ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uLzAwLUlOREVYCmluZGV4IGMxN2NkNGIuLjFiNzc3YjkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi8wMC1JTkRFWApAQCAtMzI4LDggKzMyOCw2IEBACiAJLSBpbmZvIG9uIHRoZSBtYWdpYyBTeXNScSBrZXkuCiB0ZWxlcGhvbnkvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIG9uIHRlbGVwaG9ueSAoZS5nLiB2b2ljZSBvdmVyIElQKSBzdXBwb3J0LgotdW1sLwotCS0gZGlyZWN0b3J5IHdpdGggaW5mb3JtYXRpb24gYWJvdXQgVXNlciBNb2RlIExpbnV4LgogdW5pY29kZS50eHQKIAktIGluZm8gb24gdGhlIFVuaWNvZGUgY2hhcmFjdGVyL2ZvbnQgbWFwcGluZyB1c2VkIGluIExpbnV4LgogdW5zaGFyZS50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZGV2aWNlcy1zeXN0ZW0tY3B1IGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLXN5c3RlbS1jcHUKaW5kZXggNzU2NGU4OC4uZTdiZTc1YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLXN5c3RlbS1jcHUKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLXN5c3RlbS1jcHUKQEAgLTE4MywyMSArMTgzLDIxIEBACiAJCXRvIGxlYXJuIGhvdyB0byBjb250cm9sIHRoZSBrbm9icy4KIAogCi1XaGF0OiAgICAgIC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSovY2FjaGUvaW5kZXgqL2NhY2hlX2Rpc2FibGVfWAotRGF0ZTogICAgICBBdWd1c3QgMjAwOAorV2hhdDoJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSovY2FjaGUvaW5kZXgzL2NhY2hlX2Rpc2FibGVfezAsMX0KK0RhdGU6CQlBdWd1c3QgMjAwOAogS2VybmVsVmVyc2lvbjoJMi42LjI3Ci1Db250YWN0OgltYXJrLmxhbmdzZG9yZkBhbWQuY29tCi1EZXNjcmlwdGlvbjoJVGhlc2UgZmlsZXMgZXhpc3QgaW4gZXZlcnkgY3B1J3MgY2FjaGUgaW5kZXggZGlyZWN0b3JpZXMuCi0JCVRoZXJlIGFyZSBjdXJyZW50bHkgMiBjYWNoZV9kaXNhYmxlXyMgZmlsZXMgaW4gZWFjaAotCQlkaXJlY3RvcnkuICBSZWFkaW5nIGZyb20gdGhlc2UgZmlsZXMgb24gYSBzdXBwb3J0ZWQKLQkJcHJvY2Vzc29yIHdpbGwgcmV0dXJuIHRoYXQgY2FjaGUgZGlzYWJsZSBpbmRleCB2YWx1ZQotCQlmb3IgdGhhdCBwcm9jZXNzb3IgYW5kIG5vZGUuICBXcml0aW5nIHRvIG9uZSBvZiB0aGVzZQotCQlmaWxlcyB3aWxsIGNhdXNlIHRoZSBzcGVjaWZpY2VkIGNhY2hlIGluZGV4IHRvIGJlIGRpc2FibGVkLgorQ29udGFjdDoJZGlzY3Vzc0B4ODYtNjQub3JnCitEZXNjcmlwdGlvbjoJRGlzYWJsZSBMMyBjYWNoZSBpbmRpY2VzCiAKLQkJQ3VycmVudGx5LCBvbmx5IEFNRCBGYW1pbHkgMTBoIFByb2Nlc3NvcnMgc3VwcG9ydCBjYWNoZSBpbmRleAotCQlkaXNhYmxlLCBhbmQgb25seSBmb3IgdGhlaXIgTDMgY2FjaGVzLiAgU2VlIHRoZSBCSU9TIGFuZAotCQlLZXJuZWwgRGV2ZWxvcGVyJ3MgR3VpZGUgYXQKLQkJaHR0cDovL3N1cHBvcnQuYW1kLmNvbS91cy9FbWJlZGRlZF9UZWNoRG9jcy8zMTExNi1QdWJsaWMtR0gtQktER18zLTI4XzUtMjgtMDkucGRmCQotCQlmb3IgZm9ybWF0dGluZyBpbmZvcm1hdGlvbiBhbmQgb3RoZXIgZGV0YWlscyBvbiB0aGUKLQkJY2FjaGUgaW5kZXggZGlzYWJsZS4KLVVzZXJzOiAgICBqb2FjaGltLmRlZ3VhcmFAYW1kLmNvbQorCQlUaGVzZSBmaWxlcyBleGlzdCBpbiBldmVyeSBDUFUncyBjYWNoZS9pbmRleDMgZGlyZWN0b3J5LiBFYWNoCisJCWNhY2hlX2Rpc2FibGVfezAsMX0gZmlsZSBjb3JyZXNwb25kcyB0byBvbmUgZGlzYWJsZSBzbG90IHdoaWNoCisJCWNhbiBiZSB1c2VkIHRvIGRpc2FibGUgYSBjYWNoZSBpbmRleC4gUmVhZGluZyBmcm9tIHRoZXNlIGZpbGVzCisJCW9uIGEgcHJvY2Vzc29yIHdpdGggdGhpcyBmdW5jdGlvbmFsaXR5IHdpbGwgcmV0dXJuIHRoZSBjdXJyZW50bHkKKwkJZGlzYWJsZWQgaW5kZXggZm9yIHRoYXQgbm9kZS4gVGhlcmUgaXMgb25lIEwzIHN0cnVjdHVyZSBwZXIKKwkJbm9kZSwgb3IgcGVyIGludGVybmFsIG5vZGUgb24gTUNNIG1hY2hpbmVzLiBXcml0aW5nIGEgdmFsaWQKKwkJaW5kZXggdG8gb25lIG9mIHRoZXNlIGZpbGVzIHdpbGwgY2F1c2UgdGhlIHNwZWNpZmljZWQgY2FjaGUKKwkJaW5kZXggdG8gYmUgZGlzYWJsZWQuCisKKwkJQWxsIEFNRCBwcm9jZXNzb3JzIHdpdGggTDMgY2FjaGVzIHByb3ZpZGUgdGhpcyBmdW5jdGlvbmFsaXR5LgorCQlGb3IgZGV0YWlscywgc2VlIEJLREdzIGF0CisJCWh0dHA6Ly9kZXZlbG9wZXIuYW1kLmNvbS9kb2N1bWVudGF0aW9uL2d1aWRlcy9QYWdlcy9kZWZhdWx0LmFzcHgKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZmlybXdhcmUtZG1pIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1maXJtd2FyZS1kbWkKaW5kZXggYmE5ZGE5NS4uYzc4ZjlhYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1maXJtd2FyZS1kbWkKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1maXJtd2FyZS1kbWkKQEAgLTE0LDE0ICsxNCwxNSBAQAogCiAJCURNSSBpcyBzdHJ1Y3R1cmVkIGFzIGEgbGFyZ2UgdGFibGUgb2YgZW50cmllcywgd2hlcmUKIAkJZWFjaCBlbnRyeSBoYXMgYSBjb21tb24gaGVhZGVyIGluZGljYXRpbmcgdGhlIHR5cGUgYW5kCi0JCWxlbmd0aCBvZiB0aGUgZW50cnksIGFzIHdlbGwgYXMgJ2hhbmRsZScgdGhhdCBpcwotCQlzdXBwb3NlZCB0byBiZSB1bmlxdWUgYW1vbmdzdCBhbGwgZW50cmllcy4KKwkJbGVuZ3RoIG9mIHRoZSBlbnRyeSwgYXMgd2VsbCBhcyBhIGZpcm13YXJlLXByb3ZpZGVkCisJCSdoYW5kbGUnIHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgdW5pcXVlIGFtb25nc3QgYWxsCisJCWVudHJpZXMuCiAKIAkJU29tZSBlbnRyaWVzIGFyZSByZXF1aXJlZCBieSB0aGUgc3BlY2lmaWNhdGlvbiwgYnV0IG1hbnkKIAkJb3RoZXJzIGFyZSBvcHRpb25hbC4gIEluIGdlbmVyYWwgdGhvdWdoLCB1c2VycyBzaG91bGQKIAkJbmV2ZXIgZXhwZWN0IHRvIGZpbmQgYSBzcGVjaWZpYyBlbnRyeSB0eXBlIG9uIHRoZWlyCiAJCXN5c3RlbSB1bmxlc3MgdGhleSBrbm93IGZvciBjZXJ0YWluIHdoYXQgdGhlaXIgZmlybXdhcmUKLQkJaXMgZG9pbmcuICBNYWNoaW5lIHRvIG1hY2hpbmUgd2lsbCB2YXJ5LgorCQlpcyBkb2luZy4gIE1hY2hpbmUgdG8gbWFjaGluZSBleHBlcmllbmNlcyB3aWxsIHZhcnkuCiAKIAkJTXVsdGlwbGUgZW50cmllcyBvZiB0aGUgc2FtZSB0eXBlIGFyZSBhbGxvd2VkLiAgSW4gb3JkZXIKIAkJdG8gaGFuZGxlIHRoZXNlIGR1cGxpY2F0ZSBlbnRyeSB0eXBlcywgZWFjaCBlbnRyeSBpcwpAQCAtNjcsMjUgKzY4LDI0IEBACiAJCQkgIGFuZCB0aGUgdHdvIHRlcm1pbmF0aW5nIG51bCBjaGFyYWN0ZXJzLgogCQl0eXBlCTogVGhlIHR5cGUgb2YgdGhlIGVudHJ5LiAgVGhpcyB2YWx1ZSBpcyB0aGUgc2FtZQogCQkJICBhcyBmb3VuZCBpbiB0aGUgZGlyZWN0b3J5IG5hbWUuICBJdCBpbmRpY2F0ZXMKLQkJCSAgaG93IHRoZSByZXN0IG9mIHRoZSBlbnRyeSBzaG91bGQgYmUKLQkJCSAgaW50ZXJwcmV0ZWQuCisJCQkgIGhvdyB0aGUgcmVzdCBvZiB0aGUgZW50cnkgc2hvdWxkIGJlIGludGVycHJldGVkLgogCQlpbnN0YW5jZTogVGhlIGluc3RhbmNlIG9yZGluYWwgb2YgdGhlIGVudHJ5IGZvciB0aGUKIAkJCSAgZ2l2ZW4gdHlwZS4gIFRoaXMgdmFsdWUgaXMgdGhlIHNhbWUgYXMgZm91bmQKIAkJCSAgaW4gdGhlIHBhcmVudCBkaXJlY3RvcnkgbmFtZS4KLQkJcG9zaXRpb246IFRoZSBwb3NpdGlvbiBvZiB0aGUgZW50cnkgd2l0aGluIHRoZSBlbnRpcmV0eQotCQkJICBvZiB0aGUgZW50aXJldHkuCisJCXBvc2l0aW9uOiBUaGUgb3JkaW5hbCBwb3NpdGlvbiAoemVyby1iYXNlZCkgb2YgdGhlIGVudHJ5CisJCQkgIHdpdGhpbiB0aGUgZW50aXJldHkgb2YgdGhlIERNSSBlbnRyeSB0YWJsZS4KIAogCQk9PT0gRW50cnkgU3BlY2lhbGl6YXRpb24gPT09CiAKIAkJU29tZSBlbnRyeSB0eXBlcyBtYXkgaGF2ZSBvdGhlciBpbmZvcm1hdGlvbiBhdmFpbGFibGUgaW4KLQkJc3lzZnMuCisJCXN5c2ZzLiAgTm90IGFsbCB0eXBlcyBhcmUgc3BlY2lhbGl6ZWQuCiAKIAkJLS0tIFR5cGUgMTUgLSBTeXN0ZW0gRXZlbnQgTG9nIC0tLQogCiAJCVRoaXMgZW50cnkgYWxsb3dzIHRoZSBmaXJtd2FyZSB0byBleHBvcnQgYSBsb2cgb2YKIAkJZXZlbnRzIHRoZSBzeXN0ZW0gaGFzIHRha2VuLiAgVGhpcyBpbmZvcm1hdGlvbiBpcwogCQl0eXBpY2FsbHkgYmFja2VkIGJ5IG52cmFtLCBidXQgdGhlIGltcGxlbWVudGF0aW9uCi0JCWRldGFpbHMgYXJlIGFic3RyYWN0ZWQgYnkgdGhpcyB0YWJsZS4gIFRoaXMgZW50cmllcyBkYXRhCisJCWRldGFpbHMgYXJlIGFic3RyYWN0ZWQgYnkgdGhpcyB0YWJsZS4gIFRoaXMgZW50cnkncyBkYXRhCiAJCWlzIGV4cG9ydGVkIGluIHRoZSBkaXJlY3Rvcnk6CiAKIAkJL3N5cy9maXJtd2FyZS9kbWkvZW50cmllcy8xNS0wL3N5c3RlbV9ldmVudF9sb2cKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZmlybXdhcmUtZ3NtaSBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZmlybXdhcmUtZ3NtaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmFhMGFhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1maXJtd2FyZS1nc21pCkBAIC0wLDAgKzEsNTggQEAKK1doYXQ6CQkvc3lzL2Zpcm13YXJlL2dzbWkKK0RhdGU6CQlNYXJjaCAyMDExCitDb250YWN0OglNaWtlIFdheWNoaXNvbiA8bWlrZXdAZ29vZ2xlLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlTb21lIHNlcnZlcnMgdXNlZCBpbnRlcm5hbGx5IGF0IEdvb2dsZSBoYXZlIGZpcm13YXJlCisJCXRoYXQgcHJvdmlkZXMgY2FsbGJhY2sgZnVuY3Rpb25hbGl0eSB2aWEgZXhwbGljaXQgU01JCisJCXRyaWdnZXJzLiAgU29tZSBvZiB0aGUgY2FsbGJhY2tzIGFyZSBzaW1pbGFyIHRvIHRob3NlCisJCXByb3ZpZGVkIGJ5IHRoZSBFRkkgcnVudGltZSBzZXJ2aWNlcyBwYWdlLCBidXQgZHVlIHRvCisJCWhpc3RvcmljYWwgcmVhc29ucyB0aGlzIGRpZmZlcmVudCBlbnRyeS1wb2ludCBoYXMgYmVlbgorCQl1c2VkLgorCisJCVRoZSBnc21pIGRyaXZlciBpbXBsZW1lbnRzIHRoZSBrZXJuZWwncyBhYnN0cmFjdGlvbiBmb3IKKwkJdGhlc2UgZmlybXdhcmUgY2FsbGJhY2tzLiAgQ3VycmVudGx5LCB0aGlzIGZ1bmN0aW9uYWxpdHkKKwkJaXMgbGltaXRlZCB0byBoYW5kbGluZyB0aGUgc3lzdGVtIGV2ZW50IGxvZyBhbmQgZ2V0dGluZworCQlhY2Nlc3MgdG8gRUZJLXN0eWxlIHZhcmlhYmxlcyBzdG9yZWQgaW4gbnZyYW0uCisKKwkJTGF5b3V0OgorCisJCS9zeXMvZmlybXdhcmUvZ3NtaS92YXJzOgorCisJCQlUaGlzIGRpcmVjdG9yeSBoYXMgdGhlIHNhbWUgbGF5b3V0IChhbmQKKwkJCXVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gYXMgL3N5cy9maXJtd2FyZS9lZmkvdmFycy4KKwkJCVNlZSBEb2N1bWVudGF0aW9uL0FCSS8qL3N5c2ZzLWZpcm13YXJlLWVmaS12YXJzCisJCQlmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gaW50ZXJhY3Qgd2l0aAorCQkJdGhpcyBzdHJ1Y3R1cmUuCisKKwkJL3N5cy9maXJtd2FyZS9nc21pL2FwcGVuZF90b19ldmVudGxvZyAtIHdyaXRlLW9ubHk6CisKKwkJCVRoaXMgZmlsZSB0YWtlcyBhIGJpbmFyeSBibG9iIGFuZCBwYXNzZXMgaXQgb250bworCQkJdGhlIGZpcm13YXJlIHRvIGJlIHRpbWVzdGFtcGVkIGFuZCBhcHBlbmRlZCB0bworCQkJdGhlIHN5c3RlbSBldmVudGxvZy4gIFRoZSBiaW5hcnkgZm9ybWF0IGlzCisJCQlpbnRlcnByZXRlZCBieSB0aGUgZmlybXdhcmUgYW5kIG1heSBjaGFuZ2UgZnJvbQorCQkJcGxhdGZvcm0gdG8gcGxhdGZvcm0uICBUaGUgb25seSBrZXJuZWwtZW5mb3JjZWQKKwkJCXJlcXVpcmVtZW50IGlzIHRoYXQgdGhlIGJsb2IgYmUgcHJlZml4ZWQgd2l0aCBhCisJCQkzMmJpdCBob3N0LWVuZGlhbiB0eXBlIHVzZWQgYXMgcGFydCBvZiB0aGUKKwkJCWZpcm13YXJlIGNhbGwuCisKKwkJL3N5cy9maXJtd2FyZS9nc21pL2NsZWFyX2NvbmZpZyAtIHdyaXRlLW9ubHk6CisKKwkJCVdyaXRpbmcgYW55IHZhbHVlIHRvIHRoaXMgZmlsZSB3aWxsIGNhdXNlIHRoZQorCQkJZW50aXJlIGZpcm13YXJlIGNvbmZpZ3VyYXRpb24gdG8gYmUgcmVzZXQgdG8KKwkJCSJmYWN0b3J5IGRlZmF1bHRzIi4gIENhbGxlcnMgc2hvdWxkIGFzc3VtZSB0aGF0CisJCQlhIHJlYm9vdCBpcyByZXF1aXJlZCBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gdG8gYmUKKwkJCWNsZWFyZWQuCisKKwkJL3N5cy9maXJtd2FyZS9nc21pL2NsZWFyX2V2ZW50bG9nIC0gd3JpdGUtb25seToKKworCQkJVGhpcyBmaWxlIGlzIHVzZWQgdG8gY2xlYXIgb3V0IGEgcG9ydGlvbi90aGUKKwkJCXdob2xlIG9mIHRoZSBzeXN0ZW0gZXZlbnQgbG9nLiAgVmFsdWVzIHdyaXR0ZW4KKwkJCXNob3VsZCBiZSB2YWx1ZXMgYmV0d2VlbiAxIGFuZCAxMDAgaW5jbHVzaXZlIChpbgorCQkJQVNDSUkpIHJlcHJlc2VudGluZyB0aGUgZnJhY3Rpb24gb2YgdGhlIGxvZyB0bworCQkJY2xlYXIuICBOb3QgYWxsIHBsYXRmb3JtcyBzdXBwb3J0IGZyYWN0aW9uYWwKKwkJCWNsZWFyaW5nIHRob3VnaCwgYW5kIHRoaXMgd3JpdGVzIHRvIHRoaXMgZmlsZQorCQkJd2lsbCBlcnJvciBvdXQgaWYgdGhlIGZpcm13YXJlIGRvZXNuJ3QgbGlrZSB5b3VyCisJCQlzdWJtaXR0ZWQgZnJhY3Rpb24uCisKKwkJCUNhbGxlcnMgc2hvdWxkIGFzc3VtZSB0aGF0IGEgcmVib290IGlzIG5lZWRlZAorCQkJZm9yIHRoaXMgb3BlcmF0aW9uIHRvIGNvbXBsZXRlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1maXJtd2FyZS1sb2cgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWZpcm13YXJlLWxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjU4ZTdjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1maXJtd2FyZS1sb2cKQEAgLTAsMCArMSw3IEBACitXaGF0OgkJL3N5cy9maXJtd2FyZS9sb2cKK0RhdGU6CQlGZWJydWFyeSAyMDExCitDb250YWN0OglNaWtlIFdheWNoaXNvbiA8bWlrZXdAZ29vZ2xlLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGUgL3N5cy9maXJtd2FyZS9sb2cgaXMgYSBiaW5hcnkgZmlsZSB0aGF0IHJlcHJlc2VudHMgYQorCQlyZWFkLW9ubHkgY29weSBvZiB0aGUgZmlybXdhcmUncyBsb2cgaWYgb25lIGlzCisJCWF2YWlsYWJsZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMta2VybmVsLWZzY2FwcyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMta2VybmVsLWZzY2FwcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGEzMDMzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1rZXJuZWwtZnNjYXBzCkBAIC0wLDAgKzEsOCBAQAorV2hhdDoJCS9zeXMva2VybmVsL2ZzY2FwcworRGF0ZToJCUZlYnJ1YXJ5IDIwMTEKK0tlcm5lbFZlcnNpb246CTIuNi4zOAorQ29udGFjdDoJTHVkd2lnIE51c3NlbCA8bHVkd2lnLm51c3NlbEBzdXNlLmRlPgorRGVzY3JpcHRpb24KKwkJU2hvd3Mgd2hldGhlciBmaWxlIHN5c3RlbSBjYXBhYmlsaXRpZXMgYXJlIGhvbm9yZWQKKwkJd2hlbiBleGVjdXRpbmcgYSBiaW5hcnkKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1wb3dlciBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtcG93ZXIKaW5kZXggMTk0Y2E0NC4uYjQ2NGQxMjc2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBvd2VyCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtcG93ZXIKQEAgLTE1OCwzICsxNTgsMTcgQEAKIAkJc3VjY2Vzc2Z1bCwgd2lsbCBtYWtlIHRoZSBrZXJuZWwgYWJvcnQgYSBzdWJzZXF1ZW50IHRyYW5zaXRpb24KIAkJdG8gYSBzbGVlcCBzdGF0ZSBpZiBhbnkgd2FrZXVwIGV2ZW50cyBhcmUgcmVwb3J0ZWQgYWZ0ZXIgdGhlCiAJCXdyaXRlIGhhcyByZXR1cm5lZC4KKworV2hhdDoJCS9zeXMvcG93ZXIvcmVzZXJ2ZWRfc2l6ZQorRGF0ZToJCU1heSAyMDExCitDb250YWN0OglSYWZhZWwgSi4gV3lzb2NraSA8cmp3QHNpc2sucGw+CitEZXNjcmlwdGlvbjoKKwkJVGhlIC9zeXMvcG93ZXIvcmVzZXJ2ZWRfc2l6ZSBmaWxlIGFsbG93cyB1c2VyIHNwYWNlIHRvIGNvbnRyb2wKKwkJdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVzZXJ2ZWQgZm9yIGFsbG9jYXRpb25zIG1hZGUgYnkgZGV2aWNlCisJCWRyaXZlcnMgZHVyaW5nIHRoZSAiZGV2aWNlIGZyZWV6ZSIgc3RhZ2Ugb2YgaGliZXJuYXRpb24uICBJdCBjYW4KKwkJYmUgd3JpdHRlbiBhIHN0cmluZyByZXByZXNlbnRpbmcgYSBub24tbmVnYXRpdmUgaW50ZWdlciB0aGF0CisJCXdpbGwgYmUgdXNlZCBhcyB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZXNlcnZlIGZvciBhbGxvY2F0aW9ucworCQltYWRlIGJ5IGRldmljZSBkcml2ZXJzJyAiZnJlZXplIiBjYWxsYmFja3MsIGluIGJ5dGVzLgorCisJCVJlYWRpbmcgZnJvbSB0aGlzIGZpbGUgd2lsbCBkaXNwbGF5IHRoZSBjdXJyZW50IHZhbHVlLCB3aGljaCBpcworCQlzZXQgdG8gMSBNQiBieSBkZWZhdWx0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2RldmljZS1kcml2ZXJzLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZGV2aWNlLWRyaXZlcnMudG1wbAppbmRleCAzNmY2M2Q0Li5iNjM4ZTUwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZGV2aWNlLWRyaXZlcnMudG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZGV2aWNlLWRyaXZlcnMudG1wbApAQCAtOTYsMTAgKzk2LDEwIEBACiAKICAgPGNoYXB0ZXIgaWQ9ImRldmRyaXZlcnMiPgogICAgICA8dGl0bGU+RGV2aWNlIGRyaXZlcnMgaW5mcmFzdHJ1Y3R1cmU8L3RpdGxlPgorICAgICA8c2VjdDE+PHRpdGxlPlRoZSBCYXNpYyBEZXZpY2UgRHJpdmVyLU1vZGVsIFN0cnVjdHVyZXMgPC90aXRsZT4KKyFJaW5jbHVkZS9saW51eC9kZXZpY2UuaAorICAgICA8L3NlY3QxPgogICAgICA8c2VjdDE+PHRpdGxlPkRldmljZSBEcml2ZXJzIEJhc2U8L3RpdGxlPgotPCEtLQotWCFJaW5jbHVkZS9saW51eC9kZXZpY2UuaAotLS0+CiAhRWRyaXZlcnMvYmFzZS9kcml2ZXIuYwogIUVkcml2ZXJzL2Jhc2UvY29yZS5jCiAhRWRyaXZlcnMvYmFzZS9jbGFzcy5jCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZ2VuZXJpY2lycS50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2dlbmVyaWNpcnEudG1wbAppbmRleCBmYjEwZmQwLi5iMzQyMjM0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZ2VuZXJpY2lycS50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9nZW5lcmljaXJxLnRtcGwKQEAgLTE5MSw4ICsxOTEsOCBAQAogCTxwYXJhPgogCVdoZW5ldmVyIGFuIGludGVycnVwdCB0cmlnZ2VycywgdGhlIGxvd2xldmVsIGFyY2ggY29kZSBjYWxscyBpbnRvCiAJdGhlIGdlbmVyaWMgaW50ZXJydXB0IGNvZGUgYnkgY2FsbGluZyBkZXNjLT5oYW5kbGVfaXJxKCkuCi0JVGhpcyBoaWdobGV2ZWwgSVJRIGhhbmRsaW5nIGZ1bmN0aW9uIG9ubHkgdXNlcyBkZXNjLT5jaGlwIHByaW1pdGl2ZXMKLQlyZWZlcmVuY2VkIGJ5IHRoZSBhc3NpZ25lZCBjaGlwIGRlc2NyaXB0b3Igc3RydWN0dXJlLgorCVRoaXMgaGlnaGxldmVsIElSUSBoYW5kbGluZyBmdW5jdGlvbiBvbmx5IHVzZXMgZGVzYy0+aXJxX2RhdGEuY2hpcAorCXByaW1pdGl2ZXMgcmVmZXJlbmNlZCBieSB0aGUgYXNzaWduZWQgY2hpcCBkZXNjcmlwdG9yIHN0cnVjdHVyZS4KIAk8L3BhcmE+CiAgICAgPC9zZWN0MT4KICAgICA8c2VjdDEgaWQ9IkhpZ2hsZXZlbF9Ecml2ZXJfQVBJIj4KQEAgLTIwNiwxMSArMjA2LDExIEBACiAJICA8bGlzdGl0ZW0+PHBhcmE+ZW5hYmxlX2lycSgpPC9wYXJhPjwvbGlzdGl0ZW0+CiAJICA8bGlzdGl0ZW0+PHBhcmE+ZGlzYWJsZV9pcnFfbm9zeW5jKCkgKFNNUCBvbmx5KTwvcGFyYT48L2xpc3RpdGVtPgogCSAgPGxpc3RpdGVtPjxwYXJhPnN5bmNocm9uaXplX2lycSgpIChTTVAgb25seSk8L3BhcmE+PC9saXN0aXRlbT4KLQkgIDxsaXN0aXRlbT48cGFyYT5zZXRfaXJxX3R5cGUoKTwvcGFyYT48L2xpc3RpdGVtPgotCSAgPGxpc3RpdGVtPjxwYXJhPnNldF9pcnFfd2FrZSgpPC9wYXJhPjwvbGlzdGl0ZW0+Ci0JICA8bGlzdGl0ZW0+PHBhcmE+c2V0X2lycV9kYXRhKCk8L3BhcmE+PC9saXN0aXRlbT4KLQkgIDxsaXN0aXRlbT48cGFyYT5zZXRfaXJxX2NoaXAoKTwvcGFyYT48L2xpc3RpdGVtPgotCSAgPGxpc3RpdGVtPjxwYXJhPnNldF9pcnFfY2hpcF9kYXRhKCk8L3BhcmE+PC9saXN0aXRlbT4KKwkgIDxsaXN0aXRlbT48cGFyYT5pcnFfc2V0X2lycV90eXBlKCk8L3BhcmE+PC9saXN0aXRlbT4KKwkgIDxsaXN0aXRlbT48cGFyYT5pcnFfc2V0X2lycV93YWtlKCk8L3BhcmE+PC9saXN0aXRlbT4KKwkgIDxsaXN0aXRlbT48cGFyYT5pcnFfc2V0X2hhbmRsZXJfZGF0YSgpPC9wYXJhPjwvbGlzdGl0ZW0+CisJICA8bGlzdGl0ZW0+PHBhcmE+aXJxX3NldF9jaGlwKCk8L3BhcmE+PC9saXN0aXRlbT4KKwkgIDxsaXN0aXRlbT48cGFyYT5pcnFfc2V0X2NoaXBfZGF0YSgpPC9wYXJhPjwvbGlzdGl0ZW0+CiAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CiAJICBTZWUgdGhlIGF1dG9nZW5lcmF0ZWQgZnVuY3Rpb24gZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KIAk8L3BhcmE+CkBAIC0yMjUsNiArMjI1LDggQEAKIAkgIDxsaXN0aXRlbT48cGFyYT5oYW5kbGVfZmFzdGVvaV9pcnE8L3BhcmE+PC9saXN0aXRlbT4KIAkgIDxsaXN0aXRlbT48cGFyYT5oYW5kbGVfc2ltcGxlX2lycTwvcGFyYT48L2xpc3RpdGVtPgogCSAgPGxpc3RpdGVtPjxwYXJhPmhhbmRsZV9wZXJjcHVfaXJxPC9wYXJhPjwvbGlzdGl0ZW0+CisJICA8bGlzdGl0ZW0+PHBhcmE+aGFuZGxlX2VkZ2VfZW9pX2lycTwvcGFyYT48L2xpc3RpdGVtPgorCSAgPGxpc3RpdGVtPjxwYXJhPmhhbmRsZV9iYWRfaXJxPC9wYXJhPjwvbGlzdGl0ZW0+CiAJICA8L2l0ZW1pemVkbGlzdD4KIAkgIFRoZSBpbnRlcnJ1cHQgZmxvdyBoYW5kbGVycyAoZWl0aGVyIHByZWRlZmluZWQgb3IgYXJjaGl0ZWN0dXJlCiAJICBzcGVjaWZpYykgYXJlIGFzc2lnbmVkIHRvIHNwZWNpZmljIGludGVycnVwdHMgYnkgdGhlIGFyY2hpdGVjdHVyZQpAQCAtMjQxLDEzICsyNDMsMTMgQEAKIAkJPHByb2dyYW1saXN0aW5nPgogZGVmYXVsdF9lbmFibGUoc3RydWN0IGlycV9kYXRhICpkYXRhKQogewotCWRlc2MtPmNoaXAtPmlycV91bm1hc2soZGF0YSk7CisJZGVzYy0+aXJxX2RhdGEuY2hpcC0+aXJxX3VubWFzayhkYXRhKTsKIH0KIAogZGVmYXVsdF9kaXNhYmxlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKIAlpZiAoIWRlbGF5X2Rpc2FibGUoZGF0YSkpCi0JCWRlc2MtPmNoaXAtPmlycV9tYXNrKGRhdGEpOworCQlkZXNjLT5pcnFfZGF0YS5jaGlwLT5pcnFfbWFzayhkYXRhKTsKIH0KIAogZGVmYXVsdF9hY2soc3RydWN0IGlycV9kYXRhICpkYXRhKQpAQCAtMjg0LDkgKzI4Niw5IEBACiAJCTxwYXJhPgogCQlUaGUgZm9sbG93aW5nIGNvbnRyb2wgZmxvdyBpcyBpbXBsZW1lbnRlZCAoc2ltcGxpZmllZCBleGNlcnB0KToKIAkJPHByb2dyYW1saXN0aW5nPgotZGVzYy0+Y2hpcC0+aXJxX21hc2soKTsKLWhhbmRsZV9JUlFfZXZlbnQoZGVzYy0+YWN0aW9uKTsKLWRlc2MtPmNoaXAtPmlycV91bm1hc2soKTsKK2Rlc2MtPmlycV9kYXRhLmNoaXAtPmlycV9tYXNrX2FjaygpOworaGFuZGxlX2lycV9ldmVudChkZXNjLT5hY3Rpb24pOworZGVzYy0+aXJxX2RhdGEuY2hpcC0+aXJxX3VubWFzaygpOwogCQk8L3Byb2dyYW1saXN0aW5nPgogCQk8L3BhcmE+CiAJICAgIDwvc2VjdDM+CkBAIC0zMDAsOCArMzAyLDggQEAKIAkJPHBhcmE+CiAJCVRoZSBmb2xsb3dpbmcgY29udHJvbCBmbG93IGlzIGltcGxlbWVudGVkIChzaW1wbGlmaWVkIGV4Y2VycHQpOgogCQk8cHJvZ3JhbWxpc3Rpbmc+Ci1oYW5kbGVfSVJRX2V2ZW50KGRlc2MtPmFjdGlvbik7Ci1kZXNjLT5jaGlwLT5pcnFfZW9pKCk7CitoYW5kbGVfaXJxX2V2ZW50KGRlc2MtPmFjdGlvbik7CitkZXNjLT5pcnFfZGF0YS5jaGlwLT5pcnFfZW9pKCk7CiAJCTwvcHJvZ3JhbWxpc3Rpbmc+CiAJCTwvcGFyYT4KIAkgICAgPC9zZWN0Mz4KQEAgLTMxNSwxNyArMzE3LDE3IEBACiAJCVRoZSBmb2xsb3dpbmcgY29udHJvbCBmbG93IGlzIGltcGxlbWVudGVkIChzaW1wbGlmaWVkIGV4Y2VycHQpOgogCQk8cHJvZ3JhbWxpc3Rpbmc+CiBpZiAoZGVzYy0+c3RhdHVzICZhbXA7IHJ1bm5pbmcpIHsKLQlkZXNjLT5jaGlwLT5pcnFfbWFzaygpOworCWRlc2MtPmlycV9kYXRhLmNoaXAtPmlycV9tYXNrX2FjaygpOwogCWRlc2MtPnN0YXR1cyB8PSBwZW5kaW5nIHwgbWFza2VkOwogCXJldHVybjsKIH0KLWRlc2MtPmNoaXAtPmlycV9hY2soKTsKK2Rlc2MtPmlycV9kYXRhLmNoaXAtPmlycV9hY2soKTsKIGRlc2MtPnN0YXR1cyB8PSBydW5uaW5nOwogZG8gewogCWlmIChkZXNjLT5zdGF0dXMgJmFtcDsgbWFza2VkKQotCQlkZXNjLT5jaGlwLT5pcnFfdW5tYXNrKCk7CisJCWRlc2MtPmlycV9kYXRhLmNoaXAtPmlycV91bm1hc2soKTsKIAlkZXNjLT5zdGF0dXMgJmFtcDs9IH5wZW5kaW5nOwotCWhhbmRsZV9JUlFfZXZlbnQoZGVzYy0+YWN0aW9uKTsKKwloYW5kbGVfaXJxX2V2ZW50KGRlc2MtPmFjdGlvbik7CiB9IHdoaWxlIChzdGF0dXMgJmFtcDsgcGVuZGluZyk7CiBkZXNjLT5zdGF0dXMgJmFtcDs9IH5ydW5uaW5nOwogCQk8L3Byb2dyYW1saXN0aW5nPgpAQCAtMzQ0LDcgKzM0Niw3IEBACiAJCTxwYXJhPgogCQlUaGUgZm9sbG93aW5nIGNvbnRyb2wgZmxvdyBpcyBpbXBsZW1lbnRlZCAoc2ltcGxpZmllZCBleGNlcnB0KToKIAkJPHByb2dyYW1saXN0aW5nPgotaGFuZGxlX0lSUV9ldmVudChkZXNjLT5hY3Rpb24pOworaGFuZGxlX2lycV9ldmVudChkZXNjLT5hY3Rpb24pOwogCQk8L3Byb2dyYW1saXN0aW5nPgogCQk8L3BhcmE+CiAgICAJICAgIDwvc2VjdDM+CkBAIC0zNjIsMTIgKzM2NCwyOSBAQAogCQk8cGFyYT4KIAkJVGhlIGZvbGxvd2luZyBjb250cm9sIGZsb3cgaXMgaW1wbGVtZW50ZWQgKHNpbXBsaWZpZWQgZXhjZXJwdCk6CiAJCTxwcm9ncmFtbGlzdGluZz4KLWhhbmRsZV9JUlFfZXZlbnQoZGVzYy0+YWN0aW9uKTsKLWlmIChkZXNjLT5jaGlwLT5pcnFfZW9pKQotICAgICAgICBkZXNjLT5jaGlwLT5pcnFfZW9pKCk7CitpZiAoZGVzYy0+aXJxX2RhdGEuY2hpcC0+aXJxX2FjaykKKwlkZXNjLT5pcnFfZGF0YS5jaGlwLT5pcnFfYWNrKCk7CitoYW5kbGVfaXJxX2V2ZW50KGRlc2MtPmFjdGlvbik7CitpZiAoZGVzYy0+aXJxX2RhdGEuY2hpcC0+aXJxX2VvaSkKKyAgICAgICAgZGVzYy0+aXJxX2RhdGEuY2hpcC0+aXJxX2VvaSgpOwogCQk8L3Byb2dyYW1saXN0aW5nPgogCQk8L3BhcmE+CiAgICAJICAgIDwvc2VjdDM+CisJICAgIDxzZWN0MyBpZD0iRU9JX0VkZ2VfSVJRX2Zsb3dfaGFuZGxlciI+CisJIAk8dGl0bGU+RU9JIEVkZ2UgSVJRIGZsb3cgaGFuZGxlcjwvdGl0bGU+CisJCTxwYXJhPgorCQloYW5kbGVfZWRnZV9lb2lfaXJxIHByb3ZpZGVzIGFuIGFibm9taW5hdGlvbiBvZiB0aGUgZWRnZQorCQloYW5kbGVyIHdoaWNoIGlzIHNvbGVseSB1c2VkIHRvIHRhbWUgYSBiYWRseSB3cmVja2FnZWQKKwkJaXJxIGNvbnRyb2xsZXIgb24gcG93ZXJwYy9jZWxsLgorCQk8L3BhcmE+CisgICAJICAgIDwvc2VjdDM+CisJICAgIDxzZWN0MyBpZD0iQkFEX0lSUV9mbG93X2hhbmRsZXIiPgorCSAJPHRpdGxlPkJhZCBJUlEgZmxvdyBoYW5kbGVyPC90aXRsZT4KKwkJPHBhcmE+CisJCWhhbmRsZV9iYWRfaXJxIGlzIHVzZWQgZm9yIHNwdXJpb3VzIGludGVycnVwdHMgd2hpY2gKKwkJaGF2ZSBubyByZWFsIGhhbmRsZXIgYXNzaWduZWQuLgorCQk8L3BhcmE+CisgICAJICAgIDwvc2VjdDM+CiAJPC9zZWN0Mj4KIAk8c2VjdDIgaWQ9IlF1aXJrc19hbmRfb3B0aW1pemF0aW9ucyI+CiAJPHRpdGxlPlF1aXJrcyBhbmQgb3B0aW1pemF0aW9uczwvdGl0bGU+CkBAIC00MTAsNiArNDI5LDcgQEAKIAkgIDxsaXN0aXRlbT48cGFyYT5pcnFfbWFza19hY2soKSAtIE9wdGlvbmFsLCByZWNvbW1lbmRlZCBmb3IgcGVyZm9ybWFuY2U8L3BhcmE+PC9saXN0aXRlbT4KIAkgIDxsaXN0aXRlbT48cGFyYT5pcnFfbWFzaygpPC9wYXJhPjwvbGlzdGl0ZW0+CiAJICA8bGlzdGl0ZW0+PHBhcmE+aXJxX3VubWFzaygpPC9wYXJhPjwvbGlzdGl0ZW0+CisJICA8bGlzdGl0ZW0+PHBhcmE+aXJxX2VvaSgpIC0gT3B0aW9uYWwsIHJlcXVpcmVkIGZvciBlb2kgZmxvdyBoYW5kbGVyczwvcGFyYT48L2xpc3RpdGVtPgogCSAgPGxpc3RpdGVtPjxwYXJhPmlycV9yZXRyaWdnZXIoKSAtIE9wdGlvbmFsPC9wYXJhPjwvbGlzdGl0ZW0+CiAJICA8bGlzdGl0ZW0+PHBhcmE+aXJxX3NldF90eXBlKCkgLSBPcHRpb25hbDwvcGFyYT48L2xpc3RpdGVtPgogCSAgPGxpc3RpdGVtPjxwYXJhPmlycV9zZXRfd2FrZSgpIC0gT3B0aW9uYWw8L3BhcmE+PC9saXN0aXRlbT4KQEAgLTQyNCwzMiArNDQ0LDI0IEBACiAgIDxjaGFwdGVyIGlkPSJkb2lycSI+CiAgICAgIDx0aXRsZT5fX2RvX0lSUSBlbnRyeSBwb2ludDwvdGl0bGU+CiAgICAgIDxwYXJhPgotIAlUaGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24gX19kb19JUlEoKSBpcyBhbiBhbHRlcm5hdGl2ZSBlbnRyeQotCXBvaW50IGZvciBhbGwgdHlwZXMgb2YgaW50ZXJydXB0cy4KKwlUaGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24gX19kb19JUlEoKSB3YXMgYW4gYWx0ZXJuYXRpdmUgZW50cnkKKwlwb2ludCBmb3IgYWxsIHR5cGVzIG9mIGludGVycnVwdHMuIEl0IG5vdCBsb25nZXIgZXhpc3RzLgogICAgICA8L3BhcmE+CiAgICAgIDxwYXJhPgogCVRoaXMgaGFuZGxlciB0dXJuZWQgb3V0IHRvIGJlIG5vdCBzdWl0YWJsZSBmb3IgYWxsCiAJaW50ZXJydXB0IGhhcmR3YXJlIGFuZCB3YXMgdGhlcmVmb3JlIHJlaW1wbGVtZW50ZWQgd2l0aCBzcGxpdAotCWZ1bmN0aW9uYWxpdHkgZm9yIGVnZGUvbGV2ZWwvc2ltcGxlL3BlcmNwdSBpbnRlcnJ1cHRzLiBUaGlzIGlzIG5vdAorCWZ1bmN0aW9uYWxpdHkgZm9yIGVkZ2UvbGV2ZWwvc2ltcGxlL3BlcmNwdSBpbnRlcnJ1cHRzLiBUaGlzIGlzIG5vdAogCW9ubHkgYSBmdW5jdGlvbmFsIG9wdGltaXphdGlvbi4gSXQgYWxzbyBzaG9ydGVucyBjb2RlIHBhdGhzIGZvcgogCWludGVycnVwdHMuCiAgICAgICA8L3BhcmE+Ci0gICAgICA8cGFyYT4KLQlUbyBtYWtlIHVzZSBvZiB0aGUgc3BsaXQgaW1wbGVtZW50YXRpb24sIHJlcGxhY2UgdGhlIGNhbGwgdG8KLQlfX2RvX0lSUSBieSBhIGNhbGwgdG8gZGVzYy0+aGFuZGxlX2lycSgpIGFuZCBhc3NvY2lhdGUKLSAgICAgICAgdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXIgZnVuY3Rpb24gdG8gZGVzYy0+aGFuZGxlX2lycSgpLgotCUluIG1vc3QgY2FzZXMgdGhlIGdlbmVyaWMgaGFuZGxlciBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkCi0JYmUgc3VmZmljaWVudC4KLSAgICAgPC9wYXJhPgogICA8L2NoYXB0ZXI+CiAKICAgPGNoYXB0ZXIgaWQ9ImxvY2tpbmciPgogICAgICA8dGl0bGU+TG9ja2luZyBvbiBTTVA8L3RpdGxlPgogICAgICA8cGFyYT4KIAlUaGUgbG9ja2luZyBvZiBjaGlwIHJlZ2lzdGVycyBpcyB1cCB0byB0aGUgYXJjaGl0ZWN0dXJlIHRoYXQKLQlkZWZpbmVzIHRoZSBjaGlwIHByaW1pdGl2ZXMuIFRoZXJlIGlzIGEgY2hpcC0+bG9jayBmaWVsZCB0aGF0IGNhbiBiZSB1c2VkCi0JZm9yIHNlcmlhbGl6YXRpb24sIGJ1dCB0aGUgZ2VuZXJpYyBsYXllciBkb2VzIG5vdCB0b3VjaCBpdC4gVGhlIHBlci1pcnEKLQlzdHJ1Y3R1cmUgaXMgcHJvdGVjdGVkIHZpYSBkZXNjLT5sb2NrLCBieSB0aGUgZ2VuZXJpYyBsYXllci4KKwlkZWZpbmVzIHRoZSBjaGlwIHByaW1pdGl2ZXMuIFRoZSBwZXItaXJxIHN0cnVjdHVyZSBpcworCXByb3RlY3RlZCB2aWEgZGVzYy0+bG9jaywgYnkgdGhlIGdlbmVyaWMgbGF5ZXIuCiAgICAgIDwvcGFyYT4KICAgPC9jaGFwdGVyPgogICA8Y2hhcHRlciBpZD0ic3RydWN0cyI+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vUkNVLzAwLUlOREVYCmluZGV4IDcxYjZmNTAuLjFkN2E4ODUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vUkNVLzAwLUlOREVYCisrKyBiL0RvY3VtZW50YXRpb24vUkNVLzAwLUlOREVYCkBAIC0yMSw3ICsyMSw3IEBACiBSVEZQLnR4dAogCS0gTGlzdCBvZiBSQ1UgcGFwZXJzIChiaWJsaW9ncmFwaHkpIGdvaW5nIGJhY2sgdG8gMTk4MC4KIHN0YWxsd2Fybi50eHQKLQktIFJDVSBDUFUgc3RhbGwgd2FybmluZ3MgKENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SKQorCS0gUkNVIENQVSBzdGFsbCB3YXJuaW5ncyAobW9kdWxlIHBhcmFtZXRlciByY3VfY3B1X3N0YWxsX3N1cHByZXNzKQogdG9ydHVyZS50eHQKIAktIFJDVSBUb3J0dXJlIFRlc3QgT3BlcmF0aW9uIChDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCkKIHRyYWNlLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SQ1Uvc3RhbGx3YXJuLnR4dCBiL0RvY3VtZW50YXRpb24vUkNVL3N0YWxsd2Fybi50eHQKaW5kZXggODYyYzA4ZS4uNGU5NTkyMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9SQ1Uvc3RhbGx3YXJuLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL1JDVS9zdGFsbHdhcm4udHh0CkBAIC0xLDIyICsxLDI1IEBACiBVc2luZyBSQ1UncyBDUFUgU3RhbGwgRGV0ZWN0b3IKIAotVGhlIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGtlcm5lbCBjb25maWcgcGFyYW1ldGVyIGVuYWJsZXMKLVJDVSdzIENQVSBzdGFsbCBkZXRlY3Rvciwgd2hpY2ggZGV0ZWN0cyBjb25kaXRpb25zIHRoYXQgdW5kdWx5IGRlbGF5Ci1SQ1UgZ3JhY2UgcGVyaW9kcy4gIFRoZSBzdGFsbCBkZXRlY3RvcidzIGlkZWEgb2Ygd2hhdCBjb25zdGl0dXRlcwotInVuZHVseSBkZWxheWVkIiBpcyBjb250cm9sbGVkIGJ5IGEgc2V0IG9mIEMgcHJlcHJvY2Vzc29yIG1hY3JvczoKK1RoZSByY3VfY3B1X3N0YWxsX3N1cHByZXNzIG1vZHVsZSBwYXJhbWV0ZXIgZW5hYmxlcyBSQ1UncyBDUFUgc3RhbGwKK2RldGVjdG9yLCB3aGljaCBkZXRlY3RzIGNvbmRpdGlvbnMgdGhhdCB1bmR1bHkgZGVsYXkgUkNVIGdyYWNlIHBlcmlvZHMuCitUaGlzIG1vZHVsZSBwYXJhbWV0ZXIgZW5hYmxlcyBDUFUgc3RhbGwgZGV0ZWN0aW9uIGJ5IGRlZmF1bHQsIGJ1dAorbWF5IGJlIG92ZXJyaWRkZW4gdmlhIGJvb3QtdGltZSBwYXJhbWV0ZXIgb3IgYXQgcnVudGltZSB2aWEgc3lzZnMuCitUaGUgc3RhbGwgZGV0ZWN0b3IncyBpZGVhIG9mIHdoYXQgY29uc3RpdHV0ZXMgInVuZHVseSBkZWxheWVkIiBpcworY29udHJvbGxlZCBieSBhIHNldCBvZiBrZXJuZWwgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgYW5kIGNwcCBtYWNyb3M6CiAKLVJDVV9TRUNPTkRTX1RJTExfU1RBTExfQ0hFQ0sKK0NPTkZJR19SQ1VfQ1BVX1NUQUxMX1RJTUVPVVQKIAotCVRoaXMgbWFjcm8gZGVmaW5lcyB0aGUgcGVyaW9kIG9mIHRpbWUgdGhhdCBSQ1Ugd2lsbCB3YWl0IGZyb20KLQl0aGUgYmVnaW5uaW5nIG9mIGEgZ3JhY2UgcGVyaW9kIHVudGlsIGl0IGlzc3VlcyBhbiBSQ1UgQ1BVCi0Jc3RhbGwgd2FybmluZy4JVGhpcyB0aW1lIHBlcmlvZCBpcyBub3JtYWxseSB0ZW4gc2Vjb25kcy4KKwlUaGlzIGtlcm5lbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBkZWZpbmVzIHRoZSBwZXJpb2Qgb2YgdGltZQorCXRoYXQgUkNVIHdpbGwgd2FpdCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgYSBncmFjZSBwZXJpb2QgdW50aWwgaXQKKwlpc3N1ZXMgYW4gUkNVIENQVSBzdGFsbCB3YXJuaW5nLiAgVGhpcyB0aW1lIHBlcmlvZCBpcyBub3JtYWxseQorCXRlbiBzZWNvbmRzLgogCiBSQ1VfU0VDT05EU19USUxMX1NUQUxMX1JFQ0hFQ0sKIAogCVRoaXMgbWFjcm8gZGVmaW5lcyB0aGUgcGVyaW9kIG9mIHRpbWUgdGhhdCBSQ1Ugd2lsbCB3YWl0IGFmdGVyCiAJaXNzdWluZyBhIHN0YWxsIHdhcm5pbmcgdW50aWwgaXQgaXNzdWVzIGFub3RoZXIgc3RhbGwgd2FybmluZwotCWZvciB0aGUgc2FtZSBzdGFsbC4gIFRoaXMgdGltZSBwZXJpb2QgaXMgbm9ybWFsbHkgc2V0IHRvIHRoaXJ0eQotCXNlY29uZHMuCisJZm9yIHRoZSBzYW1lIHN0YWxsLiAgVGhpcyB0aW1lIHBlcmlvZCBpcyBub3JtYWxseSBzZXQgdG8gdGhyZWUKKwl0aW1lcyB0aGUgY2hlY2sgaW50ZXJ2YWwgcGx1cyB0aGlydHkgc2Vjb25kcy4KIAogUkNVX1NUQUxMX1JBVF9ERUxBWQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS90cmFjZS50eHQgYi9Eb2N1bWVudGF0aW9uL1JDVS90cmFjZS50eHQKaW5kZXggNmE4YzczZi4uYzA3OGFkNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9SQ1UvdHJhY2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUkNVL3RyYWNlLnR4dApAQCAtMTAsMzQgKzEwLDQ2IEBACiAKIENPTkZJR19UUkVFX1JDVSBhbmQgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UgZGVidWdmcyBGaWxlcyBhbmQgRm9ybWF0cwogCi1UaGVzZSBpbXBsZW1lbnRhdGlvbnMgb2YgUkNVIHByb3ZpZGVzIGZpdmUgZGVidWdmcyBmaWxlcyB1bmRlciB0aGUKLXRvcC1sZXZlbCBkaXJlY3RvcnkgUkNVOiByY3UvcmN1ZGF0YSAod2hpY2ggZGlzcGxheXMgZmllbGRzIGluIHN0cnVjdAotcmN1X2RhdGEpLCByY3UvcmN1ZGF0YS5jc3YgKHdoaWNoIGlzIGEgLmNzdiBzcHJlYWRzaGVldCB2ZXJzaW9uIG9mCi1yY3UvcmN1ZGF0YSksIHJjdS9yY3VncCAod2hpY2ggZGlzcGxheXMgZ3JhY2UtcGVyaW9kIGNvdW50ZXJzKSwKLXJjdS9yY3VoaWVyICh3aGljaCBkaXNwbGF5cyB0aGUgc3RydWN0IHJjdV9ub2RlIGhpZXJhcmNoeSksIGFuZAotcmN1L3JjdV9wZW5kaW5nICh3aGljaCBkaXNwbGF5cyBjb3VudHMgb2YgdGhlIHJlYXNvbnMgdGhhdCB0aGUKLXJjdV9wZW5kaW5nKCkgZnVuY3Rpb24gZGVjaWRlZCB0aGF0IHRoZXJlIHdhcyBjb3JlIFJDVSB3b3JrIHRvIGRvKS4KK1RoZXNlIGltcGxlbWVudGF0aW9ucyBvZiBSQ1UgcHJvdmlkZXMgc2V2ZXJhbCBkZWJ1Z2ZzIGZpbGVzIHVuZGVyIHRoZQordG9wLWxldmVsIGRpcmVjdG9yeSAicmN1IjoKKworcmN1L3JjdWRhdGE6CisJRGlzcGxheXMgZmllbGRzIGluIHN0cnVjdCByY3VfZGF0YS4KK3JjdS9yY3VkYXRhLmNzdjoKKwlDb21tYS1zZXBhcmF0ZWQgdmFsdWVzIHNwcmVhZHNoZWV0IHZlcnNpb24gb2YgcmN1ZGF0YS4KK3JjdS9yY3VncDoKKwlEaXNwbGF5cyBncmFjZS1wZXJpb2QgY291bnRlcnMuCityY3UvcmN1aGllcjoKKwlEaXNwbGF5cyB0aGUgc3RydWN0IHJjdV9ub2RlIGhpZXJhcmNoeS4KK3JjdS9yY3VfcGVuZGluZzoKKwlEaXNwbGF5cyBjb3VudHMgb2YgdGhlIHJlYXNvbnMgcmN1X3BlbmRpbmcoKSBkZWNpZGVkIHRoYXQgUkNVIGhhZAorCXdvcmsgdG8gZG8uCityY3UvcmN1dG9ydHVyZToKKwlEaXNwbGF5cyByY3V0b3J0dXJlIHRlc3QgcHJvZ3Jlc3MuCityY3UvcmN1Ym9vc3Q6CisJRGlzcGxheXMgUkNVIGJvb3N0aW5nIHN0YXRpc3RpY3MuICBPbmx5IHByZXNlbnQgaWYKKwlDT05GSUdfUkNVX0JPT1NUPXkuCiAKIFRoZSBvdXRwdXQgb2YgImNhdCByY3UvcmN1ZGF0YSIgbG9va3MgYXMgZm9sbG93czoKIAogcmN1X3NjaGVkOgotICAwIGM9MTc4MjkgZz0xNzgyOSBwcT0xIHBxYz0xNzgyOSBxcD0wIGR0PTEwOTUxLzEgZG49MCBkZj0xMTAxIG9mPTAgcmk9MzYgcWw9MCBiPTEwCi0gIDEgYz0xNzgyOSBnPTE3ODI5IHBxPTEgcHFjPTE3ODI5IHFwPTAgZHQ9MTYxMTcvMSBkbj0wIGRmPTEwMTUgb2Y9MCByaT0wIHFsPTAgYj0xMAotICAyIGM9MTc4MjkgZz0xNzgyOSBwcT0xIHBxYz0xNzgyOSBxcD0wIGR0PTE0NDUvMSBkbj0wIGRmPTE4Mzkgb2Y9MCByaT0wIHFsPTAgYj0xMAotICAzIGM9MTc4MjkgZz0xNzgyOSBwcT0xIHBxYz0xNzgyOSBxcD0wIGR0PTY2ODEvMSBkbj0wIGRmPTE1NDUgb2Y9MCByaT0wIHFsPTAgYj0xMAotICA0IGM9MTc4MjkgZz0xNzgyOSBwcT0xIHBxYz0xNzgyOSBxcD0wIGR0PTEwMDMvMSBkbj0wIGRmPTE5OTIgb2Y9MCByaT0wIHFsPTAgYj0xMAotICA1IGM9MTc4MjkgZz0xNzgzMCBwcT0xIHBxYz0xNzgyOSBxcD0xIGR0PTM4ODcvMSBkbj0wIGRmPTMzMzEgb2Y9MCByaT00IHFsPTIgYj0xMAotICA2IGM9MTc4MjkgZz0xNzgyOSBwcT0xIHBxYz0xNzgyOSBxcD0wIGR0PTg1OS8xIGRuPTAgZGY9MzIyNCBvZj0wIHJpPTAgcWw9MCBiPTEwCi0gIDcgYz0xNzgyOSBnPTE3ODMwIHBxPTAgcHFjPTE3ODI5IHFwPTEgZHQ9Mzc2MS8xIGRuPTAgZGY9MTgxOCBvZj0wIHJpPTAgcWw9MiBiPTEwCisgIDAgYz0yMDk3MiBnPTIwOTczIHBxPTEgcHFjPTIwOTcyIHFwPTAgZHQ9NTQ1LzEvMCBkZj01MCBvZj0wIHJpPTAgcWw9MTYzIHFzPU5SVy4ga3Q9MC9XLzAga3RsPWViYzMgYj0xMCBjaT0xNTM3MzcgY289MCBjYT0wCisgIDEgYz0yMDk3MiBnPTIwOTczIHBxPTEgcHFjPTIwOTcyIHFwPTAgZHQ9OTY3LzEvMCBkZj01OCBvZj0wIHJpPTAgcWw9NjM0IHFzPU5SVy4ga3Q9MC9XLzEga3RsPTU4YyBiPTEwIGNpPTE5MTAzNyBjbz0wIGNhPTAKKyAgMiBjPTIwOTcyIGc9MjA5NzMgcHE9MSBwcWM9MjA5NzIgcXA9MCBkdD0xMDgxLzEvMCBkZj0xNzUgb2Y9MCByaT0wIHFsPTc0IHFzPU4uVy4ga3Q9MC9XLzIga3RsPWRhOTQgYj0xMCBjaT03NTk5MSBjbz0wIGNhPTAKKyAgMyBjPTIwOTQyIGc9MjA5NDMgcHE9MSBwcWM9MjA5NDIgcXA9MSBkdD0xODQ2LzAvMCBkZj00MDQgb2Y9MCByaT0wIHFsPTAgcXM9Li4uLiBrdD0wL1cvMyBrdGw9ZDFjZCBiPTEwIGNpPTcyMjYxIGNvPTAgY2E9MAorICA0IGM9MjA5NzIgZz0yMDk3MyBwcT0xIHBxYz0yMDk3MiBxcD0wIGR0PTM2OS8xLzAgZGY9ODMgb2Y9MCByaT0wIHFsPTQ4IHFzPU4uVy4ga3Q9MC9XLzQga3RsPWUwZTcgYj0xMCBjaT0xMjgzNjUgY289MCBjYT0wCisgIDUgYz0yMDk3MiBnPTIwOTczIHBxPTEgcHFjPTIwOTcyIHFwPTAgZHQ9MzgxLzEvMCBkZj02NCBvZj0wIHJpPTAgcWw9MTY5IHFzPU5SVy4ga3Q9MC9XLzUga3RsPWZiMmYgYj0xMCBjaT0xNjQzNjAgY289MCBjYT0wCisgIDYgYz0yMDk3MiBnPTIwOTczIHBxPTEgcHFjPTIwOTcyIHFwPTAgZHQ9MTAzNy8xLzAgZGY9MTgzIG9mPTAgcmk9MCBxbD02MiBxcz1OLlcuIGt0PTAvVy82IGt0bD1kMmFkIGI9MTAgY2k9NjU2NjMgY289MCBjYT0wCisgIDcgYz0yMDg5NyBnPTIwODk3IHBxPTEgcHFjPTIwODk2IHFwPTAgZHQ9MTU3Mi8wLzAgZGY9MzgyIG9mPTAgcmk9MCBxbD0wIHFzPS4uLi4ga3Q9MC9XLzcga3RsPWNmMTUgYj0xMCBjaT03NTAwNiBjbz0wIGNhPTAKIHJjdV9iaDoKLSAgMCBjPS0yNzUgZz0tMjc1IHBxPTEgcHFjPS0yNzUgcXA9MCBkdD0xMDk1MS8xIGRuPTAgZGY9MCBvZj0wIHJpPTAgcWw9MCBiPTEwCi0gIDEgYz0tMjc1IGc9LTI3NSBwcT0xIHBxYz0tMjc1IHFwPTAgZHQ9MTYxMTcvMSBkbj0wIGRmPTEzIG9mPTAgcmk9MCBxbD0wIGI9MTAKLSAgMiBjPS0yNzUgZz0tMjc1IHBxPTEgcHFjPS0yNzUgcXA9MCBkdD0xNDQ1LzEgZG49MCBkZj0xNSBvZj0wIHJpPTAgcWw9MCBiPTEwCi0gIDMgYz0tMjc1IGc9LTI3NSBwcT0xIHBxYz0tMjc1IHFwPTAgZHQ9NjY4MS8xIGRuPTAgZGY9OSBvZj0wIHJpPTAgcWw9MCBiPTEwCi0gIDQgYz0tMjc1IGc9LTI3NSBwcT0xIHBxYz0tMjc1IHFwPTAgZHQ9MTAwMy8xIGRuPTAgZGY9MTUgb2Y9MCByaT0wIHFsPTAgYj0xMAotICA1IGM9LTI3NSBnPS0yNzUgcHE9MSBwcWM9LTI3NSBxcD0wIGR0PTM4ODcvMSBkbj0wIGRmPTE1IG9mPTAgcmk9MCBxbD0wIGI9MTAKLSAgNiBjPS0yNzUgZz0tMjc1IHBxPTEgcHFjPS0yNzUgcXA9MCBkdD04NTkvMSBkbj0wIGRmPTE1IG9mPTAgcmk9MCBxbD0wIGI9MTAKLSAgNyBjPS0yNzUgZz0tMjc1IHBxPTEgcHFjPS0yNzUgcXA9MCBkdD0zNzYxLzEgZG49MCBkZj0xNSBvZj0wIHJpPTAgcWw9MCBiPTEwCisgIDAgYz0xNDgwIGc9MTQ4MCBwcT0xIHBxYz0xNDc5IHFwPTAgZHQ9NTQ1LzEvMCBkZj02IG9mPTAgcmk9MSBxbD0wIHFzPS4uLi4ga3Q9MC9XLzAga3RsPWViYzMgYj0xMCBjaT0wIGNvPTAgY2E9MAorICAxIGM9MTQ4MCBnPTE0ODAgcHE9MSBwcWM9MTQ3OSBxcD0wIGR0PTk2Ny8xLzAgZGY9MyBvZj0wIHJpPTEgcWw9MCBxcz0uLi4uIGt0PTAvVy8xIGt0bD01OGMgYj0xMCBjaT0xNTEgY289MCBjYT0wCisgIDIgYz0xNDgwIGc9MTQ4MCBwcT0xIHBxYz0xNDc5IHFwPTAgZHQ9MTA4MS8xLzAgZGY9NiBvZj0wIHJpPTEgcWw9MCBxcz0uLi4uIGt0PTAvVy8yIGt0bD1kYTk0IGI9MTAgY2k9MCBjbz0wIGNhPTAKKyAgMyBjPTE0ODAgZz0xNDgwIHBxPTEgcHFjPTE0NzkgcXA9MCBkdD0xODQ2LzAvMCBkZj04IG9mPTAgcmk9MSBxbD0wIHFzPS4uLi4ga3Q9MC9XLzMga3RsPWQxY2QgYj0xMCBjaT0wIGNvPTAgY2E9MAorICA0IGM9MTQ4MCBnPTE0ODAgcHE9MSBwcWM9MTQ3OSBxcD0wIGR0PTM2OS8xLzAgZGY9NiBvZj0wIHJpPTEgcWw9MCBxcz0uLi4uIGt0PTAvVy80IGt0bD1lMGU3IGI9MTAgY2k9MCBjbz0wIGNhPTAKKyAgNSBjPTE0ODAgZz0xNDgwIHBxPTEgcHFjPTE0NzkgcXA9MCBkdD0zODEvMS8wIGRmPTQgb2Y9MCByaT0xIHFsPTAgcXM9Li4uLiBrdD0wL1cvNSBrdGw9ZmIyZiBiPTEwIGNpPTAgY289MCBjYT0wCisgIDYgYz0xNDgwIGc9MTQ4MCBwcT0xIHBxYz0xNDc5IHFwPTAgZHQ9MTAzNy8xLzAgZGY9NiBvZj0wIHJpPTEgcWw9MCBxcz0uLi4uIGt0PTAvVy82IGt0bD1kMmFkIGI9MTAgY2k9MCBjbz0wIGNhPTAKKyAgNyBjPTE0NzQgZz0xNDc0IHBxPTEgcHFjPTE0NzMgcXA9MCBkdD0xNTcyLzAvMCBkZj04IG9mPTAgcmk9MSBxbD0wIHFzPS4uLi4ga3Q9MC9XLzcga3RsPWNmMTUgYj0xMCBjaT0wIGNvPTAgY2E9MAogCiBUaGUgZmlyc3Qgc2VjdGlvbiBsaXN0cyB0aGUgcmN1X2RhdGEgc3RydWN0dXJlcyBmb3IgcmN1X3NjaGVkLCB0aGUgc2Vjb25kCiBmb3IgcmN1X2JoLiAgTm90ZSB0aGF0IENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGtlcm5lbHMgd2lsbCBoYXZlIGFuCkBAIC01MiwxNyArNjQsMTggQEAKIAlzdWJzdGFudGlhbGx5IGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYWN0dWFsIENQVXMuCiAKIG8JImMiIGlzIHRoZSBjb3VudCBvZiBncmFjZSBwZXJpb2RzIHRoYXQgdGhpcyBDUFUgYmVsaWV2ZXMgaGF2ZQotCWNvbXBsZXRlZC4gIENQVXMgaW4gZHludGlja3MgaWRsZSBtb2RlIG1heSBsYWcgcXVpdGUgYSB3YXlzCi0JYmVoaW5kLCBmb3IgZXhhbXBsZSwgQ1BVIDQgdW5kZXIgInJjdV9zY2hlZCIgYWJvdmUsIHdoaWNoIGhhcwotCXNsZXB0IHRocm91Z2ggdGhlIHBhc3QgMjUgUkNVIGdyYWNlIHBlcmlvZHMuICBJdCBpcyBub3QgdW51c3VhbAotCXRvIHNlZSBDUFVzIGxhZ2dpbmcgYnkgdGhvdXNhbmRzIG9mIGdyYWNlIHBlcmlvZHMuCisJY29tcGxldGVkLiAgT2ZmbGluZWQgQ1BVcyBhbmQgQ1BVcyBpbiBkeW50aWNrcyBpZGxlIG1vZGUgbWF5CisJbGFnIHF1aXRlIGEgd2F5cyBiZWhpbmQsIGZvciBleGFtcGxlLCBDUFUgNiB1bmRlciAicmN1X3NjaGVkIgorCWFib3ZlLCB3aGljaCBoYXMgYmVlbiBvZmZsaW5lIHRocm91Z2ggbm90IHF1aXRlIDQwLDAwMCBSQ1UgZ3JhY2UKKwlwZXJpb2RzLiAgSXQgaXMgbm90IHVudXN1YWwgdG8gc2VlIENQVXMgbGFnZ2luZyBieSB0aG91c2FuZHMgb2YKKwlncmFjZSBwZXJpb2RzLgogCiBvCSJnIiBpcyB0aGUgY291bnQgb2YgZ3JhY2UgcGVyaW9kcyB0aGF0IHRoaXMgQ1BVIGJlbGlldmVzIGhhdmUKLQlzdGFydGVkLiAgQWdhaW4sIENQVXMgaW4gZHludGlja3MgaWRsZSBtb2RlIG1heSBsYWcgYmVoaW5kLgotCUlmIHRoZSAiYyIgYW5kICJnIiB2YWx1ZXMgYXJlIGVxdWFsLCB0aGlzIENQVSBoYXMgYWxyZWFkeQotCXJlcG9ydGVkIGEgcXVpZXNjZW50IHN0YXRlIGZvciB0aGUgbGFzdCBSQ1UgZ3JhY2UgcGVyaW9kIHRoYXQKLQlpdCBpcyBhd2FyZSBvZiwgb3RoZXJ3aXNlLCB0aGUgQ1BVIGJlbGlldmVzIHRoYXQgaXQgb3dlcyBSQ1UgYQotCXF1aWVzY2VudCBzdGF0ZS4KKwlzdGFydGVkLiAgQWdhaW4sIG9mZmxpbmVkIENQVXMgYW5kIENQVXMgaW4gZHludGlja3MgaWRsZSBtb2RlCisJbWF5IGxhZyBiZWhpbmQuICBJZiB0aGUgImMiIGFuZCAiZyIgdmFsdWVzIGFyZSBlcXVhbCwgdGhpcyBDUFUKKwloYXMgYWxyZWFkeSByZXBvcnRlZCBhIHF1aWVzY2VudCBzdGF0ZSBmb3IgdGhlIGxhc3QgUkNVIGdyYWNlCisJcGVyaW9kIHRoYXQgaXQgaXMgYXdhcmUgb2YsIG90aGVyd2lzZSwgdGhlIENQVSBiZWxpZXZlcyB0aGF0IGl0CisJb3dlcyBSQ1UgYSBxdWllc2NlbnQgc3RhdGUuCiAKIG8JInBxIiBpbmRpY2F0ZXMgdGhhdCB0aGlzIENQVSBoYXMgcGFzc2VkIHRocm91Z2ggYSBxdWllc2NlbnQgc3RhdGUKIAlmb3IgdGhlIGN1cnJlbnQgZ3JhY2UgcGVyaW9kLiAgSXQgaXMgcG9zc2libGUgZm9yICJwcSIgdG8gYmUKQEAgLTgxLDcgKzk0LDggQEAKIAl0aGUgbmV4dCBncmFjZSBwZXJpb2QhCiAKIG8JInFwIiBpbmRpY2F0ZXMgdGhhdCBSQ1Ugc3RpbGwgZXhwZWN0cyBhIHF1aWVzY2VudCBzdGF0ZSBmcm9tCi0JdGhpcyBDUFUuCisJdGhpcyBDUFUuICBPZmZsaW5lZCBDUFVzIGFuZCBDUFVzIGluIGR5bnRpY2sgaWRsZSBtb2RlIG1pZ2h0CisJd2VsbCBoYXZlIHFwPTEsIHdoaWNoIGlzIE9LOiBSQ1UgaXMgc3RpbGwgaWdub3JpbmcgdGhlbS4KIAogbwkiZHQiIGlzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBkeW50aWNrIGNvdW50ZXIgdGhhdCBpcyBpbmNyZW1lbnRlZAogCXdoZW4gZW50ZXJpbmcgb3IgbGVhdmluZyBkeW50aWNrcyBpZGxlIHN0YXRlLCBlaXRoZXIgYnkgdGhlCkBAIC0xMDgsNyArMTIyLDcgQEAKIAogbwkib2YiIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBzb21lIG90aGVyIENQVSBoYXMgZm9yY2VkIGEKIAlxdWllc2NlbnQgc3RhdGUgb24gYmVoYWxmIG9mIHRoaXMgQ1BVIGR1ZSB0byB0aGlzIENQVSBiZWluZwotCW9mZmxpbmUuICBJbiBhIHBlcmZlY3Qgd29ybGQsIHRoaXMgbWlnaHQgbmV2ZSBoYXBwZW4sIGJ1dCBpdAorCW9mZmxpbmUuICBJbiBhIHBlcmZlY3Qgd29ybGQsIHRoaXMgbWlnaHQgbmV2ZXIgaGFwcGVuLCBidXQgaXQKIAl0dXJucyBvdXQgdGhhdCBvZmZsaW5pbmcgYW5kIG9ubGluaW5nIGEgQ1BVIGNhbiB0YWtlIHNldmVyYWwgZ3JhY2UKIAlwZXJpb2RzLCBhbmQgc28gdGhlcmUgaXMgbGlrZWx5IHRvIGJlIGFuIGV4dGVuZGVkIHBlcmlvZCBvZiB0aW1lCiAJd2hlbiBSQ1UgYmVsaWV2ZXMgdGhhdCB0aGUgQ1BVIGlzIG9ubGluZSB3aGVuIGl0IHJlYWxseSBpcyBub3QuCkBAIC0xMjUsNiArMTM5LDYyIEBACiAJb2Ygd2hhdCBzdGF0ZSB0aGV5IGFyZSBpbiAobmV3LCB3YWl0aW5nIGZvciBncmFjZSBwZXJpb2QgdG8KIAlzdGFydCwgd2FpdGluZyBmb3IgZ3JhY2UgcGVyaW9kIHRvIGVuZCwgcmVhZHkgdG8gaW52b2tlKS4KIAorbwkicXMiIGdpdmVzIGFuIGluZGljYXRpb24gb2YgdGhlIHN0YXRlIG9mIHRoZSBjYWxsYmFjayBxdWV1ZQorCXdpdGggZm91ciBjaGFyYWN0ZXJzOgorCisJIk4iCUluZGljYXRlcyB0aGF0IHRoZXJlIGFyZSBjYWxsYmFja3MgcXVldWVkIHRoYXQgYXJlIG5vdAorCQlyZWFkeSB0byBiZSBoYW5kbGVkIGJ5IHRoZSBuZXh0IGdyYWNlIHBlcmlvZCwgYW5kIHRodXMKKwkJd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBncmFjZSBwZXJpb2QgZm9sbG93aW5nIHRoZSBuZXh0CisJCW9uZS4KKworCSJSIglJbmRpY2F0ZXMgdGhhdCB0aGVyZSBhcmUgY2FsbGJhY2tzIHF1ZXVlZCB0aGF0IGFyZQorCQlyZWFkeSB0byBiZSBoYW5kbGVkIGJ5IHRoZSBuZXh0IGdyYWNlIHBlcmlvZC4KKworCSJXIglJbmRpY2F0ZXMgdGhhdCB0aGVyZSBhcmUgY2FsbGJhY2tzIHF1ZXVlZCB0aGF0IGFyZQorCQl3YWl0aW5nIG9uIHRoZSBjdXJyZW50IGdyYWNlIHBlcmlvZC4KKworCSJEIglJbmRpY2F0ZXMgdGhhdCB0aGVyZSBhcmUgY2FsbGJhY2tzIHF1ZXVlZCB0aGF0IGhhdmUKKwkJYWxyZWFkeSBiZWVuIGhhbmRsZWQgYnkgYSBwcmlvciBncmFjZSBwZXJpb2QsIGFuZCBhcmUKKwkJdGh1cyB3YWl0aW5nIHRvIGJlIGludm9rZWQuICBOb3RlIHRoYXQgY2FsbGJhY2tzIGluCisJCXRoZSBwcm9jZXNzIG9mIGJlaW5nIGludm9rZWQgYXJlIG5vdCBjb3VudGVkIGhlcmUuCisJCUNhbGxiYWNrcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBpbnZva2VkIGFyZSB0aG9zZQorCQl0aGF0IGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHJjdV9kYXRhIHN0cnVjdHVyZXMKKwkJcXVldWVzIGJ5IHJjdV9kb19iYXRjaCgpLCBidXQgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW4KKwkJaW52b2tlZC4KKworCUlmIHRoZXJlIGFyZSBubyBjYWxsYmFja3MgaW4gYSBnaXZlbiBvbmUgb2YgdGhlIGFib3ZlIHN0YXRlcywKKwl0aGUgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXIgaXMgcmVwbGFjZWQgYnkgIi4iLgorCitvCSJrdCIgaXMgdGhlIHBlci1DUFUga2VybmVsLXRocmVhZCBzdGF0ZS4gIFRoZSBkaWdpdCBwcmVjZWRpbmcKKwl0aGUgZmlyc3Qgc2xhc2ggaXMgemVybyBpZiB0aGVyZSBpcyBubyB3b3JrIHBlbmRpbmcgYW5kIDEKKwlvdGhlcndpc2UuICBUaGUgY2hhcmFjdGVyIGJldHdlZW4gdGhlIGZpcnN0IHBhaXIgb2Ygc2xhc2hlcyBpcworCWFzIGZvbGxvd3M6CisKKwkiUyIJVGhlIGtlcm5lbCB0aHJlYWQgaXMgc3RvcHBlZCwgaW4gb3RoZXIgd29yZHMsIGFsbAorCQlDUFVzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyByY3Vfbm9kZSBzdHJ1Y3R1cmUgYXJlCisJCW9mZmxpbmUuCisKKwkiUiIJVGhlIGtlcm5lbCB0aHJlYWQgaXMgcnVubmluZy4KKworCSJXIglUaGUga2VybmVsIHRocmVhZCBpcyB3YWl0aW5nIGJlY2F1c2UgdGhlcmUgaXMgbm8gd29yaworCQlmb3IgaXQgdG8gZG8uCisKKwkiTyIJVGhlIGtlcm5lbCB0aHJlYWQgaXMgd2FpdGluZyBiZWNhdXNlIGl0IGhhcyBiZWVuCisJCWZvcmNlZCBvZmYgb2YgaXRzIGRlc2lnbmF0ZWQgQ1BVIG9yIGJlY2F1c2UgaXRzCisJCS0+Y3B1c19hbGxvd2VkIG1hc2sgcGVybWl0cyBpdCB0byBydW4gb24gb3RoZXIgdGhhbgorCQlpdHMgZGVzaWduYXRlZCBDUFUuCisKKwkiWSIJVGhlIGtlcm5lbCB0aHJlYWQgaXMgeWllbGRpbmcgdG8gYXZvaWQgaG9nZ2luZyBDUFUuCisKKwkiPyIJVW5rbm93biB2YWx1ZSwgaW5kaWNhdGVzIGEgYnVnLgorCisJVGhlIG51bWJlciBhZnRlciB0aGUgZmluYWwgc2xhc2ggaXMgdGhlIENQVSB0aGF0IHRoZSBrdGhyZWFkCisJaXMgYWN0dWFsbHkgcnVubmluZyBvbi4KKworbwkia3RsIiBpcyB0aGUgbG93LW9yZGVyIDE2IGJpdHMgKGluIGhleGFkZWNpbWFsKSBvZiB0aGUgY291bnQgb2YKKwl0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgdGhpcyBDUFUncyBwZXItQ1BVIGt0aHJlYWQgaGFzIGdvbmUKKwl0aHJvdWdoIGl0cyBsb29wIHNlcnZpY2luZyBpbnZva2VfcmN1X2NwdV9rdGhyZWFkKCkgcmVxdWVzdHMuCisKIG8JImIiIGlzIHRoZSBiYXRjaCBsaW1pdCBmb3IgdGhpcyBDUFUuICBJZiBtb3JlIHRoYW4gdGhpcyBudW1iZXIKIAlvZiBSQ1UgY2FsbGJhY2tzIGlzIHJlYWR5IHRvIGludm9rZSwgdGhlbiB0aGUgcmVtYWluZGVyIHdpbGwKIAliZSBkZWZlcnJlZC4KQEAgLTE3NCwxNCArMjQ0LDE0IEBACiBUaGUgb3V0cHV0IG9mICJjYXQgcmN1L3JjdWhpZXIiIGxvb2tzIGFzIGZvbGxvd3MsIHdpdGggdmVyeSBsb25nIGxpbmVzOgogCiBjPTY5MDIgZz02OTAzIHM9MiBqZnE9MyBqPTcyYzcgbmZxcz0xMzE0Mi9uZnFzbmc9MCgxMzE0MikgZnFsaD02Ci0xLzEgLj4uIDA6MTI3IF4wICAgIAotMy8zIC4+LiAwOjM1IF4wICAgIDAvMCAuPi4gMzY6NzEgXjEgICAgMC8wIC4+LiA3MjoxMDcgXjIgICAgMC8wIC4+LiAxMDg6MTI3IF4zICAgIAotMy8zZiAuPi4gMDo1IF4wICAgIDIvMyAuPi4gNjoxMSBeMSAgICAwLzAgLj4uIDEyOjE3IF4yICAgIDAvMCAuPi4gMTg6MjMgXjMgICAgMC8wIC4+LiAyNDoyOSBeNCAgICAwLzAgLj4uIDMwOjM1IF41ICAgIDAvMCAuPi4gMzY6NDEgXjAgICAgMC8wIC4+LiA0Mjo0NyBeMSAgICAwLzAgLj4uIDQ4OjUzIF4yICAgIDAvMCAuPi4gNTQ6NTkgXjMgICAgMC8wIC4+LiA2MDo2NSBeNCAgICAwLzAgLj4uIDY2OjcxIF41ICAgIDAvMCAuPi4gNzI6NzcgXjAgICAgMC8wIC4+LiA3ODo4MyBeMSAgICAwLzAgLj4uIDg0Ojg5IF4yICAgIDAvMCAuPi4gOTA6OTUgXjMgICAgMC8wIC4+LiA5NjoxMDEgXjQgICAgMC8wIC4+LiAxMDI6MTA3IF41ICAgIDAvMCAuPi4gMTA4OjExMyBeMCAgICAwLzAgLj4uIDExNDoxMTkgXjEgICAgMC8wIC4+LiAxMjA6MTI1IF4yICAgIDAvMCAuPi4gMTI2OjEyNyBeMyAgICAKKzEvMSAuLj4uIDA6MTI3IF4wCiszLzMgLi4+LiAwOjM1IF4wICAgIDAvMCAuLj4uIDM2OjcxIF4xICAgIDAvMCAuLj4uIDcyOjEwNyBeMiAgICAwLzAgLi4+LiAxMDg6MTI3IF4zCiszLzNmIC4uPi4gMDo1IF4wICAgIDIvMyAuLj4uIDY6MTEgXjEgICAgMC8wIC4uPi4gMTI6MTcgXjIgICAgMC8wIC4uPi4gMTg6MjMgXjMgICAgMC8wIC4uPi4gMjQ6MjkgXjQgICAgMC8wIC4uPi4gMzA6MzUgXjUgICAgMC8wIC4uPi4gMzY6NDEgXjAgICAgMC8wIC4uPi4gNDI6NDcgXjEgICAgMC8wIC4uPi4gNDg6NTMgXjIgICAgMC8wIC4uPi4gNTQ6NTkgXjMgICAgMC8wIC4uPi4gNjA6NjUgXjQgICAgMC8wIC4uPi4gNjY6NzEgXjUgICAgMC8wIC4uPi4gNzI6NzcgXjAgICAgMC8wIC4uPi4gNzg6ODMgXjEgICAgMC8wIC4uPi4gODQ6ODkgXjIgICAgMC8wIC4uPi4gOTA6OTUgXjMgICAgMC8wIC4uPi4gOTY6MTAxIF40ICAgIDAvMCAuLj4uIDEwMjoxMDcgXjUgICAgMC8wIC4uPi4gMTA4OjExMyBeMCAgICAwLzAgLi4+LiAxMTQ6MTE5IF4xICAgIDAvMCAuLj4uIDEyMDoxMjUgXjIgICAgMC8wIC4uPi4gMTI2OjEyNyBeMwogcmN1X2JoOgogYz0tMjI2IGc9LTIyNiBzPTEgamZxPS01NzAxIGo9NzJjNyBuZnFzPTg4L25mcXNuZz0wKDg4KSBmcWxoPTAKLTAvMSAuPi4gMDoxMjcgXjAgICAgCi0wLzMgLj4uIDA6MzUgXjAgICAgMC8wIC4+LiAzNjo3MSBeMSAgICAwLzAgLj4uIDcyOjEwNyBeMiAgICAwLzAgLj4uIDEwODoxMjcgXjMgICAgCi0wLzNmIC4+LiAwOjUgXjAgICAgMC8zIC4+LiA2OjExIF4xICAgIDAvMCAuPi4gMTI6MTcgXjIgICAgMC8wIC4+LiAxODoyMyBeMyAgICAwLzAgLj4uIDI0OjI5IF40ICAgIDAvMCAuPi4gMzA6MzUgXjUgICAgMC8wIC4+LiAzNjo0MSBeMCAgICAwLzAgLj4uIDQyOjQ3IF4xICAgIDAvMCAuPi4gNDg6NTMgXjIgICAgMC8wIC4+LiA1NDo1OSBeMyAgICAwLzAgLj4uIDYwOjY1IF40ICAgIDAvMCAuPi4gNjY6NzEgXjUgICAgMC8wIC4+LiA3Mjo3NyBeMCAgICAwLzAgLj4uIDc4OjgzIF4xICAgIDAvMCAuPi4gODQ6ODkgXjIgICAgMC8wIC4+LiA5MDo5NSBeMyAgICAwLzAgLj4uIDk2OjEwMSBeNCAgICAwLzAgLj4uIDEwMjoxMDcgXjUgICAgMC8wIC4+LiAxMDg6MTEzIF4wICAgIDAvMCAuPi4gMTE0OjExOSBeMSAgICAwLzAgLj4uIDEyMDoxMjUgXjIgICAgMC8wIC4+LiAxMjY6MTI3IF4zCiswLzEgLi4+LiAwOjEyNyBeMAorMC8zIC4uPi4gMDozNSBeMCAgICAwLzAgLi4+LiAzNjo3MSBeMSAgICAwLzAgLi4+LiA3MjoxMDcgXjIgICAgMC8wIC4uPi4gMTA4OjEyNyBeMworMC8zZiAuLj4uIDA6NSBeMCAgICAwLzMgLi4+LiA2OjExIF4xICAgIDAvMCAuLj4uIDEyOjE3IF4yICAgIDAvMCAuLj4uIDE4OjIzIF4zICAgIDAvMCAuLj4uIDI0OjI5IF40ICAgIDAvMCAuLj4uIDMwOjM1IF41ICAgIDAvMCAuLj4uIDM2OjQxIF4wICAgIDAvMCAuLj4uIDQyOjQ3IF4xICAgIDAvMCAuLj4uIDQ4OjUzIF4yICAgIDAvMCAuLj4uIDU0OjU5IF4zICAgIDAvMCAuLj4uIDYwOjY1IF40ICAgIDAvMCAuLj4uIDY2OjcxIF41ICAgIDAvMCAuLj4uIDcyOjc3IF4wICAgIDAvMCAuLj4uIDc4OjgzIF4xICAgIDAvMCAuLj4uIDg0Ojg5IF4yICAgIDAvMCAuLj4uIDkwOjk1IF4zICAgIDAvMCAuLj4uIDk2OjEwMSBeNCAgICAwLzAgLi4+LiAxMDI6MTA3IF41ICAgIDAvMCAuLj4uIDEwODoxMTMgXjAgICAgMC8wIC4uPi4gMTE0OjExOSBeMSAgICAwLzAgLi4+LiAxMjA6MTI1IF4yICAgIDAvMCAuLj4uIDEyNjoxMjcgXjMKIAogVGhpcyBpcyBvbmNlIGFnYWluIHNwbGl0IGludG8gInJjdV9zY2hlZCIgYW5kICJyY3VfYmgiIHBvcnRpb25zLAogYW5kIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGtlcm5lbHMgd2lsbCBhZ2FpbiBoYXZlIGFuIGFkZGl0aW9uYWwKQEAgLTI0MCwxMyArMzEwLDIwIEBACiAJCWN1cnJlbnQgZ3JhY2UgcGVyaW9kLgogCiAJbwlUaGUgY2hhcmFjdGVycyBzZXBhcmF0ZWQgYnkgdGhlICI+IiBpbmRpY2F0ZSB0aGUgc3RhdGUKLQkJb2YgdGhlIGJsb2NrZWQtdGFza3MgbGlzdHMuICBBICJUIiBwcmVjZWRpbmcgdGhlICI+IgorCQlvZiB0aGUgYmxvY2tlZC10YXNrcyBsaXN0cy4gIEEgIkciIHByZWNlZGluZyB0aGUgIj4iCiAJCWluZGljYXRlcyB0aGF0IGF0IGxlYXN0IG9uZSB0YXNrIGJsb2NrZWQgaW4gYW4gUkNVCiAJCXJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uIGJsb2NrcyB0aGUgY3VycmVudCBncmFjZQotCQlwZXJpb2QsIHdoaWxlIGEgIi4iIHByZWNlZGluZyB0aGUgIj4iIGluZGljYXRlcyBvdGhlcndpc2UuCi0JCVRoZSBjaGFyYWN0ZXIgZm9sbG93aW5nIHRoZSAiPiIgaW5kaWNhdGVzIHNpbWlsYXJseSBmb3IKLQkJdGhlIG5leHQgZ3JhY2UgcGVyaW9kLiAgQSAiVCIgc2hvdWxkIGFwcGVhciBpbiB0aGlzCi0JCWZpZWxkIG9ubHkgZm9yIHJjdS1wcmVlbXB0LgorCQlwZXJpb2QsIHdoaWxlIGEgIkUiIHByZWNlZGluZyB0aGUgIj4iIGluZGljYXRlcyB0aGF0CisJCWF0IGxlYXN0IG9uZSB0YXNrIGJsb2NrZWQgaW4gYW4gUkNVIHJlYWQtc2lkZSBjcml0aWNhbAorCQlzZWN0aW9uIGJsb2NrcyB0aGUgY3VycmVudCBleHBlZGl0ZWQgZ3JhY2UgcGVyaW9kLgorCQlBICJUIiBjaGFyYWN0ZXIgZm9sbG93aW5nIHRoZSAiPiIgaW5kaWNhdGVzIHRoYXQgYXQKKwkJbGVhc3Qgb25lIHRhc2sgaXMgYmxvY2tlZCB3aXRoaW4gYW4gUkNVIHJlYWQtc2lkZQorCQljcml0aWNhbCBzZWN0aW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW55IGN1cnJlbnQKKwkJZ3JhY2UgcGVyaW9kIChleHBlZGl0ZWQgb3Igbm9ybWFsKSBpcyBpbmNvbnZlbmllbmNlZC4KKwkJQSAiLiIgY2hhcmFjdGVyIGFwcGVhcnMgaWYgdGhlIGNvcnJlc3BvbmRpbmcgY29uZGl0aW9uCisJCWRvZXMgbm90IGhvbGQsIHNvIHRoYXQgIi4uPi4iIGluZGljYXRlcyB0aGF0IG5vIHRhc2tzCisJCWFyZSBibG9ja2VkLiAgSW4gY29udHJhc3QsICJHRT5UIiBpbmRpY2F0ZXMgbWF4aW1hbAorCQlpbmNvbnZlbmllbmNlIGZyb20gYmxvY2tlZCB0YXNrcy4KIAogCW8JVGhlIG51bWJlcnMgc2VwYXJhdGVkIGJ5IHRoZSAiOiIgYXJlIHRoZSByYW5nZSBvZiBDUFVzCiAJCXNlcnZlZCBieSB0aGlzIHN0cnVjdCByY3Vfbm9kZS4gIFRoaXMgY2FuIGJlIGhlbHBmdWwKQEAgLTMyOCw2ICs0MDUsMTEzIEBACiAJaXMgZHVlIHRvIHNob3J0LWNpcmN1aXQgZXZhbHVhdGlvbiBpbiByY3VfcGVuZGluZygpLgogCiAKK1RoZSBvdXRwdXQgb2YgImNhdCByY3UvcmN1dG9ydHVyZSIgbG9va3MgYXMgZm9sbG93czoKKworcmN1dG9ydHVyZSB0ZXN0IHNlcXVlbmNlOiAwICh0ZXN0IGluIHByb2dyZXNzKQorcmN1dG9ydHVyZSB1cGRhdGUgdmVyc2lvbiBudW1iZXI6IDYxNQorCitUaGUgZmlyc3QgbGluZSBzaG93cyB0aGUgbnVtYmVyIG9mIHJjdXRvcnR1cmUgdGVzdHMgdGhhdCBoYXZlIGNvbXBsZXRlZAorc2luY2UgYm9vdC4gIElmIGEgdGVzdCBpcyBjdXJyZW50bHkgcnVubmluZywgdGhlICIodGVzdCBpbiBwcm9ncmVzcykiCitzdHJpbmcgd2lsbCBhcHBlYXIgYXMgc2hvd24gYWJvdmUuICBUaGUgc2Vjb25kIGxpbmUgc2hvd3MgdGhlIG51bWJlciBvZgordXBkYXRlIGN5Y2xlcyB0aGF0IHRoZSBjdXJyZW50IHRlc3QgaGFzIHN0YXJ0ZWQsIG9yIHplcm8gaWYgdGhlcmUgaXMKK25vIHRlc3QgaW4gcHJvZ3Jlc3MuCisKKworVGhlIG91dHB1dCBvZiAiY2F0IHJjdS9yY3Vib29zdCIgbG9va3MgYXMgZm9sbG93czoKKworMDo1IHRhc2tzPS4uLi4ga3Q9VyBudGI9MCBuZWI9MCBubmI9MCBqPTJmOTUgYnQ9MzAwZgorICAgICBiYWxrOiBudD0wIGVndD05ODkgYnQ9MCBuYj0wIG55PTAgbm9zPTE2Cis2OjcgdGFza3M9Li4uLiBrdD1XIG50Yj0wIG5lYj0wIG5uYj0wIGo9MmY5NSBidD0zMDBmCisgICAgIGJhbGs6IG50PTAgZWd0PTIyNSBidD0wIG5iPTAgbnk9MCBub3M9NgorCitUaGlzIGluZm9ybWF0aW9uIGlzIG91dHB1dCBvbmx5IGZvciByY3VfcHJlZW1wdC4gIEVhY2ggdHdvLWxpbmUgZW50cnkKK2NvcnJlc3BvbmRzIHRvIGEgbGVhZiByY3Vfbm9kZSBzdHJjdXR1cmUuICBUaGUgZmllbGRzIGFyZSBhcyBmb2xsb3dzOgorCitvCSJuOm0iIGlzIHRoZSBDUFUtbnVtYmVyIHJhbmdlIGZvciB0aGUgY29ycmVzcG9uZGluZyB0d28tbGluZQorCWVudHJ5LiAgSW4gdGhlIHNhbXBsZSBvdXRwdXQgYWJvdmUsIHRoZSBmaXJzdCBlbnRyeSBjb3ZlcnMKKwlDUFVzIHplcm8gdGhyb3VnaCBmaXZlIGFuZCB0aGUgc2Vjb25kIGVudHJ5IGNvdmVycyBDUFVzIDYKKwlhbmQgNy4KKworbwkidGFza3M9VE5FQiIgZ2l2ZXMgdGhlIHN0YXRlIG9mIHRoZSB2YXJpb3VzIHNlZ21lbnRzIG9mIHRoZQorCXJucC0+YmxvY2tlZF90YXNrcyBsaXN0OgorCisJIlQiCVRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlcmUgYXJlIHNvbWUgdGFza3MgdGhhdCBibG9ja2VkCisJCXdoaWxlIHJ1bm5pbmcgb24gb25lIG9mIHRoZSBjb3JyZXNwb25kaW5nIENQVXMgd2hpbGUKKwkJaW4gYW4gUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uLgorCisJIk4iCVRoaXMgaW5kaWNhdGVzIHRoYXQgc29tZSBvZiB0aGUgYmxvY2tlZCB0YXNrcyBhcmUgcHJldmVudGluZworCQl0aGUgY3VycmVudCBub3JtYWwgKG5vbi1leHBlZGl0ZWQpIGdyYWNlIHBlcmlvZCBmcm9tCisJCWNvbXBsZXRpbmcuCisKKwkiRSIJVGhpcyBpbmRpY2F0ZXMgdGhhdCBzb21lIG9mIHRoZSBibG9ja2VkIHRhc2tzIGFyZSBwcmV2ZW50aW5nCisJCXRoZSBjdXJyZW50IGV4cGVkaXRlZCBncmFjZSBwZXJpb2QgZnJvbSBjb21wbGV0aW5nLgorCisJIkIiCVRoaXMgaW5kaWNhdGVzIHRoYXQgc29tZSBvZiB0aGUgYmxvY2tlZCB0YXNrcyBhcmUgaW4KKwkJbmVlZCBvZiBSQ1UgcHJpb3JpdHkgYm9vc3RpbmcuCisKKwlFYWNoIGNoYXJhY3RlciBpcyByZXBsYWNlZCB3aXRoICIuIiBpZiB0aGUgY29ycmVzcG9uZGluZworCWNvbmRpdGlvbiBkb2VzIG5vdCBob2xkLgorCitvCSJrdCIgaXMgdGhlIHN0YXRlIG9mIHRoZSBSQ1UgcHJpb3JpdHktYm9vc3Rpbmcga2VybmVsCisJdGhyZWFkIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyByY3Vfbm9kZSBzdHJ1Y3R1cmUuCisJVGhlIHN0YXRlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworCSJTIglUaGUga2VybmVsIHRocmVhZCBpcyBzdG9wcGVkLCBpbiBvdGhlciB3b3JkcywgYWxsCisJCUNQVXMgY29ycmVzcG9uZGluZyB0byB0aGlzIHJjdV9ub2RlIHN0cnVjdHVyZSBhcmUKKwkJb2ZmbGluZS4KKworCSJSIglUaGUga2VybmVsIHRocmVhZCBpcyBydW5uaW5nLgorCisJIlciCVRoZSBrZXJuZWwgdGhyZWFkIGlzIHdhaXRpbmcgYmVjYXVzZSB0aGVyZSBpcyBubyB3b3JrCisJCWZvciBpdCB0byBkby4KKworCSJZIglUaGUga2VybmVsIHRocmVhZCBpcyB5aWVsZGluZyB0byBhdm9pZCBob2dnaW5nIENQVS4KKworCSI/IglVbmtub3duIHZhbHVlLCBpbmRpY2F0ZXMgYSBidWcuCisKK28JIm50YiIgaXMgdGhlIG51bWJlciBvZiB0YXNrcyBib29zdGVkLgorCitvCSJuZWIiIGlzIHRoZSBudW1iZXIgb2YgdGFza3MgYm9vc3RlZCBpbiBvcmRlciB0byBjb21wbGV0ZSBhbgorCWV4cGVkaXRlZCBncmFjZSBwZXJpb2QuCisKK28JIm5uYiIgaXMgdGhlIG51bWJlciBvZiB0YXNrcyBib29zdGVkIGluIG9yZGVyIHRvIGNvbXBsZXRlIGEKKwlub3JtYWwgKG5vbi1leHBlZGl0ZWQpIGdyYWNlIHBlcmlvZC4gIFdoZW4gYm9vc3RpbmcgYSB0YXNrCisJdGhhdCB3YXMgYmxvY2tpbmcgYm90aCBhbiBleHBlZGl0ZWQgYW5kIGEgbm9ybWFsIGdyYWNlIHBlcmlvZCwKKwlpdCBpcyBjb3VudGVkIGFnYWluc3QgdGhlIGV4cGVkaXRlZCB0b3RhbCBhYm92ZS4KKworbwkiaiIgaXMgdGhlIGxvdy1vcmRlciAxNiBiaXRzIG9mIHRoZSBqaWZmaWVzIGNvdW50ZXIgaW4KKwloZXhhZGVjaW1hbC4KKworbwkiYnQiIGlzIHRoZSBsb3ctb3JkZXIgMTYgYml0cyBvZiB0aGUgdmFsdWUgdGhhdCB0aGUgamlmZmllcworCWNvdW50ZXIgd2lsbCBoYXZlIHdoZW4gd2UgbmV4dCBzdGFydCBib29zdGluZywgYXNzdW1pbmcgdGhhdAorCXRoZSBjdXJyZW50IGdyYWNlIHBlcmlvZCBkb2VzIG5vdCBlbmQgYmVmb3JlaGFuZC4gIFRoaXMgaXMKKwlhbHNvIGluIGhleGFkZWNpbWFsLgorCitvCSJiYWxrOiBudCIgY291bnRzIHRoZSBudW1iZXIgb2YgdGltZXMgd2UgZGlkbid0IGJvb3N0IChpbgorCW90aGVyIHdvcmRzLCB3ZSBiYWxrZWQpIGV2ZW4gdGhvdWdoIGl0IHdhcyB0aW1lIHRvIGJvb3N0IGJlY2F1c2UKKwl0aGVyZSB3ZXJlIG5vIGJsb2NrZWQgdGFza3MgdG8gYm9vc3QuICBUaGlzIHNpdHVhdGlvbiBvY2N1cnMKKwl3aGVuIHRoZXJlIGlzIG9uZSBibG9ja2VkIHRhc2sgb24gb25lIHJjdV9ub2RlIHN0cnVjdHVyZSBhbmQKKwlub25lIG9uIHNvbWUgb3RoZXIgcmN1X25vZGUgc3RydWN0dXJlLgorCitvCSJlZ3QiIGNvdW50cyB0aGUgbnVtYmVyIG9mIHRpbWVzIHdlIGJhbGtlZCBiZWNhdXNlIGFsdGhvdWdoCisJdGhlcmUgd2VyZSBibG9ja2VkIHRhc2tzLCBub25lIG9mIHRoZW0gd2VyZSBibG9ja2luZyB0aGUKKwljdXJyZW50IGdyYWNlIHBlcmlvZCwgd2hldGhlciBleHBlZGl0ZWQgb3Igb3RoZXJ3aXNlLgorCitvCSJidCIgY291bnRzIHRoZSBudW1iZXIgb2YgdGltZXMgd2UgYmFsa2VkIGJlY2F1c2UgYm9vc3RpbmcKKwloYWQgYWxyZWFkeSBiZWVuIGluaXRpYXRlZCBmb3IgdGhlIGN1cnJlbnQgZ3JhY2UgcGVyaW9kLgorCitvCSJuYiIgY291bnRzIHRoZSBudW1iZXIgb2YgdGltZXMgd2UgYmFsa2VkIGJlY2F1c2UgdGhlcmUKKwl3YXMgYXQgbGVhc3Qgb25lIHRhc2sgYmxvY2tpbmcgdGhlIGN1cnJlbnQgbm9uLWV4cGVkaXRlZCBncmFjZQorCXBlcmlvZCB0aGF0IG5ldmVyIGhhZCBibG9ja2VkLiAgSWYgaXQgaXMgYWxyZWFkeSBydW5uaW5nLCBpdAorCWp1c3Qgd29uJ3QgaGVscCB0byBib29zdCBpdHMgcHJpb3JpdHkhCisKK28JIm55IiBjb3VudHMgdGhlIG51bWJlciBvZiB0aW1lcyB3ZSBiYWxrZWQgYmVjYXVzZSBpdCB3YXMKKwlub3QgeWV0IHRpbWUgdG8gc3RhcnQgYm9vc3RpbmcuCisKK28JIm5vcyIgY291bnRzIHRoZSBudW1iZXIgb2YgdGltZXMgd2UgYmFsa2VkIGZvciBvdGhlcgorCXJlYXNvbnMsIGUuZy4sIHRoZSBncmFjZSBwZXJpb2QgZW5kZWQgZmlyc3QuCisKKwogQ09ORklHX1RJTllfUkNVIGFuZCBDT05GSUdfVElOWV9QUkVFTVBUX1JDVSBkZWJ1Z2ZzIEZpbGVzIGFuZCBGb3JtYXRzCiAKIFRoZXNlIGltcGxlbWVudGF0aW9ucyBvZiBSQ1UgcHJvdmlkZXMgYSBzaW5nbGUgZGVidWdmcyBmaWxlIHVuZGVyIHRoZQpAQCAtMzk0LDkgKzU3OCw5IEBACiBvCSJubmIiIGlzIHRoZSBudW1iZXIgb2Ygbm9ybWFsIGdyYWNlIHBlcmlvZHMgdGhhdCBoYXZlIGhhZAogCXRvIHJlc29ydCB0byBSQ1UgcHJpb3JpdHkgYm9vc3Rpbmcgc2luY2UgYm9vdC4KIAotbwkiaiIgaXMgdGhlIGxvdy1vcmRlciAxMiBiaXRzIG9mIHRoZSBqaWZmaWVzIGNvdW50ZXIgaW4gaGV4YWRlY2ltYWwuCitvCSJqIiBpcyB0aGUgbG93LW9yZGVyIDE2IGJpdHMgb2YgdGhlIGppZmZpZXMgY291bnRlciBpbiBoZXhhZGVjaW1hbC4KIAotbwkiYnQiIGlzIHRoZSBsb3ctb3JkZXIgMTIgYml0cyBvZiB0aGUgdmFsdWUgdGhhdCB0aGUgamlmZmllcyBjb3VudGVyCitvCSJidCIgaXMgdGhlIGxvdy1vcmRlciAxNiBiaXRzIG9mIHRoZSB2YWx1ZSB0aGF0IHRoZSBqaWZmaWVzIGNvdW50ZXIKIAl3aWxsIGhhdmUgYXQgdGhlIG5leHQgdGltZSB0aGF0IGJvb3N0aW5nIGlzIHNjaGVkdWxlZCB0byBiZWdpbi4KIAogbwlJbiB0aGUgbGluZSBiZWdpbm5pbmcgd2l0aCAibm9ybWFsIGJhbGsiLCB0aGUgZmllbGRzIGFyZSBhcyBmb2xsb3dzOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvYnVzLnR4dCBiL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL2J1cy50eHQKaW5kZXggNTAwMWI3NS4uNjc1NGIyZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvYnVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9idXMudHh0CkBAIC0zLDI0ICszLDcgQEAKIAogRGVmaW5pdGlvbgogfn5+fn5+fn5+fgotCi1zdHJ1Y3QgYnVzX3R5cGUgewotCWNoYXIJCQkqIG5hbWU7Ci0KLQlzdHJ1Y3Qgc3Vic3lzdGVtCXN1YnN5czsKLQlzdHJ1Y3Qga3NldAkJZHJpdmVyczsKLQlzdHJ1Y3Qga3NldAkJZGV2aWNlczsKLQotCXN0cnVjdCBidXNfYXR0cmlidXRlCSogYnVzX2F0dHJzOwotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCSogZGV2X2F0dHJzOwotCXN0cnVjdCBkcml2ZXJfYXR0cmlidXRlCSogZHJ2X2F0dHJzOwotCi0JaW50CQkoKm1hdGNoKShzdHJ1Y3QgZGV2aWNlICogZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRydik7Ci0JaW50CQkoKmhvdHBsdWcpIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKiplbnZwLCAKLQkJCQkgICAgaW50IG51bV9lbnZwLCBjaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSk7Ci0JaW50CQkoKnN1c3BlbmQpKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7Ci0JaW50CQkoKnJlc3VtZSkoc3RydWN0IGRldmljZSAqIGRldik7Ci19OworU2VlIHRoZSBrZXJuZWxkb2MgZm9yIHRoZSBzdHJ1Y3QgYnVzX3R5cGUuCiAKIGludCBidXNfcmVnaXN0ZXIoc3RydWN0IGJ1c190eXBlICogYnVzKTsKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvY2xhc3MudHh0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvY2xhc3MudHh0CmluZGV4IDU0ODUwNWYuLjFmZWZjNDggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL2NsYXNzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9jbGFzcy50eHQKQEAgLTI3LDIyICsyNyw3IEBACiB0eXBlZGVmIGludCAoKmRldmNsYXNzX2FkZCkoc3RydWN0IGRldmljZSAqKTsKIHR5cGVkZWYgdm9pZCAoKmRldmNsYXNzX3JlbW92ZSkoc3RydWN0IGRldmljZSAqKTsKIAotc3RydWN0IGRldmljZV9jbGFzcyB7Ci0JY2hhcgkJCSogbmFtZTsKLQlyd2xvY2tfdAkJbG9jazsKLQl1MzIJCQlkZXZudW07Ci0Jc3RydWN0IGxpc3RfaGVhZAlub2RlOwotCi0Jc3RydWN0IGxpc3RfaGVhZAlkcml2ZXJzOwotCXN0cnVjdCBsaXN0X2hlYWQJaW50Zl9saXN0OwotCi0Jc3RydWN0IGRyaXZlcl9kaXJfZW50cnkJZGlyOwotCXN0cnVjdCBkcml2ZXJfZGlyX2VudHJ5CWRldmljZV9kaXI7Ci0Jc3RydWN0IGRyaXZlcl9kaXJfZW50cnkJZHJpdmVyX2RpcjsKLQotCWRldmNsYXNzX2FkZAkJYWRkX2RldmljZTsKLQlkZXZjbGFzc19yZW1vdmUJCXJlbW92ZV9kZXZpY2U7Ci19OworU2VlIHRoZSBrZXJuZWxkb2MgZm9yIHRoZSBzdHJ1Y3QgY2xhc3MuCiAKIEEgdHlwaWNhbCBkZXZpY2UgY2xhc3MgZGVmaW5pdGlvbiB3b3VsZCBsb29rIGxpa2U6IAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9kZXZpY2UudHh0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvZGV2aWNlLnR4dAppbmRleCBhMTI0ZjMxLi5iMmZmNDI2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9kZXZpY2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL2RldmljZS50eHQKQEAgLTIsOTYgKzIsNyBAQAogVGhlIEJhc2ljIERldmljZSBTdHJ1Y3R1cmUKIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiAKLXN0cnVjdCBkZXZpY2UgewotICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIGdfbGlzdDsKLSAgICAgICAgc3RydWN0IGxpc3RfaGVhZCBub2RlOwotICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIGJ1c19saXN0OwotICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIGRyaXZlcl9saXN0OwotICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIGludGZfbGlzdDsKLSAgICAgICAgc3RydWN0IGxpc3RfaGVhZCBjaGlsZHJlbjsKLSAgICAgICAgc3RydWN0IGRldmljZSAgICogcGFyZW50OwotCi0gICAgICAgIGNoYXIgICAgbmFtZVtERVZJQ0VfTkFNRV9TSVpFXTsKLSAgICAgICAgY2hhciAgICBidXNfaWRbQlVTX0lEX1NJWkVdOwotCi0gICAgICAgIHNwaW5sb2NrX3QgICAgICBsb2NrOwotICAgICAgICBhdG9taWNfdCAgICAgICAgcmVmY291bnQ7Ci0KLSAgICAgICAgc3RydWN0IGJ1c190eXBlICogYnVzOwotICAgICAgICBzdHJ1Y3QgZHJpdmVyX2Rpcl9lbnRyeSBkaXI7Ci0KLQl1MzIJCWNsYXNzX251bTsKLQotICAgICAgICBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyOwotICAgICAgICB2b2lkICAgICAgICAgICAgKmRyaXZlcl9kYXRhOwotICAgICAgICB2b2lkICAgICAgICAgICAgKnBsYXRmb3JtX2RhdGE7Ci0KLSAgICAgICAgdTMyICAgICAgICAgICAgIGN1cnJlbnRfc3RhdGU7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgKnNhdmVkX3N0YXRlOwotCi0gICAgICAgIHZvaWQgICAgKCpyZWxlYXNlKShzdHJ1Y3QgZGV2aWNlICogZGV2KTsKLX07Ci0KLUZpZWxkcyAKLX5+fn5+fgotZ19saXN0OglOb2RlIGluIHRoZSBnbG9iYWwgZGV2aWNlIGxpc3QuCi0KLW5vZGU6CU5vZGUgaW4gZGV2aWNlJ3MgcGFyZW50J3MgY2hpbGRyZW4gbGlzdC4KLQotYnVzX2xpc3Q6IE5vZGUgaW4gZGV2aWNlJ3MgYnVzJ3MgZGV2aWNlcyBsaXN0LgotCi1kcml2ZXJfbGlzdDogICBOb2RlIGluIGRldmljZSdzIGRyaXZlcidzIGRldmljZXMgbGlzdC4KLQotaW50Zl9saXN0OiAgICAgTGlzdCBvZiBpbnRmX2RhdGEuIFRoZXJlIGlzIG9uZSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGZvcgotCSAgICAgICBlYWNoIGludGVyZmFjZSB0aGF0IHRoZSBkZXZpY2Ugc3VwcG9ydHMuCi0KLWNoaWxkcmVuOiAgICAgIExpc3Qgb2YgY2hpbGQgZGV2aWNlcy4KLQotcGFyZW50OiAgICAgICAgKioqIEZJWE1FICoqKgotCi1uYW1lOgkgICAgICAgQVNDSUkgZGVzY3JpcHRpb24gb2YgZGV2aWNlLiAKLQkgICAgICAgRXhhbXBsZTogIiAzQ29tIENvcnBvcmF0aW9uIDNjOTA1IDEwMEJhc2VUWCBbQm9vbWVyYW5nXSIKLQotYnVzX2lkOgkgICAgICAgQVNDSUkgcmVwcmVzZW50YXRpb24gb2YgZGV2aWNlJ3MgYnVzIHBvc2l0aW9uLiBUaGlzIAotCSAgICAgICBmaWVsZCBzaG91bGQgYmUgYSBuYW1lIHVuaXF1ZSBhY3Jvc3MgYWxsIGRldmljZXMgb24gdGhlCi0JICAgICAgIGJ1cyB0eXBlIHRoZSBkZXZpY2UgYmVsb25ncyB0by4gCi0KLQkgICAgICAgRXhhbXBsZTogUENJIGJ1c19pZHMgYXJlIGluIHRoZSBmb3JtIG9mCi0JICAgICAgIDxidXMgbnVtYmVyPjo8c2xvdCBudW1iZXI+LjxmdW5jdGlvbiBudW1iZXI+IAotCSAgICAgICBUaGlzIG5hbWUgaXMgdW5pcXVlIGFjcm9zcyBhbGwgUENJIGRldmljZXMgaW4gdGhlIHN5c3RlbS4KLQotbG9jazoJICAgICAgIFNwaW5sb2NrIGZvciB0aGUgZGV2aWNlLiAKLQotcmVmY291bnQ6ICAgICAgUmVmZXJlbmNlIGNvdW50IG9uIHRoZSBkZXZpY2UuCi0KLWJ1czoJICAgICAgIFBvaW50ZXIgdG8gc3RydWN0IGJ1c190eXBlIHRoYXQgZGV2aWNlIGJlbG9uZ3MgdG8uCi0KLWRpcjoJICAgICAgIERldmljZSdzIHN5c2ZzIGRpcmVjdG9yeS4KLQotY2xhc3NfbnVtOiAgICAgQ2xhc3MtZW51bWVyYXRlZCB2YWx1ZSBvZiB0aGUgZGV2aWNlLgotCi1kcml2ZXI6CSAgICAgICBQb2ludGVyIHRvIHN0cnVjdCBkZXZpY2VfZHJpdmVyIHRoYXQgY29udHJvbHMgdGhlIGRldmljZS4KLQotZHJpdmVyX2RhdGE6ICAgRHJpdmVyLXNwZWNpZmljIGRhdGEuCi0KLXBsYXRmb3JtX2RhdGE6IFBsYXRmb3JtIGRhdGEgc3BlY2lmaWMgdG8gdGhlIGRldmljZS4KLQotCSAgICAgICBFeGFtcGxlOiAgZm9yIGRldmljZXMgb24gY3VzdG9tIGJvYXJkcywgYXMgdHlwaWNhbCBvZiBlbWJlZGRlZAotCSAgICAgICBhbmQgU09DIGJhc2VkIGhhcmR3YXJlLCBMaW51eCBvZnRlbiB1c2VzIHBsYXRmb3JtX2RhdGEgdG8gcG9pbnQKLQkgICAgICAgdG8gYm9hcmQtc3BlY2lmaWMgc3RydWN0dXJlcyBkZXNjcmliaW5nIGRldmljZXMgYW5kIGhvdyB0aGV5Ci0JICAgICAgIGFyZSB3aXJlZC4gIFRoYXQgY2FuIGluY2x1ZGUgd2hhdCBwb3J0cyBhcmUgYXZhaWxhYmxlLCBjaGlwCi0JICAgICAgIHZhcmlhbnRzLCB3aGljaCBHUElPIHBpbnMgYWN0IGluIHdoYXQgYWRkaXRpb25hbCByb2xlcywgYW5kIHNvCi0JICAgICAgIG9uLiAgVGhpcyBzaHJpbmtzIHRoZSAiQm9hcmQgU3VwcG9ydCBQYWNrYWdlcyIgKEJTUHMpIGFuZAotCSAgICAgICBtaW5pbWl6ZXMgYm9hcmQtc3BlY2lmaWMgI2lmZGVmcyBpbiBkcml2ZXJzLgotCi1jdXJyZW50X3N0YXRlOiBDdXJyZW50IHBvd2VyIHN0YXRlIG9mIHRoZSBkZXZpY2UuCi0KLXNhdmVkX3N0YXRlOiAgIFBvaW50ZXIgdG8gc2F2ZWQgc3RhdGUgb2YgdGhlIGRldmljZS4gVGhpcyBpcyB1c2FibGUgYnkKLQkgICAgICAgdGhlIGRldmljZSBkcml2ZXIgY29udHJvbGxpbmcgdGhlIGRldmljZS4KLQotcmVsZWFzZTogICAgICAgQ2FsbGJhY2sgdG8gZnJlZSB0aGUgZGV2aWNlIGFmdGVyIGFsbCByZWZlcmVuY2VzIGhhdmUgCi0JICAgICAgIGdvbmUgYXdheS4gVGhpcyBzaG91bGQgYmUgc2V0IGJ5IHRoZSBhbGxvY2F0b3Igb2YgdGhlIAotCSAgICAgICBkZXZpY2UgKGkuZS4gdGhlIGJ1cyBkcml2ZXIgdGhhdCBkaXNjb3ZlcmVkIHRoZSBkZXZpY2UpLgorU2VlIHRoZSBrZXJuZWxkb2MgZm9yIHRoZSBzdHJ1Y3QgZGV2aWNlLgogCiAKIFByb2dyYW1taW5nIEludGVyZmFjZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvZHJpdmVyLnR4dCBiL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL2RyaXZlci50eHQKaW5kZXggZDJjZDZmYi4uNDQyMTEzNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvZHJpdmVyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9kcml2ZXIudHh0CkBAIC0xLDIzICsxLDcgQEAKIAogRGV2aWNlIERyaXZlcnMKIAotc3RydWN0IGRldmljZV9kcml2ZXIgewotICAgICAgICBjaGFyICAgICAgICAgICAgICAgICAgICAqIG5hbWU7Ci0gICAgICAgIHN0cnVjdCBidXNfdHlwZSAgICAgICAgICogYnVzOwotCi0gICAgICAgIHN0cnVjdCBjb21wbGV0aW9uCXVubG9hZGVkOwotICAgICAgICBzdHJ1Y3Qga29iamVjdAkJa29iajsKLSAgICAgICAgbGlzdF90ICAgICAgICAgICAgICAgICAgZGV2aWNlczsKLQotICAgICAgICBzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7Ci0KLSAgICAgICAgaW50ICAgICAoKnByb2JlKSAgICAgICAgKHN0cnVjdCBkZXZpY2UgKiBkZXYpOwotICAgICAgICBpbnQgICAgICgqcmVtb3ZlKSAgICAgICAoc3RydWN0IGRldmljZSAqIGRldik7Ci0KLSAgICAgICAgaW50ICAgICAoKnN1c3BlbmQpICAgICAgKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7Ci0gICAgICAgIGludCAgICAgKCpyZXN1bWUpICAgICAgIChzdHJ1Y3QgZGV2aWNlICogZGV2KTsKLX07Ci0KK1NlZSB0aGUga2VybmVsZG9jIGZvciB0aGUgc3RydWN0IGRldmljZV9kcml2ZXIuCiAKIAogQWxsb2NhdGlvbgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0IGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CmluZGV4IDQ5MmU4MWQuLmY2YTI0ZTggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKQEAgLTQ2MCwxNCArNDYwLDYgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1XaGF0OglUaGUgYWNwaV9zbGVlcD1zNF9ub252cyBjb21tYW5kIGxpbmUgb3B0aW9uCi1XaGVuOgkyLjYuMzcKLUZpbGVzOglhcmNoL3g4Ni9rZXJuZWwvYWNwaS9zbGVlcC5jCi1XaHk6CXN1cGVyc2VkZWQgYnkgYWNwaV9zbGVlcD1ub252cwotV2hvOglSYWZhZWwgSi4gV3lzb2NraSA8cmp3QHNpc2sucGw+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogV2hhdDogCVBDSSBETUEgdW5tYXAgc3RhdGUgQVBJCiBXaGVuOglBdWd1c3QgMjAxMgogV2h5OglQQ0kgRE1BIHVubWFwIHN0YXRlIEFQSSAoaW5jbHVkZS9saW51eC9wY2ktZG1hLmgpIHdhcyByZXBsYWNlZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKaW5kZXggYjBiODE0ZC4uNjA3NDBlOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CkBAIC04MzYsNyArODM2LDYgQEAKICBUQVNLTEVUOiAgICAgICAgICAwICAgICAgICAgIDAgICAgICAgICAgMCAgICAgICAgMjkwCiAgICBTQ0hFRDogICAgICAyNzAzNSAgICAgIDI2OTgzICAgICAgMjY5NzEgICAgICAyNjc0NgogIEhSVElNRVI6ICAgICAgICAgIDAgICAgICAgICAgMCAgICAgICAgICAwICAgICAgICAgIDAKLSAgICAgUkNVOiAgICAgICAxNjc4ICAgICAgIDE3NjkgICAgICAgMjE3OCAgICAgICAyMjUwCiAKIAogMS4zIElERSBkZXZpY2VzIGluIC9wcm9jL2lkZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9qYV9KUC9IT1dUTyBiL0RvY3VtZW50YXRpb24vamFfSlAvSE9XVE8KaW5kZXggYjYzMzAxYS4uMDUwZDM3ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9qYV9KUC9IT1dUTworKysgYi9Eb2N1bWVudGF0aW9uL2phX0pQL0hPV1RPCkBAIC0xMSwxNCArMTEsMTQgQEAKIGZvcmsuIFNvIGlmIHlvdSBoYXZlIGFueSBjb21tZW50cyBvciB1cGRhdGVzIGZvciB0aGlzIGZpbGUsIHBsZWFzZSB0cnkKIHRvIHVwZGF0ZSB0aGUgb3JpZ2luYWwgRW5nbGlzaCBmaWxlIGZpcnN0LgogCi1MYXN0IFVwZGF0ZWQ6IDIwMDgvMTAvMjQKK0xhc3QgVXBkYXRlZDogMjAxMS8wMy8zMQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQog44GT44KM44Gv44CBCi1saW51eC0yLjYuMjgvRG9jdW1lbnRhdGlvbi9IT1dUTworbGludXgtMi42LjM4L0RvY3VtZW50YXRpb24vSE9XVE8KIOOBruWSjOios+OBp+OBmeOAggogCiDnv7voqLPlm6PkvZPvvJogSkYg44OX44Ot44K444Kn44Kv44OIIDwgaHR0cDovL3d3dy5saW51eC5vci5qcC9KRi8gPgot57+76Kiz5pel77yaIDIwMDgvMTAvMjQKK+e/u+ios+aXpe+8miAyMDExLzMvMjgKIOe/u+ios+iAhe+8miBUc3VnaWthenUgU2hpYmF0YSA8dHNoaWJhdGEgYXQgYWIgZG90IGpwIGRvdCBuZWMgZG90IGNvbT4KIOagoeato+iAhe+8miDmnb7lgInjgZXjgpMgPG5iaC0tbWF0cyBhdCBuaWZ0eSBkb3QgY29tPgogICAgICAgICAg5bCP5p6XIOmbheWFuOOBleOCkyAoTWFzYW5vcmkgS29iYXlhc2kpIDx6YXAwMzIxNiBhdCBuaWZ0eSBkb3QgbmUgZG90IGpwPgpAQCAtMjU2LDggKzI1Niw4IEBACiAgIC0g44Oh44Kk44Oz44GuIDIuNi54IOOCq+ODvOODjeODq+ODhOODquODvAogICAtIDIuNi54LnkgLXN0YWJsZSDjgqvjg7zjg43jg6vjg4Tjg6rjg7wKICAgLSAyLjYueCAtZ2l0IOOCq+ODvOODjeODq+ODkeODg+ODgQotICAtIDIuNi54IC1tbSDjgqvjg7zjg43jg6vjg5Hjg4Pjg4EKICAgLSDjgrXjg5bjgrfjgrnjg4bjg6Dmr47jga7jgqvjg7zjg43jg6vjg4Tjg6rjg7zjgajjg5Hjg4Pjg4EKKyAgLSDntbHlkIjjg4bjgrnjg4jjga7jgZ/jgoHjga4gMi42LnggLW5leHQg44Kr44O844ON44Or44OE44Oq44O8CiAKIDIuNi54IOOCq+ODvOODjeODq+ODhOODquODvAogLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTI2OCw5ICsyNjgsOSBAQAogCiAgIC0g5paw44GX44GE44Kr44O844ON44Or44GM44Oq44Oq44O844K544GV44KM44Gf55u05b6M44Gr44CBMumAsemWk+OBrueJueWIpeacn+mWk+OBjOioreOBkeOCieOCjOOAgQogICAgIOOBk+OBruacn+mWk+S4reOBq+OAgeODoeODs+ODhuODiumBlOOBryBMaW51cyDjgavlpKfjgY3jgarlt67liIbjgpLpgIHjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgIIKLSAgICDjgZPjga7jgojjgYbjgarlt67liIbjga/pgJrluLggLW1tIOOCq+ODvOODjeODq+OBq+aVsOmAsemWk+WQq+OBvuOCjOOBpuOBjeOBn+ODkeODg+ODgeOBp+OBmeOAggorICAgIOOBk+OBruOCiOOBhuOBquW3ruWIhuOBr+mAmuW4uCAtbmV4dCDjgqvjg7zjg43jg6vjgavmlbDpgLHplpPlkKvjgb7jgozjgabjgY3jgZ/jg5Hjg4Pjg4HjgafjgZnjgIIKICAgICDlpKfjgY3jgarlpInmm7Tjga8gZ2l0KOOCq+ODvOODjeODq+OBruOCveODvOOCueeuoeeQhuODhOODvOODq+OAgeips+e0sOOBrwotICAgIGh0dHA6Ly9naXQub3IuY3ovICDlj4LnhacpIOOCkuS9v+OBo+OBpumAgeOCi+OBruOBjOWlveOBvuOBl+OBhOOChOOCiuaWueOBp+OBmeOBjOOAgeODkeODgworICAgIGh0dHA6Ly9naXQtc2NtLmNvbS8gIOWPgueFpykg44KS5L2/44Gj44Gm6YCB44KL44Gu44GM5aW944G+44GX44GE44KE44KK5pa544Gn44GZ44GM44CB44OR44ODCiAgICAg44OB44OV44Kh44Kk44Or44Gu5b2i5byP44Gu44G+44G+6YCB44KL44Gu44Gn44KC5Y2B5YiG44Gn44GZ44CCCiAKICAgLSAy6YCx6ZaT5b6M44CBLXJjMSDjgqvjg7zjg43jg6vjgYzjg6rjg6rjg7zjgrnjgZXjgozjgIHjgZPjga7lvozjgavjga/jgqvjg7zjg43jg6vlhajkvZPjga7lronlrpoKQEAgLTMzMyw4NiArMzMzLDQ0IEBACiDjgozjga8gLXJjIOOCq+ODvOODjeODq+OBqOavlOOBueOBpuOAgeODkeODg+ODgeOBjOWkp+S4iOWkq+OBi+OBqeOBhuOBi+OCgueiuuiqjeOBl+OBquOBhOOBp+iHquWLleeahAog44Gr55Sf5oiQ44GV44KM44KL44Gu44Gn44CB44KI44KK5a6f6aiT55qE44Gn44GZ44CCCiAKLTIuNi54IC1tbSDjgqvjg7zjg43jg6vjg5Hjg4Pjg4EKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BbmRyZXcgTW9ydG9uIOOBq+OCiOOBo+OBpuODquODquODvOOCueOBleOCjOOCi+Wun+mok+eahOOBquOCq+ODvOODjeODq+ODkeODg+ODgee+pOOBp+OBmeOAggotQW5kcmV3IOOBr+WAi+WIpeOBruOCteODluOCt+OCueODhuODoOOCq+ODvOODjeODq+ODhOODquODvOOBqOODkeODg+ODgeOCkuWFqOOBpumbhuOCgeOBpuOBjeOBpgotbGludXgta2VybmVsIOODoeODvOODquODs+OCsOODquOCueODiOOBp+WPjumbhuOBleOCjOOBn+WkmuaVsOOBruODkeODg+ODgeOBqOWQjOaZguOBq+S4gOOBpOOBq+OBvgot44Go44KB44G+44GZ44CCCi3jgZPjga7jg4Tjg6rjg7zjga/mlrDmqZ/og73jgajjg5Hjg4Pjg4HjgYzmpJzoqLzjgZXjgozjgovloLTjgajjgarjgorjgb7jgZnjgILjgYLjgovmnJ/plpPjga7plpPjg5Hjg4Pjg4EKLeOBjCAtbW0g44Gr5YWl44Gj44Gm5L6h5YCk44KS6Ki85piO44GV44KM44Gf44KJ44CBQW5kcmV3IOOChOOCteODluOCt+OCueODhuODoOODoeODs+ODhuODiuOBjOOAgQot44Oh44Kk44Oz44Op44Kk44Oz44G45YWl44KM44KL44KI44GG44GrIExpbnVzIOOBq+ODl+ODg+OCt+ODpeOBl+OBvuOBmeOAggotCi3jg6HjgqTjg7Pjgqvjg7zjg43jg6vjg4Tjg6rjg7zjgavlkKvjgoHjgovjgZ/jgoHjgasgTGludXMg44Gr6YCB44KL5YmN44Gr44CB44GZ44G544Gm44Gu5paw44GX44GE44OR44ODCi3jg4HjgYwgLW1tIOODhOODquODvOOBp+ODhuOCueODiOOBleOCjOOCi+OBk+OBqOOBjOW8t+OBj+aOqOWlqOOBleOCjOOBpuOBhOOBvuOBmeOAguODnuODvOOCuOOCpuOCo+ODswot44OJ44Km44GM6ZaL44GP5YmN44GrIC1tbSDjg4Tjg6rjg7zjgavnj77jgozjgarjgYvjgaPjgZ/jg5Hjg4Pjg4Hjga/jg6HjgqTjg7Pjg6njgqTjg7Pjgavjg57jg7zjgrjjgZUKLeOCjOOCi+OBk+OBqOOBr+WbsOmbo+OBq+OBquOCiuOBvuOBmeOAggotCi3jgZPjgozjgonjga7jgqvjg7zjg43jg6vjga/lronlrprjgZfjgabli5XkvZzjgZnjgbnjgY3jgrfjgrnjg4bjg6DjgajjgZfjgabkvb/jgYbjga7jgavjga/pganliIfjgafjga/jgYIKLeOCiuOBvuOBm+OCk+OBl+OAgeOCq+ODvOODjeODq+ODluODqeODs+ODgeOBruS4reOBp+OCguOCguOBo+OBqOOCguWLleS9nOOBq+ODquOCueOCr+OBjOmrmOOBhOOCguOBruOBp+OBmeOAggotCi3jgoLjgZfjgYLjgarjgZ/jgYzjgIHjgqvjg7zjg43jg6vplovnmbrjg5fjg63jgrvjgrnjga7mlK/mj7TjgpLjgZfjgZ/jgYTjgajmgJ3jgaPjgabjgYTjgovjga7jgafjgYLjgozjgbDjgIEKLeOBqeOBhuOBnuOBk+OCjOOCieOBruOCq+ODvOODjeODq+ODquODquODvOOCueOCkuODhuOCueODiOOBq+S9v+OBo+OBpuOBv+OBpuOAgeOBneOBl+OBpuOCguOBl+WVj+mhjOOBjOOBggot44KM44Gw44CB44G+44Gf44KC44GX5YWo44Gm44GM5q2j44GX44GP5YuV5L2c44GX44Gf44Go44GX44Gm44KC44CBbGludXgta2VybmVsIOODoeODvOODquODs+OCsOODqgot44K544OI44Gr44OV44Kj44O844OJ44OQ44OD44Kv44KS5o+Q5L6b44GX44Gm44GP44Gg44GV44GE44CCCi0KLeOBmeOBueOBpuOBruS7luOBruWun+mok+eahOODkeODg+ODgeOBq+WKoOOBiOOBpuOAgeOBk+OCjOOCieOBruOCq+ODvOODjeODq+OBr+mAmuW4uOODquODquODvOOCueaZgueCueOBpwot44Oh44Kk44Oz44Op44Kk44Oz44GuIC1naXQg44Kr44O844ON44Or44Gr5ZCr44G+44KM44KL5YWo44Gm44Gu5aSJ5pu044KC5ZCr44KT44Gn44GE44G+44GZ44CCCi0KLS1tbSDjgqvjg7zjg43jg6vjga/msbrjgb7jgaPjgZ/jgrnjgrHjgrjjg6Xjg7zjg6vjgafjga/jg6rjg6rjg7zjgrnjgZXjgozjgb7jgZvjgpPjgIHjgZfjgYvjgZfpgJrluLjlub4KLeOBpOOBi+OBriAtbW0g44Kr44O844ON44OrICgxIOOBi+OCiSAzIOOBjOaZrumAmu+8ieOBjOWQhC1yYyDjgqvjg7zjg43jg6vjga7plpPjgavjg6rjg6rjg7zjgrnjgZUKLeOCjOOBvuOBmeOAggotCiDjgrXjg5bjgrfjgrnjg4bjg6Dmr47jga7jgqvjg7zjg43jg6vjg4Tjg6rjg7zjgajjg5Hjg4Pjg4EKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAot44Kr44O844ON44Or44Gu5qeY44CF44Gq6aCY5Z+f44Gn5L2V44GM6LW344GN44Gm44GE44KL44GL44KS6KaL44KJ44KM44KL44KI44GG44Gr44GZ44KL44Gf44KB44CB5aSa44GP44GuCi3jgqvjg7zjg43jg6vjgrXjg5bjgrfjgrnjg4bjg6DplovnmbrogIXjga/lvbzjgonjga7plovnmbrjg4Tjg6rjg7zjgpLlhazplovjgZfjgabjgYTjgb7jgZnjgILjgZPjgozjgonjga4KLeODhOODquODvOOBr+iqrOaYjuOBl+OBn+OCiOOBhuOBqyAtbW0g44Kr44O844ON44Or44Oq44Oq44O844K544Gr5YWl44KM6L6844G+44KM44G+44GZ44CCCivjgZ3jgozjgZ7jgozjga7jgqvjg7zjg43jg6vjgrXjg5bjgrfjgrnjg4bjg6Djga7jg6Hjg7Pjg4bjg4rpgZTjga8gLS0tIOOBneOBl+OBpuWkmuOBj+OBruOCq+ODvOODjeODqwor44K144OW44K344K544OG44Og44Gu6ZaL55m66ICF6YGU44KCIC0tLSDlkIToh6rjga7mnIDmlrDjga7plovnmbrnirbms4HjgpLjgr3jg7zjgrnjg6rjg53jgrjjg4jjg6rjgasKK+WFrOmWi+OBl+OBpuOBhOOBvuOBmeOAguOBneOBruOBn+OCgeOAgeiHquWIhuOBqOOBr+eVsOOBquOCi+mgmOWfn+OBruOCq+ODvOODjeODq+OBp+S9leOBjOi1t+OBjeOBpuOBhOOCiwor44GL44KS5LuW44Gu5Lq644GM6KaL44KJ44KM44KL44KI44GG44Gr44Gq44Gj44Gm44GE44G+44GZ44CC6ZaL55m644GM5pep44GP6YCy44KT44Gn44GE44KL6aCY5Z+f44Gn44Gv44CBCivplovnmbrogIXjga/oh6rouqvjga7mipXnqL/jgYzjganjga7jgrXjg5bjgrfjgrnjg4bjg6Djgqvjg7zjg43jg6vjg4Tjg6rjg7zjgpLlhYPjgavjgZfjgabjgYTjgovjgYvos6rllY8KK+OBleOCjOOCi+OBruOBp+OAgeOBneOBruaKleeov+OBqOOBmeOBp+OBq+mAsuihjOS4reOBruS7luOBruS9nOalreOBqOOBruihneeqgeOBjOmBv+OBkeOCieOCjOOBvuOBmeOAggogCi3ku6XkuIvjga/jgZXjgb7jgZbjgb7jgarjgqvjg7zjg43jg6vjg4Tjg6rjg7zjga7kuK3jga7jgYTjgY/jgaTjgYvjga7jg6rjgrnjg4gtCivlpKfpg6jliIbjga7jgZPjgozjgonjga7jg6rjg53jgrjjg4jjg6rjga8gZ2l0IOODhOODquODvOOBp+OBmeOAguOBl+OBi+OBl+OBneOBruS7luOBriBTQ00g44KECitxdWlsdCDjgrfjg6rjg7zjgrrjgajjgZfjgablhazplovjgZXjgozjgabjgYTjgovjg5Hjg4Pjg4Hjgq3jg6Xjg7zjgoLkvb/jgo/jgozjgabjgYTjgb7jgZnjgILjgZPjgozjgokKK+OBruOCteODluOCt+OCueODhuODoOODquODneOCuOODiOODquOBruOCouODieODrOOCueOBryBNQUlOVEFJTkVSUyDjg5XjgqHjgqTjg6vjgavjg6rjgrnjg4jjgZXjgowKK+OBpuOBhOOBvuOBmeOAguOBk+OCjOOCieOBruWkmuOBj+OBryBodHRwOi8vZ2l0Lmtlcm5lbC5vcmcvIOOBp+WPgueFp+OBmeOCi+OBk+OBqOOBjOOBp+OBjeOBvgor44GZ44CCCiAKLSAgZ2l0IOODhOODquODvC0KLSAgICAtIEtidWlsZCDjga7plovnmbrjg4Tjg6rjg7zjgIFTYW0gUmF2bmJvcmcgPHNhbUByYXZuYm9yZy5vcmc+Ci0JZ2l0Lmtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9zYW0va2J1aWxkLmdpdAor5o+Q5qGI44GV44KM44Gf44OR44OD44OB44GM44GT44Gu44KI44GG44Gq44K144OW44K344K544OG44Og44OE44Oq44O844Gr44Kz44Of44OD44OI44GV44KM44KL5YmN44Gr44CB44Oh44O8Civjg6rjg7PjgrDjg6rjgrnjg4jjgafkuovliY3jgavjg6zjg5Pjg6Xjg7zjgavjgYvjgZHjgonjgozjgb7jgZnvvIjku6XkuIvjga7lr77lv5zjgZnjgovjgrvjgq/jgrfjg6fjg7PjgpIKK+WPgueFp++8ieOAguOBhOOBj+OBpOOBi+OBruOCq+ODvOODjeODq+OCteODluOCt+OCueODhuODoOOBp+OBr+OAgeOBk+OBruODrOODk+ODpeODvOOBryBwYXRjaHdvcmsKK+OBqOOBhOOBhuODhOODvOODq+OBq+OCiOOBo+OBpui/vei3oeOBleOCjOOBvuOBmeOAglBhdGNod29yayDjga8gd2ViIOOCpOODs+OCv+ODvOODleOCp+OCpOOCueOBqwor44KI44Gj44Gm44OR44OD44OB5oqV56i/44Gu6KGo56S644CB44OR44OD44OB44G444Gu44Kz44Oh44Oz44OI5LuY44GR44KE5pS56KiC44Gq44Gp44GM44Gn44GN44CB44Gd44GX44GmCivjg6Hjg7Pjg4bjg4rjga/jg5Hjg4Pjg4Hjgavlr77jgZfjgabjgIHjg6zjg5Pjg6Xjg7zkuK3jgIHlj5fku5jmuIjjgb/jgIHmi5LlkKbjgajjgYTjgYbjgojjgYbjgarjg57jg7zjgq8KK+OCkuOBpOOBkeOCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAguWkp+mDqOWIhuOBruOBk+OCjOOCieOBriBwYXRjaHdvcmsg44Gu44K144Kk44OI44GvCitodHRwOi8vcGF0Y2h3b3JrLmtlcm5lbC5vcmcvIOOBp+ODquOCueODiOOBleOCjOOBpuOBhOOBvuOBmeOAggogCi0gICAgLSBBQ1BJIOOBrumWi+eZuuODhOODquODvOOAgSBMZW4gQnJvd24gPGxlbi5icm93bkBpbnRlbC5jb20+Ci0JZ2l0Lmtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9sZW5iL2xpbnV4LWFjcGktMi42LmdpdAor57Wx5ZCI44OG44K544OI44Gu44Gf44KB44GuIDIuNi54IC1uZXh0IOOCq+ODvOODjeODq+ODhOODquODvAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgICAtIEJsb2NrIOOBrumWi+eZuuODhOODquODvOOAgUplbnMgQXhib2UgPGF4Ym9lQHN1c2UuZGU+Ci0JZ2l0Lmtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9heGJvZS9saW51eC0yLjYtYmxvY2suZ2l0CivjgrXjg5bjgrfjgrnjg4bjg6Djg4Tjg6rjg7zjga7mm7TmlrDlhoXlrrnjgYzjg6HjgqTjg7Pjg6njgqTjg7Pjga4gMi42Lngg44OE44Oq44O844Gr44Oe44O844K444GV44KMCivjgovliY3jgavjgIHjgZ3jgozjgonjga/ntbHlkIjjg4bjgrnjg4jjgZXjgozjgovlv4XopoHjgYzjgYLjgorjgb7jgZnjgILjgZPjga7nm67nmoTjga7jgZ/jgoHjgIHlrp/os6rnmoQKK+OBq+WFqOOCteODluOCt+OCueODhuODoOODhOODquODvOOBi+OCieOBu+OBvOavjuaXpeODl+ODq+OBleOCjOOBpuOBp+OBjeOCi+eJueWIpeOBquODhuOCueODiOeUqOOBruODqgor44Od44K444OI44Oq44GM5a2Y5Zyo44GX44G+44GZLQorICAgICAgIGh0dHA6Ly9naXQua2VybmVsLm9yZy8/cD1saW51eC9rZXJuZWwvZ2l0L3Nmci9saW51eC1uZXh0LmdpdAorICAgICAgIGh0dHA6Ly9saW51eC5mLXNlaWRlbC5kZS9saW51eC1uZXh0L3Btd2lraS8KIAotICAgIC0gRFJNIOOBrumWi+eZuuODhOODquODvOOAgURhdmUgQWlybGllIDxhaXJsaWVkQGxpbnV4LmllPgotCWdpdC5rZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvYWlybGllZC9kcm0tMi42LmdpdAotCi0gICAgLSBpYTY0IOOBrumWi+eZuuODhOODquODvOOAgVRvbnkgTHVjayA8dG9ueS5sdWNrQGludGVsLmNvbT4KLQlnaXQua2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2FlZ2wvbGludXgtMi42LmdpdAotCi0gICAgLSBpbmZpbmliYW5kLCBSb2xhbmQgRHJlaWVyIDxyb2xhbmRkQGNpc2NvLmNvbT4KLQlnaXQua2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3JvbGFuZC9pbmZpbmliYW5kLmdpdAotCi0gICAgLSBsaWJhdGEsIEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KLQlnaXQua2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2pnYXJ6aWsvbGliYXRhLWRldi5naXQKLQotICAgIC0g44ON44OD44OI44Ov44O844Kv44OJ44Op44Kk44OQLCBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+Ci0JZ2l0Lmtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9qZ2FyemlrL25ldGRldi0yLjYuZ2l0Ci0KLSAgICAtIHBjbWNpYSwgRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGRvbWluaWticm9kb3dza2kubmV0PgotCWdpdC5rZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvYnJvZG8vcGNtY2lhLTIuNi5naXQKLQotICAgIC0gU0NTSSwgSmFtZXMgQm90dG9tbGV5IDxKYW1lcy5Cb3R0b21sZXlAaGFuc2VucGFydG5lcnNoaXAuY29tPgotCWdpdC5rZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvamVqYi9zY3NpLW1pc2MtMi42LmdpdAotCi0gICAgLSB4ODYsIEluZ28gTW9sbmFyIDxtaW5nb0BlbHRlLmh1PgotCWdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC94ODYvbGludXgtMi42LXg4Ni5naXQKLQotICBxdWlsdCDjg4Tjg6rjg7wtCi0gICAgLSBVU0IsIOODieODqeOCpOODkOOCs+OCouOBqCBJMkMsIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQHN1c2UuZGU+Ci0Ja2VybmVsLm9yZy9wdWIvbGludXgva2VybmVsL3Blb3BsZS9ncmVna2gvZ3JlZ2toLTIuNi8KLQotICDjgZ3jga7ku5bjga7jgqvjg7zjg43jg6vjg4Tjg6rjg7zjga8gaHR0cDovL2dpdC5rZXJuZWwub3JnLyDjgaggTUFJTlRBSU5FUlMg44OV44KhCi0gIOOCpOODq+OBq+S4gOimp+ihqOOBjOOBguOCiuOBvuOBmeOAggor44GT44Gu44KE44KK5pa544Gr44KI44Gj44Gm44CBLW5leHQg44Kr44O844ON44Or44Gv5qyh44Gu44Oe44O844K45qmf5Lya44Gn44Gp44KT44Gq44KC44Gu44GM44Oh44Kk44OzCivjg6njgqTjg7Pjgqvjg7zjg43jg6vjgavjg57jg7zjgrjjgZXjgozjgovjgYvjgIHjgYrjgYrjgb7jgYvjgarjga7lsZXmnJvjgpLmj5DkvpvjgZfjgb7jgZnjgIItbmV4dCAKK+OCq+ODvOODjeODq+OBruWun+ihjOODhuOCueODiOOCkuihjOOBhuWGkumZuuWlveOBjeOBquODhuOCueOCv+ODvOOBr+Wkp+OBhOOBq+atk+i/juOBleOCjOOBvuOBmQogCiDjg5DjgrDjg6zjg53jg7zjg4gKIC0tLS0tLS0tLS0tLS0KQEAgLTY3MywxMCArNjMxLDkgQEAKIOOBmOOBqOOBk+OCjeOBi+OCieOCueOCv+ODvOODiOOBl+OBn+OBruOBp+OBmeOBi+OCieOAggogCiBQYW9sbyBDaWFycm9jY2hpIOOBq+aEn+isneOAgeW9vOOBr+W9vOOBruabuOOBhOOBnyAiRGV2ZWxvcG1lbnQgUHJvY2VzcyIKLShodHRwOi8vbGludXgudGFyLmJ6L2FydGljbGVzLzIuNi1kZXZlbG9wbWVudF9wcm9jZXNzKeOCu+OCr+OCt+ODpwot44Oz44KS44GT44Gu44OG44Kt44K544OI44Gu5Y6f5Z6L44Gr44GZ44KL44GT44Go44KS6Kix5Y+v44GX44Gm44GP44KM44G+44GX44Gf44CCCi1SdW5keSBEdW5sYXAg44GoIEdlcnJpdCBIdWl6ZW5nYSDjga/jg6Hjg7zjg6rjg7PjgrDjg6rjgrnjg4jjgafjgoTjgovjgbnjgY3jgZPjgajjgajjgoTjgaMKLeOBpuOBr+OBhOOBkeOBquOBhOOBk+OBqOOBruODquOCueODiOOCkuaPkOS+m+OBl+OBpuOBj+OCjOOBvuOBl+OBn+OAggorKGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzk0Mzg2Lykg44K744Kv44K344On44Oz44KS44GT44Gu44OG44Kt44K544OI44Gu5Y6f5Z6L44Gr44GZ44KLCivjgZPjgajjgpLoqLHlj6/jgZfjgabjgY/jgozjgb7jgZfjgZ/jgIJSdW5keSBEdW5sYXAg44GoIEdlcnJpdCBIdWl6ZW5nYSDjga/jg6Hjg7zjg6rjg7PjgrAKK+ODquOCueODiOOBp+OChOOCi+OBueOBjeOBk+OBqOOBqOOChOOBo+OBpuOBr+OBhOOBkeOBquOBhOOBk+OBqOOBruODquOCueODiOOCkuaPkOS+m+OBl+OBpuOBj+OCjOOBvuOBl+OBn+OAggog5Lul5LiL44Gu5Lq644CF44Gu44Os44OT44Ol44O844CB44Kz44Oh44Oz44OI44CB6LKi54yu44Gr5oSf6Kyd44CCCiBQYXQgTW9jaGVsLCBIYW5uYSBMaW5kZXIsIFJhbmR5IER1bmxhcCwgS2F5IFNpZXZlcnMsCiBWb2p0ZWNoIFBhdmxpaywgSmFuIEthcmEsIEpvc2ggQm95ZXIsIEtlZXMgQ29vaywgQW5kcmV3IE1vcnRvbiwgQW5kaQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAppbmRleCBjYzg1YTkyLi5jNjAzZWY3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dApAQCAtMjQ1LDcgKzI0NSw3IEBACiAKIAlhY3BpX3NsZWVwPQlbSFcsQUNQSV0gU2xlZXAgb3B0aW9ucwogCQkJRm9ybWF0OiB7IHMzX2Jpb3MsIHMzX21vZGUsIHMzX2JlZXAsIHM0X25vaHdzaWcsCi0JCQkJICBvbGRfb3JkZXJpbmcsIHM0X25vbnZzLCBzY2lfZm9yY2VfZW5hYmxlIH0KKwkJCQkgIG9sZF9vcmRlcmluZywgbm9udnMsIHNjaV9mb3JjZV9lbmFibGUgfQogCQkJU2VlIERvY3VtZW50YXRpb24vcG93ZXIvdmlkZW8udHh0IGZvciBpbmZvcm1hdGlvbiBvbgogCQkJczNfYmlvcyBhbmQgczNfbW9kZS4KIAkJCXMzX2JlZXAgaXMgZm9yIGRlYnVnZ2luZzsgaXQgbWFrZXMgdGhlIFBDJ3Mgc3BlYWtlciBiZWVwCkBAIC0xNjY0LDYgKzE2NjQsMTAgQEAKIAkJCW5vZXhlYz1vbjogZW5hYmxlIG5vbi1leGVjdXRhYmxlIG1hcHBpbmdzIChkZWZhdWx0KQogCQkJbm9leGVjPW9mZjogZGlzYWJsZSBub24tZXhlY3V0YWJsZSBtYXBwaW5ncwogCisJbm9zbWVwCQlbWDg2XQorCQkJRGlzYWJsZSBTTUVQIChTdXBlcnZpc29yIE1vZGUgRXhlY3V0aW9uIFByb3RlY3Rpb24pCisJCQlldmVuIGlmIGl0IGlzIHN1cHBvcnRlZCBieSBwcm9jZXNzb3IuCisKIAlub2V4ZWMzMglbWDg2LTY0XQogCQkJVGhpcyBhZmZlY3RzIG9ubHkgMzItYml0IGV4ZWN1dGFibGVzLgogCQkJbm9leGVjMzI9b246IGVuYWJsZSBub24tZXhlY3V0YWJsZSBtYXBwaW5ncyAoZGVmYXVsdCkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvZGV2aWNlcy50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL2RldmljZXMudHh0CmluZGV4IDE5NzFiY2YuLjg4ODgwODMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvZGV2aWNlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlci9kZXZpY2VzLnR4dApAQCAtMjc5LDExICsyNzksMTUgQEAKIAl0aW1lLikgIFVubGlrZSB0aGUgb3RoZXIgc3VzcGVuZC1yZWxhdGVkIHBoYXNlcywgZHVyaW5nIHRoZSBwcmVwYXJlCiAJcGhhc2UgdGhlIGRldmljZSB0cmVlIGlzIHRyYXZlcnNlZCB0b3AtZG93bi4KIAotCVRoZSBwcmVwYXJlIHBoYXNlIHVzZXMgb25seSBhIGJ1cyBjYWxsYmFjay4gIEFmdGVyIHRoZSBjYWxsYmFjayBtZXRob2QKLQlyZXR1cm5zLCBubyBuZXcgY2hpbGRyZW4gbWF5IGJlIHJlZ2lzdGVyZWQgYmVsb3cgdGhlIGRldmljZS4gIFRoZSBtZXRob2QKLQltYXkgYWxzbyBwcmVwYXJlIHRoZSBkZXZpY2Ugb3IgZHJpdmVyIGluIHNvbWUgd2F5IGZvciB0aGUgdXBjb21pbmcKLQlzeXN0ZW0gcG93ZXIgdHJhbnNpdGlvbiwgYnV0IGl0IHNob3VsZCBub3QgcHV0IHRoZSBkZXZpY2UgaW50byBhCi0JbG93LXBvd2VyIHN0YXRlLgorCUluIGFkZGl0aW9uIHRvIHRoYXQsIGlmIGRldmljZSBkcml2ZXJzIG5lZWQgdG8gYWxsb2NhdGUgYWRkaXRpb25hbAorCW1lbW9yeSB0byBiZSBhYmxlIHRvIGhhZGxlIGRldmljZSBzdXNwZW5kIGNvcnJlY3RseSwgdGhhdCBzaG91bGQgYmUKKwlkb25lIGluIHRoZSBwcmVwYXJlIHBoYXNlLgorCisJQWZ0ZXIgdGhlIHByZXBhcmUgY2FsbGJhY2sgbWV0aG9kIHJldHVybnMsIG5vIG5ldyBjaGlsZHJlbiBtYXkgYmUKKwlyZWdpc3RlcmVkIGJlbG93IHRoZSBkZXZpY2UuICBUaGUgbWV0aG9kIG1heSBhbHNvIHByZXBhcmUgdGhlIGRldmljZSBvcgorCWRyaXZlciBpbiBzb21lIHdheSBmb3IgdGhlIHVwY29taW5nIHN5c3RlbSBwb3dlciB0cmFuc2l0aW9uIChmb3IKKwlleGFtcGxlLCBieSBhbGxvY2F0aW5nIGFkZGl0aW9uYWwgbWVtb3J5IHJlcXVpcmVkIGZvciB0aGlzIHB1cnBvc2UpLCBidXQKKwlpdCBzaG91bGQgbm90IHB1dCB0aGUgZGV2aWNlIGludG8gYSBsb3ctcG93ZXIgc3RhdGUuCiAKICAgICAyLglUaGUgc3VzcGVuZCBtZXRob2RzIHNob3VsZCBxdWllc2NlIHRoZSBkZXZpY2UgdG8gc3RvcCBpdCBmcm9tIHBlcmZvcm1pbmcKIAlJL08uICBUaGV5IGFsc28gbWF5IHNhdmUgdGhlIGRldmljZSByZWdpc3RlcnMgYW5kIHB1dCBpdCBpbnRvIHRoZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9ub3RpZmllcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9ub3RpZmllcnMudHh0CmluZGV4IGNmOTgwNzAuLmMyYTRhMzQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvbm90aWZpZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL25vdGlmaWVycy50eHQKQEAgLTEsNDYgKzEsNDEgQEAKIFN1c3BlbmQgbm90aWZpZXJzCi0JKEMpIDIwMDcgUmFmYWVsIEouIFd5c29ja2kgPHJqd0BzaXNrLnBsPiwgR1BMCisJKEMpIDIwMDctMjAxMSBSYWZhZWwgSi4gV3lzb2NraSA8cmp3QHNpc2sucGw+LCBHUEwKIAotVGhlcmUgYXJlIHNvbWUgb3BlcmF0aW9ucyB0aGF0IGRldmljZSBkcml2ZXJzIG1heSB3YW50IHRvIGNhcnJ5IG91dCBpbiB0aGVpcgotLnN1c3BlbmQoKSByb3V0aW5lcywgYnV0IHNob3VsZG4ndCwgYmVjYXVzZSB0aGV5IGNhbiBjYXVzZSB0aGUgaGliZXJuYXRpb24gb3IKLXN1c3BlbmQgdG8gZmFpbC4gRm9yIGV4YW1wbGUsIGEgZHJpdmVyIG1heSB3YW50IHRvIGFsbG9jYXRlIGEgc3Vic3RhbnRpYWwgYW1vdW50Ci1vZiBtZW1vcnkgKGxpa2UgNTAgTUIpIGluIC5zdXNwZW5kKCksIGJ1dCB0aGF0IHNob3VsZG4ndCBiZSBkb25lIGFmdGVyIHRoZQotc3dzdXNwJ3MgbWVtb3J5IHNocmlua2VyIGhhcyBydW4uCitUaGVyZSBhcmUgc29tZSBvcGVyYXRpb25zIHRoYXQgc3Vic3lzdGVtcyBvciBkcml2ZXJzIG1heSB3YW50IHRvIGNhcnJ5IG91dAorYmVmb3JlIGhpYmVybmF0aW9uL3N1c3BlbmQgb3IgYWZ0ZXIgcmVzdG9yZS9yZXN1bWUsIGJ1dCB0aGV5IHJlcXVpcmUgdGhlIHN5c3RlbQordG8gYmUgZnVsbHkgZnVuY3Rpb25hbCwgc28gdGhlIGRyaXZlcnMnIGFuZCBzdWJzeXN0ZW1zJyAuc3VzcGVuZCgpIGFuZCAucmVzdW1lKCkKK29yIGV2ZW4gLnByZXBhcmUoKSBhbmQgLmNvbXBsZXRlKCkgY2FsbGJhY2tzIGFyZSBub3Qgc3VpdGFibGUgZm9yIHRoaXMgcHVycG9zZS4KK0ZvciBleGFtcGxlLCBkZXZpY2UgZHJpdmVycyBtYXkgd2FudCB0byB1cGxvYWQgZmlybXdhcmUgdG8gdGhlaXIgZGV2aWNlcyBhZnRlcgorcmVzdW1lL3Jlc3RvcmUsIGJ1dCB0aGV5IGNhbm5vdCBkbyBpdCBieSBjYWxsaW5nIHJlcXVlc3RfZmlybXdhcmUoKSBmcm9tIHRoZWlyCisucmVzdW1lKCkgb3IgLmNvbXBsZXRlKCkgcm91dGluZXMgKHVzZXIgbGFuZCBwcm9jZXNzZXMgYXJlIGZyb3plbiBhdCB0aGVzZQorcG9pbnRzKS4gIFRoZSBzb2x1dGlvbiBtYXkgYmUgdG8gbG9hZCB0aGUgZmlybXdhcmUgaW50byBtZW1vcnkgYmVmb3JlIHByb2Nlc3NlcworYXJlIGZyb3plbiBhbmQgdXBsb2FkIGl0IGZyb20gdGhlcmUgaW4gdGhlIC5yZXN1bWUoKSByb3V0aW5lLgorQSBzdXNwZW5kL2hpYmVybmF0aW9uIG5vdGlmaWVyIG1heSBiZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UuCiAKLUFsc28sIHRoZXJlIG1heSBiZSBzb21lIG9wZXJhdGlvbnMsIHRoYXQgc3Vic3lzdGVtcyB3YW50IHRvIGNhcnJ5IG91dCBiZWZvcmUgYQotaGliZXJuYXRpb24vc3VzcGVuZCBvciBhZnRlciBhIHJlc3RvcmUvcmVzdW1lLCByZXF1aXJpbmcgdGhlIHN5c3RlbSB0byBiZSBmdWxseQotZnVuY3Rpb25hbCwgc28gdGhlIGRyaXZlcnMnIC5zdXNwZW5kKCkgYW5kIC5yZXN1bWUoKSByb3V0aW5lcyBhcmUgbm90IHN1aXRhYmxlCi1mb3IgdGhpcyBwdXJwb3NlLiAgRm9yIGV4YW1wbGUsIGRldmljZSBkcml2ZXJzIG1heSB3YW50IHRvIHVwbG9hZCBmaXJtd2FyZSB0bwotdGhlaXIgZGV2aWNlcyBhZnRlciBhIHJlc3RvcmUgZnJvbSBhIGhpYmVybmF0aW9uIGltYWdlLCBidXQgdGhleSBjYW5ub3QgZG8gaXQgYnkKLWNhbGxpbmcgcmVxdWVzdF9maXJtd2FyZSgpIGZyb20gdGhlaXIgLnJlc3VtZSgpIHJvdXRpbmVzICh1c2VyIGxhbmQgcHJvY2Vzc2VzCi1hcmUgZnJvemVuIGF0IHRoaXMgcG9pbnQpLiAgVGhlIHNvbHV0aW9uIG1heSBiZSB0byBsb2FkIHRoZSBmaXJtd2FyZSBpbnRvCi1tZW1vcnkgYmVmb3JlIHByb2Nlc3NlcyBhcmUgZnJvemVuIGFuZCB1cGxvYWQgaXQgZnJvbSB0aGVyZSBpbiB0aGUgLnJlc3VtZSgpCi1yb3V0aW5lLiAgT2YgY291cnNlLCBhIGhpYmVybmF0aW9uIG5vdGlmaWVyIG1heSBiZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UuCi0KLVRoZSBzdWJzeXN0ZW1zIHRoYXQgaGF2ZSBzdWNoIG5lZWRzIGNhbiByZWdpc3RlciBzdXNwZW5kIG5vdGlmaWVycyB0aGF0IHdpbGwgYmUKLWNhbGxlZCB1cG9uIHRoZSBmb2xsb3dpbmcgZXZlbnRzIGJ5IHRoZSBzdXNwZW5kIGNvcmU6CitUaGUgc3Vic3lzdGVtcyBvciBkcml2ZXJzIGhhdmluZyBzdWNoIG5lZWRzIGNhbiByZWdpc3RlciBzdXNwZW5kIG5vdGlmaWVycyB0aGF0Cit3aWxsIGJlIGNhbGxlZCB1cG9uIHRoZSBmb2xsb3dpbmcgZXZlbnRzIGJ5IHRoZSBQTSBjb3JlOgogCiBQTV9ISUJFUk5BVElPTl9QUkVQQVJFCVRoZSBzeXN0ZW0gaXMgZ29pbmcgdG8gaGliZXJuYXRlIG9yIHN1c3BlbmQsIHRhc2tzIHdpbGwKIAkJCWJlIGZyb3plbiBpbW1lZGlhdGVseS4KIAogUE1fUE9TVF9ISUJFUk5BVElPTglUaGUgc3lzdGVtIG1lbW9yeSBzdGF0ZSBoYXMgYmVlbiByZXN0b3JlZCBmcm9tIGEKLQkJCWhpYmVybmF0aW9uIGltYWdlIG9yIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUKLQkJCWhpYmVybmF0aW9uLiAgRGV2aWNlIGRyaXZlcnMnIC5yZXN1bWUoKSBjYWxsYmFja3MgaGF2ZQorCQkJaGliZXJuYXRpb24gaW1hZ2Ugb3IgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nCisJCQloaWJlcm5hdGlvbi4gIERldmljZSBkcml2ZXJzJyByZXN0b3JlIGNhbGxiYWNrcyBoYXZlCiAJCQliZWVuIGV4ZWN1dGVkIGFuZCB0YXNrcyBoYXZlIGJlZW4gdGhhd2VkLgogCiBQTV9SRVNUT1JFX1BSRVBBUkUJVGhlIHN5c3RlbSBpcyBnb2luZyB0byByZXN0b3JlIGEgaGliZXJuYXRpb24gaW1hZ2UuCi0JCQlJZiBhbGwgZ29lcyB3ZWxsIHRoZSByZXN0b3JlZCBrZXJuZWwgd2lsbCBpc3N1ZSBhCisJCQlJZiBhbGwgZ29lcyB3ZWxsLCB0aGUgcmVzdG9yZWQga2VybmVsIHdpbGwgaXNzdWUgYQogCQkJUE1fUE9TVF9ISUJFUk5BVElPTiBub3RpZmljYXRpb24uCiAKLVBNX1BPU1RfUkVTVE9SRQkJQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHRoZSBoaWJlcm5hdGlvbiByZXN0b3JlLgotCQkJRGV2aWNlIGRyaXZlcnMnIC5yZXN1bWUoKSBjYWxsYmFja3MgaGF2ZSBiZWVuIGV4ZWN1dGVkCitQTV9QT1NUX1JFU1RPUkUJCUFuIGVycm9yIG9jY3VycmVkIGR1cmluZyByZXN0b3JlIGZyb20gaGliZXJuYXRpb24uCisJCQlEZXZpY2UgZHJpdmVycycgcmVzdG9yZSBjYWxsYmFja3MgaGF2ZSBiZWVuIGV4ZWN1dGVkCiAJCQlhbmQgdGFza3MgaGF2ZSBiZWVuIHRoYXdlZC4KIAotUE1fU1VTUEVORF9QUkVQQVJFCVRoZSBzeXN0ZW0gaXMgcHJlcGFyaW5nIGZvciBhIHN1c3BlbmQuCitQTV9TVVNQRU5EX1BSRVBBUkUJVGhlIHN5c3RlbSBpcyBwcmVwYXJpbmcgZm9yIHN1c3BlbmQuCiAKIFBNX1BPU1RfU1VTUEVORAkJVGhlIHN5c3RlbSBoYXMganVzdCByZXN1bWVkIG9yIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZwotCQkJdGhlIHN1c3BlbmQuCURldmljZSBkcml2ZXJzJyAucmVzdW1lKCkgY2FsbGJhY2tzIGhhdmUKLQkJCWJlZW4gZXhlY3V0ZWQgYW5kIHRhc2tzIGhhdmUgYmVlbiB0aGF3ZWQuCisJCQlzdXNwZW5kLiAgRGV2aWNlIGRyaXZlcnMnIHJlc3VtZSBjYWxsYmFja3MgaGF2ZSBiZWVuCisJCQlleGVjdXRlZCBhbmQgdGFza3MgaGF2ZSBiZWVuIHRoYXdlZC4KIAogSXQgaXMgZ2VuZXJhbGx5IGFzc3VtZWQgdGhhdCB3aGF0ZXZlciB0aGUgbm90aWZpZXJzIGRvIGZvcgogUE1fSElCRVJOQVRJT05fUFJFUEFSRSwgc2hvdWxkIGJlIHVuZG9uZSBmb3IgUE1fUE9TVF9ISUJFUk5BVElPTi4gIEFuYWxvZ291c2x5LApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90cmFjZS9rcHJvYmV0cmFjZS50eHQgYi9Eb2N1bWVudGF0aW9uL3RyYWNlL2twcm9iZXRyYWNlLnR4dAppbmRleCA2ZDI3YWI4Li5jODNiZDZiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3RyYWNlL2twcm9iZXRyYWNlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3RyYWNlL2twcm9iZXRyYWNlLnR4dApAQCAtMTIwLDcgKzEyMCw2IEBACiAgICAgICAgIGZpZWxkOnVuc2lnbmVkIGNoYXIgY29tbW9uX2ZsYWdzOyAgICAgICBvZmZzZXQ6MjsgICAgICAgc2l6ZToxOyBzaWduZWQ6MDsKICAgICAgICAgZmllbGQ6dW5zaWduZWQgY2hhciBjb21tb25fcHJlZW1wdF9jb3VudDsgICAgICAgb2Zmc2V0OjM7IHNpemU6MTtzaWduZWQ6MDsKICAgICAgICAgZmllbGQ6aW50IGNvbW1vbl9waWQ7ICAgb2Zmc2V0OjQ7ICAgICAgIHNpemU6NDsgc2lnbmVkOjE7Ci0gICAgICAgIGZpZWxkOmludCBjb21tb25fbG9ja19kZXB0aDsgICAgb2Zmc2V0Ojg7ICAgICAgIHNpemU6NDsgc2lnbmVkOjE7CiAKICAgICAgICAgZmllbGQ6dW5zaWduZWQgbG9uZyBfX3Byb2JlX2lwOyBvZmZzZXQ6MTI7ICAgICAgc2l6ZTo0OyBzaWduZWQ6MDsKICAgICAgICAgZmllbGQ6aW50IF9fcHJvYmVfbmFyZ3M7ICAgICAgICBvZmZzZXQ6MTY7ICAgICAgc2l6ZTo0OyBzaWduZWQ6MTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlydHVhbC8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vdmlydHVhbC8wMC1JTkRFWApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTAyNTFjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsLzAwLUlOREVYCkBAIC0wLDAgKzEsMTAgQEAKK1ZpcnR1YWxpemF0aW9uIHN1cHBvcnQgaW4gdGhlIExpbnV4IGtlcm5lbC4KKworMDAtSU5ERVgKKwktIHRoaXMgZmlsZS4KK2t2bS8KKwktIEtlcm5lbCBWaXJ0dWFsIE1hY2hpbmUuICBTZWUgYWxzbyBodHRwOi8vbGludXgta3ZtLm9yZworbGd1ZXN0LworCS0gRXh0cmVtZWx5IHNpbXBsZSBoeXBlcnZpc29yIGZvciBleHBlcmltZW50YWwvZWR1Y2F0aW9uYWwgdXNlLgordW1sLworCS0gVXNlciBNb2RlIExpbnV4LCBidWlsZHMvcnVucyBMaW51eCBrZXJuZWwgYXMgYSB1c2Vyc3BhY2UgcHJvZ3JhbS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va3ZtL2FwaS50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtL2FwaS50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24va3ZtL2FwaS50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vYXBpLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rdm0vY3B1aWQudHh0IGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9jcHVpZC50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24va3ZtL2NwdWlkLnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9jcHVpZC50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va3ZtL2xvY2tpbmcudHh0IGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9sb2NraW5nLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9rdm0vbG9ja2luZy50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vbG9ja2luZy50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va3ZtL21tdS50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtL21tdS50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24va3ZtL21tdS50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vbW11LnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rdm0vbXNyLnR4dCBiL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vbXNyLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9rdm0vbXNyLnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9tc3IudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2t2bS9wcGMtcHYudHh0IGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9wcGMtcHYudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2t2bS9wcGMtcHYudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtL3BwYy1wdi50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va3ZtL3Jldmlldy1jaGVja2xpc3QudHh0IGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9yZXZpZXctY2hlY2tsaXN0LnR4dApzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2t2bS9yZXZpZXctY2hlY2tsaXN0LnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9yZXZpZXctY2hlY2tsaXN0LnR4dAppbmRleCA3MzA0NzVhLi5hODUwOTg2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2t2bS9yZXZpZXctY2hlY2tsaXN0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtL3Jldmlldy1jaGVja2xpc3QudHh0CkBAIC03LDcgKzcsNyBAQAogMi4gIFBhdGNoZXMgc2hvdWxkIGJlIGFnYWluc3Qga3ZtLmdpdCBtYXN0ZXIgYnJhbmNoLgogCiAzLiAgSWYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgYSBuZXcgdXNlcnNwYWNlIEFQSToKLSAgICAtIHRoZSBBUEkgbXVzdCBiZSBkb2N1bWVudGVkIGluIERvY3VtZW50YXRpb24va3ZtL2FwaS50eHQKKyAgICAtIHRoZSBBUEkgbXVzdCBiZSBkb2N1bWVudGVkIGluIERvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vYXBpLnR4dAogICAgIC0gdGhlIEFQSSBtdXN0IGJlIGRpc2NvdmVyYWJsZSB1c2luZyBLVk1fQ0hFQ0tfRVhURU5TSU9OCiAKIDQuICBOZXcgc3RhdGUgbXVzdCBpbmNsdWRlIHN1cHBvcnQgZm9yIHNhdmUvcmVzdG9yZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va3ZtL3RpbWVrZWVwaW5nLnR4dCBiL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vdGltZWtlZXBpbmcudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2t2bS90aW1la2VlcGluZy50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vdGltZWtlZXBpbmcudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2xndWVzdC8uZ2l0aWdub3JlIGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2xndWVzdC8uZ2l0aWdub3JlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2xndWVzdC8uZ2l0aWdub3JlCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL3ZpcnR1YWwvbGd1ZXN0Ly5naXRpZ25vcmUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbGd1ZXN0L01ha2VmaWxlIGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2xndWVzdC9NYWtlZmlsZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9sZ3Vlc3QvTWFrZWZpbGUKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vdmlydHVhbC9sZ3Vlc3QvTWFrZWZpbGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbGd1ZXN0L2V4dHJhY3QgYi9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwvbGd1ZXN0L2V4dHJhY3QKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vbGd1ZXN0L2V4dHJhY3QKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vdmlydHVhbC9sZ3Vlc3QvZXh0cmFjdApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9sZ3Vlc3QvbGd1ZXN0LmMgYi9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwvbGd1ZXN0L2xndWVzdC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2xndWVzdC9sZ3Vlc3QuYwpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2xndWVzdC9sZ3Vlc3QuYwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9sZ3Vlc3QvbGd1ZXN0LnR4dCBiL0RvY3VtZW50YXRpb24vdmlydHVhbC9sZ3Vlc3QvbGd1ZXN0LnR4dApzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2xndWVzdC9sZ3Vlc3QudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL3ZpcnR1YWwvbGd1ZXN0L2xndWVzdC50eHQKaW5kZXggZGFkOTk5Ny4uYmZmMGM1NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9sZ3Vlc3QvbGd1ZXN0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwvbGd1ZXN0L2xndWVzdC50eHQKQEAgLTc0LDcgKzc0LDggQEAKIAogLSBSdW4gYW4gbGd1ZXN0IGFzIHJvb3Q6CiAKLSAgICAgIERvY3VtZW50YXRpb24vbGd1ZXN0L2xndWVzdCA2NCB2bWxpbnV4IC0tdHVubmV0PTE5Mi4xNjguMTkuMSAtLWJsb2NrPXJvb3RmaWxlIHJvb3Q9L2Rldi92ZGEKKyAgICAgIERvY3VtZW50YXRpb24vdmlydHVhbC9sZ3Vlc3QvbGd1ZXN0IDY0IHZtbGludXggLS10dW5uZXQ9MTkyLjE2OC4xOS4xIFwKKyAgICAgICAgLS1ibG9jaz1yb290ZmlsZSByb290PS9kZXYvdmRhCiAKICAgIEV4cGxhbmF0aW9uOgogICAgIDY0OiB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byB1c2UsIGluIE1CLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91bWwvVXNlck1vZGVMaW51eC1IT1dUTy50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwvdW1sL1VzZXJNb2RlTGludXgtSE9XVE8udHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL3VtbC9Vc2VyTW9kZUxpbnV4LUhPV1RPLnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi92aXJ0dWFsL3VtbC9Vc2VyTW9kZUxpbnV4LUhPV1RPLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi94ODYveDg2XzY0L2Jvb3Qtb3B0aW9ucy50eHQgYi9Eb2N1bWVudGF0aW9uL3g4Ni94ODZfNjQvYm9vdC1vcHRpb25zLnR4dAppbmRleCAwOTJlNTk2Li5jNTRiNGY1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3g4Ni94ODZfNjQvYm9vdC1vcHRpb25zLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3g4Ni94ODZfNjQvYm9vdC1vcHRpb25zLnR4dApAQCAtMjA2LDcgKzIwNiw3IEBACiAgICAgICAoZS5nLiBiZWNhdXNlIHlvdSBoYXZlIDwgMyBHQiBtZW1vcnkpLgogICAgICAgS2VybmVsIGJvb3QgbWVzc2FnZTogIlBDSS1ETUE6IERpc2FibGluZyBJT01NVSIKIAotICAgMi4gPGFyY2gveDg2XzY0L2tlcm5lbC9wY2ktZ2FydC5jPjogQU1EIEdBUlQgYmFzZWQgaGFyZHdhcmUgSU9NTVUuCisgICAyLiA8YXJjaC94ODYva2VybmVsL2FtZF9nYXJ0XzY0LmM+OiBBTUQgR0FSVCBiYXNlZCBoYXJkd2FyZSBJT01NVS4KICAgICAgIEtlcm5lbCBib290IG1lc3NhZ2U6ICJQQ0ktRE1BOiB1c2luZyBHQVJUIElPTU1VIgogCiAgICAzLiA8YXJjaC94ODZfNjQva2VybmVsL3BjaS1zd2lvdGxiLmM+IDogU29mdHdhcmUgSU9NTVUgaW1wbGVtZW50YXRpb24uIFVzZWQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vemhfQ04vZW1haWwtY2xpZW50cy50eHQgYi9Eb2N1bWVudGF0aW9uL3poX0NOL2VtYWlsLWNsaWVudHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNjVlMzIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3poX0NOL2VtYWlsLWNsaWVudHMudHh0CkBAIC0wLDAgKzEsMjEwIEBACivplJg/Q2hpbmVzZSB0cmFuc2xhdGVkIHZlcnNpb24gb2YgRG9jdW1lbnRhdGlvbi9lbWFpbC1jbGllbnRzLnR4dAorCitJZiB5b3UgaGF2ZSBhbnkgY29tbWVudCBvciB1cGRhdGUgdG8gdGhlIGNvbnRlbnQsIHBsZWFzZSBjb250YWN0IHRoZQorb3JpZ2luYWwgZG9jdW1lbnQgbWFpbnRhaW5lciBkaXJlY3RseS4gIEhvd2V2ZXIsIGlmIHlvdSBoYXZlIGEgcHJvYmxlbQorY29tbXVuaWNhdGluZyBpbiBFbmdsaXNoIHlvdSBjYW4gYWxzbyBhc2sgdGhlIENoaW5lc2UgbWFpbnRhaW5lciBmb3IKK2hlbHAuICBDb250YWN0IHRoZSBDaGluZXNlIG1haW50YWluZXIgaWYgdGhpcyB0cmFuc2xhdGlvbiBpcyBvdXRkYXRlZAorb3IgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIHRyYW5zbGF0aW9uLgorCitDaGluZXNlIG1haW50YWluZXI6IEhhcnJ5IFdlaSA8aGFycnl4aXlvdUBnbWFpbC5jb20+CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24vZW1haWwtY2xpZW50cy50eHQgPz8/5raTPz8/P+e8iOaYjz8/CisKK+a/oT8/Pz8/P+WuoD8/55KB54OYPz8/P+WtmD/niYg/Pz8/Pz8/Pz8/P+eAueeZuD8/55KH6aOOP+WtmD/jg6g/P+e7r+ivsj8/Pz8/5aaX772HPz/nvIHlrZg/44KIPz8/Pz/mv6E/Pz8/5rWjP+a1o+i3qD/jhKg/6L6oPz8KK+a1nOOChj8/Pz8/Pz/kvLQ/5YmnPz/nkoc/6ZSbP+a2lD8/Pz/mtaDjg6U/P+a2kz8/Pz8/Pz/nvIHlrZg/44KIPz/lp7k/Pz/ilL8/P+a/oT8/Pz8/Pz/nvIjmmI8/Pz8/5a2YP+migT8/Pz8/Pz/oiLU/Pz8/P+e8iD8KK+eShz/ngJs/Pz/jhKk/P+ajsD/plJs/55KH55avPz/nu6/orrPohZE/Pz8/Pz/nvIHlrZg/44KIPz8/Pz8KKwor5raTPz8/Pz8/P+e8geWtmD/jgog/P+mUmz8g55KQ5oOnPz/mv54/ICBIYXJyeSBXZWkgPGhhcnJ5eGl5b3VAZ21haWwuY29tPgor5raTPz8/Pz8/P+e8iOaYjz8/Pz8/6ZSbPyDnkpDmg6c/P+a/nj8gIEhhcnJ5IFdlaSA8aGFycnl4aXlvdUBnbWFpbC5jb20+CivmtpM/Pz8/Pz8/Pz/CpD8/Pz8/6ZSbPyBZaW5nbGluIEx1YW4gPHN5bm15dGhAZ21haWwuY29tPgorCQlYaWFvY2hlbiBXYW5nIDx3YW5neGlhb2NoZW4wQGdtYWlsLmNvbT4KKwkJeWF4aW5zbiA8eWF4aW5zbkAxNjMuY29tPgorCivmtaDjg6Q/P+a2k+eDmD/vvYY/PworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xpbnV4Pz8/5rWg6Le6P+OIoT/po44/Pz8/P+e8gz/mt4fihIM/PworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis/Pz8/Pz8/Pz/nvIM/CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMaW51eD8/Pz8/5q2My4nmtpM/Pz8/Pz8/5p2pPz8/P+a1oOaDsD8/Pz8/5rWc44KHPz/plJs/Pz8/5r+C6IqlPz/nkJvjg6Q/P+a1oz/mtpPmtKo/P+a1oOactT8/Pz8/Pz8/5a6TPz8/Pz8/Pz8/Pz8/P+a1nD/nvIHlrZg/44KIPz8KKz8/44OmP+WglT8/5rWg6K65Pz/mtaM/Pz8/Pz8/5rWg5YmBPz8/Pz/ngLnop4Q/54WOPz/mkLQ/55KH44OmPz8idGV4dC9wbGFpbiI/Pz8/P+aDsD8/6ZSbPz8/P+a1oOactT8/Pz8/Pz8/5raTP+eSpz8/Pz8/Pz/plJs/Cis/Pz/mtpPpuL8/P+a1vD/mtaPog6/Liea2kz8/Pz/lr64/Pz/jhKk/44SlPz8/P+OEqD8/55KB6bi/Pz/nu4s/5raTPz8/Pz8/P+WvsD8/P+S8tD/kv7E/PworCis/P+OEpj/jg6U/Pz8/P0xpbnV4Pz8/Pz/mrYzLiea2kz8/Pz8/Pz/mtaDot7o/44ihP+mjjj8/Pz/jhKU/Pz8/P+eQm+ODpD8/Pz/ot7o/P+eSh+ODpT8/5rWcPz8/Pz8/Pz8/Pz8/P+a/rj8/P+iItT8/Pz8/5riaP+a/oT/plJs/CivmtaA/5rWgP+a2kz8/P+iKpT/nkbA/Pz8/Pz8/Pz8/Pz8/44KFP+aDsOOAg+e7lz8/Pz8/Pz/nu4zng5g/56G3Pz8/Pz8/P+iZqz8/Pz/jhKY/P+a2kz/nkJs/Pz8/5a+uP+a+tuWtmD8/Pz8/57yBP+eBj+S/sT8/CisKK+a2kz/nkZU/Pz8/5p2pPyJmb3JtYXQ9Zmxvd2VkIuWmr+KAsz8/Pz8/Pz8/55Cb44OkPz8/Pz/mnak/Pz/onII/P+Wvrj/nkqfonII/Pz8/P+ajsD8/Pz/mtaDjg6U/Pz8/P+eAueW0hz8/Pz8/55CbPz8/PworCivmtpM/55GVP+eSgeKVgD8/Pz8/Pz8/5rWg6Le6P+OIoT/po44/P+adqT/nkJs/Pz8/Pz/jhKY/44ijPz8/Pz/mnak/Pz/onII/P+a1vD8/P+adkT8/5rWjPz8/P+eQm+ODpD8/Pz8/CisKKz8/P+a1oOi3uj/jiKE/6aOOPz/mtpM/Pz/oiqU/55GwPz8/Pz8/Pz8/Pz/ngJs/57uXPz8/P+e8gj8/Pz8/P+eRsD8/Pz8/55GVPz8/Pz8/Pz8/P+eQm+ODpD8/Pz8/Pz/oiqU/P0FTQ0lJPz8/Pz8/VVRGLTjnvII/Pz8/Pz/nkbA/P+mUmz8KK+a/oT8/Pz/mtaM/5rWj6LeoPz9VVEYtOOe8gj8/Pz8/P+eRsD8/Pz8/Pz8/Pz8/5rWg6K65Pz8/P++9hD8/5rWjP+eBjz/mtbw/Pz/lnq4/P+a2kz/mtZw/Pz8/Pz/ol4k/Pz8/Pz8/P+eAmz/nu5c/Pz8/Pz8/5qOwPz8/PworCis/Pz/mtaDot7o/44ihP+mjjj8/5pC0P+eSh+ODpeiIsD8/P+mqnuactT8/5reHPz8/PyBSZWZlcmVuY2VzOiA/Pz8/Pz8gSW4tUmVwbHktVG86ID8/P+ajsD/plJs/Pz/vvYQ/PworPz8/5rWg5oOwPz/mo7A/54GP5Y+YPz/mtbw/5raTPz8/Pz8/PworCivmvrY/Pz/liYE/P+eUrz8oPz8/Pz8/Pz8/55KQ5a+4Pz/nlK8/KT8/P+eUr+mVkD8/Pz/nlYw/44SkPz/nkJvjg6Q/P+mUmz8/Pz/mtpPlk4Q/5oOw44CD57uXP+a1vD/mnZ4/Pz8/5raT6Jm54pSWPz/nrLo/P+a1o+i3qD8/eGNsaXBib2FyZCwgeGNsaXAKKz8/Pz8/P3hjdXRzZWzmtpQ/55KB56i/Pz/mtaDjg68/P+a1oz8/Pz8/Pz/mv4LoiqU/P+eShz/mtpM/5raTPz8/Pz8/Pz8/5Z6uPz/mtaPot6g/44SlPz8/P+WJgT8/55SvPz8/PworCivmtpM/55GVPz8/44Sk5aiHPz8/UEdQL0dQR+e8g+aPkj8/Pz8/Pz8/5rWg5py16IWRPz8/Pz8/55Cb44OkPz8/Pz/mnak/Pz/onII/P+a1o+Werj8/5a+wP+a+tj8/Pz8/Pz/mtpM/Pz/lgJ8/6K+yPz8/Pz8/Pz8/P+OEpD8/5rWjPz8/P+eQm+ODpD8/Pz8/CivplJs/5p2pP+a2kz8/Pz/mo7A/5pC0P+eSh+ODpj8/Pz8/5rWg44Ok5oWo5r62Pz8/P+mUmz8KKworPz/jhKc/Pz8/Pz8/5pCBPz/mtaDot7o/P+eQm+OEpT8/Pz8/55Cb44OkPz/mtpQ/Pz8/6ZSbP+e8gT8/Pz/lrrjljZ4/Pz8/P+a2kz/mtpM/55Cb44OkPz8/Pz/mtpM/5raTPz8/Pz8/P+a2k+e7mD8/6ZSbP+a3hz/ngJs/Pz/jg6Y/6Le6P+aJrj8/Cis/Pz/mtaDorrk/P+eBjz/nkJvjg6Q/Pz8/PydwYXRjaCc/P+aIkuaKpD8/P+a2kz/plJs/5r+hPz8/Pz8/Pz8/P+a1nD/plJs/Pz8/57yBPz8/Pz8/5pCBPz/mtaDot7o/P+eQm+OEpT8/Pz8/Pz8/CisKKwor5raTP+a1nD8/Pz/mtaDot7o/44ihP+mjjj8/Pz8/57uAPworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor5p2pPz8/P+e8gT8/P+i9sD8/5rWcP+eShz/nvIE/Pz8/TVVBPz8/57yDPz8/P+e7gOeMtD8/Pz8/5rWg44OnP+OEpD8/57yBP0xpbnV4Pz8/Pz/nqL8/Pz8/P+eQm+ODpD8/Pz8/5p2pP+a1nD/pqp7mnLU/Pz8/Pz8/6JmrPz8KKz8/Pz8/Pz8/P+adnj/mtaDot7o/Pz8/P+e8gz8/P+iNpD8/Pz8/CisKK+eSh+WtmD8/6ZSbPworVFVJID0g5rWg44OmPz8/Pz/mtpPlk4Q/6Jm5Pz8/Pz8/P+OEpj/plIs/44OlPz8KK0dVSSA9ID8/5oOn6IiwPz8/Pz/jiKI/44SmP+mUiz/jg6U/PworCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorQWxwaW5lIChUVUkpCisKKz8/P+e8gz8/Pz/mpKTnmbg/PworPz8/IlNlbmRpbmcgUHJlZmVyZW5jZXMiPz/jhKU/P+mUmz8KKworLSAiRG8gTm90IFNlbmQgRmxvd2VkIFRleHQi6LmHP+akpOivsj8/Pz8/CistICJTdHJpcCBXaGl0ZXNwYWNlIEJlZm9yZSBTZW5kaW5nIui5hz/mpKTor7I/5oq9Pz8KKwor6KSwPz8/Pz8/P+a1oOiItT/orrk/Pz8/Pz8/P+aQtD/nkofjg6Y/5oOnP+OEqMuJ5raTP+a1vD8/P+iZuT/mia4/Pz8/54mIP+eZuD8/Pz/ot7o/Pz8/P+a2kz9DVFJMLVLnvIE/Pz8/Pz8/6ZSbP+a1o+aMjj8/54C5Pz8/Pwor55Cb44OkPz8/Pz/mtaDot7o/Pz8/44OlP+S8tD8/5rWg5py16IWRPz8/CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitFdm9sdXRpb24gKEdVSSkKKwor5raTP+a1nD/lr64/Pz8/Pz8/Pz8/Pz8/Pz8/5rWj6LeoP+OEpT8/Pz8/Pz8/55Cb44OkPz8KKwor6KSwPz8/Pz8/4pWFPz/mtaDloJU/P+akpOeZuD8/UHJlZm9ybWF0CisgIOa1oD9Gb3JtYXQtPkhlYWRpbmctPlByZWZvcm1hdHRlZCAoQ3RybC03KT8/Pz8/P+WuuOODpT/plIs/PworCis/P+i3uj8/5rWj6LeoPz/plJs/CisgIEluc2VydC0+VGV4dCBGaWxlLi4uIChBbHQtbiB4KT8/Pz8/44Ooy4nmtpM/Pz8/5rWg6LqyPz8KKwor5rWjP+adqT8/Pz/mtaA/ImRpZmYgLU5ydSBvbGQuYyBuZXcuYyB8IHhjbGlwIumUmz8/Pz8/Pz9QcmVmb3JtYXTplJs/Pz/ot7o/P+a1o+i3qD/jhKTohZE/P+aSrj8/5p2pP+eQmz/nu64/55SvPz8/PworCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorS21haWwgKEdVSSkKKwor5raTP+a1nD/lr64/Pz8/Pz8/Pz8/Pz8/Pz8/5rWj6LeoP+OEpT8/Pz8/Pz8/55Cb44OkPz8/Pz8KKwor5qabP+eSgeOCiD/liafnlobmtpM/5raTP0hUTUw/P+eFjj8/Pz8/Pz8/Pz8/Pz8/6ZSbP+a2kz/nkZU/Pz8/Pz/jhKU/Pz8/PworCivopLA/5raUPz8/P+a2kz/ngY8/Pz8/5rWg5YmBPz8/P+i3uj8/6ZSbPz8/44SpPz/mpKTpgJs/Pz8/P+a2kz/nkZU/Pz8/Pz/ilYQ/Pz8/44SmP+OIoz8/Pz8/Pz8/5raTPz8/P+e8guiZuT/nkbDmsKg/Pz/mtaM/Pz/jhKk/P+a1oOacteiFkeadiD8/P+ODpz8/5rWg6K6zPz8/Pz8/Pz8KKz8/5oiSPz/mtbw/55CaPz8/Pz8/44SmP+OIoz8/6ZSbPz8/P+WnneOChD8/6LmHP+akpOivsj/jhKU/Pz8/P+eQm+ODpD8/5raUPz8/Pz8/Pz8/44SmP+OIoz8/Pz8/Pz8/57ugPz8/Pz8/Pz8/6KeEPz/ngY/ovqg/Pz8/Pz8/44SoPz8/P+OEpj/jiKM/Pz8/44Ok5YqfPz8/Pz8/5rWg6K65Pz8KKz8/6Le6Pz8/Pz/ngLk/5reHP+eAmz/mtpPpuL8/P+e7i+ijpD8/5raTPz8/P+a1oz8/P+OEqD8/57uL5aS46IWRPz8/5aiG4oSDPz/lr64/54C5P+mUmz/ngLk/5a646IysPz8/P+OEqT/jhKg/Pz8/44SmP+OIoz8/5rWcP+mUmz8/P++9hD8/5rWjPz8/Pz8/P+a1oOaDsD/nlYw/6Ii155eFPz8/Cis/Pz8/P+KVhD8/Pz/jhKY/44ijPz/plJs/5rWjPz8/P+adqT/mtpM/5rW8P+a+tuWNnj/or7Llh6E/Pz8/Pz8/Pz8/P+OEpj/jiKM/Pz8/PworCis/P+OEqT8/5rWg5YmBPz/mkLQ/Pz8/6ZSbPz8/Pz8/44Ooy4nmtpM/5raUPz8/P+mUmz8/P+WPpT8/55Sv5ZOlP+OEpz8/55Cb44OkPz/ngLk/Pz8/57uXP+mUmz/mtpM/5raTP+adqT/ngJs/Pz8/KC0tLSk/Pz8KKworPz/ot7o/Pz8/PyJNZXNzYWdlIj8/Pz8/Pz8/77yEPz/plJs/Pz8/Pz/ilYI/Pz8/44OmPz/mtaDorrk/Pz8/44OnPz8/Pz8/Pz/mtaM/Pz8/55Cb44OkPz8/Pz/mtaDourI/P+adqT8/Pz/mtpM/5raTP+ajsD/mvrY/Pz8/Pz8/5qSk55m4Pz/mtaM/Pz8/5rWgPworPz8/5p2pP+eAuT8/Pz/nvIM/5rWjPz8/Pz8/P+a1oOi3uue8k+e7lD/lrrjjg6U/6ZSLPz8/Pz8/Pz/plJs/5p2pPz8/P+a1oOODpeeUq+a2kz8iaW5zZXJ0IGZpbGUiPz/ngqw/Pz8/PworCivmtaM/Pz8/5rWg44OlPz8/P+OEpT/kvLQ/P+adqT9HUEc/Pz/nkoHkvLQ/P+a1oOiuuT8/5rWjPz8/Pz8/P+Wukz/nkJvjg6Q/Pz8/P+a/guaIkj8/55GVP+a1o+i3qD8/R1BHPz8/55KB5p2/Pz/mtaA/Pz8/5rWjP+a2k+WThD8/5a6TPz8/Pz8/Pz8/P+e7m+aDpz8/55Cb44OkPz/plJs/CivopLA/5rWgP0dQR+a2kz8/Pz8/Pz835rWjP+e8gj8/Pz8/P+actT8/5rWj5aS4Pz/mtaA/Pz8/Pz8/Pz/mnZE/P+a+tj8/Pz8/Pz8KKwor5r+hPz8/P+a1oz8/Pz/nkZU/5rWg44OpPz/mtaDliYE/P+iksOOIoD8/Pz8/Pz8/55Cb44OkPz/plJs/Pz/vvYQ/P+eBj+WNnj/mir0/Pz8/55GwP+Wpmj8/5rWg6K65Pz8/P+i3uj8/Pz8/5raTP+eBnj8/P9GNPz/nu5A/Pz8/IlN1Z2dlc3QgYXV0b21hdGljCitkaXNwbGF5IumUmz/mnak/Pz/ls7A/P+Wukz8/Pz/mtaDoiLU/5p2RP+inhD8/55KB4pWEP+aYjz8/Pz8/Pz/oiKw/PworCivopLA/5rWjP+eRlT/mt4c/54CbP+eBjz/nkZU/Pz8/Pz8/Pz8/Pz8/5a6TPz8/Pz8/P+eQm+ODpD8/6ZSbP+a1oz8/Pz/mtaDjg6Q/P+WokT8/Pz8/Pz/nkJvjhKc/Pz8/5aW4Pz8/P+KVgT8/Pz8/55Cb44OkPz8/Pz8/Pz/mtaDorrk/Pz8/6Le6Pz8/P+WGsj/lqZo/Pz8/PworInNhdmUgYXMiPz8/5rWjPz8/P+a1oOODpOWohz8/44SkPz/mtpM/5aiM4oSDPz8/P+WtmD/lnK0/Pz8/Pz8/P+eQm+ODpD8/Pz8/Pz8/5rWg6K65Pz/mv6E/Pz8/54C5Pz8/P+a1oOODpj/vvYfigJg/Pz/opLDjiKA/P+e8gT8/Pz8/Pz/opLA/5rWjP+Wnne+9hz8/Pz/jhKU/PworPz8/5a646L6pPz/nu5A/Pz/vvYQ/P+a2kz/ngLU/Pz8/6ZSbPz8/772GP+iIteeXhT8/Pz8/P+akpOeRsD8/5rWg44OkPz/ngJs/Pz8/5rWgPy0t5a646IysPz8/Pz/mtpM/5raTP+adqT8/P+mjjj8/YnVn55CaP+WnuT8/P+ODpT/pooE/P2ttYWlsPz8/YnVnemlsbGEKK+mqnuactT8/55SvPz8/P+adqT/ngY8/5rW8P+eQmj/mvrY/Pz8/Pz8/Pz8/5rWg6Ii1Pz/mtaDjg6U/Pz8/P+eAteinhD8/5raTPz8/44SmP+WzsD8/55KH6K+yPz8/Pz8/Pz8/Pz/nkJo/5reHP+eAmz8/Pz/plJs/Pz8/5rWg44OlPz8/Pz/mtaM/Pz/omas/Pz8/P+a1oOi3uj8/Pz/ot7o/5p2/P+actT8/Pz/niYg/55m4Pz8KK+a1oz/mtpM/5a+wP+a2kz8/Pz/mtaA/5rWgPz8/Pz8/Pz8/Pz8/6YCb6LSf57yBPz8/Pz8/Pz8/57+gPz8/Pz/nkofmsYc/PworCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorTG90dXMgTm90ZXMgKEdVSSkKKwor5raTP+eRlT/mtaPot6g/44SlPz8/Pz8KKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK011dHQgKFRVSSkKKwor5a+wP+a+tj9MaW51eOWvrj8/Pz/mtZzlk4Q/P+a1o+i3qD8/bXV0dOeAueOIoT/po44/P+mUmz8/Pz/mtaDjg6g/Pz8/P+eAuT8/Pz/ngLk/5a6444OkPz8/Pz8/Pz/nlK/lkYo/P+a1nD8/Pz8KKworTXV0dOa2kz8/Pz/nlK8/57yCP+adiD8/Pz/plJs/Pz8/5rWg44OkPz/nu6DigLI/P+a1o+i3qD/jhKQ/P+a2lD/nvII/5p2IPz8/44SpP+aIkj8/5pC0P+eSh+ODpeeUqz8/Pz8/Pz8/44SmPz/nkJs/Pz8/5r620YM/Pz8/5omuPz/mnYg/Pz/jhKk/6JeJ55SrPz8/CivmtpM/5raTPyJpbnNlcnQgZmlsZSI/Pz/mpKTnmbg/P+eAuT8/Pz/mtaDjg6k/P+adqT/mtpM/Pz/nkbA/Pz8/P+a1oOi3uj8/54C55ZytPz8/P+eRsD8/Pz8/Pz/jg6Y/P+a1oOi6sj8/CisKKyd2aW0n5rWjP+a2kz9tdXR0Pz8/57yCP+adiD8/Pz/plJs/CisgIHNldCBlZGl0b3I9InZpIgorCisgIOa/oT8/Pz/mtaPot6g/P3hjbGlw6ZSbPz8/5o+SP+ODpOS6kua2kz8/P+aIkuaKpAorICA6c2V0IHBhc3RlCisgID8/P+a2kz8/Pz/mtpQ/Pz8/Pz8/Pz8/c2hpZnQtaW5zZXJ0Pz8/Pz8/5rWj6LeoPz8KKyAgOnIgZmlsZW5hbWUKKwor5r+hPz8/Pz8/5a6gPz8/Pz/nkJvjg6Q/P+a1oz/mtpPlk4Q/P+Wukz8/Pz8/Pz8/Pz8KKyhhKXR0YWNo5a6444OkPz8/Pz/lr7A/5r+C5pakPz/mtpM/55SvPz8/PyJzZXQgcGFzdGUiPz8/CisKKz8/P+e8gz8/Pz/mpKTnmbg/Pwor54C5P+aQtD/nkofjg6TkupLmpps/55KB44KIP+WJp+eWhj8/P+iksOOIoD8/5a6444OkPz8/Pz8KKz8/5oOwPz/plJs/Pz8/InNlbmRfY2hhcnNldCLnkoHliafnlobmtpM/InVzLWFzY2lpOjp1dGYtOCLmtpQ/Pz8/5raTP+a2kz/mtpM/Pz8/Pz8/5raT57uYPz8/Pz8KKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK1BpbmUgKFRVSSkKKworUGluZeadqT8/P+e7mD8/5raTP+a1nD/nu4zng5g/54WOPz8/Pz8/Pz/mo7A/6ZSbP+a1oz8/Pz/mnak/5rWcPz8/5p2/P+OEpT8/55KH44OpP+WAnz8/5reHP+a+tj/mtZw/Pz8/CisKK+a/oT8/Pz8/Pz/mtaDjg68/P+eSh+icguWohz8/P2FscGluZShwaW5lPz8/57yB0YQ/6IOvPz8pCisKKz8/P+e8gz8/Pz/mpKTnmbg/PworLSA/Pz/mnak/Pz8/Pz8/Pz8/Pz8/55GVP+WokT8/P+OChj8/57uLPz8/Pz8/PworLSAibm8tc3RyaXAtd2hpdGVzcGFjZS1iZWZvcmUtc2VuZCI/Pz/mpKTpgJs/Pz8/Pz8/P+eRlT8/Pz8/Pz8KKworCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorU3lscGhlZWQgKEdVSSkKKworLSA/Pz/lrpM/Pz8/Pz8/Pz8/5rWg44OlPz/mv4LnlYw/P+WuuOODpD8/6ZSbPz8/Pz8/P+a1o+i3qD/jhKk/P+a1oOiuuT8/Pz8/CistID8/P+eSgemVkOWohz8/44SlPz8/P+OEpz8/57yCP+adiD8/P+OEoz8/CistIOeAtemAmz8/Pz8/6KSwP+adiD/mvrY/Pz/loJU/P+eUr+WRij8/Pz8/CistIOa/oT8/Pz8/Pz/mnak/bm9uLVNTTOadqT8/P+ODrz8/Pz8/5aiJP+a1o+i3qD8/VExTIFNNVFA/Pz8/Pz8/Pz8KKy0gPz/jhKc/Pz8/P+e7kD8/P++9hOiFkT8/P+a2kz/mtpM/5a+wPz8/Pz8/44SnPz9ydWxlciBiYXI/Pz8KKy0g57yBPz8/5p2/Pz8/Pz/mtpM/5aij6K+yPz8/P+advz8/54GP5Y+YPz/mtbw/5aed772H4oCYPz8/5rWcP+eRme+9hj/liafjgZo/Pz8/Pz8KKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK1RodW5kZXJiaXJkIChHVUkpCisKK+ammz/nkoHjgoY/Pz8/5YW4Pz/plJs/dGh1bmRlcmJpcmTlr7A/54C56KeEPz8/Pz8/Pz8/Pz8/Pz/plJs/5rWjPz8/P+adqT8/Pz/mtpM/5rWcPz8/6KeEPz8/Pz/mtaDjg6Xlt7E/P+i3uj8/Pz8/5a+wPz8/5p2R44K9Pz8/CisKKy0gPz/jhKc/44SmP+WzsD8/Pz/nlq8/5Ymn55aGPz8/6ZSbP+e8gT8/Pz8/Pz/ngLXor7I/P+mUmz/mtpM/55GVPz8/Pz8/PyJDb21wb3NlIG1lc3NhZ2VzIGluIEhUTUwgZm9ybWF0Ij8/PworCistIOe8gj/mnYg/5rWjPz8/P1RodW5kZXJiaXJkPz8/57yDP+eSgeWJp+eWhj8/44Ok5aiH54C5P+a2kz/nkZU/Pz8/55CbP+a1o+i3qD8/6ZSbP3VzZXJfcHJlZigibWFpbG5ld3Mud3JhcGxlbmd0aCIsIDApOworCistIOe8gj/mnYg/5rWjPz8/P1RodW5kZXJiaXJkPz8/57yDP+eSgeWJp+eWhumUmz/mtaPlnq4/P+a2kz/nkZU/5rWj6LeoPz8iZm9ybWF0PWZsb3dlZCI/P+eFjj8/6ZSbP3VzZXJfcHJlZigibWFpbG5ld3MuCisgIHNlbmRfcGxhaW50ZXh0X2Zsb3dlZCIsIGZhbHNlKTsKKworLSDmtaM/Pz8/55GVP+a1oz9UaHVuZGVyYmlyZD8/P+a2k+a0qj8/Pz8/Pz/nhY4/Pz8/55GwPz/plJs/CisgIOa/oT8/Pz/mpps/55KB44KGPz8/P+WFuD8/5rWjP+a2lD8/Pz8/Pz8/Pz9IVE1MPz/nhY4/P+mUmz8/P++9hD8/Pz8/5a+wPz8/5L+xPz/mtaA/5rWgP+a1oD8/Pz/mo7A/Pz8/Pz8/5raTPz8/P+Wmlz/mtpM/Pz8/Pz8/IlByZWZvcm1hdCI/P+eFjj8/Pz8/CisgIOa/oT8/Pz/mpps/55KB44KGPz8/P+WFuD8/5rWjP+a2lD8/Pz8/Pz8/Pz8/Pz8/Pz8/P+eFjj8/6ZSbP+a1oz/mtpM/5a+wPz8/P+eAuT8/P+mAm+i0n0hUTUw/P+eFjj8/6ZSbP+a1oD/mtaA/5rWjP+a2k+i9sD8/5aiG4oSDP9GFPz/plJs/Pz/jg6Tlip8/Pz8/P+aJrj8/5aiRPz8/P+mUmz8KKyAgPz/ot7o/P+WvruWThD/mnLXlqIfngLk/Pz8/Pz/niYg/Pz8/Pz8/54WOPz/plJs/Pz8/Pz8/54C5P+eBj+WPmD8/Pz8/55CbPz8/P+eRlT/ngLk/Pz/mnb8/P+mUmz8/P+OEpT8/5reH77yEPz8/P+eCrD8/5raTP+a1o+i3qD8/c2hpZnQ/Pz8/P+ODpOWoh+eAuT8/Pz/mtpM/SFRNTAorICA/P+eFjj8/6ZSbPz8/6Le6Pz8/Pz/mo7A/Pz8/Pz8/5raTPz8/P+Wmlz/mtpM/Pz8/Pz8/IlByZWZvcm1hdCI/P+eFjj8/Pz8/CisKKy0gPz8/55KB6ZWQ5aiHPz/jhKU/Pz8/44SnPz/nvII/5p2IPz8/P+mUmz8KKyAgPz8/54C1P1RodW5kZXJiaXJkPz8/55Cb44OkPz8/Pz/nu6A/Pz8/Pz8/Pz/op4Q/P+eBj+i+qD8/5rWj6LeoP+OEpD8/5raTPyJleHRlcm5hbCBlZGl0b3IiPz/ilYE/P+mUmz8/P+i3uj8/5rWj6LeoP+OEpD8/Pz8/Pz8/5aiG44iiPz8KKyAgJEVESVRPUj8/44OoP+ivsj8/Pz8/Pz8/Pz8/6aqe5oOwy4nmtpM/Pz/niYg/Pz8/P+a2kz8/Pz/nkZU/54C5Pz8/5p2/Pz/plJs/Pz8/5rWg44OkPz/mnZ7ol4noi5/mtpM/54C5P+eRgT/mnak/5raTPz8/4pWBPz/plJs/Pz/ot7o/P+Woo+ivsj8/5raTP+a2kz/mtaPot6g/44SlPz8/Pz8KKyAgPz8/Pz8/Vmlldy0+VG9vbGJhcnMtPkN1c3RvbWl6ZS4uLj8/Pz8/P+iksD/mtaM/5raUPz8/P+a3h+KEgz8/Pz8/Pz/ot7o/P+a1oD/mtaA/Pz/nkbA/6K+yPz/ngY/ljZ4/P+a1oOODpD8/Pz8/CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitUa1JhdCAoR1VJKQorCis/Pz/mtaDjg6TlqIc/P+OEpT8/Pz8/5rWj6LeoPz8iSW5zZXJ0IGZpbGUuLi4iPz8/Pz8/5r62Pz8/44SnPz/nvII/5p2IPz8/44SjPz8KKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK0dtYWlsIChXZWIgR1VJKQorCivmtpM/55GVP+a1o+i3qD/jhKU/Pz8/Pz8/P+eQm+ODpD8/Pz8/CisKK0dtYWls57yDP+akpOmdmz/jiKE/6aOOPz8/Pz8/P+OEpT/niYg/Pz8/5oOw44CD57uXP+adnj8/Pz/mtpPombnilJY/P+esuj8/CisKKz8/55WMP+i3uj/mg7DjgIPnu5c/5p2ePz8/P+a2k+iZueKUlj8/5aW4Pz/mo7A/Pz8/5rWg44OoPz/mvrY/Pz/jhKc/P+adiD8/P+OEqNCSPz/nrbk/Pz8/Pz8/6Le6Pz/mnak/5rW8P+a1o+i3qD/jhKU/P+adnj8/P+OIoz8/Pz8/5aejP+eQmz8/Pz8/Pz/mtpM/NzjmtpM/54CbP+e7lz8/Pz8KKworPz8/5raTP+a2kz8/Pz/mo7A/Pz8/R21haWzmnak/5rW8Pz8/P+a1oOiusz8/5raTPz8/P0FTQ0lJPz8/54CbP+e7lz8/Pz/mt4fihIM/Pz8/6YCb6LSfYmFzZTY057yCPz8/Pz8/P+eAuT8/Pz/mtpM/55GX5Z6uPz8/Pz8/Pz/lqIbRhOW6iua1nOiZuT8/Pz8/54CbPz8/PworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIwpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCA2OWYxOWYxLi44ZGY4ZDJkIDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtNDA1LDggKzQwNSw4IEBACiBGOglzb3VuZC9vc3MvYWVkc3AxNi5jCiAKIEFGRlMgRklMRSBTWVNURU0KLU06CVJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgotUzoJTWFpbnRhaW5lZAorTDoJbGludXgtZnNkZXZlbEB2Z2VyLmtlcm5lbC5vcmcKK1M6CU9ycGhhbgogRjoJRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9hZmZzLnR4dAogRjoJZnMvYWZmcy8KIApAQCAtMjk0Niw4ICsyOTQ2LDggQEAKIEY6CWluY2x1ZGUvbGludXgvY2Npc3NfaW9jdGwuaAogCiBIRlMgRklMRVNZU1RFTQotTToJUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+Ci1TOglNYWludGFpbmVkCitMOglsaW51eC1mc2RldmVsQHZnZXIua2VybmVsLm9yZworUzoJT3JwaGFuCiBGOglEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2hmcy50eHQKIEY6CWZzL2hmcy8KIApAQCAtMzgxNCw3ICszODE0LDcgQEAKIEw6CWxndWVzdEBsaXN0cy5vemxhYnMub3JnCiBXOglodHRwOi8vbGd1ZXN0Lm96bGFicy5vcmcvCiBTOglPZGQgRml4ZXMKLUY6CURvY3VtZW50YXRpb24vbGd1ZXN0LworRjoJRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2xndWVzdC8KIEY6CWFyY2gveDg2L2xndWVzdC8KIEY6CWRyaXZlcnMvbGd1ZXN0LwogRjoJaW5jbHVkZS9saW51eC9sZ3Vlc3QqLmgKQEAgLTQwMDEsNyArNDAwMSw2IEBACiAKIE02OEsgQVJDSElURUNUVVJFCiBNOglHZWVydCBVeXR0ZXJob2V2ZW4gPGdlZXJ0QGxpbnV4LW02OGsub3JnPgotTToJUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CiBMOglsaW51eC1tNjhrQGxpc3RzLmxpbnV4LW02OGsub3JnCiBXOglodHRwOi8vd3d3LmxpbnV4LW02OGsub3JnLwogVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9nZWVydC9saW51eC1tNjhrLmdpdApAQCAtNjYzMiw3ICs2NjMxLDcgQEAKIEw6CXVzZXItbW9kZS1saW51eC11c2VyQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAogVzoJaHR0cDovL3VzZXItbW9kZS1saW51eC5zb3VyY2Vmb3JnZS5uZXQKIFM6CU1haW50YWluZWQKLUY6CURvY3VtZW50YXRpb24vdW1sLworRjoJRG9jdW1lbnRhdGlvbi92aXJ0dWFsL3VtbC8KIEY6CWFyY2gvdW0vCiBGOglmcy9ob3N0ZnMvCiBGOglmcy9ocHBmcy8KZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggNDFlYTZmYi4uYTAzNDRhOCAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTEsNyArMSw3IEBACiBWRVJTSU9OID0gMgogUEFUQ0hMRVZFTCA9IDYKIFNVQkxFVkVMID0gMzkKLUVYVFJBVkVSU0lPTiA9IC1yYzcKK0VYVFJBVkVSU0lPTiA9CiBOQU1FID0gRmxlc2gtRWF0aW5nIEJhdHMgd2l0aCBGYW5ncwogCiAjICpET0NVTUVOVEFUSU9OKgpAQCAtMTI2OCw2ICsxMjY4LDcgQEAKIAlAZWNobyAgJyAgbWFrZSBDPTEgICBbdGFyZ2V0c10gQ2hlY2sgYWxsIGMgc291cmNlIHdpdGggJCRDSEVDSyAoc3BhcnNlIGJ5IGRlZmF1bHQpJwogCUBlY2hvICAnICBtYWtlIEM9MiAgIFt0YXJnZXRzXSBGb3JjZSBjaGVjayBvZiBhbGwgYyBzb3VyY2Ugd2l0aCAkJENIRUNLJwogCUBlY2hvICAnICBtYWtlIFc9MSAgIFt0YXJnZXRzXSBFbmFibGUgZXh0cmEgZ2NjIGNoZWNrcycKKwlAZWNobyAgJyAgbWFrZSBSRUNPUkRNQ09VTlRfV0FSTj0xIFt0YXJnZXRzXSBXYXJuIGFib3V0IGlnbm9yZWQgbWNvdW50IHNlY3Rpb25zJwogCUBlY2hvICAnJwogCUBlY2hvICAnRXhlY3V0ZSAibWFrZSIgb3IgIm1ha2UgYWxsIiB0byBidWlsZCBhbGwgdGFyZ2V0cyBtYXJrZWQgd2l0aCBbKl0gJwogCUBlY2hvICAnRm9yIGZ1cnRoZXIgaW5mbyBzZWUgdGhlIC4vUkVBRE1FIGZpbGUnCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zbXAuYyBiL2FyY2gvYWxwaGEva2VybmVsL3NtcC5jCmluZGV4IDQyYWEwNzguLjVhNjIxYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3NtcC5jCkBAIC01ODUsOCArNTg1LDcgQEAKIAogCQlzd2l0Y2ggKHdoaWNoKSB7CiAJCWNhc2UgSVBJX1JFU0NIRURVTEU6Ci0JCQkvKiBSZXNjaGVkdWxlIGNhbGxiYWNrLiAgRXZlcnl0aGluZyB0byBiZSBkb25lCi0JCQkgICBpcyBkb25lIGJ5IHRoZSBpbnRlcnJ1cHQgcmV0dXJuIHBhdGguICAqLworCQkJc2NoZWR1bGVyX2lwaSgpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBJUElfQ0FMTF9GVU5DOgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL3ZpYy5jIGIvYXJjaC9hcm0vY29tbW9uL3ZpYy5jCmluZGV4IDExMzA4NWEuLjdhYTQyNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbW1vbi92aWMuYworKysgYi9hcmNoL2FybS9jb21tb24vdmljLmMKQEAgLTIyLDE3ICsyMiwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvdmljLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19QTSkKKyNpZmRlZiBDT05GSUdfUE0KIC8qKgogICogc3RydWN0IHZpY19kZXZpY2UgLSBWSUMgUE0gZGV2aWNlCi0gKiBAc3lzZGV2OiBUaGUgc3lzdGVtIGRldmljZSB3aGljaCBpcyByZWdpc3RlcmVkLgogICogQGlycTogVGhlIElSUSBudW1iZXIgZm9yIHRoZSBiYXNlIG9mIHRoZSBWSUMuCiAgKiBAYmFzZTogVGhlIHJlZ2lzdGVyIGJhc2UgZm9yIHRoZSBWSUMuCiAgKiBAcmVzdW1lX3NvdXJjZXM6IEEgYml0bWFzayBvZiBpbnRlcnJ1cHRzIGZvciByZXN1bWUuCkBAIC00Myw4ICs0Miw2IEBACiAgKiBAcHJvdGVjdDogU2F2ZSBmb3IgVklDX1BST1RFQ1QuCiAgKi8KIHN0cnVjdCB2aWNfZGV2aWNlIHsKLQlzdHJ1Y3Qgc3lzX2RldmljZSBzeXNkZXY7Ci0KIAl2b2lkIF9faW9tZW0JKmJhc2U7CiAJaW50CQlpcnE7CiAJdTMyCQlyZXN1bWVfc291cmNlczsKQEAgLTU5LDExICs1Niw2IEBACiBzdGF0aWMgc3RydWN0IHZpY19kZXZpY2UgdmljX2RldmljZXNbQ09ORklHX0FSTV9WSUNfTlJdOwogCiBzdGF0aWMgaW50IHZpY19pZDsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgdmljX2RldmljZSAqdG9fdmljKHN0cnVjdCBzeXNfZGV2aWNlICpzeXMpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihzeXMsIHN0cnVjdCB2aWNfZGV2aWNlLCBzeXNkZXYpOwotfQogI2VuZGlmIC8qIENPTkZJR19QTSAqLwogCiAvKioKQEAgLTg1LDEwICs3Nyw5IEBACiAJd3JpdGVsKDMyLCBiYXNlICsgVklDX1BMMTkwX0RFRl9WRUNUX0FERFIpOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfUE0pCi1zdGF0aWMgaW50IHZpY19jbGFzc19yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyB2b2lkIHJlc3VtZV9vbmVfdmljKHN0cnVjdCB2aWNfZGV2aWNlICp2aWMpCiB7Ci0Jc3RydWN0IHZpY19kZXZpY2UgKnZpYyA9IHRvX3ZpYyhkZXYpOwogCXZvaWQgX19pb21lbSAqYmFzZSA9IHZpYy0+YmFzZTsKIAogCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVzdW1pbmcgdmljIGF0ICVwXG4iLCBfX2Z1bmNfXywgYmFzZSk7CkBAIC0xMDcsMTMgKzk4LDE4IEBACiAKIAl3cml0ZWwodmljLT5zb2Z0X2ludCwgYmFzZSArIFZJQ19JTlRfU09GVCk7CiAJd3JpdGVsKH52aWMtPnNvZnRfaW50LCBiYXNlICsgVklDX0lOVF9TT0ZUX0NMRUFSKTsKLQotCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHZpY19jbGFzc19zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyB2b2lkIHZpY19yZXN1bWUodm9pZCkKIHsKLQlzdHJ1Y3QgdmljX2RldmljZSAqdmljID0gdG9fdmljKGRldik7CisJaW50IGlkOworCisJZm9yIChpZCA9IHZpY19pZCAtIDE7IGlkID49IDA7IGlkLS0pCisJCXJlc3VtZV9vbmVfdmljKHZpY19kZXZpY2VzICsgaWQpOworfQorCitzdGF0aWMgdm9pZCBzdXNwZW5kX29uZV92aWMoc3RydWN0IHZpY19kZXZpY2UgKnZpYykKK3sKIAl2b2lkIF9faW9tZW0gKmJhc2UgPSB2aWMtPmJhc2U7CiAKIAlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHN1c3BlbmRpbmcgdmljIGF0ICVwXG4iLCBfX2Z1bmNfXywgYmFzZSk7CkBAIC0xMjgsMTQgKzEyNCwyMSBAQAogCiAJd3JpdGVsKHZpYy0+cmVzdW1lX2lycXMsIGJhc2UgKyBWSUNfSU5UX0VOQUJMRSk7CiAJd3JpdGVsKH52aWMtPnJlc3VtZV9pcnFzLCBiYXNlICsgVklDX0lOVF9FTkFCTEVfQ0xFQVIpOworfQorCitzdGF0aWMgaW50IHZpY19zdXNwZW5kKHZvaWQpCit7CisJaW50IGlkOworCisJZm9yIChpZCA9IDA7IGlkIDwgdmljX2lkOyBpZCsrKQorCQlzdXNwZW5kX29uZV92aWModmljX2RldmljZXMgKyBpZCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IHN5c2Rldl9jbGFzcyB2aWNfY2xhc3MgPSB7Ci0JLm5hbWUJCT0gInZpYyIsCi0JLnN1c3BlbmQJPSB2aWNfY2xhc3Nfc3VzcGVuZCwKLQkucmVzdW1lCQk9IHZpY19jbGFzc19yZXN1bWUsCitzdHJ1Y3Qgc3lzY29yZV9vcHMgdmljX3N5c2NvcmVfb3BzID0geworCS5zdXNwZW5kCT0gdmljX3N1c3BlbmQsCisJLnJlc3VtZQkJPSB2aWNfcmVzdW1lLAogfTsKIAogLyoqCkBAIC0xNDcsMzAgKzE1MCw4IEBACiAqLwogc3RhdGljIGludCBfX2luaXQgdmljX3BtX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgdmljX2RldmljZSAqZGV2ID0gdmljX2RldmljZXM7Ci0JaW50IGVycjsKLQlpbnQgaWQ7Ci0KLQlpZiAodmljX2lkID09IDApCi0JCXJldHVybiAwOwotCi0JZXJyID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZ2aWNfY2xhc3MpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IHJlZ2lzdGVyIGNsYXNzXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JZm9yIChpZCA9IDA7IGlkIDwgdmljX2lkOyBpZCsrLCBkZXYrKykgewotCQlkZXYtPnN5c2Rldi5pZCA9IGlkOwotCQlkZXYtPnN5c2Rldi5jbHMgPSAmdmljX2NsYXNzOwotCi0JCWVyciA9IHN5c2Rldl9yZWdpc3RlcigmZGV2LT5zeXNkZXYpOwotCQlpZiAoZXJyKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgZGV2aWNlXG4iLAotCQkJICAgICAgIF9fZnVuY19fKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KLQl9CisJaWYgKHZpY19pZCA+IDApCisJCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZ2aWNfc3lzY29yZV9vcHMpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9pODI1My5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vaTgyNTMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDY1NmI2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vaTgyNTMuaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIF9fQVNNQVJNX0k4MjUzX0gKKyNkZWZpbmUgX19BU01BUk1fSTgyNTNfSAorCisvKiBpODI1M0EgUElUIHJlZ2lzdGVycyAqLworI2RlZmluZSBQSVRfTU9ERQkweDQzCisjZGVmaW5lIFBJVF9DSDAJCTB4NDAKKworI2RlZmluZSBQSVRfTEFUQ0gJKChQSVRfVElDS19SQVRFICsgSFogLyAyKSAvIEhaKQorCitleHRlcm4gcmF3X3NwaW5sb2NrX3QgaTgyNTNfbG9jazsKKworI2RlZmluZSBvdXRiX3BpdAlvdXRiX3AKKyNkZWZpbmUgaW5iX3BpdAkJaW5iX3AKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL3RpbWUuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvdGltZS5oCmluZGV4IDg4M2Y2YmUuLmQ1YWRhYWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvdGltZS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvdGltZS5oCkBAIC0zNCw3ICszNCw2IEBACiAgKiAgIHRpbWVyIGludGVycnVwdCB3aGljaCBtYXkgYmUgcGVuZGluZy4KICAqLwogc3RydWN0IHN5c190aW1lciB7Ci0Jc3RydWN0IHN5c19kZXZpY2UJZGV2OwogCXZvaWQJCQkoKmluaXQpKHZvaWQpOwogCXZvaWQJCQkoKnN1c3BlbmQpKHZvaWQpOwogCXZvaWQJCQkoKnJlc3VtZSkodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvbGVkcy5jIGIvYXJjaC9hcm0va2VybmVsL2xlZHMuYwppbmRleCAzMWEzMTZjLi4wZjEwN2RjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvbGVkcy5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9sZWRzLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KIAogI2luY2x1ZGUgPGFzbS9sZWRzLmg+CiAKQEAgLTY5LDI5ICs3MCw4IEBACiAKIHN0YXRpYyBTWVNERVZfQVRUUihldmVudCwgMDIwMCwgTlVMTCwgbGVkc19zdG9yZSk7CiAKLXN0YXRpYyBpbnQgbGVkc19zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlsZWRzX2V2ZW50KGxlZF9zdG9wKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBsZWRzX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQotewotCWxlZHNfZXZlbnQobGVkX3N0YXJ0KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBsZWRzX3NodXRkb3duKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCi17Ci0JbGVkc19ldmVudChsZWRfaGFsdGVkKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgbGVkc19zeXNjbGFzcyA9IHsKIAkubmFtZQkJPSAibGVkcyIsCi0JLnNodXRkb3duCT0gbGVkc19zaHV0ZG93biwKLQkuc3VzcGVuZAk9IGxlZHNfc3VzcGVuZCwKLQkucmVzdW1lCQk9IGxlZHNfcmVzdW1lLAogfTsKIAogc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIGxlZHNfZGV2aWNlID0gewpAQCAtOTksNiArNzksMjggQEAKIAkuY2xzCQk9ICZsZWRzX3N5c2NsYXNzLAogfTsKIAorc3RhdGljIGludCBsZWRzX3N1c3BlbmQodm9pZCkKK3sKKwlsZWRzX2V2ZW50KGxlZF9zdG9wKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbGVkc19yZXN1bWUodm9pZCkKK3sKKwlsZWRzX2V2ZW50KGxlZF9zdGFydCk7Cit9CisKK3N0YXRpYyB2b2lkIGxlZHNfc2h1dGRvd24odm9pZCkKK3sKKwlsZWRzX2V2ZW50KGxlZF9oYWx0ZWQpOworfQorCitzdGF0aWMgc3RydWN0IHN5c2NvcmVfb3BzIGxlZHNfc3lzY29yZV9vcHMgPSB7CisJLnNodXRkb3duCT0gbGVkc19zaHV0ZG93biwKKwkuc3VzcGVuZAk9IGxlZHNfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGxlZHNfcmVzdW1lLAorfTsKKwogc3RhdGljIGludCBfX2luaXQgbGVkc19pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKQEAgLTEwNyw2ICsxMDksOCBAQAogCQlyZXQgPSBzeXNkZXZfcmVnaXN0ZXIoJmxlZHNfZGV2aWNlKTsKIAlpZiAocmV0ID09IDApCiAJCXJldCA9IHN5c2Rldl9jcmVhdGVfZmlsZSgmbGVkc19kZXZpY2UsICZhdHRyX2V2ZW50KTsKKwlpZiAocmV0ID09IDApCisJCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZsZWRzX3N5c2NvcmVfb3BzKTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc21wLmMgYi9hcmNoL2FybS9rZXJuZWwvc21wLmMKaW5kZXggZjI5YjhhMi4uMDA3YTBhOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3NtcC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zbXAuYwpAQCAtNTYwLDEwICs1NjAsNyBAQAogCQlicmVhazsKIAogCWNhc2UgSVBJX1JFU0NIRURVTEU6Ci0JCS8qCi0JCSAqIG5vdGhpbmcgbW9yZSB0byBkbyAtIGV2ZXl0aGluZyBpcwotCQkgKiBkb25lIG9uIHRoZSBpbnRlcnJ1cHQgcmV0dXJuIHBhdGgKLQkJICovCisJCXNjaGVkdWxlcl9pcGkoKTsKIAkJYnJlYWs7CiAKIAljYXNlIElQSV9DQUxMX0ZVTkM6CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvdGltZS5jIGIvYXJjaC9hcm0va2VybmVsL3RpbWUuYwppbmRleCAxZmY0NmNhLi5jYjYzNGMzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC90aW1lLmMKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1leC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KIApAQCAtMTE1LDQ4ICsxMTUsMzcgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfUE0pICYmICFkZWZpbmVkKENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTKQotc3RhdGljIGludCB0aW1lcl9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgdGltZXJfc3VzcGVuZCh2b2lkKQogewotCXN0cnVjdCBzeXNfdGltZXIgKnRpbWVyID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHN5c190aW1lciwgZGV2KTsKLQotCWlmICh0aW1lci0+c3VzcGVuZCAhPSBOVUxMKQotCQl0aW1lci0+c3VzcGVuZCgpOworCWlmIChzeXN0ZW1fdGltZXItPnN1c3BlbmQpCisJCXN5c3RlbV90aW1lci0+c3VzcGVuZCgpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdGltZXJfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCB0aW1lcl9yZXN1bWUodm9pZCkKIHsKLQlzdHJ1Y3Qgc3lzX3RpbWVyICp0aW1lciA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBzeXNfdGltZXIsIGRldik7Ci0KLQlpZiAodGltZXItPnJlc3VtZSAhPSBOVUxMKQotCQl0aW1lci0+cmVzdW1lKCk7Ci0KLQlyZXR1cm4gMDsKKwlpZiAoc3lzdGVtX3RpbWVyLT5yZXN1bWUpCisJCXN5c3RlbV90aW1lci0+cmVzdW1lKCk7CiB9CiAjZWxzZQogI2RlZmluZSB0aW1lcl9zdXNwZW5kIE5VTEwKICNkZWZpbmUgdGltZXJfcmVzdW1lIE5VTEwKICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyB0aW1lcl9zeXNjbGFzcyA9IHsKLQkubmFtZQkJPSAidGltZXIiLAorc3RhdGljIHN0cnVjdCBzeXNjb3JlX29wcyB0aW1lcl9zeXNjb3JlX29wcyA9IHsKIAkuc3VzcGVuZAk9IHRpbWVyX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSB0aW1lcl9yZXN1bWUsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCB0aW1lcl9pbml0X3N5c2ZzKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCB0aW1lcl9pbml0X3N5c2NvcmVfb3BzKHZvaWQpCiB7Ci0JaW50IHJldCA9IHN5c2Rldl9jbGFzc19yZWdpc3RlcigmdGltZXJfc3lzY2xhc3MpOwotCWlmIChyZXQgPT0gMCkgewotCQlzeXN0ZW1fdGltZXItPmRldi5jbHMgPSAmdGltZXJfc3lzY2xhc3M7Ci0JCXJldCA9IHN5c2Rldl9yZWdpc3Rlcigmc3lzdGVtX3RpbWVyLT5kZXYpOwotCX0KKwlyZWdpc3Rlcl9zeXNjb3JlX29wcygmdGltZXJfc3lzY29yZV9vcHMpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAotZGV2aWNlX2luaXRjYWxsKHRpbWVyX2luaXRfc3lzZnMpOworZGV2aWNlX2luaXRjYWxsKHRpbWVyX2luaXRfc3lzY29yZV9vcHMpOwogCiB2b2lkIF9faW5pdCB0aW1lX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKaW5kZXggM2I1NGFkMS4uZDUyZWVjMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKQEAgLTIzNCw3ICsyMzQsNiBAQAogCiAJcHJpbnRrKEtFUk5fRU1FUkcgIkludGVybmFsIGVycm9yOiAlczogJXggWyMlZF0iIFNfUFJFRU1QVCBTX1NNUCAiXG4iLAogCSAgICAgICBzdHIsIGVyciwgKytkaWVfY291bnRlcik7Ci0Jc3lzZnNfcHJpbnRrX2xhc3RfZmlsZSgpOwogCiAJLyogdHJhcCBhbmQgZXJyb3IgbnVtYmVycyBhcmUgbW9zdGx5IG1lYW5pbmdsZXNzIG9uIEFSTSAqLwogCXJldCA9IG5vdGlmeV9kaWUoRElFX09PUFMsIHN0ciwgcmVncywgZXJyLCB0c2stPnRocmVhZC50cmFwX25vLCBTSUdTRUdWKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9jcHVmcmVxLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvY3B1ZnJlcS5jCmluZGV4IDBhOTViZTEuLjQxNjY5ZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9jcHVmcmVxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2NwdWZyZXEuYwpAQCAtOTQsOSArOTQsNyBAQAogCWlmIChmcmVxcy5vbGQgPT0gZnJlcXMubmV3KQogCQlyZXR1cm4gcmV0OwogCi0JY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsCi0JCQlkZXZfZHJpdmVyX3N0cmluZyhjcHVmcmVxLmRldiksCi0JCQkidHJhbnNpdGlvbjogJXUgLS0+ICV1XG4iLCBmcmVxcy5vbGQsIGZyZXFzLm5ldyk7CisJZGV2X2RiZygmY3B1ZnJlcS5kZXYsICJ0cmFuc2l0aW9uOiAldSAtLT4gJXVcbiIsIGZyZXFzLm9sZCwgZnJlcXMubmV3KTsKIAogCXJldCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksIHBkYXRhLT5mcmVxX3RhYmxlLAogCQkJCQkJZnJlcXMubmV3LCByZWxhdGlvbiwgJmlkeCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvcG0uYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9wbS5jCmluZGV4IDEwZDkxN2QuLjg3NTVjYTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9wbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9wbS5jCkBAIC0xNiw2ICsxNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CkBAIC0zNzIsNyArMzczLDI3IEBACiAJZmx1c2hfY2FjaGVfYWxsKCk7CiB9CiAKLXN0YXRpYyBpbnQgZXh5bm9zNF9wbV9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2RyaXZlciBleHlub3M0X3BtX2RyaXZlciA9IHsKKwkuYWRkCQk9IGV4eW5vczRfcG1fYWRkLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgZXh5bm9zNF9wbV9kcnZpbml0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IHRtcDsKKworCXMzY19wbV9pbml0KCk7CisKKwkvKiBBbGwgd2FrZXVwIGRpc2FibGUgKi8KKworCXRtcCA9IF9fcmF3X3JlYWRsKFM1UF9XQUtFVVBfTUFTSyk7CisJdG1wIHw9ICgoMHhGRiA8PCA4KSB8ICgweDFGIDw8IDEpKTsKKwlfX3Jhd193cml0ZWwodG1wLCBTNVBfV0FLRVVQX01BU0spOworCisJcmV0dXJuIHN5c2Rldl9kcml2ZXJfcmVnaXN0ZXIoJmV4eW5vczRfc3lzY2xhc3MsICZleHlub3M0X3BtX2RyaXZlcik7Cit9CithcmNoX2luaXRjYWxsKGV4eW5vczRfcG1fZHJ2aW5pdCk7CisKK3N0YXRpYyB2b2lkIGV4eW5vczRfcG1fcmVzdW1lKHZvaWQpCiB7CiAJLyogRm9yIHJlbGVhc2UgcmV0ZW50aW9uICovCiAKQEAgLTM5NCwyNyArNDE1LDE1IEBACiAJLyogZW5hYmxlIEwyWDAqLwogCXdyaXRlbF9yZWxheGVkKDEsIFM1UF9WQV9MMkNDICsgTDJYMF9DVFJMKTsKICNlbmRpZgotCi0JcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2RyaXZlciBleHlub3M0X3BtX2RyaXZlciA9IHsKLQkuYWRkCQk9IGV4eW5vczRfcG1fYWRkLAorc3RhdGljIHN0cnVjdCBzeXNjb3JlX29wcyBleHlub3M0X3BtX3N5c2NvcmVfb3BzID0gewogCS5yZXN1bWUJCT0gZXh5bm9zNF9wbV9yZXN1bWUsCiB9OwogCi1zdGF0aWMgX19pbml0IGludCBleHlub3M0X3BtX2RydmluaXQodm9pZCkKK3N0YXRpYyBfX2luaXQgaW50IGV4eW5vczRfcG1fc3lzY29yZV9pbml0KHZvaWQpCiB7Ci0JdW5zaWduZWQgaW50IHRtcDsKLQotCXMzY19wbV9pbml0KCk7Ci0KLQkvKiBBbGwgd2FrZXVwIGRpc2FibGUgKi8KLQotCXRtcCA9IF9fcmF3X3JlYWRsKFM1UF9XQUtFVVBfTUFTSyk7Ci0JdG1wIHw9ICgoMHhGRiA8PCA4KSB8ICgweDFGIDw8IDEpKTsKLQlfX3Jhd193cml0ZWwodG1wLCBTNVBfV0FLRVVQX01BU0spOwotCi0JcmV0dXJuIHN5c2Rldl9kcml2ZXJfcmVnaXN0ZXIoJmV4eW5vczRfc3lzY2xhc3MsICZleHlub3M0X3BtX2RyaXZlcik7CisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJmV4eW5vczRfcG1fc3lzY29yZV9vcHMpOworCXJldHVybiAwOwogfQotYXJjaF9pbml0Y2FsbChleHlub3M0X3BtX2RydmluaXQpOworYXJjaF9pbml0Y2FsbChleHlub3M0X3BtX3N5c2NvcmVfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9LY29uZmlnCmluZGV4IGJkZDI1NzkuLjQ2YWRjYTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9LY29uZmlnCkBAIC00LDYgKzQsNyBAQAogCiBjb25maWcgQVJDSF9DQVRTCiAJYm9vbCAiQ0FUUyIKKwlzZWxlY3QgQ0xLU1JDX0k4MjUzCiAJc2VsZWN0IEZPT1RCUklER0VfSE9TVAogCXNlbGVjdCBJU0EKIAlzZWxlY3QgSVNBX0RNQQpAQCAtNTksNiArNjAsNyBAQAogCiBjb25maWcgQVJDSF9ORVRXSU5ERVIKIAlib29sICJOZXRXaW5kZXIiCisJc2VsZWN0IENMS1NSQ19JODI1MwogCXNlbGVjdCBGT09UQlJJREdFX0hPU1QKIAlzZWxlY3QgSVNBCiAJc2VsZWN0IElTQV9ETUEKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EtdGltZXIuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EtdGltZXIuYwppbmRleCA0NDFjNmNlLi43MDIwZjFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaXNhLXRpbWVyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2lzYS10aW1lci5jCkBAIC0xMCw1MyArMTAsMTYgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXguaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLQorI2luY2x1ZGUgPGFzbS9pODI1My5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KIAogI2luY2x1ZGUgImNvbW1vbi5oIgogCi0jZGVmaW5lIFBJVF9NT0RFCTB4NDMKLSNkZWZpbmUgUElUX0NIMAkJMHg0MAotCi0jZGVmaW5lIFBJVF9MQVRDSAkoKFBJVF9USUNLX1JBVEUgKyBIWiAvIDIpIC8gSFopCi0KLXN0YXRpYyBjeWNsZV90IHBpdF9yZWFkKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdGF0aWMgaW50IG9sZF9jb3VudDsKLQlzdGF0aWMgdTMyIG9sZF9qaWZzOwotCWludCBjb3VudDsKLQl1MzIgamlmczsKLQotCXJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQlqaWZzID0gamlmZmllczsKLQlvdXRiX3AoMHgwMCwgUElUX01PREUpOwkJLyogbGF0Y2ggdGhlIGNvdW50ICovCi0JY291bnQgPSBpbmJfcChQSVRfQ0gwKTsJCS8qIHJlYWQgdGhlIGxhdGNoZWQgY291bnQgKi8KLQljb3VudCB8PSBpbmJfcChQSVRfQ0gwKSA8PCA4OwotCi0JaWYgKGNvdW50ID4gb2xkX2NvdW50ICYmIGppZnMgPT0gb2xkX2ppZnMpCi0JCWNvdW50ID0gb2xkX2NvdW50OwotCi0Jb2xkX2NvdW50ID0gY291bnQ7Ci0Jb2xkX2ppZnMgPSBqaWZzOwotCi0JcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCWNvdW50ID0gKFBJVF9MQVRDSCAtIDEpIC0gY291bnQ7Ci0KLQlyZXR1cm4gKGN5Y2xlX3QpKGppZnMgKiBQSVRfTEFUQ0gpICsgY291bnQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tzb3VyY2UgcGl0X2NzID0gewotCS5uYW1lCQk9ICJwaXQiLAotCS5yYXRpbmcJCT0gMTEwLAotCS5yZWFkCQk9IHBpdF9yZWFkLAotCS5tYXNrCQk9IENMT0NLU09VUkNFX01BU0soMzIpLAotfTsKK0RFRklORV9SQVdfU1BJTkxPQ0soaTgyNTNfbG9jayk7CiAKIHN0YXRpYyB2b2lkIHBpdF9zZXRfbW9kZShlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSwKIAlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCkBAIC0xMjEsNyArODQsNyBAQAogCXBpdF9jZS5tYXhfZGVsdGFfbnMgPSBjbG9ja2V2ZW50X2RlbHRhMm5zKDB4N2ZmZiwgJnBpdF9jZSk7CiAJcGl0X2NlLm1pbl9kZWx0YV9ucyA9IGNsb2NrZXZlbnRfZGVsdGEybnMoMHgwMDBmLCAmcGl0X2NlKTsKIAotCWNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KCZwaXRfY3MsIFBJVF9USUNLX1JBVEUpOworCWNsb2Nrc291cmNlX2k4MjUzX2luaXQoKTsKIAogCXNldHVwX2lycShwaXRfY2UuaXJxLCAmcGl0X3RpbWVyX2lycSk7CiAJY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKCZwaXRfY2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfYXAuYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2FwLmMKaW5kZXggOTgwODAzZi4uZDNlOTY0NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfYXAuYworKysgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9hcC5jCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL2ttaS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CkBAIC0xODAsMTMgKzE4MCwxMyBAQAogI2lmZGVmIENPTkZJR19QTQogc3RhdGljIHVuc2lnbmVkIGxvbmcgaWNfaXJxX2VuYWJsZTsKIAotc3RhdGljIGludCBpcnFfc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitzdGF0aWMgaW50IGlycV9zdXNwZW5kKHZvaWQpCiB7CiAJaWNfaXJxX2VuYWJsZSA9IHJlYWRsKFZBX0lDX0JBU0UgKyBJUlFfRU5BQkxFKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpcnFfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBpcnFfcmVzdW1lKHZvaWQpCiB7CiAJLyogZGlzYWJsZSBhbGwgaXJxIHNvdXJjZXMgKi8KIAl3cml0ZWwoLTEsIFZBX0NNSUNfQkFTRSArIElSUV9FTkFCTEVfQ0xFQVIpOwpAQCAtMTk0LDMzICsxOTQsMjUgQEAKIAl3cml0ZWwoLTEsIFZBX0lDX0JBU0UgKyBGSVFfRU5BQkxFX0NMRUFSKTsKIAogCXdyaXRlbChpY19pcnFfZW5hYmxlLCBWQV9JQ19CQVNFICsgSVJRX0VOQUJMRV9TRVQpOwotCXJldHVybiAwOwogfQogI2Vsc2UKICNkZWZpbmUgaXJxX3N1c3BlbmQgTlVMTAogI2RlZmluZSBpcnFfcmVzdW1lIE5VTEwKICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBpcnFfY2xhc3MgPSB7Ci0JLm5hbWUJCT0gImlycSIsCitzdGF0aWMgc3RydWN0IHN5c2NvcmVfb3BzIGlycV9zeXNjb3JlX29wcyA9IHsKIAkuc3VzcGVuZAk9IGlycV9zdXNwZW5kLAogCS5yZXN1bWUJCT0gaXJxX3Jlc3VtZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBpcnFfZGV2aWNlID0gewotCS5pZAk9IDAsCi0JLmNscwk9ICZpcnFfY2xhc3MsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpcnFfaW5pdF9zeXNmcyh2b2lkKQorc3RhdGljIGludCBfX2luaXQgaXJxX3N5c2NvcmVfaW5pdCh2b2lkKQogewotCWludCByZXQgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJmlycV9jbGFzcyk7Ci0JaWYgKHJldCA9PSAwKQotCQlyZXQgPSBzeXNkZXZfcmVnaXN0ZXIoJmlycV9kZXZpY2UpOwotCXJldHVybiByZXQ7CisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJmlycV9zeXNjb3JlX29wcyk7CisKKwlyZXR1cm4gMDsKIH0KIAotZGV2aWNlX2luaXRjYWxsKGlycV9pbml0X3N5c2ZzKTsKK2RldmljZV9pbml0Y2FsbChpcnFfc3lzY29yZV9pbml0KTsKIAogLyoKICAqIEZsYXNoIGhhbmRsaW5nLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9wbV9idXMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvcG1fYnVzLmMKaW5kZXggNjU4OGMyMi4uZmUzMWQ5MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9wbV9idXMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL3BtX2J1cy5jCkBAIC0yNCw3NSArMjQsNTAgQEAKICNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQogc3RhdGljIGludCBvbWFwMV9wbV9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBjbGsgKmljbGssICpmY2xrOwotCWludCByZXQgPSAwOworCWludCByZXQ7CiAKIAlkZXZfZGJnKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlyZXQgPSBwbV9nZW5lcmljX3J1bnRpbWVfc3VzcGVuZChkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKLQlmY2xrID0gY2xrX2dldChkZXYsICJmY2siKTsKLQlpZiAoIUlTX0VSUihmY2xrKSkgewotCQljbGtfZGlzYWJsZShmY2xrKTsKLQkJY2xrX3B1dChmY2xrKTsKLQl9Ci0KLQlpY2xrID0gY2xrX2dldChkZXYsICJpY2siKTsKLQlpZiAoIUlTX0VSUihpY2xrKSkgewotCQljbGtfZGlzYWJsZShpY2xrKTsKLQkJY2xrX3B1dChpY2xrKTsKKwlyZXQgPSBwbV9ydW50aW1lX2Nsa19zdXNwZW5kKGRldik7CisJaWYgKHJldCkgeworCQlwbV9nZW5lcmljX3J1bnRpbWVfcmVzdW1lKGRldik7CisJCXJldHVybiByZXQ7CiAJfQogCiAJcmV0dXJuIDA7Ci19OworfQogCiBzdGF0aWMgaW50IG9tYXAxX3BtX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgY2xrICppY2xrLCAqZmNsazsKLQogCWRldl9kYmcoZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAotCWljbGsgPSBjbGtfZ2V0KGRldiwgImljayIpOwotCWlmICghSVNfRVJSKGljbGspKSB7Ci0JCWNsa19lbmFibGUoaWNsayk7Ci0JCWNsa19wdXQoaWNsayk7Ci0JfQotCi0JZmNsayA9IGNsa19nZXQoZGV2LCAiZmNrIik7Ci0JaWYgKCFJU19FUlIoZmNsaykpIHsKLQkJY2xrX2VuYWJsZShmY2xrKTsKLQkJY2xrX3B1dChmY2xrKTsKLQl9Ci0KKwlwbV9ydW50aW1lX2Nsa19yZXN1bWUoZGV2KTsKIAlyZXR1cm4gcG1fZ2VuZXJpY19ydW50aW1lX3Jlc3VtZShkZXYpOworfQorCitzdGF0aWMgc3RydWN0IGRldl9wb3dlcl9kb21haW4gZGVmYXVsdF9wb3dlcl9kb21haW4gPSB7CisJLm9wcyA9IHsKKwkJLnJ1bnRpbWVfc3VzcGVuZCA9IG9tYXAxX3BtX3J1bnRpbWVfc3VzcGVuZCwKKwkJLnJ1bnRpbWVfcmVzdW1lID0gb21hcDFfcG1fcnVudGltZV9yZXN1bWUsCisJCVVTRV9QTEFURk9STV9QTV9TTEVFUF9PUFMKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbV9jbGtfbm90aWZpZXJfYmxvY2sgcGxhdGZvcm1fYnVzX25vdGlmaWVyID0geworCS5wd3JfZG9tYWluID0gJmRlZmF1bHRfcG93ZXJfZG9tYWluLAorCS5jb25faWRzID0geyAiaWNrIiwgImZjayIsIE5VTEwsIH0sCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBvbWFwMV9wbV9ydW50aW1lX2luaXQodm9pZCkKIHsKLQljb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyAqcG07Ci0Jc3RydWN0IGRldl9wbV9vcHMgKm9tYXBfcG07Ci0KIAlpZiAoIWNwdV9jbGFzc19pc19vbWFwMSgpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXBtID0gcGxhdGZvcm1fYnVzX2dldF9wbV9vcHMoKTsKLQlpZiAoIXBtKSB7Ci0JCXByX2VycigiJXM6IHVuYWJsZSB0byBnZXQgZGV2X3BtX29wcyBmcm9tIHBsYXRmb3JtX2J1c1xuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0Jb21hcF9wbSA9IGttZW1kdXAocG0sIHNpemVvZihzdHJ1Y3QgZGV2X3BtX29wcyksIEdGUF9LRVJORUwpOwotCWlmICghb21hcF9wbSkgewotCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gYWxsb2MgbWVtb3J5IGZvciBuZXcgZGV2X3BtX29wc1xuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0Jb21hcF9wbS0+cnVudGltZV9zdXNwZW5kID0gb21hcDFfcG1fcnVudGltZV9zdXNwZW5kOwotCW9tYXBfcG0tPnJ1bnRpbWVfcmVzdW1lID0gb21hcDFfcG1fcnVudGltZV9yZXN1bWU7Ci0KLQlwbGF0Zm9ybV9idXNfc2V0X3BtX29wcyhvbWFwX3BtKTsKKwlwbV9ydW50aW1lX2Nsa19hZGRfbm90aWZpZXIoJnBsYXRmb3JtX2J1c190eXBlLCAmcGxhdGZvcm1fYnVzX25vdGlmaWVyKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtb21hcDIvTWFrZWZpbGUKaW5kZXggNTEyYjE1Mi4uNjZkZmJjYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL01ha2VmaWxlCkBAIC01OSwxMCArNTksMTAgQEAKICMgUG93ZXIgTWFuYWdlbWVudAogaWZlcSAoJChDT05GSUdfUE0pLHkpCiBvYmotJChDT05GSUdfQVJDSF9PTUFQMikJCSs9IHBtMjR4eC5vCi1vYmotJChDT05GSUdfQVJDSF9PTUFQMikJCSs9IHNsZWVwMjR4eC5vIHBtX2J1cy5vCitvYmotJChDT05GSUdfQVJDSF9PTUFQMikJCSs9IHNsZWVwMjR4eC5vCiBvYmotJChDT05GSUdfQVJDSF9PTUFQMykJCSs9IHBtMzR4eC5vIHNsZWVwMzR4eC5vIFwKLQkJCQkJICAgY3B1aWRsZTM0eHgubyBwbV9idXMubwotb2JqLSQoQ09ORklHX0FSQ0hfT01BUDQpCQkrPSBwbTQ0eHgubyBwbV9idXMubworCQkJCQkgICBjcHVpZGxlMzR4eC5vCitvYmotJChDT05GSUdfQVJDSF9PTUFQNCkJCSs9IHBtNDR4eC5vCiBvYmotJChDT05GSUdfUE1fREVCVUcpCQkJKz0gcG0tZGVidWcubwogb2JqLSQoQ09ORklHX09NQVBfU01BUlRSRUZMRVgpICAgICAgICAgICs9IHNyX2RldmljZS5vIHNtYXJ0cmVmbGV4Lm8KIG9iai0kKENPTkZJR19PTUFQX1NNQVJUUkVGTEVYX0NMQVNTMykJKz0gc21hcnRyZWZsZXgtY2xhc3MzLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG1fYnVzLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3BtX2J1cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWNkMmFiLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG1fYnVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogUnVudGltZSBQTSBzdXBwb3J0IGNvZGUgZm9yIE9NQVAKLSAqCi0gKiBBdXRob3I6IEtldmluIEhpbG1hbiwgRGVlcCBSb290IFN5c3RlbXMsIExMQwotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgotICoKLSAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55Ci0gKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLQotI2luY2x1ZGUgPHBsYXQvb21hcF9kZXZpY2UuaD4KLSNpbmNsdWRlIDxwbGF0L29tYXAtcG0uaD4KLQotI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCi1zdGF0aWMgaW50IG9tYXBfcG1fcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7Ci0JaW50IHIsIHJldCA9IDA7Ci0KLQlkZXZfZGJnKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlyZXQgPSBwbV9nZW5lcmljX3J1bnRpbWVfc3VzcGVuZChkZXYpOwotCi0JaWYgKCFyZXQgJiYgZGV2LT5wYXJlbnQgPT0gJm9tYXBfZGV2aWNlX3BhcmVudCkgewotCQlyID0gb21hcF9kZXZpY2VfaWRsZShwZGV2KTsKLQkJV0FSTl9PTihyKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfTsKLQotc3RhdGljIGludCBvbWFwX3BtX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7Ci0JaW50IHI7Ci0KLQlkZXZfZGJnKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoZGV2LT5wYXJlbnQgPT0gJm9tYXBfZGV2aWNlX3BhcmVudCkgewotCQlyID0gb21hcF9kZXZpY2VfZW5hYmxlKHBkZXYpOwotCQlXQVJOX09OKHIpOwotCX0KLQotCXJldHVybiBwbV9nZW5lcmljX3J1bnRpbWVfcmVzdW1lKGRldik7Ci19OwotI2Vsc2UKLSNkZWZpbmUgb21hcF9wbV9ydW50aW1lX3N1c3BlbmQgTlVMTAotI2RlZmluZSBvbWFwX3BtX3J1bnRpbWVfcmVzdW1lIE5VTEwKLSNlbmRpZiAvKiBDT05GSUdfUE1fUlVOVElNRSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBvbWFwX3BtX3J1bnRpbWVfaW5pdCh2b2lkKQotewotCWNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzICpwbTsKLQlzdHJ1Y3QgZGV2X3BtX29wcyAqb21hcF9wbTsKLQotCXBtID0gcGxhdGZvcm1fYnVzX2dldF9wbV9vcHMoKTsKLQlpZiAoIXBtKSB7Ci0JCXByX2VycigiJXM6IHVuYWJsZSB0byBnZXQgZGV2X3BtX29wcyBmcm9tIHBsYXRmb3JtX2J1c1xuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0Jb21hcF9wbSA9IGttZW1kdXAocG0sIHNpemVvZihzdHJ1Y3QgZGV2X3BtX29wcyksIEdGUF9LRVJORUwpOwotCWlmICghb21hcF9wbSkgewotCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gYWxsb2MgbWVtb3J5IGZvciBuZXcgZGV2X3BtX29wc1xuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0Jb21hcF9wbS0+cnVudGltZV9zdXNwZW5kID0gb21hcF9wbV9ydW50aW1lX3N1c3BlbmQ7Ci0Jb21hcF9wbS0+cnVudGltZV9yZXN1bWUgPSBvbWFwX3BtX3J1bnRpbWVfcmVzdW1lOwotCi0JcGxhdGZvcm1fYnVzX3NldF9wbV9vcHMob21hcF9wbSk7Ci0KLQlyZXR1cm4gMDsKLX0KLWNvcmVfaW5pdGNhbGwob21hcF9wbV9ydW50aW1lX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvYmFsbG9vbjMuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2JhbGxvb24zLmMKaW5kZXggYmZiZWNlYy4uODEwYTk4MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvYmFsbG9vbjMuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9iYWxsb29uMy5jCkBAIC0xNSw3ICsxNSw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2Nsb2NrLXB4YTJ4eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvY2xvY2stcHhhMnh4LmMKaW5kZXggMWNlMDkwNC4uMWQ1ODU5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY2xvY2stcHhhMnh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvY2xvY2stcHhhMnh4LmMKQEAgLTksNyArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CiAKICNpbmNsdWRlIDxtYWNoL3B4YTJ4eC1yZWdzLmg+CiAKQEAgLTMzLDMyICszMywyMiBAQAogI2lmZGVmIENPTkZJR19QTQogc3RhdGljIHVpbnQzMl90IHNhdmVkX2NrZW47CiAKLXN0YXRpYyBpbnQgcHhhMnh4X2Nsb2NrX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmQsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgcHhhMnh4X2Nsb2NrX3N1c3BlbmQodm9pZCkKIHsKIAlzYXZlZF9ja2VuID0gQ0tFTjsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBweGEyeHhfY2xvY2tfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkKQorc3RhdGljIHZvaWQgcHhhMnh4X2Nsb2NrX3Jlc3VtZSh2b2lkKQogewogCUNLRU4gPSBzYXZlZF9ja2VuOwotCXJldHVybiAwOwogfQogI2Vsc2UKICNkZWZpbmUgcHhhMnh4X2Nsb2NrX3N1c3BlbmQJTlVMTAogI2RlZmluZSBweGEyeHhfY2xvY2tfcmVzdW1lCU5VTEwKICNlbmRpZgogCi1zdHJ1Y3Qgc3lzZGV2X2NsYXNzIHB4YTJ4eF9jbG9ja19zeXNjbGFzcyA9IHsKLQkubmFtZQkJPSAicHhhMnh4LWNsb2NrIiwKK3N0cnVjdCBzeXNjb3JlX29wcyBweGEyeHhfY2xvY2tfc3lzY29yZV9vcHMgPSB7CiAJLnN1c3BlbmQJPSBweGEyeHhfY2xvY2tfc3VzcGVuZCwKIAkucmVzdW1lCQk9IHB4YTJ4eF9jbG9ja19yZXN1bWUsCiB9OwotCi1zdGF0aWMgaW50IF9faW5pdCBweGEyeHhfY2xvY2tfaW5pdCh2b2lkKQotewotCWlmIChjcHVfaXNfcHhhMnh4KCkpCi0JCXJldHVybiBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJnB4YTJ4eF9jbG9ja19zeXNjbGFzcyk7Ci0JcmV0dXJuIDA7Ci19Ci1wb3N0Y29yZV9pbml0Y2FsbChweGEyeHhfY2xvY2tfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jbG9jay1weGEzeHguYyBiL2FyY2gvYXJtL21hY2gtcHhhL2Nsb2NrLXB4YTN4eC5jCmluZGV4IDNmODY0Y2QuLjJhMzdhOWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2Nsb2NrLXB4YTN4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2Nsb2NrLXB4YTN4eC5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KIAogI2luY2x1ZGUgPG1hY2gvc21lbWMuaD4KICNpbmNsdWRlIDxtYWNoL3B4YTN4eC1yZWdzLmg+CkBAIC0xODIsNyArMTgzLDcgQEAKIHN0YXRpYyB1aW50MzJfdCBja2VuWzJdOwogc3RhdGljIHVpbnQzMl90IGFjY3I7CiAKLXN0YXRpYyBpbnQgcHhhM3h4X2Nsb2NrX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmQsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgcHhhM3h4X2Nsb2NrX3N1c3BlbmQodm9pZCkKIHsKIAlja2VuWzBdID0gQ0tFTkE7CiAJY2tlblsxXSA9IENLRU5COwpAQCAtMTkwLDI4ICsxOTEsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBweGEzeHhfY2xvY2tfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkKQorc3RhdGljIHZvaWQgcHhhM3h4X2Nsb2NrX3Jlc3VtZSh2b2lkKQogewogCUFDQ1IgPSBhY2NyOwogCUNLRU5BID0gY2tlblswXTsKIAlDS0VOQiA9IGNrZW5bMV07Ci0JcmV0dXJuIDA7CiB9CiAjZWxzZQogI2RlZmluZSBweGEzeHhfY2xvY2tfc3VzcGVuZAlOVUxMCiAjZGVmaW5lIHB4YTN4eF9jbG9ja19yZXN1bWUJTlVMTAogI2VuZGlmCiAKLXN0cnVjdCBzeXNkZXZfY2xhc3MgcHhhM3h4X2Nsb2NrX3N5c2NsYXNzID0gewotCS5uYW1lCQk9ICJweGEzeHgtY2xvY2siLAorc3RydWN0IHN5c2NvcmVfb3BzIHB4YTN4eF9jbG9ja19zeXNjb3JlX29wcyA9IHsKIAkuc3VzcGVuZAk9IHB4YTN4eF9jbG9ja19zdXNwZW5kLAogCS5yZXN1bWUJCT0gcHhhM3h4X2Nsb2NrX3Jlc3VtZSwKIH07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHB4YTN4eF9jbG9ja19pbml0KHZvaWQpCi17Ci0JaWYgKGNwdV9pc19weGEzeHgoKSB8fCBjcHVfaXNfcHhhOTV4KCkpCi0JCXJldHVybiBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJnB4YTN4eF9jbG9ja19zeXNjbGFzcyk7Ci0JcmV0dXJuIDA7Ci19Ci1wb3N0Y29yZV9pbml0Y2FsbChweGEzeHhfY2xvY2tfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jbG9jay5oIGIvYXJjaC9hcm0vbWFjaC1weGEvY2xvY2suaAppbmRleCBmOWYzNDlhLi4xZjJmYjljIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jbG9jay5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2Nsb2NrLmgKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8bGludXgvY2xrZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KIAogc3RydWN0IGNsa29wcyB7CiAJdm9pZAkJCSgqZW5hYmxlKShzdHJ1Y3QgY2xrICopOwpAQCAtNTQsNyArNTQsNyBAQAogdm9pZCBjbGtfcHhhMnh4X2NrZW5fZW5hYmxlKHN0cnVjdCBjbGsgKmNsayk7CiB2b2lkIGNsa19weGEyeHhfY2tlbl9kaXNhYmxlKHN0cnVjdCBjbGsgKmNsayk7CiAKLWV4dGVybiBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHB4YTJ4eF9jbG9ja19zeXNjbGFzczsKK2V4dGVybiBzdHJ1Y3Qgc3lzY29yZV9vcHMgcHhhMnh4X2Nsb2NrX3N5c2NvcmVfb3BzOwogCiAjaWYgZGVmaW5lZChDT05GSUdfUFhBM3h4KSB8fCBkZWZpbmVkKENPTkZJR19QWEE5NXgpCiAjZGVmaW5lIERFRklORV9QWEEzX0NLRU4oX25hbWUsIF9ja2VuLCBfcmF0ZSwgX2RlbGF5KQlcCkBAIC03NCw1ICs3NCw2IEBACiBleHRlcm4gdm9pZCBjbGtfcHhhM3h4X2NrZW5fZW5hYmxlKHN0cnVjdCBjbGsgKik7CiBleHRlcm4gdm9pZCBjbGtfcHhhM3h4X2NrZW5fZGlzYWJsZShzdHJ1Y3QgY2xrICopOwogCi1leHRlcm4gc3RydWN0IHN5c2Rldl9jbGFzcyBweGEzeHhfY2xvY2tfc3lzY2xhc3M7CitleHRlcm4gc3RydWN0IHN5c2NvcmVfb3BzIHB4YTN4eF9jbG9ja19zeXNjb3JlX29wczsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jbS14MjcwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9jbS14MjcwLmMKaW5kZXggYjg4ZDYwMWEuLjEzNTE4YTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyNzAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jbS14MjcwLmMKQEAgLTEwLDcgKzEwLDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jbS14Mnh4LmMgYi9hcmNoL2FybS9tYWNoLXB4YS9jbS14Mnh4LmMKaW5kZXggODIyNWUyZS4uYTEwOTk2NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY20teDJ4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyeHguYwpAQCAtMTAsNyArMTAsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KIApAQCAtMzg4LDcgKzM4OCw3IEBACiAjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzbGVlcF9zYXZlX21zY1sxMF07CiAKLXN0YXRpYyBpbnQgY214Mnh4X3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBjbXgyeHhfc3VzcGVuZCh2b2lkKQogewogCWNteDJ4eF9wY2lfc3VzcGVuZCgpOwogCkBAIC00MTIsNyArNDEyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjbXgyeHhfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBjbXgyeHhfcmVzdW1lKHZvaWQpCiB7CiAJY214Mnh4X3BjaV9yZXN1bWUoKTsKIApAQCAtNDIwLDI3ICs0MjAsMTggQEAKIAlfX3Jhd193cml0ZWwoc2xlZXBfc2F2ZV9tc2NbMF0sIE1TQzApOwogCV9fcmF3X3dyaXRlbChzbGVlcF9zYXZlX21zY1sxXSwgTVNDMSk7CiAJX19yYXdfd3JpdGVsKHNsZWVwX3NhdmVfbXNjWzJdLCBNU0MyKTsKLQotCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBjbXgyeHhfcG1fc3lzY2xhc3MgPSB7Ci0JLm5hbWUgPSAicG0iLAorc3RhdGljIHN0cnVjdCBzeXNjb3JlX29wcyBjbXgyeHhfcG1fc3lzY29yZV9vcHMgPSB7CiAJLnJlc3VtZSA9IGNteDJ4eF9yZXN1bWUsCiAJLnN1c3BlbmQgPSBjbXgyeHhfc3VzcGVuZCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBjbXgyeHhfcG1fZGV2aWNlID0gewotCS5jbHMgPSAmY214Mnh4X3BtX3N5c2NsYXNzLAotfTsKLQogc3RhdGljIGludCBfX2luaXQgY214Mnh4X3BtX2luaXQodm9pZCkKIHsKLQlpbnQgZXJyb3I7Ci0JZXJyb3IgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJmNteDJ4eF9wbV9zeXNjbGFzcyk7Ci0JaWYgKGVycm9yID09IDApCi0JCWVycm9yID0gc3lzZGV2X3JlZ2lzdGVyKCZjbXgyeHhfcG1fZGV2aWNlKTsKLQlyZXR1cm4gZXJyb3I7CisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJmNteDJ4eF9wbV9zeXNjb3JlX29wcyk7CisKKwlyZXR1cm4gMDsKIH0KICNlbHNlCiBzdGF0aWMgaW50IF9faW5pdCBjbXgyeHhfcG1faW5pdCh2b2lkKSB7IHJldHVybiAwOyB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jb2xpYnJpLWV2YWxib2FyZC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvY29saWJyaS1ldmFsYm9hcmQuYwppbmRleCA4MWMzYzQzLi5kMjhlODAyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jb2xpYnJpLWV2YWxib2FyZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvbGlicmktZXZhbGJvYXJkLmMKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jb2xpYnJpLXB4YTI3MC1pbmNvbWUuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvbGlicmktcHhhMjcwLWluY29tZS5jCmluZGV4IDQ0YzFiNzcuLjgwNTM4YjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2NvbGlicmktcHhhMjcwLWluY29tZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvbGlicmktcHhhMjcwLWluY29tZS5jCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcHdtX2JhY2tsaWdodC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy9weGEtaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2NvbGlicmktcHhhMjcwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9jb2xpYnJpLXB4YTI3MC5jCmluZGV4IDZmYzVkMzIuLjc1NDVhNDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2NvbGlicmktcHhhMjcwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvY29saWJyaS1weGEyNzAuYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC91Y2IxNDAwLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9nZW5lcmljLmggYi9hcmNoL2FybS9tYWNoLXB4YS9nZW5lcmljLmgKaW5kZXggYTA3OWQ4Yi4uZTZjOTM0NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvZ2VuZXJpYy5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2dlbmVyaWMuaApAQCAtNjEsMTAgKzYxLDEwIEBACiAjZGVmaW5lIHB4YTN4eF9nZXRfY2xrX2ZyZXF1ZW5jeV9raHooeCkJCSgwKQogI2VuZGlmCiAKLWV4dGVybiBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHB4YV9pcnFfc3lzY2xhc3M7Ci1leHRlcm4gc3RydWN0IHN5c2Rldl9jbGFzcyBweGFfZ3Bpb19zeXNjbGFzczsKLWV4dGVybiBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHB4YTJ4eF9tZnBfc3lzY2xhc3M7Ci1leHRlcm4gc3RydWN0IHN5c2Rldl9jbGFzcyBweGEzeHhfbWZwX3N5c2NsYXNzOworZXh0ZXJuIHN0cnVjdCBzeXNjb3JlX29wcyBweGFfaXJxX3N5c2NvcmVfb3BzOworZXh0ZXJuIHN0cnVjdCBzeXNjb3JlX29wcyBweGFfZ3Bpb19zeXNjb3JlX29wczsKK2V4dGVybiBzdHJ1Y3Qgc3lzY29yZV9vcHMgcHhhMnh4X21mcF9zeXNjb3JlX29wczsKK2V4dGVybiBzdHJ1Y3Qgc3lzY29yZV9vcHMgcHhhM3h4X21mcF9zeXNjb3JlX29wczsKIAogdm9pZCBfX2luaXQgcHhhX3NldF9mZnVhcnRfaW5mbyh2b2lkICppbmZvKTsKIHZvaWQgX19pbml0IHB4YV9zZXRfYnR1YXJ0X2luZm8odm9pZCAqaW5mbyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pcnEuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2lycS5jCmluZGV4IDYyNTFlM2YuLjMyZWQ1NTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2lycS5jCkBAIC0xNSw3ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KIApAQCAtMTgzLDcgKzE4Myw3IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzYXZlZF9pY21yW01BWF9JTlRFUk5BTF9JUlFTLzMyXTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHNhdmVkX2lwcltNQVhfSU5URVJOQUxfSVJRU107CiAKLXN0YXRpYyBpbnQgcHhhX2lycV9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgcHhhX2lycV9zdXNwZW5kKHZvaWQpCiB7CiAJaW50IGk7CiAKQEAgLTIwMiw3ICsyMDIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHB4YV9pcnFfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBweGFfaXJxX3Jlc3VtZSh2b2lkKQogewogCWludCBpOwogCkBAIC0yMTgsMjIgKzIxOCwxMyBAQAogCQkJX19yYXdfd3JpdGVsKHNhdmVkX2lwcltpXSwgSVJRX0JBU0UgKyBJUFIoaSkpOwogCiAJX19yYXdfd3JpdGVsKDEsIElSUV9CQVNFICsgSUNDUik7Ci0JcmV0dXJuIDA7CiB9CiAjZWxzZQogI2RlZmluZSBweGFfaXJxX3N1c3BlbmQJCU5VTEwKICNkZWZpbmUgcHhhX2lycV9yZXN1bWUJCU5VTEwKICNlbmRpZgogCi1zdHJ1Y3Qgc3lzZGV2X2NsYXNzIHB4YV9pcnFfc3lzY2xhc3MgPSB7Ci0JLm5hbWUJCT0gImlycSIsCitzdHJ1Y3Qgc3lzY29yZV9vcHMgcHhhX2lycV9zeXNjb3JlX29wcyA9IHsKIAkuc3VzcGVuZAk9IHB4YV9pcnFfc3VzcGVuZCwKIAkucmVzdW1lCQk9IHB4YV9pcnFfcmVzdW1lLAogfTsKLQotc3RhdGljIGludCBfX2luaXQgcHhhX2lycV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHN5c2Rldl9jbGFzc19yZWdpc3RlcigmcHhhX2lycV9zeXNjbGFzcyk7Ci19Ci0KLWNvcmVfaW5pdGNhbGwocHhhX2lycV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2xwZDI3MC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbHBkMjcwLmMKaW5kZXggZjVkZTU0MS4uNmNmODE4MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvbHBkMjcwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbHBkMjcwLmMKQEAgLTE1LDcgKzE1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CkBAIC0xNTksMzAgKzE1OSwyMiBAQAogCiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgbHBkMjcwX2lycV9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGxwZDI3MF9pcnFfcmVzdW1lKHZvaWQpCiB7CiAJX19yYXdfd3JpdGV3KGxwZDI3MF9pcnFfZW5hYmxlZCwgTFBEMjcwX0lOVF9NQVNLKTsKLQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgbHBkMjcwX2lycV9zeXNjbGFzcyA9IHsKLQkubmFtZSA9ICJjcGxkX2lycSIsCitzdGF0aWMgc3RydWN0IHN5c2NvcmVfb3BzIGxwZDI3MF9pcnFfc3lzY29yZV9vcHMgPSB7CiAJLnJlc3VtZSA9IGxwZDI3MF9pcnFfcmVzdW1lLAogfTsKIAotc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIGxwZDI3MF9pcnFfZGV2aWNlID0gewotCS5jbHMgPSAmbHBkMjcwX2lycV9zeXNjbGFzcywKLX07Ci0KIHN0YXRpYyBpbnQgX19pbml0IGxwZDI3MF9pcnFfZGV2aWNlX2luaXQodm9pZCkKIHsKLQlpbnQgcmV0ID0gLUVOT0RFVjsKIAlpZiAobWFjaGluZV9pc19sb2dpY3BkX3B4YTI3MCgpKSB7Ci0JCXJldCA9IHN5c2Rldl9jbGFzc19yZWdpc3RlcigmbHBkMjcwX2lycV9zeXNjbGFzcyk7Ci0JCWlmIChyZXQgPT0gMCkKLQkJCXJldCA9IHN5c2Rldl9yZWdpc3RlcigmbHBkMjcwX2lycV9kZXZpY2UpOworCQlyZWdpc3Rlcl9zeXNjb3JlX29wcygmbHBkMjcwX2lycV9zeXNjb3JlX29wcyk7CisJCXJldHVybiAwOwogCX0KLQlyZXR1cm4gcmV0OworCXJldHVybiAtRU5PREVWOwogfQogCiBkZXZpY2VfaW5pdGNhbGwobHBkMjcwX2lycV9kZXZpY2VfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9sdWJib2NrLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9sdWJib2NrLmMKaW5kZXggM2VkZTk3OC4uZTEwZGRiOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2x1YmJvY2suYwpAQCAtMTUsNyArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiAjaW5jbHVkZSA8bGludXgvZmIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTE3NiwzMSArMTc2LDIyIEBACiAKICNpZmRlZiBDT05GSUdfUE0KIAotc3RhdGljIGludCBsdWJib2NrX2lycV9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGx1YmJvY2tfaXJxX3Jlc3VtZSh2b2lkKQogewogCUxVQl9JUlFfTUFTS19FTiA9IGx1YmJvY2tfaXJxX2VuYWJsZWQ7Ci0JcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIGx1YmJvY2tfaXJxX3N5c2NsYXNzID0gewotCS5uYW1lID0gImNwbGRfaXJxIiwKK3N0YXRpYyBzdHJ1Y3Qgc3lzY29yZV9vcHMgbHViYm9ja19pcnFfc3lzY29yZV9vcHMgPSB7CiAJLnJlc3VtZSA9IGx1YmJvY2tfaXJxX3Jlc3VtZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBsdWJib2NrX2lycV9kZXZpY2UgPSB7Ci0JLmNscyA9ICZsdWJib2NrX2lycV9zeXNjbGFzcywKLX07Ci0KIHN0YXRpYyBpbnQgX19pbml0IGx1YmJvY2tfaXJxX2RldmljZV9pbml0KHZvaWQpCiB7Ci0JaW50IHJldCA9IC1FTk9ERVY7Ci0KIAlpZiAobWFjaGluZV9pc19sdWJib2NrKCkpIHsKLQkJcmV0ID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZsdWJib2NrX2lycV9zeXNjbGFzcyk7Ci0JCWlmIChyZXQgPT0gMCkKLQkJCXJldCA9IHN5c2Rldl9yZWdpc3RlcigmbHViYm9ja19pcnFfZGV2aWNlKTsKKwkJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJmx1YmJvY2tfaXJxX3N5c2NvcmVfb3BzKTsKKwkJcmV0dXJuIDA7CiAJfQotCXJldHVybiByZXQ7CisJcmV0dXJuIC1FTk9ERVY7CiB9CiAKIGRldmljZV9pbml0Y2FsbChsdWJib2NrX2lycV9kZXZpY2VfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9tYWluc3RvbmUuYyBiL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jCmluZGV4IDk1MTYzYmEuLjM0NzllMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jCkBAIC0xNSw3ICsxNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgpAQCAtMTg1LDMxICsxODUsMjEgQEAKIAogI2lmZGVmIENPTkZJR19QTQogCi1zdGF0aWMgaW50IG1haW5zdG9uZV9pcnFfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBtYWluc3RvbmVfaXJxX3Jlc3VtZSh2b2lkKQogewogCU1TVF9JTlRNU0tFTkEgPSBtYWluc3RvbmVfaXJxX2VuYWJsZWQ7Ci0JcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIG1haW5zdG9uZV9pcnFfc3lzY2xhc3MgPSB7Ci0JLm5hbWUgPSAiY3BsZF9pcnEiLAorc3RhdGljIHN0cnVjdCBzeXNjb3JlX29wcyBtYWluc3RvbmVfaXJxX3N5c2NvcmVfb3BzID0gewogCS5yZXN1bWUgPSBtYWluc3RvbmVfaXJxX3Jlc3VtZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBtYWluc3RvbmVfaXJxX2RldmljZSA9IHsKLQkuY2xzID0gJm1haW5zdG9uZV9pcnFfc3lzY2xhc3MsCi19OwotCiBzdGF0aWMgaW50IF9faW5pdCBtYWluc3RvbmVfaXJxX2RldmljZV9pbml0KHZvaWQpCiB7Ci0JaW50IHJldCA9IC1FTk9ERVY7CisJaWYgKG1hY2hpbmVfaXNfbWFpbnN0b25lKCkpCisJCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZtYWluc3RvbmVfaXJxX3N5c2NvcmVfb3BzKTsKIAotCWlmIChtYWNoaW5lX2lzX21haW5zdG9uZSgpKSB7Ci0JCXJldCA9IHN5c2Rldl9jbGFzc19yZWdpc3RlcigmbWFpbnN0b25lX2lycV9zeXNjbGFzcyk7Ci0JCWlmIChyZXQgPT0gMCkKLQkJCXJldCA9IHN5c2Rldl9yZWdpc3RlcigmbWFpbnN0b25lX2lycV9kZXZpY2UpOwotCX0KLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBkZXZpY2VfaW5pdGNhbGwobWFpbnN0b25lX2lycV9kZXZpY2VfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9tZnAtcHhhMnh4LmMgYi9hcmNoL2FybS9tYWNoLXB4YS9tZnAtcHhhMnh4LmMKaW5kZXggMWQxNDE5Yi4uODdhZTMxMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvbWZwLXB4YTJ4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL21mcC1weGEyeHguYwpAQCAtMTYsNyArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogCiAjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEyeHgtcmVncy5oPgpAQCAtMzM4LDcgKzMzOCw3IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzYXZlZF9ncGRyWzRdOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgc2F2ZWRfcGdzcls0XTsKIAotc3RhdGljIGludCBweGEyeHhfbWZwX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmQsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgcHhhMnh4X21mcF9zdXNwZW5kKHZvaWQpCiB7CiAJaW50IGk7CiAKQEAgLTM2NSw3ICszNjUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHB4YTJ4eF9tZnBfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkKQorc3RhdGljIHZvaWQgcHhhMnh4X21mcF9yZXN1bWUodm9pZCkKIHsKIAlpbnQgaTsKIApAQCAtMzc2LDE1ICszNzYsMTMgQEAKIAkJUEdTUihpKSA9IHNhdmVkX3Bnc3JbaV07CiAJfQogCVBTU1IgPSBQU1NSX1JESCB8IFBTU1JfUEg7Ci0JcmV0dXJuIDA7CiB9CiAjZWxzZQogI2RlZmluZSBweGEyeHhfbWZwX3N1c3BlbmQJTlVMTAogI2RlZmluZSBweGEyeHhfbWZwX3Jlc3VtZQlOVUxMCiAjZW5kaWYKIAotc3RydWN0IHN5c2Rldl9jbGFzcyBweGEyeHhfbWZwX3N5c2NsYXNzID0gewotCS5uYW1lCQk9ICJtZnAiLAorc3RydWN0IHN5c2NvcmVfb3BzIHB4YTJ4eF9tZnBfc3lzY29yZV9vcHMgPSB7CiAJLnN1c3BlbmQJPSBweGEyeHhfbWZwX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSBweGEyeHhfbWZwX3Jlc3VtZSwKIH07CkBAIC00MDksNiArNDA3LDYgQEAKIAlmb3IgKGkgPSAwOyBpIDw9IGdwaW9fdG9fYmFuayhweGFfbGFzdF9ncGlvKTsgaSsrKQogCQlncGRyX2xwbVtpXSA9IEdQRFIoaSAqIDMyKTsKIAotCXJldHVybiBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJnB4YTJ4eF9tZnBfc3lzY2xhc3MpOworCXJldHVybiAwOwogfQogcG9zdGNvcmVfaW5pdGNhbGwocHhhMnh4X21mcF9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL21mcC1weGEzeHguYyBiL2FyY2gvYXJtL21hY2gtcHhhL21mcC1weGEzeHguYwppbmRleCA3YTI3MGVlLi44OTg2M2EwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9tZnAtcHhhM3h4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbWZwLXB4YTN4eC5jCkBAIC0xNyw3ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL21mcC1weGEzeHguaD4KQEAgLTMxLDEzICszMSwxMyBAQAogICogYSBwdWxsLWRvd24gbW9kZSBpZiB0aGV5J3JlIGFuIGFjdGl2ZSBsb3cgY2hpcCBzZWxlY3QsIGFuZCB3ZSdyZQogICoganVzdCBlbnRlcmluZyBzdGFuZGJ5LgogICovCi1zdGF0aWMgaW50IHB4YTN4eF9tZnBfc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqZCwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBweGEzeHhfbWZwX3N1c3BlbmQodm9pZCkKIHsKIAltZnBfY29uZmlnX2xwbSgpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHB4YTN4eF9tZnBfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkKQorc3RhdGljIHZvaWQgcHhhM3h4X21mcF9yZXN1bWUodm9pZCkKIHsKIAltZnBfY29uZmlnX3J1bigpOwogCkBAIC00NywyNCArNDcsMTMgQEAKIAkgKiBwcmVzZXJ2ZSB0aGVtIGhlcmUgaW4gY2FzZSB0aGV5IHdpbGwgYmUgcmVmZXJlbmNlZCBsYXRlcgogCSAqLwogCUFTQ1IgJj0gfihBU0NSX1JESCB8IEFTQ1JfRDFTIHwgQVNDUl9EMlMgfCBBU0NSX0QzUyk7Ci0JcmV0dXJuIDA7CiB9CiAjZWxzZQogI2RlZmluZSBweGEzeHhfbWZwX3N1c3BlbmQJTlVMTAogI2RlZmluZSBweGEzeHhfbWZwX3Jlc3VtZQlOVUxMCiAjZW5kaWYKIAotc3RydWN0IHN5c2Rldl9jbGFzcyBweGEzeHhfbWZwX3N5c2NsYXNzID0gewotCS5uYW1lCQk9ICJtZnAiLAorc3RydWN0IHN5c2NvcmVfb3BzIHB4YTN4eF9tZnBfc3lzY29yZV9vcHMgPSB7CiAJLnN1c3BlbmQJPSBweGEzeHhfbWZwX3N1c3BlbmQsCi0JLnJlc3VtZSAJPSBweGEzeHhfbWZwX3Jlc3VtZSwKKwkucmVzdW1lCQk9IHB4YTN4eF9tZnBfcmVzdW1lLAogfTsKLQotc3RhdGljIGludCBfX2luaXQgbWZwX2luaXRfZGV2aWNlZnModm9pZCkKLXsKLQlpZiAoY3B1X2lzX3B4YTN4eCgpKQotCQlyZXR1cm4gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZweGEzeHhfbWZwX3N5c2NsYXNzKTsKLQotCXJldHVybiAwOwotfQotcG9zdGNvcmVfaW5pdGNhbGwobWZwX2luaXRfZGV2aWNlZnMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvbWlvYTcwMS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbWlvYTcwMS5jCmluZGV4IDIzOTI1ZGIuLmUzNDcwMTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL21pb2E3MDEuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9taW9hNzAxLmMKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpb19rZXlzLmg+CkBAIC00ODgsNyArNDg4LDcgQEAKIH0KIAogCi1zdGF0aWMgaW50IG1pb2E3MDFfc3lzX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBtaW9hNzAxX3N5c19zdXNwZW5kKHZvaWQpCiB7CiAJaW50IGkgPSAwLCBpc19idF9vbjsKIAl1MzIgKm1lbV9yZXN1bWVfdmVjdG9yCT0gcGh5c190b192aXJ0KFJFU1VNRV9WRUNUT1JfQUREUik7CkBAIC01MTQsNyArNTE0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtaW9hNzAxX3N5c19yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldikKK3N0YXRpYyB2b2lkIG1pb2E3MDFfc3lzX3Jlc3VtZSh2b2lkKQogewogCWludCBpID0gMDsKIAl1MzIgKm1lbV9yZXN1bWVfdmVjdG9yCT0gcGh5c190b192aXJ0KFJFU1VNRV9WRUNUT1JfQUREUik7CkBAIC01MjcsNDMgKzUyNywxOCBAQAogCSptZW1fcmVzdW1lX2VuYWJsZXIgPSBzYXZlX2J1ZmZlcltpKytdOwogCSptZW1fcmVzdW1lX2J0CSAgICA9IHNhdmVfYnVmZmVyW2krK107CiAJKm1lbV9yZXN1bWVfdW5rbm93biA9IHNhdmVfYnVmZmVyW2krK107Ci0KLQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgbWlvYTcwMV9zeXNjbGFzcyA9IHsKLQkubmFtZSA9ICJtaW9hNzAxIiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBzeXNkZXZfYm9vdHN0cmFwID0gewotCS5jbHMJCT0gJm1pb2E3MDFfc3lzY2xhc3MsCi19OwotCi1zdGF0aWMgc3RydWN0IHN5c2Rldl9kcml2ZXIgZHJpdmVyX2Jvb3RzdHJhcCA9IHsKLQkuc3VzcGVuZAk9ICZtaW9hNzAxX3N5c19zdXNwZW5kLAotCS5yZXN1bWUJCT0gJm1pb2E3MDFfc3lzX3Jlc3VtZSwKK3N0YXRpYyBzdHJ1Y3Qgc3lzY29yZV9vcHMgbWlvYTcwMV9zeXNjb3JlX29wcyA9IHsKKwkuc3VzcGVuZAk9IG1pb2E3MDFfc3lzX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBtaW9hNzAxX3N5c19yZXN1bWUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBib290c3RyYXBfaW5pdCh2b2lkKQogewotCWludCByYzsKIAlpbnQgc2F2ZV9zaXplID0gbWlvYTcwMV9ib290c3RyYXBfbGcgKyAoc2l6ZW9mKHUzMikgKiAzKTsKIAotCXJjID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZtaW9hNzAxX3N5c2NsYXNzKTsKLQlpZiAocmMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgcmVnaXN0ZXJpbmcgbWlvYTcwMSBzeXMgY2xhc3NcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JcmMgPSBzeXNkZXZfcmVnaXN0ZXIoJnN5c2Rldl9ib290c3RyYXApOwotCWlmIChyYykgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCByZWdpc3RlcmluZyBtaW9hNzAxIHN5cyBkZXZpY2VcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JcmMgPSBzeXNkZXZfZHJpdmVyX3JlZ2lzdGVyKCZtaW9hNzAxX3N5c2NsYXNzLCAmZHJpdmVyX2Jvb3RzdHJhcCk7Ci0JaWYgKHJjKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHJlZ2lzdGVyaW5nIFBNVSBzeXMgZHJpdmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQorCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZtaW9hNzAxX3N5c2NvcmVfb3BzKTsKIAogCXNhdmVfYnVmZmVyID0ga21hbGxvYyhzYXZlX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghc2F2ZV9idWZmZXIpCkBAIC01NzYsOSArNTUxLDcgQEAKIHN0YXRpYyB2b2lkIGJvb3RzdHJhcF9leGl0KHZvaWQpCiB7CiAJa2ZyZWUoc2F2ZV9idWZmZXIpOwotCXN5c2Rldl9kcml2ZXJfdW5yZWdpc3RlcigmbWlvYTcwMV9zeXNjbGFzcywgJmRyaXZlcl9ib290c3RyYXApOwotCXN5c2Rldl91bnJlZ2lzdGVyKCZzeXNkZXZfYm9vdHN0cmFwKTsKLQlzeXNkZXZfY2xhc3NfdW5yZWdpc3RlcigmbWlvYTcwMV9zeXNjbGFzcyk7CisJdW5yZWdpc3Rlcl9zeXNjb3JlX29wcygmbWlvYTcwMV9zeXNjb3JlX29wcyk7CiAKIAlwcmludGsoS0VSTl9DUklUICJVbnJlZ2lzdGVyaW5nIG1pb2E3MDEgc3VzcGVuZCB3aWxsIGhhbmcgbmV4dCIKIAkgICAgICAgInJlc3VtZSAhISFcbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvcGFsbWxkLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9wYWxtbGQuYwppbmRleCBhNmY4OThjLi40MDYxZWNkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9wYWxtbGQuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9wYWxtbGQuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC93bTk3eHguaD4KICNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXRyZW8uYyBiL2FyY2gvYXJtL21hY2gtcHhhL3BhbG10cmVvLmMKaW5kZXggOGFhZGFkNS4uMjBkMWIxOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXRyZW8uYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9wYWxtdHJlby5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgvcHdtX2JhY2tsaWdodC5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC93MS1ncGlvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXo3Mi5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXo3Mi5jCmluZGV4IDNiOGE0ZjMuLjY1ZjI0ZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3BhbG16NzIuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9wYWxtejcyLmMKQEAgLTE5LDcgKzE5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgpAQCAtMjMzLDkgKzIzMyw5IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHN0b3JlX3B0cjsKIAotLyogc3lzX2RldmljZSBmb3IgUGFsbSBaaXJlIDcyIFBNICovCisvKiBzeXNjb3JlX29wcyBmb3IgUGFsbSBaaXJlIDcyIFBNICovCiAKLXN0YXRpYyBpbnQgcGFsbXo3Ml9wbV9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtc2cpCitzdGF0aWMgaW50IHBhbG16NzJfcG1fc3VzcGVuZCh2b2lkKQogewogCS8qIHNldHVwIHRoZSByZXN1bWVfaW5mbyBzdHJ1Y3QgZm9yIHRoZSBvcmlnaW5hbCBib290bG9hZGVyICovCiAJcGFsbXo3Ml9yZXN1bWVfaW5mby5yZXN1bWVfYWRkciA9ICh1MzIpIGNwdV9yZXN1bWU7CkBAIC0yNDksMzEgKzI0OSwyMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHBhbG16NzJfcG1fcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBwYWxtejcyX3BtX3Jlc3VtZSh2b2lkKQogewogCSpQQUxNWjcyX1NBVkVfRFdPUkQgPSBzdG9yZV9wdHI7Ci0JcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHBhbG16NzJfcG1fc3lzY2xhc3MgPSB7Ci0JLm5hbWUgPSAicGFsbXo3Ml9wbSIsCitzdGF0aWMgc3RydWN0IHN5c2NvcmVfb3BzIHBhbG16NzJfcG1fc3lzY29yZV9vcHMgPSB7CiAJLnN1c3BlbmQgPSBwYWxtejcyX3BtX3N1c3BlbmQsCiAJLnJlc3VtZSA9IHBhbG16NzJfcG1fcmVzdW1lLAogfTsKIAotc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIHBhbG16NzJfcG1fZGV2aWNlID0gewotCS5jbHMgPSAmcGFsbXo3Ml9wbV9zeXNjbGFzcywKLX07Ci0KIHN0YXRpYyBpbnQgX19pbml0IHBhbG16NzJfcG1faW5pdCh2b2lkKQogewotCWludCByZXQgPSAtRU5PREVWOwogCWlmIChtYWNoaW5lX2lzX3BhbG16NzIoKSkgewotCQlyZXQgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJnBhbG16NzJfcG1fc3lzY2xhc3MpOwotCQlpZiAocmV0ID09IDApCi0JCQlyZXQgPSBzeXNkZXZfcmVnaXN0ZXIoJnBhbG16NzJfcG1fZGV2aWNlKTsKKwkJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJnBhbG16NzJfcG1fc3lzY29yZV9vcHMpOworCQlyZXR1cm4gMDsKIAl9Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gLUVOT0RFVjsKIH0KIAogZGV2aWNlX2luaXRjYWxsKHBhbG16NzJfcG1faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9weGEyNXguYyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI1eC5jCmluZGV4IGE0YWY4YzUuLmZlZDM2M2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI1eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI1eC5jCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CkBAIC0zNTAsMjEgKzM1MCw5IEBACiAJJnB4YV9kZXZpY2VfYXNvY19wbGF0Zm9ybSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBweGEyNXhfc3lzZGV2W10gPSB7Ci0JewotCQkuY2xzCT0gJnB4YV9pcnFfc3lzY2xhc3MsCi0JfSwgewotCQkuY2xzCT0gJnB4YTJ4eF9tZnBfc3lzY2xhc3MsCi0JfSwgewotCQkuY2xzCT0gJnB4YV9ncGlvX3N5c2NsYXNzLAotCX0sIHsKLQkJLmNscwk9ICZweGEyeHhfY2xvY2tfc3lzY2xhc3MsCi0JfQotfTsKLQogc3RhdGljIGludCBfX2luaXQgcHhhMjV4X2luaXQodm9pZCkKIHsKLQlpbnQgaSwgcmV0ID0gMDsKKwlpbnQgcmV0ID0gMDsKIAogCWlmIChjcHVfaXNfcHhhMjV4KCkpIHsKIApAQCAtMzc3LDExICszNjUsMTAgQEAKIAogCQlweGEyNXhfaW5pdF9wbSgpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHB4YTI1eF9zeXNkZXYpOyBpKyspIHsKLQkJCXJldCA9IHN5c2Rldl9yZWdpc3RlcigmcHhhMjV4X3N5c2RldltpXSk7Ci0JCQlpZiAocmV0KQotCQkJCXByX2VycigiZmFpbGVkIHRvIHJlZ2lzdGVyIHN5c2RldlslZF1cbiIsIGkpOwotCQl9CisJCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZweGFfaXJxX3N5c2NvcmVfb3BzKTsKKwkJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJnB4YTJ4eF9tZnBfc3lzY29yZV9vcHMpOworCQlyZWdpc3Rlcl9zeXNjb3JlX29wcygmcHhhX2dwaW9fc3lzY29yZV9vcHMpOworCQlyZWdpc3Rlcl9zeXNjb3JlX29wcygmcHhhMnh4X2Nsb2NrX3N5c2NvcmVfb3BzKTsKIAogCQlyZXQgPSBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhweGEyNXhfZGV2aWNlcywKIAkJCQkJICAgQVJSQVlfU0laRShweGEyNXhfZGV2aWNlcykpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjd4LmMgYi9hcmNoL2FybS9tYWNoLXB4YS9weGEyN3guYwppbmRleCA5MDk3NTZlLi4yZmVjYmVjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9weGEyN3guYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9weGEyN3guYwpAQCAtMTYsNyArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy9weGEtaTJjLmg+CkBAIC00MjgsMjEgKzQyOCw5IEBACiAJJnB4YTI3eF9kZXZpY2VfcHdtMSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBweGEyN3hfc3lzZGV2W10gPSB7Ci0JewotCQkuY2xzCT0gJnB4YV9pcnFfc3lzY2xhc3MsCi0JfSwgewotCQkuY2xzCT0gJnB4YTJ4eF9tZnBfc3lzY2xhc3MsCi0JfSwgewotCQkuY2xzCT0gJnB4YV9ncGlvX3N5c2NsYXNzLAotCX0sIHsKLQkJLmNscwk9ICZweGEyeHhfY2xvY2tfc3lzY2xhc3MsCi0JfQotfTsKLQogc3RhdGljIGludCBfX2luaXQgcHhhMjd4X2luaXQodm9pZCkKIHsKLQlpbnQgaSwgcmV0ID0gMDsKKwlpbnQgcmV0ID0gMDsKIAogCWlmIChjcHVfaXNfcHhhMjd4KCkpIHsKIApAQCAtNDU1LDExICs0NDMsMTAgQEAKIAogCQlweGEyN3hfaW5pdF9wbSgpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHB4YTI3eF9zeXNkZXYpOyBpKyspIHsKLQkJCXJldCA9IHN5c2Rldl9yZWdpc3RlcigmcHhhMjd4X3N5c2RldltpXSk7Ci0JCQlpZiAocmV0KQotCQkJCXByX2VycigiZmFpbGVkIHRvIHJlZ2lzdGVyIHN5c2RldlslZF1cbiIsIGkpOwotCQl9CisJCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZweGFfaXJxX3N5c2NvcmVfb3BzKTsKKwkJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJnB4YTJ4eF9tZnBfc3lzY29yZV9vcHMpOworCQlyZWdpc3Rlcl9zeXNjb3JlX29wcygmcHhhX2dwaW9fc3lzY29yZV9vcHMpOworCQlyZWdpc3Rlcl9zeXNjb3JlX29wcygmcHhhMnh4X2Nsb2NrX3N5c2NvcmVfb3BzKTsKIAogCQlyZXQgPSBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9weGEzeHguYyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTN4eC5jCmluZGV4IDhkZDEwNzMuLjg1MjFkN2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTN4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTN4eC5jCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy9weGEtaTJjLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KQEAgLTQyNywyMSArNDI3LDkgQEAKIAkmcHhhMjd4X2RldmljZV9wd20xLAogfTsKIAotc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIHB4YTN4eF9zeXNkZXZbXSA9IHsKLQl7Ci0JCS5jbHMJPSAmcHhhX2lycV9zeXNjbGFzcywKLQl9LCB7Ci0JCS5jbHMJPSAmcHhhM3h4X21mcF9zeXNjbGFzcywKLQl9LCB7Ci0JCS5jbHMJPSAmcHhhX2dwaW9fc3lzY2xhc3MsCi0JfSwgewotCQkuY2xzCT0gJnB4YTN4eF9jbG9ja19zeXNjbGFzcywKLQl9Ci19OwotCiBzdGF0aWMgaW50IF9faW5pdCBweGEzeHhfaW5pdCh2b2lkKQogewotCWludCBpLCByZXQgPSAwOworCWludCByZXQgPSAwOwogCiAJaWYgKGNwdV9pc19weGEzeHgoKSkgewogCkBAIC00NjIsMTEgKzQ1MCwxMCBAQAogCiAJCXB4YTN4eF9pbml0X3BtKCk7CiAKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocHhhM3h4X3N5c2Rldik7IGkrKykgewotCQkJcmV0ID0gc3lzZGV2X3JlZ2lzdGVyKCZweGEzeHhfc3lzZGV2W2ldKTsKLQkJCWlmIChyZXQpCi0JCQkJcHJfZXJyKCJmYWlsZWQgdG8gcmVnaXN0ZXIgc3lzZGV2WyVkXVxuIiwgaSk7Ci0JCX0KKwkJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJnB4YV9pcnFfc3lzY29yZV9vcHMpOworCQlyZWdpc3Rlcl9zeXNjb3JlX29wcygmcHhhM3h4X21mcF9zeXNjb3JlX29wcyk7CisJCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZweGFfZ3Bpb19zeXNjb3JlX29wcyk7CisJCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZweGEzeHhfY2xvY2tfc3lzY29yZV9vcHMpOwogCiAJCXJldCA9IHBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTk1eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhOTV4LmMKaW5kZXggMjNiMjI5Yi4uZWNjODJhMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcHhhOTV4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhOTV4LmMKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMvcHhhLWkyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KQEAgLTI2MCwxNiArMjYwLDYgQEAKIAkmcHhhMjd4X2RldmljZV9wd20xLAogfTsKIAotc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIHB4YTk1eF9zeXNkZXZbXSA9IHsKLQl7Ci0JCS5jbHMJPSAmcHhhX2lycV9zeXNjbGFzcywKLQl9LCB7Ci0JCS5jbHMJPSAmcHhhX2dwaW9fc3lzY2xhc3MsCi0JfSwgewotCQkuY2xzCT0gJnB4YTN4eF9jbG9ja19zeXNjbGFzcywKLQl9Ci19OwotCiBzdGF0aWMgaW50IF9faW5pdCBweGE5NXhfaW5pdCh2b2lkKQogewogCWludCByZXQgPSAwLCBpOwpAQCAtMjkzLDExICsyODMsOSBAQAogCQlpZiAoKHJldCA9IHB4YV9pbml0X2RtYShJUlFfRE1BLCAzMikpKQogCQkJcmV0dXJuIHJldDsKIAotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShweGE5NXhfc3lzZGV2KTsgaSsrKSB7Ci0JCQlyZXQgPSBzeXNkZXZfcmVnaXN0ZXIoJnB4YTk1eF9zeXNkZXZbaV0pOwotCQkJaWYgKHJldCkKLQkJCQlwcl9lcnIoImZhaWxlZCB0byByZWdpc3RlciBzeXNkZXZbJWRdXG4iLCBpKTsKLQkJfQorCQlyZWdpc3Rlcl9zeXNjb3JlX29wcygmcHhhX2lycV9zeXNjb3JlX29wcyk7CisJCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZweGFfZ3Bpb19zeXNjb3JlX29wcyk7CisJCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZweGEzeHhfY2xvY2tfc3lzY29yZV9vcHMpOwogCiAJCXJldCA9IHBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3JhdW1mZWxkLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9yYXVtZmVsZC5jCmluZGV4IGNkMTg2MTMuLmQxMzBmNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3JhdW1mZWxkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcmF1bWZlbGQuYwpAQCAtMTgsNyArMTgsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3NtZW1jLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9zbWVtYy5jCmluZGV4IDIzMmI3MzEuLjc5OTIzMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3NtZW1jLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvc21lbWMuYwpAQCAtNiw3ICs2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvc21lbWMuaD4KQEAgLTE2LDcgKzE2LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHN4Y25mZywgbWVtY2xrY2ZnOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgY3NhZHJjZmdbNF07CiAKLXN0YXRpYyBpbnQgcHhhM3h4X3NtZW1jX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBweGEzeHhfc21lbWNfc3VzcGVuZCh2b2lkKQogewogCW1zY1swXSA9IF9fcmF3X3JlYWRsKE1TQzApOwogCW1zY1sxXSA9IF9fcmF3X3JlYWRsKE1TQzEpOwpAQCAtMzAsNyArMzAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHB4YTN4eF9zbWVtY19yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHB4YTN4eF9zbWVtY19yZXN1bWUodm9pZCkKIHsKIAlfX3Jhd193cml0ZWwobXNjWzBdLCBNU0MwKTsKIAlfX3Jhd193cml0ZWwobXNjWzFdLCBNU0MxKTsKQEAgLTQwLDM0ICs0MCwxOSBAQAogCV9fcmF3X3dyaXRlbChjc2FkcmNmZ1sxXSwgQ1NBRFJDRkcxKTsKIAlfX3Jhd193cml0ZWwoY3NhZHJjZmdbMl0sIENTQURSQ0ZHMik7CiAJX19yYXdfd3JpdGVsKGNzYWRyY2ZnWzNdLCBDU0FEUkNGRzMpOwotCi0JcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHNtZW1jX3N5c2NsYXNzID0gewotCS5uYW1lCQk9ICJzbWVtYyIsCitzdGF0aWMgc3RydWN0IHN5c2NvcmVfb3BzIHNtZW1jX3N5c2NvcmVfb3BzID0gewogCS5zdXNwZW5kCT0gcHhhM3h4X3NtZW1jX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSBweGEzeHhfc21lbWNfcmVzdW1lLAogfTsKIAotc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIHNtZW1jX3N5c2RldiA9IHsKLQkuaWQJCT0gMCwKLQkuY2xzCQk9ICZzbWVtY19zeXNjbGFzcywKLX07Ci0KIHN0YXRpYyBpbnQgX19pbml0IHNtZW1jX2luaXQodm9pZCkKIHsKLQlpbnQgcmV0ID0gMDsKKwlpZiAoY3B1X2lzX3B4YTN4eCgpKQorCQlyZWdpc3Rlcl9zeXNjb3JlX29wcygmc21lbWNfc3lzY29yZV9vcHMpOwogCi0JaWYgKGNwdV9pc19weGEzeHgoKSkgewotCQlyZXQgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJnNtZW1jX3N5c2NsYXNzKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJcmV0ID0gc3lzZGV2X3JlZ2lzdGVyKCZzbWVtY19zeXNkZXYpOwotCX0KLQotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiBzdWJzeXNfaW5pdGNhbGwoc21lbWNfaW5pdCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3RyaXplcHM0LmMgYi9hcmNoL2FybS9tYWNoLXB4YS90cml6ZXBzNC5jCmluZGV4IGI5Y2ZiZWIuLjY4NzQxN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3RyaXplcHM0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvdHJpemVwczQuYwpAQCAtMTUsNyArMTUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvdmlwZXIuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3ZpcGVyLmMKaW5kZXggYjUyM2YxMS4uOTAzMjE4ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvdmlwZXIuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS92aXBlci5jCkBAIC00NCw2ICs0NCw3IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogCiAjaW5jbHVkZSA8bWFjaC9weGEyNXguaD4KICNpbmNsdWRlIDxtYWNoL2F1ZGlvLmg+CkBAIC0xMzAsMjAgKzEzMSwxOSBAQAogCXJldHVybiB2MTsKIH0KIAotLyogQ1BVIHN5c2RldiAqLwotc3RhdGljIGludCB2aXBlcl9jcHVfc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCisvKiBDUFUgc3lzdGVtIGNvcmUgb3BlcmF0aW9ucy4gKi8KK3N0YXRpYyBpbnQgdmlwZXJfY3B1X3N1c3BlbmQodm9pZCkKIHsKIAl2aXBlcl9pY3Jfc2V0X2JpdChWSVBFUl9JQ1JfUl9ESVMpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHZpcGVyX2NwdV9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldikKK3N0YXRpYyB2b2lkIHZpcGVyX2NwdV9yZXN1bWUodm9pZCkKIHsKIAl2aXBlcl9pY3JfY2xlYXJfYml0KFZJUEVSX0lDUl9SX0RJUyk7Ci0JcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2RyaXZlciB2aXBlcl9jcHVfc3lzZGV2X2RyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc3lzY29yZV9vcHMgdmlwZXJfY3B1X3N5c2NvcmVfb3BzID0gewogCS5zdXNwZW5kCT0gdmlwZXJfY3B1X3N1c3BlbmQsCiAJLnJlc3VtZQkJPSB2aXBlcl9jcHVfcmVzdW1lLAogfTsKQEAgLTk0NSw3ICs5NDUsNyBAQAogCXZpcGVyX2luaXRfdmNvcmVfZ3Bpb3MoKTsKIAl2aXBlcl9pbml0X2NwdWZyZXEoKTsKIAotCXN5c2Rldl9kcml2ZXJfcmVnaXN0ZXIoJmNwdV9zeXNkZXZfY2xhc3MsICZ2aXBlcl9jcHVfc3lzZGV2X2RyaXZlcik7CisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJnZpcGVyX2NwdV9zeXNjb3JlX29wcyk7CiAKIAlpZiAodmVyc2lvbikgewogCQlwcl9pbmZvKCJ2aXBlcjogaGFyZHdhcmUgdiVkaSVkIGRldGVjdGVkLiAiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS92cGFjMjcwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS92cGFjMjcwLmMKaW5kZXggZjcxZDM3Ny4uNjdiZDQxNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvdnBhYzI3MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3ZwYWMyNzAuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9ncGlvX3ZidXMuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pcnEuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pcnEuYwppbmRleCA1ZTJmMzUzLi4yODU0MTI5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2lycS5jCkBAIC0yMywzOCArMjMsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogCiAjaW5jbHVkZSA8cGxhdC9jcHUuaD4KICNpbmNsdWRlIDxwbGF0L3BtLmg+CiAKLXN0YXRpYyBpbnQgczNjMjQxMF9pcnFfYWRkKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2RyaXZlciBzM2MyNDEwX2lycV9kcml2ZXIgPSB7Ci0JLmFkZAkJPSBzM2MyNDEwX2lycV9hZGQsCitzdHJ1Y3Qgc3lzY29yZV9vcHMgczNjMjR4eF9pcnFfc3lzY29yZV9vcHMgPSB7CiAJLnN1c3BlbmQJPSBzM2MyNHh4X2lycV9zdXNwZW5kLAogCS5yZXN1bWUJCT0gczNjMjR4eF9pcnFfcmVzdW1lLAogfTsKLQotc3RhdGljIGludCBfX2luaXQgczNjMjQxMF9pcnFfaW5pdCh2b2lkKQotewotCXJldHVybiBzeXNkZXZfZHJpdmVyX3JlZ2lzdGVyKCZzM2MyNDEwX3N5c2NsYXNzLCAmczNjMjQxMF9pcnFfZHJpdmVyKTsKLX0KLQotYXJjaF9pbml0Y2FsbChzM2MyNDEwX2lycV9pbml0KTsKLQotc3RhdGljIHN0cnVjdCBzeXNkZXZfZHJpdmVyIHMzYzI0MTBhX2lycV9kcml2ZXIgPSB7Ci0JLmFkZAkJPSBzM2MyNDEwX2lycV9hZGQsCi0JLnN1c3BlbmQJPSBzM2MyNHh4X2lycV9zdXNwZW5kLAotCS5yZXN1bWUJCT0gczNjMjR4eF9pcnFfcmVzdW1lLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgczNjMjQxMGFfaXJxX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gc3lzZGV2X2RyaXZlcl9yZWdpc3RlcigmczNjMjQxMGFfc3lzY2xhc3MsICZzM2MyNDEwYV9pcnFfZHJpdmVyKTsKLX0KLQotYXJjaF9pbml0Y2FsbChzM2MyNDEwYV9pcnFfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1iYXN0LmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1iYXN0LmMKaW5kZXggMjk3MGVhOS4uMWUyZDUzNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYmFzdC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWJhc3QuYwpAQCAtMTcsNyArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG05MDAwLmg+CkBAIC0yMTQsMTcgKzIxNCwxNiBAQAogLyogTkFORCBGbGFzaCBvbiBCQVNUIGJvYXJkICovCiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgYmFzdF9wbV9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpzZCwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBiYXN0X3BtX3N1c3BlbmQodm9pZCkKIHsKIAkvKiBlbnN1cmUgdGhhdCBhbiBuUkVTRVQgaXMgbm90IGdlbmVyYXRlZCBvbiByZXN1bWUuICovCiAJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KFMzQzI0MTBfR1BBKDIxKSwgMSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYmFzdF9wbV9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKnNkKQorc3RhdGljIHZvaWQgYmFzdF9wbV9yZXN1bWUodm9pZCkKIHsKIAlzM2NfZ3Bpb19jZmdwaW4oUzNDMjQxMF9HUEEoMjEpLCBTM0MyNDEwX0dQQTIxX25SU1RPVVQpOwotCXJldHVybiAwOwogfQogCiAjZWxzZQpAQCAtMjMyLDE2ICsyMzEsMTEgQEAKICNkZWZpbmUgYmFzdF9wbV9yZXN1bWUgTlVMTAogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIGJhc3RfcG1fc3lzY2xhc3MgPSB7Ci0JLm5hbWUJCT0gIm1hY2gtYmFzdCIsCitzdGF0aWMgc3RydWN0IHN5c2NvcmVfb3BzIGJhc3RfcG1fc3lzY29yZV9vcHMgPSB7CiAJLnN1c3BlbmQJPSBiYXN0X3BtX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSBiYXN0X3BtX3Jlc3VtZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBiYXN0X3BtX3N5c2RldiA9IHsKLQkuY2xzCQk9ICZiYXN0X3BtX3N5c2NsYXNzLAotfTsKLQogc3RhdGljIGludCBzbWFydG1lZGlhX21hcFtdID0geyAwIH07CiBzdGF0aWMgaW50IGNoaXAwX21hcFtdID0geyAxIH07CiBzdGF0aWMgaW50IGNoaXAxX21hcFtdID0geyAyIH07CkBAIC02NDIsOCArNjM2LDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGJhc3RfaW5pdCh2b2lkKQogewotCXN5c2Rldl9jbGFzc19yZWdpc3RlcigmYmFzdF9wbV9zeXNjbGFzcyk7Ci0Jc3lzZGV2X3JlZ2lzdGVyKCZiYXN0X3BtX3N5c2Rldik7CisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJmJhc3RfcG1fc3lzY29yZV9vcHMpOwogCiAJczNjX2kyYzBfc2V0X3BsYXRkYXRhKCZiYXN0X2kyY19pbmZvKTsKIAlzM2NfbmFuZF9zZXRfcGxhdGRhdGEoJmJhc3RfbmFuZF9pbmZvKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9wbS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3BtLmMKaW5kZXggNzI1NjM2Zi4uNDcyOGY5YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3BtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3BtLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCkBAIC05Miw3ICs5Myw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IHMzYzI0MTBfcG1fcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBzM2MyNDEwX3BtX3Jlc3VtZSh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgdG1wOwogCkBAIC0xMDQsMTAgKzEwNSwxMiBAQAogCiAJaWYgKCBtYWNoaW5lX2lzX2FtbF9tNTkwMCgpICkKIAkJczNjMjQxMF9ncGlvX3NldHBpbihTM0MyNDEwX0dQRigyKSwgMCk7Ci0KLQlyZXR1cm4gMDsKIH0KIAorc3RydWN0IHN5c2NvcmVfb3BzIHMzYzI0MTBfcG1fc3lzY29yZV9vcHMgPSB7CisJLnJlc3VtZQkJPSBzM2MyNDEwX3BtX3Jlc3VtZSwKK307CisKIHN0YXRpYyBpbnQgczNjMjQxMF9wbV9hZGQoc3RydWN0IHN5c19kZXZpY2UgKmRldikKIHsKIAlwbV9jcHVfcHJlcCA9IHMzYzI0MTBfcG1fcHJlcGFyZTsKQEAgLTExOSw3ICsxMjIsNiBAQAogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TM0MyNDEwKQogc3RhdGljIHN0cnVjdCBzeXNkZXZfZHJpdmVyIHMzYzI0MTBfcG1fZHJpdmVyID0gewogCS5hZGQJCT0gczNjMjQxMF9wbV9hZGQsCi0JLnJlc3VtZQkJPSBzM2MyNDEwX3BtX3Jlc3VtZSwKIH07CiAKIC8qIHJlZ2lzdGVyIG91cnNlbHZlcyAqLwpAQCAtMTMzLDcgKzEzNSw2IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2RyaXZlciBzM2MyNDEwYV9wbV9kcml2ZXIgPSB7CiAJLmFkZAkJPSBzM2MyNDEwX3BtX2FkZCwKLQkucmVzdW1lCQk9IHMzYzI0MTBfcG1fcmVzdW1lLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgczNjMjQxMGFfcG1fZHJ2aW5pdCh2b2lkKQpAQCAtMTQ3LDcgKzE0OCw2IEBACiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1MzQzI0NDApCiBzdGF0aWMgc3RydWN0IHN5c2Rldl9kcml2ZXIgczNjMjQ0MF9wbV9kcml2ZXIgPSB7CiAJLmFkZAkJPSBzM2MyNDEwX3BtX2FkZCwKLQkucmVzdW1lCQk9IHMzYzI0MTBfcG1fcmVzdW1lLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgczNjMjQ0MF9wbV9kcnZpbml0KHZvaWQpCkBAIC0xNjEsNyArMTYxLDYgQEAKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfUzNDMjQ0MikKIHN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2RyaXZlciBzM2MyNDQyX3BtX2RyaXZlciA9IHsKIAkuYWRkCQk9IHMzYzI0MTBfcG1fYWRkLAotCS5yZXN1bWUJCT0gczNjMjQxMF9wbV9yZXN1bWUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzM2MyNDQyX3BtX2RydmluaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMC5jCmluZGV4IGFkYzkwYTMuLmYxZDNiZDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0MTAuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KQEAgLTQwLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxwbGF0L2RldnMuaD4KICNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CiAjaW5jbHVkZSA8cGxhdC9wbGwuaD4KKyNpbmNsdWRlIDxwbGF0L3BtLmg+CiAKICNpbmNsdWRlIDxwbGF0L2dwaW8tY29yZS5oPgogI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KQEAgLTE2OCw2ICsxNzAsOSBAQAogewogCXByaW50aygiUzNDMjQxMDogSW5pdGlhbGlzaW5nIGFyY2hpdGVjdHVyZVxuIik7CiAKKwlyZWdpc3Rlcl9zeXNjb3JlX29wcygmczNjMjQxMF9wbV9zeXNjb3JlX29wcyk7CisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJnMzYzI0eHhfaXJxX3N5c2NvcmVfb3BzKTsKKwogCXJldHVybiBzeXNkZXZfcmVnaXN0ZXIoJnMzYzI0MTBfc3lzZGV2KTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL2lycS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL2lycS5jCmluZGV4IGYzMzU1ZDIuLjFhMWFhMjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMi9pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvaXJxLmMKQEAgLTIwMiw4ICsyMDIsNiBAQAogCiBzdGF0aWMgc3RydWN0IHN5c2Rldl9kcml2ZXIgczNjMjQxMl9pcnFfZHJpdmVyID0gewogCS5hZGQJCT0gczNjMjQxMl9pcnFfYWRkLAotCS5zdXNwZW5kCT0gczNjMjR4eF9pcnFfc3VzcGVuZCwKLQkucmVzdW1lCQk9IHMzYzI0eHhfaXJxX3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBpbnQgczNjMjQxMl9pcnFfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL21hY2gtaml2ZS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL21hY2gtaml2ZS5jCmluZGV4IDkyM2UwMWIuLjg1ZGNhZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMi9tYWNoLWppdmUuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvbWFjaC1qaXZlLmMKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgpAQCAtNDg2LDcgKzQ4Niw3IEBACiAvKiBKaXZlIHBvd2VyIG1hbmFnZW1lbnQgZGV2aWNlICovCiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgaml2ZV9wbV9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpzZCwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBqaXZlX3BtX3N1c3BlbmQodm9pZCkKIHsKIAkvKiBXcml0ZSB0aGUgbWFnaWMgdmFsdWUgdS1ib290IHVzZXMgdG8gY2hlY2sgZm9yIHJlc3VtZSBpbnRvCiAJICogdGhlIElORk9STTAgcmVnaXN0ZXIsIGFuZCBlbnN1cmUgSU5GT1JNMSBpcyBzZXQgdG8gdGhlCkBAIC00OTgsMTAgKzQ5OCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaml2ZV9wbV9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKnNkKQorc3RhdGljIHZvaWQgaml2ZV9wbV9yZXN1bWUodm9pZCkKIHsKIAlfX3Jhd193cml0ZWwoMHgwLCBTM0MyNDEyX0lORk9STTApOwotCXJldHVybiAwOwogfQogCiAjZWxzZQpAQCAtNTA5LDE2ICs1MDgsMTEgQEAKICNkZWZpbmUgaml2ZV9wbV9yZXN1bWUgTlVMTAogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIGppdmVfcG1fc3lzY2xhc3MgPSB7Ci0JLm5hbWUJCT0gImppdmUtcG0iLAorc3RhdGljIHN0cnVjdCBzeXNjb3JlX29wcyBqaXZlX3BtX3N5c2NvcmVfb3BzID0gewogCS5zdXNwZW5kCT0gaml2ZV9wbV9zdXNwZW5kLAogCS5yZXN1bWUJCT0gaml2ZV9wbV9yZXN1bWUsCiB9OwogCi1zdGF0aWMgc3RydWN0IHN5c19kZXZpY2Ugaml2ZV9wbV9zeXNkZXYgPSB7Ci0JLmNscwkJPSAmaml2ZV9wbV9zeXNjbGFzcywKLX07Ci0KIHN0YXRpYyB2b2lkIF9faW5pdCBqaXZlX21hcF9pbyh2b2lkKQogewogCXMzYzI0eHhfaW5pdF9pbyhqaXZlX2lvZGVzYywgQVJSQVlfU0laRShqaXZlX2lvZGVzYykpOwpAQCAtNTM2LDEwICs1MzAsOSBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgaml2ZV9tYWNoaW5lX2luaXQodm9pZCkKIHsKLQkvKiByZWdpc3RlciBzeXN0ZW0gZGV2aWNlcyBmb3IgbWFuYWdpbmcgbG93IGxldmVsIHN1c3BlbmQgKi8KKwkvKiByZWdpc3RlciBzeXN0ZW0gY29yZSBvcGVyYXRpb25zIGZvciBtYW5hZ2luZyBsb3cgbGV2ZWwgc3VzcGVuZCAqLwogCi0Jc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZqaXZlX3BtX3N5c2NsYXNzKTsKLQlzeXNkZXZfcmVnaXN0ZXIoJmppdmVfcG1fc3lzZGV2KTsKKwlyZWdpc3Rlcl9zeXNjb3JlX29wcygmaml2ZV9wbV9zeXNjb3JlX29wcyk7CiAKIAkvKiB3cml0ZSBvdXIgc2xlZXAgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBJTy4gUHVsbCBkb3duIGFsbCB1bnVzZWQKIAkgKiBJTywgZW5zdXJlIHRoYXQgd2UgaGF2ZSB0dXJuZWQgb2ZmIGFsbCBwZXJpcGhlcmFscyB3ZSBkbyBub3QKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMi9wbS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL3BtLmMKaW5kZXggYTc0MTdjNC4uNzUyYjEzYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL3BtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL3BtLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKQEAgLTg2LDEzICs4NywyNCBAQAogCVNBVkVfSVRFTShTM0MyNDEzX0dQSlNMUENPTiksCiB9OwogCi1zdGF0aWMgaW50IHMzYzI0MTJfcG1fc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitzdGF0aWMgc3RydWN0IHN5c2Rldl9kcml2ZXIgczNjMjQxMl9wbV9kcml2ZXIgPSB7CisJLmFkZAkJPSBzM2MyNDEyX3BtX2FkZCwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IHMzYzI0MTJfcG1faW5pdCh2b2lkKQoreworCXJldHVybiBzeXNkZXZfZHJpdmVyX3JlZ2lzdGVyKCZzM2MyNDEyX3N5c2NsYXNzLCAmczNjMjQxMl9wbV9kcml2ZXIpOworfQorCithcmNoX2luaXRjYWxsKHMzYzI0MTJfcG1faW5pdCk7CisKK3N0YXRpYyBpbnQgczNjMjQxMl9wbV9zdXNwZW5kKHZvaWQpCiB7CiAJczNjX3BtX2RvX3NhdmUoczNjMjQxMl9zbGVlcCwgQVJSQVlfU0laRShzM2MyNDEyX3NsZWVwKSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgczNjMjQxMl9wbV9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHMzYzI0MTJfcG1fcmVzdW1lKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXA7CiAKQEAgLTEwMiwxOCArMTE0LDkgQEAKIAlfX3Jhd193cml0ZWwodG1wLCBTM0MyNDEyX1BXUkNGRyk7CiAKIAlzM2NfcG1fZG9fcmVzdG9yZShzM2MyNDEyX3NsZWVwLCBBUlJBWV9TSVpFKHMzYzI0MTJfc2xlZXApKTsKLQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzeXNkZXZfZHJpdmVyIHMzYzI0MTJfcG1fZHJpdmVyID0gewotCS5hZGQJCT0gczNjMjQxMl9wbV9hZGQsCitzdHJ1Y3Qgc3lzY29yZV9vcHMgczNjMjQxMl9wbV9zeXNjb3JlX29wcyA9IHsKIAkuc3VzcGVuZAk9IHMzYzI0MTJfcG1fc3VzcGVuZCwKIAkucmVzdW1lCQk9IHMzYzI0MTJfcG1fcmVzdW1lLAogfTsKLQotc3RhdGljIF9faW5pdCBpbnQgczNjMjQxMl9wbV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHN5c2Rldl9kcml2ZXJfcmVnaXN0ZXIoJnMzYzI0MTJfc3lzY2xhc3MsICZzM2MyNDEyX3BtX2RyaXZlcik7Ci19Ci0KLWFyY2hfaW5pdGNhbGwoczNjMjQxMl9wbV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMi9zM2MyNDEyLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvczNjMjQxMi5jCmluZGV4IDRjNmRmNTEuLmVmMDk1OGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMi9zM2MyNDEyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL3MzYzI0MTIuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CkBAIC0yNDQsNSArMjQ1LDggQEAKIHsKIAlwcmludGsoIlMzQzI0MTI6IEluaXRpYWxpc2luZyBhcmNoaXRlY3R1cmVcbiIpOwogCisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJnMzYzI0MTJfcG1fc3lzY29yZV9vcHMpOworCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZzM2MyNHh4X2lycV9zeXNjb3JlX29wcyk7CisKIAlyZXR1cm4gc3lzZGV2X3JlZ2lzdGVyKCZzM2MyNDEyX3N5c2Rldik7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTYvaXJxLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTYvaXJxLmMKaW5kZXggNzdiMzhmMi4uMjhhZDIwZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDE2L2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxNi9pcnEuYwpAQCAtMjM2LDggKzIzNiw2IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2RyaXZlciBzM2MyNDE2X2lycV9kcml2ZXIgPSB7CiAJLmFkZAkJPSBzM2MyNDE2X2lycV9hZGQsCi0JLnN1c3BlbmQJPSBzM2MyNHh4X2lycV9zdXNwZW5kLAotCS5yZXN1bWUJCT0gczNjMjR4eF9pcnFfcmVzdW1lLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgczNjMjQxNl9pcnFfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDE2L3BtLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTYvcG0uYwppbmRleCA0YTA0MjA1Li40MWRiMmIyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTYvcG0uYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTYvcG0uYwpAQCAtMTEsNiArMTEsNyBAQAogKi8KIAogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CkBAIC01NSwyNSArNTYsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHMzYzI0MTZfcG1fc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgczNjMjQxNl9wbV9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKLXsKLQkvKiB1bnNldCB0aGUgcmV0dXJuLWZyb20tc2xlZXAgYW1kIGluZm9ybSBmbGFncyAqLwotCV9fcmF3X3dyaXRlbCgweDAsIFMzQzI0NDNfUFdSTU9ERSk7Ci0JX19yYXdfd3JpdGVsKDB4MCwgUzNDMjQxMl9JTkZPUk0wKTsKLQlfX3Jhd193cml0ZWwoMHgwLCBTM0MyNDEyX0lORk9STTEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2RyaXZlciBzM2MyNDE2X3BtX2RyaXZlciA9IHsKIAkuYWRkCQk9IHMzYzI0MTZfcG1fYWRkLAotCS5zdXNwZW5kCT0gczNjMjQxNl9wbV9zdXNwZW5kLAotCS5yZXN1bWUJCT0gczNjMjQxNl9wbV9yZXN1bWUsCiB9OwogCiBzdGF0aWMgX19pbml0IGludCBzM2MyNDE2X3BtX2luaXQodm9pZCkKQEAgLTgyLDMgKzY2LDE2IEBACiB9CiAKIGFyY2hfaW5pdGNhbGwoczNjMjQxNl9wbV9pbml0KTsKKworCitzdGF0aWMgdm9pZCBzM2MyNDE2X3BtX3Jlc3VtZSh2b2lkKQoreworCS8qIHVuc2V0IHRoZSByZXR1cm4tZnJvbS1zbGVlcCBhbWQgaW5mb3JtIGZsYWdzICovCisJX19yYXdfd3JpdGVsKDB4MCwgUzNDMjQ0M19QV1JNT0RFKTsKKwlfX3Jhd193cml0ZWwoMHgwLCBTM0MyNDEyX0lORk9STTApOworCV9fcmF3X3dyaXRlbCgweDAsIFMzQzI0MTJfSU5GT1JNMSk7Cit9CisKK3N0cnVjdCBzeXNjb3JlX29wcyBzM2MyNDE2X3BtX3N5c2NvcmVfb3BzID0geworCS5yZXN1bWUJCT0gczNjMjQxNl9wbV9yZXN1bWUsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDE2L3MzYzI0MTYuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxNi9zM2MyNDE2LmMKaW5kZXggYmE3ZmQ4Ny4uNDk0Y2U5MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDE2L3MzYzI0MTYuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTYvczNjMjQxNi5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKQEAgLTU0LDYgKzU1LDcgQEAKICNpbmNsdWRlIDxwbGF0L2RldnMuaD4KICNpbmNsdWRlIDxwbGF0L2NwdS5oPgogI2luY2x1ZGUgPHBsYXQvc2RoY2kuaD4KKyNpbmNsdWRlIDxwbGF0L3BtLmg+CiAKICNpbmNsdWRlIDxwbGF0L2lpYy1jb3JlLmg+CiAjaW5jbHVkZSA8cGxhdC9mYi1jb3JlLmg+CkBAIC05NSw2ICs5Nyw5IEBACiAKIAlzM2NfZmJfc2V0bmFtZSgiczNjMjQ0My1mYiIpOwogCisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJnMzYzI0MTZfcG1fc3lzY29yZV9vcHMpOworCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZzM2MyNHh4X2lycV9zeXNjb3JlX29wcyk7CisKIAlyZXR1cm4gc3lzZGV2X3JlZ2lzdGVyKCZzM2MyNDE2X3N5c2Rldik7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLW9zaXJpcy5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtb3NpcmlzLmMKaW5kZXggMTRkYzY3OC4uZDg4NTM2MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtb3NpcmlzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtb3NpcmlzLmMKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KQEAgLTI4NCw3ICsyODQsNyBAQAogI2lmZGVmIENPTkZJR19QTQogc3RhdGljIHVuc2lnbmVkIGNoYXIgcG1fb3NpcmlzX2N0cmwwOwogCi1zdGF0aWMgaW50IG9zaXJpc19wbV9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpzZCwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBvc2lyaXNfcG1fc3VzcGVuZCh2b2lkKQogewogCXVuc2lnbmVkIGludCB0bXA7CiAKQEAgLTMwNCw3ICszMDQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG9zaXJpc19wbV9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKnNkKQorc3RhdGljIHZvaWQgb3NpcmlzX3BtX3Jlc3VtZSh2b2lkKQogewogCWlmIChwbV9vc2lyaXNfY3RybDAgJiBPU0lSSVNfQ1RSTDBfRklYOCkKIAkJX19yYXdfd3JpdGViKE9TSVJJU19DVFJMMV9GSVg4LCBPU0lSSVNfVkFfQ1RSTDEpOwpAQCAtMzEyLDggKzMxMiw2IEBACiAJX19yYXdfd3JpdGViKHBtX29zaXJpc19jdHJsMCwgT1NJUklTX1ZBX0NUUkwwKTsKIAogCXMzY19ncGlvX2NmZ3BpbihTM0MyNDEwX0dQQSgyMSksIFMzQzI0MTBfR1BBMjFfblJTVE9VVCk7Ci0KLQlyZXR1cm4gMDsKIH0KIAogI2Vsc2UKQEAgLTMyMSwxNiArMzE5LDExIEBACiAjZGVmaW5lIG9zaXJpc19wbV9yZXN1bWUgTlVMTAogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIG9zaXJpc19wbV9zeXNjbGFzcyA9IHsKLQkubmFtZQkJPSAibWFjaC1vc2lyaXMiLAorc3RhdGljIHN0cnVjdCBzeXNjb3JlX29wcyBvc2lyaXNfcG1fc3lzY29yZV9vcHMgPSB7CiAJLnN1c3BlbmQJPSBvc2lyaXNfcG1fc3VzcGVuZCwKIAkucmVzdW1lCQk9IG9zaXJpc19wbV9yZXN1bWUsCiB9OwogCi1zdGF0aWMgc3RydWN0IHN5c19kZXZpY2Ugb3NpcmlzX3BtX3N5c2RldiA9IHsKLQkuY2xzCQk9ICZvc2lyaXNfcG1fc3lzY2xhc3MsCi19OwotCiAvKiBMaW5rIGZvciBEVlMgZHJpdmVyIHRvIFRQUzY1MDExICovCiAKIHN0YXRpYyB2b2lkIG9zaXJpc190cHNfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC00MzksOCArNDMyLDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IG9zaXJpc19pbml0KHZvaWQpCiB7Ci0Jc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZvc2lyaXNfcG1fc3lzY2xhc3MpOwotCXN5c2Rldl9yZWdpc3Rlcigmb3NpcmlzX3BtX3N5c2Rldik7CisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJm9zaXJpc19wbV9zeXNjb3JlX29wcyk7CiAKIAlzM2NfaTJjMF9zZXRfcGxhdGRhdGEoTlVMTCk7CiAJczNjX25hbmRfc2V0X3BsYXRkYXRhKCZvc2lyaXNfbmFuZF9pbmZvKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9zM2MyNDQwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvczNjMjQ0MC5jCmluZGV4IGY3NjYzZjcuLmNlOTlmZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9zM2MyNDQwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL3MzYzI0NDAuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KQEAgLTMzLDYgKzM0LDcgQEAKICNpbmNsdWRlIDxwbGF0L2RldnMuaD4KICNpbmNsdWRlIDxwbGF0L2NwdS5oPgogI2luY2x1ZGUgPHBsYXQvczNjMjQ0eC5oPgorI2luY2x1ZGUgPHBsYXQvcG0uaD4KIAogI2luY2x1ZGUgPHBsYXQvZ3Bpby1jb3JlLmg+CiAjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgpAQCAtNTEsNiArNTMsMTIgQEAKIAlzM2NfZGV2aWNlX3dkdC5yZXNvdXJjZVsxXS5zdGFydCA9IElSUV9TM0MyNDQwX1dEVDsKIAlzM2NfZGV2aWNlX3dkdC5yZXNvdXJjZVsxXS5lbmQgICA9IElSUV9TM0MyNDQwX1dEVDsKIAorCS8qIHJlZ2lzdGVyIHN1c3BlbmQvcmVzdW1lIGhhbmRsZXJzICovCisKKwlyZWdpc3Rlcl9zeXNjb3JlX29wcygmczNjMjQxMF9wbV9zeXNjb3JlX29wcyk7CisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJnMzYzI0NHhfcG1fc3lzY29yZV9vcHMpOworCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZzM2MyNHh4X2lycV9zeXNjb3JlX29wcyk7CisKIAkvKiByZWdpc3RlciBvdXIgc3lzdGVtIGRldmljZSBmb3IgZXZlcnl0aGluZyBlbHNlICovCiAKIAlyZXR1cm4gc3lzZGV2X3JlZ2lzdGVyKCZzM2MyNDQwX3N5c2Rldik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvczNjMjQ0Mi5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL3MzYzI0NDIuYwppbmRleCBlY2Y4MTM1Li42MjI0YmFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvczNjMjQ0Mi5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9zM2MyNDQyLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CkBAIC00NSw2ICs0Niw3IEBACiAjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAjaW5jbHVkZSA8cGxhdC9zM2MyNDR4Lmg+CisjaW5jbHVkZSA8cGxhdC9wbS5oPgogCiAjaW5jbHVkZSA8cGxhdC9ncGlvLWNvcmUuaD4KICNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+CkBAIC0xNjcsNiArMTY5LDEwIEBACiB7CiAJcHJpbnRrKCJTM0MyNDQyOiBJbml0aWFsaXNpbmcgYXJjaGl0ZWN0dXJlXG4iKTsKIAorCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZzM2MyNDEwX3BtX3N5c2NvcmVfb3BzKTsKKwlyZWdpc3Rlcl9zeXNjb3JlX29wcygmczNjMjQ0eF9wbV9zeXNjb3JlX29wcyk7CisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJnMzYzI0eHhfaXJxX3N5c2NvcmVfb3BzKTsKKwogCXJldHVybiBzeXNkZXZfcmVnaXN0ZXIoJnMzYzI0NDJfc3lzZGV2KTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL3MzYzI0NHgtaXJxLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvczNjMjQ0eC1pcnEuYwppbmRleCBkZTA3YzJmLi5jNjNlOGYyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvczNjMjQ0eC1pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvczNjMjQ0eC1pcnEuYwpAQCAtMTE2LDggKzExNiw2IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2RyaXZlciBzM2MyNDQwX2lycV9kcml2ZXIgPSB7CiAJLmFkZAkJPSBzM2MyNDR4X2lycV9hZGQsCi0JLnN1c3BlbmQJPSBzM2MyNHh4X2lycV9zdXNwZW5kLAotCS5yZXN1bWUJCT0gczNjMjR4eF9pcnFfcmVzdW1lLAogfTsKIAogc3RhdGljIGludCBzM2MyNDQwX2lycV9pbml0KHZvaWQpCkBAIC0xMjksOCArMTI3LDYgQEAKIAogc3RhdGljIHN0cnVjdCBzeXNkZXZfZHJpdmVyIHMzYzI0NDJfaXJxX2RyaXZlciA9IHsKIAkuYWRkCQk9IHMzYzI0NHhfaXJxX2FkZCwKLQkuc3VzcGVuZAk9IHMzYzI0eHhfaXJxX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBzM2MyNHh4X2lycV9yZXN1bWUsCiB9OwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9zM2MyNDR4LmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvczNjMjQ0eC5jCmluZGV4IDkwYzE3MDcuLjdlOGEyM2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9zM2MyNDR4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL3MzYzI0NHguYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCkBAIC0xMzQsNDUgKzEzNSwxNCBAQAogCXMzYzI0MTBfYmFzZWNsa19hZGQoKTsKIH0KIAotI2lmZGVmIENPTkZJR19QTQotCi1zdGF0aWMgc3RydWN0IHNsZWVwX3NhdmUgczNjMjQ0eF9zbGVlcFtdID0gewotCVNBVkVfSVRFTShTM0MyNDQwX0RTQzApLAotCVNBVkVfSVRFTShTM0MyNDQwX0RTQzEpLAotCVNBVkVfSVRFTShTM0MyNDQwX0dQSkRBVCksCi0JU0FWRV9JVEVNKFMzQzI0NDBfR1BKQ09OKSwKLQlTQVZFX0lURU0oUzNDMjQ0MF9HUEpVUCkKLX07Ci0KLXN0YXRpYyBpbnQgczNjMjQ0eF9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlzM2NfcG1fZG9fc2F2ZShzM2MyNDR4X3NsZWVwLCBBUlJBWV9TSVpFKHMzYzI0NHhfc2xlZXApKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzM2MyNDR4X3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQotewotCXMzY19wbV9kb19yZXN0b3JlKHMzYzI0NHhfc2xlZXAsIEFSUkFZX1NJWkUoczNjMjQ0eF9zbGVlcCkpOwotCXJldHVybiAwOwotfQotCi0jZWxzZQotI2RlZmluZSBzM2MyNDR4X3N1c3BlbmQgTlVMTAotI2RlZmluZSBzM2MyNDR4X3Jlc3VtZSAgTlVMTAotI2VuZGlmCi0KIC8qIFNpbmNlIHRoZSBTM0MyNDQyIGFuZCBTM0MyNDQwIHNoYXJlICBpdGVtcywgcHV0IGJvdGggc3lzY2xhc3NlcyBoZXJlICovCiAKIHN0cnVjdCBzeXNkZXZfY2xhc3MgczNjMjQ0MF9zeXNjbGFzcyA9IHsKIAkubmFtZQkJPSAiczNjMjQ0MC1jb3JlIiwKLQkuc3VzcGVuZAk9IHMzYzI0NHhfc3VzcGVuZCwKLQkucmVzdW1lCQk9IHMzYzI0NHhfcmVzdW1lCiB9OwogCiBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHMzYzI0NDJfc3lzY2xhc3MgPSB7CiAJLm5hbWUJCT0gInMzYzI0NDItY29yZSIsCi0JLnN1c3BlbmQJPSBzM2MyNDR4X3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBzM2MyNDR4X3Jlc3VtZQogfTsKIAogLyogbmVlZCB0byByZWdpc3RlciBjbGFzcyBiZWZvcmUgd2UgYWN0dWFsbHkgcmVnaXN0ZXIgdGhlIGRldmljZSwgYW5kCkBAIC0xOTQsMyArMTY0LDMzIEBACiB9CiAKIGNvcmVfaW5pdGNhbGwoczNjMjQ0Ml9jb3JlX2luaXQpOworCisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBzdHJ1Y3Qgc2xlZXBfc2F2ZSBzM2MyNDR4X3NsZWVwW10gPSB7CisJU0FWRV9JVEVNKFMzQzI0NDBfRFNDMCksCisJU0FWRV9JVEVNKFMzQzI0NDBfRFNDMSksCisJU0FWRV9JVEVNKFMzQzI0NDBfR1BKREFUKSwKKwlTQVZFX0lURU0oUzNDMjQ0MF9HUEpDT04pLAorCVNBVkVfSVRFTShTM0MyNDQwX0dQSlVQKQorfTsKKworc3RhdGljIGludCBzM2MyNDR4X3N1c3BlbmQodm9pZCkKK3sKKwlzM2NfcG1fZG9fc2F2ZShzM2MyNDR4X3NsZWVwLCBBUlJBWV9TSVpFKHMzYzI0NHhfc2xlZXApKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgczNjMjQ0eF9yZXN1bWUodm9pZCkKK3sKKwlzM2NfcG1fZG9fcmVzdG9yZShzM2MyNDR4X3NsZWVwLCBBUlJBWV9TSVpFKHMzYzI0NHhfc2xlZXApKTsKK30KKyNlbHNlCisjZGVmaW5lIHMzYzI0NHhfc3VzcGVuZCBOVUxMCisjZGVmaW5lIHMzYzI0NHhfcmVzdW1lICBOVUxMCisjZW5kaWYKKworc3RydWN0IHN5c2NvcmVfb3BzIHMzYzI0NHhfcG1fc3lzY29yZV9vcHMgPSB7CisJLnN1c3BlbmQJPSBzM2MyNDR4X3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzM2MyNDR4X3Jlc3VtZSwKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaXJxLXBtLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaXJxLXBtLmMKaW5kZXggZGExYmVjNi4uOGJlYzYxZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2lycS1wbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pcnEtcG0uYwpAQCAtMTMsNyArMTMsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CkBAIC01NCw3ICs1NCw3IEBACiAKIHN0YXRpYyB1MzIgaXJxX3VhcnRfbWFza1tDT05GSUdfU0VSSUFMX1NBTVNVTkdfVUFSVFNdOwogCi1zdGF0aWMgaW50IHMzYzY0eHhfaXJxX3BtX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBzM2M2NHh4X2lycV9wbV9zdXNwZW5kKHZvaWQpCiB7CiAJc3RydWN0IGlycV9ncnBfc2F2ZSAqZ3JwID0gZWludF9ncnBfc2F2ZTsKIAlpbnQgaTsKQEAgLTc1LDcgKzc1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzM2M2NHh4X2lycV9wbV9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHMzYzY0eHhfaXJxX3BtX3Jlc3VtZSh2b2lkKQogewogCXN0cnVjdCBpcnFfZ3JwX3NhdmUgKmdycCA9IGVpbnRfZ3JwX3NhdmU7CiAJaW50IGk7CkBAIC05NCwxOCArOTQsMTggQEAKIAl9CiAKIAlTM0NfUE1EQkcoIiVzOiBJUlEgY29uZmlndXJhdGlvbiByZXN0b3JlZFxuIiwgX19mdW5jX18pOwotCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHN5c2Rldl9kcml2ZXIgczNjNjR4eF9pcnFfZHJpdmVyID0geworc3RydWN0IHN5c2NvcmVfb3BzIHMzYzY0eHhfaXJxX3N5c2NvcmVfb3BzID0gewogCS5zdXNwZW5kID0gczNjNjR4eF9pcnFfcG1fc3VzcGVuZCwKIAkucmVzdW1lCSA9IHMzYzY0eHhfaXJxX3BtX3Jlc3VtZSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHMzYzY0eHhfaXJxX3BtX2luaXQodm9pZCkKK3N0YXRpYyBfX2luaXQgaW50IHMzYzY0eHhfc3lzY29yZV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHN5c2Rldl9kcml2ZXJfcmVnaXN0ZXIoJnMzYzY0eHhfc3lzY2xhc3MsICZzM2M2NHh4X2lycV9kcml2ZXIpOworCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZzM2M2NHh4X2lycV9zeXNjb3JlX29wcyk7CisKKwlyZXR1cm4gMDsKIH0KIAotYXJjaF9pbml0Y2FsbChzM2M2NHh4X2lycV9wbV9pbml0KTsKLQorY29yZV9pbml0Y2FsbChzM2M2NHh4X3N5c2NvcmVfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvcG0uYyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9wbS5jCmluZGV4IDU0OWQ3OTIuLjI0ZmViYWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9wbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9wbS5jCkBAIC0xNiw2ICsxNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CkBAIC0xNDAsNyArMTQxLDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgczVwdjIxMF9wbV9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2RyaXZlciBzNXB2MjEwX3BtX2RyaXZlciA9IHsKKwkuYWRkCQk9IHM1cHYyMTBfcG1fYWRkLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgczVwdjIxMF9wbV9kcnZpbml0KHZvaWQpCit7CisJcmV0dXJuIHN5c2Rldl9kcml2ZXJfcmVnaXN0ZXIoJnM1cHYyMTBfc3lzY2xhc3MsICZzNXB2MjEwX3BtX2RyaXZlcik7Cit9CithcmNoX2luaXRjYWxsKHM1cHYyMTBfcG1fZHJ2aW5pdCk7CisKK3N0YXRpYyB2b2lkIHM1cHYyMTBfcG1fcmVzdW1lKHZvaWQpCiB7CiAJdTMyIHRtcDsKIApAQCAtMTUwLDE3ICsxNjEsMTUgQEAKIAlfX3Jhd193cml0ZWwodG1wICwgUzVQX09USEVSUyk7CiAKIAlzM2NfcG1fZG9fcmVzdG9yZV9jb3JlKHM1cHYyMTBfY29yZV9zYXZlLCBBUlJBWV9TSVpFKHM1cHYyMTBfY29yZV9zYXZlKSk7Ci0KLQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzeXNkZXZfZHJpdmVyIHM1cHYyMTBfcG1fZHJpdmVyID0gewotCS5hZGQJCT0gczVwdjIxMF9wbV9hZGQsCitzdGF0aWMgc3RydWN0IHN5c2NvcmVfb3BzIHM1cHYyMTBfcG1fc3lzY29yZV9vcHMgPSB7CiAJLnJlc3VtZQkJPSBzNXB2MjEwX3BtX3Jlc3VtZSwKIH07CiAKLXN0YXRpYyBfX2luaXQgaW50IHM1cHYyMTBfcG1fZHJ2aW5pdCh2b2lkKQorc3RhdGljIF9faW5pdCBpbnQgczVwdjIxMF9wbV9zeXNjb3JlX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gc3lzZGV2X2RyaXZlcl9yZWdpc3RlcigmczVwdjIxMF9zeXNjbGFzcywgJnM1cHYyMTBfcG1fZHJpdmVyKTsKKwlyZWdpc3Rlcl9zeXNjb3JlX29wcygmczVwdjIxMF9wbV9zeXNjb3JlX29wcyk7CisJcmV0dXJuIDA7CiB9Ci1hcmNoX2luaXRjYWxsKHM1cHYyMTBfcG1fZHJ2aW5pdCk7CithcmNoX2luaXRjYWxsKHM1cHYyMTBfcG1fc3lzY29yZV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2lycS5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaXJxLmMKaW5kZXggNDIzZGRiMy4uZGZiZjgyNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaXJxLmMKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgpAQCAtMjM0LDcgKzIzNCw3IEBACiAJdW5zaWduZWQgaW50CWljY3I7CiB9IHNhMTEwMGlycV9zdGF0ZTsKIAotc3RhdGljIGludCBzYTExMDBpcnFfc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitzdGF0aWMgaW50IHNhMTEwMGlycV9zdXNwZW5kKHZvaWQpCiB7CiAJc3RydWN0IHNhMTEwMGlycV9zdGF0ZSAqc3QgPSAmc2ExMTAwaXJxX3N0YXRlOwogCkBAIC0yNjQsNyArMjY0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzYTExMDBpcnFfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBzYTExMDBpcnFfcmVzdW1lKHZvaWQpCiB7CiAJc3RydWN0IHNhMTEwMGlycV9zdGF0ZSAqc3QgPSAmc2ExMTAwaXJxX3N0YXRlOwogCkBAIC0yNzcsMjQgKzI3NywxNyBAQAogCiAJCUlDTVIgPSBzdC0+aWNtcjsKIAl9Ci0JcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHNhMTEwMGlycV9zeXNjbGFzcyA9IHsKLQkubmFtZQkJPSAic2ExMXgwLWlycSIsCitzdGF0aWMgc3RydWN0IHN5c2NvcmVfb3BzIHNhMTEwMGlycV9zeXNjb3JlX29wcyA9IHsKIAkuc3VzcGVuZAk9IHNhMTEwMGlycV9zdXNwZW5kLAogCS5yZXN1bWUJCT0gc2ExMTAwaXJxX3Jlc3VtZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBzYTExMDBpcnFfZGV2aWNlID0gewotCS5pZAkJPSAwLAotCS5jbHMJCT0gJnNhMTEwMGlycV9zeXNjbGFzcywKLX07Ci0KIHN0YXRpYyBpbnQgX19pbml0IHNhMTEwMGlycV9pbml0X2RldmljZWZzKHZvaWQpCiB7Ci0Jc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZzYTExMDBpcnFfc3lzY2xhc3MpOwotCXJldHVybiBzeXNkZXZfcmVnaXN0ZXIoJnNhMTEwMGlycV9kZXZpY2UpOworCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZzYTExMDBpcnFfc3lzY29yZV9vcHMpOworCXJldHVybiAwOwogfQogCiBkZXZpY2VfaW5pdGNhbGwoc2ExMTAwaXJxX2luaXRfZGV2aWNlZnMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wbV9ydW50aW1lLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BtX3J1bnRpbWUuYwppbmRleCA5NDkxMmQzLi4yZDFiNjdhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BtX3J1bnRpbWUuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BtX3J1bnRpbWUuYwpAQCAtMTgsMTUyICsxOCw0MSBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCi0jZGVmaW5lIEJJVF9PTkNFIDAKLSNkZWZpbmUgQklUX0FDVElWRSAxCi0jZGVmaW5lIEJJVF9DTEtfRU5BQkxFRCAyCiAKLXN0cnVjdCBwbV9ydW50aW1lX2RhdGEgewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGNsayAqY2xrOwotfTsKLQotc3RhdGljIHZvaWQgX19kZXZyZXNfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnJlcykKLXsKLQlzdHJ1Y3QgcG1fcnVudGltZV9kYXRhICpwcmQgPSByZXM7Ci0KLQlkZXZfZGJnKGRldiwgIl9fZGV2cmVzX3JlbGVhc2UoKVxuIik7Ci0KLQlpZiAodGVzdF9iaXQoQklUX0NMS19FTkFCTEVELCAmcHJkLT5mbGFncykpCi0JCWNsa19kaXNhYmxlKHByZC0+Y2xrKTsKLQotCWlmICh0ZXN0X2JpdChCSVRfQUNUSVZFLCAmcHJkLT5mbGFncykpCi0JCWNsa19wdXQocHJkLT5jbGspOwotfQotCi1zdGF0aWMgc3RydWN0IHBtX3J1bnRpbWVfZGF0YSAqX190b19wcmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiBkZXZyZXNfZmluZChkZXYsIF9fZGV2cmVzX3JlbGVhc2UsIE5VTEwsIE5VTEwpOwotfQotCi1zdGF0aWMgdm9pZCBwbGF0Zm9ybV9wbV9ydW50aW1lX2luaXQoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICAgc3RydWN0IHBtX3J1bnRpbWVfZGF0YSAqcHJkKQotewotCWlmIChwcmQgJiYgIXRlc3RfYW5kX3NldF9iaXQoQklUX09OQ0UsICZwcmQtPmZsYWdzKSkgewotCQlwcmQtPmNsayA9IGNsa19nZXQoZGV2LCBOVUxMKTsKLQkJaWYgKCFJU19FUlIocHJkLT5jbGspKSB7Ci0JCQlzZXRfYml0KEJJVF9BQ1RJVkUsICZwcmQtPmZsYWdzKTsKLQkJCWRldl9pbmZvKGRldiwgImNsb2NrcyBtYW5hZ2VkIGJ5IHJ1bnRpbWUgcG1cbiIpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBwbGF0Zm9ybV9wbV9ydW50aW1lX2J1ZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgIHN0cnVjdCBwbV9ydW50aW1lX2RhdGEgKnByZCkKLXsKLQlpZiAocHJkICYmICF0ZXN0X2FuZF9zZXRfYml0KEJJVF9PTkNFLCAmcHJkLT5mbGFncykpCi0JCWRldl9lcnIoZGV2LCAicnVudGltZSBwbSBzdXNwZW5kIGJlZm9yZSByZXN1bWVcbiIpOwotfQotCi1pbnQgcGxhdGZvcm1fcG1fcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcG1fcnVudGltZV9kYXRhICpwcmQgPSBfX3RvX3ByZChkZXYpOwotCi0JZGV2X2RiZyhkZXYsICJwbGF0Zm9ybV9wbV9ydW50aW1lX3N1c3BlbmQoKVxuIik7Ci0KLQlwbGF0Zm9ybV9wbV9ydW50aW1lX2J1ZyhkZXYsIHByZCk7Ci0KLQlpZiAocHJkICYmIHRlc3RfYml0KEJJVF9BQ1RJVkUsICZwcmQtPmZsYWdzKSkgewotCQljbGtfZGlzYWJsZShwcmQtPmNsayk7Ci0JCWNsZWFyX2JpdChCSVRfQ0xLX0VOQUJMRUQsICZwcmQtPmZsYWdzKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHBsYXRmb3JtX3BtX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcG1fcnVudGltZV9kYXRhICpwcmQgPSBfX3RvX3ByZChkZXYpOwotCi0JZGV2X2RiZyhkZXYsICJwbGF0Zm9ybV9wbV9ydW50aW1lX3Jlc3VtZSgpXG4iKTsKLQotCXBsYXRmb3JtX3BtX3J1bnRpbWVfaW5pdChkZXYsIHByZCk7Ci0KLQlpZiAocHJkICYmIHRlc3RfYml0KEJJVF9BQ1RJVkUsICZwcmQtPmZsYWdzKSkgewotCQljbGtfZW5hYmxlKHByZC0+Y2xrKTsKLQkJc2V0X2JpdChCSVRfQ0xLX0VOQUJMRUQsICZwcmQtPmZsYWdzKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHBsYXRmb3JtX3BtX3J1bnRpbWVfaWRsZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGRlZmF1bHRfcGxhdGZvcm1fcnVudGltZV9pZGxlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAkvKiBzdXNwZW5kIHN5bmNocm9ub3VzbHkgdG8gZGlzYWJsZSBjbG9ja3MgaW1tZWRpYXRlbHkgKi8KIAlyZXR1cm4gcG1fcnVudGltZV9zdXNwZW5kKGRldik7CiB9CiAKLXN0YXRpYyBpbnQgcGxhdGZvcm1fYnVzX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IHBtX3J1bnRpbWVfZGF0YSAqcHJkOworc3RhdGljIHN0cnVjdCBkZXZfcG93ZXJfZG9tYWluIGRlZmF1bHRfcG93ZXJfZG9tYWluID0geworCS5vcHMgPSB7CisJCS5ydW50aW1lX3N1c3BlbmQgPSBwbV9ydW50aW1lX2Nsa19zdXNwZW5kLAorCQkucnVudGltZV9yZXN1bWUgPSBwbV9ydW50aW1lX2Nsa19yZXN1bWUsCisJCS5ydW50aW1lX2lkbGUgPSBkZWZhdWx0X3BsYXRmb3JtX3J1bnRpbWVfaWRsZSwKKwkJVVNFX1BMQVRGT1JNX1BNX1NMRUVQX09QUworCX0sCit9OwogCi0JZGV2X2RiZyhkZXYsICJwbGF0Zm9ybV9idXNfbm90aWZ5KCkgJWxkICFcbiIsIGFjdGlvbik7CisjZGVmaW5lIERFRkFVTFRfUFdSX0RPTUFJTl9QVFIJKCZkZWZhdWx0X3Bvd2VyX2RvbWFpbikKIAotCWlmIChhY3Rpb24gPT0gQlVTX05PVElGWV9CSU5EX0RSSVZFUikgewotCQlwcmQgPSBkZXZyZXNfYWxsb2MoX19kZXZyZXNfcmVsZWFzZSwgc2l6ZW9mKCpwcmQpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKHByZCkKLQkJCWRldnJlc19hZGQoZGV2LCBwcmQpOwotCQllbHNlCi0JCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBhbGxvYyBtZW1vcnkgZm9yIHJ1bnRpbWUgcG1cbiIpOwotCX0KKyNlbHNlCiAKLQlyZXR1cm4gMDsKLX0KLQotI2Vsc2UgLyogQ09ORklHX1BNX1JVTlRJTUUgKi8KLQotc3RhdGljIGludCBwbGF0Zm9ybV9idXNfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci0KLQlkZXZfZGJnKGRldiwgInBsYXRmb3JtX2J1c19ub3RpZnkoKSAlbGQgIVxuIiwgYWN0aW9uKTsKLQotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBCVVNfTk9USUZZX0JJTkRfRFJJVkVSOgotCQljbGsgPSBjbGtfZ2V0KGRldiwgTlVMTCk7Ci0JCWlmICghSVNfRVJSKGNsaykpIHsKLQkJCWNsa19lbmFibGUoY2xrKTsKLQkJCWNsa19wdXQoY2xrKTsKLQkJCWRldl9pbmZvKGRldiwgInJ1bnRpbWUgcG0gZGlzYWJsZWQsIGNsb2NrIGZvcmNlZCBvblxuIik7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBCVVNfTk9USUZZX1VOQk9VTkRfRFJJVkVSOgotCQljbGsgPSBjbGtfZ2V0KGRldiwgTlVMTCk7Ci0JCWlmICghSVNfRVJSKGNsaykpIHsKLQkJCWNsa19kaXNhYmxlKGNsayk7Ci0JCQljbGtfcHV0KGNsayk7Ci0JCQlkZXZfaW5mbyhkZXYsICJydW50aW1lIHBtIGRpc2FibGVkLCBjbG9jayBmb3JjZWQgb2ZmXG4iKTsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KKyNkZWZpbmUgREVGQVVMVF9QV1JfRE9NQUlOX1BUUglOVUxMCiAKICNlbmRpZiAvKiBDT05GSUdfUE1fUlVOVElNRSAqLwogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBsYXRmb3JtX2J1c19ub3RpZmllciA9IHsKLQkubm90aWZpZXJfY2FsbCA9IHBsYXRmb3JtX2J1c19ub3RpZnkKK3N0YXRpYyBzdHJ1Y3QgcG1fY2xrX25vdGlmaWVyX2Jsb2NrIHBsYXRmb3JtX2J1c19ub3RpZmllciA9IHsKKwkucHdyX2RvbWFpbiA9IERFRkFVTFRfUFdSX0RPTUFJTl9QVFIsCisJLmNvbl9pZHMgPSB7IE5VTEwsIH0sCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzaF9wbV9ydW50aW1lX2luaXQodm9pZCkKIHsKLQlidXNfcmVnaXN0ZXJfbm90aWZpZXIoJnBsYXRmb3JtX2J1c190eXBlLCAmcGxhdGZvcm1fYnVzX25vdGlmaWVyKTsKKwlwbV9ydW50aW1lX2Nsa19hZGRfbm90aWZpZXIoJnBsYXRmb3JtX2J1c190eXBlLCAmcGxhdGZvcm1fYnVzX25vdGlmaWVyKTsKIAlyZXR1cm4gMDsKIH0KIGNvcmVfaW5pdGNhbGwoc2hfcG1fcnVudGltZV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9ncGlvLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvZ3Bpby5jCmluZGV4IGQyYWRjZGQuLmJkOWUzMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9ncGlvLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2dwaW8uYwpAQCAtMTcsNyArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CkBAIC0xMzcyLDkgKzEzNzIsNyBAQAogCS5yZXN1bWVfbm9pcnEgPSBvbWFwX21wdWlvX3Jlc3VtZV9ub2lycSwKIH07CiAKLS8qIHVzZSBwbGF0Zm9ybV9kcml2ZXIgZm9yIHRoaXMsIG5vdyB0aGF0IHRoZXJlJ3Mgbm8gbG9uZ2VyIGFueQotICogcG9pbnQgdG8gc3lzX2RldmljZSAob3RoZXIgdGhhbiBub3QgZGlzdHVyYmluZyBvbGQgY29kZSkuCi0gKi8KKy8qIHVzZSBwbGF0Zm9ybV9kcml2ZXIgZm9yIHRoaXMuICovCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwX21wdWlvX2RyaXZlciA9IHsKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAibXB1aW8iLApAQCAtMTc0NSw3ICsxNzQzLDcgQEAKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDJQTFVTKQotc3RhdGljIGludCBvbWFwX2dwaW9fc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3N0YXRpYyBpbnQgb21hcF9ncGlvX3N1c3BlbmQodm9pZCkKIHsKIAlpbnQgaTsKIApAQCAtMTc5NSwxMiArMTc5MywxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG9tYXBfZ3Bpb19yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIG9tYXBfZ3Bpb19yZXN1bWUodm9pZCkKIHsKIAlpbnQgaTsKIAogCWlmICghY3B1X2NsYXNzX2lzX29tYXAyKCkgJiYgIWNwdV9pc19vbWFwMTZ4eCgpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCiAJZm9yIChpID0gMDsgaSA8IGdwaW9fYmFua19jb3VudDsgaSsrKSB7CiAJCXN0cnVjdCBncGlvX2JhbmsgKmJhbmsgPSAmZ3Bpb19iYW5rW2ldOwpAQCAtMTgzNiwyMSArMTgzNCwxMyBAQAogCQlfX3Jhd193cml0ZWwoYmFuay0+c2F2ZWRfd2FrZXVwLCB3YWtlX3NldCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKIAl9Ci0KLQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3Mgb21hcF9ncGlvX3N5c2NsYXNzID0gewotCS5uYW1lCQk9ICJncGlvIiwKK3N0YXRpYyBzdHJ1Y3Qgc3lzY29yZV9vcHMgb21hcF9ncGlvX3N5c2NvcmVfb3BzID0gewogCS5zdXNwZW5kCT0gb21hcF9ncGlvX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSBvbWFwX2dwaW9fcmVzdW1lLAogfTsKIAotc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIG9tYXBfZ3Bpb19kZXZpY2UgPSB7Ci0JLmlkCQk9IDAsCi0JLmNscwkJPSAmb21hcF9ncGlvX3N5c2NsYXNzLAotfTsKLQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMlBMVVMKQEAgLTIxMDgsMjEgKzIwOTgsMTQgQEAKIAogc3RhdGljIGludCBfX2luaXQgb21hcF9ncGlvX3N5c2luaXQodm9pZCkKIHsKLQlpbnQgcmV0ID0gMDsKLQogCW1wdWlvX2luaXQoKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDJQTFVTKQotCWlmIChjcHVfaXNfb21hcDE2eHgoKSB8fCBjcHVfY2xhc3NfaXNfb21hcDIoKSkgewotCQlpZiAocmV0ID09IDApIHsKLQkJCXJldCA9IHN5c2Rldl9jbGFzc19yZWdpc3Rlcigmb21hcF9ncGlvX3N5c2NsYXNzKTsKLQkJCWlmIChyZXQgPT0gMCkKLQkJCQlyZXQgPSBzeXNkZXZfcmVnaXN0ZXIoJm9tYXBfZ3Bpb19kZXZpY2UpOwotCQl9Ci0JfQorCWlmIChjcHVfaXNfb21hcDE2eHgoKSB8fCBjcHVfY2xhc3NfaXNfb21hcDIoKSkKKwkJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJm9tYXBfZ3Bpb19zeXNjb3JlX29wcyk7CiAjZW5kaWYKIAotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIGFyY2hfaW5pdGNhbGwob21hcF9ncGlvX3N5c2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL29tYXBfZGV2aWNlLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvb21hcF9kZXZpY2UuYwppbmRleCA5YmJkYTlhLi5hMzdiOGViIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvb21hcF9kZXZpY2UuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvb21hcF9kZXZpY2UuYwpAQCAtNTM2LDYgKzUzNiwyOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IF9vZF9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKworCXJldHVybiBvbWFwX2RldmljZV9pZGxlKHBkZXYpOworfQorCitzdGF0aWMgaW50IF9vZF9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCisJcmV0dXJuIG9tYXBfZGV2aWNlX2VuYWJsZShwZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBkZXZfcG93ZXJfZG9tYWluIG9tYXBfZGV2aWNlX3Bvd2VyX2RvbWFpbiA9IHsKKwkub3BzID0geworCQkucnVudGltZV9zdXNwZW5kID0gX29kX3J1bnRpbWVfc3VzcGVuZCwKKwkJLnJ1bnRpbWVfcmVzdW1lID0gX29kX3J1bnRpbWVfcmVzdW1lLAorCQlVU0VfUExBVEZPUk1fUE1fU0xFRVBfT1BTCisJfQorfTsKKwogLyoqCiAgKiBvbWFwX2RldmljZV9yZWdpc3RlciAtIHJlZ2lzdGVyIGFuIG9tYXBfZGV2aWNlIHdpdGggb25lIG9tYXBfaHdtb2QKICAqIEBvZDogc3RydWN0IG9tYXBfZGV2aWNlICogdG8gcmVnaXN0ZXIKQEAgLTU0OSw2ICs1NzEsNyBAQAogCXByX2RlYnVnKCJvbWFwX2RldmljZTogJXM6IHJlZ2lzdGVyaW5nXG4iLCBvZC0+cGRldi5uYW1lKTsKIAogCW9kLT5wZGV2LmRldi5wYXJlbnQgPSAmb21hcF9kZXZpY2VfcGFyZW50OworCW9kLT5wZGV2LmRldi5wd3JfZG9tYWluID0gJm9tYXBfZGV2aWNlX3Bvd2VyX2RvbWFpbjsKIAlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZvZC0+cGRldik7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtcHhhL2dwaW8uYyBiL2FyY2gvYXJtL3BsYXQtcHhhL2dwaW8uYwppbmRleCBkY2UwODhmLi40OGViYjk0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXB4YS9ncGlvLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1weGEvZ3Bpby5jCkBAIC0xNSw3ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KQEAgLTI5NSw3ICsyOTUsNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHB4YV9ncGlvX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBweGFfZ3Bpb19zdXNwZW5kKHZvaWQpCiB7CiAJc3RydWN0IHB4YV9ncGlvX2NoaXAgKmM7CiAJaW50IGdwaW87CkBAIC0zMTIsNyArMzEyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBweGFfZ3Bpb19yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHB4YV9ncGlvX3Jlc3VtZSh2b2lkKQogewogCXN0cnVjdCBweGFfZ3Bpb19jaGlwICpjOwogCWludCBncGlvOwpAQCAtMzI2LDIyICszMjYsMTMgQEAKIAkJX19yYXdfd3JpdGVsKGMtPnNhdmVkX2dmZXIsIGMtPnJlZ2Jhc2UgKyBHRkVSX09GRlNFVCk7CiAJCV9fcmF3X3dyaXRlbChjLT5zYXZlZF9ncGRyLCBjLT5yZWdiYXNlICsgR1BEUl9PRkZTRVQpOwogCX0KLQlyZXR1cm4gMDsKIH0KICNlbHNlCiAjZGVmaW5lIHB4YV9ncGlvX3N1c3BlbmQJTlVMTAogI2RlZmluZSBweGFfZ3Bpb19yZXN1bWUJCU5VTEwKICNlbmRpZgogCi1zdHJ1Y3Qgc3lzZGV2X2NsYXNzIHB4YV9ncGlvX3N5c2NsYXNzID0gewotCS5uYW1lCQk9ICJncGlvIiwKK3N0cnVjdCBzeXNjb3JlX29wcyBweGFfZ3Bpb19zeXNjb3JlX29wcyA9IHsKIAkuc3VzcGVuZAk9IHB4YV9ncGlvX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSBweGFfZ3Bpb19yZXN1bWUsCiB9OwotCi1zdGF0aWMgaW50IF9faW5pdCBweGFfZ3Bpb19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHN5c2Rldl9jbGFzc19yZWdpc3RlcigmcHhhX2dwaW9fc3lzY2xhc3MpOwotfQotCi1jb3JlX2luaXRjYWxsKHB4YV9ncGlvX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1weGEvbWZwLmMgYi9hcmNoL2FybS9wbGF0LXB4YS9tZnAuYwppbmRleCBhOWFhNWFkLi5iZTEyZWFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXB4YS9tZnAuYworKysgYi9hcmNoL2FybS9wbGF0LXB4YS9tZnAuYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogCiAjaW5jbHVkZSA8cGxhdC9tZnAuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2RtYS5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2RtYS5jCmluZGV4IDI3ZWE4NTIuLmMxMGQxMGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9kbWEuYworKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZG1hLmMKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgpAQCAtMTE5NSwxOSArMTE5NSwxMiBAQAogCiBFWFBPUlRfU1lNQk9MKHMzYzI0MTBfZG1hX2dldHBvc2l0aW9uKTsKIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqdG9fZG1hX2NoYW4oc3RydWN0IHN5c19kZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHMzYzI0MTBfZG1hX2NoYW4sIGRldik7Ci19Ci0KLS8qIHN5c3RlbSBkZXZpY2UgY2xhc3MgKi8KKy8qIHN5c3RlbSBjb3JlIG9wZXJhdGlvbnMgKi8KIAogI2lmZGVmIENPTkZJR19QTQogCi1zdGF0aWMgaW50IHMzYzI0MTBfZG1hX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIHZvaWQgczNjMjQxMF9kbWFfc3VzcGVuZF9jaGFuKHMzYzI0MTBfZG1hX2NoYW4gKmNwKQogewotCXN0cnVjdCBzM2MyNDEwX2RtYV9jaGFuICpjcCA9IHRvX2RtYV9jaGFuKGRldik7Ci0KIAlwcmludGsoS0VSTl9ERUJVRyAic3VzcGVuZGluZyBkbWEgY2hhbm5lbCAlZFxuIiwgY3AtPm51bWJlcik7CiAKIAlpZiAoZG1hX3JkcmVnKGNwLCBTM0MyNDEwX0RNQV9ETUFTS1RSSUcpICYgUzNDMjQxMF9ETUFTS1RSSUdfT04pIHsKQEAgLTEyMjIsMTMgKzEyMTUsMjEgQEAKIAogCQlzM2MyNDEwX2RtYV9kb3N0b3AoY3ApOwogCX0KK30KKworc3RhdGljIGludCBzM2MyNDEwX2RtYV9zdXNwZW5kKHZvaWQpCit7CisJc3RydWN0IHMzYzI0MTBfZG1hX2NoYW4gKmNwID0gczNjMjQxMF9jaGFuczsKKwlpbnQgY2hhbm5lbDsKKworCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBkbWFfY2hhbm5lbHM7IGNwKyssIGNoYW5uZWwrKykKKwkJczNjMjQxMF9kbWFfc3VzcGVuZF9jaGFuKGNwKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHMzYzI0MTBfZG1hX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgczNjMjQxMF9kbWFfcmVzdW1lX2NoYW4oc3RydWN0IHMzYzI0MTBfZG1hX2NoYW4gKmNwKQogewotCXN0cnVjdCBzM2MyNDEwX2RtYV9jaGFuICpjcCA9IHRvX2RtYV9jaGFuKGRldik7CiAJdW5zaWduZWQgaW50IG5vID0gY3AtPm51bWJlciB8IERNQUNIX0xPV19MRVZFTDsKIAogCS8qIHJlc3RvcmUgY2hhbm5lbCdzIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gKi8KQEAgLTEyNDksMTMgKzEyNTAsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgczNjMjQxMF9kbWFfcmVzdW1lKHZvaWQpCit7CisJc3RydWN0IHMzYzI0MTBfZG1hX2NoYW4gKmNwID0gczNjMjQxMF9jaGFucyArIGRtYV9jaGFubmVscyAtIDE7CisJaW50IGNoYW5uZWw7CisKKwlmb3IgKGNoYW5uZWwgPSBkbWFfY2hhbm5lbHMgLSAxOyBjaGFubmVsID49IDA7IGNwKyssIGNoYW5uZWwtLSkKKwkJczNjMjQxMF9kbWFfcmVzdW1lX2NoYW4oY3ApOworfQorCiAjZWxzZQogI2RlZmluZSBzM2MyNDEwX2RtYV9zdXNwZW5kIE5VTEwKICNkZWZpbmUgczNjMjQxMF9kbWFfcmVzdW1lICBOVUxMCiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKLXN0cnVjdCBzeXNkZXZfY2xhc3MgZG1hX3N5c2NsYXNzID0gewotCS5uYW1lCQk9ICJzM2MyNHh4LWRtYSIsCitzdHJ1Y3Qgc3lzY29yZV9vcHMgZG1hX3N5c2NvcmVfb3BzID0gewogCS5zdXNwZW5kCT0gczNjMjQxMF9kbWFfc3VzcGVuZCwKIAkucmVzdW1lCQk9IHMzYzI0MTBfZG1hX3Jlc3VtZSwKIH07CkBAIC0xMjY5LDM5ICsxMjc4LDE0IEBACiAKIC8qIGluaXRpYWxpc2F0aW9uIGNvZGUgKi8KIAotc3RhdGljIGludCBfX2luaXQgczNjMjR4eF9kbWFfc3lzY2xhc3NfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgczNjMjR4eF9kbWFfc3lzY29yZV9pbml0KHZvaWQpCiB7Ci0JaW50IHJldCA9IHN5c2Rldl9jbGFzc19yZWdpc3RlcigmZG1hX3N5c2NsYXNzKTsKLQotCWlmIChyZXQgIT0gMCkKLQkJcHJpbnRrKEtFUk5fRVJSICJkbWEgc3lzY2xhc3MgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1jb3JlX2luaXRjYWxsKHMzYzI0eHhfZG1hX3N5c2NsYXNzX2luaXQpOwotCi1zdGF0aWMgaW50IF9faW5pdCBzM2MyNHh4X2RtYV9zeXNkZXZfcmVnaXN0ZXIodm9pZCkKLXsKLQlzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY3AgPSBzM2MyNDEwX2NoYW5zOwotCWludCBjaGFubmVsLCByZXQ7Ci0KLQlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgZG1hX2NoYW5uZWxzOyBjcCsrLCBjaGFubmVsKyspIHsKLQkJY3AtPmRldi5jbHMgPSAmZG1hX3N5c2NsYXNzOwotCQljcC0+ZGV2LmlkICA9IGNoYW5uZWw7Ci0JCXJldCA9IHN5c2Rldl9yZWdpc3RlcigmY3AtPmRldik7Ci0KLQkJaWYgKHJldCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJlcnJvciByZWdpc3RlcmluZyBkZXYgZm9yIGRtYSAlZFxuIiwKLQkJCSAgICAgICBjaGFubmVsKTsKLSAJCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQorCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZkbWFfc3lzY29yZV9vcHMpOwogCiAJcmV0dXJuIDA7CiB9CiAKLWxhdGVfaW5pdGNhbGwoczNjMjR4eF9kbWFfc3lzZGV2X3JlZ2lzdGVyKTsKK2xhdGVfaW5pdGNhbGwoczNjMjR4eF9kbWFfc3lzY29yZV9pbml0KTsKIAogaW50IF9faW5pdCBzM2MyNHh4X2RtYV9pbml0KHVuc2lnbmVkIGludCBjaGFubmVscywgdW5zaWduZWQgaW50IGlycSwKIAkJCSAgICB1bnNpZ25lZCBpbnQgc3RyaWRlKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2lycS1wbS5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2lycS1wbS5jCmluZGV4IGMzNjI0ZDguLjBlZmIyZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pcnEtcG0uYworKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaXJxLXBtLmMKQEAgLTE0LDcgKzE0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKICNpbmNsdWRlIDxwbGF0L2NwdS5oPgpAQCAtNjUsNyArNjQsNyBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgc2F2ZV9laW50Zmx0WzRdOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgc2F2ZV9laW50bWFzazsKIAotaW50IHMzYzI0eHhfaXJxX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoraW50IHMzYzI0eHhfaXJxX3N1c3BlbmQodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIApAQCAtODEsNyArODAsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgczNjMjR4eF9pcnFfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCit2b2lkIHMzYzI0eHhfaXJxX3Jlc3VtZSh2b2lkKQogewogCXVuc2lnbmVkIGludCBpOwogCkBAIC05Myw2ICs5Miw0IEBACiAKIAlzM2NfcG1fZG9fcmVzdG9yZShpcnFfc2F2ZSwgQVJSQVlfU0laRShpcnFfc2F2ZSkpOwogCV9fcmF3X3dyaXRlbChzYXZlX2VpbnRtYXNrLCBTM0MyNFhYX0VJTlRNQVNLKTsKLQotCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvaXJxLXBtLmMgYi9hcmNoL2FybS9wbGF0LXM1cC9pcnEtcG0uYwppbmRleCA1MjU5YWQ0Li4zMjdhY2IzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9pcnEtcG0uYworKysgYi9hcmNoL2FybS9wbGF0LXM1cC9pcnEtcG0uYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KIAogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAjaW5jbHVkZSA8cGxhdC9pcnFzLmg+CkBAIC03NywxNyArNzYsMTUgQEAKIAlTQVZFX0lURU0oUzVQX0VJTlRfTUFTSygzKSksCiB9OwogCi1pbnQgczNjMjR4eF9pcnFfc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitpbnQgczNjMjR4eF9pcnFfc3VzcGVuZCh2b2lkKQogewogCXMzY19wbV9kb19zYXZlKGVpbnRfc2F2ZSwgQVJSQVlfU0laRShlaW50X3NhdmUpKTsKIAogCXJldHVybiAwOwogfQogCi1pbnQgczNjMjR4eF9pcnFfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCit2b2lkIHMzYzI0eHhfaXJxX3Jlc3VtZSh2b2lkKQogewogCXMzY19wbV9kb19yZXN0b3JlKGVpbnRfc2F2ZSwgQVJSQVlfU0laRShlaW50X3NhdmUpKTsKLQotCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2NwdS5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9jcHUuaAppbmRleCBjZWRmZmY1Li4zYWVkYWMwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2NwdS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvY3B1LmgKQEAgLTY4LDYgKzY4LDEyIEBACiBzdHJ1Y3Qgc3lzX3RpbWVyOwogZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgczNjMjR4eF90aW1lcjsKIAorZXh0ZXJuIHN0cnVjdCBzeXNjb3JlX29wcyBzM2MyNDEwX3BtX3N5c2NvcmVfb3BzOworZXh0ZXJuIHN0cnVjdCBzeXNjb3JlX29wcyBzM2MyNDEyX3BtX3N5c2NvcmVfb3BzOworZXh0ZXJuIHN0cnVjdCBzeXNjb3JlX29wcyBzM2MyNDE2X3BtX3N5c2NvcmVfb3BzOworZXh0ZXJuIHN0cnVjdCBzeXNjb3JlX29wcyBzM2MyNDR4X3BtX3N5c2NvcmVfb3BzOworZXh0ZXJuIHN0cnVjdCBzeXNjb3JlX29wcyBzM2M2NHh4X2lycV9zeXNjb3JlX29wczsKKwogLyogc3lzdGVtIGRldmljZSBjbGFzc2VzICovCiAKIGV4dGVybiBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHMzYzI0MTBfc3lzY2xhc3M7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3BtLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3BtLmgKaW5kZXggOTM3Y2MyYS4uN2ZiNmY2YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9wbS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcG0uaApAQCAtMTAzLDE0ICsxMDMsMTYgQEAKIAogI2lmZGVmIENPTkZJR19QTQogZXh0ZXJuIGludCBzM2NfaXJxZXh0X3dha2Uoc3RydWN0IGlycV9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgc3RhdGUpOwotZXh0ZXJuIGludCBzM2MyNHh4X2lycV9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7Ci1leHRlcm4gaW50IHMzYzI0eHhfaXJxX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgczNjMjR4eF9pcnFfc3VzcGVuZCh2b2lkKTsKK2V4dGVybiB2b2lkIHMzYzI0eHhfaXJxX3Jlc3VtZSh2b2lkKTsKICNlbHNlCiAjZGVmaW5lIHMzY19pcnFleHRfd2FrZSBOVUxMCiAjZGVmaW5lIHMzYzI0eHhfaXJxX3N1c3BlbmQgTlVMTAogI2RlZmluZSBzM2MyNHh4X2lycV9yZXN1bWUgIE5VTEwKICNlbmRpZgogCitleHRlcm4gc3RydWN0IHN5c2NvcmVfb3BzIHMzYzI0eHhfaXJxX3N5c2NvcmVfb3BzOworCiAvKiBQTSBkZWJ1ZyBmdW5jdGlvbnMgKi8KIAogI2lmZGVmIENPTkZJR19TQU1TVU5HX1BNX0RFQlVHCmRpZmYgLS1naXQgYS9hcmNoL2FybS92ZnAvdmZwbW9kdWxlLmMgYi9hcmNoL2FybS92ZnAvdmZwbW9kdWxlLmMKaW5kZXggZjc0Njk1MC4uZjI1ZTdlYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vdmZwL3ZmcG1vZHVsZS5jCisrKyBiL2FyY2gvYXJtL3ZmcC92ZnBtb2R1bGUuYwpAQCAtMzk4LDkgKzM5OCw5IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogCi1zdGF0aWMgaW50IHZmcF9wbV9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgdmZwX3BtX3N1c3BlbmQodm9pZCkKIHsKIAlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gY3VycmVudF90aHJlYWRfaW5mbygpOwogCXUzMiBmcGV4YyA9IGZtcngoRlBFWEMpOwpAQCAtNDIwLDM0ICs0MjAsMjUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB2ZnBfcG1fcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCB2ZnBfcG1fcmVzdW1lKHZvaWQpCiB7CiAJLyogZW5zdXJlIHdlIGhhdmUgYWNjZXNzIHRvIHRoZSB2ZnAgKi8KIAl2ZnBfZW5hYmxlKE5VTEwpOwogCiAJLyogYW5kIGRpc2FibGUgaXQgdG8gZW5zdXJlIHRoZSBuZXh0IHVzYWdlIHJlc3RvcmVzIHRoZSBzdGF0ZSAqLwogCWZteHIoRlBFWEMsIGZtcngoRlBFWEMpICYgfkZQRVhDX0VOKTsKLQotCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyB2ZnBfcG1fc3lzY2xhc3MgPSB7Ci0JLm5hbWUJCT0gInZmcCIsCitzdGF0aWMgc3RydWN0IHN5c2NvcmVfb3BzIHZmcF9wbV9zeXNjb3JlX29wcyA9IHsKIAkuc3VzcGVuZAk9IHZmcF9wbV9zdXNwZW5kLAogCS5yZXN1bWUJCT0gdmZwX3BtX3Jlc3VtZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSB2ZnBfcG1fc3lzZGV2ID0gewotCS5jbHMJPSAmdmZwX3BtX3N5c2NsYXNzLAotfTsKLQogc3RhdGljIHZvaWQgdmZwX3BtX2luaXQodm9pZCkKIHsKLQlzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJnZmcF9wbV9zeXNjbGFzcyk7Ci0Jc3lzZGV2X3JlZ2lzdGVyKCZ2ZnBfcG1fc3lzZGV2KTsKKwlyZWdpc3Rlcl9zeXNjb3JlX29wcygmdmZwX3BtX3N5c2NvcmVfb3BzKTsKIH0KIAotCiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIHZmcF9wbV9pbml0KHZvaWQpIHsgfQogI2VuZGlmIC8qIENPTkZJR19QTSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbnRjLmMgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2ludGMuYwppbmRleCAyMWNlMzVmLi4zZTM2NDYxIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2ludGMuYworKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2ludGMuYwpAQCAtMTIsNyArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KIApAQCAtMjEsNyArMjEsNiBAQAogc3RydWN0IGludGMgewogCXZvaWQgX19pb21lbQkJKnJlZ3M7CiAJc3RydWN0IGlycV9jaGlwCQljaGlwOwotCXN0cnVjdCBzeXNfZGV2aWNlCXN5c2RldjsKICNpZmRlZiBDT05GSUdfUE0KIAl1bnNpZ25lZCBsb25nCQlzdXNwZW5kX2lwcjsKIAl1bnNpZ25lZCBsb25nCQlzYXZlZF9pcHJbNjRdOwpAQCAtMTQ2LDkgKzE0NSw4IEBACiAJaW50YzAuc3VzcGVuZF9pcHIgPSBvZmZzZXQ7CiB9CiAKLXN0YXRpYyBpbnQgaW50Y19zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpzZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitzdGF0aWMgaW50IGludGNfc3VzcGVuZCh2b2lkKQogewotCXN0cnVjdCBpbnRjICppbnRjID0gY29udGFpbmVyX29mKHNkZXYsIHN0cnVjdCBpbnRjLCBzeXNkZXYpOwogCWludCBpOwogCiAJaWYgKHVubGlrZWx5KCFpcnFzX2Rpc2FibGVkKCkpKSB7CkBAIC0xNTYsMjggKzE1NCwyNSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAodW5saWtlbHkoIWludGMtPnN1c3BlbmRfaXByKSkgeworCWlmICh1bmxpa2VseSghaW50YzAuc3VzcGVuZF9pcHIpKSB7CiAJCXByX2VycigiaW50Y19zdXNwZW5kOiBzdXNwZW5kX2lwciBub3QgaW5pdGlhbGl6ZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewotCQlpbnRjLT5zYXZlZF9pcHJbaV0gPSBpbnRjX3JlYWRsKGludGMsIElOVFBSMCArIDQgKiBpKTsKLQkJaW50Y193cml0ZWwoaW50YywgSU5UUFIwICsgNCAqIGksIGludGMtPnN1c3BlbmRfaXByKTsKKwkJaW50YzAuc2F2ZWRfaXByW2ldID0gaW50Y19yZWFkbCgmaW50YzAsIElOVFBSMCArIDQgKiBpKTsKKwkJaW50Y193cml0ZWwoJmludGMwLCBJTlRQUjAgKyA0ICogaSwgaW50YzAuc3VzcGVuZF9pcHIpOwogCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGludGNfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpzZGV2KQorc3RhdGljIGludCBpbnRjX3Jlc3VtZSh2b2lkKQogewotCXN0cnVjdCBpbnRjICppbnRjID0gY29udGFpbmVyX29mKHNkZXYsIHN0cnVjdCBpbnRjLCBzeXNkZXYpOwogCWludCBpOwogCi0JV0FSTl9PTighaXJxc19kaXNhYmxlZCgpKTsKLQogCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQotCQlpbnRjX3dyaXRlbChpbnRjLCBJTlRQUjAgKyA0ICogaSwgaW50Yy0+c2F2ZWRfaXByW2ldKTsKKwkJaW50Y193cml0ZWwoJmludGMwLCBJTlRQUjAgKyA0ICogaSwgaW50YzAuc2F2ZWRfaXByW2ldKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTg2LDI3ICsxODEsMTggQEAKICNkZWZpbmUgaW50Y19yZXN1bWUJTlVMTAogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIGludGNfY2xhc3MgPSB7Ci0JLm5hbWUJCT0gImludGMiLAorc3RhdGljIHN0cnVjdCBzeXNjb3JlX29wcyBpbnRjX3N5c2NvcmVfb3BzID0gewogCS5zdXNwZW5kCT0gaW50Y19zdXNwZW5kLAogCS5yZXN1bWUJCT0gaW50Y19yZXN1bWUsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBpbnRjX2luaXRfc3lzZGV2KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpbnRjX2luaXRfc3lzY29yZSh2b2lkKQogewotCWludCByZXQ7CisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJmludGNfc3lzY29yZV9vcHMpOwogCi0JcmV0ID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZpbnRjX2NsYXNzKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JaW50YzAuc3lzZGV2LmlkID0gMDsKLQlpbnRjMC5zeXNkZXYuY2xzID0gJmludGNfY2xhc3M7Ci0JcmV0ID0gc3lzZGV2X3JlZ2lzdGVyKCZpbnRjMC5zeXNkZXYpOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KLWRldmljZV9pbml0Y2FsbChpbnRjX2luaXRfc3lzZGV2KTsKK2RldmljZV9pbml0Y2FsbChpbnRjX2luaXRfc3lzY29yZSk7CiAKIHVuc2lnbmVkIGxvbmcgaW50Y19nZXRfcGVuZGluZyh1bnNpZ25lZCBpbnQgZ3JvdXApCiB7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9ubWkuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL25taS5jCmluZGV4IDBiNWY3MmYuLjQwMWViMWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL25taS5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL25taS5jCkBAIC0xMiw3ICsxMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L25taS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgpAQCAtMTk2LDQzICsxOTYsMzEgQEAKIAogLyogU3VzcGVuZC9yZXN1bWUgc3VwcG9ydCAqLwogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBubWlfd2R0X3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBubWlfd2R0X3N1c3BlbmQodm9pZCkKIHsKIAlubWlfd2R0X3N0b3AoKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBubWlfd2R0X3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgbm1pX3dkdF9yZXN1bWUodm9pZCkKIHsKIAlpZiAobm1pX2FjdGl2ZSkKIAkJbm1pX3dkdF9zdGFydCgpOwotCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBubWlfc3lzY2xhc3MgPSB7Ci0JLm5hbWUJCT0gRFJWX05BTUUsCitzdGF0aWMgc3RydWN0IHN5c2NvcmVfb3BzIG5taV9zeXNjb3JlX29wcyA9IHsKIAkucmVzdW1lCQk9IG5taV93ZHRfcmVzdW1lLAogCS5zdXNwZW5kCT0gbm1pX3dkdF9zdXNwZW5kLAogfTsKIAotc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIGRldmljZV9ubWlfd2R0ID0gewotCS5pZAk9IDAsCi0JLmNscwk9ICZubWlfc3lzY2xhc3MsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X25taV93ZHRfc3lzZnModm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbm1pX3dkdF9zeXNjb3JlKHZvaWQpCiB7Ci0JaW50IGVycm9yOworCWlmIChubWlfYWN0aXZlKQorCQlyZWdpc3Rlcl9zeXNjb3JlX29wcygmbm1pX3N5c2NvcmVfb3BzKTsKIAotCWlmICghbm1pX2FjdGl2ZSkKLQkJcmV0dXJuIDA7Ci0KLQllcnJvciA9IHN5c2Rldl9jbGFzc19yZWdpc3Rlcigmbm1pX3N5c2NsYXNzKTsKLQlpZiAoIWVycm9yKQotCQllcnJvciA9IHN5c2Rldl9yZWdpc3RlcigmZGV2aWNlX25taV93ZHQpOwotCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gMDsKIH0KLWxhdGVfaW5pdGNhbGwoaW5pdF9ubWlfd2R0X3N5c2ZzKTsKK2xhdGVfaW5pdGNhbGwoaW5pdF9ubWlfd2R0X3N5c2NvcmUpOwogCiAjZW5kaWYJLyogQ09ORklHX1BNICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3RpbWUtdHMuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3RpbWUtdHMuYwppbmRleCBjZGI0YmViLi45ZTliNjBkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC90aW1lLXRzLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdGltZS10cy5jCkBAIC0yMywyOSArMjMsNiBAQAogI2luY2x1ZGUgPGFzbS9ncHRpbWVycy5oPgogI2luY2x1ZGUgPGFzbS9ubWkuaD4KIAotLyogQWNjZWxlcmF0b3JzIGZvciBzY2hlZF9jbG9jaygpCi0gKiBjb252ZXJ0IGZyb20gY3ljbGVzKDY0Yml0cykgPT4gbmFub3NlY29uZHMgKDY0Yml0cykKLSAqICBiYXNpYyBlcXVhdGlvbjoKLSAqCQlucyA9IGN5Y2xlcyAvIChmcmVxIC8gbnNfcGVyX3NlYykKLSAqCQlucyA9IGN5Y2xlcyAqIChuc19wZXJfc2VjIC8gZnJlcSkKLSAqCQlucyA9IGN5Y2xlcyAqICgxMF45IC8gKGNwdV9raHogKiAxMF4zKSkKLSAqCQlucyA9IGN5Y2xlcyAqICgxMF42IC8gY3B1X2toeikKLSAqCi0gKglUaGVuIHdlIHVzZSBzY2FsaW5nIG1hdGggKHN1Z2dlc3RlZCBieSBnZW9yZ2VAbXZpc3RhLmNvbSkgdG8gZ2V0OgotICoJCW5zID0gY3ljbGVzICogKDEwXjYgKiBTQyAvIGNwdV9raHopIC8gU0MKLSAqCQlucyA9IGN5Y2xlcyAqIGN5YzJuc19zY2FsZSAvIFNDCi0gKgotICoJQW5kIHNpbmNlIFNDIGlzIGEgY29uc3RhbnQgcG93ZXIgb2YgdHdvLCB3ZSBjYW4gY29udmVydCB0aGUgZGl2Ci0gKiAgaW50byBhIHNoaWZ0LgotICoKLSAqICBXZSBjYW4gdXNlIGtoeiBkaXZpc29yIGluc3RlYWQgb2YgbWh6IHRvIGtlZXAgYSBiZXR0ZXIgcHJlY2lzaW9uLCBzaW5jZQotICogIGN5YzJuc19zY2FsZSBpcyBsaW1pdGVkIHRvIDEwXjYgKiAyXjEwLCB3aGljaCBmaXRzIGluIDMyIGJpdHMuCi0gKiAgKG1hdGhpZXUuZGVzbm95ZXJzQHBvbHltdGwuY2EpCi0gKgotICoJCQktam9obnN0dWxAdXMuaWJtLmNvbSAibWF0aCBpcyBoYXJkLCBsZXRzIGdvIHNob3BwaW5nISIKLSAqLwotCi0jZGVmaW5lIENZQzJOU19TQ0FMRV9GQUNUT1IgMTAgLyogMl4xMCwgY2FyZWZ1bGx5IGNob3NlbiAqLwogCiAjaWYgZGVmaW5lZChDT05GSUdfQ1lDTEVTX0NMT0NLU09VUkNFKQogCkBAIC02Myw3ICs0MCw2IEBACiAJLnJhdGluZwkJPSA0MDAsCiAJLnJlYWQJCT0gYmZpbl9yZWFkX2N5Y2xlcywKIAkubWFzawkJPSBDTE9DS1NPVVJDRV9NQVNLKDY0KSwKLQkuc2hpZnQJCT0gQ1lDMk5TX1NDQUxFX0ZBQ1RPUiwKIAkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCkBAIC03NSwxMCArNTEsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBiZmluX2NzX2N5Y2xlc19pbml0KHZvaWQpCiB7Ci0JYmZpbl9jc19jeWNsZXMubXVsdCA9IFwKLQkJY2xvY2tzb3VyY2VfaHoybXVsdChnZXRfY2NsaygpLCBiZmluX2NzX2N5Y2xlcy5zaGlmdCk7Ci0KLQlpZiAoY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmJmaW5fY3NfY3ljbGVzKSkKKwlpZiAoY2xvY2tzb3VyY2VfcmVnaXN0ZXJfaHooJmJmaW5fY3NfY3ljbGVzLCBnZXRfY2NsaygpKSkKIAkJcGFuaWMoImZhaWxlZCB0byByZWdpc3RlciBjbG9ja3NvdXJjZSIpOwogCiAJcmV0dXJuIDA7CkBAIC0xMTEsNyArODQsNiBAQAogCS5yYXRpbmcJCT0gMzUwLAogCS5yZWFkCQk9IGJmaW5fcmVhZF9ncHRpbWVyMCwKIAkubWFzawkJPSBDTE9DS1NPVVJDRV9NQVNLKDMyKSwKLQkuc2hpZnQJCT0gQ1lDMk5TX1NDQUxFX0ZBQ1RPUiwKIAkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCkBAIC0xMjUsMTAgKzk3LDcgQEAKIHsKIAlzZXR1cF9ncHRpbWVyMCgpOwogCi0JYmZpbl9jc19ncHRpbWVyMC5tdWx0ID0gXAotCQljbG9ja3NvdXJjZV9oejJtdWx0KGdldF9zY2xrKCksIGJmaW5fY3NfZ3B0aW1lcjAuc2hpZnQpOwotCi0JaWYgKGNsb2Nrc291cmNlX3JlZ2lzdGVyKCZiZmluX2NzX2dwdGltZXIwKSkKKwlpZiAoY2xvY2tzb3VyY2VfcmVnaXN0ZXJfaHooJmJmaW5fY3NfZ3B0aW1lcjAsIGdldF9zY2xrKCkpKQogCQlwYW5pYygiZmFpbGVkIHRvIHJlZ2lzdGVyIGNsb2Nrc291cmNlIik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vZHBtYy5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9kcG1jLmMKaW5kZXggMzgyMDk5Zi4uNWU0MTEyZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9kcG1jLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9kcG1jLmMKQEAgLTE5LDkgKzE5LDYgQEAKIAogI2RlZmluZSBEUklWRVJfTkFNRSAiYmZpbiBkcG1jIgogCi0jZGVmaW5lIGRwcmludGsobXNnLi4uKSBcCi0JY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsIERSSVZFUl9OQU1FLCBtc2cpCi0KIHN0cnVjdCBiZmluX2RwbWNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9zbXAuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vc21wLmMKaW5kZXggOGJjZTVlZC4uMWZiZDk0YyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9zbXAuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL3NtcC5jCkBAIC0xNzcsNiArMTc3LDkgQEAKIAl3aGlsZSAobXNnX3F1ZXVlLT5jb3VudCkgewogCQltc2cgPSAmbXNnX3F1ZXVlLT5pcGlfbWVzc2FnZVttc2dfcXVldWUtPmhlYWRdOwogCQlzd2l0Y2ggKG1zZy0+dHlwZSkgeworCQljYXNlIEJGSU5fSVBJX1JFU0NIRURVTEU6CisJCQlzY2hlZHVsZXJfaXBpKCk7CisJCQlicmVhazsKIAkJY2FzZSBCRklOX0lQSV9DQUxMX0ZVTkM6CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc2dfcXVldWUtPmxvY2ssIGZsYWdzKTsKIAkJCWlwaV9jYWxsX2Z1bmN0aW9uKGNwdSwgbXNnKTsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvc21wLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3NtcC5jCmluZGV4IDRjOWUzZTEuLjY2Y2M3NTYgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9zbXAuYwpAQCAtMzQyLDE1ICszNDIsMTggQEAKIAogCWlwaSA9IFJFR19SRChpbnRyX3ZlY3QsIGlycV9yZWdzW3NtcF9wcm9jZXNzb3JfaWQoKV0sIHJ3X2lwaSk7CiAKKwlpZiAoaXBpLnZlY3RvciAmIElQSV9TQ0hFRFVMRSkgeworCQlzY2hlZHVsZXJfaXBpKCk7CisJfQogCWlmIChpcGkudmVjdG9yICYgSVBJX0NBTEwpIHsKLQkgICAgICAgICBmdW5jKGluZm8pOworCQlmdW5jKGluZm8pOwogCX0KIAlpZiAoaXBpLnZlY3RvciAmIElQSV9GTFVTSF9UTEIpIHsKLQkJICAgICBpZiAoZmx1c2hfbW0gPT0gRkxVU0hfQUxMKQotCQkJIF9fZmx1c2hfdGxiX2FsbCgpOwotCQkgICAgIGVsc2UgaWYgKGZsdXNoX3ZtYSA9PSBGTFVTSF9BTEwpCisJCWlmIChmbHVzaF9tbSA9PSBGTFVTSF9BTEwpCisJCQlfX2ZsdXNoX3RsYl9hbGwoKTsKKwkJZWxzZSBpZiAoZmx1c2hfdm1hID09IEZMVVNIX0FMTCkKIAkJCV9fZmx1c2hfdGxiX21tKGZsdXNoX21tKTsKLQkJICAgICBlbHNlCisJCWVsc2UKIAkJCV9fZmx1c2hfdGxiX3BhZ2UoZmx1c2hfdm1hLCBmbHVzaF9hZGRyKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYyBiL2FyY2gvaWE2NC9rZXJuZWwvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYwppbmRleCAyMmY2MTUyLi5mMDliMTc0IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCkBAIC0yMyw4ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvcHJvY2Vzc29yLmg+CiAKLSNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCAiYWNwaS1jcHVmcmVxIiwgbXNnKQotCiBNT0RVTEVfQVVUSE9SKCJWZW5rYXRlc2ggUGFsbGlwYWRpIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkFDUEkgUHJvY2Vzc29yIFAtU3RhdGVzIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpAQCAtNDcsMTIgKzQ1LDEyIEBACiB7CiAJczY0IHJldHZhbDsKIAotCWRwcmludGsoInByb2Nlc3Nvcl9zZXRfcHN0YXRlXG4iKTsKKwlwcl9kZWJ1ZygicHJvY2Vzc29yX3NldF9wc3RhdGVcbiIpOwogCiAJcmV0dmFsID0gaWE2NF9wYWxfc2V0X3BzdGF0ZSgodTY0KXZhbHVlKTsKIAogCWlmIChyZXR2YWwpIHsKLQkJZHByaW50aygiRmFpbGVkIHRvIHNldCBmcmVxIHRvIDB4JXgsIHdpdGggZXJyb3IgMHglbHhcbiIsCisJCXByX2RlYnVnKCJGYWlsZWQgdG8gc2V0IGZyZXEgdG8gMHgleCwgd2l0aCBlcnJvciAweCVseFxuIiwKIAkJICAgICAgICB2YWx1ZSwgcmV0dmFsKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtNjcsMTQgKzY1LDE0IEBACiAJdTY0CXBzdGF0ZV9pbmRleCA9IDA7CiAJczY0IAlyZXR2YWw7CiAKLQlkcHJpbnRrKCJwcm9jZXNzb3JfZ2V0X3BzdGF0ZVxuIik7CisJcHJfZGVidWcoInByb2Nlc3Nvcl9nZXRfcHN0YXRlXG4iKTsKIAogCXJldHZhbCA9IGlhNjRfcGFsX2dldF9wc3RhdGUoJnBzdGF0ZV9pbmRleCwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBTF9HRVRfUFNUQVRFX1RZUEVfSU5TVEFOVCk7CiAJKnZhbHVlID0gKHUzMikgcHN0YXRlX2luZGV4OwogCiAJaWYgKHJldHZhbCkKLQkJZHByaW50aygiRmFpbGVkIHRvIGdldCBjdXJyZW50IGZyZXEgd2l0aCAiCisJCXByX2RlYnVnKCJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgZnJlcSB3aXRoICIKIAkJCSJlcnJvciAweCVseCwgaWR4IDB4JXhcbiIsIHJldHZhbCwgKnZhbHVlKTsKIAogCXJldHVybiAoaW50KXJldHZhbDsKQEAgLTkwLDcgKzg4LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGk7CiAKLQlkcHJpbnRrKCJleHRyYWN0X2Nsb2NrXG4iKTsKKwlwcl9kZWJ1ZygiZXh0cmFjdF9jbG9ja1xuIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50OyBpKyspIHsKIAkJaWYgKHZhbHVlID09IGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaV0uc3RhdHVzKQpAQCAtMTEwLDcgKzEwOCw3IEBACiAJY3B1bWFza190CQlzYXZlZF9tYXNrOwogCXVuc2lnbmVkIGxvbmcgCQljbG9ja19mcmVxOwogCi0JZHByaW50aygicHJvY2Vzc29yX2dldF9mcmVxXG4iKTsKKwlwcl9kZWJ1ZygicHJvY2Vzc29yX2dldF9mcmVxXG4iKTsKIAogCXNhdmVkX21hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CiAJc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgY3B1bWFza19vZihjcHUpKTsKQEAgLTE0OCw3ICsxNDYsNyBAQAogCWNwdW1hc2tfdAkJc2F2ZWRfbWFzazsKIAlpbnQJCQlyZXR2YWw7CiAKLQlkcHJpbnRrKCJwcm9jZXNzb3Jfc2V0X2ZyZXFcbiIpOworCXByX2RlYnVnKCJwcm9jZXNzb3Jfc2V0X2ZyZXFcbiIpOwogCiAJc2F2ZWRfbWFzayA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKIAlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCBjcHVtYXNrX29mKGNwdSkpOwpAQCAtMTU5LDE2ICsxNTcsMTYgQEAKIAogCWlmIChzdGF0ZSA9PSBkYXRhLT5hY3BpX2RhdGEuc3RhdGUpIHsKIAkJaWYgKHVubGlrZWx5KGRhdGEtPnJlc3VtZSkpIHsKLQkJCWRwcmludGsoIkNhbGxlZCBhZnRlciByZXN1bWUsIHJlc2V0dGluZyB0byBQJWRcbiIsIHN0YXRlKTsKKwkJCXByX2RlYnVnKCJDYWxsZWQgYWZ0ZXIgcmVzdW1lLCByZXNldHRpbmcgdG8gUCVkXG4iLCBzdGF0ZSk7CiAJCQlkYXRhLT5yZXN1bWUgPSAwOwogCQl9IGVsc2UgewotCQkJZHByaW50aygiQWxyZWFkeSBhdCB0YXJnZXQgc3RhdGUgKFAlZClcbiIsIHN0YXRlKTsKKwkJCXByX2RlYnVnKCJBbHJlYWR5IGF0IHRhcmdldCBzdGF0ZSAoUCVkKVxuIiwgc3RhdGUpOwogCQkJcmV0dmFsID0gMDsKIAkJCWdvdG8gbWlncmF0ZV9lbmQ7CiAJCX0KIAl9CiAKLQlkcHJpbnRrKCJUcmFuc2l0aW9uaW5nIGZyb20gUCVkIHRvIFAlZFxuIiwKKwlwcl9kZWJ1ZygiVHJhbnNpdGlvbmluZyBmcm9tIFAlZCB0byBQJWRcbiIsCiAJCWRhdGEtPmFjcGlfZGF0YS5zdGF0ZSwgc3RhdGUpOwogCiAJLyogY3B1ZnJlcSBmcmVxdWVuY3kgc3RydWN0ICovCkBAIC0xODYsNyArMTg0LDcgQEAKIAogCXZhbHVlID0gKHUzMikgZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tzdGF0ZV0uY29udHJvbDsKIAotCWRwcmludGsoIlRyYW5zaXRpb25pbmcgdG8gc3RhdGU6IDB4JTA4eFxuIiwgdmFsdWUpOworCXByX2RlYnVnKCJUcmFuc2l0aW9uaW5nIHRvIHN0YXRlOiAweCUwOHhcbiIsIHZhbHVlKTsKIAogCXJldCA9IHByb2Nlc3Nvcl9zZXRfcHN0YXRlKHZhbHVlKTsKIAlpZiAocmV0KSB7CkBAIC0yMTksNyArMjE3LDcgQEAKIHsKIAlzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvICpkYXRhID0gYWNwaV9pb19kYXRhW2NwdV07CiAKLQlkcHJpbnRrKCJhY3BpX2NwdWZyZXFfZ2V0XG4iKTsKKwlwcl9kZWJ1ZygiYWNwaV9jcHVmcmVxX2dldFxuIik7CiAKIAlyZXR1cm4gcHJvY2Vzc29yX2dldF9mcmVxKGRhdGEsIGNwdSk7CiB9CkBAIC0yMzUsNyArMjMzLDcgQEAKIAl1bnNpZ25lZCBpbnQgbmV4dF9zdGF0ZSA9IDA7CiAJdW5zaWduZWQgaW50IHJlc3VsdCA9IDA7CiAKLQlkcHJpbnRrKCJhY3BpX2NwdWZyZXFfc2V0cG9saWN5XG4iKTsKKwlwcl9kZWJ1ZygiYWNwaV9jcHVmcmVxX3NldHBvbGljeVxuIik7CiAKIAlyZXN1bHQgPSBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LAogCQkJZGF0YS0+ZnJlcV90YWJsZSwgdGFyZ2V0X2ZyZXEsIHJlbGF0aW9uLCAmbmV4dF9zdGF0ZSk7CkBAIC0yNTUsNyArMjUzLDcgQEAKIAl1bnNpZ25lZCBpbnQgcmVzdWx0ID0gMDsKIAlzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvICpkYXRhID0gYWNwaV9pb19kYXRhW3BvbGljeS0+Y3B1XTsKIAotCWRwcmludGsoImFjcGlfY3B1ZnJlcV92ZXJpZnlcbiIpOworCXByX2RlYnVnKCJhY3BpX2NwdWZyZXFfdmVyaWZ5XG4iKTsKIAogCXJlc3VsdCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksCiAJCQlkYXRhLT5mcmVxX3RhYmxlKTsKQEAgLTI3Myw3ICsyNzEsNyBAQAogCXN0cnVjdCBjcHVmcmVxX2FjcGlfaW8JKmRhdGE7CiAJdW5zaWduZWQgaW50CQlyZXN1bHQgPSAwOwogCi0JZHByaW50aygiYWNwaV9jcHVmcmVxX2NwdV9pbml0XG4iKTsKKwlwcl9kZWJ1ZygiYWNwaV9jcHVmcmVxX2NwdV9pbml0XG4iKTsKIAogCWRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkYXRhKQpAQCAtMjg4LDcgKzI4Niw3IEBACiAKIAkvKiBjYXBhYmlsaXR5IGNoZWNrICovCiAJaWYgKGRhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudCA8PSAxKSB7Ci0JCWRwcmludGsoIk5vIFAtU3RhdGVzXG4iKTsKKwkJcHJfZGVidWcoIk5vIFAtU3RhdGVzXG4iKTsKIAkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJZ290byBlcnJfdW5yZWc7CiAJfQpAQCAtMjk3LDcgKzI5NSw3IEBACiAJCQkJCUFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFKSB8fAogCSAgICAoZGF0YS0+YWNwaV9kYXRhLnN0YXR1c19yZWdpc3Rlci5zcGFjZV9pZCAhPQogCQkJCQlBQ1BJX0FEUl9TUEFDRV9GSVhFRF9IQVJEV0FSRSkpIHsKLQkJZHByaW50aygiVW5zdXBwb3J0ZWQgYWRkcmVzcyBzcGFjZSBbJWQsICVkXVxuIiwKKwkJcHJfZGVidWcoIlVuc3VwcG9ydGVkIGFkZHJlc3Mgc3BhY2UgWyVkLCAlZF1cbiIsCiAJCQkodTMyKSAoZGF0YS0+YWNwaV9kYXRhLmNvbnRyb2xfcmVnaXN0ZXIuc3BhY2VfaWQpLAogCQkJKHUzMikgKGRhdGEtPmFjcGlfZGF0YS5zdGF0dXNfcmVnaXN0ZXIuc3BhY2VfaWQpKTsKIAkJcmVzdWx0ID0gLUVOT0RFVjsKQEAgLTM0OCw3ICszNDYsNyBAQAogCSAgICAgICAiYWN0aXZhdGVkLlxuIiwgY3B1KTsKIAogCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQ7IGkrKykKLQkJZHByaW50aygiICAgICAlY1AlZDogJWQgTUh6LCAlZCBtVywgJWQgdVMsICVkIHVTLCAweCV4IDB4JXhcbiIsCisJCXByX2RlYnVnKCIgICAgICVjUCVkOiAlZCBNSHosICVkIG1XLCAlZCB1UywgJWQgdVMsIDB4JXggMHgleFxuIiwKIAkJCShpID09IGRhdGEtPmFjcGlfZGF0YS5zdGF0ZT8nKic6JyAnKSwgaSwKIAkJCSh1MzIpIGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3ksCiAJCQkodTMyKSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2ldLnBvd2VyLApAQCAtMzgzLDcgKzM4MSw3IEBACiB7CiAJc3RydWN0IGNwdWZyZXFfYWNwaV9pbyAqZGF0YSA9IGFjcGlfaW9fZGF0YVtwb2xpY3ktPmNwdV07CiAKLQlkcHJpbnRrKCJhY3BpX2NwdWZyZXFfY3B1X2V4aXRcbiIpOworCXByX2RlYnVnKCJhY3BpX2NwdWZyZXFfY3B1X2V4aXRcbiIpOwogCiAJaWYgKGRhdGEpIHsKIAkJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9saWN5LT5jcHUpOwpAQCAtNDE4LDcgKzQxNiw3IEBACiBzdGF0aWMgaW50IF9faW5pdAogYWNwaV9jcHVmcmVxX2luaXQgKHZvaWQpCiB7Ci0JZHByaW50aygiYWNwaV9jcHVmcmVxX2luaXRcbiIpOworCXByX2RlYnVnKCJhY3BpX2NwdWZyZXFfaW5pdFxuIik7CiAKICAJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2NwdWZyZXFfZHJpdmVyKTsKIH0KQEAgLTQyNyw3ICs0MjUsNyBAQAogc3RhdGljIHZvaWQgX19leGl0CiBhY3BpX2NwdWZyZXFfZXhpdCAodm9pZCkKIHsKLQlkcHJpbnRrKCJhY3BpX2NwdWZyZXFfZXhpdFxuIik7CisJcHJfZGVidWcoImFjcGlfY3B1ZnJlcV9leGl0XG4iKTsKIAogCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfY3B1ZnJlcV9kcml2ZXIpOwogCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvY3ljbG9uZS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9jeWNsb25lLmMKaW5kZXggMWI4MTFjNi4uZjY0MDk3YiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9jeWNsb25lLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9jeWNsb25lLmMKQEAgLTMxLDggKzMxLDYgQEAKICAgICAgICAgLnJhdGluZyAgICAgICAgID0gMzAwLAogICAgICAgICAucmVhZCAgICAgICAgICAgPSByZWFkX2N5Y2xvbmUsCiAgICAgICAgIC5tYXNrICAgICAgICAgICA9ICgxTEwgPDwgNDApIC0gMSwKLSAgICAgICAgLm11bHQgICAgICAgICAgID0gMCwgLyp0byBiZSBjYWxjdWxhdGVkKi8KLSAgICAgICAgLnNoaWZ0ICAgICAgICAgID0gMTYsCiAgICAgICAgIC5mbGFncyAgICAgICAgICA9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAogfTsKIApAQCAtMTE4LDkgKzExNiw3IEBACiAJLyogaW5pdGlhbGl6ZSBsYXN0IHRpY2sgKi8KIAljeWNsb25lX21jID0gY3ljbG9uZV90aW1lcjsKIAljbG9ja3NvdXJjZV9jeWNsb25lLmZzeXNfbW1pbyA9IGN5Y2xvbmVfdGltZXI7Ci0JY2xvY2tzb3VyY2VfY3ljbG9uZS5tdWx0ID0gY2xvY2tzb3VyY2VfaHoybXVsdChDWUNMT05FX1RJTUVSX0ZSRVEsCi0JCQkJCQljbG9ja3NvdXJjZV9jeWNsb25lLnNoaWZ0KTsKLQljbG9ja3NvdXJjZV9yZWdpc3RlcigmY2xvY2tzb3VyY2VfY3ljbG9uZSk7CisJY2xvY2tzb3VyY2VfcmVnaXN0ZXJfaHooJmNsb2Nrc291cmNlX2N5Y2xvbmUsIENZQ0xPTkVfVElNRVJfRlJFUSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvaXJxX2lhNjQuYyBiL2FyY2gvaWE2NC9rZXJuZWwvaXJxX2lhNjQuYwppbmRleCA1YjcwNDc0Li43ODJjM2EzNSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9pcnFfaWE2NC5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvaXJxX2lhNjQuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL2ludHJpbnNpY3MuaD4KQEAgLTQ5Niw2ICs0OTcsNyBAQAogCQkJc21wX2xvY2FsX2ZsdXNoX3RsYigpOwogCQkJa3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KGlycSwgZGVzYyk7CiAJCX0gZWxzZSBpZiAodW5saWtlbHkoSVNfUkVTQ0hFRFVMRSh2ZWN0b3IpKSkgeworCQkJc2NoZWR1bGVyX2lwaSgpOwogCQkJa3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KGlycSwgZGVzYyk7CiAJCX0gZWxzZSB7CiAJCQlpYTY0X3NldHJlZyhfSUE2NF9SRUdfQ1JfVFBSLCB2ZWN0b3IpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC90aW1lLmMgYi9hcmNoL2lhNjQva2VybmVsL3RpbWUuYwppbmRleCAxNTZhZDgwLi4wNDQ0MGNjIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3RpbWUuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3RpbWUuYwpAQCAtNzMsOCArNzMsNiBAQAogCS5yYXRpbmcgICAgICAgICA9IDM1MCwKIAkucmVhZCAgICAgICAgICAgPSBpdGNfZ2V0X2N5Y2xlcywKIAkubWFzayAgICAgICAgICAgPSBDTE9DS1NPVVJDRV9NQVNLKDY0KSwKLQkubXVsdCAgICAgICAgICAgPSAwLCAvKnRvIGJlIGNhbGN1bGF0ZWQqLwotCS5zaGlmdCAgICAgICAgICA9IDE2LAogCS5mbGFncyAgICAgICAgICA9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAogI2lmZGVmIENPTkZJR19QQVJBVklSVAogCS5yZXN1bWUJCT0gcGFyYXZpcnRfY2xvY2tzb3VyY2VfcmVzdW1lLApAQCAtMzY1LDExICszNjMsOCBAQAogCWlhNjRfY3B1X2xvY2FsX3RpY2soKTsKIAogCWlmICghaXRjX2Nsb2Nrc291cmNlKSB7Ci0JCS8qIFNvcnQgb3V0IG11bHQvc2hpZnQgdmFsdWVzOiAqLwotCQljbG9ja3NvdXJjZV9pdGMubXVsdCA9Ci0JCQljbG9ja3NvdXJjZV9oejJtdWx0KGxvY2FsX2NwdV9kYXRhLT5pdGNfZnJlcSwKLQkJCQkJCWNsb2Nrc291cmNlX2l0Yy5zaGlmdCk7Ci0JCWNsb2Nrc291cmNlX3JlZ2lzdGVyKCZjbG9ja3NvdXJjZV9pdGMpOworCQljbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmY2xvY2tzb3VyY2VfaXRjLAorCQkJCQkJbG9jYWxfY3B1X2RhdGEtPml0Y19mcmVxKTsKIAkJaXRjX2Nsb2Nrc291cmNlID0gJmNsb2Nrc291cmNlX2l0YzsKIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL3NuMi90aW1lci5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvdGltZXIuYwppbmRleCAyMWQ2ZjA5Li5jMzRlZmRhIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL3NuMi90aW1lci5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3RpbWVyLmMKQEAgLTMzLDggKzMzLDYgQEAKICAgICAgICAgLnJhdGluZyAgICAgICAgID0gNDUwLAogICAgICAgICAucmVhZCAgICAgICAgICAgPSByZWFkX3NuMiwKICAgICAgICAgLm1hc2sgICAgICAgICAgID0gKDFMTCA8PCA1NSkgLSAxLAotICAgICAgICAubXVsdCAgICAgICAgICAgPSAwLAotICAgICAgICAuc2hpZnQgICAgICAgICAgPSAxMCwKICAgICAgICAgLmZsYWdzICAgICAgICAgID0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCkBAIC01Nyw5ICs1NSw3IEBACiB2b2lkIF9faW5pdCBzbl90aW1lcl9pbml0KHZvaWQpCiB7CiAJY2xvY2tzb3VyY2Vfc24yLmZzeXNfbW1pbyA9IFJUQ19DT1VOVEVSX0FERFI7Ci0JY2xvY2tzb3VyY2Vfc24yLm11bHQgPSBjbG9ja3NvdXJjZV9oejJtdWx0KHNuX3J0Y19jeWNsZXNfcGVyX3NlY29uZCwKLQkJCQkJCQljbG9ja3NvdXJjZV9zbjIuc2hpZnQpOwotCWNsb2Nrc291cmNlX3JlZ2lzdGVyKCZjbG9ja3NvdXJjZV9zbjIpOworCWNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KCZjbG9ja3NvdXJjZV9zbjIsIHNuX3J0Y19jeWNsZXNfcGVyX3NlY29uZCk7CiAKIAlpYTY0X3VkZWxheSA9ICZpYTY0X3NuX3VkZWxheTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC94ZW4vaXJxX3hlbi5jIGIvYXJjaC9pYTY0L3hlbi9pcnFfeGVuLmMKaW5kZXggMTA4YmI4NS4uYjI3OWUxNCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3hlbi9pcnFfeGVuLmMKKysrIGIvYXJjaC9pYTY0L3hlbi9pcnFfeGVuLmMKQEAgLTkyLDYgKzkyLDggQEAKIHN0YXRpYyBpbnQgeGVuX3NsYWJfcmVhZHk7CiAKICNpZmRlZiBDT05GSUdfU01QCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKwogLyogRHVtbXkgc3R1Yi4gVGhvdWdoIHdlIG1heSBjaGVjayBYRU5fUkVTQ0hFRFVMRV9WRUNUT1IgYmVmb3JlIF9fZG9fSVJRLAogICogaXQgZW5kcyB1cCB0byBpc3N1ZSBzZXZlcmFsIG1lbW9yeSBhY2Nlc3NlcyB1cG9uIHBlcmNwdSBkYXRhIGFuZAogICogdGh1cyBhZGRzIHVubmVjZXNzYXJ5IHRyYWZmaWMgdG8gb3RoZXIgcGF0aHMuCkBAIC05OSw3ICsxMDEsMTMgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdAogeGVuX2R1bW15X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogeworCXJldHVybiBJUlFfSEFORExFRDsKK30KIAorc3RhdGljIGlycXJldHVybl90Cit4ZW5fcmVzY2hlZF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzY2hlZHVsZXJfaXBpKCk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCkBAIC0xMTAsNyArMTE4LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHhlbl9yZXNjaGVkX2lycWFjdGlvbiA9IHsKLQkuaGFuZGxlciA9CXhlbl9kdW1teV9oYW5kbGVyLAorCS5oYW5kbGVyID0JeGVuX3Jlc2NoZWRfaGFuZGxlciwKIAkuZmxhZ3MgPQlJUlFGX0RJU0FCTEVELAogCS5uYW1lID0JCSJyZXNjaGVkIgogfTsKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvc21wLmMgYi9hcmNoL20zMnIva2VybmVsL3NtcC5jCmluZGV4IDMxY2VmMjAuLmZjMTBiMzkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9zbXAuYwpAQCAtMTIyLDggKzEyMiw2IEBACiAgKgogICogRGVzY3JpcHRpb246ICBUaGlzIHJvdXRpbmUgZXhlY3V0ZXMgb24gQ1BVIHdoaWNoIHJlY2VpdmVkCiAgKiAgICAgICAgICAgICAgICdSRVNDSEVEVUxFX0lQSScuCi0gKiAgICAgICAgICAgICAgIFJlc2NoZWR1bGluZyBpcyBwcm9jZXNzZWQgYXQgdGhlIGV4aXQgb2YgaW50ZXJydXB0Ci0gKiAgICAgICAgICAgICAgIG9wZXJhdGlvbi4KICAqCiAgKiBCb3JuIG9uIERhdGU6IDIwMDIuMDIuMDUKICAqCkBAIC0xMzgsNyArMTM2LDcgQEAKICAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogdm9pZCBzbXBfcmVzY2hlZHVsZV9pbnRlcnJ1cHQodm9pZCkKIHsKLQkvKiBub3RoaW5nIHRvIGRvICovCisJc2NoZWR1bGVyX2lwaSgpOwogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2F0YXJpL2F0YWtleWIuYyBiL2FyY2gvbTY4ay9hdGFyaS9hdGFrZXliLmMKaW5kZXggYjk5NTUxMy4uOTUwMjJiMCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2F0YXJpL2F0YWtleWIuYworKysgYi9hcmNoL202OGsvYXRhcmkvYXRha2V5Yi5jCkBAIC0zNiwxMyArMzYsMTAgQEAKIAogLyogSG9vayBmb3IgTUlESSBzZXJpYWwgZHJpdmVyICovCiB2b2lkICgqYXRhcmlfTUlESV9pbnRlcnJ1cHRfaG9vaykgKHZvaWQpOwotLyogSG9vayBmb3IgbW91c2UgZHJpdmVyICovCi12b2lkICgqYXRhcmlfbW91c2VfaW50ZXJydXB0X2hvb2spIChjaGFyICopOwogLyogSG9vayBmb3Iga2V5Ym9hcmQgaW5wdXRkZXYgIGRyaXZlciAqLwogdm9pZCAoKmF0YXJpX2lucHV0X2tleWJvYXJkX2ludGVycnVwdF9ob29rKSAodW5zaWduZWQgY2hhciwgY2hhcik7CiAvKiBIb29rIGZvciBtb3VzZSBpbnB1dGRldiAgZHJpdmVyICovCiB2b2lkICgqYXRhcmlfaW5wdXRfbW91c2VfaW50ZXJydXB0X2hvb2spIChjaGFyICopOwotRVhQT1JUX1NZTUJPTChhdGFyaV9tb3VzZV9pbnRlcnJ1cHRfaG9vayk7CiBFWFBPUlRfU1lNQk9MKGF0YXJpX2lucHV0X2tleWJvYXJkX2ludGVycnVwdF9ob29rKTsKIEVYUE9SVF9TWU1CT0woYXRhcmlfaW5wdXRfbW91c2VfaW50ZXJydXB0X2hvb2spOwogCkBAIC0yNjMsOCArMjYwLDggQEAKIAkJCWtiX3N0YXRlLmJ1ZltrYl9zdGF0ZS5sZW4rK10gPSBzY2FuY29kZTsKIAkJCWlmIChrYl9zdGF0ZS5sZW4gPT0gMykgewogCQkJCWtiX3N0YXRlLnN0YXRlID0gS0VZQk9BUkQ7Ci0JCQkJaWYgKGF0YXJpX21vdXNlX2ludGVycnVwdF9ob29rKQotCQkJCQlhdGFyaV9tb3VzZV9pbnRlcnJ1cHRfaG9vayhrYl9zdGF0ZS5idWYpOworCQkJCWlmIChhdGFyaV9pbnB1dF9tb3VzZV9pbnRlcnJ1cHRfaG9vaykKKwkJCQkJYXRhcmlfaW5wdXRfbW91c2VfaW50ZXJydXB0X2hvb2soa2Jfc3RhdGUuYnVmKTsKIAkJCX0KIAkJCWJyZWFrOwogCkBAIC01NzUsNyArNTcyLDcgQEAKIAlrYl9zdGF0ZS5sZW4gPSAwOwogCiAJZXJyb3IgPSByZXF1ZXN0X2lycShJUlFfTUZQX0FDSUEsIGF0YXJpX2tleWJvYXJkX2ludGVycnVwdCwKLQkJCSAgICBJUlFfVFlQRV9TTE9XLCAia2V5Ym9hcmQvbW91c2UvTUlESSIsCisJCQkgICAgSVJRX1RZUEVfU0xPVywgImtleWJvYXJkLG1vdXNlLE1JREkiLAogCQkJICAgIGF0YXJpX2tleWJvYXJkX2ludGVycnVwdCk7CiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvYXRhcmkvc3RkbWEuYyBiL2FyY2gvbTY4ay9hdGFyaS9zdGRtYS5jCmluZGV4IDYwNDMyOWYuLmRkYmY0M2MgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hdGFyaS9zdGRtYS5jCisrKyBiL2FyY2gvbTY4ay9hdGFyaS9zdGRtYS5jCkBAIC0xODAsNyArMTgwLDcgQEAKIHsKIAlzdGRtYV9pc3IgPSBOVUxMOwogCWlmIChyZXF1ZXN0X2lycShJUlFfTUZQX0ZEQywgc3RkbWFfaW50LCBJUlFfVFlQRV9TTE9XIHwgSVJRRl9TSEFSRUQsCi0JCQkiU1QtRE1BOiBmbG9wcHkvQUNTSS9JREUvRmFsY29uLVNDU0kiLCBzdGRtYV9pbnQpKQorCQkJIlNULURNQSBmbG9wcHksQUNTSSxJREUsRmFsY29uLVNDU0kiLCBzdGRtYV9pbnQpKQogCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyIFNULURNQSBpbnRlcnJ1cHRcbiIpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vYXRhcmlrYi5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2F0YXJpa2IuaAppbmRleCA1NDZlN2RhLi42OGYzNjIyIDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vYXRhcmlrYi5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9hdGFyaWtiLmgKQEAgLTM0LDggKzM0LDYgQEAKIAogLyogSG9vayBmb3IgTUlESSBzZXJpYWwgZHJpdmVyICovCiBleHRlcm4gdm9pZCAoKmF0YXJpX01JRElfaW50ZXJydXB0X2hvb2spICh2b2lkKTsKLS8qIEhvb2sgZm9yIG1vdXNlIGRyaXZlciAqLwotZXh0ZXJuIHZvaWQgKCphdGFyaV9tb3VzZV9pbnRlcnJ1cHRfaG9vaykgKGNoYXIgKik7CiAvKiBIb29rIGZvciBrZXlib2FyZCBpbnB1dGRldiAgZHJpdmVyICovCiBleHRlcm4gdm9pZCAoKmF0YXJpX2lucHV0X2tleWJvYXJkX2ludGVycnVwdF9ob29rKSAodW5zaWduZWQgY2hhciwgY2hhcik7CiAvKiBIb29rIGZvciBtb3VzZSBpbnB1dGRldiAgZHJpdmVyICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vYml0b3BzX21tLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vYml0b3BzX21tLmgKaW5kZXggOWQ2OWY2ZS4uZTkwMjBmOCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2JpdG9wc19tbS5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9iaXRvcHNfbW0uaApAQCAtMTgxLDE0ICsxODEsMTUgQEAKIHsKIAljb25zdCB1bnNpZ25lZCBsb25nICpwID0gdmFkZHI7CiAJaW50IHJlcyA9IDMyOworCXVuc2lnbmVkIGludCB3b3JkczsKIAl1bnNpZ25lZCBsb25nIG51bTsKIAogCWlmICghc2l6ZSkKIAkJcmV0dXJuIDA7CiAKLQlzaXplID0gKHNpemUgKyAzMSkgPj4gNTsKKwl3b3JkcyA9IChzaXplICsgMzEpID4+IDU7CiAJd2hpbGUgKCEobnVtID0gfipwKyspKSB7Ci0JCWlmICghLS1zaXplKQorCQlpZiAoIS0td29yZHMpCiAJCQlnb3RvIG91dDsKIAl9CiAKQEAgLTE5Niw3ICsxOTcsOCBAQAogCQkJICAgICAgOiAiPWQiIChyZXMpIDogImQiIChudW0gJiAtbnVtKSk7CiAJcmVzIF49IDMxOwogb3V0OgotCXJldHVybiAoKGxvbmcpcCAtIChsb25nKXZhZGRyIC0gNCkgKiA4ICsgcmVzOworCXJlcyArPSAoKGxvbmcpcCAtIChsb25nKXZhZGRyIC0gNCkgKiA4OworCXJldHVybiByZXMgPCBzaXplID8gcmVzIDogc2l6ZTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZmluZF9uZXh0X3plcm9fYml0KGNvbnN0IHVuc2lnbmVkIGxvbmcgKnZhZGRyLCBpbnQgc2l6ZSwKQEAgLTIxNSwyNyArMjE3LDMyIEBACiAJCS8qIExvb2sgZm9yIHplcm8gaW4gZmlyc3QgbG9uZ3dvcmQgKi8KIAkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJiZmZmbyAlMXsjMCwjMH0sJTAiCiAJCQkJICAgICAgOiAiPWQiIChyZXMpIDogImQiIChudW0gJiAtbnVtKSk7Ci0JCWlmIChyZXMgPCAzMikKLQkJCXJldHVybiBvZmZzZXQgKyAocmVzIF4gMzEpOworCQlpZiAocmVzIDwgMzIpIHsKKwkJCW9mZnNldCArPSByZXMgXiAzMTsKKwkJCXJldHVybiBvZmZzZXQgPCBzaXplID8gb2Zmc2V0IDogc2l6ZTsKKwkJfQogCQlvZmZzZXQgKz0gMzI7CisKKwkJaWYgKG9mZnNldCA+PSBzaXplKQorCQkJcmV0dXJuIHNpemU7CiAJfQogCS8qIE5vIHplcm8geWV0LCBzZWFyY2ggcmVtYWluaW5nIGZ1bGwgYnl0ZXMgZm9yIGEgemVybyAqLwotCXJlcyA9IGZpbmRfZmlyc3RfemVyb19iaXQocCwgc2l6ZSAtICgobG9uZylwIC0gKGxvbmcpdmFkZHIpICogOCk7Ci0JcmV0dXJuIG9mZnNldCArIHJlczsKKwlyZXR1cm4gb2Zmc2V0ICsgZmluZF9maXJzdF96ZXJvX2JpdChwLCBzaXplIC0gb2Zmc2V0KTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZmluZF9maXJzdF9iaXQoY29uc3QgdW5zaWduZWQgbG9uZyAqdmFkZHIsIHVuc2lnbmVkIHNpemUpCiB7CiAJY29uc3QgdW5zaWduZWQgbG9uZyAqcCA9IHZhZGRyOwogCWludCByZXMgPSAzMjsKKwl1bnNpZ25lZCBpbnQgd29yZHM7CiAJdW5zaWduZWQgbG9uZyBudW07CiAKIAlpZiAoIXNpemUpCiAJCXJldHVybiAwOwogCi0Jc2l6ZSA9IChzaXplICsgMzEpID4+IDU7CisJd29yZHMgPSAoc2l6ZSArIDMxKSA+PiA1OwogCXdoaWxlICghKG51bSA9ICpwKyspKSB7Ci0JCWlmICghLS1zaXplKQorCQlpZiAoIS0td29yZHMpCiAJCQlnb3RvIG91dDsKIAl9CiAKQEAgLTI0Myw3ICsyNTAsOCBAQAogCQkJICAgICAgOiAiPWQiIChyZXMpIDogImQiIChudW0gJiAtbnVtKSk7CiAJcmVzIF49IDMxOwogb3V0OgotCXJldHVybiAoKGxvbmcpcCAtIChsb25nKXZhZGRyIC0gNCkgKiA4ICsgcmVzOworCXJlcyArPSAoKGxvbmcpcCAtIChsb25nKXZhZGRyIC0gNCkgKiA4OworCXJldHVybiByZXMgPCBzaXplID8gcmVzIDogc2l6ZTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZmluZF9uZXh0X2JpdChjb25zdCB1bnNpZ25lZCBsb25nICp2YWRkciwgaW50IHNpemUsCkBAIC0yNjIsMTMgKzI3MCwxNyBAQAogCQkvKiBMb29rIGZvciBvbmUgaW4gZmlyc3QgbG9uZ3dvcmQgKi8KIAkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJiZmZmbyAlMXsjMCwjMH0sJTAiCiAJCQkJICAgICAgOiAiPWQiIChyZXMpIDogImQiIChudW0gJiAtbnVtKSk7Ci0JCWlmIChyZXMgPCAzMikKLQkJCXJldHVybiBvZmZzZXQgKyAocmVzIF4gMzEpOworCQlpZiAocmVzIDwgMzIpIHsKKwkJCW9mZnNldCArPSByZXMgXiAzMTsKKwkJCXJldHVybiBvZmZzZXQgPCBzaXplID8gb2Zmc2V0IDogc2l6ZTsKKwkJfQogCQlvZmZzZXQgKz0gMzI7CisKKwkJaWYgKG9mZnNldCA+PSBzaXplKQorCQkJcmV0dXJuIHNpemU7CiAJfQogCS8qIE5vIG9uZSB5ZXQsIHNlYXJjaCByZW1haW5pbmcgZnVsbCBieXRlcyBmb3IgYSBvbmUgKi8KLQlyZXMgPSBmaW5kX2ZpcnN0X2JpdChwLCBzaXplIC0gKChsb25nKXAgLSAobG9uZyl2YWRkcikgKiA4KTsKLQlyZXR1cm4gb2Zmc2V0ICsgcmVzOworCXJldHVybiBvZmZzZXQgKyBmaW5kX2ZpcnN0X2JpdChwLCBzaXplIC0gb2Zmc2V0KTsKIH0KIAogLyoKQEAgLTM2NiwyMyArMzc4LDI1IEBACiBzdGF0aWMgaW5saW5lIGludCBmaW5kX2ZpcnN0X3plcm9fYml0X2xlKGNvbnN0IHZvaWQgKnZhZGRyLCB1bnNpZ25lZCBzaXplKQogewogCWNvbnN0IHVuc2lnbmVkIGxvbmcgKnAgPSB2YWRkciwgKmFkZHIgPSB2YWRkcjsKLQlpbnQgcmVzOworCWludCByZXMgPSAwOworCXVuc2lnbmVkIGludCB3b3JkczsKIAogCWlmICghc2l6ZSkKIAkJcmV0dXJuIDA7CiAKLQlzaXplID0gKHNpemUgPj4gNSkgKyAoKHNpemUgJiAzMSkgPiAwKTsKLQl3aGlsZSAoKnArKyA9PSB+MFVMKQotCXsKLQkJaWYgKC0tc2l6ZSA9PSAwKQotCQkJcmV0dXJuIChwIC0gYWRkcikgPDwgNTsKKwl3b3JkcyA9IChzaXplID4+IDUpICsgKChzaXplICYgMzEpID4gMCk7CisJd2hpbGUgKCpwKysgPT0gfjBVTCkgeworCQlpZiAoLS13b3JkcyA9PSAwKQorCQkJZ290byBvdXQ7CiAJfQogCiAJLS1wOwogCWZvciAocmVzID0gMDsgcmVzIDwgMzI7IHJlcysrKQogCQlpZiAoIXRlc3RfYml0X2xlKHJlcywgcCkpCiAJCQlicmVhazsKLQlyZXR1cm4gKHAgLSBhZGRyKSAqIDMyICsgcmVzOworb3V0OgorCXJlcyArPSAocCAtIGFkZHIpICogMzI7CisJcmV0dXJuIHJlcyA8IHNpemUgPyByZXMgOiBzaXplOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZmluZF9uZXh0X3plcm9fYml0X2xlKGNvbnN0IHZvaWQgKmFkZHIsCkBAIC00MDAsMTAgKzQxNCwxNSBAQAogCQlvZmZzZXQgLT0gYml0OwogCQkvKiBMb29rIGZvciB6ZXJvIGluIGZpcnN0IGxvbmd3b3JkICovCiAJCWZvciAocmVzID0gYml0OyByZXMgPCAzMjsgcmVzKyspCi0JCQlpZiAoIXRlc3RfYml0X2xlKHJlcywgcCkpCi0JCQkJcmV0dXJuIG9mZnNldCArIHJlczsKKwkJCWlmICghdGVzdF9iaXRfbGUocmVzLCBwKSkgeworCQkJCW9mZnNldCArPSByZXM7CisJCQkJcmV0dXJuIG9mZnNldCA8IHNpemUgPyBvZmZzZXQgOiBzaXplOworCQkJfQogCQlwKys7CiAJCW9mZnNldCArPSAzMjsKKworCQlpZiAob2Zmc2V0ID49IHNpemUpCisJCQlyZXR1cm4gc2l6ZTsKIAl9CiAJLyogTm8gemVybyB5ZXQsIHNlYXJjaCByZW1haW5pbmcgZnVsbCBieXRlcyBmb3IgYSB6ZXJvICovCiAJcmV0dXJuIG9mZnNldCArIGZpbmRfZmlyc3RfemVyb19iaXRfbGUocCwgc2l6ZSAtIG9mZnNldCk7CkBAIC00MTIsMjIgKzQzMSwyNSBAQAogc3RhdGljIGlubGluZSBpbnQgZmluZF9maXJzdF9iaXRfbGUoY29uc3Qgdm9pZCAqdmFkZHIsIHVuc2lnbmVkIHNpemUpCiB7CiAJY29uc3QgdW5zaWduZWQgbG9uZyAqcCA9IHZhZGRyLCAqYWRkciA9IHZhZGRyOwotCWludCByZXM7CisJaW50IHJlcyA9IDA7CisJdW5zaWduZWQgaW50IHdvcmRzOwogCiAJaWYgKCFzaXplKQogCQlyZXR1cm4gMDsKIAotCXNpemUgPSAoc2l6ZSA+PiA1KSArICgoc2l6ZSAmIDMxKSA+IDApOworCXdvcmRzID0gKHNpemUgPj4gNSkgKyAoKHNpemUgJiAzMSkgPiAwKTsKIAl3aGlsZSAoKnArKyA9PSAwVUwpIHsKLQkJaWYgKC0tc2l6ZSA9PSAwKQotCQkJcmV0dXJuIChwIC0gYWRkcikgPDwgNTsKKwkJaWYgKC0td29yZHMgPT0gMCkKKwkJCWdvdG8gb3V0OwogCX0KIAogCS0tcDsKIAlmb3IgKHJlcyA9IDA7IHJlcyA8IDMyOyByZXMrKykKIAkJaWYgKHRlc3RfYml0X2xlKHJlcywgcCkpCiAJCQlicmVhazsKLQlyZXR1cm4gKHAgLSBhZGRyKSAqIDMyICsgcmVzOworb3V0OgorCXJlcyArPSAocCAtIGFkZHIpICogMzI7CisJcmV0dXJuIHJlcyA8IHNpemUgPyByZXMgOiBzaXplOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZmluZF9uZXh0X2JpdF9sZShjb25zdCB2b2lkICphZGRyLApAQCAtNDQ1LDEwICs0NjcsMTUgQEAKIAkJb2Zmc2V0IC09IGJpdDsKIAkJLyogTG9vayBmb3Igb25lIGluIGZpcnN0IGxvbmd3b3JkICovCiAJCWZvciAocmVzID0gYml0OyByZXMgPCAzMjsgcmVzKyspCi0JCQlpZiAodGVzdF9iaXRfbGUocmVzLCBwKSkKLQkJCQlyZXR1cm4gb2Zmc2V0ICsgcmVzOworCQkJaWYgKHRlc3RfYml0X2xlKHJlcywgcCkpIHsKKwkJCQlvZmZzZXQgKz0gcmVzOworCQkJCXJldHVybiBvZmZzZXQgPCBzaXplID8gb2Zmc2V0IDogc2l6ZTsKKwkJCX0KIAkJcCsrOwogCQlvZmZzZXQgKz0gMzI7CisKKwkJaWYgKG9mZnNldCA+PSBzaXplKQorCQkJcmV0dXJuIHNpemU7CiAJfQogCS8qIE5vIHNldCBiaXQgeWV0LCBzZWFyY2ggcmVtYWluaW5nIGZ1bGwgYnl0ZXMgZm9yIGEgc2V0IGJpdCAqLwogCXJldHVybiBvZmZzZXQgKyBmaW5kX2ZpcnN0X2JpdF9sZShwLCBzaXplIC0gb2Zmc2V0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS91bmlzdGQuaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS91bmlzdGQuaAppbmRleCAyOWUxNzkwLi5mM2I2NDlkIDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vdW5pc3RkLmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCkBAIC0yMiw3ICsyMiw3IEBACiAjZGVmaW5lIF9fTlJfbWtub2QJCSAxNAogI2RlZmluZSBfX05SX2NobW9kCQkgMTUKICNkZWZpbmUgX19OUl9jaG93bgkJIDE2Ci0jZGVmaW5lIF9fTlJfYnJlYWsJCSAxNworLyojZGVmaW5lIF9fTlJfYnJlYWsJCSAxNyovCiAjZGVmaW5lIF9fTlJfb2xkc3RhdAkJIDE4CiAjZGVmaW5lIF9fTlJfbHNlZWsJCSAxOQogI2RlZmluZSBfX05SX2dldHBpZAkJIDIwCkBAIC0zNiwxMSArMzYsMTEgQEAKICNkZWZpbmUgX19OUl9vbGRmc3RhdAkJIDI4CiAjZGVmaW5lIF9fTlJfcGF1c2UJCSAyOQogI2RlZmluZSBfX05SX3V0aW1lCQkgMzAKLSNkZWZpbmUgX19OUl9zdHR5CQkgMzEKLSNkZWZpbmUgX19OUl9ndHR5CQkgMzIKKy8qI2RlZmluZSBfX05SX3N0dHkJCSAzMSovCisvKiNkZWZpbmUgX19OUl9ndHR5CQkgMzIqLwogI2RlZmluZSBfX05SX2FjY2VzcwkJIDMzCiAjZGVmaW5lIF9fTlJfbmljZQkJIDM0Ci0jZGVmaW5lIF9fTlJfZnRpbWUJCSAzNQorLyojZGVmaW5lIF9fTlJfZnRpbWUJCSAzNSovCiAjZGVmaW5lIF9fTlJfc3luYwkJIDM2CiAjZGVmaW5lIF9fTlJfa2lsbAkJIDM3CiAjZGVmaW5lIF9fTlJfcmVuYW1lCQkgMzgKQEAgLTQ5LDcgKzQ5LDcgQEAKICNkZWZpbmUgX19OUl9kdXAJCSA0MQogI2RlZmluZSBfX05SX3BpcGUJCSA0MgogI2RlZmluZSBfX05SX3RpbWVzCQkgNDMKLSNkZWZpbmUgX19OUl9wcm9mCQkgNDQKKy8qI2RlZmluZSBfX05SX3Byb2YJCSA0NCovCiAjZGVmaW5lIF9fTlJfYnJrCQkgNDUKICNkZWZpbmUgX19OUl9zZXRnaWQJCSA0NgogI2RlZmluZSBfX05SX2dldGdpZAkJIDQ3CkBAIC01OCwxMyArNTgsMTMgQEAKICNkZWZpbmUgX19OUl9nZXRlZ2lkCQkgNTAKICNkZWZpbmUgX19OUl9hY2N0CQkgNTEKICNkZWZpbmUgX19OUl91bW91bnQyCQkgNTIKLSNkZWZpbmUgX19OUl9sb2NrCQkgNTMKKy8qI2RlZmluZSBfX05SX2xvY2sJCSA1MyovCiAjZGVmaW5lIF9fTlJfaW9jdGwJCSA1NAogI2RlZmluZSBfX05SX2ZjbnRsCQkgNTUKLSNkZWZpbmUgX19OUl9tcHgJCSA1NgorLyojZGVmaW5lIF9fTlJfbXB4CQkgNTYqLwogI2RlZmluZSBfX05SX3NldHBnaWQJCSA1NwotI2RlZmluZSBfX05SX3VsaW1pdAkJIDU4Ci0jZGVmaW5lIF9fTlJfb2xkb2xkdW5hbWUJIDU5CisvKiNkZWZpbmUgX19OUl91bGltaXQJCSA1OCovCisvKiNkZWZpbmUgX19OUl9vbGRvbGR1bmFtZQkgNTkqLwogI2RlZmluZSBfX05SX3VtYXNrCQkgNjAKICNkZWZpbmUgX19OUl9jaHJvb3QJCSA2MQogI2RlZmluZSBfX05SX3VzdGF0CQkgNjIKQEAgLTEwMywxMCArMTAzLDEwIEBACiAjZGVmaW5lIF9fTlJfZmNob3duCQkgOTUKICNkZWZpbmUgX19OUl9nZXRwcmlvcml0eQkgOTYKICNkZWZpbmUgX19OUl9zZXRwcmlvcml0eQkgOTcKLSNkZWZpbmUgX19OUl9wcm9maWwJCSA5OAorLyojZGVmaW5lIF9fTlJfcHJvZmlsCQkgOTgqLwogI2RlZmluZSBfX05SX3N0YXRmcwkJIDk5CiAjZGVmaW5lIF9fTlJfZnN0YXRmcwkJMTAwCi0jZGVmaW5lIF9fTlJfaW9wZXJtCQkxMDEKKy8qI2RlZmluZSBfX05SX2lvcGVybQkJMTAxKi8KICNkZWZpbmUgX19OUl9zb2NrZXRjYWxsCQkxMDIKICNkZWZpbmUgX19OUl9zeXNsb2cJCTEwMwogI2RlZmluZSBfX05SX3NldGl0aW1lcgkJMTA0CkBAIC0xMTQsMTEgKzExNCwxMSBAQAogI2RlZmluZSBfX05SX3N0YXQJCTEwNgogI2RlZmluZSBfX05SX2xzdGF0CQkxMDcKICNkZWZpbmUgX19OUl9mc3RhdAkJMTA4Ci0jZGVmaW5lIF9fTlJfb2xkdW5hbWUJCTEwOQotI2RlZmluZSBfX05SX2lvcGwJCS8qIDExMCAqLyBub3Qgc3VwcG9ydGVkCisvKiNkZWZpbmUgX19OUl9vbGR1bmFtZQkJMTA5Ki8KKy8qI2RlZmluZSBfX05SX2lvcGwJCTExMCovIC8qIG5vdCBzdXBwb3J0ZWQgKi8KICNkZWZpbmUgX19OUl92aGFuZ3VwCQkxMTEKLSNkZWZpbmUgX19OUl9pZGxlCQkvKiAxMTIgKi8gT2Jzb2xldGUKLSNkZWZpbmUgX19OUl92bTg2CQkvKiAxMTMgKi8gbm90IHN1cHBvcnRlZAorLyojZGVmaW5lIF9fTlJfaWRsZQkJMTEyKi8gLyogT2Jzb2xldGUgKi8KKy8qI2RlZmluZSBfX05SX3ZtODYJCTExMyovIC8qIG5vdCBzdXBwb3J0ZWQgKi8KICNkZWZpbmUgX19OUl93YWl0NAkJMTE0CiAjZGVmaW5lIF9fTlJfc3dhcG9mZgkJMTE1CiAjZGVmaW5lIF9fTlJfc3lzaW5mbwkJMTE2CkBAIC0xMzIsMTcgKzEzMiwxNyBAQAogI2RlZmluZSBfX05SX2FkanRpbWV4CQkxMjQKICNkZWZpbmUgX19OUl9tcHJvdGVjdAkJMTI1CiAjZGVmaW5lIF9fTlJfc2lncHJvY21hc2sJMTI2Ci0jZGVmaW5lIF9fTlJfY3JlYXRlX21vZHVsZQkxMjcKKy8qI2RlZmluZSBfX05SX2NyZWF0ZV9tb2R1bGUJMTI3Ki8KICNkZWZpbmUgX19OUl9pbml0X21vZHVsZQkxMjgKICNkZWZpbmUgX19OUl9kZWxldGVfbW9kdWxlCTEyOQotI2RlZmluZSBfX05SX2dldF9rZXJuZWxfc3ltcwkxMzAKKy8qI2RlZmluZSBfX05SX2dldF9rZXJuZWxfc3ltcwkxMzAqLwogI2RlZmluZSBfX05SX3F1b3RhY3RsCQkxMzEKICNkZWZpbmUgX19OUl9nZXRwZ2lkCQkxMzIKICNkZWZpbmUgX19OUl9mY2hkaXIJCTEzMwogI2RlZmluZSBfX05SX2JkZmx1c2gJCTEzNAogI2RlZmluZSBfX05SX3N5c2ZzCQkxMzUKICNkZWZpbmUgX19OUl9wZXJzb25hbGl0eQkxMzYKLSNkZWZpbmUgX19OUl9hZnNfc3lzY2FsbAkxMzcgLyogU3lzY2FsbCBmb3IgQW5kcmV3IEZpbGUgU3lzdGVtICovCisvKiNkZWZpbmUgX19OUl9hZnNfc3lzY2FsbAkxMzcqLyAvKiBTeXNjYWxsIGZvciBBbmRyZXcgRmlsZSBTeXN0ZW0gKi8KICNkZWZpbmUgX19OUl9zZXRmc3VpZAkJMTM4CiAjZGVmaW5lIF9fTlJfc2V0ZnNnaWQJCTEzOQogI2RlZmluZSBfX05SX19sbHNlZWsJCTE0MApAQCAtMTcyLDcgKzE3Miw3IEBACiAjZGVmaW5lIF9fTlJfc2V0cmVzdWlkCQkxNjQKICNkZWZpbmUgX19OUl9nZXRyZXN1aWQJCTE2NQogI2RlZmluZSBfX05SX2dldHBhZ2VzaXplCTE2NgotI2RlZmluZSBfX05SX3F1ZXJ5X21vZHVsZQkxNjcKKy8qI2RlZmluZSBfX05SX3F1ZXJ5X21vZHVsZQkxNjcqLwogI2RlZmluZSBfX05SX3BvbGwJCTE2OAogI2RlZmluZSBfX05SX25mc3NlcnZjdGwJCTE2OQogI2RlZmluZSBfX05SX3NldHJlc2dpZAkJMTcwCkBAIC0xOTMsOCArMTkzLDggQEAKICNkZWZpbmUgX19OUl9jYXBzZXQJCTE4NQogI2RlZmluZSBfX05SX3NpZ2FsdHN0YWNrCTE4NgogI2RlZmluZSBfX05SX3NlbmRmaWxlCQkxODcKLSNkZWZpbmUgX19OUl9nZXRwbXNnCQkxODgJLyogc29tZSBwZW9wbGUgYWN0dWFsbHkgd2FudCBzdHJlYW1zICovCi0jZGVmaW5lIF9fTlJfcHV0cG1zZwkJMTg5CS8qIHNvbWUgcGVvcGxlIGFjdHVhbGx5IHdhbnQgc3RyZWFtcyAqLworLyojZGVmaW5lIF9fTlJfZ2V0cG1zZwkJMTg4Ki8JLyogc29tZSBwZW9wbGUgYWN0dWFsbHkgd2FudCBzdHJlYW1zICovCisvKiNkZWZpbmUgX19OUl9wdXRwbXNnCQkxODkqLwkvKiBzb21lIHBlb3BsZSBhY3R1YWxseSB3YW50IHN0cmVhbXMgKi8KICNkZWZpbmUgX19OUl92Zm9yawkJMTkwCiAjZGVmaW5lIF9fTlJfdWdldHJsaW1pdAkJMTkxCiAjZGVmaW5lIF9fTlJfbW1hcDIJCTE5MgpAQCAtMjIzLDYgKzIyMyw4IEBACiAjZGVmaW5lIF9fTlJfc2V0ZnN1aWQzMgkJMjE1CiAjZGVmaW5lIF9fTlJfc2V0ZnNnaWQzMgkJMjE2CiAjZGVmaW5lIF9fTlJfcGl2b3Rfcm9vdAkJMjE3CisvKiAyMTgqLworLyogMjE5Ki8KICNkZWZpbmUgX19OUl9nZXRkZW50czY0CQkyMjAKICNkZWZpbmUgX19OUl9nZXR0aWQJCTIyMQogI2RlZmluZSBfX05SX3RraWxsCQkyMjIKQEAgLTI4MSw3ICsyODMsNyBAQAogI2RlZmluZSBfX05SX21xX25vdGlmeQkJMjc1CiAjZGVmaW5lIF9fTlJfbXFfZ2V0c2V0YXR0cgkyNzYKICNkZWZpbmUgX19OUl93YWl0aWQJCTI3NwotI2RlZmluZSBfX05SX3ZzZXJ2ZXIJCTI3OAorLyojZGVmaW5lIF9fTlJfdnNlcnZlcgkJMjc4Ki8KICNkZWZpbmUgX19OUl9hZGRfa2V5CQkyNzkKICNkZWZpbmUgX19OUl9yZXF1ZXN0X2tleQkyODAKICNkZWZpbmUgX19OUl9rZXljdGwJCTI4MQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9NYWtlZmlsZV9tbSBiL2FyY2gvbTY4ay9rZXJuZWwvTWFrZWZpbGVfbW0KaW5kZXggNTVkNWQ2Yi4uYWNlZDY3OCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9NYWtlZmlsZV9tbQorKysgYi9hcmNoL202OGsva2VybmVsL01ha2VmaWxlX21tCkBAIC0xMCw3ICsxMCw3IEBACiBleHRyYS15CSs9IHZtbGludXgubGRzCiAKIG9iai15CTo9IGVudHJ5Lm8gcHJvY2Vzcy5vIHRyYXBzLm8gaW50cy5vIHNpZ25hbC5vIHB0cmFjZS5vIG1vZHVsZS5vIFwKLQkgICBzeXNfbTY4ay5vIHRpbWUubyBzZXR1cC5vIG02OGtfa3N5bXMubyBkZXZyZXMubworCSAgIHN5c19tNjhrLm8gdGltZS5vIHNldHVwLm8gbTY4a19rc3ltcy5vIGRldnJlcy5vIHN5c2NhbGx0YWJsZS5vCiAKIGRldnJlcy15ID0gLi4vLi4vLi4va2VybmVsL2lycS9kZXZyZXMubwogCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL2VudHJ5X21tLlMgYi9hcmNoL202OGsva2VybmVsL2VudHJ5X21tLlMKaW5kZXggMTM1OWVlNi4uYmQwZWMwNSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9lbnRyeV9tbS5TCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvZW50cnlfbW0uUwpAQCAtNDA3LDM1MSArNDA3LDMgQEAKIAogCXJ0cwogCi0uZGF0YQotQUxJR04KLXN5c19jYWxsX3RhYmxlOgotCS5sb25nIHN5c19yZXN0YXJ0X3N5c2NhbGwJLyogMCAtIG9sZCAic2V0dXAoKSIgc3lzdGVtIGNhbGwsIHVzZWQgZm9yIHJlc3RhcnRpbmcgKi8KLQkubG9uZyBzeXNfZXhpdAotCS5sb25nIHN5c19mb3JrCi0JLmxvbmcgc3lzX3JlYWQKLQkubG9uZyBzeXNfd3JpdGUKLQkubG9uZyBzeXNfb3BlbgkJLyogNSAqLwotCS5sb25nIHN5c19jbG9zZQotCS5sb25nIHN5c193YWl0cGlkCi0JLmxvbmcgc3lzX2NyZWF0Ci0JLmxvbmcgc3lzX2xpbmsKLQkubG9uZyBzeXNfdW5saW5rCS8qIDEwICovCi0JLmxvbmcgc3lzX2V4ZWN2ZQotCS5sb25nIHN5c19jaGRpcgotCS5sb25nIHN5c190aW1lCi0JLmxvbmcgc3lzX21rbm9kCi0JLmxvbmcgc3lzX2NobW9kCQkvKiAxNSAqLwotCS5sb25nIHN5c19jaG93bjE2Ci0JLmxvbmcgc3lzX25pX3N5c2NhbGwJCQkJLyogb2xkIGJyZWFrIHN5c2NhbGwgaG9sZGVyICovCi0JLmxvbmcgc3lzX3N0YXQKLQkubG9uZyBzeXNfbHNlZWsKLQkubG9uZyBzeXNfZ2V0cGlkCS8qIDIwICovCi0JLmxvbmcgc3lzX21vdW50Ci0JLmxvbmcgc3lzX29sZHVtb3VudAotCS5sb25nIHN5c19zZXR1aWQxNgotCS5sb25nIHN5c19nZXR1aWQxNgotCS5sb25nIHN5c19zdGltZQkJLyogMjUgKi8KLQkubG9uZyBzeXNfcHRyYWNlCi0JLmxvbmcgc3lzX2FsYXJtCi0JLmxvbmcgc3lzX2ZzdGF0Ci0JLmxvbmcgc3lzX3BhdXNlCi0JLmxvbmcgc3lzX3V0aW1lCQkvKiAzMCAqLwotCS5sb25nIHN5c19uaV9zeXNjYWxsCQkJCS8qIG9sZCBzdHR5IHN5c2NhbGwgaG9sZGVyICovCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJCQkJLyogb2xkIGd0dHkgc3lzY2FsbCBob2xkZXIgKi8KLQkubG9uZyBzeXNfYWNjZXNzCi0JLmxvbmcgc3lzX25pY2UKLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiAzNSAqLwkvKiBvbGQgZnRpbWUgc3lzY2FsbCBob2xkZXIgKi8KLQkubG9uZyBzeXNfc3luYwotCS5sb25nIHN5c19raWxsCi0JLmxvbmcgc3lzX3JlbmFtZQotCS5sb25nIHN5c19ta2RpcgotCS5sb25nIHN5c19ybWRpcgkJLyogNDAgKi8KLQkubG9uZyBzeXNfZHVwCi0JLmxvbmcgc3lzX3BpcGUKLQkubG9uZyBzeXNfdGltZXMKLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkJCQkvKiBvbGQgcHJvZiBzeXNjYWxsIGhvbGRlciAqLwotCS5sb25nIHN5c19icmsJCS8qIDQ1ICovCi0JLmxvbmcgc3lzX3NldGdpZDE2Ci0JLmxvbmcgc3lzX2dldGdpZDE2Ci0JLmxvbmcgc3lzX3NpZ25hbAotCS5sb25nIHN5c19nZXRldWlkMTYKLQkubG9uZyBzeXNfZ2V0ZWdpZDE2CS8qIDUwICovCi0JLmxvbmcgc3lzX2FjY3QKLQkubG9uZyBzeXNfdW1vdW50CQkJCS8qIHJlY3ljbGVkIG5ldmVyIHVzZWQgcGh5cygpICovCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJCQkJLyogb2xkIGxvY2sgc3lzY2FsbCBob2xkZXIgKi8KLQkubG9uZyBzeXNfaW9jdGwKLQkubG9uZyBzeXNfZmNudGwJCS8qIDU1ICovCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJCQkJLyogb2xkIG1weCBzeXNjYWxsIGhvbGRlciAqLwotCS5sb25nIHN5c19zZXRwZ2lkCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJCQkJLyogb2xkIHVsaW1pdCBzeXNjYWxsIGhvbGRlciAqLwotCS5sb25nIHN5c19uaV9zeXNjYWxsCi0JLmxvbmcgc3lzX3VtYXNrCQkvKiA2MCAqLwotCS5sb25nIHN5c19jaHJvb3QKLQkubG9uZyBzeXNfdXN0YXQKLQkubG9uZyBzeXNfZHVwMgotCS5sb25nIHN5c19nZXRwcGlkCi0JLmxvbmcgc3lzX2dldHBncnAJLyogNjUgKi8KLQkubG9uZyBzeXNfc2V0c2lkCi0JLmxvbmcgc3lzX3NpZ2FjdGlvbgotCS5sb25nIHN5c19zZ2V0bWFzawotCS5sb25nIHN5c19zc2V0bWFzawotCS5sb25nIHN5c19zZXRyZXVpZDE2CS8qIDcwICovCi0JLmxvbmcgc3lzX3NldHJlZ2lkMTYKLQkubG9uZyBzeXNfc2lnc3VzcGVuZAotCS5sb25nIHN5c19zaWdwZW5kaW5nCi0JLmxvbmcgc3lzX3NldGhvc3RuYW1lCi0JLmxvbmcgc3lzX3NldHJsaW1pdAkvKiA3NSAqLwotCS5sb25nIHN5c19vbGRfZ2V0cmxpbWl0Ci0JLmxvbmcgc3lzX2dldHJ1c2FnZQotCS5sb25nIHN5c19nZXR0aW1lb2ZkYXkKLQkubG9uZyBzeXNfc2V0dGltZW9mZGF5Ci0JLmxvbmcgc3lzX2dldGdyb3VwczE2CS8qIDgwICovCi0JLmxvbmcgc3lzX3NldGdyb3VwczE2Ci0JLmxvbmcgc3lzX29sZF9zZWxlY3QKLQkubG9uZyBzeXNfc3ltbGluawotCS5sb25nIHN5c19sc3RhdAotCS5sb25nIHN5c19yZWFkbGluawkvKiA4NSAqLwotCS5sb25nIHN5c191c2VsaWIKLQkubG9uZyBzeXNfc3dhcG9uCi0JLmxvbmcgc3lzX3JlYm9vdAotCS5sb25nIHN5c19vbGRfcmVhZGRpcgotCS5sb25nIHN5c19vbGRfbW1hcAkvKiA5MCAqLwotCS5sb25nIHN5c19tdW5tYXAKLQkubG9uZyBzeXNfdHJ1bmNhdGUKLQkubG9uZyBzeXNfZnRydW5jYXRlCi0JLmxvbmcgc3lzX2ZjaG1vZAotCS5sb25nIHN5c19mY2hvd24xNgkvKiA5NSAqLwotCS5sb25nIHN5c19nZXRwcmlvcml0eQotCS5sb25nIHN5c19zZXRwcmlvcml0eQotCS5sb25nIHN5c19uaV9zeXNjYWxsCQkJCS8qIG9sZCBwcm9maWwgc3lzY2FsbCBob2xkZXIgKi8KLQkubG9uZyBzeXNfc3RhdGZzCi0JLmxvbmcgc3lzX2ZzdGF0ZnMJLyogMTAwICovCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJCQkJLyogaW9wZXJtIGZvciBpMzg2ICovCi0JLmxvbmcgc3lzX3NvY2tldGNhbGwKLQkubG9uZyBzeXNfc3lzbG9nCi0JLmxvbmcgc3lzX3NldGl0aW1lcgotCS5sb25nIHN5c19nZXRpdGltZXIJLyogMTA1ICovCi0JLmxvbmcgc3lzX25ld3N0YXQKLQkubG9uZyBzeXNfbmV3bHN0YXQKLQkubG9uZyBzeXNfbmV3ZnN0YXQKLQkubG9uZyBzeXNfbmlfc3lzY2FsbAotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIDExMCAqLwkvKiBpb3BsIGZvciBpMzg2ICovCi0JLmxvbmcgc3lzX3ZoYW5ndXAKLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkJCQkvKiBvYnNvbGV0ZSBpZGxlKCkgc3lzY2FsbCAqLwotCS5sb25nIHN5c19uaV9zeXNjYWxsCQkJCS8qIHZtODZvbGQgZm9yIGkzODYgKi8KLQkubG9uZyBzeXNfd2FpdDQKLQkubG9uZyBzeXNfc3dhcG9mZgkvKiAxMTUgKi8KLQkubG9uZyBzeXNfc3lzaW5mbwotCS5sb25nIHN5c19pcGMKLQkubG9uZyBzeXNfZnN5bmMKLQkubG9uZyBzeXNfc2lncmV0dXJuCi0JLmxvbmcgc3lzX2Nsb25lCQkvKiAxMjAgKi8KLQkubG9uZyBzeXNfc2V0ZG9tYWlubmFtZQotCS5sb25nIHN5c19uZXd1bmFtZQotCS5sb25nIHN5c19jYWNoZWZsdXNoCQkJCS8qIG1vZGlmeV9sZHQgZm9yIGkzODYgKi8KLQkubG9uZyBzeXNfYWRqdGltZXgKLQkubG9uZyBzeXNfbXByb3RlY3QJLyogMTI1ICovCi0JLmxvbmcgc3lzX3NpZ3Byb2NtYXNrCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJCS8qIG9sZCAiY3JlYXRlX21vZHVsZSIgKi8KLQkubG9uZyBzeXNfaW5pdF9tb2R1bGUKLQkubG9uZyBzeXNfZGVsZXRlX21vZHVsZQotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIDEzMCAtIG9sZCAiZ2V0X2tlcm5lbF9zeW1zIiAqLwotCS5sb25nIHN5c19xdW90YWN0bAotCS5sb25nIHN5c19nZXRwZ2lkCi0JLmxvbmcgc3lzX2ZjaGRpcgotCS5sb25nIHN5c19iZGZsdXNoCi0JLmxvbmcgc3lzX3N5c2ZzCQkvKiAxMzUgKi8KLQkubG9uZyBzeXNfcGVyc29uYWxpdHkKLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkJCQkvKiBmb3IgYWZzX3N5c2NhbGwgKi8KLQkubG9uZyBzeXNfc2V0ZnN1aWQxNgotCS5sb25nIHN5c19zZXRmc2dpZDE2Ci0JLmxvbmcgc3lzX2xsc2VlawkvKiAxNDAgKi8KLQkubG9uZyBzeXNfZ2V0ZGVudHMKLQkubG9uZyBzeXNfc2VsZWN0Ci0JLmxvbmcgc3lzX2Zsb2NrCi0JLmxvbmcgc3lzX21zeW5jCi0JLmxvbmcgc3lzX3JlYWR2CQkvKiAxNDUgKi8KLQkubG9uZyBzeXNfd3JpdGV2Ci0JLmxvbmcgc3lzX2dldHNpZAotCS5sb25nIHN5c19mZGF0YXN5bmMKLQkubG9uZyBzeXNfc3lzY3RsCi0JLmxvbmcgc3lzX21sb2NrCQkvKiAxNTAgKi8KLQkubG9uZyBzeXNfbXVubG9jawotCS5sb25nIHN5c19tbG9ja2FsbAotCS5sb25nIHN5c19tdW5sb2NrYWxsCi0JLmxvbmcgc3lzX3NjaGVkX3NldHBhcmFtCi0JLmxvbmcgc3lzX3NjaGVkX2dldHBhcmFtCS8qIDE1NSAqLwotCS5sb25nIHN5c19zY2hlZF9zZXRzY2hlZHVsZXIKLQkubG9uZyBzeXNfc2NoZWRfZ2V0c2NoZWR1bGVyCi0JLmxvbmcgc3lzX3NjaGVkX3lpZWxkCi0JLmxvbmcgc3lzX3NjaGVkX2dldF9wcmlvcml0eV9tYXgKLQkubG9uZyBzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiAgLyogMTYwICovCi0JLmxvbmcgc3lzX3NjaGVkX3JyX2dldF9pbnRlcnZhbAotCS5sb25nIHN5c19uYW5vc2xlZXAKLQkubG9uZyBzeXNfbXJlbWFwCi0JLmxvbmcgc3lzX3NldHJlc3VpZDE2Ci0JLmxvbmcgc3lzX2dldHJlc3VpZDE2CS8qIDE2NSAqLwotCS5sb25nIHN5c19nZXRwYWdlc2l6ZQotCS5sb25nIHN5c19uaV9zeXNjYWxsCQkvKiBvbGQgc3lzX3F1ZXJ5X21vZHVsZSAqLwotCS5sb25nIHN5c19wb2xsCi0JLmxvbmcgc3lzX25mc3NlcnZjdGwKLQkubG9uZyBzeXNfc2V0cmVzZ2lkMTYJLyogMTcwICovCi0JLmxvbmcgc3lzX2dldHJlc2dpZDE2Ci0JLmxvbmcgc3lzX3ByY3RsCi0JLmxvbmcgc3lzX3J0X3NpZ3JldHVybgotCS5sb25nIHN5c19ydF9zaWdhY3Rpb24KLQkubG9uZyBzeXNfcnRfc2lncHJvY21hc2sJLyogMTc1ICovCi0JLmxvbmcgc3lzX3J0X3NpZ3BlbmRpbmcKLQkubG9uZyBzeXNfcnRfc2lndGltZWR3YWl0Ci0JLmxvbmcgc3lzX3J0X3NpZ3F1ZXVlaW5mbwotCS5sb25nIHN5c19ydF9zaWdzdXNwZW5kCi0JLmxvbmcgc3lzX3ByZWFkNjQJLyogMTgwICovCi0JLmxvbmcgc3lzX3B3cml0ZTY0Ci0JLmxvbmcgc3lzX2xjaG93bjE2OwotCS5sb25nIHN5c19nZXRjd2QKLQkubG9uZyBzeXNfY2FwZ2V0Ci0JLmxvbmcgc3lzX2NhcHNldAkvKiAxODUgKi8KLQkubG9uZyBzeXNfc2lnYWx0c3RhY2sKLQkubG9uZyBzeXNfc2VuZGZpbGUKLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkJCQkvKiBzdHJlYW1zMSAqLwotCS5sb25nIHN5c19uaV9zeXNjYWxsCQkJCS8qIHN0cmVhbXMyICovCi0JLmxvbmcgc3lzX3Zmb3JrCQkvKiAxOTAgKi8KLQkubG9uZyBzeXNfZ2V0cmxpbWl0Ci0JLmxvbmcgc3lzX21tYXAyCi0JLmxvbmcgc3lzX3RydW5jYXRlNjQKLQkubG9uZyBzeXNfZnRydW5jYXRlNjQKLQkubG9uZyBzeXNfc3RhdDY0CS8qIDE5NSAqLwotCS5sb25nIHN5c19sc3RhdDY0Ci0JLmxvbmcgc3lzX2ZzdGF0NjQKLQkubG9uZyBzeXNfY2hvd24KLQkubG9uZyBzeXNfZ2V0dWlkCi0JLmxvbmcgc3lzX2dldGdpZAkvKiAyMDAgKi8KLQkubG9uZyBzeXNfZ2V0ZXVpZAotCS5sb25nIHN5c19nZXRlZ2lkCi0JLmxvbmcgc3lzX3NldHJldWlkCi0JLmxvbmcgc3lzX3NldHJlZ2lkCi0JLmxvbmcgc3lzX2dldGdyb3VwcwkvKiAyMDUgKi8KLQkubG9uZyBzeXNfc2V0Z3JvdXBzCi0JLmxvbmcgc3lzX2ZjaG93bgotCS5sb25nIHN5c19zZXRyZXN1aWQKLQkubG9uZyBzeXNfZ2V0cmVzdWlkCi0JLmxvbmcgc3lzX3NldHJlc2dpZAkvKiAyMTAgKi8KLQkubG9uZyBzeXNfZ2V0cmVzZ2lkCi0JLmxvbmcgc3lzX2xjaG93bgotCS5sb25nIHN5c19zZXR1aWQKLQkubG9uZyBzeXNfc2V0Z2lkCi0JLmxvbmcgc3lzX3NldGZzdWlkCS8qIDIxNSAqLwotCS5sb25nIHN5c19zZXRmc2dpZAotCS5sb25nIHN5c19waXZvdF9yb290Ci0JLmxvbmcgc3lzX25pX3N5c2NhbGwKLQkubG9uZyBzeXNfbmlfc3lzY2FsbAotCS5sb25nIHN5c19nZXRkZW50czY0CS8qIDIyMCAqLwotCS5sb25nIHN5c19nZXR0aWQKLQkubG9uZyBzeXNfdGtpbGwKLQkubG9uZyBzeXNfc2V0eGF0dHIKLQkubG9uZyBzeXNfbHNldHhhdHRyCi0JLmxvbmcgc3lzX2ZzZXR4YXR0cgkvKiAyMjUgKi8KLQkubG9uZyBzeXNfZ2V0eGF0dHIKLQkubG9uZyBzeXNfbGdldHhhdHRyCi0JLmxvbmcgc3lzX2ZnZXR4YXR0cgotCS5sb25nIHN5c19saXN0eGF0dHIKLQkubG9uZyBzeXNfbGxpc3R4YXR0cgkvKiAyMzAgKi8KLQkubG9uZyBzeXNfZmxpc3R4YXR0cgotCS5sb25nIHN5c19yZW1vdmV4YXR0cgotCS5sb25nIHN5c19scmVtb3ZleGF0dHIKLQkubG9uZyBzeXNfZnJlbW92ZXhhdHRyCi0JLmxvbmcgc3lzX2Z1dGV4CQkvKiAyMzUgKi8KLQkubG9uZyBzeXNfc2VuZGZpbGU2NAotCS5sb25nIHN5c19taW5jb3JlCi0JLmxvbmcgc3lzX21hZHZpc2UKLQkubG9uZyBzeXNfZmNudGw2NAotCS5sb25nIHN5c19yZWFkYWhlYWQJLyogMjQwICovCi0JLmxvbmcgc3lzX2lvX3NldHVwCi0JLmxvbmcgc3lzX2lvX2Rlc3Ryb3kKLQkubG9uZyBzeXNfaW9fZ2V0ZXZlbnRzCi0JLmxvbmcgc3lzX2lvX3N1Ym1pdAotCS5sb25nIHN5c19pb19jYW5jZWwJLyogMjQ1ICovCi0JLmxvbmcgc3lzX2ZhZHZpc2U2NAotCS5sb25nIHN5c19leGl0X2dyb3VwCi0JLmxvbmcgc3lzX2xvb2t1cF9kY29va2llCi0JLmxvbmcgc3lzX2Vwb2xsX2NyZWF0ZQotCS5sb25nIHN5c19lcG9sbF9jdGwJLyogMjUwICovCi0JLmxvbmcgc3lzX2Vwb2xsX3dhaXQKLQkubG9uZyBzeXNfcmVtYXBfZmlsZV9wYWdlcwotCS5sb25nIHN5c19zZXRfdGlkX2FkZHJlc3MKLQkubG9uZyBzeXNfdGltZXJfY3JlYXRlCi0JLmxvbmcgc3lzX3RpbWVyX3NldHRpbWUJLyogMjU1ICovCi0JLmxvbmcgc3lzX3RpbWVyX2dldHRpbWUKLQkubG9uZyBzeXNfdGltZXJfZ2V0b3ZlcnJ1bgotCS5sb25nIHN5c190aW1lcl9kZWxldGUKLQkubG9uZyBzeXNfY2xvY2tfc2V0dGltZQotCS5sb25nIHN5c19jbG9ja19nZXR0aW1lCS8qIDI2MCAqLwotCS5sb25nIHN5c19jbG9ja19nZXRyZXMKLQkubG9uZyBzeXNfY2xvY2tfbmFub3NsZWVwCi0JLmxvbmcgc3lzX3N0YXRmczY0Ci0JLmxvbmcgc3lzX2ZzdGF0ZnM2NAotCS5sb25nIHN5c190Z2tpbGwJLyogMjY1ICovCi0JLmxvbmcgc3lzX3V0aW1lcwotCS5sb25nIHN5c19mYWR2aXNlNjRfNjQKLQkubG9uZyBzeXNfbWJpbmQKLQkubG9uZyBzeXNfZ2V0X21lbXBvbGljeQotCS5sb25nIHN5c19zZXRfbWVtcG9saWN5CS8qIDI3MCAqLwotCS5sb25nIHN5c19tcV9vcGVuCi0JLmxvbmcgc3lzX21xX3VubGluawotCS5sb25nIHN5c19tcV90aW1lZHNlbmQKLQkubG9uZyBzeXNfbXFfdGltZWRyZWNlaXZlCi0JLmxvbmcgc3lzX21xX25vdGlmeQkvKiAyNzUgKi8KLQkubG9uZyBzeXNfbXFfZ2V0c2V0YXR0cgotCS5sb25nIHN5c193YWl0aWQKLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBmb3Igc3lzX3ZzZXJ2ZXIgKi8KLQkubG9uZyBzeXNfYWRkX2tleQotCS5sb25nIHN5c19yZXF1ZXN0X2tleQkvKiAyODAgKi8KLQkubG9uZyBzeXNfa2V5Y3RsCi0JLmxvbmcgc3lzX2lvcHJpb19zZXQKLQkubG9uZyBzeXNfaW9wcmlvX2dldAotCS5sb25nIHN5c19pbm90aWZ5X2luaXQKLQkubG9uZyBzeXNfaW5vdGlmeV9hZGRfd2F0Y2gJLyogMjg1ICovCi0JLmxvbmcgc3lzX2lub3RpZnlfcm1fd2F0Y2gKLQkubG9uZyBzeXNfbWlncmF0ZV9wYWdlcwotCS5sb25nIHN5c19vcGVuYXQKLQkubG9uZyBzeXNfbWtkaXJhdAotCS5sb25nIHN5c19ta25vZGF0CQkvKiAyOTAgKi8KLQkubG9uZyBzeXNfZmNob3duYXQKLQkubG9uZyBzeXNfZnV0aW1lc2F0Ci0JLmxvbmcgc3lzX2ZzdGF0YXQ2NAotCS5sb25nIHN5c191bmxpbmthdAotCS5sb25nIHN5c19yZW5hbWVhdAkJLyogMjk1ICovCi0JLmxvbmcgc3lzX2xpbmthdAotCS5sb25nIHN5c19zeW1saW5rYXQKLQkubG9uZyBzeXNfcmVhZGxpbmthdAotCS5sb25nIHN5c19mY2htb2RhdAotCS5sb25nIHN5c19mYWNjZXNzYXQJCS8qIDMwMCAqLwotCS5sb25nIHN5c19uaV9zeXNjYWxsCQkvKiBSZXNlcnZlZCBmb3IgcHNlbGVjdDYgKi8KLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkJLyogUmVzZXJ2ZWQgZm9yIHBwb2xsICovCi0JLmxvbmcgc3lzX3Vuc2hhcmUKLQkubG9uZyBzeXNfc2V0X3JvYnVzdF9saXN0Ci0JLmxvbmcgc3lzX2dldF9yb2J1c3RfbGlzdAkvKiAzMDUgKi8KLQkubG9uZyBzeXNfc3BsaWNlCi0JLmxvbmcgc3lzX3N5bmNfZmlsZV9yYW5nZQotCS5sb25nIHN5c190ZWUKLQkubG9uZyBzeXNfdm1zcGxpY2UKLQkubG9uZyBzeXNfbW92ZV9wYWdlcwkJLyogMzEwICovCi0JLmxvbmcgc3lzX3NjaGVkX3NldGFmZmluaXR5Ci0JLmxvbmcgc3lzX3NjaGVkX2dldGFmZmluaXR5Ci0JLmxvbmcgc3lzX2tleGVjX2xvYWQKLQkubG9uZyBzeXNfZ2V0Y3B1Ci0JLmxvbmcgc3lzX2Vwb2xsX3B3YWl0CQkvKiAzMTUgKi8KLQkubG9uZyBzeXNfdXRpbWVuc2F0Ci0JLmxvbmcgc3lzX3NpZ25hbGZkCi0JLmxvbmcgc3lzX3RpbWVyZmRfY3JlYXRlCi0JLmxvbmcgc3lzX2V2ZW50ZmQKLQkubG9uZyBzeXNfZmFsbG9jYXRlCQkvKiAzMjAgKi8KLQkubG9uZyBzeXNfdGltZXJmZF9zZXR0aW1lCi0JLmxvbmcgc3lzX3RpbWVyZmRfZ2V0dGltZQotCS5sb25nIHN5c19zaWduYWxmZDQKLQkubG9uZyBzeXNfZXZlbnRmZDIKLQkubG9uZyBzeXNfZXBvbGxfY3JlYXRlMQkJLyogMzI1ICovCi0JLmxvbmcgc3lzX2R1cDMKLQkubG9uZyBzeXNfcGlwZTIKLQkubG9uZyBzeXNfaW5vdGlmeV9pbml0MQotCS5sb25nIHN5c19wcmVhZHYKLQkubG9uZyBzeXNfcHdyaXRldgkJLyogMzMwICovCi0JLmxvbmcgc3lzX3J0X3Rnc2lncXVldWVpbmZvCi0JLmxvbmcgc3lzX3BlcmZfZXZlbnRfb3BlbgotCS5sb25nIHN5c19nZXRfdGhyZWFkX2FyZWEKLQkubG9uZyBzeXNfc2V0X3RocmVhZF9hcmVhCi0JLmxvbmcgc3lzX2F0b21pY19jbXB4Y2hnXzMyCS8qIDMzNSAqLwotCS5sb25nIHN5c19hdG9taWNfYmFycmllcgotCS5sb25nIHN5c19mYW5vdGlmeV9pbml0Ci0JLmxvbmcgc3lzX2Zhbm90aWZ5X21hcmsKLQkubG9uZyBzeXNfcHJsaW1pdDY0Ci0JLmxvbmcgc3lzX25hbWVfdG9faGFuZGxlX2F0CS8qIDM0MCAqLwotCS5sb25nIHN5c19vcGVuX2J5X2hhbmRsZV9hdAotCS5sb25nIHN5c19jbG9ja19hZGp0aW1lCi0JLmxvbmcgc3lzX3N5bmNmcwotCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3N5c2NhbGx0YWJsZS5TIGIvYXJjaC9tNjhrL2tlcm5lbC9zeXNjYWxsdGFibGUuUwppbmRleCA5YjgzOTNkLi41OTA5ZTM5IDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3N5c2NhbGx0YWJsZS5TCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvc3lzY2FsbHRhYmxlLlMKQEAgLTEsNiArMSw0IEBACiAvKgotICogIGxpbnV4L2FyY2gvbTY4a25vbW11L2tlcm5lbC9zeXNjYWxsdGFibGUuUwotICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDIsIEdyZWcgVW5nZXJlciAoZ2VyZ0BzbmFwZ2Vhci5jb20pCiAgKgogICogIEJhc2VkIG9uIG9sZGVyIGVudHJ5LlMgZmlsZXMsIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0cyBhcHBseToKQEAgLTksMTcxICs3LDE3NiBAQAogICogICAgICAgICAgICAgICAgICAgICAgS2VubmV0aCBBbGJhbm93c2tpIDxramFoZHNAa2phaGRzLmNvbT4sCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAwICBMaW5lbyBJbmMuICh3d3cubGluZW8uY29tKSAKICAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIExpbnV4L202OGsgc3VwcG9ydCBieSBIYW1pc2ggTWFjZG9uYWxkCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3N5cy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAKLS50ZXh0CisjaWZuZGVmIENPTkZJR19NTVUKKyNkZWZpbmUgc3lzX21tYXAyCQlzeXNfbW1hcF9wZ29mZgorI2VuZGlmCisKKy5zZWN0aW9uIC5yb2RhdGEKIEFMSUdOCiBFTlRSWShzeXNfY2FsbF90YWJsZSkKLQkubG9uZyBzeXNfcmVzdGFydF9zeXNjYWxsCS8qIDAgIC0gIG9sZCAic2V0dXAoKSIgc3lzdGVtIGNhbGwgKi8KKwkubG9uZyBzeXNfcmVzdGFydF9zeXNjYWxsCS8qIDAgLSBvbGQgInNldHVwKCkiIHN5c3RlbSBjYWxsLCB1c2VkIGZvciByZXN0YXJ0aW5nICovCiAJLmxvbmcgc3lzX2V4aXQKIAkubG9uZyBzeXNfZm9yawogCS5sb25nIHN5c19yZWFkCiAJLmxvbmcgc3lzX3dyaXRlCi0JLmxvbmcgc3lzX29wZW4JCS8qIDUgKi8KKwkubG9uZyBzeXNfb3BlbgkJCS8qIDUgKi8KIAkubG9uZyBzeXNfY2xvc2UKIAkubG9uZyBzeXNfd2FpdHBpZAogCS5sb25nIHN5c19jcmVhdAogCS5sb25nIHN5c19saW5rCi0JLmxvbmcgc3lzX3VubGluawkvKiAxMCAqLworCS5sb25nIHN5c191bmxpbmsJCS8qIDEwICovCiAJLmxvbmcgc3lzX2V4ZWN2ZQogCS5sb25nIHN5c19jaGRpcgogCS5sb25nIHN5c190aW1lCiAJLmxvbmcgc3lzX21rbm9kCi0JLmxvbmcgc3lzX2NobW9kCQkvKiAxNSAqLworCS5sb25nIHN5c19jaG1vZAkJCS8qIDE1ICovCiAJLmxvbmcgc3lzX2Nob3duMTYKLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBvbGQgYnJlYWsgc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkJLyogb2xkIGJyZWFrIHN5c2NhbGwgaG9sZGVyICovCiAJLmxvbmcgc3lzX3N0YXQKIAkubG9uZyBzeXNfbHNlZWsKLQkubG9uZyBzeXNfZ2V0cGlkCS8qIDIwICovCisJLmxvbmcgc3lzX2dldHBpZAkJLyogMjAgKi8KIAkubG9uZyBzeXNfbW91bnQKIAkubG9uZyBzeXNfb2xkdW1vdW50CiAJLmxvbmcgc3lzX3NldHVpZDE2CiAJLmxvbmcgc3lzX2dldHVpZDE2Ci0JLmxvbmcgc3lzX3N0aW1lCQkvKiAyNSAqLworCS5sb25nIHN5c19zdGltZQkJCS8qIDI1ICovCiAJLmxvbmcgc3lzX3B0cmFjZQogCS5sb25nIHN5c19hbGFybQogCS5sb25nIHN5c19mc3RhdAogCS5sb25nIHN5c19wYXVzZQotCS5sb25nIHN5c191dGltZQkJLyogMzAgKi8KLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBvbGQgc3R0eSBzeXNjYWxsIGhvbGRlciAqLwotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCBndHR5IHN5c2NhbGwgaG9sZGVyICovCisJLmxvbmcgc3lzX3V0aW1lCQkJLyogMzAgKi8KKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkJLyogb2xkIHN0dHkgc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkJLyogb2xkIGd0dHkgc3lzY2FsbCBob2xkZXIgKi8KIAkubG9uZyBzeXNfYWNjZXNzCiAJLmxvbmcgc3lzX25pY2UKLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiAzNSAqLyAvKiBvbGQgZnRpbWUgc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkJLyogMzUgLSBvbGQgZnRpbWUgc3lzY2FsbCBob2xkZXIgKi8KIAkubG9uZyBzeXNfc3luYwogCS5sb25nIHN5c19raWxsCiAJLmxvbmcgc3lzX3JlbmFtZQogCS5sb25nIHN5c19ta2RpcgotCS5sb25nIHN5c19ybWRpcgkJLyogNDAgKi8KKwkubG9uZyBzeXNfcm1kaXIJCQkvKiA0MCAqLwogCS5sb25nIHN5c19kdXAKIAkubG9uZyBzeXNfcGlwZQogCS5sb25nIHN5c190aW1lcwotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCBwcm9mIHN5c2NhbGwgaG9sZGVyICovCi0JLmxvbmcgc3lzX2JyawkJLyogNDUgKi8KKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkJLyogb2xkIHByb2Ygc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBzeXNfYnJrCQkJLyogNDUgKi8KIAkubG9uZyBzeXNfc2V0Z2lkMTYKIAkubG9uZyBzeXNfZ2V0Z2lkMTYKIAkubG9uZyBzeXNfc2lnbmFsCiAJLmxvbmcgc3lzX2dldGV1aWQxNgotCS5sb25nIHN5c19nZXRlZ2lkMTYJLyogNTAgKi8KKwkubG9uZyBzeXNfZ2V0ZWdpZDE2CQkvKiA1MCAqLwogCS5sb25nIHN5c19hY2N0Ci0JLmxvbmcgc3lzX3Vtb3VudAkvKiByZWN5Y2xlZCBuZXZlciB1c2VkIHBoeXMoKSAqLwotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCBsb2NrIHN5c2NhbGwgaG9sZGVyICovCisJLmxvbmcgc3lzX3Vtb3VudAkJLyogcmVjeWNsZWQgbmV2ZXIgdXNlZCBwaHlzKCkgKi8KKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkJLyogb2xkIGxvY2sgc3lzY2FsbCBob2xkZXIgKi8KIAkubG9uZyBzeXNfaW9jdGwKLQkubG9uZyBzeXNfZmNudGwJCS8qIDU1ICovCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogb2xkIG1weCBzeXNjYWxsIGhvbGRlciAqLworCS5sb25nIHN5c19mY250bAkJCS8qIDU1ICovCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJCS8qIG9sZCBtcHggc3lzY2FsbCBob2xkZXIgKi8KIAkubG9uZyBzeXNfc2V0cGdpZAotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCB1bGltaXQgc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkJLyogb2xkIHVsaW1pdCBzeXNjYWxsIGhvbGRlciAqLwogCS5sb25nIHN5c19uaV9zeXNjYWxsCi0JLmxvbmcgc3lzX3VtYXNrCQkvKiA2MCAqLworCS5sb25nIHN5c191bWFzawkJCS8qIDYwICovCiAJLmxvbmcgc3lzX2Nocm9vdAogCS5sb25nIHN5c191c3RhdAogCS5sb25nIHN5c19kdXAyCiAJLmxvbmcgc3lzX2dldHBwaWQKLQkubG9uZyBzeXNfZ2V0cGdycAkvKiA2NSAqLworCS5sb25nIHN5c19nZXRwZ3JwCQkvKiA2NSAqLwogCS5sb25nIHN5c19zZXRzaWQKIAkubG9uZyBzeXNfc2lnYWN0aW9uCiAJLmxvbmcgc3lzX3NnZXRtYXNrCiAJLmxvbmcgc3lzX3NzZXRtYXNrCi0JLmxvbmcgc3lzX3NldHJldWlkMTYJLyogNzAgKi8KKwkubG9uZyBzeXNfc2V0cmV1aWQxNgkJLyogNzAgKi8KIAkubG9uZyBzeXNfc2V0cmVnaWQxNgogCS5sb25nIHN5c19zaWdzdXNwZW5kCiAJLmxvbmcgc3lzX3NpZ3BlbmRpbmcKIAkubG9uZyBzeXNfc2V0aG9zdG5hbWUKLQkubG9uZyBzeXNfc2V0cmxpbWl0CS8qIDc1ICovCisJLmxvbmcgc3lzX3NldHJsaW1pdAkJLyogNzUgKi8KIAkubG9uZyBzeXNfb2xkX2dldHJsaW1pdAogCS5sb25nIHN5c19nZXRydXNhZ2UKIAkubG9uZyBzeXNfZ2V0dGltZW9mZGF5CiAJLmxvbmcgc3lzX3NldHRpbWVvZmRheQotCS5sb25nIHN5c19nZXRncm91cHMxNgkvKiA4MCAqLworCS5sb25nIHN5c19nZXRncm91cHMxNgkJLyogODAgKi8KIAkubG9uZyBzeXNfc2V0Z3JvdXBzMTYKIAkubG9uZyBzeXNfb2xkX3NlbGVjdAogCS5sb25nIHN5c19zeW1saW5rCiAJLmxvbmcgc3lzX2xzdGF0Ci0JLmxvbmcgc3lzX3JlYWRsaW5rCS8qIDg1ICovCisJLmxvbmcgc3lzX3JlYWRsaW5rCQkvKiA4NSAqLwogCS5sb25nIHN5c191c2VsaWIKLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBzeXNfc3dhcG9uICovCisJLmxvbmcgc3lzX3N3YXBvbgogCS5sb25nIHN5c19yZWJvb3QKIAkubG9uZyBzeXNfb2xkX3JlYWRkaXIKLQkubG9uZyBzeXNfb2xkX21tYXAJLyogOTAgKi8KKwkubG9uZyBzeXNfb2xkX21tYXAJCS8qIDkwICovCiAJLmxvbmcgc3lzX211bm1hcAogCS5sb25nIHN5c190cnVuY2F0ZQogCS5sb25nIHN5c19mdHJ1bmNhdGUKIAkubG9uZyBzeXNfZmNobW9kCi0JLmxvbmcgc3lzX2ZjaG93bjE2CS8qIDk1ICovCisJLmxvbmcgc3lzX2ZjaG93bjE2CQkvKiA5NSAqLwogCS5sb25nIHN5c19nZXRwcmlvcml0eQogCS5sb25nIHN5c19zZXRwcmlvcml0eQotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCBwcm9maWwgc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkJLyogb2xkIHByb2ZpbCBzeXNjYWxsIGhvbGRlciAqLwogCS5sb25nIHN5c19zdGF0ZnMKLQkubG9uZyBzeXNfZnN0YXRmcwkvKiAxMDAgKi8KLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBpb3Blcm0gZm9yIGkzODYgKi8KKwkubG9uZyBzeXNfZnN0YXRmcwkJLyogMTAwICovCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJCS8qIGlvcGVybSBmb3IgaTM4NiAqLwogCS5sb25nIHN5c19zb2NrZXRjYWxsCiAJLmxvbmcgc3lzX3N5c2xvZwogCS5sb25nIHN5c19zZXRpdGltZXIKLQkubG9uZyBzeXNfZ2V0aXRpbWVyCS8qIDEwNSAqLworCS5sb25nIHN5c19nZXRpdGltZXIJCS8qIDEwNSAqLwogCS5sb25nIHN5c19uZXdzdGF0CiAJLmxvbmcgc3lzX25ld2xzdGF0CiAJLmxvbmcgc3lzX25ld2ZzdGF0CiAJLmxvbmcgc3lzX25pX3N5c2NhbGwKLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBpb3BsIGZvciBpMzg2ICovIC8qIDExMCAqLworCS5sb25nIHN5c19uaV9zeXNjYWxsCQkvKiAxMTAgLSBpb3BsIGZvciBpMzg2ICovCiAJLmxvbmcgc3lzX3ZoYW5ndXAKLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBvYnNvbGV0ZSBpZGxlKCkgc3lzY2FsbCAqLwotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIHZtODZvbGQgZm9yIGkzODYgKi8KKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkJLyogb2Jzb2xldGUgaWRsZSgpIHN5c2NhbGwgKi8KKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkJLyogdm04Nm9sZCBmb3IgaTM4NiAqLwogCS5sb25nIHN5c193YWl0NAotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIDExNSAqLyAvKiBzeXNfc3dhcG9mZiAqLworCS5sb25nIHN5c19zd2Fwb2ZmCQkvKiAxMTUgKi8KIAkubG9uZyBzeXNfc3lzaW5mbwogCS5sb25nIHN5c19pcGMKIAkubG9uZyBzeXNfZnN5bmMKIAkubG9uZyBzeXNfc2lncmV0dXJuCi0JLmxvbmcgc3lzX2Nsb25lCQkvKiAxMjAgKi8KKwkubG9uZyBzeXNfY2xvbmUJCQkvKiAxMjAgKi8KIAkubG9uZyBzeXNfc2V0ZG9tYWlubmFtZQogCS5sb25nIHN5c19uZXd1bmFtZQotCS5sb25nIHN5c19jYWNoZWZsdXNoCS8qIG1vZGlmeV9sZHQgZm9yIGkzODYgKi8KKwkubG9uZyBzeXNfY2FjaGVmbHVzaAkJLyogbW9kaWZ5X2xkdCBmb3IgaTM4NiAqLwogCS5sb25nIHN5c19hZGp0aW1leAotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIDEyNSAqLyAvKiBzeXNfbXByb3RlY3QgKi8KKwkubG9uZyBzeXNfbXByb3RlY3QJCS8qIDEyNSAqLwogCS5sb25nIHN5c19zaWdwcm9jbWFzawotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCAiY3JlYXRfbW9kdWxlIiAqLworCS5sb25nIHN5c19uaV9zeXNjYWxsCQkvKiBvbGQgImNyZWF0ZV9tb2R1bGUiICovCiAJLmxvbmcgc3lzX2luaXRfbW9kdWxlCiAJLmxvbmcgc3lzX2RlbGV0ZV9tb2R1bGUKLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiAxMzA6IG9sZCAiZ2V0X2tlcm5lbF9zeW1zIiAqLworCS5sb25nIHN5c19uaV9zeXNjYWxsCQkvKiAxMzAgLSBvbGQgImdldF9rZXJuZWxfc3ltcyIgKi8KIAkubG9uZyBzeXNfcXVvdGFjdGwKIAkubG9uZyBzeXNfZ2V0cGdpZAogCS5sb25nIHN5c19mY2hkaXIKIAkubG9uZyBzeXNfYmRmbHVzaAotCS5sb25nIHN5c19zeXNmcwkJLyogMTM1ICovCisJLmxvbmcgc3lzX3N5c2ZzCQkJLyogMTM1ICovCiAJLmxvbmcgc3lzX3BlcnNvbmFsaXR5Ci0JLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogZm9yIGFmc19zeXNjYWxsICovCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJCS8qIGZvciBhZnNfc3lzY2FsbCAqLwogCS5sb25nIHN5c19zZXRmc3VpZDE2CiAJLmxvbmcgc3lzX3NldGZzZ2lkMTYKLQkubG9uZyBzeXNfbGxzZWVrCS8qIDE0MCAqLworCS5sb25nIHN5c19sbHNlZWsJCS8qIDE0MCAqLwogCS5sb25nIHN5c19nZXRkZW50cwogCS5sb25nIHN5c19zZWxlY3QKIAkubG9uZyBzeXNfZmxvY2sKLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBzeXNfbXN5bmMgKi8KLQkubG9uZyBzeXNfcmVhZHYJCS8qIDE0NSAqLworCS5sb25nIHN5c19tc3luYworCS5sb25nIHN5c19yZWFkdgkJCS8qIDE0NSAqLwogCS5sb25nIHN5c193cml0ZXYKIAkubG9uZyBzeXNfZ2V0c2lkCiAJLmxvbmcgc3lzX2ZkYXRhc3luYwogCS5sb25nIHN5c19zeXNjdGwKLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiAxNTAgKi8gLyogc3lzX21sb2NrICovCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogc3lzX211bmxvY2sgKi8KLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBzeXNfbWxvY2thbGwgKi8KLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBzeXNfbXVubG9ja2FsbCAqLworCS5sb25nIHN5c19tbG9jawkJCS8qIDE1MCAqLworCS5sb25nIHN5c19tdW5sb2NrCisJLmxvbmcgc3lzX21sb2NrYWxsCisJLmxvbmcgc3lzX211bmxvY2thbGwKIAkubG9uZyBzeXNfc2NoZWRfc2V0cGFyYW0KLQkubG9uZyBzeXNfc2NoZWRfZ2V0cGFyYW0gLyogMTU1ICovCisJLmxvbmcgc3lzX3NjaGVkX2dldHBhcmFtCS8qIDE1NSAqLwogCS5sb25nIHN5c19zY2hlZF9zZXRzY2hlZHVsZXIKIAkubG9uZyBzeXNfc2NoZWRfZ2V0c2NoZWR1bGVyCiAJLmxvbmcgc3lzX3NjaGVkX3lpZWxkCkBAIC0xODEsMTI0ICsxODQsMTI0IEBACiAJLmxvbmcgc3lzX3NjaGVkX2dldF9wcmlvcml0eV9taW4gIC8qIDE2MCAqLwogCS5sb25nIHN5c19zY2hlZF9ycl9nZXRfaW50ZXJ2YWwKIAkubG9uZyBzeXNfbmFub3NsZWVwCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogc3lzX21yZW1hcCAqLworCS5sb25nIHN5c19tcmVtYXAKIAkubG9uZyBzeXNfc2V0cmVzdWlkMTYKLQkubG9uZyBzeXNfZ2V0cmVzdWlkMTYJLyogMTY1ICovCi0JLmxvbmcgc3lzX2dldHBhZ2VzaXplCS8qIHN5c19nZXRwYWdlc2l6ZSAqLwotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCAicXVlcnlfbW9kdWxlIiAqLworCS5sb25nIHN5c19nZXRyZXN1aWQxNgkJLyogMTY1ICovCisJLmxvbmcgc3lzX2dldHBhZ2VzaXplCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJCS8qIG9sZCAicXVlcnlfbW9kdWxlIiAqLwogCS5sb25nIHN5c19wb2xsCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogc3lzX25mc3NlcnZjdGwgKi8KLQkubG9uZyBzeXNfc2V0cmVzZ2lkMTYJLyogMTcwICovCisJLmxvbmcgc3lzX25mc3NlcnZjdGwKKwkubG9uZyBzeXNfc2V0cmVzZ2lkMTYJCS8qIDE3MCAqLwogCS5sb25nIHN5c19nZXRyZXNnaWQxNgogCS5sb25nIHN5c19wcmN0bAogCS5sb25nIHN5c19ydF9zaWdyZXR1cm4KIAkubG9uZyBzeXNfcnRfc2lnYWN0aW9uCi0JLmxvbmcgc3lzX3J0X3NpZ3Byb2NtYXNrIC8qIDE3NSAqLworCS5sb25nIHN5c19ydF9zaWdwcm9jbWFzawkvKiAxNzUgKi8KIAkubG9uZyBzeXNfcnRfc2lncGVuZGluZwogCS5sb25nIHN5c19ydF9zaWd0aW1lZHdhaXQKIAkubG9uZyBzeXNfcnRfc2lncXVldWVpbmZvCiAJLmxvbmcgc3lzX3J0X3NpZ3N1c3BlbmQKLQkubG9uZyBzeXNfcHJlYWQ2NAkvKiAxODAgKi8KKwkubG9uZyBzeXNfcHJlYWQ2NAkJLyogMTgwICovCiAJLmxvbmcgc3lzX3B3cml0ZTY0CiAJLmxvbmcgc3lzX2xjaG93bjE2CiAJLmxvbmcgc3lzX2dldGN3ZAogCS5sb25nIHN5c19jYXBnZXQKLQkubG9uZyBzeXNfY2Fwc2V0CS8qIDE4NSAqLworCS5sb25nIHN5c19jYXBzZXQJCS8qIDE4NSAqLwogCS5sb25nIHN5c19zaWdhbHRzdGFjawogCS5sb25nIHN5c19zZW5kZmlsZQotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIHN0cmVhbXMxICovCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogc3RyZWFtczIgKi8KLQkubG9uZyBzeXNfdmZvcmsJCS8qIDE5MCAqLworCS5sb25nIHN5c19uaV9zeXNjYWxsCQkvKiBzdHJlYW1zMSAqLworCS5sb25nIHN5c19uaV9zeXNjYWxsCQkvKiBzdHJlYW1zMiAqLworCS5sb25nIHN5c192Zm9yawkJCS8qIDE5MCAqLwogCS5sb25nIHN5c19nZXRybGltaXQKLQkubG9uZyBzeXNfbW1hcF9wZ29mZgorCS5sb25nIHN5c19tbWFwMgogCS5sb25nIHN5c190cnVuY2F0ZTY0CiAJLmxvbmcgc3lzX2Z0cnVuY2F0ZTY0Ci0JLmxvbmcgc3lzX3N0YXQ2NAkvKiAxOTUgKi8KKwkubG9uZyBzeXNfc3RhdDY0CQkvKiAxOTUgKi8KIAkubG9uZyBzeXNfbHN0YXQ2NAogCS5sb25nIHN5c19mc3RhdDY0CiAJLmxvbmcgc3lzX2Nob3duCiAJLmxvbmcgc3lzX2dldHVpZAotCS5sb25nIHN5c19nZXRnaWQJLyogMjAwICovCisJLmxvbmcgc3lzX2dldGdpZAkJLyogMjAwICovCiAJLmxvbmcgc3lzX2dldGV1aWQKIAkubG9uZyBzeXNfZ2V0ZWdpZAogCS5sb25nIHN5c19zZXRyZXVpZAogCS5sb25nIHN5c19zZXRyZWdpZAotCS5sb25nIHN5c19nZXRncm91cHMJLyogMjA1ICovCisJLmxvbmcgc3lzX2dldGdyb3VwcwkJLyogMjA1ICovCiAJLmxvbmcgc3lzX3NldGdyb3VwcwogCS5sb25nIHN5c19mY2hvd24KIAkubG9uZyBzeXNfc2V0cmVzdWlkCiAJLmxvbmcgc3lzX2dldHJlc3VpZAotCS5sb25nIHN5c19zZXRyZXNnaWQJLyogMjEwICovCisJLmxvbmcgc3lzX3NldHJlc2dpZAkJLyogMjEwICovCiAJLmxvbmcgc3lzX2dldHJlc2dpZAogCS5sb25nIHN5c19sY2hvd24KIAkubG9uZyBzeXNfc2V0dWlkCiAJLmxvbmcgc3lzX3NldGdpZAotCS5sb25nIHN5c19zZXRmc3VpZAkvKiAyMTUgKi8KKwkubG9uZyBzeXNfc2V0ZnN1aWQJCS8qIDIxNSAqLwogCS5sb25nIHN5c19zZXRmc2dpZAogCS5sb25nIHN5c19waXZvdF9yb290CiAJLmxvbmcgc3lzX25pX3N5c2NhbGwKIAkubG9uZyBzeXNfbmlfc3lzY2FsbAotCS5sb25nIHN5c19nZXRkZW50czY0CS8qIDIyMCAqLworCS5sb25nIHN5c19nZXRkZW50czY0CQkvKiAyMjAgKi8KIAkubG9uZyBzeXNfZ2V0dGlkCiAJLmxvbmcgc3lzX3RraWxsCiAJLmxvbmcgc3lzX3NldHhhdHRyCiAJLmxvbmcgc3lzX2xzZXR4YXR0cgotCS5sb25nIHN5c19mc2V0eGF0dHIJLyogMjI1ICovCisJLmxvbmcgc3lzX2ZzZXR4YXR0cgkJLyogMjI1ICovCiAJLmxvbmcgc3lzX2dldHhhdHRyCiAJLmxvbmcgc3lzX2xnZXR4YXR0cgogCS5sb25nIHN5c19mZ2V0eGF0dHIKIAkubG9uZyBzeXNfbGlzdHhhdHRyCi0JLmxvbmcgc3lzX2xsaXN0eGF0dHIJLyogMjMwICovCisJLmxvbmcgc3lzX2xsaXN0eGF0dHIJCS8qIDIzMCAqLwogCS5sb25nIHN5c19mbGlzdHhhdHRyCiAJLmxvbmcgc3lzX3JlbW92ZXhhdHRyCiAJLmxvbmcgc3lzX2xyZW1vdmV4YXR0cgogCS5sb25nIHN5c19mcmVtb3ZleGF0dHIKLQkubG9uZyBzeXNfZnV0ZXgJCS8qIDIzNSAqLworCS5sb25nIHN5c19mdXRleAkJCS8qIDIzNSAqLwogCS5sb25nIHN5c19zZW5kZmlsZTY0Ci0JLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogc3lzX21pbmNvcmUgKi8KLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBzeXNfbWFkdmlzZSAqLworCS5sb25nIHN5c19taW5jb3JlCisJLmxvbmcgc3lzX21hZHZpc2UKIAkubG9uZyBzeXNfZmNudGw2NAotCS5sb25nIHN5c19yZWFkYWhlYWQJLyogMjQwICovCisJLmxvbmcgc3lzX3JlYWRhaGVhZAkJLyogMjQwICovCiAJLmxvbmcgc3lzX2lvX3NldHVwCiAJLmxvbmcgc3lzX2lvX2Rlc3Ryb3kKIAkubG9uZyBzeXNfaW9fZ2V0ZXZlbnRzCiAJLmxvbmcgc3lzX2lvX3N1Ym1pdAotCS5sb25nIHN5c19pb19jYW5jZWwJLyogMjQ1ICovCisJLmxvbmcgc3lzX2lvX2NhbmNlbAkJLyogMjQ1ICovCiAJLmxvbmcgc3lzX2ZhZHZpc2U2NAogCS5sb25nIHN5c19leGl0X2dyb3VwCiAJLmxvbmcgc3lzX2xvb2t1cF9kY29va2llCiAJLmxvbmcgc3lzX2Vwb2xsX2NyZWF0ZQotCS5sb25nIHN5c19lcG9sbF9jdGwJLyogMjUwICovCisJLmxvbmcgc3lzX2Vwb2xsX2N0bAkJLyogMjUwICovCiAJLmxvbmcgc3lzX2Vwb2xsX3dhaXQKLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBzeXNfcmVtYXBfZmlsZV9wYWdlcyAqLworCS5sb25nIHN5c19yZW1hcF9maWxlX3BhZ2VzCiAJLmxvbmcgc3lzX3NldF90aWRfYWRkcmVzcwogCS5sb25nIHN5c190aW1lcl9jcmVhdGUKLQkubG9uZyBzeXNfdGltZXJfc2V0dGltZQkvKiAyNTUgKi8KKwkubG9uZyBzeXNfdGltZXJfc2V0dGltZQkJLyogMjU1ICovCiAJLmxvbmcgc3lzX3RpbWVyX2dldHRpbWUKIAkubG9uZyBzeXNfdGltZXJfZ2V0b3ZlcnJ1bgogCS5sb25nIHN5c190aW1lcl9kZWxldGUKIAkubG9uZyBzeXNfY2xvY2tfc2V0dGltZQotCS5sb25nIHN5c19jbG9ja19nZXR0aW1lCS8qIDI2MCAqLworCS5sb25nIHN5c19jbG9ja19nZXR0aW1lCQkvKiAyNjAgKi8KIAkubG9uZyBzeXNfY2xvY2tfZ2V0cmVzCiAJLmxvbmcgc3lzX2Nsb2NrX25hbm9zbGVlcAogCS5sb25nIHN5c19zdGF0ZnM2NAogCS5sb25nIHN5c19mc3RhdGZzNjQKLQkubG9uZyBzeXNfdGdraWxsCS8qIDI2NSAqLworCS5sb25nIHN5c190Z2tpbGwJCS8qIDI2NSAqLwogCS5sb25nIHN5c191dGltZXMKIAkubG9uZyBzeXNfZmFkdmlzZTY0XzY0Ci0JLmxvbmcgc3lzX21iaW5kCQorCS5sb25nIHN5c19tYmluZAogCS5sb25nIHN5c19nZXRfbWVtcG9saWN5Ci0JLmxvbmcgc3lzX3NldF9tZW1wb2xpY3kJLyogMjcwICovCisJLmxvbmcgc3lzX3NldF9tZW1wb2xpY3kJCS8qIDI3MCAqLwogCS5sb25nIHN5c19tcV9vcGVuCiAJLmxvbmcgc3lzX21xX3VubGluawogCS5sb25nIHN5c19tcV90aW1lZHNlbmQKIAkubG9uZyBzeXNfbXFfdGltZWRyZWNlaXZlCi0JLmxvbmcgc3lzX21xX25vdGlmeQkvKiAyNzUgKi8KKwkubG9uZyBzeXNfbXFfbm90aWZ5CQkvKiAyNzUgKi8KIAkubG9uZyBzeXNfbXFfZ2V0c2V0YXR0cgogCS5sb25nIHN5c193YWl0aWQKLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBmb3Igc3lzX3ZzZXJ2ZXIgKi8KKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkJLyogZm9yIHN5c192c2VydmVyICovCiAJLmxvbmcgc3lzX2FkZF9rZXkKLQkubG9uZyBzeXNfcmVxdWVzdF9rZXkJLyogMjgwICovCisJLmxvbmcgc3lzX3JlcXVlc3Rfa2V5CQkvKiAyODAgKi8KIAkubG9uZyBzeXNfa2V5Y3RsCiAJLmxvbmcgc3lzX2lvcHJpb19zZXQKIAkubG9uZyBzeXNfaW9wcmlvX2dldApAQCAtMzE5LDggKzMyMiw4IEBACiAJLmxvbmcgc3lzX3JlYWRsaW5rYXQKIAkubG9uZyBzeXNfZmNobW9kYXQKIAkubG9uZyBzeXNfZmFjY2Vzc2F0CQkvKiAzMDAgKi8KLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkJLyogUmVzZXJ2ZWQgZm9yIHBzZWxlY3Q2ICovCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJCS8qIFJlc2VydmVkIGZvciBwcG9sbCAqLworCS5sb25nIHN5c19wc2VsZWN0NgorCS5sb25nIHN5c19wcG9sbAogCS5sb25nIHN5c191bnNoYXJlCiAJLmxvbmcgc3lzX3NldF9yb2J1c3RfbGlzdAogCS5sb25nIHN5c19nZXRfcm9idXN0X2xpc3QJLyogMzA1ICovCkBAIC0zNjMsNyArMzY2LDMgQEAKIAkubG9uZyBzeXNfY2xvY2tfYWRqdGltZQogCS5sb25nIHN5c19zeW5jZnMKIAotCS5yZXB0IE5SX3N5c2NhbGxzLSguLXN5c19jYWxsX3RhYmxlKS80Ci0JCS5sb25nIHN5c19uaV9zeXNjYWxsCi0JLmVuZHIKLQpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC90aW1lci5jIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC90aW1lci5jCmluZGV4IGQ4YTIxNGYuLmU1NTUwY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvdGltZXIuYworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL3RpbWVyLmMKQEAgLTIxNywxNiArMjE3LDEyIEBACiAJLnJhdGluZwkJPSAzMDAsCiAJLnJlYWQJCT0gbWljcm9ibGF6ZV9yZWFkLAogCS5tYXNrCQk9IENMT0NLU09VUkNFX01BU0soMzIpLAotCS5zaGlmdAkJPSA4LCAvKiBJIGNhbiBzaGlmdCBpdCAqLwogCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IG1pY3JvYmxhemVfY2xvY2tzb3VyY2VfaW5pdCh2b2lkKQogewotCWNsb2Nrc291cmNlX21pY3JvYmxhemUubXVsdCA9Ci0JCQljbG9ja3NvdXJjZV9oejJtdWx0KHRpbWVyX2Nsb2NrX2ZyZXEsCi0JCQkJCQljbG9ja3NvdXJjZV9taWNyb2JsYXplLnNoaWZ0KTsKLQlpZiAoY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNsb2Nrc291cmNlX21pY3JvYmxhemUpKQorCWlmIChjbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmY2xvY2tzb3VyY2VfbWljcm9ibGF6ZSwgdGltZXJfY2xvY2tfZnJlcSkpCiAJCXBhbmljKCJmYWlsZWQgdG8gcmVnaXN0ZXIgY2xvY2tzb3VyY2UiKTsKIAogCS8qIHN0b3AgdGltZXIxICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvS2J1aWxkLnBsYXRmb3JtcyBiL2FyY2gvbWlwcy9LYnVpbGQucGxhdGZvcm1zCmluZGV4IDdmZjliNTQuLmFlZjZjOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9LYnVpbGQucGxhdGZvcm1zCisrKyBiL2FyY2gvbWlwcy9LYnVpbGQucGxhdGZvcm1zCkBAIC0xMSw2ICsxMSw3IEBACiBwbGF0Zm9ybXMgKz0gZW1tYQogcGxhdGZvcm1zICs9IGphenoKIHBsYXRmb3JtcyArPSBqejQ3NDAKK3BsYXRmb3JtcyArPSBsYW50aXEKIHBsYXRmb3JtcyArPSBsYXNhdAogcGxhdGZvcm1zICs9IGxvb25nc29uCiBwbGF0Zm9ybXMgKz0gbWlwc3NpbQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL0tjb25maWcgYi9hcmNoL21pcHMvS2NvbmZpZwppbmRleCAzNTFjODBmLi5jZWYxYTg1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvS2NvbmZpZworKysgYi9hcmNoL21pcHMvS2NvbmZpZwpAQCAtMjEyLDYgKzIxMiwyNCBAQAogCXNlbGVjdCBIQVZFX1BXTQogCXNlbGVjdCBIQVZFX0NMSwogCitjb25maWcgTEFOVElRCisJYm9vbCAiTGFudGlxIGJhc2VkIHBsYXRmb3JtcyIKKwlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCisJc2VsZWN0IElSUV9DUFUKKwlzZWxlY3QgQ0VWVF9SNEsKKwlzZWxlY3QgQ1NSQ19SNEsKKwlzZWxlY3QgU1lTX0hBU19DUFVfTUlQUzMyX1IxCisJc2VsZWN0IFNZU19IQVNfQ1BVX01JUFMzMl9SMgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfQklHX0VORElBTgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCisJc2VsZWN0IFNZU19TVVBQT1JUU19NVUxUSVRIUkVBRElORworCXNlbGVjdCBTWVNfSEFTX0VBUkxZX1BSSU5USworCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgorCXNlbGVjdCBTV0FQX0lPX1NQQUNFCisJc2VsZWN0IEJPT1RfUkFXCisJc2VsZWN0IEhBVkVfQ0xLCisJc2VsZWN0IE1JUFNfTUFDSElORQorCiBjb25maWcgTEFTQVQKIAlib29sICJMQVNBVCBOZXR3b3JrcyBwbGF0Zm9ybXMiCiAJc2VsZWN0IENFVlRfUjRLCkBAIC03MzYsNiArNzU0LDMzIEBACiAJCUhpa2FyaQogCSAgU2F5IFkgaGVyZSBmb3IgbW9zdCBPY3Rlb24gcmVmZXJlbmNlIGJvYXJkcy4KIAorY29uZmlnIE5MTV9YTFJfQk9BUkQKKwlib29sICJOZXRsb2dpYyBYTFIvWExTIGJhc2VkIHN5c3RlbXMiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgQk9PVF9FTEYzMgorCXNlbGVjdCBOTE1fQ09NTU9OCisJc2VsZWN0IE5MTV9YTFIKKwlzZWxlY3QgU1lTX0hBU19DUFVfWExSCisJc2VsZWN0IFNZU19TVVBQT1JUU19TTVAKKwlzZWxlY3QgSFdfSEFTX1BDSQorCXNlbGVjdCBTV0FQX0lPX1NQQUNFCisJc2VsZWN0IFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKKwlzZWxlY3QgU1lTX1NVUFBPUlRTXzY0QklUX0tFUk5FTAorCXNlbGVjdCA2NEJJVF9QSFlTX0FERFIKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX0JJR19FTkRJQU4KKwlzZWxlY3QgU1lTX1NVUFBPUlRTX0hJR0hNRU0KKwlzZWxlY3QgRE1BX0NPSEVSRU5UCisJc2VsZWN0IE5SX0NQVVNfREVGQVVMVF8zMgorCXNlbGVjdCBDRVZUX1I0SworCXNlbGVjdCBDU1JDX1I0SworCXNlbGVjdCBJUlFfQ1BVCisJc2VsZWN0IFpPTkVfRE1BIGlmIDY0QklUCisJc2VsZWN0IFNZTkNfUjRLCisJc2VsZWN0IFNZU19IQVNfRUFSTFlfUFJJTlRLCisJaGVscAorCSAgU3VwcG9ydCBmb3Igc3lzdGVtcyBiYXNlZCBvbiBOZXRsb2dpYyBYTFIgYW5kIFhMUyBwcm9jZXNzb3JzLgorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFhMUiBvciBYTFMgYmFzZWQgYm9hcmQuCisKIGVuZGNob2ljZQogCiBzb3VyY2UgImFyY2gvbWlwcy9hbGNoZW15L0tjb25maWciCkBAIC03NDMsNiArNzg4LDcgQEAKIHNvdXJjZSAiYXJjaC9taXBzL2JjbTYzeHgvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9taXBzL2phenovS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9taXBzL2p6NDc0MC9LY29uZmlnIgorc291cmNlICJhcmNoL21pcHMvbGFudGlxL0tjb25maWciCiBzb3VyY2UgImFyY2gvbWlwcy9sYXNhdC9LY29uZmlnIgogc291cmNlICJhcmNoL21pcHMvcG1jLXNpZXJyYS9LY29uZmlnIgogc291cmNlICJhcmNoL21pcHMvcG93ZXJ0di9LY29uZmlnIgpAQCAtNzUyLDYgKzc5OCw3IEBACiBzb3VyY2UgImFyY2gvbWlwcy92cjQxeHgvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9taXBzL2xvb25nc29uL0tjb25maWciCitzb3VyY2UgImFyY2gvbWlwcy9uZXRsb2dpYy9LY29uZmlnIgogCiBlbmRtZW51CiAKQEAgLTE0MjAsNiArMTQ2NywxNyBAQAogCWhlbHAKIAkgIEJyb2FkY29tIEJNSVBTNTAwMCBwcm9jZXNzb3JzLgogCitjb25maWcgQ1BVX1hMUgorCWJvb2wgIk5ldGxvZ2ljIFhMUiBTb0MiCisJZGVwZW5kcyBvbiBTWVNfSEFTX0NQVV9YTFIKKwlzZWxlY3QgQ1BVX1NVUFBPUlRTXzMyQklUX0tFUk5FTAorCXNlbGVjdCBDUFVfU1VQUE9SVFNfNjRCSVRfS0VSTkVMCisJc2VsZWN0IENQVV9TVVBQT1JUU19ISUdITUVNCisJc2VsZWN0IFdFQUtfT1JERVJJTkcKKwlzZWxlY3QgV0VBS19SRU9SREVSSU5HX0JFWU9ORF9MTFNDCisJc2VsZWN0IENQVV9TVVBQT1JUU19IVUdFUEFHRVMKKwloZWxwCisJICBOZXRsb2dpYyBNaWNyb3N5c3RlbXMgWExSL1hMUyBwcm9jZXNzb3JzLgogZW5kY2hvaWNlCiAKIGlmIENQVV9MT09OR1NPTjJGCkBAIC0xNTUwLDYgKzE2MDgsOSBAQAogY29uZmlnIFNZU19IQVNfQ1BVX0JNSVBTNTAwMAogCWJvb2wKIAorY29uZmlnIFNZU19IQVNfQ1BVX1hMUgorCWJvb2wKKwogIwogIyBDUFUgbWF5IHJlb3JkZXIgUi0+UiwgUi0+VywgVy0+UiwgVy0+VwogIyBSZW9yZGVyaW5nIGJleW9uZCBMTCBhbmQgU0MgaXMgaGFuZGxlZCBpbiBXRUFLX1JFT1JERVJJTkdfQkVZT05EX0xMU0MKQEAgLTIzMzQsNiArMjM5NSw3IEBACiAKIGNvbmZpZyBJODI1MwogCWJvb2wKKwlzZWxlY3QgQ0xLU1JDX0k4MjUzCiAJc2VsZWN0IE1JUFNfRVhURVJOQUxfVElNRVIKIAogY29uZmlnIFpPTkVfRE1BMzIKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9NYWtlZmlsZSBiL2FyY2gvbWlwcy9NYWtlZmlsZQppbmRleCA1M2UzNTE0Li44ODQ4MTljIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL01ha2VmaWxlCkBAIC0xOTEsNiArMTkxLDE4IEBACiAjCiBpbmNsdWRlICQoc3JjdHJlZSkvYXJjaC9taXBzL0tidWlsZC5wbGF0Zm9ybXMKIAorIworIyBORVRMT0dJQyBTT0MgQ29tbW9uIChjb21tb24pCisjCitjZmxhZ3MtJChDT05GSUdfTkxNX0NPTU1PTikJCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1uZXRsb2dpYworY2ZsYWdzLSQoQ09ORklHX05MTV9DT01NT04pCQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL25ldGxvZ2ljCisKKyMKKyMgTkVUTE9HSUMgWExSL1hMUyBTb0MsIFNpbXVsYXRvciBhbmQgYm9hcmRzCisjCitjb3JlLSQoQ09ORklHX05MTV9YTFIpICAgICAgCQkrPSBhcmNoL21pcHMvbmV0bG9naWMveGxyLworbG9hZC0kKENPTkZJR19OTE1fWExSX0JPQVJEKQkJKz0gMHhmZmZmZmZmZjg0MDAwMDAwCisKIGNmbGFncy15CQkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWdlbmVyaWMKIGRyaXZlcnMtJChDT05GSUdfUENJKQkJKz0gYXJjaC9taXBzL3BjaS8KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2RiZG1hLmMgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vZGJkbWEuYwppbmRleCBjYTA1MDZhLi4zYTVhYmI1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vZGJkbWEuYworKysgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vZGJkbWEuYwpAQCAtMzYsNyArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MXh4eF9kYmRtYS5oPgogCkBAIC01OCw3ICs1OCw4IEBACiAvKiBJIGNvdWxkbid0IGZpbmQgYSBtYWNybyB0aGF0IGRpZCB0aGlzLi4uICovCiAjZGVmaW5lIEFMSUdOX0FERFIoeCwgYSkJKCgoKHUzMikoeCkpICsgKGEtMSkpICYgfihhLTEpKQogCi1zdGF0aWMgZGJkbWFfZ2xvYmFsX3QgKmRiZG1hX2dwdHIgPSAoZGJkbWFfZ2xvYmFsX3QgKilERE1BX0dMT0JBTF9CQVNFOworc3RhdGljIGRiZG1hX2dsb2JhbF90ICpkYmRtYV9ncHRyID0KKwkJCShkYmRtYV9nbG9iYWxfdCAqKUtTRUcxQUREUihBVTE1NTBfREJETUFfQ09ORl9QSFlTX0FERFIpOwogc3RhdGljIGludCBkYmRtYV9pbml0aWFsaXplZDsKIAogc3RhdGljIGRiZGV2X3RhYl90IGRiZGV2X3RhYltdID0gewpAQCAtMjk5LDcgKzMwMCw3IEBACiAJaWYgKGN0cCAhPSBOVUxMKSB7CiAJCW1lbXNldChjdHAsIDAsIHNpemVvZihjaGFuX3RhYl90KSk7CiAJCWN0cC0+Y2hhbl9pbmRleCA9IGNoYW4gPSBpOwotCQlkY3AgPSBERE1BX0NIQU5ORUxfQkFTRTsKKwkJZGNwID0gS1NFRzFBRERSKEFVMTU1MF9EQkRNQV9QSFlTX0FERFIpOwogCQlkY3AgKz0gKDB4MDEwMCAqIGNoYW4pOwogCQljdHAtPmNoYW5fcHRyID0gKGF1MXhfZG1hX2NoYW5fdCAqKWRjcDsKIAkJY3AgPSAoYXUxeF9kbWFfY2hhbl90ICopZGNwOwpAQCAtOTU4LDEwNSArOTU5LDc1IEBACiB9CiAKIAotc3RydWN0IGFsY2hlbXlfZGJkbWFfc3lzZGV2IHsKLQlzdHJ1Y3Qgc3lzX2RldmljZSBzeXNkZXY7Ci0JdTMyIHBtX3JlZ3NbTlVNX0RCRE1BX0NIQU5TICsgMV1bNl07Ci19Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgYWxjaGVteV9kYmRtYV9wbV9kYXRhW05VTV9EQkRNQV9DSEFOUyArIDFdWzZdOwogCi1zdGF0aWMgaW50IGFsY2hlbXlfZGJkbWFfc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LAotCQkJCSBwbV9tZXNzYWdlX3Qgc3RhdGUpCitzdGF0aWMgaW50IGFsY2hlbXlfZGJkbWFfc3VzcGVuZCh2b2lkKQogewotCXN0cnVjdCBhbGNoZW15X2RiZG1hX3N5c2RldiAqc2RldiA9Ci0JCWNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBhbGNoZW15X2RiZG1hX3N5c2Rldiwgc3lzZGV2KTsKIAlpbnQgaTsKLQl1MzIgYWRkcjsKKwl2b2lkIF9faW9tZW0gKmFkZHI7CiAKLQlhZGRyID0gRERNQV9HTE9CQUxfQkFTRTsKLQlzZGV2LT5wbV9yZWdzWzBdWzBdID0gYXVfcmVhZGwoYWRkciArIDB4MDApOwotCXNkZXYtPnBtX3JlZ3NbMF1bMV0gPSBhdV9yZWFkbChhZGRyICsgMHgwNCk7Ci0Jc2Rldi0+cG1fcmVnc1swXVsyXSA9IGF1X3JlYWRsKGFkZHIgKyAweDA4KTsKLQlzZGV2LT5wbV9yZWdzWzBdWzNdID0gYXVfcmVhZGwoYWRkciArIDB4MGMpOworCWFkZHIgPSAodm9pZCBfX2lvbWVtICopS1NFRzFBRERSKEFVMTU1MF9EQkRNQV9DT05GX1BIWVNfQUREUik7CisJYWxjaGVteV9kYmRtYV9wbV9kYXRhWzBdWzBdID0gX19yYXdfcmVhZGwoYWRkciArIDB4MDApOworCWFsY2hlbXlfZGJkbWFfcG1fZGF0YVswXVsxXSA9IF9fcmF3X3JlYWRsKGFkZHIgKyAweDA0KTsKKwlhbGNoZW15X2RiZG1hX3BtX2RhdGFbMF1bMl0gPSBfX3Jhd19yZWFkbChhZGRyICsgMHgwOCk7CisJYWxjaGVteV9kYmRtYV9wbV9kYXRhWzBdWzNdID0gX19yYXdfcmVhZGwoYWRkciArIDB4MGMpOwogCiAJLyogc2F2ZSBjaGFubmVsIGNvbmZpZ3VyYXRpb25zICovCi0JZm9yIChpID0gMSwgYWRkciA9IERETUFfQ0hBTk5FTF9CQVNFOyBpIDw9IE5VTV9EQkRNQV9DSEFOUzsgaSsrKSB7Ci0JCXNkZXYtPnBtX3JlZ3NbaV1bMF0gPSBhdV9yZWFkbChhZGRyICsgMHgwMCk7Ci0JCXNkZXYtPnBtX3JlZ3NbaV1bMV0gPSBhdV9yZWFkbChhZGRyICsgMHgwNCk7Ci0JCXNkZXYtPnBtX3JlZ3NbaV1bMl0gPSBhdV9yZWFkbChhZGRyICsgMHgwOCk7Ci0JCXNkZXYtPnBtX3JlZ3NbaV1bM10gPSBhdV9yZWFkbChhZGRyICsgMHgwYyk7Ci0JCXNkZXYtPnBtX3JlZ3NbaV1bNF0gPSBhdV9yZWFkbChhZGRyICsgMHgxMCk7Ci0JCXNkZXYtPnBtX3JlZ3NbaV1bNV0gPSBhdV9yZWFkbChhZGRyICsgMHgxNCk7CisJYWRkciA9ICh2b2lkIF9faW9tZW0gKilLU0VHMUFERFIoQVUxNTUwX0RCRE1BX1BIWVNfQUREUik7CisJZm9yIChpID0gMTsgaSA8PSBOVU1fREJETUFfQ0hBTlM7IGkrKykgeworCQlhbGNoZW15X2RiZG1hX3BtX2RhdGFbaV1bMF0gPSBfX3Jhd19yZWFkbChhZGRyICsgMHgwMCk7CisJCWFsY2hlbXlfZGJkbWFfcG1fZGF0YVtpXVsxXSA9IF9fcmF3X3JlYWRsKGFkZHIgKyAweDA0KTsKKwkJYWxjaGVteV9kYmRtYV9wbV9kYXRhW2ldWzJdID0gX19yYXdfcmVhZGwoYWRkciArIDB4MDgpOworCQlhbGNoZW15X2RiZG1hX3BtX2RhdGFbaV1bM10gPSBfX3Jhd19yZWFkbChhZGRyICsgMHgwYyk7CisJCWFsY2hlbXlfZGJkbWFfcG1fZGF0YVtpXVs0XSA9IF9fcmF3X3JlYWRsKGFkZHIgKyAweDEwKTsKKwkJYWxjaGVteV9kYmRtYV9wbV9kYXRhW2ldWzVdID0gX19yYXdfcmVhZGwoYWRkciArIDB4MTQpOwogCiAJCS8qIGhhbHQgY2hhbm5lbCAqLwotCQlhdV93cml0ZWwoc2Rldi0+cG1fcmVnc1tpXVswXSAmIH4xLCBhZGRyICsgMHgwMCk7Ci0JCWF1X3N5bmMoKTsKLQkJd2hpbGUgKCEoYXVfcmVhZGwoYWRkciArIDB4MTQpICYgMSkpCi0JCQlhdV9zeW5jKCk7CisJCV9fcmF3X3dyaXRlbChhbGNoZW15X2RiZG1hX3BtX2RhdGFbaV1bMF0gJiB+MSwgYWRkciArIDB4MDApOworCQl3bWIoKTsKKwkJd2hpbGUgKCEoX19yYXdfcmVhZGwoYWRkciArIDB4MTQpICYgMSkpCisJCQl3bWIoKTsKIAogCQlhZGRyICs9IDB4MTAwOwkvKiBuZXh0IGNoYW5uZWwgYmFzZSAqLwogCX0KIAkvKiBkaXNhYmxlIGNoYW5uZWwgaW50ZXJydXB0cyAqLwotCWF1X3dyaXRlbCgwLCBERE1BX0dMT0JBTF9CQVNFICsgMHgwYyk7Ci0JYXVfc3luYygpOworCWFkZHIgPSAodm9pZCBfX2lvbWVtICopS1NFRzFBRERSKEFVMTU1MF9EQkRNQV9DT05GX1BIWVNfQUREUik7CisJX19yYXdfd3JpdGVsKDAsIGFkZHIgKyAweDBjKTsKKwl3bWIoKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFsY2hlbXlfZGJkbWFfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBhbGNoZW15X2RiZG1hX3Jlc3VtZSh2b2lkKQogewotCXN0cnVjdCBhbGNoZW15X2RiZG1hX3N5c2RldiAqc2RldiA9Ci0JCWNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBhbGNoZW15X2RiZG1hX3N5c2Rldiwgc3lzZGV2KTsKIAlpbnQgaTsKLQl1MzIgYWRkcjsKKwl2b2lkIF9faW9tZW0gKmFkZHI7CiAKLQlhZGRyID0gRERNQV9HTE9CQUxfQkFTRTsKLQlhdV93cml0ZWwoc2Rldi0+cG1fcmVnc1swXVswXSwgYWRkciArIDB4MDApOwotCWF1X3dyaXRlbChzZGV2LT5wbV9yZWdzWzBdWzFdLCBhZGRyICsgMHgwNCk7Ci0JYXVfd3JpdGVsKHNkZXYtPnBtX3JlZ3NbMF1bMl0sIGFkZHIgKyAweDA4KTsKLQlhdV93cml0ZWwoc2Rldi0+cG1fcmVnc1swXVszXSwgYWRkciArIDB4MGMpOworCWFkZHIgPSAodm9pZCBfX2lvbWVtICopS1NFRzFBRERSKEFVMTU1MF9EQkRNQV9DT05GX1BIWVNfQUREUik7CisJX19yYXdfd3JpdGVsKGFsY2hlbXlfZGJkbWFfcG1fZGF0YVswXVswXSwgYWRkciArIDB4MDApOworCV9fcmF3X3dyaXRlbChhbGNoZW15X2RiZG1hX3BtX2RhdGFbMF1bMV0sIGFkZHIgKyAweDA0KTsKKwlfX3Jhd193cml0ZWwoYWxjaGVteV9kYmRtYV9wbV9kYXRhWzBdWzJdLCBhZGRyICsgMHgwOCk7CisJX19yYXdfd3JpdGVsKGFsY2hlbXlfZGJkbWFfcG1fZGF0YVswXVszXSwgYWRkciArIDB4MGMpOwogCiAJLyogcmVzdG9yZSBjaGFubmVsIGNvbmZpZ3VyYXRpb25zICovCi0JZm9yIChpID0gMSwgYWRkciA9IERETUFfQ0hBTk5FTF9CQVNFOyBpIDw9IE5VTV9EQkRNQV9DSEFOUzsgaSsrKSB7Ci0JCWF1X3dyaXRlbChzZGV2LT5wbV9yZWdzW2ldWzBdLCBhZGRyICsgMHgwMCk7Ci0JCWF1X3dyaXRlbChzZGV2LT5wbV9yZWdzW2ldWzFdLCBhZGRyICsgMHgwNCk7Ci0JCWF1X3dyaXRlbChzZGV2LT5wbV9yZWdzW2ldWzJdLCBhZGRyICsgMHgwOCk7Ci0JCWF1X3dyaXRlbChzZGV2LT5wbV9yZWdzW2ldWzNdLCBhZGRyICsgMHgwYyk7Ci0JCWF1X3dyaXRlbChzZGV2LT5wbV9yZWdzW2ldWzRdLCBhZGRyICsgMHgxMCk7Ci0JCWF1X3dyaXRlbChzZGV2LT5wbV9yZWdzW2ldWzVdLCBhZGRyICsgMHgxNCk7Ci0JCWF1X3N5bmMoKTsKKwlhZGRyID0gKHZvaWQgX19pb21lbSAqKUtTRUcxQUREUihBVTE1NTBfREJETUFfUEhZU19BRERSKTsKKwlmb3IgKGkgPSAxOyBpIDw9IE5VTV9EQkRNQV9DSEFOUzsgaSsrKSB7CisJCV9fcmF3X3dyaXRlbChhbGNoZW15X2RiZG1hX3BtX2RhdGFbaV1bMF0sIGFkZHIgKyAweDAwKTsKKwkJX19yYXdfd3JpdGVsKGFsY2hlbXlfZGJkbWFfcG1fZGF0YVtpXVsxXSwgYWRkciArIDB4MDQpOworCQlfX3Jhd193cml0ZWwoYWxjaGVteV9kYmRtYV9wbV9kYXRhW2ldWzJdLCBhZGRyICsgMHgwOCk7CisJCV9fcmF3X3dyaXRlbChhbGNoZW15X2RiZG1hX3BtX2RhdGFbaV1bM10sIGFkZHIgKyAweDBjKTsKKwkJX19yYXdfd3JpdGVsKGFsY2hlbXlfZGJkbWFfcG1fZGF0YVtpXVs0XSwgYWRkciArIDB4MTApOworCQlfX3Jhd193cml0ZWwoYWxjaGVteV9kYmRtYV9wbV9kYXRhW2ldWzVdLCBhZGRyICsgMHgxNCk7CisJCXdtYigpOwogCQlhZGRyICs9IDB4MTAwOwkvKiBuZXh0IGNoYW5uZWwgYmFzZSAqLwogCX0KLQotCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBhbGNoZW15X2RiZG1hX3N5c2Rldl9jbGFzcyA9IHsKLQkubmFtZQkJPSAiZGJkbWEiLAorc3RhdGljIHN0cnVjdCBzeXNjb3JlX29wcyBhbGNoZW15X2RiZG1hX3N5c2NvcmVfb3BzID0gewogCS5zdXNwZW5kCT0gYWxjaGVteV9kYmRtYV9zdXNwZW5kLAogCS5yZXN1bWUJCT0gYWxjaGVteV9kYmRtYV9yZXN1bWUsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBhbGNoZW15X2RiZG1hX3N5c2Rldl9pbml0KHZvaWQpCi17Ci0Jc3RydWN0IGFsY2hlbXlfZGJkbWFfc3lzZGV2ICpzZGV2OwotCWludCByZXQ7Ci0KLQlyZXQgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJmFsY2hlbXlfZGJkbWFfc3lzZGV2X2NsYXNzKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0Jc2RldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhbGNoZW15X2RiZG1hX3N5c2RldiksIEdGUF9LRVJORUwpOwotCWlmICghc2RldikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzZGV2LT5zeXNkZXYuaWQgPSAtMTsKLQlzZGV2LT5zeXNkZXYuY2xzID0gJmFsY2hlbXlfZGJkbWFfc3lzZGV2X2NsYXNzOwotCXJldCA9IHN5c2Rldl9yZWdpc3Rlcigmc2Rldi0+c3lzZGV2KTsKLQlpZiAocmV0KQotCQlrZnJlZShzZGV2KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBpbnQgX19pbml0IGF1MXh4eF9kYmRtYV9pbml0KHZvaWQpCiB7CiAJaW50IGlycV9uciwgcmV0OwpAQCAtMTA4NCwxMSArMTA1NSw3IEBACiAJZWxzZSB7CiAJCWRiZG1hX2luaXRpYWxpemVkID0gMTsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiQWxjaGVteSBEQkRNQSBpbml0aWFsaXplZFxuIik7Ci0JCXJldCA9IGFsY2hlbXlfZGJkbWFfc3lzZGV2X2luaXQoKTsKLQkJaWYgKHJldCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJEQkRNQSBQTSBpbml0IGZhaWxlZFxuIik7Ci0JCQlyZXQgPSAwOwotCQl9CisJCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZhbGNoZW15X2RiZG1hX3N5c2NvcmVfb3BzKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2RtYS5jIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2RtYS5jCmluZGV4IGQ1Mjc4ODcuLjM0Nzk4MGUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9kbWEuYworKysgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vZG1hLmMKQEAgLTU4LDYgKzU4LDkgQEAKICAqIHJldHVybmVkIGZyb20gcmVxdWVzdF9kbWEuCiAgKi8KIAorLyogRE1BIENoYW5uZWwgcmVnaXN0ZXIgYmxvY2sgc3BhY2luZyAqLworI2RlZmluZSBETUFfQ0hBTk5FTF9MRU4JCTB4MDAwMDAxMDAKKwogREVGSU5FX1NQSU5MT0NLKGF1MTAwMF9kbWFfc3Bpbl9sb2NrKTsKIAogc3RydWN0IGRtYV9jaGFuIGF1MTAwMF9kbWFfdGFibGVbTlVNX0FVMTAwMF9ETUFfQ0hBTk5FTFNdID0gewpAQCAtNzcsMjIgKzgwLDIzIEBACiAJdW5zaWduZWQgaW50IGZpZm9fYWRkcjsKIAl1bnNpZ25lZCBpbnQgZG1hX21vZGU7CiB9IGRtYV9kZXZfdGFibGVbRE1BX05VTV9ERVZdID0gewotCXtVQVJUMF9BRERSICsgVUFSVF9UWCwgMH0sCi0Je1VBUlQwX0FERFIgKyBVQVJUX1JYLCAwfSwKLQl7MCwgMH0sCi0JezAsIDB9LAotCXtBQzk3Q19EQVRBLCBETUFfRFcxNiB9LCAgICAgICAgICAvKiBjb2hlcmVudCAqLwotCXtBQzk3Q19EQVRBLCBETUFfRFIgfCBETUFfRFcxNiB9LCAvKiBjb2hlcmVudCAqLwotCXtVQVJUM19BRERSICsgVUFSVF9UWCwgRE1BX0RXOCB8IERNQV9OQ30sCi0Je1VBUlQzX0FERFIgKyBVQVJUX1JYLCBETUFfRFIgfCBETUFfRFc4IHwgRE1BX05DfSwKLQl7VVNCRF9FUDBSRCwgRE1BX0RSIHwgRE1BX0RXOCB8IERNQV9OQ30sCi0Je1VTQkRfRVAwV1IsIERNQV9EVzggfCBETUFfTkN9LAotCXtVU0JEX0VQMldSLCBETUFfRFc4IHwgRE1BX05DfSwKLQl7VVNCRF9FUDNXUiwgRE1BX0RXOCB8IERNQV9OQ30sCi0Je1VTQkRfRVA0UkQsIERNQV9EUiB8IERNQV9EVzggfCBETUFfTkN9LAotCXtVU0JEX0VQNVJELCBETUFfRFIgfCBETUFfRFc4IHwgRE1BX05DfSwKLQl7STJTX0RBVEEsIERNQV9EVzMyIHwgRE1BX05DfSwKLQl7STJTX0RBVEEsIERNQV9EUiB8IERNQV9EVzMyIHwgRE1BX05DfQorCXsgQVUxMDAwX1VBUlQwX1BIWVNfQUREUiArIDB4MDQsIERNQV9EVzggfSwJCS8qIFVBUlQwX1RYICovCisJeyBBVTEwMDBfVUFSVDBfUEhZU19BRERSICsgMHgwMCwgRE1BX0RXOCB8IERNQV9EUiB9LAkvKiBVQVJUMF9SWCAqLworCXsgMCwgMCB9LAkvKiBETUFfUkVRMCAqLworCXsgMCwgMCB9LAkvKiBETUFfUkVRMSAqLworCXsgQVUxMDAwX0FDOTdfUEhZU19BRERSICsgMHgwOCwgRE1BX0RXMTYgfSwJCS8qIEFDOTcgVFggYyAqLworCXsgQVUxMDAwX0FDOTdfUEhZU19BRERSICsgMHgwOCwgRE1BX0RXMTYgfCBETUFfRFIgfSwJLyogQUM5NyBSWCBjICovCisJeyBBVTEwMDBfVUFSVDNfUEhZU19BRERSICsgMHgwNCwgRE1BX0RXOCB8IERNQV9OQyB9LAkvKiBVQVJUM19UWCAqLworCXsgQVUxMDAwX1VBUlQzX1BIWVNfQUREUiArIDB4MDAsIERNQV9EVzggfCBETUFfTkMgfCBETUFfRFIgfSwgLyogVUFSVDNfUlggKi8KKwl7IEFVMTAwMF9VU0JEX1BIWVNfQUREUiArIDB4MDAsIERNQV9EVzggfCBETUFfTkMgfCBETUFfRFIgfSwgLyogRVAwUkQgKi8KKwl7IEFVMTAwMF9VU0JEX1BIWVNfQUREUiArIDB4MDQsIERNQV9EVzggfCBETUFfTkMgfSwgLyogRVAwV1IgKi8KKwl7IEFVMTAwMF9VU0JEX1BIWVNfQUREUiArIDB4MDgsIERNQV9EVzggfCBETUFfTkMgfSwgLyogRVAyV1IgKi8KKwl7IEFVMTAwMF9VU0JEX1BIWVNfQUREUiArIDB4MGMsIERNQV9EVzggfCBETUFfTkMgfSwgLyogRVAzV1IgKi8KKwl7IEFVMTAwMF9VU0JEX1BIWVNfQUREUiArIDB4MTAsIERNQV9EVzggfCBETUFfTkMgfCBETUFfRFIgfSwgLyogRVA0UkQgKi8KKwl7IEFVMTAwMF9VU0JEX1BIWVNfQUREUiArIDB4MTQsIERNQV9EVzggfCBETUFfTkMgfCBETUFfRFIgfSwgLyogRVA1UkQgKi8KKwkvKiBvbiBBdTE1MDAsIHRoZXNlIDIgYXJlIERNQV9SRVEyLzMgKEdQSU8yMDgvMjA5KSBpbnN0ZWFkISAqLworCXsgQVUxMDAwX0kyU19QSFlTX0FERFIgKyAweDAwLCBETUFfRFczMiB8IERNQV9OQ30sCS8qIEkyUyBUWCAqLworCXsgQVUxMDAwX0kyU19QSFlTX0FERFIgKyAweDAwLCBETUFfRFczMiB8IERNQV9OQyB8IERNQV9EUn0sIC8qIEkyUyBSWCAqLwogfTsKIAogaW50IGF1MTAwMF9kbWFfcmVhZF9wcm9jKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBmcG9zLApAQCAtMTIzLDEwICsxMjcsMTAgQEAKIAogLyogRGV2aWNlIEZJRk8gYWRkcmVzc2VzIGFuZCBkZWZhdWx0IERNQSBtb2RlcyAtIDJuZCBiYW5rICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRtYV9kZXYgZG1hX2Rldl90YWJsZV9iYW5rMltETUFfTlVNX0RFVl9CQU5LMl0gPSB7Ci0JeyBTRDBfWE1JVF9GSUZPLCBETUFfRFMgfCBETUFfRFc4IH0sCQkvKiBjb2hlcmVudCAqLwotCXsgU0QwX1JFQ1ZfRklGTywgRE1BX0RTIHwgRE1BX0RSIHwgRE1BX0RXOCB9LAkvKiBjb2hlcmVudCAqLwotCXsgU0QxX1hNSVRfRklGTywgRE1BX0RTIHwgRE1BX0RXOCB9LAkJLyogY29oZXJlbnQgKi8KLQl7IFNEMV9SRUNWX0ZJRk8sIERNQV9EUyB8IERNQV9EUiB8IERNQV9EVzggfQkvKiBjb2hlcmVudCAqLworCXsgQVUxMTAwX1NEMF9QSFlTX0FERFIgKyAweDAwLCBETUFfRFMgfCBETUFfRFc4IH0sCQkvKiBjb2hlcmVudCAqLworCXsgQVUxMTAwX1NEMF9QSFlTX0FERFIgKyAweDA0LCBETUFfRFMgfCBETUFfRFc4IHwgRE1BX0RSIH0sCS8qIGNvaGVyZW50ICovCisJeyBBVTExMDBfU0QxX1BIWVNfQUREUiArIDB4MDAsIERNQV9EUyB8IERNQV9EVzggfSwJCS8qIGNvaGVyZW50ICovCisJeyBBVTExMDBfU0QxX1BIWVNfQUREUiArIDB4MDQsIERNQV9EUyB8IERNQV9EVzggfCBETUFfRFIgfQkvKiBjb2hlcmVudCAqLwogfTsKIAogdm9pZCBkdW1wX2F1MTAwMF9kbWFfY2hhbm5lbCh1bnNpZ25lZCBpbnQgZG1hbnIpCkBAIC0yMDIsNyArMjA2LDcgQEAKIAl9CiAKIAkvKiBmaWxsIGl0IGluICovCi0JY2hhbi0+aW8gPSBETUFfQ0hBTk5FTF9CQVNFICsgaSAqIERNQV9DSEFOTkVMX0xFTjsKKwljaGFuLT5pbyA9IEtTRUcxQUREUihBVTEwMDBfRE1BX1BIWVNfQUREUikgKyBpICogRE1BX0NIQU5ORUxfTEVOOwogCWNoYW4tPmRldl9pZCA9IGRldl9pZDsKIAljaGFuLT5kZXZfc3RyID0gZGV2X3N0cjsKIAljaGFuLT5maWZvX2FkZHIgPSBkZXYtPmZpZm9fYWRkcjsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9pcnEuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9pcnEuYwppbmRleCA1NWRkN2M4Li44YjYwYmEwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vaXJxLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2lycS5jCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CiAKICNpbmNsdWRlIDxhc20vaXJxX2NwdS5oPgogI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgpAQCAtMzksNiArMzksMzYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC1wYjF4MDAvcGIxMDAwLmg+CiAjZW5kaWYKIAorLyogSW50ZXJydXB0IENvbnRyb2xsZXIgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBJQ19DRkcwUkQJMHg0MAorI2RlZmluZSBJQ19DRkcwU0VUCTB4NDAKKyNkZWZpbmUgSUNfQ0ZHMENMUgkweDQ0CisjZGVmaW5lIElDX0NGRzFSRAkweDQ4CisjZGVmaW5lIElDX0NGRzFTRVQJMHg0OAorI2RlZmluZSBJQ19DRkcxQ0xSCTB4NEMKKyNkZWZpbmUgSUNfQ0ZHMlJECTB4NTAKKyNkZWZpbmUgSUNfQ0ZHMlNFVAkweDUwCisjZGVmaW5lIElDX0NGRzJDTFIJMHg1NAorI2RlZmluZSBJQ19SRVEwSU5UCTB4NTQKKyNkZWZpbmUgSUNfU1JDUkQJMHg1OAorI2RlZmluZSBJQ19TUkNTRVQJMHg1OAorI2RlZmluZSBJQ19TUkNDTFIJMHg1QworI2RlZmluZSBJQ19SRVExSU5UCTB4NUMKKyNkZWZpbmUgSUNfQVNTSUdOUkQJMHg2MAorI2RlZmluZSBJQ19BU1NJR05TRVQJMHg2MAorI2RlZmluZSBJQ19BU1NJR05DTFIJMHg2NAorI2RlZmluZSBJQ19XQUtFUkQJMHg2OAorI2RlZmluZSBJQ19XQUtFU0VUCTB4NjgKKyNkZWZpbmUgSUNfV0FLRUNMUgkweDZDCisjZGVmaW5lIElDX01BU0tSRAkweDcwCisjZGVmaW5lIElDX01BU0tTRVQJMHg3MAorI2RlZmluZSBJQ19NQVNLQ0xSCTB4NzQKKyNkZWZpbmUgSUNfUklTSU5HUkQJMHg3OAorI2RlZmluZSBJQ19SSVNJTkdDTFIJMHg3OAorI2RlZmluZSBJQ19GQUxMSU5HUkQJMHg3QworI2RlZmluZSBJQ19GQUxMSU5HQ0xSCTB4N0MKKyNkZWZpbmUgSUNfVEVTVEJJVAkweDgwCisKIHN0YXRpYyBpbnQgYXUxeF9pY19zZXR0eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IGZsb3dfdHlwZSk7CiAKIC8qIE5PVEUgb24gaW50ZXJydXB0IHByaW9yaXRpZXM6IFRoZSBvcmlnaW5hbCB3cml0ZXJzIG9mIHRoaXMgY29kZSBzYWlkOgpAQCAtMjIxLDg5ICsyNTEsMTAxIEBACiBzdGF0aWMgdm9pZCBhdTF4X2ljMF91bm1hc2soc3RydWN0IGlycV9kYXRhICpkKQogewogCXVuc2lnbmVkIGludCBiaXQgPSBkLT5pcnEgLSBBVTEwMDBfSU5UQzBfSU5UX0JBU0U7Ci0JYXVfd3JpdGVsKDEgPDwgYml0LCBJQzBfTUFTS1NFVCk7Ci0JYXVfd3JpdGVsKDEgPDwgYml0LCBJQzBfV0FLRVNFVCk7Ci0JYXVfc3luYygpOworCXZvaWQgX19pb21lbSAqYmFzZSA9ICh2b2lkIF9faW9tZW0gKilLU0VHMUFERFIoQVUxMDAwX0lDMF9QSFlTX0FERFIpOworCisJX19yYXdfd3JpdGVsKDEgPDwgYml0LCBiYXNlICsgSUNfTUFTS1NFVCk7CisJX19yYXdfd3JpdGVsKDEgPDwgYml0LCBiYXNlICsgSUNfV0FLRVNFVCk7CisJd21iKCk7CiB9CiAKIHN0YXRpYyB2b2lkIGF1MXhfaWMxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7CiAJdW5zaWduZWQgaW50IGJpdCA9IGQtPmlycSAtIEFVMTAwMF9JTlRDMV9JTlRfQkFTRTsKLQlhdV93cml0ZWwoMSA8PCBiaXQsIElDMV9NQVNLU0VUKTsKLQlhdV93cml0ZWwoMSA8PCBiaXQsIElDMV9XQUtFU0VUKTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSAodm9pZCBfX2lvbWVtICopS1NFRzFBRERSKEFVMTAwMF9JQzFfUEhZU19BRERSKTsKKworCV9fcmF3X3dyaXRlbCgxIDw8IGJpdCwgYmFzZSArIElDX01BU0tTRVQpOworCV9fcmF3X3dyaXRlbCgxIDw8IGJpdCwgYmFzZSArIElDX1dBS0VTRVQpOwogCiAvKiB2ZXJ5IGhhY2t5LiBkb2VzIHRoZSBwYjEwMDAgY3BsZCBhdXRvLWRpc2FibGUgdGhpcyBpbnQ/CiAgKiBub3doZXJlIGluIHRoZSBjdXJyZW50IGtlcm5lbCBzb3VyY2VzIGlzIGl0IGRpc2FibGVkLgktLW1sYXUKICAqLwogI2lmIGRlZmluZWQoQ09ORklHX01JUFNfUEIxMDAwKQogCWlmIChkLT5pcnEgPT0gQVUxMDAwX0dQSU8xNV9JTlQpCi0JCWF1X3dyaXRlbCgweDQwMDAsIFBCMTAwMF9NRFIpOyAvKiBlbmFibGUgaW50ICovCisJCV9fcmF3X3dyaXRlbCgweDQwMDAsICh2b2lkIF9faW9tZW0gKilQQjEwMDBfTURSKTsgLyogZW5hYmxlIGludCAqLwogI2VuZGlmCi0JYXVfc3luYygpOworCXdtYigpOwogfQogCiBzdGF0aWMgdm9pZCBhdTF4X2ljMF9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKIAl1bnNpZ25lZCBpbnQgYml0ID0gZC0+aXJxIC0gQVUxMDAwX0lOVEMwX0lOVF9CQVNFOwotCWF1X3dyaXRlbCgxIDw8IGJpdCwgSUMwX01BU0tDTFIpOwotCWF1X3dyaXRlbCgxIDw8IGJpdCwgSUMwX1dBS0VDTFIpOwotCWF1X3N5bmMoKTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSAodm9pZCBfX2lvbWVtICopS1NFRzFBRERSKEFVMTAwMF9JQzBfUEhZU19BRERSKTsKKworCV9fcmF3X3dyaXRlbCgxIDw8IGJpdCwgYmFzZSArIElDX01BU0tDTFIpOworCV9fcmF3X3dyaXRlbCgxIDw8IGJpdCwgYmFzZSArIElDX1dBS0VDTFIpOworCXdtYigpOwogfQogCiBzdGF0aWMgdm9pZCBhdTF4X2ljMV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKIAl1bnNpZ25lZCBpbnQgYml0ID0gZC0+aXJxIC0gQVUxMDAwX0lOVEMxX0lOVF9CQVNFOwotCWF1X3dyaXRlbCgxIDw8IGJpdCwgSUMxX01BU0tDTFIpOwotCWF1X3dyaXRlbCgxIDw8IGJpdCwgSUMxX1dBS0VDTFIpOwotCWF1X3N5bmMoKTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSAodm9pZCBfX2lvbWVtICopS1NFRzFBRERSKEFVMTAwMF9JQzFfUEhZU19BRERSKTsKKworCV9fcmF3X3dyaXRlbCgxIDw8IGJpdCwgYmFzZSArIElDX01BU0tDTFIpOworCV9fcmF3X3dyaXRlbCgxIDw8IGJpdCwgYmFzZSArIElDX1dBS0VDTFIpOworCXdtYigpOwogfQogCiBzdGF0aWMgdm9pZCBhdTF4X2ljMF9hY2soc3RydWN0IGlycV9kYXRhICpkKQogewogCXVuc2lnbmVkIGludCBiaXQgPSBkLT5pcnEgLSBBVTEwMDBfSU5UQzBfSU5UX0JBU0U7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gKHZvaWQgX19pb21lbSAqKUtTRUcxQUREUihBVTEwMDBfSUMwX1BIWVNfQUREUik7CiAKIAkvKgogCSAqIFRoaXMgbWF5IGFzc3VtZSB0aGF0IHdlIGRvbid0IGdldCBpbnRlcnJ1cHRzIGZyb20KIAkgKiBib3RoIGVkZ2VzIGF0IG9uY2UsIG9yIGlmIHdlIGRvLCB0aGF0IHdlIGRvbid0IGNhcmUuCiAJICovCi0JYXVfd3JpdGVsKDEgPDwgYml0LCBJQzBfRkFMTElOR0NMUik7Ci0JYXVfd3JpdGVsKDEgPDwgYml0LCBJQzBfUklTSU5HQ0xSKTsKLQlhdV9zeW5jKCk7CisJX19yYXdfd3JpdGVsKDEgPDwgYml0LCBiYXNlICsgSUNfRkFMTElOR0NMUik7CisJX19yYXdfd3JpdGVsKDEgPDwgYml0LCBiYXNlICsgSUNfUklTSU5HQ0xSKTsKKwl3bWIoKTsKIH0KIAogc3RhdGljIHZvaWQgYXUxeF9pYzFfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKIAl1bnNpZ25lZCBpbnQgYml0ID0gZC0+aXJxIC0gQVUxMDAwX0lOVEMxX0lOVF9CQVNFOworCXZvaWQgX19pb21lbSAqYmFzZSA9ICh2b2lkIF9faW9tZW0gKilLU0VHMUFERFIoQVUxMDAwX0lDMV9QSFlTX0FERFIpOwogCiAJLyoKIAkgKiBUaGlzIG1heSBhc3N1bWUgdGhhdCB3ZSBkb24ndCBnZXQgaW50ZXJydXB0cyBmcm9tCiAJICogYm90aCBlZGdlcyBhdCBvbmNlLCBvciBpZiB3ZSBkbywgdGhhdCB3ZSBkb24ndCBjYXJlLgogCSAqLwotCWF1X3dyaXRlbCgxIDw8IGJpdCwgSUMxX0ZBTExJTkdDTFIpOwotCWF1X3dyaXRlbCgxIDw8IGJpdCwgSUMxX1JJU0lOR0NMUik7Ci0JYXVfc3luYygpOworCV9fcmF3X3dyaXRlbCgxIDw8IGJpdCwgYmFzZSArIElDX0ZBTExJTkdDTFIpOworCV9fcmF3X3dyaXRlbCgxIDw8IGJpdCwgYmFzZSArIElDX1JJU0lOR0NMUik7CisJd21iKCk7CiB9CiAKIHN0YXRpYyB2b2lkIGF1MXhfaWMwX21hc2thY2soc3RydWN0IGlycV9kYXRhICpkKQogewogCXVuc2lnbmVkIGludCBiaXQgPSBkLT5pcnEgLSBBVTEwMDBfSU5UQzBfSU5UX0JBU0U7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gKHZvaWQgX19pb21lbSAqKUtTRUcxQUREUihBVTEwMDBfSUMwX1BIWVNfQUREUik7CiAKLQlhdV93cml0ZWwoMSA8PCBiaXQsIElDMF9XQUtFQ0xSKTsKLQlhdV93cml0ZWwoMSA8PCBiaXQsIElDMF9NQVNLQ0xSKTsKLQlhdV93cml0ZWwoMSA8PCBiaXQsIElDMF9SSVNJTkdDTFIpOwotCWF1X3dyaXRlbCgxIDw8IGJpdCwgSUMwX0ZBTExJTkdDTFIpOwotCWF1X3N5bmMoKTsKKwlfX3Jhd193cml0ZWwoMSA8PCBiaXQsIGJhc2UgKyBJQ19XQUtFQ0xSKTsKKwlfX3Jhd193cml0ZWwoMSA8PCBiaXQsIGJhc2UgKyBJQ19NQVNLQ0xSKTsKKwlfX3Jhd193cml0ZWwoMSA8PCBiaXQsIGJhc2UgKyBJQ19SSVNJTkdDTFIpOworCV9fcmF3X3dyaXRlbCgxIDw8IGJpdCwgYmFzZSArIElDX0ZBTExJTkdDTFIpOworCXdtYigpOwogfQogCiBzdGF0aWMgdm9pZCBhdTF4X2ljMV9tYXNrYWNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKIAl1bnNpZ25lZCBpbnQgYml0ID0gZC0+aXJxIC0gQVUxMDAwX0lOVEMxX0lOVF9CQVNFOworCXZvaWQgX19pb21lbSAqYmFzZSA9ICh2b2lkIF9faW9tZW0gKilLU0VHMUFERFIoQVUxMDAwX0lDMV9QSFlTX0FERFIpOwogCi0JYXVfd3JpdGVsKDEgPDwgYml0LCBJQzFfV0FLRUNMUik7Ci0JYXVfd3JpdGVsKDEgPDwgYml0LCBJQzFfTUFTS0NMUik7Ci0JYXVfd3JpdGVsKDEgPDwgYml0LCBJQzFfUklTSU5HQ0xSKTsKLQlhdV93cml0ZWwoMSA8PCBiaXQsIElDMV9GQUxMSU5HQ0xSKTsKLQlhdV9zeW5jKCk7CisJX19yYXdfd3JpdGVsKDEgPDwgYml0LCBiYXNlICsgSUNfV0FLRUNMUik7CisJX19yYXdfd3JpdGVsKDEgPDwgYml0LCBiYXNlICsgSUNfTUFTS0NMUik7CisJX19yYXdfd3JpdGVsKDEgPDwgYml0LCBiYXNlICsgSUNfUklTSU5HQ0xSKTsKKwlfX3Jhd193cml0ZWwoMSA8PCBiaXQsIGJhc2UgKyBJQ19GQUxMSU5HQ0xSKTsKKwl3bWIoKTsKIH0KIAogc3RhdGljIGludCBhdTF4X2ljMV9zZXR3YWtlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IG9uKQpAQCAtMzE4LDEzICszNjAsMTMgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0Jd2FrZW1zayA9IGF1X3JlYWRsKFNZU19XQUtFTVNLKTsKKwl3YWtlbXNrID0gX19yYXdfcmVhZGwoKHZvaWQgX19pb21lbSAqKVNZU19XQUtFTVNLKTsKIAlpZiAob24pCiAJCXdha2Vtc2sgfD0gMSA8PCBiaXQ7CiAJZWxzZQogCQl3YWtlbXNrICY9IH4oMSA8PCBiaXQpOwotCWF1X3dyaXRlbCh3YWtlbXNrLCBTWVNfV0FLRU1TSyk7Ci0JYXVfc3luYygpOworCV9fcmF3X3dyaXRlbCh3YWtlbXNrLCAodm9pZCBfX2lvbWVtICopU1lTX1dBS0VNU0spOworCXdtYigpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAogCXJldHVybiAwOwpAQCAtMzU2LDgxICszOTgsNzQgQEAKIHN0YXRpYyBpbnQgYXUxeF9pY19zZXR0eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IGZsb3dfdHlwZSkKIHsKIAlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXA7Ci0JdW5zaWduZWQgbG9uZyBpY3JbNl07Ci0JdW5zaWduZWQgaW50IGJpdCwgaWMsIGlycSA9IGQtPmlycTsKKwl1bnNpZ25lZCBpbnQgYml0LCBpcnEgPSBkLT5pcnE7CiAJaXJxX2Zsb3dfaGFuZGxlcl90IGhhbmRsZXIgPSBOVUxMOwogCXVuc2lnbmVkIGNoYXIgKm5hbWUgPSBOVUxMOworCXZvaWQgX19pb21lbSAqYmFzZTsKIAlpbnQgcmV0OwogCiAJaWYgKGlycSA+PSBBVTEwMDBfSU5UQzFfSU5UX0JBU0UpIHsKIAkJYml0ID0gaXJxIC0gQVUxMDAwX0lOVEMxX0lOVF9CQVNFOwogCQljaGlwID0gJmF1MXhfaWMxX2NoaXA7Ci0JCWljID0gMTsKKwkJYmFzZSA9ICh2b2lkIF9faW9tZW0gKilLU0VHMUFERFIoQVUxMDAwX0lDMV9QSFlTX0FERFIpOwogCX0gZWxzZSB7CiAJCWJpdCA9IGlycSAtIEFVMTAwMF9JTlRDMF9JTlRfQkFTRTsKIAkJY2hpcCA9ICZhdTF4X2ljMF9jaGlwOwotCQlpYyA9IDA7CisJCWJhc2UgPSAodm9pZCBfX2lvbWVtICopS1NFRzFBRERSKEFVMTAwMF9JQzBfUEhZU19BRERSKTsKIAl9CiAKIAlpZiAoYml0ID4gMzEpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWNyWzBdID0gaWMgPyBJQzFfQ0ZHMFNFVCA6IElDMF9DRkcwU0VUOwotCWljclsxXSA9IGljID8gSUMxX0NGRzFTRVQgOiBJQzBfQ0ZHMVNFVDsKLQlpY3JbMl0gPSBpYyA/IElDMV9DRkcyU0VUIDogSUMwX0NGRzJTRVQ7Ci0JaWNyWzNdID0gaWMgPyBJQzFfQ0ZHMENMUiA6IElDMF9DRkcwQ0xSOwotCWljcls0XSA9IGljID8gSUMxX0NGRzFDTFIgOiBJQzBfQ0ZHMUNMUjsKLQlpY3JbNV0gPSBpYyA/IElDMV9DRkcyQ0xSIDogSUMwX0NGRzJDTFI7Ci0KIAlyZXQgPSAwOwogCiAJc3dpdGNoIChmbG93X3R5cGUpIHsJLyogY2ZncmVncyAyOjE6MCAqLwogCWNhc2UgSVJRX1RZUEVfRURHRV9SSVNJTkc6CS8qIDA6MDoxICovCi0JCWF1X3dyaXRlbCgxIDw8IGJpdCwgaWNyWzVdKTsKLQkJYXVfd3JpdGVsKDEgPDwgYml0LCBpY3JbNF0pOwotCQlhdV93cml0ZWwoMSA8PCBiaXQsIGljclswXSk7CisJCV9fcmF3X3dyaXRlbCgxIDw8IGJpdCwgYmFzZSArIElDX0NGRzJDTFIpOworCQlfX3Jhd193cml0ZWwoMSA8PCBiaXQsIGJhc2UgKyBJQ19DRkcxQ0xSKTsKKwkJX19yYXdfd3JpdGVsKDEgPDwgYml0LCBiYXNlICsgSUNfQ0ZHMFNFVCk7CiAJCWhhbmRsZXIgPSBoYW5kbGVfZWRnZV9pcnE7CiAJCW5hbWUgPSAicmlzZWVkZ2UiOwogCQlicmVhazsKIAljYXNlIElSUV9UWVBFX0VER0VfRkFMTElORzoJLyogMDoxOjAgKi8KLQkJYXVfd3JpdGVsKDEgPDwgYml0LCBpY3JbNV0pOwotCQlhdV93cml0ZWwoMSA8PCBiaXQsIGljclsxXSk7Ci0JCWF1X3dyaXRlbCgxIDw8IGJpdCwgaWNyWzNdKTsKKwkJX19yYXdfd3JpdGVsKDEgPDwgYml0LCBiYXNlICsgSUNfQ0ZHMkNMUik7CisJCV9fcmF3X3dyaXRlbCgxIDw8IGJpdCwgYmFzZSArIElDX0NGRzFTRVQpOworCQlfX3Jhd193cml0ZWwoMSA8PCBiaXQsIGJhc2UgKyBJQ19DRkcwQ0xSKTsKIAkJaGFuZGxlciA9IGhhbmRsZV9lZGdlX2lycTsKIAkJbmFtZSA9ICJmYWxsZWRnZSI7CiAJCWJyZWFrOwogCWNhc2UgSVJRX1RZUEVfRURHRV9CT1RIOgkvKiAwOjE6MSAqLwotCQlhdV93cml0ZWwoMSA8PCBiaXQsIGljcls1XSk7Ci0JCWF1X3dyaXRlbCgxIDw8IGJpdCwgaWNyWzFdKTsKLQkJYXVfd3JpdGVsKDEgPDwgYml0LCBpY3JbMF0pOworCQlfX3Jhd193cml0ZWwoMSA8PCBiaXQsIGJhc2UgKyBJQ19DRkcyQ0xSKTsKKwkJX19yYXdfd3JpdGVsKDEgPDwgYml0LCBiYXNlICsgSUNfQ0ZHMVNFVCk7CisJCV9fcmF3X3dyaXRlbCgxIDw8IGJpdCwgYmFzZSArIElDX0NGRzBTRVQpOwogCQloYW5kbGVyID0gaGFuZGxlX2VkZ2VfaXJxOwogCQluYW1lID0gImJvdGhlZGdlIjsKIAkJYnJlYWs7CiAJY2FzZSBJUlFfVFlQRV9MRVZFTF9ISUdIOgkvKiAxOjA6MSAqLwotCQlhdV93cml0ZWwoMSA8PCBiaXQsIGljclsyXSk7Ci0JCWF1X3dyaXRlbCgxIDw8IGJpdCwgaWNyWzRdKTsKLQkJYXVfd3JpdGVsKDEgPDwgYml0LCBpY3JbMF0pOworCQlfX3Jhd193cml0ZWwoMSA8PCBiaXQsIGJhc2UgKyBJQ19DRkcyU0VUKTsKKwkJX19yYXdfd3JpdGVsKDEgPDwgYml0LCBiYXNlICsgSUNfQ0ZHMUNMUik7CisJCV9fcmF3X3dyaXRlbCgxIDw8IGJpdCwgYmFzZSArIElDX0NGRzBTRVQpOwogCQloYW5kbGVyID0gaGFuZGxlX2xldmVsX2lycTsKIAkJbmFtZSA9ICJoaWxldmVsIjsKIAkJYnJlYWs7CiAJY2FzZSBJUlFfVFlQRV9MRVZFTF9MT1c6CS8qIDE6MTowICovCi0JCWF1X3dyaXRlbCgxIDw8IGJpdCwgaWNyWzJdKTsKLQkJYXVfd3JpdGVsKDEgPDwgYml0LCBpY3JbMV0pOwotCQlhdV93cml0ZWwoMSA8PCBiaXQsIGljclszXSk7CisJCV9fcmF3X3dyaXRlbCgxIDw8IGJpdCwgYmFzZSArIElDX0NGRzJTRVQpOworCQlfX3Jhd193cml0ZWwoMSA8PCBiaXQsIGJhc2UgKyBJQ19DRkcxU0VUKTsKKwkJX19yYXdfd3JpdGVsKDEgPDwgYml0LCBiYXNlICsgSUNfQ0ZHMENMUik7CiAJCWhhbmRsZXIgPSBoYW5kbGVfbGV2ZWxfaXJxOwogCQluYW1lID0gImxvd2xldmVsIjsKIAkJYnJlYWs7CiAJY2FzZSBJUlFfVFlQRV9OT05FOgkJLyogMDowOjAgKi8KLQkJYXVfd3JpdGVsKDEgPDwgYml0LCBpY3JbNV0pOwotCQlhdV93cml0ZWwoMSA8PCBiaXQsIGljcls0XSk7Ci0JCWF1X3dyaXRlbCgxIDw8IGJpdCwgaWNyWzNdKTsKKwkJX19yYXdfd3JpdGVsKDEgPDwgYml0LCBiYXNlICsgSUNfQ0ZHMkNMUik7CisJCV9fcmF3X3dyaXRlbCgxIDw8IGJpdCwgYmFzZSArIElDX0NGRzFDTFIpOworCQlfX3Jhd193cml0ZWwoMSA8PCBiaXQsIGJhc2UgKyBJQ19DRkcwQ0xSKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVJTlZBTDsKIAl9CiAJX19pcnFfc2V0X2NoaXBfaGFuZGxlcl9uYW1lX2xvY2tlZChkLT5pcnEsIGNoaXAsIGhhbmRsZXIsIG5hbWUpOwogCi0JYXVfc3luYygpOworCXdtYigpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTQ0NCwyMSArNDc5LDIxIEBACiAJCW9mZiA9IE1JUFNfQ1BVX0lSUV9CQVNFICsgNzsKIAkJZ290byBoYW5kbGU7CiAJfSBlbHNlIGlmIChwZW5kaW5nICYgQ0FVU0VGX0lQMikgewotCQlzID0gSUMwX1JFUTBJTlQ7CisJCXMgPSBLU0VHMUFERFIoQVUxMDAwX0lDMF9QSFlTX0FERFIpICsgSUNfUkVRMElOVDsKIAkJb2ZmID0gQVUxMDAwX0lOVEMwX0lOVF9CQVNFOwogCX0gZWxzZSBpZiAocGVuZGluZyAmIENBVVNFRl9JUDMpIHsKLQkJcyA9IElDMF9SRVExSU5UOworCQlzID0gS1NFRzFBRERSKEFVMTAwMF9JQzBfUEhZU19BRERSKSArIElDX1JFUTFJTlQ7CiAJCW9mZiA9IEFVMTAwMF9JTlRDMF9JTlRfQkFTRTsKIAl9IGVsc2UgaWYgKHBlbmRpbmcgJiBDQVVTRUZfSVA0KSB7Ci0JCXMgPSBJQzFfUkVRMElOVDsKKwkJcyA9IEtTRUcxQUREUihBVTEwMDBfSUMxX1BIWVNfQUREUikgKyBJQ19SRVEwSU5UOwogCQlvZmYgPSBBVTEwMDBfSU5UQzFfSU5UX0JBU0U7CiAJfSBlbHNlIGlmIChwZW5kaW5nICYgQ0FVU0VGX0lQNSkgewotCQlzID0gSUMxX1JFUTFJTlQ7CisJCXMgPSBLU0VHMUFERFIoQVUxMDAwX0lDMV9QSFlTX0FERFIpICsgSUNfUkVRMUlOVDsKIAkJb2ZmID0gQVUxMDAwX0lOVEMxX0lOVF9CQVNFOwogCX0gZWxzZQogCQlnb3RvIHNwdXJpb3VzOwogCi0JcyA9IGF1X3JlYWRsKHMpOworCXMgPSBfX3Jhd19yZWFkbCgodm9pZCBfX2lvbWVtICopcyk7CiAJaWYgKHVubGlrZWx5KCFzKSkgewogc3B1cmlvdXM6CiAJCXNwdXJpb3VzX2ludGVycnVwdCgpOwpAQCAtNDY5LDQ4ICs1MDQsNDIgQEAKIAlkb19JUlEob2ZmKTsKIH0KIAorCitzdGF0aWMgaW5saW5lIHZvaWQgaWNfaW5pdCh2b2lkIF9faW9tZW0gKmJhc2UpCit7CisJLyogaW5pdGlhbGl6ZSBpbnRlcnJ1cHQgY29udHJvbGxlciB0byBhIHNhZmUgc3RhdGUgKi8KKwlfX3Jhd193cml0ZWwoMHhmZmZmZmZmZiwgYmFzZSArIElDX0NGRzBDTFIpOworCV9fcmF3X3dyaXRlbCgweGZmZmZmZmZmLCBiYXNlICsgSUNfQ0ZHMUNMUik7CisJX19yYXdfd3JpdGVsKDB4ZmZmZmZmZmYsIGJhc2UgKyBJQ19DRkcyQ0xSKTsKKwlfX3Jhd193cml0ZWwoMHhmZmZmZmZmZiwgYmFzZSArIElDX01BU0tDTFIpOworCV9fcmF3X3dyaXRlbCgweGZmZmZmZmZmLCBiYXNlICsgSUNfQVNTSUdOQ0xSKTsKKwlfX3Jhd193cml0ZWwoMHhmZmZmZmZmZiwgYmFzZSArIElDX1dBS0VDTFIpOworCV9fcmF3X3dyaXRlbCgweGZmZmZmZmZmLCBiYXNlICsgSUNfU1JDU0VUKTsKKwlfX3Jhd193cml0ZWwoMHhmZmZmZmZmZiwgYmFzZSArIElDX0ZBTExJTkdDTFIpOworCV9fcmF3X3dyaXRlbCgweGZmZmZmZmZmLCBiYXNlICsgSUNfUklTSU5HQ0xSKTsKKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMCwgYmFzZSArIElDX1RFU1RCSVQpOworCXdtYigpOworfQorCiBzdGF0aWMgdm9pZCBfX2luaXQgYXUxMDAwX2luaXRfaXJxKHN0cnVjdCBhdTF4eHhfaXJxbWFwICptYXApCiB7CiAJdW5zaWduZWQgaW50IGJpdCwgaXJxX25yOwotCWludCBpOworCXZvaWQgX19pb21lbSAqYmFzZTsKIAotCS8qCi0JICogSW5pdGlhbGl6ZSBpbnRlcnJ1cHQgY29udHJvbGxlcnMgdG8gYSBzYWZlIHN0YXRlLgotCSAqLwotCWF1X3dyaXRlbCgweGZmZmZmZmZmLCBJQzBfQ0ZHMENMUik7Ci0JYXVfd3JpdGVsKDB4ZmZmZmZmZmYsIElDMF9DRkcxQ0xSKTsKLQlhdV93cml0ZWwoMHhmZmZmZmZmZiwgSUMwX0NGRzJDTFIpOwotCWF1X3dyaXRlbCgweGZmZmZmZmZmLCBJQzBfTUFTS0NMUik7Ci0JYXVfd3JpdGVsKDB4ZmZmZmZmZmYsIElDMF9BU1NJR05DTFIpOwotCWF1X3dyaXRlbCgweGZmZmZmZmZmLCBJQzBfV0FLRUNMUik7Ci0JYXVfd3JpdGVsKDB4ZmZmZmZmZmYsIElDMF9TUkNTRVQpOwotCWF1X3dyaXRlbCgweGZmZmZmZmZmLCBJQzBfRkFMTElOR0NMUik7Ci0JYXVfd3JpdGVsKDB4ZmZmZmZmZmYsIElDMF9SSVNJTkdDTFIpOwotCWF1X3dyaXRlbCgweDAwMDAwMDAwLCBJQzBfVEVTVEJJVCk7Ci0KLQlhdV93cml0ZWwoMHhmZmZmZmZmZiwgSUMxX0NGRzBDTFIpOwotCWF1X3dyaXRlbCgweGZmZmZmZmZmLCBJQzFfQ0ZHMUNMUik7Ci0JYXVfd3JpdGVsKDB4ZmZmZmZmZmYsIElDMV9DRkcyQ0xSKTsKLQlhdV93cml0ZWwoMHhmZmZmZmZmZiwgSUMxX01BU0tDTFIpOwotCWF1X3dyaXRlbCgweGZmZmZmZmZmLCBJQzFfQVNTSUdOQ0xSKTsKLQlhdV93cml0ZWwoMHhmZmZmZmZmZiwgSUMxX1dBS0VDTFIpOwotCWF1X3dyaXRlbCgweGZmZmZmZmZmLCBJQzFfU1JDU0VUKTsKLQlhdV93cml0ZWwoMHhmZmZmZmZmZiwgSUMxX0ZBTExJTkdDTFIpOwotCWF1X3dyaXRlbCgweGZmZmZmZmZmLCBJQzFfUklTSU5HQ0xSKTsKLQlhdV93cml0ZWwoMHgwMDAwMDAwMCwgSUMxX1RFU1RCSVQpOwotCisJaWNfaW5pdCgodm9pZCBfX2lvbWVtICopS1NFRzFBRERSKEFVMTAwMF9JQzBfUEhZU19BRERSKSk7CisJaWNfaW5pdCgodm9pZCBfX2lvbWVtICopS1NFRzFBRERSKEFVMTAwMF9JQzFfUEhZU19BRERSKSk7CiAJbWlwc19jcHVfaXJxX2luaXQoKTsKIAogCS8qIHJlZ2lzdGVyIGFsbCA2NCBwb3NzaWJsZSBJQzArSUMxIGlycSBzb3VyY2VzIGFzIHR5cGUgIm5vbmUiLgogCSAqIFVzZSBzZXRfaXJxX3R5cGUoKSB0byBzZXQgZWRnZS9sZXZlbCBiZWhhdmlvdXIgYXQgcnVudGltZS4KIAkgKi8KLQlmb3IgKGkgPSBBVTEwMDBfSU5UQzBfSU5UX0JBU0U7Ci0JICAgICAoaSA8IEFVMTAwMF9JTlRDMF9JTlRfQkFTRSArIDMyKTsgaSsrKQotCQlhdTF4X2ljX3NldHR5cGUoaXJxX2dldF9pcnFfZGF0YShpKSwgSVJRX1RZUEVfTk9ORSk7CisJZm9yIChpcnFfbnIgPSBBVTEwMDBfSU5UQzBfSU5UX0JBU0U7CisJICAgICAoaXJxX25yIDwgQVUxMDAwX0lOVEMwX0lOVF9CQVNFICsgMzIpOyBpcnFfbnIrKykKKwkJYXUxeF9pY19zZXR0eXBlKGlycV9nZXRfaXJxX2RhdGEoaXJxX25yKSwgSVJRX1RZUEVfTk9ORSk7CiAKLQlmb3IgKGkgPSBBVTEwMDBfSU5UQzFfSU5UX0JBU0U7Ci0JICAgICAoaSA8IEFVMTAwMF9JTlRDMV9JTlRfQkFTRSArIDMyKTsgaSsrKQotCQlhdTF4X2ljX3NldHR5cGUoaXJxX2dldF9pcnFfZGF0YShpKSwgSVJRX1RZUEVfTk9ORSk7CisJZm9yIChpcnFfbnIgPSBBVTEwMDBfSU5UQzFfSU5UX0JBU0U7CisJICAgICAoaXJxX25yIDwgQVUxMDAwX0lOVEMxX0lOVF9CQVNFICsgMzIpOyBpcnFfbnIrKykKKwkJYXUxeF9pY19zZXR0eXBlKGlycV9nZXRfaXJxX2RhdGEoaXJxX25yKSwgSVJRX1RZUEVfTk9ORSk7CiAKIAkvKgogCSAqIEluaXRpYWxpemUgSUMwLCB3aGljaCBpcyBmaXhlZCBwZXIgcHJvY2Vzc29yLgpAQCAtNTIwLDEzICs1NDksMTMgQEAKIAogCQlpZiAoaXJxX25yID49IEFVMTAwMF9JTlRDMV9JTlRfQkFTRSkgewogCQkJYml0ID0gaXJxX25yIC0gQVUxMDAwX0lOVEMxX0lOVF9CQVNFOwotCQkJaWYgKG1hcC0+aW1fcmVxdWVzdCkKLQkJCQlhdV93cml0ZWwoMSA8PCBiaXQsIElDMV9BU1NJR05TRVQpOworCQkJYmFzZSA9ICh2b2lkIF9faW9tZW0gKilLU0VHMUFERFIoQVUxMDAwX0lDMV9QSFlTX0FERFIpOwogCQl9IGVsc2UgewogCQkJYml0ID0gaXJxX25yIC0gQVUxMDAwX0lOVEMwX0lOVF9CQVNFOwotCQkJaWYgKG1hcC0+aW1fcmVxdWVzdCkKLQkJCQlhdV93cml0ZWwoMSA8PCBiaXQsIElDMF9BU1NJR05TRVQpOworCQkJYmFzZSA9ICh2b2lkIF9faW9tZW0gKilLU0VHMUFERFIoQVUxMDAwX0lDMF9QSFlTX0FERFIpOwogCQl9CisJCWlmIChtYXAtPmltX3JlcXVlc3QpCisJCQlfX3Jhd193cml0ZWwoMSA8PCBiaXQsIGJhc2UgKyBJQ19BU1NJR05TRVQpOwogCiAJCWF1MXhfaWNfc2V0dHlwZShpcnFfZ2V0X2lycV9kYXRhKGlycV9uciksIG1hcC0+aW1fdHlwZSk7CiAJCSsrbWFwOwpAQCAtNTU2LDkwICs1ODUsNjIgQEAKIAl9CiB9CiAKLXN0cnVjdCBhbGNoZW15X2ljX3N5c2RldiB7Ci0Jc3RydWN0IHN5c19kZXZpY2Ugc3lzZGV2OwotCXZvaWQgX19pb21lbSAqYmFzZTsKLQl1bnNpZ25lZCBsb25nIHBtZGF0YVs3XTsKLX07CiAKLXN0YXRpYyBpbnQgYWxjaGVteV9pY19zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFsY2hlbXlfaWNfcG1kYXRhWzcgKiAyXTsKKworc3RhdGljIGlubGluZSB2b2lkIGFsY2hlbXlfaWNfc3VzcGVuZF9vbmUodm9pZCBfX2lvbWVtICpiYXNlLCB1bnNpZ25lZCBsb25nICpkKQogewotCXN0cnVjdCBhbGNoZW15X2ljX3N5c2RldiAqaWNkZXYgPQotCQkJY29udGFpbmVyX29mKGRldiwgc3RydWN0IGFsY2hlbXlfaWNfc3lzZGV2LCBzeXNkZXYpOworCWRbMF0gPSBfX3Jhd19yZWFkbChiYXNlICsgSUNfQ0ZHMFJEKTsKKwlkWzFdID0gX19yYXdfcmVhZGwoYmFzZSArIElDX0NGRzFSRCk7CisJZFsyXSA9IF9fcmF3X3JlYWRsKGJhc2UgKyBJQ19DRkcyUkQpOworCWRbM10gPSBfX3Jhd19yZWFkbChiYXNlICsgSUNfU1JDUkQpOworCWRbNF0gPSBfX3Jhd19yZWFkbChiYXNlICsgSUNfQVNTSUdOUkQpOworCWRbNV0gPSBfX3Jhd19yZWFkbChiYXNlICsgSUNfV0FLRVJEKTsKKwlkWzZdID0gX19yYXdfcmVhZGwoYmFzZSArIElDX01BU0tSRCk7CisJaWNfaW5pdChiYXNlKTsJCS8qIHNodXQgaXQgdXAgdG9vIHdoaWxlIGF0IGl0ICovCit9CiAKLQlpY2Rldi0+cG1kYXRhWzBdID0gX19yYXdfcmVhZGwoaWNkZXYtPmJhc2UgKyBJQ19DRkcwUkQpOwotCWljZGV2LT5wbWRhdGFbMV0gPSBfX3Jhd19yZWFkbChpY2Rldi0+YmFzZSArIElDX0NGRzFSRCk7Ci0JaWNkZXYtPnBtZGF0YVsyXSA9IF9fcmF3X3JlYWRsKGljZGV2LT5iYXNlICsgSUNfQ0ZHMlJEKTsKLQlpY2Rldi0+cG1kYXRhWzNdID0gX19yYXdfcmVhZGwoaWNkZXYtPmJhc2UgKyBJQ19TUkNSRCk7Ci0JaWNkZXYtPnBtZGF0YVs0XSA9IF9fcmF3X3JlYWRsKGljZGV2LT5iYXNlICsgSUNfQVNTSUdOUkQpOwotCWljZGV2LT5wbWRhdGFbNV0gPSBfX3Jhd19yZWFkbChpY2Rldi0+YmFzZSArIElDX1dBS0VSRCk7Ci0JaWNkZXYtPnBtZGF0YVs2XSA9IF9fcmF3X3JlYWRsKGljZGV2LT5iYXNlICsgSUNfTUFTS1JEKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBhbGNoZW15X2ljX3Jlc3VtZV9vbmUodm9pZCBfX2lvbWVtICpiYXNlLCB1bnNpZ25lZCBsb25nICpkKQoreworCWljX2luaXQoYmFzZSk7CiAKKwlfX3Jhd193cml0ZWwoZFswXSwgYmFzZSArIElDX0NGRzBTRVQpOworCV9fcmF3X3dyaXRlbChkWzFdLCBiYXNlICsgSUNfQ0ZHMVNFVCk7CisJX19yYXdfd3JpdGVsKGRbMl0sIGJhc2UgKyBJQ19DRkcyU0VUKTsKKwlfX3Jhd193cml0ZWwoZFszXSwgYmFzZSArIElDX1NSQ1NFVCk7CisJX19yYXdfd3JpdGVsKGRbNF0sIGJhc2UgKyBJQ19BU1NJR05TRVQpOworCV9fcmF3X3dyaXRlbChkWzVdLCBiYXNlICsgSUNfV0FLRVNFVCk7CisJd21iKCk7CisKKwlfX3Jhd193cml0ZWwoZFs2XSwgYmFzZSArIElDX01BU0tTRVQpOworCXdtYigpOworfQorCitzdGF0aWMgaW50IGFsY2hlbXlfaWNfc3VzcGVuZCh2b2lkKQoreworCWFsY2hlbXlfaWNfc3VzcGVuZF9vbmUoKHZvaWQgX19pb21lbSAqKUtTRUcxQUREUihBVTEwMDBfSUMwX1BIWVNfQUREUiksCisJCQkgICAgICAgYWxjaGVteV9pY19wbWRhdGEpOworCWFsY2hlbXlfaWNfc3VzcGVuZF9vbmUoKHZvaWQgX19pb21lbSAqKUtTRUcxQUREUihBVTEwMDBfSUMxX1BIWVNfQUREUiksCisJCQkgICAgICAgJmFsY2hlbXlfaWNfcG1kYXRhWzddKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhbGNoZW15X2ljX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgYWxjaGVteV9pY19yZXN1bWUodm9pZCkKIHsKLQlzdHJ1Y3QgYWxjaGVteV9pY19zeXNkZXYgKmljZGV2ID0KLQkJCWNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBhbGNoZW15X2ljX3N5c2Rldiwgc3lzZGV2KTsKLQotCV9fcmF3X3dyaXRlbCgweGZmZmZmZmZmLCBpY2Rldi0+YmFzZSArIElDX01BU0tDTFIpOwotCV9fcmF3X3dyaXRlbCgweGZmZmZmZmZmLCBpY2Rldi0+YmFzZSArIElDX0NGRzBDTFIpOwotCV9fcmF3X3dyaXRlbCgweGZmZmZmZmZmLCBpY2Rldi0+YmFzZSArIElDX0NGRzFDTFIpOwotCV9fcmF3X3dyaXRlbCgweGZmZmZmZmZmLCBpY2Rldi0+YmFzZSArIElDX0NGRzJDTFIpOwotCV9fcmF3X3dyaXRlbCgweGZmZmZmZmZmLCBpY2Rldi0+YmFzZSArIElDX1NSQ0NMUik7Ci0JX19yYXdfd3JpdGVsKDB4ZmZmZmZmZmYsIGljZGV2LT5iYXNlICsgSUNfQVNTSUdOQ0xSKTsKLQlfX3Jhd193cml0ZWwoMHhmZmZmZmZmZiwgaWNkZXYtPmJhc2UgKyBJQ19XQUtFQ0xSKTsKLQlfX3Jhd193cml0ZWwoMHhmZmZmZmZmZiwgaWNkZXYtPmJhc2UgKyBJQ19SSVNJTkdDTFIpOwotCV9fcmF3X3dyaXRlbCgweGZmZmZmZmZmLCBpY2Rldi0+YmFzZSArIElDX0ZBTExJTkdDTFIpOwotCV9fcmF3X3dyaXRlbCgweDAwMDAwMDAwLCBpY2Rldi0+YmFzZSArIElDX1RFU1RCSVQpOwotCXdtYigpOwotCV9fcmF3X3dyaXRlbChpY2Rldi0+cG1kYXRhWzBdLCBpY2Rldi0+YmFzZSArIElDX0NGRzBTRVQpOwotCV9fcmF3X3dyaXRlbChpY2Rldi0+cG1kYXRhWzFdLCBpY2Rldi0+YmFzZSArIElDX0NGRzFTRVQpOwotCV9fcmF3X3dyaXRlbChpY2Rldi0+cG1kYXRhWzJdLCBpY2Rldi0+YmFzZSArIElDX0NGRzJTRVQpOwotCV9fcmF3X3dyaXRlbChpY2Rldi0+cG1kYXRhWzNdLCBpY2Rldi0+YmFzZSArIElDX1NSQ1NFVCk7Ci0JX19yYXdfd3JpdGVsKGljZGV2LT5wbWRhdGFbNF0sIGljZGV2LT5iYXNlICsgSUNfQVNTSUdOU0VUKTsKLQlfX3Jhd193cml0ZWwoaWNkZXYtPnBtZGF0YVs1XSwgaWNkZXYtPmJhc2UgKyBJQ19XQUtFU0VUKTsKLQl3bWIoKTsKLQotCV9fcmF3X3dyaXRlbChpY2Rldi0+cG1kYXRhWzZdLCBpY2Rldi0+YmFzZSArIElDX01BU0tTRVQpOwotCXdtYigpOwotCi0JcmV0dXJuIDA7CisJYWxjaGVteV9pY19yZXN1bWVfb25lKCh2b2lkIF9faW9tZW0gKilLU0VHMUFERFIoQVUxMDAwX0lDMV9QSFlTX0FERFIpLAorCQkJICAgICAgJmFsY2hlbXlfaWNfcG1kYXRhWzddKTsKKwlhbGNoZW15X2ljX3Jlc3VtZV9vbmUoKHZvaWQgX19pb21lbSAqKUtTRUcxQUREUihBVTEwMDBfSUMwX1BIWVNfQUREUiksCisJCQkgICAgICBhbGNoZW15X2ljX3BtZGF0YSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIGFsY2hlbXlfaWNfc3lzZGV2X2NsYXNzID0gewotCS5uYW1lCQk9ICJpYyIsCitzdGF0aWMgc3RydWN0IHN5c2NvcmVfb3BzIGFsY2hlbXlfaWNfc3lzY29yZV9vcHMgPSB7CiAJLnN1c3BlbmQJPSBhbGNoZW15X2ljX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSBhbGNoZW15X2ljX3Jlc3VtZSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IGFsY2hlbXlfaWNfc3lzZGV2X2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFsY2hlbXlfaWNfcG1faW5pdCh2b2lkKQogewotCXN0cnVjdCBhbGNoZW15X2ljX3N5c2RldiAqaWNkZXY7Ci0JdW5zaWduZWQgbG9uZyBpY2Jhc2VbMl0gPSB7IElDMF9QSFlTX0FERFIsIElDMV9QSFlTX0FERFIgfTsKLQlpbnQgZXJyLCBpOwotCi0JZXJyID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZhbGNoZW15X2ljX3N5c2Rldl9jbGFzcyk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJaWNkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWxjaGVteV9pY19zeXNkZXYpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFpY2RldikKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCWljZGV2LT5iYXNlID0gaW9yZW1hcChpY2Jhc2VbaV0sIDB4MTAwMCk7Ci0KLQkJaWNkZXYtPnN5c2Rldi5pZCA9IGk7Ci0JCWljZGV2LT5zeXNkZXYuY2xzID0gJmFsY2hlbXlfaWNfc3lzZGV2X2NsYXNzOwotCQllcnIgPSBzeXNkZXZfcmVnaXN0ZXIoJmljZGV2LT5zeXNkZXYpOwotCQlpZiAoZXJyKSB7Ci0JCQlrZnJlZShpY2Rldik7Ci0JCQlyZXR1cm4gZXJyOwotCQl9Ci0JfQotCisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJmFsY2hlbXlfaWNfc3lzY29yZV9vcHMpOwogCXJldHVybiAwOwogfQotZGV2aWNlX2luaXRjYWxsKGFsY2hlbXlfaWNfc3lzZGV2X2luaXQpOworZGV2aWNlX2luaXRjYWxsKGFsY2hlbXlfaWNfcG1faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vcGxhdGZvcm0uYyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9wbGF0Zm9ybS5jCmluZGV4IDllNzgxNGQuLjNiMmMxOGIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9wbGF0Zm9ybS5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9wbGF0Zm9ybS5jCkBAIC0xMyw5ICsxMywxMCBAQAogCiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxeHh4Lmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MXh4eF9kYmRtYS5oPgpAQCAtMzAsMjEgKzMxLDEyIEBACiAjaWZkZWYgQ09ORklHX1NFUklBTF84MjUwCiAJc3dpdGNoIChzdGF0ZSkgewogCWNhc2UgMDoKLQkJaWYgKChfX3Jhd19yZWFkbChwb3J0LT5tZW1iYXNlICsgVUFSVF9NT0RfQ05UUkwpICYgMykgIT0gMykgewotCQkJLyogcG93ZXItb24gc2VxdWVuY2UgYXMgc3VnZ2VzdGVkIGluIHRoZSBkYXRhYm9va3MgKi8KLQkJCV9fcmF3X3dyaXRlbCgwLCBwb3J0LT5tZW1iYXNlICsgVUFSVF9NT0RfQ05UUkwpOwotCQkJd21iKCk7Ci0JCQlfX3Jhd193cml0ZWwoMSwgcG9ydC0+bWVtYmFzZSArIFVBUlRfTU9EX0NOVFJMKTsKLQkJCXdtYigpOwotCQl9Ci0JCV9fcmF3X3dyaXRlbCgzLCBwb3J0LT5tZW1iYXNlICsgVUFSVF9NT0RfQ05UUkwpOyAvKiBmdWxsIG9uICovCi0JCXdtYigpOworCQlhbGNoZW15X3VhcnRfZW5hYmxlKENQSFlTQUREUihwb3J0LT5tZW1iYXNlKSk7CiAJCXNlcmlhbDgyNTBfZG9fcG0ocG9ydCwgc3RhdGUsIG9sZF9zdGF0ZSk7CiAJCWJyZWFrOwogCWNhc2UgMzoJCS8qIHBvd2VyIG9mZiAqLwogCQlzZXJpYWw4MjUwX2RvX3BtKHBvcnQsIHN0YXRlLCBvbGRfc3RhdGUpOwotCQlfX3Jhd193cml0ZWwoMCwgcG9ydC0+bWVtYmFzZSArIFVBUlRfTU9EX0NOVFJMKTsKLQkJd21iKCk7CisJCWFsY2hlbXlfdWFydF9kaXNhYmxlKENQSFlTQUREUihwb3J0LT5tZW1iYXNlKSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXNlcmlhbDgyNTBfZG9fcG0ocG9ydCwgc3RhdGUsIG9sZF9zdGF0ZSk7CkBAIC02NSwzOCArNTcsNjAgQEAKIAkJLnBtCQk9IGFsY2hlbXlfODI1MF9wbSwJCVwKIAl9CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgYXUxeDAwX3VhcnRfZGF0YVtdID0gewotI2lmIGRlZmluZWQoQ09ORklHX1NPQ19BVTEwMDApCi0JUE9SVChVQVJUMF9QSFlTX0FERFIsIEFVMTAwMF9VQVJUMF9JTlQpLAotCVBPUlQoVUFSVDFfUEhZU19BRERSLCBBVTEwMDBfVUFSVDFfSU5UKSwKLQlQT1JUKFVBUlQyX1BIWVNfQUREUiwgQVUxMDAwX1VBUlQyX0lOVCksCi0JUE9SVChVQVJUM19QSFlTX0FERFIsIEFVMTAwMF9VQVJUM19JTlQpLAotI2VsaWYgZGVmaW5lZChDT05GSUdfU09DX0FVMTUwMCkKLQlQT1JUKFVBUlQwX1BIWVNfQUREUiwgQVUxNTAwX1VBUlQwX0lOVCksCi0JUE9SVChVQVJUM19QSFlTX0FERFIsIEFVMTUwMF9VQVJUM19JTlQpLAotI2VsaWYgZGVmaW5lZChDT05GSUdfU09DX0FVMTEwMCkKLQlQT1JUKFVBUlQwX1BIWVNfQUREUiwgQVUxMTAwX1VBUlQwX0lOVCksCi0JUE9SVChVQVJUMV9QSFlTX0FERFIsIEFVMTEwMF9VQVJUMV9JTlQpLAotCVBPUlQoVUFSVDNfUEhZU19BRERSLCBBVTExMDBfVUFSVDNfSU5UKSwKLSNlbGlmIGRlZmluZWQoQ09ORklHX1NPQ19BVTE1NTApCi0JUE9SVChVQVJUMF9QSFlTX0FERFIsIEFVMTU1MF9VQVJUMF9JTlQpLAotCVBPUlQoVUFSVDFfUEhZU19BRERSLCBBVTE1NTBfVUFSVDFfSU5UKSwKLQlQT1JUKFVBUlQzX1BIWVNfQUREUiwgQVUxNTUwX1VBUlQzX0lOVCksCi0jZWxpZiBkZWZpbmVkKENPTkZJR19TT0NfQVUxMjAwKQotCVBPUlQoVUFSVDBfUEhZU19BRERSLCBBVTEyMDBfVUFSVDBfSU5UKSwKLQlQT1JUKFVBUlQxX1BIWVNfQUREUiwgQVUxMjAwX1VBUlQxX0lOVCksCi0jZW5kaWYKLQl7IH0sCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IGF1MXgwMF91YXJ0X2RhdGFbXVs0XSBfX2luaXRkYXRhID0geworCVtBTENIRU1ZX0NQVV9BVTEwMDBdID0geworCQlQT1JUKEFVMTAwMF9VQVJUMF9QSFlTX0FERFIsIEFVMTAwMF9VQVJUMF9JTlQpLAorCQlQT1JUKEFVMTAwMF9VQVJUMV9QSFlTX0FERFIsIEFVMTAwMF9VQVJUMV9JTlQpLAorCQlQT1JUKEFVMTAwMF9VQVJUMl9QSFlTX0FERFIsIEFVMTAwMF9VQVJUMl9JTlQpLAorCQlQT1JUKEFVMTAwMF9VQVJUM19QSFlTX0FERFIsIEFVMTAwMF9VQVJUM19JTlQpLAorCX0sCisJW0FMQ0hFTVlfQ1BVX0FVMTUwMF0gPSB7CisJCVBPUlQoQVUxMDAwX1VBUlQwX1BIWVNfQUREUiwgQVUxNTAwX1VBUlQwX0lOVCksCisJCVBPUlQoQVUxMDAwX1VBUlQzX1BIWVNfQUREUiwgQVUxNTAwX1VBUlQzX0lOVCksCisJfSwKKwlbQUxDSEVNWV9DUFVfQVUxMTAwXSA9IHsKKwkJUE9SVChBVTEwMDBfVUFSVDBfUEhZU19BRERSLCBBVTExMDBfVUFSVDBfSU5UKSwKKwkJUE9SVChBVTEwMDBfVUFSVDFfUEhZU19BRERSLCBBVTExMDBfVUFSVDFfSU5UKSwKKwkJUE9SVChBVTEwMDBfVUFSVDNfUEhZU19BRERSLCBBVTExMDBfVUFSVDNfSU5UKSwKKwl9LAorCVtBTENIRU1ZX0NQVV9BVTE1NTBdID0geworCQlQT1JUKEFVMTAwMF9VQVJUMF9QSFlTX0FERFIsIEFVMTU1MF9VQVJUMF9JTlQpLAorCQlQT1JUKEFVMTAwMF9VQVJUMV9QSFlTX0FERFIsIEFVMTU1MF9VQVJUMV9JTlQpLAorCQlQT1JUKEFVMTAwMF9VQVJUM19QSFlTX0FERFIsIEFVMTU1MF9VQVJUM19JTlQpLAorCX0sCisJW0FMQ0hFTVlfQ1BVX0FVMTIwMF0gPSB7CisJCVBPUlQoQVUxMDAwX1VBUlQwX1BIWVNfQUREUiwgQVUxMjAwX1VBUlQwX0lOVCksCisJCVBPUlQoQVUxMDAwX1VBUlQxX1BIWVNfQUREUiwgQVUxMjAwX1VBUlQxX0lOVCksCisJfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF1MXh4MF91YXJ0X2RldmljZSA9IHsKIAkubmFtZQkJCT0gInNlcmlhbDgyNTAiLAogCS5pZAkJCT0gUExBVDgyNTBfREVWX0FVMVgwMCwKLQkuZGV2CQkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gYXUxeDAwX3VhcnRfZGF0YSwKLQl9LAogfTsKIAorc3RhdGljIHZvaWQgX19pbml0IGFsY2hlbXlfc2V0dXBfdWFydHMoaW50IGN0eXBlKQoreworCXVuc2lnbmVkIGludCB1YXJ0Y2xrID0gZ2V0X2F1MXgwMF91YXJ0X2JhdWRfYmFzZSgpICogMTY7CisJaW50IHMgPSBzaXplb2Yoc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0KTsKKwlpbnQgYyA9IGFsY2hlbXlfZ2V0X3VhcnRzKGN0eXBlKTsKKwlzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgKnBvcnRzOworCisJcG9ydHMgPSBremFsbG9jKHMgKiAoYyArIDEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBvcnRzKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkFsY2hlbXk6IG5vIG1lbW9yeSBmb3IgVUFSVCBkYXRhXG4iKTsKKwkJcmV0dXJuOworCX0KKwltZW1jcHkocG9ydHMsIGF1MXgwMF91YXJ0X2RhdGFbY3R5cGVdLCBzICogYyk7CisJYXUxeHgwX3VhcnRfZGV2aWNlLmRldi5wbGF0Zm9ybV9kYXRhID0gcG9ydHM7CisKKwkvKiBGaWxsIHVwIHVhcnRjbGsuICovCisJZm9yIChzID0gMDsgcyA8IGM7IHMrKykKKwkJcG9ydHNbc10udWFydGNsayA9IHVhcnRjbGs7CisJaWYgKHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXUxeHgwX3VhcnRfZGV2aWNlKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQWxjaGVteTogZmFpbGVkIHRvIHJlZ2lzdGVyIFVBUlRzXG4iKTsKK30KKwogLyogT0hDSSAoVVNCIGZ1bGwgc3BlZWQgaG9zdCBjb250cm9sbGVyKSAqLwogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdTF4eHhfdXNiX29oY2lfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewpAQCAtMjY5LDggKzI4Myw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXUxMjAwX21tYzBfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewotCQkuc3RhcnQgICAgICAgICAgPSBTRDBfUEhZU19BRERSLAotCQkuZW5kICAgICAgICAgICAgPSBTRDBfUEhZU19BRERSICsgMHg3ZmZmZiwKKwkJLnN0YXJ0ICAgICAgICAgID0gQVUxMTAwX1NEMF9QSFlTX0FERFIsCisJCS5lbmQgICAgICAgICAgICA9IEFVMTEwMF9TRDBfUEhZU19BRERSICsgMHhmZmYsCiAJCS5mbGFncyAgICAgICAgICA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJWzFdID0gewpAQCAtMzA1LDggKzMxOSw4IEBACiAjaWZuZGVmIENPTkZJR19NSVBTX0RCMTIwMAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdTEyMDBfbW1jMV9yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7Ci0JCS5zdGFydCAgICAgICAgICA9IFNEMV9QSFlTX0FERFIsCi0JCS5lbmQgICAgICAgICAgICA9IFNEMV9QSFlTX0FERFIgKyAweDdmZmZmLAorCQkuc3RhcnQgICAgICAgICAgPSBBVTExMDBfU0QxX1BIWVNfQUREUiwKKwkJLmVuZCAgICAgICAgICAgID0gQVUxMTAwX1NEMV9QSFlTX0FERFIgKyAweGZmZiwKIAkJLmZsYWdzICAgICAgICAgID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAlbMV0gPSB7CkBAIC0zNTksMTUgKzM3MywxNiBAQAogI2VuZGlmCiAKIC8qIE1hY3JvIHRvIGhlbHAgZGVmaW5pbmcgdGhlIEV0aGVybmV0IE1BQyByZXNvdXJjZXMgKi8KKyNkZWZpbmUgTUFDX1JFU19DT1VOVAkzCS8qIE1BQyByZWdzIGJhc2UsIE1BQyBlbmFibGUgcmVnLCBNQUMgSU5UICovCiAjZGVmaW5lIE1BQ19SRVMoX2Jhc2UsIF9lbmFibGUsIF9pcnEpCQkJXAogCXsJCQkJCQlcCi0JCS5zdGFydAk9IENQSFlTQUREUihfYmFzZSksCQlcCi0JCS5lbmQJPSBDUEhZU0FERFIoX2Jhc2UgKyAweGZmZmYpLAlcCisJCS5zdGFydAk9IF9iYXNlLAkJCVwKKwkJLmVuZAk9IF9iYXNlICsgMHhmZmZmLAkJXAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwJCVwKIAl9LAkJCQkJCVwKIAl7CQkJCQkJXAotCQkuc3RhcnQJPSBDUEhZU0FERFIoX2VuYWJsZSksCQlcCi0JCS5lbmQJPSBDUEhZU0FERFIoX2VuYWJsZSArIDB4MyksCVwKKwkJLnN0YXJ0CT0gX2VuYWJsZSwJCQlcCisJCS5lbmQJPSBfZW5hYmxlICsgMHgzLAkJXAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwJCVwKIAl9LAkJCQkJCVwKIAl7CQkJCQkJXApAQCAtMzc2LDE5ICszOTEsMjkgQEAKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEJCVwKIAl9CiAKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXUxeHh4X2V0aDBfcmVzb3VyY2VzW10gPSB7Ci0jaWYgZGVmaW5lZChDT05GSUdfU09DX0FVMTAwMCkKLQlNQUNfUkVTKEFVMTAwMF9FVEgwX0JBU0UsIEFVMTAwMF9NQUMwX0VOQUJMRSwgQVUxMDAwX01BQzBfRE1BX0lOVCksCi0jZWxpZiBkZWZpbmVkKENPTkZJR19TT0NfQVUxMTAwKQotCU1BQ19SRVMoQVUxMTAwX0VUSDBfQkFTRSwgQVUxMTAwX01BQzBfRU5BQkxFLCBBVTExMDBfTUFDMF9ETUFfSU5UKSwKLSNlbGlmIGRlZmluZWQoQ09ORklHX1NPQ19BVTE1NTApCi0JTUFDX1JFUyhBVTE1NTBfRVRIMF9CQVNFLCBBVTE1NTBfTUFDMF9FTkFCTEUsIEFVMTU1MF9NQUMwX0RNQV9JTlQpLAotI2VsaWYgZGVmaW5lZChDT05GSUdfU09DX0FVMTUwMCkKLQlNQUNfUkVTKEFVMTUwMF9FVEgwX0JBU0UsIEFVMTUwMF9NQUMwX0VOQUJMRSwgQVUxNTAwX01BQzBfRE1BX0lOVCksCi0jZW5kaWYKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXUxeHh4X2V0aDBfcmVzb3VyY2VzW11bTUFDX1JFU19DT1VOVF0gX19pbml0ZGF0YSA9IHsKKwlbQUxDSEVNWV9DUFVfQVUxMDAwXSA9IHsKKwkJTUFDX1JFUyhBVTEwMDBfTUFDMF9QSFlTX0FERFIsCisJCQlBVTEwMDBfTUFDRU5fUEhZU19BRERSLAorCQkJQVUxMDAwX01BQzBfRE1BX0lOVCkKKwl9LAorCVtBTENIRU1ZX0NQVV9BVTE1MDBdID0geworCQlNQUNfUkVTKEFVMTUwMF9NQUMwX1BIWVNfQUREUiwKKwkJCUFVMTUwMF9NQUNFTl9QSFlTX0FERFIsCisJCQlBVTE1MDBfTUFDMF9ETUFfSU5UKQorCX0sCisJW0FMQ0hFTVlfQ1BVX0FVMTEwMF0gPSB7CisJCU1BQ19SRVMoQVUxMDAwX01BQzBfUEhZU19BRERSLAorCQkJQVUxMDAwX01BQ0VOX1BIWVNfQUREUiwKKwkJCUFVMTEwMF9NQUMwX0RNQV9JTlQpCisJfSwKKwlbQUxDSEVNWV9DUFVfQVUxNTUwXSA9IHsKKwkJTUFDX1JFUyhBVTEwMDBfTUFDMF9QSFlTX0FERFIsCisJCQlBVTEwMDBfTUFDRU5fUEhZU19BRERSLAorCQkJQVUxNTUwX01BQzBfRE1BX0lOVCkKKwl9LAogfTsKIAotCiBzdGF0aWMgc3RydWN0IGF1MTAwMF9ldGhfcGxhdGZvcm1fZGF0YSBhdTF4eHhfZXRoMF9wbGF0Zm9ybV9kYXRhID0gewogCS5waHkxX3NlYXJjaF9tYWMwID0gMSwKIH07CkBAIC0zOTYsMjAgKzQyMSwyNiBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXUxeHh4X2V0aDBfZGV2aWNlID0gewogCS5uYW1lCQk9ICJhdTEwMDAtZXRoIiwKIAkuaWQJCT0gMCwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoYXUxeHh4X2V0aDBfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSBhdTF4eHhfZXRoMF9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBNQUNfUkVTX0NPVU5ULAogCS5kZXYucGxhdGZvcm1fZGF0YSA9ICZhdTF4eHhfZXRoMF9wbGF0Zm9ybV9kYXRhLAogfTsKIAotI2lmbmRlZiBDT05GSUdfU09DX0FVMTEwMAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdTF4eHhfZXRoMV9yZXNvdXJjZXNbXSA9IHsKLSNpZiBkZWZpbmVkKENPTkZJR19TT0NfQVUxMDAwKQotCU1BQ19SRVMoQVUxMDAwX0VUSDFfQkFTRSwgQVUxMDAwX01BQzFfRU5BQkxFLCBBVTEwMDBfTUFDMV9ETUFfSU5UKSwKLSNlbGlmIGRlZmluZWQoQ09ORklHX1NPQ19BVTE1NTApCi0JTUFDX1JFUyhBVTE1NTBfRVRIMV9CQVNFLCBBVTE1NTBfTUFDMV9FTkFCTEUsIEFVMTU1MF9NQUMxX0RNQV9JTlQpLAotI2VsaWYgZGVmaW5lZChDT05GSUdfU09DX0FVMTUwMCkKLQlNQUNfUkVTKEFVMTUwMF9FVEgxX0JBU0UsIEFVMTUwMF9NQUMxX0VOQUJMRSwgQVUxNTAwX01BQzFfRE1BX0lOVCksCi0jZW5kaWYKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXUxeHh4X2V0aDFfcmVzb3VyY2VzW11bTUFDX1JFU19DT1VOVF0gX19pbml0ZGF0YSA9IHsKKwlbQUxDSEVNWV9DUFVfQVUxMDAwXSA9IHsKKwkJTUFDX1JFUyhBVTEwMDBfTUFDMV9QSFlTX0FERFIsCisJCQlBVTEwMDBfTUFDRU5fUEhZU19BRERSICsgNCwKKwkJCUFVMTAwMF9NQUMxX0RNQV9JTlQpCisJfSwKKwlbQUxDSEVNWV9DUFVfQVUxNTAwXSA9IHsKKwkJTUFDX1JFUyhBVTE1MDBfTUFDMV9QSFlTX0FERFIsCisJCQlBVTE1MDBfTUFDRU5fUEhZU19BRERSICsgNCwKKwkJCUFVMTUwMF9NQUMxX0RNQV9JTlQpCisJfSwKKwlbQUxDSEVNWV9DUFVfQVUxNTUwXSA9IHsKKwkJTUFDX1JFUyhBVTEwMDBfTUFDMV9QSFlTX0FERFIsCisJCQlBVTEwMDBfTUFDRU5fUEhZU19BRERSICsgNCwKKwkJCUFVMTU1MF9NQUMxX0RNQV9JTlQpCisJfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXUxMDAwX2V0aF9wbGF0Zm9ybV9kYXRhIGF1MXh4eF9ldGgxX3BsYXRmb3JtX2RhdGEgPSB7CkBAIC00MTksMTEgKzQ1MCw5IEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdTF4eHhfZXRoMV9kZXZpY2UgPSB7CiAJLm5hbWUJCT0gImF1MTAwMC1ldGgiLAogCS5pZAkJPSAxLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShhdTF4eHhfZXRoMV9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQk9IGF1MXh4eF9ldGgxX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IE1BQ19SRVNfQ09VTlQsCiAJLmRldi5wbGF0Zm9ybV9kYXRhID0gJmF1MXh4eF9ldGgxX3BsYXRmb3JtX2RhdGEsCiB9OwotI2VuZGlmCiAKIHZvaWQgX19pbml0IGF1MXh4eF9vdmVycmlkZV9ldGhfY2ZnKHVuc2lnbmVkIGludCBwb3J0LAogCQkJc3RydWN0IGF1MTAwMF9ldGhfcGxhdGZvcm1fZGF0YSAqZXRoX2RhdGEpCkBAIC00MzQsMTUgKzQ2Myw2NSBAQAogCWlmIChwb3J0ID09IDApCiAJCW1lbWNweSgmYXUxeHh4X2V0aDBfcGxhdGZvcm1fZGF0YSwgZXRoX2RhdGEsCiAJCQlzaXplb2Yoc3RydWN0IGF1MTAwMF9ldGhfcGxhdGZvcm1fZGF0YSkpOwotI2lmbmRlZiBDT05GSUdfU09DX0FVMTEwMAogCWVsc2UKIAkJbWVtY3B5KCZhdTF4eHhfZXRoMV9wbGF0Zm9ybV9kYXRhLCBldGhfZGF0YSwKIAkJCXNpemVvZihzdHJ1Y3QgYXUxMDAwX2V0aF9wbGF0Zm9ybV9kYXRhKSk7Ci0jZW5kaWYKK30KKworc3RhdGljIHZvaWQgX19pbml0IGFsY2hlbXlfc2V0dXBfbWFjcyhpbnQgY3R5cGUpCit7CisJaW50IHJldCwgaTsKKwl1bnNpZ25lZCBjaGFyIGV0aGFkZHJbNl07CisJc3RydWN0IHJlc291cmNlICptYWNyZXM7CisKKwkvKiBIYW5kbGUgMXN0IE1BQyAqLworCWlmIChhbGNoZW15X2dldF9tYWNzKGN0eXBlKSA8IDEpCisJCXJldHVybjsKKworCW1hY3JlcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkgKiBNQUNfUkVTX0NPVU5ULCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1hY3JlcykgeworCQlwcmludGsoS0VSTl9JTkZPICJBbGNoZW15OiBubyBtZW1vcnkgZm9yIE1BQzAgcmVzb3VyY2VzXG4iKTsKKwkJcmV0dXJuOworCX0KKwltZW1jcHkobWFjcmVzLCBhdTF4eHhfZXRoMF9yZXNvdXJjZXNbY3R5cGVdLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHJlc291cmNlKSAqIE1BQ19SRVNfQ09VTlQpOworCWF1MXh4eF9ldGgwX2RldmljZS5yZXNvdXJjZSA9IG1hY3JlczsKKworCWkgPSBwcm9tX2dldF9ldGhlcm5ldF9hZGRyKGV0aGFkZHIpOworCWlmICghaSAmJiAhaXNfdmFsaWRfZXRoZXJfYWRkcihhdTF4eHhfZXRoMF9wbGF0Zm9ybV9kYXRhLm1hYykpCisJCW1lbWNweShhdTF4eHhfZXRoMF9wbGF0Zm9ybV9kYXRhLm1hYywgZXRoYWRkciwgNik7CisKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF1MXh4eF9ldGgwX2RldmljZSk7CisJaWYgKCFyZXQpCisJCXByaW50ayhLRVJOX0lORk8gIkFsY2hlbXk6IGZhaWxlZCB0byByZWdpc3RlciBNQUMwXG4iKTsKKworCisJLyogSGFuZGxlIDJuZCBNQUMgKi8KKwlpZiAoYWxjaGVteV9nZXRfbWFjcyhjdHlwZSkgPCAyKQorCQlyZXR1cm47CisKKwltYWNyZXMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpICogTUFDX1JFU19DT1VOVCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtYWNyZXMpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQWxjaGVteTogbm8gbWVtb3J5IGZvciBNQUMxIHJlc291cmNlc1xuIik7CisJCXJldHVybjsKKwl9CisJbWVtY3B5KG1hY3JlcywgYXUxeHh4X2V0aDFfcmVzb3VyY2VzW2N0eXBlXSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkgKiBNQUNfUkVTX0NPVU5UKTsKKwlhdTF4eHhfZXRoMV9kZXZpY2UucmVzb3VyY2UgPSBtYWNyZXM7CisKKwlldGhhZGRyWzVdICs9IDE7CS8qIG5leHQgYWRkciBmb3IgMm5kIE1BQyAqLworCWlmICghaSAmJiAhaXNfdmFsaWRfZXRoZXJfYWRkcihhdTF4eHhfZXRoMV9wbGF0Zm9ybV9kYXRhLm1hYykpCisJCW1lbWNweShhdTF4eHhfZXRoMV9wbGF0Zm9ybV9kYXRhLm1hYywgZXRoYWRkciwgNik7CisKKwkvKiBSZWdpc3RlciBzZWNvbmQgTUFDIGlmIGVuYWJsZWQgaW4gcGluZnVuYyAqLworCWlmICghKGF1X3JlYWRsKFNZU19QSU5GVU5DKSAmICh1MzIpU1lTX1BGX05JMikpIHsKKwkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdTF4eHhfZXRoMV9kZXZpY2UpOworCQlpZiAocmV0KQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiQWxjaGVteTogZmFpbGVkIHRvIHJlZ2lzdGVyIE1BQzFcbiIpOworCX0KIH0KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmF1MXh4eF9wbGF0Zm9ybV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKLQkmYXUxeHgwX3VhcnRfZGV2aWNlLAogCSZhdTF4eHhfdXNiX29oY2lfZGV2aWNlLAogI2lmZGVmIENPTkZJR19GQl9BVTExMDAKIAkmYXUxMTAwX2xjZF9kZXZpY2UsCkBAIC00NjAsMzYgKzUzOSwxNyBAQAogI2lmZGVmIFNNQlVTX1BTQ19CQVNFCiAJJnBiZGJfc21idXNfZGV2aWNlLAogI2VuZGlmCi0JJmF1MXh4eF9ldGgwX2RldmljZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGF1MXh4eF9wbGF0Zm9ybV9pbml0KHZvaWQpCiB7Ci0JdW5zaWduZWQgaW50IHVhcnRjbGsgPSBnZXRfYXUxeDAwX3VhcnRfYmF1ZF9iYXNlKCkgKiAxNjsKLQlpbnQgZXJyLCBpOwotCXVuc2lnbmVkIGNoYXIgZXRoYWRkcls2XTsKKwlpbnQgZXJyLCBjdHlwZSA9IGFsY2hlbXlfZ2V0X2NwdXR5cGUoKTsKIAotCS8qIEZpbGwgdXAgdWFydGNsay4gKi8KLQlmb3IgKGkgPSAwOyBhdTF4MDBfdWFydF9kYXRhW2ldLmZsYWdzOyBpKyspCi0JCWF1MXgwMF91YXJ0X2RhdGFbaV0udWFydGNsayA9IHVhcnRjbGs7Ci0KLQkvKiB1c2UgZmlybXdhcmUtcHJvdmlkZWQgbWFjIGFkZHIgaWYgYXZhaWxhYmxlIGFuZCBuZWNlc3NhcnkgKi8KLQlpID0gcHJvbV9nZXRfZXRoZXJuZXRfYWRkcihldGhhZGRyKTsKLQlpZiAoIWkgJiYgIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYXUxeHh4X2V0aDBfcGxhdGZvcm1fZGF0YS5tYWMpKQotCQltZW1jcHkoYXUxeHh4X2V0aDBfcGxhdGZvcm1fZGF0YS5tYWMsIGV0aGFkZHIsIDYpOworCWFsY2hlbXlfc2V0dXBfdWFydHMoY3R5cGUpOworCWFsY2hlbXlfc2V0dXBfbWFjcyhjdHlwZSk7CiAKIAllcnIgPSBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhhdTF4eHhfcGxhdGZvcm1fZGV2aWNlcywKIAkJCQkgICBBUlJBWV9TSVpFKGF1MXh4eF9wbGF0Zm9ybV9kZXZpY2VzKSk7Ci0jaWZuZGVmIENPTkZJR19TT0NfQVUxMTAwCi0JZXRoYWRkcls1XSArPSAxOwkvKiBuZXh0IGFkZHIgZm9yIDJuZCBNQUMgKi8KLQlpZiAoIWkgJiYgIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYXUxeHh4X2V0aDFfcGxhdGZvcm1fZGF0YS5tYWMpKQotCQltZW1jcHkoYXUxeHh4X2V0aDFfcGxhdGZvcm1fZGF0YS5tYWMsIGV0aGFkZHIsIDYpOwotCi0JLyogUmVnaXN0ZXIgc2Vjb25kIE1BQyBpZiBlbmFibGVkIGluIHBpbmZ1bmMgKi8KLQlpZiAoIWVyciAmJiAhKGF1X3JlYWRsKFNZU19QSU5GVU5DKSAmICh1MzIpU1lTX1BGX05JMikpCi0JCWVyciA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXUxeHh4X2V0aDFfZGV2aWNlKTsKLSNlbmRpZgotCiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3NldHVwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vc2V0dXAuYwppbmRleCA1NjFlNWRhLi4xYjg4N2M4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vc2V0dXAuYworKysgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vc2V0dXAuYwpAQCAtNTIsOCArNTIsNiBAQAogCS8qIHRoaXMgaXMgZmFzdGVyIHRoYW4gd2FzdGluZyBjeWNsZXMgdHJ5aW5nIHRvIGFwcHJveGltYXRlIGl0ICovCiAJcHJlc2V0X2xwaiA9IChlc3RfZnJlcSA+PiAxKSAvIEhaOwogCi0JYm9hcmRfc2V0dXAoKTsgIC8qIGJvYXJkIHNwZWNpZmljIHNldHVwICovCi0KIAlpZiAoYXUxeHh4X2NwdV9uZWVkc19jb25maWdfb2QoKSkKIAkJLyogVmFyaW91cyBlYXJseSBBdTF4eDAgZXJyYXRhIGNvcnJlY3RlZCBieSB0aGlzICovCiAJCXNldF9jMF9jb25maWcoMSA8PCAxOSk7IC8qIFNldCBDb25maWdbT0RdICovCkBAIC02MSw2ICs1OSw4IEBACiAJCS8qIENsZWFyIHRvIG9idGFpbiBiZXN0IHN5c3RlbSBidXMgcGVyZm9ybWFuY2UgKi8KIAkJY2xlYXJfYzBfY29uZmlnKDEgPDwgMTkpOyAvKiBDbGVhciBDb25maWdbT0RdICovCiAKKwlib2FyZF9zZXR1cCgpOyAgLyogYm9hcmQgc3BlY2lmaWMgc2V0dXAgKi8KKwogCS8qIElPL01FTSByZXNvdXJjZXMuICovCiAJc2V0X2lvX3BvcnRfYmFzZSgwKTsKIAlpb3BvcnRfcmVzb3VyY2Uuc3RhcnQgPSBJT1BPUlRfUkVTT1VSQ0VfU1RBUlQ7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vdGltZS5jIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3RpbWUuYwppbmRleCAyYWVjYjJmLi5kNWRhNmFkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vdGltZS5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi90aW1lLmMKQEAgLTE0MSw4ICsxNDEsNyBAQAogCQlnb3RvIGNudHJfZXJyOwogCiAJLyogcmVnaXN0ZXIgY291bnRlcjEgY2xvY2tzb3VyY2UgYW5kIGV2ZW50IGRldmljZSAqLwotCWNsb2Nrc291cmNlX3NldF9jbG9jaygmYXUxeF9jb3VudGVyMV9jbG9ja3NvdXJjZSwgMzI3NjgpOwotCWNsb2Nrc291cmNlX3JlZ2lzdGVyKCZhdTF4X2NvdW50ZXIxX2Nsb2Nrc291cmNlKTsKKwljbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmYXUxeF9jb3VudGVyMV9jbG9ja3NvdXJjZSwgMzI3NjgpOwogCiAJY2QtPnNoaWZ0ID0gMzI7CiAJY2QtPm11bHQgPSBkaXZfc2MoMzI3NjgsIE5TRUNfUEVSX1NFQywgY2QtPnNoaWZ0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjEyMDAvc2V0dXAuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjEyMDAvc2V0dXAuYwppbmRleCA0YTg5ODAwLi4xZGFjNGYyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxMjAwL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMTIwMC9zZXR1cC5jCkBAIC0yMyw2ICsyMywxMyBAQAogCXVuc2lnbmVkIGxvbmcgZnJlcTAsIGNsa3NyYywgZGl2LCBwZmM7CiAJdW5zaWduZWQgc2hvcnQgd2hvYW1pOwogCisJLyogU2V0IENvbmZpZ1tPRF0gKGRpc2FibGUgb3ZlcmxhcHBpbmcgYnVzIHRyYW5zYWN0aW9uKToKKwkgKiBUaGlzIGdldHMgcmlkIG9mIGEgX2xvdF8gb2Ygc3B1cmlvdXMgaW50ZXJydXB0cyAoZXNwZWNpYWxseQorCSAqIHdydC4gSURFKTsgYnV0IGluY3VycyB+MTAlIHBlcmZvcm1hbmNlIGhpdCBpbiBzb21lCisJICogY3B1LWJvdW5kIGFwcGxpY2F0aW9ucy4KKwkgKi8KKwlzZXRfYzBfY29uZmlnKDEgPDwgMTkpOworCiAJYmNzcl9pbml0KERCMTIwMF9CQ1NSX1BIWVNfQUREUiwKIAkJICBEQjEyMDBfQkNTUl9QSFlTX0FERFIgKyBEQjEyMDBfQkNTUl9IRVhMRURfT0ZTKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTAwMC9ib2FyZF9zZXR1cC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTAwMC9ib2FyZF9zZXR1cC5jCmluZGV4IDJkODVjNGIuLmU2NGZkY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjEwMDAvYm9hcmRfc2V0dXAuYworKysgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxMDAwL2JvYXJkX3NldHVwLmMKQEAgLTY1LDcgKzY1LDcgQEAKIAogCS8qIFNldCBBVVggY2xvY2sgdG8gMTIgTUh6ICogOCA9IDk2IE1IeiAqLwogCWF1X3dyaXRlbCg4LCBTWVNfQVVYUExMKTsKLQlhdV93cml0ZWwoMCwgU1lTX1BJTlNUQVRFUkQpOworCWFsY2hlbXlfZ3BpbzFfaW5wdXRfZW5hYmxlKCk7CiAJdWRlbGF5KDEwMCk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRF9NT0RVTEUpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxNTAwL2JvYXJkX3NldHVwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxNTAwL2JvYXJkX3NldHVwLmMKaW5kZXggODNmNDYyMS4uM2I0ZmEzMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTUwMC9ib2FyZF9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjE1MDAvYm9hcmRfc2V0dXAuYwpAQCAtNTYsNyArNTYsNyBAQAogCXN5c19jbGtzcmMgPSBzeXNfZnJlcWN0cmwgPSBwaW5fZnVuYyA9IDA7CiAJLyogU2V0IEFVWCBjbG9jayB0byAxMiBNSHogKiA4ID0gOTYgTUh6ICovCiAJYXVfd3JpdGVsKDgsIFNZU19BVVhQTEwpOwotCWF1X3dyaXRlbCgwLCBTWVNfUElOU1RBVEVSRCk7CisJYWxjaGVteV9ncGlvMV9pbnB1dF9lbmFibGUoKTsKIAl1ZGVsYXkoMTAwKTsKIAogCS8qIEdQSU8yMDEgaXMgaW5wdXQgZm9yIFBDTUNJQSBjYXJkIGRldGVjdCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3Byb20uYyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wcm9tLmMKaW5kZXggYmFlYjIxMy4uZTUzMDZiNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3Byb20uYworKysgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcHJvbS5jCkBAIC02Miw1ICs2Miw1IEBACiAKIHZvaWQgcHJvbV9wdXRjaGFyKHVuc2lnbmVkIGNoYXIgYykKIHsKLSAgICBhbGNoZW15X3VhcnRfcHV0Y2hhcihVQVJUMF9QSFlTX0FERFIsIGMpOworCWFsY2hlbXlfdWFydF9wdXRjaGFyKEFVMTAwMF9VQVJUMF9QSFlTX0FERFIsIGMpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvZ3ByL2JvYXJkX3NldHVwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9ncHIvYm9hcmRfc2V0dXAuYwppbmRleCBhZDJlM2YxLi41ZjhmMDY5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9ncHIvYm9hcmRfc2V0dXAuYworKysgYi9hcmNoL21pcHMvYWxjaGVteS9ncHIvYm9hcmRfc2V0dXAuYwpAQCAtMzYsOSArMzYsNiBAQAogCiAjaW5jbHVkZSA8cHJvbS5oPgogCi0jZGVmaW5lIFVBUlQxX0FERFIJS1NFRzFBRERSKFVBUlQxX1BIWVNfQUREUikKLSNkZWZpbmUgVUFSVDNfQUREUglLU0VHMUFERFIoVUFSVDNfUEhZU19BRERSKQotCiBjaGFyIGlycV90YWJfYWxjaGVteVtdWzVdIF9faW5pdGRhdGEgPSB7CiAJWzBdID0geyAtMSwgQVUxNTAwX1BDSV9JTlRBLCBBVTE1MDBfUENJX0lOVEIsIDB4ZmYsIDB4ZmYgfSwKIH07CkBAIC02NywxOCArNjQsMTUgQEAKIAogdm9pZCBfX2luaXQgYm9hcmRfc2V0dXAodm9pZCkKIHsKLQlwcmludGsoS0VSTl9JTkZPICJUYXJwZXplIElUUyBHUFIgYm9hcmRcbiIpOworCXByaW50ayhLRVJOX0lORk8gIlRyYXBlemUgSVRTIEdQUiBib2FyZFxuIik7CiAKIAlwbV9wb3dlcl9vZmYgPSBncHJfcG93ZXJfb2ZmOwogCV9tYWNoaW5lX2hhbHQgPSBncHJfcG93ZXJfb2ZmOwogCV9tYWNoaW5lX3Jlc3RhcnQgPSBncHJfcmVzZXQ7CiAKLQkvKiBFbmFibGUgVUFSVDMgKi8KLQlhdV93cml0ZWwoMHgxLCBVQVJUM19BRERSICsgVUFSVF9NT0RfQ05UUkwpOy8qIGNsb2NrIGVuYWJsZSAoQ0UpICovCi0JYXVfd3JpdGVsKDB4MywgVUFSVDNfQUREUiArIFVBUlRfTU9EX0NOVFJMKTsgLyogQ0UgYW5kICJlbmFibGUiICovCi0JLyogRW5hYmxlIFVBUlQxICovCi0JYXVfd3JpdGVsKDB4MSwgVUFSVDFfQUREUiArIFVBUlRfTU9EX0NOVFJMKTsgLyogY2xvY2sgZW5hYmxlIChDRSkgKi8KLQlhdV93cml0ZWwoMHgzLCBVQVJUMV9BRERSICsgVUFSVF9NT0RfQ05UUkwpOyAvKiBDRSBhbmQgImVuYWJsZSIgKi8KKwkvKiBFbmFibGUgVUFSVDEvMyAqLworCWFsY2hlbXlfdWFydF9lbmFibGUoQVUxMDAwX1VBUlQzX1BIWVNfQUREUik7CisJYWxjaGVteV91YXJ0X2VuYWJsZShBVTEwMDBfVUFSVDFfUEhZU19BRERSKTsKIAogCS8qIFRha2UgYXdheSBSZXNldCBvZiBVTVRTLWNhcmQgKi8KIAlhbGNoZW15X2dwaW9fZGlyZWN0aW9uX291dHB1dCgyMTUsIDEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvZ3ByL2luaXQuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2dwci9pbml0LmMKaW5kZXggZjA0NGY0YzU0Li4yMjlhYWZhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9ncHIvaW5pdC5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2dwci9pbml0LmMKQEAgLTU5LDUgKzU5LDUgQEAKIAogdm9pZCBwcm9tX3B1dGNoYXIodW5zaWduZWQgY2hhciBjKQogewotCWFsY2hlbXlfdWFydF9wdXRjaGFyKFVBUlQwX1BIWVNfQUREUiwgYyk7CisJYWxjaGVteV91YXJ0X3B1dGNoYXIoQVUxMDAwX1VBUlQwX1BIWVNfQUREUiwgYyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9tdHgtMS9ib2FyZF9zZXR1cC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvbXR4LTEvYm9hcmRfc2V0dXAuYwppbmRleCBjZjQzNmFiLi4zYWU5ODRjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9tdHgtMS9ib2FyZF9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L210eC0xL2JvYXJkX3NldHVwLmMKQEAgLTg3LDcgKzg3LDcgQEAKIAlhdV93cml0ZWwoU1lTX1BGX05JMiwgU1lTX1BJTkZVTkMpOwogCiAJLyogSW5pdGlhbGl6ZSBHUElPICovCi0JYXVfd3JpdGVsKDB4RkZGRkZGRkYsIFNZU19UUklPVVRDTFIpOworCWF1X3dyaXRlbCh+MCwgS1NFRzFBRERSKEFVMTAwMF9TWVNfUEhZU19BRERSKSArIFNZU19UUklPVVRDTFIpOwogCWFsY2hlbXlfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KDAsIDApOwkvKiBEaXNhYmxlIE02NkVOIChQQ0kgNjZNSHopICovCiAJYWxjaGVteV9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoMywgMSk7CS8qIERpc2FibGUgUENJIENMS1JVTiMgKi8KIAlhbGNoZW15X2dwaW9fZGlyZWN0aW9uX291dHB1dCgxLCAxKTsJLyogRW5hYmxlIEVYVF9JTzMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L210eC0xL2luaXQuYyBiL2FyY2gvbWlwcy9hbGNoZW15L210eC0xL2luaXQuYwppbmRleCBmOGQyNTU3Li4yZTgxY2M3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9tdHgtMS9pbml0LmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvbXR4LTEvaW5pdC5jCkBAIC02Miw1ICs2Miw1IEBACiAKIHZvaWQgcHJvbV9wdXRjaGFyKHVuc2lnbmVkIGNoYXIgYykKIHsKLQlhbGNoZW15X3VhcnRfcHV0Y2hhcihVQVJUMF9QSFlTX0FERFIsIGMpOworCWFsY2hlbXlfdWFydF9wdXRjaGFyKEFVMTAwMF9VQVJUMF9QSFlTX0FERFIsIGMpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvbXR4LTEvcGxhdGZvcm0uYyBiL2FyY2gvbWlwcy9hbGNoZW15L210eC0xL3BsYXRmb3JtLmMKaW5kZXggOTU2Zjk0Ni4uNTU2MjhlMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvbXR4LTEvcGxhdGZvcm0uYworKysgYi9hcmNoL21pcHMvYWxjaGVteS9tdHgtMS9wbGF0Zm9ybS5jCkBAIC01Myw4ICs1Myw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXR4MV93ZHRfcmVzW10gPSB7CiAJWzBdID0gewotCQkuc3RhcnQJPSAxNSwKLQkJLmVuZAk9IDE1LAorCQkuc3RhcnQJPSAyMTUsCisJCS5lbmQJPSAyMTUsCiAJCS5uYW1lCT0gIm10eDEtd2R0LWdwaW8iLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKIAl9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS94eHMxNTAwL2JvYXJkX3NldHVwLmMgYi9hcmNoL21pcHMvYWxjaGVteS94eHMxNTAwL2JvYXJkX3NldHVwLmMKaW5kZXggZmViZmIwZmIuLjgxZTU3ZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L3h4czE1MDAvYm9hcmRfc2V0dXAuYworKysgYi9hcmNoL21pcHMvYWxjaGVteS94eHMxNTAwL2JvYXJkX3NldHVwLmMKQEAgLTY2LDEzICs2NiwxMCBAQAogCWF1X3dyaXRlbChwaW5fZnVuYywgU1lTX1BJTkZVTkMpOwogCiAJLyogRW5hYmxlIFVBUlQgKi8KLQlhdV93cml0ZWwoMHgwMSwgVUFSVDNfQUREUiArIFVBUlRfTU9EX0NOVFJMKTsgLyogY2xvY2sgZW5hYmxlIChDRSkgKi8KLQltZGVsYXkoMTApOwotCWF1X3dyaXRlbCgweDAzLCBVQVJUM19BRERSICsgVUFSVF9NT0RfQ05UUkwpOyAvKiBDRSBhbmQgImVuYWJsZSIgKi8KLQltZGVsYXkoMTApOwotCi0JLyogRW5hYmxlIERUUiA9IFVTQiBwb3dlciB1cCAqLwotCWF1X3dyaXRlbCgweDAxLCBVQVJUM19BRERSICsgVUFSVF9NQ1IpOyAvKiBVQVJUX01DUl9EVFIgaXMgMHgwMT8/PyAqLworCWFsY2hlbXlfdWFydF9lbmFibGUoQVUxMDAwX1VBUlQzX1BIWVNfQUREUik7CisJLyogRW5hYmxlIERUUiAoTUNSIGJpdCAwKSA9IFVTQiBwb3dlciB1cCAqLworCV9fcmF3X3dyaXRlbCgxLCAodm9pZCBfX2lvbWVtICopS1NFRzFBRERSKEFVMTAwMF9VQVJUM19QSFlTX0FERFIgKyAweDE4KSk7CisJd21iKCk7CiAKICNpZmRlZiBDT05GSUdfUENJCiAjaWYgZGVmaW5lZChfX01JUFNFQl9fKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkveHhzMTUwMC9pbml0LmMgYi9hcmNoL21pcHMvYWxjaGVteS94eHMxNTAwL2luaXQuYwppbmRleCAzNGE5MGE0Li4wZWUwMmNmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS94eHMxNTAwL2luaXQuYworKysgYi9hcmNoL21pcHMvYWxjaGVteS94eHMxNTAwL2luaXQuYwpAQCAtNTksNSArNTksNSBAQAogCiB2b2lkIHByb21fcHV0Y2hhcih1bnNpZ25lZCBjaGFyIGMpCiB7Ci0JYWxjaGVteV91YXJ0X3B1dGNoYXIoVUFSVDBfUEhZU19BRERSLCBjKTsKKwlhbGNoZW15X3VhcnRfcHV0Y2hhcihBVTEwMDBfVUFSVDBfUEhZU19BRERSLCBjKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9iY200N3h4L252cmFtLmMgYi9hcmNoL21pcHMvYmNtNDd4eC9udnJhbS5jCmluZGV4IGU1YjY2MTUuLjU0ZGI4MTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9iY200N3h4L252cmFtLmMKKysrIGIvYXJjaC9taXBzL2JjbTQ3eHgvbnZyYW0uYwpAQCAtMyw2ICszLDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDUgQnJvYWRjb20gQ29ycG9yYXRpb24KICAqIENvcHlyaWdodCAoQykgMjAwNiBGZWxpeCBGaWV0a2F1IDxuYmRAb3BlbndydC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBIYXVrZSBNZWhydGVucyA8aGF1a2VAaGF1a2UtbS5kZT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQpAQCAtMjMsNyArMjQsNyBAQAogc3RhdGljIGNoYXIgbnZyYW1fYnVmW05WUkFNX1NQQUNFXTsKIAogLyogUHJvYmUgZm9yIE5WUkFNIGhlYWRlciAqLwotc3RhdGljIHZvaWQgX19pbml0IGVhcmx5X252cmFtX2luaXQodm9pZCkKK3N0YXRpYyB2b2lkIGVhcmx5X252cmFtX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3Qgc3NiX21pcHNjb3JlICptY29yZSA9ICZzc2JfYmNtNDd4eC5taXBzY29yZTsKIAlzdHJ1Y3QgbnZyYW1faGVhZGVyICpoZWFkZXI7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYmNtNDd4eC9zZXR1cC5jIGIvYXJjaC9taXBzL2JjbTQ3eHgvc2V0dXAuYwppbmRleCBjOTVmOTBiLi43M2I1MjliIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYmNtNDd4eC9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9iY200N3h4L3NldHVwLmMKQEAgLTMsNiArMyw3IEBACiAgKiAgQ29weXJpZ2h0IChDKSAyMDA2IEZlbGl4IEZpZXRrYXUgPG5iZEBvcGVud3J0Lm9yZz4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDYgTWljaGFlbCBCdWVzY2ggPG1iQGJ1M3NjaC5kZT4KICAqICBDb3B5cmlnaHQgKEMpIDIwMTAgV2FsZGVtYXIgQnJvZGtvcmIgPHdieEBvcGVuYWRrLm9yZz4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBIYXVrZSBNZWhydGVucyA8aGF1a2VAaGF1a2UtbS5kZT4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCkBAIC01NywxMCArNTgsNDkgQEAKIH0KIAogI2RlZmluZSBSRUFEX0ZST01fTlZSQU0oX291dHZhciwgbmFtZSwgYnVmKSBcCi0JaWYgKG52cmFtX2dldGVudihuYW1lLCBidWYsIHNpemVvZihidWYpKSA+PSAwKVwKKwlpZiAobnZyYW1fZ2V0cHJlZml4KHByZWZpeCwgbmFtZSwgYnVmLCBzaXplb2YoYnVmKSkgPj0gMClcCiAJCXNwcm9tLT5fb3V0dmFyID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAwKTsKIAotc3RhdGljIHZvaWQgYmNtNDd4eF9maWxsX3Nwcm9tKHN0cnVjdCBzc2Jfc3Byb20gKnNwcm9tKQorI2RlZmluZSBSRUFEX0ZST01fTlZSQU0yKF9vdXR2YXIsIG5hbWUxLCBuYW1lMiwgYnVmKSBcCisJaWYgKG52cmFtX2dldHByZWZpeChwcmVmaXgsIG5hbWUxLCBidWYsIHNpemVvZihidWYpKSA+PSAwIHx8IFwKKwkgICAgbnZyYW1fZ2V0cHJlZml4KHByZWZpeCwgbmFtZTIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpID49IDApXAorCQlzcHJvbS0+X291dHZhciA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IG52cmFtX2dldHByZWZpeChjb25zdCBjaGFyICpwcmVmaXgsIGNoYXIgKm5hbWUsCisJCQkJICBjaGFyICpidWYsIGludCBsZW4pCit7CisJaWYgKHByZWZpeCkgeworCQljaGFyIGtleVsxMDBdOworCisJCXNucHJpbnRmKGtleSwgc2l6ZW9mKGtleSksICIlcyVzIiwgcHJlZml4LCBuYW1lKTsKKwkJcmV0dXJuIG52cmFtX2dldGVudihrZXksIGJ1ZiwgbGVuKTsKKwl9CisKKwlyZXR1cm4gbnZyYW1fZ2V0ZW52KG5hbWUsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIHUzMiBudnJhbV9nZXR1MzIoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCWludCBydjsKKwljaGFyIGtleVsxMDBdOworCXUxNiB2YXIwLCB2YXIxOworCisJc25wcmludGYoa2V5LCBzaXplb2Yoa2V5KSwgIiVzMCIsIG5hbWUpOworCXJ2ID0gbnZyYW1fZ2V0ZW52KGtleSwgYnVmLCBsZW4pOworCS8qIHJldHVybiAwIGhlcmUgc28gdGhpcyBsb29rcyBsaWtlIHVuc2V0ICovCisJaWYgKHJ2IDwgMCkKKwkJcmV0dXJuIDA7CisJdmFyMCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CisKKwlzbnByaW50ZihrZXksIHNpemVvZihrZXkpLCAiJXMxIiwgbmFtZSk7CisJcnYgPSBudnJhbV9nZXRlbnYoa2V5LCBidWYsIGxlbik7CisJaWYgKHJ2IDwgMCkKKwkJcmV0dXJuIDA7CisJdmFyMSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CisJcmV0dXJuIHZhcjEgPDwgMTYgfCB2YXIwOworfQorCitzdGF0aWMgdm9pZCBiY200N3h4X2ZpbGxfc3Byb20oc3RydWN0IHNzYl9zcHJvbSAqc3Byb20sIGNvbnN0IGNoYXIgKnByZWZpeCkKIHsKIAljaGFyIGJ1ZlsxMDBdOwogCXUzMiBib2FyZGZsYWdzOwpAQCAtNjksMTEgKzEwOSwxMiBAQAogCiAJc3Byb20tPnJldmlzaW9uID0gMTsgLyogRmFsbGJhY2s6IE9sZCBoYXJkd2FyZSBkb2VzIG5vdCBkZWZpbmUgdGhpcy4gKi8KIAlSRUFEX0ZST01fTlZSQU0ocmV2aXNpb24sICJzcm9tcmV2IiwgYnVmKTsKLQlpZiAobnZyYW1fZ2V0ZW52KCJpbDBtYWNhZGRyIiwgYnVmLCBzaXplb2YoYnVmKSkgPj0gMCkKKwlpZiAobnZyYW1fZ2V0cHJlZml4KHByZWZpeCwgImlsMG1hY2FkZHIiLCBidWYsIHNpemVvZihidWYpKSA+PSAwIHx8CisJICAgIG52cmFtX2dldHByZWZpeChwcmVmaXgsICJtYWNhZGRyIiwgYnVmLCBzaXplb2YoYnVmKSkgPj0gMCkKIAkJbnZyYW1fcGFyc2VfbWFjYWRkcihidWYsIHNwcm9tLT5pbDBtYWMpOwotCWlmIChudnJhbV9nZXRlbnYoImV0MG1hY2FkZHIiLCBidWYsIHNpemVvZihidWYpKSA+PSAwKQorCWlmIChudnJhbV9nZXRwcmVmaXgocHJlZml4LCAiZXQwbWFjYWRkciIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpID49IDApCiAJCW52cmFtX3BhcnNlX21hY2FkZHIoYnVmLCBzcHJvbS0+ZXQwbWFjKTsKLQlpZiAobnZyYW1fZ2V0ZW52KCJldDFtYWNhZGRyIiwgYnVmLCBzaXplb2YoYnVmKSkgPj0gMCkKKwlpZiAobnZyYW1fZ2V0cHJlZml4KHByZWZpeCwgImV0MW1hY2FkZHIiLCBidWYsIHNpemVvZihidWYpKSA+PSAwKQogCQludnJhbV9wYXJzZV9tYWNhZGRyKGJ1Ziwgc3Byb20tPmV0MW1hYyk7CiAJUkVBRF9GUk9NX05WUkFNKGV0MHBoeWFkZHIsICJldDBwaHlhZGRyIiwgYnVmKTsKIAlSRUFEX0ZST01fTlZSQU0oZXQxcGh5YWRkciwgImV0MXBoeWFkZHIiLCBidWYpOwpAQCAtOTUsMjAgKzEzNiwzNiBAQAogCVJFQURfRlJPTV9OVlJBTShwYTFoaWIwLCAicGExaGliMCIsIGJ1Zik7CiAJUkVBRF9GUk9NX05WUkFNKHBhMWhpYjIsICJwYTFoaWIxIiwgYnVmKTsKIAlSRUFEX0ZST01fTlZSQU0ocGExaGliMSwgInBhMWhpYjIiLCBidWYpOwotCVJFQURfRlJPTV9OVlJBTShncGlvMCwgIndsMGdwaW8wIiwgYnVmKTsKLQlSRUFEX0ZST01fTlZSQU0oZ3BpbzEsICJ3bDBncGlvMSIsIGJ1Zik7Ci0JUkVBRF9GUk9NX05WUkFNKGdwaW8yLCAid2wwZ3BpbzIiLCBidWYpOwotCVJFQURfRlJPTV9OVlJBTShncGlvMywgIndsMGdwaW8zIiwgYnVmKTsKLQlSRUFEX0ZST01fTlZSQU0obWF4cHdyX2JnLCAicGEwbWF4cHdyIiwgYnVmKTsKLQlSRUFEX0ZST01fTlZSQU0obWF4cHdyX2FsLCAicGExbG9tYXhwd3IiLCBidWYpOwotCVJFQURfRlJPTV9OVlJBTShtYXhwd3JfYSwgInBhMW1heHB3ciIsIGJ1Zik7Ci0JUkVBRF9GUk9NX05WUkFNKG1heHB3cl9haCwgInBhMWhpbWF4cHdyIiwgYnVmKTsKLQlSRUFEX0ZST01fTlZSQU0oaXRzc2lfYSwgInBhMWl0c3NpdCIsIGJ1Zik7Ci0JUkVBRF9GUk9NX05WUkFNKGl0c3NpX2JnLCAicGEwaXRzc2l0IiwgYnVmKTsKKwlSRUFEX0ZST01fTlZSQU0yKGdwaW8wLCAibGVkYmgwIiwgIndsMGdwaW8wIiwgYnVmKTsKKwlSRUFEX0ZST01fTlZSQU0yKGdwaW8xLCAibGVkYmgxIiwgIndsMGdwaW8xIiwgYnVmKTsKKwlSRUFEX0ZST01fTlZSQU0yKGdwaW8yLCAibGVkYmgyIiwgIndsMGdwaW8yIiwgYnVmKTsKKwlSRUFEX0ZST01fTlZSQU0yKGdwaW8zLCAibGVkYmgzIiwgIndsMGdwaW8zIiwgYnVmKTsKKwlSRUFEX0ZST01fTlZSQU0yKG1heHB3cl9iZywgIm1heHAyZ2EwIiwgInBhMG1heHB3ciIsIGJ1Zik7CisJUkVBRF9GUk9NX05WUkFNMihtYXhwd3JfYWwsICJtYXhwNWdsYTAiLCAicGExbG9tYXhwd3IiLCBidWYpOworCVJFQURfRlJPTV9OVlJBTTIobWF4cHdyX2EsICJtYXhwNWdhMCIsICJwYTFtYXhwd3IiLCBidWYpOworCVJFQURfRlJPTV9OVlJBTTIobWF4cHdyX2FoLCAibWF4cDVnaGEwIiwgInBhMWhpbWF4cHdyIiwgYnVmKTsKKwlSRUFEX0ZST01fTlZSQU0yKGl0c3NpX2JnLCAiaXR0NWdhMCIsICJwYTBpdHNzaXQiLCBidWYpOworCVJFQURfRlJPTV9OVlJBTTIoaXRzc2lfYSwgIml0dDJnYTAiLCAicGExaXRzc2l0IiwgYnVmKTsKIAlSRUFEX0ZST01fTlZSQU0odHJpMmcsICJ0cmkyZyIsIGJ1Zik7CiAJUkVBRF9GUk9NX05WUkFNKHRyaTVnbCwgInRyaTVnbCIsIGJ1Zik7CiAJUkVBRF9GUk9NX05WUkFNKHRyaTVnLCAidHJpNWciLCBidWYpOwogCVJFQURfRlJPTV9OVlJBTSh0cmk1Z2gsICJ0cmk1Z2giLCBidWYpOworCVJFQURfRlJPTV9OVlJBTSh0eHBpZDJnWzBdLCAidHhwaWQyZ2EwIiwgYnVmKTsKKwlSRUFEX0ZST01fTlZSQU0odHhwaWQyZ1sxXSwgInR4cGlkMmdhMSIsIGJ1Zik7CisJUkVBRF9GUk9NX05WUkFNKHR4cGlkMmdbMl0sICJ0eHBpZDJnYTIiLCBidWYpOworCVJFQURfRlJPTV9OVlJBTSh0eHBpZDJnWzNdLCAidHhwaWQyZ2EzIiwgYnVmKTsKKwlSRUFEX0ZST01fTlZSQU0odHhwaWQ1Z1swXSwgInR4cGlkNWdhMCIsIGJ1Zik7CisJUkVBRF9GUk9NX05WUkFNKHR4cGlkNWdbMV0sICJ0eHBpZDVnYTEiLCBidWYpOworCVJFQURfRlJPTV9OVlJBTSh0eHBpZDVnWzJdLCAidHhwaWQ1Z2EyIiwgYnVmKTsKKwlSRUFEX0ZST01fTlZSQU0odHhwaWQ1Z1szXSwgInR4cGlkNWdhMyIsIGJ1Zik7CisJUkVBRF9GUk9NX05WUkFNKHR4cGlkNWdsWzBdLCAidHhwaWQ1Z2xhMCIsIGJ1Zik7CisJUkVBRF9GUk9NX05WUkFNKHR4cGlkNWdsWzFdLCAidHhwaWQ1Z2xhMSIsIGJ1Zik7CisJUkVBRF9GUk9NX05WUkFNKHR4cGlkNWdsWzJdLCAidHhwaWQ1Z2xhMiIsIGJ1Zik7CisJUkVBRF9GUk9NX05WUkFNKHR4cGlkNWdsWzNdLCAidHhwaWQ1Z2xhMyIsIGJ1Zik7CisJUkVBRF9GUk9NX05WUkFNKHR4cGlkNWdoWzBdLCAidHhwaWQ1Z2hhMCIsIGJ1Zik7CisJUkVBRF9GUk9NX05WUkFNKHR4cGlkNWdoWzFdLCAidHhwaWQ1Z2hhMSIsIGJ1Zik7CisJUkVBRF9GUk9NX05WUkFNKHR4cGlkNWdoWzJdLCAidHhwaWQ1Z2hhMiIsIGJ1Zik7CisJUkVBRF9GUk9NX05WUkFNKHR4cGlkNWdoWzNdLCAidHhwaWQ1Z2hhMyIsIGJ1Zik7CiAJUkVBRF9GUk9NX05WUkFNKHJ4cG8yZywgInJ4cG8yZyIsIGJ1Zik7CiAJUkVBRF9GUk9NX05WUkFNKHJ4cG81ZywgInJ4cG81ZyIsIGJ1Zik7CiAJUkVBRF9GUk9NX05WUkFNKHJzc2lzYXYyZywgInJzc2lzYXYyZyIsIGJ1Zik7CkBAIC0xMjAsMTkgKzE3NywyNyBAQAogCVJFQURfRlJPTV9OVlJBTShyc3Npc21mNWcsICJyc3Npc21mNWciLCBidWYpOwogCVJFQURfRlJPTV9OVlJBTShieGE1ZywgImJ4YTVnIiwgYnVmKTsKIAlSRUFEX0ZST01fTlZSQU0oY2NrMmdwbywgImNjazJncG8iLCBidWYpOwotCVJFQURfRlJPTV9OVlJBTShvZmRtMmdwbywgIm9mZG0yZ3BvIiwgYnVmKTsKLQlSRUFEX0ZST01fTlZSQU0ob2ZkbTVnbHBvLCAib2ZkbTVnbHBvIiwgYnVmKTsKLQlSRUFEX0ZST01fTlZSQU0ob2ZkbTVncG8sICJvZmRtNWdwbyIsIGJ1Zik7Ci0JUkVBRF9GUk9NX05WUkFNKG9mZG01Z2hwbywgIm9mZG01Z2hwbyIsIGJ1Zik7CiAKLQlpZiAobnZyYW1fZ2V0ZW52KCJib2FyZGZsYWdzIiwgYnVmLCBzaXplb2YoYnVmKSkgPj0gMCkgeworCXNwcm9tLT5vZmRtMmdwbyA9IG52cmFtX2dldHUzMigib2ZkbTJncG8iLCBidWYsIHNpemVvZihidWYpKTsKKwlzcHJvbS0+b2ZkbTVnbHBvID0gbnZyYW1fZ2V0dTMyKCJvZmRtNWdscG8iLCBidWYsIHNpemVvZihidWYpKTsKKwlzcHJvbS0+b2ZkbTVncG8gPSBudnJhbV9nZXR1MzIoIm9mZG01Z3BvIiwgYnVmLCBzaXplb2YoYnVmKSk7CisJc3Byb20tPm9mZG01Z2hwbyA9IG52cmFtX2dldHUzMigib2ZkbTVnaHBvIiwgYnVmLCBzaXplb2YoYnVmKSk7CisKKwlSRUFEX0ZST01fTlZSQU0oYW50ZW5uYV9nYWluLmdoejI0LmEwLCAiYWcwIiwgYnVmKTsKKwlSRUFEX0ZST01fTlZSQU0oYW50ZW5uYV9nYWluLmdoejI0LmExLCAiYWcxIiwgYnVmKTsKKwlSRUFEX0ZST01fTlZSQU0oYW50ZW5uYV9nYWluLmdoejI0LmEyLCAiYWcyIiwgYnVmKTsKKwlSRUFEX0ZST01fTlZSQU0oYW50ZW5uYV9nYWluLmdoejI0LmEzLCAiYWczIiwgYnVmKTsKKwltZW1jcHkoJnNwcm9tLT5hbnRlbm5hX2dhaW4uZ2h6NSwgJnNwcm9tLT5hbnRlbm5hX2dhaW4uZ2h6MjQsCisJICAgICAgIHNpemVvZihzcHJvbS0+YW50ZW5uYV9nYWluLmdoejUpKTsKKworCWlmIChudnJhbV9nZXRwcmVmaXgocHJlZml4LCAiYm9hcmRmbGFncyIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpID49IDApIHsKIAkJYm9hcmRmbGFncyA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CiAJCWlmIChib2FyZGZsYWdzKSB7CiAJCQlzcHJvbS0+Ym9hcmRmbGFnc19sbyA9IChib2FyZGZsYWdzICYgMHgwMDAwRkZGRlUpOwogCQkJc3Byb20tPmJvYXJkZmxhZ3NfaGkgPSAoYm9hcmRmbGFncyAmIDB4RkZGRjAwMDBVKSA+PiAxNjsKIAkJfQogCX0KLQlpZiAobnZyYW1fZ2V0ZW52KCJib2FyZGZsYWdzMiIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpID49IDApIHsKKwlpZiAobnZyYW1fZ2V0cHJlZml4KHByZWZpeCwgImJvYXJkZmxhZ3MyIiwgYnVmLCBzaXplb2YoYnVmKSkgPj0gMCkgewogCQlib2FyZGZsYWdzID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAwKTsKIAkJaWYgKGJvYXJkZmxhZ3MpIHsKIAkJCXNwcm9tLT5ib2FyZGZsYWdzMl9sbyA9IChib2FyZGZsYWdzICYgMHgwMDAwRkZGRlUpOwpAQCAtMTQxLDYgKzIwNiwyMiBAQAogCX0KIH0KIAoraW50IGJjbTQ3eHhfZ2V0X3Nwcm9tKHN0cnVjdCBzc2JfYnVzICpidXMsIHN0cnVjdCBzc2Jfc3Byb20gKm91dCkKK3sKKwljaGFyIHByZWZpeFsxMF07CisKKwlpZiAoYnVzLT5idXN0eXBlID09IFNTQl9CVVNUWVBFX1BDSSkgeworCQlzbnByaW50ZihwcmVmaXgsIHNpemVvZihwcmVmaXgpLCAicGNpLyV1LyV1LyIsCisJCQkgYnVzLT5ob3N0X3BjaS0+YnVzLT5udW1iZXIgKyAxLAorCQkJIFBDSV9TTE9UKGJ1cy0+aG9zdF9wY2ktPmRldmZuKSk7CisJCWJjbTQ3eHhfZmlsbF9zcHJvbShvdXQsIHByZWZpeCk7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImJjbTQ3eHg6IHVuYWJsZSB0byBmaWxsIFNQUk9NIGZvciBnaXZlbiBidXN0eXBlLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKwogc3RhdGljIGludCBiY200N3h4X2dldF9pbnZhcmlhbnRzKHN0cnVjdCBzc2JfYnVzICpidXMsCiAJCQkJICAgc3RydWN0IHNzYl9pbml0X2ludmFyaWFudHMgKml2KQogewpAQCAtMTU4LDcgKzIzOSw3IEBACiAJaWYgKG52cmFtX2dldGVudigiYm9hcmRyZXYiLCBidWYsIHNpemVvZihidWYpKSA+PSAwKQogCQlpdi0+Ym9hcmRpbmZvLnJldiA9ICh1MTYpc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAwKTsKIAotCWJjbTQ3eHhfZmlsbF9zcHJvbSgmaXYtPnNwcm9tKTsKKwliY200N3h4X2ZpbGxfc3Byb20oJml2LT5zcHJvbSwgTlVMTCk7CiAKIAlpZiAobnZyYW1fZ2V0ZW52KCJjYXJkYnVzIiwgYnVmLCBzaXplb2YoYnVmKSkgPj0gMCkKIAkJaXYtPmhhc19jYXJkYnVzX3Nsb3QgPSAhIXNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwpAQCAtMTcyLDYgKzI1MywxMSBAQAogCWNoYXIgYnVmWzEwMF07CiAJc3RydWN0IHNzYl9taXBzY29yZSAqbWNvcmU7CiAKKwllcnIgPSBzc2JfYXJjaF9yZWdpc3Rlcl9mYWxsYmFja19zcHJvbSgmYmNtNDd4eF9nZXRfc3Byb20pOworCWlmIChlcnIpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImJjbTQ3eHg6IHNvbWVvbmUgZWxzZSBhbHJlYWR5IHJlZ2lzdGVyZWQiCisJCQkiIGEgc3NiIFNQUk9NIGNhbGxiYWNrIGhhbmRsZXIgKGVyciAlZClcbiIsIGVycik7CisKIAllcnIgPSBzc2JfYnVzX3NzYmJ1c19yZWdpc3Rlcigmc3NiX2JjbTQ3eHgsIFNTQl9FTlVNX0JBU0UsCiAJCQkJICAgICAgYmNtNDd4eF9nZXRfaW52YXJpYW50cyk7CiAJaWYgKGVycikKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9iY202M3h4L2JvYXJkcy9ib2FyZF9iY205NjN4eC5jIGIvYXJjaC9taXBzL2JjbTYzeHgvYm9hcmRzL2JvYXJkX2JjbTk2M3h4LmMKaW5kZXggOGRiYThjZi4uNDBiMjIzYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2JjbTYzeHgvYm9hcmRzL2JvYXJkX2JjbTk2M3h4LmMKKysrIGIvYXJjaC9taXBzL2JjbTYzeHgvYm9hcmRzL2JvYXJkX2JjbTk2M3h4LmMKQEAgLTY0Myw2ICs2NDMsMTcgQEAKIAkuYm9hcmRmbGFnc19sbwkJPSAweDI4NDgsCiAJLmJvYXJkZmxhZ3NfaGkJCT0gMHgwMDAwLAogfTsKKworaW50IGJjbTYzeHhfZ2V0X2ZhbGxiYWNrX3Nwcm9tKHN0cnVjdCBzc2JfYnVzICpidXMsIHN0cnVjdCBzc2Jfc3Byb20gKm91dCkKK3sKKwlpZiAoYnVzLT5idXN0eXBlID09IFNTQl9CVVNUWVBFX1BDSSkgeworCQltZW1jcHkob3V0LCAmYmNtNjN4eF9zcHJvbSwgc2l6ZW9mKHN0cnVjdCBzc2Jfc3Byb20pKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIGZpbGwgU1BST00gZm9yIGdpdmVuIGJ1c3R5cGUuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQogI2VuZGlmCiAKIC8qCkBAIC03OTMsOCArODA0LDkgQEAKIAlpZiAoIWJvYXJkX2dldF9tYWNfYWRkcmVzcyhiY202M3h4X3Nwcm9tLmlsMG1hYykpIHsKIAkJbWVtY3B5KGJjbTYzeHhfc3Byb20uZXQwbWFjLCBiY202M3h4X3Nwcm9tLmlsMG1hYywgRVRIX0FMRU4pOwogCQltZW1jcHkoYmNtNjN4eF9zcHJvbS5ldDFtYWMsIGJjbTYzeHhfc3Byb20uaWwwbWFjLCBFVEhfQUxFTik7Ci0JCWlmIChzc2JfYXJjaF9zZXRfZmFsbGJhY2tfc3Byb20oJmJjbTYzeHhfc3Byb20pIDwgMCkKLQkJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIHJlZ2lzdGVyIGZhbGxiYWNrIFNQUk9NXG4iKTsKKwkJaWYgKHNzYl9hcmNoX3JlZ2lzdGVyX2ZhbGxiYWNrX3Nwcm9tKAorCQkJCSZiY202M3h4X2dldF9mYWxsYmFja19zcHJvbSkgPCAwKQorCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGZhbGxiYWNrIFNQUk9NXG4iKTsKIAl9CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9ib290L2NvbXByZXNzZWQvdWFydC1hbGNoZW15LmMgYi9hcmNoL21pcHMvYm9vdC9jb21wcmVzc2VkL3VhcnQtYWxjaGVteS5jCmluZGV4IDFiZmYyMmYuLmViMDYzZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9ib290L2NvbXByZXNzZWQvdWFydC1hbGNoZW15LmMKKysrIGIvYXJjaC9taXBzL2Jvb3QvY29tcHJlc3NlZC91YXJ0LWFsY2hlbXkuYwpAQCAtMyw1ICszLDUgQEAKIHZvaWQgcHV0YyhjaGFyIGMpCiB7CiAJLyogYWxsIGN1cnJlbnQgKEphbi4gMjAxMCkgaW4ta2VybmVsIGJvYXJkcyAqLwotCWFsY2hlbXlfdWFydF9wdXRjaGFyKFVBUlQwX1BIWVNfQUREUiwgYyk7CisJYWxjaGVteV91YXJ0X3B1dGNoYXIoQVUxMDAwX1VBUlQwX1BIWVNfQUREUiwgYyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9jc3JjLW9jdGVvbi5jIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vY3NyYy1vY3Rlb24uYwppbmRleCAyNmJmNzExLi4yOWQ1NmFmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9jc3JjLW9jdGVvbi5jCisrKyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2NzcmMtb2N0ZW9uLmMKQEAgLTEwNSw4ICsxMDUsNyBAQAogdm9pZCBfX2luaXQgcGxhdF90aW1lX2luaXQodm9pZCkKIHsKIAljbG9ja3NvdXJjZV9taXBzLnJhdGluZyA9IDMwMDsKLQljbG9ja3NvdXJjZV9zZXRfY2xvY2soJmNsb2Nrc291cmNlX21pcHMsIG9jdGVvbl9nZXRfY2xvY2tfcmF0ZSgpKTsKLQljbG9ja3NvdXJjZV9yZWdpc3RlcigmY2xvY2tzb3VyY2VfbWlwcyk7CisJY2xvY2tzb3VyY2VfcmVnaXN0ZXJfaHooJmNsb2Nrc291cmNlX21pcHMsIG9jdGVvbl9nZXRfY2xvY2tfcmF0ZSgpKTsKIH0KIAogc3RhdGljIHU2NCBvY3Rlb25fdWRlbGF5X2ZhY3RvcjsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL3NldHVwLmMgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9zZXR1cC5jCmluZGV4IDA3MDdmYWUuLjJkOTAyOGYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vc2V0dXAuYwpAQCAtMjg4LDcgKzI4OCw2IEBACiAJdW5pb24gb2N0ZW9uX2N2bWVtY3RsIGN2bW1lbWN0bDsKIAl1bmlvbiBjdm14X2lvYl9mYXVfdGltZW91dCBmYXVfdGltZW91dDsKIAl1bmlvbiBjdm14X3Bvd19ud190aW0gbm1fdGltOwotCXVpbnQ2NF90IGN2bWN0bDsKIAogCS8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyBmb3IgQ1AwX0NWTU1FTUNUTF9SRUcgKi8KIAljdm1tZW1jdGwudTY0ID0gcmVhZF9jMF9jdm1tZW1jdGwoKTsKQEAgLTM5MiwxMiArMzkxLDYgQEAKIAkJCSAgQ09ORklHX0NBVklVTV9PQ1RFT05fQ1ZNU0VHX1NJWkUsCiAJCQkgIENPTkZJR19DQVZJVU1fT0NURU9OX0NWTVNFR19TSVpFICogMTI4KTsKIAotCS8qIE1vdmUgdGhlIHBlcmZvcm1hbmNlIGNvdW50ZXIgaW50ZXJydXB0cyB0byBJUlEgNiAqLwotCWN2bWN0bCA9IHJlYWRfYzBfY3ZtY3RsKCk7Ci0JY3ZtY3RsICY9IH4oNyA8PCA3KTsKLQljdm1jdGwgfD0gNiA8PCA3OwotCXdyaXRlX2MwX2N2bWN0bChjdm1jdGwpOwotCiAJLyogU2V0IGEgZGVmYXVsdCBmb3IgdGhlIGhhcmR3YXJlIHRpbWVvdXRzICovCiAJZmF1X3RpbWVvdXQudTY0ID0gMDsKIAlmYXVfdGltZW91dC5zLnRvdXRfdmFsID0gMHhmZmY7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9zbXAuYyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL3NtcC5jCmluZGV4IGJhNzhiMjEuLjhiNjA2NDIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL3NtcC5jCisrKyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL3NtcC5jCkBAIC0zNywxMyArMzcsMTUgQEAKIAl1aW50NjRfdCBhY3Rpb247CiAKIAkvKiBMb2FkIHRoZSBtYWlsYm94IHJlZ2lzdGVyIHRvIGZpZ3VyZSBvdXQgd2hhdCB3ZSdyZSBzdXBwb3NlZCB0byBkbyAqLwotCWFjdGlvbiA9IGN2bXhfcmVhZF9jc3IoQ1ZNWF9DSVVfTUJPWF9DTFJYKGNvcmVpZCkpOworCWFjdGlvbiA9IGN2bXhfcmVhZF9jc3IoQ1ZNWF9DSVVfTUJPWF9DTFJYKGNvcmVpZCkpICYgMHhmZmZmOwogCiAJLyogQ2xlYXIgdGhlIG1haWxib3ggdG8gY2xlYXIgdGhlIGludGVycnVwdCAqLwogCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX01CT1hfQ0xSWChjb3JlaWQpLCBhY3Rpb24pOwogCiAJaWYgKGFjdGlvbiAmIFNNUF9DQUxMX0ZVTkNUSU9OKQogCQlzbXBfY2FsbF9mdW5jdGlvbl9pbnRlcnJ1cHQoKTsKKwlpZiAoYWN0aW9uICYgU01QX1JFU0NIRURVTEVfWU9VUlNFTEYpCisJCXNjaGVkdWxlcl9pcGkoKTsKIAogCS8qIENoZWNrIGlmIHdlJ3ZlIGJlZW4gdG9sZCB0byBmbHVzaCB0aGUgaWNhY2hlICovCiAJaWYgKGFjdGlvbiAmIFNNUF9JQ0FDSEVfRkxVU0gpCkBAIC0yMDAsMTYgKzIwMiwxNSBAQAogCWlmIChsYWJpLT5sYWJpX3NpZ25hdHVyZSAhPSBMQUJJX1NJR05BVFVSRSkKIAkJcGFuaWMoIlRoZSBib290bG9hZGVyIHZlcnNpb24gb24gdGhpcyBib2FyZCBpcyBpbmNvcnJlY3QuIik7CiAjZW5kaWYKLQotCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX01CT1hfQ0xSWChjdm14X2dldF9jb3JlX251bSgpKSwgMHhmZmZmZmZmZik7CisJLyoKKwkgKiBPbmx5IHRoZSBsb3cgb3JkZXIgbWFpbGJveCBiaXRzIGFyZSB1c2VkIGZvciBJUElzLCBsZWF2ZQorCSAqIHRoZSBvdGhlciBiaXRzIGFsb25lLgorCSAqLworCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX01CT1hfQ0xSWChjdm14X2dldF9jb3JlX251bSgpKSwgMHhmZmZmKTsKIAlpZiAocmVxdWVzdF9pcnEoT0NURU9OX0lSUV9NQk9YMCwgbWFpbGJveF9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsCi0JCQkibWFpbGJveDAiLCBtYWlsYm94X2ludGVycnVwdCkpIHsKKwkJCSJTTVAtSVBJIiwgbWFpbGJveF9pbnRlcnJ1cHQpKSB7CiAJCXBhbmljKCJDYW5ub3QgcmVxdWVzdF9pcnEoT0NURU9OX0lSUV9NQk9YMClcbiIpOwogCX0KLQlpZiAocmVxdWVzdF9pcnEoT0NURU9OX0lSUV9NQk9YMSwgbWFpbGJveF9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsCi0JCQkibWFpbGJveDEiLCBtYWlsYm94X2ludGVycnVwdCkpIHsKLQkJcGFuaWMoIkNhbm5vdCByZXF1ZXN0X2lycShPQ1RFT05fSVJRX01CT1gxKVxuIik7Ci0JfQogfQogCiAvKioKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2xlbW90ZTJmX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2xlbW90ZTJmX2RlZmNvbmZpZwppbmRleCAxNjdjMWQwLi5iNmFjZDJmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9sZW1vdGUyZl9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvbGVtb3RlMmZfZGVmY29uZmlnCkBAIC04Niw4ICs4Niw4IEBACiBDT05GSUdfTkVUX0VNQVRDSD15CiBDT05GSUdfTkVUX0NMU19BQ1Q9eQogQ09ORklHX0JUPW0KLUNPTkZJR19CVF9MMkNBUD1tCi1DT05GSUdfQlRfU0NPPW0KK0NPTkZJR19CVF9MMkNBUD15CitDT05GSUdfQlRfU0NPPXkKIENPTkZJR19CVF9SRkNPTU09bQogQ09ORklHX0JUX1JGQ09NTV9UVFk9eQogQ09ORklHX0JUX0JORVA9bQpAQCAtMzI5LDcgKzMyOSw3IEBACiBDT05GSUdfVVNCX0dBREdFVD1tCiBDT05GSUdfVVNCX0dBREdFVF9NNjY1OTI9eQogQ09ORklHX01NQz1tCi1DT05GSUdfTEVEU19DTEFTUz1tCitDT05GSUdfTEVEU19DTEFTUz15CiBDT05GSUdfU1RBR0lORz15CiAjIENPTkZJR19TVEFHSU5HX0VYQ0xVREVfQlVJTEQgaXMgbm90IHNldAogQ09ORklHX0ZCX1NNN1hYPXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL21hbHRhX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL21hbHRhX2RlZmNvbmZpZwppbmRleCA3MjcwZjMxLi41NTI3YWJiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9tYWx0YV9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFfZGVmY29uZmlnCkBAIC0zNzQsNyArMzc0LDcgQEAKICMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKIENPTkZJR19ISUQ9bQotQ09ORklHX0xFRFNfQ0xBU1M9bQorQ09ORklHX0xFRFNfQ0xBU1M9eQogQ09ORklHX0xFRFNfVFJJR0dFUl9USU1FUj1tCiBDT05GSUdfTEVEU19UUklHR0VSX0lERV9ESVNLPXkKIENPTkZJR19MRURTX1RSSUdHRVJfSEVBUlRCRUFUPW0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL210eDFfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvbXR4MV9kZWZjb25maWcKaW5kZXggYTk3YTQyYzYuLjM3ODYyYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL210eDFfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL210eDFfZGVmY29uZmlnCkBAIC0yMjUsOCArMjI1LDggQEAKIENPTkZJR19WTFNJX0ZJUj1tCiBDT05GSUdfTUNTX0ZJUj1tCiBDT05GSUdfQlQ9bQotQ09ORklHX0JUX0wyQ0FQPW0KLUNPTkZJR19CVF9TQ089bQorQ09ORklHX0JUX0wyQ0FQPXkKK0NPTkZJR19CVF9TQ089eQogQ09ORklHX0JUX1JGQ09NTT1tCiBDT05GSUdfQlRfUkZDT01NX1RUWT15CiBDT05GSUdfQlRfQk5FUD1tCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9ubG1feGxyX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL25sbV94bHJfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YjM5OWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvY29uZmlncy9ubG1feGxyX2RlZmNvbmZpZwpAQCAtMCwwICsxLDU3NCBAQAorQ09ORklHX05MTV9YTFJfQk9BUkQ9eQorQ09ORklHX0hJR0hNRU09eQorQ09ORklHX0tTTT15CitDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTY1NTM2CitDT05GSUdfU01QPXkKK0NPTkZJR19OT19IWj15CitDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKK0NPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT15CitDT05GSUdfS0VYRUM9eQorQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ1JPU1NfQ09NUElMRT0ibWlwczY0LXVua25vd24tbGludXgtZ251LSIKKyMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjM9eQorQ09ORklHX1RBU0tTVEFUUz15CitDT05GSUdfVEFTS19ERUxBWV9BQ0NUPXkKK0NPTkZJR19UQVNLX1hBQ0NUPXkKK0NPTkZJR19UQVNLX0lPX0FDQ09VTlRJTkc9eQorQ09ORklHX0FVRElUPXkKK0NPTkZJR19OQU1FU1BBQ0VTPXkKK0NPTkZJR19TQ0hFRF9BVVRPR1JPVVA9eQorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSJ1c3IvZGV2X2ZpbGVfbGlzdCB1c3Ivcm9vdGZzIgorQ09ORklHX1JEX0JaSVAyPXkKK0NPTkZJR19SRF9MWk1BPXkKK0NPTkZJR19JTklUUkFNRlNfQ09NUFJFU1NJT05fR1pJUD15CisjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CitDT05GSUdfRVhQRVJUPXkKK0NPTkZJR19LQUxMU1lNU19BTEw9eQorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfUENTUEtSX1BMQVRGT1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BFUkZfRVZFTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAorQ09ORklHX1BST0ZJTElORz15CitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CitDT05GSUdfTU9EVkVSU0lPTlM9eQorQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTD15CitDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFk9eQorQ09ORklHX0JJTkZNVF9NSVNDPW0KK0NPTkZJR19QTV9SVU5USU1FPXkKK0NPTkZJR19QTV9ERUJVRz15CitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNX1VTRVI9bQorQ09ORklHX05FVF9LRVk9bQorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CitDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSPXkKK0NPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVM9eQorQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSD15CitDT05GSUdfSVBfUk9VVEVfVkVSQk9TRT15CitDT05GSUdfTkVUX0lQSVA9bQorQ09ORklHX0lQX01ST1VURT15CitDT05GSUdfSVBfUElNU01fVjE9eQorQ09ORklHX0lQX1BJTVNNX1YyPXkKK0NPTkZJR19TWU5fQ09PS0lFUz15CitDT05GSUdfSU5FVF9BSD1tCitDT05GSUdfSU5FVF9FU1A9bQorQ09ORklHX0lORVRfSVBDT01QPW0KK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9bQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD1tCitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD1tCitDT05GSUdfVENQX0NPTkdfQURWQU5DRUQ9eQorQ09ORklHX1RDUF9DT05HX0hTVENQPW0KK0NPTkZJR19UQ1BfQ09OR19IWUJMQT1tCitDT05GSUdfVENQX0NPTkdfU0NBTEFCTEU9bQorQ09ORklHX1RDUF9DT05HX0xQPW0KK0NPTkZJR19UQ1BfQ09OR19WRU5PPW0KK0NPTkZJR19UQ1BfQ09OR19ZRUFIPW0KK0NPTkZJR19UQ1BfQ09OR19JTExJTk9JUz1tCitDT05GSUdfVENQX01ENVNJRz15CitDT05GSUdfSVBWNj15CitDT05GSUdfSVBWNl9QUklWQUNZPXkKK0NPTkZJR19JTkVUNl9BSD1tCitDT05GSUdfSU5FVDZfRVNQPW0KK0NPTkZJR19JTkVUNl9JUENPTVA9bQorQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UUkFOU1BPUlQ9bQorQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UVU5ORUw9bQorQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9CRUVUPW0KK0NPTkZJR19JTkVUNl9YRlJNX01PREVfUk9VVEVPUFRJTUlaQVRJT049bQorQ09ORklHX0lQVjZfU0lUPW0KK0NPTkZJR19JUFY2X1RVTk5FTD1tCitDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVM9eQorQ09ORklHX05FVExBQkVMPXkKK0NPTkZJR19ORVRGSUxURVI9eQorQ09ORklHX05GX0NPTk5UUkFDSz1tCitDT05GSUdfTkZfQ09OTlRSQUNLX1NFQ01BUks9eQorQ09ORklHX05GX0NPTk5UUkFDS19FVkVOVFM9eQorQ09ORklHX05GX0NUX1BST1RPX1VEUExJVEU9bQorQ09ORklHX05GX0NPTk5UUkFDS19BTUFOREE9bQorQ09ORklHX05GX0NPTk5UUkFDS19GVFA9bQorQ09ORklHX05GX0NPTk5UUkFDS19IMzIzPW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfSVJDPW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfTkVUQklPU19OUz1tCitDT05GSUdfTkZfQ09OTlRSQUNLX1BQVFA9bQorQ09ORklHX05GX0NPTk5UUkFDS19TQU5FPW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfU0lQPW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfVEZUUD1tCitDT05GSUdfTkZfQ1RfTkVUTElOSz1tCitDT05GSUdfTkVURklMVEVSX1RQUk9YWT1tCitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DTEFTU0lGWT1tCitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DT05OTUFSSz1tCitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DT05OU0VDTUFSSz1tCitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9EU0NQPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX01BUks9bQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZMT0c9bQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZRVUVVRT1tCitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9OT1RSQUNLPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RQUk9YWT1tCitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9UUkFDRT1tCitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9TRUNNQVJLPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RDUE1TUz1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NMVVNURVI9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT01NRU5UPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTkJZVEVTPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTkxJTUlUPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTk1BUks9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OVFJBQ0s9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9EU0NQPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRVNQPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEFTSExJTUlUPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEVMUEVSPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSVBSQU5HRT1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xJTUlUPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFDPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFSSz1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01VTFRJUE9SVD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX09TRj1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX09XTkVSPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUE9MSUNZPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEhZU0RFVj1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BLVFRZUEU9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9RVU9UQT1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JBVEVFU1Q9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUFMTT1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JFQ0VOVD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NPQ0tFVD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRFPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RBVElTVElDPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RSSU5HPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVENQTVNTPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVElNRT1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1UzMj1tCitDT05GSUdfSVBfVlM9bQorQ09ORklHX0lQX1ZTX0lQVjY9eQorQ09ORklHX0lQX1ZTX1BST1RPX1RDUD15CitDT05GSUdfSVBfVlNfUFJPVE9fVURQPXkKK0NPTkZJR19JUF9WU19QUk9UT19FU1A9eQorQ09ORklHX0lQX1ZTX1BST1RPX0FIPXkKK0NPTkZJR19JUF9WU19SUj1tCitDT05GSUdfSVBfVlNfV1JSPW0KK0NPTkZJR19JUF9WU19MQz1tCitDT05GSUdfSVBfVlNfV0xDPW0KK0NPTkZJR19JUF9WU19MQkxDPW0KK0NPTkZJR19JUF9WU19MQkxDUj1tCitDT05GSUdfSVBfVlNfREg9bQorQ09ORklHX0lQX1ZTX1NIPW0KK0NPTkZJR19JUF9WU19TRUQ9bQorQ09ORklHX0lQX1ZTX05RPW0KK0NPTkZJR19JUF9WU19GVFA9bQorQ09ORklHX05GX0NPTk5UUkFDS19JUFY0PW0KK0NPTkZJR19JUF9ORl9RVUVVRT1tCitDT05GSUdfSVBfTkZfSVBUQUJMRVM9bQorQ09ORklHX0lQX05GX01BVENIX0FIPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9FQ049bQorQ09ORklHX0lQX05GX01BVENIX1RUTD1tCitDT05GSUdfSVBfTkZfRklMVEVSPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfUkVKRUNUPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfTE9HPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfVUxPRz1tCitDT05GSUdfTkZfTkFUPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfTUFTUVVFUkFERT1tCitDT05GSUdfSVBfTkZfVEFSR0VUX05FVE1BUD1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1JFRElSRUNUPW0KK0NPTkZJR19JUF9ORl9NQU5HTEU9bQorQ09ORklHX0lQX05GX1RBUkdFVF9DTFVTVEVSSVA9bQorQ09ORklHX0lQX05GX1RBUkdFVF9FQ049bQorQ09ORklHX0lQX05GX1RBUkdFVF9UVEw9bQorQ09ORklHX0lQX05GX1JBVz1tCitDT05GSUdfSVBfTkZfU0VDVVJJVFk9bQorQ09ORklHX0lQX05GX0FSUFRBQkxFUz1tCitDT05GSUdfSVBfTkZfQVJQRklMVEVSPW0KK0NPTkZJR19JUF9ORl9BUlBfTUFOR0xFPW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfSVBWNj1tCitDT05GSUdfSVA2X05GX1FVRVVFPW0KK0NPTkZJR19JUDZfTkZfSVBUQUJMRVM9bQorQ09ORklHX0lQNl9ORl9NQVRDSF9BSD1tCitDT05GSUdfSVA2X05GX01BVENIX0VVSTY0PW0KK0NPTkZJR19JUDZfTkZfTUFUQ0hfRlJBRz1tCitDT05GSUdfSVA2X05GX01BVENIX09QVFM9bQorQ09ORklHX0lQNl9ORl9NQVRDSF9ITD1tCitDT05GSUdfSVA2X05GX01BVENIX0lQVjZIRUFERVI9bQorQ09ORklHX0lQNl9ORl9NQVRDSF9NSD1tCitDT05GSUdfSVA2X05GX01BVENIX1JUPW0KK0NPTkZJR19JUDZfTkZfVEFSR0VUX0hMPW0KK0NPTkZJR19JUDZfTkZfVEFSR0VUX0xPRz1tCitDT05GSUdfSVA2X05GX0ZJTFRFUj1tCitDT05GSUdfSVA2X05GX1RBUkdFVF9SRUpFQ1Q9bQorQ09ORklHX0lQNl9ORl9NQU5HTEU9bQorQ09ORklHX0lQNl9ORl9SQVc9bQorQ09ORklHX0lQNl9ORl9TRUNVUklUWT1tCitDT05GSUdfREVDTkVUX05GX0dSQUJVTEFUT1I9bQorQ09ORklHX0JSSURHRV9ORl9FQlRBQkxFUz1tCitDT05GSUdfQlJJREdFX0VCVF9CUk9VVEU9bQorQ09ORklHX0JSSURHRV9FQlRfVF9GSUxURVI9bQorQ09ORklHX0JSSURHRV9FQlRfVF9OQVQ9bQorQ09ORklHX0JSSURHRV9FQlRfODAyXzM9bQorQ09ORklHX0JSSURHRV9FQlRfQU1PTkc9bQorQ09ORklHX0JSSURHRV9FQlRfQVJQPW0KK0NPTkZJR19CUklER0VfRUJUX0lQPW0KK0NPTkZJR19CUklER0VfRUJUX0lQNj1tCitDT05GSUdfQlJJREdFX0VCVF9MSU1JVD1tCitDT05GSUdfQlJJREdFX0VCVF9NQVJLPW0KK0NPTkZJR19CUklER0VfRUJUX1BLVFRZUEU9bQorQ09ORklHX0JSSURHRV9FQlRfU1RQPW0KK0NPTkZJR19CUklER0VfRUJUX1ZMQU49bQorQ09ORklHX0JSSURHRV9FQlRfQVJQUkVQTFk9bQorQ09ORklHX0JSSURHRV9FQlRfRE5BVD1tCitDT05GSUdfQlJJREdFX0VCVF9NQVJLX1Q9bQorQ09ORklHX0JSSURHRV9FQlRfUkVESVJFQ1Q9bQorQ09ORklHX0JSSURHRV9FQlRfU05BVD1tCitDT05GSUdfQlJJREdFX0VCVF9MT0c9bQorQ09ORklHX0JSSURHRV9FQlRfVUxPRz1tCitDT05GSUdfQlJJREdFX0VCVF9ORkxPRz1tCitDT05GSUdfSVBfRENDUD1tCitDT05GSUdfUkRTPW0KK0NPTkZJR19SRFNfVENQPW0KK0NPTkZJR19USVBDPW0KK0NPTkZJR19BVE09bQorQ09ORklHX0FUTV9DTElQPW0KK0NPTkZJR19BVE1fTEFORT1tCitDT05GSUdfQVRNX01QT0E9bQorQ09ORklHX0FUTV9CUjI2ODQ9bQorQ09ORklHX0JSSURHRT1tCitDT05GSUdfVkxBTl84MDIxUT1tCitDT05GSUdfVkxBTl84MDIxUV9HVlJQPXkKK0NPTkZJR19ERUNORVQ9bQorQ09ORklHX0xMQzI9bQorQ09ORklHX0lQWD1tCitDT05GSUdfQVRBTEs9bQorQ09ORklHX0RFVl9BUFBMRVRBTEs9bQorQ09ORklHX0lQRERQPW0KK0NPTkZJR19JUEREUF9FTkNBUD15CitDT05GSUdfSVBERFBfREVDQVA9eQorQ09ORklHX1gyNT1tCitDT05GSUdfTEFQQj1tCitDT05GSUdfRUNPTkVUPW0KK0NPTkZJR19FQ09ORVRfQVVOVURQPXkKK0NPTkZJR19FQ09ORVRfTkFUSVZFPXkKK0NPTkZJR19XQU5fUk9VVEVSPW0KK0NPTkZJR19QSE9ORVQ9bQorQ09ORklHX0lFRUU4MDIxNTQ9bQorQ09ORklHX05FVF9TQ0hFRD15CitDT05GSUdfTkVUX1NDSF9DQlE9bQorQ09ORklHX05FVF9TQ0hfSFRCPW0KK0NPTkZJR19ORVRfU0NIX0hGU0M9bQorQ09ORklHX05FVF9TQ0hfQVRNPW0KK0NPTkZJR19ORVRfU0NIX1BSSU89bQorQ09ORklHX05FVF9TQ0hfTVVMVElRPW0KK0NPTkZJR19ORVRfU0NIX1JFRD1tCitDT05GSUdfTkVUX1NDSF9TRlE9bQorQ09ORklHX05FVF9TQ0hfVEVRTD1tCitDT05GSUdfTkVUX1NDSF9UQkY9bQorQ09ORklHX05FVF9TQ0hfR1JFRD1tCitDT05GSUdfTkVUX1NDSF9EU01BUks9bQorQ09ORklHX05FVF9TQ0hfTkVURU09bQorQ09ORklHX05FVF9TQ0hfRFJSPW0KK0NPTkZJR19ORVRfU0NIX0lOR1JFU1M9bQorQ09ORklHX05FVF9DTFNfQkFTSUM9bQorQ09ORklHX05FVF9DTFNfVENJTkRFWD1tCitDT05GSUdfTkVUX0NMU19ST1VURTQ9bQorQ09ORklHX05FVF9DTFNfRlc9bQorQ09ORklHX05FVF9DTFNfVTMyPW0KK0NPTkZJR19DTFNfVTMyX01BUks9eQorQ09ORklHX05FVF9DTFNfUlNWUD1tCitDT05GSUdfTkVUX0NMU19SU1ZQNj1tCitDT05GSUdfTkVUX0NMU19GTE9XPW0KK0NPTkZJR19ORVRfRU1BVENIPXkKK0NPTkZJR19ORVRfRU1BVENIX0NNUD1tCitDT05GSUdfTkVUX0VNQVRDSF9OQllURT1tCitDT05GSUdfTkVUX0VNQVRDSF9VMzI9bQorQ09ORklHX05FVF9FTUFUQ0hfTUVUQT1tCitDT05GSUdfTkVUX0VNQVRDSF9URVhUPW0KK0NPTkZJR19ORVRfQ0xTX0FDVD15CitDT05GSUdfTkVUX0FDVF9QT0xJQ0U9bQorQ09ORklHX05FVF9BQ1RfR0FDVD1tCitDT05GSUdfR0FDVF9QUk9CPXkKK0NPTkZJR19ORVRfQUNUX01JUlJFRD1tCitDT05GSUdfTkVUX0FDVF9JUFQ9bQorQ09ORklHX05FVF9BQ1RfTkFUPW0KK0NPTkZJR19ORVRfQUNUX1BFRElUPW0KK0NPTkZJR19ORVRfQUNUX1NJTVA9bQorQ09ORklHX05FVF9BQ1RfU0tCRURJVD1tCitDT05GSUdfRENCPXkKK0NPTkZJR19ORVRfUEtUR0VOPW0KKyMgQ09ORklHX1dJUkVMRVNTIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZUTVBGUz15CitDT05GSUdfREVWVE1QRlNfTU9VTlQ9eQorIyBDT05GSUdfU1RBTkRBTE9ORSBpcyBub3Qgc2V0CitDT05GSUdfQ09OTkVDVE9SPXkKK0NPTkZJR19NVEQ9bQorQ09ORklHX0JMS19ERVZfTE9PUD15CitDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QPW0KK0NPTkZJR19CTEtfREVWX05CRD1tCitDT05GSUdfQkxLX0RFVl9PU0Q9bQorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTY1NTM2CitDT05GSUdfQ0RST01fUEtUQ0RWRD15CitDT05GSUdfTUlTQ19ERVZJQ0VTPXkKK0NPTkZJR19SQUlEX0FUVFJTPW0KK0NPTkZJR19TQ1NJPXkKK0NPTkZJR19TQ1NJX1RHVD1tCitDT05GSUdfQkxLX0RFVl9TRD15CitDT05GSUdfQ0hSX0RFVl9TVD1tCitDT05GSUdfQ0hSX0RFVl9PU1NUPW0KK0NPTkZJR19CTEtfREVWX1NSPXkKK0NPTkZJR19DSFJfREVWX1NHPXkKK0NPTkZJR19DSFJfREVWX1NDSD1tCitDT05GSUdfU0NTSV9NVUxUSV9MVU49eQorQ09ORklHX1NDU0lfQ09OU1RBTlRTPXkKK0NPTkZJR19TQ1NJX0xPR0dJTkc9eQorQ09ORklHX1NDU0lfU0NBTl9BU1lOQz15CitDT05GSUdfU0NTSV9TUElfQVRUUlM9bQorQ09ORklHX1NDU0lfRkNfVEdUX0FUVFJTPXkKK0NPTkZJR19TQ1NJX1NBU19MSUJTQVM9bQorQ09ORklHX1NDU0lfU1JQX0FUVFJTPW0KK0NPTkZJR19TQ1NJX1NSUF9UR1RfQVRUUlM9eQorQ09ORklHX0lTQ1NJX1RDUD1tCitDT05GSUdfTElCRkNPRT1tCitDT05GSUdfU0NTSV9ERUJVRz1tCitDT05GSUdfU0NTSV9ESD15CitDT05GSUdfU0NTSV9ESF9SREFDPW0KK0NPTkZJR19TQ1NJX0RIX0hQX1NXPW0KK0NPTkZJR19TQ1NJX0RIX0VNQz1tCitDT05GSUdfU0NTSV9ESF9BTFVBPW0KK0NPTkZJR19TQ1NJX09TRF9JTklUSUFUT1I9bQorQ09ORklHX1NDU0lfT1NEX1VMRD1tCisjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfRVZERVY9eQorQ09ORklHX0lOUFVUX0VWQlVHPW0KKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX0k4MDQyIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJT19TRVJQT1JUPW0KK0NPTkZJR19TRVJJT19MSUJQUzI9eQorQ09ORklHX1NFUklPX1JBVz1tCitDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HPXkKK0NPTkZJR19ERVZQVFNfTVVMVElQTEVfSU5TVEFOQ0VTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTAKK0NPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQ9eQorQ09ORklHX05fSERMQz1tCisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKK0NPTkZJR19TVEFMRFJWPXkKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9NDgKK0NPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRD15CitDT05GSUdfU0VSSUFMXzgyNTBfTUFOWV9QT1JUUz15CitDT05GSUdfU0VSSUFMXzgyNTBfU0hBUkVfSVJRPXkKK0NPTkZJR19TRVJJQUxfODI1MF9SU0E9eQorQ09ORklHX0hXX1JBTkRPTT15CitDT05GSUdfSFdfUkFORE9NX1RJTUVSSU9NRU09bQorQ09ORklHX1JBV19EUklWRVI9bQorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX1VJTz15CitDT05GSUdfVUlPX1BEUlY9bQorQ09ORklHX1VJT19QRFJWX0dFTklSUT1tCitDT05GSUdfRVhUMl9GUz15CitDT05GSUdfRVhUMl9GU19YQVRUUj15CitDT05GSUdfRVhUMl9GU19QT1NJWF9BQ0w9eQorQ09ORklHX0VYVDJfRlNfU0VDVVJJVFk9eQorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMPXkKK0NPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZPXkKK0NPTkZJR19FWFQ0X0ZTPXkKK0NPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTD15CitDT05GSUdfRVhUNF9GU19TRUNVUklUWT15CitDT05GSUdfR0ZTMl9GUz1tCitDT05GSUdfR0ZTMl9GU19MT0NLSU5HX0RMTT15CitDT05GSUdfT0NGUzJfRlM9bQorQ09ORklHX0JUUkZTX0ZTPW0KK0NPTkZJR19CVFJGU19GU19QT1NJWF9BQ0w9eQorQ09ORklHX05JTEZTMl9GUz1tCitDT05GSUdfUVVPVEFfTkVUTElOS19JTlRFUkZBQ0U9eQorIyBDT05GSUdfUFJJTlRfUVVPVEFfV0FSTklORyBpcyBub3Qgc2V0CitDT05GSUdfUUZNVF9WMT1tCitDT05GSUdfUUZNVF9WMj1tCitDT05GSUdfQVVUT0ZTNF9GUz1tCitDT05GSUdfRlVTRV9GUz15CitDT05GSUdfQ1VTRT1tCitDT05GSUdfRlNDQUNIRT1tCitDT05GSUdfRlNDQUNIRV9TVEFUUz15CitDT05GSUdfRlNDQUNIRV9ISVNUT0dSQU09eQorQ09ORklHX0NBQ0hFRklMRVM9bQorQ09ORklHX0lTTzk2NjBfRlM9bQorQ09ORklHX0pPTElFVD15CitDT05GSUdfWklTT0ZTPXkKK0NPTkZJR19VREZfRlM9bQorQ09ORklHX01TRE9TX0ZTPW0KK0NPTkZJR19WRkFUX0ZTPW0KK0NPTkZJR19OVEZTX0ZTPW0KK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19UTVBGUz15CitDT05GSUdfVE1QRlNfUE9TSVhfQUNMPXkKK0NPTkZJR19DT05GSUdGU19GUz15CitDT05GSUdfQURGU19GUz1tCitDT05GSUdfQUZGU19GUz1tCitDT05GSUdfRUNSWVBUX0ZTPXkKK0NPTkZJR19IRlNfRlM9bQorQ09ORklHX0hGU1BMVVNfRlM9bQorQ09ORklHX0JFRlNfRlM9bQorQ09ORklHX0JGU19GUz1tCitDT05GSUdfRUZTX0ZTPW0KK0NPTkZJR19DUkFNRlM9bQorQ09ORklHX1NRVUFTSEZTPW0KK0NPTkZJR19WWEZTX0ZTPW0KK0NPTkZJR19NSU5JWF9GUz1tCitDT05GSUdfT01GU19GUz1tCitDT05GSUdfSFBGU19GUz1tCitDT05GSUdfUU5YNEZTX0ZTPW0KK0NPTkZJR19ST01GU19GUz1tCitDT05GSUdfU1lTVl9GUz1tCitDT05GSUdfVUZTX0ZTPW0KK0NPTkZJR19FWE9GU19GUz1tCitDT05GSUdfTkZTX0ZTPW0KK0NPTkZJR19ORlNfVjM9eQorQ09ORklHX05GU19WM19BQ0w9eQorQ09ORklHX05GU19WND15CitDT05GSUdfTkZTX0ZTQ0FDSEU9eQorQ09ORklHX05GU0Q9bQorQ09ORklHX05GU0RfVjNfQUNMPXkKK0NPTkZJR19ORlNEX1Y0PXkKK0NPTkZJR19DSUZTPW0KK0NPTkZJR19DSUZTX1dFQUtfUFdfSEFTSD15CitDT05GSUdfQ0lGU19VUENBTEw9eQorQ09ORklHX0NJRlNfWEFUVFI9eQorQ09ORklHX0NJRlNfUE9TSVg9eQorQ09ORklHX0NJRlNfREZTX1VQQ0FMTD15CitDT05GSUdfQ0lGU19FWFBFUklNRU5UQUw9eQorQ09ORklHX05DUF9GUz1tCitDT05GSUdfTkNQRlNfUEFDS0VUX1NJR05JTkc9eQorQ09ORklHX05DUEZTX0lPQ1RMX0xPQ0tJTkc9eQorQ09ORklHX05DUEZTX1NUUk9ORz15CitDT05GSUdfTkNQRlNfTkZTX05TPXkKK0NPTkZJR19OQ1BGU19PUzJfTlM9eQorQ09ORklHX05DUEZTX05MUz15CitDT05GSUdfTkNQRlNfRVhUUkFTPXkKK0NPTkZJR19DT0RBX0ZTPW0KK0NPTkZJR19BRlNfRlM9bQorQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CitDT05GSUdfQUNPUk5fUEFSVElUSU9OPXkKK0NPTkZJR19BQ09STl9QQVJUSVRJT05fSUNTPXkKK0NPTkZJR19BQ09STl9QQVJUSVRJT05fUklTQ0lYPXkKK0NPTkZJR19PU0ZfUEFSVElUSU9OPXkKK0NPTkZJR19BTUlHQV9QQVJUSVRJT049eQorQ09ORklHX0FUQVJJX1BBUlRJVElPTj15CitDT05GSUdfTUFDX1BBUlRJVElPTj15CitDT05GSUdfQlNEX0RJU0tMQUJFTD15CitDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OPXkKK0NPTkZJR19TT0xBUklTX1g4Nl9QQVJUSVRJT049eQorQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTD15CitDT05GSUdfTERNX1BBUlRJVElPTj15CitDT05GSUdfU0dJX1BBUlRJVElPTj15CitDT05GSUdfVUxUUklYX1BBUlRJVElPTj15CitDT05GSUdfU1VOX1BBUlRJVElPTj15CitDT05GSUdfS0FSTUFfUEFSVElUSU9OPXkKK0NPTkZJR19FRklfUEFSVElUSU9OPXkKK0NPTkZJR19TWVNWNjhfUEFSVElUSU9OPXkKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJjcDQzNyIKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfNzM3PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfNzc1PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODUwPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODUyPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODU1PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODU3PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODYwPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODYxPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODYyPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODYzPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODY0PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODY1PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODY2PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODY5PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfOTM2PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfOTUwPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfOTMyPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfOTQ5PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODc0PW0KK0NPTkZJR19OTFNfSVNPODg1OV84PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfMTI1MD1tCitDT05GSUdfTkxTX0NPREVQQUdFXzEyNTE9bQorQ09ORklHX05MU19BU0NJST1tCitDT05GSUdfTkxTX0lTTzg4NTlfMT1tCitDT05GSUdfTkxTX0lTTzg4NTlfMj1tCitDT05GSUdfTkxTX0lTTzg4NTlfMz1tCitDT05GSUdfTkxTX0lTTzg4NTlfND1tCitDT05GSUdfTkxTX0lTTzg4NTlfNT1tCitDT05GSUdfTkxTX0lTTzg4NTlfNj1tCitDT05GSUdfTkxTX0lTTzg4NTlfNz1tCitDT05GSUdfTkxTX0lTTzg4NTlfOT1tCitDT05GSUdfTkxTX0lTTzg4NTlfMTM9bQorQ09ORklHX05MU19JU084ODU5XzE0PW0KK0NPTkZJR19OTFNfSVNPODg1OV8xNT1tCitDT05GSUdfTkxTX0tPSThfUj1tCitDT05GSUdfTkxTX0tPSThfVT1tCitDT05GSUdfUFJJTlRLX1RJTUU9eQorIyBDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfVU5VU0VEX1NZTUJPTFM9eQorQ09ORklHX0RFQlVHX0tFUk5FTD15CitDT05GSUdfREVURUNUX0hVTkdfVEFTSz15CitDT05GSUdfU0NIRURTVEFUUz15CitDT05GSUdfVElNRVJfU1RBVFM9eQorQ09ORklHX0RFQlVHX0lORk89eQorQ09ORklHX0RFQlVHX01FTU9SWV9JTklUPXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CitDT05GSUdfU0NIRURfVFJBQ0VSPXkKK0NPTkZJR19CTEtfREVWX0lPX1RSQUNFPXkKK0NPTkZJR19LR0RCPXkKK0NPTkZJR19TRUNVUklUWT15CitDT05GSUdfU0VDVVJJVFlfTkVUV09SSz15CitDT05GSUdfTFNNX01NQVBfTUlOX0FERFI9MAorQ09ORklHX1NFQ1VSSVRZX1NFTElOVVg9eQorQ09ORklHX1NFQ1VSSVRZX1NFTElOVVhfQk9PVFBBUkFNPXkKK0NPTkZJR19TRUNVUklUWV9TRUxJTlVYX0JPT1RQQVJBTV9WQUxVRT0wCitDT05GSUdfU0VDVVJJVFlfU0VMSU5VWF9ESVNBQkxFPXkKK0NPTkZJR19TRUNVUklUWV9TTUFDSz15CitDT05GSUdfU0VDVVJJVFlfVE9NT1lPPXkKK0NPTkZJR19DUllQVE9fTlVMTD1tCitDT05GSUdfQ1JZUFRPX0NSWVBURD1tCitDT05GSUdfQ1JZUFRPX1RFU1Q9bQorQ09ORklHX0NSWVBUT19DQ009bQorQ09ORklHX0NSWVBUT19HQ009bQorQ09ORklHX0NSWVBUT19DVFM9bQorQ09ORklHX0NSWVBUT19MUlc9bQorQ09ORklHX0NSWVBUT19QQ0JDPW0KK0NPTkZJR19DUllQVE9fWFRTPW0KK0NPTkZJR19DUllQVE9fSE1BQz15CitDT05GSUdfQ1JZUFRPX1hDQkM9bQorQ09ORklHX0NSWVBUT19WTUFDPW0KK0NPTkZJR19DUllQVE9fTUlDSEFFTF9NSUM9bQorQ09ORklHX0NSWVBUT19STUQxMjg9bQorQ09ORklHX0NSWVBUT19STUQxNjA9bQorQ09ORklHX0NSWVBUT19STUQyNTY9bQorQ09ORklHX0NSWVBUT19STUQzMjA9bQorQ09ORklHX0NSWVBUT19TSEEyNTY9bQorQ09ORklHX0NSWVBUT19TSEE1MTI9bQorQ09ORklHX0NSWVBUT19UR1IxOTI9bQorQ09ORklHX0NSWVBUT19XUDUxMj1tCitDT05GSUdfQ1JZUFRPX0FOVUJJUz1tCitDT05GSUdfQ1JZUFRPX0JMT1dGSVNIPW0KK0NPTkZJR19DUllQVE9fQ0FNRUxMSUE9bQorQ09ORklHX0NSWVBUT19DQVNUNT1tCitDT05GSUdfQ1JZUFRPX0NBU1Q2PW0KK0NPTkZJR19DUllQVE9fRkNSWVBUPW0KK0NPTkZJR19DUllQVE9fS0hBWkFEPW0KK0NPTkZJR19DUllQVE9fU0FMU0EyMD1tCitDT05GSUdfQ1JZUFRPX1NFRUQ9bQorQ09ORklHX0NSWVBUT19TRVJQRU5UPW0KK0NPTkZJR19DUllQVE9fVEVBPW0KK0NPTkZJR19DUllQVE9fVFdPRklTSD1tCitDT05GSUdfQ1JZUFRPX1pMSUI9bQorQ09ORklHX0NSWVBUT19MWk89bQorQ09ORklHX0NSQ19DQ0lUVD1tCitDT05GSUdfQ1JDNz1tCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LmgKaW5kZXggODY4Nzc1My4uMzRjMGQzYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NwdS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUuaApAQCAtMzMsNiArMzMsNyBAQAogI2RlZmluZSBQUklEX0NPTVBfVE9TSElCQQkweDA3MDAwMAogI2RlZmluZSBQUklEX0NPTVBfTFNJCQkweDA4MDAwMAogI2RlZmluZSBQUklEX0NPTVBfTEVYUkEJCTB4MGIwMDAwCisjZGVmaW5lIFBSSURfQ09NUF9ORVRMT0dJQwkweDBjMDAwMAogI2RlZmluZSBQUklEX0NPTVBfQ0FWSVVNCTB4MGQwMDAwCiAjZGVmaW5lIFBSSURfQ09NUF9JTkdFTklDCTB4ZDAwMDAwCiAKQEAgLTE0Miw2ICsxNDMsMzEgQEAKICNkZWZpbmUgUFJJRF9JTVBfSlpSSVNDICAgICAgICAweDAyMDAKIAogLyoKKyAqIFRoZXNlIGFyZSB0aGUgUFJJRCdzIGZvciB3aGVuIDIzOjE2ID09IFBSSURfQ09NUF9ORVRMT0dJQworICovCisjZGVmaW5lIFBSSURfSU1QX05FVExPR0lDX1hMUjczMgkweDAwMDAKKyNkZWZpbmUgUFJJRF9JTVBfTkVUTE9HSUNfWExSNzE2CTB4MDIwMAorI2RlZmluZSBQUklEX0lNUF9ORVRMT0dJQ19YTFI1MzIJMHgwOTAwCisjZGVmaW5lIFBSSURfSU1QX05FVExPR0lDX1hMUjMwOAkweDA2MDAKKyNkZWZpbmUgUFJJRF9JTVBfTkVUTE9HSUNfWExSNTMyQwkweDA4MDAKKyNkZWZpbmUgUFJJRF9JTVBfTkVUTE9HSUNfWExSNTE2QwkweDBhMDAKKyNkZWZpbmUgUFJJRF9JTVBfTkVUTE9HSUNfWExSNTA4QwkweDBiMDAKKyNkZWZpbmUgUFJJRF9JTVBfTkVUTE9HSUNfWExSMzA4QwkweDBmMDAKKyNkZWZpbmUgUFJJRF9JTVBfTkVUTE9HSUNfWExTNjA4CTB4ODAwMAorI2RlZmluZSBQUklEX0lNUF9ORVRMT0dJQ19YTFM0MDgJMHg4ODAwCisjZGVmaW5lIFBSSURfSU1QX05FVExPR0lDX1hMUzQwNAkweDhjMDAKKyNkZWZpbmUgUFJJRF9JTVBfTkVUTE9HSUNfWExTMjA4CTB4OGUwMAorI2RlZmluZSBQUklEX0lNUF9ORVRMT0dJQ19YTFMyMDQJMHg4ZjAwCisjZGVmaW5lIFBSSURfSU1QX05FVExPR0lDX1hMUzEwOAkweGNlMDAKKyNkZWZpbmUgUFJJRF9JTVBfTkVUTE9HSUNfWExTMTA0CTB4Y2YwMAorI2RlZmluZSBQUklEX0lNUF9ORVRMT0dJQ19YTFM2MTZCCTB4NDAwMAorI2RlZmluZSBQUklEX0lNUF9ORVRMT0dJQ19YTFM2MDhCCTB4NGEwMAorI2RlZmluZSBQUklEX0lNUF9ORVRMT0dJQ19YTFM0MTZCCTB4NDQwMAorI2RlZmluZSBQUklEX0lNUF9ORVRMT0dJQ19YTFM0MTJCCTB4NGMwMAorI2RlZmluZSBQUklEX0lNUF9ORVRMT0dJQ19YTFM0MDhCCTB4NGUwMAorI2RlZmluZSBQUklEX0lNUF9ORVRMT0dJQ19YTFM0MDRCCTB4NGYwMAorCisvKgogICogRGVmaW5pdGlvbnMgZm9yIDc6MCBvbiBsZWdhY3kgcHJvY2Vzc29ycwogICovCiAKQEAgLTIzNCw2ICsyNjAsNyBAQAogCSAqLwogCUNQVV81S0MsIENQVV8yMEtDLCBDUFVfMjVLRiwgQ1BVX1NCMSwgQ1BVX1NCMUEsIENQVV9MT09OR1NPTjIsCiAJQ1BVX0NBVklVTV9PQ1RFT04sIENQVV9DQVZJVU1fT0NURU9OX1BMVVMsIENQVV9DQVZJVU1fT0NURU9OMiwKKwlDUFVfWExSLAogCiAJQ1BVX0xBU1QKIH07CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vaTgyNTMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9pODI1My5oCmluZGV4IDQ4YmI4MjMuLjlhZDAxMTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9pODI1My5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9pODI1My5oCkBAIC0xMiw4ICsxMiwxMyBAQAogI2RlZmluZSBQSVRfQ0gwCQkJMHg0MAogI2RlZmluZSBQSVRfQ0gyCQkJMHg0MgogCisjZGVmaW5lIFBJVF9MQVRDSAkJTEFUQ0gKKwogZXh0ZXJuIHJhd19zcGlubG9ja190IGk4MjUzX2xvY2s7CiAKIGV4dGVybiB2b2lkIHNldHVwX3BpdF90aW1lcih2b2lkKTsKIAorI2RlZmluZSBpbmJfcGl0IGluYl9wCisjZGVmaW5lIG91dGJfcGl0IG91dGJfcAorCiAjZW5kaWYgLyogX19BU01fSTgyNTNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2p1bXBfbGFiZWwuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9qdW1wX2xhYmVsLmgKaW5kZXggNzYyMmNjZi4uMTg4MWIzMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2p1bXBfbGFiZWwuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vanVtcF9sYWJlbC5oCkBAIC0yMCwxNiArMjAsMTggQEAKICNkZWZpbmUgV09SRF9JTlNOICIud29yZCIKICNlbmRpZgogCi0jZGVmaW5lIEpVTVBfTEFCRUwoa2V5LCBsYWJlbCkJCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlhc20gZ290bygiMTpcdG5vcFxuXHQiCQkJCQlcCi0JCQkibm9wXG5cdCIJCQkJCVwKLQkJCSIucHVzaHNlY3Rpb24gX19qdW1wX3RhYmxlLCAgXCJhXCJcblx0IgkJXAotCQkJV09SRF9JTlNOICIgMWIsICVsWyIgI2xhYmVsICJdLCAlMFxuXHQiCQlcCi0JCQkiLnBvcHNlY3Rpb25cblx0IgkJCQlcCi0JCQk6IDogICJpIiAoa2V5KSA6ICA6IGxhYmVsKTsJCQlcCi0JfSB3aGlsZSAoMCkKLQorc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIGFyY2hfc3RhdGljX2JyYW5jaChzdHJ1Y3QganVtcF9sYWJlbF9rZXkgKmtleSkKK3sKKwlhc20gZ290bygiMTpcdG5vcFxuXHQiCisJCSJub3Bcblx0IgorCQkiLnB1c2hzZWN0aW9uIF9fanVtcF90YWJsZSwgIFwiYXdcIlxuXHQiCisJCVdPUkRfSU5TTiAiIDFiLCAlbFtsX3llc10sICUwXG5cdCIKKwkJIi5wb3BzZWN0aW9uXG5cdCIKKwkJOiA6ICAiaSIgKGtleSkgOiA6IGxfeWVzKTsKKwlyZXR1cm4gZmFsc2U7CitsX3llczoKKwlyZXR1cm4gdHJ1ZTsKK30KIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oCmluZGV4IGE2OTc2NjEuLmYyNjBlYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxMDAwLmgKQEAgLTE2MSw2ICsxNjEsNDUgQEAKIAlyZXR1cm4gQUxDSEVNWV9DUFVfVU5LTk9XTjsKIH0KIAorLyogcmV0dXJuIG51bWJlciBvZiB1YXJ0cyBvbiBhIGdpdmVuIGNwdXR5cGUgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGFsY2hlbXlfZ2V0X3VhcnRzKGludCB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgQUxDSEVNWV9DUFVfQVUxMDAwOgorCQlyZXR1cm4gNDsKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTUwMDoKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTIwMDoKKwkJcmV0dXJuIDI7CisJY2FzZSBBTENIRU1ZX0NQVV9BVTExMDA6CisJY2FzZSBBTENIRU1ZX0NQVV9BVTE1NTA6CisJCXJldHVybiAzOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogZW5hYmxlIGFuIFVBUlQgYmxvY2sgaWYgaXQgaXNuJ3QgYWxyZWFkeSAqLworc3RhdGljIGlubGluZSB2b2lkIGFsY2hlbXlfdWFydF9lbmFibGUodTMyIHVhcnRfcGh5cykKK3sKKwl2b2lkIF9faW9tZW0gKmFkZHIgPSAodm9pZCBfX2lvbWVtICopS1NFRzFBRERSKHVhcnRfcGh5cyk7CisKKwkvKiByZXNldCwgZW5hYmxlIGNsb2NrLCBkZWFzc2VydCByZXNldCAqLworCWlmICgoX19yYXdfcmVhZGwoYWRkciArIDB4MTAwKSAmIDMpICE9IDMpIHsKKwkJX19yYXdfd3JpdGVsKDAsIGFkZHIgKyAweDEwMCk7CisJCXdtYigpOworCQlfX3Jhd193cml0ZWwoMSwgYWRkciArIDB4MTAwKTsKKwkJd21iKCk7CisJfQorCV9fcmF3X3dyaXRlbCgzLCBhZGRyICsgMHgxMDApOworCXdtYigpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWxjaGVteV91YXJ0X2Rpc2FibGUodTMyIHVhcnRfcGh5cykKK3sKKwl2b2lkIF9faW9tZW0gKmFkZHIgPSAodm9pZCBfX2lvbWVtICopS1NFRzFBRERSKHVhcnRfcGh5cyk7CisJX19yYXdfd3JpdGVsKDAsIGFkZHIgKyAweDEwMCk7CS8qIFVBUlRfTU9EX0NOVFJMICovCisJd21iKCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBhbGNoZW15X3VhcnRfcHV0Y2hhcih1MzIgdWFydF9waHlzLCB1OCBjKQogewogCXZvaWQgX19pb21lbSAqYmFzZSA9ICh2b2lkIF9faW9tZW0gKilLU0VHMUFERFIodWFydF9waHlzKTsKQEAgLTE4MCw2ICsyMTksMjAgQEAKIAl3bWIoKTsKIH0KIAorLyogcmV0dXJuIG51bWJlciBvZiBldGhlcm5ldCBNQUNzIG9uIGEgZ2l2ZW4gY3B1dHlwZSAqLworc3RhdGljIGlubGluZSBpbnQgYWxjaGVteV9nZXRfbWFjcyhpbnQgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTAwMDoKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTUwMDoKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTU1MDoKKwkJcmV0dXJuIDI7CisJY2FzZSBBTENIRU1ZX0NQVV9BVTExMDA6CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKwogLyogYXJjaC9taXBzL2F1MTAwMC9jb21tb24vY2xvY2tzLmMgKi8KIGV4dGVybiB2b2lkIHNldF9hdTF4MDBfc3BlZWQodW5zaWduZWQgaW50IG5ld19mcmVxKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgZ2V0X2F1MXgwMF9zcGVlZCh2b2lkKTsKQEAgLTYzMCwzOCArNjgzLDQyIEBACiAKIC8qCiAgKiBQaHlzaWNhbCBiYXNlIGFkZHJlc3NlcyBmb3IgaW50ZWdyYXRlZCBwZXJpcGhlcmFscworICogMC4uYXUxMDAwIDEuLmF1MTUwMCAyLi5hdTExMDAgMy4uYXUxNTUwIDQuLmF1MTIwMAogICovCiAKKyNkZWZpbmUgQVUxMDAwX0FDOTdfUEhZU19BRERSCQkweDEwMDAwMDAwIC8qIDAxMiAqLworI2RlZmluZSBBVTEwMDBfVVNCRF9QSFlTX0FERFIJCTB4MTAyMDAwMDAgLyogMDEyMyAqLworI2RlZmluZSBBVTEwMDBfSUMwX1BIWVNfQUREUgkJMHgxMDQwMDAwMCAvKiAwMTIzNCAqLworI2RlZmluZSBBVTEwMDBfTUFDMF9QSFlTX0FERFIJCTB4MTA1MDAwMDAgLyogMDIzICovCisjZGVmaW5lIEFVMTAwMF9NQUMxX1BIWVNfQUREUgkJMHgxMDUxMDAwMCAvKiAwMjMgKi8KKyNkZWZpbmUgQVUxMDAwX01BQ0VOX1BIWVNfQUREUgkJMHgxMDUyMDAwMCAvKiAwMjMgKi8KKyNkZWZpbmUgQVUxMTAwX1NEMF9QSFlTX0FERFIJCTB4MTA2MDAwMDAgLyogMjQgKi8KKyNkZWZpbmUgQVUxMTAwX1NEMV9QSFlTX0FERFIJCTB4MTA2ODAwMDAgLyogMjQgKi8KKyNkZWZpbmUgQVUxMDAwX0kyU19QSFlTX0FERFIJCTB4MTEwMDAwMDAgLyogMDIgKi8KKyNkZWZpbmUgQVUxNTAwX01BQzBfUEhZU19BRERSCQkweDExNTAwMDAwIC8qIDEgKi8KKyNkZWZpbmUgQVUxNTAwX01BQzFfUEhZU19BRERSCQkweDExNTEwMDAwIC8qIDEgKi8KKyNkZWZpbmUgQVUxNTAwX01BQ0VOX1BIWVNfQUREUgkJMHgxMTUyMDAwMCAvKiAxICovCisjZGVmaW5lIEFVMTAwMF9VQVJUMF9QSFlTX0FERFIJCTB4MTExMDAwMDAgLyogMDEyMzQgKi8KKyNkZWZpbmUgQVUxMDAwX1VBUlQxX1BIWVNfQUREUgkJMHgxMTIwMDAwMCAvKiAwMjM0ICovCisjZGVmaW5lIEFVMTAwMF9VQVJUMl9QSFlTX0FERFIJCTB4MTEzMDAwMDAgLyogMCAqLworI2RlZmluZSBBVTEwMDBfVUFSVDNfUEhZU19BRERSCQkweDExNDAwMDAwIC8qIDAxMjMgKi8KKyNkZWZpbmUgQVUxNTAwX0dQSU8yX1BIWVNfQUREUgkJMHgxMTcwMDAwMCAvKiAxMjM0ICovCisjZGVmaW5lIEFVMTAwMF9JQzFfUEhZU19BRERSCQkweDExODAwMDAwIC8qIDAxMjM0ICovCisjZGVmaW5lIEFVMTAwMF9TWVNfUEhZU19BRERSCQkweDExOTAwMDAwIC8qIDAxMjM0ICovCisjZGVmaW5lIEFVMTAwMF9ETUFfUEhZU19BRERSCQkweDE0MDAyMDAwIC8qIDAxMiAqLworI2RlZmluZSBBVTE1NTBfREJETUFfUEhZU19BRERSCQkweDE0MDAyMDAwIC8qIDM0ICovCisjZGVmaW5lIEFVMTU1MF9EQkRNQV9DT05GX1BIWVNfQUREUgkweDE0MDAzMDAwIC8qIDM0ICovCisjZGVmaW5lIEFVMTAwMF9NQUNETUEwX1BIWVNfQUREUgkweDE0MDA0MDAwIC8qIDAxMjMgKi8KKyNkZWZpbmUgQVUxMDAwX01BQ0RNQTFfUEhZU19BRERSCTB4MTQwMDQyMDAgLyogMDEyMyAqLworCisKICNpZmRlZiBDT05GSUdfU09DX0FVMTAwMAogI2RlZmluZQlNRU1fUEhZU19BRERSCQkweDE0MDAwMDAwCiAjZGVmaW5lCVNUQVRJQ19NRU1fUEhZU19BRERSCTB4MTQwMDEwMDAKLSNkZWZpbmUJRE1BMF9QSFlTX0FERFIJCTB4MTQwMDIwMDAKLSNkZWZpbmUJRE1BMV9QSFlTX0FERFIJCTB4MTQwMDIxMDAKLSNkZWZpbmUJRE1BMl9QSFlTX0FERFIJCTB4MTQwMDIyMDAKLSNkZWZpbmUJRE1BM19QSFlTX0FERFIJCTB4MTQwMDIzMDAKLSNkZWZpbmUJRE1BNF9QSFlTX0FERFIJCTB4MTQwMDI0MDAKLSNkZWZpbmUJRE1BNV9QSFlTX0FERFIJCTB4MTQwMDI1MDAKLSNkZWZpbmUJRE1BNl9QSFlTX0FERFIJCTB4MTQwMDI2MDAKLSNkZWZpbmUJRE1BN19QSFlTX0FERFIJCTB4MTQwMDI3MDAKLSNkZWZpbmUJSUMwX1BIWVNfQUREUgkJMHgxMDQwMDAwMAotI2RlZmluZQlJQzFfUEhZU19BRERSCQkweDExODAwMDAwCi0jZGVmaW5lCUFDOTdfUEhZU19BRERSCQkweDEwMDAwMDAwCiAjZGVmaW5lCVVTQkhfUEhZU19BRERSCQkweDEwMTAwMDAwCi0jZGVmaW5lCVVTQkRfUEhZU19BRERSCQkweDEwMjAwMDAwCiAjZGVmaW5lCUlSREFfUEhZU19BRERSCQkweDEwMzAwMDAwCi0jZGVmaW5lCU1BQzBfUEhZU19BRERSCQkweDEwNTAwMDAwCi0jZGVmaW5lCU1BQzFfUEhZU19BRERSCQkweDEwNTEwMDAwCi0jZGVmaW5lCU1BQ0VOX1BIWVNfQUREUgkJMHgxMDUyMDAwMAotI2RlZmluZQlNQUNETUEwX1BIWVNfQUREUgkweDE0MDA0MDAwCi0jZGVmaW5lCU1BQ0RNQTFfUEhZU19BRERSCTB4MTQwMDQyMDAKLSNkZWZpbmUJSTJTX1BIWVNfQUREUgkJMHgxMTAwMDAwMAotI2RlZmluZQlVQVJUMF9QSFlTX0FERFIJCTB4MTExMDAwMDAKLSNkZWZpbmUJVUFSVDFfUEhZU19BRERSCQkweDExMjAwMDAwCi0jZGVmaW5lCVVBUlQyX1BIWVNfQUREUgkJMHgxMTMwMDAwMAotI2RlZmluZQlVQVJUM19QSFlTX0FERFIJCTB4MTE0MDAwMDAKICNkZWZpbmUJU1NJMF9QSFlTX0FERFIJCTB4MTE2MDAwMDAKICNkZWZpbmUJU1NJMV9QSFlTX0FERFIJCTB4MTE2ODAwMDAKLSNkZWZpbmUJU1lTX1BIWVNfQUREUgkJMHgxMTkwMDAwMAogI2RlZmluZSBQQ01DSUFfSU9fUEhZU19BRERSCTB4RjAwMDAwMDAwVUxMCiAjZGVmaW5lIFBDTUNJQV9BVFRSX1BIWVNfQUREUgkweEY0MDAwMDAwMFVMTAogI2RlZmluZSBQQ01DSUFfTUVNX1BIWVNfQUREUgkweEY4MDAwMDAwMFVMTApAQCAtNjcyLDMwICs3MjksOCBAQAogI2lmZGVmIENPTkZJR19TT0NfQVUxNTAwCiAjZGVmaW5lCU1FTV9QSFlTX0FERFIJCTB4MTQwMDAwMDAKICNkZWZpbmUJU1RBVElDX01FTV9QSFlTX0FERFIJMHgxNDAwMTAwMAotI2RlZmluZQlETUEwX1BIWVNfQUREUgkJMHgxNDAwMjAwMAotI2RlZmluZQlETUExX1BIWVNfQUREUgkJMHgxNDAwMjEwMAotI2RlZmluZQlETUEyX1BIWVNfQUREUgkJMHgxNDAwMjIwMAotI2RlZmluZQlETUEzX1BIWVNfQUREUgkJMHgxNDAwMjMwMAotI2RlZmluZQlETUE0X1BIWVNfQUREUgkJMHgxNDAwMjQwMAotI2RlZmluZQlETUE1X1BIWVNfQUREUgkJMHgxNDAwMjUwMAotI2RlZmluZQlETUE2X1BIWVNfQUREUgkJMHgxNDAwMjYwMAotI2RlZmluZQlETUE3X1BIWVNfQUREUgkJMHgxNDAwMjcwMAotI2RlZmluZQlJQzBfUEhZU19BRERSCQkweDEwNDAwMDAwCi0jZGVmaW5lCUlDMV9QSFlTX0FERFIJCTB4MTE4MDAwMDAKLSNkZWZpbmUJQUM5N19QSFlTX0FERFIJCTB4MTAwMDAwMDAKICNkZWZpbmUJVVNCSF9QSFlTX0FERFIJCTB4MTAxMDAwMDAKLSNkZWZpbmUJVVNCRF9QSFlTX0FERFIJCTB4MTAyMDAwMDAKICNkZWZpbmUgUENJX1BIWVNfQUREUgkJMHgxNDAwNTAwMAotI2RlZmluZQlNQUMwX1BIWVNfQUREUgkJMHgxMTUwMDAwMAotI2RlZmluZQlNQUMxX1BIWVNfQUREUgkJMHgxMTUxMDAwMAotI2RlZmluZQlNQUNFTl9QSFlTX0FERFIJCTB4MTE1MjAwMDAKLSNkZWZpbmUJTUFDRE1BMF9QSFlTX0FERFIJMHgxNDAwNDAwMAotI2RlZmluZQlNQUNETUExX1BIWVNfQUREUgkweDE0MDA0MjAwCi0jZGVmaW5lCUkyU19QSFlTX0FERFIJCTB4MTEwMDAwMDAKLSNkZWZpbmUJVUFSVDBfUEhZU19BRERSCQkweDExMTAwMDAwCi0jZGVmaW5lCVVBUlQzX1BIWVNfQUREUgkJMHgxMTQwMDAwMAotI2RlZmluZSBHUElPMl9QSFlTX0FERFIJCTB4MTE3MDAwMDAKLSNkZWZpbmUJU1lTX1BIWVNfQUREUgkJMHgxMTkwMDAwMAogI2RlZmluZSBQQ0lfTUVNX1BIWVNfQUREUgkweDQwMDAwMDAwMFVMTAogI2RlZmluZSBQQ0lfSU9fUEhZU19BRERSCTB4NTAwMDAwMDAwVUxMCiAjZGVmaW5lIFBDSV9DT05GSUcwX1BIWVNfQUREUgkweDYwMDAwMDAwMFVMTApAQCAtNzEwLDM0ICs3NDUsMTAgQEAKICNpZmRlZiBDT05GSUdfU09DX0FVMTEwMAogI2RlZmluZQlNRU1fUEhZU19BRERSCQkweDE0MDAwMDAwCiAjZGVmaW5lCVNUQVRJQ19NRU1fUEhZU19BRERSCTB4MTQwMDEwMDAKLSNkZWZpbmUJRE1BMF9QSFlTX0FERFIJCTB4MTQwMDIwMDAKLSNkZWZpbmUJRE1BMV9QSFlTX0FERFIJCTB4MTQwMDIxMDAKLSNkZWZpbmUJRE1BMl9QSFlTX0FERFIJCTB4MTQwMDIyMDAKLSNkZWZpbmUJRE1BM19QSFlTX0FERFIJCTB4MTQwMDIzMDAKLSNkZWZpbmUJRE1BNF9QSFlTX0FERFIJCTB4MTQwMDI0MDAKLSNkZWZpbmUJRE1BNV9QSFlTX0FERFIJCTB4MTQwMDI1MDAKLSNkZWZpbmUJRE1BNl9QSFlTX0FERFIJCTB4MTQwMDI2MDAKLSNkZWZpbmUJRE1BN19QSFlTX0FERFIJCTB4MTQwMDI3MDAKLSNkZWZpbmUJSUMwX1BIWVNfQUREUgkJMHgxMDQwMDAwMAotI2RlZmluZSBTRDBfUEhZU19BRERSCQkweDEwNjAwMDAwCi0jZGVmaW5lIFNEMV9QSFlTX0FERFIJCTB4MTA2ODAwMDAKLSNkZWZpbmUJSUMxX1BIWVNfQUREUgkJMHgxMTgwMDAwMAotI2RlZmluZQlBQzk3X1BIWVNfQUREUgkJMHgxMDAwMDAwMAogI2RlZmluZQlVU0JIX1BIWVNfQUREUgkJMHgxMDEwMDAwMAotI2RlZmluZQlVU0JEX1BIWVNfQUREUgkJMHgxMDIwMDAwMAogI2RlZmluZQlJUkRBX1BIWVNfQUREUgkJMHgxMDMwMDAwMAotI2RlZmluZQlNQUMwX1BIWVNfQUREUgkJMHgxMDUwMDAwMAotI2RlZmluZQlNQUNFTl9QSFlTX0FERFIJCTB4MTA1MjAwMDAKLSNkZWZpbmUJTUFDRE1BMF9QSFlTX0FERFIJMHgxNDAwNDAwMAotI2RlZmluZQlNQUNETUExX1BIWVNfQUREUgkweDE0MDA0MjAwCi0jZGVmaW5lCUkyU19QSFlTX0FERFIJCTB4MTEwMDAwMDAKLSNkZWZpbmUJVUFSVDBfUEhZU19BRERSCQkweDExMTAwMDAwCi0jZGVmaW5lCVVBUlQxX1BIWVNfQUREUgkJMHgxMTIwMDAwMAotI2RlZmluZQlVQVJUM19QSFlTX0FERFIJCTB4MTE0MDAwMDAKICNkZWZpbmUJU1NJMF9QSFlTX0FERFIJCTB4MTE2MDAwMDAKICNkZWZpbmUJU1NJMV9QSFlTX0FERFIJCTB4MTE2ODAwMDAKLSNkZWZpbmUgR1BJTzJfUEhZU19BRERSCQkweDExNzAwMDAwCi0jZGVmaW5lCVNZU19QSFlTX0FERFIJCTB4MTE5MDAwMDAKICNkZWZpbmUgTENEX1BIWVNfQUREUgkJMHgxNTAwMDAwMAogI2RlZmluZSBQQ01DSUFfSU9fUEhZU19BRERSCTB4RjAwMDAwMDAwVUxMCiAjZGVmaW5lIFBDTUNJQV9BVFRSX1BIWVNfQUREUgkweEY0MDAwMDAwMFVMTApAQCAtNzQ5LDIyICs3NjAsOCBAQAogI2lmZGVmIENPTkZJR19TT0NfQVUxNTUwCiAjZGVmaW5lCU1FTV9QSFlTX0FERFIJCTB4MTQwMDAwMDAKICNkZWZpbmUJU1RBVElDX01FTV9QSFlTX0FERFIJMHgxNDAwMTAwMAotI2RlZmluZQlJQzBfUEhZU19BRERSCQkweDEwNDAwMDAwCi0jZGVmaW5lCUlDMV9QSFlTX0FERFIJCTB4MTE4MDAwMDAKICNkZWZpbmUJVVNCSF9QSFlTX0FERFIJCTB4MTQwMjAwMDAKLSNkZWZpbmUJVVNCRF9QSFlTX0FERFIJCTB4MTAyMDAwMDAKICNkZWZpbmUgUENJX1BIWVNfQUREUgkJMHgxNDAwNTAwMAotI2RlZmluZQlNQUMwX1BIWVNfQUREUgkJMHgxMDUwMDAwMAotI2RlZmluZQlNQUMxX1BIWVNfQUREUgkJMHgxMDUxMDAwMAotI2RlZmluZQlNQUNFTl9QSFlTX0FERFIJCTB4MTA1MjAwMDAKLSNkZWZpbmUJTUFDRE1BMF9QSFlTX0FERFIJMHgxNDAwNDAwMAotI2RlZmluZQlNQUNETUExX1BIWVNfQUREUgkweDE0MDA0MjAwCi0jZGVmaW5lCVVBUlQwX1BIWVNfQUREUgkJMHgxMTEwMDAwMAotI2RlZmluZQlVQVJUMV9QSFlTX0FERFIJCTB4MTEyMDAwMDAKLSNkZWZpbmUJVUFSVDNfUEhZU19BRERSCQkweDExNDAwMDAwCi0jZGVmaW5lIEdQSU8yX1BIWVNfQUREUgkJMHgxMTcwMDAwMAotI2RlZmluZQlTWVNfUEhZU19BRERSCQkweDExOTAwMDAwCi0jZGVmaW5lCURETUFfUEhZU19BRERSCQkweDE0MDAyMDAwCiAjZGVmaW5lIFBFX1BIWVNfQUREUgkJMHgxNDAwODAwMAogI2RlZmluZSBQU0MwX1BIWVNfQUREUgkJMHgxMUEwMDAwMAogI2RlZmluZSBQU0MxX1BIWVNfQUREUgkJMHgxMUIwMDAwMApAQCAtNzg2LDE5ICs3ODMsMTAgQEAKICNkZWZpbmUJU1RBVElDX01FTV9QSFlTX0FERFIJMHgxNDAwMTAwMAogI2RlZmluZSBBRVNfUEhZU19BRERSCQkweDEwMzAwMDAwCiAjZGVmaW5lIENJTV9QSFlTX0FERFIJCTB4MTQwMDQwMDAKLSNkZWZpbmUJSUMwX1BIWVNfQUREUgkJMHgxMDQwMDAwMAotI2RlZmluZQlJQzFfUEhZU19BRERSCQkweDExODAwMDAwCiAjZGVmaW5lIFVTQk1fUEhZU19BRERSCQkweDE0MDIwMDAwCiAjZGVmaW5lCVVTQkhfUEhZU19BRERSCQkweDE0MDIwMTAwCi0jZGVmaW5lCVVBUlQwX1BIWVNfQUREUgkJMHgxMTEwMDAwMAotI2RlZmluZQlVQVJUMV9QSFlTX0FERFIJCTB4MTEyMDAwMDAKLSNkZWZpbmUgR1BJTzJfUEhZU19BRERSCQkweDExNzAwMDAwCi0jZGVmaW5lCVNZU19QSFlTX0FERFIJCTB4MTE5MDAwMDAKLSNkZWZpbmUJRERNQV9QSFlTX0FERFIJCTB4MTQwMDIwMDAKICNkZWZpbmUgUFNDMF9QSFlTX0FERFIJIAkweDExQTAwMDAwCiAjZGVmaW5lIFBTQzFfUEhZU19BRERSCSAJMHgxMUIwMDAwMAotI2RlZmluZSBTRDBfUEhZU19BRERSCQkweDEwNjAwMDAwCi0jZGVmaW5lIFNEMV9QSFlTX0FERFIJCTB4MTA2ODAwMDAKICNkZWZpbmUgTENEX1BIWVNfQUREUgkJMHgxNTAwMDAwMAogI2RlZmluZSBTV0NOVF9QSFlTX0FERFIJCTB4MTExMDAxMEMKICNkZWZpbmUgTUFFRkVfUEhZU19BRERSCQkweDE0MDEyMDAwCkBAIC04MzUsMTgzICs4MjMsNDMgQEAKICNlbmRpZgogCiAKLS8qIEludGVycnVwdCBDb250cm9sbGVyIHJlZ2lzdGVyIG9mZnNldHMgKi8KLSNkZWZpbmUgSUNfQ0ZHMFJECQkweDQwCi0jZGVmaW5lIElDX0NGRzBTRVQJCTB4NDAKLSNkZWZpbmUgSUNfQ0ZHMENMUgkJMHg0NAotI2RlZmluZSBJQ19DRkcxUkQJCTB4NDgKLSNkZWZpbmUgSUNfQ0ZHMVNFVAkJMHg0OAotI2RlZmluZSBJQ19DRkcxQ0xSCQkweDRDCi0jZGVmaW5lIElDX0NGRzJSRAkJMHg1MAotI2RlZmluZSBJQ19DRkcyU0VUCQkweDUwCi0jZGVmaW5lIElDX0NGRzJDTFIJCTB4NTQKLSNkZWZpbmUgSUNfUkVRMElOVAkJMHg1NAotI2RlZmluZSBJQ19TUkNSRAkJMHg1OAotI2RlZmluZSBJQ19TUkNTRVQJCTB4NTgKLSNkZWZpbmUgSUNfU1JDQ0xSCQkweDVDCi0jZGVmaW5lIElDX1JFUTFJTlQJCTB4NUMKLSNkZWZpbmUgSUNfQVNTSUdOUkQJCTB4NjAKLSNkZWZpbmUgSUNfQVNTSUdOU0VUCQkweDYwCi0jZGVmaW5lIElDX0FTU0lHTkNMUgkJMHg2NAotI2RlZmluZSBJQ19XQUtFUkQJCTB4NjgKLSNkZWZpbmUgSUNfV0FLRVNFVAkJMHg2OAotI2RlZmluZSBJQ19XQUtFQ0xSCQkweDZDCi0jZGVmaW5lIElDX01BU0tSRAkJMHg3MAotI2RlZmluZSBJQ19NQVNLU0VUCQkweDcwCi0jZGVmaW5lIElDX01BU0tDTFIJCTB4NzQKLSNkZWZpbmUgSUNfUklTSU5HUkQJCTB4NzgKLSNkZWZpbmUgSUNfUklTSU5HQ0xSCQkweDc4Ci0jZGVmaW5lIElDX0ZBTExJTkdSRAkJMHg3QwotI2RlZmluZSBJQ19GQUxMSU5HQ0xSCQkweDdDCi0jZGVmaW5lIElDX1RFU1RCSVQJCTB4ODAKLQotCi0vKiBJbnRlcnJ1cHQgQ29udHJvbGxlciAwICovCi0jZGVmaW5lIElDMF9DRkcwUkQJCTB4QjA0MDAwNDAKLSNkZWZpbmUgSUMwX0NGRzBTRVQJCTB4QjA0MDAwNDAKLSNkZWZpbmUgSUMwX0NGRzBDTFIJCTB4QjA0MDAwNDQKLQotI2RlZmluZSBJQzBfQ0ZHMVJECQkweEIwNDAwMDQ4Ci0jZGVmaW5lIElDMF9DRkcxU0VUCQkweEIwNDAwMDQ4Ci0jZGVmaW5lIElDMF9DRkcxQ0xSCQkweEIwNDAwMDRDCi0KLSNkZWZpbmUgSUMwX0NGRzJSRAkJMHhCMDQwMDA1MAotI2RlZmluZSBJQzBfQ0ZHMlNFVAkJMHhCMDQwMDA1MAotI2RlZmluZSBJQzBfQ0ZHMkNMUgkJMHhCMDQwMDA1NAotCi0jZGVmaW5lIElDMF9SRVEwSU5UCQkweEIwNDAwMDU0Ci0jZGVmaW5lIElDMF9TUkNSRAkJMHhCMDQwMDA1OAotI2RlZmluZSBJQzBfU1JDU0VUCQkweEIwNDAwMDU4Ci0jZGVmaW5lIElDMF9TUkNDTFIJCTB4QjA0MDAwNUMKLSNkZWZpbmUgSUMwX1JFUTFJTlQJCTB4QjA0MDAwNUMKLQotI2RlZmluZSBJQzBfQVNTSUdOUkQJCTB4QjA0MDAwNjAKLSNkZWZpbmUgSUMwX0FTU0lHTlNFVAkJMHhCMDQwMDA2MAotI2RlZmluZSBJQzBfQVNTSUdOQ0xSCQkweEIwNDAwMDY0Ci0KLSNkZWZpbmUgSUMwX1dBS0VSRAkJMHhCMDQwMDA2OAotI2RlZmluZSBJQzBfV0FLRVNFVAkJMHhCMDQwMDA2OAotI2RlZmluZSBJQzBfV0FLRUNMUgkJMHhCMDQwMDA2QwotCi0jZGVmaW5lIElDMF9NQVNLUkQJCTB4QjA0MDAwNzAKLSNkZWZpbmUgSUMwX01BU0tTRVQJCTB4QjA0MDAwNzAKLSNkZWZpbmUgSUMwX01BU0tDTFIJCTB4QjA0MDAwNzQKLQotI2RlZmluZSBJQzBfUklTSU5HUkQJCTB4QjA0MDAwNzgKLSNkZWZpbmUgSUMwX1JJU0lOR0NMUgkJMHhCMDQwMDA3OAotI2RlZmluZSBJQzBfRkFMTElOR1JECQkweEIwNDAwMDdDCi0jZGVmaW5lIElDMF9GQUxMSU5HQ0xSCQkweEIwNDAwMDdDCi0KLSNkZWZpbmUgSUMwX1RFU1RCSVQJCTB4QjA0MDAwODAKLQotLyogSW50ZXJydXB0IENvbnRyb2xsZXIgMSAqLwotI2RlZmluZSBJQzFfQ0ZHMFJECQkweEIxODAwMDQwCi0jZGVmaW5lIElDMV9DRkcwU0VUCQkweEIxODAwMDQwCi0jZGVmaW5lIElDMV9DRkcwQ0xSCQkweEIxODAwMDQ0Ci0KLSNkZWZpbmUgSUMxX0NGRzFSRAkJMHhCMTgwMDA0OAotI2RlZmluZSBJQzFfQ0ZHMVNFVAkJMHhCMTgwMDA0OAotI2RlZmluZSBJQzFfQ0ZHMUNMUgkJMHhCMTgwMDA0QwotCi0jZGVmaW5lIElDMV9DRkcyUkQJCTB4QjE4MDAwNTAKLSNkZWZpbmUgSUMxX0NGRzJTRVQJCTB4QjE4MDAwNTAKLSNkZWZpbmUgSUMxX0NGRzJDTFIJCTB4QjE4MDAwNTQKLQotI2RlZmluZSBJQzFfUkVRMElOVAkJMHhCMTgwMDA1NAotI2RlZmluZSBJQzFfU1JDUkQJCTB4QjE4MDAwNTgKLSNkZWZpbmUgSUMxX1NSQ1NFVAkJMHhCMTgwMDA1OAotI2RlZmluZSBJQzFfU1JDQ0xSCQkweEIxODAwMDVDCi0jZGVmaW5lIElDMV9SRVExSU5UCQkweEIxODAwMDVDCi0KLSNkZWZpbmUgSUMxX0FTU0lHTlJEICAgICAgICAgICAgMHhCMTgwMDA2MAotI2RlZmluZSBJQzFfQVNTSUdOU0VUICAgICAgICAgICAweEIxODAwMDYwCi0jZGVmaW5lIElDMV9BU1NJR05DTFIgICAgICAgICAgIDB4QjE4MDAwNjQKLQotI2RlZmluZSBJQzFfV0FLRVJECQkweEIxODAwMDY4Ci0jZGVmaW5lIElDMV9XQUtFU0VUCQkweEIxODAwMDY4Ci0jZGVmaW5lIElDMV9XQUtFQ0xSCQkweEIxODAwMDZDCi0KLSNkZWZpbmUgSUMxX01BU0tSRAkJMHhCMTgwMDA3MAotI2RlZmluZSBJQzFfTUFTS1NFVAkJMHhCMTgwMDA3MAotI2RlZmluZSBJQzFfTUFTS0NMUgkJMHhCMTgwMDA3NAotCi0jZGVmaW5lIElDMV9SSVNJTkdSRAkJMHhCMTgwMDA3OAotI2RlZmluZSBJQzFfUklTSU5HQ0xSCQkweEIxODAwMDc4Ci0jZGVmaW5lIElDMV9GQUxMSU5HUkQJCTB4QjE4MDAwN0MKLSNkZWZpbmUgSUMxX0ZBTExJTkdDTFIJCTB4QjE4MDAwN0MKLQotI2RlZmluZSBJQzFfVEVTVEJJVAkJMHhCMTgwMDA4MAogCiAKIC8qIEF1MTAwMCAqLwogI2lmZGVmIENPTkZJR19TT0NfQVUxMDAwCiAKLSNkZWZpbmUgVUFSVDBfQUREUgkJMHhCMTEwMDAwMAotI2RlZmluZSBVQVJUM19BRERSCQkweEIxNDAwMDAwCi0KICNkZWZpbmUgVVNCX09IQ0lfQkFTRQkJMHgxMDEwMDAwMAkvKiBwaHlzIGFkZHIgZm9yIGlvcmVtYXAgKi8KICNkZWZpbmUgVVNCX0hPU1RfQ09ORklHIAkweEIwMTdGRkZDCiAjZGVmaW5lIEZPUl9QTEFURk9STV9DX1VTQl9IT1NUX0lOVCBBVTEwMDBfVVNCX0hPU1RfSU5UCi0KLSNkZWZpbmUgQVUxMDAwX0VUSDBfQkFTRQkweEIwNTAwMDAwCi0jZGVmaW5lIEFVMTAwMF9FVEgxX0JBU0UJMHhCMDUxMDAwMAotI2RlZmluZSBBVTEwMDBfTUFDMF9FTkFCTEUJMHhCMDUyMDAwMAotI2RlZmluZSBBVTEwMDBfTUFDMV9FTkFCTEUJMHhCMDUyMDAwNAotI2RlZmluZSBOVU1fRVRIX0lOVEVSRkFDRVMgMgogI2VuZGlmIC8qIENPTkZJR19TT0NfQVUxMDAwICovCiAKIC8qIEF1MTUwMCAqLwogI2lmZGVmIENPTkZJR19TT0NfQVUxNTAwCiAKLSNkZWZpbmUgVUFSVDBfQUREUgkJMHhCMTEwMDAwMAotI2RlZmluZSBVQVJUM19BRERSCQkweEIxNDAwMDAwCi0KICNkZWZpbmUgVVNCX09IQ0lfQkFTRQkJMHgxMDEwMDAwMAkvKiBwaHlzIGFkZHIgZm9yIGlvcmVtYXAgKi8KICNkZWZpbmUgVVNCX0hPU1RfQ09ORklHIAkweEIwMTdmZmZjCiAjZGVmaW5lIEZPUl9QTEFURk9STV9DX1VTQl9IT1NUX0lOVCBBVTE1MDBfVVNCX0hPU1RfSU5UCi0KLSNkZWZpbmUgQVUxNTAwX0VUSDBfQkFTRQkweEIxNTAwMDAwCi0jZGVmaW5lIEFVMTUwMF9FVEgxX0JBU0UJMHhCMTUxMDAwMAotI2RlZmluZSBBVTE1MDBfTUFDMF9FTkFCTEUJMHhCMTUyMDAwMAotI2RlZmluZSBBVTE1MDBfTUFDMV9FTkFCTEUJMHhCMTUyMDAwNAotI2RlZmluZSBOVU1fRVRIX0lOVEVSRkFDRVMgMgogI2VuZGlmIC8qIENPTkZJR19TT0NfQVUxNTAwICovCiAKIC8qIEF1MTEwMCAqLwogI2lmZGVmIENPTkZJR19TT0NfQVUxMTAwCiAKLSNkZWZpbmUgVUFSVDBfQUREUgkJMHhCMTEwMDAwMAotI2RlZmluZSBVQVJUM19BRERSCQkweEIxNDAwMDAwCi0KICNkZWZpbmUgVVNCX09IQ0lfQkFTRQkJMHgxMDEwMDAwMAkvKiBwaHlzIGFkZHIgZm9yIGlvcmVtYXAgKi8KICNkZWZpbmUgVVNCX0hPU1RfQ09ORklHIAkweEIwMTdGRkZDCiAjZGVmaW5lIEZPUl9QTEFURk9STV9DX1VTQl9IT1NUX0lOVCBBVTExMDBfVVNCX0hPU1RfSU5UCi0KLSNkZWZpbmUgQVUxMTAwX0VUSDBfQkFTRQkweEIwNTAwMDAwCi0jZGVmaW5lIEFVMTEwMF9NQUMwX0VOQUJMRQkweEIwNTIwMDAwCi0jZGVmaW5lIE5VTV9FVEhfSU5URVJGQUNFUyAxCiAjZW5kaWYgLyogQ09ORklHX1NPQ19BVTExMDAgKi8KIAogI2lmZGVmIENPTkZJR19TT0NfQVUxNTUwCi0jZGVmaW5lIFVBUlQwX0FERFIJCTB4QjExMDAwMDAKIAogI2RlZmluZSBVU0JfT0hDSV9CQVNFCQkweDE0MDIwMDAwCS8qIHBoeXMgYWRkciBmb3IgaW9yZW1hcCAqLwogI2RlZmluZSBVU0JfT0hDSV9MRU4JCTB4MDAwNjAwMDAKICNkZWZpbmUgVVNCX0hPU1RfQ09ORklHIAkweEI0MDI3ZmZjCiAjZGVmaW5lIEZPUl9QTEFURk9STV9DX1VTQl9IT1NUX0lOVCBBVTE1NTBfVVNCX0hPU1RfSU5UCi0KLSNkZWZpbmUgQVUxNTUwX0VUSDBfQkFTRQkweEIwNTAwMDAwCi0jZGVmaW5lIEFVMTU1MF9FVEgxX0JBU0UJMHhCMDUxMDAwMAotI2RlZmluZSBBVTE1NTBfTUFDMF9FTkFCTEUJMHhCMDUyMDAwMAotI2RlZmluZSBBVTE1NTBfTUFDMV9FTkFCTEUJMHhCMDUyMDAwNAotI2RlZmluZSBOVU1fRVRIX0lOVEVSRkFDRVMgMgogI2VuZGlmIC8qIENPTkZJR19TT0NfQVUxNTUwICovCiAKIAogI2lmZGVmIENPTkZJR19TT0NfQVUxMjAwCiAKLSNkZWZpbmUgVUFSVDBfQUREUgkJMHhCMTEwMDAwMAotCiAjZGVmaW5lIFVTQl9VT0NfQkFTRQkJMHgxNDAyMDAyMAogI2RlZmluZSBVU0JfVU9DX0xFTgkJMHgyMAogI2RlZmluZSBVU0JfT0hDSV9CQVNFCQkweDE0MDIwMTAwCkBAIC0xNTA0LDIyICsxMzUyLDYgQEAKICNkZWZpbmUgU1lTX1BJTkZVTkNfUzFCIAkoMSA8PCAyKQogI2VuZGlmCiAKLSNkZWZpbmUgU1lTX1RSSU9VVFJECQkweEIxOTAwMTAwCi0jZGVmaW5lIFNZU19UUklPVVRDTFIJCTB4QjE5MDAxMDAKLSNkZWZpbmUgU1lTX09VVFBVVFJECQkweEIxOTAwMTA4Ci0jZGVmaW5lIFNZU19PVVRQVVRTRVQJCTB4QjE5MDAxMDgKLSNkZWZpbmUgU1lTX09VVFBVVENMUgkJMHhCMTkwMDEwQwotI2RlZmluZSBTWVNfUElOU1RBVEVSRAkJMHhCMTkwMDExMAotI2RlZmluZSBTWVNfUElOSU5QVVRFTgkJMHhCMTkwMDExMAotCi0vKiBHUElPMiwgQXUxNTAwLCBBdTE1NTAgb25seSAqLwotI2RlZmluZSBHUElPMl9CQVNFCQkweEIxNzAwMDAwCi0jZGVmaW5lIEdQSU8yX0RJUgkJKEdQSU8yX0JBU0UgKyAwKQotI2RlZmluZSBHUElPMl9PVVRQVVQJCShHUElPMl9CQVNFICsgOCkKLSNkZWZpbmUgR1BJTzJfUElOU1RBVEUJCShHUElPMl9CQVNFICsgMHhDKQotI2RlZmluZSBHUElPMl9JTlRFTkFCTEUgCShHUElPMl9CQVNFICsgMHgxMCkKLSNkZWZpbmUgR1BJTzJfRU5BQkxFCQkoR1BJTzJfQkFTRSArIDB4MTQpCi0KIC8qIFBvd2VyIE1hbmFnZW1lbnQgKi8KICNkZWZpbmUgU1lTX1NDUkFUQ0gwCQkweEIxOTAwMDE4CiAjZGVmaW5lIFNZU19TQ1JBVENIMQkJMHhCMTkwMDAxQwpAQCAtMTYzNSwxMiArMTQ2Nyw2IEBACiAjICBkZWZpbmUgQUM5N0NfUlMJCSgxIDw8IDEpCiAjICBkZWZpbmUgQUM5N0NfQ0UJCSgxIDw8IDApCiAKLS8qIFNlY3VyZSBEaWdpdGFsIChTRCkgQ29udHJvbGxlciAqLwotI2RlZmluZSBTRDBfWE1JVF9GSUZPCTB4QjA2MDAwMDAKLSNkZWZpbmUgU0QwX1JFQ1ZfRklGTwkweEIwNjAwMDA0Ci0jZGVmaW5lIFNEMV9YTUlUX0ZJRk8JMHhCMDY4MDAwMAotI2RlZmluZSBTRDFfUkVDVl9GSUZPCTB4QjA2ODAwMDQKLQogI2lmIGRlZmluZWQoQ09ORklHX1NPQ19BVTE1MDApIHx8IGRlZmluZWQoQ09ORklHX1NPQ19BVTE1NTApCiAvKiBBdTE1MDAgUENJIENvbnRyb2xsZXIgKi8KICNkZWZpbmUgQXUxNTAwX0NGR19CQVNFIAkweEI0MDA1MDAwCS8qIHZpcnR1YWwsIEtTRUcxIGFkZHIgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTEwMDBfZG1hLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxMDAwX2RtYS5oCmluZGV4IGMzMzNiNGUuLjU5ZjViNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTEwMDBfZG1hLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MTAwMF9kbWEuaApAQCAtMzcsMTAgKzM3LDYgQEAKIAogI2RlZmluZSBOVU1fQVUxMDAwX0RNQV9DSEFOTkVMUwk4CiAKLS8qIERNQSBDaGFubmVsIEJhc2UgQWRkcmVzc2VzICovCi0jZGVmaW5lIERNQV9DSEFOTkVMX0JBU0UJMHhCNDAwMjAwMAotI2RlZmluZSBETUFfQ0hBTk5FTF9MRU4JCTB4MDAwMDAxMDAKLQogLyogRE1BIENoYW5uZWwgUmVnaXN0ZXIgT2Zmc2V0cyAqLwogI2RlZmluZSBETUFfTU9ERV9TRVQJCTB4MDAwMDAwMDAKICNkZWZpbmUgRE1BX01PREVfUkVBRAkJRE1BX01PREVfU0VUCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxeHh4X2RiZG1hLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxeHh4X2RiZG1hLmgKaW5kZXggYzhhNTUzYTMuLjJmZGFjZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTF4eHhfZGJkbWEuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxeHh4X2RiZG1hLmgKQEAgLTM3LDE0ICszNyw2IEBACiAKICNpZm5kZWYgX0xBTkdVQUdFX0FTU0VNQkxZCiAKLS8qCi0gKiBUaGUgRE1BIGJhc2UgYWRkcmVzc2VzLgotICogVGhlIGNoYW5uZWxzIGFyZSBldmVyeSAyNTYgYnl0ZXMgKDB4MDEwMCkgZnJvbSB0aGUgY2hhbm5lbCAwIGJhc2UuCi0gKiBJbnRlcnJ1cHQgc3RhdHVzL2VuYWJsZSBpcyBiaXRzIDE1OjAgZm9yIGNoYW5uZWxzIDE1IHRvIHplcm8uCi0gKi8KLSNkZWZpbmUgRERNQV9HTE9CQUxfQkFTRQkweGI0MDAzMDAwCi0jZGVmaW5lIERETUFfQ0hBTk5FTF9CQVNFCTB4YjQwMDIwMDAKLQogdHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfZ2xvYmFsIHsKIAl1MzIJZGRtYV9jb25maWc7CiAJdTMyCWRkbWFfaW50c3RhdDsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9ncGlvLWF1MTAwMC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2dwaW8tYXUxMDAwLmgKaW5kZXggNjJkMmYxMy4uMWY0MWE1MiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2dwaW8tYXUxMDAwLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2dwaW8tYXUxMDAwLmgKQEAgLTI0LDYgKzI0LDIzIEBACiAKICNkZWZpbmUgTUFLRV9JUlEoaW50Yywgb2ZmKQkoQVUxMDAwX0lOVEMjI2ludGMjI19JTlRfQkFTRSArIChvZmYpKQogCisvKiBHUElPMSByZWdpc3RlcnMgd2l0aGluIFNZU18gYXJlYSAqLworI2RlZmluZSBTWVNfVFJJT1VUUkQJCTB4MTAwCisjZGVmaW5lIFNZU19UUklPVVRDTFIJCTB4MTAwCisjZGVmaW5lIFNZU19PVVRQVVRSRAkJMHgxMDgKKyNkZWZpbmUgU1lTX09VVFBVVFNFVAkJMHgxMDgKKyNkZWZpbmUgU1lTX09VVFBVVENMUgkJMHgxMEMKKyNkZWZpbmUgU1lTX1BJTlNUQVRFUkQJCTB4MTEwCisjZGVmaW5lIFNZU19QSU5JTlBVVEVOCQkweDExMAorCisvKiByZWdpc3RlciBvZmZzZXRzIHdpdGhpbiBHUElPMiBibG9jayAqLworI2RlZmluZSBHUElPMl9ESVIJCTB4MDAKKyNkZWZpbmUgR1BJTzJfT1VUUFVUCQkweDA4CisjZGVmaW5lIEdQSU8yX1BJTlNUQVRFCQkweDBDCisjZGVmaW5lIEdQSU8yX0lOVEVOQUJMRQkJMHgxMAorI2RlZmluZSBHUElPMl9FTkFCTEUJCTB4MTQKKworc3RydWN0IGdwaW87CiAKIHN0YXRpYyBpbmxpbmUgaW50IGF1MTAwMF9ncGlvMV90b19pcnEoaW50IGdwaW8pCiB7CkBAIC0yMDAsMjMgKzIxNywyNiBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgYWxjaGVteV9ncGlvMV9zZXRfdmFsdWUoaW50IGdwaW8sIGludCB2KQogeworCXZvaWQgX19pb21lbSAqYmFzZSA9ICh2b2lkIF9faW9tZW0gKilLU0VHMUFERFIoQVUxMDAwX1NZU19QSFlTX0FERFIpOwogCXVuc2lnbmVkIGxvbmcgbWFzayA9IDEgPDwgKGdwaW8gLSBBTENIRU1ZX0dQSU8xX0JBU0UpOwogCXVuc2lnbmVkIGxvbmcgciA9IHYgPyBTWVNfT1VUUFVUU0VUIDogU1lTX09VVFBVVENMUjsKLQlhdV93cml0ZWwobWFzaywgcik7Ci0JYXVfc3luYygpOworCV9fcmF3X3dyaXRlbChtYXNrLCBiYXNlICsgcik7CisJd21iKCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGFsY2hlbXlfZ3BpbzFfZ2V0X3ZhbHVlKGludCBncGlvKQogeworCXZvaWQgX19pb21lbSAqYmFzZSA9ICh2b2lkIF9faW9tZW0gKilLU0VHMUFERFIoQVUxMDAwX1NZU19QSFlTX0FERFIpOwogCXVuc2lnbmVkIGxvbmcgbWFzayA9IDEgPDwgKGdwaW8gLSBBTENIRU1ZX0dQSU8xX0JBU0UpOwotCXJldHVybiBhdV9yZWFkbChTWVNfUElOU1RBVEVSRCkgJiBtYXNrOworCXJldHVybiBfX3Jhd19yZWFkbChiYXNlICsgU1lTX1BJTlNUQVRFUkQpICYgbWFzazsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgYWxjaGVteV9ncGlvMV9kaXJlY3Rpb25faW5wdXQoaW50IGdwaW8pCiB7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gKHZvaWQgX19pb21lbSAqKUtTRUcxQUREUihBVTEwMDBfU1lTX1BIWVNfQUREUik7CiAJdW5zaWduZWQgbG9uZyBtYXNrID0gMSA8PCAoZ3BpbyAtIEFMQ0hFTVlfR1BJTzFfQkFTRSk7Ci0JYXVfd3JpdGVsKG1hc2ssIFNZU19UUklPVVRDTFIpOwotCWF1X3N5bmMoKTsKKwlfX3Jhd193cml0ZWwobWFzaywgYmFzZSArIFNZU19UUklPVVRDTFIpOworCXdtYigpOwogCXJldHVybiAwOwogfQogCkBAIC0yNTcsMjcgKzI3NywzMSBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgX19hbGNoZW15X2dwaW8yX21vZF9kaXIoaW50IGdwaW8sIGludCB0b19vdXQpCiB7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gKHZvaWQgX19pb21lbSAqKUtTRUcxQUREUihBVTE1MDBfR1BJTzJfUEhZU19BRERSKTsKIAl1bnNpZ25lZCBsb25nIG1hc2sgPSAxIDw8IChncGlvIC0gQUxDSEVNWV9HUElPMl9CQVNFKTsKLQl1bnNpZ25lZCBsb25nIGQgPSBhdV9yZWFkbChHUElPMl9ESVIpOworCXVuc2lnbmVkIGxvbmcgZCA9IF9fcmF3X3JlYWRsKGJhc2UgKyBHUElPMl9ESVIpOworCiAJaWYgKHRvX291dCkKIAkJZCB8PSBtYXNrOwogCWVsc2UKIAkJZCAmPSB+bWFzazsKLQlhdV93cml0ZWwoZCwgR1BJTzJfRElSKTsKLQlhdV9zeW5jKCk7CisJX19yYXdfd3JpdGVsKGQsIGJhc2UgKyBHUElPMl9ESVIpOworCXdtYigpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYWxjaGVteV9ncGlvMl9zZXRfdmFsdWUoaW50IGdwaW8sIGludCB2KQogeworCXZvaWQgX19pb21lbSAqYmFzZSA9ICh2b2lkIF9faW9tZW0gKilLU0VHMUFERFIoQVUxNTAwX0dQSU8yX1BIWVNfQUREUik7CiAJdW5zaWduZWQgbG9uZyBtYXNrOwogCW1hc2sgPSAoKHYpID8gMHgwMDAxMDAwMSA6IDB4MDAwMTAwMDApIDw8IChncGlvIC0gQUxDSEVNWV9HUElPMl9CQVNFKTsKLQlhdV93cml0ZWwobWFzaywgR1BJTzJfT1VUUFVUKTsKLQlhdV9zeW5jKCk7CisJX19yYXdfd3JpdGVsKG1hc2ssIGJhc2UgKyBHUElPMl9PVVRQVVQpOworCXdtYigpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBhbGNoZW15X2dwaW8yX2dldF92YWx1ZShpbnQgZ3BpbykKIHsKLQlyZXR1cm4gYXVfcmVhZGwoR1BJTzJfUElOU1RBVEUpICYgKDEgPDwgKGdwaW8gLSBBTENIRU1ZX0dQSU8yX0JBU0UpKTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSAodm9pZCBfX2lvbWVtICopS1NFRzFBRERSKEFVMTUwMF9HUElPMl9QSFlTX0FERFIpOworCXJldHVybiBfX3Jhd19yZWFkbChiYXNlICsgR1BJTzJfUElOU1RBVEUpICYgKDEgPDwgKGdwaW8gLSBBTENIRU1ZX0dQSU8yX0JBU0UpKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgYWxjaGVteV9ncGlvMl9kaXJlY3Rpb25faW5wdXQoaW50IGdwaW8pCkBAIC0zMjksMjEgKzM1MywyMyBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgYWxjaGVteV9ncGlvMV9pbnB1dF9lbmFibGUodm9pZCkKIHsKLQlhdV93cml0ZWwoMCwgU1lTX1BJTklOUFVURU4pOwkvKiB0aGUgd3JpdGUgb3AgaXMga2V5ICovCi0JYXVfc3luYygpOworCXZvaWQgX19pb21lbSAqYmFzZSA9ICh2b2lkIF9faW9tZW0gKilLU0VHMUFERFIoQVUxMDAwX1NZU19QSFlTX0FERFIpOworCV9fcmF3X3dyaXRlbCgwLCBiYXNlICsgU1lTX1BJTklOUFVURU4pOwkvKiB0aGUgd3JpdGUgb3AgaXMga2V5ICovCisJd21iKCk7CiB9CiAKIC8qIEdQSU8yIHNoYXJlZCBpbnRlcnJ1cHRzIGFuZCBjb250cm9sICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2FsY2hlbXlfZ3BpbzJfbW9kX2ludChpbnQgZ3BpbzIsIGludCBlbikKIHsKLQl1bnNpZ25lZCBsb25nIHIgPSBhdV9yZWFkbChHUElPMl9JTlRFTkFCTEUpOworCXZvaWQgX19pb21lbSAqYmFzZSA9ICh2b2lkIF9faW9tZW0gKilLU0VHMUFERFIoQVUxNTAwX0dQSU8yX1BIWVNfQUREUik7CisJdW5zaWduZWQgbG9uZyByID0gX19yYXdfcmVhZGwoYmFzZSArIEdQSU8yX0lOVEVOQUJMRSk7CiAJaWYgKGVuKQogCQlyIHw9IDEgPDwgZ3BpbzI7CiAJZWxzZQogCQlyICY9IH4oMSA8PCBncGlvMik7Ci0JYXVfd3JpdGVsKHIsIEdQSU8yX0lOVEVOQUJMRSk7Ci0JYXVfc3luYygpOworCV9fcmF3X3dyaXRlbChyLCBiYXNlICsgR1BJTzJfSU5URU5BQkxFKTsKKwl3bWIoKTsKIH0KIAogLyoqCkBAIC00MTgsMTAgKzQ0NCwxMSBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgYWxjaGVteV9ncGlvMl9lbmFibGUodm9pZCkKIHsKLQlhdV93cml0ZWwoMywgR1BJTzJfRU5BQkxFKTsJLyogcmVzZXQsIGNsb2NrIGVuYWJsZWQgKi8KLQlhdV9zeW5jKCk7Ci0JYXVfd3JpdGVsKDEsIEdQSU8yX0VOQUJMRSk7CS8qIGNsb2NrIGVuYWJsZWQgKi8KLQlhdV9zeW5jKCk7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gKHZvaWQgX19pb21lbSAqKUtTRUcxQUREUihBVTE1MDBfR1BJTzJfUEhZU19BRERSKTsKKwlfX3Jhd193cml0ZWwoMywgYmFzZSArIEdQSU8yX0VOQUJMRSk7CS8qIHJlc2V0LCBjbG9jayBlbmFibGVkICovCisJd21iKCk7CisJX19yYXdfd3JpdGVsKDEsIGJhc2UgKyBHUElPMl9FTkFCTEUpOwkvKiBjbG9jayBlbmFibGVkICovCisJd21iKCk7CiB9CiAKIC8qKgpAQCAtNDMxLDggKzQ1OCw5IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBhbGNoZW15X2dwaW8yX2Rpc2FibGUodm9pZCkKIHsKLQlhdV93cml0ZWwoMiwgR1BJTzJfRU5BQkxFKTsJLyogcmVzZXQsIGNsb2NrIGRpc2FibGVkICovCi0JYXVfc3luYygpOworCXZvaWQgX19pb21lbSAqYmFzZSA9ICh2b2lkIF9faW9tZW0gKilLU0VHMUFERFIoQVUxNTAwX0dQSU8yX1BIWVNfQUREUik7CisJX19yYXdfd3JpdGVsKDIsIGJhc2UgKyBHUElPMl9FTkFCTEUpOwkvKiByZXNldCwgY2xvY2sgZGlzYWJsZWQgKi8KKwl3bWIoKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC01NTYsNiArNTg0LDE2IEBACiAJYWxjaGVteV9ncGlvX3NldF92YWx1ZShncGlvLCB2KTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgZ3Bpb19nZXRfdmFsdWVfY2Fuc2xlZXAodW5zaWduZWQgZ3BpbykKK3sKKwlyZXR1cm4gZ3Bpb19nZXRfdmFsdWUoZ3Bpbyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBncGlvX3NldF92YWx1ZV9jYW5zbGVlcCh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCit7CisJZ3Bpb19zZXRfdmFsdWUoZ3BpbywgdmFsdWUpOworfQorCiBzdGF0aWMgaW5saW5lIGludCBncGlvX2lzX3ZhbGlkKGludCBncGlvKQogewogCXJldHVybiBhbGNoZW15X2dwaW9faXNfdmFsaWQoZ3Bpbyk7CkBAIC01ODEsMTAgKzYxOSw1MCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIGludCBncGlvX3JlcXVlc3Rfb25lKHVuc2lnbmVkIGdwaW8sCisJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmxhYmVsKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBncGlvX3JlcXVlc3RfYXJyYXkoc3RydWN0IGdwaW8gKmFycmF5LCBzaXplX3QgbnVtKQoreworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgZ3Bpb19mcmVlKHVuc2lnbmVkIGdwaW8pCiB7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBncGlvX2ZyZWVfYXJyYXkoc3RydWN0IGdwaW8gKmFycmF5LCBzaXplX3QgbnVtKQoreworfQorCitzdGF0aWMgaW5saW5lIGludCBncGlvX3NldF9kZWJvdW5jZSh1bnNpZ25lZCBncGlvLCB1bnNpZ25lZCBkZWJvdW5jZSkKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ3Bpb19leHBvcnQodW5zaWduZWQgZ3BpbywgYm9vbCBkaXJlY3Rpb25fbWF5X2NoYW5nZSkKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ3Bpb19leHBvcnRfbGluayhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgdW5zaWduZWQgZ3BpbykKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ3Bpb19zeXNmc19zZXRfYWN0aXZlX2xvdyh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBncGlvX3VuZXhwb3J0KHVuc2lnbmVkIGdwaW8pCit7Cit9CisKICNlbmRpZgkvKiAhQ09ORklHX0FMQ0hFTVlfR1BJT19JTkRJUkVDVCAqLwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWJjbTQ3eHgvbnZyYW0uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWJjbTQ3eHgvbnZyYW0uaAppbmRleCA5NzU5NTg4Li4xODRkNWVjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1iY200N3h4L252cmFtLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYmNtNDd4eC9udnJhbS5oCkBAIC0zOSw4ICszOSwxNiBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgbnZyYW1fcGFyc2VfbWFjYWRkcihjaGFyICpidWYsIHU4ICptYWNhZGRyKQogewotCXNzY2FuZihidWYsICIlaGh4OiVoaHg6JWhoeDolaGh4OiVoaHg6JWhoeCIsICZtYWNhZGRyWzBdLCAmbWFjYWRkclsxXSwKLQkgICAgICAgJm1hY2FkZHJbMl0sICZtYWNhZGRyWzNdLCAmbWFjYWRkcls0XSwgJm1hY2FkZHJbNV0pOworCWlmIChzdHJjaHIoYnVmLCAnOicpKQorCQlzc2NhbmYoYnVmLCAiJWhoeDolaGh4OiVoaHg6JWhoeDolaGh4OiVoaHgiLCAmbWFjYWRkclswXSwKKwkJCSZtYWNhZGRyWzFdLCAmbWFjYWRkclsyXSwgJm1hY2FkZHJbM10sICZtYWNhZGRyWzRdLAorCQkJJm1hY2FkZHJbNV0pOworCWVsc2UgaWYgKHN0cmNocihidWYsICctJykpCisJCXNzY2FuZihidWYsICIlaGh4LSVoaHgtJWhoeC0laGh4LSVoaHgtJWhoeCIsICZtYWNhZGRyWzBdLAorCQkJJm1hY2FkZHJbMV0sICZtYWNhZGRyWzJdLCAmbWFjYWRkclszXSwgJm1hY2FkZHJbNF0sCisJCQkmbWFjYWRkcls1XSk7CisJZWxzZQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4gbm90IHBhcnNlIG1hYyBhZGRyZXNzOiAlc1xuIiwgYnVmKTsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1jYXZpdW0tb2N0ZW9uL2tlcm5lbC1lbnRyeS1pbml0LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1jYXZpdW0tb2N0ZW9uL2tlcm5lbC1lbnRyeS1pbml0LmgKaW5kZXggMGIyYjVlYi4uZGVkZWY3ZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtY2F2aXVtLW9jdGVvbi9rZXJuZWwtZW50cnktaW5pdC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWNhdml1bS1vY3Rlb24va2VybmVsLWVudHJ5LWluaXQuaApAQCAtNjMsNiArNjMsMTEgQEAKIAkjIENOMzBYWCBEaXNhYmxlIGluc3RydWN0aW9uIHByZWZldGNoaW5nCiAJb3IgIHYwLCB2MCwgMHgyMDAwCiBza2lwOgorCSMgRmlyc3QgY2xlYXIgb2ZmIEN2bUN0bFtJUFBDSV0gYml0IGFuZCBtb3ZlIHRoZSBwZXJmb3JtYW5jZQorCSMgY291bnRlcnMgaW50ZXJydXB0IHRvIElSUSA2CisJbGkJdjEsIH4oNyA8PCA3KQorCWFuZAl2MCwgdjAsIHYxCisJb3JpCXYwLCB2MCwgKDYgPDwgNykKIAkjIFdyaXRlIHRoZSBjYXZpdW0gY29udHJvbCByZWdpc3RlcgogCWRtdGMwICAgdjAsIENQMF9DVk1DVExfUkVHCiAJc3luYwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbGFudGlxL2xhbnRpcS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbGFudGlxL2xhbnRpcS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMmYwMjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sYW50aXEvbGFudGlxLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAorICogIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBKb2huIENyaXNwaW4gPGJsb2dpY0BvcGVud3J0Lm9yZz4KKyAqLworI2lmbmRlZiBfTEFOVElRX0hfXworI2RlZmluZSBfTEFOVElRX0hfXworCisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisKKy8qIGdlbmVyaWMgcmVnIGFjY2VzcyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgbHRxX3IzMihyZWcpCQlfX3Jhd19yZWFkbChyZWcpCisjZGVmaW5lIGx0cV93MzIodmFsLCByZWcpCV9fcmF3X3dyaXRlbCh2YWwsIHJlZykKKyNkZWZpbmUgbHRxX3czMl9tYXNrKGNsZWFyLCBzZXQsIHJlZykJXAorCWx0cV93MzIoKGx0cV9yMzIocmVnKSAmIH4oY2xlYXIpKSB8IChzZXQpLCByZWcpCisjZGVmaW5lIGx0cV9yOChyZWcpCQlfX3Jhd19yZWFkYihyZWcpCisjZGVmaW5lIGx0cV93OCh2YWwsIHJlZykJX19yYXdfd3JpdGViKHZhbCwgcmVnKQorCisvKiByZWdpc3RlciBhY2Nlc3MgbWFjcm9zIGZvciBFQlUgYW5kIENHVSAqLworI2RlZmluZSBsdHFfZWJ1X3czMih4LCB5KQlsdHFfdzMyKCh4KSwgbHRxX2VidV9tZW1iYXNlICsgKHkpKQorI2RlZmluZSBsdHFfZWJ1X3IzMih4KQkJbHRxX3IzMihsdHFfZWJ1X21lbWJhc2UgKyAoeCkpCisjZGVmaW5lIGx0cV9jZ3VfdzMyKHgsIHkpCWx0cV93MzIoKHgpLCBsdHFfY2d1X21lbWJhc2UgKyAoeSkpCisjZGVmaW5lIGx0cV9jZ3VfcjMyKHgpCQlsdHFfcjMyKGx0cV9jZ3VfbWVtYmFzZSArICh4KSkKKworZXh0ZXJuIF9faW9tZW0gdm9pZCAqbHRxX2VidV9tZW1iYXNlOworZXh0ZXJuIF9faW9tZW0gdm9pZCAqbHRxX2NndV9tZW1iYXNlOworCitleHRlcm4gdW5zaWduZWQgaW50IGx0cV9nZXRfY3B1X3Zlcih2b2lkKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbHRxX2dldF9zb2NfdHlwZSh2b2lkKTsKKworLyogY2xvY2sgc3BlZWRzICovCisjZGVmaW5lIENMT0NLXzYwTQk2MDAwMDAwMAorI2RlZmluZSBDTE9DS184M00JODMzMzMzMzMKKyNkZWZpbmUgQ0xPQ0tfMTExTQkxMTExMTExMTEKKyNkZWZpbmUgQ0xPQ0tfMTMzTQkxMzMzMzMzMzMKKyNkZWZpbmUgQ0xPQ0tfMTY3TQkxNjY2NjY2NjcKKyNkZWZpbmUgQ0xPQ0tfMjAwTQkyMDAwMDAwMDAKKyNkZWZpbmUgQ0xPQ0tfMjY2TQkyNjY2NjY2NjYKKyNkZWZpbmUgQ0xPQ0tfMzMzTQkzMzMzMzMzMzMKKyNkZWZpbmUgQ0xPQ0tfNDAwTQk0MDAwMDAwMDAKKworLyogc3BpbmxvY2sgYWxsIGVidSBpL28gKi8KK2V4dGVybiBzcGlubG9ja190IGVidV9sb2NrOworCisvKiBzb21lIGlycSBoZWxwZXJzICovCitleHRlcm4gdm9pZCBsdHFfZGlzYWJsZV9pcnEoc3RydWN0IGlycV9kYXRhICpkYXRhKTsKK2V4dGVybiB2b2lkIGx0cV9tYXNrX2FuZF9hY2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSk7CitleHRlcm4gdm9pZCBsdHFfZW5hYmxlX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpOworCisvKiBmaW5kIG91dCB3aGF0IGNhdXNlZCB0aGUgbGFzdCBjcHUgcmVzZXQgKi8KK2V4dGVybiBpbnQgbHRxX3Jlc2V0X2NhdXNlKHZvaWQpOworI2RlZmluZSBMVFFfUlNUX0NBVVNFX1dEVFJTVAkweDIwCisKKyNkZWZpbmUgSU9QT1JUX1JFU09VUkNFX1NUQVJUCTB4MTAwMDAwMDAKKyNkZWZpbmUgSU9QT1JUX1JFU09VUkNFX0VORAkweGZmZmZmZmZmCisjZGVmaW5lIElPTUVNX1JFU09VUkNFX1NUQVJUCTB4MTAwMDAwMDAKKyNkZWZpbmUgSU9NRU1fUkVTT1VSQ0VfRU5ECTB4ZmZmZmZmZmYKKyNkZWZpbmUgTFRRX0ZMQVNIX1NUQVJUCQkweDEwMDAwMDAwCisjZGVmaW5lIExUUV9GTEFTSF9NQVgJCTB4MDQwMDAwMDAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sYW50aXEvbGFudGlxX3BsYXRmb3JtLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sYW50aXEvbGFudGlxX3BsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMwNWYxZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxhbnRpcS9sYW50aXFfcGxhdGZvcm0uaApAQCAtMCwwICsxLDUzIEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIEpvaG4gQ3Jpc3BpbiA8YmxvZ2ljQG9wZW53cnQub3JnPgorICovCisKKyNpZm5kZWYgX0xBTlRJUV9QTEFURk9STV9IX18KKyNkZWZpbmUgX0xBTlRJUV9QTEFURk9STV9IX18KKworI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisKKy8qIHN0cnVjdCB1c2VkIHRvIHBhc3MgaW5mbyB0byB0aGUgcGNpIGNvcmUgKi8KK2VudW0geworCVBDSV9DTE9DS19JTlQgPSAwLAorCVBDSV9DTE9DS19FWFQKK307CisKKyNkZWZpbmUgUENJX0VYSU4wCTB4MDAwMQorI2RlZmluZSBQQ0lfRVhJTjEJMHgwMDAyCisjZGVmaW5lIFBDSV9FWElOMgkweDAwMDQKKyNkZWZpbmUgUENJX0VYSU4zCTB4MDAwOAorI2RlZmluZSBQQ0lfRVhJTjQJMHgwMDEwCisjZGVmaW5lIFBDSV9FWElONQkweDAwMjAKKyNkZWZpbmUgUENJX0VYSU5fTUFYCTYKKworI2RlZmluZSBQQ0lfR05UMQkweDAwNDAKKyNkZWZpbmUgUENJX0dOVDIJMHgwMDgwCisjZGVmaW5lIFBDSV9HTlQzCTB4MDEwMAorI2RlZmluZSBQQ0lfR05UNAkweDAyMDAKKworI2RlZmluZSBQQ0lfUkVRMQkweDA0MDAKKyNkZWZpbmUgUENJX1JFUTIJMHgwODAwCisjZGVmaW5lIFBDSV9SRVEzCTB4MTAwMAorI2RlZmluZSBQQ0lfUkVRNAkweDIwMDAKKyNkZWZpbmUgUENJX1JFUV9TSElGVAkxMAorI2RlZmluZSBQQ0lfUkVRX01BU0sJMHhmCisKK3N0cnVjdCBsdHFfcGNpX2RhdGEgeworCWludCBjbG9jazsKKwlpbnQgZ3BpbzsKKwlpbnQgaXJxWzE2XTsKK307CisKKy8qIHN0cnVjdCB1c2VkIHRvIHBhc3MgaW5mbyB0byBuZXR3b3JrIGRyaXZlcnMgKi8KK3N0cnVjdCBsdHFfZXRoX2RhdGEgeworCXN0cnVjdCBzb2NrYWRkciBtYWM7CisJaW50IG1paV9tb2RlOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sYW50aXEvd2FyLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sYW50aXEvd2FyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFiMDhlZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxhbnRpcS93YXIuaApAQCAtMCwwICsxLDI0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisjaWZuZGVmIF9fQVNNX01JUFNfTUFDSF9MQU5USVFfV0FSX0gKKyNkZWZpbmUgX19BU01fTUlQU19NQUNIX0xBTlRJUV9XQVJfSAorCisjZGVmaW5lIFI0NjAwX1YxX0lOREVYX0lDQUNIRU9QX1dBUiAgICAgMAorI2RlZmluZSBSNDYwMF9WMV9ISVRfQ0FDSEVPUF9XQVIgICAgICAgIDAKKyNkZWZpbmUgUjQ2MDBfVjJfSElUX0NBQ0hFT1BfV0FSICAgICAgICAwCisjZGVmaW5lIFI1NDMyX0NQMF9JTlRFUlJVUFRfV0FSICAgICAgICAgMAorI2RlZmluZSBCQ00xMjUwX00zX1dBUiAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU0lCWVRFXzE5NTZfV0FSICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1JUFM0S19JQ0FDSEVfUkVGSUxMX1dBUiAgICAgICAgMAorI2RlZmluZSBNSVBTX0NBQ0hFX1NZTkNfV0FSICAgICAgICAgICAgIDAKKyNkZWZpbmUgVFg0OVhYX0lDQUNIRV9JTkRFWF9JTlZfV0FSICAgICAwCisjZGVmaW5lIFJNOTAwMF9DREVYX1NNUF9XQVIgICAgICAgICAgICAgMAorI2RlZmluZSBJQ0FDSEVfUkVGSUxMU19XT1JLQVJPVU5EX1dBUiAgIDAKKyNkZWZpbmUgUjEwMDAwX0xMU0NfV0FSICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1JUFMzNEtfTUlTU0VEX0lUTEJfV0FSICAgICAgICAgMAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxhbnRpcS94d2F5L2lycS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbGFudGlxL3h3YXkvaXJxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE0NzFkMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxhbnRpcS94d2F5L2lycS5oCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgSm9obiBDcmlzcGluIDxibG9naWNAb3BlbndydC5vcmc+CisgKi8KKworI2lmbmRlZiBfX0xBTlRJUV9JUlFfSAorI2RlZmluZSBfX0xBTlRJUV9JUlFfSAorCisjaW5jbHVkZSA8bGFudGlxX2lycS5oPgorCisjZGVmaW5lIE5SX0lSUVMgMjU2CisKKyNpbmNsdWRlX25leHQgPGlycS5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxhbnRpcS94d2F5L2xhbnRpcV9pcnEuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxhbnRpcS94d2F5L2xhbnRpcV9pcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDQ2NWE4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbGFudGlxL3h3YXkvbGFudGlxX2lycS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgSm9obiBDcmlzcGluIDxibG9naWNAb3BlbndydC5vcmc+CisgKi8KKworI2lmbmRlZiBfTEFOVElRX1hXQVlfSVJRX0hfXworI2RlZmluZSBfTEFOVElRX1hXQVlfSVJRX0hfXworCisjZGVmaW5lIElOVF9OVU1fSVJRMAkJOAorI2RlZmluZSBJTlRfTlVNX0lNMF9JUkwwCShJTlRfTlVNX0lSUTAgKyAwKQorI2RlZmluZSBJTlRfTlVNX0lNMV9JUkwwCShJTlRfTlVNX0lSUTAgKyAzMikKKyNkZWZpbmUgSU5UX05VTV9JTTJfSVJMMAkoSU5UX05VTV9JUlEwICsgNjQpCisjZGVmaW5lIElOVF9OVU1fSU0zX0lSTDAJKElOVF9OVU1fSVJRMCArIDk2KQorI2RlZmluZSBJTlRfTlVNX0lNNF9JUkwwCShJTlRfTlVNX0lSUTAgKyAxMjgpCisjZGVmaW5lIElOVF9OVU1fSU1fT0ZGU0VUCShJTlRfTlVNX0lNMV9JUkwwIC0gSU5UX05VTV9JTTBfSVJMMCkKKworI2RlZmluZSBMVFFfQVNDX1RJUih4KQkJKElOVF9OVU1fSU0zX0lSTDAgKyAoeCAqIDgpKQorI2RlZmluZSBMVFFfQVNDX1JJUih4KQkJKElOVF9OVU1fSU0zX0lSTDAgKyAoeCAqIDgpICsgMSkKKyNkZWZpbmUgTFRRX0FTQ19FSVIoeCkJCShJTlRfTlVNX0lNM19JUkwwICsgKHggKiA4KSArIDIpCisKKyNkZWZpbmUgTFRRX0FTQ19BU0VfVElSCQlJTlRfTlVNX0lNMl9JUkwwCisjZGVmaW5lIExUUV9BU0NfQVNFX1JJUgkJKElOVF9OVU1fSU0yX0lSTDAgKyAyKQorI2RlZmluZSBMVFFfQVNDX0FTRV9FSVIJCShJTlRfTlVNX0lNMl9JUkwwICsgMykKKworI2RlZmluZSBMVFFfU1NDX1RJUgkJKElOVF9OVU1fSU0wX0lSTDAgKyAxNSkKKyNkZWZpbmUgTFRRX1NTQ19SSVIJCShJTlRfTlVNX0lNMF9JUkwwICsgMTQpCisjZGVmaW5lIExUUV9TU0NfRUlSCQkoSU5UX05VTV9JTTBfSVJMMCArIDE2KQorCisjZGVmaW5lIExUUV9NRUlfRFlJTkdfR0FTUF9JTlQJKElOVF9OVU1fSU0xX0lSTDAgKyAyMSkKKyNkZWZpbmUgTFRRX01FSV9JTlQJCShJTlRfTlVNX0lNMV9JUkwwICsgMjMpCisKKyNkZWZpbmUgTFRRX1RJTUVSNl9JTlQJCShJTlRfTlVNX0lNMV9JUkwwICsgMjMpCisjZGVmaW5lIExUUV9VU0JfSU5UCQkoSU5UX05VTV9JTTFfSVJMMCArIDIyKQorI2RlZmluZSBMVFFfVVNCX09DX0lOVAkJKElOVF9OVU1fSU00X0lSTDAgKyAyMykKKworI2RlZmluZSBNSVBTX0NQVV9USU1FUl9JUlEJCTcKKworI2RlZmluZSBMVFFfRE1BX0NIMF9JTlQJCShJTlRfTlVNX0lNMl9JUkwwKQorI2RlZmluZSBMVFFfRE1BX0NIMV9JTlQJCShJTlRfTlVNX0lNMl9JUkwwICsgMSkKKyNkZWZpbmUgTFRRX0RNQV9DSDJfSU5UCQkoSU5UX05VTV9JTTJfSVJMMCArIDIpCisjZGVmaW5lIExUUV9ETUFfQ0gzX0lOVAkJKElOVF9OVU1fSU0yX0lSTDAgKyAzKQorI2RlZmluZSBMVFFfRE1BX0NINF9JTlQJCShJTlRfTlVNX0lNMl9JUkwwICsgNCkKKyNkZWZpbmUgTFRRX0RNQV9DSDVfSU5UCQkoSU5UX05VTV9JTTJfSVJMMCArIDUpCisjZGVmaW5lIExUUV9ETUFfQ0g2X0lOVAkJKElOVF9OVU1fSU0yX0lSTDAgKyA2KQorI2RlZmluZSBMVFFfRE1BX0NIN19JTlQJCShJTlRfTlVNX0lNMl9JUkwwICsgNykKKyNkZWZpbmUgTFRRX0RNQV9DSDhfSU5UCQkoSU5UX05VTV9JTTJfSVJMMCArIDgpCisjZGVmaW5lIExUUV9ETUFfQ0g5X0lOVAkJKElOVF9OVU1fSU0yX0lSTDAgKyA5KQorI2RlZmluZSBMVFFfRE1BX0NIMTBfSU5UCShJTlRfTlVNX0lNMl9JUkwwICsgMTApCisjZGVmaW5lIExUUV9ETUFfQ0gxMV9JTlQJKElOVF9OVU1fSU0yX0lSTDAgKyAxMSkKKyNkZWZpbmUgTFRRX0RNQV9DSDEyX0lOVAkoSU5UX05VTV9JTTJfSVJMMCArIDI1KQorI2RlZmluZSBMVFFfRE1BX0NIMTNfSU5UCShJTlRfTlVNX0lNMl9JUkwwICsgMjYpCisjZGVmaW5lIExUUV9ETUFfQ0gxNF9JTlQJKElOVF9OVU1fSU0yX0lSTDAgKyAyNykKKyNkZWZpbmUgTFRRX0RNQV9DSDE1X0lOVAkoSU5UX05VTV9JTTJfSVJMMCArIDI4KQorI2RlZmluZSBMVFFfRE1BX0NIMTZfSU5UCShJTlRfTlVNX0lNMl9JUkwwICsgMjkpCisjZGVmaW5lIExUUV9ETUFfQ0gxN19JTlQJKElOVF9OVU1fSU0yX0lSTDAgKyAzMCkKKyNkZWZpbmUgTFRRX0RNQV9DSDE4X0lOVAkoSU5UX05VTV9JTTJfSVJMMCArIDE2KQorI2RlZmluZSBMVFFfRE1BX0NIMTlfSU5UCShJTlRfTlVNX0lNMl9JUkwwICsgMjEpCisKKyNkZWZpbmUgTFRRX1BQRV9NQk9YX0lOVAkoSU5UX05VTV9JTTJfSVJMMCArIDI0KQorCisjZGVmaW5lIElOVF9OVU1fSU00X0lSTDE0CShJTlRfTlVNX0lNNF9JUkwwICsgMTQpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbGFudGlxL3h3YXkvbGFudGlxX3NvYy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbGFudGlxL3h3YXkvbGFudGlxX3NvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhM2M2YmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sYW50aXEveHdheS9sYW50aXFfc29jLmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgSm9obiBDcmlzcGluIDxibG9naWNAb3BlbndydC5vcmc+CisgKi8KKworI2lmbmRlZiBfTFRRX1hXQVlfSF9fCisjZGVmaW5lIF9MVFFfWFdBWV9IX18KKworI2lmZGVmIENPTkZJR19TT0NfVFlQRV9YV0FZCisKKyNpbmNsdWRlIDxsYW50aXEuaD4KKworLyogQ2hpcCBJRHMgKi8KKyNkZWZpbmUgU09DX0lEX0RBTlVCRTEJCTB4MTI5CisjZGVmaW5lIFNPQ19JRF9EQU5VQkUyCQkweDEyQgorI2RlZmluZSBTT0NfSURfVFdJTlBBU1MJCTB4MTJECisjZGVmaW5lIFNPQ19JRF9BTUFaT05fU0UJMHgxNTIKKyNkZWZpbmUgU09DX0lEX0FSWDE4OAkJMHgxNkMKKyNkZWZpbmUgU09DX0lEX0FSWDE2OAkJMHgxNkQKKyNkZWZpbmUgU09DX0lEX0FSWDE4MgkJMHgxNkYKKworLyogU29DIFR5cGVzICovCisjZGVmaW5lIFNPQ19UWVBFX0RBTlVCRQkJMHgwMQorI2RlZmluZSBTT0NfVFlQRV9UV0lOUEFTUwkweDAyCisjZGVmaW5lIFNPQ19UWVBFX0FSOQkJMHgwMworI2RlZmluZSBTT0NfVFlQRV9WUjkJCTB4MDQKKyNkZWZpbmUgU09DX1RZUEVfQU1BWk9OX1NFCTB4MDUKKworLyogQVNDMC8xIC0gc2VyaWFsIHBvcnQgKi8KKyNkZWZpbmUgTFRRX0FTQzBfQkFTRV9BRERSCTB4MUUxMDA0MDAKKyNkZWZpbmUgTFRRX0FTQzFfQkFTRV9BRERSCTB4MUUxMDBDMDAKKyNkZWZpbmUgTFRRX0FTQ19TSVpFCQkweDQwMAorCisvKiBSQ1UgLSByZXNldCBjb250cm9sIHVuaXQgKi8KKyNkZWZpbmUgTFRRX1JDVV9CQVNFX0FERFIJMHgxRjIwMzAwMAorI2RlZmluZSBMVFFfUkNVX1NJWkUJCTB4MTAwMAorCisvKiBHUFRVIC0gZ2VuZXJhbCBwdXJwb3NlIHRpbWVyIHVuaXQgKi8KKyNkZWZpbmUgTFRRX0dQVFVfQkFTRV9BRERSCTB4MTgwMDAzMDAKKyNkZWZpbmUgTFRRX0dQVFVfU0laRQkJMHgxMDAKKworLyogRUJVIC0gZXh0ZXJuYWwgYnVzIHVuaXQgKi8KKyNkZWZpbmUgTFRRX0VCVV9HUElPX1NUQVJUCTB4MTQwMDAwMDAKKyNkZWZpbmUgTFRRX0VCVV9HUElPX1NJWkUJMHgxMDAwCisKKyNkZWZpbmUgTFRRX0VCVV9CQVNFX0FERFIJMHgxRTEwNTMwMAorI2RlZmluZSBMVFFfRUJVX1NJWkUJCTB4MTAwCisKKyNkZWZpbmUgTFRRX0VCVV9CVVNDT04wCQkweDAwNjAKKyNkZWZpbmUgTFRRX0VCVV9QQ0NfQ09OCQkweDAwOTAKKyNkZWZpbmUgTFRRX0VCVV9QQ0NfSUVOCQkweDAwQTQKKyNkZWZpbmUgTFRRX0VCVV9QQ0NfSVNUQVQJMHgwMEEwCisjZGVmaW5lIExUUV9FQlVfQlVTQ09OMQkJMHgwMDY0CisjZGVmaW5lIExUUV9FQlVfQUREUlNFTDEJMHgwMDI0CisjZGVmaW5lIEVCVV9XUkRJUwkJMHg4MDAwMDAwMAorCisvKiBDR1UgLSBjbG9jayBnZW5lcmF0aW9uIHVuaXQgKi8KKyNkZWZpbmUgTFRRX0NHVV9CQVNFX0FERFIJMHgxRjEwMzAwMAorI2RlZmluZSBMVFFfQ0dVX1NJWkUJCTB4MTAwMAorCisvKiBJQ1UgLSBpbnRlcnJ1cHQgY29udHJvbCB1bml0ICovCisjZGVmaW5lIExUUV9JQ1VfQkFTRV9BRERSCTB4MUY4ODAyMDAKKyNkZWZpbmUgTFRRX0lDVV9TSVpFCQkweDEwMAorCisvKiBFSVUgLSBleHRlcm5hbCBpbnRlcnJ1cHQgdW5pdCAqLworI2RlZmluZSBMVFFfRUlVX0JBU0VfQUREUgkweDFGMTAxMDAwCisjZGVmaW5lIExUUV9FSVVfU0laRQkJMHgxMDAwCisKKy8qIFBNVSAtIHBvd2VyIG1hbmFnZW1lbnQgdW5pdCAqLworI2RlZmluZSBMVFFfUE1VX0JBU0VfQUREUgkweDFGMTAyMDAwCisjZGVmaW5lIExUUV9QTVVfU0laRQkJMHgxMDAwCisKKyNkZWZpbmUgUE1VX0RNQQkJCTB4MDAyMAorI2RlZmluZSBQTVVfVVNCCQkJMHg4MDQxCisjZGVmaW5lIFBNVV9MRUQJCQkweDA4MDAKKyNkZWZpbmUgUE1VX0dQVAkJCTB4MTAwMAorI2RlZmluZSBQTVVfUFBFCQkJMHgyMDAwCisjZGVmaW5lIFBNVV9GUEkJCQkweDQwMDAKKyNkZWZpbmUgUE1VX1NXSVRDSAkJMHgxMDAwMDAwMAorCisvKiBFVE9QIC0gZXRoZXJuZXQgKi8KKyNkZWZpbmUgTFRRX0VUT1BfQkFTRV9BRERSCTB4MUUxODAwMDAKKyNkZWZpbmUgTFRRX0VUT1BfU0laRQkJMHg0MDAwMAorCisvKiBETUEgKi8KKyNkZWZpbmUgTFRRX0RNQV9CQVNFX0FERFIJMHgxRTEwNDEwMAorI2RlZmluZSBMVFFfRE1BX1NJWkUJCTB4ODAwCisKKy8qIFBDSSAqLworI2RlZmluZSBQQ0lfQ1JfQkFTRV9BRERSCTB4MUUxMDU0MDAKKyNkZWZpbmUgUENJX0NSX1NJWkUJCTB4NDAwCisKKy8qIFdEVCAqLworI2RlZmluZSBMVFFfV0RUX0JBU0VfQUREUgkweDFGODgwM0YwCisjZGVmaW5lIExUUV9XRFRfU0laRQkJMHgxMAorCisvKiBTVFAgLSBzZXJpYWwgdG8gcGFyYWxsZWwgY29udmVyc2lvbiB1bml0ICovCisjZGVmaW5lIExUUV9TVFBfQkFTRV9BRERSCTB4MUUxMDBCQjAKKyNkZWZpbmUgTFRRX1NUUF9TSVpFCQkweDQwCisKKy8qIEdQSU8gKi8KKyNkZWZpbmUgTFRRX0dQSU8wX0JBU0VfQUREUgkweDFFMTAwQjEwCisjZGVmaW5lIExUUV9HUElPMV9CQVNFX0FERFIJMHgxRTEwMEI0MAorI2RlZmluZSBMVFFfR1BJTzJfQkFTRV9BRERSCTB4MUUxMDBCNzAKKyNkZWZpbmUgTFRRX0dQSU9fU0laRQkJMHgzMAorCisvKiBTU0MgKi8KKyNkZWZpbmUgTFRRX1NTQ19CQVNFX0FERFIJMHgxZTEwMDgwMAorI2RlZmluZSBMVFFfU1NDX1NJWkUJCTB4MTAwCisKKy8qIE1FSSAtIGRzbCBjb3JlICovCisjZGVmaW5lIExUUV9NRUlfQkFTRV9BRERSCTB4MUUxMTYwMDAKKworLyogREVVIC0gZGF0YSBlbmNyeXB0aW9uIHVuaXQgKi8KKyNkZWZpbmUgTFRRX0RFVV9CQVNFX0FERFIJMHgxRTEwMzEwMAorCisvKiBNUFMgLSBtdWx0aSBwcm9jZXNzb3IgdW5pdCAodm9pY2UpICovCisjZGVmaW5lIExUUV9NUFNfQkFTRV9BRERSCShLU0VHMSArIDB4MUYxMDcwMDApCisjZGVmaW5lIExUUV9NUFNfQ0hJUElECQkoKHUzMiAqKShMVFFfTVBTX0JBU0VfQUREUiArIDB4MDM0NCkpCisKKy8qIHJlcXVlc3QgYSBub24tZ3BpbyBhbmQgc2V0IHRoZSBQSU8gY29uZmlnICovCitleHRlcm4gaW50ICBsdHFfZ3Bpb19yZXF1ZXN0KHVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGludCBhbHQwLAorCXVuc2lnbmVkIGludCBhbHQxLCB1bnNpZ25lZCBpbnQgZGlyLCBjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiB2b2lkIGx0cV9wbXVfZW5hYmxlKHVuc2lnbmVkIGludCBtb2R1bGUpOworZXh0ZXJuIHZvaWQgbHRxX3BtdV9kaXNhYmxlKHVuc2lnbmVkIGludCBtb2R1bGUpOworCitzdGF0aWMgaW5saW5lIGludCBsdHFfaXNfYXI5KHZvaWQpCit7CisJcmV0dXJuIChsdHFfZ2V0X3NvY190eXBlKCkgPT0gU09DX1RZUEVfQVI5KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbHRxX2lzX3ZyOSh2b2lkKQoreworCXJldHVybiAobHRxX2dldF9zb2NfdHlwZSgpID09IFNPQ19UWVBFX1ZSOSk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfU09DX1RZUEVfWFdBWSAqLworI2VuZGlmIC8qIF9MVFFfWFdBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxhbnRpcS94d2F5L3h3YXlfZG1hLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sYW50aXEveHdheS94d2F5X2RtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3Mjk0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sYW50aXEveHdheS94d2F5X2RtYS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAorICogICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiAgIENvcHlyaWdodCAoQykgMjAxMSBKb2huIENyaXNwaW4gPGJsb2dpY0BvcGVud3J0Lm9yZz4KKyAqLworCisjaWZuZGVmIExUUV9ETUFfSF9fCisjZGVmaW5lIExUUV9ETUFfSF9fCisKKyNkZWZpbmUgTFRRX0RFU0NfU0laRQkJMHgwOAkvKiBlYWNoIGRlc2NyaXB0b3IgaXMgNjRiaXQgKi8KKyNkZWZpbmUgTFRRX0RFU0NfTlVNCQkweDQwCS8qIDY0IGRlc2NyaXB0b3JzIC8gY2hhbm5lbCAqLworCisjZGVmaW5lIExUUV9ETUFfT1dOCQlCSVQoMzEpCS8qIG93bmVyIGJpdCAqLworI2RlZmluZSBMVFFfRE1BX0MJCUJJVCgzMCkgLyogY29tcGxldGUgYml0ICovCisjZGVmaW5lIExUUV9ETUFfU09QCQlCSVQoMjkpIC8qIHN0YXJ0IG9mIHBhY2tldCAqLworI2RlZmluZSBMVFFfRE1BX0VPUAkJQklUKDI4KSAvKiBlbmQgb2YgcGFja2V0ICovCisjZGVmaW5lIExUUV9ETUFfVFhfT0ZGU0VUKHgpCSgoeCAmIDB4MWYpIDw8IDIzKSAvKiBkYXRhIGJ5dGVzIG9mZnNldCAqLworI2RlZmluZSBMVFFfRE1BX1JYX09GRlNFVCh4KQkoKHggJiAweDcpIDw8IDIzKSAvKiBkYXRhIGJ5dGVzIG9mZnNldCAqLworI2RlZmluZSBMVFFfRE1BX1NJWkVfTUFTSwkoMHhmZmZmKSAvKiB0aGUgc2l6ZSBmaWVsZCBpcyAxNiBiaXQgKi8KKworc3RydWN0IGx0cV9kbWFfZGVzYyB7CisJdTMyIGN0bDsKKwl1MzIgYWRkcjsKK307CisKK3N0cnVjdCBsdHFfZG1hX2NoYW5uZWwgeworCWludCBucjsJCQkJLyogdGhlIGNoYW5uZWwgbnVtYmVyICovCisJaW50IGlycTsJCQkvKiB0aGUgbWFwcGVkIGlycSAqLworCWludCBkZXNjOwkJCS8qIHRoZSBjdXJyZW50IGRlc2NyaXB0b3IgKi8KKwlzdHJ1Y3QgbHRxX2RtYV9kZXNjICpkZXNjX2Jhc2U7CS8qIHRoZSBkZXNjcmlwdG9yIGJhc2UgKi8KKwlpbnQgcGh5czsJCQkvKiBwaHlzaWNhbCBhZGRyICovCit9OworCitlbnVtIHsKKwlETUFfUE9SVF9FVE9QID0gMCwKKwlETUFfUE9SVF9ERVUsCit9OworCitleHRlcm4gdm9pZCBsdHFfZG1hX2VuYWJsZV9pcnEoc3RydWN0IGx0cV9kbWFfY2hhbm5lbCAqY2gpOworZXh0ZXJuIHZvaWQgbHRxX2RtYV9kaXNhYmxlX2lycShzdHJ1Y3QgbHRxX2RtYV9jaGFubmVsICpjaCk7CitleHRlcm4gdm9pZCBsdHFfZG1hX2Fja19pcnEoc3RydWN0IGx0cV9kbWFfY2hhbm5lbCAqY2gpOworZXh0ZXJuIHZvaWQgbHRxX2RtYV9vcGVuKHN0cnVjdCBsdHFfZG1hX2NoYW5uZWwgKmNoKTsKK2V4dGVybiB2b2lkIGx0cV9kbWFfY2xvc2Uoc3RydWN0IGx0cV9kbWFfY2hhbm5lbCAqY2gpOworZXh0ZXJuIHZvaWQgbHRxX2RtYV9hbGxvY190eChzdHJ1Y3QgbHRxX2RtYV9jaGFubmVsICpjaCk7CitleHRlcm4gdm9pZCBsdHFfZG1hX2FsbG9jX3J4KHN0cnVjdCBsdHFfZG1hX2NoYW5uZWwgKmNoKTsKK2V4dGVybiB2b2lkIGx0cV9kbWFfZnJlZShzdHJ1Y3QgbHRxX2RtYV9jaGFubmVsICpjaCk7CitleHRlcm4gdm9pZCBsdHFfZG1hX2luaXRfcG9ydChpbnQgcCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbmV0bG9naWMvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1uZXRsb2dpYy9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjcyODI3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbmV0bG9naWMvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBOZXRsb2dpYyBNaWNyb3N5c3RlbXMKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSYWxmIEJhZWNobGUKKyAqLworI2lmbmRlZiBfX0FTTV9NQUNIX05FVExPR0lDX0NQVV9GRUFUVVJFX09WRVJSSURFU19ICisjZGVmaW5lIF9fQVNNX01BQ0hfTkVUTE9HSUNfQ1BVX0ZFQVRVUkVfT1ZFUlJJREVTX0gKKworI2RlZmluZSBjcHVfaGFzXzRrZXgJCTEKKyNkZWZpbmUgY3B1X2hhc180a19jYWNoZQkxCisjZGVmaW5lIGNwdV9oYXNfd2F0Y2gJCTEKKyNkZWZpbmUgY3B1X2hhc19taXBzMTYJCTAKKyNkZWZpbmUgY3B1X2hhc19jb3VudGVyCQkxCisjZGVmaW5lIGNwdV9oYXNfZGl2ZWMJCTEKKyNkZWZpbmUgY3B1X2hhc192Y2UJCTAKKyNkZWZpbmUgY3B1X2hhc19jYWNoZV9jZGV4X3AJMAorI2RlZmluZSBjcHVfaGFzX2NhY2hlX2NkZXhfcwkwCisjZGVmaW5lIGNwdV9oYXNfcHJlZmV0Y2gJMQorI2RlZmluZSBjcHVfaGFzX21jaGVjawkJMQorI2RlZmluZSBjcHVfaGFzX2VqdGFnCQkxCisKKyNkZWZpbmUgY3B1X2hhc19sbHNjCQkxCisjZGVmaW5lIGNwdV9oYXNfdnRhZ19pY2FjaGUJMAorI2RlZmluZSBjcHVfaGFzX2RjX2FsaWFzZXMJMAorI2RlZmluZSBjcHVfaGFzX2ljX2ZpbGxzX2ZfZGMJMAorI2RlZmluZSBjcHVfaGFzX2RzcAkJMAorI2RlZmluZSBjcHVfaGFzX21pcHNtdAkJMAorI2RlZmluZSBjcHVfaGFzX3VzZXJsb2NhbAkwCisjZGVmaW5lIGNwdV9pY2FjaGVfc25vb3BzX3JlbW90ZV9zdG9yZQkwCisKKyNkZWZpbmUgY3B1X2hhc19ub2ZwdWV4CQkwCisjZGVmaW5lIGNwdV9oYXNfNjRiaXRzCQkxCisKKyNkZWZpbmUgY3B1X2hhc19taXBzMzJyMQkxCisjZGVmaW5lIGNwdV9oYXNfbWlwczMycjIJMAorI2RlZmluZSBjcHVfaGFzX21pcHM2NHIxCTEKKyNkZWZpbmUgY3B1X2hhc19taXBzNjRyMgkwCisKKyNkZWZpbmUgY3B1X2hhc19pbmNsdXNpdmVfcGNhY2hlcwkwCisKKyNkZWZpbmUgY3B1X2RjYWNoZV9saW5lX3NpemUoKQkzMgorI2RlZmluZSBjcHVfaWNhY2hlX2xpbmVfc2l6ZSgpCTMyCisKKyNlbmRpZiAvKiBfX0FTTV9NQUNIX05FVExPR0lDX0NQVV9GRUFUVVJFX09WRVJSSURFU19IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1uZXRsb2dpYy9pcnEuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLW5ldGxvZ2ljL2lycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OTAyNDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1uZXRsb2dpYy9pcnEuaApAQCAtMCwwICsxLDE0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIE5ldGxvZ2ljIE1pY3Jvc3lzdGVtcy4KKyAqLworI2lmbmRlZiBfX0FTTV9ORVRMT0dJQ19JUlFfSAorI2RlZmluZSBfX0FTTV9ORVRMT0dJQ19JUlFfSAorCisjZGVmaW5lIE5SX0lSUVMJCQk2NAorI2RlZmluZSBNSVBTX0NQVV9JUlFfQkFTRQkwCisKKyNlbmRpZiAvKiBfX0FTTV9ORVRMT0dJQ19JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbmV0bG9naWMvd2FyLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1uZXRsb2dpYy93YXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmRhODkzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbmV0bG9naWMvd2FyLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBOZXRsb2dpYyBNaWNyb3N5c3RlbXMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDQsIDIwMDcgYnkgUmFsZiBCYWVjaGxlIDxyYWxmQGxpbnV4LW1pcHMub3JnPgorICovCisjaWZuZGVmIF9fQVNNX01JUFNfTUFDSF9OTE1fV0FSX0gKKyNkZWZpbmUgX19BU01fTUlQU19NQUNIX05MTV9XQVJfSAorCisjZGVmaW5lIFI0NjAwX1YxX0lOREVYX0lDQUNIRU9QX1dBUgkwCisjZGVmaW5lIFI0NjAwX1YxX0hJVF9DQUNIRU9QX1dBUgkwCisjZGVmaW5lIFI0NjAwX1YyX0hJVF9DQUNIRU9QX1dBUgkwCisjZGVmaW5lIFI1NDMyX0NQMF9JTlRFUlJVUFRfV0FSCQkwCisjZGVmaW5lIEJDTTEyNTBfTTNfV0FSCQkJMAorI2RlZmluZSBTSUJZVEVfMTk1Nl9XQVIJCQkwCisjZGVmaW5lIE1JUFM0S19JQ0FDSEVfUkVGSUxMX1dBUgkwCisjZGVmaW5lIE1JUFNfQ0FDSEVfU1lOQ19XQVIJCTAKKyNkZWZpbmUgVFg0OVhYX0lDQUNIRV9JTkRFWF9JTlZfV0FSCTAKKyNkZWZpbmUgUk05MDAwX0NERVhfU01QX1dBUgkJMAorI2RlZmluZSBJQ0FDSEVfUkVGSUxMU19XT1JLQVJPVU5EX1dBUgkwCisjZGVmaW5lIFIxMDAwMF9MTFNDX1dBUgkJCTAKKyNkZWZpbmUgTUlQUzM0S19NSVNTRURfSVRMQl9XQVIJCTAKKworI2VuZGlmIC8qIF9fQVNNX01JUFNfTUFDSF9OTE1fV0FSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tb2R1bGUuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tb2R1bGUuaAppbmRleCBkOTQwODVhLi5iYzAxYTAyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbW9kdWxlLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21vZHVsZS5oCkBAIC0xMTgsNiArMTE4LDggQEAKICNkZWZpbmUgTU9EVUxFX1BST0NfRkFNSUxZICJMT09OR1NPTjIgIgogI2VsaWYgZGVmaW5lZCBDT05GSUdfQ1BVX0NBVklVTV9PQ1RFT04KICNkZWZpbmUgTU9EVUxFX1BST0NfRkFNSUxZICJPQ1RFT04gIgorI2VsaWYgZGVmaW5lZCBDT05GSUdfQ1BVX1hMUgorI2RlZmluZSBNT0RVTEVfUFJPQ19GQU1JTFkgIlhMUiAiCiAjZWxzZQogI2Vycm9yIE1PRFVMRV9QUk9DX0ZBTUlMWSB1bmRlZmluZWQgZm9yIHlvdXIgcHJvY2Vzc29yIGNvbmZpZ3VyYXRpb24KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL25ldGxvZ2ljL2ludGVycnVwdC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL25ldGxvZ2ljL2ludGVycnVwdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NWFhZGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbmV0bG9naWMvaW50ZXJydXB0LmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMTEgTmV0TG9naWMgTWljcm9zeXN0ZW1zLCBJbmMuIChOZXRMb2dpYykuIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZSBOZXRMb2dpYworICogbGljZW5zZSBiZWxvdzoKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgTkVUTE9HSUMgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIE5FVExPR0lDIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfQVNNX05MTV9JTlRFUlJVUFRfSAorI2RlZmluZSBfQVNNX05MTV9JTlRFUlJVUFRfSAorCisvKiBEZWZpbmVzIGZvciB0aGUgSVJRIG51bWJlcnMgKi8KKworI2RlZmluZSBJUlFfSVBJX1NNUF9GVU5DVElPTgkzCisjZGVmaW5lIElSUV9JUElfU01QX1JFU0NIRURVTEUJNAorI2RlZmluZSBJUlFfTVNHUklORwkJNgorI2RlZmluZSBJUlFfVElNRVIJCTcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbmV0bG9naWMvbWlwcy1leHRucy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL25ldGxvZ2ljL21pcHMtZXh0bnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzUzZDBiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL25ldGxvZ2ljL21pcHMtZXh0bnMuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAxMSBOZXRMb2dpYyBNaWNyb3N5c3RlbXMsIEluYy4gKE5ldExvZ2ljKS4gQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlIE5ldExvZ2ljCisgKiBsaWNlbnNlIGJlbG93OgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBORVRMT0dJQyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgTkVUTE9HSUMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9BU01fTkxNX01JUFNfRVhUU19ICisjZGVmaW5lIF9BU01fTkxNX01JUFNfRVhUU19ICisKKy8qCisgKiBYTFIgYW5kIFhMUCBpbnRlcnJ1cHQgcmVxdWVzdCBhbmQgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgcmVhZF9jMF9laXJyKCkJCV9fcmVhZF82NGJpdF9jMF9yZWdpc3RlcigkOSwgNikKKyNkZWZpbmUgcmVhZF9jMF9laW1yKCkJCV9fcmVhZF82NGJpdF9jMF9yZWdpc3RlcigkOSwgNykKKyNkZWZpbmUgd3JpdGVfYzBfZWlycih2YWwpCV9fd3JpdGVfNjRiaXRfYzBfcmVnaXN0ZXIoJDksIDYsIHZhbCkKKworLyoKKyAqIFdyaXRpbmcgRUlNUiBpbiAzMiBiaXQgaXMgYSBzcGVjaWFsIGNhc2UsIHRoZSBsb3dlciA4IGJpdCBvZiB0aGUKKyAqIEVJTVIgaXMgc2hhZG93ZWQgaW4gdGhlIHN0YXR1cyByZWdpc3Rlciwgc28gd2UgY2Fubm90IHNhdmUgYW5kCisgKiByZXN0b3JlIHN0YXR1cyByZWdpc3RlciBmb3Igc3BsaXQgcmVhZC4KKyAqLworI2RlZmluZSB3cml0ZV9jMF9laW1yKHZhbCkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmIChzaXplb2YodW5zaWduZWQgbG9uZykgPT0gNCkJewkJCQlcCisJCXVuc2lnbmVkIGxvbmcgX19mbGFnczsJCQkJCVwKKwkJCQkJCQkJCVwKKwkJbG9jYWxfaXJxX3NhdmUoX19mbGFncyk7CQkJCVwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCisJCQkiLnNldFx0bWlwczY0XG5cdCIJCQkJXAorCQkJImRzbGxcdCVMMCwgJUwwLCAzMlxuXHQiCQkJXAorCQkJImRzcmxcdCVMMCwgJUwwLCAzMlxuXHQiCQkJXAorCQkJImRzbGxcdCVNMCwgJU0wLCAzMlxuXHQiCQkJXAorCQkJIm9yXHQlTDAsICVMMCwgJU0wXG5cdCIJCQkJXAorCQkJImRtdGMwXHQlTDAsICQ5LCA3XG5cdCIJCQkJXAorCQkJIi5zZXRcdG1pcHMwIgkJCQkJXAorCQkJOiA6ICJyIiAodmFsKSk7CQkJCQlcCisJCV9fZmxhZ3MgPSAoX19mbGFncyAmIDB4ZmZmZjAwZmYpIHwgKCgodmFsKSAmIDB4ZmYpIDw8IDgpO1wKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoX19mbGFncyk7CQkJCVwKKwl9IGVsc2UJCQkJCQkJCVwKKwkJX193cml0ZV82NGJpdF9jMF9yZWdpc3RlcigkOSwgNywgKHZhbCkpOwkJXAorfSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgaGFyZF9zbXBfcHJvY2Vzc29yX2lkKHZvaWQpCit7CisJcmV0dXJuIF9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMTUsIDEpICYgMHgzZmY7Cit9CisKKyNlbmRpZiAvKl9BU01fTkxNX01JUFNfRVhUU19IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbmV0bG9naWMvcHNiLWJvb3RpbmZvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbmV0bG9naWMvcHNiLWJvb3RpbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg3ODMwNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9uZXRsb2dpYy9wc2ItYm9vdGluZm8uaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMTEgTmV0TG9naWMgTWljcm9zeXN0ZW1zLCBJbmMuIChOZXRMb2dpYykuIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZSBOZXRMb2dpYworICogbGljZW5zZSBiZWxvdzoKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgTkVUTE9HSUMgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIE5FVExPR0lDIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfQVNNX05FVExPR0lDX0JPT1RJTkZPX0gKKyNkZWZpbmUgX0FTTV9ORVRMT0dJQ19CT09USU5GT19ICisKK3N0cnVjdCBwc2JfaW5mbyB7CisJdWludDY0X3QgYm9vdF9sZXZlbDsKKwl1aW50NjRfdCBpb19iYXNlOworCXVpbnQ2NF90IG91dHB1dF9kZXZpY2U7CisJdWludDY0X3QgdWFydF9wcmludDsKKwl1aW50NjRfdCBsZWRfb3V0cHV0OworCXVpbnQ2NF90IGluaXQ7CisJdWludDY0X3QgZXhpdDsKKwl1aW50NjRfdCB3YXJtX3Jlc2V0OworCXVpbnQ2NF90IHdha2V1cDsKKwl1aW50NjRfdCBvbmxpbmVfY3B1X21hcDsKKwl1aW50NjRfdCBtYXN0ZXJfcmVlbnRyeV9zcDsKKwl1aW50NjRfdCBtYXN0ZXJfcmVlbnRyeV9ncDsKKwl1aW50NjRfdCBtYXN0ZXJfcmVlbnRyeV9mbjsKKwl1aW50NjRfdCBzbGF2ZV9yZWVudHJ5X2ZuOworCXVpbnQ2NF90IG1hZ2ljX2R3b3JkOworCXVpbnQ2NF90IHVhcnRfcHV0Y2hhcjsKKwl1aW50NjRfdCBzaXplOworCXVpbnQ2NF90IHVhcnRfZ2V0Y2hhcjsKKwl1aW50NjRfdCBubWlfaGFuZGxlcjsKKwl1aW50NjRfdCBwc2JfdmVyc2lvbjsKKwl1aW50NjRfdCBtYWNfYWRkcjsKKwl1aW50NjRfdCBjcHVfZnJlcXVlbmN5OworCXVpbnQ2NF90IGJvYXJkX3ZlcnNpb247CisJdWludDY0X3QgbWFsbG9jOworCXVpbnQ2NF90IGZyZWU7CisJdWludDY0X3QgZ2xvYmFsX3NobWVtX2FkZHI7CisJdWludDY0X3QgZ2xvYmFsX3NobWVtX3NpemU7CisJdWludDY0X3QgcHNiX29zX2NwdV9tYXA7CisJdWludDY0X3QgdXNlcmFwcF9jcHVfbWFwOworCXVpbnQ2NF90IHdha2V1cF9vczsKKwl1aW50NjRfdCBwc2JfbWVtX21hcDsKKwl1aW50NjRfdCBib2FyZF9tYWpvcl92ZXJzaW9uOworCXVpbnQ2NF90IGJvYXJkX21pbm9yX3ZlcnNpb247CisJdWludDY0X3QgYm9hcmRfbWFuZl9yZXZpc2lvbjsKKwl1aW50NjRfdCBib2FyZF9zZXJpYWxfbnVtYmVyOworCXVpbnQ2NF90IHBzYl9waHlzYWRkcl9tYXA7CisJdWludDY0X3QgeGxyX2xvYWRlcmlwX2NvbmZpZzsKKwl1aW50NjRfdCBibGRyX2VudnA7CisJdWludDY0X3QgYXZhaWxfbWVtX21hcDsKK307CisKK2VudW0geworCU5FVExPR0lDX0lPX1NQQUNFID0gMHgxMCwKKwlQQ0lYX0lPX1NQQUNFLAorCVBDSVhfQ0ZHX1NQQUNFLAorCVBDSVhfTUVNT1JZX1NQQUNFLAorCUhUX0lPX1NQQUNFLAorCUhUX0NGR19TUEFDRSwKKwlIVF9NRU1PUllfU1BBQ0UsCisJU1JBTV9TUEFDRSwKKwlGTEFTSF9DT05UUk9MTEVSX1NQQUNFCit9OworCisjZGVmaW5lIE5MTV9NQVhfQVJHUwk2NAorI2RlZmluZSBOTE1fTUFYX0VOVlMJMzIKKworLyogVGhpcyBpcyB3aGF0IG5ldGxib290IHBhc3NlcyBhbmQgbGludXggYm9vdF9tZW1fbWFwIGlzIHN1YnRseSBkaWZmZXJlbnQgKi8KKyNkZWZpbmUgTkxNX0JPT1RfTUVNX01BUF9NQVgJMzIKK3N0cnVjdCBubG1fYm9vdF9tZW1fbWFwIHsKKwlpbnQgbnJfbWFwOworCXN0cnVjdCBubG1fYm9vdF9tZW1fbWFwX2VudHJ5IHsKKwkJdWludDY0X3QgYWRkcjsJCS8qIHN0YXJ0IG9mIG1lbW9yeSBzZWdtZW50ICovCisJCXVpbnQ2NF90IHNpemU7CQkvKiBzaXplIG9mIG1lbW9yeSBzZWdtZW50ICovCisJCXVpbnQzMl90IHR5cGU7CQkvKiB0eXBlIG9mIG1lbW9yeSBzZWdtZW50ICovCisJfSBtYXBbTkxNX0JPT1RfTUVNX01BUF9NQVhdOworfTsKKworLyogUG9pbnRlciB0byBzYXZlZCBib290IGxvYWRlciBpbmZvICovCitleHRlcm4gc3RydWN0IHBzYl9pbmZvIG5sbV9wcm9tX2luZm87CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL25ldGxvZ2ljL3hsci9ncGlvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbmV0bG9naWMveGxyL2dwaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWY2YWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL25ldGxvZ2ljL3hsci9ncGlvLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMTEgTmV0TG9naWMgTWljcm9zeXN0ZW1zLCBJbmMuIChOZXRMb2dpYykuIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZSBOZXRMb2dpYworICogbGljZW5zZSBiZWxvdzoKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgTkVUTE9HSUMgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIE5FVExPR0lDIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfQVNNX05MTV9HUElPX0gKKyNkZWZpbmUgX0FTTV9OTE1fR1BJT19ICisKKyNkZWZpbmUgTkVUTE9HSUNfR1BJT19JTlRfRU5fUkVHCQkwCisjZGVmaW5lIE5FVExPR0lDX0dQSU9fSU5QVVRfSU5WRVJTSU9OX1JFRwkxCisjZGVmaW5lIE5FVExPR0lDX0dQSU9fSU9fRElSX1JFRwkJMgorI2RlZmluZSBORVRMT0dJQ19HUElPX0lPX0RBVEFfV1JfUkVHCQkzCisjZGVmaW5lIE5FVExPR0lDX0dQSU9fSU9fREFUQV9SRF9SRUcJCTQKKworI2RlZmluZSBORVRMT0dJQ19HUElPX1NXUkVTRVRfUkVHCQk4CisjZGVmaW5lIE5FVExPR0lDX0dQSU9fRFJBTTFfQ05UUkxfUkVHCQk5CisjZGVmaW5lIE5FVExPR0lDX0dQSU9fRFJBTTFfUkFUSU9fUkVHCQkxMAorI2RlZmluZSBORVRMT0dJQ19HUElPX0RSQU0xX1JFU0VUX1JFRwkJMTEKKyNkZWZpbmUgTkVUTE9HSUNfR1BJT19EUkFNMV9TVEFUVVNfUkVHCQkxMgorI2RlZmluZSBORVRMT0dJQ19HUElPX0RSQU0yX0NOVFJMX1JFRwkJMTMKKyNkZWZpbmUgTkVUTE9HSUNfR1BJT19EUkFNMl9SQVRJT19SRUcJCTE0CisjZGVmaW5lIE5FVExPR0lDX0dQSU9fRFJBTTJfUkVTRVRfUkVHCQkxNQorI2RlZmluZSBORVRMT0dJQ19HUElPX0RSQU0yX1NUQVRVU19SRUcJCTE2CisKKyNkZWZpbmUgTkVUTE9HSUNfR1BJT19QV1JPTl9SRVNFVF9DRkdfUkVHCTIxCisjZGVmaW5lIE5FVExPR0lDX0dQSU9fQklTVF9BTExfR09fU1RBVFVTX1JFRwkyNAorI2RlZmluZSBORVRMT0dJQ19HUElPX0JJU1RfQ1BVX0dPX1NUQVRVU19SRUcJMjUKKyNkZWZpbmUgTkVUTE9HSUNfR1BJT19CSVNUX0RFVl9HT19TVEFUVVNfUkVHCTI2CisKKyNkZWZpbmUgTkVUTE9HSUNfR1BJT19GVVNFX0JBTktfUkVHCQkzNQorI2RlZmluZSBORVRMT0dJQ19HUElPX0NQVV9SRVNFVF9SRUcJCTQwCisjZGVmaW5lIE5FVExPR0lDX0dQSU9fUk5HX1JFRwkJCTQzCisKKyNkZWZpbmUgTkVUTE9HSUNfUFdST05fUkVTRVRfUENNQ0lBX0JPT1QJMTcKKyNkZWZpbmUgTkVUTE9HSUNfR1BJT19MRURfQklUTUFQCTB4MTcwMDAwMAorI2RlZmluZSBORVRMT0dJQ19HUElPX0xFRF8wX1NISUZUCQkyMAorI2RlZmluZSBORVRMT0dJQ19HUElPX0xFRF8xX1NISUZUCQkyNAorCisjZGVmaW5lIE5FVExPR0lDX0dQSU9fTEVEX09VVFBVVF9DT0RFX1JFU0VUCTB4MDEKKyNkZWZpbmUgTkVUTE9HSUNfR1BJT19MRURfT1VUUFVUX0NPREVfSEFSRF9SRVNFVCAweDAyCisjZGVmaW5lIE5FVExPR0lDX0dQSU9fTEVEX09VVFBVVF9DT0RFX1NPRlRfUkVTRVQgMHgwMworI2RlZmluZSBORVRMT0dJQ19HUElPX0xFRF9PVVRQVVRfQ09ERV9NQUlOCTB4MDQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbmV0bG9naWMveGxyL2lvbWFwLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbmV0bG9naWMveGxyL2lvbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUzYTRkZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9uZXRsb2dpYy94bHIvaW9tYXAuaApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMTEgTmV0TG9naWMgTWljcm9zeXN0ZW1zLCBJbmMuIChOZXRMb2dpYykuIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZSBOZXRMb2dpYworICogbGljZW5zZSBiZWxvdzoKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgTkVUTE9HSUMgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIE5FVExPR0lDIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfQVNNX05MTV9JT01BUF9ICisjZGVmaW5lIF9BU01fTkxNX0lPTUFQX0gKKworI2RlZmluZSBERUZBVUxUX05FVExPR0lDX0lPX0JBU0UgICAgICAgICAgIENLU0VHMUFERFIoMHgxZWYwMDAwMCkKKyNkZWZpbmUgTkVUTE9HSUNfSU9fRERSMl9DSE4wX09GRlNFVCAgICAgICAweDAxMDAwCisjZGVmaW5lIE5FVExPR0lDX0lPX0REUjJfQ0hOMV9PRkZTRVQgICAgICAgMHgwMjAwMAorI2RlZmluZSBORVRMT0dJQ19JT19ERFIyX0NITjJfT0ZGU0VUICAgICAgIDB4MDMwMDAKKyNkZWZpbmUgTkVUTE9HSUNfSU9fRERSMl9DSE4zX09GRlNFVCAgICAgICAweDA0MDAwCisjZGVmaW5lIE5FVExPR0lDX0lPX1BJQ19PRkZTRVQgICAgICAgICAgICAgMHgwODAwMAorI2RlZmluZSBORVRMT0dJQ19JT19VQVJUXzBfT0ZGU0VUICAgICAgICAgIDB4MTQwMDAKKyNkZWZpbmUgTkVUTE9HSUNfSU9fVUFSVF8xX09GRlNFVCAgICAgICAgICAweDE1MTAwCisKKyNkZWZpbmUgTkVUTE9HSUNfSU9fU0laRSAgICAgICAgICAgICAgICAgICAweDEwMDAKKworI2RlZmluZSBORVRMT0dJQ19JT19CUklER0VfT0ZGU0VUICAgICAgICAgIDB4MDAwMDAKKworI2RlZmluZSBORVRMT0dJQ19JT19STEQyX0NITjBfT0ZGU0VUICAgICAgIDB4MDUwMDAKKyNkZWZpbmUgTkVUTE9HSUNfSU9fUkxEMl9DSE4xX09GRlNFVCAgICAgICAweDA2MDAwCisKKyNkZWZpbmUgTkVUTE9HSUNfSU9fU1JBTV9PRkZTRVQgICAgICAgICAgICAweDA3MDAwCisKKyNkZWZpbmUgTkVUTE9HSUNfSU9fUENJWF9PRkZTRVQgICAgICAgICAgICAweDA5MDAwCisjZGVmaW5lIE5FVExPR0lDX0lPX0hUX09GRlNFVCAgICAgICAgICAgICAgMHgwQTAwMAorCisjZGVmaW5lIE5FVExPR0lDX0lPX1NFQ1VSSVRZX09GRlNFVCAgICAgICAgMHgwQjAwMAorCisjZGVmaW5lIE5FVExPR0lDX0lPX0dNQUNfMF9PRkZTRVQgICAgICAgICAgMHgwQzAwMAorI2RlZmluZSBORVRMT0dJQ19JT19HTUFDXzFfT0ZGU0VUICAgICAgICAgIDB4MEQwMDAKKyNkZWZpbmUgTkVUTE9HSUNfSU9fR01BQ18yX09GRlNFVCAgICAgICAgICAweDBFMDAwCisjZGVmaW5lIE5FVExPR0lDX0lPX0dNQUNfM19PRkZTRVQgICAgICAgICAgMHgwRjAwMAorCisvKiBYTFMgZGV2aWNlcyAqLworI2RlZmluZSBORVRMT0dJQ19JT19HTUFDXzRfT0ZGU0VUICAgICAgICAgIDB4MjAwMDAKKyNkZWZpbmUgTkVUTE9HSUNfSU9fR01BQ181X09GRlNFVCAgICAgICAgICAweDIxMDAwCisjZGVmaW5lIE5FVExPR0lDX0lPX0dNQUNfNl9PRkZTRVQgICAgICAgICAgMHgyMjAwMAorI2RlZmluZSBORVRMT0dJQ19JT19HTUFDXzdfT0ZGU0VUICAgICAgICAgIDB4MjMwMDAKKworI2RlZmluZSBORVRMT0dJQ19JT19QQ0lFXzBfT0ZGU0VUICAgICAgICAgIDB4MUUwMDAKKyNkZWZpbmUgTkVUTE9HSUNfSU9fUENJRV8xX09GRlNFVCAgICAgICAgICAweDFGMDAwCisjZGVmaW5lIE5FVExPR0lDX0lPX1NSSU9fMF9PRkZTRVQgICAgICAgICAgMHgxRTAwMAorI2RlZmluZSBORVRMT0dJQ19JT19TUklPXzFfT0ZGU0VUICAgICAgICAgIDB4MUYwMDAKKworI2RlZmluZSBORVRMT0dJQ19JT19VU0JfMF9PRkZTRVQgICAgICAgICAgIDB4MjQwMDAKKyNkZWZpbmUgTkVUTE9HSUNfSU9fVVNCXzFfT0ZGU0VUICAgICAgICAgICAweDI1MDAwCisKKyNkZWZpbmUgTkVUTE9HSUNfSU9fQ09NUF9PRkZTRVQgICAgICAgICAgICAweDFEMDAwCisvKiBlbmQgWExTIGRldmljZXMgKi8KKworLyogWExSIGRldmljZXMgKi8KKyNkZWZpbmUgTkVUTE9HSUNfSU9fU1BJNF8wX09GRlNFVCAgICAgICAgICAweDEwMDAwCisjZGVmaW5lIE5FVExPR0lDX0lPX1hHTUFDXzBfT0ZGU0VUICAgICAgICAgMHgxMTAwMAorI2RlZmluZSBORVRMT0dJQ19JT19TUEk0XzFfT0ZGU0VUICAgICAgICAgIDB4MTIwMDAKKyNkZWZpbmUgTkVUTE9HSUNfSU9fWEdNQUNfMV9PRkZTRVQgICAgICAgICAweDEzMDAwCisvKiBlbmQgWExSIGRldmljZXMgKi8KKworI2RlZmluZSBORVRMT0dJQ19JT19JMkNfMF9PRkZTRVQgICAgICAgICAgIDB4MTYwMDAKKyNkZWZpbmUgTkVUTE9HSUNfSU9fSTJDXzFfT0ZGU0VUICAgICAgICAgICAweDE3MDAwCisKKyNkZWZpbmUgTkVUTE9HSUNfSU9fR1BJT19PRkZTRVQgICAgICAgICAgICAweDE4MDAwCisjZGVmaW5lIE5FVExPR0lDX0lPX0ZMQVNIX09GRlNFVCAgICAgICAgICAgMHgxOTAwMAorI2RlZmluZSBORVRMT0dJQ19JT19UQl9PRkZTRVQgICAgICAgICAgICAgIDB4MUMwMDAKKworI2RlZmluZSBORVRMT0dJQ19DUExEX09GRlNFVCAgICAgICAgICAgICAgIEtTRUcxQUREUigweDFkODQwMDAwKQorCisvKgorICogQmFzZSBBZGRyZXNzIChWaXJ0dWFsKSBvZiB0aGUgUENJIENvbmZpZyBhZGRyZXNzIHNwYWNlCisgKiBGb3Igbm93LCBjaG9vc2UgMjU2TSBwaHlzIGluIGtzZWcxID0gMHhBMDAwMDAwMCArICgxPDwyOCkKKyAqIENvbmZpZyBzcGFjZSBzcGFucyAyNTYgKG51bSBvZiBidXNlcykgKiAyNTYgKG51bSBmdW5jdGlvbnMpICogMjU2IGJ5dGVzCisgKiBpZSAxPDwyNCA9IDE2TQorICovCisjZGVmaW5lIERFRkFVTFRfUENJX0NPTkZJR19CQVNFICAgICAgICAgMHgxODAwMDAwMAorI2RlZmluZSBERUZBVUxUX0hUX1RZUEUwX0NGR19CQVNFICAgICAgIDB4MTYwMDAwMDAKKyNkZWZpbmUgREVGQVVMVF9IVF9UWVBFMV9DRkdfQkFTRSAgICAgICAweDE3MDAwMDAwCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKK3R5cGVkZWYgdm9sYXRpbGUgX191MzIgbmxtX3JlZ190OworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbmV0bG9naWNfaW9fYmFzZTsKKworLyogRklYTUUgcmVhZCBvbmNlIGluIHdyaXRlX3JlZyAqLworI2lmZGVmIENPTkZJR19DUFVfTElUVExFX0VORElBTgorI2RlZmluZSBuZXRsb2dpY19yZWFkX3JlZyhiYXNlLCBvZmZzZXQpCQkoKGJhc2UpWyhvZmZzZXQpXSkKKyNkZWZpbmUgbmV0bG9naWNfd3JpdGVfcmVnKGJhc2UsIG9mZnNldCwgdmFsdWUpCSgoYmFzZSlbKG9mZnNldCldID0gKHZhbHVlKSkKKyNlbHNlCisjZGVmaW5lIG5ldGxvZ2ljX3JlYWRfcmVnKGJhc2UsIG9mZnNldCkJCShiZTMyX3RvX2NwdSgoYmFzZSlbKG9mZnNldCldKSkKKyNkZWZpbmUgbmV0bG9naWNfd3JpdGVfcmVnKGJhc2UsIG9mZnNldCwgdmFsdWUpIFwKKwkJCQkoKGJhc2UpWyhvZmZzZXQpXSA9IGNwdV90b19iZTMyKCh2YWx1ZSkpKQorI2VuZGlmCisKKyNkZWZpbmUgbmV0bG9naWNfcmVhZF9yZWdfbGUzMihiYXNlLCBvZmZzZXQpIChsZTMyX3RvX2NwdSgoYmFzZSlbKG9mZnNldCldKSkKKyNkZWZpbmUgbmV0bG9naWNfd3JpdGVfcmVnX2xlMzIoYmFzZSwgb2Zmc2V0LCB2YWx1ZSkgXAorCQkJCSgoYmFzZSlbKG9mZnNldCldID0gY3B1X3RvX2xlMzIoKHZhbHVlKSkpCisjZGVmaW5lIG5ldGxvZ2ljX2lvX21taW8ob2Zmc2V0KSAoKG5sbV9yZWdfdCAqKShuZXRsb2dpY19pb19iYXNlKyhvZmZzZXQpKSkKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL25ldGxvZ2ljL3hsci9waWMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9uZXRsb2dpYy94bHIvcGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNjZWI3NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9uZXRsb2dpYy94bHIvcGljLmgKQEAgLTAsMCArMSwyMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDExIE5ldExvZ2ljIE1pY3Jvc3lzdGVtcywgSW5jLiAoTmV0TG9naWMpLiBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUgTmV0TG9naWMKKyAqIGxpY2Vuc2UgYmVsb3c6CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIE5FVExPR0lDIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBORVRMT0dJQyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX0FTTV9OTE1fWExSX1BJQ19ICisjZGVmaW5lIF9BU01fTkxNX1hMUl9QSUNfSAorCisjZGVmaW5lIFBJQ19DTEtTX1BFUl9TRUMJCTY2NjY2NjY2VUxMCisvKiBQSUMgaGFyZHdhcmUgaW50ZXJydXB0IG51bWJlcnMgKi8KKyNkZWZpbmUgUElDX0lSVF9XRF9JTkRFWAkJMAorI2RlZmluZSBQSUNfSVJUX1RJTUVSXzBfSU5ERVgJCTEKKyNkZWZpbmUgUElDX0lSVF9USU1FUl8xX0lOREVYCQkyCisjZGVmaW5lIFBJQ19JUlRfVElNRVJfMl9JTkRFWAkJMworI2RlZmluZSBQSUNfSVJUX1RJTUVSXzNfSU5ERVgJCTQKKyNkZWZpbmUgUElDX0lSVF9USU1FUl80X0lOREVYCQk1CisjZGVmaW5lIFBJQ19JUlRfVElNRVJfNV9JTkRFWAkJNgorI2RlZmluZSBQSUNfSVJUX1RJTUVSXzZfSU5ERVgJCTcKKyNkZWZpbmUgUElDX0lSVF9USU1FUl83X0lOREVYCQk4CisjZGVmaW5lIFBJQ19JUlRfQ0xPQ0tfSU5ERVgJCVBJQ19JUlRfVElNRVJfN19JTkRFWAorI2RlZmluZSBQSUNfSVJUX1VBUlRfMF9JTkRFWAkJOQorI2RlZmluZSBQSUNfSVJUX1VBUlRfMV9JTkRFWAkJMTAKKyNkZWZpbmUgUElDX0lSVF9JMkNfMF9JTkRFWAkJMTEKKyNkZWZpbmUgUElDX0lSVF9JMkNfMV9JTkRFWAkJMTIKKyNkZWZpbmUgUElDX0lSVF9QQ01DSUFfSU5ERVgJCTEzCisjZGVmaW5lIFBJQ19JUlRfR1BJT19JTkRFWAkJMTQKKyNkZWZpbmUgUElDX0lSVF9IWVBFUl9JTkRFWAkJMTUKKyNkZWZpbmUgUElDX0lSVF9QQ0lYX0lOREVYCQkxNgorLyogWExTICovCisjZGVmaW5lIFBJQ19JUlRfQ0RFX0lOREVYCQkxNQorI2RlZmluZSBQSUNfSVJUX0JSSURHRV9UQl9YTFNfSU5ERVgJMTYKKy8qIFhMUyAqLworI2RlZmluZSBQSUNfSVJUX0dNQUMwX0lOREVYCQkxNworI2RlZmluZSBQSUNfSVJUX0dNQUMxX0lOREVYCQkxOAorI2RlZmluZSBQSUNfSVJUX0dNQUMyX0lOREVYCQkxOQorI2RlZmluZSBQSUNfSVJUX0dNQUMzX0lOREVYCQkyMAorI2RlZmluZSBQSUNfSVJUX1hHUzBfSU5ERVgJCTIxCisjZGVmaW5lIFBJQ19JUlRfWEdTMV9JTkRFWAkJMjIKKyNkZWZpbmUgUElDX0lSVF9IWVBFUl9GQVRBTF9JTkRFWAkyMworI2RlZmluZSBQSUNfSVJUX1BDSVhfRkFUQUxfSU5ERVgJMjQKKyNkZWZpbmUgUElDX0lSVF9CUklER0VfQUVSUl9JTkRFWAkyNQorI2RlZmluZSBQSUNfSVJUX0JSSURHRV9CRVJSX0lOREVYCTI2CisjZGVmaW5lIFBJQ19JUlRfQlJJREdFX1RCX1hMUl9JTkRFWAkyNworI2RlZmluZSBQSUNfSVJUX0JSSURHRV9BRVJSX05NSV9JTkRFWAkyOAorLyogWExTICovCisjZGVmaW5lIFBJQ19JUlRfR01BQzRfSU5ERVgJCTIxCisjZGVmaW5lIFBJQ19JUlRfR01BQzVfSU5ERVgJCTIyCisjZGVmaW5lIFBJQ19JUlRfR01BQzZfSU5ERVgJCTIzCisjZGVmaW5lIFBJQ19JUlRfR01BQzdfSU5ERVgJCTI0CisjZGVmaW5lIFBJQ19JUlRfQlJJREdFX0VSUl9JTkRFWAkyNQorI2RlZmluZSBQSUNfSVJUX1BDSUVfTElOSzBfSU5ERVgJMjYKKyNkZWZpbmUgUElDX0lSVF9QQ0lFX0xJTksxX0lOREVYCTI3CisjZGVmaW5lIFBJQ19JUlRfUENJRV9MSU5LMl9JTkRFWAkyMworI2RlZmluZSBQSUNfSVJUX1BDSUVfTElOSzNfSU5ERVgJMjQKKyNkZWZpbmUgUElDX0lSVF9QQ0lFX1hMU0IwX0xJTksyX0lOREVYCTI4CisjZGVmaW5lIFBJQ19JUlRfUENJRV9YTFNCMF9MSU5LM19JTkRFWAkyOQorI2RlZmluZSBQSUNfSVJUX1NSSU9fTElOSzBfSU5ERVgJMjYKKyNkZWZpbmUgUElDX0lSVF9TUklPX0xJTksxX0lOREVYCTI3CisjZGVmaW5lIFBJQ19JUlRfU1JJT19MSU5LMl9JTkRFWAkyOAorI2RlZmluZSBQSUNfSVJUX1NSSU9fTElOSzNfSU5ERVgJMjkKKyNkZWZpbmUgUElDX0lSVF9QQ0lFX0lOVF9JTkRFWAkJMjgKKyNkZWZpbmUgUElDX0lSVF9QQ0lFX0ZBVEFMX0lOREVYCTI5CisjZGVmaW5lIFBJQ19JUlRfR1BJT19CX0lOREVYCQkzMAorI2RlZmluZSBQSUNfSVJUX1VTQl9JTkRFWAkJMzEKKy8qIFhMUyAqLworI2RlZmluZSBQSUNfTlVNX0lSVFMJCQkzMgorCisKKyNkZWZpbmUgUElDX0NMT0NLX1RJTUVSCQkJNworCisvKiBQSUMgUmVnaXN0ZXJzICovCisjZGVmaW5lIFBJQ19DVFJMCQkJMHgwMAorI2RlZmluZSBQSUNfSVBJCQkJCTB4MDQKKyNkZWZpbmUgUElDX0lOVF9BQ0sJCQkweDA2CisKKyNkZWZpbmUgV0RfTUFYX1ZBTF8wCQkJMHgwOAorI2RlZmluZSBXRF9NQVhfVkFMXzEJCQkweDA5CisjZGVmaW5lIFdEX01BU0tfMAkJCTB4MGEKKyNkZWZpbmUgV0RfTUFTS18xCQkJMHgwYgorI2RlZmluZSBXRF9IRUFSQkVBVF8wCQkJMHgwYworI2RlZmluZSBXRF9IRUFSQkVBVF8xCQkJMHgwZAorCisjZGVmaW5lIFBJQ19JUlRfMF9CQVNFCQkJMHg0MAorI2RlZmluZSBQSUNfSVJUXzFfQkFTRQkJCTB4ODAKKyNkZWZpbmUgUElDX1RJTUVSX01BWFZBTF8wX0JBU0UJCTB4MTAwCisjZGVmaW5lIFBJQ19USU1FUl9NQVhWQUxfMV9CQVNFCQkweDExMAorI2RlZmluZSBQSUNfVElNRVJfQ09VTlRfMF9CQVNFCQkweDEyMAorI2RlZmluZSBQSUNfVElNRVJfQ09VTlRfMV9CQVNFCQkweDEzMAorCisjZGVmaW5lIFBJQ19JUlRfMChwaWNpbnRyKSAgICAgIChQSUNfSVJUXzBfQkFTRSArIChwaWNpbnRyKSkKKyNkZWZpbmUgUElDX0lSVF8xKHBpY2ludHIpCShQSUNfSVJUXzFfQkFTRSArIChwaWNpbnRyKSkKKworI2RlZmluZSBQSUNfVElNRVJfTUFYVkFMXzAoaSkJKFBJQ19USU1FUl9NQVhWQUxfMF9CQVNFICsgKGkpKQorI2RlZmluZSBQSUNfVElNRVJfTUFYVkFMXzEoaSkJKFBJQ19USU1FUl9NQVhWQUxfMV9CQVNFICsgKGkpKQorI2RlZmluZSBQSUNfVElNRVJfQ09VTlRfMChpKQkoUElDX1RJTUVSX0NPVU5UXzBfQkFTRSArIChpKSkKKyNkZWZpbmUgUElDX1RJTUVSX0NPVU5UXzEoaSkJKFBJQ19USU1FUl9DT1VOVF8wX0JBU0UgKyAoaSkpCisKKy8qCisgKiBNYXBwaW5nIGJldHdlZW4gaGFyZHdhcmUgaW50ZXJydXB0IG51bWJlcnMgYW5kIElSUXMgb24gQ1BVCisgKiB3ZSB1c2UgYSBzaW1wbGUgc2NoZW1lIHRvIG1hcCBQSUMgaW50ZXJydXB0cyAwLTMxIHRvIElSUXMKKyAqIDgtMzkuIFRoaXMgbGVhdmVzIHRoZSBJUlEgMC03IGZvciBjcHUgaW50ZXJydXB0cyBsaWtlCisgKiBjb3VudC9jb21wYXJlIGFuZCBGTU4KKyAqLworI2RlZmluZSBQSUNfSVJRX0JBU0UgICAgICAgICAgICA4CisjZGVmaW5lIFBJQ19JTlRSX1RPX0lSUShpKSAgICAgIChQSUNfSVJRX0JBU0UgKyAoaSkpCisjZGVmaW5lIFBJQ19JUlFfVE9fSU5UUihpKSAgICAgICgoaSkgLSBQSUNfSVJRX0JBU0UpCisKKyNkZWZpbmUgUElDX0lSVF9GSVJTVF9JUlEJUElDX0lSUV9CQVNFCisjZGVmaW5lIFBJQ19XRF9JUlEJCVBJQ19JTlRSX1RPX0lSUShQSUNfSVJUX1dEX0lOREVYKQorI2RlZmluZSBQSUNfVElNRVJfMF9JUlEJCVBJQ19JTlRSX1RPX0lSUShQSUNfSVJUX1RJTUVSXzBfSU5ERVgpCisjZGVmaW5lIFBJQ19USU1FUl8xX0lSUQkJUElDX0lOVFJfVE9fSVJRKFBJQ19JUlRfVElNRVJfMV9JTkRFWCkKKyNkZWZpbmUgUElDX1RJTUVSXzJfSVJRCQlQSUNfSU5UUl9UT19JUlEoUElDX0lSVF9USU1FUl8yX0lOREVYKQorI2RlZmluZSBQSUNfVElNRVJfM19JUlEJCVBJQ19JTlRSX1RPX0lSUShQSUNfSVJUX1RJTUVSXzNfSU5ERVgpCisjZGVmaW5lIFBJQ19USU1FUl80X0lSUQkJUElDX0lOVFJfVE9fSVJRKFBJQ19JUlRfVElNRVJfNF9JTkRFWCkKKyNkZWZpbmUgUElDX1RJTUVSXzVfSVJRCQlQSUNfSU5UUl9UT19JUlEoUElDX0lSVF9USU1FUl81X0lOREVYKQorI2RlZmluZSBQSUNfVElNRVJfNl9JUlEJCVBJQ19JTlRSX1RPX0lSUShQSUNfSVJUX1RJTUVSXzZfSU5ERVgpCisjZGVmaW5lIFBJQ19USU1FUl83X0lSUQkJUElDX0lOVFJfVE9fSVJRKFBJQ19JUlRfVElNRVJfN19JTkRFWCkKKyNkZWZpbmUgUElDX0NMT0NLX0lSUQkJKFBJQ19USU1FUl83X0lSUSkKKyNkZWZpbmUgUElDX1VBUlRfMF9JUlEJCVBJQ19JTlRSX1RPX0lSUShQSUNfSVJUX1VBUlRfMF9JTkRFWCkKKyNkZWZpbmUgUElDX1VBUlRfMV9JUlEJCVBJQ19JTlRSX1RPX0lSUShQSUNfSVJUX1VBUlRfMV9JTkRFWCkKKyNkZWZpbmUgUElDX0kyQ18wX0lSUQkJUElDX0lOVFJfVE9fSVJRKFBJQ19JUlRfSTJDXzBfSU5ERVgpCisjZGVmaW5lIFBJQ19JMkNfMV9JUlEJCVBJQ19JTlRSX1RPX0lSUShQSUNfSVJUX0kyQ18xX0lOREVYKQorI2RlZmluZSBQSUNfUENNQ0lBX0lSUQkJUElDX0lOVFJfVE9fSVJRKFBJQ19JUlRfUENNQ0lBX0lOREVYKQorI2RlZmluZSBQSUNfR1BJT19JUlEJCVBJQ19JTlRSX1RPX0lSUShQSUNfSVJUX0dQSU9fSU5ERVgpCisjZGVmaW5lIFBJQ19IWVBFUl9JUlEJCVBJQ19JTlRSX1RPX0lSUShQSUNfSVJUX0hZUEVSX0lOREVYKQorI2RlZmluZSBQSUNfUENJWF9JUlEJCVBJQ19JTlRSX1RPX0lSUShQSUNfSVJUX1BDSVhfSU5ERVgpCisvKiBYTFMgKi8KKyNkZWZpbmUgUElDX0NERV9JUlEJCVBJQ19JTlRSX1RPX0lSUShQSUNfSVJUX0NERV9JTkRFWCkKKyNkZWZpbmUgUElDX0JSSURHRV9UQl9YTFNfSVJRCVBJQ19JTlRSX1RPX0lSUShQSUNfSVJUX0JSSURHRV9UQl9YTFNfSU5ERVgpCisvKiBlbmQgWExTICovCisjZGVmaW5lIFBJQ19HTUFDXzBfSVJRCQlQSUNfSU5UUl9UT19JUlEoUElDX0lSVF9HTUFDMF9JTkRFWCkKKyNkZWZpbmUgUElDX0dNQUNfMV9JUlEJCVBJQ19JTlRSX1RPX0lSUShQSUNfSVJUX0dNQUMxX0lOREVYKQorI2RlZmluZSBQSUNfR01BQ18yX0lSUQkJUElDX0lOVFJfVE9fSVJRKFBJQ19JUlRfR01BQzJfSU5ERVgpCisjZGVmaW5lIFBJQ19HTUFDXzNfSVJRCQlQSUNfSU5UUl9UT19JUlEoUElDX0lSVF9HTUFDM19JTkRFWCkKKyNkZWZpbmUgUElDX1hHU18wX0lSUQkJUElDX0lOVFJfVE9fSVJRKFBJQ19JUlRfWEdTMF9JTkRFWCkKKyNkZWZpbmUgUElDX1hHU18xX0lSUQkJUElDX0lOVFJfVE9fSVJRKFBJQ19JUlRfWEdTMV9JTkRFWCkKKyNkZWZpbmUgUElDX0hZUEVSX0ZBVEFMX0lSUQlQSUNfSU5UUl9UT19JUlEoUElDX0lSVF9IWVBFUl9GQVRBTF9JTkRFWCkKKyNkZWZpbmUgUElDX1BDSVhfRkFUQUxfSVJRCVBJQ19JTlRSX1RPX0lSUShQSUNfSVJUX1BDSVhfRkFUQUxfSU5ERVgpCisjZGVmaW5lIFBJQ19CUklER0VfQUVSUl9JUlEJUElDX0lOVFJfVE9fSVJRKFBJQ19JUlRfQlJJREdFX0FFUlJfSU5ERVgpCisjZGVmaW5lIFBJQ19CUklER0VfQkVSUl9JUlEJUElDX0lOVFJfVE9fSVJRKFBJQ19JUlRfQlJJREdFX0JFUlJfSU5ERVgpCisjZGVmaW5lIFBJQ19CUklER0VfVEJfWExSX0lSUQlQSUNfSU5UUl9UT19JUlEoUElDX0lSVF9CUklER0VfVEJfWExSX0lOREVYKQorI2RlZmluZSBQSUNfQlJJREdFX0FFUlJfTk1JX0lSUQlQSUNfSU5UUl9UT19JUlEoUElDX0lSVF9CUklER0VfQUVSUl9OTUlfSU5ERVgpCisvKiBYTFMgZGVmaW5lcyAqLworI2RlZmluZSBQSUNfR01BQ180X0lSUQkJUElDX0lOVFJfVE9fSVJRKFBJQ19JUlRfR01BQzRfSU5ERVgpCisjZGVmaW5lIFBJQ19HTUFDXzVfSVJRCQlQSUNfSU5UUl9UT19JUlEoUElDX0lSVF9HTUFDNV9JTkRFWCkKKyNkZWZpbmUgUElDX0dNQUNfNl9JUlEJCVBJQ19JTlRSX1RPX0lSUShQSUNfSVJUX0dNQUM2X0lOREVYKQorI2RlZmluZSBQSUNfR01BQ183X0lSUQkJUElDX0lOVFJfVE9fSVJRKFBJQ19JUlRfR01BQzdfSU5ERVgpCisjZGVmaW5lIFBJQ19CUklER0VfRVJSX0lSUQlQSUNfSU5UUl9UT19JUlEoUElDX0lSVF9CUklER0VfRVJSX0lOREVYKQorI2RlZmluZSBQSUNfUENJRV9MSU5LMF9JUlEJUElDX0lOVFJfVE9fSVJRKFBJQ19JUlRfUENJRV9MSU5LMF9JTkRFWCkKKyNkZWZpbmUgUElDX1BDSUVfTElOSzFfSVJRCVBJQ19JTlRSX1RPX0lSUShQSUNfSVJUX1BDSUVfTElOSzFfSU5ERVgpCisjZGVmaW5lIFBJQ19QQ0lFX0xJTksyX0lSUQlQSUNfSU5UUl9UT19JUlEoUElDX0lSVF9QQ0lFX0xJTksyX0lOREVYKQorI2RlZmluZSBQSUNfUENJRV9MSU5LM19JUlEJUElDX0lOVFJfVE9fSVJRKFBJQ19JUlRfUENJRV9MSU5LM19JTkRFWCkKKyNkZWZpbmUgUElDX1BDSUVfWExTQjBfTElOSzJfSVJRIFBJQ19JTlRSX1RPX0lSUShQSUNfSVJUX1BDSUVfWExTQjBfTElOSzJfSU5ERVgpCisjZGVmaW5lIFBJQ19QQ0lFX1hMU0IwX0xJTkszX0lSUSBQSUNfSU5UUl9UT19JUlEoUElDX0lSVF9QQ0lFX1hMU0IwX0xJTkszX0lOREVYKQorI2RlZmluZSBQSUNfU1JJT19MSU5LMF9JUlEJUElDX0lOVFJfVE9fSVJRKFBJQ19JUlRfU1JJT19MSU5LMF9JTkRFWCkKKyNkZWZpbmUgUElDX1NSSU9fTElOSzFfSVJRCVBJQ19JTlRSX1RPX0lSUShQSUNfSVJUX1NSSU9fTElOSzFfSU5ERVgpCisjZGVmaW5lIFBJQ19TUklPX0xJTksyX0lSUQlQSUNfSU5UUl9UT19JUlEoUElDX0lSVF9TUklPX0xJTksyX0lOREVYKQorI2RlZmluZSBQSUNfU1JJT19MSU5LM19JUlEJUElDX0lOVFJfVE9fSVJRKFBJQ19JUlRfU1JJT19MSU5LM19JTkRFWCkKKyNkZWZpbmUgUElDX1BDSUVfSU5UX0lSUQlQSUNfSU5UUl9UT19JUlEoUElDX0lSVF9QQ0lFX0lOVF9fSU5ERVgpCisjZGVmaW5lIFBJQ19QQ0lFX0ZBVEFMX0lSUQlQSUNfSU5UUl9UT19JUlEoUElDX0lSVF9QQ0lFX0ZBVEFMX0lOREVYKQorI2RlZmluZSBQSUNfR1BJT19CX0lSUQkJUElDX0lOVFJfVE9fSVJRKFBJQ19JUlRfR1BJT19CX0lOREVYKQorI2RlZmluZSBQSUNfVVNCX0lSUQkJUElDX0lOVFJfVE9fSVJRKFBJQ19JUlRfVVNCX0lOREVYKQorI2RlZmluZSBQSUNfSVJUX0xBU1RfSVJRCVBJQ19VU0JfSVJRCisvKiBlbmQgWExTICovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCitzdGF0aWMgaW5saW5lIHZvaWQgcGljX3NlbmRfaXBpKHUzMiBpcGkpCit7CisJbmxtX3JlZ190ICptbWlvID0gbmV0bG9naWNfaW9fbW1pbyhORVRMT0dJQ19JT19QSUNfT0ZGU0VUKTsKKworCW5ldGxvZ2ljX3dyaXRlX3JlZyhtbWlvLCBQSUNfSVBJLCBpcGkpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBwaWNfcmVhZF9jb250cm9sKHZvaWQpCit7CisJbmxtX3JlZ190ICptbWlvID0gbmV0bG9naWNfaW9fbW1pbyhORVRMT0dJQ19JT19QSUNfT0ZGU0VUKTsKKworCXJldHVybiBuZXRsb2dpY19yZWFkX3JlZyhtbWlvLCBQSUNfQ1RSTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwaWNfd3JpdGVfY29udHJvbCh1MzIgY29udHJvbCkKK3sKKwlubG1fcmVnX3QgKm1taW8gPSBuZXRsb2dpY19pb19tbWlvKE5FVExPR0lDX0lPX1BJQ19PRkZTRVQpOworCisJbmV0bG9naWNfd3JpdGVfcmVnKG1taW8sIFBJQ19DVFJMLCBjb250cm9sKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBpY191cGRhdGVfY29udHJvbCh1MzIgY29udHJvbCkKK3sKKwlubG1fcmVnX3QgKm1taW8gPSBuZXRsb2dpY19pb19tbWlvKE5FVExPR0lDX0lPX1BJQ19PRkZTRVQpOworCisJbmV0bG9naWNfd3JpdGVfcmVnKG1taW8sIFBJQ19DVFJMLAorCQkoY29udHJvbCB8IG5ldGxvZ2ljX3JlYWRfcmVnKG1taW8sIFBJQ19DVFJMKSkpOworfQorCisjZGVmaW5lIFBJQ19JUlFfSVNfRURHRV9UUklHR0VSRUQoaXJxKQkoKChpcnEpID49IFBJQ19USU1FUl8wX0lSUSkgJiYgXAorCQkJCQkoKGlycSkgPD0gUElDX1RJTUVSXzdfSVJRKSkKKyNkZWZpbmUgUElDX0lSUV9JU19JUlQoaXJxKQkJKCgoaXJxKSA+PSBQSUNfSVJUX0ZJUlNUX0lSUSkgJiYgXAorCQkJCQkoKGlycSkgPD0gUElDX0lSVF9MQVNUX0lSUSkpCisjZW5kaWYKKworI2VuZGlmIC8qIF9BU01fTkxNX1hMUl9QSUNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL25ldGxvZ2ljL3hsci94bHIuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9uZXRsb2dpYy94bHIveGxyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U2MzcyNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9uZXRsb2dpYy94bHIveGxyLmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMTEgTmV0TG9naWMgTWljcm9zeXN0ZW1zLCBJbmMuIChOZXRMb2dpYykuIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZSBOZXRMb2dpYworICogbGljZW5zZSBiZWxvdzoKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgTkVUTE9HSUMgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIE5FVExPR0lDIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfQVNNX05MTV9YTFJfSAorI2RlZmluZSBfQVNNX05MTV9YTFJfSAorCisvKiBQbGF0Zm9ybSBVQVJUIGZ1bmN0aW9ucyAqLworc3RydWN0IHVhcnRfcG9ydDsKK3Vuc2lnbmVkIGludCBubG1feGxyX3VhcnRfaW4oc3RydWN0IHVhcnRfcG9ydCAqLCBpbnQpOwordm9pZCBubG1feGxyX3VhcnRfb3V0KHN0cnVjdCB1YXJ0X3BvcnQgKiwgaW50LCBpbnQpOworCisvKiBTTVAgc3VwcG9ydCBmdW5jdGlvbnMgKi8KK3N0cnVjdCBpcnFfZGVzYzsKK3ZvaWQgbmxtX3NtcF9mdW5jdGlvbl9pcGlfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpOwordm9pZCBubG1fc21wX3Jlc2NoZWRfaXBpX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKTsKK2ludCBubG1fd2FrZXVwX3NlY29uZGFyeV9jcHVzKHUzMiB3YWtldXBfbWFzayk7Cit2b2lkIG5sbV9zbXBfaXJxX2luaXQodm9pZCk7Cit2b2lkIG5sbV9ib290X3NtcF9ubWkodm9pZCk7Cit2b2lkIHByb21fcHJlX2Jvb3Rfc2Vjb25kYXJ5X2NwdXModm9pZCk7CisKK2V4dGVybiBzdHJ1Y3QgcGxhdF9zbXBfb3BzIG5sbV9zbXBfb3BzOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbmxtX2NvbW1vbl9lYmFzZTsKKworLyogWExTIEIgc2lsaWNvbiAiUm9vayIgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG5sbV9jaGlwX2lzX3hsc19iKHZvaWQpCit7CisJdWludDMyX3QgcHJpZCA9IHJlYWRfYzBfcHJpZCgpOworCisJcmV0dXJuICgocHJpZCAmIDB4ZjAwMCkgPT0gMHg0MDAwKTsKK30KKworLyoKKyAqICBYTFIgY2hpcCB0eXBlcworICovCisgLyogVGhlIFhMUyBwcm9kdWN0IGxpbmUgaGFzIGNoaXAgdmVyc2lvbnMgMHhbNDhjXT8gKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG5sbV9jaGlwX2lzX3hscyh2b2lkKQoreworCXVpbnQzMl90IHByaWQgPSByZWFkX2MwX3ByaWQoKTsKKworCXJldHVybiAoKHByaWQgJiAweGYwMDApID09IDB4ODAwMCB8fCAocHJpZCAmIDB4ZjAwMCkgPT0gMHg0MDAwIHx8CisJCShwcmlkICYgMHhmMDAwKSA9PSAweGMwMDApOworfQorCisjZW5kaWYgLyogX0FTTV9OTE1fWExSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wdHJhY2UuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wdHJhY2UuaAppbmRleCA5ZjFiOGRiLi5kZTM5YjFmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vcHRyYWNlLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3B0cmFjZS5oCkBAIC0xNDEsNyArMTQxLDggQEAKICNkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSAoKHJlZ3MpLT5jcDBfZXBjKQogI2RlZmluZSBwcm9maWxlX3BjKHJlZ3MpIGluc3RydWN0aW9uX3BvaW50ZXIocmVncykKIAotZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBkb19zeXNjYWxsX3RyYWNlKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgZW50cnlleGl0KTsKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgc3lzY2FsbF90cmFjZV9lbnRlcihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIHN5c2NhbGxfdHJhY2VfbGVhdmUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogCiBleHRlcm4gTk9SRVRfVFlQRSB2b2lkIGRpZShjb25zdCBjaGFyICosIHN0cnVjdCBwdF9yZWdzICopIEFUVFJJQl9OT1JFVDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAppbmRleCBkNzExNjBkLi45N2Y4YmY2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtMTQ5LDYgKzE0OSw5IEBACiAjZGVmaW5lIF9USUZfRlBVQk9VTkQJCSgxPDxUSUZfRlBVQk9VTkQpCiAjZGVmaW5lIF9USUZfTE9BRF9XQVRDSAkJKDE8PFRJRl9MT0FEX1dBVENIKQogCisvKiB3b3JrIHRvIGRvIGluIHN5c2NhbGxfdHJhY2VfbGVhdmUoKSAqLworI2RlZmluZSBfVElGX1dPUktfU1lTQ0FMTF9FWElUCShfVElGX1NZU0NBTExfVFJBQ0UgfCBfVElGX1NZU0NBTExfQVVESVQpCisKIC8qIHdvcmsgdG8gZG8gb24gaW50ZXJydXB0L2V4Y2VwdGlvbiByZXR1cm4gKi8KICNkZWZpbmUgX1RJRl9XT1JLX01BU0sJCSgweDAwMDBmZmVmICYJCQkJXAogCQkJCQl+KF9USUZfU0VDQ09NUCB8IF9USUZfU1lTQ0FMTF9BVURJVCkpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdGltZS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3RpbWUuaAppbmRleCBjN2YxYmZlLi5iYzE0NDQ3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdGltZS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90aW1lLmgKQEAgLTg0LDEyICs4NCw2IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGNsb2Nrc291cmNlX3NldF9jbG9jayhzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzLAotCQkJCQkgdW5zaWduZWQgaW50IGNsb2NrKQotewotCWNsb2Nrc291cmNlX2NhbGNfbXVsdF9zaGlmdChjcywgY2xvY2ssIDQpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgY2xvY2tldmVudF9zZXRfY2xvY2soc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2QsCiAJCQkJCXVuc2lnbmVkIGludCBjbG9jaykKIHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qejQ3NDAvc2V0dXAuYyBiL2FyY2gvbWlwcy9qejQ3NDAvc2V0dXAuYwppbmRleCA2YTllMTRkLi5kOTdjZmJmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvano0NzQwL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2p6NDc0MC9zZXR1cC5jCkBAIC0xLDUgKzEsNiBAQAogLyoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCwgTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKiAgQ29weXJpZ2h0IChDKSAyMDExLCBNYWFydGVuIHRlciBIdXVybmUgPG1hYXJ0ZW5AdHJlZXdhbGtlci5vcmc+CiAgKiAgSlo0NzQwIHNldHVwIGNvZGUKICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTE0LDEzICsxNSw0NCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KIAorI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtano0NzQwL2Jhc2UuaD4KKwogI2luY2x1ZGUgInJlc2V0LmgiCiAKKworI2RlZmluZSBKWjQ3NDBfRU1DX1NEUkFNX0NUUkwgMHg4MAorCisKK3N0YXRpYyB2b2lkIF9faW5pdCBqejQ3NDBfZGV0ZWN0X21lbSh2b2lkKQoreworCXZvaWQgX19pb21lbSAqanpfZW1jX2Jhc2U7CisJdTMyIGN0cmwsIGJ1cywgYmFuaywgcm93cywgY29sczsKKwlwaHlzX3Qgc2l6ZTsKKworCWp6X2VtY19iYXNlID0gaW9yZW1hcChKWjQ3NDBfRU1DX0JBU0VfQUREUiwgMHgxMDApOworCWN0cmwgPSByZWFkbChqel9lbWNfYmFzZSArIEpaNDc0MF9FTUNfU0RSQU1fQ1RSTCk7CisJYnVzID0gMiAtICgoY3RybCA+PiAzMSkgJiAxKTsKKwliYW5rID0gMSArICgoY3RybCA+PiAxOSkgJiAxKTsKKwljb2xzID0gOCArICgoY3RybCA+PiAyNikgJiA3KTsKKwlyb3dzID0gMTEgKyAoKGN0cmwgPj4gMjApICYgMyk7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkJIlNEUkFNIHByZWNvbmZpZ3VyZWQ6IGJ1czoldSBiYW5rOiV1IHJvd3M6JXUgY29sczoldVxuIiwKKwkJYnVzLCBiYW5rLCByb3dzLCBjb2xzKTsKKwlpb3VubWFwKGp6X2VtY19iYXNlKTsKKworCXNpemUgPSAxIDw8IChidXMgKyBiYW5rICsgY29scyArIHJvd3MpOworCWFkZF9tZW1vcnlfcmVnaW9uKDAsIHNpemUsIEJPT1RfTUVNX1JBTSk7Cit9CisKIHZvaWQgX19pbml0IHBsYXRfbWVtX3NldHVwKHZvaWQpCiB7CiAJano0NzQwX3Jlc2V0X2luaXQoKTsKKwlqejQ3NDBfZGV0ZWN0X21lbSgpOwogfQogCiBjb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qejQ3NDAvdGltZS5jIGIvYXJjaC9taXBzL2p6NDc0MC90aW1lLmMKaW5kZXggZWFhODUzYS4uZjgzYzJkZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2p6NDc0MC90aW1lLmMKKysrIGIvYXJjaC9taXBzL2p6NDc0MC90aW1lLmMKQEAgLTEyMSw4ICsxMjEsNyBAQAogCiAJY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKCZqejQ3NDBfY2xvY2tldmVudCk7CiAKLQljbG9ja3NvdXJjZV9zZXRfY2xvY2soJmp6NDc0MF9jbG9ja3NvdXJjZSwgY2xrX3JhdGUpOwotCXJldCA9IGNsb2Nrc291cmNlX3JlZ2lzdGVyKCZqejQ3NDBfY2xvY2tzb3VyY2UpOworCXJldCA9IGNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KCZqejQ3NDBfY2xvY2tzb3VyY2UsIGNsa19yYXRlKTsKIAogCWlmIChyZXQpCiAJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlZ2lzdGVyIGNsb2Nrc291cmNlOiAlZFxuIiwgcmV0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL21pcHMva2VybmVsL01ha2VmaWxlCmluZGV4IGNlZGVlMmIuLjgzYmJhMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9NYWtlZmlsZQpAQCAtNTIsNiArNTIsNyBAQAogb2JqLSQoQ09ORklHX0NQVV9UWDQ5WFgpCSs9IHI0a19mcHUubyByNGtfc3dpdGNoLm8KIG9iai0kKENPTkZJR19DUFVfVlI0MVhYKQkrPSByNGtfZnB1Lm8gcjRrX3N3aXRjaC5vCiBvYmotJChDT05GSUdfQ1BVX0NBVklVTV9PQ1RFT04pCSs9IG9jdGVvbl9zd2l0Y2gubworb2JqLSQoQ09ORklHX0NQVV9YTFIpCQkrPSByNGtfZnB1Lm8gcjRrX3N3aXRjaC5vCiAKIG9iai0kKENPTkZJR19TTVApCQkrPSBzbXAubwogb2JqLSQoQ09ORklHX1NNUF9VUCkJCSs9IHNtcC11cC5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2NldnQtdHh4OS5jIGIvYXJjaC9taXBzL2tlcm5lbC9jZXZ0LXR4eDkuYwppbmRleCAwYjczNzczLi5mMGFiOTJhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2NldnQtdHh4OS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvY2V2dC10eHg5LmMKQEAgLTUxLDggKzUxLDcgQEAKIHsKIAlzdHJ1Y3QgdHh4OV90bXJfcmVnIF9faW9tZW0gKnRtcnB0cjsKIAotCWNsb2Nrc291cmNlX3NldF9jbG9jaygmdHh4OV9jbG9ja3NvdXJjZS5jcywgVElNRVJfQ0xLKGltYnVzY2xrKSk7Ci0JY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJnR4eDlfY2xvY2tzb3VyY2UuY3MpOworCWNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KCZ0eHg5X2Nsb2Nrc291cmNlLmNzLCBUSU1FUl9DTEsoaW1idXNjbGspKTsKIAogCXRtcnB0ciA9IGlvcmVtYXAoYmFzZWFkZHIsIHNpemVvZihzdHJ1Y3QgdHh4OV90bXJfcmVnKSk7CiAJX19yYXdfd3JpdGVsKFRDUl9CQVNFLCAmdG1ycHRyLT50Y3IpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9jcHUtcHJvYmUuYyBiL2FyY2gvbWlwcy9rZXJuZWwvY3B1LXByb2JlLmMKaW5kZXggZjY1ZDRjOC4uYmIxMzNkMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9jcHUtcHJvYmUuYworKysgYi9hcmNoL21pcHMva2VybmVsL2NwdS1wcm9iZS5jCkBAIC0yOTEsNiArMjkxLDEyIEBACiAjZW5kaWYKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHNldF9lbGZfcGxhdGZvcm0oaW50IGNwdSwgY29uc3QgY2hhciAqcGxhdCkKK3sKKwlpZiAoY3B1ID09IDApCisJCV9fZWxmX3BsYXRmb3JtID0gcGxhdDsKK30KKwogLyoKICAqIEdldCB0aGUgRlBVIEltcGxlbWVudGF0aW9uL1JldmlzaW9uLgogICovCkBAIC02MTQsNiArNjIwLDE2IEBACiAJY2FzZSBQUklEX0lNUF9MT09OR1NPTjI6CiAJCWMtPmNwdXR5cGUgPSBDUFVfTE9PTkdTT04yOwogCQlfX2NwdV9uYW1lW2NwdV0gPSAiSUNUIExvb25nc29uLTIiOworCisJCXN3aXRjaCAoYy0+cHJvY2Vzc29yX2lkICYgUFJJRF9SRVZfTUFTSykgeworCQljYXNlIFBSSURfUkVWX0xPT05HU09OMkU6CisJCQlzZXRfZWxmX3BsYXRmb3JtKGNwdSwgImxvb25nc29uMmUiKTsKKwkJCWJyZWFrOworCQljYXNlIFBSSURfUkVWX0xPT05HU09OMkY6CisJCQlzZXRfZWxmX3BsYXRmb3JtKGNwdSwgImxvb25nc29uMmYiKTsKKwkJCWJyZWFrOworCQl9CisKIAkJYy0+aXNhX2xldmVsID0gTUlQU19DUFVfSVNBX0lJSTsKIAkJYy0+b3B0aW9ucyA9IFI0S19PUFRTIHwKIAkJCSAgICAgTUlQU19DUFVfRlBVIHwgTUlQU19DUFVfTExTQyB8CkBAIC05MTEsMTIgKzkyNywxNCBAQAogCWNhc2UgUFJJRF9JTVBfQk1JUFMzMl9SRVY4OgogCQljLT5jcHV0eXBlID0gQ1BVX0JNSVBTMzI7CiAJCV9fY3B1X25hbWVbY3B1XSA9ICJCcm9hZGNvbSBCTUlQUzMyIjsKKwkJc2V0X2VsZl9wbGF0Zm9ybShjcHUsICJibWlwczMyIik7CiAJCWJyZWFrOwogCWNhc2UgUFJJRF9JTVBfQk1JUFMzMzAwOgogCWNhc2UgUFJJRF9JTVBfQk1JUFMzMzAwX0FMVDoKIAljYXNlIFBSSURfSU1QX0JNSVBTMzMwMF9CVUc6CiAJCWMtPmNwdXR5cGUgPSBDUFVfQk1JUFMzMzAwOwogCQlfX2NwdV9uYW1lW2NwdV0gPSAiQnJvYWRjb20gQk1JUFMzMzAwIjsKKwkJc2V0X2VsZl9wbGF0Zm9ybShjcHUsICJibWlwczMzMDAiKTsKIAkJYnJlYWs7CiAJY2FzZSBQUklEX0lNUF9CTUlQUzQzWFg6IHsKIAkJaW50IHJldiA9IGMtPnByb2Nlc3Nvcl9pZCAmIDB4ZmY7CkBAIC05MjUsMTUgKzk0MywxOCBAQAogCQkJCXJldiA8PSBQUklEX1JFVl9CTUlQUzQzODBfSEkpIHsKIAkJCWMtPmNwdXR5cGUgPSBDUFVfQk1JUFM0MzgwOwogCQkJX19jcHVfbmFtZVtjcHVdID0gIkJyb2FkY29tIEJNSVBTNDM4MCI7CisJCQlzZXRfZWxmX3BsYXRmb3JtKGNwdSwgImJtaXBzNDM4MCIpOwogCQl9IGVsc2UgewogCQkJYy0+Y3B1dHlwZSA9IENQVV9CTUlQUzQzNTA7CiAJCQlfX2NwdV9uYW1lW2NwdV0gPSAiQnJvYWRjb20gQk1JUFM0MzUwIjsKKwkJCXNldF9lbGZfcGxhdGZvcm0oY3B1LCAiYm1pcHM0MzUwIik7CiAJCX0KIAkJYnJlYWs7CiAJfQogCWNhc2UgUFJJRF9JTVBfQk1JUFM1MDAwOgogCQljLT5jcHV0eXBlID0gQ1BVX0JNSVBTNTAwMDsKIAkJX19jcHVfbmFtZVtjcHVdID0gIkJyb2FkY29tIEJNSVBTNTAwMCI7CisJCXNldF9lbGZfcGxhdGZvcm0oY3B1LCAiYm1pcHM1MDAwIik7CiAJCWMtPm9wdGlvbnMgfD0gTUlQU19DUFVfVUxSSTsKIAkJYnJlYWs7CiAJfQpAQCAtOTU2LDE0ICs5NzcsMTIgQEAKIAkJYy0+Y3B1dHlwZSA9IENQVV9DQVZJVU1fT0NURU9OX1BMVVM7CiAJCV9fY3B1X25hbWVbY3B1XSA9ICJDYXZpdW0gT2N0ZW9uKyI7CiBwbGF0Zm9ybToKLQkJaWYgKGNwdSA9PSAwKQotCQkJX19lbGZfcGxhdGZvcm0gPSAib2N0ZW9uIjsKKwkJc2V0X2VsZl9wbGF0Zm9ybShjcHUsICJvY3Rlb24iKTsKIAkJYnJlYWs7CiAJY2FzZSBQUklEX0lNUF9DQVZJVU1fQ042M1hYOgogCQljLT5jcHV0eXBlID0gQ1BVX0NBVklVTV9PQ1RFT04yOwogCQlfX2NwdV9uYW1lW2NwdV0gPSAiQ2F2aXVtIE9jdGVvbiBJSSI7Ci0JCWlmIChjcHUgPT0gMCkKLQkJCV9fZWxmX3BsYXRmb3JtID0gIm9jdGVvbjIiOworCQlzZXRfZWxmX3BsYXRmb3JtKGNwdSwgIm9jdGVvbjIiKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fSU5GTyAiVW5rbm93biBPY3Rlb24gY2hpcCFcbiIpOwpAQCAtOTg4LDYgKzEwMDcsNTkgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVfcHJvYmVfbmV0bG9naWMoc3RydWN0IGNwdWluZm9fbWlwcyAqYywgaW50IGNwdSkKK3sKKwlkZWNvZGVfY29uZmlncyhjKTsKKworCWMtPm9wdGlvbnMgPSAoTUlQU19DUFVfVExCICAgICAgIHwKKwkJCU1JUFNfQ1BVXzRLRVggICAgfAorCQkJTUlQU19DUFVfQ09VTlRFUiB8CisJCQlNSVBTX0NQVV9ESVZFQyAgIHwKKwkJCU1JUFNfQ1BVX1dBVENIICAgfAorCQkJTUlQU19DUFVfRUpUQUcgICB8CisJCQlNSVBTX0NQVV9MTFNDKTsKKworCXN3aXRjaCAoYy0+cHJvY2Vzc29yX2lkICYgMHhmZjAwKSB7CisJY2FzZSBQUklEX0lNUF9ORVRMT0dJQ19YTFI3MzI6CisJY2FzZSBQUklEX0lNUF9ORVRMT0dJQ19YTFI3MTY6CisJY2FzZSBQUklEX0lNUF9ORVRMT0dJQ19YTFI1MzI6CisJY2FzZSBQUklEX0lNUF9ORVRMT0dJQ19YTFIzMDg6CisJY2FzZSBQUklEX0lNUF9ORVRMT0dJQ19YTFI1MzJDOgorCWNhc2UgUFJJRF9JTVBfTkVUTE9HSUNfWExSNTE2QzoKKwljYXNlIFBSSURfSU1QX05FVExPR0lDX1hMUjUwOEM6CisJY2FzZSBQUklEX0lNUF9ORVRMT0dJQ19YTFIzMDhDOgorCQljLT5jcHV0eXBlID0gQ1BVX1hMUjsKKwkJX19jcHVfbmFtZVtjcHVdID0gIk5ldGxvZ2ljIFhMUiI7CisJCWJyZWFrOworCisJY2FzZSBQUklEX0lNUF9ORVRMT0dJQ19YTFM2MDg6CisJY2FzZSBQUklEX0lNUF9ORVRMT0dJQ19YTFM0MDg6CisJY2FzZSBQUklEX0lNUF9ORVRMT0dJQ19YTFM0MDQ6CisJY2FzZSBQUklEX0lNUF9ORVRMT0dJQ19YTFMyMDg6CisJY2FzZSBQUklEX0lNUF9ORVRMT0dJQ19YTFMyMDQ6CisJY2FzZSBQUklEX0lNUF9ORVRMT0dJQ19YTFMxMDg6CisJY2FzZSBQUklEX0lNUF9ORVRMT0dJQ19YTFMxMDQ6CisJY2FzZSBQUklEX0lNUF9ORVRMT0dJQ19YTFM2MTZCOgorCWNhc2UgUFJJRF9JTVBfTkVUTE9HSUNfWExTNjA4QjoKKwljYXNlIFBSSURfSU1QX05FVExPR0lDX1hMUzQxNkI6CisJY2FzZSBQUklEX0lNUF9ORVRMT0dJQ19YTFM0MTJCOgorCWNhc2UgUFJJRF9JTVBfTkVUTE9HSUNfWExTNDA4QjoKKwljYXNlIFBSSURfSU1QX05FVExPR0lDX1hMUzQwNEI6CisJCWMtPmNwdXR5cGUgPSBDUFVfWExSOworCQlfX2NwdV9uYW1lW2NwdV0gPSAiTmV0bG9naWMgWExTIjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPICJVbmtub3duIE5ldGxvZ2ljIGNoaXAgaWQgWyUwMnhdIVxuIiwKKwkJICAgICAgIGMtPnByb2Nlc3Nvcl9pZCk7CisJCWMtPmNwdXR5cGUgPSBDUFVfWExSOworCQlicmVhazsKKwl9CisKKwljLT5pc2FfbGV2ZWwgPSBNSVBTX0NQVV9JU0FfTTY0UjE7CisJYy0+dGxic2l6ZSA9ICgocmVhZF9jMF9jb25maWcxKCkgPj4gMjUpICYgMHgzZikgKyAxOworfQorCiAjaWZkZWYgQ09ORklHXzY0QklUCiAvKiBGb3IgdXNlIGJ5IHVhY2Nlc3MuaCAqLwogdTY0IF9fdWFfbGltaXQ7CkBAIC0xMDM1LDYgKzExMDcsOSBAQAogCWNhc2UgUFJJRF9DT01QX0lOR0VOSUM6CiAJCWNwdV9wcm9iZV9pbmdlbmljKGMsIGNwdSk7CiAJCWJyZWFrOworCWNhc2UgUFJJRF9DT01QX05FVExPR0lDOgorCQljcHVfcHJvYmVfbmV0bG9naWMoYywgY3B1KTsKKwkJYnJlYWs7CiAJfQogCiAJQlVHX09OKCFfX2NwdV9uYW1lW2NwdV0pOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9jc3JjLWJjbTE0ODAuYyBiL2FyY2gvbWlwcy9rZXJuZWwvY3NyYy1iY20xNDgwLmMKaW5kZXggNTE0ODlmOC4uZjk2Zjk5YyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9jc3JjLWJjbTE0ODAuYworKysgYi9hcmNoL21pcHMva2VybmVsL2NzcmMtYmNtMTQ4MC5jCkBAIC00OSw2ICs0OSw1IEBACiAKIAlwbGxkaXYgPSBHX0JDTTE0ODBfU1lTX1BMTF9ESVYoX19yYXdfcmVhZHEoSU9BRERSKEFfU0NEX1NZU1RFTV9DRkcpKSk7CiAJemJidXMgPSAoKHBsbGRpdiA+PiAxKSAqIDUwMDAwMDAwKSArICgocGxsZGl2ICYgMSkgKiAyNTAwMDAwMCk7Ci0JY2xvY2tzb3VyY2Vfc2V0X2Nsb2NrKGNzLCB6YmJ1cyk7Ci0JY2xvY2tzb3VyY2VfcmVnaXN0ZXIoY3MpOworCWNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KGNzLCB6YmJ1cyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2NzcmMtaW9hc2ljLmMgYi9hcmNoL21pcHMva2VybmVsL2NzcmMtaW9hc2ljLmMKaW5kZXggMjNkYTEwOC4uNDZiZDdmYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9jc3JjLWlvYXNpYy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvY3NyYy1pb2FzaWMuYwpAQCAtNTksNyArNTksNSBAQAogCXByaW50ayhLRVJOX0lORk8gIkkvTyBBU0lDIGNsb2NrIGZyZXF1ZW5jeSAlZEh6XG4iLCBmcmVxKTsKIAogCWNsb2Nrc291cmNlX2RlYy5yYXRpbmcgPSAyMDAgKyBmcmVxIC8gMTAwMDAwMDA7Ci0JY2xvY2tzb3VyY2Vfc2V0X2Nsb2NrKCZjbG9ja3NvdXJjZV9kZWMsIGZyZXEpOwotCi0JY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNsb2Nrc291cmNlX2RlYyk7CisJY2xvY2tzb3VyY2VfcmVnaXN0ZXJfaHooJmNsb2Nrc291cmNlX2RlYywgZnJlcSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2NzcmMtcG93ZXJ0di5jIGIvYXJjaC9taXBzL2tlcm5lbC9jc3JjLXBvd2VydHYuYwppbmRleCBhMjdjMTZjLi4yZTdjNTIzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2NzcmMtcG93ZXJ0di5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvY3NyYy1wb3dlcnR2LmMKQEAgLTc4LDkgKzc4LDcgQEAKIAogCWNsb2Nrc291cmNlX21pcHMucmF0aW5nID0gMjAwICsgbWlwc19ocHRfZnJlcXVlbmN5IC8gMTAwMDAwMDA7CiAKLQljbG9ja3NvdXJjZV9zZXRfY2xvY2soJmNsb2Nrc291cmNlX21pcHMsIG1pcHNfaHB0X2ZyZXF1ZW5jeSk7Ci0KLQljbG9ja3NvdXJjZV9yZWdpc3RlcigmY2xvY2tzb3VyY2VfbWlwcyk7CisJY2xvY2tzb3VyY2VfcmVnaXN0ZXJfaHooJmNsb2Nrc291cmNlX21pcHMsIG1pcHNfaHB0X2ZyZXF1ZW5jeSk7CiB9CiAKIC8qKgpAQCAtMTMwLDQzICsxMjgsMTYgQEAKIC8qKgogICogcG93ZXJ0dl90aW1fY19jbG9ja3NvdXJjZV9pbml0IC0gc2V0IHVwIGEgY2xvY2sgc291cmNlIGZvciB0aGUgVElNX0MgY2xvY2sKICAqCi0gKiBUaGUgaGFyZCBwYXJ0IGhlcmUgaXMgY29taW5nIHVwIHdpdGggYSBjb25zdGFudCBrIGFuZCBzaGlmdCBzIHN1Y2ggdGhhdAotICogdGhlIDQ4LWJpdCBUSU1fQyB2YWx1ZSBtdWx0aXBsaWVkIGJ5IGsgZG9lc24ndCBvdmVyZmxvdyBhbmQgdGhhdCB2YWx1ZSwKLSAqIHdoZW4gc2hpZnRlZCByaWdodCBieSBzLCB5aWVsZHMgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mIG5hbm9zZWNvbmRzLgogICogV2Uga25vdyB0aGF0IFRJTV9DIGNvdW50cyBhdCAyNyBNSHovOCwgc28gZWFjaCBjeWNsZSBjb3JyZXNwb25kcyB0bwotICogMSAvICgyNywwMDAsMDAwLzgpIHNlY29uZHMuIE11bHRpcGx5IHRoYXQgYnkgYSBiaWxsaW9uIGFuZCB5b3UgZ2V0IHRoZQotICogbnVtYmVyIG9mIG5hbm9zZWNvbmRzLiBTaW5jZSB0aGUgVElNX0MgdmFsdWUgaGFzIDQ4IGJpdHMgYW5kIHRoZSBtYXRoIGlzCi0gKiBkb25lIGluIDY0IGJpdHMsIGF2b2lkaW5nIGFuIG92ZXJmbG93IG1lYW5zIHRoYXQgayBtdXN0IGJlIGxlc3MgdGhhbgotICogNjQgLSA0OCA9IDE2IGJpdHMuCisgKiAxIC8gKDI3LDAwMCwwMDAvOCkgc2Vjb25kcy4KICAqLwogc3RhdGljIHZvaWQgX19pbml0IHBvd2VydHZfdGltX2NfY2xvY2tzb3VyY2VfaW5pdCh2b2lkKQogewotCWludAkJCXByZXNjYWxlOwotCXVuc2lnbmVkIGxvbmcJCWRpdmlkZW5kOwotCXVuc2lnbmVkIGxvbmcJCWs7Ci0JaW50CQkJczsKLQljb25zdCBpbnQJCW1heF9rX2JpdHMgPSAoNjQgLSA0OCkgLSAxOwotCWNvbnN0IHVuc2lnbmVkIGxvbmcJYmlsbGlvbiA9IDEwMDAwMDAwMDA7CiAJY29uc3QgdW5zaWduZWQgbG9uZwljb3VudHNfcGVyX3NlY29uZCA9IDI3MDAwMDAwIC8gODsKIAotCXByZXNjYWxlID0gQklUU19QRVJfTE9ORyAtIGlsb2cyKGJpbGxpb24pIC0gMTsKLQlkaXZpZGVuZCA9IGJpbGxpb24gPDwgcHJlc2NhbGU7Ci0JayA9IGRpdmlkZW5kIC8gY291bnRzX3Blcl9zZWNvbmQ7Ci0JcyA9IGlsb2cyKGspIC0gbWF4X2tfYml0czsKLQotCWlmIChzIDwgMCkKLQkJcyA9IHByZXNjYWxlOwotCi0JZWxzZSB7Ci0JCWsgPj49IHM7Ci0JCXMgKz0gcHJlc2NhbGU7Ci0JfQotCi0JY2xvY2tzb3VyY2VfdGltX2MubXVsdCA9IGs7Ci0JY2xvY2tzb3VyY2VfdGltX2Muc2hpZnQgPSBzOwogCWNsb2Nrc291cmNlX3RpbV9jLnJhdGluZyA9IDIwMDsKIAotCWNsb2Nrc291cmNlX3JlZ2lzdGVyKCZjbG9ja3NvdXJjZV90aW1fYyk7CisJY2xvY2tzb3VyY2VfcmVnaXN0ZXJfaHooJmNsb2Nrc291cmNlX3RpbV9jLCBjb3VudHNfcGVyX3NlY29uZCk7CiAJdGltX2MgPSAoc3RydWN0IHRpbV9jICopIGFzaWNfcmVnX2FkZHIodGltX2NoKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9jc3JjLXI0ay5jIGIvYXJjaC9taXBzL2tlcm5lbC9jc3JjLXI0ay5jCmluZGV4IGU5NWEzY2QuLmRlY2QxZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvY3NyYy1yNGsuYworKysgYi9hcmNoL21pcHMva2VybmVsL2NzcmMtcjRrLmMKQEAgLTMwLDkgKzMwLDcgQEAKIAkvKiBDYWxjdWxhdGUgYSBzb21ld2hhdCByZWFzb25hYmxlIHJhdGluZyB2YWx1ZSAqLwogCWNsb2Nrc291cmNlX21pcHMucmF0aW5nID0gMjAwICsgbWlwc19ocHRfZnJlcXVlbmN5IC8gMTAwMDAwMDA7CiAKLQljbG9ja3NvdXJjZV9zZXRfY2xvY2soJmNsb2Nrc291cmNlX21pcHMsIG1pcHNfaHB0X2ZyZXF1ZW5jeSk7Ci0KLQljbG9ja3NvdXJjZV9yZWdpc3RlcigmY2xvY2tzb3VyY2VfbWlwcyk7CisJY2xvY2tzb3VyY2VfcmVnaXN0ZXJfaHooJmNsb2Nrc291cmNlX21pcHMsIG1pcHNfaHB0X2ZyZXF1ZW5jeSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvY3NyYy1zYjEyNTAuYyBiL2FyY2gvbWlwcy9rZXJuZWwvY3NyYy1zYjEyNTAuYwppbmRleCBkMTRkM2QxLi5lOTYwNmQ5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2NzcmMtc2IxMjUwLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9jc3JjLXNiMTI1MC5jCkBAIC02NSw2ICs2NSw1IEBACiAJCSAgICAgSU9BRERSKEFfU0NEX1RJTUVSX1JFR0lTVEVSKFNCMTI1MF9IUFRfTlVNLAogCQkJCQkJIFJfU0NEX1RJTUVSX0NGRykpKTsKIAotCWNsb2Nrc291cmNlX3NldF9jbG9jayhjcywgVl9TQ0RfVElNRVJfRlJFUSk7Ci0JY2xvY2tzb3VyY2VfcmVnaXN0ZXIoY3MpOworCWNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KGNzLCBWX1NDRF9USU1FUl9GUkVRKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvZW50cnkuUyBiL2FyY2gvbWlwcy9rZXJuZWwvZW50cnkuUwppbmRleCBmZmEzMzEwLi4zN2FjZmEwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9lbnRyeS5TCkBAIC0xNjcsMTQgKzE2NywxMyBAQAogRkVYUE9SVChzeXNjYWxsX2V4aXRfd29ya19wYXJ0aWFsKQogCVNBVkVfU1RBVElDCiBzeXNjYWxsX2V4aXRfd29yazoKLQlsaQl0MCwgX1RJRl9TWVNDQUxMX1RSQUNFIHwgX1RJRl9TWVNDQUxMX0FVRElUCisJbGkJdDAsIF9USUZfV09SS19TWVNDQUxMX0VYSVQKIAlhbmQJdDAsIGEyCQkJIyBhMiBpcyBwcmVsb2FkZWQgd2l0aCBUSV9GTEFHUwogCWJlcXoJdDAsIHdvcmtfcGVuZGluZwkjIHRyYWNlIGJpdCBzZXQ/Ci0JbG9jYWxfaXJxX2VuYWJsZQkJIyBjb3VsZCBsZXQgZG9fc3lzY2FsbF90cmFjZSgpCisJbG9jYWxfaXJxX2VuYWJsZQkJIyBjb3VsZCBsZXQgc3lzY2FsbF90cmFjZV9sZWF2ZSgpCiAJCQkJCSMgY2FsbCBzY2hlZHVsZSgpIGluc3RlYWQKIAltb3ZlCWEwLCBzcAotCWxpCWExLCAxCi0JamFsCWRvX3N5c2NhbGxfdHJhY2UKKwlqYWwJc3lzY2FsbF90cmFjZV9sZWF2ZQogCWIJcmVzdW1lX3VzZXJzcGFjZQogCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX01JUFNSMikgfHwgZGVmaW5lZChDT05GSUdfTUlQU19NVCkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvaTgyNTMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvaTgyNTMuYwppbmRleCAyMzkyYTdhMi4uMzkxMjIxYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9pODI1My5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvaTgyNTMuYwpAQCAtMTI1LDg3ICsxMjUsMTEgQEAKIAlzZXR1cF9pcnEoMCwgJmlycTApOwogfQogCi0vKgotICogU2luY2UgdGhlIFBJVCBvdmVyZmxvd3MgZXZlcnkgdGljaywgaXRzIG5vdCB2ZXJ5IHVzZWZ1bAotICogdG8ganVzdCByZWFkIGJ5IGl0c2VsZi4gU28gdXNlIGppZmZpZXMgdG8gZW11bGF0ZSBhIGZyZWUKLSAqIHJ1bm5pbmcgY291bnRlcjoKLSAqLwotc3RhdGljIGN5Y2xlX3QgcGl0X3JlYWQoc3RydWN0IGNsb2Nrc291cmNlICpjcykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBjb3VudDsKLQl1MzIgamlmczsKLQlzdGF0aWMgaW50IG9sZF9jb3VudDsKLQlzdGF0aWMgdTMyIG9sZF9qaWZzOwotCi0JcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZpODI1M19sb2NrLCBmbGFncyk7Ci0JLyoKLQkgKiBBbHRob3VnaCBvdXIgY2FsbGVyIG1heSBoYXZlIHRoZSByZWFkIHNpZGUgb2YgeHRpbWVfbG9jaywKLQkgKiB0aGlzIGlzIG5vdyBhIHNlcWxvY2ssIGFuZCB3ZSBhcmUgY2hlYXRpbmcgaW4gdGhpcyByb3V0aW5lCi0JICogYnkgaGF2aW5nIHNpZGUgZWZmZWN0cyBvbiBzdGF0ZSB0aGF0IHdlIGNhbm5vdCB1bmRvIGlmCi0JICogdGhlcmUgaXMgYSBjb2xsaXNpb24gb24gdGhlIHNlcWxvY2sgYW5kIG91ciBjYWxsZXIgaGFzIHRvCi0JICogcmV0cnkuICAoTmFtZWx5LCBvbGRfamlmcyBhbmQgb2xkX2NvdW50LikgIFNvIHdlIG11c3QgdHJlYXQKLQkgKiBqaWZmaWVzIGFzIHZvbGF0aWxlIGRlc3BpdGUgdGhlIGxvY2suICBXZSByZWFkIGppZmZpZXMKLQkgKiBiZWZvcmUgbGF0Y2hpbmcgdGhlIHRpbWVyIGNvdW50IHRvIGd1YXJhbnRlZSB0aGF0IGFsdGhvdWdoCi0JICogdGhlIGppZmZpZXMgdmFsdWUgbWlnaHQgYmUgb2xkZXIgdGhhbiB0aGUgY291bnQgKHRoYXQgaXMsCi0JICogdGhlIGNvdW50ZXIgbWF5IHVuZGVyZmxvdyBiZXR3ZWVuIHRoZSBsYXN0IHBvaW50IHdoZXJlCi0JICogamlmZmllcyB3YXMgaW5jcmVtZW50ZWQgYW5kIHRoZSBwb2ludCB3aGVyZSB3ZSBsYXRjaCB0aGUKLQkgKiBjb3VudCksIGl0IGNhbm5vdCBiZSBuZXdlci4KLQkgKi8KLQlqaWZzID0gamlmZmllczsKLQlvdXRiX3AoMHgwMCwgUElUX01PREUpOwkvKiBsYXRjaCB0aGUgY291bnQgQVNBUCAqLwotCWNvdW50ID0gaW5iX3AoUElUX0NIMCk7CS8qIHJlYWQgdGhlIGxhdGNoZWQgY291bnQgKi8KLQljb3VudCB8PSBpbmJfcChQSVRfQ0gwKSA8PCA4OwotCi0JLyogVklBNjg2YSB0ZXN0IGNvZGUuLi4gcmVzZXQgdGhlIGxhdGNoIGlmIGNvdW50ID4gbWF4ICsgMSAqLwotCWlmIChjb3VudCA+IExBVENIKSB7Ci0JCW91dGJfcCgweDM0LCBQSVRfTU9ERSk7Ci0JCW91dGJfcChMQVRDSCAmIDB4ZmYsIFBJVF9DSDApOwotCQlvdXRiKExBVENIID4+IDgsIFBJVF9DSDApOwotCQljb3VudCA9IExBVENIIC0gMTsKLQl9Ci0KLQkvKgotCSAqIEl0J3MgcG9zc2libGUgZm9yIGNvdW50IHRvIGFwcGVhciB0byBnbyB0aGUgd3Jvbmcgd2F5IGZvciBhCi0JICogY291cGxlIG9mIHJlYXNvbnM6Ci0JICoKLQkgKiAgMS4gVGhlIHRpbWVyIGNvdW50ZXIgdW5kZXJmbG93cywgYnV0IHdlIGhhdmVuJ3QgaGFuZGxlZCB0aGUKLQkgKiAgICAgcmVzdWx0aW5nIGludGVycnVwdCBhbmQgaW5jcmVtZW50ZWQgamlmZmllcyB5ZXQuCi0JICogIDIuIEhhcmR3YXJlIHByb2JsZW0gd2l0aCB0aGUgdGltZXIsIG5vdCBnaXZpbmcgdXMgY29udGludW91cyB0aW1lLAotCSAqICAgICB0aGUgY291bnRlciBkb2VzIHNtYWxsICJqdW1wcyIgdXB3YXJkcyBvbiBzb21lIFBlbnRpdW0gc3lzdGVtcywKLQkgKiAgICAgKHNlZSBjJ3QgOTUvMTAgcGFnZSAzMzUgZm9yIE5lcHR1biBidWcuKQotCSAqCi0JICogUHJldmlvdXMgYXR0ZW1wdHMgdG8gaGFuZGxlIHRoZXNlIGNhc2VzIGludGVsbGlnZW50bHkgd2VyZQotCSAqIGJ1Z2d5LCBzbyB3ZSBqdXN0IGRvIHRoZSBzaW1wbGUgdGhpbmcgbm93LgotCSAqLwotCWlmIChjb3VudCA+IG9sZF9jb3VudCAmJiBqaWZzID09IG9sZF9qaWZzKSB7Ci0JCWNvdW50ID0gb2xkX2NvdW50OwotCX0KLQlvbGRfY291bnQgPSBjb3VudDsKLQlvbGRfamlmcyA9IGppZnM7Ci0KLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTgyNTNfbG9jaywgZmxhZ3MpOwotCi0JY291bnQgPSAoTEFUQ0ggLSAxKSAtIGNvdW50OwotCi0JcmV0dXJuIChjeWNsZV90KShqaWZzICogTEFUQ0gpICsgY291bnQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tzb3VyY2UgY2xvY2tzb3VyY2VfcGl0ID0gewotCS5uYW1lCT0gInBpdCIsCi0JLnJhdGluZyA9IDExMCwKLQkucmVhZAk9IHBpdF9yZWFkLAotCS5tYXNrCT0gQ0xPQ0tTT1VSQ0VfTUFTSygzMiksCi0JLm11bHQJPSAwLAotCS5zaGlmdAk9IDIwLAotfTsKLQogc3RhdGljIGludCBfX2luaXQgaW5pdF9waXRfY2xvY2tzb3VyY2Uodm9pZCkKIHsKIAlpZiAobnVtX3Bvc3NpYmxlX2NwdXMoKSA+IDEpIC8qIFBJVCBkb2VzIG5vdCBzY2FsZSEgKi8KIAkJcmV0dXJuIDA7CiAKLQljbG9ja3NvdXJjZV9waXQubXVsdCA9IGNsb2Nrc291cmNlX2h6Mm11bHQoQ0xPQ0tfVElDS19SQVRFLCAyMCk7Ci0JcmV0dXJuIGNsb2Nrc291cmNlX3JlZ2lzdGVyKCZjbG9ja3NvdXJjZV9waXQpOworCXJldHVybiBjbG9ja3NvdXJjZV9pODI1M19pbml0KCk7CiB9CiBhcmNoX2luaXRjYWxsKGluaXRfcGl0X2Nsb2Nrc291cmNlKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL21pcHMva2VybmVsL3B0cmFjZS5jCmluZGV4IDU4NGU2YjUuLjRlNmVhMWYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UuYwpAQCAtNTMzLDE1ICs1MzMsMTAgQEAKICAqIE5vdGlmaWNhdGlvbiBvZiBzeXN0ZW0gY2FsbCBlbnRyeS9leGl0CiAgKiAtIHRyaWdnZXJlZCBieSBjdXJyZW50LT53b3JrLnN5c2NhbGxfdHJhY2UKICAqLwotYXNtbGlua2FnZSB2b2lkIGRvX3N5c2NhbGxfdHJhY2Uoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBlbnRyeWV4aXQpCithc21saW5rYWdlIHZvaWQgc3lzY2FsbF90cmFjZV9lbnRlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAkvKiBkbyB0aGUgc2VjdXJlIGNvbXB1dGluZyBjaGVjayBmaXJzdCAqLwotCWlmICghZW50cnlleGl0KQotCQlzZWN1cmVfY29tcHV0aW5nKHJlZ3MtPnJlZ3NbMl0pOwotCi0JaWYgKHVubGlrZWx5KGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQpICYmIGVudHJ5ZXhpdCkKLQkJYXVkaXRfc3lzY2FsbF9leGl0KEFVRElUU0NfUkVTVUxUKHJlZ3MtPnJlZ3NbN10pLAotCQkgICAgICAgICAgICAgICAgICAgLXJlZ3MtPnJlZ3NbMl0pOworCXNlY3VyZV9jb21wdXRpbmcocmVncy0+cmVnc1syXSk7CiAKIAlpZiAoIShjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKSkKIAkJZ290byBvdXQ7CkBAIC01NjUsOCArNTYwLDQwIEBACiAJfQogCiBvdXQ6Ci0JaWYgKHVubGlrZWx5KGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQpICYmICFlbnRyeWV4aXQpCisJaWYgKHVubGlrZWx5KGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQpKQogCQlhdWRpdF9zeXNjYWxsX2VudHJ5KGF1ZGl0X2FyY2goKSwgcmVncy0+cmVnc1syXSwKIAkJCQkgICAgcmVncy0+cmVnc1s0XSwgcmVncy0+cmVnc1s1XSwKIAkJCQkgICAgcmVncy0+cmVnc1s2XSwgcmVncy0+cmVnc1s3XSk7CiB9CisKKy8qCisgKiBOb3RpZmljYXRpb24gb2Ygc3lzdGVtIGNhbGwgZW50cnkvZXhpdAorICogLSB0cmlnZ2VyZWQgYnkgY3VycmVudC0+d29yay5zeXNjYWxsX3RyYWNlCisgKi8KK2FzbWxpbmthZ2Ugdm9pZCBzeXNjYWxsX3RyYWNlX2xlYXZlKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmICh1bmxpa2VseShjdXJyZW50LT5hdWRpdF9jb250ZXh0KSkKKwkJYXVkaXRfc3lzY2FsbF9leGl0KEFVRElUU0NfUkVTVUxUKHJlZ3MtPnJlZ3NbN10pLAorCQkgICAgICAgICAgICAgICAgICAgLXJlZ3MtPnJlZ3NbMl0pOworCisJaWYgKCEoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpCisJCXJldHVybjsKKworCWlmICghdGVzdF90aHJlYWRfZmxhZyhUSUZfU1lTQ0FMTF9UUkFDRSkpCisJCXJldHVybjsKKworCS8qIFRoZSAweDgwIHByb3ZpZGVzIGEgd2F5IGZvciB0aGUgdHJhY2luZyBwYXJlbnQgdG8gZGlzdGluZ3Vpc2gKKwkgICBiZXR3ZWVuIGEgc3lzY2FsbCBzdG9wIGFuZCBTSUdUUkFQIGRlbGl2ZXJ5ICovCisJcHRyYWNlX25vdGlmeShTSUdUUkFQIHwgKChjdXJyZW50LT5wdHJhY2UgJiBQVF9UUkFDRVNZU0dPT0QpID8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MCA6IDApKTsKKworCS8qCisJICogdGhpcyBpc24ndCB0aGUgc2FtZSBhcyBjb250aW51aW5nIHdpdGggYSBzaWduYWwsIGJ1dCBpdCB3aWxsIGRvCisJICogZm9yIG5vcm1hbCB1c2UuICBzdHJhY2Ugb25seSBjb250aW51ZXMgd2l0aCBhIHNpZ25hbCBpZiB0aGUKKwkgKiBzdG9wcGluZyBzaWduYWwgaXMgbm90IFNJR1RSQVAuICAtYnJsCisJICovCisJaWYgKGN1cnJlbnQtPmV4aXRfY29kZSkgeworCQlzZW5kX3NpZyhjdXJyZW50LT5leGl0X2NvZGUsIGN1cnJlbnQsIDEpOworCQljdXJyZW50LT5leGl0X2NvZGUgPSAwOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGwzMi1vMzIuUyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGwzMi1vMzIuUwppbmRleCA3ZjEzNzdlLi43YThlMWRkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NjYWxsMzItbzMyLlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDMyLW8zMi5TCkBAIC04OCw4ICs4OCw3IEBACiAJU0FWRV9TVEFUSUMKIAltb3ZlCXMwLCB0MgogCW1vdmUJYTAsIHNwCi0JbGkJYTEsIDAKLQlqYWwJZG9fc3lzY2FsbF90cmFjZQorCWphbAlzeXNjYWxsX3RyYWNlX2VudGVyCiAKIAltb3ZlCXQwLCBzMAogCVJFU1RPUkVfU1RBVElDCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtNjQuUyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC02NC5TCmluZGV4IDdjMGVmN2YuLjJkMzFjODMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC02NC5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC02NC5TCkBAIC05MSw4ICs5MSw3IEBACiAJU0FWRV9TVEFUSUMKIAltb3ZlCXMwLCB0MgogCW1vdmUJYTAsIHNwCi0JbGkJYTEsIDAKLQlqYWwJZG9fc3lzY2FsbF90cmFjZQorCWphbAlzeXNjYWxsX3RyYWNlX2VudGVyCiAKIAltb3ZlCXQwLCBzMAogCVJFU1RPUkVfU1RBVElDCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbjMyLlMgYi9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbjMyLlMKaW5kZXggZGU2YzU1Ni4uMzhhMDUwMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW4zMi5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1uMzIuUwpAQCAtODksOCArODksNyBAQAogCVNBVkVfU1RBVElDCiAJbW92ZQlzMCwgdDIKIAltb3ZlCWEwLCBzcAotCWxpCWExLCAwCi0JamFsCWRvX3N5c2NhbGxfdHJhY2UKKwlqYWwJc3lzY2FsbF90cmFjZV9lbnRlcgogCiAJbW92ZQl0MCwgczAKIAlSRVNUT1JFX1NUQVRJQwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW8zMi5TIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW8zMi5TCmluZGV4IGIwNTQxZGQuLjkxZWE1ZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1vMzIuUworKysgYi9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbzMyLlMKQEAgLTEyMyw4ICsxMjMsNyBAQAogCiAJbW92ZQlzMCwgdDIJCQkjIFNhdmUgc3lzY2FsbCBwb2ludGVyCiAJbW92ZQlhMCwgc3AKLQlsaQlhMSwgMAotCWphbAlkb19zeXNjYWxsX3RyYWNlCisJamFsCXN5c2NhbGxfdHJhY2VfZW50ZXIKIAogCW1vdmUJdDAsIHMwCiAJUkVTVE9SRV9TVEFUSUMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc210Yy5jIGIvYXJjaC9taXBzL2tlcm5lbC9zbXRjLmMKaW5kZXggNWE4OGNjNC4uY2VkYWM0NiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zbXRjLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zbXRjLmMKQEAgLTkyOSw3ICs5MjksNyBAQAogCiBzdGF0aWMgdm9pZCBpcGlfcmVzY2hlZF9pbnRlcnJ1cHQodm9pZCkKIHsKLQkvKiBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQgc2hvdWxkIGJlIGVub3VnaCB0byBjYXVzZSBzY2hlZHVsZXIgY2hlY2sgKi8KKwlzY2hlZHVsZXJfaXBpKCk7CiB9CiAKIHN0YXRpYyB2b2lkIGlwaV9jYWxsX2ludGVycnVwdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zeXNjYWxsLmMgYi9hcmNoL21pcHMva2VybmVsL3N5c2NhbGwuYwppbmRleCA1OGJlYWJmLi5kMDI3NjU3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3N5c2NhbGwuYworKysgYi9hcmNoL21pcHMva2VybmVsL3N5c2NhbGwuYwpAQCAtMTAsMTIgKzEwLDkgQEAKICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgpAQCAtMjUsMTEgKzIyLDkgQEAKICNpbmNsdWRlIDxsaW51eC9tc2cuaD4KICNpbmNsdWRlIDxsaW51eC9zaG0uaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lwYy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvZWxmLmg+CiAKICNpbmNsdWRlIDxhc20vYXNtLmg+CkBAIC02NiwxMjEgKzYxLDYgQEAKIAlyZXR1cm4gcmVzOwogfQogCi11bnNpZ25lZCBsb25nIHNobV9hbGlnbl9tYXNrID0gUEFHRV9TSVpFIC0gMTsJLyogU2FuZSBjYWNoZXMgKi8KLQotRVhQT1JUX1NZTUJPTChzaG1fYWxpZ25fbWFzayk7Ci0KLSNkZWZpbmUgQ09MT1VSX0FMSUdOKGFkZHIscGdvZmYpCQkJCVwKLQkoKCgoYWRkcikgKyBzaG1fYWxpZ25fbWFzaykgJiB+c2htX2FsaWduX21hc2spICsJXAotCSAoKChwZ29mZikgPDwgUEFHRV9TSElGVCkgJiBzaG1fYWxpZ25fbWFzaykpCi0KLXVuc2lnbmVkIGxvbmcgYXJjaF9nZXRfdW5tYXBwZWRfYXJlYShzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgbG9uZyBhZGRyLAotCXVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHBnb2ZmLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtbTsKLQlpbnQgZG9fY29sb3JfYWxpZ247Ci0JdW5zaWduZWQgbG9uZyB0YXNrX3NpemU7Ci0KLSNpZmRlZiBDT05GSUdfMzJCSVQKLQl0YXNrX3NpemUgPSBUQVNLX1NJWkU7Ci0jZWxzZSAvKiBNdXN0IGJlIENPTkZJR182NEJJVCovCi0JdGFza19zaXplID0gdGVzdF90aHJlYWRfZmxhZyhUSUZfMzJCSVRfQUREUikgPyBUQVNLX1NJWkUzMiA6IFRBU0tfU0laRTsKLSNlbmRpZgotCi0JaWYgKGxlbiA+IHRhc2tfc2l6ZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAoZmxhZ3MgJiBNQVBfRklYRUQpIHsKLQkJLyogRXZlbiBNQVBfRklYRUQgbWFwcGluZ3MgbXVzdCByZXNpZGUgd2l0aGluIHRhc2tfc2l6ZS4gICovCi0JCWlmICh0YXNrX3NpemUgLSBsZW4gPCBhZGRyKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJLyoKLQkJICogV2UgZG8gbm90IGFjY2VwdCBhIHNoYXJlZCBtYXBwaW5nIGlmIGl0IHdvdWxkIHZpb2xhdGUKLQkJICogY2FjaGUgYWxpYXNpbmcgY29uc3RyYWludHMuCi0JCSAqLwotCQlpZiAoKGZsYWdzICYgTUFQX1NIQVJFRCkgJiYKLQkJICAgICgoYWRkciAtIChwZ29mZiA8PCBQQUdFX1NISUZUKSkgJiBzaG1fYWxpZ25fbWFzaykpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIGFkZHI7Ci0JfQotCi0JZG9fY29sb3JfYWxpZ24gPSAwOwotCWlmIChmaWxwIHx8IChmbGFncyAmIE1BUF9TSEFSRUQpKQotCQlkb19jb2xvcl9hbGlnbiA9IDE7Ci0JaWYgKGFkZHIpIHsKLQkJaWYgKGRvX2NvbG9yX2FsaWduKQotCQkJYWRkciA9IENPTE9VUl9BTElHTihhZGRyLCBwZ29mZik7Ci0JCWVsc2UKLQkJCWFkZHIgPSBQQUdFX0FMSUdOKGFkZHIpOwotCQl2bW0gPSBmaW5kX3ZtYShjdXJyZW50LT5tbSwgYWRkcik7Ci0JCWlmICh0YXNrX3NpemUgLSBsZW4gPj0gYWRkciAmJgotCQkgICAgKCF2bW0gfHwgYWRkciArIGxlbiA8PSB2bW0tPnZtX3N0YXJ0KSkKLQkJCXJldHVybiBhZGRyOwotCX0KLQlhZGRyID0gY3VycmVudC0+bW0tPm1tYXBfYmFzZTsKLQlpZiAoZG9fY29sb3JfYWxpZ24pCi0JCWFkZHIgPSBDT0xPVVJfQUxJR04oYWRkciwgcGdvZmYpOwotCWVsc2UKLQkJYWRkciA9IFBBR0VfQUxJR04oYWRkcik7Ci0KLQlmb3IgKHZtbSA9IGZpbmRfdm1hKGN1cnJlbnQtPm1tLCBhZGRyKTsgOyB2bW0gPSB2bW0tPnZtX25leHQpIHsKLQkJLyogQXQgdGhpcyBwb2ludDogICghdm1tIHx8IGFkZHIgPCB2bW0tPnZtX2VuZCkuICovCi0JCWlmICh0YXNrX3NpemUgLSBsZW4gPCBhZGRyKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCWlmICghdm1tIHx8IGFkZHIgKyBsZW4gPD0gdm1tLT52bV9zdGFydCkKLQkJCXJldHVybiBhZGRyOwotCQlhZGRyID0gdm1tLT52bV9lbmQ7Ci0JCWlmIChkb19jb2xvcl9hbGlnbikKLQkJCWFkZHIgPSBDT0xPVVJfQUxJR04oYWRkciwgcGdvZmYpOwotCX0KLX0KLQotdm9pZCBhcmNoX3BpY2tfbW1hcF9sYXlvdXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCi17Ci0JdW5zaWduZWQgbG9uZyByYW5kb21fZmFjdG9yID0gMFVMOwotCi0JaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfUkFORE9NSVpFKSB7Ci0JCXJhbmRvbV9mYWN0b3IgPSBnZXRfcmFuZG9tX2ludCgpOwotCQlyYW5kb21fZmFjdG9yID0gcmFuZG9tX2ZhY3RvciA8PCBQQUdFX1NISUZUOwotCQlpZiAoVEFTS19JU18zMkJJVF9BRERSKQotCQkJcmFuZG9tX2ZhY3RvciAmPSAweGZmZmZmZnVsOwotCQllbHNlCi0JCQlyYW5kb21fZmFjdG9yICY9IDB4ZmZmZmZmZnVsOwotCX0KLQotCW1tLT5tbWFwX2Jhc2UgPSBUQVNLX1VOTUFQUEVEX0JBU0UgKyByYW5kb21fZmFjdG9yOwotCW1tLT5nZXRfdW5tYXBwZWRfYXJlYSA9IGFyY2hfZ2V0X3VubWFwcGVkX2FyZWE7Ci0JbW0tPnVubWFwX2FyZWEgPSBhcmNoX3VubWFwX2FyZWE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBicmtfcm5kKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBybmQgPSBnZXRfcmFuZG9tX2ludCgpOwotCi0Jcm5kID0gcm5kIDw8IFBBR0VfU0hJRlQ7Ci0JLyogOE1CIGZvciAzMmJpdCwgMjU2TUIgZm9yIDY0Yml0ICovCi0JaWYgKFRBU0tfSVNfMzJCSVRfQUREUikKLQkJcm5kID0gcm5kICYgMHg3ZmZmZmZ1bDsKLQllbHNlCi0JCXJuZCA9IHJuZCAmIDB4ZmZmZmZmZnVsOwotCi0JcmV0dXJuIHJuZDsKLX0KLQotdW5zaWduZWQgbG9uZyBhcmNoX3JhbmRvbWl6ZV9icmsoc3RydWN0IG1tX3N0cnVjdCAqbW0pCi17Ci0JdW5zaWduZWQgbG9uZyBiYXNlID0gbW0tPmJyazsKLQl1bnNpZ25lZCBsb25nIHJldDsKLQotCXJldCA9IFBBR0VfQUxJR04oYmFzZSArIGJya19ybmQoKSk7Ci0KLQlpZiAocmV0IDwgbW0tPmJyaykKLQkJcmV0dXJuIG1tLT5icms7Ci0KLQlyZXR1cm4gcmV0OwotfQotCiBTWVNDQUxMX0RFRklORTYobWlwc19tbWFwLCB1bnNpZ25lZCBsb25nLCBhZGRyLCB1bnNpZ25lZCBsb25nLCBsZW4sCiAJdW5zaWduZWQgbG9uZywgcHJvdCwgdW5zaWduZWQgbG9uZywgZmxhZ3MsIHVuc2lnbmVkIGxvbmcsCiAJZmQsIG9mZl90LCBvZmZzZXQpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL21pcHMva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggZTRiMGIwYi4uY2QyY2E1NCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtNjgsNiArNjgsNyBAQAogCVJPREFUQQogCiAJLyogd3JpdGVhYmxlICovCisJX3NkYXRhID0gLjsJCQkJLyogU3RhcnQgb2YgZGF0YSBzZWN0aW9uICovCiAJLmRhdGEgOiB7CS8qIERhdGEgKi8KIAkJLiA9IC4gKyBEQVRBT0ZGU0VUOwkJLyogZm9yIENPTkZJR19NQVBQRURfS0VSTkVMICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sYW50aXEvS2NvbmZpZyBiL2FyY2gvbWlwcy9sYW50aXEvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmNjZjIxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2xhbnRpcS9LY29uZmlnCkBAIC0wLDAgKzEsMjMgQEAKK2lmIExBTlRJUQorCitjb25maWcgU09DX1RZUEVfWFdBWQorCWJvb2wKKwlkZWZhdWx0IG4KKworY2hvaWNlCisJcHJvbXB0ICJTb0MgVHlwZSIKKwlkZWZhdWx0IFNPQ19YV0FZCisKK2NvbmZpZyBTT0NfQU1BWk9OX1NFCisJYm9vbCAiQW1hem9uIFNFIgorCXNlbGVjdCBTT0NfVFlQRV9YV0FZCisKK2NvbmZpZyBTT0NfWFdBWQorCWJvb2wgIlhXQVkiCisJc2VsZWN0IFNPQ19UWVBFX1hXQVkKKwlzZWxlY3QgSFdfSEFTX1BDSQorZW5kY2hvaWNlCisKK3NvdXJjZSAiYXJjaC9taXBzL2xhbnRpcS94d2F5L0tjb25maWciCisKK2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGFudGlxL01ha2VmaWxlIGIvYXJjaC9taXBzL2xhbnRpcS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWRhZTBlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2xhbnRpcS9NYWtlZmlsZQpAQCAtMCwwICsxLDExIEBACisjIENvcHlyaWdodCAoQykgMjAxMCBKb2huIENyaXNwaW4gPGJsb2dpY0BvcGVud3J0Lm9yZz4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisjIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK29iai15IDo9IGlycS5vIHNldHVwLm8gY2xrLm8gcHJvbS5vIGRldmljZXMubworCitvYmotJChDT05GSUdfRUFSTFlfUFJJTlRLKSArPSBlYXJseV9wcmludGsubworCitvYmotJChDT05GSUdfU09DX1RZUEVfWFdBWSkgKz0geHdheS8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sYW50aXEvUGxhdGZvcm0gYi9hcmNoL21pcHMvbGFudGlxL1BsYXRmb3JtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZGZmMDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvbGFudGlxL1BsYXRmb3JtCkBAIC0wLDAgKzEsOCBAQAorIworIyBMYW50aXEKKyMKKworcGxhdGZvcm0tJChDT05GSUdfTEFOVElRKQkrPSBsYW50aXEvCitjZmxhZ3MtJChDT05GSUdfTEFOVElRKQkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxhbnRpcQorbG9hZC0kKENPTkZJR19MQU5USVEpCQk9IDB4ZmZmZmZmZmY4MDAwMjAwMAorY2ZsYWdzLSQoQ09ORklHX1NPQ19UWVBFX1hXQVkpCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sYW50aXEveHdheQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xhbnRpcS9jbGsuYyBiL2FyY2gvbWlwcy9sYW50aXEvY2xrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ1NjA4OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9sYW50aXEvY2xrLmMKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaG9tYXMgTGFuZ2VyIDx0aG9tYXMubGFuZ2VyQGxhbnRpcS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgSm9obiBDcmlzcGluIDxibG9naWNAb3BlbndydC5vcmc+CisgKi8KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgPGFzbS90aW1lLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjaW5jbHVkZSA8bGFudGlxX3NvYy5oPgorCisjaW5jbHVkZSAiY2xrLmgiCisKK3N0cnVjdCBjbGsgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdW5zaWduZWQgbG9uZyByYXRlOworCXVuc2lnbmVkIGxvbmcgKCpnZXRfcmF0ZSkgKHZvaWQpOworfTsKKworc3RhdGljIHN0cnVjdCBjbGsgKmNwdV9jbGs7CitzdGF0aWMgaW50IGNwdV9jbGtfY250OworCisvKiBsYW50aXEgc29jcyBoYXZlIDMgc3RhdGljIGNsb2NrcyAqLworc3RhdGljIHN0cnVjdCBjbGsgY3B1X2Nsa19nZW5lcmljW10gPSB7CisJeworCQkubmFtZSA9ICJjcHUiLAorCQkuZ2V0X3JhdGUgPSBsdHFfZ2V0X2NwdV9oeiwKKwl9LCB7CisJCS5uYW1lID0gImZwaSIsCisJCS5nZXRfcmF0ZSA9IGx0cV9nZXRfZnBpX2h6LAorCX0sIHsKKwkJLm5hbWUgPSAiaW8iLAorCQkuZ2V0X3JhdGUgPSBsdHFfZ2V0X2lvX3JlZ2lvbl9jbG9jaywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBsdHFfY2d1X3Jlc291cmNlID0geworCS5uYW1lCT0gImNndSIsCisJLnN0YXJ0CT0gTFRRX0NHVV9CQVNFX0FERFIsCisJLmVuZAk9IExUUV9DR1VfQkFTRV9BRERSICsgTFRRX0NHVV9TSVpFIC0gMSwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKK307CisKKy8qIHJlbWFwcGVkIGNsb2NrIHJlZ2lzdGVyIHJhbmdlICovCit2b2lkIF9faW9tZW0gKmx0cV9jZ3VfbWVtYmFzZTsKKwordm9pZCBjbGtfaW5pdCh2b2lkKQoreworCWNwdV9jbGsgPSBjcHVfY2xrX2dlbmVyaWM7CisJY3B1X2Nsa19jbnQgPSBBUlJBWV9TSVpFKGNwdV9jbGtfZ2VuZXJpYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNsa19nb29kKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gY2xrICYmICFJU19FUlIoY2xrKTsKK30KKwordW5zaWduZWQgbG9uZyBjbGtfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCWlmICh1bmxpa2VseSghY2xrX2dvb2QoY2xrKSkpCisJCXJldHVybiAwOworCisJaWYgKGNsay0+cmF0ZSAhPSAwKQorCQlyZXR1cm4gY2xrLT5yYXRlOworCisJaWYgKGNsay0+Z2V0X3JhdGUgIT0gTlVMTCkKKwkJcmV0dXJuIGNsay0+Z2V0X3JhdGUoKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChjbGtfZ2V0X3JhdGUpOworCitzdHJ1Y3QgY2xrICpjbGtfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY3B1X2Nsa19jbnQ7IGkrKykKKwkJaWYgKCFzdHJjbXAoaWQsIGNwdV9jbGtbaV0ubmFtZSkpCisJCQlyZXR1cm4gJmNwdV9jbGtbaV07CisJQlVHKCk7CisJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7Cit9CitFWFBPUlRfU1lNQk9MKGNsa19nZXQpOworCit2b2lkIGNsa19wdXQoc3RydWN0IGNsayAqY2xrKQoreworCS8qIG5vdCB1c2VkICovCit9CitFWFBPUlRfU1lNQk9MKGNsa19wdXQpOworCitzdGF0aWMgaW5saW5lIHUzMiBsdHFfZ2V0X2NvdW50ZXJfcmVzb2x1dGlvbih2b2lkKQoreworCXUzMiByZXM7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJIi5zZXQgICBwdXNoXG4iCisJCSIuc2V0ICAgbWlwczMycjJcbiIKKwkJInJkaHdyICAlMCwgJDNcbiIKKwkJIi5zZXQgcG9wXG4iCisJCTogIj0mciIgKHJlcykKKwkJOiAvKiBubyBpbnB1dCAqLworCQk6ICJtZW1vcnkiKTsKKworCXJldHVybiByZXM7Cit9CisKK3ZvaWQgX19pbml0IHBsYXRfdGltZV9pbml0KHZvaWQpCit7CisJc3RydWN0IGNsayAqY2xrOworCisJaWYgKGluc2VydF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZsdHFfY2d1X3Jlc291cmNlKSA8IDApCisJCXBhbmljKCJGYWlsZWQgdG8gaW5zZXJ0IGNndSBtZW1vcnlcbiIpOworCisJaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihsdHFfY2d1X3Jlc291cmNlLnN0YXJ0LAorCQkJcmVzb3VyY2Vfc2l6ZSgmbHRxX2NndV9yZXNvdXJjZSksICJjZ3UiKSA8IDApCisJCXBhbmljKCJGYWlsZWQgdG8gcmVxdWVzdCBjZ3UgbWVtb3J5XG4iKTsKKworCWx0cV9jZ3VfbWVtYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShsdHFfY2d1X3Jlc291cmNlLnN0YXJ0LAorCQkJCXJlc291cmNlX3NpemUoJmx0cV9jZ3VfcmVzb3VyY2UpKTsKKwlpZiAoIWx0cV9jZ3VfbWVtYmFzZSkgeworCQlwcl9lcnIoIkZhaWxlZCB0byByZW1hcCBjZ3UgbWVtb3J5XG4iKTsKKwkJdW5yZWFjaGFibGUoKTsKKwl9CisJY2xrID0gY2xrX2dldCgwLCAiY3B1Iik7CisJbWlwc19ocHRfZnJlcXVlbmN5ID0gY2xrX2dldF9yYXRlKGNsaykgLyBsdHFfZ2V0X2NvdW50ZXJfcmVzb2x1dGlvbigpOworCXdyaXRlX2MwX2NvbXBhcmUocmVhZF9jMF9jb3VudCgpKTsKKwljbGtfcHV0KGNsayk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGFudGlxL2Nsay5oIGIvYXJjaC9taXBzL2xhbnRpcS9jbGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzI4OTI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2xhbnRpcS9jbGsuaApAQCAtMCwwICsxLDE4IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgSm9obiBDcmlzcGluIDxibG9naWNAb3BlbndydC5vcmc+CisgKi8KKworI2lmbmRlZiBfTFRRX0NMS19IX18KKyNkZWZpbmUgX0xUUV9DTEtfSF9fCisKK2V4dGVybiB2b2lkIGNsa19pbml0KHZvaWQpOworCitleHRlcm4gdW5zaWduZWQgbG9uZyBsdHFfZ2V0X2NwdV9oeih2b2lkKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGx0cV9nZXRfZnBpX2h6KHZvaWQpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbHRxX2dldF9pb19yZWdpb25fY2xvY2sodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xhbnRpcS9kZXZpY2VzLmMgYi9hcmNoL21pcHMvbGFudGlxL2RldmljZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjgyYzM0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2xhbnRpcS9kZXZpY2VzLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgSm9obiBDcmlzcGluIDxibG9naWNAb3BlbndydC5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisKKyNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxsYW50aXFfc29jLmg+CisKKyNpbmNsdWRlICJkZXZpY2VzLmgiCisKKy8qIG5vciBmbGFzaCAqLworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBsdHFfbm9yX3Jlc291cmNlID0geworCS5uYW1lCT0gIm5vciIsCisJLnN0YXJ0CT0gTFRRX0ZMQVNIX1NUQVJULAorCS5lbmQJPSBMVFFfRkxBU0hfU1RBUlQgKyBMVFFfRkxBU0hfTUFYIC0gMSwKKwkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBsdHFfbm9yID0geworCS5uYW1lCQk9ICJsdHFfbm9yIiwKKwkucmVzb3VyY2UJPSAmbHRxX25vcl9yZXNvdXJjZSwKKwkubnVtX3Jlc291cmNlcwk9IDEsCit9OworCit2b2lkIF9faW5pdCBsdHFfcmVnaXN0ZXJfbm9yKHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgKmRhdGEpCit7CisJbHRxX25vci5kZXYucGxhdGZvcm1fZGF0YSA9IGRhdGE7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZsdHFfbm9yKTsKK30KKworLyogd2F0Y2hkb2cgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbHRxX3dkdF9yZXNvdXJjZSA9IHsKKwkubmFtZQk9ICJ3YXRjaGRvZyIsCisJLnN0YXJ0ICA9IExUUV9XRFRfQkFTRV9BRERSLAorCS5lbmQgICAgPSBMVFFfV0RUX0JBU0VfQUREUiArIExUUV9XRFRfU0laRSAtIDEsCisJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorfTsKKwordm9pZCBfX2luaXQgbHRxX3JlZ2lzdGVyX3dkdCh2b2lkKQoreworCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoImx0cV93ZHQiLCAwLCAmbHRxX3dkdF9yZXNvdXJjZSwgMSk7Cit9CisKKy8qIGFzYyBwb3J0cyAqLworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBsdHFfYXNjMF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5uYW1lCT0gImFzYzAiLAorCQkuc3RhcnQgID0gTFRRX0FTQzBfQkFTRV9BRERSLAorCQkuZW5kICAgID0gTFRRX0FTQzBfQkFTRV9BRERSICsgTFRRX0FTQ19TSVpFIC0gMSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJSVJRX1JFUyh0eCwgTFRRX0FTQ19USVIoMCkpLAorCUlSUV9SRVMocngsIExUUV9BU0NfUklSKDApKSwKKwlJUlFfUkVTKGVyciwgTFRRX0FTQ19FSVIoMCkpLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBsdHFfYXNjMV9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5uYW1lCT0gImFzYzEiLAorCQkuc3RhcnQgID0gTFRRX0FTQzFfQkFTRV9BRERSLAorCQkuZW5kICAgID0gTFRRX0FTQzFfQkFTRV9BRERSICsgTFRRX0FTQ19TSVpFIC0gMSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJSVJRX1JFUyh0eCwgTFRRX0FTQ19USVIoMSkpLAorCUlSUV9SRVMocngsIExUUV9BU0NfUklSKDEpKSwKKwlJUlFfUkVTKGVyciwgTFRRX0FTQ19FSVIoMSkpLAorfTsKKwordm9pZCBfX2luaXQgbHRxX3JlZ2lzdGVyX2FzYyhpbnQgcG9ydCkKK3sKKwlzd2l0Y2ggKHBvcnQpIHsKKwljYXNlIDA6CisJCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoImx0cV9hc2MiLCAwLAorCQkJbHRxX2FzYzBfcmVzb3VyY2VzLCBBUlJBWV9TSVpFKGx0cV9hc2MwX3Jlc291cmNlcykpOworCQlicmVhazsKKwljYXNlIDE6CisJCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoImx0cV9hc2MiLCAxLAorCQkJbHRxX2FzYzFfcmVzb3VyY2VzLCBBUlJBWV9TSVpFKGx0cV9hc2MxX3Jlc291cmNlcykpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfUENJCisvKiBwY2kgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGx0cV9wY2kgPSB7CisJLm5hbWUJCT0gImx0cV9wY2kiLAorCS5udW1fcmVzb3VyY2VzCT0gMCwKK307CisKK3ZvaWQgX19pbml0IGx0cV9yZWdpc3Rlcl9wY2koc3RydWN0IGx0cV9wY2lfZGF0YSAqZGF0YSkKK3sKKwlsdHFfcGNpLmRldi5wbGF0Zm9ybV9kYXRhID0gZGF0YTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmx0cV9wY2kpOworfQorI2Vsc2UKK3ZvaWQgX19pbml0IGx0cV9yZWdpc3Rlcl9wY2koc3RydWN0IGx0cV9wY2lfZGF0YSAqZGF0YSkKK3sKKwlwcl9lcnIoImtlcm5lbCBpcyBjb21waWxlZCB3aXRob3V0IFBDSSBzdXBwb3J0XG4iKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xhbnRpcS9kZXZpY2VzLmggYi9hcmNoL21pcHMvbGFudGlxL2RldmljZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTQ3YmIxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2xhbnRpcS9kZXZpY2VzLmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAorICogIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBKb2huIENyaXNwaW4gPGJsb2dpY0BvcGVud3J0Lm9yZz4KKyAqLworCisjaWZuZGVmIF9MVFFfREVWSUNFU19IX18KKyNkZWZpbmUgX0xUUV9ERVZJQ0VTX0hfXworCisjaW5jbHVkZSA8bGFudGlxX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKworI2RlZmluZSBJUlFfUkVTKHJlc25hbWUsIGlycSkgXAorCXsubmFtZSA9ICNyZXNuYW1lLCAuc3RhcnQgPSAoaXJxKSwgLmZsYWdzID0gSU9SRVNPVVJDRV9JUlF9CisKK2V4dGVybiB2b2lkIGx0cV9yZWdpc3Rlcl9ub3Ioc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSAqZGF0YSk7CitleHRlcm4gdm9pZCBsdHFfcmVnaXN0ZXJfd2R0KHZvaWQpOworZXh0ZXJuIHZvaWQgbHRxX3JlZ2lzdGVyX2FzYyhpbnQgcG9ydCk7CitleHRlcm4gdm9pZCBsdHFfcmVnaXN0ZXJfcGNpKHN0cnVjdCBsdHFfcGNpX2RhdGEgKmRhdGEpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sYW50aXEvZWFybHlfcHJpbnRrLmMgYi9hcmNoL21pcHMvbGFudGlxL2Vhcmx5X3ByaW50ay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MmUwNWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvbGFudGlxL2Vhcmx5X3ByaW50ay5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgSm9obiBDcmlzcGluIDxibG9naWNAb3BlbndydC5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKworI2luY2x1ZGUgPGxhbnRpcS5oPgorI2luY2x1ZGUgPGxhbnRpcV9zb2MuaD4KKworLyogbm8gaW9yZW1hcCBwb3NzaWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlLCBsZXRzIHVzZSBLU0VHMSBpbnN0ZWFkICAqLworI2RlZmluZSBMVFFfQVNDX0JBU0UJS1NFRzFBRERSKExUUV9BU0MxX0JBU0VfQUREUikKKyNkZWZpbmUgQVNDX0JVRgkJMTAyNAorI2RlZmluZSBMVFFfQVNDX0ZTVEFUCSgodTMyICopKExUUV9BU0NfQkFTRSArIDB4MDA0OCkpCisjZGVmaW5lIExUUV9BU0NfVEJVRgkoKHUzMiAqKShMVFFfQVNDX0JBU0UgKyAweDAwMjApKQorI2RlZmluZSBUWE1BU0sJCTB4M0YwMAorI2RlZmluZSBUWE9GRlNFVAk4CisKK3ZvaWQgcHJvbV9wdXRjaGFyKGNoYXIgYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWRvIHsgfSB3aGlsZSAoKGx0cV9yMzIoTFRRX0FTQ19GU1RBVCkgJiBUWE1BU0spID4+IFRYT0ZGU0VUKTsKKwlpZiAoYyA9PSAnXG4nKQorCQlsdHFfdzMyKCdccicsIExUUV9BU0NfVEJVRik7CisJbHRxX3czMihjLCBMVFFfQVNDX1RCVUYpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sYW50aXEvaXJxLmMgYi9hcmNoL21pcHMvbGFudGlxL2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjODk3OTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvbGFudGlxL2lycS5jCkBAIC0wLDAgKzEsMzI2IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgSm9obiBDcmlzcGluIDxibG9naWNAb3BlbndydC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhvbWFzIExhbmdlciA8dGhvbWFzLmxhbmdlckBsYW50aXEuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKworI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgorI2luY2x1ZGUgPGFzbS9pcnFfY3B1Lmg+CisKKyNpbmNsdWRlIDxsYW50aXFfc29jLmg+CisjaW5jbHVkZSA8aXJxLmg+CisKKy8qIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIExUUV9JQ1VfSU0wX0lTUgkJMHgwMDAwCisjZGVmaW5lIExUUV9JQ1VfSU0wX0lFUgkJMHgwMDA4CisjZGVmaW5lIExUUV9JQ1VfSU0wX0lPU1IJMHgwMDEwCisjZGVmaW5lIExUUV9JQ1VfSU0wX0lSU1IJMHgwMDE4CisjZGVmaW5lIExUUV9JQ1VfSU0wX0lNUgkJMHgwMDIwCisjZGVmaW5lIExUUV9JQ1VfSU0xX0lTUgkJMHgwMDI4CisjZGVmaW5lIExUUV9JQ1VfT0ZGU0VUCQkoTFRRX0lDVV9JTTFfSVNSIC0gTFRRX0lDVV9JTTBfSVNSKQorCisjZGVmaW5lIExUUV9FSVVfRVhJTl9DCQkweDAwMDAKKyNkZWZpbmUgTFRRX0VJVV9FWElOX0lOSUMJMHgwMDA0CisjZGVmaW5lIExUUV9FSVVfRVhJTl9JTkVOCTB4MDAwQworCisvKiBpcnEgbnVtYmVycyB1c2VkIGJ5IHRoZSBleHRlcm5hbCBpbnRlcnJ1cHQgdW5pdCAoRUlVKSAqLworI2RlZmluZSBMVFFfRUlVX0lSMAkJKElOVF9OVU1fSU00X0lSTDAgKyAzMCkKKyNkZWZpbmUgTFRRX0VJVV9JUjEJCShJTlRfTlVNX0lNM19JUkwwICsgMzEpCisjZGVmaW5lIExUUV9FSVVfSVIyCQkoSU5UX05VTV9JTTFfSVJMMCArIDI2KQorI2RlZmluZSBMVFFfRUlVX0lSMwkJSU5UX05VTV9JTTFfSVJMMAorI2RlZmluZSBMVFFfRUlVX0lSNAkJKElOVF9OVU1fSU0xX0lSTDAgKyAxKQorI2RlZmluZSBMVFFfRUlVX0lSNQkJKElOVF9OVU1fSU0xX0lSTDAgKyAyKQorI2RlZmluZSBMVFFfRUlVX0lSNgkJKElOVF9OVU1fSU0yX0lSTDAgKyAzMCkKKworI2RlZmluZSBNQVhfRUlVCQkJNgorCisvKiBpcnFzIGdlbmVyYXRlZCBieSBkZXZpY2UgYXR0YWNoZWQgdG8gdGhlIEVCVSBuZWVkIHRvIGJlIGFja2VkIGluCisgKiBhIHNwZWNpYWwgbWFubmVyCisgKi8KKyNkZWZpbmUgTFRRX0lDVV9FQlVfSVJRCQkyMgorCisjZGVmaW5lIGx0cV9pY3VfdzMyKHgsIHkpCWx0cV93MzIoKHgpLCBsdHFfaWN1X21lbWJhc2UgKyAoeSkpCisjZGVmaW5lIGx0cV9pY3VfcjMyKHgpCQlsdHFfcjMyKGx0cV9pY3VfbWVtYmFzZSArICh4KSkKKworI2RlZmluZSBsdHFfZWl1X3czMih4LCB5KQlsdHFfdzMyKCh4KSwgbHRxX2VpdV9tZW1iYXNlICsgKHkpKQorI2RlZmluZSBsdHFfZWl1X3IzMih4KQkJbHRxX3IzMihsdHFfZWl1X21lbWJhc2UgKyAoeCkpCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBsdHFfZWl1X2lycVtNQVhfRUlVXSA9IHsKKwlMVFFfRUlVX0lSMCwKKwlMVFFfRUlVX0lSMSwKKwlMVFFfRUlVX0lSMiwKKwlMVFFfRUlVX0lSMywKKwlMVFFfRUlVX0lSNCwKKwlMVFFfRUlVX0lSNSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbHRxX2ljdV9yZXNvdXJjZSA9IHsKKwkubmFtZQk9ICJpY3UiLAorCS5zdGFydAk9IExUUV9JQ1VfQkFTRV9BRERSLAorCS5lbmQJPSBMVFFfSUNVX0JBU0VfQUREUiArIExUUV9JQ1VfU0laRSAtIDEsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGx0cV9laXVfcmVzb3VyY2UgPSB7CisJLm5hbWUJPSAiZWl1IiwKKwkuc3RhcnQJPSBMVFFfRUlVX0JBU0VfQUREUiwKKwkuZW5kCT0gTFRRX0VJVV9CQVNFX0FERFIgKyBMVFFfSUNVX1NJWkUgLSAxLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHZvaWQgX19pb21lbSAqbHRxX2ljdV9tZW1iYXNlOworc3RhdGljIHZvaWQgX19pb21lbSAqbHRxX2VpdV9tZW1iYXNlOworCit2b2lkIGx0cV9kaXNhYmxlX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJdTMyIGllciA9IExUUV9JQ1VfSU0wX0lFUjsKKwlpbnQgaXJxX25yID0gZC0+aXJxIC0gSU5UX05VTV9JUlEwOworCisJaWVyICs9IExUUV9JQ1VfT0ZGU0VUICogKGlycV9uciAvIElOVF9OVU1fSU1fT0ZGU0VUKTsKKwlpcnFfbnIgJT0gSU5UX05VTV9JTV9PRkZTRVQ7CisJbHRxX2ljdV93MzIobHRxX2ljdV9yMzIoaWVyKSAmIH4oMSA8PCBpcnFfbnIpLCBpZXIpOworfQorCit2b2lkIGx0cV9tYXNrX2FuZF9hY2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwl1MzIgaWVyID0gTFRRX0lDVV9JTTBfSUVSOworCXUzMiBpc3IgPSBMVFFfSUNVX0lNMF9JU1I7CisJaW50IGlycV9uciA9IGQtPmlycSAtIElOVF9OVU1fSVJRMDsKKworCWllciArPSBMVFFfSUNVX09GRlNFVCAqIChpcnFfbnIgLyBJTlRfTlVNX0lNX09GRlNFVCk7CisJaXNyICs9IExUUV9JQ1VfT0ZGU0VUICogKGlycV9uciAvIElOVF9OVU1fSU1fT0ZGU0VUKTsKKwlpcnFfbnIgJT0gSU5UX05VTV9JTV9PRkZTRVQ7CisJbHRxX2ljdV93MzIobHRxX2ljdV9yMzIoaWVyKSAmIH4oMSA8PCBpcnFfbnIpLCBpZXIpOworCWx0cV9pY3VfdzMyKCgxIDw8IGlycV9uciksIGlzcik7Cit9CisKK3N0YXRpYyB2b2lkIGx0cV9hY2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwl1MzIgaXNyID0gTFRRX0lDVV9JTTBfSVNSOworCWludCBpcnFfbnIgPSBkLT5pcnEgLSBJTlRfTlVNX0lSUTA7CisKKwlpc3IgKz0gTFRRX0lDVV9PRkZTRVQgKiAoaXJxX25yIC8gSU5UX05VTV9JTV9PRkZTRVQpOworCWlycV9uciAlPSBJTlRfTlVNX0lNX09GRlNFVDsKKwlsdHFfaWN1X3czMigoMSA8PCBpcnFfbnIpLCBpc3IpOworfQorCit2b2lkIGx0cV9lbmFibGVfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwl1MzIgaWVyID0gTFRRX0lDVV9JTTBfSUVSOworCWludCBpcnFfbnIgPSBkLT5pcnEgLSBJTlRfTlVNX0lSUTA7CisKKwlpZXIgKz0gTFRRX0lDVV9PRkZTRVQgICogKGlycV9uciAvIElOVF9OVU1fSU1fT0ZGU0VUKTsKKwlpcnFfbnIgJT0gSU5UX05VTV9JTV9PRkZTRVQ7CisJbHRxX2ljdV93MzIobHRxX2ljdV9yMzIoaWVyKSB8ICgxIDw8IGlycV9uciksIGllcik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbHRxX3N0YXJ0dXBfZWl1X2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJaW50IGk7CisJaW50IGlycV9uciA9IGQtPmlycSAtIElOVF9OVU1fSVJRMDsKKworCWx0cV9lbmFibGVfaXJxKGQpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfRUlVOyBpKyspIHsKKwkJaWYgKGlycV9uciA9PSBsdHFfZWl1X2lycVtpXSkgeworCQkJLyogbG93IGxldmVsIC0gd2Ugc2hvdWxkIHJlYWxseSBoYW5kbGUgc2V0X3R5cGUgKi8KKwkJCWx0cV9laXVfdzMyKGx0cV9laXVfcjMyKExUUV9FSVVfRVhJTl9DKSB8CisJCQkJKDB4NiA8PCAoaSAqIDQpKSwgTFRRX0VJVV9FWElOX0MpOworCQkJLyogY2xlYXIgYWxsIHBlbmRpbmcgKi8KKwkJCWx0cV9laXVfdzMyKGx0cV9laXVfcjMyKExUUV9FSVVfRVhJTl9JTklDKSAmIH4oMSA8PCBpKSwKKwkJCQlMVFFfRUlVX0VYSU5fSU5JQyk7CisJCQkvKiBlbmFibGUgKi8KKwkJCWx0cV9laXVfdzMyKGx0cV9laXVfcjMyKExUUV9FSVVfRVhJTl9JTkVOKSB8ICgxIDw8IGkpLAorCQkJCUxUUV9FSVVfRVhJTl9JTkVOKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGx0cV9zaHV0ZG93bl9laXVfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlpbnQgaTsKKwlpbnQgaXJxX25yID0gZC0+aXJxIC0gSU5UX05VTV9JUlEwOworCisJbHRxX2Rpc2FibGVfaXJxKGQpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfRUlVOyBpKyspIHsKKwkJaWYgKGlycV9uciA9PSBsdHFfZWl1X2lycVtpXSkgeworCQkJLyogZGlzYWJsZSAqLworCQkJbHRxX2VpdV93MzIobHRxX2VpdV9yMzIoTFRRX0VJVV9FWElOX0lORU4pICYgfigxIDw8IGkpLAorCQkJCUxUUV9FSVVfRVhJTl9JTkVOKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGx0cV9pcnFfdHlwZSA9IHsKKwkiaWN1IiwKKwkuaXJxX2VuYWJsZSA9IGx0cV9lbmFibGVfaXJxLAorCS5pcnFfZGlzYWJsZSA9IGx0cV9kaXNhYmxlX2lycSwKKwkuaXJxX3VubWFzayA9IGx0cV9lbmFibGVfaXJxLAorCS5pcnFfYWNrID0gbHRxX2Fja19pcnEsCisJLmlycV9tYXNrID0gbHRxX2Rpc2FibGVfaXJxLAorCS5pcnFfbWFza19hY2sgPSBsdHFfbWFza19hbmRfYWNrX2lycSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbHRxX2VpdV90eXBlID0geworCSJlaXUiLAorCS5pcnFfc3RhcnR1cCA9IGx0cV9zdGFydHVwX2VpdV9pcnEsCisJLmlycV9zaHV0ZG93biA9IGx0cV9zaHV0ZG93bl9laXVfaXJxLAorCS5pcnFfZW5hYmxlID0gbHRxX2VuYWJsZV9pcnEsCisJLmlycV9kaXNhYmxlID0gbHRxX2Rpc2FibGVfaXJxLAorCS5pcnFfdW5tYXNrID0gbHRxX2VuYWJsZV9pcnEsCisJLmlycV9hY2sgPSBsdHFfYWNrX2lycSwKKwkuaXJxX21hc2sgPSBsdHFfZGlzYWJsZV9pcnEsCisJLmlycV9tYXNrX2FjayA9IGx0cV9tYXNrX2FuZF9hY2tfaXJxLAorfTsKKworc3RhdGljIHZvaWQgbHRxX2h3X2lycWRpc3BhdGNoKGludCBtb2R1bGUpCit7CisJdTMyIGlycTsKKworCWlycSA9IGx0cV9pY3VfcjMyKExUUV9JQ1VfSU0wX0lPU1IgKyAobW9kdWxlICogTFRRX0lDVV9PRkZTRVQpKTsKKwlpZiAoaXJxID09IDApCisJCXJldHVybjsKKworCS8qIHNpbGljb24gYnVnIGNhdXNlcyBvbmx5IHRoZSBtc2Igc2V0IHRvIDEgdG8gYmUgdmFsaWQuIGFsbAorCSAqIG90aGVyIGJpdHMgbWlnaHQgYmUgYm9ndXMKKwkgKi8KKwlpcnEgPSBfX2ZscyhpcnEpOworCWRvX0lSUSgoaW50KWlycSArIElOVF9OVU1fSU0wX0lSTDAgKyAoSU5UX05VTV9JTV9PRkZTRVQgKiBtb2R1bGUpKTsKKworCS8qIGlmIHRoaXMgaXMgYSBFQlUgaXJxLCB3ZSBuZWVkIHRvIGFjayBpdCBvciBnZXQgYSBkZWFkbG9jayAqLworCWlmICgoaXJxID09IExUUV9JQ1VfRUJVX0lSUSkgJiYgKG1vZHVsZSA9PSAwKSkKKwkJbHRxX2VidV93MzIobHRxX2VidV9yMzIoTFRRX0VCVV9QQ0NfSVNUQVQpIHwgMHgxMCwKKwkJCUxUUV9FQlVfUENDX0lTVEFUKTsKK30KKworI2RlZmluZSBERUZJTkVfSFd4X0lSUURJU1BBVENIKHgpCQkJCQlcCisJc3RhdGljIHZvaWQgbHRxX2h3ICMjIHggIyMgX2lycWRpc3BhdGNoKHZvaWQpCQkJXAorCXsJCQkJCQkJCVwKKwkJbHRxX2h3X2lycWRpc3BhdGNoKHgpOwkJCQkJXAorCX0KK0RFRklORV9IV3hfSVJRRElTUEFUQ0goMCkKK0RFRklORV9IV3hfSVJRRElTUEFUQ0goMSkKK0RFRklORV9IV3hfSVJRRElTUEFUQ0goMikKK0RFRklORV9IV3hfSVJRRElTUEFUQ0goMykKK0RFRklORV9IV3hfSVJRRElTUEFUQ0goNCkKKworc3RhdGljIHZvaWQgbHRxX2h3NV9pcnFkaXNwYXRjaCh2b2lkKQoreworCWRvX0lSUShNSVBTX0NQVV9USU1FUl9JUlEpOworfQorCithc21saW5rYWdlIHZvaWQgcGxhdF9pcnFfZGlzcGF0Y2godm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgcGVuZGluZyA9IHJlYWRfYzBfc3RhdHVzKCkgJiByZWFkX2MwX2NhdXNlKCkgJiBTVDBfSU07CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAocGVuZGluZyAmIENBVVNFRl9JUDcpIHsKKwkJZG9fSVJRKE1JUFNfQ1BVX1RJTUVSX0lSUSk7CisJCWdvdG8gb3V0OworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJCWlmIChwZW5kaW5nICYgKENBVVNFRl9JUDIgPDwgaSkpIHsKKwkJCQlsdHFfaHdfaXJxZGlzcGF0Y2goaSk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwl9CisJcHJfYWxlcnQoIlNwdXJpb3VzIElSUTogQ0FVU0U9MHglMDh4XG4iLCByZWFkX2MwX3N0YXR1cygpKTsKKworb3V0OgorCXJldHVybjsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gY2FzY2FkZSA9IHsKKwkuaGFuZGxlciA9IG5vX2FjdGlvbiwKKwkuZmxhZ3MgPSBJUlFGX0RJU0FCTEVELAorCS5uYW1lID0gImNhc2NhZGUiLAorfTsKKwordm9pZCBfX2luaXQgYXJjaF9pbml0X2lycSh2b2lkKQoreworCWludCBpOworCisJaWYgKGluc2VydF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZsdHFfaWN1X3Jlc291cmNlKSA8IDApCisJCXBhbmljKCJGYWlsZWQgdG8gaW5zZXJ0IGljdSBtZW1vcnlcbiIpOworCisJaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihsdHFfaWN1X3Jlc291cmNlLnN0YXJ0LAorCQkJcmVzb3VyY2Vfc2l6ZSgmbHRxX2ljdV9yZXNvdXJjZSksICJpY3UiKSA8IDApCisJCXBhbmljKCJGYWlsZWQgdG8gcmVxdWVzdCBpY3UgbWVtb3J5XG4iKTsKKworCWx0cV9pY3VfbWVtYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShsdHFfaWN1X3Jlc291cmNlLnN0YXJ0LAorCQkJCXJlc291cmNlX3NpemUoJmx0cV9pY3VfcmVzb3VyY2UpKTsKKwlpZiAoIWx0cV9pY3VfbWVtYmFzZSkKKwkJcGFuaWMoIkZhaWxlZCB0byByZW1hcCBpY3UgbWVtb3J5XG4iKTsKKworCWlmIChpbnNlcnRfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmbHRxX2VpdV9yZXNvdXJjZSkgPCAwKQorCQlwYW5pYygiRmFpbGVkIHRvIGluc2VydCBlaXUgbWVtb3J5XG4iKTsKKworCWlmIChyZXF1ZXN0X21lbV9yZWdpb24obHRxX2VpdV9yZXNvdXJjZS5zdGFydCwKKwkJCXJlc291cmNlX3NpemUoJmx0cV9laXVfcmVzb3VyY2UpLCAiZWl1IikgPCAwKQorCQlwYW5pYygiRmFpbGVkIHRvIHJlcXVlc3QgZWl1IG1lbW9yeVxuIik7CisKKwlsdHFfZWl1X21lbWJhc2UgPSBpb3JlbWFwX25vY2FjaGUobHRxX2VpdV9yZXNvdXJjZS5zdGFydCwKKwkJCQlyZXNvdXJjZV9zaXplKCZsdHFfZWl1X3Jlc291cmNlKSk7CisJaWYgKCFsdHFfZWl1X21lbWJhc2UpCisJCXBhbmljKCJGYWlsZWQgdG8gcmVtYXAgZWl1IG1lbW9yeVxuIik7CisKKwkvKiBtYWtlIHN1cmUgYWxsIGlycXMgYXJlIHR1cm5lZCBvZmYgYnkgZGVmYXVsdCAqLworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCWx0cV9pY3VfdzMyKDAsIExUUV9JQ1VfSU0wX0lFUiArIChpICogTFRRX0lDVV9PRkZTRVQpKTsKKworCS8qIGNsZWFyIGFsbCBwb3NzaWJseSBwZW5kaW5nIGludGVycnVwdHMgKi8KKwlsdHFfaWN1X3czMih+MCwgTFRRX0lDVV9JTTBfSVNSICsgKGkgKiBMVFFfSUNVX09GRlNFVCkpOworCisJbWlwc19jcHVfaXJxX2luaXQoKTsKKworCWZvciAoaSA9IDI7IGkgPD0gNjsgaSsrKQorCQlzZXR1cF9pcnEoaSwgJmNhc2NhZGUpOworCisJaWYgKGNwdV9oYXNfdmludCkgeworCQlwcl9pbmZvKCJTZXR0aW5nIHVwIHZlY3RvcmVkIGludGVycnVwdHNcbiIpOworCQlzZXRfdmlfaGFuZGxlcigyLCBsdHFfaHcwX2lycWRpc3BhdGNoKTsKKwkJc2V0X3ZpX2hhbmRsZXIoMywgbHRxX2h3MV9pcnFkaXNwYXRjaCk7CisJCXNldF92aV9oYW5kbGVyKDQsIGx0cV9odzJfaXJxZGlzcGF0Y2gpOworCQlzZXRfdmlfaGFuZGxlcig1LCBsdHFfaHczX2lycWRpc3BhdGNoKTsKKwkJc2V0X3ZpX2hhbmRsZXIoNiwgbHRxX2h3NF9pcnFkaXNwYXRjaCk7CisJCXNldF92aV9oYW5kbGVyKDcsIGx0cV9odzVfaXJxZGlzcGF0Y2gpOworCX0KKworCWZvciAoaSA9IElOVF9OVU1fSVJRMDsKKwkJaSA8PSAoSU5UX05VTV9JUlEwICsgKDUgKiBJTlRfTlVNX0lNX09GRlNFVCkpOyBpKyspCisJCWlmICgoaSA9PSBMVFFfRUlVX0lSMCkgfHwgKGkgPT0gTFRRX0VJVV9JUjEpIHx8CisJCQkoaSA9PSBMVFFfRUlVX0lSMikpCisJCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaSwgJmx0cV9laXVfdHlwZSwKKwkJCQloYW5kbGVfbGV2ZWxfaXJxKTsKKwkJLyogRUlVMy01IG9ubHkgZXhpc3Qgb24gYXI5IGFuZCB2cjkgKi8KKwkJZWxzZSBpZiAoKChpID09IExUUV9FSVVfSVIzKSB8fCAoaSA9PSBMVFFfRUlVX0lSNCkgfHwKKwkJCShpID09IExUUV9FSVVfSVI1KSkgJiYgKGx0cV9pc19hcjkoKSB8fCBsdHFfaXNfdnI5KCkpKQorCQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGksICZsdHFfZWl1X3R5cGUsCisJCQkJaGFuZGxlX2xldmVsX2lycSk7CisJCWVsc2UKKwkJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpLCAmbHRxX2lycV90eXBlLAorCQkJCWhhbmRsZV9sZXZlbF9pcnEpOworCisjaWYgIWRlZmluZWQoQ09ORklHX01JUFNfTVRfU01QKSAmJiAhZGVmaW5lZChDT05GSUdfTUlQU19NVF9TTVRDKQorCXNldF9jMF9zdGF0dXMoSUVfSVJRMCB8IElFX0lSUTEgfCBJRV9JUlEyIHwKKwkJSUVfSVJRMyB8IElFX0lSUTQgfCBJRV9JUlE1KTsKKyNlbHNlCisJc2V0X2MwX3N0YXR1cyhJRV9TVzAgfCBJRV9TVzEgfCBJRV9JUlEwIHwgSUVfSVJRMSB8CisJCUlFX0lSUTIgfCBJRV9JUlEzIHwgSUVfSVJRNCB8IElFX0lSUTUpOworI2VuZGlmCit9CisKK3Vuc2lnbmVkIGludCBfX2NwdWluaXQgZ2V0X2MwX2NvbXBhcmVfaW50KHZvaWQpCit7CisJcmV0dXJuIENQMF9MRUdBQ1lfQ09NUEFSRV9JUlE7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGFudGlxL21hY2h0eXBlcy5oIGIvYXJjaC9taXBzL2xhbnRpcS9tYWNodHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTAxYjhjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2xhbnRpcS9tYWNodHlwZXMuaApAQCAtMCwwICsxLDIwIEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIEpvaG4gQ3Jpc3BpbiA8YmxvZ2ljQG9wZW53cnQub3JnPgorICovCisKKyNpZm5kZWYgX0xBTlRJUV9NQUNIX0hfXworI2RlZmluZSBfTEFOVElRX01BQ0hfSF9fCisKKyNpbmNsdWRlIDxhc20vbWlwc19tYWNoaW5lLmg+CisKK2VudW0gbGFudGlxX21hY2hfdHlwZSB7CisJTFRRX01BQ0hfR0VORVJJQyA9IDAsCisJTFRRX01BQ0hfRUFTWTUwNzEyLAkvKiBEYW51YmUgZXZhbHVhdGlvbiBib2FyZCAqLworCUxUUV9NQUNIX0VBU1k1MDYwMSwJLyogQW1hem9uIFNFIGV2YWx1YXRpb24gYm9hcmQgKi8KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xhbnRpcS9wcm9tLmMgYi9hcmNoL21pcHMvbGFudGlxL3Byb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmJhMDA3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2xhbnRpcS9wcm9tLmMKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAorICogIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEpvaG4gQ3Jpc3BpbiA8YmxvZ2ljQG9wZW53cnQub3JnPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KKyNpbmNsdWRlIDxhc20vdGltZS5oPgorCisjaW5jbHVkZSA8bGFudGlxLmg+CisKKyNpbmNsdWRlICJwcm9tLmgiCisjaW5jbHVkZSAiY2xrLmgiCisKK3N0YXRpYyBzdHJ1Y3QgbHRxX3NvY19pbmZvIHNvY19pbmZvOworCit1bnNpZ25lZCBpbnQgbHRxX2dldF9jcHVfdmVyKHZvaWQpCit7CisJcmV0dXJuIHNvY19pbmZvLnJldjsKK30KK0VYUE9SVF9TWU1CT0wobHRxX2dldF9jcHVfdmVyKTsKKwordW5zaWduZWQgaW50IGx0cV9nZXRfc29jX3R5cGUodm9pZCkKK3sKKwlyZXR1cm4gc29jX2luZm8udHlwZTsKK30KK0VYUE9SVF9TWU1CT0wobHRxX2dldF9zb2NfdHlwZSk7CisKK2NvbnN0IGNoYXIgKmdldF9zeXN0ZW1fdHlwZSh2b2lkKQoreworCXJldHVybiBzb2NfaW5mby5zeXNfdHlwZTsKK30KKwordm9pZCBwcm9tX2ZyZWVfcHJvbV9tZW1vcnkodm9pZCkKK3sKK30KKworc3RhdGljIHZvaWQgX19pbml0IHByb21faW5pdF9jbWRsaW5lKHZvaWQpCit7CisJaW50IGFyZ2MgPSBmd19hcmcwOworCWNoYXIgKiphcmd2ID0gKGNoYXIgKiopIEtTRUcxQUREUihmd19hcmcxKTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKwkJY2hhciAqcCA9IChjaGFyICopICBLU0VHMUFERFIoYXJndltpXSk7CisKKwkJaWYgKHAgJiYgKnApIHsKKwkJCXN0cmxjYXQoYXJjc19jbWRsaW5lLCBwLCBzaXplb2YoYXJjc19jbWRsaW5lKSk7CisJCQlzdHJsY2F0KGFyY3NfY21kbGluZSwgIiAiLCBzaXplb2YoYXJjc19jbWRsaW5lKSk7CisJCX0KKwl9Cit9CisKK3ZvaWQgX19pbml0IHByb21faW5pdCh2b2lkKQoreworCXN0cnVjdCBjbGsgKmNsazsKKworCWx0cV9zb2NfZGV0ZWN0KCZzb2NfaW5mbyk7CisJY2xrX2luaXQoKTsKKwljbGsgPSBjbGtfZ2V0KDAsICJjcHUiKTsKKwlzbnByaW50Zihzb2NfaW5mby5zeXNfdHlwZSwgTFRRX1NZU19UWVBFX0xFTiAtIDEsICIlcyByZXYxLiVkIiwKKwkJc29jX2luZm8ubmFtZSwgc29jX2luZm8ucmV2KTsKKwljbGtfcHV0KGNsayk7CisJc29jX2luZm8uc3lzX3R5cGVbTFRRX1NZU19UWVBFX0xFTiAtIDFdID0gJ1wwJzsKKwlwcl9pbmZvKCJTb0M6ICVzXG4iLCBzb2NfaW5mby5zeXNfdHlwZSk7CisJcHJvbV9pbml0X2NtZGxpbmUoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sYW50aXEvcHJvbS5oIGIvYXJjaC9taXBzL2xhbnRpcS9wcm9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQyMjlkOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9sYW50aXEvcHJvbS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBKb2huIENyaXNwaW4gPGJsb2dpY0BvcGVud3J0Lm9yZz4KKyAqLworCisjaWZuZGVmIF9MVFFfUFJPTV9IX18KKyNkZWZpbmUgX0xUUV9QUk9NX0hfXworCisjZGVmaW5lIExUUV9TWVNfVFlQRV9MRU4JMHgxMDAKKworc3RydWN0IGx0cV9zb2NfaW5mbyB7CisJdW5zaWduZWQgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBpbnQgcmV2OworCXVuc2lnbmVkIGludCBwYXJ0bnVtOworCXVuc2lnbmVkIGludCB0eXBlOworCXVuc2lnbmVkIGNoYXIgc3lzX3R5cGVbTFRRX1NZU19UWVBFX0xFTl07Cit9OworCitleHRlcm4gdm9pZCBsdHFfc29jX2RldGVjdChzdHJ1Y3QgbHRxX3NvY19pbmZvICppKTsKK2V4dGVybiB2b2lkIGx0cV9zb2Nfc2V0dXAodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xhbnRpcS9zZXR1cC5jIGIvYXJjaC9taXBzL2xhbnRpcS9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOGFmNzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvbGFudGlxL3NldHVwLmMKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAorICogIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEpvaG4gQ3Jpc3BpbiA8YmxvZ2ljQG9wZW53cnQub3JnPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgorCisjaW5jbHVkZSA8bGFudGlxX3NvYy5oPgorCisjaW5jbHVkZSAibWFjaHR5cGVzLmgiCisjaW5jbHVkZSAiZGV2aWNlcy5oIgorI2luY2x1ZGUgInByb20uaCIKKwordm9pZCBfX2luaXQgcGxhdF9tZW1fc2V0dXAodm9pZCkKK3sKKwkvKiBhc3N1bWUgMTZNIGFzIGRlZmF1bHQgaW5jYXNlIHVib290IGZhaWxzIHRvIHBhc3MgcHJvcGVyIHJhbXNpemUgKi8KKwl1bnNpZ25lZCBsb25nIG1lbXNpemUgPSAxNjsKKwljaGFyICoqZW52cCA9IChjaGFyICoqKSBLU0VHMUFERFIoZndfYXJnMik7CisKKwlpb3BvcnRfcmVzb3VyY2Uuc3RhcnQgPSBJT1BPUlRfUkVTT1VSQ0VfU1RBUlQ7CisJaW9wb3J0X3Jlc291cmNlLmVuZCA9IElPUE9SVF9SRVNPVVJDRV9FTkQ7CisJaW9tZW1fcmVzb3VyY2Uuc3RhcnQgPSBJT01FTV9SRVNPVVJDRV9TVEFSVDsKKwlpb21lbV9yZXNvdXJjZS5lbmQgPSBJT01FTV9SRVNPVVJDRV9FTkQ7CisKKwlzZXRfaW9fcG9ydF9iYXNlKCh1bnNpZ25lZCBsb25nKSBLU0VHMSk7CisKKwl3aGlsZSAoKmVudnApIHsKKwkJY2hhciAqZSA9IChjaGFyICopS1NFRzFBRERSKCplbnZwKTsKKwkJaWYgKCFzdHJuY21wKGUsICJtZW1zaXplPSIsIDgpKSB7CisJCQllICs9IDg7CisJCQlpZiAoc3RyaWN0X3N0cnRvdWwoZSwgMCwgJm1lbXNpemUpKQorCQkJCXByX3dhcm4oImJhZCBtZW1zaXplIHNwZWNpZmllZFxuIik7CisJCX0KKwkJZW52cCsrOworCX0KKwltZW1zaXplICo9IDEwMjQgKiAxMDI0OworCWFkZF9tZW1vcnlfcmVnaW9uKDB4MDAwMDAwMDAsIG1lbXNpemUsIEJPT1RfTUVNX1JBTSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0CitsYW50aXFfc2V0dXAodm9pZCkKK3sKKwlsdHFfc29jX3NldHVwKCk7CisJbWlwc19tYWNoaW5lX3NldHVwKCk7CisJcmV0dXJuIDA7Cit9CisKK2FyY2hfaW5pdGNhbGwobGFudGlxX3NldHVwKTsKKworc3RhdGljIHZvaWQgX19pbml0CitsYW50aXFfZ2VuZXJpY19pbml0KHZvaWQpCit7CisJLyogTm90aGluZyB0byBkbyAqLworfQorCitNSVBTX01BQ0hJTkUoTFRRX01BQ0hfR0VORVJJQywKKwkgICAgICJHZW5lcmljIiwKKwkgICAgICJHZW5lcmljIExhbnRpcSBiYXNlZCBib2FyZCIsCisJICAgICBsYW50aXFfZ2VuZXJpY19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sYW50aXEveHdheS9LY29uZmlnIGIvYXJjaC9taXBzL2xhbnRpcS94d2F5L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI4NTdkZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9sYW50aXEveHdheS9LY29uZmlnCkBAIC0wLDAgKzEsMjMgQEAKK2lmIFNPQ19YV0FZCisKK21lbnUgIk1JUFMgTWFjaGluZSIKKworY29uZmlnIExBTlRJUV9NQUNIX0VBU1k1MDcxMgorCWJvb2wgIkVhc3k1MDcxMiAtIERhbnViZSIKKwlkZWZhdWx0IHkKKworZW5kbWVudQorCitlbmRpZgorCitpZiBTT0NfQU1BWk9OX1NFCisKK21lbnUgIk1JUFMgTWFjaGluZSIKKworY29uZmlnIExBTlRJUV9NQUNIX0VBU1k1MDYwMQorCWJvb2wgIkVhc3k1MDYwMSAtIEFtYXpvbiBTRSIKKwlkZWZhdWx0IHkKKworZW5kbWVudQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xhbnRpcS94d2F5L01ha2VmaWxlIGIvYXJjaC9taXBzL2xhbnRpcS94d2F5L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MTdmMmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvbGFudGlxL3h3YXkvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACitvYmoteSA6PSBwbXUubyBlYnUubyByZXNldC5vIGdwaW8ubyBncGlvX3N0cC5vIGdwaW9fZWJ1Lm8gZGV2aWNlcy5vIGRtYS5vCisKK29iai0kKENPTkZJR19TT0NfWFdBWSkgKz0gY2xrLXh3YXkubyBwcm9tLXh3YXkubyBzZXR1cC14d2F5Lm8KK29iai0kKENPTkZJR19TT0NfQU1BWk9OX1NFKSArPSBjbGstYXNlLm8gcHJvbS1hc2UubyBzZXR1cC1hc2UubworCitvYmotJChDT05GSUdfTEFOVElRX01BQ0hfRUFTWTUwNzEyKSArPSBtYWNoLWVhc3k1MDcxMi5vCitvYmotJChDT05GSUdfTEFOVElRX01BQ0hfRUFTWTUwNjAxKSArPSBtYWNoLWVhc3k1MDYwMS5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGFudGlxL3h3YXkvY2xrLWFzZS5jIGIvYXJjaC9taXBzL2xhbnRpcS94d2F5L2Nsay1hc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmQ4MjNhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2xhbnRpcS94d2F5L2Nsay1hc2UuYwpAQCAtMCwwICsxLDQ4IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDExIEpvaG4gQ3Jpc3BpbiA8YmxvZ2ljQG9wZW53cnQub3JnPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKworI2luY2x1ZGUgPGFzbS90aW1lLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjaW5jbHVkZSA8bGFudGlxX3NvYy5oPgorCisvKiBjZ3UgcmVnaXN0ZXJzICovCisjZGVmaW5lIExUUV9DR1VfU1lTCTB4MDAxMAorCit1bnNpZ25lZCBpbnQgbHRxX2dldF9pb19yZWdpb25fY2xvY2sodm9pZCkKK3sKKwlyZXR1cm4gQ0xPQ0tfMTMzTTsKK30KK0VYUE9SVF9TWU1CT0wobHRxX2dldF9pb19yZWdpb25fY2xvY2spOworCit1bnNpZ25lZCBpbnQgbHRxX2dldF9mcGlfYnVzX2Nsb2NrKGludCBmcGkpCit7CisJcmV0dXJuIENMT0NLXzEzM007Cit9CitFWFBPUlRfU1lNQk9MKGx0cV9nZXRfZnBpX2J1c19jbG9jayk7CisKK3Vuc2lnbmVkIGludCBsdHFfZ2V0X2NwdV9oeih2b2lkKQoreworCWlmIChsdHFfY2d1X3IzMihMVFFfQ0dVX1NZUykgJiAoMSA8PCA1KSkKKwkJcmV0dXJuIENMT0NLXzI2Nk07CisJZWxzZQorCQlyZXR1cm4gQ0xPQ0tfMTMzTTsKK30KK0VYUE9SVF9TWU1CT0wobHRxX2dldF9jcHVfaHopOworCit1bnNpZ25lZCBpbnQgbHRxX2dldF9mcGlfaHoodm9pZCkKK3sKKwlyZXR1cm4gQ0xPQ0tfMTMzTTsKK30KK0VYUE9SVF9TWU1CT0wobHRxX2dldF9mcGlfaHopOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xhbnRpcS94d2F5L2Nsay14d2F5LmMgYi9hcmNoL21pcHMvbGFudGlxL3h3YXkvY2xrLXh3YXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGQzOTU5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2xhbnRpcS94d2F5L2Nsay14d2F5LmMKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgSm9obiBDcmlzcGluIDxibG9naWNAb3BlbndydC5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorCisjaW5jbHVkZSA8YXNtL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisKKyNpbmNsdWRlIDxsYW50aXFfc29jLmg+CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbHRxX3JhbV9jbG9ja3NbXSA9IHsKKwlDTE9DS18xNjdNLCBDTE9DS18xMzNNLCBDTE9DS18xMTFNLCBDTE9DS184M00gfTsKKyNkZWZpbmUgRERSX0haIGx0cV9yYW1fY2xvY2tzW2x0cV9jZ3VfcjMyKExUUV9DR1VfU1lTKSAmIDB4M10KKworI2RlZmluZSBCQVNJQ19GUkVRVUVOQ1lfMQkzNTMyODAwMAorI2RlZmluZSBCQVNJQ19GUkVRVUVOQ1lfMgkzNjAwMDAwMAorI2RlZmluZSBCQVNJU19SRVFVRU5DWV9VU0IJMTIwMDAwMDAKKworI2RlZmluZSBHRVRfQklUUyh4LCBtc2IsIGxzYikgXAorCSgoKHgpICYgKCgxIDw8ICgobXNiKSArIDEpKSAtIDEpKSA+PiAobHNiKSkKKworI2RlZmluZSBMVFFfQ0dVX1BMTDBfQ0ZHCTB4MDAwNAorI2RlZmluZSBMVFFfQ0dVX1BMTDFfQ0ZHCTB4MDAwOAorI2RlZmluZSBMVFFfQ0dVX1BMTDJfQ0ZHCTB4MDAwQworI2RlZmluZSBMVFFfQ0dVX1NZUwkJMHgwMDEwCisjZGVmaW5lIExUUV9DR1VfVVBEQVRFCQkweDAwMTQKKyNkZWZpbmUgTFRRX0NHVV9JRl9DTEsJCTB4MDAxOAorI2RlZmluZSBMVFFfQ0dVX09TQ19DT04JCTB4MDAxQworI2RlZmluZSBMVFFfQ0dVX1NNRAkJMHgwMDIwCisjZGVmaW5lIExUUV9DR1VfQ1QxU1IJCTB4MDAyOAorI2RlZmluZSBMVFFfQ0dVX0NUMlNSCQkweDAwMkMKKyNkZWZpbmUgTFRRX0NHVV9QQ01DUgkJMHgwMDMwCisjZGVmaW5lIExUUV9DR1VfUENJX0NSCQkweDAwMzQKKyNkZWZpbmUgTFRRX0NHVV9QRF9QQwkJMHgwMDM4CisjZGVmaW5lIExUUV9DR1VfRk1SCQkweDAwM0MKKworI2RlZmluZSBDR1VfUExMMF9QSEFTRV9ESVZJREVSX0VOQUJMRQlcCisJKGx0cV9jZ3VfcjMyKExUUV9DR1VfUExMMF9DRkcpICYgKDEgPDwgMzEpKQorI2RlZmluZSBDR1VfUExMMF9CWVBBU1MJCQlcCisJKGx0cV9jZ3VfcjMyKExUUV9DR1VfUExMMF9DRkcpICYgKDEgPDwgMzApKQorI2RlZmluZSBDR1VfUExMMF9DRkdfRFNNU0VMCQlcCisJKGx0cV9jZ3VfcjMyKExUUV9DR1VfUExMMF9DRkcpICYgKDEgPDwgMjgpKQorI2RlZmluZSBDR1VfUExMMF9DRkdfRlJBQ19FTgkJXAorCShsdHFfY2d1X3IzMihMVFFfQ0dVX1BMTDBfQ0ZHKSAmICgxIDw8IDI3KSkKKyNkZWZpbmUgQ0dVX1BMTDFfU1JDCQkJXAorCShsdHFfY2d1X3IzMihMVFFfQ0dVX1BMTDFfQ0ZHKSAmICgxIDw8IDMxKSkKKyNkZWZpbmUgQ0dVX1BMTDJfUEhBU0VfRElWSURFUl9FTkFCTEUJXAorCShsdHFfY2d1X3IzMihMVFFfQ0dVX1BMTDJfQ0ZHKSAmICgxIDw8IDIwKSkKKyNkZWZpbmUgQ0dVX1NZU19GUElfU0VMCQkJKDEgPDwgNikKKyNkZWZpbmUgQ0dVX1NZU19ERFJfU0VMCQkJMHgzCisjZGVmaW5lIENHVV9QTEwwX1NSQwkJCSgxIDw8IDI5KQorCisjZGVmaW5lIENHVV9QTEwwX0NGR19QTExLCUdFVF9CSVRTKGx0cV9jZ3VfcjMyKExUUV9DR1VfUExMMF9DRkcpLCAyNiwgMTcpCisjZGVmaW5lIENHVV9QTEwwX0NGR19QTExOCUdFVF9CSVRTKGx0cV9jZ3VfcjMyKExUUV9DR1VfUExMMF9DRkcpLCAxMiwgNikKKyNkZWZpbmUgQ0dVX1BMTDBfQ0ZHX1BMTE0JR0VUX0JJVFMobHRxX2NndV9yMzIoTFRRX0NHVV9QTEwwX0NGRyksIDUsIDIpCisjZGVmaW5lIENHVV9QTEwyX1NSQwkJR0VUX0JJVFMobHRxX2NndV9yMzIoTFRRX0NHVV9QTEwyX0NGRyksIDE4LCAxNykKKyNkZWZpbmUgQ0dVX1BMTDJfQ0ZHX0lOUFVUX0RJVglHRVRfQklUUyhsdHFfY2d1X3IzMihMVFFfQ0dVX1BMTDJfQ0ZHKSwgMTYsIDEzKQorCitzdGF0aWMgdW5zaWduZWQgaW50IGx0cV9nZXRfcGxsMF9mZGl2KHZvaWQpOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfaW5wdXRfY2xvY2soaW50IHBsbCkKK3sKKwlzd2l0Y2ggKHBsbCkgeworCWNhc2UgMDoKKwkJaWYgKGx0cV9jZ3VfcjMyKExUUV9DR1VfUExMMF9DRkcpICYgQ0dVX1BMTDBfU1JDKQorCQkJcmV0dXJuIEJBU0lTX1JFUVVFTkNZX1VTQjsKKwkJZWxzZSBpZiAoQ0dVX1BMTDBfUEhBU0VfRElWSURFUl9FTkFCTEUpCisJCQlyZXR1cm4gQkFTSUNfRlJFUVVFTkNZXzE7CisJCWVsc2UKKwkJCXJldHVybiBCQVNJQ19GUkVRVUVOQ1lfMjsKKwljYXNlIDE6CisJCWlmIChDR1VfUExMMV9TUkMpCisJCQlyZXR1cm4gQkFTSVNfUkVRVUVOQ1lfVVNCOworCQllbHNlIGlmIChDR1VfUExMMF9QSEFTRV9ESVZJREVSX0VOQUJMRSkKKwkJCXJldHVybiBCQVNJQ19GUkVRVUVOQ1lfMTsKKwkJZWxzZQorCQkJcmV0dXJuIEJBU0lDX0ZSRVFVRU5DWV8yOworCWNhc2UgMjoKKwkJc3dpdGNoIChDR1VfUExMMl9TUkMpIHsKKwkJY2FzZSAwOgorCQkJcmV0dXJuIGx0cV9nZXRfcGxsMF9mZGl2KCk7CisJCWNhc2UgMToKKwkJCXJldHVybiBDR1VfUExMMl9QSEFTRV9ESVZJREVSX0VOQUJMRSA/CisJCQkJQkFTSUNfRlJFUVVFTkNZXzEgOgorCQkJCUJBU0lDX0ZSRVFVRU5DWV8yOworCQljYXNlIDI6CisJCQlyZXR1cm4gQkFTSVNfUkVRVUVOQ1lfVVNCOworCQl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjYWxfZHNtKGludCBwbGwsIHVuc2lnbmVkIGludCBudW0sIHVuc2lnbmVkIGludCBkZW4pCit7CisJdTY0IHJlcywgY2xvY2sgPSBnZXRfaW5wdXRfY2xvY2socGxsKTsKKworCXJlcyA9IG51bSAqIGNsb2NrOworCWRvX2RpdihyZXMsIGRlbik7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWFzaF9kc20oaW50IHBsbCwgdW5zaWduZWQgaW50IE0sIHVuc2lnbmVkIGludCBOLAorCXVuc2lnbmVkIGludCBLKQoreworCXVuc2lnbmVkIGludCBudW0gPSAoKE4gKyAxKSA8PCAxMCkgKyBLOworCXVuc2lnbmVkIGludCBkZW4gPSAoTSArIDEpIDw8IDEwOworCisJcmV0dXJuIGNhbF9kc20ocGxsLCBudW0sIGRlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNzZmZfZHNtXzEoaW50IHBsbCwgdW5zaWduZWQgaW50IE0sIHVuc2lnbmVkIGludCBOLAorCXVuc2lnbmVkIGludCBLKQoreworCXVuc2lnbmVkIGludCBudW0gPSAoKE4gKyAxKSA8PCAxMSkgKyBLICsgNTEyOworCXVuc2lnbmVkIGludCBkZW4gPSAoTSArIDEpIDw8IDExOworCisJcmV0dXJuIGNhbF9kc20ocGxsLCBudW0sIGRlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNzZmZfZHNtXzIoaW50IHBsbCwgdW5zaWduZWQgaW50IE0sIHVuc2lnbmVkIGludCBOLAorCXVuc2lnbmVkIGludCBLKQoreworCXVuc2lnbmVkIGludCBudW0gPSBLID49IDUxMiA/CisJCSgoTiArIDEpIDw8IDEyKSArIEsgLSA1MTIgOiAoKE4gKyAxKSA8PCAxMikgKyBLICsgMzU4NDsKKwl1bnNpZ25lZCBpbnQgZGVuID0gKE0gKyAxKSA8PCAxMjsKKworCXJldHVybiBjYWxfZHNtKHBsbCwgbnVtLCBkZW4pOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBkc20oaW50IHBsbCwgdW5zaWduZWQgaW50IE0sIHVuc2lnbmVkIGludCBOLAorCXVuc2lnbmVkIGludCBLLCB1bnNpZ25lZCBpbnQgZHNtc2VsLCB1bnNpZ25lZCBpbnQgcGhhc2VfZGl2X2VuKQoreworCWlmICghZHNtc2VsKQorCQlyZXR1cm4gbWFzaF9kc20ocGxsLCBNLCBOLCBLKTsKKwllbHNlIGlmICghcGhhc2VfZGl2X2VuKQorCQlyZXR1cm4gbWFzaF9kc20ocGxsLCBNLCBOLCBLKTsKKwllbHNlCisJCXJldHVybiBzc2ZmX2RzbV8yKHBsbCwgTSwgTiwgSyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGx0cV9nZXRfcGxsMF9mb3NjKHZvaWQpCit7CisJaWYgKENHVV9QTEwwX0JZUEFTUykKKwkJcmV0dXJuIGdldF9pbnB1dF9jbG9jaygwKTsKKwllbHNlCisJCXJldHVybiAhQ0dVX1BMTDBfQ0ZHX0ZSQUNfRU4KKwkJCT8gZHNtKDAsIENHVV9QTEwwX0NGR19QTExNLCBDR1VfUExMMF9DRkdfUExMTiwgMCwKKwkJCQlDR1VfUExMMF9DRkdfRFNNU0VMLAorCQkJCUNHVV9QTEwwX1BIQVNFX0RJVklERVJfRU5BQkxFKQorCQkJOiBkc20oMCwgQ0dVX1BMTDBfQ0ZHX1BMTE0sIENHVV9QTEwwX0NGR19QTExOLAorCQkJCUNHVV9QTEwwX0NGR19QTExLLCBDR1VfUExMMF9DRkdfRFNNU0VMLAorCQkJCUNHVV9QTEwwX1BIQVNFX0RJVklERVJfRU5BQkxFKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBsdHFfZ2V0X3BsbDBfZmRpdih2b2lkKQoreworCXVuc2lnbmVkIGludCBkaXYgPSBDR1VfUExMMl9DRkdfSU5QVVRfRElWICsgMTsKKworCXJldHVybiAobHRxX2dldF9wbGwwX2Zvc2MoKSArIChkaXYgPj4gMSkpIC8gZGl2OworfQorCit1bnNpZ25lZCBpbnQgbHRxX2dldF9pb19yZWdpb25fY2xvY2sodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgcmV0ID0gbHRxX2dldF9wbGwwX2Zvc2MoKTsKKworCXN3aXRjaCAobHRxX2NndV9yMzIoTFRRX0NHVV9QTEwyX0NGRykgJiBDR1VfU1lTX0REUl9TRUwpIHsKKwlkZWZhdWx0OgorCWNhc2UgMDoKKwkJcmV0dXJuIChyZXQgKyAxKSAvIDI7CisJY2FzZSAxOgorCQlyZXR1cm4gKHJldCAqIDIgKyAyKSAvIDU7CisJY2FzZSAyOgorCQlyZXR1cm4gKHJldCArIDEpIC8gMzsKKwljYXNlIDM6CisJCXJldHVybiAocmV0ICsgMikgLyA0OworCX0KK30KK0VYUE9SVF9TWU1CT0wobHRxX2dldF9pb19yZWdpb25fY2xvY2spOworCit1bnNpZ25lZCBpbnQgbHRxX2dldF9mcGlfYnVzX2Nsb2NrKGludCBmcGkpCit7CisJdW5zaWduZWQgaW50IHJldCA9IGx0cV9nZXRfaW9fcmVnaW9uX2Nsb2NrKCk7CisKKwlpZiAoKGZwaSA9PSAyKSAmJiAobHRxX2NndV9yMzIoTFRRX0NHVV9TWVMpICYgQ0dVX1NZU19GUElfU0VMKSkKKwkJcmV0ID4+PSAxOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGx0cV9nZXRfZnBpX2J1c19jbG9jayk7CisKK3Vuc2lnbmVkIGludCBsdHFfZ2V0X2NwdV9oeih2b2lkKQoreworCXN3aXRjaCAobHRxX2NndV9yMzIoTFRRX0NHVV9TWVMpICYgMHhjKSB7CisJY2FzZSAwOgorCQlyZXR1cm4gQ0xPQ0tfMzMzTTsKKwljYXNlIDQ6CisJCXJldHVybiBERFJfSFo7CisJY2FzZSA4OgorCQlyZXR1cm4gRERSX0haIDw8IDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIEREUl9IWiA+PiAxOworCX0KK30KK0VYUE9SVF9TWU1CT0wobHRxX2dldF9jcHVfaHopOworCit1bnNpZ25lZCBpbnQgbHRxX2dldF9mcGlfaHoodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgZGRyX2Nsb2NrID0gRERSX0haOworCisJaWYgKGx0cV9jZ3VfcjMyKExUUV9DR1VfU1lTKSAmIDB4NDApCisJCXJldHVybiBkZHJfY2xvY2sgPj4gMTsKKwlyZXR1cm4gZGRyX2Nsb2NrOworfQorRVhQT1JUX1NZTUJPTChsdHFfZ2V0X2ZwaV9oeik7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGFudGlxL3h3YXkvZGV2aWNlcy5jIGIvYXJjaC9taXBzL2xhbnRpcS94d2F5L2RldmljZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDllNzg5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2xhbnRpcS94d2F5L2RldmljZXMuYwpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAorICogIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBKb2huIENyaXNwaW4gPGJsb2dpY0BvcGVud3J0Lm9yZz4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorCisjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8bGFudGlxX3NvYy5oPgorI2luY2x1ZGUgPGxhbnRpcV9pcnEuaD4KKyNpbmNsdWRlIDxsYW50aXFfcGxhdGZvcm0uaD4KKworI2luY2x1ZGUgImRldmljZXMuaCIKKworLyogZ3BpbyAqLworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBsdHFfZ3Bpb19yZXNvdXJjZVtdID0geworCXsKKwkJLm5hbWUJPSAiZ3BpbzAiLAorCQkuc3RhcnQgID0gTFRRX0dQSU8wX0JBU0VfQUREUiwKKwkJLmVuZCAgICA9IExUUV9HUElPMF9CQVNFX0FERFIgKyBMVFFfR1BJT19TSVpFIC0gMSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sIHsKKwkJLm5hbWUJPSAiZ3BpbzEiLAorCQkuc3RhcnQgID0gTFRRX0dQSU8xX0JBU0VfQUREUiwKKwkJLmVuZCAgICA9IExUUV9HUElPMV9CQVNFX0FERFIgKyBMVFFfR1BJT19TSVpFIC0gMSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sIHsKKwkJLm5hbWUJPSAiZ3BpbzIiLAorCQkuc3RhcnQgID0gTFRRX0dQSU8yX0JBU0VfQUREUiwKKwkJLmVuZCAgICA9IExUUV9HUElPMl9CQVNFX0FERFIgKyBMVFFfR1BJT19TSVpFIC0gMSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0KK307CisKK3ZvaWQgX19pbml0IGx0cV9yZWdpc3Rlcl9ncGlvKHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgibHRxX2dwaW8iLCAwLAorCQkmbHRxX2dwaW9fcmVzb3VyY2VbMF0sIDEpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoImx0cV9ncGlvIiwgMSwKKwkJJmx0cV9ncGlvX3Jlc291cmNlWzFdLCAxKTsKKworCS8qIEFSOSBhbmQgVlI5IGhhdmUgYW4gZXh0cmEgZ3BpbyBibG9jayAqLworCWlmIChsdHFfaXNfYXI5KCkgfHwgbHRxX2lzX3ZyOSgpKSB7CisJCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoImx0cV9ncGlvIiwgMiwKKwkJCSZsdHFfZ3Bpb19yZXNvdXJjZVsyXSwgMSk7CisJfQorfQorCisvKiBzZXJpYWwgdG8gcGFyYWxsZWwgY29udmVyc2lvbiAqLworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBsdHFfc3RwX3Jlc291cmNlID0geworCS5uYW1lICAgPSAic3RwIiwKKwkuc3RhcnQgID0gTFRRX1NUUF9CQVNFX0FERFIsCisJLmVuZCAgICA9IExUUV9TVFBfQkFTRV9BRERSICsgTFRRX1NUUF9TSVpFIC0gMSwKKwkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCit9OworCit2b2lkIF9faW5pdCBsdHFfcmVnaXN0ZXJfZ3Bpb19zdHAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJsdHFfc3RwIiwgMCwgJmx0cV9zdHBfcmVzb3VyY2UsIDEpOworfQorCisvKiBhc2MgcG9ydHMgLSBhbWF6b24gc2UgaGFzIGl0cyBvd24gc2VyaWFsIG1hcHBpbmcgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbHRxX2FzZV9hc2NfcmVzb3VyY2VzW10gPSB7CisJeworCQkubmFtZQk9ICJhc2MwIiwKKwkJLnN0YXJ0ICA9IExUUV9BU0MxX0JBU0VfQUREUiwKKwkJLmVuZCAgICA9IExUUV9BU0MxX0JBU0VfQUREUiArIExUUV9BU0NfU0laRSAtIDEsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCUlSUV9SRVModHgsIExUUV9BU0NfQVNFX1RJUiksCisJSVJRX1JFUyhyeCwgTFRRX0FTQ19BU0VfUklSKSwKKwlJUlFfUkVTKGVyciwgTFRRX0FTQ19BU0VfRUlSKSwKK307CisKK3ZvaWQgX19pbml0IGx0cV9yZWdpc3Rlcl9hc2VfYXNjKHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgibHRxX2FzYyIsIDAsCisJCWx0cV9hc2VfYXNjX3Jlc291cmNlcywgQVJSQVlfU0laRShsdHFfYXNlX2FzY19yZXNvdXJjZXMpKTsKK30KKworLyogZXRoZXJuZXQgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbHRxX2V0b3BfcmVzb3VyY2VzID0geworCS5uYW1lCT0gImV0b3AiLAorCS5zdGFydAk9IExUUV9FVE9QX0JBU0VfQUREUiwKKwkuZW5kCT0gTFRRX0VUT1BfQkFTRV9BRERSICsgTFRRX0VUT1BfU0laRSAtIDEsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBsdHFfZXRvcCA9IHsKKwkubmFtZQkJPSAibHRxX2V0b3AiLAorCS5yZXNvdXJjZQk9ICZsdHFfZXRvcF9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSAxLAorfTsKKwordm9pZCBfX2luaXQKK2x0cV9yZWdpc3Rlcl9ldG9wKHN0cnVjdCBsdHFfZXRoX2RhdGEgKmV0aCkKK3sKKwlpZiAoZXRoKSB7CisJCWx0cV9ldG9wLmRldi5wbGF0Zm9ybV9kYXRhID0gZXRoOworCQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmx0cV9ldG9wKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGFudGlxL3h3YXkvZGV2aWNlcy5oIGIvYXJjaC9taXBzL2xhbnRpcS94d2F5L2RldmljZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTA0OTM0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2xhbnRpcS94d2F5L2RldmljZXMuaApAQCAtMCwwICsxLDIwIEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIEpvaG4gQ3Jpc3BpbiA8YmxvZ2ljQG9wZW53cnQub3JnPgorICovCisKKyNpZm5kZWYgX0xUUV9ERVZJQ0VTX1hXQVlfSF9fCisjZGVmaW5lIF9MVFFfREVWSUNFU19YV0FZX0hfXworCisjaW5jbHVkZSAiLi4vZGV2aWNlcy5oIgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorCitleHRlcm4gdm9pZCBsdHFfcmVnaXN0ZXJfZ3Bpbyh2b2lkKTsKK2V4dGVybiB2b2lkIGx0cV9yZWdpc3Rlcl9ncGlvX3N0cCh2b2lkKTsKK2V4dGVybiB2b2lkIGx0cV9yZWdpc3Rlcl9hc2VfYXNjKHZvaWQpOworZXh0ZXJuIHZvaWQgbHRxX3JlZ2lzdGVyX2V0b3Aoc3RydWN0IGx0cV9ldGhfZGF0YSAqZXRoKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGFudGlxL3h3YXkvZG1hLmMgYi9hcmNoL21pcHMvbGFudGlxL3h3YXkvZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3OGE0NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9sYW50aXEveHdheS9kbWEuYwpAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqICAgQ29weXJpZ2h0IChDKSAyMDExIEpvaG4gQ3Jpc3BpbiA8YmxvZ2ljQG9wZW53cnQub3JnPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSA8bGFudGlxX3NvYy5oPgorI2luY2x1ZGUgPHh3YXlfZG1hLmg+CisKKyNkZWZpbmUgTFRRX0RNQV9DVFJMCQkweDEwCisjZGVmaW5lIExUUV9ETUFfQ1BPTEwJCTB4MTQKKyNkZWZpbmUgTFRRX0RNQV9DUwkJMHgxOAorI2RlZmluZSBMVFFfRE1BX0NDVFJMCQkweDFDCisjZGVmaW5lIExUUV9ETUFfQ0RCQQkJMHgyMAorI2RlZmluZSBMVFFfRE1BX0NETEVOCQkweDI0CisjZGVmaW5lIExUUV9ETUFfQ0lTCQkweDI4CisjZGVmaW5lIExUUV9ETUFfQ0lFCQkweDJDCisjZGVmaW5lIExUUV9ETUFfUFMJCTB4NDAKKyNkZWZpbmUgTFRRX0RNQV9QQ1RSTAkJMHg0NAorI2RlZmluZSBMVFFfRE1BX0lSTkVOCQkweGY0CisKKyNkZWZpbmUgRE1BX0RFU0NQVAkJQklUKDMpCQkvKiBkZXNjcmlwdG9yIGNvbXBsZXRlIGlycSAqLworI2RlZmluZSBETUFfVFgJCQlCSVQoOCkJCS8qIFRYIGNoYW5uZWwgZGlyZWN0aW9uICovCisjZGVmaW5lIERNQV9DSEFOX09OCQlCSVQoMCkJCS8qIGNoYW5uZWwgb24gLyBvZmYgYml0ICovCisjZGVmaW5lIERNQV9QREVOCQlCSVQoNikJCS8qIGVuYWJsZSBwYWNrZXQgZHJvcCAqLworI2RlZmluZSBETUFfQ0hBTl9SU1QJCUJJVCgxKQkJLyogY2hhbm5lbCBvbiAvIG9mZiBiaXQgKi8KKyNkZWZpbmUgRE1BX1JFU0VUCQlCSVQoMCkJCS8qIGNoYW5uZWwgb24gLyBvZmYgYml0ICovCisjZGVmaW5lIERNQV9JUlFfQUNLCQkweDdlCQkvKiBJUlEgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIERNQV9QT0xMCQlCSVQoMzEpCQkvKiB0dXJuIG9uIGNoYW5uZWwgcG9sbGluZyAqLworI2RlZmluZSBETUFfQ0xLX0RJVjQJCUJJVCg2KQkJLyogcG9sbGluZyBjbG9jayBkaXZpZGVyICovCisjZGVmaW5lIERNQV8yV19CVVJTVAkJQklUKDEpCQkvKiAyIHdvcmQgYnVyc3QgbGVuZ3RoICovCisjZGVmaW5lIERNQV9NQVhfQ0hBTk5FTAkJMjAJCS8qIHRoZSBzb2MgaGFzIDIwIGNoYW5uZWxzICovCisjZGVmaW5lIERNQV9FVE9QX0VORElBTkVTUwkoMHhmIDw8IDgpIC8qIGVuZGlhbmVzcyBzd2FwIGV0b3AgY2hhbm5lbHMgKi8KKyNkZWZpbmUgRE1BX1dFSUdIVAkoQklUKDE3KSB8IEJJVCgxNikpCS8qIGRlZmF1bHQgY2hhbm5lbCB3aGVpZ2h0ICovCisKKyNkZWZpbmUgbHRxX2RtYV9yMzIoeCkJCQlsdHFfcjMyKGx0cV9kbWFfbWVtYmFzZSArICh4KSkKKyNkZWZpbmUgbHRxX2RtYV93MzIoeCwgeSkJCWx0cV93MzIoeCwgbHRxX2RtYV9tZW1iYXNlICsgKHkpKQorI2RlZmluZSBsdHFfZG1hX3czMl9tYXNrKHgsIHksIHopCWx0cV93MzJfbWFzayh4LCB5LCBcCisJCQkJCQlsdHFfZG1hX21lbWJhc2UgKyAoeikpCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbHRxX2RtYV9yZXNvdXJjZSA9IHsKKwkubmFtZQk9ICJkbWEiLAorCS5zdGFydAk9IExUUV9ETUFfQkFTRV9BRERSLAorCS5lbmQJPSBMVFFfRE1BX0JBU0VfQUREUiArIExUUV9ETUFfU0laRSAtIDEsCisJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHZvaWQgX19pb21lbSAqbHRxX2RtYV9tZW1iYXNlOworCit2b2lkCitsdHFfZG1hX2VuYWJsZV9pcnEoc3RydWN0IGx0cV9kbWFfY2hhbm5lbCAqY2gpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsdHFfZG1hX3czMihjaC0+bnIsIExUUV9ETUFfQ1MpOworCWx0cV9kbWFfdzMyX21hc2soMCwgMSA8PCBjaC0+bnIsIExUUV9ETUFfSVJORU4pOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGx0cV9kbWFfZW5hYmxlX2lycSk7CisKK3ZvaWQKK2x0cV9kbWFfZGlzYWJsZV9pcnEoc3RydWN0IGx0cV9kbWFfY2hhbm5lbCAqY2gpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsdHFfZG1hX3czMihjaC0+bnIsIExUUV9ETUFfQ1MpOworCWx0cV9kbWFfdzMyX21hc2soMSA8PCBjaC0+bnIsIDAsIExUUV9ETUFfSVJORU4pOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGx0cV9kbWFfZGlzYWJsZV9pcnEpOworCit2b2lkCitsdHFfZG1hX2Fja19pcnEoc3RydWN0IGx0cV9kbWFfY2hhbm5lbCAqY2gpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsdHFfZG1hX3czMihjaC0+bnIsIExUUV9ETUFfQ1MpOworCWx0cV9kbWFfdzMyKERNQV9JUlFfQUNLLCBMVFFfRE1BX0NJUyk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobHRxX2RtYV9hY2tfaXJxKTsKKwordm9pZAorbHRxX2RtYV9vcGVuKHN0cnVjdCBsdHFfZG1hX2NoYW5uZWwgKmNoKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZzsKKworCWxvY2FsX2lycV9zYXZlKGZsYWcpOworCWx0cV9kbWFfdzMyKGNoLT5uciwgTFRRX0RNQV9DUyk7CisJbHRxX2RtYV93MzJfbWFzaygwLCBETUFfQ0hBTl9PTiwgTFRRX0RNQV9DQ1RSTCk7CisJbHRxX2RtYV9lbmFibGVfaXJxKGNoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFnKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGx0cV9kbWFfb3Blbik7CisKK3ZvaWQKK2x0cV9kbWFfY2xvc2Uoc3RydWN0IGx0cV9kbWFfY2hhbm5lbCAqY2gpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZyk7CisJbHRxX2RtYV93MzIoY2gtPm5yLCBMVFFfRE1BX0NTKTsKKwlsdHFfZG1hX3czMl9tYXNrKERNQV9DSEFOX09OLCAwLCBMVFFfRE1BX0NDVFJMKTsKKwlsdHFfZG1hX2Rpc2FibGVfaXJxKGNoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFnKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGx0cV9kbWFfY2xvc2UpOworCitzdGF0aWMgdm9pZAorbHRxX2RtYV9hbGxvYyhzdHJ1Y3QgbHRxX2RtYV9jaGFubmVsICpjaCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY2gtPmRlc2MgPSAwOworCWNoLT5kZXNjX2Jhc2UgPSBkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwKKwkJCQlMVFFfREVTQ19OVU0gKiBMVFFfREVTQ19TSVpFLAorCQkJCSZjaC0+cGh5cywgR0ZQX0FUT01JQyk7CisJbWVtc2V0KGNoLT5kZXNjX2Jhc2UsIDAsIExUUV9ERVNDX05VTSAqIExUUV9ERVNDX1NJWkUpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWx0cV9kbWFfdzMyKGNoLT5uciwgTFRRX0RNQV9DUyk7CisJbHRxX2RtYV93MzIoY2gtPnBoeXMsIExUUV9ETUFfQ0RCQSk7CisJbHRxX2RtYV93MzIoTFRRX0RFU0NfTlVNLCBMVFFfRE1BX0NETEVOKTsKKwlsdHFfZG1hX3czMl9tYXNrKERNQV9DSEFOX09OLCAwLCBMVFFfRE1BX0NDVFJMKTsKKwl3bWIoKTsKKwlsdHFfZG1hX3czMl9tYXNrKDAsIERNQV9DSEFOX1JTVCwgTFRRX0RNQV9DQ1RSTCk7CisJd2hpbGUgKGx0cV9kbWFfcjMyKExUUV9ETUFfQ0NUUkwpICYgRE1BX0NIQU5fUlNUKQorCQk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCit2b2lkCitsdHFfZG1hX2FsbG9jX3R4KHN0cnVjdCBsdHFfZG1hX2NoYW5uZWwgKmNoKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsdHFfZG1hX2FsbG9jKGNoKTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsdHFfZG1hX3czMihETUFfREVTQ1BULCBMVFFfRE1BX0NJRSk7CisJbHRxX2RtYV93MzJfbWFzaygwLCAxIDw8IGNoLT5uciwgTFRRX0RNQV9JUk5FTik7CisJbHRxX2RtYV93MzIoRE1BX1dFSUdIVCB8IERNQV9UWCwgTFRRX0RNQV9DQ1RSTCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobHRxX2RtYV9hbGxvY190eCk7CisKK3ZvaWQKK2x0cV9kbWFfYWxsb2Nfcngoc3RydWN0IGx0cV9kbWFfY2hhbm5lbCAqY2gpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWx0cV9kbWFfYWxsb2MoY2gpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWx0cV9kbWFfdzMyKERNQV9ERVNDUFQsIExUUV9ETUFfQ0lFKTsKKwlsdHFfZG1hX3czMl9tYXNrKDAsIDEgPDwgY2gtPm5yLCBMVFFfRE1BX0lSTkVOKTsKKwlsdHFfZG1hX3czMihETUFfV0VJR0hULCBMVFFfRE1BX0NDVFJMKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChsdHFfZG1hX2FsbG9jX3J4KTsKKwordm9pZAorbHRxX2RtYV9mcmVlKHN0cnVjdCBsdHFfZG1hX2NoYW5uZWwgKmNoKQoreworCWlmICghY2gtPmRlc2NfYmFzZSkKKwkJcmV0dXJuOworCWx0cV9kbWFfY2xvc2UoY2gpOworCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIExUUV9ERVNDX05VTSAqIExUUV9ERVNDX1NJWkUsCisJCWNoLT5kZXNjX2Jhc2UsIGNoLT5waHlzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGx0cV9kbWFfZnJlZSk7CisKK3ZvaWQKK2x0cV9kbWFfaW5pdF9wb3J0KGludCBwKQoreworCWx0cV9kbWFfdzMyKHAsIExUUV9ETUFfUFMpOworCXN3aXRjaCAocCkgeworCWNhc2UgRE1BX1BPUlRfRVRPUDoKKwkJLyoKKwkJICogVGVsbCB0aGUgRE1BIGVuZ2luZSB0byBzd2FwIHRoZSBlbmRpYW5lc3Mgb2YgZGF0YSBmcmFtZXMgYW5kCisJCSAqIGRyb3AgcGFja2V0cyBpZiB0aGUgY2hhbm5lbCBhcmJpdHJhdGlvbiBmYWlscy4KKwkJICovCisJCWx0cV9kbWFfdzMyX21hc2soMCwgRE1BX0VUT1BfRU5ESUFORVNTIHwgRE1BX1BERU4sCisJCQlMVFFfRE1BX1BDVFJMKTsKKwkJYnJlYWs7CisKKwljYXNlIERNQV9QT1JUX0RFVToKKwkJbHRxX2RtYV93MzIoKERNQV8yV19CVVJTVCA8PCA0KSB8IChETUFfMldfQlVSU1QgPDwgMiksCisJCQlMVFFfRE1BX1BDVFJMKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChsdHFfZG1hX2luaXRfcG9ydCk7CisKK2ludCBfX2luaXQKK2x0cV9kbWFfaW5pdCh2b2lkKQoreworCWludCBpOworCisJLyogaW5zZXJ0IGFuZCByZXF1ZXN0IHRoZSBtZW1vcnkgcmVnaW9uICovCisJaWYgKGluc2VydF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZsdHFfZG1hX3Jlc291cmNlKSA8IDApCisJCXBhbmljKCJGYWlsZWQgdG8gaW5zZXJ0IGRtYSBtZW1vcnlcbiIpOworCisJaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihsdHFfZG1hX3Jlc291cmNlLnN0YXJ0LAorCQkJcmVzb3VyY2Vfc2l6ZSgmbHRxX2RtYV9yZXNvdXJjZSksICJkbWEiKSA8IDApCisJCXBhbmljKCJGYWlsZWQgdG8gcmVxdWVzdCBkbWEgbWVtb3J5XG4iKTsKKworCS8qIHJlbWFwIGRtYSByZWdpc3RlciByYW5nZSAqLworCWx0cV9kbWFfbWVtYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShsdHFfZG1hX3Jlc291cmNlLnN0YXJ0LAorCQkJCXJlc291cmNlX3NpemUoJmx0cV9kbWFfcmVzb3VyY2UpKTsKKwlpZiAoIWx0cV9kbWFfbWVtYmFzZSkKKwkJcGFuaWMoIkZhaWxlZCB0byByZW1hcCBkbWEgbWVtb3J5XG4iKTsKKworCS8qIHBvd2VyIHVwIGFuZCByZXNldCB0aGUgZG1hIGVuZ2luZSAqLworCWx0cV9wbXVfZW5hYmxlKFBNVV9ETUEpOworCWx0cV9kbWFfdzMyX21hc2soMCwgRE1BX1JFU0VULCBMVFFfRE1BX0NUUkwpOworCisJLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCWx0cV9kbWFfdzMyKDAsIExUUV9ETUFfSVJORU4pOworCisJLyogcmVzZXQvY29uZmlndXJlIGVhY2ggY2hhbm5lbCAqLworCWZvciAoaSA9IDA7IGkgPCBETUFfTUFYX0NIQU5ORUw7IGkrKykgeworCQlsdHFfZG1hX3czMihpLCBMVFFfRE1BX0NTKTsKKwkJbHRxX2RtYV93MzIoRE1BX0NIQU5fUlNULCBMVFFfRE1BX0NDVFJMKTsKKwkJbHRxX2RtYV93MzIoRE1BX1BPTEwgfCBETUFfQ0xLX0RJVjQsIExUUV9ETUFfQ1BPTEwpOworCQlsdHFfZG1hX3czMl9tYXNrKERNQV9DSEFOX09OLCAwLCBMVFFfRE1BX0NDVFJMKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3Bvc3Rjb3JlX2luaXRjYWxsKGx0cV9kbWFfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGFudGlxL3h3YXkvZWJ1LmMgYi9hcmNoL21pcHMvbGFudGlxL3h3YXkvZWJ1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZlYjUyZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9sYW50aXEveHdheS9lYnUuYwpAQCAtMCwwICsxLDUzIEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgRUJVIC0gdGhlIGV4dGVybmFsIGJ1cyB1bml0IGF0dGFjaGVzIFBDSSwgTk9SIGFuZCBOQU5ECisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBKb2huIENyaXNwaW4gPGJsb2dpY0BvcGVud3J0Lm9yZz4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorCisjaW5jbHVkZSA8bGFudGlxX3NvYy5oPgorCisvKiBhbGwgYWNjZXNzIHRvIHRoZSBlYnUgbXVzdCBiZSBsb2NrZWQgKi8KK0RFRklORV9TUElOTE9DSyhlYnVfbG9jayk7CitFWFBPUlRfU1lNQk9MX0dQTChlYnVfbG9jayk7CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbHRxX2VidV9yZXNvdXJjZSA9IHsKKwkubmFtZQk9ICJlYnUiLAorCS5zdGFydAk9IExUUV9FQlVfQkFTRV9BRERSLAorCS5lbmQJPSBMVFFfRUJVX0JBU0VfQUREUiArIExUUV9FQlVfU0laRSAtIDEsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCisvKiByZW1hcHBlZCBiYXNlIGFkZHIgb2YgdGhlIGNsb2NrIHVuaXQgYW5kIGV4dGVybmFsIGJ1cyB1bml0ICovCit2b2lkIF9faW9tZW0gKmx0cV9lYnVfbWVtYmFzZTsKKworc3RhdGljIGludCBfX2luaXQgbGFudGlxX2VidV9pbml0KHZvaWQpCit7CisJLyogaW5zZXJ0IGFuZCByZXF1ZXN0IHRoZSBtZW1vcnkgcmVnaW9uICovCisJaWYgKGluc2VydF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZsdHFfZWJ1X3Jlc291cmNlKSA8IDApCisJCXBhbmljKCJGYWlsZWQgdG8gaW5zZXJ0IGVidSBtZW1vcnlcbiIpOworCisJaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihsdHFfZWJ1X3Jlc291cmNlLnN0YXJ0LAorCQkJcmVzb3VyY2Vfc2l6ZSgmbHRxX2VidV9yZXNvdXJjZSksICJlYnUiKSA8IDApCisJCXBhbmljKCJGYWlsZWQgdG8gcmVxdWVzdCBlYnUgbWVtb3J5XG4iKTsKKworCS8qIHJlbWFwIGVidSByZWdpc3RlciByYW5nZSAqLworCWx0cV9lYnVfbWVtYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShsdHFfZWJ1X3Jlc291cmNlLnN0YXJ0LAorCQkJCXJlc291cmNlX3NpemUoJmx0cV9lYnVfcmVzb3VyY2UpKTsKKwlpZiAoIWx0cV9lYnVfbWVtYmFzZSkKKwkJcGFuaWMoIkZhaWxlZCB0byByZW1hcCBlYnUgbWVtb3J5XG4iKTsKKworCS8qIG1ha2Ugc3VyZSB0byB1bnByb3RlY3QgdGhlIG1lbW9yeSByZWdpb24gd2hlcmUgZmxhc2ggaXMgbG9jYXRlZCAqLworCWx0cV9lYnVfdzMyKGx0cV9lYnVfcjMyKExUUV9FQlVfQlVTQ09OMCkgJiB+RUJVX1dSRElTLCBMVFFfRUJVX0JVU0NPTjApOworCXJldHVybiAwOworfQorCitwb3N0Y29yZV9pbml0Y2FsbChsYW50aXFfZWJ1X2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xhbnRpcS94d2F5L2dwaW8uYyBiL2FyY2gvbWlwcy9sYW50aXEveHdheS9ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMyMTQ1MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9sYW50aXEveHdheS9ncGlvLmMKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgSm9obiBDcmlzcGluIDxibG9naWNAb3BlbndydC5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGxhbnRpcV9zb2MuaD4KKworI2RlZmluZSBMVFFfR1BJT19PVVQJCTB4MDAKKyNkZWZpbmUgTFRRX0dQSU9fSU4JCTB4MDQKKyNkZWZpbmUgTFRRX0dQSU9fRElSCQkweDA4CisjZGVmaW5lIExUUV9HUElPX0FMVFNFTDAJMHgwQworI2RlZmluZSBMVFFfR1BJT19BTFRTRUwxCTB4MTAKKyNkZWZpbmUgTFRRX0dQSU9fT0QJCTB4MTQKKworI2RlZmluZSBQSU5TX1BFUl9QT1JUCQkxNgorI2RlZmluZSBNQVhfUE9SVFMJCTMKKworI2RlZmluZSBsdHFfZ3Bpb19nZXRiaXQobSwgciwgcCkJKCEhKGx0cV9yMzIobSArIHIpICYgKDEgPDwgcCkpKQorI2RlZmluZSBsdHFfZ3Bpb19zZXRiaXQobSwgciwgcCkJbHRxX3czMl9tYXNrKDAsICgxIDw8IHApLCBtICsgcikKKyNkZWZpbmUgbHRxX2dwaW9fY2xlYXJiaXQobSwgciwgcCkJbHRxX3czMl9tYXNrKCgxIDw8IHApLCAwLCBtICsgcikKKworc3RydWN0IGx0cV9ncGlvIHsKKwl2b2lkIF9faW9tZW0gKm1lbWJhc2U7CisJc3RydWN0IGdwaW9fY2hpcCBjaGlwOworfTsKKworc3RhdGljIHN0cnVjdCBsdHFfZ3BpbyBsdHFfZ3Bpb19wb3J0W01BWF9QT1JUU107CisKK2ludCBncGlvX3RvX2lycSh1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0woZ3Bpb190b19pcnEpOworCitpbnQgaXJxX3RvX2dwaW8odW5zaWduZWQgaW50IGdwaW8pCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CitFWFBPUlRfU1lNQk9MKGlycV90b19ncGlvKTsKKworaW50IGx0cV9ncGlvX3JlcXVlc3QodW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IGFsdDAsCisJdW5zaWduZWQgaW50IGFsdDEsIHVuc2lnbmVkIGludCBkaXIsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGlkID0gMDsKKworCWlmIChwaW4gPj0gKE1BWF9QT1JUUyAqIFBJTlNfUEVSX1BPUlQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZ3Bpb19yZXF1ZXN0KHBpbiwgbmFtZSkpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gc2V0dXAgbGFudGlxIGdwaW86ICVzXG4iLCBuYW1lKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJaWYgKGRpcikKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBpbiwgMSk7CisJZWxzZQorCQlncGlvX2RpcmVjdGlvbl9pbnB1dChwaW4pOworCXdoaWxlIChwaW4gPj0gUElOU19QRVJfUE9SVCkgeworCQlwaW4gLT0gUElOU19QRVJfUE9SVDsKKwkJaWQrKzsKKwl9CisJaWYgKGFsdDApCisJCWx0cV9ncGlvX3NldGJpdChsdHFfZ3Bpb19wb3J0W2lkXS5tZW1iYXNlLAorCQkJTFRRX0dQSU9fQUxUU0VMMCwgcGluKTsKKwllbHNlCisJCWx0cV9ncGlvX2NsZWFyYml0KGx0cV9ncGlvX3BvcnRbaWRdLm1lbWJhc2UsCisJCQlMVFFfR1BJT19BTFRTRUwwLCBwaW4pOworCWlmIChhbHQxKQorCQlsdHFfZ3Bpb19zZXRiaXQobHRxX2dwaW9fcG9ydFtpZF0ubWVtYmFzZSwKKwkJCUxUUV9HUElPX0FMVFNFTDEsIHBpbik7CisJZWxzZQorCQlsdHFfZ3Bpb19jbGVhcmJpdChsdHFfZ3Bpb19wb3J0W2lkXS5tZW1iYXNlLAorCQkJTFRRX0dQSU9fQUxUU0VMMSwgcGluKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wobHRxX2dwaW9fcmVxdWVzdCk7CisKK3N0YXRpYyB2b2lkIGx0cV9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGx0cV9ncGlvICpsdHFfZ3BpbyA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgbHRxX2dwaW8sIGNoaXApOworCisJaWYgKHZhbHVlKQorCQlsdHFfZ3Bpb19zZXRiaXQobHRxX2dwaW8tPm1lbWJhc2UsIExUUV9HUElPX09VVCwgb2Zmc2V0KTsKKwllbHNlCisJCWx0cV9ncGlvX2NsZWFyYml0KGx0cV9ncGlvLT5tZW1iYXNlLCBMVFFfR1BJT19PVVQsIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbnQgbHRxX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IGx0cV9ncGlvICpsdHFfZ3BpbyA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgbHRxX2dwaW8sIGNoaXApOworCisJcmV0dXJuIGx0cV9ncGlvX2dldGJpdChsdHFfZ3Bpby0+bWVtYmFzZSwgTFRRX0dQSU9fSU4sIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbnQgbHRxX2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IGx0cV9ncGlvICpsdHFfZ3BpbyA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgbHRxX2dwaW8sIGNoaXApOworCisJbHRxX2dwaW9fY2xlYXJiaXQobHRxX2dwaW8tPm1lbWJhc2UsIExUUV9HUElPX09ELCBvZmZzZXQpOworCWx0cV9ncGlvX2NsZWFyYml0KGx0cV9ncGlvLT5tZW1iYXNlLCBMVFFfR1BJT19ESVIsIG9mZnNldCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsdHFfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJdW5zaWduZWQgaW50IG9mZnNldCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBsdHFfZ3BpbyAqbHRxX2dwaW8gPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IGx0cV9ncGlvLCBjaGlwKTsKKworCWx0cV9ncGlvX3NldGJpdChsdHFfZ3Bpby0+bWVtYmFzZSwgTFRRX0dQSU9fT0QsIG9mZnNldCk7CisJbHRxX2dwaW9fc2V0Yml0KGx0cV9ncGlvLT5tZW1iYXNlLCBMVFFfR1BJT19ESVIsIG9mZnNldCk7CisJbHRxX2dwaW9fc2V0KGNoaXAsIG9mZnNldCwgdmFsdWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbHRxX2dwaW9fcmVxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgbHRxX2dwaW8gKmx0cV9ncGlvID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBsdHFfZ3BpbywgY2hpcCk7CisKKwlsdHFfZ3Bpb19jbGVhcmJpdChsdHFfZ3Bpby0+bWVtYmFzZSwgTFRRX0dQSU9fQUxUU0VMMCwgb2Zmc2V0KTsKKwlsdHFfZ3Bpb19jbGVhcmJpdChsdHFfZ3Bpby0+bWVtYmFzZSwgTFRRX0dQSU9fQUxUU0VMMSwgb2Zmc2V0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsdHFfZ3Bpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJaWYgKHBkZXYtPmlkID49IE1BWF9QT1JUUykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJpbnZhbGlkIGdwaW8gcG9ydCAlZFxuIiwKKwkJCXBkZXYtPmlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBtZW1vcnkgZm9yIGdwaW8gcG9ydCAlZFxuIiwKKwkJCXBkZXYtPmlkKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCXJlcyA9IGRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCisJCXJlc291cmNlX3NpemUocmVzKSwgZGV2X25hbWUoJnBkZXYtPmRldikpOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJmYWlsZWQgdG8gcmVxdWVzdCBtZW1vcnkgZm9yIGdwaW8gcG9ydCAlZFxuIiwKKwkJCXBkZXYtPmlkKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJbHRxX2dwaW9fcG9ydFtwZGV2LT5pZF0ubWVtYmFzZSA9IGRldm1faW9yZW1hcF9ub2NhY2hlKCZwZGV2LT5kZXYsCisJCXJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFsdHFfZ3Bpb19wb3J0W3BkZXYtPmlkXS5tZW1iYXNlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZW1hcCBtZW1vcnkgZm9yIGdwaW8gcG9ydCAlZFxuIiwKKwkJCXBkZXYtPmlkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWx0cV9ncGlvX3BvcnRbcGRldi0+aWRdLmNoaXAubGFiZWwgPSAibHRxX2dwaW8iOworCWx0cV9ncGlvX3BvcnRbcGRldi0+aWRdLmNoaXAuZGlyZWN0aW9uX2lucHV0ID0gbHRxX2dwaW9fZGlyZWN0aW9uX2lucHV0OworCWx0cV9ncGlvX3BvcnRbcGRldi0+aWRdLmNoaXAuZGlyZWN0aW9uX291dHB1dCA9CisJCWx0cV9ncGlvX2RpcmVjdGlvbl9vdXRwdXQ7CisJbHRxX2dwaW9fcG9ydFtwZGV2LT5pZF0uY2hpcC5nZXQgPSBsdHFfZ3Bpb19nZXQ7CisJbHRxX2dwaW9fcG9ydFtwZGV2LT5pZF0uY2hpcC5zZXQgPSBsdHFfZ3Bpb19zZXQ7CisJbHRxX2dwaW9fcG9ydFtwZGV2LT5pZF0uY2hpcC5yZXF1ZXN0ID0gbHRxX2dwaW9fcmVxOworCWx0cV9ncGlvX3BvcnRbcGRldi0+aWRdLmNoaXAuYmFzZSA9IFBJTlNfUEVSX1BPUlQgKiBwZGV2LT5pZDsKKwlsdHFfZ3Bpb19wb3J0W3BkZXYtPmlkXS5jaGlwLm5ncGlvID0gUElOU19QRVJfUE9SVDsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCAmbHRxX2dwaW9fcG9ydFtwZGV2LT5pZF0pOworCXJldHVybiBncGlvY2hpcF9hZGQoJmx0cV9ncGlvX3BvcnRbcGRldi0+aWRdLmNoaXApOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlcgorbHRxX2dwaW9fZHJpdmVyID0geworCS5wcm9iZSA9IGx0cV9ncGlvX3Byb2JlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImx0cV9ncGlvIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK2ludCBfX2luaXQgbHRxX2dwaW9faW5pdCh2b2lkKQoreworCWludCByZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmx0cV9ncGlvX2RyaXZlcik7CisKKwlpZiAocmV0KQorCQlwcl9pbmZvKCJsdHFfZ3BpbyA6IEVycm9yIHJlZ2lzdGVyaW5nIHBsYXRmb20gZHJpdmVyISIpOworCXJldHVybiByZXQ7Cit9CisKK3Bvc3Rjb3JlX2luaXRjYWxsKGx0cV9ncGlvX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xhbnRpcS94d2F5L2dwaW9fZWJ1LmMgYi9hcmNoL21pcHMvbGFudGlxL3h3YXkvZ3Bpb19lYnUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDc5MzU1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2xhbnRpcS94d2F5L2dwaW9fZWJ1LmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgSm9obiBDcmlzcGluIDxibG9naWNAb3BlbndydC5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxsYW50aXFfc29jLmg+CisKKy8qCisgKiBCeSBhdHRhY2hpbmcgaGFyZHdhcmUgbGF0Y2hlcyB0byB0aGUgRUJVIGl0IGlzIHBvc3NpYmxlIHRvIGNyZWF0ZSBvdXRwdXQKKyAqIG9ubHkgZ3Bpb3MuIFRoaXMgZHJpdmVyIGNvbmZpZ3VyZXMgYSBzcGVjaWFsIG1lbW9yeSBhZGRyZXNzLCB3aGljaCB3aGVuCisgKiB3cml0dGVuIHRvIG91dHB1dHMgMTYgYml0IHRvIHRoZSBsYXRjaGVzLgorICovCisKKyNkZWZpbmUgTFRRX0VCVV9CVVNDT04JMHgxZTdmZgkJLyogMTYgYml0IGFjY2Vzcywgc2xvd2VzdCB0aW1pbmcgKi8KKyNkZWZpbmUgTFRRX0VCVV9XUAkweDgwMDAwMDAwCS8qIHdyaXRlIHByb3RlY3QgYml0ICovCisKKy8qIHdlIGtlZXAgYSBzaGFkb3cgdmFsdWUgb2YgdGhlIGxhc3QgdmFsdWUgd3JpdHRlbiB0byB0aGUgZWJ1ICovCitzdGF0aWMgaW50IGx0cV9lYnVfZ3Bpb19zaGFkb3cgPSAweDA7CitzdGF0aWMgdm9pZCBfX2lvbWVtICpsdHFfZWJ1X2dwaW9fbWVtYmFzZTsKKworc3RhdGljIHZvaWQgbHRxX2VidV9hcHBseSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWJ1X2xvY2ssIGZsYWdzKTsKKwlsdHFfZWJ1X3czMihMVFFfRUJVX0JVU0NPTiwgTFRRX0VCVV9CVVNDT04xKTsKKwkqKChfX3UxNiAqKWx0cV9lYnVfZ3Bpb19tZW1iYXNlKSA9IGx0cV9lYnVfZ3Bpb19zaGFkb3c7CisJbHRxX2VidV93MzIoTFRRX0VCVV9CVVNDT04gfCBMVFFfRUJVX1dQLCBMVFFfRUJVX0JVU0NPTjEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVidV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGx0cV9lYnVfc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCWlmICh2YWx1ZSkKKwkJbHRxX2VidV9ncGlvX3NoYWRvdyB8PSAoMSA8PCBvZmZzZXQpOworCWVsc2UKKwkJbHRxX2VidV9ncGlvX3NoYWRvdyAmPSB+KDEgPDwgb2Zmc2V0KTsKKwlsdHFfZWJ1X2FwcGx5KCk7Cit9CisKK3N0YXRpYyBpbnQgbHRxX2VidV9kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwKKwlpbnQgdmFsdWUpCit7CisJbHRxX2VidV9zZXQoY2hpcCwgb2Zmc2V0LCB2YWx1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgbHRxX2VidV9jaGlwID0geworCS5sYWJlbCA9ICJsdHFfZWJ1IiwKKwkuZGlyZWN0aW9uX291dHB1dCA9IGx0cV9lYnVfZGlyZWN0aW9uX291dHB1dCwKKwkuc2V0ID0gbHRxX2VidV9zZXQsCisJLmJhc2UgPSA3MiwKKwkubmdwaW8gPSAxNiwKKwkuY2FuX3NsZWVwID0gMSwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgbHRxX2VidV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgbWVtb3J5IHJlc291cmNlXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJcmVzID0gZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJnBkZXYtPmRldiwgcmVzLT5zdGFydCwKKwkJcmVzb3VyY2Vfc2l6ZShyZXMpLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgbWVtb3J5IHJlc291cmNlXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlsdHFfZWJ1X2dwaW9fbWVtYmFzZSA9IGRldm1faW9yZW1hcF9ub2NhY2hlKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCisJCXJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFsdHFfZWJ1X2dwaW9fbWVtYmFzZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gaW9yZW1hcCBtZW0gcmVnaW9uXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogZ3JhYiB0aGUgZGVmYXVsdCBzaGFkb3cgdmFsdWUgcGFzc2VkIGZvcm0gdGhlIHBsYXRmb3JtIGNvZGUgKi8KKwlsdHFfZWJ1X2dwaW9fc2hhZG93ID0gKHVuc2lnbmVkIGludCkgcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwkvKiB0ZWxsIHRoZSBlYnUgY29udHJvbGxlciB3aGljaCBtZW1vcnkgYWRkcmVzcyB3ZSB3aWxsIGJlIHVzaW5nICovCisJbHRxX2VidV93MzIocGRldi0+cmVzb3VyY2UtPnN0YXJ0IHwgMHgxLCBMVFFfRUJVX0FERFJTRUwxKTsKKworCS8qIHdyaXRlIHByb3RlY3QgdGhlIHJlZ2lvbiAqLworCWx0cV9lYnVfdzMyKExUUV9FQlVfQlVTQ09OIHwgTFRRX0VCVV9XUCwgTFRRX0VCVV9CVVNDT04xKTsKKworCXJldCA9IGdwaW9jaGlwX2FkZCgmbHRxX2VidV9jaGlwKTsKKwlpZiAoIXJldCkKKwkJbHRxX2VidV9hcHBseSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGx0cV9lYnVfZHJpdmVyID0geworCS5wcm9iZSA9IGx0cV9lYnVfcHJvYmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibHRxX2VidSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBsdHFfZWJ1X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZsdHFfZWJ1X2RyaXZlcik7CisKKwlpZiAocmV0KQorCQlwcl9pbmZvKCJsdHFfZWJ1IDogRXJyb3IgcmVnaXN0ZXJpbmcgcGxhdGZvbSBkcml2ZXIhIik7CisJcmV0dXJuIHJldDsKK30KKworcG9zdGNvcmVfaW5pdGNhbGwobHRxX2VidV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sYW50aXEveHdheS9ncGlvX3N0cC5jIGIvYXJjaC9taXBzL2xhbnRpcS94d2F5L2dwaW9fc3RwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkNTlkNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9sYW50aXEveHdheS9ncGlvX3N0cC5jCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IEpvaG4gQ3Jpc3BpbiA8YmxvZ2ljQG9wZW53cnQub3JnPgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisKKyNpbmNsdWRlIDxsYW50aXFfc29jLmg+CisKKyNkZWZpbmUgTFRRX1NUUF9DT04wCQkweDAwCisjZGVmaW5lIExUUV9TVFBfQ09OMQkJMHgwNAorI2RlZmluZSBMVFFfU1RQX0NQVTAJCTB4MDgKKyNkZWZpbmUgTFRRX1NUUF9DUFUxCQkweDBDCisjZGVmaW5lIExUUV9TVFBfQVIJCTB4MTAKKworI2RlZmluZSBMVFFfU1RQX0NPTl9TV1UJCSgxIDw8IDMxKQorI2RlZmluZSBMVFFfU1RQXzJIWgkJMAorI2RlZmluZSBMVFFfU1RQXzRIWgkJKDEgPDwgMjMpCisjZGVmaW5lIExUUV9TVFBfOEhaCQkoMiA8PCAyMykKKyNkZWZpbmUgTFRRX1NUUF8xMEhaCQkoMyA8PCAyMykKKyNkZWZpbmUgTFRRX1NUUF9TUEVFRF9NQVNLCSgweGYgPDwgMjMpCisjZGVmaW5lIExUUV9TVFBfVVBEX0ZQSQkJKDEgPDwgMzEpCisjZGVmaW5lIExUUV9TVFBfVVBEX01BU0sJKDMgPDwgMzApCisjZGVmaW5lIExUUV9TVFBfQURTTF9TUkMJKDMgPDwgMjQpCisKKyNkZWZpbmUgTFRRX1NUUF9HUk9VUDAJCSgxIDw8IDApCisKKyNkZWZpbmUgTFRRX1NUUF9SSVNJTkcJCTAKKyNkZWZpbmUgTFRRX1NUUF9GQUxMSU5HCQkoMSA8PCAyNikKKyNkZWZpbmUgTFRRX1NUUF9FREdFX01BU0sJKDEgPDwgMjYpCisKKyNkZWZpbmUgbHRxX3N0cF9yMzIocmVnKQlfX3Jhd19yZWFkbChsdHFfc3RwX21lbWJhc2UgKyByZWcpCisjZGVmaW5lIGx0cV9zdHBfdzMyKHZhbCwgcmVnKQlfX3Jhd193cml0ZWwodmFsLCBsdHFfc3RwX21lbWJhc2UgKyByZWcpCisjZGVmaW5lIGx0cV9zdHBfdzMyX21hc2soY2xlYXIsIHNldCwgcmVnKSBcCisJCWx0cV93MzIoKGx0cV9yMzIobHRxX3N0cF9tZW1iYXNlICsgcmVnKSAmIH4oY2xlYXIpKSB8IChzZXQpLCBcCisJCWx0cV9zdHBfbWVtYmFzZSArIChyZWcpKQorCitzdGF0aWMgaW50IGx0cV9zdHBfc2hhZG93ID0gMHhmZmZmOworc3RhdGljIHZvaWQgX19pb21lbSAqbHRxX3N0cF9tZW1iYXNlOworCitzdGF0aWMgdm9pZCBsdHFfc3RwX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlpZiAodmFsdWUpCisJCWx0cV9zdHBfc2hhZG93IHw9ICgxIDw8IG9mZnNldCk7CisJZWxzZQorCQlsdHFfc3RwX3NoYWRvdyAmPSB+KDEgPDwgb2Zmc2V0KTsKKwlsdHFfc3RwX3czMihsdHFfc3RwX3NoYWRvdywgTFRRX1NUUF9DUFUwKTsKK30KKworc3RhdGljIGludCBsdHFfc3RwX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LAorCWludCB2YWx1ZSkKK3sKKwlsdHFfc3RwX3NldChjaGlwLCBvZmZzZXQsIHZhbHVlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGdwaW9fY2hpcCBsdHFfc3RwX2NoaXAgPSB7CisJLmxhYmVsID0gImx0cV9zdHAiLAorCS5kaXJlY3Rpb25fb3V0cHV0ID0gbHRxX3N0cF9kaXJlY3Rpb25fb3V0cHV0LAorCS5zZXQgPSBsdHFfc3RwX3NldCwKKwkuYmFzZSA9IDQ4LAorCS5uZ3BpbyA9IDI0LAorCS5jYW5fc2xlZXAgPSAxLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBsdHFfc3RwX2h3X2luaXQodm9pZCkKK3sKKwkvKiB0aGUgMyBwaW5zIHVzZWQgdG8gY29udHJvbCB0aGUgZXh0ZXJuYWwgc3RwICovCisJbHRxX2dwaW9fcmVxdWVzdCg0LCAxLCAwLCAxLCAic3RwLXN0Iik7CisJbHRxX2dwaW9fcmVxdWVzdCg1LCAxLCAwLCAxLCAic3RwLWQiKTsKKwlsdHFfZ3Bpb19yZXF1ZXN0KDYsIDEsIDAsIDEsICJzdHAtc2giKTsKKworCS8qIHNhbmUgZGVmYXVsdHMgKi8KKwlsdHFfc3RwX3czMigwLCBMVFFfU1RQX0FSKTsKKwlsdHFfc3RwX3czMigwLCBMVFFfU1RQX0NQVTApOworCWx0cV9zdHBfdzMyKDAsIExUUV9TVFBfQ1BVMSk7CisJbHRxX3N0cF93MzIoTFRRX1NUUF9DT05fU1dVLCBMVFFfU1RQX0NPTjApOworCWx0cV9zdHBfdzMyKDAsIExUUV9TVFBfQ09OMSk7CisKKwkvKiByaXNpbmcgb3IgZmFsbGluZyBlZGdlICovCisJbHRxX3N0cF93MzJfbWFzayhMVFFfU1RQX0VER0VfTUFTSywgTFRRX1NUUF9GQUxMSU5HLCBMVFFfU1RQX0NPTjApOworCisJLyogcGVyIGRlZmF1bHQgc3RwIDE1LTAgYXJlIHNldCAqLworCWx0cV9zdHBfdzMyX21hc2soMCwgTFRRX1NUUF9HUk9VUDAsIExUUV9TVFBfQ09OMSk7CisKKwkvKiBzdHAgYXJlIHVwZGF0ZSBwZXJpb2RpY2FsbHkgYnkgdGhlIEZQSSBidXMgKi8KKwlsdHFfc3RwX3czMl9tYXNrKExUUV9TVFBfVVBEX01BU0ssIExUUV9TVFBfVVBEX0ZQSSwgTFRRX1NUUF9DT04xKTsKKworCS8qIHNldCBzdHAgdXBkYXRlIHNwZWVkICovCisJbHRxX3N0cF93MzJfbWFzayhMVFFfU1RQX1NQRUVEX01BU0ssIExUUV9TVFBfOEhaLCBMVFFfU1RQX0NPTjEpOworCisJLyogdGVsbCB0aGUgaGFyZHdhcmUgdGhhdCBwaW4gKGxlZCkgMCBhbmQgMSBhcmUgY29udHJvbGxlZAorCSAqICBieSB0aGUgZHNsIGFyYworCSAqLworCWx0cV9zdHBfdzMyX21hc2soMCwgTFRRX1NUUF9BRFNMX1NSQywgTFRRX1NUUF9DT04wKTsKKworCWx0cV9wbXVfZW5hYmxlKFBNVV9MRUQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBsdHFfc3RwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWludCByZXQgPSAwOworCisJaWYgKCFyZXMpCisJCXJldHVybiAtRU5PRU5UOworCXJlcyA9IGRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCisJCXJlc291cmNlX3NpemUocmVzKSwgZGV2X25hbWUoJnBkZXYtPmRldikpOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IFNUUCBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlsdHFfc3RwX21lbWJhc2UgPSBkZXZtX2lvcmVtYXBfbm9jYWNoZSgmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LAorCQlyZXNvdXJjZV9zaXplKHJlcykpOworCWlmICghbHRxX3N0cF9tZW1iYXNlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZW1hcCBTVFAgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldCA9IGdwaW9jaGlwX2FkZCgmbHRxX3N0cF9jaGlwKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gbHRxX3N0cF9od19pbml0KCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBsdHFfc3RwX2RyaXZlciA9IHsKKwkucHJvYmUgPSBsdHFfc3RwX3Byb2JlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImx0cV9zdHAiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworaW50IF9faW5pdCBsdHFfc3RwX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZsdHFfc3RwX2RyaXZlcik7CisKKwlpZiAocmV0KQorCQlwcl9pbmZvKCJsdHFfc3RwOiBlcnJvciByZWdpc3RlcmluZyBwbGF0Zm9tIGRyaXZlciIpOworCXJldHVybiByZXQ7Cit9CisKK3Bvc3Rjb3JlX2luaXRjYWxsKGx0cV9zdHBfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGFudGlxL3h3YXkvbWFjaC1lYXN5NTA2MDEuYyBiL2FyY2gvbWlwcy9sYW50aXEveHdheS9tYWNoLWVhc3k1MDYwMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YWFmNjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvbGFudGlxL3h3YXkvbWFjaC1lYXN5NTA2MDEuYwpAQCAtMCwwICsxLDU3IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIEpvaG4gQ3Jpc3BpbiA8YmxvZ2ljQG9wZW53cnQub3JnPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorCisjaW5jbHVkZSA8bGFudGlxLmg+CisKKyNpbmNsdWRlICIuLi9tYWNodHlwZXMuaCIKKyNpbmNsdWRlICJkZXZpY2VzLmgiCisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBlYXN5NTA2MDFfcGFydGl0aW9uc1tdID0geworCXsKKwkJLm5hbWUJPSAidWJvb3QiLAorCQkub2Zmc2V0CT0gMHgwLAorCQkuc2l6ZQk9IDB4MTAwMDAsCisJfSwKKwl7CisJCS5uYW1lCT0gInVib290X2VudiIsCisJCS5vZmZzZXQJPSAweDEwMDAwLAorCQkuc2l6ZQk9IDB4MTAwMDAsCisJfSwKKwl7CisJCS5uYW1lCT0gImxpbnV4IiwKKwkJLm9mZnNldAk9IDB4MjAwMDAsCisJCS5zaXplCT0gMHhFMDAwMCwKKwl9LAorCXsKKwkJLm5hbWUJPSAicm9vdGZzIiwKKwkJLm9mZnNldAk9IDB4MTAwMDAwLAorCQkuc2l6ZQk9IDB4MzAwMDAwLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBlYXN5NTA2MDFfZmxhc2hfZGF0YSA9IHsKKwkubnJfcGFydHMJPSBBUlJBWV9TSVpFKGVhc3k1MDYwMV9wYXJ0aXRpb25zKSwKKwkucGFydHMJCT0gZWFzeTUwNjAxX3BhcnRpdGlvbnMsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgZWFzeTUwNjAxX2luaXQodm9pZCkKK3sKKwlsdHFfcmVnaXN0ZXJfbm9yKCZlYXN5NTA2MDFfZmxhc2hfZGF0YSk7Cit9CisKK01JUFNfTUFDSElORShMVFFfTUFDSF9FQVNZNTA2MDEsCisJCQkiRUFTWTUwNjAxIiwKKwkJCSJFQVNZNTA2MDEgRXZhbCBCb2FyZCIsCisJCQllYXN5NTA2MDFfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGFudGlxL3h3YXkvbWFjaC1lYXN5NTA3MTIuYyBiL2FyY2gvbWlwcy9sYW50aXEveHdheS9tYWNoLWVhc3k1MDcxMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNTAyN2IKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvbGFudGlxL3h3YXkvbWFjaC1lYXN5NTA3MTIuYwpAQCAtMCwwICsxLDc0IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIEpvaG4gQ3Jpc3BpbiA8YmxvZ2ljQG9wZW53cnQub3JnPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorCisjaW5jbHVkZSA8bGFudGlxX3NvYy5oPgorI2luY2x1ZGUgPGlycS5oPgorCisjaW5jbHVkZSAiLi4vbWFjaHR5cGVzLmgiCisjaW5jbHVkZSAiZGV2aWNlcy5oIgorCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gZWFzeTUwNzEyX3BhcnRpdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lCT0gInVib290IiwKKwkJLm9mZnNldAk9IDB4MCwKKwkJLnNpemUJPSAweDEwMDAwLAorCX0sCisJeworCQkubmFtZQk9ICJ1Ym9vdF9lbnYiLAorCQkub2Zmc2V0CT0gMHgxMDAwMCwKKwkJLnNpemUJPSAweDEwMDAwLAorCX0sCisJeworCQkubmFtZQk9ICJsaW51eCIsCisJCS5vZmZzZXQJPSAweDIwMDAwLAorCQkuc2l6ZQk9IDB4ZTAwMDAsCisJfSwKKwl7CisJCS5uYW1lCT0gInJvb3RmcyIsCisJCS5vZmZzZXQJPSAweDEwMDAwMCwKKwkJLnNpemUJPSAweDMwMDAwMCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgZWFzeTUwNzEyX2ZsYXNoX2RhdGEgPSB7CisJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShlYXN5NTA3MTJfcGFydGl0aW9ucyksCisJLnBhcnRzCQk9IGVhc3k1MDcxMl9wYXJ0aXRpb25zLAorfTsKKworc3RhdGljIHN0cnVjdCBsdHFfcGNpX2RhdGEgbHRxX3BjaV9kYXRhID0geworCS5jbG9jawk9IFBDSV9DTE9DS19JTlQsCisJLmdwaW8JPSBQQ0lfR05UMSB8IFBDSV9SRVExLAorCS5pcnEJPSB7CisJCVsxNF0gPSBJTlRfTlVNX0lNMF9JUkwwICsgMjIsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbHRxX2V0aF9kYXRhIGx0cV9ldGhfZGF0YSA9IHsKKwkubWlpX21vZGUgPSBQSFlfSU5URVJGQUNFX01PREVfTUlJLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGVhc3k1MDcxMl9pbml0KHZvaWQpCit7CisJbHRxX3JlZ2lzdGVyX2dwaW9fc3RwKCk7CisJbHRxX3JlZ2lzdGVyX25vcigmZWFzeTUwNzEyX2ZsYXNoX2RhdGEpOworCWx0cV9yZWdpc3Rlcl9wY2koJmx0cV9wY2lfZGF0YSk7CisJbHRxX3JlZ2lzdGVyX2V0b3AoJmx0cV9ldGhfZGF0YSk7Cit9CisKK01JUFNfTUFDSElORShMVFFfTUFDSF9FQVNZNTA3MTIsCisJICAgICAiRUFTWTUwNzEyIiwKKwkgICAgICJFQVNZNTA3MTIgRXZhbCBCb2FyZCIsCisJICAgICAgZWFzeTUwNzEyX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xhbnRpcS94d2F5L3BtdS5jIGIvYXJjaC9taXBzL2xhbnRpcS94d2F5L3BtdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNjlmMDFlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2xhbnRpcS94d2F5L3BtdS5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgSm9obiBDcmlzcGluIDxibG9naWNAb3BlbndydC5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKworI2luY2x1ZGUgPGxhbnRpcV9zb2MuaD4KKworLyogUE1VIC0gdGhlIHBvd2VyIG1hbmFnZW1lbnQgdW5pdCBhbGxvd3MgdXMgdG8gdHVybiBwYXJ0IG9mIHRoZSBjb3JlCisgKiBvbiBhbmQgb2ZmCisgKi8KKworLyogdGhlIGVuYWJsZSAvIGRpc2FibGUgcmVnaXN0ZXJzICovCisjZGVmaW5lIExUUV9QTVVfUFdEQ1IJMHgxQworI2RlZmluZSBMVFFfUE1VX1BXRFNSCTB4MjAKKworI2RlZmluZSBsdHFfcG11X3czMih4LCB5KQlsdHFfdzMyKCh4KSwgbHRxX3BtdV9tZW1iYXNlICsgKHkpKQorI2RlZmluZSBsdHFfcG11X3IzMih4KQkJbHRxX3IzMihsdHFfcG11X21lbWJhc2UgKyAoeCkpCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbHRxX3BtdV9yZXNvdXJjZSA9IHsKKwkubmFtZQk9ICJwbXUiLAorCS5zdGFydAk9IExUUV9QTVVfQkFTRV9BRERSLAorCS5lbmQJPSBMVFFfUE1VX0JBU0VfQUREUiArIExUUV9QTVVfU0laRSAtIDEsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgdm9pZCBfX2lvbWVtICpsdHFfcG11X21lbWJhc2U7CisKK3ZvaWQgbHRxX3BtdV9lbmFibGUodW5zaWduZWQgaW50IG1vZHVsZSkKK3sKKwlpbnQgZXJyID0gMTAwMDAwMDsKKworCWx0cV9wbXVfdzMyKGx0cV9wbXVfcjMyKExUUV9QTVVfUFdEQ1IpICYgfm1vZHVsZSwgTFRRX1BNVV9QV0RDUik7CisJZG8ge30gd2hpbGUgKC0tZXJyICYmIChsdHFfcG11X3IzMihMVFFfUE1VX1BXRFNSKSAmIG1vZHVsZSkpOworCisJaWYgKCFlcnIpCisJCXBhbmljKCJhY3RpdmF0aW5nIFBNVSBtb2R1bGUgZmFpbGVkIVxuIik7Cit9CitFWFBPUlRfU1lNQk9MKGx0cV9wbXVfZW5hYmxlKTsKKwordm9pZCBsdHFfcG11X2Rpc2FibGUodW5zaWduZWQgaW50IG1vZHVsZSkKK3sKKwlsdHFfcG11X3czMihsdHFfcG11X3IzMihMVFFfUE1VX1BXRENSKSB8IG1vZHVsZSwgTFRRX1BNVV9QV0RDUik7Cit9CitFWFBPUlRfU1lNQk9MKGx0cV9wbXVfZGlzYWJsZSk7CisKK2ludCBfX2luaXQgbHRxX3BtdV9pbml0KHZvaWQpCit7CisJaWYgKGluc2VydF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZsdHFfcG11X3Jlc291cmNlKSA8IDApCisJCXBhbmljKCJGYWlsZWQgdG8gaW5zZXJ0IHBtdSBtZW1vcnlcbiIpOworCisJaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihsdHFfcG11X3Jlc291cmNlLnN0YXJ0LAorCQkJcmVzb3VyY2Vfc2l6ZSgmbHRxX3BtdV9yZXNvdXJjZSksICJwbXUiKSA8IDApCisJCXBhbmljKCJGYWlsZWQgdG8gcmVxdWVzdCBwbXUgbWVtb3J5XG4iKTsKKworCWx0cV9wbXVfbWVtYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShsdHFfcG11X3Jlc291cmNlLnN0YXJ0LAorCQkJCXJlc291cmNlX3NpemUoJmx0cV9wbXVfcmVzb3VyY2UpKTsKKwlpZiAoIWx0cV9wbXVfbWVtYmFzZSkKKwkJcGFuaWMoIkZhaWxlZCB0byByZW1hcCBwbXUgbWVtb3J5XG4iKTsKKwlyZXR1cm4gMDsKK30KKworY29yZV9pbml0Y2FsbChsdHFfcG11X2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xhbnRpcS94d2F5L3Byb20tYXNlLmMgYi9hcmNoL21pcHMvbGFudGlxL3h3YXkvcHJvbS1hc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmU0OWY0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2xhbnRpcS94d2F5L3Byb20tYXNlLmMKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAorICogIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBKb2huIENyaXNwaW4gPGJsb2dpY0BvcGVud3J0Lm9yZz4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CisjaW5jbHVkZSA8YXNtL3RpbWUuaD4KKworI2luY2x1ZGUgPGxhbnRpcV9zb2MuaD4KKworI2luY2x1ZGUgIi4uL3Byb20uaCIKKworI2RlZmluZSBTT0NfQU1BWk9OX1NFCSJBbWF6b25fU0UiCisKKyNkZWZpbmUgUEFSVF9TSElGVAkxMgorI2RlZmluZSBQQVJUX01BU0sJMHgwRkZGRkZGRgorI2RlZmluZSBSRVZfU0hJRlQJMjgKKyNkZWZpbmUgUkVWX01BU0sJMHhGMDAwMDAwMAorCit2b2lkIF9faW5pdCBsdHFfc29jX2RldGVjdChzdHJ1Y3QgbHRxX3NvY19pbmZvICppKQoreworCWktPnBhcnRudW0gPSAobHRxX3IzMihMVFFfTVBTX0NISVBJRCkgJiBQQVJUX01BU0spID4+IFBBUlRfU0hJRlQ7CisJaS0+cmV2ID0gKGx0cV9yMzIoTFRRX01QU19DSElQSUQpICYgUkVWX01BU0spID4+IFJFVl9TSElGVDsKKwlzd2l0Y2ggKGktPnBhcnRudW0pIHsKKwljYXNlIFNPQ19JRF9BTUFaT05fU0U6CisJCWktPm5hbWUgPSBTT0NfQU1BWk9OX1NFOworCQlpLT50eXBlID0gU09DX1RZUEVfQU1BWk9OX1NFOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXVucmVhY2hhYmxlKCk7CisJCWJyZWFrOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sYW50aXEveHdheS9wcm9tLXh3YXkuYyBiL2FyY2gvbWlwcy9sYW50aXEveHdheS9wcm9tLXh3YXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjg2NjkyYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9sYW50aXEveHdheS9wcm9tLXh3YXkuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIEpvaG4gQ3Jpc3BpbiA8YmxvZ2ljQG9wZW53cnQub3JnPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KKyNpbmNsdWRlIDxhc20vdGltZS5oPgorCisjaW5jbHVkZSA8bGFudGlxX3NvYy5oPgorCisjaW5jbHVkZSAiLi4vcHJvbS5oIgorCisjZGVmaW5lIFNPQ19EQU5VQkUJIkRhbnViZSIKKyNkZWZpbmUgU09DX1RXSU5QQVNTCSJUd2lucGFzcyIKKyNkZWZpbmUgU09DX0FSOQkJIkFSOSIKKworI2RlZmluZSBQQVJUX1NISUZUCTEyCisjZGVmaW5lIFBBUlRfTUFTSwkweDBGRkZGRkZGCisjZGVmaW5lIFJFVl9TSElGVAkyOAorI2RlZmluZSBSRVZfTUFTSwkweEYwMDAwMDAwCisKK3ZvaWQgX19pbml0IGx0cV9zb2NfZGV0ZWN0KHN0cnVjdCBsdHFfc29jX2luZm8gKmkpCit7CisJaS0+cGFydG51bSA9IChsdHFfcjMyKExUUV9NUFNfQ0hJUElEKSAmIFBBUlRfTUFTSykgPj4gUEFSVF9TSElGVDsKKwlpLT5yZXYgPSAobHRxX3IzMihMVFFfTVBTX0NISVBJRCkgJiBSRVZfTUFTSykgPj4gUkVWX1NISUZUOworCXN3aXRjaCAoaS0+cGFydG51bSkgeworCWNhc2UgU09DX0lEX0RBTlVCRTE6CisJY2FzZSBTT0NfSURfREFOVUJFMjoKKwkJaS0+bmFtZSA9IFNPQ19EQU5VQkU7CisJCWktPnR5cGUgPSBTT0NfVFlQRV9EQU5VQkU7CisJCWJyZWFrOworCisJY2FzZSBTT0NfSURfVFdJTlBBU1M6CisJCWktPm5hbWUgPSBTT0NfVFdJTlBBU1M7CisJCWktPnR5cGUgPSBTT0NfVFlQRV9EQU5VQkU7CisJCWJyZWFrOworCisJY2FzZSBTT0NfSURfQVJYMTg4OgorCWNhc2UgU09DX0lEX0FSWDE2ODoKKwljYXNlIFNPQ19JRF9BUlgxODI6CisJCWktPm5hbWUgPSBTT0NfQVI5OworCQlpLT50eXBlID0gU09DX1RZUEVfQVI5OworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXVucmVhY2hhYmxlKCk7CisJCWJyZWFrOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sYW50aXEveHdheS9yZXNldC5jIGIvYXJjaC9taXBzL2xhbnRpcS94d2F5L3Jlc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFiZTM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9sYW50aXEveHdheS9yZXNldC5jCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgSm9obiBDcmlzcGluIDxibG9naWNAb3BlbndydC5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgorCisjaW5jbHVkZSA8bGFudGlxX3NvYy5oPgorCisjZGVmaW5lIGx0cV9yY3VfdzMyKHgsIHkpCWx0cV93MzIoKHgpLCBsdHFfcmN1X21lbWJhc2UgKyAoeSkpCisjZGVmaW5lIGx0cV9yY3VfcjMyKHgpCQlsdHFfcjMyKGx0cV9yY3VfbWVtYmFzZSArICh4KSkKKworLyogcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgTFRRX1JDVV9SU1QJCTB4MDAxMAorI2RlZmluZSBMVFFfUkNVX1JTVF9BTEwJCTB4NDAwMDAwMDAKKworI2RlZmluZSBMVFFfUkNVX1JTVF9TVEFUCTB4MDAxNAorI2RlZmluZSBMVFFfUkNVX1NUQVRfU0hJRlQJMjYKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBsdHFfcmN1X3Jlc291cmNlID0geworCS5uYW1lICAgPSAicmN1IiwKKwkuc3RhcnQgID0gTFRRX1JDVV9CQVNFX0FERFIsCisJLmVuZCAgICA9IExUUV9SQ1VfQkFTRV9BRERSICsgTFRRX1JDVV9TSVpFIC0gMSwKKwkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCit9OworCisvKiByZW1hcHBlZCBiYXNlIGFkZHIgb2YgdGhlIHJlc2V0IGNvbnRyb2wgdW5pdCAqLworc3RhdGljIHZvaWQgX19pb21lbSAqbHRxX3JjdV9tZW1iYXNlOworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIHdhdGNoZG9nIGRyaXZlciAqLworaW50IGx0cV9yZXNldF9jYXVzZSh2b2lkKQoreworCXUzMiB2YWwgPSBsdHFfcmN1X3IzMihMVFFfUkNVX1JTVF9TVEFUKTsKKwlyZXR1cm4gdmFsID4+IExUUV9SQ1VfU1RBVF9TSElGVDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGx0cV9yZXNldF9jYXVzZSk7CisKK3N0YXRpYyB2b2lkIGx0cV9tYWNoaW5lX3Jlc3RhcnQoY2hhciAqY29tbWFuZCkKK3sKKwlwcl9ub3RpY2UoIlN5c3RlbSByZXN0YXJ0XG4iKTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWx0cV9yY3VfdzMyKGx0cV9yY3VfcjMyKExUUV9SQ1VfUlNUKSB8IExUUV9SQ1VfUlNUX0FMTCwgTFRRX1JDVV9SU1QpOworCXVucmVhY2hhYmxlKCk7Cit9CisKK3N0YXRpYyB2b2lkIGx0cV9tYWNoaW5lX2hhbHQodm9pZCkKK3sKKwlwcl9ub3RpY2UoIlN5c3RlbSBoYWx0ZWQuXG4iKTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXVucmVhY2hhYmxlKCk7Cit9CisKK3N0YXRpYyB2b2lkIGx0cV9tYWNoaW5lX3Bvd2VyX29mZih2b2lkKQoreworCXByX25vdGljZSgiUGxlYXNlIHR1cm4gb2ZmIHRoZSBwb3dlciBub3cuXG4iKTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXVucmVhY2hhYmxlKCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG1pcHNfcmVib290X3NldHVwKHZvaWQpCit7CisJLyogaW5zZXJ0IGFuZCByZXF1ZXN0IHRoZSBtZW1vcnkgcmVnaW9uICovCisJaWYgKGluc2VydF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZsdHFfcmN1X3Jlc291cmNlKSA8IDApCisJCXBhbmljKCJGYWlsZWQgdG8gaW5zZXJ0IHJjdSBtZW1vcnlcbiIpOworCisJaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihsdHFfcmN1X3Jlc291cmNlLnN0YXJ0LAorCQkJcmVzb3VyY2Vfc2l6ZSgmbHRxX3JjdV9yZXNvdXJjZSksICJyY3UiKSA8IDApCisJCXBhbmljKCJGYWlsZWQgdG8gcmVxdWVzdCByY3UgbWVtb3J5XG4iKTsKKworCS8qIHJlbWFwIHJjdSByZWdpc3RlciByYW5nZSAqLworCWx0cV9yY3VfbWVtYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShsdHFfcmN1X3Jlc291cmNlLnN0YXJ0LAorCQkJCXJlc291cmNlX3NpemUoJmx0cV9yY3VfcmVzb3VyY2UpKTsKKwlpZiAoIWx0cV9yY3VfbWVtYmFzZSkKKwkJcGFuaWMoIkZhaWxlZCB0byByZW1hcCByY3UgbWVtb3J5XG4iKTsKKworCV9tYWNoaW5lX3Jlc3RhcnQgPSBsdHFfbWFjaGluZV9yZXN0YXJ0OworCV9tYWNoaW5lX2hhbHQgPSBsdHFfbWFjaGluZV9oYWx0OworCXBtX3Bvd2VyX29mZiA9IGx0cV9tYWNoaW5lX3Bvd2VyX29mZjsKKworCXJldHVybiAwOworfQorCithcmNoX2luaXRjYWxsKG1pcHNfcmVib290X3NldHVwKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sYW50aXEveHdheS9zZXR1cC1hc2UuYyBiL2FyY2gvbWlwcy9sYW50aXEveHdheS9zZXR1cC1hc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmYzMjY3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2xhbnRpcS94d2F5L3NldHVwLWFzZS5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTEgSm9obiBDcmlzcGluIDxibG9naWNAb3BlbndydC5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxhbnRpcV9zb2MuaD4KKworI2luY2x1ZGUgIi4uL3Byb20uaCIKKyNpbmNsdWRlICJkZXZpY2VzLmgiCisKK3ZvaWQgX19pbml0IGx0cV9zb2Nfc2V0dXAodm9pZCkKK3sKKwlsdHFfcmVnaXN0ZXJfYXNlX2FzYygpOworCWx0cV9yZWdpc3Rlcl9ncGlvKCk7CisJbHRxX3JlZ2lzdGVyX3dkdCgpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xhbnRpcS94d2F5L3NldHVwLXh3YXkuYyBiL2FyY2gvbWlwcy9sYW50aXEveHdheS9zZXR1cC14d2F5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI5MmY2NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9sYW50aXEveHdheS9zZXR1cC14d2F5LmMKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAorICogIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMSBKb2huIENyaXNwaW4gPGJsb2dpY0BvcGVud3J0Lm9yZz4KKyAqLworCisjaW5jbHVkZSA8bGFudGlxX3NvYy5oPgorCisjaW5jbHVkZSAiLi4vcHJvbS5oIgorI2luY2x1ZGUgImRldmljZXMuaCIKKwordm9pZCBfX2luaXQgbHRxX3NvY19zZXR1cCh2b2lkKQoreworCWx0cV9yZWdpc3Rlcl9hc2MoMCk7CisJbHRxX3JlZ2lzdGVyX2FzYygxKTsKKwlsdHFfcmVnaXN0ZXJfZ3BpbygpOworCWx0cV9yZWdpc3Rlcl93ZHQoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9saWIvTWFrZWZpbGUgYi9hcmNoL21pcHMvbGliL01ha2VmaWxlCmluZGV4IDJhZGVhZDUuLmIyY2FkNGYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9saWIvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL2xpYi9NYWtlZmlsZQpAQCAtMjgsNiArMjgsNyBAQAogb2JqLSQoQ09ORklHX0NQVV9UWDQ5WFgpCSs9IGR1bXBfdGxiLm8KIG9iai0kKENPTkZJR19DUFVfVlI0MVhYKQkrPSBkdW1wX3RsYi5vCiBvYmotJChDT05GSUdfQ1BVX0NBVklVTV9PQ1RFT04pCSs9IGR1bXBfdGxiLm8KK29iai0kKENPTkZJR19DUFVfWExSKQkJKz0gZHVtcF90bGIubwogCiAjIGxpYmdjYy1zdHlsZSBzdHVmZiBuZWVkZWQgaW4gdGhlIGtlcm5lbAogb2JqLXkgKz0gYXNobGRpMy5vIGFzaHJkaTMubyBjbXBkaTIubyBsc2hyZGkzLm8gdWNtcGRpMi5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL2NzNTUzNi9jczU1MzZfbWZncHQuYyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vY3M1NTM2L2NzNTUzNl9tZmdwdC5jCmluZGV4IDhjODA3YzkuLjBjYjFiOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vY3M1NTM2L2NzNTUzNl9tZmdwdC5jCisrKyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vY3M1NTM2L2NzNTUzNl9tZmdwdC5jCkBAIC0yMDEsOCArMjAxLDYgQEAKIAkucmF0aW5nID0gMTIwLCAvKiBGdW5jdGlvbmFsIGZvciByZWFsIHVzZSwgYnV0IG5vdCBkZXNpcmVkICovCiAJLnJlYWQgPSBtZmdwdF9yZWFkLAogCS5tYXNrID0gQ0xPQ0tTT1VSQ0VfTUFTSygzMiksCi0JLm11bHQgPSAwLAotCS5zaGlmdCA9IDIyLAogfTsKIAogaW50IF9faW5pdCBpbml0X21mZ3B0X2Nsb2Nrc291cmNlKHZvaWQpCkBAIC0yMTAsOCArMjA4LDcgQEAKIAlpZiAobnVtX3Bvc3NpYmxlX2NwdXMoKSA+IDEpCS8qIE1GR1BUIGRvZXMgbm90IHNjYWxlISAqLwogCQlyZXR1cm4gMDsKIAotCWNsb2Nrc291cmNlX21mZ3B0Lm11bHQgPSBjbG9ja3NvdXJjZV9oejJtdWx0KE1GR1BUX1RJQ0tfUkFURSwgMjIpOwotCXJldHVybiBjbG9ja3NvdXJjZV9yZWdpc3RlcigmY2xvY2tzb3VyY2VfbWZncHQpOworCXJldHVybiBjbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmY2xvY2tzb3VyY2VfbWZncHQsIE1GR1BUX1RJQ0tfUkFURSk7CiB9CiAKIGFyY2hfaW5pdGNhbGwoaW5pdF9tZmdwdF9jbG9ja3NvdXJjZSk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vTWFrZWZpbGUgYi9hcmNoL21pcHMvbW0vTWFrZWZpbGUKaW5kZXggZDY3OWM3Ny4uNGQ4YzE2MiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9tbS9NYWtlZmlsZQpAQCAtMyw3ICszLDggQEAKICMKIAogb2JqLXkJCQkJKz0gY2FjaGUubyBkbWEtZGVmYXVsdC5vIGV4dGFibGUubyBmYXVsdC5vIFwKLQkJCQkgICBpbml0Lm8gdGxiZXgubyB0bGJleC1mYXVsdC5vIHVhc20ubyBwYWdlLm8KKwkJCQkgICBpbml0Lm8gbW1hcC5vIHRsYmV4Lm8gdGxiZXgtZmF1bHQubyB1YXNtLm8gXAorCQkJCSAgIHBhZ2UubwogCiBvYmotJChDT05GSUdfMzJCSVQpCQkrPSBpb3JlbWFwLm8gcGd0YWJsZS0zMi5vCiBvYmotJChDT05GSUdfNjRCSVQpCQkrPSBwZ3RhYmxlLTY0Lm8KQEAgLTI5LDYgKzMwLDcgQEAKIG9iai0kKENPTkZJR19DUFVfVFg0OVhYKQkrPSBjLXI0ay5vIGNleC1nZW4ubyB0bGItcjRrLm8KIG9iai0kKENPTkZJR19DUFVfVlI0MVhYKQkrPSBjLXI0ay5vIGNleC1nZW4ubyB0bGItcjRrLm8KIG9iai0kKENPTkZJR19DUFVfQ0FWSVVNX09DVEVPTikJKz0gYy1vY3Rlb24ubyBjZXgtb2N0Lm8gdGxiLXI0ay5vCitvYmotJChDT05GSUdfQ1BVX1hMUikJCSs9IGMtcjRrLm8gdGxiLXI0ay5vIGNleC1nZW4ubwogCiBvYmotJChDT05GSUdfSVAyMl9DUFVfU0NBQ0hFKQkrPSBzYy1pcDIyLm8KIG9iai0kKENPTkZJR19SNTAwMF9DUFVfU0NBQ0hFKSAgKz0gc2MtcjVrLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9jLXI0ay5jIGIvYXJjaC9taXBzL21tL2MtcjRrLmMKaW5kZXggNzFiZGRmOC4uZDliYzVkMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2MtcjRrLmMKKysrIGIvYXJjaC9taXBzL21tL2MtcjRrLmMKQEAgLTEwMDYsNiArMTAwNiw3IEBACiAJY2FzZSBDUFVfMjVLRjoKIAljYXNlIENQVV9TQjE6CiAJY2FzZSBDUFVfU0IxQToKKwljYXNlIENQVV9YTFI6CiAJCWMtPmRjYWNoZS5mbGFncyB8PSBNSVBTX0NBQ0hFX1BJTkRFWDsKIAkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9tbWFwLmMgYi9hcmNoL21pcHMvbW0vbW1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlM2MyMGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvbW0vbW1hcC5jCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFdpbmQgUml2ZXIgU3lzdGVtcywKKyAqICAgd3JpdHRlbiBieSBSYWxmIEJhZWNobGUgPHJhbGZAbGludXgtbWlwcy5vcmc+CisgKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKK3Vuc2lnbmVkIGxvbmcgc2htX2FsaWduX21hc2sgPSBQQUdFX1NJWkUgLSAxOwkvKiBTYW5lIGNhY2hlcyAqLworCitFWFBPUlRfU1lNQk9MKHNobV9hbGlnbl9tYXNrKTsKKworI2RlZmluZSBDT0xPVVJfQUxJR04oYWRkcixwZ29mZikJCQkJXAorCSgoKChhZGRyKSArIHNobV9hbGlnbl9tYXNrKSAmIH5zaG1fYWxpZ25fbWFzaykgKwlcCisJICgoKHBnb2ZmKSA8PCBQQUdFX1NISUZUKSAmIHNobV9hbGlnbl9tYXNrKSkKKwordW5zaWduZWQgbG9uZyBhcmNoX2dldF91bm1hcHBlZF9hcmVhKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgcGdvZmYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1tOworCWludCBkb19jb2xvcl9hbGlnbjsKKworCWlmIChsZW4gPiBUQVNLX1NJWkUpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGZsYWdzICYgTUFQX0ZJWEVEKSB7CisJCS8qIEV2ZW4gTUFQX0ZJWEVEIG1hcHBpbmdzIG11c3QgcmVzaWRlIHdpdGhpbiBUQVNLX1NJWkUuICAqLworCQlpZiAoVEFTS19TSVpFIC0gbGVuIDwgYWRkcikKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qCisJCSAqIFdlIGRvIG5vdCBhY2NlcHQgYSBzaGFyZWQgbWFwcGluZyBpZiBpdCB3b3VsZCB2aW9sYXRlCisJCSAqIGNhY2hlIGFsaWFzaW5nIGNvbnN0cmFpbnRzLgorCQkgKi8KKwkJaWYgKChmbGFncyAmIE1BUF9TSEFSRUQpICYmCisJCSAgICAoKGFkZHIgLSAocGdvZmYgPDwgUEFHRV9TSElGVCkpICYgc2htX2FsaWduX21hc2spKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBhZGRyOworCX0KKworCWRvX2NvbG9yX2FsaWduID0gMDsKKwlpZiAoZmlscCB8fCAoZmxhZ3MgJiBNQVBfU0hBUkVEKSkKKwkJZG9fY29sb3JfYWxpZ24gPSAxOworCWlmIChhZGRyKSB7CisJCWlmIChkb19jb2xvcl9hbGlnbikKKwkJCWFkZHIgPSBDT0xPVVJfQUxJR04oYWRkciwgcGdvZmYpOworCQllbHNlCisJCQlhZGRyID0gUEFHRV9BTElHTihhZGRyKTsKKwkJdm1tID0gZmluZF92bWEoY3VycmVudC0+bW0sIGFkZHIpOworCQlpZiAoVEFTS19TSVpFIC0gbGVuID49IGFkZHIgJiYKKwkJICAgICghdm1tIHx8IGFkZHIgKyBsZW4gPD0gdm1tLT52bV9zdGFydCkpCisJCQlyZXR1cm4gYWRkcjsKKwl9CisJYWRkciA9IGN1cnJlbnQtPm1tLT5tbWFwX2Jhc2U7CisJaWYgKGRvX2NvbG9yX2FsaWduKQorCQlhZGRyID0gQ09MT1VSX0FMSUdOKGFkZHIsIHBnb2ZmKTsKKwllbHNlCisJCWFkZHIgPSBQQUdFX0FMSUdOKGFkZHIpOworCisJZm9yICh2bW0gPSBmaW5kX3ZtYShjdXJyZW50LT5tbSwgYWRkcik7IDsgdm1tID0gdm1tLT52bV9uZXh0KSB7CisJCS8qIEF0IHRoaXMgcG9pbnQ6ICAoIXZtbSB8fCBhZGRyIDwgdm1tLT52bV9lbmQpLiAqLworCQlpZiAoVEFTS19TSVpFIC0gbGVuIDwgYWRkcikKKwkJCXJldHVybiAtRU5PTUVNOworCQlpZiAoIXZtbSB8fCBhZGRyICsgbGVuIDw9IHZtbS0+dm1fc3RhcnQpCisJCQlyZXR1cm4gYWRkcjsKKwkJYWRkciA9IHZtbS0+dm1fZW5kOworCQlpZiAoZG9fY29sb3JfYWxpZ24pCisJCQlhZGRyID0gQ09MT1VSX0FMSUdOKGFkZHIsIHBnb2ZmKTsKKwl9Cit9CisKK3ZvaWQgYXJjaF9waWNrX21tYXBfbGF5b3V0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXVuc2lnbmVkIGxvbmcgcmFuZG9tX2ZhY3RvciA9IDBVTDsKKworCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX1JBTkRPTUlaRSkgeworCQlyYW5kb21fZmFjdG9yID0gZ2V0X3JhbmRvbV9pbnQoKTsKKwkJcmFuZG9tX2ZhY3RvciA9IHJhbmRvbV9mYWN0b3IgPDwgUEFHRV9TSElGVDsKKwkJaWYgKFRBU0tfSVNfMzJCSVRfQUREUikKKwkJCXJhbmRvbV9mYWN0b3IgJj0gMHhmZmZmZmZ1bDsKKwkJZWxzZQorCQkJcmFuZG9tX2ZhY3RvciAmPSAweGZmZmZmZmZ1bDsKKwl9CisKKwltbS0+bW1hcF9iYXNlID0gVEFTS19VTk1BUFBFRF9CQVNFICsgcmFuZG9tX2ZhY3RvcjsKKwltbS0+Z2V0X3VubWFwcGVkX2FyZWEgPSBhcmNoX2dldF91bm1hcHBlZF9hcmVhOworCW1tLT51bm1hcF9hcmVhID0gYXJjaF91bm1hcF9hcmVhOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYnJrX3JuZCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcm5kID0gZ2V0X3JhbmRvbV9pbnQoKTsKKworCXJuZCA9IHJuZCA8PCBQQUdFX1NISUZUOworCS8qIDhNQiBmb3IgMzJiaXQsIDI1Nk1CIGZvciA2NGJpdCAqLworCWlmIChUQVNLX0lTXzMyQklUX0FERFIpCisJCXJuZCA9IHJuZCAmIDB4N2ZmZmZmdWw7CisJZWxzZQorCQlybmQgPSBybmQgJiAweGZmZmZmZmZ1bDsKKworCXJldHVybiBybmQ7Cit9CisKK3Vuc2lnbmVkIGxvbmcgYXJjaF9yYW5kb21pemVfYnJrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXVuc2lnbmVkIGxvbmcgYmFzZSA9IG1tLT5icms7CisJdW5zaWduZWQgbG9uZyByZXQ7CisKKwlyZXQgPSBQQUdFX0FMSUdOKGJhc2UgKyBicmtfcm5kKCkpOworCisJaWYgKHJldCA8IG1tLT5icmspCisJCXJldHVybiBtbS0+YnJrOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS90bGJleC5jIGIvYXJjaC9taXBzL21tL3RsYmV4LmMKaW5kZXggZjU3MzRjMi4uNDI0ZWQ0YiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL3RsYmV4LmMKKysrIGIvYXJjaC9taXBzL21tL3RsYmV4LmMKQEAgLTQwNCw2ICs0MDQsNyBAQAogCWNhc2UgQ1BVXzVLQzoKIAljYXNlIENQVV9UWDQ5WFg6CiAJY2FzZSBDUFVfUFI0NDUwOgorCWNhc2UgQ1BVX1hMUjoKIAkJdWFzbV9pX25vcChwKTsKIAkJdGxidyhwKTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLWludC5jIGIvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1pbnQuYwppbmRleCBlODVjOTc3Li4xZDM2YzUxMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1pbnQuYworKysgYi9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLWludC5jCkBAIC0zMDgsNiArMzA4LDggQEAKIAogc3RhdGljIGlycXJldHVybl90IGlwaV9yZXNjaGVkX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CisJc2NoZWR1bGVyX2lwaSgpOworCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbmV0bG9naWMvS2NvbmZpZyBiL2FyY2gvbWlwcy9uZXRsb2dpYy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1Y2E3NDMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvbmV0bG9naWMvS2NvbmZpZwpAQCAtMCwwICsxLDUgQEAKK2NvbmZpZyBOTE1fQ09NTU9OCisJYm9vbAorCitjb25maWcgTkxNX1hMUgorCWJvb2wKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9uZXRsb2dpYy94bHIvTWFrZWZpbGUgYi9hcmNoL21pcHMvbmV0bG9naWMveGxyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZDNmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvbmV0bG9naWMveGxyL01ha2VmaWxlCkBAIC0wLDAgKzEsNSBAQAorb2JqLXkJCQkJKz0gc2V0dXAubyBwbGF0Zm9ybS5vIGlycS5vIHNldHVwLm8gdGltZS5vCitvYmotJChDT05GSUdfU01QKQkJKz0gc21wLm8gc21wYm9vdC5vCitvYmotJChDT05GSUdfRUFSTFlfUFJJTlRLKQkrPSB4bHJfY29uc29sZS5vCisKK0VYVFJBX0NGTEFHUwkJCSs9IC1XZXJyb3IKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9uZXRsb2dpYy94bHIvaXJxLmMgYi9hcmNoL21pcHMvbmV0bG9naWMveGxyL2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NDZkNThlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL25ldGxvZ2ljL3hsci9pcnEuYwpAQCAtMCwwICsxLDMwMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMTEgTmV0TG9naWMgTWljcm9zeXN0ZW1zLCBJbmMuIChOZXRMb2dpYykuIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZSBOZXRMb2dpYworICogbGljZW5zZSBiZWxvdzoKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgTkVUTE9HSUMgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIE5FVExPR0lDIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorCisjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+CisKKyNpbmNsdWRlIDxhc20vbmV0bG9naWMveGxyL2lvbWFwLmg+CisjaW5jbHVkZSA8YXNtL25ldGxvZ2ljL3hsci9waWMuaD4KKyNpbmNsdWRlIDxhc20vbmV0bG9naWMveGxyL3hsci5oPgorCisjaW5jbHVkZSA8YXNtL25ldGxvZ2ljL2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9uZXRsb2dpYy9taXBzLWV4dG5zLmg+CisKK3N0YXRpYyB1NjQgbmxtX2lycV9tYXNrOworc3RhdGljIERFRklORV9TUElOTE9DSyhubG1fcGljX2xvY2spOworCitzdGF0aWMgdm9pZCB4bHJfcGljX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJbmxtX3JlZ190ICptbWlvID0gbmV0bG9naWNfaW9fbW1pbyhORVRMT0dJQ19JT19QSUNfT0ZGU0VUKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCW5sbV9yZWdfdCByZWc7CisJaW50IGlycSA9IGQtPmlycTsKKworCVdBUk4oIVBJQ19JUlFfSVNfSVJUKGlycSksICJCYWQgaXJxICVkIiwgaXJxKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZubG1fcGljX2xvY2ssIGZsYWdzKTsKKwlyZWcgPSBuZXRsb2dpY19yZWFkX3JlZyhtbWlvLCBQSUNfSVJUXzFfQkFTRSArIGlycSAtIFBJQ19JUlFfQkFTRSk7CisJbmV0bG9naWNfd3JpdGVfcmVnKG1taW8sIFBJQ19JUlRfMV9CQVNFICsgaXJxIC0gUElDX0lSUV9CQVNFLAorCQkJICByZWcgfCAoMSA8PCA2KSB8ICgxIDw8IDMwKSB8ICgxIDw8IDMxKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmxtX3BpY19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHhscl9waWNfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJbmxtX3JlZ190ICptbWlvID0gbmV0bG9naWNfaW9fbW1pbyhORVRMT0dJQ19JT19QSUNfT0ZGU0VUKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCW5sbV9yZWdfdCByZWc7CisJaW50IGlycSA9IGQtPmlycTsKKworCVdBUk4oIVBJQ19JUlFfSVNfSVJUKGlycSksICJCYWQgaXJxICVkIiwgaXJxKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZubG1fcGljX2xvY2ssIGZsYWdzKTsKKwlyZWcgPSBuZXRsb2dpY19yZWFkX3JlZyhtbWlvLCBQSUNfSVJUXzFfQkFTRSArIGlycSAtIFBJQ19JUlFfQkFTRSk7CisJbmV0bG9naWNfd3JpdGVfcmVnKG1taW8sIFBJQ19JUlRfMV9CQVNFICsgaXJxIC0gUElDX0lSUV9CQVNFLAorCQkJICByZWcgfCAoMSA8PCA2KSB8ICgxIDw8IDMwKSB8ICgwIDw8IDMxKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmxtX3BpY19sb2NrLCBmbGFncyk7Cit9CisKKyNpZmRlZiBDT05GSUdfUENJCisvKiBFeHRyYSBBQ0sgbmVlZGVkIGZvciBYTFIgb24gY2hpcCBQQ0kgY29udHJvbGxlciAqLworc3RhdGljIHZvaWQgeGxyX3BjaV9hY2soc3RydWN0IGlycV9kYXRhICpkKQoreworCW5sbV9yZWdfdCAqcGNpX21taW8gPSBuZXRsb2dpY19pb19tbWlvKE5FVExPR0lDX0lPX1BDSVhfT0ZGU0VUKTsKKworCW5ldGxvZ2ljX3JlYWRfcmVnKHBjaV9tbWlvLCAoMHgxNDAgPj4gMikpOworfQorCisvKiBFeHRyYSBBQ0sgbmVlZGVkIGZvciBYTFMgb24gY2hpcCBQQ0llIGNvbnRyb2xsZXIgKi8KK3N0YXRpYyB2b2lkIHhsc19wY2llX2FjayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJbmxtX3JlZ190ICpwY2llX21taW9fbGUgPSBuZXRsb2dpY19pb19tbWlvKE5FVExPR0lDX0lPX1BDSUVfMV9PRkZTRVQpOworCisJc3dpdGNoIChkLT5pcnEpIHsKKwljYXNlIFBJQ19QQ0lFX0xJTkswX0lSUToKKwkJbmV0bG9naWNfd3JpdGVfcmVnKHBjaWVfbW1pb19sZSwgKDB4OTAgPj4gMiksIDB4ZmZmZmZmZmYpOworCQlicmVhazsKKwljYXNlIFBJQ19QQ0lFX0xJTksxX0lSUToKKwkJbmV0bG9naWNfd3JpdGVfcmVnKHBjaWVfbW1pb19sZSwgKDB4OTQgPj4gMiksIDB4ZmZmZmZmZmYpOworCQlicmVhazsKKwljYXNlIFBJQ19QQ0lFX0xJTksyX0lSUToKKwkJbmV0bG9naWNfd3JpdGVfcmVnKHBjaWVfbW1pb19sZSwgKDB4MTkwID4+IDIpLCAweGZmZmZmZmZmKTsKKwkJYnJlYWs7CisJY2FzZSBQSUNfUENJRV9MSU5LM19JUlE6CisJCW5ldGxvZ2ljX3dyaXRlX3JlZyhwY2llX21taW9fbGUsICgweDE5NCA+PiAyKSwgMHhmZmZmZmZmZik7CisJCWJyZWFrOworCX0KK30KKworLyogRm9yIFhMUyBCIHNpbGljb24sIHRoZSAzLDQgUENJIGludGVycnVwdHMgYXJlIGRpZmZlcmVudCAqLworc3RhdGljIHZvaWQgeGxzX3BjaWVfYWNrX2Ioc3RydWN0IGlycV9kYXRhICpkKQoreworCW5sbV9yZWdfdCAqcGNpZV9tbWlvX2xlID0gbmV0bG9naWNfaW9fbW1pbyhORVRMT0dJQ19JT19QQ0lFXzFfT0ZGU0VUKTsKKworCXN3aXRjaCAoZC0+aXJxKSB7CisJY2FzZSBQSUNfUENJRV9MSU5LMF9JUlE6CisJCW5ldGxvZ2ljX3dyaXRlX3JlZyhwY2llX21taW9fbGUsICgweDkwID4+IDIpLCAweGZmZmZmZmZmKTsKKwkJYnJlYWs7CisJY2FzZSBQSUNfUENJRV9MSU5LMV9JUlE6CisJCW5ldGxvZ2ljX3dyaXRlX3JlZyhwY2llX21taW9fbGUsICgweDk0ID4+IDIpLCAweGZmZmZmZmZmKTsKKwkJYnJlYWs7CisJY2FzZSBQSUNfUENJRV9YTFNCMF9MSU5LMl9JUlE6CisJCW5ldGxvZ2ljX3dyaXRlX3JlZyhwY2llX21taW9fbGUsICgweDE5MCA+PiAyKSwgMHhmZmZmZmZmZik7CisJCWJyZWFrOworCWNhc2UgUElDX1BDSUVfWExTQjBfTElOSzNfSVJROgorCQluZXRsb2dpY193cml0ZV9yZWcocGNpZV9tbWlvX2xlLCAoMHgxOTQgPj4gMiksIDB4ZmZmZmZmZmYpOworCQlicmVhazsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgeGxyX3BpY19hY2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJbmxtX3JlZ190ICptbWlvOworCWludCBpcnEgPSBkLT5pcnE7CisJdm9pZCAqaGQgPSBpcnFfZGF0YV9nZXRfaXJxX2hhbmRsZXJfZGF0YShkKTsKKworCVdBUk4oIVBJQ19JUlFfSVNfSVJUKGlycSksICJCYWQgaXJxICVkIiwgaXJxKTsKKworCWlmIChoZCkgeworCQl2b2lkICgqZXh0cmFfYWNrKSh2b2lkICopID0gaGQ7CisJCWV4dHJhX2FjayhkKTsKKwl9CisJbW1pbyA9IG5ldGxvZ2ljX2lvX21taW8oTkVUTE9HSUNfSU9fUElDX09GRlNFVCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm5sbV9waWNfbG9jaywgZmxhZ3MpOworCW5ldGxvZ2ljX3dyaXRlX3JlZyhtbWlvLCBQSUNfSU5UX0FDSywgKDEgPDwgKGlycSAtIFBJQ19JUlFfQkFTRSkpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZubG1fcGljX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIFRoaXMgY2hpcCBkZWZpbml0aW9uIGhhbmRsZXMgaW50ZXJydXB0cyByb3V0ZWQgdGhydSB0aGUgWExSCisgKiBoYXJkd2FyZSBQSUMsIGN1cnJlbnRseSBJUlFzIDgtMzkgYXJlIG1hcHBlZCB0byBoYXJkd2FyZSBpbnRyCisgKiAwLTMxIHdpcmVkIHRoZSBYTFIgUElDCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgeGxyX3BpYyA9IHsKKwkubmFtZQkJPSAiWExSLVBJQyIsCisJLmlycV9lbmFibGUJPSB4bHJfcGljX2VuYWJsZSwKKwkuaXJxX21hc2sJPSB4bHJfcGljX21hc2ssCisJLmlycV9hY2sJPSB4bHJfcGljX2FjaywKK307CisKK3N0YXRpYyB2b2lkIHJzdmRfaXJxX2hhbmRsZXIoc3RydWN0IGlycV9kYXRhICpkKQoreworCVdBUk4oZC0+aXJxID49IFBJQ19JUlFfQkFTRSwgIkJhZCBpcnEgJWQiLCBkLT5pcnEpOworfQorCisvKgorICogQ2hpcCBkZWZpbml0aW9uIGZvciBDUFUgb3JpZ2luYXRlZCBpbnRlcnJ1cHRzKHRpbWVyLCBtc2cpIGFuZAorICogSVBJcworICovCitzdHJ1Y3QgaXJxX2NoaXAgbmxtX2NwdV9pbnRyID0geworCS5uYW1lCQk9ICJYTFItQ1BVLUlOVFIiLAorCS5pcnFfZW5hYmxlCT0gcnN2ZF9pcnFfaGFuZGxlciwKKwkuaXJxX21hc2sJPSByc3ZkX2lycV9oYW5kbGVyLAorCS5pcnFfYWNrCT0gcnN2ZF9pcnFfaGFuZGxlciwKK307CisKK3ZvaWQgX19pbml0IGluaXRfeGxyX2lycXModm9pZCkKK3sKKwlubG1fcmVnX3QgKm1taW8gPSBuZXRsb2dpY19pb19tbWlvKE5FVExPR0lDX0lPX1BJQ19PRkZTRVQpOworCXVpbnQzMl90IHRocmVhZF9tYXNrID0gMTsKKwlpbnQgbGV2ZWwsIGk7CisKKwlwcl9pbmZvKCJJbnRlcnJ1cHQgdGhyZWFkIG1hc2sgWyV4XVxuIiwgdGhyZWFkX21hc2spOworCWZvciAoaSA9IDA7IGkgPCBQSUNfTlVNX0lSVFM7IGkrKykgeworCQlsZXZlbCA9IFBJQ19JUlFfSVNfRURHRV9UUklHR0VSRUQoaSk7CisKKwkJLyogQmluZCBhbGwgUElDIGlycXMgdG8gYm9vdCBjcHUgKi8KKwkJbmV0bG9naWNfd3JpdGVfcmVnKG1taW8sIFBJQ19JUlRfMF9CQVNFICsgaSwgdGhyZWFkX21hc2spOworCisJCS8qCisJCSAqIFVzZSBsb2NhbCBzY2hlZHVsaW5nIGFuZCBoaWdoIHBvbGFyaXR5IGZvciBhbGwgSVJUcworCQkgKiBJbnZhbGlkYXRlIGFsbCBJUlRzLCBieSBkZWZhdWx0CisJCSAqLworCQluZXRsb2dpY193cml0ZV9yZWcobW1pbywgUElDX0lSVF8xX0JBU0UgKyBpLAorCQkJCShsZXZlbCA8PCAzMCkgfCAoMSA8PCA2KSB8IChQSUNfSVJRX0JBU0UgKyBpKSk7CisJfQorCisJLyogTWFrZSBhbGwgSVJRcyBhcyBsZXZlbCB0cmlnZ2VyZWQgYnkgZGVmYXVsdCAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9JUlFTOyBpKyspIHsKKwkJaWYgKFBJQ19JUlFfSVNfSVJUKGkpKQorCQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGksICZ4bHJfcGljLCBoYW5kbGVfbGV2ZWxfaXJxKTsKKwkJZWxzZQorCQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGksICZubG1fY3B1X2ludHIsCisJCQkJCQloYW5kbGVfbGV2ZWxfaXJxKTsKKwl9CisjaWZkZWYgQ09ORklHX1NNUAorCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihJUlFfSVBJX1NNUF9GVU5DVElPTiwgJm5sbV9jcHVfaW50ciwKKwkJCSBubG1fc21wX2Z1bmN0aW9uX2lwaV9oYW5kbGVyKTsKKwlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoSVJRX0lQSV9TTVBfUkVTQ0hFRFVMRSwgJm5sbV9jcHVfaW50ciwKKwkJCSBubG1fc21wX3Jlc2NoZWRfaXBpX2hhbmRsZXIpOworCW5sbV9pcnFfbWFzayB8PQorCSAgICAoKDFVTEwgPDwgSVJRX0lQSV9TTVBfRlVOQ1RJT04pIHwgKDFVTEwgPDwgSVJRX0lQSV9TTVBfUkVTQ0hFRFVMRSkpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUENJCisJLyoKKwkgKiBGb3IgUENJIGludGVycnVwdHMsIHdlIG5lZWQgdG8gYWNrIHRoZSBQSUMgY29udHJvbGxlciB0b28sIG92ZXJsb2FkCisJICogaXJxIGhhbmRsZXIgZGF0YSB0byBkbyB0aGlzCisJICovCisJaWYgKG5sbV9jaGlwX2lzX3hscygpKSB7CisJCWlmIChubG1fY2hpcF9pc194bHNfYigpKSB7CisJCQlpcnFfc2V0X2hhbmRsZXJfZGF0YShQSUNfUENJRV9MSU5LMF9JUlEsCisJCQkJCQkJeGxzX3BjaWVfYWNrX2IpOworCQkJaXJxX3NldF9oYW5kbGVyX2RhdGEoUElDX1BDSUVfTElOSzFfSVJRLAorCQkJCQkJCXhsc19wY2llX2Fja19iKTsKKwkJCWlycV9zZXRfaGFuZGxlcl9kYXRhKFBJQ19QQ0lFX1hMU0IwX0xJTksyX0lSUSwKKwkJCQkJCQl4bHNfcGNpZV9hY2tfYik7CisJCQlpcnFfc2V0X2hhbmRsZXJfZGF0YShQSUNfUENJRV9YTFNCMF9MSU5LM19JUlEsCisJCQkJCQkJeGxzX3BjaWVfYWNrX2IpOworCQl9IGVsc2UgeworCQkJaXJxX3NldF9oYW5kbGVyX2RhdGEoUElDX1BDSUVfTElOSzBfSVJRLCB4bHNfcGNpZV9hY2spOworCQkJaXJxX3NldF9oYW5kbGVyX2RhdGEoUElDX1BDSUVfTElOSzFfSVJRLCB4bHNfcGNpZV9hY2spOworCQkJaXJxX3NldF9oYW5kbGVyX2RhdGEoUElDX1BDSUVfTElOSzJfSVJRLCB4bHNfcGNpZV9hY2spOworCQkJaXJxX3NldF9oYW5kbGVyX2RhdGEoUElDX1BDSUVfTElOSzNfSVJRLCB4bHNfcGNpZV9hY2spOworCQl9CisJfSBlbHNlIHsKKwkJLyogWExSIFBDSSBjb250cm9sbGVyIEFDSyAqLworCQlpcnFfc2V0X2hhbmRsZXJfZGF0YShQSUNfUENJRV9YTFNCMF9MSU5LM19JUlEsIHhscl9wY2lfYWNrKTsKKwl9CisjZW5kaWYKKwkvKiB1bm1hc2sgYWxsIFBJQyByZWxhdGVkIGludGVycnVwdHMuIElmIG5vIGhhbmRsZXIgaXMgaW5zdGFsbGVkIGJ5IHRoZQorCSAqIGRyaXZlcnMsIGl0J2xsIGp1c3QgYWNrIHRoZSBpbnRlcnJ1cHQgYW5kIHJldHVybgorCSAqLworCWZvciAoaSA9IFBJQ19JUlRfRklSU1RfSVJROyBpIDw9IFBJQ19JUlRfTEFTVF9JUlE7IGkrKykKKwkJbmxtX2lycV9tYXNrIHw9ICgxVUxMIDw8IGkpOworCisJbmxtX2lycV9tYXNrIHw9ICgxVUxMIDw8IElSUV9USU1FUik7Cit9CisKK3ZvaWQgX19pbml0IGFyY2hfaW5pdF9pcnEodm9pZCkKK3sKKwkvKiBJbml0aWFsaXplIHRoZSBpcnEgZGVzY3JpcHRvcnMgKi8KKwlpbml0X3hscl9pcnFzKCk7CisJd3JpdGVfYzBfZWltcihubG1faXJxX21hc2spOworfQorCit2b2lkIF9fY3B1aW5pdCBubG1fc21wX2lycV9pbml0KHZvaWQpCit7CisJLyogc2V0IGludGVycnVwdCBtYXNrIGZvciBub24temVybyBjcHVzICovCisJd3JpdGVfYzBfZWltcihubG1faXJxX21hc2spOworfQorCithc21saW5rYWdlIHZvaWQgcGxhdF9pcnFfZGlzcGF0Y2godm9pZCkKK3sKKwl1aW50NjRfdCBlaXJyOworCWludCBpOworCisJZWlyciA9IHJlYWRfYzBfZWlycigpICYgcmVhZF9jMF9laW1yKCk7CisJaWYgKCFlaXJyKQorCQlyZXR1cm47CisKKwkvKiBubyBuZWVkIG9mIEVJUlIgaGVyZSwgd3JpdGluZyBjb21wYXJlIGNsZWFycyBpbnRlcnJ1cHQgKi8KKwlpZiAoZWlyciAmICgxIDw8IElSUV9USU1FUikpIHsKKwkJZG9fSVJRKElSUV9USU1FUik7CisJCXJldHVybjsKKwl9CisKKwkvKiB1c2UgZGNsdHo6IG9wdGltaXplIGJlbG93IGNvZGUgKi8KKwlmb3IgKGkgPSA2MzsgaSAhPSAtMTsgaS0tKSB7CisJCWlmIChlaXJyICYgKDFVTEwgPDwgaSkpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gLTEpIHsKKwkJcHJfZXJyKCJubyBpbnRlcnJ1cHQgISFcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogQWNrIGVpcnIgKi8KKwl3cml0ZV9jMF9laXJyKDFVTEwgPDwgaSk7CisKKwlkb19JUlEoaSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbmV0bG9naWMveGxyL3BsYXRmb3JtLmMgYi9hcmNoL21pcHMvbmV0bG9naWMveGxyL3BsYXRmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA5ZWMyNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9uZXRsb2dpYy94bHIvcGxhdGZvcm0uYwpAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTEsIE5ldGxvZ2ljIE1pY3Jvc3lzdGVtcy4KKyAqIENvcHlyaWdodCAyMDA0LCBNYXR0IFBvcnRlciA8bXBvcnRlckBrZXJuZWwuY3Jhc2hpbmcub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KKworI2luY2x1ZGUgPGFzbS9uZXRsb2dpYy94bHIvaW9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbmV0bG9naWMveGxyL3BpYy5oPgorI2luY2x1ZGUgPGFzbS9uZXRsb2dpYy94bHIveGxyLmg+CisKK3Vuc2lnbmVkIGludCBubG1feGxyX3VhcnRfaW4oc3RydWN0IHVhcnRfcG9ydCAqcCwgaW50IG9mZnNldCkKK3sKKwlubG1fcmVnX3QgKm1taW87CisJdW5zaWduZWQgaW50IHZhbHVlOworCisJLyogWExSIHVhcnQgZG9lcyBub3QgbmVlZCBhbnkgbWFwcGluZyBvZiByZWdzICovCisJbW1pbyA9IChubG1fcmVnX3QgKikocC0+bWVtYmFzZSArIChvZmZzZXQgPDwgcC0+cmVnc2hpZnQpKTsKKwl2YWx1ZSA9IG5ldGxvZ2ljX3JlYWRfcmVnKG1taW8sIDApOworCisJLyogU2VlIFhMUi9YTFMgZXJyYXRhICovCisJaWYgKG9mZnNldCA9PSBVQVJUX01TUikKKwkJdmFsdWUgXj0gMHhGMDsKKwllbHNlIGlmIChvZmZzZXQgPT0gVUFSVF9NQ1IpCisJCXZhbHVlIF49IDB4MzsKKworCXJldHVybiB2YWx1ZTsKK30KKwordm9pZCBubG1feGxyX3VhcnRfb3V0KHN0cnVjdCB1YXJ0X3BvcnQgKnAsIGludCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlubG1fcmVnX3QgKm1taW87CisKKwkvKiBYTFIgdWFydCBkb2VzIG5vdCBuZWVkIGFueSBtYXBwaW5nIG9mIHJlZ3MgKi8KKwltbWlvID0gKG5sbV9yZWdfdCAqKShwLT5tZW1iYXNlICsgKG9mZnNldCA8PCBwLT5yZWdzaGlmdCkpOworCisJLyogU2VlIFhMUi9YTFMgZXJyYXRhICovCisJaWYgKG9mZnNldCA9PSBVQVJUX01TUikKKwkJdmFsdWUgXj0gMHhGMDsKKwllbHNlIGlmIChvZmZzZXQgPT0gVUFSVF9NQ1IpCisJCXZhbHVlIF49IDB4MzsKKworCW5ldGxvZ2ljX3dyaXRlX3JlZyhtbWlvLCAwLCB2YWx1ZSk7Cit9CisKKyNkZWZpbmUgUE9SVChfaXJxKQkJCQkJXAorCXsJCQkJCQlcCisJCS5pcnEJCT0gX2lycSwJCQlcCisJCS5yZWdzaGlmdAk9IDIsCQkJXAorCQkuaW90eXBlCQk9IFVQSU9fTUVNMzIsCQlcCisJCS5mbGFncwkJPSAoVVBGX1NLSVBfVEVTVCB8CVwKKwkJCSBVUEZfRklYRURfVFlQRSB8IFVQRl9CT09UX0FVVE9DT05GKSxcCisJCS51YXJ0Y2xrCT0gUElDX0NMS1NfUEVSX1NFQywJXAorCQkudHlwZQkJPSBQT1JUXzE2NTUwQSwJCVwKKwkJLnNlcmlhbF9pbgk9IG5sbV94bHJfdWFydF9pbiwJXAorCQkuc2VyaWFsX291dAk9IG5sbV94bHJfdWFydF9vdXQsCVwKKwl9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgeGxyX3VhcnRfZGF0YVtdID0geworCVBPUlQoUElDX1VBUlRfMF9JUlEpLAorCVBPUlQoUElDX1VBUlRfMV9JUlEpLAorCXt9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdWFydF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNlcmlhbDgyNTAiLAorCS5pZAkJPSBQTEFUODI1MF9ERVZfUExBVEZPUk0sCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSB4bHJfdWFydF9kYXRhLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBubG1fdWFydF9pbml0KHZvaWQpCit7CisJbmxtX3JlZ190ICptbWlvOworCisJbW1pbyA9IG5ldGxvZ2ljX2lvX21taW8oTkVUTE9HSUNfSU9fVUFSVF8wX09GRlNFVCk7CisJeGxyX3VhcnRfZGF0YVswXS5tZW1iYXNlID0gKHZvaWQgX19pb21lbSAqKW1taW87CisJeGxyX3VhcnRfZGF0YVswXS5tYXBiYXNlID0gQ1BIWVNBRERSKCh1bnNpZ25lZCBsb25nKW1taW8pOworCisJbW1pbyA9IG5ldGxvZ2ljX2lvX21taW8oTkVUTE9HSUNfSU9fVUFSVF8xX09GRlNFVCk7CisJeGxyX3VhcnRfZGF0YVsxXS5tZW1iYXNlID0gKHZvaWQgX19pb21lbSAqKW1taW87CisJeGxyX3VhcnRfZGF0YVsxXS5tYXBiYXNlID0gQ1BIWVNBRERSKCh1bnNpZ25lZCBsb25nKW1taW8pOworCisJcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmdWFydF9kZXZpY2UpOworfQorCithcmNoX2luaXRjYWxsKG5sbV91YXJ0X2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL25ldGxvZ2ljL3hsci9zZXR1cC5jIGIvYXJjaC9taXBzL25ldGxvZ2ljL3hsci9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MjgwMjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvbmV0bG9naWMveGxyL3NldHVwLmMKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDExIE5ldExvZ2ljIE1pY3Jvc3lzdGVtcywgSW5jLiAoTmV0TG9naWMpLiBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUgTmV0TG9naWMKKyAqIGxpY2Vuc2UgYmVsb3c6CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIE5FVExPR0lDIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBORVRMT0dJQyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisKKyNpbmNsdWRlIDxhc20vcmVib290Lmg+CisjaW5jbHVkZSA8YXNtL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KKyNpbmNsdWRlIDxhc20vc21wLW9wcy5oPgorCisjaW5jbHVkZSA8YXNtL25ldGxvZ2ljL2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9uZXRsb2dpYy9wc2ItYm9vdGluZm8uaD4KKworI2luY2x1ZGUgPGFzbS9uZXRsb2dpYy94bHIveGxyLmg+CisjaW5jbHVkZSA8YXNtL25ldGxvZ2ljL3hsci9pb21hcC5oPgorI2luY2x1ZGUgPGFzbS9uZXRsb2dpYy94bHIvcGljLmg+CisjaW5jbHVkZSA8YXNtL25ldGxvZ2ljL3hsci9ncGlvLmg+CisKK3Vuc2lnbmVkIGxvbmcgbmV0bG9naWNfaW9fYmFzZSA9ICh1bnNpZ25lZCBsb25nKShERUZBVUxUX05FVExPR0lDX0lPX0JBU0UpOwordW5zaWduZWQgbG9uZyBubG1fY29tbW9uX2ViYXNlID0gMHgwOworc3RydWN0IHBzYl9pbmZvIG5sbV9wcm9tX2luZm87CisKK3N0YXRpYyB2b2lkIG5sbV9lYXJseV9zZXJpYWxfc2V0dXAodm9pZCkKK3sKKwlzdHJ1Y3QgdWFydF9wb3J0IHM7CisJbmxtX3JlZ190ICp1YXJ0X2Jhc2U7CisKKwl1YXJ0X2Jhc2UgPSBuZXRsb2dpY19pb19tbWlvKE5FVExPR0lDX0lPX1VBUlRfMF9PRkZTRVQpOworCW1lbXNldCgmcywgMCwgc2l6ZW9mKHMpKTsKKwlzLmZsYWdzCQk9IEFTWU5DX0JPT1RfQVVUT0NPTkYgfCBBU1lOQ19TS0lQX1RFU1Q7CisJcy5pb3R5cGUJPSBVUElPX01FTTMyOworCXMucmVnc2hpZnQJPSAyOworCXMuaXJxCQk9IFBJQ19VQVJUXzBfSVJROworCXMudWFydGNsawk9IFBJQ19DTEtTX1BFUl9TRUM7CisJcy5zZXJpYWxfaW4JPSBubG1feGxyX3VhcnRfaW47CisJcy5zZXJpYWxfb3V0CT0gbmxtX3hscl91YXJ0X291dDsKKwlzLm1hcGJhc2UJPSAodW5zaWduZWQgbG9uZyl1YXJ0X2Jhc2U7CisJcy5tZW1iYXNlCT0gKHVuc2lnbmVkIGNoYXIgX19pb21lbSAqKXVhcnRfYmFzZTsKKwllYXJseV9zZXJpYWxfc2V0dXAoJnMpOworfQorCitzdGF0aWMgdm9pZCBubG1fbGludXhfZXhpdCh2b2lkKQoreworCW5sbV9yZWdfdCAqbW1pbzsKKworCW1taW8gPSBuZXRsb2dpY19pb19tbWlvKE5FVExPR0lDX0lPX0dQSU9fT0ZGU0VUKTsKKwkvKiB0cmlnZ2VyIGEgY2hpcCByZXNldCBieSB3cml0aW5nIDEgdG8gR1BJT19TV1JFU0VUX1JFRyAqLworCW5ldGxvZ2ljX3dyaXRlX3JlZyhtbWlvLCBORVRMT0dJQ19HUElPX1NXUkVTRVRfUkVHLCAxKTsKKwlmb3IgKCA7IDsgKQorCQljcHVfd2FpdCgpOworfQorCit2b2lkIF9faW5pdCBwbGF0X21lbV9zZXR1cCh2b2lkKQoreworCXBhbmljX3RpbWVvdXQJPSA1OworCV9tYWNoaW5lX3Jlc3RhcnQgPSAodm9pZCAoKikoY2hhciAqKSlubG1fbGludXhfZXhpdDsKKwlfbWFjaGluZV9oYWx0CT0gbmxtX2xpbnV4X2V4aXQ7CisJcG1fcG93ZXJfb2ZmCT0gbmxtX2xpbnV4X2V4aXQ7Cit9CisKK2NvbnN0IGNoYXIgKmdldF9zeXN0ZW1fdHlwZSh2b2lkKQoreworCXJldHVybiAiTmV0bG9naWMgWExSL1hMUyBTZXJpZXMiOworfQorCit2b2lkIF9faW5pdCBwcm9tX2ZyZWVfcHJvbV9tZW1vcnkodm9pZCkKK3sKKwkvKiBOb3RoaW5nIHlldCAqLworfQorCitzdGF0aWMgdm9pZCBidWlsZF9hcmNzX2NtZGxpbmUoaW50ICphcmd2KQoreworCWludCBpLCByZW1haW4sIGxlbjsKKwljaGFyICphcmc7CisKKwlyZW1haW4gPSBzaXplb2YoYXJjc19jbWRsaW5lKSAtIDE7CisJYXJjc19jbWRsaW5lWzBdID0gJ1wwJzsKKwlmb3IgKGkgPSAwOyBhcmd2W2ldICE9IDA7IGkrKykgeworCQlhcmcgPSAoY2hhciAqKShsb25nKWFyZ3ZbaV07CisJCWxlbiA9IHN0cmxlbihhcmcpOworCQlpZiAobGVuICsgMSA+IHJlbWFpbikKKwkJCWJyZWFrOworCQlzdHJjYXQoYXJjc19jbWRsaW5lLCBhcmcpOworCQlzdHJjYXQoYXJjc19jbWRsaW5lLCAiICIpOworCQlyZW1haW4gLT0gIGxlbiArIDE7CisJfQorCisJLyogQWRkIHRoZSBkZWZhdWx0IG9wdGlvbnMgaGVyZSAqLworCWlmICgoc3Ryc3RyKGFyY3NfY21kbGluZSwgImNvbnNvbGU9IikpID09IE5VTEwpIHsKKwkJYXJnID0gImNvbnNvbGU9dHR5UzAsMzg0MDAgIjsKKwkJbGVuID0gc3RybGVuKGFyZyk7CisJCWlmIChsZW4gPiByZW1haW4pCisJCQlnb3RvIGZhaWw7CisJCXN0cmNhdChhcmNzX2NtZGxpbmUsIGFyZyk7CisJCXJlbWFpbiAtPSBsZW47CisJfQorI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAorCWlmICgoc3Ryc3RyKGFyY3NfY21kbGluZSwgInJkaW5pdD0iKSkgPT0gTlVMTCkgeworCQlhcmcgPSAicmRpbml0PS9zYmluL2luaXQgIjsKKwkJbGVuID0gc3RybGVuKGFyZyk7CisJCWlmIChsZW4gPiByZW1haW4pCisJCQlnb3RvIGZhaWw7CisJCXN0cmNhdChhcmNzX2NtZGxpbmUsIGFyZyk7CisJCXJlbWFpbiAtPSBsZW47CisJfQorI2VuZGlmCisJcmV0dXJuOworZmFpbDoKKwlwYW5pYygiQ2Fubm90IGFkZCAlcywgY29tbWFuZCBsaW5lIHRvbyBiaWchIiwgYXJnKTsKK30KKworc3RhdGljIHZvaWQgcHJvbV9hZGRfbWVtb3J5KHZvaWQpCit7CisJc3RydWN0IG5sbV9ib290X21lbV9tYXAgKmJvb3RtOworCXU2NCBzdGFydCwgc2l6ZTsKKwl1NjQgcHJlZl9iYWNrdXAgPSA1MTI7ICAvKiBhdm9pZCBwcmVmIHdhbGtpbmcgYmV5b25kIGVuZCAqLworCWludCBpOworCisJYm9vdG0gPSAodm9pZCAqKShsb25nKW5sbV9wcm9tX2luZm8ucHNiX21lbV9tYXA7CisJZm9yIChpID0gMDsgaSA8IGJvb3RtLT5ucl9tYXA7IGkrKykgeworCQlpZiAoYm9vdG0tPm1hcFtpXS50eXBlICE9IEJPT1RfTUVNX1JBTSkKKwkJCWNvbnRpbnVlOworCQlzdGFydCA9IGJvb3RtLT5tYXBbaV0uYWRkcjsKKwkJc2l6ZSAgID0gYm9vdG0tPm1hcFtpXS5zaXplOworCisJCS8qIFdvcmsgYXJvdW5kIGZvciB1c2luZyBib290bG9hZGVyIG1lbSAqLworCQlpZiAoaSA9PSAwICYmIHN0YXJ0ID09IDAgJiYgc2l6ZSA9PSAweDBjMDAwMDAwKQorCQkJc2l6ZSA9IDB4MGZmMDAwMDA7CisKKwkJYWRkX21lbW9yeV9yZWdpb24oc3RhcnQsIHNpemUgLSBwcmVmX2JhY2t1cCwgQk9PVF9NRU1fUkFNKTsKKwl9Cit9CisKK3ZvaWQgX19pbml0IHByb21faW5pdCh2b2lkKQoreworCWludCAqYXJndiwgKmVudnA7CQkvKiBwYXNzZWQgYXMgMzIgYml0IHB0cnMgKi8KKwlzdHJ1Y3QgcHNiX2luZm8gKnByb21faW5mb3A7CisKKwkvKiB0cnVuY2F0ZSB0byAzMiBiaXQgYW5kIHNpZ24gZXh0ZW5kIGFsbCBhcmdzICovCisJYXJndiA9IChpbnQgKikobG9uZykoaW50KWZ3X2FyZzE7CisJZW52cCA9IChpbnQgKikobG9uZykoaW50KWZ3X2FyZzI7CisJcHJvbV9pbmZvcCA9IChzdHJ1Y3QgcHNiX2luZm8gKikobG9uZykoaW50KWZ3X2FyZzM7CisKKwlubG1fcHJvbV9pbmZvID0gKnByb21faW5mb3A7CisKKwlubG1fZWFybHlfc2VyaWFsX3NldHVwKCk7CisJYnVpbGRfYXJjc19jbWRsaW5lKGFyZ3YpOworCW5sbV9jb21tb25fZWJhc2UgPSByZWFkX2MwX2ViYXNlKCkgJiAofigoMSA8PCAxMikgLSAxKSk7CisJcHJvbV9hZGRfbWVtb3J5KCk7CisKKyNpZmRlZiBDT05GSUdfU01QCisJbmxtX3dha2V1cF9zZWNvbmRhcnlfY3B1cyhubG1fcHJvbV9pbmZvLm9ubGluZV9jcHVfbWFwKTsKKwlyZWdpc3Rlcl9zbXBfb3BzKCZubG1fc21wX29wcyk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9uZXRsb2dpYy94bHIvc21wLmMgYi9hcmNoL21pcHMvbmV0bG9naWMveGxyL3NtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0OTVhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvbmV0bG9naWMveGxyL3NtcC5jCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAxMSBOZXRMb2dpYyBNaWNyb3N5c3RlbXMsIEluYy4gKE5ldExvZ2ljKS4gQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlIE5ldExvZ2ljCisgKiBsaWNlbnNlIGJlbG93OgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBORVRMT0dJQyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgTkVUTE9HSUMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KKworI2luY2x1ZGUgPGFzbS9uZXRsb2dpYy9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vbmV0bG9naWMvbWlwcy1leHRucy5oPgorCisjaW5jbHVkZSA8YXNtL25ldGxvZ2ljL3hsci9pb21hcC5oPgorI2luY2x1ZGUgPGFzbS9uZXRsb2dpYy94bHIvcGljLmg+CisjaW5jbHVkZSA8YXNtL25ldGxvZ2ljL3hsci94bHIuaD4KKwordm9pZCBjb3JlX3NlbmRfaXBpKGludCBsb2dpY2FsX2NwdSwgdW5zaWduZWQgaW50IGFjdGlvbikKK3sKKwlpbnQgY3B1ID0gY3B1X2xvZ2ljYWxfbWFwKGxvZ2ljYWxfY3B1KTsKKwl1MzIgdGlkID0gY3B1ICYgMHgzOworCXUzMiBwaWQgPSAoY3B1ID4+IDIpICYgMHgwNzsKKwl1MzIgaXBpID0gKHRpZCA8PCAxNikgfCAocGlkIDw8IDIwKTsKKworCWlmIChhY3Rpb24gJiBTTVBfQ0FMTF9GVU5DVElPTikKKwkJaXBpIHw9IElSUV9JUElfU01QX0ZVTkNUSU9OOworCWVsc2UgaWYgKGFjdGlvbiAmIFNNUF9SRVNDSEVEVUxFX1lPVVJTRUxGKQorCQlpcGkgfD0gSVJRX0lQSV9TTVBfUkVTQ0hFRFVMRTsKKwllbHNlCisJCXJldHVybjsKKworCXBpY19zZW5kX2lwaShpcGkpOworfQorCit2b2lkIG5sbV9zZW5kX2lwaV9zaW5nbGUoaW50IGNwdSwgdW5zaWduZWQgaW50IGFjdGlvbikKK3sKKwljb3JlX3NlbmRfaXBpKGNwdSwgYWN0aW9uKTsKK30KKwordm9pZCBubG1fc2VuZF9pcGlfbWFzayhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaywgdW5zaWduZWQgaW50IGFjdGlvbikKK3sKKwlpbnQgY3B1OworCisJZm9yX2VhY2hfY3B1KGNwdSwgbWFzaykgeworCQljb3JlX3NlbmRfaXBpKGNwdSwgYWN0aW9uKTsKKwl9Cit9CisKKy8qIElSUV9JUElfU01QX0ZVTkNUSU9OIEhhbmRsZXIgKi8KK3ZvaWQgbmxtX3NtcF9mdW5jdGlvbl9pcGlfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJc21wX2NhbGxfZnVuY3Rpb25faW50ZXJydXB0KCk7Cit9CisKKy8qIElSUV9JUElfU01QX1JFU0NIRURVTEUgIGhhbmRsZXIgKi8KK3ZvaWQgbmxtX3NtcF9yZXNjaGVkX2lwaV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzZXRfbmVlZF9yZXNjaGVkKCk7Cit9CisKK3ZvaWQgbmxtX2NvbW1vbl9pcGlfaGFuZGxlcihpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAoaXJxID09IElSUV9JUElfU01QX0ZVTkNUSU9OKSB7CisJCXNtcF9jYWxsX2Z1bmN0aW9uX2ludGVycnVwdCgpOworCX0gZWxzZSB7CisJCS8qIEFubm91bmNlIHRoYXQgd2UgYXJlIGZvciByZXNjaGR1bGluZyAqLworCQlzZXRfbmVlZF9yZXNjaGVkKCk7CisJfQorfQorCisvKgorICogQ2FsbGVkIGJlZm9yZSBnb2luZyBpbnRvIG1pcHMgY29kZSwgZWFybHkgY3B1IGluaXQKKyAqLwordm9pZCBubG1fZWFybHlfaW5pdF9zZWNvbmRhcnkodm9pZCkKK3sKKwl3cml0ZV9jMF9lYmFzZSgodWludDMyX3QpbmxtX2NvbW1vbl9lYmFzZSk7CisJLyogVExCIHBhcnRpdGlvbiBoZXJlIGxhdGVyICovCit9CisKKy8qCisgKiBDb2RlIHRvIHJ1biBvbiBzZWNvbmRhcnkganVzdCBhZnRlciBwcm9iaW5nIHRoZSBDUFUKKyAqLworc3RhdGljIHZvaWQgX19jcHVpbml0IG5sbV9pbml0X3NlY29uZGFyeSh2b2lkKQoreworCW5sbV9zbXBfaXJxX2luaXQoKTsKK30KKwordm9pZCBubG1fc21wX2ZpbmlzaCh2b2lkKQoreworI2lmZGVmIG5vdHlldAorCW5sbV9jb21tb25fbXNncmluZ19jcHVfaW5pdCgpOworI2VuZGlmCit9CisKK3ZvaWQgbmxtX2NwdXNfZG9uZSh2b2lkKQoreworfQorCisvKgorICogQm9vdCBhbGwgb3RoZXIgY3B1cyBpbiB0aGUgc3lzdGVtLCBpbml0aWFsaXplIHRoZW0sIGFuZCBicmluZyB0aGVtIGludG8KKyAqIHRoZSBib290IGZ1bmN0aW9uCisgKi8KK2ludCBubG1fY3B1X3VuYmxvY2tbTlJfQ1BVU107CitpbnQgbmxtX2NwdV9yZWFkeVtOUl9DUFVTXTsKK3Vuc2lnbmVkIGxvbmcgbmxtX25leHRfZ3A7Cit1bnNpZ25lZCBsb25nIG5sbV9uZXh0X3NwOworY3B1bWFza190IHBoeXNfY3B1X3ByZXNlbnRfbWFwOworCit2b2lkIG5sbV9ib290X3NlY29uZGFyeShpbnQgbG9naWNhbF9jcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZSkKK3sKKwl1bnNpZ25lZCBsb25nIGdwID0gKHVuc2lnbmVkIGxvbmcpdGFza190aHJlYWRfaW5mbyhpZGxlKTsKKwl1bnNpZ25lZCBsb25nIHNwID0gKHVuc2lnbmVkIGxvbmcpX19LU1RLX1RPUyhpZGxlKTsKKwlpbnQgY3B1ID0gY3B1X2xvZ2ljYWxfbWFwKGxvZ2ljYWxfY3B1KTsKKworCW5sbV9uZXh0X3NwID0gc3A7CisJbmxtX25leHRfZ3AgPSBncDsKKworCS8qIGJhcnJpZXIgKi8KKwlfX3N5bmMoKTsKKwlubG1fY3B1X3VuYmxvY2tbY3B1XSA9IDE7Cit9CisKK3ZvaWQgX19pbml0IG5sbV9zbXBfc2V0dXAodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgYm9vdF9jcHU7CisJaW50IG51bV9jcHVzLCBpOworCisJYm9vdF9jcHUgPSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKKwljcHVzX2NsZWFyKHBoeXNfY3B1X3ByZXNlbnRfbWFwKTsKKworCWNwdV9zZXQoYm9vdF9jcHUsIHBoeXNfY3B1X3ByZXNlbnRfbWFwKTsKKwlfX2NwdV9udW1iZXJfbWFwW2Jvb3RfY3B1XSA9IDA7CisJX19jcHVfbG9naWNhbF9tYXBbMF0gPSBib290X2NwdTsKKwljcHVfc2V0KDAsIGNwdV9wb3NzaWJsZV9tYXApOworCisJbnVtX2NwdXMgPSAxOworCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKKwkJaWYgKG5sbV9jcHVfcmVhZHlbaV0pIHsKKwkJCWNwdV9zZXQoaSwgcGh5c19jcHVfcHJlc2VudF9tYXApOworCQkJX19jcHVfbnVtYmVyX21hcFtpXSA9IG51bV9jcHVzOworCQkJX19jcHVfbG9naWNhbF9tYXBbbnVtX2NwdXNdID0gaTsKKwkJCWNwdV9zZXQobnVtX2NwdXMsIGNwdV9wb3NzaWJsZV9tYXApOworCQkJKytudW1fY3B1czsKKwkJfQorCX0KKworCXByX2luZm8oIlBoeXMgQ1BVIHByZXNlbnQgbWFwOiAlbHgsIHBvc3NpYmxlIG1hcCAlbHhcbiIsCisJCSh1bnNpZ25lZCBsb25nKXBoeXNfY3B1X3ByZXNlbnRfbWFwLmJpdHNbMF0sCisJCSh1bnNpZ25lZCBsb25nKWNwdV9wb3NzaWJsZV9tYXAuYml0c1swXSk7CisKKwlwcl9pbmZvKCJEZXRlY3RlZCAlaSBTbGF2ZSBDUFUocylcbiIsIG51bV9jcHVzKTsKK30KKwordm9pZCBubG1fcHJlcGFyZV9jcHVzKHVuc2lnbmVkIGludCBtYXhfY3B1cykKK3sKK30KKworc3RydWN0IHBsYXRfc21wX29wcyBubG1fc21wX29wcyA9IHsKKwkuc2VuZF9pcGlfc2luZ2xlCT0gbmxtX3NlbmRfaXBpX3NpbmdsZSwKKwkuc2VuZF9pcGlfbWFzawkJPSBubG1fc2VuZF9pcGlfbWFzaywKKwkuaW5pdF9zZWNvbmRhcnkJCT0gbmxtX2luaXRfc2Vjb25kYXJ5LAorCS5zbXBfZmluaXNoCQk9IG5sbV9zbXBfZmluaXNoLAorCS5jcHVzX2RvbmUJCT0gbmxtX2NwdXNfZG9uZSwKKwkuYm9vdF9zZWNvbmRhcnkJCT0gbmxtX2Jvb3Rfc2Vjb25kYXJ5LAorCS5zbXBfc2V0dXAJCT0gbmxtX3NtcF9zZXR1cCwKKwkucHJlcGFyZV9jcHVzCQk9IG5sbV9wcmVwYXJlX2NwdXMsCit9OworCit1bnNpZ25lZCBsb25nIHNlY29uZGFyeV9lbnRyeV9wb2ludDsKKworaW50IG5sbV93YWtldXBfc2Vjb25kYXJ5X2NwdXModTMyIHdha2V1cF9tYXNrKQoreworCXVuc2lnbmVkIGludCB0aWQsIHBpZCwgaXBpLCBpLCBib290X2NwdTsKKwl2b2lkICpyZXNldF92ZWM7CisKKwlzZWNvbmRhcnlfZW50cnlfcG9pbnQgPSAodW5zaWduZWQgbG9uZylwcm9tX3ByZV9ib290X3NlY29uZGFyeV9jcHVzOworCXJlc2V0X3ZlYyA9ICh2b2lkICopQ0tTRUcxQUREUigweDFmYzAwMDAwKTsKKwltZW1jcHkocmVzZXRfdmVjLCBubG1fYm9vdF9zbXBfbm1pLCAweDgwKTsKKwlib290X2NwdSA9IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlpZiAoaSA9PSBib290X2NwdSkKKwkJCWNvbnRpbnVlOworCQlpZiAod2FrZXVwX21hc2sgJiAoMXUgPDwgaSkpIHsKKwkJCXRpZCA9IGkgJiAweDM7CisJCQlwaWQgPSAoaSA+PiAyKSAmIDB4NzsKKwkJCWlwaSA9ICh0aWQgPDwgMTYpIHwgKHBpZCA8PCAyMCkgfCAoMSA8PCA4KTsKKwkJCXBpY19zZW5kX2lwaShpcGkpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbmV0bG9naWMveGxyL3NtcGJvb3QuUyBiL2FyY2gvbWlwcy9uZXRsb2dpYy94bHIvc21wYm9vdC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZTA3NDQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvbmV0bG9naWMveGxyL3NtcGJvb3QuUwpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAxMSBOZXRMb2dpYyBNaWNyb3N5c3RlbXMsIEluYy4gKE5ldExvZ2ljKS4gQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlIE5ldExvZ2ljCisgKiBsaWNlbnNlIGJlbG93OgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBORVRMT0dJQyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgTkVUTE9HSUMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8YXNtL2FzbS5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9yZWdkZWYuaD4KKyNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KKworCisvKiBEb24ndCBqdW1wIHRvIGxpbnV4IGZ1bmN0aW9uIGZyb20gQm9vdGxvYWRlciBzdGFjay4gQ2hhbmdlIGl0CisgKiBoZXJlLiBLZXJuZWwgbWlnaHQgYWxsb2NhdGUgYm9vdGxvYWRlciBtZW1vcnkgYmVmb3JlIGFsbCB0aGUgQ1BVcyBhcmUKKyAqIGJyb3VnaHQgdXAgKGVnOiBJbm9kZSBjYWNoZSByZWdpb24pIGFuZCB3ZSBiZXR0ZXIgZG9uJ3Qgb3ZlcndyaXRlIHRoaXMKKyAqIG1lbW9yeQorICovCitORVNURUQocHJvbV9wcmVfYm9vdF9zZWNvbmRhcnlfY3B1cywgMTYsIHNwKQorCS5zZXQJbWlwczY0CisJbWZjMAl0MCwgJDE1LCAxCSMgcmVhZCBlYmFzZQorCWFuZGkJdDAsIDB4MWYJIyB0MCBoYXMgdGhlIHByb2Nlc3Nvcl9pZCgpCisJc2xsCXQwLCAyCQkjIG9mZnNldCBpbiBjcHUgYXJyYXkKKworCVBUUl9MQQl0MSwgbmxtX2NwdV9yZWFkeSAjIG1hcmsgQ1BVIHJlYWR5CisJUFRSX0FERFUgdDEsIHQwCisJbGkJdDIsIDEKKwlzdwl0MiwgMCh0MSkKKworCVBUUl9MQQl0MSwgbmxtX2NwdV91bmJsb2NrCisJUFRSX0FERFUgdDEsIHQwCisxOglsdwl0MiwgMCh0MSkJIyB3YWl0IHRpbGwgdW5ibG9ja2VkCisJYmVxegl0MiwgMWIKKwlub3AKKworCVBUUl9MQQl0MSwgbmxtX25leHRfc3AKKwlQVFJfTAlzcCwgMCh0MSkKKwlQVFJfTEEJdDEsIG5sbV9uZXh0X2dwCisJUFRSX0wJZ3AsIDAodDEpCisKKwlQVFJfTEEJdDAsIG5sbV9lYXJseV9pbml0X3NlY29uZGFyeQorCWphbHIJdDAKKwlub3AKKworCVBUUl9MQQl0MCwgc21wX2Jvb3RzdHJhcAorCWpyCXQwCisJbm9wCitFTkQocHJvbV9wcmVfYm9vdF9zZWNvbmRhcnlfY3B1cykKKworTkVTVEVEKG5sbV9ib290X3NtcF9ubWksIDAsIHNwKQorCS5zZXQgcHVzaAorCS5zZXQgbm9hdAorCS5zZXQgbWlwczY0CisJLnNldCBub3Jlb3JkZXIKKworCS8qIENsZWFyIHRoZSAgTk1JIGFuZCBCRVYgYml0cyAqLworCU1GQzAJazAsIENQMF9TVEFUVVMKKwlsaSAJazEsIDB4ZmZiN2ZmZmYKKwlhbmQJazAsIGswLCBrMQorCU1UQzAJazAsIENQMF9TVEFUVVMKKworCVBUUl9MQSAgazEsIHNlY29uZGFyeV9lbnRyeV9wb2ludAorCVBUUl9MCWswLCAwKGsxKQorCWpyCWswCisJbm9wCisJLnNldCBwb3AKK0VORChubG1fYm9vdF9zbXBfbm1pKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL25ldGxvZ2ljL3hsci90aW1lLmMgYi9hcmNoL21pcHMvbmV0bG9naWMveGxyL3RpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDgxYjI2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL25ldGxvZ2ljL3hsci90aW1lLmMKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMTEgTmV0TG9naWMgTWljcm9zeXN0ZW1zLCBJbmMuIChOZXRMb2dpYykuIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZSBOZXRMb2dpYworICogbGljZW5zZSBiZWxvdzoKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgTkVUTE9HSUMgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIE5FVExPR0lDIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS90aW1lLmg+CisjaW5jbHVkZSA8YXNtL25ldGxvZ2ljL2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9uZXRsb2dpYy9wc2ItYm9vdGluZm8uaD4KKwordW5zaWduZWQgaW50IF9fY3B1aW5pdCBnZXRfYzBfY29tcGFyZV9pbnQodm9pZCkKK3sKKwlyZXR1cm4gSVJRX1RJTUVSOworfQorCit2b2lkIF9faW5pdCBwbGF0X3RpbWVfaW5pdCh2b2lkKQoreworCW1pcHNfaHB0X2ZyZXF1ZW5jeSA9IG5sbV9wcm9tX2luZm8uY3B1X2ZyZXF1ZW5jeTsKKwlwcl9pbmZvKCJNSVBTIGNvdW50ZXIgZnJlcXVlbmN5IFslbGRdXG4iLAorCQkodW5zaWduZWQgbG9uZyltaXBzX2hwdF9mcmVxdWVuY3kpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL25ldGxvZ2ljL3hsci94bHJfY29uc29sZS5jIGIvYXJjaC9taXBzL25ldGxvZ2ljL3hsci94bHJfY29uc29sZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OWRmMDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvbmV0bG9naWMveGxyL3hscl9jb25zb2xlLmMKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMTEgTmV0TG9naWMgTWljcm9zeXN0ZW1zLCBJbmMuIChOZXRMb2dpYykuIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZSBOZXRMb2dpYworICogbGljZW5zZSBiZWxvdzoKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgTkVUTE9HSUMgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIE5FVExPR0lDIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL25ldGxvZ2ljL3hsci9pb21hcC5oPgorCit2b2lkIHByb21fcHV0Y2hhcihjaGFyIGMpCit7CisJbmxtX3JlZ190ICptbWlvOworCisJbW1pbyA9IG5ldGxvZ2ljX2lvX21taW8oTkVUTE9HSUNfSU9fVUFSVF8wX09GRlNFVCk7CisJd2hpbGUgKG5ldGxvZ2ljX3JlYWRfcmVnKG1taW8sIDB4NSkgPT0gMCkKKwkJOworCW5ldGxvZ2ljX3dyaXRlX3JlZyhtbWlvLCAweDAsIGMpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9NYWtlZmlsZSBiL2FyY2gvbWlwcy9wY2kvTWFrZWZpbGUKaW5kZXggYzkyMDljYS4uNGRmODc5OSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvcGNpL01ha2VmaWxlCkBAIC00MSw2ICs0MSw3IEBACiBvYmotJChDT05GSUdfU0lCWVRFX0JDTTExMlgpCSs9IGZpeHVwLXNiMTI1MC5vIHBjaS1zYjEyNTAubwogb2JqLSQoQ09ORklHX1NJQllURV9CQ00xeDgwKQkrPSBwY2ktYmNtMTQ4MC5vIHBjaS1iY20xNDgwaHQubwogb2JqLSQoQ09ORklHX1NOSV9STSkJCSs9IGZpeHVwLXNuaS5vIG9wcy1zbmkubworb2JqLSQoQ09ORklHX1NPQ19YV0FZKQkJKz0gcGNpLWxhbnRpcS5vIG9wcy1sYW50aXEubwogb2JqLSQoQ09ORklHX1RBTkJBQ19UQjAyMTkpCSs9IGZpeHVwLXRiMDIxOS5vCiBvYmotJChDT05GSUdfVEFOQkFDX1RCMDIyNikJKz0gZml4dXAtdGIwMjI2Lm8KIG9iai0kKENPTkZJR19UQU5CQUNfVEIwMjg3KQkrPSBmaXh1cC10YjAyODcubwpAQCAtNTUsNiArNTYsNyBAQAogb2JqLSQoQ09ORklHX1dSX1BQTUMpCQkrPSBmaXh1cC13cnBwbWMubwogb2JqLSQoQ09ORklHX01JS1JPVElLX1JCNTMyKQkrPSBwY2ktcmMzMjQzNC5vIG9wcy1yYzMyNDM0Lm8gZml4dXAtcmMzMjQzNC5vCiBvYmotJChDT05GSUdfQ1BVX0NBVklVTV9PQ1RFT04pCSs9IHBjaS1vY3Rlb24ubyBwY2llLW9jdGVvbi5vCitvYmotJChDT05GSUdfTkxNX1hMUikJCSs9IHBjaS14bHIubwogCiBpZmRlZiBDT05GSUdfUENJX01TSQogb2JqLSQoQ09ORklHX0NQVV9DQVZJVU1fT0NURU9OKQkrPSBtc2ktb2N0ZW9uLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvb3BzLWxhbnRpcS5jIGIvYXJjaC9taXBzL3BjaS9vcHMtbGFudGlxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyYWZiNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9wY2kvb3BzLWxhbnRpcS5jCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIEpvaG4gQ3Jpc3BpbiA8YmxvZ2ljQG9wZW53cnQub3JnPgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2luY2x1ZGUgPGxhbnRpcV9zb2MuaD4KKworI2luY2x1ZGUgInBjaS1sYW50aXEuaCIKKworI2RlZmluZSBMVFFfUENJX0NGR19CVVNOVU1fU0hGIDE2CisjZGVmaW5lIExUUV9QQ0lfQ0ZHX0RFVk5VTV9TSEYgMTEKKyNkZWZpbmUgTFRRX1BDSV9DRkdfRlVOTlVNX1NIRiA4CisKKyNkZWZpbmUgUENJX0FDQ0VTU19SRUFEICAwCisjZGVmaW5lIFBDSV9BQ0NFU1NfV1JJVEUgMQorCitzdGF0aWMgaW50IGx0cV9wY2lfY29uZmlnX2FjY2Vzcyh1bnNpZ25lZCBjaGFyIGFjY2Vzc190eXBlLCBzdHJ1Y3QgcGNpX2J1cyAqYnVzLAorCXVuc2lnbmVkIGludCBkZXZmbiwgdW5zaWduZWQgaW50IHdoZXJlLCB1MzIgKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBjZmdfYmFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB0ZW1wOworCisJLyogd2Ugc3VwcG9ydCBzbG90IGZyb20gMCB0byAxNSBkZXZfZm4gJiAweDY4IChBRDI5KSBpcyB0aGUKKwkgICBTb0MgaXRzZWxmICovCisJaWYgKChidXMtPm51bWJlciAhPSAwKSB8fCAoKGRldmZuICYgMHhmOCkgPiAweDc4KQorCQl8fCAoKGRldmZuICYgMHhmOCkgPT0gMCkgfHwgKChkZXZmbiAmIDB4ZjgpID09IDB4NjgpKQorCQlyZXR1cm4gMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlYnVfbG9jaywgZmxhZ3MpOworCisJY2ZnX2Jhc2UgPSAodW5zaWduZWQgbG9uZykgbHRxX3BjaV9tYXBwZWRfY2ZnOworCWNmZ19iYXNlIHw9IChidXMtPm51bWJlciA8PCBMVFFfUENJX0NGR19CVVNOVU1fU0hGKSB8IChkZXZmbiA8PAorCQkJTFRRX1BDSV9DRkdfRlVOTlVNX1NIRikgfCAod2hlcmUgJiB+MHgzKTsKKworCS8qIFBlcmZvcm0gYWNjZXNzICovCisJaWYgKGFjY2Vzc190eXBlID09IFBDSV9BQ0NFU1NfV1JJVEUpIHsKKwkJbHRxX3czMihzd2FiMzIoKmRhdGEpLCAoKHUzMiAqKWNmZ19iYXNlKSk7CisJfSBlbHNlIHsKKwkJKmRhdGEgPSBsdHFfcjMyKCgodTMyICopKGNmZ19iYXNlKSkpOworCQkqZGF0YSA9IHN3YWIzMigqZGF0YSk7CisJfQorCXdtYigpOworCisJLyogY2xlYW4gcG9zc2libGUgTWFzdGVyIGFib3J0ICovCisJY2ZnX2Jhc2UgPSAodW5zaWduZWQgbG9uZykgbHRxX3BjaV9tYXBwZWRfY2ZnOworCWNmZ19iYXNlIHw9ICgweDAgPDwgTFRRX1BDSV9DRkdfRlVOTlVNX1NIRikgKyA0OworCXRlbXAgPSBsdHFfcjMyKCgodTMyICopKGNmZ19iYXNlKSkpOworCXRlbXAgPSBzd2FiMzIodGVtcCk7CisJY2ZnX2Jhc2UgPSAodW5zaWduZWQgbG9uZykgbHRxX3BjaV9tYXBwZWRfY2ZnOworCWNmZ19iYXNlIHw9ICgweDY4IDw8IExUUV9QQ0lfQ0ZHX0ZVTk5VTV9TSEYpICsgNDsKKwlsdHFfdzMyKHRlbXAsICgodTMyICopY2ZnX2Jhc2UpKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVidV9sb2NrLCBmbGFncyk7CisKKwlpZiAoKCgqZGF0YSkgPT0gMHhmZmZmZmZmZikgJiYgKGFjY2Vzc190eXBlID09IFBDSV9BQ0NFU1NfUkVBRCkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBsdHFfcGNpX3JlYWRfY29uZmlnX2R3b3JkKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwlpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgKnZhbCkKK3sKKwl1MzIgZGF0YSA9IDA7CisKKwlpZiAobHRxX3BjaV9jb25maWdfYWNjZXNzKFBDSV9BQ0NFU1NfUkVBRCwgYnVzLCBkZXZmbiwgd2hlcmUsICZkYXRhKSkKKwkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKKworCWlmIChzaXplID09IDEpCisJCSp2YWwgPSAoZGF0YSA+PiAoKHdoZXJlICYgMykgPDwgMykpICYgMHhmZjsKKwllbHNlIGlmIChzaXplID09IDIpCisJCSp2YWwgPSAoZGF0YSA+PiAoKHdoZXJlICYgMykgPDwgMykpICYgMHhmZmZmOworCWVsc2UKKwkJKnZhbCA9IGRhdGE7CisKKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitpbnQgbHRxX3BjaV93cml0ZV9jb25maWdfZHdvcmQoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAorCWludCB3aGVyZSwgaW50IHNpemUsIHUzMiB2YWwpCit7CisJdTMyIGRhdGEgPSAwOworCisJaWYgKHNpemUgPT0gNCkgeworCQlkYXRhID0gdmFsOworCX0gZWxzZSB7CisJCWlmIChsdHFfcGNpX2NvbmZpZ19hY2Nlc3MoUENJX0FDQ0VTU19SRUFELCBidXMsCisJCQkJZGV2Zm4sIHdoZXJlLCAmZGF0YSkpCisJCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOworCisJCWlmIChzaXplID09IDEpCisJCQlkYXRhID0gKGRhdGEgJiB+KDB4ZmYgPDwgKCh3aGVyZSAmIDMpIDw8IDMpKSkgfAorCQkJCSh2YWwgPDwgKCh3aGVyZSAmIDMpIDw8IDMpKTsKKwkJZWxzZSBpZiAoc2l6ZSA9PSAyKQorCQkJZGF0YSA9IChkYXRhICYgfigweGZmZmYgPDwgKCh3aGVyZSAmIDMpIDw8IDMpKSkgfAorCQkJCSh2YWwgPDwgKCh3aGVyZSAmIDMpIDw8IDMpKTsKKwl9CisKKwlpZiAobHRxX3BjaV9jb25maWdfYWNjZXNzKFBDSV9BQ0NFU1NfV1JJVEUsIGJ1cywgZGV2Zm4sIHdoZXJlLCAmZGF0YSkpCisJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisKKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9wY2ktbGFudGlxLmMgYi9hcmNoL21pcHMvcGNpL3BjaS1sYW50aXEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDNkNzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL3BjaS9wY2ktbGFudGlxLmMKQEAgLTAsMCArMSwyOTcgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgSm9obiBDcmlzcGluIDxibG9naWNAb3BlbndydC5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vcGNpLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+CisKKyNpbmNsdWRlIDxsYW50aXFfc29jLmg+CisjaW5jbHVkZSA8bGFudGlxX2lycS5oPgorI2luY2x1ZGUgPGxhbnRpcV9wbGF0Zm9ybS5oPgorCisjaW5jbHVkZSAicGNpLWxhbnRpcS5oIgorCisjZGVmaW5lIExUUV9QQ0lfQ0ZHX0JBU0UJCTB4MTcwMDAwMDAKKyNkZWZpbmUgTFRRX1BDSV9DRkdfU0laRQkJMHgwMDAwODAwMAorI2RlZmluZSBMVFFfUENJX01FTV9CQVNFCQkweDE4MDAwMDAwCisjZGVmaW5lIExUUV9QQ0lfTUVNX1NJWkUJCTB4MDIwMDAwMDAKKyNkZWZpbmUgTFRRX1BDSV9JT19CQVNFCQkJMHgxQUUwMDAwMAorI2RlZmluZSBMVFFfUENJX0lPX1NJWkUJCQkweDAwMjAwMDAwCisKKyNkZWZpbmUgUENJX0NSX0ZDSV9BRERSX01BUDAJCTB4MDBDMAorI2RlZmluZSBQQ0lfQ1JfRkNJX0FERFJfTUFQMQkJMHgwMEM0CisjZGVmaW5lIFBDSV9DUl9GQ0lfQUREUl9NQVAyCQkweDAwQzgKKyNkZWZpbmUgUENJX0NSX0ZDSV9BRERSX01BUDMJCTB4MDBDQworI2RlZmluZSBQQ0lfQ1JfRkNJX0FERFJfTUFQNAkJMHgwMEQwCisjZGVmaW5lIFBDSV9DUl9GQ0lfQUREUl9NQVA1CQkweDAwRDQKKyNkZWZpbmUgUENJX0NSX0ZDSV9BRERSX01BUDYJCTB4MDBEOAorI2RlZmluZSBQQ0lfQ1JfRkNJX0FERFJfTUFQNwkJMHgwMERDCisjZGVmaW5lIFBDSV9DUl9DTEtfQ1RSTAkJCTB4MDAwMAorI2RlZmluZSBQQ0lfQ1JfUENJX01PRAkJCTB4MDAzMAorI2RlZmluZSBQQ0lfQ1JfUENfQVJCCQkJMHgwMDgwCisjZGVmaW5lIFBDSV9DUl9GQ0lfQUREUl9NQVAxMWhnCQkweDAwRTQKKyNkZWZpbmUgUENJX0NSX0JBUjExTUFTSwkJMHgwMDQ0CisjZGVmaW5lIFBDSV9DUl9CQVIxMk1BU0sJCTB4MDA0OAorI2RlZmluZSBQQ0lfQ1JfQkFSMTNNQVNLCQkweDAwNEMKKyNkZWZpbmUgUENJX0NTX0JBU0VfQUREUjEJCTB4MDAxMAorI2RlZmluZSBQQ0lfQ1JfUENJX0FERFJfTUFQMTEJCTB4MDA2NAorI2RlZmluZSBQQ0lfQ1JfRkNJX0JVUlNUX0xFTkdUSAkJMHgwMEU4CisjZGVmaW5lIFBDSV9DUl9QQ0lfRU9JCQkJMHgwMDJDCisjZGVmaW5lIFBDSV9DU19TVFNfQ01ECQkJMHgwMDA0CisKKyNkZWZpbmUgUENJX01BU1RFUjBfUkVRX01BU0tfMkJJVFMJOAorI2RlZmluZSBQQ0lfTUFTVEVSMV9SRVFfTUFTS18yQklUUwkxMAorI2RlZmluZSBQQ0lfTUFTVEVSMl9SRVFfTUFTS18yQklUUwkxMgorI2RlZmluZSBJTlRFUk5BTF9BUkJfRU5BQkxFX0JJVAkJMAorCisjZGVmaW5lIExUUV9DR1VfSUZDQ1IJCTB4MDAxOAorI2RlZmluZSBMVFFfQ0dVX1BDSUNSCQkweDAwMzQKKworI2RlZmluZSBsdHFfcGNpX3czMih4LCB5KQlsdHFfdzMyKCh4KSwgbHRxX3BjaV9tZW1iYXNlICsgKHkpKQorI2RlZmluZSBsdHFfcGNpX3IzMih4KQkJbHRxX3IzMihsdHFfcGNpX21lbWJhc2UgKyAoeCkpCisKKyNkZWZpbmUgbHRxX3BjaV9jZmdfdzMyKHgsIHkpCWx0cV93MzIoKHgpLCBsdHFfcGNpX21hcHBlZF9jZmcgKyAoeSkpCisjZGVmaW5lIGx0cV9wY2lfY2ZnX3IzMih4KQlsdHFfcjMyKGx0cV9wY2lfbWFwcGVkX2NmZyArICh4KSkKKworc3RydWN0IGx0cV9wY2lfZ3Bpb19tYXAgeworCWludCBwaW47CisJaW50IGFsdDA7CisJaW50IGFsdDE7CisJaW50IGRpcjsKKwljaGFyICpuYW1lOworfTsKKworLyogdGhlIHBjaSBjb3JlIGNhbiBtYWtlIHVzZSBvZiB0aGUgZm9sbG93aW5nIGdwaW9zICovCitzdGF0aWMgc3RydWN0IGx0cV9wY2lfZ3Bpb19tYXAgbHRxX3BjaV9ncGlvX21hcFtdID0geworCXsgMCwgMSwgMCwgMCwgInBjaS1leGluMCIgfSwKKwl7IDEsIDEsIDAsIDAsICJwY2ktZXhpbjEiIH0sCisJeyAyLCAxLCAwLCAwLCAicGNpLWV4aW4yIiB9LAorCXsgMzksIDEsIDAsIDAsICJwY2ktZXhpbjMiIH0sCisJeyAxMCwgMSwgMCwgMCwgInBjaS1leGluNCIgfSwKKwl7IDksIDEsIDAsIDAsICJwY2ktZXhpbjUiIH0sCisJeyAzMCwgMSwgMCwgMSwgInBjaS1nbnQxIiB9LAorCXsgMjMsIDEsIDAsIDEsICJwY2ktZ250MiIgfSwKKwl7IDE5LCAxLCAwLCAxLCAicGNpLWdudDMiIH0sCisJeyAzOCwgMSwgMCwgMSwgInBjaS1nbnQ0IiB9LAorCXsgMjksIDEsIDAsIDAsICJwY2ktcmVxMSIgfSwKKwl7IDMxLCAxLCAwLCAwLCAicGNpLXJlcTIiIH0sCisJeyAzLCAxLCAwLCAwLCAicGNpLXJlcTMiIH0sCisJeyAzNywgMSwgMCwgMCwgInBjaS1yZXE0IiB9LAorfTsKKworX19pb21lbSB2b2lkICpsdHFfcGNpX21hcHBlZF9jZmc7CitzdGF0aWMgX19pb21lbSB2b2lkICpsdHFfcGNpX21lbWJhc2U7CisKK2ludCAoKmx0cXBjaV9wbGF0X2Rldl9pbml0KShzdHJ1Y3QgcGNpX2RldiAqZGV2KSA9IE5VTEw7CisKKy8qIFNpbmNlIHRoZSBQQ0kgUkVRIHBpbnMgY2FuIGJlIHJldXNlZCBmb3Igb3RoZXIgZnVuY3Rpb25hbGl0eSwgbWFrZSBpdAorICAgcG9zc2libGUgdG8gZXhjbHVkZSB0aG9zZSBmcm9tIGludGVycHJldGF0aW9uIGJ5IHRoZSBQQ0kgY29udHJvbGxlciAqLworc3RhdGljIGludCBsdHFfcGNpX3JlcV9tYXNrID0gMHhmOworCitzdGF0aWMgaW50ICpsdHFfcGNpX2lycV9tYXA7CisKK3N0cnVjdCBwY2lfb3BzIGx0cV9wY2lfb3BzID0geworCS5yZWFkCT0gbHRxX3BjaV9yZWFkX2NvbmZpZ19kd29yZCwKKwkud3JpdGUJPSBsdHFfcGNpX3dyaXRlX2NvbmZpZ19kd29yZAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwY2lfaW9fcmVzb3VyY2UgPSB7CisJLm5hbWUJPSAicGNpIGlvIHNwYWNlIiwKKwkuc3RhcnQJPSBMVFFfUENJX0lPX0JBU0UsCisJLmVuZAk9IExUUV9QQ0lfSU9fQkFTRSArIExUUV9QQ0lfSU9fU0laRSAtIDEsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9JTworfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwY2lfbWVtX3Jlc291cmNlID0geworCS5uYW1lCT0gInBjaSBtZW1vcnkgc3BhY2UiLAorCS5zdGFydAk9IExUUV9QQ0lfTUVNX0JBU0UsCisJLmVuZAk9IExUUV9QQ0lfTUVNX0JBU0UgKyBMVFFfUENJX01FTV9TSVpFIC0gMSwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTQorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBsdHFfcGNpX2NvbnRyb2xsZXIgPSB7CisJLnBjaV9vcHMJPSAmbHRxX3BjaV9vcHMsCisJLm1lbV9yZXNvdXJjZQk9ICZwY2lfbWVtX3Jlc291cmNlLAorCS5tZW1fb2Zmc2V0CT0gMHgwMDAwMDAwMFVMLAorCS5pb19yZXNvdXJjZQk9ICZwY2lfaW9fcmVzb3VyY2UsCisJLmlvX29mZnNldAk9IDB4MDAwMDAwMDBVTCwKK307CisKK2ludCBwY2liaW9zX3BsYXRfZGV2X2luaXQoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpZiAobHRxcGNpX3BsYXRfZGV2X2luaXQpCisJCXJldHVybiBsdHFwY2lfcGxhdF9kZXZfaW5pdChkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgbHRxX2NhbGNfYmFyMTFtYXNrKHZvaWQpCit7CisJdTMyIG1lbSwgYmFyMTFtYXNrOworCisJLyogQkFSMTFNQVNLIHZhbHVlIGRlcGVuZHMgb24gYXZhaWxhYmxlIG1lbW9yeSBvbiBzeXN0ZW0uICovCisJbWVtID0gbnVtX3BoeXNwYWdlcyAqIFBBR0VfU0laRTsKKwliYXIxMW1hc2sgPSAoMHgwZmZmZmZmMCAmIH4oKDEgPDwgKGZscyhtZW0pIC0gMSkpIC0gMSkpIHwgODsKKworCXJldHVybiBiYXIxMW1hc2s7Cit9CisKK3N0YXRpYyB2b2lkIGx0cV9wY2lfc2V0dXBfZ3BpbyhpbnQgZ3BpbykKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsdHFfcGNpX2dwaW9fbWFwKTsgaSsrKSB7CisJCWlmIChncGlvICYgKDEgPDwgaSkpIHsKKwkJCWx0cV9ncGlvX3JlcXVlc3QobHRxX3BjaV9ncGlvX21hcFtpXS5waW4sCisJCQkJbHRxX3BjaV9ncGlvX21hcFtpXS5hbHQwLAorCQkJCWx0cV9wY2lfZ3Bpb19tYXBbaV0uYWx0MSwKKwkJCQlsdHFfcGNpX2dwaW9fbWFwW2ldLmRpciwKKwkJCQlsdHFfcGNpX2dwaW9fbWFwW2ldLm5hbWUpOworCQl9CisJfQorCWx0cV9ncGlvX3JlcXVlc3QoMjEsIDAsIDAsIDEsICJwY2ktcmVzZXQiKTsKKwlsdHFfcGNpX3JlcV9tYXNrID0gKGdwaW8gPj4gUENJX1JFUV9TSElGVCkgJiBQQ0lfUkVRX01BU0s7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGx0cV9wY2lfc3RhcnR1cChzdHJ1Y3QgbHRxX3BjaV9kYXRhICpjb25mKQoreworCXUzMiB0ZW1wX2J1ZmZlcjsKKworCS8qIHNldCBjbG9jayB0byAzM01oeiAqLworCWx0cV9jZ3VfdzMyKGx0cV9jZ3VfcjMyKExUUV9DR1VfSUZDQ1IpICYgfjB4ZjAwMDAwLCBMVFFfQ0dVX0lGQ0NSKTsKKwlsdHFfY2d1X3czMihsdHFfY2d1X3IzMihMVFFfQ0dVX0lGQ0NSKSB8IDB4ODAwMDAwLCBMVFFfQ0dVX0lGQ0NSKTsKKworCS8qIGV4dGVybmFsIG9yIGludGVybmFsIGNsb2NrID8gKi8KKwlpZiAoY29uZi0+Y2xvY2spIHsKKwkJbHRxX2NndV93MzIobHRxX2NndV9yMzIoTFRRX0NHVV9JRkNDUikgJiB+KDEgPDwgMTYpLAorCQkJTFRRX0NHVV9JRkNDUik7CisJCWx0cV9jZ3VfdzMyKCgxIDw8IDMwKSwgTFRRX0NHVV9QQ0lDUik7CisJfSBlbHNlIHsKKwkJbHRxX2NndV93MzIobHRxX2NndV9yMzIoTFRRX0NHVV9JRkNDUikgfCAoMSA8PCAxNiksCisJCQlMVFFfQ0dVX0lGQ0NSKTsKKwkJbHRxX2NndV93MzIoKDEgPDwgMzEpIHwgKDEgPDwgMzApLCBMVFFfQ0dVX1BDSUNSKTsKKwl9CisKKwkvKiBzZXR1cCBwY2kgY2xvY2sgYW5kIGdwaXMgdXNlZCBieSBwY2kgKi8KKwlsdHFfcGNpX3NldHVwX2dwaW8oY29uZi0+Z3Bpbyk7CisKKwkvKiBlbmFibGUgYXV0by1zd2l0Y2hpbmcgYmV0d2VlbiBQQ0kgYW5kIEVCVSAqLworCWx0cV9wY2lfdzMyKDB4YSwgUENJX0NSX0NMS19DVFJMKTsKKworCS8qIGJ1c3ksIGkuZS4gY29uZmlndXJhdGlvbiBpcyBub3QgZG9uZSwgUENJIGFjY2VzcyBoYXMgdG8gYmUgcmV0cmllZCAqLworCWx0cV9wY2lfdzMyKGx0cV9wY2lfcjMyKFBDSV9DUl9QQ0lfTU9EKSAmIH4oMSA8PCAyNCksIFBDSV9DUl9QQ0lfTU9EKTsKKwl3bWIoKTsKKwkvKiBCVVMgTWFzdGVyL0lPL01FTSBhY2Nlc3MgKi8KKwlsdHFfcGNpX2NmZ193MzIobHRxX3BjaV9jZmdfcjMyKFBDSV9DU19TVFNfQ01EKSB8IDcsIFBDSV9DU19TVFNfQ01EKTsKKworCS8qIGVuYWJsZSBleHRlcm5hbCAyIFBDSSBtYXN0ZXJzICovCisJdGVtcF9idWZmZXIgPSBsdHFfcGNpX3IzMihQQ0lfQ1JfUENfQVJCKTsKKwl0ZW1wX2J1ZmZlciAmPSAofihsdHFfcGNpX3JlcV9tYXNrIDw8IDE2KSk7CisJLyogZW5hYmxlIGludGVybmFsIGFyYml0ZXIgKi8KKwl0ZW1wX2J1ZmZlciB8PSAoMSA8PCBJTlRFUk5BTF9BUkJfRU5BQkxFX0JJVCk7CisJLyogZW5hYmxlIGludGVybmFsIFBDSSBtYXN0ZXIgcmVxZXN0ICovCisJdGVtcF9idWZmZXIgJj0gKH4oMyA8PCBQQ0lfTUFTVEVSMF9SRVFfTUFTS18yQklUUykpOworCisJLyogZW5hYmxlIEVCVSByZXF1ZXN0ICovCisJdGVtcF9idWZmZXIgJj0gKH4oMyA8PCBQQ0lfTUFTVEVSMV9SRVFfTUFTS18yQklUUykpOworCisJLyogZW5hYmxlIGFsbCBleHRlcm5hbCBtYXN0ZXJzIHJlcXVlc3QgKi8KKwl0ZW1wX2J1ZmZlciAmPSAofigzIDw8IFBDSV9NQVNURVIyX1JFUV9NQVNLXzJCSVRTKSk7CisJbHRxX3BjaV93MzIodGVtcF9idWZmZXIsIFBDSV9DUl9QQ19BUkIpOworCXdtYigpOworCisJLyogc2V0dXAgQkFSIG1lbW9yeSByZWdpb25zICovCisJbHRxX3BjaV93MzIoMHgxODAwMDAwMCwgUENJX0NSX0ZDSV9BRERSX01BUDApOworCWx0cV9wY2lfdzMyKDB4MTg0MDAwMDAsIFBDSV9DUl9GQ0lfQUREUl9NQVAxKTsKKwlsdHFfcGNpX3czMigweDE4ODAwMDAwLCBQQ0lfQ1JfRkNJX0FERFJfTUFQMik7CisJbHRxX3BjaV93MzIoMHgxOGMwMDAwMCwgUENJX0NSX0ZDSV9BRERSX01BUDMpOworCWx0cV9wY2lfdzMyKDB4MTkwMDAwMDAsIFBDSV9DUl9GQ0lfQUREUl9NQVA0KTsKKwlsdHFfcGNpX3czMigweDE5NDAwMDAwLCBQQ0lfQ1JfRkNJX0FERFJfTUFQNSk7CisJbHRxX3BjaV93MzIoMHgxOTgwMDAwMCwgUENJX0NSX0ZDSV9BRERSX01BUDYpOworCWx0cV9wY2lfdzMyKDB4MTljMDAwMDAsIFBDSV9DUl9GQ0lfQUREUl9NQVA3KTsKKwlsdHFfcGNpX3czMigweDFhZTAwMDAwLCBQQ0lfQ1JfRkNJX0FERFJfTUFQMTFoZyk7CisJbHRxX3BjaV93MzIobHRxX2NhbGNfYmFyMTFtYXNrKCksIFBDSV9DUl9CQVIxMU1BU0spOworCWx0cV9wY2lfdzMyKDAsIFBDSV9DUl9QQ0lfQUREUl9NQVAxMSk7CisJbHRxX3BjaV93MzIoMCwgUENJX0NTX0JBU0VfQUREUjEpOworCS8qIGJvdGggVFggYW5kIFJYIGVuZGlhbiBzd2FwIGFyZSBlbmFibGVkICovCisJbHRxX3BjaV93MzIobHRxX3BjaV9yMzIoUENJX0NSX1BDSV9FT0kpIHwgMywgUENJX0NSX1BDSV9FT0kpOworCXdtYigpOworCWx0cV9wY2lfdzMyKGx0cV9wY2lfcjMyKFBDSV9DUl9CQVIxMk1BU0spIHwgMHg4MDAwMDAwMCwKKwkJUENJX0NSX0JBUjEyTUFTSyk7CisJbHRxX3BjaV93MzIobHRxX3BjaV9yMzIoUENJX0NSX0JBUjEzTUFTSykgfCAweDgwMDAwMDAwLAorCQlQQ0lfQ1JfQkFSMTNNQVNLKTsKKwkvKnVzZSA4IGR3IGJ1cnN0IGxlbmd0aCAqLworCWx0cV9wY2lfdzMyKDB4MzAzLCBQQ0lfQ1JfRkNJX0JVUlNUX0xFTkdUSCk7CisJbHRxX3BjaV93MzIobHRxX3BjaV9yMzIoUENJX0NSX1BDSV9NT0QpIHwgKDEgPDwgMjQpLCBQQ0lfQ1JfUENJX01PRCk7CisJd21iKCk7CisKKwkvKiBzZXR1cCBpcnEgbGluZSAqLworCWx0cV9lYnVfdzMyKGx0cV9lYnVfcjMyKExUUV9FQlVfUENDX0NPTikgfCAweGMsIExUUV9FQlVfUENDX0NPTik7CisJbHRxX2VidV93MzIobHRxX2VidV9yMzIoTFRRX0VCVV9QQ0NfSUVOKSB8IDB4MTAsIExUUV9FQlVfUENDX0lFTik7CisKKwkvKiB0b2dnbGUgcmVzZXQgcGluICovCisJX19ncGlvX3NldF92YWx1ZSgyMSwgMCk7CisJd21iKCk7CisJbWRlbGF5KDEpOworCV9fZ3Bpb19zZXRfdmFsdWUoMjEsIDEpOworCXJldHVybiAwOworfQorCitpbnQgX19pbml0IHBjaWJpb3NfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCit7CisJaWYgKGx0cV9wY2lfaXJxX21hcFtzbG90XSkKKwkJcmV0dXJuIGx0cV9wY2lfaXJxX21hcFtzbG90XTsKKwlwcmludGsoS0VSTl9FUlIgImxxX3BjaTogdHJ5aW5nIHRvIG1hcCBpcnEgZm9yIHVua25vd24gc2xvdCAlZFxuIiwKKwkJc2xvdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgbHRxX3BjaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBsdHFfcGNpX2RhdGEgKmx0cV9wY2lfZGF0YSA9CisJCShzdHJ1Y3QgbHRxX3BjaV9kYXRhICopIHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXBjaV9wcm9iZV9vbmx5ID0gMDsKKwlsdHFfcGNpX2lycV9tYXAgPSBsdHFfcGNpX2RhdGEtPmlycTsKKwlsdHFfcGNpX21lbWJhc2UgPSBpb3JlbWFwX25vY2FjaGUoUENJX0NSX0JBU0VfQUREUiwgUENJX0NSX1NJWkUpOworCWx0cV9wY2lfbWFwcGVkX2NmZyA9CisJCWlvcmVtYXBfbm9jYWNoZShMVFFfUENJX0NGR19CQVNFLCBMVFFfUENJX0NGR19CQVNFKTsKKwlsdHFfcGNpX2NvbnRyb2xsZXIuaW9fbWFwX2Jhc2UgPQorCQkodW5zaWduZWQgbG9uZylpb3JlbWFwKExUUV9QQ0lfSU9fQkFTRSwgTFRRX1BDSV9JT19TSVpFIC0gMSk7CisJbHRxX3BjaV9zdGFydHVwKGx0cV9wY2lfZGF0YSk7CisJcmVnaXN0ZXJfcGNpX2NvbnRyb2xsZXIoJmx0cV9wY2lfY29udHJvbGxlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIKK2x0cV9wY2lfZHJpdmVyID0geworCS5wcm9iZSA9IGx0cV9wY2lfcHJvYmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibHRxX3BjaSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitpbnQgX19pbml0IHBjaWJpb3NfaW5pdCh2b2lkKQoreworCWludCByZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmx0cV9wY2lfZHJpdmVyKTsKKwlpZiAocmV0KQorCQlwcmludGsoS0VSTl9JTkZPICJsdHFfcGNpOiBFcnJvciByZWdpc3RlcmluZyBwbGF0Zm9tIGRyaXZlciEiKTsKKwlyZXR1cm4gcmV0OworfQorCithcmNoX2luaXRjYWxsKHBjaWJpb3NfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL3BjaS1sYW50aXEuaCBiL2FyY2gvbWlwcy9wY2kvcGNpLWxhbnRpcS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YmY2Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvcGNpL3BjaS1sYW50aXEuaApAQCAtMCwwICsxLDE4IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIEpvaG4gQ3Jpc3BpbiA8YmxvZ2ljQG9wZW53cnQub3JnPgorICovCisKKyNpZm5kZWYgX0xUUV9QQ0lfSF9fCisjZGVmaW5lIF9MVFFfUENJX0hfXworCitleHRlcm4gX19pb21lbSB2b2lkICpsdHFfcGNpX21hcHBlZF9jZmc7CitleHRlcm4gaW50IGx0cV9wY2lfcmVhZF9jb25maWdfZHdvcmQoc3RydWN0IHBjaV9idXMgKmJ1cywKKwl1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiAqdmFsKTsKK2V4dGVybiBpbnQgbHRxX3BjaV93cml0ZV9jb25maWdfZHdvcmQoc3RydWN0IHBjaV9idXMgKmJ1cywKKwl1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiB2YWwpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvcGNpLXhsci5jIGIvYXJjaC9taXBzL3BjaS9wY2kteGxyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhmZWNlMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9wY2kvcGNpLXhsci5jCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAxMSBOZXRMb2dpYyBNaWNyb3N5c3RlbXMsIEluYy4gKE5ldExvZ2ljKS4gQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlIE5ldExvZ2ljCisgKiBsaWNlbnNlIGJlbG93OgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBORVRMT0dJQyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgTkVUTE9HSUMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGFzbS9uZXRsb2dpYy9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vbmV0bG9naWMveGxyL2lvbWFwLmg+CisjaW5jbHVkZSA8YXNtL25ldGxvZ2ljL3hsci9waWMuaD4KKyNpbmNsdWRlIDxhc20vbmV0bG9naWMveGxyL3hsci5oPgorCitzdGF0aWMgdm9pZCAqcGNpX2NvbmZpZ19iYXNlOworCisjZGVmaW5lCXBjaV9jZmdfYWRkcihidXMsIGRldmZuLCBvZmYpICgoKGJ1cykgPDwgMTYpIHwgKChkZXZmbikgPDwgOCkgfCAob2ZmKSkKKworLyogUENJIG9wcyAqLworc3RhdGljIGlubGluZSB1MzIgcGNpX2NmZ19yZWFkXzMyYml0KHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwlpbnQgd2hlcmUpCit7CisJdTMyIGRhdGE7CisJdTMyICpjZmdhZGRyOworCisJY2ZnYWRkciA9ICh1MzIgKikocGNpX2NvbmZpZ19iYXNlICsKKwkJCXBjaV9jZmdfYWRkcihidXMtPm51bWJlciwgZGV2Zm4sIHdoZXJlICYgfjMpKTsKKwlkYXRhID0gKmNmZ2FkZHI7CisJcmV0dXJuIGNwdV90b19sZTMyKGRhdGEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2NmZ193cml0ZV8zMmJpdChzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCisJaW50IHdoZXJlLCB1MzIgZGF0YSkKK3sKKwl1MzIgKmNmZ2FkZHI7CisKKwljZmdhZGRyID0gKHUzMiAqKShwY2lfY29uZmlnX2Jhc2UgKworCQkJcGNpX2NmZ19hZGRyKGJ1cy0+bnVtYmVyLCBkZXZmbiwgd2hlcmUgJiB+MykpOworCSpjZmdhZGRyID0gY3B1X3RvX2xlMzIoZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgbmxtX3BjaWJpb3NfcmVhZChzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCisJaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyICp2YWwpCit7CisJdTMyIGRhdGE7CisKKwlpZiAoKHNpemUgPT0gMikgJiYgKHdoZXJlICYgMSkpCisJCXJldHVybiBQQ0lCSU9TX0JBRF9SRUdJU1RFUl9OVU1CRVI7CisJZWxzZSBpZiAoKHNpemUgPT0gNCkgJiYgKHdoZXJlICYgMykpCisJCXJldHVybiBQQ0lCSU9TX0JBRF9SRUdJU1RFUl9OVU1CRVI7CisKKwlkYXRhID0gcGNpX2NmZ19yZWFkXzMyYml0KGJ1cywgZGV2Zm4sIHdoZXJlKTsKKworCWlmIChzaXplID09IDEpCisJCSp2YWwgPSAoZGF0YSA+PiAoKHdoZXJlICYgMykgPDwgMykpICYgMHhmZjsKKwllbHNlIGlmIChzaXplID09IDIpCisJCSp2YWwgPSAoZGF0YSA+PiAoKHdoZXJlICYgMykgPDwgMykpICYgMHhmZmZmOworCWVsc2UKKwkJKnZhbCA9IGRhdGE7CisKKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCisKK3N0YXRpYyBpbnQgbmxtX3BjaWJpb3Nfd3JpdGUoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAorCQlpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgdmFsKQoreworCXUzMiBkYXRhOworCisJaWYgKChzaXplID09IDIpICYmICh3aGVyZSAmIDEpKQorCQlyZXR1cm4gUENJQklPU19CQURfUkVHSVNURVJfTlVNQkVSOworCWVsc2UgaWYgKChzaXplID09IDQpICYmICh3aGVyZSAmIDMpKQorCQlyZXR1cm4gUENJQklPU19CQURfUkVHSVNURVJfTlVNQkVSOworCisJZGF0YSA9IHBjaV9jZmdfcmVhZF8zMmJpdChidXMsIGRldmZuLCB3aGVyZSk7CisKKwlpZiAoc2l6ZSA9PSAxKQorCQlkYXRhID0gKGRhdGEgJiB+KDB4ZmYgPDwgKCh3aGVyZSAmIDMpIDw8IDMpKSkgfAorCQkJKHZhbCA8PCAoKHdoZXJlICYgMykgPDwgMykpOworCWVsc2UgaWYgKHNpemUgPT0gMikKKwkJZGF0YSA9IChkYXRhICYgfigweGZmZmYgPDwgKCh3aGVyZSAmIDMpIDw8IDMpKSkgfAorCQkJKHZhbCA8PCAoKHdoZXJlICYgMykgPDwgMykpOworCWVsc2UKKwkJZGF0YSA9IHZhbDsKKworCXBjaV9jZmdfd3JpdGVfMzJiaXQoYnVzLCBkZXZmbiwgd2hlcmUsIGRhdGEpOworCisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RydWN0IHBjaV9vcHMgbmxtX3BjaV9vcHMgPSB7CisJLnJlYWQgID0gbmxtX3BjaWJpb3NfcmVhZCwKKwkud3JpdGUgPSBubG1fcGNpYmlvc193cml0ZQorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBubG1fcGNpX21lbV9yZXNvdXJjZSA9IHsKKwkubmFtZSAgICAgICAgICAgPSAiWExSIFBDSSBNRU0iLAorCS5zdGFydCAgICAgICAgICA9IDB4ZDAwMDAwMDBVTCwJLyogMjU2TUIgUENJIG1lbSBAIDB4ZDAwMF8wMDAwICovCisJLmVuZCAgICAgICAgICAgID0gMHhkZmZmZmZmZlVMLAorCS5mbGFncyAgICAgICAgICA9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBubG1fcGNpX2lvX3Jlc291cmNlID0geworCS5uYW1lICAgICAgICAgICA9ICJYTFIgSU8gTUVNIiwKKwkuc3RhcnQgICAgICAgICAgPSAweDEwMDAwMDAwVUwsCS8qIDE2TUIgUENJIElPIEAgMHgxMDAwXzAwMDAgKi8KKwkuZW5kICAgICAgICAgICAgPSAweDEwMGZmZmZmVUwsCisJLmZsYWdzICAgICAgICAgID0gSU9SRVNPVVJDRV9JTywKK307CisKK3N0cnVjdCBwY2lfY29udHJvbGxlciBubG1fcGNpX2NvbnRyb2xsZXIgPSB7CisJLmluZGV4ICAgICAgICAgID0gMCwKKwkucGNpX29wcyAgICAgICAgPSAmbmxtX3BjaV9vcHMsCisJLm1lbV9yZXNvdXJjZSAgID0gJm5sbV9wY2lfbWVtX3Jlc291cmNlLAorCS5tZW1fb2Zmc2V0ICAgICA9IDB4MDAwMDAwMDBVTCwKKwkuaW9fcmVzb3VyY2UgICAgPSAmbmxtX3BjaV9pb19yZXNvdXJjZSwKKwkuaW9fb2Zmc2V0ICAgICAgPSAweDAwMDAwMDAwVUwsCit9OworCitpbnQgX19pbml0IHBjaWJpb3NfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCit7CisJaWYgKCFubG1fY2hpcF9pc194bHMoKSkKKwkJcmV0dXJuCVBJQ19QQ0lYX0lSUTsJLyogZm9yIFhMUiBqdXN0IG9uZSBJUlEqLworCisJLyoKKwkgKiBGb3IgWExTIFBDSWUsIHRoZXJlIGlzIGFuIElSUSBwZXIgTGluaywgZmluZCBvdXQgd2hpY2gKKwkgKiBsaW5rIHRoZSBkZXZpY2UgaXMgb24gdG8gYXNzaWduIGludGVycnVwdHMKKwkqLworCWlmIChkZXYtPmJ1cy0+c2VsZiA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaAkoZGV2LT5idXMtPnNlbGYtPmRldmZuKSB7CisJY2FzZSAweDA6CisJCXJldHVybiBQSUNfUENJRV9MSU5LMF9JUlE7CisJY2FzZSAweDg6CisJCXJldHVybiBQSUNfUENJRV9MSU5LMV9JUlE7CisJY2FzZSAweDEwOgorCQlpZiAobmxtX2NoaXBfaXNfeGxzX2IoKSkKKwkJCXJldHVybiBQSUNfUENJRV9YTFNCMF9MSU5LMl9JUlE7CisJCWVsc2UKKwkJCXJldHVybiBQSUNfUENJRV9MSU5LMl9JUlE7CisJY2FzZSAweDE4OgorCQlpZiAobmxtX2NoaXBfaXNfeGxzX2IoKSkKKwkJCXJldHVybiBQSUNfUENJRV9YTFNCMF9MSU5LM19JUlE7CisJCWVsc2UKKwkJCXJldHVybiBQSUNfUENJRV9MSU5LM19JUlE7CisJfQorCVdBUk4oMSwgIlVuZXhwZWN0ZWQgZGV2Zm4gJWRcbiIsIGRldi0+YnVzLT5zZWxmLT5kZXZmbik7CisJcmV0dXJuIDA7Cit9CisKKy8qIERvIHBsYXRmb3JtIHNwZWNpZmljIGRldmljZSBpbml0aWFsaXphdGlvbiBhdCBwY2lfZW5hYmxlX2RldmljZSgpIHRpbWUgKi8KK2ludCBwY2liaW9zX3BsYXRfZGV2X2luaXQoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgcGNpYmlvc19pbml0KHZvaWQpCit7CisJLyogUFNCIGFzc2lnbnMgUENJIHJlc291cmNlcyAqLworCXBjaV9wcm9iZV9vbmx5ID0gMTsKKwlwY2lfY29uZmlnX2Jhc2UgPSBpb3JlbWFwKERFRkFVTFRfUENJX0NPTkZJR19CQVNFLCAxNiA8PCAyMCk7CisKKwkvKiBFeHRlbmQgSU8gcG9ydCBmb3IgbWVtb3J5IG1hcHBlZCBpbyAqLworCWlvcG9ydF9yZXNvdXJjZS5zdGFydCA9ICAwOworCWlvcG9ydF9yZXNvdXJjZS5lbmQgICA9IH4wOworCisJc2V0X2lvX3BvcnRfYmFzZShDS1NFRzEpOworCW5sbV9wY2lfY29udHJvbGxlci5pb19tYXBfYmFzZSA9IENLU0VHMTsKKworCXByX2luZm8oIlJlZ2lzdGVyaW5nIFhMUi9YTFMgUENJWC9QQ0lFIENvbnRyb2xsZXIuXG4iKTsKKwlyZWdpc3Rlcl9wY2lfY29udHJvbGxlcigmbmxtX3BjaV9jb250cm9sbGVyKTsKKworCXJldHVybiAwOworfQorCithcmNoX2luaXRjYWxsKHBjaWJpb3NfaW5pdCk7CisKK3N0cnVjdCBwY2lfZml4dXAgcGNpYmlvc19maXh1cHNbXSA9IHsKKwl7MH0KK307CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcG1jLXNpZXJyYS95b3NlbWl0ZS9zbXAuYyBiL2FyY2gvbWlwcy9wbWMtc2llcnJhL3lvc2VtaXRlL3NtcC5jCmluZGV4IGVmYzllODguLjI2MDg3NTIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wbWMtc2llcnJhL3lvc2VtaXRlL3NtcC5jCisrKyBiL2FyY2gvbWlwcy9wbWMtc2llcnJhL3lvc2VtaXRlL3NtcC5jCkBAIC01NSw2ICs1NSw4IEBACiAKIAkJaWYgKHN0YXR1cyAmIDB4MikKIAkJCXNtcF9jYWxsX2Z1bmN0aW9uX2ludGVycnVwdCgpOworCQlpZiAoc3RhdHVzICYgMHg0KQorCQkJc2NoZWR1bGVyX2lwaSgpOwogCQlicmVhazsKIAogCWNhc2UgMToKQEAgLTYzLDYgKzY1LDggQEAKIAogCQlpZiAoc3RhdHVzICYgMHgyKQogCQkJc21wX2NhbGxfZnVuY3Rpb25faW50ZXJydXB0KCk7CisJCWlmIChzdGF0dXMgJiAweDQpCisJCQlzY2hlZHVsZXJfaXBpKCk7CiAJCWJyZWFrOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LWlycS5jIGIvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctaXJxLmMKaW5kZXggMGEwNDYwMy4uYjE4YjA0ZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctaXJxLmMKKysrIGIvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctaXJxLmMKQEAgLTE0Nyw4ICsxNDcsMTAgQEAKICNpZmRlZiBDT05GSUdfU01QCiAJaWYgKHBlbmQwICYgKDFVTCA8PCBDUFVfUkVTQ0hFRF9BX0lSUSkpIHsKIAkJTE9DQUxfSFVCX0NMUl9JTlRSKENQVV9SRVNDSEVEX0FfSVJRKTsKKwkJc2NoZWR1bGVyX2lwaSgpOwogCX0gZWxzZSBpZiAocGVuZDAgJiAoMVVMIDw8IENQVV9SRVNDSEVEX0JfSVJRKSkgewogCQlMT0NBTF9IVUJfQ0xSX0lOVFIoQ1BVX1JFU0NIRURfQl9JUlEpOworCQlzY2hlZHVsZXJfaXBpKCk7CiAJfSBlbHNlIGlmIChwZW5kMCAmICgxVUwgPDwgQ1BVX0NBTExfQV9JUlEpKSB7CiAJCUxPQ0FMX0hVQl9DTFJfSU5UUihDUFVfQ0FMTF9BX0lSUSk7CiAJCXNtcF9jYWxsX2Z1bmN0aW9uX2ludGVycnVwdCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctdGltZXIuYyBiL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LXRpbWVyLmMKaW5kZXggYTE1MjUzOC4uZWY3NGYzMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctdGltZXIuYworKysgYi9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy10aW1lci5jCkBAIC02NiwxOCArNjYsNyBAQAogc3RhdGljIHZvaWQgcnRfc2V0X21vZGUoZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUsCiAJCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKIHsKLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIENMT0NLX0VWVF9NT0RFX09ORVNIT1Q6Ci0JCS8qIFRoZSBvbmx5IG1vZGUgc3VwcG9ydGVkICovCi0JCWJyZWFrOwotCi0JY2FzZSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQzoKLQljYXNlIENMT0NLX0VWVF9NT0RFX1VOVVNFRDoKLQljYXNlIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOOgotCWNhc2UgQ0xPQ0tfRVZUX01PREVfUkVTVU1FOgotCQkvKiBOb3RoaW5nIHRvIGRvICAqLwotCQlicmVhazsKLQl9CisJLyogTm90aGluZyB0byBkbyAuLi4gICovCiB9CiAKIGludCBydF90aW1lcl9pcnE7CkBAIC0xNzQsOCArMTYzLDcgQEAKIHsKIAlzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzID0gJmh1Yl9ydF9jbG9ja3NvdXJjZTsKIAotCWNsb2Nrc291cmNlX3NldF9jbG9jayhjcywgQ1lDTEVTX1BFUl9TRUMpOwotCWNsb2Nrc291cmNlX3JlZ2lzdGVyKGNzKTsKKwljbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeihjcywgQ1lDTEVTX1BFUl9TRUMpOwogfQogCiB2b2lkIF9faW5pdCBwbGF0X3RpbWVfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL3NtcC5jIGIvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL3NtcC5jCmluZGV4IDQ3YjM0N2MuLmQ2Njc4NzUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC9zbXAuYworKysgYi9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvc21wLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtMTg5LDEwICsxOTAsOCBAQAogCS8qIENsZWFyIHRoZSBtYWlsYm94IHRvIGNsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KIAlfX3Jhd193cml0ZXEoKCh1NjQpYWN0aW9uKTw8NDgsIG1haWxib3hfMF9jbGVhcl9yZWdzW2NwdV0pOwogCi0JLyoKLQkgKiBOb3RoaW5nIHRvIGRvIGZvciBTTVBfUkVTQ0hFRFVMRV9ZT1VSU0VMRjsgcmV0dXJuaW5nIGZyb20gdGhlCi0JICogaW50ZXJydXB0IHdpbGwgZG8gdGhlIHJlc2NoZWR1bGUgZm9yIHVzCi0JICovCisJaWYgKGFjdGlvbiAmIFNNUF9SRVNDSEVEVUxFX1lPVVJTRUxGKQorCQlzY2hlZHVsZXJfaXBpKCk7CiAKIAlpZiAoYWN0aW9uICYgU01QX0NBTExfRlVOQ1RJT04pCiAJCXNtcF9jYWxsX2Z1bmN0aW9uX2ludGVycnVwdCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvc21wLmMgYi9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9zbXAuYwppbmRleCBjMDBhNWNiLi4zOGU3ZjZiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9zbXAuYworKysgYi9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9zbXAuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtMTc3LDEwICsxNzgsOCBAQAogCS8qIENsZWFyIHRoZSBtYWlsYm94IHRvIGNsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KIAlfX19fcmF3X3dyaXRlcSgoKHU2NClhY3Rpb24pIDw8IDQ4LCBtYWlsYm94X2NsZWFyX3JlZ3NbY3B1XSk7CiAKLQkvKgotCSAqIE5vdGhpbmcgdG8gZG8gZm9yIFNNUF9SRVNDSEVEVUxFX1lPVVJTRUxGOyByZXR1cm5pbmcgZnJvbSB0aGUKLQkgKiBpbnRlcnJ1cHQgd2lsbCBkbyB0aGUgcmVzY2hlZHVsZSBmb3IgdXMKLQkgKi8KKwlpZiAoYWN0aW9uICYgU01QX1JFU0NIRURVTEVfWU9VUlNFTEYpCisJCXNjaGVkdWxlcl9pcGkoKTsKIAogCWlmIChhY3Rpb24gJiBTTVBfQ0FMTF9GVU5DVElPTikKIAkJc21wX2NhbGxfZnVuY3Rpb25faW50ZXJydXB0KCk7CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL3NtcC5jIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9zbXAuYwppbmRleCAyMjZjODI2Li44M2ZiMjc5IDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvc21wLmMKQEAgLTQ5NCwxNCArNDk0LDExIEBACiAgKiBAaXJxOiBUaGUgaW50ZXJydXB0IG51bWJlci4KICAqIEBkZXZfaWQ6IFRoZSBkZXZpY2UgSUQuCiAgKgotICogV2UgbmVlZCBkbyBub3RoaW5nIGhlcmUsIHNpbmNlIHRoZSBzY2hlZHVsaW5nIHdpbGwgYmUgZWZmZWN0ZWQgb24gb3VyIHdheQotICogYmFjayB0aHJvdWdoIGVudHJ5LlMuCi0gKgogICogUmV0dXJucyBJUlFfSEFORExFRCB0byBpbmRpY2F0ZSB3ZSBoYW5kbGVkIHRoZSBpbnRlcnJ1cHQgc3VjY2Vzc2Z1bGx5LgogICovCiBzdGF0aWMgaXJxcmV0dXJuX3Qgc21wX3Jlc2NoZWR1bGVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQkvKiBkbyBub3RoaW5nICovCisJc2NoZWR1bGVyX2lwaSgpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3NtcC5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3NtcC5jCmluZGV4IDY5ZDYzZDMuLjgyODMwNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvc21wLmMKQEAgLTE1NSwxMCArMTU1LDcgQEAKIAkJCQkKIAkJCWNhc2UgSVBJX1JFU0NIRURVTEU6CiAJCQkJc21wX2RlYnVnKDEwMCwgS0VSTl9ERUJVRyAiQ1BVJWQgSVBJX1JFU0NIRURVTEVcbiIsIHRoaXNfY3B1KTsKLQkJCQkvKgotCQkJCSAqIFJlc2NoZWR1bGUgY2FsbGJhY2suICBFdmVyeXRoaW5nIHRvIGJlCi0JCQkJICogZG9uZSBpcyBkb25lIGJ5IHRoZSBpbnRlcnJ1cHQgcmV0dXJuIHBhdGguCi0JCQkJICovCisJCQkJc2NoZWR1bGVyX2lwaSgpOwogCQkJCWJyZWFrOwogCiAJCQljYXNlIElQSV9DQUxMX0ZVTkM6CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbXBpYy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21waWMuaAppbmRleCA2NjRiZWU2Ni4uZGYxODk4OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21waWMuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbXBpYy5oCkBAIC0zLDcgKzMsNiBAQAogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGFzbS9kY3IuaD4KICNpbmNsdWRlIDxhc20vbXNpX2JpdG1hcC5oPgogCkBAIC0zMjEsOCArMzIwLDYgQEAKIAkvKiBsaW5rICovCiAJc3RydWN0IG1waWMJCSpuZXh0OwogCi0Jc3RydWN0IHN5c19kZXZpY2UJc3lzZGV2OwotCiAjaWZkZWYgQ09ORklHX1BNCiAJc3RydWN0IG1waWNfaXJxX3NhdmUJKnNhdmVfZGF0YTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMKaW5kZXggZGQxOTczZi4uNGE2ZjJlYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jCkBAIC0xMTksNyArMTE5LDcgQEAKIAogc3RhdGljIGlycXJldHVybl90IHJlc2NoZWR1bGVfYWN0aW9uKGludCBpcnEsIHZvaWQgKmRhdGEpCiB7Ci0JLyogd2UganVzdCBuZWVkIHRoZSByZXR1cm4gcGF0aCBzaWRlIGVmZmVjdCBvZiBjaGVja2luZyBuZWVkX3Jlc2NoZWQgKi8KKwlzY2hlZHVsZXJfaXBpKCk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCkBAIC0yMjQsNyArMjI0LDcgQEAKIAkJaWYgKGFsbCAmICgxIDw8ICgyNCAtIDggKiBQUENfTVNHX0NBTExfRlVOQ1RJT04pKSkKIAkJCWdlbmVyaWNfc21wX2NhbGxfZnVuY3Rpb25faW50ZXJydXB0KCk7CiAJCWlmIChhbGwgJiAoMSA8PCAoMjQgLSA4ICogUFBDX01TR19SRVNDSEVEVUxFKSkpCi0JCQlyZXNjaGVkdWxlX2FjdGlvbigwLCBOVUxMKTsgLyogdXBjb21pbmcgc2NoZWQgaG9vayAqLworCQkJc2NoZWR1bGVyX2lwaSgpOwogCQlpZiAoYWxsICYgKDEgPDwgKDI0IC0gOCAqIFBQQ19NU0dfQ0FMTF9GVU5DX1NJTkdMRSkpKQogCQkJZ2VuZXJpY19zbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGVfaW50ZXJydXB0KCk7CiAJCWlmIChhbGwgJiAoMSA8PCAoMjQgLSA4ICogUFBDX01TR19ERUJVR0dFUl9CUkVBSykpKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCmluZGV4IDA2YjlkNDUuLmIxMzMwNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKQEAgLTE0Myw3ICsxNDMsNiBAQAogI2VuZGlmCiAJCXByaW50aygiJXNcbiIsIHBwY19tZC5uYW1lID8gcHBjX21kLm5hbWUgOiAiIik7CiAKLQkJc3lzZnNfcHJpbnRrX2xhc3RfZmlsZSgpOwogCQlpZiAobm90aWZ5X2RpZShESUVfT09QUywgc3RyLCByZWdzLCBlcnIsIDI1NSwKIAkJCSAgICAgICBTSUdTRUdWKSA9PSBOT1RJRllfU1RPUCkKIAkJCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jCmluZGV4IDZhNTg3NDQuLjQ0OWMwOGMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pbnRlcnJ1cHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmMKQEAgLTIwMSw3ICsyMDEsNyBAQAogCQlnZW5lcmljX3NtcF9jYWxsX2Z1bmN0aW9uX2ludGVycnVwdCgpOwogCQlicmVhazsKIAljYXNlIFBQQ19NU0dfUkVTQ0hFRFVMRToKLQkJLyogVXBjb21pbmcgc2NoZWQgaG9vayAqLworCQlzY2hlZHVsZXJfaXBpKCk7CiAJCWJyZWFrOwogCWNhc2UgUFBDX01TR19DQUxMX0ZVTkNfU0lOR0xFOgogCQlnZW5lcmljX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9pbnRlcnJ1cHQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfYmFzZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9iYXNlLmMKaW5kZXggYWNmYWNjZS4uMzY3NWRhNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9iYXNlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9iYXNlLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvbGludXhfbG9nby5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CiAjaW5jbHVkZSA8YXNtL3NwdS5oPgogI2luY2x1ZGUgPGFzbS9zcHVfcHJpdjEuaD4KICNpbmNsdWRlIDxhc20vc3B1X2NzYS5oPgpAQCAtNTIxLDE4ICs1MjIsOCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoc3B1X2luaXRfY2hhbm5lbHMpOwogCi1zdGF0aWMgaW50IHNwdV9zaHV0ZG93bihzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2KQotewotCXN0cnVjdCBzcHUgKnNwdSA9IGNvbnRhaW5lcl9vZihzeXNkZXYsIHN0cnVjdCBzcHUsIHN5c2Rldik7Ci0KLQlzcHVfZnJlZV9pcnFzKHNwdSk7Ci0Jc3B1X2Rlc3Ryb3lfc3B1KHNwdSk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHNwdV9zeXNkZXZfY2xhc3MgPSB7CiAJLm5hbWUgPSAic3B1IiwKLQkuc2h1dGRvd24gPSBzcHVfc2h1dGRvd24sCiB9OwogCiBpbnQgc3B1X2FkZF9zeXNkZXZfYXR0cihzdHJ1Y3Qgc3lzZGV2X2F0dHJpYnV0ZSAqYXR0cikKQEAgLTc5Nyw2ICs3ODgsMjIgQEAKIH0KICNlbmRpZgogCitzdGF0aWMgdm9pZCBzcHVfc2h1dGRvd24odm9pZCkKK3sKKwlzdHJ1Y3Qgc3B1ICpzcHU7CisKKwltdXRleF9sb2NrKCZzcHVfZnVsbF9saXN0X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNwdSwgJnNwdV9mdWxsX2xpc3QsIGZ1bGxfbGlzdCkgeworCQlzcHVfZnJlZV9pcnFzKHNwdSk7CisJCXNwdV9kZXN0cm95X3NwdShzcHUpOworCX0KKwltdXRleF91bmxvY2soJnNwdV9mdWxsX2xpc3RfbXV0ZXgpOworfQorCitzdGF0aWMgc3RydWN0IHN5c2NvcmVfb3BzIHNwdV9zeXNjb3JlX29wcyA9IHsKKwkuc2h1dGRvd24gPSBzcHVfc2h1dGRvd24sCit9OworCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3NwdV9iYXNlKHZvaWQpCiB7CiAJaW50IGksIHJldCA9IDA7CkBAIC04MzAsNiArODM3LDcgQEAKIAljcmFzaF9yZWdpc3Rlcl9zcHVzKCZzcHVfZnVsbF9saXN0KTsKIAltdXRleF91bmxvY2soJnNwdV9mdWxsX2xpc3RfbXV0ZXgpOwogCXNwdV9hZGRfc3lzZGV2X2F0dHIoJmF0dHJfc3RhdCk7CisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJnNwdV9zeXNjb3JlX29wcyk7CiAKIAlzcHVfaW5pdF9hZmZpbml0eSgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BpYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9waWMuYwppbmRleCAzNjAyNjBkLi45MDg5YjA0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BpYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGljLmMKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2FkYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BtdS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNjc0LDcgKzY3NCw3IEBACiAJcmV0dXJuIHZpYWludDsKIH0KIAotc3RhdGljIGludCBwbWFjcGljX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBwbWFjcGljX3N1c3BlbmQodm9pZCkKIHsKIAlpbnQgdmlhaW50ID0gcG1hY3BpY19maW5kX3ZpYWludCgpOwogCkBAIC02OTUsNyArNjk1LDcgQEAKICAgICAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcG1hY3BpY19yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldikKK3N0YXRpYyB2b2lkIHBtYWNwaWNfcmVzdW1lKHZvaWQpCiB7CiAJaW50IGk7CiAKQEAgLTcwNiwzOSArNzA2LDE5IEBACiAJZm9yIChpID0gMDsgaSA8IG1heF9yZWFsX2lycXM7ICsraSkKIAkJaWYgKHRlc3RfYml0KGksIHNsZWVwX3NhdmVfbWFzaykpCiAJCQlwbWFjX3VubWFza19pcnEoaXJxX2dldF9pcnFfZGF0YShpKSk7Ci0KLQlyZXR1cm4gMDsKIH0KIAotI2VuZGlmIC8qIENPTkZJR19QTSAmJiBDT05GSUdfUFBDMzIgKi8KLQotc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgcG1hY3BpY19zeXNjbGFzcyA9IHsKLQkubmFtZSA9ICJwbWFjX3BpYyIsCitzdGF0aWMgc3RydWN0IHN5c2NvcmVfb3BzIHBtYWNwaWNfc3lzY29yZV9vcHMgPSB7CisJLnN1c3BlbmQJPSBwbWFjcGljX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBwbWFjcGljX3Jlc3VtZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBkZXZpY2VfcG1hY3BpYyA9IHsKLQkuaWQJCT0gMCwKLQkuY2xzCQk9ICZwbWFjcGljX3N5c2NsYXNzLAotfTsKLQotc3RhdGljIHN0cnVjdCBzeXNkZXZfZHJpdmVyIGRyaXZlcl9wbWFjcGljID0gewotI2lmIGRlZmluZWQoQ09ORklHX1BNKSAmJiBkZWZpbmVkKENPTkZJR19QUEMzMikKLQkuc3VzcGVuZAk9ICZwbWFjcGljX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSAmcG1hY3BpY19yZXN1bWUsCi0jZW5kaWYgLyogQ09ORklHX1BNICYmIENPTkZJR19QUEMzMiAqLwotfTsKLQotc3RhdGljIGludCBfX2luaXQgaW5pdF9wbWFjcGljX3N5c2ZzKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3BtYWNwaWNfc3lzY29yZSh2b2lkKQogewotI2lmZGVmIENPTkZJR19QUEMzMgotCWlmIChtYXhfaXJxcyA9PSAwKQotCQlyZXR1cm4gLUVOT0RFVjsKLSNlbmRpZgotCXByaW50ayhLRVJOX0RFQlVHICJSZWdpc3RlcmluZyBwbWFjIHBpYyB3aXRoIHN5c2ZzLi4uXG4iKTsKLQlzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJnBtYWNwaWNfc3lzY2xhc3MpOwotCXN5c2Rldl9yZWdpc3RlcigmZGV2aWNlX3BtYWNwaWMpOwotCXN5c2Rldl9kcml2ZXJfcmVnaXN0ZXIoJnBtYWNwaWNfc3lzY2xhc3MsICZkcml2ZXJfcG1hY3BpYyk7CisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJnBtYWNwaWNfc3lzY29yZV9vcHMpOwogCXJldHVybiAwOwogfQotbWFjaGluZV9zdWJzeXNfaW5pdGNhbGwocG93ZXJtYWMsIGluaXRfcG1hY3BpY19zeXNmcyk7CiAKK21hY2hpbmVfc3Vic3lzX2luaXRjYWxsKHBvd2VybWFjLCBpbml0X3BtYWNwaWNfc3lzY29yZSk7CisKKyNlbmRpZiAvKiBDT05GSUdfUE0gJiYgQ09ORklHX1BQQzMyICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2lwaWMuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvaXBpYy5jCmluZGV4IGYwZWNlNzkuLjczNjdkMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvaXBpYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvaXBpYy5jCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgpAQCAtOTAwLDcgKzkwMCw3IEBACiAJdTMyIHNlcmNyOwogfSBpcGljX3NhdmVkX3N0YXRlOwogCi1zdGF0aWMgaW50IGlwaWNfc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqc2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBpcGljX3N1c3BlbmQodm9pZCkKIHsKIAlzdHJ1Y3QgaXBpYyAqaXBpYyA9IHByaW1hcnlfaXBpYzsKIApAQCAtOTMxLDcgKzkzMSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaXBpY19yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKnNkZXYpCitzdGF0aWMgdm9pZCBpcGljX3Jlc3VtZSh2b2lkKQogewogCXN0cnVjdCBpcGljICppcGljID0gcHJpbWFyeV9pcGljOwogCkBAIC05NDcsNDQgKzk0NywyNiBAQAogCWlwaWNfd3JpdGUoaXBpYy0+cmVncywgSVBJQ19TRUNOUiwgaXBpY19zYXZlZF9zdGF0ZS5zZWNucik7CiAJaXBpY193cml0ZShpcGljLT5yZWdzLCBJUElDX1NFUk1SLCBpcGljX3NhdmVkX3N0YXRlLnNlcm1yKTsKIAlpcGljX3dyaXRlKGlwaWMtPnJlZ3MsIElQSUNfU0VSQ1IsIGlwaWNfc2F2ZWRfc3RhdGUuc2VyY3IpOwotCi0JcmV0dXJuIDA7CiB9CiAjZWxzZQogI2RlZmluZSBpcGljX3N1c3BlbmQgTlVMTAogI2RlZmluZSBpcGljX3Jlc3VtZSBOVUxMCiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgaXBpY19zeXNjbGFzcyA9IHsKLQkubmFtZSA9ICJpcGljIiwKK3N0YXRpYyBzdHJ1Y3Qgc3lzY29yZV9vcHMgaXBpY19zeXNjb3JlX29wcyA9IHsKIAkuc3VzcGVuZCA9IGlwaWNfc3VzcGVuZCwKIAkucmVzdW1lID0gaXBpY19yZXN1bWUsCiB9OwogCi1zdGF0aWMgc3RydWN0IHN5c19kZXZpY2UgZGV2aWNlX2lwaWMgPSB7Ci0JLmlkCQk9IDAsCi0JLmNscwkJPSAmaXBpY19zeXNjbGFzcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXRfaXBpY19zeXNmcyh2b2lkKQorc3RhdGljIGludCBfX2luaXQgaW5pdF9pcGljX3N5c2NvcmUodm9pZCkKIHsKLQlpbnQgcmM7Ci0KIAlpZiAoIXByaW1hcnlfaXBpYyB8fCAhcHJpbWFyeV9pcGljLT5yZWdzKQogCQlyZXR1cm4gLUVOT0RFVjsKLQlwcmludGsoS0VSTl9ERUJVRyAiUmVnaXN0ZXJpbmcgaXBpYyB3aXRoIHN5c2ZzLi4uXG4iKTsKIAotCXJjID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZpcGljX3N5c2NsYXNzKTsKLQlpZiAocmMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgcmVnaXN0ZXJpbmcgaXBpYyBzeXMgY2xhc3NcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JcmMgPSBzeXNkZXZfcmVnaXN0ZXIoJmRldmljZV9pcGljKTsKLQlpZiAocmMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgcmVnaXN0ZXJpbmcgaXBpYyBzeXMgZGV2aWNlXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQorCXByaW50ayhLRVJOX0RFQlVHICJSZWdpc3RlcmluZyBpcGljIHN5c3RlbSBjb3JlIG9wZXJhdGlvbnNcbiIpOworCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZpcGljX3N5c2NvcmVfb3BzKTsKKwogCXJldHVybiAwOwogfQogCi1zdWJzeXNfaW5pdGNhbGwoaW5pdF9pcGljX3N5c2ZzKTsKK3N1YnN5c19pbml0Y2FsbChpbml0X2lwaWNfc3lzY29yZSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jCmluZGV4IDU3ZTk1NDEuLjNhOGRlNWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KIAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CkBAIC0xNzkzLDkgKzE3OTQsOCBAQAogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBtcGljX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIHZvaWQgbXBpY19zdXNwZW5kX29uZShzdHJ1Y3QgbXBpYyAqbXBpYykKIHsKLQlzdHJ1Y3QgbXBpYyAqbXBpYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBtcGljLCBzeXNkZXYpOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IG1waWMtPm51bV9zb3VyY2VzOyBpKyspIHsKQEAgLTE4MDQsMTMgKzE4MDQsMjIgQEAKIAkJbXBpYy0+c2F2ZV9kYXRhW2ldLmRlc3QgPQogCQkJbXBpY19pcnFfcmVhZChpLCBNUElDX0lORk8oSVJRX0RFU1RJTkFUSU9OKSk7CiAJfQorfQorCitzdGF0aWMgaW50IG1waWNfc3VzcGVuZCh2b2lkKQoreworCXN0cnVjdCBtcGljICptcGljID0gbXBpY3M7CisKKwl3aGlsZSAobXBpYykgeworCQltcGljX3N1c3BlbmRfb25lKG1waWMpOworCQltcGljID0gbXBpYy0+bmV4dDsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtcGljX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgbXBpY19yZXN1bWVfb25lKHN0cnVjdCBtcGljICptcGljKQogewotCXN0cnVjdCBtcGljICptcGljID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IG1waWMsIHN5c2Rldik7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbXBpYy0+bnVtX3NvdXJjZXM7IGkrKykgewpAQCAtMTgzNywzMyArMTg0NiwyOCBAQAogCX0KICNlbmRpZgogCX0gLyogZW5kIGZvciBsb29wICovCi0KLQlyZXR1cm4gMDsKIH0KLSNlbmRpZgogCi1zdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBtcGljX3N5c2NsYXNzID0gewotI2lmZGVmIENPTkZJR19QTQorc3RhdGljIHZvaWQgbXBpY19yZXN1bWUodm9pZCkKK3sKKwlzdHJ1Y3QgbXBpYyAqbXBpYyA9IG1waWNzOworCisJd2hpbGUgKG1waWMpIHsKKwkJbXBpY19yZXN1bWVfb25lKG1waWMpOworCQltcGljID0gbXBpYy0+bmV4dDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzY29yZV9vcHMgbXBpY19zeXNjb3JlX29wcyA9IHsKIAkucmVzdW1lID0gbXBpY19yZXN1bWUsCiAJLnN1c3BlbmQgPSBtcGljX3N1c3BlbmQsCi0jZW5kaWYKLQkubmFtZSA9ICJtcGljIiwKIH07CiAKIHN0YXRpYyBpbnQgbXBpY19pbml0X3N5cyh2b2lkKQogewotCXN0cnVjdCBtcGljICptcGljID0gbXBpY3M7Ci0JaW50IGVycm9yLCBpZCA9IDA7Ci0KLQllcnJvciA9IHN5c2Rldl9jbGFzc19yZWdpc3RlcigmbXBpY19zeXNjbGFzcyk7Ci0KLQl3aGlsZSAobXBpYyAmJiAhZXJyb3IpIHsKLQkJbXBpYy0+c3lzZGV2LmNscyA9ICZtcGljX3N5c2NsYXNzOwotCQltcGljLT5zeXNkZXYuaWQgPSBpZCsrOwotCQllcnJvciA9IHN5c2Rldl9yZWdpc3RlcigmbXBpYy0+c3lzZGV2KTsKLQkJbXBpYyA9IG1waWMtPm5leHQ7Ci0JfQotCXJldHVybiBlcnJvcjsKKwlyZWdpc3Rlcl9zeXNjb3JlX29wcygmbXBpY19zeXNjb3JlX29wcyk7CisJcmV0dXJuIDA7CiB9CiAKIGRldmljZV9pbml0Y2FsbChtcGljX2luaXRfc3lzKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL0tjb25maWcgYi9hcmNoL3MzOTAvS2NvbmZpZwppbmRleCAyNTA4YTZmLi40YTdmMTQwIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvS2NvbmZpZworKysgYi9hcmNoL3MzOTAvS2NvbmZpZwpAQCAtODgsNiArODgsNyBAQAogCXNlbGVjdCBIQVZFX0tFUk5FTF9YWgogCXNlbGVjdCBIQVZFX0dFVF9VU0VSX1BBR0VTX0ZBU1QKIAlzZWxlY3QgSEFWRV9BUkNIX01VVEVYX0NQVV9SRUxBWAorCXNlbGVjdCBIQVZFX0FSQ0hfSlVNUF9MQUJFTCBpZiAhTUFSQ0hfRzUKIAlzZWxlY3QgQVJDSF9JTkxJTkVfU1BJTl9UUllMT0NLCiAJc2VsZWN0IEFSQ0hfSU5MSU5FX1NQSU5fVFJZTE9DS19CSAogCXNlbGVjdCBBUkNIX0lOTElORV9TUElOX0xPQ0sKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCmluZGV4IDQzYTVjNzguLjNlMjAzODMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaApAQCAtMTEsNSArMTEsNiBAQAogaW50IHNldF9tZW1vcnlfcm8odW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpOwogaW50IHNldF9tZW1vcnlfcncodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpOwogaW50IHNldF9tZW1vcnlfbngodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpOworaW50IHNldF9tZW1vcnlfeCh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcyk7CiAKICNlbmRpZiAvKiBfUzM5MF9DQUNIRUZMVVNIX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9mdHJhY2UuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9mdHJhY2UuaAppbmRleCAzYzI5YmU0Li5iNzkzMWZhIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vZnRyYWNlLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2Z0cmFjZS5oCkBAIC0xMSwxNSArMTEsMTMgQEAKIAogI2lmZGVmIENPTkZJR182NEJJVAogI2RlZmluZSBNQ09VTlRfSU5TTl9TSVpFICAxMgotI2RlZmluZSBNQ09VTlRfT0ZGU0VUCSAgIDgKICNlbHNlCiAjZGVmaW5lIE1DT1VOVF9JTlNOX1NJWkUgIDIwCi0jZGVmaW5lIE1DT1VOVF9PRkZTRVQJICAgNAogI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBmdHJhY2VfY2FsbF9hZGp1c3QodW5zaWduZWQgbG9uZyBhZGRyKQogewotCXJldHVybiBhZGRyIC0gTUNPVU5UX09GRlNFVDsKKwlyZXR1cm4gYWRkcjsKIH0KIAogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2p1bXBfbGFiZWwuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9qdW1wX2xhYmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVhNmNmMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9qdW1wX2xhYmVsLmgKQEAgLTAsMCArMSwzNyBAQAorI2lmbmRlZiBfQVNNX1MzOTBfSlVNUF9MQUJFTF9ICisjZGVmaW5lIF9BU01fUzM5MF9KVU1QX0xBQkVMX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgSlVNUF9MQUJFTF9OT1BfU0laRSA2CisKKyNpZmRlZiBDT05GSUdfNjRCSVQKKyNkZWZpbmUgQVNNX1BUUiAiLnF1YWQiCisjZGVmaW5lIEFTTV9BTElHTiAiLmJhbGlnbiA4IgorI2Vsc2UKKyNkZWZpbmUgQVNNX1BUUiAiLmxvbmciCisjZGVmaW5lIEFTTV9BTElHTiAiLmJhbGlnbiA0IgorI2VuZGlmCisKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBhcmNoX3N0YXRpY19icmFuY2goc3RydWN0IGp1bXBfbGFiZWxfa2V5ICprZXkpCit7CisJYXNtIGdvdG8oIjA6CWJyY2wgMCwwXG4iCisJCSIucHVzaHNlY3Rpb24gX19qdW1wX3RhYmxlLCBcImF3XCJcbiIKKwkJQVNNX0FMSUdOICJcbiIKKwkJQVNNX1BUUiAiIDBiLCAlbFtsYWJlbF0sICUwXG4iCisJCSIucG9wc2VjdGlvblxuIgorCQk6IDogIlgiIChrZXkpIDogOiBsYWJlbCk7CisJcmV0dXJuIGZhbHNlOworbGFiZWw6CisJcmV0dXJuIHRydWU7Cit9CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBqdW1wX2xhYmVsX3Q7CisKK3N0cnVjdCBqdW1wX2VudHJ5IHsKKwlqdW1wX2xhYmVsX3QgY29kZTsKKwlqdW1wX2xhYmVsX3QgdGFyZ2V0OworCWp1bXBfbGFiZWxfdCBrZXk7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3MzOTAva2VybmVsL01ha2VmaWxlCmluZGV4IDY0MjMwYmMuLjVmZjE1ZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9NYWtlZmlsZQpAQCAtMjMsNyArMjMsNyBAQAogb2JqLXkJOj0gIGJpdG1hcC5vIHRyYXBzLm8gdGltZS5vIHByb2Nlc3MubyBiYXNlLm8gZWFybHkubyBzZXR1cC5vIFwKIAkgICAgcHJvY2Vzc29yLm8gc3lzX3MzOTAubyBwdHJhY2UubyBzaWduYWwubyBjcGNtZC5vIGViY2RpYy5vIFwKIAkgICAgczM5MF9leHQubyBkZWJ1Zy5vIGlycS5vIGlwbC5vIGRpcy5vIGRpYWcubyBtZW1fZGV0ZWN0Lm8gXAotCSAgICB2ZHNvLm8gdnRpbWUubyBzeXNpbmZvLm8gbm1pLm8gc2NscC5vCisJICAgIHZkc28ubyB2dGltZS5vIHN5c2luZm8ubyBubWkubyBzY2xwLm8ganVtcF9sYWJlbC5vCiAKIG9iai15CSs9ICQoaWYgJChDT05GSUdfNjRCSVQpLGVudHJ5NjQubyxlbnRyeS5vKQogb2JqLXkJKz0gJChpZiAkKENPTkZJR182NEJJVCkscmVpcGw2NC5vLHJlaXBsLm8pCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2p1bXBfbGFiZWwuYyBiL2FyY2gvczM5MC9rZXJuZWwvanVtcF9sYWJlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0Y2MwNmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAva2VybmVsL2p1bXBfbGFiZWwuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogSnVtcCBsYWJlbCBzMzkwIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMTEKKyAqIEF1dGhvcihzKTogSmFuIEdsYXViZXIgPGphbmdAbGludXgudm5ldC5pYm0uY29tPgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0b3BfbWFjaGluZS5oPgorI2luY2x1ZGUgPGxpbnV4L2p1bXBfbGFiZWwuaD4KKyNpbmNsdWRlIDxhc20vaXBsLmg+CisKKyNpZmRlZiBIQVZFX0pVTVBfTEFCRUwKKworc3RydWN0IGluc24geworCXUxNiBvcGNvZGU7CisJczMyIG9mZnNldDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpbnNuX2FyZ3MgeworCXVuc2lnbmVkIGxvbmcgKnRhcmdldDsKKwlzdHJ1Y3QgaW5zbiAqaW5zbjsKKwlzc2l6ZV90IHNpemU7Cit9OworCitzdGF0aWMgaW50IF9fYXJjaF9qdW1wX2xhYmVsX3RyYW5zZm9ybSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBpbnNuX2FyZ3MgKmFyZ3MgPSBkYXRhOworCWludCByYzsKKworCXJjID0gcHJvYmVfa2VybmVsX3dyaXRlKGFyZ3MtPnRhcmdldCwgYXJncy0+aW5zbiwgYXJncy0+c2l6ZSk7CisJV0FSTl9PTl9PTkNFKHJjIDwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYXJjaF9qdW1wX2xhYmVsX3RyYW5zZm9ybShzdHJ1Y3QganVtcF9lbnRyeSAqZW50cnksCisJCQkgICAgICAgZW51bSBqdW1wX2xhYmVsX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgaW5zbl9hcmdzIGFyZ3M7CisJc3RydWN0IGluc24gaW5zbjsKKworCWlmICh0eXBlID09IEpVTVBfTEFCRUxfRU5BQkxFKSB7CisJCS8qIGJyY2wgMTUsb2Zmc2V0ICovCisJCWluc24ub3Bjb2RlID0gMHhjMGY0OworCQlpbnNuLm9mZnNldCA9IChlbnRyeS0+dGFyZ2V0IC0gZW50cnktPmNvZGUpID4+IDE7CisJfSBlbHNlIHsKKwkJLyogYnJjbCAwLDAgKi8KKwkJaW5zbi5vcGNvZGUgPSAweGMwMDQ7CisJCWluc24ub2Zmc2V0ID0gMDsKKwl9CisKKwlhcmdzLnRhcmdldCA9ICh2b2lkICopIGVudHJ5LT5jb2RlOworCWFyZ3MuaW5zbiA9ICZpbnNuOworCWFyZ3Muc2l6ZSA9IEpVTVBfTEFCRUxfTk9QX1NJWkU7CisKKwlzdG9wX21hY2hpbmUoX19hcmNoX2p1bXBfbGFiZWxfdHJhbnNmb3JtLCAmYXJncywgTlVMTCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYyBiL2FyY2gvczM5MC9rZXJuZWwvc21wLmMKaW5kZXggNjNhOTdkYi4uNjNjN2Q5ZiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3NtcC5jCkBAIC0xNjUsMTIgKzE2NSwxMiBAQAogCWtzdGF0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpLmlycXNbRVhUSU5UX0lQSV0rKzsKIAkvKgogCSAqIGhhbmRsZSBiaXQgc2lnbmFsIGV4dGVybmFsIGNhbGxzCi0JICoKLQkgKiBGb3IgdGhlIGVjX3NjaGVkdWxlIHNpZ25hbCB3ZSBoYXZlIHRvIGRvIG5vdGhpbmcuIEFsbCB0aGUgd29yawotCSAqIGlzIGRvbmUgYXV0b21hdGljYWxseSB3aGVuIHdlIHJldHVybiBmcm9tIHRoZSBpbnRlcnJ1cHQuCiAJICovCiAJYml0cyA9IHhjaGcoJlMzOTBfbG93Y29yZS5leHRfY2FsbF9mYXN0LCAwKTsKIAorCWlmICh0ZXN0X2JpdChlY19zY2hlZHVsZSwgJmJpdHMpKQorCQlzY2hlZHVsZXJfaXBpKCk7CisKIAlpZiAodGVzdF9iaXQoZWNfY2FsbF9mdW5jdGlvbiwgJmJpdHMpKQogCQlnZW5lcmljX3NtcF9jYWxsX2Z1bmN0aW9uX2ludGVycnVwdCgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vcGFnZWF0dHIuYyBiL2FyY2gvczM5MC9tbS9wYWdlYXR0ci5jCmluZGV4IDA2MDdlNGIuLmYwNWVkY2MgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9wYWdlYXR0ci5jCisrKyBiL2FyY2gvczM5MC9tbS9wYWdlYXR0ci5jCkBAIC01NCwzICs1NCw4IEBACiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzZXRfbWVtb3J5X254KTsKKworaW50IHNldF9tZW1vcnlfeCh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcykKK3sKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gvS2NvbmZpZyBiL2FyY2gvc2gvS2NvbmZpZwppbmRleCA0Yjg5ZGEyLi5iYzQzOWRlIDEwMDY0NAotLS0gYS9hcmNoL3NoL0tjb25maWcKKysrIGIvYXJjaC9zaC9LY29uZmlnCkBAIC0yNCw3ICsyNCw2IEBACiAJc2VsZWN0IFJUQ19MSUIKIAlzZWxlY3QgR0VORVJJQ19BVE9NSUM2NAogCXNlbGVjdCBHRU5FUklDX0lSUV9TSE9XCi0Jc2VsZWN0IEFSQ0hfTk9fU1lTREVWX09QUwogCWhlbHAKIAkgIFRoZSBTdXBlckggaXMgYSBSSVNDIHByb2Nlc3NvciB0YXJnZXRlZCBmb3IgdXNlIGluIGVtYmVkZGVkIHN5c3RlbXMKIAkgIGFuZCBjb25zdW1lciBlbGVjdHJvbmljczsgaXQgd2FzIGFsc28gdXNlZCBpbiB0aGUgU2VnYSBEcmVhbWNhc3QKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9hcHNoNGFkMGFfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL2Fwc2g0YWQwYV9kZWZjb25maWcKaW5kZXggZTcxYTUzMS4uNzdlYzBlNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL2Fwc2g0YWQwYV9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL2Fwc2g0YWQwYV9kZWZjb25maWcKQEAgLTQ4LDcgKzQ4LDYgQEAKIENPTkZJR19CSU5GTVRfTUlTQz15CiBDT05GSUdfUE09eQogQ09ORklHX1BNX0RFQlVHPXkKLUNPTkZJR19QTV9WRVJCT1NFPXkKIENPTkZJR19QTV9SVU5USU1FPXkKIENPTkZJR19DUFVfSURMRT15CiBDT05GSUdfTkVUPXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9zZGs3Nzg2X2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zZGs3Nzg2X2RlZmNvbmZpZwppbmRleCBkYzRhMmViLi5jNDE2NTA1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2RrNzc4Nl9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3Nkazc3ODZfZGVmY29uZmlnCkBAIC04Myw3ICs4Myw2IEBACiBDT05GSUdfQklORk1UX01JU0M9eQogQ09ORklHX1BNPXkKIENPTkZJR19QTV9ERUJVRz15Ci1DT05GSUdfUE1fVkVSQk9TRT15CiBDT05GSUdfUE1fUlVOVElNRT15CiBDT05GSUdfQ1BVX0lETEU9eQogQ09ORklHX05FVD15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2htb2JpbGUvcG1fcnVudGltZS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NobW9iaWxlL3BtX3J1bnRpbWUuYwppbmRleCA2ZGNiODE2Li4yMmRiMTI3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2htb2JpbGUvcG1fcnVudGltZS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaG1vYmlsZS9wbV9ydW50aW1lLmMKQEAgLTEzOSw3ICsxMzksNyBAQAogCXF1ZXVlX3dvcmsocG1fd3EsICZod2Jsa193b3JrKTsKIH0KIAotaW50IHBsYXRmb3JtX3BtX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGRlZmF1bHRfcGxhdGZvcm1fcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IHBkZXZfYXJjaGRhdGEgKmFkID0gJnBkZXYtPmFyY2hkYXRhOwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAJaW50IGh3YmxrID0gYWQtPmh3YmxrX2lkOwogCWludCByZXQgPSAwOwogCi0JZGV2X2RiZyhkZXYsICJwbGF0Zm9ybV9wbV9ydW50aW1lX3N1c3BlbmQoKSBbJWRdXG4iLCBod2Jsayk7CisJZGV2X2RiZyhkZXYsICIlcygpIFslZF1cbiIsIF9fZnVuY19fLCBod2Jsayk7CiAKIAkvKiBpZ25vcmUgb2ZmLWNoaXAgcGxhdGZvcm0gZGV2aWNlcyAqLwogCWlmICghaHdibGspCkBAIC0xODMsMjAgKzE4MywyMCBAQAogCW11dGV4X3VubG9jaygmYWQtPm11dGV4KTsKIAogb3V0OgotCWRldl9kYmcoZGV2LCAicGxhdGZvcm1fcG1fcnVudGltZV9zdXNwZW5kKCkgWyVkXSByZXR1cm5zICVkXG4iLAotCQlod2JsaywgcmV0KTsKKwlkZXZfZGJnKGRldiwgIiVzKCkgWyVkXSByZXR1cm5zICVkXG4iLAorCQkgX19mdW5jX18sIGh3YmxrLCByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHBsYXRmb3JtX3BtX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgZGVmYXVsdF9wbGF0Zm9ybV9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwogCXN0cnVjdCBwZGV2X2FyY2hkYXRhICphZCA9ICZwZGV2LT5hcmNoZGF0YTsKIAlpbnQgaHdibGsgPSBhZC0+aHdibGtfaWQ7CiAJaW50IHJldCA9IDA7CiAKLQlkZXZfZGJnKGRldiwgInBsYXRmb3JtX3BtX3J1bnRpbWVfcmVzdW1lKCkgWyVkXVxuIiwgaHdibGspOworCWRldl9kYmcoZGV2LCAiJXMoKSBbJWRdXG4iLCBfX2Z1bmNfXywgaHdibGspOwogCiAJLyogaWdub3JlIG9mZi1jaGlwIHBsYXRmb3JtIGRldmljZXMgKi8KIAlpZiAoIWh3YmxrKQpAQCAtMjI4LDE5ICsyMjgsMTkgQEAKIAkgKi8KIAltdXRleF91bmxvY2soJmFkLT5tdXRleCk7CiBvdXQ6Ci0JZGV2X2RiZyhkZXYsICJwbGF0Zm9ybV9wbV9ydW50aW1lX3Jlc3VtZSgpIFslZF0gcmV0dXJucyAlZFxuIiwKLQkJaHdibGssIHJldCk7CisJZGV2X2RiZyhkZXYsICIlcygpIFslZF0gcmV0dXJucyAlZFxuIiwKKwkJX19mdW5jX18sIGh3YmxrLCByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHBsYXRmb3JtX3BtX3J1bnRpbWVfaWRsZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGRlZmF1bHRfcGxhdGZvcm1fcnVudGltZV9pZGxlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJaW50IGh3YmxrID0gcGRldi0+YXJjaGRhdGEuaHdibGtfaWQ7CiAJaW50IHJldCA9IDA7CiAKLQlkZXZfZGJnKGRldiwgInBsYXRmb3JtX3BtX3J1bnRpbWVfaWRsZSgpIFslZF1cbiIsIGh3YmxrKTsKKwlkZXZfZGJnKGRldiwgIiVzKCkgWyVkXVxuIiwgX19mdW5jX18sIGh3YmxrKTsKIAogCS8qIGlnbm9yZSBvZmYtY2hpcCBwbGF0Zm9ybSBkZXZpY2VzICovCiAJaWYgKCFod2JsaykKQEAgLTI1MiwxMCArMjUyLDE5IEBACiAJLyogc3VzcGVuZCBzeW5jaHJvbm91c2x5IHRvIGRpc2FibGUgY2xvY2tzIGltbWVkaWF0ZWx5ICovCiAJcmV0ID0gcG1fcnVudGltZV9zdXNwZW5kKGRldik7CiBvdXQ6Ci0JZGV2X2RiZyhkZXYsICJwbGF0Zm9ybV9wbV9ydW50aW1lX2lkbGUoKSBbJWRdIGRvbmUhXG4iLCBod2Jsayk7CisJZGV2X2RiZyhkZXYsICIlcygpIFslZF0gZG9uZSFcbiIsIF9fZnVuY19fLCBod2Jsayk7CiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHN0cnVjdCBkZXZfcG93ZXJfZG9tYWluIGRlZmF1bHRfcG93ZXJfZG9tYWluID0geworCS5vcHMgPSB7CisJCS5ydW50aW1lX3N1c3BlbmQgPSBkZWZhdWx0X3BsYXRmb3JtX3J1bnRpbWVfc3VzcGVuZCwKKwkJLnJ1bnRpbWVfcmVzdW1lID0gZGVmYXVsdF9wbGF0Zm9ybV9ydW50aW1lX3Jlc3VtZSwKKwkJLnJ1bnRpbWVfaWRsZSA9IGRlZmF1bHRfcGxhdGZvcm1fcnVudGltZV9pZGxlLAorCQlVU0VfUExBVEZPUk1fUE1fU0xFRVBfT1BTCisJfSwKK307CisKIHN0YXRpYyBpbnQgcGxhdGZvcm1fYnVzX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpkYXRhKQogewpAQCAtMjc2LDYgKzI4NSw3IEBACiAJCWh3YmxrX2Rpc2FibGUoaHdibGtfaW5mbywgaHdibGspOwogCQkvKiBtYWtlIHN1cmUgZHJpdmVyIHJlLWluaXRzIGl0c2VsZiBvbmNlICovCiAJCV9fc2V0X2JpdChQREVWX0FSQ0hEQVRBX0ZMQUdfSU5JVCwgJnBkZXYtPmFyY2hkYXRhLmZsYWdzKTsKKwkJZGV2LT5wd3JfZG9tYWluID0gJmRlZmF1bHRfcG93ZXJfZG9tYWluOwogCQlicmVhazsKIAkvKiBUT0RPOiBhZGQgQlVTX05PVElGWV9CSU5EX0RSSVZFUiBhbmQgaW5jcmVhc2UgaWRsZSBjb3VudCAqLwogCWNhc2UgQlVTX05PVElGWV9CT1VORF9EUklWRVI6CkBAIC0yODksNiArMjk5LDcgQEAKIAkJX19zZXRfYml0KFBERVZfQVJDSERBVEFfRkxBR19JTklULCAmcGRldi0+YXJjaGRhdGEuZmxhZ3MpOwogCQlicmVhazsKIAljYXNlIEJVU19OT1RJRllfREVMX0RFVklDRToKKwkJZGV2LT5wd3JfZG9tYWluID0gTlVMTDsKIAkJYnJlYWs7CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvc21wLmMgYi9hcmNoL3NoL2tlcm5lbC9zbXAuYwppbmRleCA1MDliMzZiLi42MjA3NTYxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9zbXAuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CkBAIC0zMjMsNiArMzI0LDcgQEAKIAkJZ2VuZXJpY19zbXBfY2FsbF9mdW5jdGlvbl9pbnRlcnJ1cHQoKTsKIAkJYnJlYWs7CiAJY2FzZSBTTVBfTVNHX1JFU0NIRURVTEU6CisJCXNjaGVkdWxlcl9pcGkoKTsKIAkJYnJlYWs7CiAJY2FzZSBTTVBfTVNHX0ZVTkNUSU9OX1NJTkdMRToKIAkJZ2VuZXJpY19zbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGVfaW50ZXJydXB0KCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC90cmFwc18zMi5jIGIvYXJjaC9zaC9rZXJuZWwvdHJhcHNfMzIuYwppbmRleCAzNDg0YzJmLi5iNTFhMTcxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC90cmFwc18zMi5jCisrKyBiL2FyY2gvc2gva2VybmVsL3RyYXBzXzMyLmMKQEAgLTg3LDcgKzg3LDYgQEAKIAlidXN0X3NwaW5sb2NrcygxKTsKIAogCXByaW50aygiJXM6ICUwNGx4IFsjJWRdXG4iLCBzdHIsIGVyciAmIDB4ZmZmZiwgKytkaWVfY291bnRlcik7Ci0Jc3lzZnNfcHJpbnRrX2xhc3RfZmlsZSgpOwogCXByaW50X21vZHVsZXMoKTsKIAlzaG93X3JlZ3MocmVncyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vanVtcF9sYWJlbC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9qdW1wX2xhYmVsLmgKaW5kZXggNDI3ZDQ2OC4uZmM3M2E4MiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9qdW1wX2xhYmVsLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9qdW1wX2xhYmVsLmgKQEAgLTcsMTcgKzcsMjAgQEAKIAogI2RlZmluZSBKVU1QX0xBQkVMX05PUF9TSVpFIDQKIAotI2RlZmluZSBKVU1QX0xBQkVMKGtleSwgbGFiZWwpCQkJCQlcCi0JZG8gewkJCQkJCQlcCi0JCWFzbSBnb3RvKCIxOlxuXHQiCQkJCVwKLQkJCSAibm9wXG5cdCIJCQkJXAotCQkJICJub3Bcblx0IgkJCQlcCi0JCQkgIi5wdXNoc2VjdGlvbiBfX2p1bXBfdGFibGUsICBcImFcIlxuXHQiXAotCQkJICIuYWxpZ24gNFxuXHQiCQkJCVwKLQkJCSAiLndvcmQgMWIsICVsWyIgI2xhYmVsICJdLCAlYzBcblx0IglcCi0JCQkgIi5wb3BzZWN0aW9uIFxuXHQiCQkJXAotCQkJIDogOiAgImkiIChrZXkpIDogIDogbGFiZWwpO1wKLQl9IHdoaWxlICgwKQorc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIGFyY2hfc3RhdGljX2JyYW5jaChzdHJ1Y3QganVtcF9sYWJlbF9rZXkgKmtleSkKK3sKKwkJYXNtIGdvdG8oIjE6XG5cdCIKKwkJCSAibm9wXG5cdCIKKwkJCSAibm9wXG5cdCIKKwkJCSAiLnB1c2hzZWN0aW9uIF9fanVtcF90YWJsZSwgIFwiYXdcIlxuXHQiCisJCQkgIi5hbGlnbiA0XG5cdCIKKwkJCSAiLndvcmQgMWIsICVsW2xfeWVzXSwgJWMwXG5cdCIKKwkJCSAiLnBvcHNlY3Rpb24gXG5cdCIKKwkJCSA6IDogICJpIiAoa2V5KSA6IDogbF95ZXMpOworCXJldHVybiBmYWxzZTsKK2xfeWVzOgorCXJldHVybiB0cnVlOworfQogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3RvcG9sb2d5XzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3RvcG9sb2d5XzY0LmgKaW5kZXggMWM3OWYzMi4uOGI5YzU1NiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90b3BvbG9neV82NC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdG9wb2xvZ3lfNjQuaApAQCAtNjUsNiArNjUsMTAgQEAKICNkZWZpbmUgc210X2NhcGFibGUoKQkJCQkoc3BhcmM2NF9tdWx0aV9jb3JlKQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAotI2RlZmluZSBjcHVfY29yZWdyb3VwX21hc2soY3B1KQkJCSgmY3B1X2NvcmVfbWFwW2NwdV0pCitleHRlcm4gY3B1bWFza190IGNwdV9jb3JlX21hcFtOUl9DUFVTXTsKK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9jb3JlZ3JvdXBfbWFzayhpbnQgY3B1KQoreworICAgICAgICByZXR1cm4gJmNwdV9jb3JlX21hcFtjcHVdOworfQogCiAjZW5kaWYgLyogX0FTTV9TUEFSQzY0X1RPUE9MT0dZX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3NtcF8zMi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc21wXzMyLmMKaW5kZXggODUwYTEzNi4uNDQyMjg2ZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc21wXzMyLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc21wXzMyLmMKQEAgLTEyOSw3ICsxMjksOSBAQAogCiB2b2lkIHNtcF9zZW5kX3Jlc2NoZWR1bGUoaW50IGNwdSkKIHsKLQkvKiBTZWUgc3BhcmM2NCAqLworCS8qCisJICogWFhYIG1pc3NpbmcgcmVzY2hlZHVsZSBJUEksIHNlZSBzY2hlZHVsZXJfaXBpKCkKKwkgKi8KIH0KIAogdm9pZCBzbXBfc2VuZF9zdG9wKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3NtcF82NC5jCmluZGV4IDNlOTRhOGMuLjk0NzhkYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3NtcF82NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3NtcF82NC5jCkBAIC0xMzY4LDYgKzEzNjgsNyBAQAogdm9pZCBfX2lycV9lbnRyeSBzbXBfcmVjZWl2ZV9zaWduYWxfY2xpZW50KGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWNsZWFyX3NvZnRpbnQoMSA8PCBpcnEpOworCXNjaGVkdWxlcl9pcGkoKTsKIH0KIAogLyogVGhpcyBpcyBhIG5vcCBiZWNhdXNlIHdlIGNhcHR1cmUgYWxsIG90aGVyIGNwdXMKZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9rZXJuZWwvc21wLmMgYi9hcmNoL3RpbGUva2VybmVsL3NtcC5jCmluZGV4IGE0MjkzMTAuLmM1MjIyNGQgMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC90aWxlL2tlcm5lbC9zbXAuYwpAQCAtMTg5LDEyICsxODksOCBAQAogLyogQ2FsbGVkIHdoZW4gc21wX3NlbmRfcmVzY2hlZHVsZSgpIHRyaWdnZXJzIElSUV9SRVNDSEVEVUxFLiAqLwogc3RhdGljIGlycXJldHVybl90IGhhbmRsZV9yZXNjaGVkdWxlX2lwaShpbnQgaXJxLCB2b2lkICp0b2tlbikKIHsKLQkvKgotCSAqIE5vdGhpbmcgdG8gZG8gaGVyZTsgd2hlbiB3ZSByZXR1cm4gZnJvbSBpbnRlcnJ1cHQsIHRoZQotCSAqIHJlc2NoZWR1bGluZyB3aWxsIG9jY3VyIHRoZXJlLiBCdXQgZG8gYnVtcCB0aGUgaW50ZXJydXB0Ci0JICogcHJvZmlsZXIgY291bnQgaW4gdGhlIG1lYW50aW1lLgotCSAqLwogCV9fZ2V0X2NwdV92YXIoaXJxX3N0YXQpLmlycV9yZXNjaGVkX2NvdW50Kys7CisJc2NoZWR1bGVyX2lwaSgpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc21wLmMgYi9hcmNoL3VtL2tlcm5lbC9zbXAuYwppbmRleCAxMDZiZjI3Li5lZWZiMTA3IDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3VtL2tlcm5lbC9zbXAuYwpAQCAtMTczLDcgKzE3Myw3IEBACiAJCQlicmVhazsKIAogCQljYXNlICdSJzoKLQkJCXNldF90c2tfbmVlZF9yZXNjaGVkKGN1cnJlbnQpOworCQkJc2NoZWR1bGVyX2lwaSgpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSAnUyc6CmRpZmYgLS1naXQgYS9hcmNoL3VuaWNvcmUzMi9rZXJuZWwvaXJxLmMgYi9hcmNoL3VuaWNvcmUzMi9rZXJuZWwvaXJxLmMKaW5kZXggMmFhMzBhMy4uZDRlZmE3ZCAxMDA2NDQKLS0tIGEvYXJjaC91bmljb3JlMzIva2VybmVsL2lycS5jCisrKyBiL2FyY2gvdW5pY29yZTMyL2tlcm5lbC9pcnEuYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTIzNyw3ICsyMzcsNyBAQAogCXVuc2lnbmVkIGludAlpY2NyOwogfSBwdXYzX2lycV9zdGF0ZTsKIAotc3RhdGljIGludCBwdXYzX2lycV9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgcHV2M19pcnFfc3VzcGVuZCh2b2lkKQogewogCXN0cnVjdCBwdXYzX2lycV9zdGF0ZSAqc3QgPSAmcHV2M19pcnFfc3RhdGU7CiAKQEAgLTI2NSw3ICsyNjUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHB1djNfaXJxX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgcHV2M19pcnFfcmVzdW1lKHZvaWQpCiB7CiAJc3RydWN0IHB1djNfaXJxX3N0YXRlICpzdCA9ICZwdXYzX2lycV9zdGF0ZTsKIApAQCAtMjc4LDI3ICsyNzgsMjAgQEAKIAogCQl3cml0ZWwoc3QtPmljbXIsIElOVENfSUNNUik7CiAJfQotCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBwdXYzX2lycV9zeXNjbGFzcyA9IHsKLQkubmFtZQkJPSAicGt1bml0eS1pcnEiLAorc3RhdGljIHN0cnVjdCBzeXNjb3JlX29wcyBwdXYzX2lycV9zeXNjb3JlX29wcyA9IHsKIAkuc3VzcGVuZAk9IHB1djNfaXJxX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSBwdXYzX2lycV9yZXN1bWUsCiB9OwogCi1zdGF0aWMgc3RydWN0IHN5c19kZXZpY2UgcHV2M19pcnFfZGV2aWNlID0gewotCS5pZAkJPSAwLAotCS5jbHMJCT0gJnB1djNfaXJxX3N5c2NsYXNzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgcHV2M19pcnFfaW5pdF9kZXZpY2Vmcyh2b2lkKQorc3RhdGljIGludCBfX2luaXQgcHV2M19pcnFfaW5pdF9zeXNjb3JlKHZvaWQpCiB7Ci0Jc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZwdXYzX2lycV9zeXNjbGFzcyk7Ci0JcmV0dXJuIHN5c2Rldl9yZWdpc3RlcigmcHV2M19pcnFfZGV2aWNlKTsKKwlyZWdpc3Rlcl9zeXNjb3JlX29wcygmcHV2M19pcnFfc3lzY29yZV9vcHMpOworCXJldHVybiAwOwogfQogCi1kZXZpY2VfaW5pdGNhbGwocHV2M19pcnFfaW5pdF9kZXZpY2Vmcyk7CitkZXZpY2VfaW5pdGNhbGwocHV2M19pcnFfaW5pdF9zeXNjb3JlKTsKIAogdm9pZCBfX2luaXQgaW5pdF9JUlEodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvdW5pY29yZTMyL2tlcm5lbC90cmFwcy5jIGIvYXJjaC91bmljb3JlMzIva2VybmVsL3RyYXBzLmMKaW5kZXggMjU0ZTM2Zi4uYjlhMjY0NiAxMDA2NDQKLS0tIGEvYXJjaC91bmljb3JlMzIva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC91bmljb3JlMzIva2VybmVsL3RyYXBzLmMKQEAgLTE5Miw3ICsxOTIsNiBAQAogCiAJcHJpbnRrKEtFUk5fRU1FUkcgIkludGVybmFsIGVycm9yOiAlczogJXggWyMlZF1cbiIsCiAJICAgICAgIHN0ciwgZXJyLCArK2RpZV9jb3VudGVyKTsKLQlzeXNmc19wcmludGtfbGFzdF9maWxlKCk7CiAKIAkvKiB0cmFwIGFuZCBlcnJvciBudW1iZXJzIGFyZSBtb3N0bHkgbWVhbmluZ2xlc3Mgb24gVW5pQ29yZSAqLwogCXJldCA9IG5vdGlmeV9kaWUoRElFX09PUFMsIHN0ciwgcmVncywgZXJyLCB0c2stPnRocmVhZC50cmFwX25vLCBcCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9LY29uZmlnIGIvYXJjaC94ODYvS2NvbmZpZwppbmRleCBjYzZjNTNhLi40MTY4ZTVkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9LY29uZmlnCisrKyBiL2FyY2gveDg2L0tjb25maWcKQEAgLTgsNiArOCw3IEBACiAKIGNvbmZpZyBYODZfMzIKIAlkZWZfYm9vbCAhNjRCSVQKKwlzZWxlY3QgQ0xLU1JDX0k4MjUzCiAKIGNvbmZpZyBYODZfNjQKIAlkZWZfYm9vbCA2NEJJVApAQCAtNzEsNyArNzIsNiBAQAogCXNlbGVjdCBHRU5FUklDX0lSUV9TSE9XCiAJc2VsZWN0IElSUV9GT1JDRURfVEhSRUFESU5HCiAJc2VsZWN0IFVTRV9HRU5FUklDX1NNUF9IRUxQRVJTIGlmIFNNUAotCXNlbGVjdCBBUkNIX05PX1NZU0RFVl9PUFMKIAogY29uZmlnIElOU1RSVUNUSU9OX0RFQ09ERVIKIAlkZWZfYm9vbCAoS1BST0JFUyB8fCBQRVJGX0VWRU5UUykKQEAgLTExMiw3ICsxMTIsMTQgQEAKIAlkZWZfYm9vbCB5CiAKIGNvbmZpZyBaT05FX0RNQQotCWRlZl9ib29sIHkKKwlib29sICJETUEgbWVtb3J5IGFsbG9jYXRpb24gc3VwcG9ydCIgaWYgRVhQRVJUCisJZGVmYXVsdCB5CisJaGVscAorCSAgRE1BIG1lbW9yeSBhbGxvY2F0aW9uIHN1cHBvcnQgYWxsb3dzIGRldmljZXMgd2l0aCBsZXNzIHRoYW4gMzItYml0CisJICBhZGRyZXNzaW5nIHRvIGFsbG9jYXRlIHdpdGhpbiB0aGUgZmlyc3QgMTZNQiBvZiBhZGRyZXNzIHNwYWNlLgorCSAgRGlzYWJsZSBpZiBubyBzdWNoIGRldmljZXMgd2lsbCBiZSB1c2VkLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgogCiBjb25maWcgU0JVUwogCWJvb2wKQEAgLTM2NSwxNyArMzcyLDYgQEAKICMgRm9sbG93aW5nIGlzIGFuIGFscGhhYmV0aWNhbGx5IHNvcnRlZCBsaXN0IG9mIDMyIGJpdCBleHRlbmRlZCBwbGF0Zm9ybXMKICMgUGxlYXNlIG1haW50YWluIHRoZSBhbHBoYWJldGljIG9yZGVyIGlmIGFuZCB3aGVuIHRoZXJlIGFyZSBhZGRpdGlvbnMKIAotY29uZmlnIFg4Nl9FTEFOCi0JYm9vbCAiQU1EIEVsYW4iCi0JZGVwZW5kcyBvbiBYODZfMzIKLQlkZXBlbmRzIG9uIFg4Nl9FWFRFTkRFRF9QTEFURk9STQotCS0tLWhlbHAtLS0KLQkgIFNlbGVjdCB0aGlzIGZvciBhbiBBTUQgRWxhbiBwcm9jZXNzb3IuCi0KLQkgIERvIG5vdCB1c2UgdGhpcyBvcHRpb24gZm9yIEs2L0F0aGxvbi9PcHRlcm9uIHByb2Nlc3NvcnMhCi0KLQkgIElmIHVuc3VyZSwgY2hvb3NlICJQQy1jb21wYXRpYmxlIiBpbnN0ZWFkLgotCiBjb25maWcgWDg2X0lOVEVMX0NFCiAJYm9vbCAiQ0U0MTAwIFRWIHBsYXRmb3JtIgogCWRlcGVuZHMgb24gUENJCkBAIC02OTAsNiArNjg2LDcgQEAKIAlib29sICJBTUQgSU9NTVUgc3VwcG9ydCIKIAlzZWxlY3QgU1dJT1RMQgogCXNlbGVjdCBQQ0lfTVNJCisJc2VsZWN0IFBDSV9JT1YKIAlkZXBlbmRzIG9uIFg4Nl82NCAmJiBQQ0kgJiYgQUNQSQogCS0tLWhlbHAtLS0KIAkgIFdpdGggdGhpcyBvcHRpb24geW91IGNhbiBlbmFibGUgc3VwcG9ydCBmb3IgQU1EIElPTU1VIGhhcmR3YXJlIGluCkBAIC0xMTc0LDcgKzExNzEsNyBAQAogY29uZmlnIEFNRF9OVU1BCiAJZGVmX2Jvb2wgeQogCXByb21wdCAiT2xkIHN0eWxlIEFNRCBPcHRlcm9uIE5VTUEgZGV0ZWN0aW9uIgotCWRlcGVuZHMgb24gWDg2XzY0ICYmIE5VTUEgJiYgUENJCisJZGVwZW5kcyBvbiBOVU1BICYmIFBDSQogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBBTUQgTlVNQSBub2RlIHRvcG9sb2d5IGRldGVjdGlvbi4gIFlvdSBzaG91bGQgc2F5IFkgaGVyZSBpZgogCSAgeW91IGhhdmUgYSBtdWx0aSBwcm9jZXNzb3IgQU1EIHN5c3RlbS4gVGhpcyB1c2VzIGFuIG9sZCBtZXRob2QgdG8KQEAgLTEyMDEsNyArMTE5OCw3IEBACiAKIGNvbmZpZyBOVU1BX0VNVQogCWJvb2wgIk5VTUEgZW11bGF0aW9uIgotCWRlcGVuZHMgb24gWDg2XzY0ICYmIE5VTUEKKwlkZXBlbmRzIG9uIE5VTUEKIAktLS1oZWxwLS0tCiAJICBFbmFibGUgTlVNQSBlbXVsYXRpb24uIEEgZmxhdCBtYWNoaW5lIHdpbGwgYmUgc3BsaXQKIAkgIGludG8gdmlydHVhbCBub2RlcyB3aGVuIGJvb3RlZCB3aXRoICJudW1hPWZha2U9TiIsIHdoZXJlIE4gaXMgdGhlCkBAIC0xMjIzLDYgKzEyMjAsMTAgQEAKIAlkZWZfYm9vbCB5CiAJZGVwZW5kcyBvbiBYODZfMzIgJiYgTlVNQQogCitjb25maWcgSEFWRV9BUkNIX0FMTE9DX1JFTUFQCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gWDg2XzMyICYmIE5VTUEKKwogY29uZmlnIEFSQ0hfSEFWRV9NRU1PUllfUFJFU0VOVAogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIFg4Nl8zMiAmJiBESVNDT05USUdNRU0KQEAgLTEyMzEsMTMgKzEyMzIsOSBAQAogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIFg4Nl8zMiAmJiAoRElTQ09OVElHTUVNIHx8IFNQQVJTRU1FTSkKIAotY29uZmlnIEhBVkVfQVJDSF9BTExPQ19SRU1BUAotCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIFg4Nl8zMiAmJiBOVU1BCi0KIGNvbmZpZyBBUkNIX0ZMQVRNRU1fRU5BQkxFCiAJZGVmX2Jvb2wgeQotCWRlcGVuZHMgb24gWDg2XzMyICYmIEFSQ0hfU0VMRUNUX01FTU9SWV9NT0RFTCAmJiAhTlVNQQorCWRlcGVuZHMgb24gWDg2XzMyICYmICFOVU1BCiAKIGNvbmZpZyBBUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUKIAlkZWZfYm9vbCB5CkBAIC0xMjQ3LDIwICsxMjQ0LDE2IEBACiAJZGVmX2Jvb2wgeQogCWRlcGVuZHMgb24gTlVNQSAmJiBYODZfMzIKIAotY29uZmlnIEFSQ0hfUFJPQ19LQ09SRV9URVhUCi0JZGVmX2Jvb2wgeQotCWRlcGVuZHMgb24gWDg2XzY0ICYmIFBST0NfS0NPUkUKLQotY29uZmlnIEFSQ0hfU1BBUlNFTUVNX0RFRkFVTFQKLQlkZWZfYm9vbCB5Ci0JZGVwZW5kcyBvbiBYODZfNjQKLQogY29uZmlnIEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIFg4Nl82NCB8fCBOVU1BIHx8IChFWFBFUklNRU5UQUwgJiYgWDg2XzMyKSB8fCBYODZfMzJfTk9OX1NUQU5EQVJECiAJc2VsZWN0IFNQQVJTRU1FTV9TVEFUSUMgaWYgWDg2XzMyCiAJc2VsZWN0IFNQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpZiBYODZfNjQKIAorY29uZmlnIEFSQ0hfU1BBUlNFTUVNX0RFRkFVTFQKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBYODZfNjQKKwogY29uZmlnIEFSQ0hfU0VMRUNUX01FTU9SWV9NT0RFTAogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQpAQCAtMTI2OSw2ICsxMjYyLDEwIEBACiAJZGVmX2Jvb2wgWDg2XzY0CiAJZGVwZW5kcyBvbiBNRU1PUllfSE9UUExVRwogCitjb25maWcgQVJDSF9QUk9DX0tDT1JFX1RFWFQKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBYODZfNjQgJiYgUFJPQ19LQ09SRQorCiBjb25maWcgSUxMRUdBTF9QT0lOVEVSX1ZBTFVFCiAgICAgICAgaGV4CiAgICAgICAgZGVmYXVsdCAwIGlmIFg4Nl8zMgpAQCAtMTcwMywxMCArMTcwMCw2IEBACiAJZGVmX2Jvb2wgeQogCWRlcGVuZHMgb24gTUVNT1JZX0hPVFBMVUcKIAotY29uZmlnIEhBVkVfQVJDSF9FQVJMWV9QRk5fVE9fTklECi0JZGVmX2Jvb2wgWDg2XzY0Ci0JZGVwZW5kcyBvbiBOVU1BCi0KIGNvbmZpZyBVU0VfUEVSQ1BVX05VTUFfTk9ERV9JRAogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIE5VTUEKQEAgLTE4NDgsNyArMTg0MSw3IEBACiAKIGVuZGlmICMgQVBNCiAKLXNvdXJjZSAiYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvY3B1ZnJlcS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvY3B1aWRsZS9LY29uZmlnIgogCkBAIC0yMDc2LDcgKzIwNjksNyBAQAogCWRlcGVuZHMgb24gIVg4Nl9QQUUKIAlzZWxlY3QgR1BJT0xJQgogCXNlbGVjdCBPRgotCXNlbGVjdCBPRl9QUk9NVFJFRSBpZiBQUk9DX0RFVklDRVRSRUUKKwlzZWxlY3QgT0ZfUFJPTVRSRUUKIAktLS1oZWxwLS0tCiAJICBBZGQgc3VwcG9ydCBmb3IgZGV0ZWN0aW5nIHRoZSB1bmlxdWUgZmVhdHVyZXMgb2YgdGhlIE9MUEMKIAkgIFhPIGhhcmR3YXJlLgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvS2NvbmZpZy5jcHUgYi9hcmNoL3g4Ni9LY29uZmlnLmNwdQppbmRleCBkMTYxZTkzLi42YTdjZmRmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9LY29uZmlnLmNwdQorKysgYi9hcmNoL3g4Ni9LY29uZmlnLmNwdQpAQCAtMSw2ICsxLDQgQEAKICMgUHV0IGhlcmUgb3B0aW9uIGZvciBDUFUgc2VsZWN0aW9uIGFuZCBkZXBlbmRpbmcgb3B0aW1pemF0aW9uCi1pZiAhWDg2X0VMQU4KLQogY2hvaWNlCiAJcHJvbXB0ICJQcm9jZXNzb3IgZmFtaWx5IgogCWRlZmF1bHQgTTY4NiBpZiBYODZfMzIKQEAgLTIwMyw2ICsyMDEsMTQgQEAKIAkgIHN0b3JlcyBmb3IgdGhpcyBDUFUsIHdoaWNoIGNhbiBpbmNyZWFzZSBwZXJmb3JtYW5jZSBvZiBzb21lCiAJICBvcGVyYXRpb25zLgogCitjb25maWcgTUVMQU4KKwlib29sICJBTUQgRWxhbiIKKwlkZXBlbmRzIG9uIFg4Nl8zMgorCS0tLWhlbHAtLS0KKwkgIFNlbGVjdCB0aGlzIGZvciBhbiBBTUQgRWxhbiBwcm9jZXNzb3IuCisKKwkgIERvIG5vdCB1c2UgdGhpcyBvcHRpb24gZm9yIEs2L0F0aGxvbi9PcHRlcm9uIHByb2Nlc3NvcnMhCisKIGNvbmZpZyBNR0VPREVHWDEKIAlib29sICJHZW9kZUdYMSIKIAlkZXBlbmRzIG9uIFg4Nl8zMgpAQCAtMjkyLDggKzI5OCw2IEBACiAJICBUaGlzIGlzIHJlYWxseSBpbnRlbmRlZCBmb3IgZGlzdHJpYnV0b3JzIHdobyBuZWVkIG1vcmUKIAkgIGdlbmVyaWMgb3B0aW1pemF0aW9ucy4KIAotZW5kaWYKLQogIwogIyBEZWZpbmUgaW1wbGllZCBvcHRpb25zIGZyb20gdGhlIENQVSBzZWxlY3Rpb24gaGVyZQogY29uZmlnIFg4Nl9JTlRFUk5PREVfQ0FDSEVfU0hJRlQKQEAgLTMxMiw3ICszMTYsNyBAQAogCWludAogCWRlZmF1bHQgIjciIGlmIE1QRU5USVVNNCB8fCBNUFNDCiAJZGVmYXVsdCAiNiIgaWYgTUs3IHx8IE1LOCB8fCBNUEVOVElVTU0gfHwgTUNPUkUyIHx8IE1BVE9NIHx8IE1WSUFDNyB8fCBYODZfR0VORVJJQyB8fCBHRU5FUklDX0NQVQotCWRlZmF1bHQgIjQiIGlmIFg4Nl9FTEFOIHx8IE00ODYgfHwgTTM4NiB8fCBNR0VPREVHWDEKKwlkZWZhdWx0ICI0IiBpZiBNRUxBTiB8fCBNNDg2IHx8IE0zODYgfHwgTUdFT0RFR1gxCiAJZGVmYXVsdCAiNSIgaWYgTVdJTkNISVAzRCB8fCBNV0lOQ0hJUEM2IHx8IE1DUlVTT0UgfHwgTUVGRklDRU9OIHx8IE1DWVJJWElJSSB8fCBNSzYgfHwgTVBFTlRJVU1JSUkgfHwgTVBFTlRJVU1JSSB8fCBNNjg2IHx8IE01ODZNTVggfHwgTTU4NlRTQyB8fCBNNTg2IHx8IE1WSUFDM18yIHx8IE1HRU9ERV9MWAogCiBjb25maWcgWDg2X1hBREQKQEAgLTM1OCw3ICszNjIsNyBAQAogCiBjb25maWcgWDg2X0FMSUdOTUVOVF8xNgogCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIE1XSU5DSElQM0QgfHwgTVdJTkNISVBDNiB8fCBNQ1lSSVhJSUkgfHwgWDg2X0VMQU4gfHwgTUs2IHx8IE01ODZNTVggfHwgTTU4NlRTQyB8fCBNNTg2IHx8IE00ODYgfHwgTVZJQUMzXzIgfHwgTUdFT0RFR1gxCisJZGVwZW5kcyBvbiBNV0lOQ0hJUDNEIHx8IE1XSU5DSElQQzYgfHwgTUNZUklYSUlJIHx8IE1FTEFOIHx8IE1LNiB8fCBNNTg2TU1YIHx8IE01ODZUU0MgfHwgTTU4NiB8fCBNNDg2IHx8IE1WSUFDM18yIHx8IE1HRU9ERUdYMQogCiBjb25maWcgWDg2X0lOVEVMX1VTRVJDT1BZCiAJZGVmX2Jvb2wgeQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvTWFrZWZpbGVfMzIuY3B1IGIvYXJjaC94ODYvTWFrZWZpbGVfMzIuY3B1CmluZGV4IGYyZWUxYWIuLjg2Y2VlN2IgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L01ha2VmaWxlXzMyLmNwdQorKysgYi9hcmNoL3g4Ni9NYWtlZmlsZV8zMi5jcHUKQEAgLTM3LDcgKzM3LDcgQEAKIAkkKGNhbGwgY2Mtb3B0aW9uLC1tdHVuZT1hdG9tLCQoY2FsbCBjYy1vcHRpb24sLW10dW5lPWdlbmVyaWMpKQogCiAjIEFNRCBFbGFuIHN1cHBvcnQKLWNmbGFncy0kKENPTkZJR19YODZfRUxBTikJKz0gLW1hcmNoPWk0ODYKK2NmbGFncy0kKENPTkZJR19NRUxBTikJCSs9IC1tYXJjaD1pNDg2CiAKICMgR2VvZGUgR1gxIHN1cHBvcnQKIGNmbGFncy0kKENPTkZJR19NR0VPREVHWDEpCSs9IC1tYXJjaD1wZW50aXVtLW1teApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYWNwaS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYWNwaS5oCmluZGV4IDEyZTBlN2QuLjQxNmQ4NjUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FjcGkuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hY3BpLmgKQEAgLTE4Myw4ICsxODMsNiBAQAogCiAjZGVmaW5lIEFSQ0hfSEFTX1BPV0VSX0lOSVQJMQogCi1zdHJ1Y3QgYm9vdG5vZGU7Ci0KICNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCiBleHRlcm4gaW50IGFjcGlfbnVtYTsKIGV4dGVybiBpbnQgeDg2X2FjcGlfbnVtYV9pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYWx0ZXJuYXRpdmUtYXNtLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS1hc20uaAppbmRleCBhNjNhNjhiLi45NGQ0MjBiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS1hc20uaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS1hc20uaApAQCAtMTUsNCArMTUsMTMgQEAKIAkuZW5kbQogI2VuZGlmCiAKKy5tYWNybyBhbHRpbnN0cnVjdGlvbl9lbnRyeSBvcmlnIGFsdCBmZWF0dXJlIG9yaWdfbGVuIGFsdF9sZW4KKwkuYWxpZ24gOAorCS5xdWFkIFxvcmlnCisJLnF1YWQgXGFsdAorCS53b3JkIFxmZWF0dXJlCisJLmJ5dGUgXG9yaWdfbGVuCisJLmJ5dGUgXGFsdF9sZW4KKy5lbmRtCisKICNlbmRpZiAgLyogIF9fQVNTRU1CTFlfXyAgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FsdGVybmF0aXZlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS5oCmluZGV4IDEzMDA5ZDEuLmJmNTM1ZjkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FsdGVybmF0aXZlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYWx0ZXJuYXRpdmUuaApAQCAtNCw3ICs0LDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgotI2luY2x1ZGUgPGxpbnV4L2p1bXBfbGFiZWwuaD4KICNpbmNsdWRlIDxhc20vYXNtLmg+CiAKIC8qCkBAIC0xOTEsMTIgKzE5MCw0IEBACiBleHRlcm4gdm9pZCAqdGV4dF9wb2tlX3NtcCh2b2lkICphZGRyLCBjb25zdCB2b2lkICpvcGNvZGUsIHNpemVfdCBsZW4pOwogZXh0ZXJuIHZvaWQgdGV4dF9wb2tlX3NtcF9iYXRjaChzdHJ1Y3QgdGV4dF9wb2tlX3BhcmFtICpwYXJhbXMsIGludCBuKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0RZTkFNSUNfRlRSQUNFKSB8fCBkZWZpbmVkKEhBVkVfSlVNUF9MQUJFTCkKLSNkZWZpbmUgSURFQUxfTk9QX1NJWkVfNSA1Ci1leHRlcm4gdW5zaWduZWQgY2hhciBpZGVhbF9ub3A1W0lERUFMX05PUF9TSVpFXzVdOwotZXh0ZXJuIHZvaWQgYXJjaF9pbml0X2lkZWFsX25vcDUodm9pZCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGFyY2hfaW5pdF9pZGVhbF9ub3A1KHZvaWQpIHt9Ci0jZW5kaWYKLQogI2VuZGlmIC8qIF9BU01fWDg2X0FMVEVSTkFUSVZFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FtZF9pb21tdV9wcm90by5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX2lvbW11X3Byb3RvLmgKaW5kZXggOTE2YmM4MS4uNTVkOTVlYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX2lvbW11X3Byb3RvLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX2lvbW11X3Byb3RvLmgKQEAgLTE5LDEzICsxOSwxMiBAQAogI2lmbmRlZiBfQVNNX1g4Nl9BTURfSU9NTVVfUFJPVE9fSAogI2RlZmluZSBfQVNNX1g4Nl9BTURfSU9NTVVfUFJPVE9fSAogCi1zdHJ1Y3QgYW1kX2lvbW11OworI2luY2x1ZGUgPGFzbS9hbWRfaW9tbXVfdHlwZXMuaD4KIAogZXh0ZXJuIGludCBhbWRfaW9tbXVfaW5pdF9kbWFfb3BzKHZvaWQpOwogZXh0ZXJuIGludCBhbWRfaW9tbXVfaW5pdF9wYXNzdGhyb3VnaCh2b2lkKTsKK2V4dGVybiBpcnFyZXR1cm5fdCBhbWRfaW9tbXVfaW50X3RocmVhZChpbnQgaXJxLCB2b2lkICpkYXRhKTsKIGV4dGVybiBpcnFyZXR1cm5fdCBhbWRfaW9tbXVfaW50X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSk7Ci1leHRlcm4gdm9pZCBhbWRfaW9tbXVfZmx1c2hfYWxsX2RvbWFpbnModm9pZCk7Ci1leHRlcm4gdm9pZCBhbWRfaW9tbXVfZmx1c2hfYWxsX2RldmljZXModm9pZCk7CiBleHRlcm4gdm9pZCBhbWRfaW9tbXVfYXBwbHlfZXJyYXR1bV82Myh1MTYgZGV2aWQpOwogZXh0ZXJuIHZvaWQgYW1kX2lvbW11X3Jlc2V0X2NtZF9idWZmZXIoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpOwogZXh0ZXJuIGludCBhbWRfaW9tbXVfaW5pdF9kZXZpY2VzKHZvaWQpOwpAQCAtNDQsNCArNDMsMTIgQEAKIAkgICAgICAgKHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1JEODkwX0lPTU1VKTsKIH0KIAorc3RhdGljIGlubGluZSBib29sIGlvbW11X2ZlYXR1cmUoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUsIHU2NCBmKQoreworCWlmICghKGlvbW11LT5jYXAgJiAoMSA8PCBJT01NVV9DQVBfRUZSKSkpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiAhIShpb21tdS0+ZmVhdHVyZXMgJiBmKTsKK30KKwogI2VuZGlmIC8qIF9BU01fWDg2X0FNRF9JT01NVV9QUk9UT19IICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX2lvbW11X3R5cGVzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbWRfaW9tbXVfdHlwZXMuaAppbmRleCBlMzUwOWZjLi40Yzk5ODI5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbWRfaW9tbXVfdHlwZXMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbWRfaW9tbXVfdHlwZXMuaApAQCAtNjgsMTIgKzY4LDI1IEBACiAjZGVmaW5lIE1NSU9fQ09OVFJPTF9PRkZTRVQgICAgIDB4MDAxOAogI2RlZmluZSBNTUlPX0VYQ0xfQkFTRV9PRkZTRVQgICAweDAwMjAKICNkZWZpbmUgTU1JT19FWENMX0xJTUlUX09GRlNFVCAgMHgwMDI4CisjZGVmaW5lIE1NSU9fRVhUX0ZFQVRVUkVTCTB4MDAzMAogI2RlZmluZSBNTUlPX0NNRF9IRUFEX09GRlNFVAkweDIwMDAKICNkZWZpbmUgTU1JT19DTURfVEFJTF9PRkZTRVQJMHgyMDA4CiAjZGVmaW5lIE1NSU9fRVZUX0hFQURfT0ZGU0VUCTB4MjAxMAogI2RlZmluZSBNTUlPX0VWVF9UQUlMX09GRlNFVAkweDIwMTgKICNkZWZpbmUgTU1JT19TVEFUVVNfT0ZGU0VUCTB4MjAyMAogCisKKy8qIEV4dGVuZGVkIEZlYXR1cmUgQml0cyAqLworI2RlZmluZSBGRUFUVVJFX1BSRUZFVENICSgxVUxMPDwwKQorI2RlZmluZSBGRUFUVVJFX1BQUgkJKDFVTEw8PDEpCisjZGVmaW5lIEZFQVRVUkVfWDJBUElDCQkoMVVMTDw8MikKKyNkZWZpbmUgRkVBVFVSRV9OWAkJKDFVTEw8PDMpCisjZGVmaW5lIEZFQVRVUkVfR1QJCSgxVUxMPDw0KQorI2RlZmluZSBGRUFUVVJFX0lBCQkoMVVMTDw8NikKKyNkZWZpbmUgRkVBVFVSRV9HQQkJKDFVTEw8PDcpCisjZGVmaW5lIEZFQVRVUkVfSEUJCSgxVUxMPDw4KQorI2RlZmluZSBGRUFUVVJFX1BDCQkoMVVMTDw8OSkKKwogLyogTU1JTyBzdGF0dXMgYml0cyAqLwogI2RlZmluZSBNTUlPX1NUQVRVU19DT01fV0FJVF9JTlRfTUFTSwkweDA0CiAKQEAgLTExMyw3ICsxMjYsOSBAQAogLyogY29tbWFuZCBzcGVjaWZpYyBkZWZpbmVzICovCiAjZGVmaW5lIENNRF9DT01QTF9XQUlUICAgICAgICAgIDB4MDEKICNkZWZpbmUgQ01EX0lOVl9ERVZfRU5UUlkgICAgICAgMHgwMgotI2RlZmluZSBDTURfSU5WX0lPTU1VX1BBR0VTICAgICAweDAzCisjZGVmaW5lIENNRF9JTlZfSU9NTVVfUEFHRVMJMHgwMworI2RlZmluZSBDTURfSU5WX0lPVExCX1BBR0VTCTB4MDQKKyNkZWZpbmUgQ01EX0lOVl9BTEwJCTB4MDgKIAogI2RlZmluZSBDTURfQ09NUExfV0FJVF9TVE9SRV9NQVNLCTB4MDEKICNkZWZpbmUgQ01EX0NPTVBMX1dBSVRfSU5UX01BU0sJCTB4MDIKQEAgLTIxNSw2ICsyMzAsOCBAQAogI2RlZmluZSBJT01NVV9QVEVfSVIgKDFVTEwgPDwgNjEpCiAjZGVmaW5lIElPTU1VX1BURV9JVyAoMVVMTCA8PCA2MikKIAorI2RlZmluZSBEVEVfRkxBR19JT1RMQgkweDAxCisKICNkZWZpbmUgSU9NTVVfUEFHRV9NQVNLICgoKDFVTEwgPDwgNTIpIC0gMSkgJiB+MHhmZmZVTEwpCiAjZGVmaW5lIElPTU1VX1BURV9QUkVTRU5UKHB0ZSkgKChwdGUpICYgSU9NTVVfUFRFX1ApCiAjZGVmaW5lIElPTU1VX1BURV9QQUdFKHB0ZSkgKHBoeXNfdG9fdmlydCgocHRlKSAmIElPTU1VX1BBR0VfTUFTSykpCkBAIC0yMjcsNiArMjQ0LDcgQEAKIC8qIElPTU1VIGNhcGFiaWxpdGllcyAqLwogI2RlZmluZSBJT01NVV9DQVBfSU9UTEIgICAyNAogI2RlZmluZSBJT01NVV9DQVBfTlBDQUNIRSAyNgorI2RlZmluZSBJT01NVV9DQVBfRUZSICAgICAyNwogCiAjZGVmaW5lIE1BWF9ET01BSU5fSUQgNjU1MzYKIApAQCAtMjQ5LDYgKzI2Nyw4IEBACiAKIC8qIGdsb2JhbCBmbGFnIGlmIElPTU1VcyBjYWNoZSBub24tcHJlc2VudCBlbnRyaWVzICovCiBleHRlcm4gYm9vbCBhbWRfaW9tbXVfbnBfY2FjaGU7CisvKiBPbmx5IHRydWUgaWYgYWxsIElPTU1VcyBzdXBwb3J0IGRldmljZSBJT1RMQnMgKi8KK2V4dGVybiBib29sIGFtZF9pb21tdV9pb3RsYl9zdXA7CiAKIC8qCiAgKiBNYWtlIGl0ZXJhdGluZyBvdmVyIGFsbCBJT01NVXMgZWFzaWVyCkBAIC0zNzEsNiArMzkxLDkgQEAKIAkvKiBmbGFncyByZWFkIGZyb20gYWNwaSB0YWJsZSAqLwogCXU4IGFjcGlfZmxhZ3M7CiAKKwkvKiBFeHRlbmRlZCBmZWF0dXJlcyAqLworCXU2NCBmZWF0dXJlczsKKwogCS8qCiAJICogQ2FwYWJpbGl0eSBwb2ludGVyLiBUaGVyZSBjb3VsZCBiZSBtb3JlIHRoYW4gb25lIElPTU1VIHBlciBQQ0kKIAkgKiBkZXZpY2UgZnVuY3Rpb24gaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgQU1EIElPTU1VIGNhcGFiaWxpdHkKQEAgLTQwOSw5ICs0MzIsNiBAQAogCS8qIGlmIG9uZSwgd2UgbmVlZCB0byBzZW5kIGEgY29tcGxldGlvbiB3YWl0IGNvbW1hbmQgKi8KIAlib29sIG5lZWRfc3luYzsKIAotCS8qIGJlY29tZXMgdHJ1ZSBpZiBhIGNvbW1hbmQgYnVmZmVyIHJlc2V0IGlzIHJ1bm5pbmcgKi8KLQlib29sIHJlc2V0X2luX3Byb2dyZXNzOwotCiAJLyogZGVmYXVsdCBkbWFfb3BzIGRvbWFpbiBmb3IgdGhhdCBJT01NVSAqLwogCXN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZGVmYXVsdF9kb207CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FtZF9uYi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX25iLmgKaW5kZXggMzMxNjgyMi4uNjdmODdmMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX25iLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX25iLmgKQEAgLTExLDcgKzExLDYgQEAKIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFtZF9uYl9taXNjX2lkc1tdOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhbWRfbmJfYnVzX2Rldl9yYW5nZSBhbWRfbmJfYnVzX2Rldl9yYW5nZXNbXTsKLXN0cnVjdCBib290bm9kZTsKIAogZXh0ZXJuIGJvb2wgZWFybHlfaXNfYW1kX25iKHUzMiB2YWx1ZSk7CiBleHRlcm4gaW50IGFtZF9jYWNoZV9ub3J0aGJyaWRnZXModm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGljLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGljLmgKaW5kZXggMmI3ZDU3My4uYTBjNDZmMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXBpYy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwaWMuaApAQCAtMzYzLDcgKzM2MywxMiBAQAogCSAqLwogCWludCAoKng4Nl8zMl9lYXJseV9sb2dpY2FsX2FwaWNpZCkoaW50IGNwdSk7CiAKLQkvKiBkZXRlcm1pbmUgQ1BVIC0+IE5VTUEgbm9kZSBtYXBwaW5nICovCisJLyoKKwkgKiBPcHRpb25hbCBtZXRob2QgY2FsbGVkIGZyb20gc2V0dXBfbG9jYWxfQVBJQygpIGFmdGVyIGxvZ2ljYWwKKwkgKiBhcGljaWQgaXMgZ3VhcmFudGVlZCB0byBiZSBrbm93biB0byBpbml0aWFsaXplIGFwaWNpZCAtPiBub2RlCisJICogbWFwcGluZyBpZiBOVU1BIGluaXRpYWxpemF0aW9uIGhhc24ndCBkb25lIHNvIGFscmVhZHkuICBEb24ndAorCSAqIGFkZCBuZXcgdXNlcnMuCisJICovCiAJaW50ICgqeDg2XzMyX251bWFfY3B1X25vZGUpKGludCBjcHUpOwogI2VuZGlmCiB9OwpAQCAtNTM3LDggKzU0Miw2IEBACiAJcmV0dXJuIGNwdWlkX2FwaWMgPj4gaW5kZXhfbXNiOwogfQogCi1leHRlcm4gaW50IGRlZmF1bHRfeDg2XzMyX251bWFfY3B1X25vZGUoaW50IGNwdSk7Ci0KICNlbmRpZgogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYmlvc19lYmRhLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9iaW9zX2ViZGEuaAppbmRleCAzYzc1MjEwLi5hYTZhMzE3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9iaW9zX2ViZGEuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9iaW9zX2ViZGEuaApAQCAtNCwxNiArNCw0MCBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAvKgotICogdGhlcmUgaXMgYSByZWFsLW1vZGUgc2VnbWVudGVkIHBvaW50ZXIgcG9pbnRpbmcgdG8gdGhlCi0gKiA0SyBFQkRBIGFyZWEgYXQgMHg0MEUuCisgKiBSZXR1cm5zIHBoeXNpY2FsIGFkZHJlc3Mgb2YgRUJEQS4gIFJldHVybnMgMCBpZiB0aGVyZSBpcyBubyBFQkRBLgogICovCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfYmlvc19lYmRhKHZvaWQpCiB7CisJLyoKKwkgKiBUaGVyZSBpcyBhIHJlYWwtbW9kZSBzZWdtZW50ZWQgcG9pbnRlciBwb2ludGluZyB0byB0aGUKKwkgKiA0SyBFQkRBIGFyZWEgYXQgMHg0MEUuCisJICovCiAJdW5zaWduZWQgaW50IGFkZHJlc3MgPSAqKHVuc2lnbmVkIHNob3J0ICopcGh5c190b192aXJ0KDB4NDBFKTsKIAlhZGRyZXNzIDw8PSA0OwogCXJldHVybiBhZGRyZXNzOwkvKiAwIG1lYW5zIG5vbmUgKi8KIH0KIAorLyoKKyAqIFJldHVybiB0aGUgc2FuaXRpemVkIGxlbmd0aCBvZiB0aGUgRUJEQSBpbiBieXRlcywgaWYgaXQgZXhpc3RzLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfYmlvc19lYmRhX2xlbmd0aCh2b2lkKQoreworCXVuc2lnbmVkIGludCBhZGRyZXNzOworCXVuc2lnbmVkIGludCBsZW5ndGg7CisKKwlhZGRyZXNzID0gZ2V0X2Jpb3NfZWJkYSgpOworCWlmICghYWRkcmVzcykKKwkJcmV0dXJuIDA7CisKKwkvKiBFQkRBIGxlbmd0aCBpcyBieXRlIDAgb2YgdGhlIEVCREEgKHN0b3JlZCBpbiBLaUIpICovCisJbGVuZ3RoID0gKih1bnNpZ25lZCBjaGFyICopcGh5c190b192aXJ0KGFkZHJlc3MpOworCWxlbmd0aCA8PD0gMTA7CisKKwkvKiBUcmltIHRoZSBsZW5ndGggaWYgaXQgZXh0ZW5kcyBiZXlvbmQgNjQwS2lCICovCisJbGVuZ3RoID0gbWluX3QodW5zaWduZWQgaW50LCAoNjQwICogMTAyNCkgLSBhZGRyZXNzLCBsZW5ndGgpOworCXJldHVybiBsZW5ndGg7Cit9CisKIHZvaWQgcmVzZXJ2ZV9lYmRhX3JlZ2lvbih2b2lkKTsKIAogI2lmZGVmIENPTkZJR19YODZfQ0hFQ0tfQklPU19DT1JSVVBUSU9OCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmgKaW5kZXggOTFmM2UwODcuLjVkYzZhY2MgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmgKQEAgLTE5NSw2ICsxOTUsOCBAQAogCiAvKiBJbnRlbC1kZWZpbmVkIENQVSBmZWF0dXJlcywgQ1BVSUQgbGV2ZWwgMHgwMDAwMDAwNzowIChlYngpLCB3b3JkIDkgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfRlNHU0JBU0UJKDkqMzIrIDApIC8qIHtSRC9XUn17RlMvR1N9QkFTRSBpbnN0cnVjdGlvbnMqLworI2RlZmluZSBYODZfRkVBVFVSRV9TTUVQCSg5KjMyKyA3KSAvKiBTdXBlcnZpc29yIE1vZGUgRXhlY3V0aW9uIFByb3RlY3Rpb24gKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfRVJNUwkoOSozMisgOSkgLyogRW5oYW5jZWQgUkVQIE1PVlNCL1NUT1NCICovCiAKICNpZiBkZWZpbmVkKF9fS0VSTkVMX18pICYmICFkZWZpbmVkKF9fQVNTRU1CTFlfXykKIApAQCAtMjA3LDggKzIwOSw3IEBACiAjZGVmaW5lIHRlc3RfY3B1X2NhcChjLCBiaXQpCQkJCQkJXAogCSB0ZXN0X2JpdChiaXQsICh1bnNpZ25lZCBsb25nICopKChjKS0+eDg2X2NhcGFiaWxpdHkpKQogCi0jZGVmaW5lIGNwdV9oYXMoYywgYml0KQkJCQkJCQlcCi0JKF9fYnVpbHRpbl9jb25zdGFudF9wKGJpdCkgJiYJCQkJCVwKKyNkZWZpbmUgUkVRVUlSRURfTUFTS19CSVRfU0VUKGJpdCkJCQkJCVwKIAkgKCAoKChiaXQpPj41KT09MCAmJiAoMVVMPDwoKGJpdCkmMzEpICYgUkVRVUlSRURfTUFTSzApKSB8fAlcCiAJICAgKCgoYml0KT4+NSk9PTEgJiYgKDFVTDw8KChiaXQpJjMxKSAmIFJFUVVJUkVEX01BU0sxKSkgfHwJXAogCSAgICgoKGJpdCk+PjUpPT0yICYmICgxVUw8PCgoYml0KSYzMSkgJiBSRVFVSVJFRF9NQVNLMikpIHx8CVwKQEAgLTIxOCwxMCArMjE5LDE2IEBACiAJICAgKCgoYml0KT4+NSk9PTYgJiYgKDFVTDw8KChiaXQpJjMxKSAmIFJFUVVJUkVEX01BU0s2KSkgfHwJXAogCSAgICgoKGJpdCk+PjUpPT03ICYmICgxVUw8PCgoYml0KSYzMSkgJiBSRVFVSVJFRF9NQVNLNykpIHx8CVwKIAkgICAoKChiaXQpPj41KT09OCAmJiAoMVVMPDwoKGJpdCkmMzEpICYgUkVRVUlSRURfTUFTSzgpKSB8fAlcCi0JICAgKCgoYml0KT4+NSk9PTkgJiYgKDFVTDw8KChiaXQpJjMxKSAmIFJFUVVJUkVEX01BU0s5KSkgKQlcCi0JICA/IDEgOgkJCQkJCQkJXAorCSAgICgoKGJpdCk+PjUpPT05ICYmICgxVUw8PCgoYml0KSYzMSkgJiBSRVFVSVJFRF9NQVNLOSkpICkKKworI2RlZmluZSBjcHVfaGFzKGMsIGJpdCkJCQkJCQkJXAorCShfX2J1aWx0aW5fY29uc3RhbnRfcChiaXQpICYmIFJFUVVJUkVEX01BU0tfQklUX1NFVChiaXQpID8gMSA6CVwKIAkgdGVzdF9jcHVfY2FwKGMsIGJpdCkpCiAKKyNkZWZpbmUgdGhpc19jcHVfaGFzKGJpdCkJCQkJCQlcCisJKF9fYnVpbHRpbl9jb25zdGFudF9wKGJpdCkgJiYgUkVRVUlSRURfTUFTS19CSVRfU0VUKGJpdCkgPyAxIDogCVwKKwkgeDg2X3RoaXNfY3B1X3Rlc3RfYml0KGJpdCwgKHVuc2lnbmVkIGxvbmcgKikmY3B1X2luZm8ueDg2X2NhcGFiaWxpdHkpKQorCiAjZGVmaW5lIGJvb3RfY3B1X2hhcyhiaXQpCWNwdV9oYXMoJmJvb3RfY3B1X2RhdGEsIGJpdCkKIAogI2RlZmluZSBzZXRfY3B1X2NhcChjLCBiaXQpCXNldF9iaXQoYml0LCAodW5zaWduZWQgbG9uZyAqKSgoYyktPng4Nl9jYXBhYmlsaXR5KSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2RtYS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZG1hLmgKaW5kZXggMDU3MDk5ZS4uMGJkYjBjNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZG1hLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZG1hLmgKQEAgLTY5LDIyICs2OSwxOCBAQAogCiAjZGVmaW5lIE1BWF9ETUFfQ0hBTk5FTFMJOAogCi0jaWZkZWYgQ09ORklHX1g4Nl8zMgotCi0vKiBUaGUgbWF4aW11bSBhZGRyZXNzIHRoYXQgd2UgY2FuIHBlcmZvcm0gYSBETUEgdHJhbnNmZXIgdG8gb24gdGhpcyBwbGF0Zm9ybSAqLwotI2RlZmluZSBNQVhfRE1BX0FERFJFU1MgICAgICAoUEFHRV9PRkZTRVQgKyAweDEwMDAwMDApCi0KLSNlbHNlCi0KIC8qIDE2TUIgSVNBIERNQSB6b25lICovCiAjZGVmaW5lIE1BWF9ETUFfUEZOICAgKCgxNiAqIDEwMjQgKiAxMDI0KSA+PiBQQUdFX1NISUZUKQogCiAvKiA0R0IgYnJva2VuIFBDSS9BR1AgaGFyZHdhcmUgYnVzIG1hc3RlciB6b25lICovCiAjZGVmaW5lIE1BWF9ETUEzMl9QRk4gKCg0VUwgKiAxMDI0ICogMTAyNCAqIDEwMjQpID4+IFBBR0VfU0hJRlQpCiAKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisvKiBUaGUgbWF4aW11bSBhZGRyZXNzIHRoYXQgd2UgY2FuIHBlcmZvcm0gYSBETUEgdHJhbnNmZXIgdG8gb24gdGhpcyBwbGF0Zm9ybSAqLworI2RlZmluZSBNQVhfRE1BX0FERFJFU1MgICAgICAoUEFHRV9PRkZTRVQgKyAweDEwMDAwMDApCisjZWxzZQogLyogQ29tcGF0IGRlZmluZSBmb3Igb2xkIGRtYSB6b25lICovCiAjZGVmaW5lIE1BWF9ETUFfQUREUkVTUyAoKHVuc2lnbmVkIGxvbmcpX192YShNQVhfRE1BX1BGTiA8PCBQQUdFX1NISUZUKSkKLQogI2VuZGlmCiAKIC8qIDgyMzcgRE1BIGNvbnRyb2xsZXJzICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lZmkuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VmaS5oCmluZGV4IDhlNGExNjUuLjcwOTNlNGEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VmaS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VmaS5oCkBAIC05MCw2ICs5MCw3IEBACiAjZW5kaWYgLyogQ09ORklHX1g4Nl8zMiAqLwogCiBleHRlcm4gaW50IGFkZF9lZmlfbWVtbWFwOworZXh0ZXJuIHZvaWQgZWZpX3NldF9leGVjdXRhYmxlKGVmaV9tZW1vcnlfZGVzY190ICptZCwgYm9vbCBleGVjdXRhYmxlKTsKIGV4dGVybiB2b2lkIGVmaV9tZW1ibG9ja194ODZfcmVzZXJ2ZV9yYW5nZSh2b2lkKTsKIGV4dGVybiB2b2lkIGVmaV9jYWxsX3BoeXNfcHJlbG9nKHZvaWQpOwogZXh0ZXJuIHZvaWQgZWZpX2NhbGxfcGh5c19lcGlsb2codm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9mdHJhY2UuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Z0cmFjZS5oCmluZGV4IGRiMjRjMjIuLjI2OGM3ODMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Z0cmFjZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Z0cmFjZS5oCkBAIC0zOCwxMSArMzgsMTAgQEAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBmdHJhY2VfY2FsbF9hZGp1c3QodW5zaWduZWQgbG9uZyBhZGRyKQogewogCS8qCi0JICogY2FsbCBtY291bnQgaXMgImU4IDw0IGJ5dGUgb2Zmc2V0PiIKLQkgKiBUaGUgYWRkciBwb2ludHMgdG8gdGhlIDQgYnl0ZSBvZmZzZXQgYW5kIHRoZSBjYWxsZXIgb2YgdGhpcwotCSAqIGZ1bmN0aW9uIHdhbnRzIHRoZSBwb2ludGVyIHRvIGU4LiBTaW1wbHkgc3VidHJhY3Qgb25lLgorCSAqIGFkZHIgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIG1jb3VudCBjYWxsIGluc3RydWN0aW9uLgorCSAqIHJlY29yZG1jb3VudCBkb2VzIHRoZSBuZWNlc3Nhcnkgb2Zmc2V0IGNhbGN1bGF0aW9uLgogCSAqLwotCXJldHVybiBhZGRyIC0gMTsKKwlyZXR1cm4gYWRkcjsKIH0KIAogI2lmZGVmIENPTkZJR19EWU5BTUlDX0ZUUkFDRQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaTgyNTMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2k4MjUzLmgKaW5kZXggZmMxZjU3OS4uNjVhYWE5MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaTgyNTMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pODI1My5oCkBAIC02LDYgKzYsOCBAQAogI2RlZmluZSBQSVRfQ0gwCQkJMHg0MAogI2RlZmluZSBQSVRfQ0gyCQkJMHg0MgogCisjZGVmaW5lIFBJVF9MQVRDSAlMQVRDSAorCiBleHRlcm4gcmF3X3NwaW5sb2NrX3QgaTgyNTNfbG9jazsKIAogZXh0ZXJuIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmdsb2JhbF9jbG9ja19ldmVudDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2p1bXBfbGFiZWwuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2p1bXBfbGFiZWwuaAppbmRleCA1NzRkYmMyLi5hMzJiMThjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9qdW1wX2xhYmVsLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vanVtcF9sYWJlbC5oCkBAIC01LDIwICs1LDI1IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9ub3BzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS5oPgogCiAjZGVmaW5lIEpVTVBfTEFCRUxfTk9QX1NJWkUgNQogCi0jIGRlZmluZSBKVU1QX0xBQkVMX0lOSVRJQUxfTk9QICIuYnl0ZSAweGU5IFxuXHQgLmxvbmcgMFxuXHQiCisjZGVmaW5lIEpVTVBfTEFCRUxfSU5JVElBTF9OT1AgIi5ieXRlIDB4ZTkgXG5cdCAubG9uZyAwXG5cdCIKIAotIyBkZWZpbmUgSlVNUF9MQUJFTChrZXksIGxhYmVsKQkJCQkJXAotCWRvIHsJCQkJCQkJXAotCQlhc20gZ290bygiMToiCQkJCQlcCi0JCQlKVU1QX0xBQkVMX0lOSVRJQUxfTk9QCQkJXAotCQkJIi5wdXNoc2VjdGlvbiBfX2p1bXBfdGFibGUsICBcImF3XCIgXG5cdCJcCi0JCQlfQVNNX1BUUiAiMWIsICVsWyIgI2xhYmVsICJdLCAlYzAgXG5cdCIgXAotCQkJIi5wb3BzZWN0aW9uIFxuXHQiCQkJXAotCQkJOiA6ICAiaSIgKGtleSkgOiAgOiBsYWJlbCk7CQlcCi0JfSB3aGlsZSAoMCkKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBhcmNoX3N0YXRpY19icmFuY2goc3RydWN0IGp1bXBfbGFiZWxfa2V5ICprZXkpCit7CisJYXNtIGdvdG8oIjE6IgorCQlKVU1QX0xBQkVMX0lOSVRJQUxfTk9QCisJCSIucHVzaHNlY3Rpb24gX19qdW1wX3RhYmxlLCAgXCJhd1wiIFxuXHQiCisJCV9BU01fQUxJR04gIlxuXHQiCisJCV9BU01fUFRSICIxYiwgJWxbbF95ZXNdLCAlYzAgXG5cdCIKKwkJIi5wb3BzZWN0aW9uIFxuXHQiCisJCTogOiAgImkiIChrZXkpIDogOiBsX3llcyk7CisJcmV0dXJuIGZhbHNlOworbF95ZXM6CisJcmV0dXJuIHRydWU7Cit9CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21jZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbWNlLmgKaW5kZXggZWIxNmU5NC4uMDIxOTc5YTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21jZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21jZS5oCkBAIC0xNDIsOCArMTQyLDYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfcDVfbWNlKHZvaWQpIHt9CiAjZW5kaWYKIAotZXh0ZXJuIHZvaWQgKCp4ODZfbWNlX2RlY29kZV9jYWxsYmFjaykoc3RydWN0IG1jZSAqbSk7Ci0KIHZvaWQgbWNlX3NldHVwKHN0cnVjdCBtY2UgKm0pOwogdm9pZCBtY2VfbG9nKHN0cnVjdCBtY2UgKm0pOwogREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBzeXNfZGV2aWNlLCBtY2VfZGV2KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tem9uZV8zMi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbW16b25lXzMyLmgKaW5kZXggOTFkZjdjNS4uNWU4M2E0MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbW16b25lXzMyLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbW16b25lXzMyLmgKQEAgLTEzLDMxICsxMywxMSBAQAogI2RlZmluZSBOT0RFX0RBVEEobmlkKQkobm9kZV9kYXRhW25pZF0pCiAKICNpbmNsdWRlIDxhc20vbnVtYXEuaD4KLS8qIHN1bW1pdCBvciBnZW5lcmljIGFyY2ggKi8KLSNpbmNsdWRlIDxhc20vc3JhdC5oPgotCi1leHRlcm4gaW50IGdldF9tZW1jZmdfbnVtYV9mbGF0KHZvaWQpOwotLyoKLSAqIFRoaXMgYWxsb3dzIGFueSBvbmUgTlVNQSBhcmNoaXRlY3R1cmUgdG8gYmUgY29tcGlsZWQKLSAqIGZvciwgYW5kIHN0aWxsIGZhbGwgYmFjayB0byB0aGUgZmxhdCBmdW5jdGlvbiBpZiBpdAotICogZmFpbHMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBnZXRfbWVtY2ZnX251bWEodm9pZCkKLXsKLQotCWlmIChnZXRfbWVtY2ZnX251bWFxKCkpCi0JCXJldHVybjsKLQlpZiAoZ2V0X21lbWNmZ19mcm9tX3NyYXQoKSkKLQkJcmV0dXJuOwotCWdldF9tZW1jZmdfbnVtYV9mbGF0KCk7Ci19CiAKIGV4dGVybiB2b2lkIHJlc3VtZV9tYXBfbnVtYV9rdmEocGdkX3QgKnBnZCk7CiAKICNlbHNlIC8qICFDT05GSUdfTlVNQSAqLwogCi0jZGVmaW5lIGdldF9tZW1jZmdfbnVtYSBnZXRfbWVtY2ZnX251bWFfZmxhdAotCiBzdGF0aWMgaW5saW5lIHZvaWQgcmVzdW1lX21hcF9udW1hX2t2YShwZ2RfdCAqcGdkKSB7fQogCiAjZW5kaWYgLyogQ09ORklHX05VTUEgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tem9uZV82NC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbW16b25lXzY0LmgKaW5kZXggMjg4Yjk2Zi4uYjNmODhkNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbW16b25lXzY0LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbW16b25lXzY0LmgKQEAgLTQsMzYgKzQsMTMgQEAKICNpZm5kZWYgX0FTTV9YODZfTU1aT05FXzY0X0gKICNkZWZpbmUgX0FTTV9YODZfTU1aT05FXzY0X0gKIAotCiAjaWZkZWYgQ09ORklHX05VTUEKIAogI2luY2x1ZGUgPGxpbnV4L21tZGVidWcuaD4KLQogI2luY2x1ZGUgPGFzbS9zbXAuaD4KIAotLyogU2ltcGxlIHBlcmZlY3QgaGFzaCB0byBtYXAgcGh5c2ljYWwgYWRkcmVzc2VzIHRvIG5vZGUgbnVtYmVycyAqLwotc3RydWN0IG1lbW5vZGUgewotCWludCBzaGlmdDsKLQl1bnNpZ25lZCBpbnQgbWFwc2l6ZTsKLQlzMTYgKm1hcDsKLQlzMTYgZW1iZWRkZWRfbWFwWzY0IC0gOF07Ci19IF9fX19jYWNoZWxpbmVfYWxpZ25lZDsgLyogdG90YWwgc2l6ZSA9IDEyOCBieXRlcyAqLwotZXh0ZXJuIHN0cnVjdCBtZW1ub2RlIG1lbW5vZGU7Ci0jZGVmaW5lIG1lbW5vZGVfc2hpZnQgbWVtbm9kZS5zaGlmdAotI2RlZmluZSBtZW1ub2RlbWFwIG1lbW5vZGUubWFwCi0jZGVmaW5lIG1lbW5vZGVtYXBzaXplIG1lbW5vZGUubWFwc2l6ZQotCiBleHRlcm4gc3RydWN0IHBnbGlzdF9kYXRhICpub2RlX2RhdGFbXTsKIAotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChwdXJlKSkgaW50IHBoeXNfdG9fbmlkKHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQl1bnNpZ25lZCBuaWQ7Ci0JVklSVFVBTF9CVUdfT04oIW1lbW5vZGVtYXApOwotCW5pZCA9IG1lbW5vZGVtYXBbYWRkciA+PiBtZW1ub2RlX3NoaWZ0XTsKLQlWSVJUVUFMX0JVR19PTihuaWQgPj0gTUFYX05VTU5PREVTIHx8ICFub2RlX2RhdGFbbmlkXSk7Ci0JcmV0dXJuIG5pZDsKLX0KLQogI2RlZmluZSBOT0RFX0RBVEEobmlkKQkJKG5vZGVfZGF0YVtuaWRdKQogCiAjZGVmaW5lIG5vZGVfc3RhcnRfcGZuKG5pZCkJKE5PREVfREFUQShuaWQpLT5ub2RlX3N0YXJ0X3BmbikKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21vZHVsZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbW9kdWxlLmgKaW5kZXggNjc3NjNjNS4uOWVhZTc3NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbW9kdWxlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbW9kdWxlLmgKQEAgLTM1LDcgKzM1LDcgQEAKICNkZWZpbmUgTU9EVUxFX1BST0NfRkFNSUxZICJLNyAiCiAjZWxpZiBkZWZpbmVkIENPTkZJR19NSzgKICNkZWZpbmUgTU9EVUxFX1BST0NfRkFNSUxZICJLOCAiCi0jZWxpZiBkZWZpbmVkIENPTkZJR19YODZfRUxBTgorI2VsaWYgZGVmaW5lZCBDT05GSUdfTUVMQU4KICNkZWZpbmUgTU9EVUxFX1BST0NfRkFNSUxZICJFTEFOICIKICNlbGlmIGRlZmluZWQgQ09ORklHX01DUlVTT0UKICNkZWZpbmUgTU9EVUxFX1BST0NfRkFNSUxZICJDUlVTT0UgIgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbm9wcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbm9wcy5oCmluZGV4IGFmNzg4NDkuLjQwNWI0MDMyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ub3BzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbm9wcy5oCkBAIC0xLDcgKzEsMTMgQEAKICNpZm5kZWYgX0FTTV9YODZfTk9QU19ICiAjZGVmaW5lIF9BU01fWDg2X05PUFNfSAogCi0vKiBEZWZpbmUgbm9wcyBmb3IgdXNlIHdpdGggYWx0ZXJuYXRpdmUoKSAqLworLyoKKyAqIERlZmluZSBub3BzIGZvciB1c2Ugd2l0aCBhbHRlcm5hdGl2ZSgpIGFuZCBmb3IgdHJhY2luZy4KKyAqCisgKiAqX05PUDVfQVRPTUlDIG11c3QgYmUgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uCisgKi8KKworI2RlZmluZSBOT1BfRFNfUFJFRklYIDB4M2UKIAogLyogZ2VuZXJpYyB2ZXJzaW9ucyBmcm9tIGdhcwogICAgMTogbm9wCkBAIC0xMywxNCArMTksMTUgQEAKICAgIDY6IGxlYWwgMHgwMDAwMDAwMCglZXNpKSwlZXNpCiAgICA3OiBsZWFsIDB4MDAwMDAwMDAoLCVlc2ksMSksJWVzaQogKi8KLSNkZWZpbmUgR0VORVJJQ19OT1AxICIuYnl0ZSAweDkwXG4iCi0jZGVmaW5lIEdFTkVSSUNfTk9QMiAiLmJ5dGUgMHg4OSwweGY2XG4iCi0jZGVmaW5lIEdFTkVSSUNfTk9QMyAiLmJ5dGUgMHg4ZCwweDc2LDB4MDBcbiIKLSNkZWZpbmUgR0VORVJJQ19OT1A0ICIuYnl0ZSAweDhkLDB4NzQsMHgyNiwweDAwXG4iCi0jZGVmaW5lIEdFTkVSSUNfTk9QNSBHRU5FUklDX05PUDEgR0VORVJJQ19OT1A0Ci0jZGVmaW5lIEdFTkVSSUNfTk9QNiAiLmJ5dGUgMHg4ZCwweGI2LDB4MDAsMHgwMCwweDAwLDB4MDBcbiIKLSNkZWZpbmUgR0VORVJJQ19OT1A3ICIuYnl0ZSAweDhkLDB4YjQsMHgyNiwweDAwLDB4MDAsMHgwMCwweDAwXG4iCi0jZGVmaW5lIEdFTkVSSUNfTk9QOCBHRU5FUklDX05PUDEgR0VORVJJQ19OT1A3CisjZGVmaW5lIEdFTkVSSUNfTk9QMSAweDkwCisjZGVmaW5lIEdFTkVSSUNfTk9QMiAweDg5LDB4ZjYKKyNkZWZpbmUgR0VORVJJQ19OT1AzIDB4OGQsMHg3NiwweDAwCisjZGVmaW5lIEdFTkVSSUNfTk9QNCAweDhkLDB4NzQsMHgyNiwweDAwCisjZGVmaW5lIEdFTkVSSUNfTk9QNSBHRU5FUklDX05PUDEsR0VORVJJQ19OT1A0CisjZGVmaW5lIEdFTkVSSUNfTk9QNiAweDhkLDB4YjYsMHgwMCwweDAwLDB4MDAsMHgwMAorI2RlZmluZSBHRU5FUklDX05PUDcgMHg4ZCwweGI0LDB4MjYsMHgwMCwweDAwLDB4MDAsMHgwMAorI2RlZmluZSBHRU5FUklDX05PUDggR0VORVJJQ19OT1AxLEdFTkVSSUNfTk9QNworI2RlZmluZSBHRU5FUklDX05PUDVfQVRPTUlDIE5PUF9EU19QUkVGSVgsR0VORVJJQ19OT1A0CiAKIC8qIE9wdGVyb24gNjRiaXQgbm9wcwogICAgMTogbm9wCkBAIC0yOSwxMyArMzYsMTQgQEAKICAgIDQ6IG9zcCBvc3Agb3NwIG5vcAogKi8KICNkZWZpbmUgSzhfTk9QMSBHRU5FUklDX05PUDEKLSNkZWZpbmUgSzhfTk9QMgkiLmJ5dGUgMHg2NiwweDkwXG4iCi0jZGVmaW5lIEs4X05PUDMJIi5ieXRlIDB4NjYsMHg2NiwweDkwXG4iCi0jZGVmaW5lIEs4X05PUDQJIi5ieXRlIDB4NjYsMHg2NiwweDY2LDB4OTBcbiIKLSNkZWZpbmUgSzhfTk9QNQlLOF9OT1AzIEs4X05PUDIKLSNkZWZpbmUgSzhfTk9QNglLOF9OT1AzIEs4X05PUDMKLSNkZWZpbmUgSzhfTk9QNwlLOF9OT1A0IEs4X05PUDMKLSNkZWZpbmUgSzhfTk9QOAlLOF9OT1A0IEs4X05PUDQKKyNkZWZpbmUgSzhfTk9QMgkweDY2LEs4X05PUDEKKyNkZWZpbmUgSzhfTk9QMwkweDY2LEs4X05PUDIKKyNkZWZpbmUgSzhfTk9QNAkweDY2LEs4X05PUDMKKyNkZWZpbmUgSzhfTk9QNQlLOF9OT1AzLEs4X05PUDIKKyNkZWZpbmUgSzhfTk9QNglLOF9OT1AzLEs4X05PUDMKKyNkZWZpbmUgSzhfTk9QNwlLOF9OT1A0LEs4X05PUDMKKyNkZWZpbmUgSzhfTk9QOAlLOF9OT1A0LEs4X05PUDQKKyNkZWZpbmUgSzhfTk9QNV9BVE9NSUMgMHg2NixLOF9OT1A0CiAKIC8qIEs3IG5vcHMKICAgIHVzZXMgZWF4IGRlcGVuZGVuY2llcyAoYXJiaXRyYXJ5IGNob2ljZSkKQEAgLTQ3LDEzICs1NSwxNCBAQAogICAgNzogbGVhbCAweDAwMDAwMDAwKCwlZWF4LDEpLCVlYXgKICovCiAjZGVmaW5lIEs3X05PUDEJR0VORVJJQ19OT1AxCi0jZGVmaW5lIEs3X05PUDIJIi5ieXRlIDB4OGIsMHhjMFxuIgotI2RlZmluZSBLN19OT1AzCSIuYnl0ZSAweDhkLDB4MDQsMHgyMFxuIgotI2RlZmluZSBLN19OT1A0CSIuYnl0ZSAweDhkLDB4NDQsMHgyMCwweDAwXG4iCi0jZGVmaW5lIEs3X05PUDUJSzdfTk9QNCBBU01fTk9QMQotI2RlZmluZSBLN19OT1A2CSIuYnl0ZSAweDhkLDB4ODAsMCwwLDAsMFxuIgotI2RlZmluZSBLN19OT1A3CSIuYnl0ZSAweDhELDB4MDQsMHgwNSwwLDAsMCwwXG4iCi0jZGVmaW5lIEs3X05PUDgJSzdfTk9QNyBBU01fTk9QMQorI2RlZmluZSBLN19OT1AyCTB4OGIsMHhjMAorI2RlZmluZSBLN19OT1AzCTB4OGQsMHgwNCwweDIwCisjZGVmaW5lIEs3X05PUDQJMHg4ZCwweDQ0LDB4MjAsMHgwMAorI2RlZmluZSBLN19OT1A1CUs3X05PUDQsSzdfTk9QMQorI2RlZmluZSBLN19OT1A2CTB4OGQsMHg4MCwwLDAsMCwwCisjZGVmaW5lIEs3X05PUDcJMHg4RCwweDA0LDB4MDUsMCwwLDAsMAorI2RlZmluZSBLN19OT1A4CUs3X05PUDcsSzdfTk9QMQorI2RlZmluZSBLN19OT1A1X0FUT01JQyBOT1BfRFNfUFJFRklYLEs3X05PUDQKIAogLyogUDYgbm9wcwogICAgdXNlcyBlYXggZGVwZW5kZW5jaWVzIChJbnRlbC1yZWNvbW1lbmRlZCBjaG9pY2UpCkBAIC02OSw1MiArNzgsNjUgQEAKIAlUaGVyZSBpcyBrZXJuZWwgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcy4KICovCiAjZGVmaW5lIFA2X05PUDEJR0VORVJJQ19OT1AxCi0jZGVmaW5lIFA2X05PUDIJIi5ieXRlIDB4NjYsMHg5MFxuIgotI2RlZmluZSBQNl9OT1AzCSIuYnl0ZSAweDBmLDB4MWYsMHgwMFxuIgotI2RlZmluZSBQNl9OT1A0CSIuYnl0ZSAweDBmLDB4MWYsMHg0MCwwXG4iCi0jZGVmaW5lIFA2X05PUDUJIi5ieXRlIDB4MGYsMHgxZiwweDQ0LDB4MDAsMFxuIgotI2RlZmluZSBQNl9OT1A2CSIuYnl0ZSAweDY2LDB4MGYsMHgxZiwweDQ0LDB4MDAsMFxuIgotI2RlZmluZSBQNl9OT1A3CSIuYnl0ZSAweDBmLDB4MWYsMHg4MCwwLDAsMCwwXG4iCi0jZGVmaW5lIFA2X05PUDgJIi5ieXRlIDB4MGYsMHgxZiwweDg0LDB4MDAsMCwwLDAsMFxuIgorI2RlZmluZSBQNl9OT1AyCTB4NjYsMHg5MAorI2RlZmluZSBQNl9OT1AzCTB4MGYsMHgxZiwweDAwCisjZGVmaW5lIFA2X05PUDQJMHgwZiwweDFmLDB4NDAsMAorI2RlZmluZSBQNl9OT1A1CTB4MGYsMHgxZiwweDQ0LDB4MDAsMAorI2RlZmluZSBQNl9OT1A2CTB4NjYsMHgwZiwweDFmLDB4NDQsMHgwMCwwCisjZGVmaW5lIFA2X05PUDcJMHgwZiwweDFmLDB4ODAsMCwwLDAsMAorI2RlZmluZSBQNl9OT1A4CTB4MGYsMHgxZiwweDg0LDB4MDAsMCwwLDAsMAorI2RlZmluZSBQNl9OT1A1X0FUT01JQyBQNl9OT1A1CisKKyNkZWZpbmUgX0FTTV9NS19OT1AoeCkgIi5ieXRlICIgX19zdHJpbmdpZnkoeCkgIlxuIgogCiAjaWYgZGVmaW5lZChDT05GSUdfTUs3KQotI2RlZmluZSBBU01fTk9QMSBLN19OT1AxCi0jZGVmaW5lIEFTTV9OT1AyIEs3X05PUDIKLSNkZWZpbmUgQVNNX05PUDMgSzdfTk9QMwotI2RlZmluZSBBU01fTk9QNCBLN19OT1A0Ci0jZGVmaW5lIEFTTV9OT1A1IEs3X05PUDUKLSNkZWZpbmUgQVNNX05PUDYgSzdfTk9QNgotI2RlZmluZSBBU01fTk9QNyBLN19OT1A3Ci0jZGVmaW5lIEFTTV9OT1A4IEs3X05PUDgKKyNkZWZpbmUgQVNNX05PUDEgX0FTTV9NS19OT1AoSzdfTk9QMSkKKyNkZWZpbmUgQVNNX05PUDIgX0FTTV9NS19OT1AoSzdfTk9QMikKKyNkZWZpbmUgQVNNX05PUDMgX0FTTV9NS19OT1AoSzdfTk9QMykKKyNkZWZpbmUgQVNNX05PUDQgX0FTTV9NS19OT1AoSzdfTk9QNCkKKyNkZWZpbmUgQVNNX05PUDUgX0FTTV9NS19OT1AoSzdfTk9QNSkKKyNkZWZpbmUgQVNNX05PUDYgX0FTTV9NS19OT1AoSzdfTk9QNikKKyNkZWZpbmUgQVNNX05PUDcgX0FTTV9NS19OT1AoSzdfTk9QNykKKyNkZWZpbmUgQVNNX05PUDggX0FTTV9NS19OT1AoSzdfTk9QOCkKKyNkZWZpbmUgQVNNX05PUDVfQVRPTUlDIF9BU01fTUtfTk9QKEs3X05PUDVfQVRPTUlDKQogI2VsaWYgZGVmaW5lZChDT05GSUdfWDg2X1A2X05PUCkKLSNkZWZpbmUgQVNNX05PUDEgUDZfTk9QMQotI2RlZmluZSBBU01fTk9QMiBQNl9OT1AyCi0jZGVmaW5lIEFTTV9OT1AzIFA2X05PUDMKLSNkZWZpbmUgQVNNX05PUDQgUDZfTk9QNAotI2RlZmluZSBBU01fTk9QNSBQNl9OT1A1Ci0jZGVmaW5lIEFTTV9OT1A2IFA2X05PUDYKLSNkZWZpbmUgQVNNX05PUDcgUDZfTk9QNwotI2RlZmluZSBBU01fTk9QOCBQNl9OT1A4CisjZGVmaW5lIEFTTV9OT1AxIF9BU01fTUtfTk9QKFA2X05PUDEpCisjZGVmaW5lIEFTTV9OT1AyIF9BU01fTUtfTk9QKFA2X05PUDIpCisjZGVmaW5lIEFTTV9OT1AzIF9BU01fTUtfTk9QKFA2X05PUDMpCisjZGVmaW5lIEFTTV9OT1A0IF9BU01fTUtfTk9QKFA2X05PUDQpCisjZGVmaW5lIEFTTV9OT1A1IF9BU01fTUtfTk9QKFA2X05PUDUpCisjZGVmaW5lIEFTTV9OT1A2IF9BU01fTUtfTk9QKFA2X05PUDYpCisjZGVmaW5lIEFTTV9OT1A3IF9BU01fTUtfTk9QKFA2X05PUDcpCisjZGVmaW5lIEFTTV9OT1A4IF9BU01fTUtfTk9QKFA2X05PUDgpCisjZGVmaW5lIEFTTV9OT1A1X0FUT01JQyBfQVNNX01LX05PUChQNl9OT1A1X0FUT01JQykKICNlbGlmIGRlZmluZWQoQ09ORklHX1g4Nl82NCkKLSNkZWZpbmUgQVNNX05PUDEgSzhfTk9QMQotI2RlZmluZSBBU01fTk9QMiBLOF9OT1AyCi0jZGVmaW5lIEFTTV9OT1AzIEs4X05PUDMKLSNkZWZpbmUgQVNNX05PUDQgSzhfTk9QNAotI2RlZmluZSBBU01fTk9QNSBLOF9OT1A1Ci0jZGVmaW5lIEFTTV9OT1A2IEs4X05PUDYKLSNkZWZpbmUgQVNNX05PUDcgSzhfTk9QNwotI2RlZmluZSBBU01fTk9QOCBLOF9OT1A4CisjZGVmaW5lIEFTTV9OT1AxIF9BU01fTUtfTk9QKEs4X05PUDEpCisjZGVmaW5lIEFTTV9OT1AyIF9BU01fTUtfTk9QKEs4X05PUDIpCisjZGVmaW5lIEFTTV9OT1AzIF9BU01fTUtfTk9QKEs4X05PUDMpCisjZGVmaW5lIEFTTV9OT1A0IF9BU01fTUtfTk9QKEs4X05PUDQpCisjZGVmaW5lIEFTTV9OT1A1IF9BU01fTUtfTk9QKEs4X05PUDUpCisjZGVmaW5lIEFTTV9OT1A2IF9BU01fTUtfTk9QKEs4X05PUDYpCisjZGVmaW5lIEFTTV9OT1A3IF9BU01fTUtfTk9QKEs4X05PUDcpCisjZGVmaW5lIEFTTV9OT1A4IF9BU01fTUtfTk9QKEs4X05PUDgpCisjZGVmaW5lIEFTTV9OT1A1X0FUT01JQyBfQVNNX01LX05PUChLOF9OT1A1X0FUT01JQykKICNlbHNlCi0jZGVmaW5lIEFTTV9OT1AxIEdFTkVSSUNfTk9QMQotI2RlZmluZSBBU01fTk9QMiBHRU5FUklDX05PUDIKLSNkZWZpbmUgQVNNX05PUDMgR0VORVJJQ19OT1AzCi0jZGVmaW5lIEFTTV9OT1A0IEdFTkVSSUNfTk9QNAotI2RlZmluZSBBU01fTk9QNSBHRU5FUklDX05PUDUKLSNkZWZpbmUgQVNNX05PUDYgR0VORVJJQ19OT1A2Ci0jZGVmaW5lIEFTTV9OT1A3IEdFTkVSSUNfTk9QNwotI2RlZmluZSBBU01fTk9QOCBHRU5FUklDX05PUDgKKyNkZWZpbmUgQVNNX05PUDEgX0FTTV9NS19OT1AoR0VORVJJQ19OT1AxKQorI2RlZmluZSBBU01fTk9QMiBfQVNNX01LX05PUChHRU5FUklDX05PUDIpCisjZGVmaW5lIEFTTV9OT1AzIF9BU01fTUtfTk9QKEdFTkVSSUNfTk9QMykKKyNkZWZpbmUgQVNNX05PUDQgX0FTTV9NS19OT1AoR0VORVJJQ19OT1A0KQorI2RlZmluZSBBU01fTk9QNSBfQVNNX01LX05PUChHRU5FUklDX05PUDUpCisjZGVmaW5lIEFTTV9OT1A2IF9BU01fTUtfTk9QKEdFTkVSSUNfTk9QNikKKyNkZWZpbmUgQVNNX05PUDcgX0FTTV9NS19OT1AoR0VORVJJQ19OT1A3KQorI2RlZmluZSBBU01fTk9QOCBfQVNNX01LX05PUChHRU5FUklDX05PUDgpCisjZGVmaW5lIEFTTV9OT1A1X0FUT01JQyBfQVNNX01LX05PUChHRU5FUklDX05PUDVfQVRPTUlDKQogI2VuZGlmCiAKICNkZWZpbmUgQVNNX05PUF9NQVggOAorI2RlZmluZSBOT1BfQVRPTUlDNSAoQVNNX05PUF9NQVgrMSkJLyogRW50cnkgZm9yIHRoZSA1LWJ5dGUgYXRvbWljIE5PUCAqLworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBjb25zdCAqaWRlYWxfbm9wczsKK2V4dGVybiB2b2lkIGFyY2hfaW5pdF9pZGVhbF9ub3BzKHZvaWQpOworI2VuZGlmCiAKICNlbmRpZiAvKiBfQVNNX1g4Nl9OT1BTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL251bWEuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL251bWEuaAppbmRleCBhNTBmYzlmLi5iZmFjZDJjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9udW1hLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbnVtYS5oCkBAIC0xLDEyICsxLDI0IEBACiAjaWZuZGVmIF9BU01fWDg2X05VTUFfSAogI2RlZmluZSBfQVNNX1g4Nl9OVU1BX0gKIAorI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+CisKICNpbmNsdWRlIDxhc20vdG9wb2xvZ3kuaD4KICNpbmNsdWRlIDxhc20vYXBpY2RlZi5oPgogCiAjaWZkZWYgQ09ORklHX05VTUEKIAogI2RlZmluZSBOUl9OT0RFX01FTUJMS1MJCShNQVhfTlVNTk9ERVMqMikKKyNkZWZpbmUgWk9ORV9BTElHTiAoMVVMIDw8IChNQVhfT1JERVIrUEFHRV9TSElGVCkpCisKKy8qCisgKiBUb28gc21hbGwgbm9kZSBzaXplcyBtYXkgY29uZnVzZSB0aGUgVk0gYmFkbHkuIFVzdWFsbHkgdGhleQorICogcmVzdWx0IGZyb20gQklPUyBidWdzLiBTbyBkb250IHJlY29nbml6ZSBub2RlcyBhcyBzdGFuZGFsb25lCisgKiBOVU1BIGVudGl0aWVzIHRoYXQgaGF2ZSBsZXNzIHRoYW4gdGhpcyBhbW91bnQgb2YgUkFNIGxpc3RlZDoKKyAqLworI2RlZmluZSBOT0RFX01JTl9TSVpFICg0KjEwMjQqMTAyNCkKKworZXh0ZXJuIGludCBudW1hX29mZjsKIAogLyoKICAqIF9fYXBpY2lkX3RvX25vZGVbXSBzdG9yZXMgdGhlIHJhdyBtYXBwaW5nIGJldHdlZW4gcGh5c2ljYWwgYXBpY2lkIGFuZApAQCAtMTcsMTUgKzI5LDI3IEBACiAgKiBudW1hX2NwdV9ub2RlKCkuCiAgKi8KIGV4dGVybiBzMTYgX19hcGljaWRfdG9fbm9kZVtNQVhfTE9DQUxfQVBJQ107CitleHRlcm4gbm9kZW1hc2tfdCBudW1hX25vZGVzX3BhcnNlZCBfX2luaXRkYXRhOworCitleHRlcm4gaW50IF9faW5pdCBudW1hX2FkZF9tZW1ibGsoaW50IG5vZGVpZCwgdTY0IHN0YXJ0LCB1NjQgZW5kKTsKK2V4dGVybiB2b2lkIF9faW5pdCBudW1hX3NldF9kaXN0YW5jZShpbnQgZnJvbSwgaW50IHRvLCBpbnQgZGlzdGFuY2UpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2FwaWNpZF90b19ub2RlKGludCBhcGljaWQsIHMxNiBub2RlKQogewogCV9fYXBpY2lkX3RvX25vZGVbYXBpY2lkXSA9IG5vZGU7CiB9CisKK2V4dGVybiBpbnQgX19jcHVpbml0IG51bWFfY3B1X25vZGUoaW50IGNwdSk7CisKICNlbHNlCS8qIENPTkZJR19OVU1BICovCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2FwaWNpZF90b19ub2RlKGludCBhcGljaWQsIHMxNiBub2RlKQogewogfQorCitzdGF0aWMgaW5saW5lIGludCBudW1hX2NwdV9ub2RlKGludCBjcHUpCit7CisJcmV0dXJuIE5VTUFfTk9fTk9ERTsKK30KICNlbmRpZgkvKiBDT05GSUdfTlVNQSAqLwogCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgpAQCAtMzcsMTQgKzYxLDEyIEBACiAjaWZkZWYgQ09ORklHX05VTUEKIGV4dGVybiB2b2lkIF9fY3B1aW5pdCBudW1hX3NldF9ub2RlKGludCBjcHUsIGludCBub2RlKTsKIGV4dGVybiB2b2lkIF9fY3B1aW5pdCBudW1hX2NsZWFyX25vZGUoaW50IGNwdSk7Ci1leHRlcm4gdm9pZCBfX2luaXQgbnVtYV9pbml0X2FycmF5KHZvaWQpOwogZXh0ZXJuIHZvaWQgX19pbml0IGluaXRfY3B1X3RvX25vZGUodm9pZCk7CiBleHRlcm4gdm9pZCBfX2NwdWluaXQgbnVtYV9hZGRfY3B1KGludCBjcHUpOwogZXh0ZXJuIHZvaWQgX19jcHVpbml0IG51bWFfcmVtb3ZlX2NwdShpbnQgY3B1KTsKICNlbHNlCS8qIENPTkZJR19OVU1BICovCiBzdGF0aWMgaW5saW5lIHZvaWQgbnVtYV9zZXRfbm9kZShpbnQgY3B1LCBpbnQgbm9kZSkJeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgbnVtYV9jbGVhcl9ub2RlKGludCBjcHUpCQl7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBudW1hX2luaXRfYXJyYXkodm9pZCkJCXsgfQogc3RhdGljIGlubGluZSB2b2lkIGluaXRfY3B1X3RvX25vZGUodm9pZCkJCXsgfQogc3RhdGljIGlubGluZSB2b2lkIG51bWFfYWRkX2NwdShpbnQgY3B1KQkJeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgbnVtYV9yZW1vdmVfY3B1KGludCBjcHUpCQl7IH0KQEAgLTU0LDQgKzc2LDEwIEBACiB2b2lkIGRlYnVnX2NwdW1hc2tfc2V0X2NwdShpbnQgY3B1LCBpbnQgbm9kZSwgYm9vbCBlbmFibGUpOwogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfTlVNQV9FTVUKKyNkZWZpbmUgRkFLRV9OT0RFX01JTl9TSVpFCSgodTY0KTMyIDw8IDIwKQorI2RlZmluZSBGQUtFX05PREVfTUlOX0hBU0hfTUFTSwkofihGQUtFX05PREVfTUlOX1NJWkUgLSAxVUwpKQordm9pZCBudW1hX2VtdV9jbWRsaW5lKGNoYXIgKik7CisjZW5kaWYgLyogQ09ORklHX05VTUFfRU1VICovCisKICNlbmRpZgkvKiBfQVNNX1g4Nl9OVU1BX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL251bWFfMzIuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL251bWFfMzIuaAppbmRleCBjNmJlZWQxZS4uZTdkNmI4MiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbnVtYV8zMi5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL251bWFfMzIuaApAQCAtMSwxNiArMSw2IEBACiAjaWZuZGVmIF9BU01fWDg2X05VTUFfMzJfSAogI2RlZmluZSBfQVNNX1g4Nl9OVU1BXzMyX0gKIAotZXh0ZXJuIGludCBudW1hX29mZjsKLQotZXh0ZXJuIGludCBweG1fdG9fbmlkKGludCBweG0pOwotCi0jaWZkZWYgQ09ORklHX05VTUEKLWV4dGVybiBpbnQgX19jcHVpbml0IG51bWFfY3B1X25vZGUoaW50IGNwdSk7Ci0jZWxzZQkvKiBDT05GSUdfTlVNQSAqLwotc3RhdGljIGlubGluZSBpbnQgbnVtYV9jcHVfbm9kZShpbnQgY3B1KQkJeyByZXR1cm4gTlVNQV9OT19OT0RFOyB9Ci0jZW5kaWYJLyogQ09ORklHX05VTUEgKi8KLQogI2lmZGVmIENPTkZJR19ISUdITUVNCiBleHRlcm4gdm9pZCBzZXRfaGlnaG1lbV9wYWdlc19pbml0KHZvaWQpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL251bWFfNjQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL251bWFfNjQuaAppbmRleCAzNDRlYjE3Li4wYzA1ZjdhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9udW1hXzY0LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbnVtYV82NC5oCkBAIC0xLDQyICsxLDYgQEAKICNpZm5kZWYgX0FTTV9YODZfTlVNQV82NF9ICiAjZGVmaW5lIF9BU01fWDg2X05VTUFfNjRfSAogCi0jaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KLQotc3RydWN0IGJvb3Rub2RlIHsKLQl1NjQgc3RhcnQ7Ci0JdTY0IGVuZDsKLX07Ci0KLSNkZWZpbmUgWk9ORV9BTElHTiAoMVVMIDw8IChNQVhfT1JERVIrUEFHRV9TSElGVCkpCi0KLWV4dGVybiBpbnQgbnVtYV9vZmY7Ci0KIGV4dGVybiB1bnNpZ25lZCBsb25nIG51bWFfZnJlZV9hbGxfYm9vdG1lbSh2b2lkKTsKLWV4dGVybiB2b2lkIHNldHVwX25vZGVfYm9vdG1lbShpbnQgbm9kZWlkLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZW5kKTsKLQotI2lmZGVmIENPTkZJR19OVU1BCi0vKgotICogVG9vIHNtYWxsIG5vZGUgc2l6ZXMgbWF5IGNvbmZ1c2UgdGhlIFZNIGJhZGx5LiBVc3VhbGx5IHRoZXkKLSAqIHJlc3VsdCBmcm9tIEJJT1MgYnVncy4gU28gZG9udCByZWNvZ25pemUgbm9kZXMgYXMgc3RhbmRhbG9uZQotICogTlVNQSBlbnRpdGllcyB0aGF0IGhhdmUgbGVzcyB0aGFuIHRoaXMgYW1vdW50IG9mIFJBTSBsaXN0ZWQ6Ci0gKi8KLSNkZWZpbmUgTk9ERV9NSU5fU0laRSAoNCoxMDI0KjEwMjQpCi0KLWV4dGVybiBub2RlbWFza190IG51bWFfbm9kZXNfcGFyc2VkIF9faW5pdGRhdGE7Ci0KLWV4dGVybiBpbnQgX19jcHVpbml0IG51bWFfY3B1X25vZGUoaW50IGNwdSk7Ci1leHRlcm4gaW50IF9faW5pdCBudW1hX2FkZF9tZW1ibGsoaW50IG5vZGVpZCwgdTY0IHN0YXJ0LCB1NjQgZW5kKTsKLWV4dGVybiB2b2lkIF9faW5pdCBudW1hX3NldF9kaXN0YW5jZShpbnQgZnJvbSwgaW50IHRvLCBpbnQgZGlzdGFuY2UpOwotCi0jaWZkZWYgQ09ORklHX05VTUFfRU1VCi0jZGVmaW5lIEZBS0VfTk9ERV9NSU5fU0laRQkoKHU2NCkzMiA8PCAyMCkKLSNkZWZpbmUgRkFLRV9OT0RFX01JTl9IQVNIX01BU0sJKH4oRkFLRV9OT0RFX01JTl9TSVpFIC0gMVVMKSkKLXZvaWQgbnVtYV9lbXVfY21kbGluZShjaGFyICopOwotI2VuZGlmIC8qIENPTkZJR19OVU1BX0VNVSAqLwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IG51bWFfY3B1X25vZGUoaW50IGNwdSkJCXsgcmV0dXJuIE5VTUFfTk9fTk9ERTsgfQotI2VuZGlmCiAKICNlbmRpZiAvKiBfQVNNX1g4Nl9OVU1BXzY0X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL251bWFxLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9udW1hcS5oCmluZGV4IDM3YzUxNjUuLmMzYjNjMzIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL251bWFxLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbnVtYXEuaApAQCAtMjksNyArMjksNyBAQAogI2lmZGVmIENPTkZJR19YODZfTlVNQVEKIAogZXh0ZXJuIGludCBmb3VuZF9udW1hcTsKLWV4dGVybiBpbnQgZ2V0X21lbWNmZ19udW1hcSh2b2lkKTsKK2V4dGVybiBpbnQgbnVtYXFfbnVtYV9pbml0KHZvaWQpOwogZXh0ZXJuIGludCBwY2lfbnVtYXFfaW5pdCh2b2lkKTsKIAogZXh0ZXJuIHZvaWQgKnhxdWFkX3BvcnRpbzsKQEAgLTE2NiwxMSArMTY2LDYgQEAKIAogdm9pZCBudW1hcV90c2NfZGlzYWJsZSh2b2lkKTsKIAotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IGdldF9tZW1jZmdfbnVtYXEodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KICNlbmRpZiAvKiBDT05GSUdfWDg2X05VTUFRICovCiAjZW5kaWYgLyogX0FTTV9YODZfTlVNQVFfSCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9vbHBjX29mdy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vb2xwY19vZncuaAppbmRleCBjNWQzYTVhLi4yNDQ4NzcxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9vbHBjX29mdy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL29scGNfb2Z3LmgKQEAgLTI2LDE1ICsyNiwxMiBAQAogLyogY2hlY2sgaWYgT0ZXIHdhcyBkZXRlY3RlZCBkdXJpbmcgYm9vdCAqLwogZXh0ZXJuIGJvb2wgb2xwY19vZndfcHJlc2VudCh2b2lkKTsKIAorZXh0ZXJuIHZvaWQgb2xwY19kdF9idWlsZF9kZXZpY2V0cmVlKHZvaWQpOworCiAjZWxzZSAvKiAhQ09ORklHX09MUEMgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBvbHBjX29md19kZXRlY3Qodm9pZCkgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBfb2xwY19vZndfcGdkKHZvaWQpIHsgfQotI2VuZGlmIC8qICFDT05GSUdfT0xQQyAqLwotCi0jaWZkZWYgQ09ORklHX09GX1BST01UUkVFCi1leHRlcm4gdm9pZCBvbHBjX2R0X2J1aWxkX2RldmljZXRyZWUodm9pZCk7Ci0jZWxzZQogc3RhdGljIGlubGluZSB2b2lkIG9scGNfZHRfYnVpbGRfZGV2aWNldHJlZSh2b2lkKSB7IH0KLSNlbmRpZgorI2VuZGlmIC8qICFDT05GSUdfT0xQQyAqLwogCiAjZW5kaWYgLyogX0FTTV9YODZfT0xQQ19PRldfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGVyY3B1LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZXJjcHUuaAppbmRleCBkNDc1YjQzLi41MzI3OGIwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZXJjcHUuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZXJjcHUuaApAQCAtNTE3LDcgKzUxNyw3IEBACiAJdHlwZW9mKG8yKSBfX28yID0gbzI7CQkJCQkJXAogCXR5cGVvZihvMikgX19uMiA9IG4yOwkJCQkJCVwKIAl0eXBlb2YobzIpIF9fZHVtbXk7CQkJCQkJXAotCWFsdGVybmF0aXZlX2lvKCJjYWxsIHRoaXNfY3B1X2NtcHhjaGcxNmJfZW11XG5cdCIgUDZfTk9QNCwJXAorCWFsdGVybmF0aXZlX2lvKCJjYWxsIHRoaXNfY3B1X2NtcHhjaGcxNmJfZW11XG5cdCIgQVNNX05PUDQsCVwKIAkJICAgICAgICJjbXB4Y2hnMTZiICIgX19wZXJjcHVfcHJlZml4ICIoJSVyc2kpXG5cdHNldHogJTBcblx0IiwJXAogCQkgICAgICAgWDg2X0ZFQVRVUkVfQ1gxNiwJCQkJXAogCQkgICAgICAgQVNNX09VVFBVVDIoIj1hIihfX3JldCksICI9ZCIoX19kdW1teSkpLAkJXApAQCAtNTQyLDYgKzU0MiwzMyBAQAogCW9sZF9fOwkJCQkJCQkJXAogfSkKIAorc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgeDg2X3RoaXNfY3B1X2NvbnN0YW50X3Rlc3RfYml0KHVuc2lnbmVkIGludCBuciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgX19wZXJjcHUgKmFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBfX3BlcmNwdSAqYSA9ICh1bnNpZ25lZCBsb25nICopYWRkciArIG5yIC8gQklUU19QRVJfTE9ORzsKKworCXJldHVybiAoKDFVTCA8PCAobnIgJSBCSVRTX1BFUl9MT05HKSkgJiBwZXJjcHVfcmVhZCgqYSkpICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHg4Nl90aGlzX2NwdV92YXJpYWJsZV90ZXN0X2JpdChpbnQgbnIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nIF9fcGVyY3B1ICphZGRyKQoreworCWludCBvbGRiaXQ7CisKKwlhc20gdm9sYXRpbGUoImJ0ICJfX3BlcmNwdV9hcmcoMikiLCUxXG5cdCIKKwkJCSJzYmIgJTAsJTAiCisJCQk6ICI9ciIgKG9sZGJpdCkKKwkJCTogIm0iICgqKHVuc2lnbmVkIGxvbmcgKilhZGRyKSwgIklyIiAobnIpKTsKKworCXJldHVybiBvbGRiaXQ7Cit9CisKKyNkZWZpbmUgeDg2X3RoaXNfY3B1X3Rlc3RfYml0KG5yLCBhZGRyKQkJCVwKKwkoX19idWlsdGluX2NvbnN0YW50X3AoKG5yKSkJCQlcCisJID8geDg2X3RoaXNfY3B1X2NvbnN0YW50X3Rlc3RfYml0KChuciksIChhZGRyKSkJXAorCSA6IHg4Nl90aGlzX2NwdV92YXJpYWJsZV90ZXN0X2JpdCgobnIpLCAoYWRkcikpKQorCisKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wZXJjcHUuaD4KIAogLyogV2UgY2FuIHVzZSB0aGlzIGRpcmVjdGx5IGZvciBsb2NhbCBDUFUgKGZhc3RlcikuICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9iZV9yb21zLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9iZV9yb21zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk1MGEwYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2JlX3JvbXMuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgX1BST0JFX1JPTVNfSF8KKyNkZWZpbmUgX1BST0JFX1JPTVNfSF8KK3N0cnVjdCBwY2lfZGV2OworCitleHRlcm4gdm9pZCBfX2lvbWVtICpwY2lfbWFwX2Jpb3Nyb20oc3RydWN0IHBjaV9kZXYgKnBkZXYpOworZXh0ZXJuIHZvaWQgcGNpX3VubWFwX2Jpb3Nyb20odm9pZCBfX2lvbWVtICpyb20pOworZXh0ZXJuIHNpemVfdCBwY2lfYmlvc3JvbV9zaXplKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLWZsYWdzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3ItZmxhZ3MuaAppbmRleCBhODk4YTJiLi41OWFiNGRmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3ItZmxhZ3MuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3ItZmxhZ3MuaApAQCAtNjAsNiArNjAsNyBAQAogI2RlZmluZSBYODZfQ1I0X09TWE1NRVhDUFQgMHgwMDAwMDQwMCAvKiBlbmFibGUgdW5tYXNrZWQgU1NFIGV4Y2VwdGlvbnMgKi8KICNkZWZpbmUgWDg2X0NSNF9WTVhFCTB4MDAwMDIwMDAgLyogZW5hYmxlIFZNWCB2aXJ0dWFsaXphdGlvbiAqLwogI2RlZmluZSBYODZfQ1I0X09TWFNBVkUgMHgwMDA0MDAwMCAvKiBlbmFibGUgeHNhdmUgYW5kIHhyZXN0b3JlICovCisjZGVmaW5lIFg4Nl9DUjRfU01FUAkweDAwMTAwMDAwIC8qIGVuYWJsZSBTTUVQIHN1cHBvcnQgKi8KIAogLyoKICAqIHg4Ni02NCBUYXNrIFByaW9yaXR5IFJlZ2lzdGVyLCBDUjgKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NldHVwLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zZXR1cC5oCmluZGV4IGRiOGFhMTkuLjk3NTY1NTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NldHVwLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc2V0dXAuaApAQCAtODgsNyArODgsNyBAQAogICogZXhlY3V0YWJsZS4pCiAgKi8KICNkZWZpbmUgUkVTRVJWRV9CUksobmFtZSxzeikJCQkJCQlcCi0Jc3RhdGljIHZvaWQgX19zZWN0aW9uKC5kaXNjYXJkLnRleHQpIF9fdXNlZAkJCVwKKwlzdGF0aWMgdm9pZCBfX3NlY3Rpb24oLmRpc2NhcmQudGV4dCkgX191c2VkIG5vdHJhY2UJCVwKIAlfX2Jya19yZXNlcnZhdGlvbl9mbl8jI25hbWUjI19fKHZvaWQpIHsJCQkJXAogCQlhc20gdm9sYXRpbGUgKAkJCQkJCVwKIAkJCSIucHVzaHNlY3Rpb24gLmJya19yZXNlcnZhdGlvbixcImF3XCIsQG5vYml0czsiIFwKQEAgLTEwNCwxMCArMTA0LDEwIEBACiAJdHlwZSAqbmFtZTsJCQkJCVwKIAlSRVNFUlZFX0JSSyhuYW1lLCBzaXplb2YodHlwZSkgKiBlbnRyaWVzKQogCitleHRlcm4gdm9pZCBwcm9iZV9yb21zKHZvaWQpOwogI2lmZGVmIF9faTM4Nl9fCiAKIHZvaWQgX19pbml0IGkzODZfc3RhcnRfa2VybmVsKHZvaWQpOwotZXh0ZXJuIHZvaWQgcHJvYmVfcm9tcyh2b2lkKTsKIAogI2Vsc2UKIHZvaWQgX19pbml0IHg4Nl82NF9zdGFydF9rZXJuZWwoY2hhciAqcmVhbF9tb2RlKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NyYXQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NyYXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUwOGQ2My4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcmF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogU29tZSBvZiB0aGUgY29kZSBpbiB0aGlzIGZpbGUgaGFzIGJlZW4gZ2xlYW5lZCBmcm9tIHRoZSA2NCBiaXQKLSAqIGRpc2NvbnRpZ21lbSBzdXBwb3J0IGNvZGUgYmFzZS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIsIElCTSBDb3JwLgotICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKLSAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCi0gKiBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICogU2VuZCBmZWVkYmFjayB0byBQYXQgR2F1Z2hlbiA8Z29uZUB1cy5pYm0uY29tPgotICovCi0KLSNpZm5kZWYgX0FTTV9YODZfU1JBVF9ICi0jZGVmaW5lIF9BU01fWDg2X1NSQVRfSAotCi0jaWZkZWYgQ09ORklHX0FDUElfTlVNQQotZXh0ZXJuIGludCBnZXRfbWVtY2ZnX2Zyb21fc3JhdCh2b2lkKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBnZXRfbWVtY2ZnX2Zyb21fc3JhdCh2b2lkKQotewotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfQVNNX1g4Nl9TUkFUX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N0YWNrdHJhY2UuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N0YWNrdHJhY2UuaAppbmRleCBkN2U4OWM4Li43MGJiZTM5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zdGFja3RyYWNlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3RhY2t0cmFjZS5oCkBAIC0zNyw5ICszNyw2IEBACiAvKiBHZW5lcmljIHN0YWNrIHRyYWNlciB3aXRoIGNhbGxiYWNrcyAqLwogCiBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgewotCXZvaWQgKCp3YXJuaW5nKSh2b2lkICpkYXRhLCBjaGFyICptc2cpOwotCS8qIG1zZyBtdXN0IGNvbnRhaW4gJXMgZm9yIHRoZSBzeW1ib2wgKi8KLQl2b2lkICgqd2FybmluZ19zeW1ib2wpKHZvaWQgKmRhdGEsIGNoYXIgKm1zZywgdW5zaWduZWQgbG9uZyBzeW1ib2wpOwogCXZvaWQgKCphZGRyZXNzKSh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCByZWxpYWJsZSk7CiAJLyogT24gbmVnYXRpdmUgcmV0dXJuIHN0b3AgZHVtcGluZyAqLwogCWludCAoKnN0YWNrKSh2b2lkICpkYXRhLCBjaGFyICpuYW1lKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N5c3RlbS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3lzdGVtLmgKaW5kZXggMTI1NjllNi4uYzJmZjJhMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3lzdGVtLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3lzdGVtLmgKQEAgLTMwMywyNCArMzAzLDgxIEBACiAjaWZkZWYgQ09ORklHX1BBUkFWSVJUCiAjaW5jbHVkZSA8YXNtL3BhcmF2aXJ0Lmg+CiAjZWxzZQotI2RlZmluZSByZWFkX2NyMCgpCShuYXRpdmVfcmVhZF9jcjAoKSkKLSNkZWZpbmUgd3JpdGVfY3IwKHgpCShuYXRpdmVfd3JpdGVfY3IwKHgpKQotI2RlZmluZSByZWFkX2NyMigpCShuYXRpdmVfcmVhZF9jcjIoKSkKLSNkZWZpbmUgd3JpdGVfY3IyKHgpCShuYXRpdmVfd3JpdGVfY3IyKHgpKQotI2RlZmluZSByZWFkX2NyMygpCShuYXRpdmVfcmVhZF9jcjMoKSkKLSNkZWZpbmUgd3JpdGVfY3IzKHgpCShuYXRpdmVfd3JpdGVfY3IzKHgpKQotI2RlZmluZSByZWFkX2NyNCgpCShuYXRpdmVfcmVhZF9jcjQoKSkKLSNkZWZpbmUgcmVhZF9jcjRfc2FmZSgpCShuYXRpdmVfcmVhZF9jcjRfc2FmZSgpKQotI2RlZmluZSB3cml0ZV9jcjQoeCkJKG5hdGl2ZV93cml0ZV9jcjQoeCkpCi0jZGVmaW5lIHdiaW52ZCgpCShuYXRpdmVfd2JpbnZkKCkpCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyByZWFkX2NyMCh2b2lkKQoreworCXJldHVybiBuYXRpdmVfcmVhZF9jcjAoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2NyMCh1bnNpZ25lZCBsb25nIHgpCit7CisJbmF0aXZlX3dyaXRlX2NyMCh4KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJlYWRfY3IyKHZvaWQpCit7CisJcmV0dXJuIG5hdGl2ZV9yZWFkX2NyMigpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfY3IyKHVuc2lnbmVkIGxvbmcgeCkKK3sKKwluYXRpdmVfd3JpdGVfY3IyKHgpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVhZF9jcjModm9pZCkKK3sKKwlyZXR1cm4gbmF0aXZlX3JlYWRfY3IzKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9jcjModW5zaWduZWQgbG9uZyB4KQoreworCW5hdGl2ZV93cml0ZV9jcjMoeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyByZWFkX2NyNCh2b2lkKQoreworCXJldHVybiBuYXRpdmVfcmVhZF9jcjQoKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJlYWRfY3I0X3NhZmUodm9pZCkKK3sKKwlyZXR1cm4gbmF0aXZlX3JlYWRfY3I0X3NhZmUoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2NyNCh1bnNpZ25lZCBsb25nIHgpCit7CisJbmF0aXZlX3dyaXRlX2NyNCh4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdiaW52ZCh2b2lkKQoreworCW5hdGl2ZV93YmludmQoKTsKK30KKwogI2lmZGVmIENPTkZJR19YODZfNjQKLSNkZWZpbmUgcmVhZF9jcjgoKQkobmF0aXZlX3JlYWRfY3I4KCkpCi0jZGVmaW5lIHdyaXRlX2NyOCh4KQkobmF0aXZlX3dyaXRlX2NyOCh4KSkKLSNkZWZpbmUgbG9hZF9nc19pbmRleCAgIG5hdGl2ZV9sb2FkX2dzX2luZGV4CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyByZWFkX2NyOCh2b2lkKQoreworCXJldHVybiBuYXRpdmVfcmVhZF9jcjgoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2NyOCh1bnNpZ25lZCBsb25nIHgpCit7CisJbmF0aXZlX3dyaXRlX2NyOCh4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxvYWRfZ3NfaW5kZXgodW5zaWduZWQgc2VsZWN0b3IpCit7CisJbmF0aXZlX2xvYWRfZ3NfaW5kZXgoc2VsZWN0b3IpOworfQorCiAjZW5kaWYKIAogLyogQ2xlYXIgdGhlICdUUycgYml0ICovCi0jZGVmaW5lIGNsdHMoKQkJKG5hdGl2ZV9jbHRzKCkpCitzdGF0aWMgaW5saW5lIHZvaWQgY2x0cyh2b2lkKQoreworCW5hdGl2ZV9jbHRzKCk7Cit9CiAKICNlbmRpZi8qIENPTkZJR19QQVJBVklSVCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90b3BvbG9neS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaAppbmRleCA5MTBhNzA4Li5jMDA2OTI0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90b3BvbG9neS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKQEAgLTkzLDE5ICs5MywxMSBAQAogI2RlZmluZSBwY2lidXNfdG9fbm9kZShidXMpIF9fcGNpYnVzX3RvX25vZGUoYnVzKQogCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbm9kZV9zdGFydF9wZm5bXTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIG5vZGVfZW5kX3BmbltdOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbm9kZV9yZW1hcF9zaXplW107Ci0jZGVmaW5lIG5vZGVfaGFzX29ubGluZV9tZW0obmlkKSAobm9kZV9zdGFydF9wZm5bbmlkXSAhPSBub2RlX2VuZF9wZm5bbmlkXSkKLQogIyBkZWZpbmUgU0RfQ0FDSEVfTklDRV9UUklFUwkxCiAjIGRlZmluZSBTRF9JRExFX0lEWAkJMQotCiAjZWxzZQotCiAjIGRlZmluZSBTRF9DQUNIRV9OSUNFX1RSSUVTCTIKICMgZGVmaW5lIFNEX0lETEVfSURYCQkyCi0KICNlbmRpZgogCiAvKiBzY2hlZF9kb21haW5zIFNEX05PREVfSU5JVCBmb3IgTlVNQSBtYWNoaW5lcyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IGFiZDNlMGUuLjk5ZjBhZDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTQyLDcgKzQyLDcgQEAKICAqIFJldHVybnMgMCBpZiB0aGUgcmFuZ2UgaXMgdmFsaWQsIG5vbnplcm8gb3RoZXJ3aXNlLgogICoKICAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nIHRlc3Q6Ci0gKiAodTMzKWFkZHIgKyAodTMzKXNpemUgPj0gKHUzMyljdXJyZW50LT5hZGRyX2xpbWl0LnNlZyAodTY1IGZvciB4ODZfNjQpCisgKiAodTMzKWFkZHIgKyAodTMzKXNpemUgPiAodTMzKWN1cnJlbnQtPmFkZHJfbGltaXQuc2VnICh1NjUgZm9yIHg4Nl82NCkKICAqCiAgKiBUaGlzIG5lZWRzIDMzLWJpdCAoNjUtYml0IGZvciB4ODZfNjQpIGFyaXRobWV0aWMuIFdlIGhhdmUgYSBjYXJyeS4uLgogICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ZW4vcGFnZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL3BhZ2UuaAppbmRleCBjNjE5MzRmLi42NGE2MTlkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ZW4vcGFnZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi9wYWdlLmgKQEAgLTQ3LDggKzQ3LDkgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHNldF9waHlzX3JhbmdlX2lkZW50aXR5KHVuc2lnbmVkIGxvbmcgcGZuX3MsCiAJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBwZm5fZSk7CiAKLWV4dGVybiBpbnQgbTJwX2FkZF9vdmVycmlkZSh1bnNpZ25lZCBsb25nIG1mbiwgc3RydWN0IHBhZ2UgKnBhZ2UpOwotZXh0ZXJuIGludCBtMnBfcmVtb3ZlX292ZXJyaWRlKHN0cnVjdCBwYWdlICpwYWdlKTsKK2V4dGVybiBpbnQgbTJwX2FkZF9vdmVycmlkZSh1bnNpZ25lZCBsb25nIG1mbiwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgICAgYm9vbCBjbGVhcl9wdGUpOworZXh0ZXJuIGludCBtMnBfcmVtb3ZlX292ZXJyaWRlKHN0cnVjdCBwYWdlICpwYWdlLCBib29sIGNsZWFyX3B0ZSk7CiBleHRlcm4gc3RydWN0IHBhZ2UgKm0ycF9maW5kX292ZXJyaWRlKHVuc2lnbmVkIGxvbmcgbWZuKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIG0ycF9maW5kX292ZXJyaWRlX3Bmbih1bnNpZ25lZCBsb25nIG1mbiwgdW5zaWduZWQgbG9uZyBwZm4pOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ZW4vcGNpLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ZW4vcGNpLmgKaW5kZXggYWE4NjIwOS4uNGZiZGE5YSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL3BjaS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi9wY2kuaApAQCAtMTUsMTAgKzE1LDI2IEBACiAjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19YRU5fRE9NMCkKIHZvaWQgX19pbml0IHhlbl9zZXR1cF9waXJxcyh2b2lkKTsKK2ludCB4ZW5fZmluZF9kZXZpY2VfZG9tYWluX293bmVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworaW50IHhlbl9yZWdpc3Rlcl9kZXZpY2VfZG9tYWluX293bmVyKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHVpbnQxNl90IGRvbWFpbik7CitpbnQgeGVuX3VucmVnaXN0ZXJfZGV2aWNlX2RvbWFpbl9vd25lcihzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IHhlbl9zZXR1cF9waXJxcyh2b2lkKQogewogfQorc3RhdGljIGlubGluZSBpbnQgeGVuX2ZpbmRfZGV2aWNlX2RvbWFpbl9vd25lcihzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXJldHVybiAtMTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHhlbl9yZWdpc3Rlcl9kZXZpY2VfZG9tYWluX293bmVyKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJCQkgICB1aW50MTZfdCBkb21haW4pCit7CisJcmV0dXJuIC0xOworfQorc3RhdGljIGlubGluZSBpbnQgeGVuX3VucmVnaXN0ZXJfZGV2aWNlX2RvbWFpbl9vd25lcihzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXJldHVybiAtMTsKK30KICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfUENJX01TSSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gveDg2L2tlcm5lbC9NYWtlZmlsZQppbmRleCA3MzM4ZWYyLi4yNTA4MDY0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYva2VybmVsL01ha2VmaWxlCkBAIC0zNiw3ICszNiw3IEBACiBvYmoteQkJCSs9IHRpbWUubyBpb3BvcnQubyBsZHQubyBkdW1wc3RhY2subwogb2JqLXkJCQkrPSBzZXR1cC5vIHg4Nl9pbml0Lm8gaTgyNTkubyBpcnFpbml0Lm8ganVtcF9sYWJlbC5vCiBvYmotJChDT05GSUdfSVJRX1dPUkspICArPSBpcnFfd29yay5vCi1vYmotJChDT05GSUdfWDg2XzMyKQkrPSBwcm9iZV9yb21zXzMyLm8KK29iai15CQkJKz0gcHJvYmVfcm9tcy5vCiBvYmotJChDT05GSUdfWDg2XzMyKQkrPSBzeXNfaTM4Nl8zMi5vIGkzODZfa3N5bXNfMzIubwogb2JqLSQoQ09ORklHX1g4Nl82NCkJKz0gc3lzX3g4Nl82NC5vIHg4NjY0X2tzeW1zXzY0Lm8KIG9iai0kKENPTkZJR19YODZfNjQpCSs9IHN5c2NhbGxfNjQubyB2c3lzY2FsbF82NC5vCkBAIC0xMTcsNyArMTE3LDcgQEAKIGlmZXEgKCQoQ09ORklHX1g4Nl82NCkseSkKIAlvYmotJChDT05GSUdfQVVESVQpCQkrPSBhdWRpdF82NC5vCiAKLQlvYmotJChDT05GSUdfR0FSVF9JT01NVSkJKz0gcGNpLWdhcnRfNjQubyBhcGVydHVyZV82NC5vCisJb2JqLSQoQ09ORklHX0dBUlRfSU9NTVUpCSs9IGFtZF9nYXJ0XzY0Lm8gYXBlcnR1cmVfNjQubwogCW9iai0kKENPTkZJR19DQUxHQVJZX0lPTU1VKQkrPSBwY2ktY2FsZ2FyeV82NC5vIHRjZV82NC5vCiAJb2JqLSQoQ09ORklHX0FNRF9JT01NVSkJCSs9IGFtZF9pb21tdV9pbml0Lm8gYW1kX2lvbW11Lm8KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FjcGkvc2xlZXAuYyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL3NsZWVwLmMKaW5kZXggZmY5M2JjMS4uMThhODU3YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FjcGkvc2xlZXAuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9zbGVlcC5jCkBAIC0xMTIsMTEgKzExMiw2IEBACiAjaWZkZWYgQ09ORklHX0hJQkVSTkFUSU9OCiAJCWlmIChzdHJuY21wKHN0ciwgInM0X25vaHdzaWciLCAxMCkgPT0gMCkKIAkJCWFjcGlfbm9fczRfaHdfc2lnbmF0dXJlKCk7Ci0JCWlmIChzdHJuY21wKHN0ciwgInM0X25vbnZzIiwgOCkgPT0gMCkgewotCQkJcHJfd2FybmluZygiQUNQSTogYWNwaV9zbGVlcD1zNF9ub252cyBpcyBkZXByZWNhdGVkLCAiCi0JCQkJCSJwbGVhc2UgdXNlIGFjcGlfc2xlZXA9bm9udnMgaW5zdGVhZCIpOwotCQkJYWNwaV9udnNfbm9zYXZlKCk7Ci0JCX0KICNlbmRpZgogCQlpZiAoc3RybmNtcChzdHIsICJub252cyIsIDUpID09IDApCiAJCQlhY3BpX252c19ub3NhdmUoKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hbHRlcm5hdGl2ZS5jIGIvYXJjaC94ODYva2VybmVsL2FsdGVybmF0aXZlLmMKaW5kZXggNGEyMzQ2Ny4uYTgxZjJkNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FsdGVybmF0aXZlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FsdGVybmF0aXZlLmMKQEAgLTY3LDE3ICs2NywzMCBAQAogI2RlZmluZSBEUFJJTlRLKGZtdCwgYXJncy4uLikgaWYgKGRlYnVnX2FsdGVybmF0aXZlKSBcCiAJcHJpbnRrKEtFUk5fREVCVUcgZm10LCBhcmdzKQogCisvKgorICogRWFjaCBHRU5FUklDX05PUFggaXMgb2YgWCBieXRlcywgYW5kIGRlZmluZWQgYXMgYW4gYXJyYXkgb2YgYnl0ZXMKKyAqIHRoYXQgY29ycmVzcG9uZCB0byB0aGF0IG5vcC4gR2V0dGluZyBmcm9tIG9uZSBub3AgdG8gdGhlIG5leHQsIHdlCisgKiBhZGQgdG8gdGhlIGFycmF5IHRoZSBvZmZzZXQgdGhhdCBpcyBlcXVhbCB0byB0aGUgc3VtIG9mIGFsbCBzaXplcyBvZgorICogbm9wcyBwcmVjZWRpbmcgdGhlIG9uZSB3ZSBhcmUgYWZ0ZXIuCisgKgorICogTm90ZTogVGhlIEdFTkVSSUNfTk9QNV9BVE9NSUMgaXMgYXQgdGhlIGVuZCwgYXMgaXQgYnJlYWtzIHRoZQorICogbmljZSBzeW1tZXRyeSBvZiBzaXplcyBvZiB0aGUgcHJldmlvdXMgbm9wcy4KKyAqLwogI2lmIGRlZmluZWQoR0VORVJJQ19OT1AxKSAmJiAhZGVmaW5lZChDT05GSUdfWDg2XzY0KQotLyogVXNlIGlubGluZSBhc3NlbWJseSB0byBkZWZpbmUgdGhpcyBiZWNhdXNlIHRoZSBub3BzIGFyZSBkZWZpbmVkCi0gICBhcyBpbmxpbmUgYXNzZW1ibHkgc3RyaW5ncyBpbiB0aGUgaW5jbHVkZSBmaWxlcyBhbmQgd2UgY2Fubm90Ci0gICBnZXQgdGhlbSBlYXNpbHkgaW50byBzdHJpbmdzLiAqLwotYXNtKCJcdCIgX19zdHJpbmdpZnkoX19JTklUUk9EQVRBX09SX01PRFVMRSkgIlxuaW50ZWxub3BzOiAiCi0JR0VORVJJQ19OT1AxIEdFTkVSSUNfTk9QMiBHRU5FUklDX05PUDMgR0VORVJJQ19OT1A0IEdFTkVSSUNfTk9QNSBHRU5FUklDX05PUDYKLQlHRU5FUklDX05PUDcgR0VORVJJQ19OT1A4Ci0gICAgIlx0LnByZXZpb3VzIik7Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBpbnRlbG5vcHNbXTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyICpjb25zdCBfX2luaXRjb25zdF9vcl9tb2R1bGUKLWludGVsX25vcHNbQVNNX05PUF9NQVgrMV0gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBpbnRlbG5vcHNbXSA9Cit7CisJR0VORVJJQ19OT1AxLAorCUdFTkVSSUNfTk9QMiwKKwlHRU5FUklDX05PUDMsCisJR0VORVJJQ19OT1A0LAorCUdFTkVSSUNfTk9QNSwKKwlHRU5FUklDX05PUDYsCisJR0VORVJJQ19OT1A3LAorCUdFTkVSSUNfTk9QOCwKKwlHRU5FUklDX05PUDVfQVRPTUlDCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBjb25zdCBpbnRlbF9ub3BzW0FTTV9OT1BfTUFYKzJdID0KK3sKIAlOVUxMLAogCWludGVsbm9wcywKIAlpbnRlbG5vcHMgKyAxLApAQCAtODcsMTcgKzEwMCwyNSBAQAogCWludGVsbm9wcyArIDEgKyAyICsgMyArIDQgKyA1LAogCWludGVsbm9wcyArIDEgKyAyICsgMyArIDQgKyA1ICsgNiwKIAlpbnRlbG5vcHMgKyAxICsgMiArIDMgKyA0ICsgNSArIDYgKyA3LAorCWludGVsbm9wcyArIDEgKyAyICsgMyArIDQgKyA1ICsgNiArIDcgKyA4LAogfTsKICNlbmRpZgogCiAjaWZkZWYgSzhfTk9QMQotYXNtKCJcdCIgX19zdHJpbmdpZnkoX19JTklUUk9EQVRBX09SX01PRFVMRSkgIlxuazhub3BzOiAiCi0JSzhfTk9QMSBLOF9OT1AyIEs4X05PUDMgSzhfTk9QNCBLOF9OT1A1IEs4X05PUDYKLQlLOF9OT1A3IEs4X05PUDgKLSAgICAiXHQucHJldmlvdXMiKTsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGs4bm9wc1tdOwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbnN0IF9faW5pdGNvbnN0X29yX21vZHVsZQotazhfbm9wc1tBU01fTk9QX01BWCsxXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGs4bm9wc1tdID0KK3sKKwlLOF9OT1AxLAorCUs4X05PUDIsCisJSzhfTk9QMywKKwlLOF9OT1A0LAorCUs4X05PUDUsCisJSzhfTk9QNiwKKwlLOF9OT1A3LAorCUs4X05PUDgsCisJSzhfTk9QNV9BVE9NSUMKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciAqIGNvbnN0IGs4X25vcHNbQVNNX05PUF9NQVgrMl0gPQorewogCU5VTEwsCiAJazhub3BzLAogCWs4bm9wcyArIDEsCkBAIC0xMDcsMTcgKzEyOCwyNSBAQAogCWs4bm9wcyArIDEgKyAyICsgMyArIDQgKyA1LAogCWs4bm9wcyArIDEgKyAyICsgMyArIDQgKyA1ICsgNiwKIAlrOG5vcHMgKyAxICsgMiArIDMgKyA0ICsgNSArIDYgKyA3LAorCWs4bm9wcyArIDEgKyAyICsgMyArIDQgKyA1ICsgNiArIDcgKyA4LAogfTsKICNlbmRpZgogCiAjaWYgZGVmaW5lZChLN19OT1AxKSAmJiAhZGVmaW5lZChDT05GSUdfWDg2XzY0KQotYXNtKCJcdCIgX19zdHJpbmdpZnkoX19JTklUUk9EQVRBX09SX01PRFVMRSkgIlxuazdub3BzOiAiCi0JSzdfTk9QMSBLN19OT1AyIEs3X05PUDMgSzdfTk9QNCBLN19OT1A1IEs3X05PUDYKLQlLN19OT1A3IEs3X05PUDgKLSAgICAiXHQucHJldmlvdXMiKTsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGs3bm9wc1tdOwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbnN0IF9faW5pdGNvbnN0X29yX21vZHVsZQotazdfbm9wc1tBU01fTk9QX01BWCsxXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGs3bm9wc1tdID0KK3sKKwlLN19OT1AxLAorCUs3X05PUDIsCisJSzdfTk9QMywKKwlLN19OT1A0LAorCUs3X05PUDUsCisJSzdfTk9QNiwKKwlLN19OT1A3LAorCUs3X05PUDgsCisJSzdfTk9QNV9BVE9NSUMKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciAqIGNvbnN0IGs3X25vcHNbQVNNX05PUF9NQVgrMl0gPQorewogCU5VTEwsCiAJazdub3BzLAogCWs3bm9wcyArIDEsCkBAIC0xMjcsMTcgKzE1NiwyNSBAQAogCWs3bm9wcyArIDEgKyAyICsgMyArIDQgKyA1LAogCWs3bm9wcyArIDEgKyAyICsgMyArIDQgKyA1ICsgNiwKIAlrN25vcHMgKyAxICsgMiArIDMgKyA0ICsgNSArIDYgKyA3LAorCWs3bm9wcyArIDEgKyAyICsgMyArIDQgKyA1ICsgNiArIDcgKyA4LAogfTsKICNlbmRpZgogCiAjaWZkZWYgUDZfTk9QMQotYXNtKCJcdCIgX19zdHJpbmdpZnkoX19JTklUUk9EQVRBX09SX01PRFVMRSkgIlxucDZub3BzOiAiCi0JUDZfTk9QMSBQNl9OT1AyIFA2X05PUDMgUDZfTk9QNCBQNl9OT1A1IFA2X05PUDYKLQlQNl9OT1A3IFA2X05PUDgKLSAgICAiXHQucHJldmlvdXMiKTsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIHA2bm9wc1tdOwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbnN0IF9faW5pdGNvbnN0X29yX21vZHVsZQotcDZfbm9wc1tBU01fTk9QX01BWCsxXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyICBfX2luaXRjb25zdF9vcl9tb2R1bGUgcDZub3BzW10gPQoreworCVA2X05PUDEsCisJUDZfTk9QMiwKKwlQNl9OT1AzLAorCVA2X05PUDQsCisJUDZfTk9QNSwKKwlQNl9OT1A2LAorCVA2X05PUDcsCisJUDZfTk9QOCwKKwlQNl9OT1A1X0FUT01JQworfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyICogY29uc3QgcDZfbm9wc1tBU01fTk9QX01BWCsyXSA9Cit7CiAJTlVMTCwKIAlwNm5vcHMsCiAJcDZub3BzICsgMSwKQEAgLTE0Nyw0NyArMTg0LDY1IEBACiAJcDZub3BzICsgMSArIDIgKyAzICsgNCArIDUsCiAJcDZub3BzICsgMSArIDIgKyAzICsgNCArIDUgKyA2LAogCXA2bm9wcyArIDEgKyAyICsgMyArIDQgKyA1ICsgNiArIDcsCisJcDZub3BzICsgMSArIDIgKyAzICsgNCArIDUgKyA2ICsgNyArIDgsCiB9OwogI2VuZGlmCiAKKy8qIEluaXRpYWxpemUgdGhlc2UgdG8gYSBzYWZlIGRlZmF1bHQgKi8KICNpZmRlZiBDT05GSUdfWDg2XzY0Citjb25zdCB1bnNpZ25lZCBjaGFyICogY29uc3QgKmlkZWFsX25vcHMgPSBwNl9ub3BzOworI2Vsc2UKK2NvbnN0IHVuc2lnbmVkIGNoYXIgKiBjb25zdCAqaWRlYWxfbm9wcyA9IGludGVsX25vcHM7CisjZW5kaWYKIAotZXh0ZXJuIGNoYXIgX192c3lzY2FsbF8wOwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbnN0ICpfX2luaXRfb3JfbW9kdWxlIGZpbmRfbm9wX3RhYmxlKHZvaWQpCit2b2lkIF9faW5pdCBhcmNoX2luaXRfaWRlYWxfbm9wcyh2b2lkKQogewotCWlmIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCAmJgotCSAgICBib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfTk9QTCkpCi0JCXJldHVybiBwNl9ub3BzOwotCWVsc2UKLQkJcmV0dXJuIGs4X25vcHM7CisJc3dpdGNoIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IpIHsKKwljYXNlIFg4Nl9WRU5ET1JfSU5URUw6CisJCS8qCisJCSAqIER1ZSB0byBhIGRlY29kZXIgaW1wbGVtZW50YXRpb24gcXVpcmssIHNvbWUKKwkJICogc3BlY2lmaWMgSW50ZWwgQ1BVcyBhY3R1YWxseSBwZXJmb3JtIGJldHRlciB3aXRoCisJCSAqIHRoZSAiazhfbm9wcyIgdGhhbiB3aXRoIHRoZSBTRE0tcmVjb21tZW5kZWQgTk9Qcy4KKwkJICovCisJCWlmIChib290X2NwdV9kYXRhLng4NiA9PSA2ICYmCisJCSAgICBib290X2NwdV9kYXRhLng4Nl9tb2RlbCA+PSAweDBmICYmCisJCSAgICBib290X2NwdV9kYXRhLng4Nl9tb2RlbCAhPSAweDFjICYmCisJCSAgICBib290X2NwdV9kYXRhLng4Nl9tb2RlbCAhPSAweDI2ICYmCisJCSAgICBib290X2NwdV9kYXRhLng4Nl9tb2RlbCAhPSAweDI3ICYmCisJCSAgICBib290X2NwdV9kYXRhLng4Nl9tb2RlbCA8IDB4MzApIHsKKwkJCWlkZWFsX25vcHMgPSBrOF9ub3BzOworCQl9IGVsc2UgaWYgKGJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9OT1BMKSkgeworCQkJICAgaWRlYWxfbm9wcyA9IHA2X25vcHM7CisJCX0gZWxzZSB7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCQkJaWRlYWxfbm9wcyA9IGs4X25vcHM7CisjZWxzZQorCQkJaWRlYWxfbm9wcyA9IGludGVsX25vcHM7CisjZW5kaWYKKwkJfQorCisJZGVmYXVsdDoKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJCWlkZWFsX25vcHMgPSBrOF9ub3BzOworI2Vsc2UKKwkJaWYgKGJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9LOCkpCisJCQlpZGVhbF9ub3BzID0gazhfbm9wczsKKwkJZWxzZSBpZiAoYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0s3KSkKKwkJCWlkZWFsX25vcHMgPSBrN19ub3BzOworCQllbHNlCisJCQlpZGVhbF9ub3BzID0gaW50ZWxfbm9wczsKKyNlbmRpZgorCX0KIH0KIAotI2Vsc2UgLyogQ09ORklHX1g4Nl82NCAqLwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciAqY29uc3QgKl9faW5pdF9vcl9tb2R1bGUgZmluZF9ub3BfdGFibGUodm9pZCkKLXsKLQlpZiAoYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0s4KSkKLQkJcmV0dXJuIGs4X25vcHM7Ci0JZWxzZSBpZiAoYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0s3KSkKLQkJcmV0dXJuIGs3X25vcHM7Ci0JZWxzZSBpZiAoYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX05PUEwpKQotCQlyZXR1cm4gcDZfbm9wczsKLQllbHNlCi0JCXJldHVybiBpbnRlbF9ub3BzOwotfQotCi0jZW5kaWYgLyogQ09ORklHX1g4Nl82NCAqLwotCiAvKiBVc2UgdGhpcyB0byBhZGQgbm9wcyB0byBhIGJ1ZmZlciwgdGhlbiB0ZXh0X3Bva2UgdGhlIHdob2xlIGJ1ZmZlci4gKi8KIHN0YXRpYyB2b2lkIF9faW5pdF9vcl9tb2R1bGUgYWRkX25vcHModm9pZCAqaW5zbnMsIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqY29uc3QgKm5vcHRhYmxlID0gZmluZF9ub3BfdGFibGUoKTsKLQogCXdoaWxlIChsZW4gPiAwKSB7CiAJCXVuc2lnbmVkIGludCBub3BsZW4gPSBsZW47CiAJCWlmIChub3BsZW4gPiBBU01fTk9QX01BWCkKIAkJCW5vcGxlbiA9IEFTTV9OT1BfTUFYOwotCQltZW1jcHkoaW5zbnMsIG5vcHRhYmxlW25vcGxlbl0sIG5vcGxlbik7CisJCW1lbWNweShpbnNucywgaWRlYWxfbm9wc1tub3BsZW5dLCBub3BsZW4pOwogCQlpbnNucyArPSBub3BsZW47CiAJCWxlbiAtPSBub3BsZW47CiAJfQpAQCAtMTk1LDYgKzI1MCw3IEBACiAKIGV4dGVybiBzdHJ1Y3QgYWx0X2luc3RyIF9fYWx0X2luc3RydWN0aW9uc1tdLCBfX2FsdF9pbnN0cnVjdGlvbnNfZW5kW107CiBleHRlcm4gczMyIF9fc21wX2xvY2tzW10sIF9fc21wX2xvY2tzX2VuZFtdOworZXh0ZXJuIGNoYXIgX192c3lzY2FsbF8wOwogdm9pZCAqdGV4dF9wb2tlX2Vhcmx5KHZvaWQgKmFkZHIsIGNvbnN0IHZvaWQgKm9wY29kZSwgc2l6ZV90IGxlbik7CiAKIC8qIFJlcGxhY2UgaW5zdHJ1Y3Rpb25zIHdpdGggYmV0dGVyIGFsdGVybmF0aXZlcyBmb3IgdGhpcyBDUFUgdHlwZS4KQEAgLTIxMCw2ICsyNjYsMTUgQEAKIAl1OCBpbnNuYnVmW01BWF9QQVRDSF9MRU5dOwogCiAJRFBSSU5USygiJXM6IGFsdCB0YWJsZSAlcCAtPiAlcFxuIiwgX19mdW5jX18sIHN0YXJ0LCBlbmQpOworCS8qCisJICogVGhlIHNjYW4gb3JkZXIgc2hvdWxkIGJlIGZyb20gc3RhcnQgdG8gZW5kLiBBIGxhdGVyIHNjYW5uZWQKKwkgKiBhbHRlcm5hdGl2ZSBjb2RlIGNhbiBvdmVyd3JpdGUgYSBwcmV2aW91cyBzY2FubmVkIGFsdGVybmF0aXZlIGNvZGUuCisJICogU29tZSBrZXJuZWwgZnVuY3Rpb25zIChlLmcuIG1lbWNweSwgbWVtc2V0LCBldGMpIHVzZSB0aGlzIG9yZGVyIHRvCisJICogcGF0Y2ggY29kZS4KKwkgKgorCSAqIFNvIGJlIGNhcmVmdWwgaWYgeW91IHdhbnQgdG8gY2hhbmdlIHRoZSBzY2FuIG9yZGVyIHRvIGFueSBvdGhlcgorCSAqIG9yZGVyLgorCSAqLwogCWZvciAoYSA9IHN0YXJ0OyBhIDwgZW5kOyBhKyspIHsKIAkJdTggKmluc3RyID0gYS0+aW5zdHI7CiAJCUJVR19PTihhLT5yZXBsYWNlbWVudGxlbiA+IGEtPmluc3RybGVuKTsKQEAgLTY3OCwyOSArNzQzLDMgQEAKIAl3cm90ZV90ZXh0ID0gMDsKIAlfX3N0b3BfbWFjaGluZShzdG9wX21hY2hpbmVfdGV4dF9wb2tlLCAodm9pZCAqKSZ0cHAsIE5VTEwpOwogfQotCi0jaWYgZGVmaW5lZChDT05GSUdfRFlOQU1JQ19GVFJBQ0UpIHx8IGRlZmluZWQoSEFWRV9KVU1QX0xBQkVMKQotCi0jaWZkZWYgQ09ORklHX1g4Nl82NAotdW5zaWduZWQgY2hhciBpZGVhbF9ub3A1WzVdID0geyAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDkwIH07Ci0jZWxzZQotdW5zaWduZWQgY2hhciBpZGVhbF9ub3A1WzVdID0geyAweDNlLCAweDhkLCAweDc0LCAweDI2LCAweDAwIH07Ci0jZW5kaWYKLQotdm9pZCBfX2luaXQgYXJjaF9pbml0X2lkZWFsX25vcDUodm9pZCkKLXsKLQkvKgotCSAqIFRoZXJlIGlzIG5vIGdvb2Qgbm9wIGZvciBhbGwgeDg2IGFyY2hzLiAgVGhpcyBzZWxlY3Rpb24KLQkgKiBhbGdvcml0aG0gc2hvdWxkIGJlIHVuaWZpZWQgd2l0aCB0aGUgb25lIGluIGZpbmRfbm9wX3RhYmxlKCksCi0JICogYnV0IHRoaXMgc2hvdWxkIGJlIGdvb2QgZW5vdWdoIGZvciBub3cuCi0JICoKLQkgKiBGb3IgY2FzZXMgb3RoZXIgdGhhbiB0aGUgb25lcyBiZWxvdywgdXNlIHRoZSBzYWZlIChhcyBpbgotCSAqIGFsd2F5cyBmdW5jdGlvbmFsKSBkZWZhdWx0cyBhYm92ZS4KLQkgKi8KLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JLyogRG9uJ3QgdXNlIHRoZXNlIG9uIDMyIGJpdHMgZHVlIHRvIGJyb2tlbiB2aXJ0dWFsaXplcnMgKi8KLQlpZiAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwpCi0JCW1lbWNweShpZGVhbF9ub3A1LCBwNl9ub3BzWzVdLCA1KTsKLSNlbmRpZgotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcGNpLWdhcnRfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9hbWRfZ2FydF82NC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3g4Ni9rZXJuZWwvcGNpLWdhcnRfNjQuYwpyZW5hbWUgdG8gYXJjaC94ODYva2VybmVsL2FtZF9nYXJ0XzY0LmMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXUuYyBiL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXUuYwppbmRleCA1N2NhNzc3Li44NzNlN2UxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdS5jCkBAIC0xOCw2ICsxOCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS1hdHMuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgpAQCAtMjUsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW9tbXUtaGVscGVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW9tbXUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS9wcm90by5oPgogI2luY2x1ZGUgPGFzbS9pb21tdS5oPgogI2luY2x1ZGUgPGFzbS9nYXJ0Lmg+CkBAIC0zNCw3ICszNiw3IEBACiAKICNkZWZpbmUgQ01EX1NFVF9UWVBFKGNtZCwgdCkgKChjbWQpLT5kYXRhWzFdIHw9ICgodCkgPDwgMjgpKQogCi0jZGVmaW5lIEVYSVRfTE9PUF9DT1VOVCAxMDAwMDAwMAorI2RlZmluZSBMT09QX1RJTUVPVVQJMTAwMDAwCiAKIHN0YXRpYyBERUZJTkVfUldMT0NLKGFtZF9pb21tdV9kZXZ0YWJsZV9sb2NrKTsKIApAQCAtNTcsNyArNTksNiBAQAogCXUzMiBkYXRhWzRdOwogfTsKIAotc3RhdGljIHZvaWQgcmVzZXRfaW9tbXVfY29tbWFuZF9idWZmZXIoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpOwogc3RhdGljIHZvaWQgdXBkYXRlX2RvbWFpbihzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zMjIsOCArMzIzLDYgQEAKIAkJYnJlYWs7CiAJY2FzZSBFVkVOVF9UWVBFX0lMTF9DTUQ6CiAJCXByaW50aygiSUxMRUdBTF9DT01NQU5EX0VSUk9SIGFkZHJlc3M9MHglMDE2bGx4XVxuIiwgYWRkcmVzcyk7Ci0JCWlvbW11LT5yZXNldF9pbl9wcm9ncmVzcyA9IHRydWU7Ci0JCXJlc2V0X2lvbW11X2NvbW1hbmRfYnVmZmVyKGlvbW11KTsKIAkJZHVtcF9jb21tYW5kKGFkZHJlc3MpOwogCQlicmVhazsKIAljYXNlIEVWRU5UX1RZUEVfQ01EX0hBUkRfRVJSOgpAQCAtMzY3LDcgKzM2Niw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKIH0KIAotaXJxcmV0dXJuX3QgYW1kX2lvbW11X2ludF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCitpcnFyZXR1cm5fdCBhbWRfaW9tbXVfaW50X3RocmVhZChpbnQgaXJxLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBhbWRfaW9tbXUgKmlvbW11OwogCkBAIC0zNzcsMTMwICszNzYsMzYwIEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCitpcnFyZXR1cm5fdCBhbWRfaW9tbXVfaW50X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIElPTU1VIGNvbW1hbmQgcXVldWluZyBmdW5jdGlvbnMKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIFdyaXRlcyB0aGUgY29tbWFuZCB0byB0aGUgSU9NTVVzIGNvbW1hbmQgYnVmZmVyIGFuZCBpbmZvcm1zIHRoZQotICogaGFyZHdhcmUgYWJvdXQgdGhlIG5ldyBjb21tYW5kLiBNdXN0IGJlIGNhbGxlZCB3aXRoIGlvbW11LT5sb2NrIGhlbGQuCi0gKi8KLXN0YXRpYyBpbnQgX19pb21tdV9xdWV1ZV9jb21tYW5kKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11LCBzdHJ1Y3QgaW9tbXVfY21kICpjbWQpCitzdGF0aWMgaW50IHdhaXRfb25fc2VtKHZvbGF0aWxlIHU2NCAqc2VtKQogewotCXUzMiB0YWlsLCBoZWFkOwotCXU4ICp0YXJnZXQ7CisJaW50IGkgPSAwOwogCi0JV0FSTl9PTihpb21tdS0+Y21kX2J1Zl9zaXplICYgQ01EX0JVRkZFUl9VTklOSVRJQUxJWkVEKTsKLQl0YWlsID0gcmVhZGwoaW9tbXUtPm1taW9fYmFzZSArIE1NSU9fQ01EX1RBSUxfT0ZGU0VUKTsKLQl0YXJnZXQgPSBpb21tdS0+Y21kX2J1ZiArIHRhaWw7Ci0JbWVtY3B5X3RvaW8odGFyZ2V0LCBjbWQsIHNpemVvZigqY21kKSk7Ci0JdGFpbCA9ICh0YWlsICsgc2l6ZW9mKCpjbWQpKSAlIGlvbW11LT5jbWRfYnVmX3NpemU7Ci0JaGVhZCA9IHJlYWRsKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0NNRF9IRUFEX09GRlNFVCk7Ci0JaWYgKHRhaWwgPT0gaGVhZCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0Jd3JpdGVsKHRhaWwsIGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0NNRF9UQUlMX09GRlNFVCk7CisJd2hpbGUgKCpzZW0gPT0gMCAmJiBpIDwgTE9PUF9USU1FT1VUKSB7CisJCXVkZWxheSgxKTsKKwkJaSArPSAxOworCX0KKworCWlmIChpID09IExPT1BfVElNRU9VVCkgeworCQlwcl9hbGVydCgiQU1ELVZpOiBDb21wbGV0aW9uLVdhaXQgbG9vcCB0aW1lZCBvdXRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIEdlbmVyYWwgcXVldWluZyBmdW5jdGlvbiBmb3IgY29tbWFuZHMuIFRha2VzIGlvbW11LT5sb2NrIGFuZCBjYWxscwotICogX19pb21tdV9xdWV1ZV9jb21tYW5kKCkuCi0gKi8KLXN0YXRpYyBpbnQgaW9tbXVfcXVldWVfY29tbWFuZChzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSwgc3RydWN0IGlvbW11X2NtZCAqY21kKQorc3RhdGljIHZvaWQgY29weV9jbWRfdG9fYnVmZmVyKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11LAorCQkJICAgICAgIHN0cnVjdCBpb21tdV9jbWQgKmNtZCwKKwkJCSAgICAgICB1MzIgdGFpbCkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQ7CisJdTggKnRhcmdldDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwotCXJldCA9IF9faW9tbXVfcXVldWVfY29tbWFuZChpb21tdSwgY21kKTsKLQlpZiAoIXJldCkKLQkJaW9tbXUtPm5lZWRfc3luYyA9IHRydWU7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKKwl0YXJnZXQgPSBpb21tdS0+Y21kX2J1ZiArIHRhaWw7CisJdGFpbCAgID0gKHRhaWwgKyBzaXplb2YoKmNtZCkpICUgaW9tbXUtPmNtZF9idWZfc2l6ZTsKIAotCXJldHVybiByZXQ7CisJLyogQ29weSBjb21tYW5kIHRvIGJ1ZmZlciAqLworCW1lbWNweSh0YXJnZXQsIGNtZCwgc2l6ZW9mKCpjbWQpKTsKKworCS8qIFRlbGwgdGhlIElPTU1VIGFib3V0IGl0ICovCisJd3JpdGVsKHRhaWwsIGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0NNRF9UQUlMX09GRlNFVCk7Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX2NvbXBsZXRpb25fd2FpdChzdHJ1Y3QgaW9tbXVfY21kICpjbWQsIHU2NCBhZGRyZXNzKQoreworCVdBUk5fT04oYWRkcmVzcyAmIDB4N1VMTCk7CisKKwltZW1zZXQoY21kLCAwLCBzaXplb2YoKmNtZCkpOworCWNtZC0+ZGF0YVswXSA9IGxvd2VyXzMyX2JpdHMoX19wYShhZGRyZXNzKSkgfCBDTURfQ09NUExfV0FJVF9TVE9SRV9NQVNLOworCWNtZC0+ZGF0YVsxXSA9IHVwcGVyXzMyX2JpdHMoX19wYShhZGRyZXNzKSk7CisJY21kLT5kYXRhWzJdID0gMTsKKwlDTURfU0VUX1RZUEUoY21kLCBDTURfQ09NUExfV0FJVCk7Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX2ludl9kdGUoc3RydWN0IGlvbW11X2NtZCAqY21kLCB1MTYgZGV2aWQpCit7CisJbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKCpjbWQpKTsKKwljbWQtPmRhdGFbMF0gPSBkZXZpZDsKKwlDTURfU0VUX1RZUEUoY21kLCBDTURfSU5WX0RFVl9FTlRSWSk7Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX2ludl9pb21tdV9wYWdlcyhzdHJ1Y3QgaW9tbXVfY21kICpjbWQsIHU2NCBhZGRyZXNzLAorCQkJCSAgc2l6ZV90IHNpemUsIHUxNiBkb21pZCwgaW50IHBkZSkKK3sKKwl1NjQgcGFnZXM7CisJaW50IHM7CisKKwlwYWdlcyA9IGlvbW11X251bV9wYWdlcyhhZGRyZXNzLCBzaXplLCBQQUdFX1NJWkUpOworCXMgICAgID0gMDsKKworCWlmIChwYWdlcyA+IDEpIHsKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSB0byBmbHVzaCBtb3JlIHRoYW4gb25lIHBhZ2UsIGZsdXNoIGFsbAorCQkgKiBUTEIgZW50cmllcyBmb3IgdGhpcyBkb21haW4KKwkJICovCisJCWFkZHJlc3MgPSBDTURfSU5WX0lPTU1VX0FMTF9QQUdFU19BRERSRVNTOworCQlzID0gMTsKKwl9CisKKwlhZGRyZXNzICY9IFBBR0VfTUFTSzsKKworCW1lbXNldChjbWQsIDAsIHNpemVvZigqY21kKSk7CisJY21kLT5kYXRhWzFdIHw9IGRvbWlkOworCWNtZC0+ZGF0YVsyXSAgPSBsb3dlcl8zMl9iaXRzKGFkZHJlc3MpOworCWNtZC0+ZGF0YVszXSAgPSB1cHBlcl8zMl9iaXRzKGFkZHJlc3MpOworCUNNRF9TRVRfVFlQRShjbWQsIENNRF9JTlZfSU9NTVVfUEFHRVMpOworCWlmIChzKSAvKiBzaXplIGJpdCAtIHdlIGZsdXNoIG1vcmUgdGhhbiBvbmUgNGtiIHBhZ2UgKi8KKwkJY21kLT5kYXRhWzJdIHw9IENNRF9JTlZfSU9NTVVfUEFHRVNfU0laRV9NQVNLOworCWlmIChwZGUpIC8qIFBERSBiaXQgLSB3ZSB3YW4ndCBmbHVzaCBldmVyeXRoaW5nIG5vdCBvbmx5IHRoZSBQVEVzICovCisJCWNtZC0+ZGF0YVsyXSB8PSBDTURfSU5WX0lPTU1VX1BBR0VTX1BERV9NQVNLOworfQorCitzdGF0aWMgdm9pZCBidWlsZF9pbnZfaW90bGJfcGFnZXMoc3RydWN0IGlvbW11X2NtZCAqY21kLCB1MTYgZGV2aWQsIGludCBxZGVwLAorCQkJCSAgdTY0IGFkZHJlc3MsIHNpemVfdCBzaXplKQoreworCXU2NCBwYWdlczsKKwlpbnQgczsKKworCXBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKGFkZHJlc3MsIHNpemUsIFBBR0VfU0laRSk7CisJcyAgICAgPSAwOworCisJaWYgKHBhZ2VzID4gMSkgeworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIHRvIGZsdXNoIG1vcmUgdGhhbiBvbmUgcGFnZSwgZmx1c2ggYWxsCisJCSAqIFRMQiBlbnRyaWVzIGZvciB0aGlzIGRvbWFpbgorCQkgKi8KKwkJYWRkcmVzcyA9IENNRF9JTlZfSU9NTVVfQUxMX1BBR0VTX0FERFJFU1M7CisJCXMgPSAxOworCX0KKworCWFkZHJlc3MgJj0gUEFHRV9NQVNLOworCisJbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKCpjbWQpKTsKKwljbWQtPmRhdGFbMF0gID0gZGV2aWQ7CisJY21kLT5kYXRhWzBdIHw9IChxZGVwICYgMHhmZikgPDwgMjQ7CisJY21kLT5kYXRhWzFdICA9IGRldmlkOworCWNtZC0+ZGF0YVsyXSAgPSBsb3dlcl8zMl9iaXRzKGFkZHJlc3MpOworCWNtZC0+ZGF0YVszXSAgPSB1cHBlcl8zMl9iaXRzKGFkZHJlc3MpOworCUNNRF9TRVRfVFlQRShjbWQsIENNRF9JTlZfSU9UTEJfUEFHRVMpOworCWlmIChzKQorCQljbWQtPmRhdGFbMl0gfD0gQ01EX0lOVl9JT01NVV9QQUdFU19TSVpFX01BU0s7Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX2ludl9hbGwoc3RydWN0IGlvbW11X2NtZCAqY21kKQoreworCW1lbXNldChjbWQsIDAsIHNpemVvZigqY21kKSk7CisJQ01EX1NFVF9UWVBFKGNtZCwgQ01EX0lOVl9BTEwpOwogfQogCiAvKgotICogVGhpcyBmdW5jdGlvbiB3YWl0cyB1bnRpbCBhbiBJT01NVSBoYXMgY29tcGxldGVkIGEgY29tcGxldGlvbgotICogd2FpdCBjb21tYW5kCisgKiBXcml0ZXMgdGhlIGNvbW1hbmQgdG8gdGhlIElPTU1VcyBjb21tYW5kIGJ1ZmZlciBhbmQgaW5mb3JtcyB0aGUKKyAqIGhhcmR3YXJlIGFib3V0IHRoZSBuZXcgY29tbWFuZC4KICAqLwotc3RhdGljIHZvaWQgX19pb21tdV93YWl0X2Zvcl9jb21wbGV0aW9uKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQorc3RhdGljIGludCBpb21tdV9xdWV1ZV9jb21tYW5kKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11LCBzdHJ1Y3QgaW9tbXVfY21kICpjbWQpCiB7Ci0JaW50IHJlYWR5ID0gMDsKLQl1bnNpZ25lZCBzdGF0dXMgPSAwOwotCXVuc2lnbmVkIGxvbmcgaSA9IDA7CisJdTMyIGxlZnQsIHRhaWwsIGhlYWQsIG5leHRfdGFpbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JSU5DX1NUQVRTX0NPVU5URVIoY29tcGxfd2FpdCk7CisJV0FSTl9PTihpb21tdS0+Y21kX2J1Zl9zaXplICYgQ01EX0JVRkZFUl9VTklOSVRJQUxJWkVEKTsKIAotCXdoaWxlICghcmVhZHkgJiYgKGkgPCBFWElUX0xPT1BfQ09VTlQpKSB7Ci0JCSsraTsKLQkJLyogd2FpdCBmb3IgdGhlIGJpdCB0byBiZWNvbWUgb25lICovCi0JCXN0YXR1cyA9IHJlYWRsKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX1NUQVRVU19PRkZTRVQpOwotCQlyZWFkeSA9IHN0YXR1cyAmIE1NSU9fU1RBVFVTX0NPTV9XQUlUX0lOVF9NQVNLOworYWdhaW46CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CisKKwloZWFkICAgICAgPSByZWFkbChpb21tdS0+bW1pb19iYXNlICsgTU1JT19DTURfSEVBRF9PRkZTRVQpOworCXRhaWwgICAgICA9IHJlYWRsKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0NNRF9UQUlMX09GRlNFVCk7CisJbmV4dF90YWlsID0gKHRhaWwgKyBzaXplb2YoKmNtZCkpICUgaW9tbXUtPmNtZF9idWZfc2l6ZTsKKwlsZWZ0ICAgICAgPSAoaGVhZCAtIG5leHRfdGFpbCkgJSBpb21tdS0+Y21kX2J1Zl9zaXplOworCisJaWYgKGxlZnQgPD0gMikgeworCQlzdHJ1Y3QgaW9tbXVfY21kIHN5bmNfY21kOworCQl2b2xhdGlsZSB1NjQgc2VtID0gMDsKKwkJaW50IHJldDsKKworCQlidWlsZF9jb21wbGV0aW9uX3dhaXQoJnN5bmNfY21kLCAodTY0KSZzZW0pOworCQljb3B5X2NtZF90b19idWZmZXIoaW9tbXUsICZzeW5jX2NtZCwgdGFpbCk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAoKHJldCA9IHdhaXRfb25fc2VtKCZzZW0pKSAhPSAwKQorCQkJcmV0dXJuIHJldDsKKworCQlnb3RvIGFnYWluOwogCX0KIAotCS8qIHNldCBiaXQgYmFjayB0byB6ZXJvICovCi0Jc3RhdHVzICY9IH5NTUlPX1NUQVRVU19DT01fV0FJVF9JTlRfTUFTSzsKLQl3cml0ZWwoc3RhdHVzLCBpb21tdS0+bW1pb19iYXNlICsgTU1JT19TVEFUVVNfT0ZGU0VUKTsKKwljb3B5X2NtZF90b19idWZmZXIoaW9tbXUsIGNtZCwgdGFpbCk7CiAKLQlpZiAodW5saWtlbHkoaSA9PSBFWElUX0xPT1BfQ09VTlQpKQotCQlpb21tdS0+cmVzZXRfaW5fcHJvZ3Jlc3MgPSB0cnVlOworCS8qIFdlIG5lZWQgdG8gc3luYyBub3cgdG8gbWFrZSBzdXJlIGFsbCBjb21tYW5kcyBhcmUgcHJvY2Vzc2VkICovCisJaW9tbXUtPm5lZWRfc3luYyA9IHRydWU7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIHF1ZXVlcyBhIGNvbXBsZXRpb24gd2FpdCBjb21tYW5kIGludG8gdGhlIGNvbW1hbmQKICAqIGJ1ZmZlciBvZiBhbiBJT01NVQogICovCi1zdGF0aWMgaW50IF9faW9tbXVfY29tcGxldGlvbl93YWl0KHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQorc3RhdGljIGludCBpb21tdV9jb21wbGV0aW9uX3dhaXQoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCit7CisJc3RydWN0IGlvbW11X2NtZCBjbWQ7CisJdm9sYXRpbGUgdTY0IHNlbSA9IDA7CisJaW50IHJldDsKKworCWlmICghaW9tbXUtPm5lZWRfc3luYykKKwkJcmV0dXJuIDA7CisKKwlidWlsZF9jb21wbGV0aW9uX3dhaXQoJmNtZCwgKHU2NCkmc2VtKTsKKworCXJldCA9IGlvbW11X3F1ZXVlX2NvbW1hbmQoaW9tbXUsICZjbWQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gd2FpdF9vbl9zZW0oJnNlbSk7Cit9CisKK3N0YXRpYyBpbnQgaW9tbXVfZmx1c2hfZHRlKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11LCB1MTYgZGV2aWQpCiB7CiAJc3RydWN0IGlvbW11X2NtZCBjbWQ7CiAKLQkgbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQkgY21kLmRhdGFbMF0gPSBDTURfQ09NUExfV0FJVF9JTlRfTUFTSzsKLQkgQ01EX1NFVF9UWVBFKCZjbWQsIENNRF9DT01QTF9XQUlUKTsKKwlidWlsZF9pbnZfZHRlKCZjbWQsIGRldmlkKTsKIAotCSByZXR1cm4gX19pb21tdV9xdWV1ZV9jb21tYW5kKGlvbW11LCAmY21kKTsKKwlyZXR1cm4gaW9tbXVfcXVldWVfY29tbWFuZChpb21tdSwgJmNtZCk7Cit9CisKK3N0YXRpYyB2b2lkIGlvbW11X2ZsdXNoX2R0ZV9hbGwoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCit7CisJdTMyIGRldmlkOworCisJZm9yIChkZXZpZCA9IDA7IGRldmlkIDw9IDB4ZmZmZjsgKytkZXZpZCkKKwkJaW9tbXVfZmx1c2hfZHRlKGlvbW11LCBkZXZpZCk7CisKKwlpb21tdV9jb21wbGV0aW9uX3dhaXQoaW9tbXUpOwogfQogCiAvKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgd2UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgSU9NTVUgaGFzCi0gKiBjb21wbGV0ZWQgZXhlY3V0aW9uIG9mIGFsbCBjb21tYW5kcyB3ZSBzZW50LiBJdCBzZW5kcyBhCi0gKiBDT01QTEVUSU9OX1dBSVQgY29tbWFuZCBhbmQgd2FpdHMgZm9yIGl0IHRvIGZpbmlzaC4gVGhlIElPTU1VIGluZm9ybXMKLSAqIHVzIGFib3V0IHRoYXQgYnkgd3JpdGluZyBhIHZhbHVlIHRvIGEgcGh5c2ljYWwgYWRkcmVzcyB3ZSBwYXNzIHdpdGgKLSAqIHRoZSBjb21tYW5kLgorICogVGhpcyBmdW5jdGlvbiB1c2VzIGhlYXZ5IGxvY2tpbmcgYW5kIG1heSBkaXNhYmxlIGlycXMgZm9yIHNvbWUgdGltZS4gQnV0CisgKiB0aGlzIGlzIG5vIGlzc3VlIGJlY2F1c2UgaXQgaXMgb25seSBjYWxsZWQgZHVyaW5nIHJlc3VtZS4KICAqLwotc3RhdGljIGludCBpb21tdV9jb21wbGV0aW9uX3dhaXQoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCitzdGF0aWMgdm9pZCBpb21tdV9mbHVzaF90bGJfYWxsKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQogewotCWludCByZXQgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGRvbV9pZDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworCWZvciAoZG9tX2lkID0gMDsgZG9tX2lkIDw9IDB4ZmZmZjsgKytkb21faWQpIHsKKwkJc3RydWN0IGlvbW11X2NtZCBjbWQ7CisJCWJ1aWxkX2ludl9pb21tdV9wYWdlcygmY21kLCAwLCBDTURfSU5WX0lPTU1VX0FMTF9QQUdFU19BRERSRVNTLAorCQkJCSAgICAgIGRvbV9pZCwgMSk7CisJCWlvbW11X3F1ZXVlX2NvbW1hbmQoaW9tbXUsICZjbWQpOworCX0KIAotCWlmICghaW9tbXUtPm5lZWRfc3luYykKLQkJZ290byBvdXQ7Ci0KLQlyZXQgPSBfX2lvbW11X2NvbXBsZXRpb25fd2FpdChpb21tdSk7Ci0KLQlpb21tdS0+bmVlZF9zeW5jID0gZmFsc2U7Ci0KLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQotCV9faW9tbXVfd2FpdF9mb3JfY29tcGxldGlvbihpb21tdSk7Ci0KLW91dDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKGlvbW11LT5yZXNldF9pbl9wcm9ncmVzcykKLQkJcmVzZXRfaW9tbXVfY29tbWFuZF9idWZmZXIoaW9tbXUpOwotCi0JcmV0dXJuIDA7CisJaW9tbXVfY29tcGxldGlvbl93YWl0KGlvbW11KTsKIH0KIAotc3RhdGljIHZvaWQgaW9tbXVfZmx1c2hfY29tcGxldGUoc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW4pCitzdGF0aWMgdm9pZCBpb21tdV9mbHVzaF9hbGwoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCit7CisJc3RydWN0IGlvbW11X2NtZCBjbWQ7CisKKwlidWlsZF9pbnZfYWxsKCZjbWQpOworCisJaW9tbXVfcXVldWVfY29tbWFuZChpb21tdSwgJmNtZCk7CisJaW9tbXVfY29tcGxldGlvbl93YWl0KGlvbW11KTsKK30KKwordm9pZCBpb21tdV9mbHVzaF9hbGxfY2FjaGVzKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQoreworCWlmIChpb21tdV9mZWF0dXJlKGlvbW11LCBGRUFUVVJFX0lBKSkgeworCQlpb21tdV9mbHVzaF9hbGwoaW9tbXUpOworCX0gZWxzZSB7CisJCWlvbW11X2ZsdXNoX2R0ZV9hbGwoaW9tbXUpOworCQlpb21tdV9mbHVzaF90bGJfYWxsKGlvbW11KTsKKwl9Cit9CisKKy8qCisgKiBDb21tYW5kIHNlbmQgZnVuY3Rpb24gZm9yIGZsdXNoaW5nIG9uLWRldmljZSBUTEIKKyAqLworc3RhdGljIGludCBkZXZpY2VfZmx1c2hfaW90bGIoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgYWRkcmVzcywgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IGFtZF9pb21tdSAqaW9tbXU7CisJc3RydWN0IGlvbW11X2NtZCBjbWQ7CisJdTE2IGRldmlkOworCWludCBxZGVwOworCisJcWRlcCAgPSBwY2lfYXRzX3F1ZXVlX2RlcHRoKHBkZXYpOworCWRldmlkID0gZ2V0X2RldmljZV9pZChkZXYpOworCWlvbW11ID0gYW1kX2lvbW11X3Jsb29rdXBfdGFibGVbZGV2aWRdOworCisJYnVpbGRfaW52X2lvdGxiX3BhZ2VzKCZjbWQsIGRldmlkLCBxZGVwLCBhZGRyZXNzLCBzaXplKTsKKworCXJldHVybiBpb21tdV9xdWV1ZV9jb21tYW5kKGlvbW11LCAmY21kKTsKK30KKworLyoKKyAqIENvbW1hbmQgc2VuZCBmdW5jdGlvbiBmb3IgaW52YWxpZGF0aW5nIGEgZGV2aWNlIHRhYmxlIGVudHJ5CisgKi8KK3N0YXRpYyBpbnQgZGV2aWNlX2ZsdXNoX2R0ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFtZF9pb21tdSAqaW9tbXU7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJdTE2IGRldmlkOworCWludCByZXQ7CisKKwlwZGV2ICA9IHRvX3BjaV9kZXYoZGV2KTsKKwlkZXZpZCA9IGdldF9kZXZpY2VfaWQoZGV2KTsKKwlpb21tdSA9IGFtZF9pb21tdV9ybG9va3VwX3RhYmxlW2RldmlkXTsKKworCXJldCA9IGlvbW11X2ZsdXNoX2R0ZShpb21tdSwgZGV2aWQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAocGNpX2F0c19lbmFibGVkKHBkZXYpKQorCQlyZXQgPSBkZXZpY2VfZmx1c2hfaW90bGIoZGV2LCAwLCB+MFVMKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUTEIgaW52YWxpZGF0aW9uIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBmcm9tIHRoZSBtYXBwaW5nIGZ1bmN0aW9ucy4KKyAqIEl0IGludmFsaWRhdGVzIGEgc2luZ2xlIFBURSBpZiB0aGUgcmFuZ2UgdG8gZmx1c2ggaXMgd2l0aGluIGEgc2luZ2xlCisgKiBwYWdlLiBPdGhlcndpc2UgaXQgZmx1c2hlcyB0aGUgd2hvbGUgVExCIG9mIHRoZSBJT01NVS4KKyAqLworc3RhdGljIHZvaWQgX19kb21haW5fZmx1c2hfcGFnZXMoc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW4sCisJCQkJIHU2NCBhZGRyZXNzLCBzaXplX3Qgc2l6ZSwgaW50IHBkZSkKK3sKKwlzdHJ1Y3QgaW9tbXVfZGV2X2RhdGEgKmRldl9kYXRhOworCXN0cnVjdCBpb21tdV9jbWQgY21kOworCWludCByZXQgPSAwLCBpOworCisJYnVpbGRfaW52X2lvbW11X3BhZ2VzKCZjbWQsIGFkZHJlc3MsIHNpemUsIGRvbWFpbi0+aWQsIHBkZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYW1kX2lvbW11c19wcmVzZW50OyArK2kpIHsKKwkJaWYgKCFkb21haW4tPmRldl9pb21tdVtpXSkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIERldmljZXMgb2YgdGhpcyBkb21haW4gYXJlIGJlaGluZCB0aGlzIElPTU1VCisJCSAqIFdlIG5lZWQgYSBUTEIgZmx1c2gKKwkJICovCisJCXJldCB8PSBpb21tdV9xdWV1ZV9jb21tYW5kKGFtZF9pb21tdXNbaV0sICZjbWQpOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2X2RhdGEsICZkb21haW4tPmRldl9saXN0LCBsaXN0KSB7CisJCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXZfZGF0YS0+ZGV2KTsKKworCQlpZiAoIXBjaV9hdHNfZW5hYmxlZChwZGV2KSkKKwkJCWNvbnRpbnVlOworCisJCXJldCB8PSBkZXZpY2VfZmx1c2hfaW90bGIoZGV2X2RhdGEtPmRldiwgYWRkcmVzcywgc2l6ZSk7CisJfQorCisJV0FSTl9PTihyZXQpOworfQorCitzdGF0aWMgdm9pZCBkb21haW5fZmx1c2hfcGFnZXMoc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW4sCisJCQkgICAgICAgdTY0IGFkZHJlc3MsIHNpemVfdCBzaXplKQoreworCV9fZG9tYWluX2ZsdXNoX3BhZ2VzKGRvbWFpbiwgYWRkcmVzcywgc2l6ZSwgMCk7Cit9CisKKy8qIEZsdXNoIHRoZSB3aG9sZSBJTy9UTEIgZm9yIGEgZ2l2ZW4gcHJvdGVjdGlvbiBkb21haW4gKi8KK3N0YXRpYyB2b2lkIGRvbWFpbl9mbHVzaF90bGIoc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW4pCit7CisJX19kb21haW5fZmx1c2hfcGFnZXMoZG9tYWluLCAwLCBDTURfSU5WX0lPTU1VX0FMTF9QQUdFU19BRERSRVNTLCAwKTsKK30KKworLyogRmx1c2ggdGhlIHdob2xlIElPL1RMQiBmb3IgYSBnaXZlbiBwcm90ZWN0aW9uIGRvbWFpbiAtIGluY2x1ZGluZyBQREUgKi8KK3N0YXRpYyB2b2lkIGRvbWFpbl9mbHVzaF90bGJfcGRlKHN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluKQoreworCV9fZG9tYWluX2ZsdXNoX3BhZ2VzKGRvbWFpbiwgMCwgQ01EX0lOVl9JT01NVV9BTExfUEFHRVNfQUREUkVTUywgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGRvbWFpbl9mbHVzaF9jb21wbGV0ZShzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbikKIHsKIAlpbnQgaTsKIApAQCAtNTE2LDExOCArNzQ1LDExIEBACiAJfQogfQogCi0vKgotICogQ29tbWFuZCBzZW5kIGZ1bmN0aW9uIGZvciBpbnZhbGlkYXRpbmcgYSBkZXZpY2UgdGFibGUgZW50cnkKLSAqLwotc3RhdGljIGludCBpb21tdV9mbHVzaF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBhbWRfaW9tbXUgKmlvbW11OwotCXN0cnVjdCBpb21tdV9jbWQgY21kOwotCXUxNiBkZXZpZDsKLQotCWRldmlkID0gZ2V0X2RldmljZV9pZChkZXYpOwotCWlvbW11ID0gYW1kX2lvbW11X3Jsb29rdXBfdGFibGVbZGV2aWRdOwotCi0JLyogQnVpbGQgY29tbWFuZCAqLwotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JQ01EX1NFVF9UWVBFKCZjbWQsIENNRF9JTlZfREVWX0VOVFJZKTsKLQljbWQuZGF0YVswXSA9IGRldmlkOwotCi0JcmV0dXJuIGlvbW11X3F1ZXVlX2NvbW1hbmQoaW9tbXUsICZjbWQpOwotfQotCi1zdGF0aWMgdm9pZCBfX2lvbW11X2J1aWxkX2ludl9pb21tdV9wYWdlcyhzdHJ1Y3QgaW9tbXVfY21kICpjbWQsIHU2NCBhZGRyZXNzLAotCQkJCQkgIHUxNiBkb21pZCwgaW50IHBkZSwgaW50IHMpCi17Ci0JbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKCpjbWQpKTsKLQlhZGRyZXNzICY9IFBBR0VfTUFTSzsKLQlDTURfU0VUX1RZUEUoY21kLCBDTURfSU5WX0lPTU1VX1BBR0VTKTsKLQljbWQtPmRhdGFbMV0gfD0gZG9taWQ7Ci0JY21kLT5kYXRhWzJdID0gbG93ZXJfMzJfYml0cyhhZGRyZXNzKTsKLQljbWQtPmRhdGFbM10gPSB1cHBlcl8zMl9iaXRzKGFkZHJlc3MpOwotCWlmIChzKSAvKiBzaXplIGJpdCAtIHdlIGZsdXNoIG1vcmUgdGhhbiBvbmUgNGtiIHBhZ2UgKi8KLQkJY21kLT5kYXRhWzJdIHw9IENNRF9JTlZfSU9NTVVfUEFHRVNfU0laRV9NQVNLOwotCWlmIChwZGUpIC8qIFBERSBiaXQgLSB3ZSB3YW4ndCBmbHVzaCBldmVyeXRoaW5nIG5vdCBvbmx5IHRoZSBQVEVzICovCi0JCWNtZC0+ZGF0YVsyXSB8PSBDTURfSU5WX0lPTU1VX1BBR0VTX1BERV9NQVNLOwotfQotCi0vKgotICogR2VuZXJpYyBjb21tYW5kIHNlbmQgZnVuY3Rpb24gZm9yIGludmFsaWRhaW5nIFRMQiBlbnRyaWVzCi0gKi8KLXN0YXRpYyBpbnQgaW9tbXVfcXVldWVfaW52X2lvbW11X3BhZ2VzKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11LAotCQl1NjQgYWRkcmVzcywgdTE2IGRvbWlkLCBpbnQgcGRlLCBpbnQgcykKLXsKLQlzdHJ1Y3QgaW9tbXVfY21kIGNtZDsKLQlpbnQgcmV0OwotCi0JX19pb21tdV9idWlsZF9pbnZfaW9tbXVfcGFnZXMoJmNtZCwgYWRkcmVzcywgZG9taWQsIHBkZSwgcyk7Ci0KLQlyZXQgPSBpb21tdV9xdWV1ZV9jb21tYW5kKGlvbW11LCAmY21kKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBUTEIgaW52YWxpZGF0aW9uIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBmcm9tIHRoZSBtYXBwaW5nIGZ1bmN0aW9ucy4KLSAqIEl0IGludmFsaWRhdGVzIGEgc2luZ2xlIFBURSBpZiB0aGUgcmFuZ2UgdG8gZmx1c2ggaXMgd2l0aGluIGEgc2luZ2xlCi0gKiBwYWdlLiBPdGhlcndpc2UgaXQgZmx1c2hlcyB0aGUgd2hvbGUgVExCIG9mIHRoZSBJT01NVS4KLSAqLwotc3RhdGljIHZvaWQgX19pb21tdV9mbHVzaF9wYWdlcyhzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbiwKLQkJCQl1NjQgYWRkcmVzcywgc2l6ZV90IHNpemUsIGludCBwZGUpCi17Ci0JaW50IHMgPSAwLCBpOwotCXVuc2lnbmVkIGxvbmcgcGFnZXMgPSBpb21tdV9udW1fcGFnZXMoYWRkcmVzcywgc2l6ZSwgUEFHRV9TSVpFKTsKLQotCWFkZHJlc3MgJj0gUEFHRV9NQVNLOwotCi0JaWYgKHBhZ2VzID4gMSkgewotCQkvKgotCQkgKiBJZiB3ZSBoYXZlIHRvIGZsdXNoIG1vcmUgdGhhbiBvbmUgcGFnZSwgZmx1c2ggYWxsCi0JCSAqIFRMQiBlbnRyaWVzIGZvciB0aGlzIGRvbWFpbgotCQkgKi8KLQkJYWRkcmVzcyA9IENNRF9JTlZfSU9NTVVfQUxMX1BBR0VTX0FERFJFU1M7Ci0JCXMgPSAxOwotCX0KLQotCi0JZm9yIChpID0gMDsgaSA8IGFtZF9pb21tdXNfcHJlc2VudDsgKytpKSB7Ci0JCWlmICghZG9tYWluLT5kZXZfaW9tbXVbaV0pCi0JCQljb250aW51ZTsKLQotCQkvKgotCQkgKiBEZXZpY2VzIG9mIHRoaXMgZG9tYWluIGFyZSBiZWhpbmQgdGhpcyBJT01NVQotCQkgKiBXZSBuZWVkIGEgVExCIGZsdXNoCi0JCSAqLwotCQlpb21tdV9xdWV1ZV9pbnZfaW9tbXVfcGFnZXMoYW1kX2lvbW11c1tpXSwgYWRkcmVzcywKLQkJCQkJICAgIGRvbWFpbi0+aWQsIHBkZSwgcyk7Ci0JfQotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBpb21tdV9mbHVzaF9wYWdlcyhzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbiwKLQkJCSAgICAgdTY0IGFkZHJlc3MsIHNpemVfdCBzaXplKQotewotCV9faW9tbXVfZmx1c2hfcGFnZXMoZG9tYWluLCBhZGRyZXNzLCBzaXplLCAwKTsKLX0KLQotLyogRmx1c2ggdGhlIHdob2xlIElPL1RMQiBmb3IgYSBnaXZlbiBwcm90ZWN0aW9uIGRvbWFpbiAqLwotc3RhdGljIHZvaWQgaW9tbXVfZmx1c2hfdGxiKHN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluKQotewotCV9faW9tbXVfZmx1c2hfcGFnZXMoZG9tYWluLCAwLCBDTURfSU5WX0lPTU1VX0FMTF9QQUdFU19BRERSRVNTLCAwKTsKLX0KLQotLyogRmx1c2ggdGhlIHdob2xlIElPL1RMQiBmb3IgYSBnaXZlbiBwcm90ZWN0aW9uIGRvbWFpbiAtIGluY2x1ZGluZyBQREUgKi8KLXN0YXRpYyB2b2lkIGlvbW11X2ZsdXNoX3RsYl9wZGUoc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW4pCi17Ci0JX19pb21tdV9mbHVzaF9wYWdlcyhkb21haW4sIDAsIENNRF9JTlZfSU9NTVVfQUxMX1BBR0VTX0FERFJFU1MsIDEpOwotfQotCiAKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIGZsdXNoZXMgdGhlIERURXMgZm9yIGFsbCBkZXZpY2VzIGluIGRvbWFpbgogICovCi1zdGF0aWMgdm9pZCBpb21tdV9mbHVzaF9kb21haW5fZGV2aWNlcyhzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbikKK3N0YXRpYyB2b2lkIGRvbWFpbl9mbHVzaF9kZXZpY2VzKHN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluKQogewogCXN0cnVjdCBpb21tdV9kZXZfZGF0YSAqZGV2X2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTYzNSw2NiArNzU3LDExIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRvbWFpbi0+bG9jaywgZmxhZ3MpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZfZGF0YSwgJmRvbWFpbi0+ZGV2X2xpc3QsIGxpc3QpCi0JCWlvbW11X2ZsdXNoX2RldmljZShkZXZfZGF0YS0+ZGV2KTsKKwkJZGV2aWNlX2ZsdXNoX2R0ZShkZXZfZGF0YS0+ZGV2KTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRvbWFpbi0+bG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCBpb21tdV9mbHVzaF9hbGxfZG9tYWluX2RldmljZXModm9pZCkKLXsKLQlzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFtZF9pb21tdV9wZF9sb2NrLCBmbGFncyk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRvbWFpbiwgJmFtZF9pb21tdV9wZF9saXN0LCBsaXN0KSB7Ci0JCWlvbW11X2ZsdXNoX2RvbWFpbl9kZXZpY2VzKGRvbWFpbik7Ci0JCWlvbW11X2ZsdXNoX2NvbXBsZXRlKGRvbWFpbik7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYW1kX2lvbW11X3BkX2xvY2ssIGZsYWdzKTsKLX0KLQotdm9pZCBhbWRfaW9tbXVfZmx1c2hfYWxsX2RldmljZXModm9pZCkKLXsKLQlpb21tdV9mbHVzaF9hbGxfZG9tYWluX2RldmljZXMoKTsKLX0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gdXNlcyBoZWF2eSBsb2NraW5nIGFuZCBtYXkgZGlzYWJsZSBpcnFzIGZvciBzb21lIHRpbWUuIEJ1dAotICogdGhpcyBpcyBubyBpc3N1ZSBiZWNhdXNlIGl0IGlzIG9ubHkgY2FsbGVkIGR1cmluZyByZXN1bWUuCi0gKi8KLXZvaWQgYW1kX2lvbW11X2ZsdXNoX2FsbF9kb21haW5zKHZvaWQpCi17Ci0Jc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW47Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhbWRfaW9tbXVfcGRfbG9jaywgZmxhZ3MpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkb21haW4sICZhbWRfaW9tbXVfcGRfbGlzdCwgbGlzdCkgewotCQlzcGluX2xvY2soJmRvbWFpbi0+bG9jayk7Ci0JCWlvbW11X2ZsdXNoX3RsYl9wZGUoZG9tYWluKTsKLQkJaW9tbXVfZmx1c2hfY29tcGxldGUoZG9tYWluKTsKLQkJc3Bpbl91bmxvY2soJmRvbWFpbi0+bG9jayk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYW1kX2lvbW11X3BkX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgcmVzZXRfaW9tbXVfY29tbWFuZF9idWZmZXIoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCi17Ci0JcHJfZXJyKCJBTUQtVmk6IFJlc2V0dGluZyBJT01NVSBjb21tYW5kIGJ1ZmZlclxuIik7Ci0KLQlpZiAoaW9tbXUtPnJlc2V0X2luX3Byb2dyZXNzKQotCQlwYW5pYygiQU1ELVZpOiBJTExFR0FMX0NPTU1BTkRfRVJST1Igd2hpbGUgcmVzZXR0aW5nIGNvbW1hbmQgYnVmZmVyXG4iKTsKLQotCWFtZF9pb21tdV9yZXNldF9jbWRfYnVmZmVyKGlvbW11KTsKLQlhbWRfaW9tbXVfZmx1c2hfYWxsX2RldmljZXMoKTsKLQlhbWRfaW9tbXVfZmx1c2hfYWxsX2RvbWFpbnMoKTsKLQotCWlvbW11LT5yZXNldF9pbl9wcm9ncmVzcyA9IGZhbHNlOwotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFRoZSBmdW5jdGlvbnMgYmVsb3cgYXJlIHVzZWQgdGhlIGNyZWF0ZSB0aGUgcGFnZSB0YWJsZSBtYXBwaW5ncyBmb3IKQEAgLTE0MTAsMTcgKzE0NzcsMjIgQEAKIAlyZXR1cm4gZG9tYWluLT5mbGFncyAmIFBEX0RNQV9PUFNfTUFTSzsKIH0KIAotc3RhdGljIHZvaWQgc2V0X2R0ZV9lbnRyeSh1MTYgZGV2aWQsIHN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluKQorc3RhdGljIHZvaWQgc2V0X2R0ZV9lbnRyeSh1MTYgZGV2aWQsIHN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluLCBib29sIGF0cykKIHsKIAl1NjQgcHRlX3Jvb3QgPSB2aXJ0X3RvX3BoeXMoZG9tYWluLT5wdF9yb290KTsKKwl1MzIgZmxhZ3MgPSAwOwogCiAJcHRlX3Jvb3QgfD0gKGRvbWFpbi0+bW9kZSAmIERFVl9FTlRSWV9NT0RFX01BU0spCiAJCSAgICA8PCBERVZfRU5UUllfTU9ERV9TSElGVDsKIAlwdGVfcm9vdCB8PSBJT01NVV9QVEVfSVIgfCBJT01NVV9QVEVfSVcgfCBJT01NVV9QVEVfUCB8IElPTU1VX1BURV9UVjsKIAotCWFtZF9pb21tdV9kZXZfdGFibGVbZGV2aWRdLmRhdGFbMl0gPSBkb21haW4tPmlkOwotCWFtZF9pb21tdV9kZXZfdGFibGVbZGV2aWRdLmRhdGFbMV0gPSB1cHBlcl8zMl9iaXRzKHB0ZV9yb290KTsKLQlhbWRfaW9tbXVfZGV2X3RhYmxlW2RldmlkXS5kYXRhWzBdID0gbG93ZXJfMzJfYml0cyhwdGVfcm9vdCk7CisJaWYgKGF0cykKKwkJZmxhZ3MgfD0gRFRFX0ZMQUdfSU9UTEI7CisKKwlhbWRfaW9tbXVfZGV2X3RhYmxlW2RldmlkXS5kYXRhWzNdIHw9IGZsYWdzOworCWFtZF9pb21tdV9kZXZfdGFibGVbZGV2aWRdLmRhdGFbMl0gID0gZG9tYWluLT5pZDsKKwlhbWRfaW9tbXVfZGV2X3RhYmxlW2RldmlkXS5kYXRhWzFdICA9IHVwcGVyXzMyX2JpdHMocHRlX3Jvb3QpOworCWFtZF9pb21tdV9kZXZfdGFibGVbZGV2aWRdLmRhdGFbMF0gID0gbG93ZXJfMzJfYml0cyhwdGVfcm9vdCk7CiB9CiAKIHN0YXRpYyB2b2lkIGNsZWFyX2R0ZV9lbnRyeSh1MTYgZGV2aWQpCkBAIC0xNDM3LDM0ICsxNTA5LDQyIEBACiB7CiAJc3RydWN0IGlvbW11X2Rldl9kYXRhICpkZXZfZGF0YTsKIAlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlib29sIGF0cyA9IGZhbHNlOwogCXUxNiBkZXZpZDsKIAogCWRldmlkICAgID0gZ2V0X2RldmljZV9pZChkZXYpOwogCWlvbW11ICAgID0gYW1kX2lvbW11X3Jsb29rdXBfdGFibGVbZGV2aWRdOwogCWRldl9kYXRhID0gZ2V0X2Rldl9kYXRhKGRldik7CisJcGRldiAgICAgPSB0b19wY2lfZGV2KGRldik7CisKKwlpZiAoYW1kX2lvbW11X2lvdGxiX3N1cCkKKwkJYXRzID0gcGNpX2F0c19lbmFibGVkKHBkZXYpOwogCiAJLyogVXBkYXRlIGRhdGEgc3RydWN0dXJlcyAqLwogCWRldl9kYXRhLT5kb21haW4gPSBkb21haW47CiAJbGlzdF9hZGQoJmRldl9kYXRhLT5saXN0LCAmZG9tYWluLT5kZXZfbGlzdCk7Ci0Jc2V0X2R0ZV9lbnRyeShkZXZpZCwgZG9tYWluKTsKKwlzZXRfZHRlX2VudHJ5KGRldmlkLCBkb21haW4sIGF0cyk7CiAKIAkvKiBEbyByZWZlcmVuY2UgY291bnRpbmcgKi8KIAlkb21haW4tPmRldl9pb21tdVtpb21tdS0+aW5kZXhdICs9IDE7CiAJZG9tYWluLT5kZXZfY250ICAgICAgICAgICAgICAgICArPSAxOwogCiAJLyogRmx1c2ggdGhlIERURSBlbnRyeSAqLwotCWlvbW11X2ZsdXNoX2RldmljZShkZXYpOworCWRldmljZV9mbHVzaF9kdGUoZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgZG9fZGV0YWNoKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgaW9tbXVfZGV2X2RhdGEgKmRldl9kYXRhOwogCXN0cnVjdCBhbWRfaW9tbXUgKmlvbW11OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCXUxNiBkZXZpZDsKIAogCWRldmlkICAgID0gZ2V0X2RldmljZV9pZChkZXYpOwogCWlvbW11ICAgID0gYW1kX2lvbW11X3Jsb29rdXBfdGFibGVbZGV2aWRdOwogCWRldl9kYXRhID0gZ2V0X2Rldl9kYXRhKGRldik7CisJcGRldiAgICAgPSB0b19wY2lfZGV2KGRldik7CiAKIAkvKiBkZWNyZWFzZSByZWZlcmVuY2UgY291bnRlcnMgKi8KIAlkZXZfZGF0YS0+ZG9tYWluLT5kZXZfaW9tbXVbaW9tbXUtPmluZGV4XSAtPSAxOwpAQCAtMTQ3Niw3ICsxNTU2LDcgQEAKIAljbGVhcl9kdGVfZW50cnkoZGV2aWQpOwogCiAJLyogRmx1c2ggdGhlIERURSBlbnRyeSAqLwotCWlvbW11X2ZsdXNoX2RldmljZShkZXYpOworCWRldmljZV9mbHVzaF9kdGUoZGV2KTsKIH0KIAogLyoKQEAgLTE1MzksOSArMTYxOSwxMyBAQAogc3RhdGljIGludCBhdHRhY2hfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSBzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbikKIHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CiAKKwlpZiAoYW1kX2lvbW11X2lvdGxiX3N1cCkKKwkJcGNpX2VuYWJsZV9hdHMocGRldiwgUEFHRV9TSElGVCk7CisKIAl3cml0ZV9sb2NrX2lycXNhdmUoJmFtZF9pb21tdV9kZXZ0YWJsZV9sb2NrLCBmbGFncyk7CiAJcmV0ID0gX19hdHRhY2hfZGV2aWNlKGRldiwgZG9tYWluKTsKIAl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmYW1kX2lvbW11X2RldnRhYmxlX2xvY2ssIGZsYWdzKTsKQEAgLTE1NTEsNyArMTYzNSw3IEBACiAJICogbGVmdCB0aGUgY2FjaGVzIGluIHRoZSBJT01NVSBkaXJ0eS4gU28gd2UgaGF2ZSB0byBmbHVzaAogCSAqIGhlcmUgdG8gZXZpY3QgYWxsIGRpcnR5IHN0dWZmLgogCSAqLwotCWlvbW11X2ZsdXNoX3RsYl9wZGUoZG9tYWluKTsKKwlkb21haW5fZmx1c2hfdGxiX3BkZShkb21haW4pOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE1OTgsMTIgKzE2ODIsMTYgQEAKICAqLwogc3RhdGljIHZvaWQgZGV0YWNoX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIGxvY2sgZGV2aWNlIHRhYmxlICovCiAJd3JpdGVfbG9ja19pcnFzYXZlKCZhbWRfaW9tbXVfZGV2dGFibGVfbG9jaywgZmxhZ3MpOwogCV9fZGV0YWNoX2RldmljZShkZXYpOwogCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZhbWRfaW9tbXVfZGV2dGFibGVfbG9jaywgZmxhZ3MpOworCisJaWYgKGFtZF9pb21tdV9pb3RsYl9zdXAgJiYgcGNpX2F0c19lbmFibGVkKHBkZXYpKQorCQlwY2lfZGlzYWJsZV9hdHMocGRldik7CiB9CiAKIC8qCkBAIC0xNjkyLDcgKzE3ODAsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlpb21tdV9mbHVzaF9kZXZpY2UoZGV2KTsKKwlkZXZpY2VfZmx1c2hfZHRlKGRldik7CiAJaW9tbXVfY29tcGxldGlvbl93YWl0KGlvbW11KTsKIAogb3V0OgpAQCAtMTc1Myw4ICsxODQxLDkgQEAKIAlzdHJ1Y3QgaW9tbXVfZGV2X2RhdGEgKmRldl9kYXRhOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZfZGF0YSwgJmRvbWFpbi0+ZGV2X2xpc3QsIGxpc3QpIHsKKwkJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldl9kYXRhLT5kZXYpOwogCQl1MTYgZGV2aWQgPSBnZXRfZGV2aWNlX2lkKGRldl9kYXRhLT5kZXYpOwotCQlzZXRfZHRlX2VudHJ5KGRldmlkLCBkb21haW4pOworCQlzZXRfZHRlX2VudHJ5KGRldmlkLCBkb21haW4sIHBjaV9hdHNfZW5hYmxlZChwZGV2KSk7CiAJfQogfQogCkBAIC0xNzY0LDggKzE4NTMsOSBAQAogCQlyZXR1cm47CiAKIAl1cGRhdGVfZGV2aWNlX3RhYmxlKGRvbWFpbik7Ci0JaW9tbXVfZmx1c2hfZG9tYWluX2RldmljZXMoZG9tYWluKTsKLQlpb21tdV9mbHVzaF90bGJfcGRlKGRvbWFpbik7CisKKwlkb21haW5fZmx1c2hfZGV2aWNlcyhkb21haW4pOworCWRvbWFpbl9mbHVzaF90bGJfcGRlKGRvbWFpbik7CiAKIAlkb21haW4tPnVwZGF0ZWQgPSBmYWxzZTsKIH0KQEAgLTE5MjQsMTAgKzIwMTQsMTAgQEAKIAlBRERfU1RBVFNfQ09VTlRFUihhbGxvY2VkX2lvX21lbSwgc2l6ZSk7CiAKIAlpZiAodW5saWtlbHkoZG1hX2RvbS0+bmVlZF9mbHVzaCAmJiAhYW1kX2lvbW11X3VubWFwX2ZsdXNoKSkgewotCQlpb21tdV9mbHVzaF90bGIoJmRtYV9kb20tPmRvbWFpbik7CisJCWRvbWFpbl9mbHVzaF90bGIoJmRtYV9kb20tPmRvbWFpbik7CiAJCWRtYV9kb20tPm5lZWRfZmx1c2ggPSBmYWxzZTsKIAl9IGVsc2UgaWYgKHVubGlrZWx5KGFtZF9pb21tdV9ucF9jYWNoZSkpCi0JCWlvbW11X2ZsdXNoX3BhZ2VzKCZkbWFfZG9tLT5kb21haW4sIGFkZHJlc3MsIHNpemUpOworCQlkb21haW5fZmx1c2hfcGFnZXMoJmRtYV9kb20tPmRvbWFpbiwgYWRkcmVzcywgc2l6ZSk7CiAKIG91dDoKIAlyZXR1cm4gYWRkcmVzczsKQEAgLTE5NzYsNyArMjA2Niw3IEBACiAJZG1hX29wc19mcmVlX2FkZHJlc3NlcyhkbWFfZG9tLCBkbWFfYWRkciwgcGFnZXMpOwogCiAJaWYgKGFtZF9pb21tdV91bm1hcF9mbHVzaCB8fCBkbWFfZG9tLT5uZWVkX2ZsdXNoKSB7Ci0JCWlvbW11X2ZsdXNoX3BhZ2VzKCZkbWFfZG9tLT5kb21haW4sIGZsdXNoX2FkZHIsIHNpemUpOworCQlkb21haW5fZmx1c2hfcGFnZXMoJmRtYV9kb20tPmRvbWFpbiwgZmx1c2hfYWRkciwgc2l6ZSk7CiAJCWRtYV9kb20tPm5lZWRfZmx1c2ggPSBmYWxzZTsKIAl9CiB9CkBAIC0yMDEyLDcgKzIxMDIsNyBAQAogCWlmIChhZGRyID09IERNQV9FUlJPUl9DT0RFKQogCQlnb3RvIG91dDsKIAotCWlvbW11X2ZsdXNoX2NvbXBsZXRlKGRvbWFpbik7CisJZG9tYWluX2ZsdXNoX2NvbXBsZXRlKGRvbWFpbik7CiAKIG91dDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkb21haW4tPmxvY2ssIGZsYWdzKTsKQEAgLTIwMzksNyArMjEyOSw3IEBACiAKIAlfX3VubWFwX3NpbmdsZShkb21haW4tPnByaXYsIGRtYV9hZGRyLCBzaXplLCBkaXIpOwogCi0JaW9tbXVfZmx1c2hfY29tcGxldGUoZG9tYWluKTsKKwlkb21haW5fZmx1c2hfY29tcGxldGUoZG9tYWluKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRvbWFpbi0+bG9jaywgZmxhZ3MpOwogfQpAQCAtMjEwNCw3ICsyMTk0LDcgQEAKIAkJCWdvdG8gdW5tYXA7CiAJfQogCi0JaW9tbXVfZmx1c2hfY29tcGxldGUoZG9tYWluKTsKKwlkb21haW5fZmx1c2hfY29tcGxldGUoZG9tYWluKTsKIAogb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRvbWFpbi0+bG9jaywgZmxhZ3MpOwpAQCAtMjE1MCw3ICsyMjQwLDcgQEAKIAkJcy0+ZG1hX2FkZHJlc3MgPSBzLT5kbWFfbGVuZ3RoID0gMDsKIAl9CiAKLQlpb21tdV9mbHVzaF9jb21wbGV0ZShkb21haW4pOworCWRvbWFpbl9mbHVzaF9jb21wbGV0ZShkb21haW4pOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG9tYWluLT5sb2NrLCBmbGFncyk7CiB9CkBAIC0yMjAwLDcgKzIyOTAsNyBAQAogCQlnb3RvIG91dF9mcmVlOwogCX0KIAotCWlvbW11X2ZsdXNoX2NvbXBsZXRlKGRvbWFpbik7CisJZG9tYWluX2ZsdXNoX2NvbXBsZXRlKGRvbWFpbik7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkb21haW4tPmxvY2ssIGZsYWdzKTsKIApAQCAtMjIzMiw3ICsyMzIyLDcgQEAKIAogCV9fdW5tYXBfc2luZ2xlKGRvbWFpbi0+cHJpdiwgZG1hX2FkZHIsIHNpemUsIERNQV9CSURJUkVDVElPTkFMKTsKIAotCWlvbW11X2ZsdXNoX2NvbXBsZXRlKGRvbWFpbik7CisJZG9tYWluX2ZsdXNoX2NvbXBsZXRlKGRvbWFpbik7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkb21haW4tPmxvY2ssIGZsYWdzKTsKIApAQCAtMjQ3Niw3ICsyNTY2LDcgQEAKIAlpZiAoIWlvbW11KQogCQlyZXR1cm47CiAKLQlpb21tdV9mbHVzaF9kZXZpY2UoZGV2KTsKKwlkZXZpY2VfZmx1c2hfZHRlKGRldik7CiAJaW9tbXVfY29tcGxldGlvbl93YWl0KGlvbW11KTsKIH0KIApAQCAtMjU0Miw3ICsyNjMyLDcgQEAKIAl1bm1hcF9zaXplID0gaW9tbXVfdW5tYXBfcGFnZShkb21haW4sIGlvdmEsIHBhZ2Vfc2l6ZSk7CiAJbXV0ZXhfdW5sb2NrKCZkb21haW4tPmFwaV9sb2NrKTsKIAotCWlvbW11X2ZsdXNoX3RsYl9wZGUoZG9tYWluKTsKKwlkb21haW5fZmx1c2hfdGxiX3BkZShkb21haW4pOwogCiAJcmV0dXJuIGdldF9vcmRlcih1bm1hcF9zaXplKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXVfaW5pdC5jIGIvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdV9pbml0LmMKaW5kZXggMjQ2ZDcyNy4uOTE3OWMyMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdV9pbml0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdV9pbml0LmMKQEAgLTEzNyw2ICsxMzcsNyBAQAogCiAvKiBJT01NVXMgaGF2ZSBhIG5vbi1wcmVzZW50IGNhY2hlPyAqLwogYm9vbCBhbWRfaW9tbXVfbnBfY2FjaGUgX19yZWFkX21vc3RseTsKK2Jvb2wgYW1kX2lvbW11X2lvdGxiX3N1cCBfX3JlYWRfbW9zdGx5ID0gdHJ1ZTsKIAogLyoKICAqIFRoZSBBQ1BJIHRhYmxlIHBhcnNpbmcgZnVuY3Rpb25zIHNldCB0aGlzIHZhcmlhYmxlIG9uIGFuIGVycm9yCkBAIC0xODAsNiArMTgxLDEyIEBACiBzdGF0aWMgdTMyIGFsaWFzX3RhYmxlX3NpemU7CS8qIHNpemUgb2YgdGhlIGFsaWFzIHRhYmxlICovCiBzdGF0aWMgdTMyIHJsb29rdXBfdGFibGVfc2l6ZTsJLyogc2l6ZSBpZiB0aGUgcmxvb2t1cCB0YWJsZSAqLwogCisvKgorICogVGhpcyBmdW5jdGlvbiBmbHVzaGVzIGFsbCBpbnRlcm5hbCBjYWNoZXMgb2YKKyAqIHRoZSBJT01NVSB1c2VkIGJ5IHRoaXMgZHJpdmVyLgorICovCitleHRlcm4gdm9pZCBpb21tdV9mbHVzaF9hbGxfY2FjaGVzKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KTsKKwogc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9sYXN0X2RldmlkKHUxNiBkZXZpZCkKIHsKIAlpZiAoZGV2aWQgPiBhbWRfaW9tbXVfbGFzdF9iZGYpCkBAIC0yOTMsOSArMzAwLDIzIEBACiAvKiBGdW5jdGlvbiB0byBlbmFibGUgdGhlIGhhcmR3YXJlICovCiBzdGF0aWMgdm9pZCBpb21tdV9lbmFibGUoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCiB7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiQU1ELVZpOiBFbmFibGluZyBJT01NVSBhdCAlcyBjYXAgMHglaHhcbiIsCisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmZWF0X3N0cltdID0geworCQkiUHJlRiIsICJQUFIiLCAiWDJBUElDIiwgIk5YIiwgIkdUIiwgIls1XSIsCisJCSJJQSIsICJHQSIsICJIRSIsICJQQyIsIE5VTEwKKwl9OworCWludCBpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiQU1ELVZpOiBFbmFibGluZyBJT01NVSBhdCAlcyBjYXAgMHglaHgiLAogCSAgICAgICBkZXZfbmFtZSgmaW9tbXUtPmRldi0+ZGV2KSwgaW9tbXUtPmNhcF9wdHIpOwogCisJaWYgKGlvbW11LT5jYXAgJiAoMSA8PCBJT01NVV9DQVBfRUZSKSkgeworCQlwcmludGsoS0VSTl9DT05UICIgZXh0ZW5kZWQgZmVhdHVyZXM6ICIpOworCQlmb3IgKGkgPSAwOyBmZWF0X3N0cltpXTsgKytpKQorCQkJaWYgKGlvbW11X2ZlYXR1cmUoaW9tbXUsICgxVUxMIDw8IGkpKSkKKwkJCQlwcmludGsoS0VSTl9DT05UICIgJXMiLCBmZWF0X3N0cltpXSk7CisJfQorCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CisKIAlpb21tdV9mZWF0dXJlX2VuYWJsZShpb21tdSwgQ09OVFJPTF9JT01NVV9FTik7CiB9CiAKQEAgLTY1MSw3ICs2NzIsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGluaXRfaW9tbXVfZnJvbV9wY2koc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCiB7CiAJaW50IGNhcF9wdHIgPSBpb21tdS0+Y2FwX3B0cjsKLQl1MzIgcmFuZ2UsIG1pc2M7CisJdTMyIHJhbmdlLCBtaXNjLCBsb3csIGhpZ2g7CiAJaW50IGksIGo7CiAKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW9tbXUtPmRldiwgY2FwX3B0ciArIE1NSU9fQ0FQX0hEUl9PRkZTRVQsCkBAIC02NjcsNiArNjg4LDE1IEBACiAJCQkJCU1NSU9fR0VUX0xEKHJhbmdlKSk7CiAJaW9tbXUtPmV2dF9tc2lfbnVtID0gTU1JT19NU0lfTlVNKG1pc2MpOwogCisJaWYgKCEoaW9tbXUtPmNhcCAmICgxIDw8IElPTU1VX0NBUF9JT1RMQikpKQorCQlhbWRfaW9tbXVfaW90bGJfc3VwID0gZmFsc2U7CisKKwkvKiByZWFkIGV4dGVuZGVkIGZlYXR1cmUgYml0cyAqLworCWxvdyAgPSByZWFkbChpb21tdS0+bW1pb19iYXNlICsgTU1JT19FWFRfRkVBVFVSRVMpOworCWhpZ2ggPSByZWFkbChpb21tdS0+bW1pb19iYXNlICsgTU1JT19FWFRfRkVBVFVSRVMgKyA0KTsKKworCWlvbW11LT5mZWF0dXJlcyA9ICgodTY0KWhpZ2ggPDwgMzIpIHwgbG93OworCiAJaWYgKCFpc19yZDg5MF9pb21tdShpb21tdS0+ZGV2KSkKIAkJcmV0dXJuOwogCkBAIC0xMDA0LDEwICsxMDM0LDExIEBACiAJaWYgKHBjaV9lbmFibGVfbXNpKGlvbW11LT5kZXYpKQogCQlyZXR1cm4gMTsKIAotCXIgPSByZXF1ZXN0X2lycShpb21tdS0+ZGV2LT5pcnEsIGFtZF9pb21tdV9pbnRfaGFuZGxlciwKLQkJCUlSUUZfU0FNUExFX1JBTkRPTSwKLQkJCSJBTUQtVmkiLAotCQkJTlVMTCk7CisJciA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGlvbW11LT5kZXYtPmlycSwKKwkJCQkgYW1kX2lvbW11X2ludF9oYW5kbGVyLAorCQkJCSBhbWRfaW9tbXVfaW50X3RocmVhZCwKKwkJCQkgMCwgIkFNRC1WaSIsCisJCQkJIGlvbW11LT5kZXYpOwogCiAJaWYgKHIpIHsKIAkJcGNpX2Rpc2FibGVfbXNpKGlvbW11LT5kZXYpOwpAQCAtMTI0NCw2ICsxMjc1LDcgQEAKIAkJaW9tbXVfc2V0X2V4Y2x1c2lvbl9yYW5nZShpb21tdSk7CiAJCWlvbW11X2luaXRfbXNpKGlvbW11KTsKIAkJaW9tbXVfZW5hYmxlKGlvbW11KTsKKwkJaW9tbXVfZmx1c2hfYWxsX2NhY2hlcyhpb21tdSk7CiAJfQogfQogCkBAIC0xMjc0LDggKzEzMDYsOCBAQAogCSAqIHdlIGhhdmUgdG8gZmx1c2ggYWZ0ZXIgdGhlIElPTU1VcyBhcmUgZW5hYmxlZCBiZWNhdXNlIGEKIAkgKiBkaXNhYmxlZCBJT01NVSB3aWxsIG5ldmVyIGV4ZWN1dGUgdGhlIGNvbW1hbmRzIHdlIHNlbmQKIAkgKi8KLQlhbWRfaW9tbXVfZmx1c2hfYWxsX2RldmljZXMoKTsKLQlhbWRfaW9tbXVfZmx1c2hfYWxsX2RvbWFpbnMoKTsKKwlmb3JfZWFjaF9pb21tdShpb21tdSkKKwkJaW9tbXVfZmx1c2hfYWxsX2NhY2hlcyhpb21tdSk7CiB9CiAKIHN0YXRpYyBpbnQgYW1kX2lvbW11X3N1c3BlbmQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGJfdGltZXIuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGJfdGltZXIuYwppbmRleCBjZDFmZmVkLi4yODllOTI4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBiX3RpbWVyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwYl90aW1lci5jCkBAIC0xNzcsNyArMTc3LDYgQEAKIAkucmF0aW5nCQk9IEFQQlRfQ0xPQ0tTT1VSQ0VfUkFUSU5HLAogCS5yZWFkCQk9IGFwYnRfcmVhZF9jbG9ja3NvdXJjZSwKIAkubWFzawkJPSBBUEJUX01BU0ssCi0JLnNoaWZ0CQk9IEFQQlRfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAogCS5yZXN1bWUJCT0gYXBidF9yZXN0YXJ0X2Nsb2Nrc291cmNlLAogfTsKQEAgLTU0MywxNCArNTQyLDcgQEAKIAlpZiAodDEgPT0gYXBidF9yZWFkX2Nsb2Nrc291cmNlKCZjbG9ja3NvdXJjZV9hcGJ0KSkKIAkJcGFuaWMoIkFQQlQgY291bnRlciBub3QgY291bnRpbmcuIEFQQlQgZGlzYWJsZWRcbiIpOwogCi0JLyoKLQkgKiBpbml0aWFsaXplIGFuZCByZWdpc3RlciBBUEJUIGNsb2Nrc291cmNlCi0JICogY29udmVydCB0aGF0IHRvIG5zL2Nsb2NrIGN5Y2xlCi0JICogbXVsdCA9IChucy9jKSAqIDJeQVBCVF9TSElGVAotCSAqLwotCWNsb2Nrc291cmNlX2FwYnQubXVsdCA9IGRpdl9zYyhNU0VDX1BFUl9TRUMsCi0JCQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBhcGJ0X2ZyZXEsIEFQQlRfU0hJRlQpOwotCWNsb2Nrc291cmNlX3JlZ2lzdGVyKCZjbG9ja3NvdXJjZV9hcGJ0KTsKKwljbG9ja3NvdXJjZV9yZWdpc3Rlcl9raHooJmNsb2Nrc291cmNlX2FwYnQsICh1MzIpYXBidF9mcmVxKjEwMDApOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBlcnR1cmVfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGVydHVyZV82NC5jCmluZGV4IDczZmI0NjkuLjNkMjY2MWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGVydHVyZV82NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGVydHVyZV82NC5jCkBAIC0zMCw2ICszMCwyMiBAQAogI2luY2x1ZGUgPGFzbS9hbWRfbmIuaD4KICNpbmNsdWRlIDxhc20veDg2X2luaXQuaD4KIAorLyoKKyAqIFVzaW5nIDUxMk0gYXMgZ29hbCwgaW4gY2FzZSBrZXhlYyB3aWxsIGxvYWQga2VybmVsX2JpZworICogdGhhdCB3aWxsIGRvIHRoZSBvbi1wb3NpdGlvbiBkZWNvbXByZXNzLCBhbmQgY291bGQgb3ZlcmxhcCB3aXRoCisgKiB3aXRoIHRoZSBnYXJ0IGFwZXJ0dXJlIHRoYXQgaXMgdXNlZC4KKyAqIFNlcXVlbmNlOgorICoga2VybmVsX3NtYWxsCisgKiA9PT4ga2V4ZWMgKHdpdGgga2R1bXAgdHJpZ2dlciBwYXRoIG9yIGdhcnQgc3RpbGwgZW5hYmxlZCkKKyAqID09PiBrZXJuZWxfc21hbGwgKGdhcnQgYXJlYSBiZWNvbWUgZTgyMF9yZXNlcnZlZCkKKyAqID09PiBrZXhlYyAod2l0aCBrZHVtcCB0cmlnZ2VyIHBhdGggb3IgZ2FydCBzdGlsbCBlbmFibGVkKQorICogPT0+IGtlcm5lX2JpZyAodW5jb21wcmVzc2VkIHNpemUgd2lsbCBiZSBiaWcgdGhhbiA2NE0gb3IgMTI4TSkKKyAqIFNvIGRvbid0IHVzZSA1MTJNIGJlbG93IGFzIGdhcnQgaW9tbXUsIGxlYXZlIHRoZSBzcGFjZSBmb3Iga2VybmVsCisgKiBjb2RlIGZvciBzYWZlLgorICovCisjZGVmaW5lIEdBUlRfTUlOX0FERFIJKDUxMlVMTCA8PCAyMCkKKyNkZWZpbmUgR0FSVF9NQVhfQUREUgkoMVVMTCAgIDw8IDMyKQorCiBpbnQgZ2FydF9pb21tdV9hcGVydHVyZTsKIGludCBnYXJ0X2lvbW11X2FwZXJ0dXJlX2Rpc2FibGVkIF9faW5pdGRhdGE7CiBpbnQgZ2FydF9pb21tdV9hcGVydHVyZV9hbGxvd2VkIF9faW5pdGRhdGE7CkBAIC03MCwyMSArODYsOSBAQAogCSAqIG1lbW9yeS4gVW5mb3J0dW5hdGVseSB3ZSBjYW5ub3QgbW92ZSBpdCB1cCBiZWNhdXNlIHRoYXQgd291bGQKIAkgKiBtYWtlIHRoZSBJT01NVSB1c2VsZXNzLgogCSAqLwotCS8qCi0JICogdXNpbmcgNTEyTSBhcyBnb2FsLCBpbiBjYXNlIGtleGVjIHdpbGwgbG9hZCBrZXJuZWxfYmlnCi0JICogdGhhdCB3aWxsIGRvIHRoZSBvbiBwb3NpdGlvbiBkZWNvbXByZXNzLCBhbmQgIGNvdWxkIG92ZXJsYXAgd2l0aAotCSAqIHRoYXQgcG9zaXRpb24gd2l0aCBnYXJ0IHRoYXQgaXMgdXNlZC4KLQkgKiBzZXF1ZW5kZToKLQkgKiBrZXJuZWxfc21hbGwKLQkgKiA9PT4ga2V4ZWMgKHdpdGgga2R1bXAgdHJpZ2dlciBwYXRoIG9yIHByZXZpb3VzIGRvZXNuJ3Qgc2h1dGRvd24gZ2FydCkKLQkgKiA9PT4ga2VybmVsX3NtYWxsKGdhcnQgYXJlYSBiZWNvbWUgZTgyMF9yZXNlcnZlZCkKLQkgKiA9PT4ga2V4ZWMgKHdpdGgga2R1bXAgdHJpZ2dlciBwYXRoIG9yIHByZXZpb3VzIGRvZXNuJ3Qgc2h1dGRvd24gZ2FydCkKLQkgKiA9PT4ga2VybmVfYmlnICh1bmNvbXByZXNzZWQgc2l6ZSB3aWxsIGJlIGJpZyB0aGFuIDY0TSBvciAxMjhNKQotCSAqIHNvIGRvbid0IHVzZSA1MTJNIGJlbG93IGFzIGdhcnQgaW9tbXUsIGxlYXZlIHRoZSBzcGFjZSBmb3Iga2VybmVsCi0JICogY29kZSBmb3Igc2FmZQotCSAqLwotCWFkZHIgPSBtZW1ibG9ja19maW5kX2luX3JhbmdlKDAsIDFVTEw8PDMyLCBhcGVyX3NpemUsIDUxMlVMTDw8MjApOwotCWlmIChhZGRyID09IE1FTUJMT0NLX0VSUk9SIHx8IGFkZHIgKyBhcGVyX3NpemUgPiAweGZmZmZmZmZmKSB7CisJYWRkciA9IG1lbWJsb2NrX2ZpbmRfaW5fcmFuZ2UoR0FSVF9NSU5fQUREUiwgR0FSVF9NQVhfQUREUiwKKwkJCQkgICAgICBhcGVyX3NpemUsIGFwZXJfc2l6ZSk7CisJaWYgKGFkZHIgPT0gTUVNQkxPQ0tfRVJST1IgfHwgYWRkciArIGFwZXJfc2l6ZSA+IEdBUlRfTUFYX0FERFIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCQkiQ2Fubm90IGFsbG9jYXRlIGFwZXJ0dXJlIG1lbW9yeSBob2xlICglbHgsJXVLKVxuIiwKIAkJCQlhZGRyLCBhcGVyX3NpemU+PjEwKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYwppbmRleCBmYWJmMDFlLi5mOTJhOGU1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jCkBAIC01MDUsNyArNTA1LDcgQEAKIHsKIAlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpsZXZ0ID0gJl9fZ2V0X2NwdV92YXIobGFwaWNfZXZlbnRzKTsKIAotCWlmIChjcHVfaGFzKF9fdGhpc19jcHVfcHRyKCZjcHVfaW5mbyksIFg4Nl9GRUFUVVJFX0FSQVQpKSB7CisJaWYgKHRoaXNfY3B1X2hhcyhYODZfRkVBVFVSRV9BUkFUKSkgewogCQlsYXBpY19jbG9ja2V2ZW50LmZlYXR1cmVzICY9IH5DTE9DS19FVlRfRkVBVF9DM1NUT1A7CiAJCS8qIE1ha2UgTEFQSUMgdGltZXIgcHJlZmVycmFibGUgb3ZlciBwZXJjcHUgSFBFVCAqLwogCQlsYXBpY19jbG9ja2V2ZW50LnJhdGluZyA9IDE1MDsKQEAgLTEyMzcsNiArMTIzNywxNyBAQAogCS8qIGFsd2F5cyB1c2UgdGhlIHZhbHVlIGZyb20gTERSICovCiAJZWFybHlfcGVyX2NwdSh4ODZfY3B1X3RvX2xvZ2ljYWxfYXBpY2lkLCBjcHUpID0KIAkJbG9naWNhbF9zbXBfcHJvY2Vzc29yX2lkKCk7CisKKwkvKgorCSAqIFNvbWUgTlVNQSBpbXBsZW1lbnRhdGlvbnMgKE5VTUFRKSBkb24ndCBpbml0aWFsaXplIGFwaWNpZCB0bworCSAqIG5vZGUgbWFwcGluZyBkdXJpbmcgTlVNQSBpbml0LiAgTm93IHRoYXQgbG9naWNhbCBhcGljaWQgaXMKKwkgKiBndWFyYW50ZWVkIHRvIGJlIGtub3duLCBnaXZlIGl0IGFub3RoZXIgY2hhbmNlLiAgVGhpcyBpcyBhbHJlYWR5CisJICogYSBiaXQgdG9vIGxhdGUgLSBwZXJjcHUgYWxsb2NhdGlvbiBoYXMgYWxyZWFkeSBoYXBwZW5lZCB3aXRob3V0CisJICogcHJvcGVyIE5VTUEgYWZmaW5pdHkuCisJICovCisJaWYgKGFwaWMtPng4Nl8zMl9udW1hX2NwdV9ub2RlKQorCQlzZXRfYXBpY2lkX3RvX25vZGUoZWFybHlfcGVyX2NwdSh4ODZfY3B1X3RvX2FwaWNpZCwgY3B1KSwKKwkJCQkgICBhcGljLT54ODZfMzJfbnVtYV9jcHVfbm9kZShjcHUpKTsKICNlbmRpZgogCiAJLyoKQEAgLTE4MTIsMzAgKzE4MjMsNDEgQEAKICAqLwogdm9pZCBzbXBfZXJyb3JfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXUzMiB2LCB2MTsKKwl1MzIgdjAsIHYxOworCXUzMiBpID0gMDsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGVycm9yX2ludGVycnVwdF9yZWFzb25bXSA9IHsKKwkJIlNlbmQgQ1MgZXJyb3IiLAkJLyogQVBJQyBFcnJvciBCaXQgMCAqLworCQkiUmVjZWl2ZSBDUyBlcnJvciIsCQkvKiBBUElDIEVycm9yIEJpdCAxICovCisJCSJTZW5kIGFjY2VwdCBlcnJvciIsCQkvKiBBUElDIEVycm9yIEJpdCAyICovCisJCSJSZWNlaXZlIGFjY2VwdCBlcnJvciIsCQkvKiBBUElDIEVycm9yIEJpdCAzICovCisJCSJSZWRpcmVjdGFibGUgSVBJIiwJCS8qIEFQSUMgRXJyb3IgQml0IDQgKi8KKwkJIlNlbmQgaWxsZWdhbCB2ZWN0b3IiLAkJLyogQVBJQyBFcnJvciBCaXQgNSAqLworCQkiUmVjZWl2ZWQgaWxsZWdhbCB2ZWN0b3IiLAkvKiBBUElDIEVycm9yIEJpdCA2ICovCisJCSJJbGxlZ2FsIHJlZ2lzdGVyIGFkZHJlc3MiLAkvKiBBUElDIEVycm9yIEJpdCA3ICovCisJfTsKIAogCWV4aXRfaWRsZSgpOwogCWlycV9lbnRlcigpOwogCS8qIEZpcnN0IHRpY2tsZSB0aGUgaGFyZHdhcmUsIG9ubHkgdGhlbiByZXBvcnQgd2hhdCB3ZW50IG9uLiAtLSBSRVcgKi8KLQl2ID0gYXBpY19yZWFkKEFQSUNfRVNSKTsKKwl2MCA9IGFwaWNfcmVhZChBUElDX0VTUik7CiAJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CiAJdjEgPSBhcGljX3JlYWQoQVBJQ19FU1IpOwogCWFja19BUElDX2lycSgpOwogCWF0b21pY19pbmMoJmlycV9lcnJfY291bnQpOwogCi0JLyoKLQkgKiBIZXJlIGlzIHdoYXQgdGhlIEFQSUMgZXJyb3IgYml0cyBtZWFuOgotCSAqIDA6IFNlbmQgQ1MgZXJyb3IKLQkgKiAxOiBSZWNlaXZlIENTIGVycm9yCi0JICogMjogU2VuZCBhY2NlcHQgZXJyb3IKLQkgKiAzOiBSZWNlaXZlIGFjY2VwdCBlcnJvcgotCSAqIDQ6IFJlc2VydmVkCi0JICogNTogU2VuZCBpbGxlZ2FsIHZlY3RvcgotCSAqIDY6IFJlY2VpdmVkIGlsbGVnYWwgdmVjdG9yCi0JICogNzogSWxsZWdhbCByZWdpc3RlciBhZGRyZXNzCi0JICovCi0JcHJfZGVidWcoIkFQSUMgZXJyb3Igb24gQ1BVJWQ6ICUwMngoJTAyeClcbiIsCi0JCXNtcF9wcm9jZXNzb3JfaWQoKSwgdiAsIHYxKTsKKwlhcGljX3ByaW50ayhBUElDX0RFQlVHLCBLRVJOX0RFQlVHICJBUElDIGVycm9yIG9uIENQVSVkOiAlMDJ4KCUwMngpIiwKKwkJICAgIHNtcF9wcm9jZXNzb3JfaWQoKSwgdjAgLCB2MSk7CisKKwl2MSA9IHYxICYgMHhmZjsKKwl3aGlsZSAodjEpIHsKKwkJaWYgKHYxICYgMHgxKQorCQkJYXBpY19wcmludGsoQVBJQ19ERUJVRywgS0VSTl9DT05UICIgOiAlcyIsIGVycm9yX2ludGVycnVwdF9yZWFzb25baV0pOworCQlpKys7CisJCXYxID4+PSAxOworCX07CisKKwlhcGljX3ByaW50ayhBUElDX0RFQlVHLCBLRVJOX0NPTlQgIlxuIik7CisKIAlpcnFfZXhpdCgpOwogfQogCkBAIC0yMDAzLDIxICsyMDI1LDYgQEAKIAlhcGljX3dyaXRlKEFQSUNfTERSLCB2YWwpOwogfQogCi0jaWZkZWYgQ09ORklHX1g4Nl8zMgotaW50IGRlZmF1bHRfeDg2XzMyX251bWFfY3B1X25vZGUoaW50IGNwdSkKLXsKLSNpZmRlZiBDT05GSUdfTlVNQQotCWludCBhcGljaWQgPSBlYXJseV9wZXJfY3B1KHg4Nl9jcHVfdG9fYXBpY2lkLCBjcHUpOwotCi0JaWYgKGFwaWNpZCAhPSBCQURfQVBJQ0lEKQotCQlyZXR1cm4gX19hcGljaWRfdG9fbm9kZVthcGljaWRdOwotCXJldHVybiBOVU1BX05PX05PREU7Ci0jZWxzZQotCXJldHVybiAwOwotI2VuZGlmCi19Ci0jZW5kaWYKLQogLyoKICAqIFBvd2VyIG1hbmFnZW1lbnQKICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpY19ub29wLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX25vb3AuYwppbmRleCBmMWJhYTJkLi43NzViODJiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX25vb3AuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX25vb3AuYwpAQCAtMTE5LDE0ICsxMTksNiBAQAogCVdBUk5fT05fT05DRShjcHVfaGFzX2FwaWMgJiYgIWRpc2FibGVfYXBpYyk7CiB9CiAKLSNpZmRlZiBDT05GSUdfWDg2XzMyCi1zdGF0aWMgaW50IG5vb3BfeDg2XzMyX251bWFfY3B1X25vZGUoaW50IGNwdSkKLXsKLQkvKiB3ZSdyZSBhbHdheXMgb24gbm9kZSAwICovCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQogc3RydWN0IGFwaWMgYXBpY19ub29wID0gewogCS5uYW1lCQkJCT0gIm5vb3AiLAogCS5wcm9iZQkJCQk9IG5vb3BfcHJvYmUsCkBAIC0xOTUsNiArMTg3LDUgQEAKIAogI2lmZGVmIENPTkZJR19YODZfMzIKIAkueDg2XzMyX2Vhcmx5X2xvZ2ljYWxfYXBpY2lkCT0gbm9vcF94ODZfMzJfZWFybHlfbG9naWNhbF9hcGljaWQsCi0JLng4Nl8zMl9udW1hX2NwdV9ub2RlCQk9IG5vb3BfeDg2XzMyX251bWFfY3B1X25vZGUsCiAjZW5kaWYKIH07CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9iaWdzbXBfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2JpZ3NtcF8zMi5jCmluZGV4IDU0MWEyZTQuLmQ4NGFjNWE1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9iaWdzbXBfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9iaWdzbXBfMzIuYwpAQCAtMjUzLDUgKzI1Myw0IEBACiAJLnNhZmVfd2FpdF9pY3JfaWRsZQkJPSBuYXRpdmVfc2FmZV9hcGljX3dhaXRfaWNyX2lkbGUsCiAKIAkueDg2XzMyX2Vhcmx5X2xvZ2ljYWxfYXBpY2lkCT0gYmlnc21wX2Vhcmx5X2xvZ2ljYWxfYXBpY2lkLAotCS54ODZfMzJfbnVtYV9jcHVfbm9kZQkJPSBkZWZhdWx0X3g4Nl8zMl9udW1hX2NwdV9ub2RlLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2VzNzAwMF8zMi5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvZXM3MDAwXzMyLmMKaW5kZXggM2U5ZGU0OC4uNzA1MzNkZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvZXM3MDAwXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvZXM3MDAwXzMyLmMKQEAgLTUxMCwxMSArNTEwLDYgQEAKIAkJbnJfaW9hcGljcywgY3B1bWFza19iaXRzKGVzNzAwMF90YXJnZXRfY3B1cygpKVswXSk7CiB9CiAKLXN0YXRpYyBpbnQgZXM3MDAwX251bWFfY3B1X25vZGUoaW50IGNwdSkKLXsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBlczcwMDBfY3B1X3ByZXNlbnRfdG9fYXBpY2lkKGludCBtcHNfY3B1KQogewogCWlmICghbXBzX2NwdSkKQEAgLTY4OCw3ICs2ODMsNiBAQAogCS5zYWZlX3dhaXRfaWNyX2lkbGUJCT0gbmF0aXZlX3NhZmVfYXBpY193YWl0X2ljcl9pZGxlLAogCiAJLng4Nl8zMl9lYXJseV9sb2dpY2FsX2FwaWNpZAk9IGVzNzAwMF9lYXJseV9sb2dpY2FsX2FwaWNpZCwKLQkueDg2XzMyX251bWFfY3B1X25vZGUJCT0gZXM3MDAwX251bWFfY3B1X25vZGUsCiB9OwogCiBzdHJ1Y3QgYXBpYyBfX3JlZmRhdGEgYXBpY19lczcwMDAgPSB7CkBAIC03NTIsNSArNzQ2LDQgQEAKIAkuc2FmZV93YWl0X2ljcl9pZGxlCQk9IG5hdGl2ZV9zYWZlX2FwaWNfd2FpdF9pY3JfaWRsZSwKIAogCS54ODZfMzJfZWFybHlfbG9naWNhbF9hcGljaWQJPSBlczcwMDBfZWFybHlfbG9naWNhbF9hcGljaWQsCi0JLng4Nl8zMl9udW1hX2NwdV9ub2RlCQk9IGVzNzAwMF9udW1hX2NwdV9ub2RlLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL251bWFxXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9udW1hcV8zMi5jCmluZGV4IDYyNzNlZWUuLjMwZjEzMzEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL251bWFxXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvbnVtYXFfMzIuYwpAQCAtNDgsOCArNDgsNiBAQAogI2luY2x1ZGUgPGFzbS9lODIwLmg+CiAjaW5jbHVkZSA8YXNtL2lwaS5oPgogCi0jZGVmaW5lCU1CX1RPX1BBR0VTKGFkZHIpCQkoKGFkZHIpIDw8ICgyMCAtIFBBR0VfU0hJRlQpKQotCiBpbnQgZm91bmRfbnVtYXE7CiAKIC8qCkBAIC03OSwzMSArNzcsMjAgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBudW1hcV9yZWdpc3Rlcl9ub2RlKGludCBub2RlLCBzdHJ1Y3Qgc3lzX2NmZ19kYXRhICpzY2QpCiB7CiAJc3RydWN0IGVhY2hxdWFkbWVtICplcSA9IHNjZC0+ZXEgKyBub2RlOworCXU2NCBzdGFydCA9ICh1NjQpKGVxLT5oaV9zaHJkX21lbV9zdGFydCAtIGVxLT5wcml2X21lbV9zaXplKSA8PCAyMDsKKwl1NjQgZW5kID0gKHU2NCkoZXEtPmhpX3NocmRfbWVtX3N0YXJ0ICsgZXEtPmhpX3NocmRfbWVtX3NpemUpIDw8IDIwOworCWludCByZXQ7CiAKLQlub2RlX3NldF9vbmxpbmUobm9kZSk7Ci0KLQkvKiBDb252ZXJ0IHRvIHBhZ2VzICovCi0Jbm9kZV9zdGFydF9wZm5bbm9kZV0gPQotCQkgTUJfVE9fUEFHRVMoZXEtPmhpX3NocmRfbWVtX3N0YXJ0IC0gZXEtPnByaXZfbWVtX3NpemUpOwotCi0Jbm9kZV9lbmRfcGZuW25vZGVdID0KLQkJIE1CX1RPX1BBR0VTKGVxLT5oaV9zaHJkX21lbV9zdGFydCArIGVxLT5oaV9zaHJkX21lbV9zaXplKTsKLQotCW1lbWJsb2NrX3g4Nl9yZWdpc3Rlcl9hY3RpdmVfcmVnaW9ucyhub2RlLCBub2RlX3N0YXJ0X3Bmbltub2RlXSwKLQkJCQkJCW5vZGVfZW5kX3Bmbltub2RlXSk7Ci0KLQltZW1vcnlfcHJlc2VudChub2RlLCBub2RlX3N0YXJ0X3Bmbltub2RlXSwgbm9kZV9lbmRfcGZuW25vZGVdKTsKLQotCW5vZGVfcmVtYXBfc2l6ZVtub2RlXSA9IG5vZGVfbWVtbWFwX3NpemVfYnl0ZXMobm9kZSwKLQkJCQkJbm9kZV9zdGFydF9wZm5bbm9kZV0sCi0JCQkJCW5vZGVfZW5kX3Bmbltub2RlXSk7CisJbm9kZV9zZXQobm9kZSwgbnVtYV9ub2Rlc19wYXJzZWQpOworCXJldCA9IG51bWFfYWRkX21lbWJsayhub2RlLCBzdGFydCwgZW5kKTsKKwlCVUdfT04ocmV0IDwgMCk7CiB9CiAKIC8qCiAgKiBGdW5jdGlvbjogc21wX2R1bXBfcWN0KCkKICAqCiAgKiBEZXNjcmlwdGlvbjogZ2V0cyBtZW1vcnkgbGF5b3V0IGZyb20gdGhlIHF1YWQgY29uZmlnIHRhYmxlLiAgVGhpcwotICogZnVuY3Rpb24gYWxzbyB1cGRhdGVzIG5vZGVfb25saW5lX21hcCB3aXRoIHRoZSBub2RlcyAocXVhZHMpIHByZXNlbnQuCisgKiBmdW5jdGlvbiBhbHNvIHVwZGF0ZXMgbnVtYV9ub2Rlc19wYXJzZWQgd2l0aCB0aGUgbm9kZXMgKHF1YWRzKSBwcmVzZW50LgogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgc21wX2R1bXBfcWN0KHZvaWQpCiB7CkBAIC0xMTIsNyArOTksNiBAQAogCiAJc2NkID0gKHZvaWQgKilfX3ZhKFNZU19DRkdfREFUQV9QUklWX0FERFIpOwogCi0Jbm9kZXNfY2xlYXIobm9kZV9vbmxpbmVfbWFwKTsKIAlmb3JfZWFjaF9ub2RlKG5vZGUpIHsKIAkJaWYgKHNjZC0+cXVhZHNfcHJlc2VudDMxXzAgJiAoMSA8PCBub2RlKSkKIAkJCW51bWFxX3JlZ2lzdGVyX25vZGUobm9kZSwgc2NkKTsKQEAgLTI4MiwxNCArMjY4LDE0IEBACiAJfQogfQogCi1pbnQgX19pbml0IGdldF9tZW1jZmdfbnVtYXEodm9pZCkKK2ludCBfX2luaXQgbnVtYXFfbnVtYV9pbml0KHZvaWQpCiB7CiAJZWFybHlfY2hlY2tfbnVtYXEoKTsKIAlpZiAoIWZvdW5kX251bWFxKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FTk9FTlQ7CiAJc21wX2R1bXBfcWN0KCk7CiAKLQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KIAogI2RlZmluZSBOVU1BUV9BUElDX0RGUl9WQUxVRQkoQVBJQ19ERlJfQ0xVU1RFUikKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3Byb2JlXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9wcm9iZV8zMi5jCmluZGV4IGZjODRjN2IuLjY1NDFlNDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3Byb2JlXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvcHJvYmVfMzIuYwpAQCAtMTcyLDcgKzE3Miw2IEBACiAJLnNhZmVfd2FpdF9pY3JfaWRsZQkJPSBuYXRpdmVfc2FmZV9hcGljX3dhaXRfaWNyX2lkbGUsCiAKIAkueDg2XzMyX2Vhcmx5X2xvZ2ljYWxfYXBpY2lkCT0gZGVmYXVsdF94ODZfMzJfZWFybHlfbG9naWNhbF9hcGljaWQsCi0JLng4Nl8zMl9udW1hX2NwdV9ub2RlCQk9IGRlZmF1bHRfeDg2XzMyX251bWFfY3B1X25vZGUsCiB9OwogCiBleHRlcm4gc3RydWN0IGFwaWMgYXBpY19udW1hcTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3N1bW1pdF8zMi5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvc3VtbWl0XzMyLmMKaW5kZXggZTRiODA1OS4uMzViY2Q3ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvc3VtbWl0XzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvc3VtbWl0XzMyLmMKQEAgLTU1MSw1ICs1NTEsNCBAQAogCS5zYWZlX3dhaXRfaWNyX2lkbGUJCT0gbmF0aXZlX3NhZmVfYXBpY193YWl0X2ljcl9pZGxlLAogCiAJLng4Nl8zMl9lYXJseV9sb2dpY2FsX2FwaWNpZAk9IHN1bW1pdF9lYXJseV9sb2dpY2FsX2FwaWNpZCwKLQkueDg2XzMyX251bWFfY3B1X25vZGUJCT0gZGVmYXVsdF94ODZfMzJfbnVtYV9jcHVfbm9kZSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBtXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBtXzMyLmMKaW5kZXggYWRlZTEyZS4uM2JmYTAyMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwbV8zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcG1fMzIuYwpAQCAtMTIzOCw3ICsxMjM4LDYgQEAKIAlkcG1fc3VzcGVuZF9ub2lycShQTVNHX1NVU1BFTkQpOwogCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlzeXNkZXZfc3VzcGVuZChQTVNHX1NVU1BFTkQpOwogCXN5c2NvcmVfc3VzcGVuZCgpOwogCiAJbG9jYWxfaXJxX2VuYWJsZSgpOwpAQCAtMTI1OCw3ICsxMjU3LDYgQEAKIAllcnIgPSAoZXJyID09IEFQTV9TVUNDRVNTKSA/IDAgOiAtRUlPOwogCiAJc3lzY29yZV9yZXN1bWUoKTsKLQlzeXNkZXZfcmVzdW1lKCk7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCiAJZHBtX3Jlc3VtZV9ub2lycShQTVNHX1JFU1VNRSk7CkBAIC0xMjgyLDcgKzEyODAsNiBAQAogCWRwbV9zdXNwZW5kX25vaXJxKFBNU0dfU1VTUEVORCk7CiAKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCXN5c2Rldl9zdXNwZW5kKFBNU0dfU1VTUEVORCk7CiAJc3lzY29yZV9zdXNwZW5kKCk7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCkBAIC0xMjkyLDcgKzEyODksNiBAQAogCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAlzeXNjb3JlX3Jlc3VtZSgpOwotCXN5c2Rldl9yZXN1bWUoKTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKIAlkcG1fcmVzdW1lX25vaXJxKFBNU0dfUkVTVU1FKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvTWFrZWZpbGUgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L01ha2VmaWxlCmluZGV4IDNmMGViZTQuLjYwNDI5ODEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9NYWtlZmlsZQpAQCAtMzAsNyArMzAsNiBAQAogCiBvYmotJChDT05GSUdfWDg2X01DRSkJCQkrPSBtY2hlY2svCiBvYmotJChDT05GSUdfTVRSUikJCQkrPSBtdHJyLwotb2JqLSQoQ09ORklHX0NQVV9GUkVRKQkJCSs9IGNwdWZyZXEvCiAKIG9iai0kKENPTkZJR19YODZfTE9DQUxfQVBJQykJCSs9IHBlcmZjdHItd2F0Y2hkb2cubwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYwppbmRleCBlMmNlZDAwLi5jYmM3MGEyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY29tbW9uLmMKQEAgLTI1NCw2ICsyNTQsMjUgQEAKIH0KICNlbmRpZgogCitzdGF0aWMgaW50IGRpc2FibGVfc21lcCBfX2luaXRkYXRhOworc3RhdGljIF9faW5pdCBpbnQgc2V0dXBfZGlzYWJsZV9zbWVwKGNoYXIgKmFyZykKK3sKKwlkaXNhYmxlX3NtZXAgPSAxOworCXJldHVybiAxOworfQorX19zZXR1cCgibm9zbWVwIiwgc2V0dXBfZGlzYWJsZV9zbWVwKTsKKworc3RhdGljIF9faW5pdCB2b2lkIHNldHVwX3NtZXAoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCWlmIChjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1NNRVApKSB7CisJCWlmICh1bmxpa2VseShkaXNhYmxlX3NtZXApKSB7CisJCQlzZXR1cF9jbGVhcl9jcHVfY2FwKFg4Nl9GRUFUVVJFX1NNRVApOworCQkJY2xlYXJfaW5fY3I0KFg4Nl9DUjRfU01FUCk7CisJCX0gZWxzZQorCQkJc2V0X2luX2NyNChYODZfQ1I0X1NNRVApOworCX0KK30KKwogLyoKICAqIFNvbWUgQ1BVIGZlYXR1cmVzIGRlcGVuZCBvbiBoaWdoZXIgQ1BVSUQgbGV2ZWxzLCB3aGljaCBtYXkgbm90IGFsd2F5cwogICogYmUgYXZhaWxhYmxlIGR1ZSB0byBDUFVJRCBsZXZlbCBjYXBwaW5nIG9yIGJyb2tlbiB2aXJ0dWFsaXphdGlvbgpAQCAtNTY1LDggKzU4NCw3IEBACiAKIAkJY3B1aWRfY291bnQoMHgwMDAwMDAwNywgMCwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CiAKLQkJaWYgKGVheCA+IDApCi0JCQljLT54ODZfY2FwYWJpbGl0eVs5XSA9IGVieDsKKwkJYy0+eDg2X2NhcGFiaWxpdHlbOV0gPSBlYng7CiAJfQogCiAJLyogQU1ELWRlZmluZWQgZmxhZ3M6IGxldmVsIDB4ODAwMDAwMDEgKi8KQEAgLTY2OCw2ICs2ODYsOCBAQAogCWMtPmNwdV9pbmRleCA9IDA7CiAjZW5kaWYKIAlmaWx0ZXJfY3B1aWRfZmVhdHVyZXMoYywgZmFsc2UpOworCisJc2V0dXBfc21lcChjKTsKIH0KIAogdm9pZCBfX2luaXQgZWFybHlfY3B1X2luaXQodm9pZCkKQEAgLTc1Myw2ICs3NzMsOCBAQAogI2VuZGlmCiAJfQogCisJc2V0dXBfc21lcChjKTsKKwogCWdldF9tb2RlbF9uYW1lKGMpOyAvKiBEZWZhdWx0IG5hbWUgKi8KIAogCWRldGVjdF9ub3BsKGMpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL01ha2VmaWxlIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDU0YmY2Li4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgTGluayBvcmRlciBtYXR0ZXJzLiBLOCBpcyBwcmVmZXJyZWQgdG8gQUNQSSBiZWNhdXNlIG9mIGZpcm13YXJlIGJ1Z3MgaW4gZWFybHkKLSMgSzggc3lzdGVtcy4gQUNQSSBpcyBwcmVmZXJyZWQgdG8gYWxsIG90aGVyIGhhcmR3YXJlLXNwZWNpZmljIGRyaXZlcnMuCi0jIHNwZWVkc3RlcC0qIGlzIHByZWZlcnJlZCBvdmVyIHA0LWNsb2NrbW9kLgotCi1vYmotJChDT05GSUdfWDg2X1BPV0VSTk9XX0s4KQkJKz0gcG93ZXJub3ctazgubyBtcGVyZi5vCi1vYmotJChDT05GSUdfWDg2X0FDUElfQ1BVRlJFUSkJCSs9IGFjcGktY3B1ZnJlcS5vIG1wZXJmLm8KLW9iai0kKENPTkZJR19YODZfUENDX0NQVUZSRVEpCQkrPSBwY2MtY3B1ZnJlcS5vCi1vYmotJChDT05GSUdfWDg2X1BPV0VSTk9XX0s2KQkJKz0gcG93ZXJub3ctazYubwotb2JqLSQoQ09ORklHX1g4Nl9QT1dFUk5PV19LNykJCSs9IHBvd2Vybm93LWs3Lm8KLW9iai0kKENPTkZJR19YODZfTE9OR0hBVUwpCQkrPSBsb25naGF1bC5vCi1vYmotJChDT05GSUdfWDg2X0VfUE9XRVJTQVZFUikJCSs9IGVfcG93ZXJzYXZlci5vCi1vYmotJChDT05GSUdfRUxBTl9DUFVGUkVRKQkJKz0gZWxhbmZyZXEubwotb2JqLSQoQ09ORklHX1NDNTIwX0NQVUZSRVEpCQkrPSBzYzUyMF9mcmVxLm8KLW9iai0kKENPTkZJR19YODZfTE9OR1JVTikJCSs9IGxvbmdydW4ubyAgCi1vYmotJChDT05GSUdfWDg2X0dYX1NVU1BNT0QpCQkrPSBneC1zdXNwbW9kLm8KLW9iai0kKENPTkZJR19YODZfU1BFRURTVEVQX0lDSCkJCSs9IHNwZWVkc3RlcC1pY2gubwotb2JqLSQoQ09ORklHX1g4Nl9TUEVFRFNURVBfTElCKQkJKz0gc3BlZWRzdGVwLWxpYi5vCi1vYmotJChDT05GSUdfWDg2X1NQRUVEU1RFUF9TTUkpCQkrPSBzcGVlZHN0ZXAtc21pLm8KLW9iai0kKENPTkZJR19YODZfU1BFRURTVEVQX0NFTlRSSU5PKQkrPSBzcGVlZHN0ZXAtY2VudHJpbm8ubwotb2JqLSQoQ09ORklHX1g4Nl9QNF9DTE9DS01PRCkJCSs9IHA0LWNsb2NrbW9kLm8KLW9iai0kKENPTkZJR19YODZfQ1BVRlJFUV9ORk9SQ0UyKQkrPSBjcHVmcmVxLW5mb3JjZTIubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbC5jCmluZGV4IGRmODZiYzguLjFlZGY1YmEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWwuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsLmMKQEAgLTI5LDEwICsyOSwxMCBAQAogCiBzdGF0aWMgdm9pZCBfX2NwdWluaXQgZWFybHlfaW5pdF9pbnRlbChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CisJdTY0IG1pc2NfZW5hYmxlOworCiAJLyogVW5tYXNrIENQVUlEIGxldmVscyBpZiBtYXNrZWQ6ICovCiAJaWYgKGMtPng4NiA+IDYgfHwgKGMtPng4NiA9PSA2ICYmIGMtPng4Nl9tb2RlbCA+PSAweGQpKSB7Ci0JCXU2NCBtaXNjX2VuYWJsZTsKLQogCQlyZG1zcmwoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIG1pc2NfZW5hYmxlKTsKIAogCQlpZiAobWlzY19lbmFibGUgJiBNU1JfSUEzMl9NSVNDX0VOQUJMRV9MSU1JVF9DUFVJRCkgewpAQCAtMTE4LDggKzExOCw2IEBACiAJICogKG1vZGVsIDIpIHdpdGggdGhlIHNhbWUgcHJvYmxlbS4KIAkgKi8KIAlpZiAoYy0+eDg2ID09IDE1KSB7Ci0JCXU2NCBtaXNjX2VuYWJsZTsKLQogCQlyZG1zcmwoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIG1pc2NfZW5hYmxlKTsKIAogCQlpZiAobWlzY19lbmFibGUgJiBNU1JfSUEzMl9NSVNDX0VOQUJMRV9GQVNUX1NUUklORykgewpAQCAtMTMwLDYgKzEyOCwxOSBAQAogCQl9CiAJfQogI2VuZGlmCisKKwkvKgorCSAqIElmIGZhc3Qgc3RyaW5nIGlzIG5vdCBlbmFibGVkIGluIElBMzJfTUlTQ19FTkFCTEUgZm9yIGFueSByZWFzb24sCisJICogY2xlYXIgdGhlIGZhc3Qgc3RyaW5nIGFuZCBlbmhhbmNlZCBmYXN0IHN0cmluZyBDUFUgY2FwYWJpbGl0aWVzLgorCSAqLworCWlmIChjLT54ODYgPiA2IHx8IChjLT54ODYgPT0gNiAmJiBjLT54ODZfbW9kZWwgPj0gMHhkKSkgeworCQlyZG1zcmwoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIG1pc2NfZW5hYmxlKTsKKwkJaWYgKCEobWlzY19lbmFibGUgJiBNU1JfSUEzMl9NSVNDX0VOQUJMRV9GQVNUX1NUUklORykpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIkRpc2FibGVkIGZhc3Qgc3RyaW5nIG9wZXJhdGlvbnNcbiIpOworCQkJc2V0dXBfY2xlYXJfY3B1X2NhcChYODZfRkVBVFVSRV9SRVBfR09PRCk7CisJCQlzZXR1cF9jbGVhcl9jcHVfY2FwKFg4Nl9GRUFUVVJFX0VSTVMpOworCQl9CisJfQogfQogCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgpAQCAtNDAwLDEyICs0MTEsMTAgQEAKIAogCQlzd2l0Y2ggKGMtPng4Nl9tb2RlbCkgewogCQljYXNlIDU6Ci0JCQlpZiAoYy0+eDg2X21hc2sgPT0gMCkgewotCQkJCWlmIChsMiA9PSAwKQotCQkJCQlwID0gIkNlbGVyb24gKENvdmluZ3RvbikiOwotCQkJCWVsc2UgaWYgKGwyID09IDI1NikKLQkJCQkJcCA9ICJNb2JpbGUgUGVudGl1bSBJSSAoRGl4b24pIjsKLQkJCX0KKwkJCWlmIChsMiA9PSAwKQorCQkJCXAgPSAiQ2VsZXJvbiAoQ292aW5ndG9uKSI7CisJCQllbHNlIGlmIChsMiA9PSAyNTYpCisJCQkJcCA9ICJNb2JpbGUgUGVudGl1bSBJSSAoRGl4b24pIjsKIAkJCWJyZWFrOwogCiAJCWNhc2UgNjoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWxfY2FjaGVpbmZvLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jCmluZGV4IDFjZTFhZjI4Li5jMTA1YzUzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWxfY2FjaGVpbmZvLmMKQEAgLTMyNyw3ICszMjcsNiBAQAogCWwzLT5zdWJjYWNoZXNbMl0gPSBzYzIgPSAhKHZhbCAmIEJJVCg4KSkgICsgISh2YWwgJiBCSVQoOSkpOwogCWwzLT5zdWJjYWNoZXNbM10gPSBzYzMgPSAhKHZhbCAmIEJJVCgxMikpICsgISh2YWwgJiBCSVQoMTMpKTsKIAotCWwzLT5pbmRpY2VzID0gKG1heChtYXgobWF4KHNjMCwgc2MxKSwgc2MyKSwgc2MzKSA8PCAxMCkgLSAxOwogCWwzLT5pbmRpY2VzID0gKG1heChtYXgzKHNjMCwgc2MxLCBzYzIpLCBzYzMpIDw8IDEwKSAtIDE7CiB9CiAKQEAgLTQ1NCwyNyArNDUzLDE2IEBACiB7CiAJaW50IHJldCA9IDA7CiAKLSNkZWZpbmUgU1VCQ0FDSEVfTUFTSwkoM1VMIDw8IDIwKQotI2RlZmluZSBTVUJDQUNIRV9JTkRFWAkweGZmZgotCi0JLyoKLQkgKiBjaGVjayB3aGV0aGVyIHRoaXMgc2xvdCBpcyBhbHJlYWR5IHVzZWQgb3IKLQkgKiB0aGUgaW5kZXggaXMgYWxyZWFkeSBkaXNhYmxlZAotCSAqLworCS8qICBjaGVjayBpZiBAc2xvdCBpcyBhbHJlYWR5IHVzZWQgb3IgdGhlIGluZGV4IGlzIGFscmVhZHkgZGlzYWJsZWQgKi8KIAlyZXQgPSBhbWRfZ2V0X2wzX2Rpc2FibGVfc2xvdChsMywgc2xvdCk7CiAJaWYgKHJldCA+PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qCi0JICogY2hlY2sgd2hldGhlciB0aGUgb3RoZXIgc2xvdCBoYXMgZGlzYWJsZWQgdGhlCi0JICogc2FtZSBpbmRleCBhbHJlYWR5Ci0JICovCi0JaWYgKGluZGV4ID09IGFtZF9nZXRfbDNfZGlzYWJsZV9zbG90KGwzLCAhc2xvdCkpCisJaWYgKGluZGV4ID4gbDMtPmluZGljZXMpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyogZG8gbm90IGFsbG93IHdyaXRlcyBvdXRzaWRlIG9mIGFsbG93ZWQgYml0cyAqLwotCWlmICgoaW5kZXggJiB+KFNVQkNBQ0hFX01BU0sgfCBTVUJDQUNIRV9JTkRFWCkpIHx8Ci0JICAgICgoaW5kZXggJiBTVUJDQUNIRV9JTkRFWCkgPiBsMy0+aW5kaWNlcykpCisJLyogY2hlY2sgd2hldGhlciB0aGUgb3RoZXIgc2xvdCBoYXMgZGlzYWJsZWQgdGhlIHNhbWUgaW5kZXggYWxyZWFkeSAqLworCWlmIChpbmRleCA9PSBhbWRfZ2V0X2wzX2Rpc2FibGVfc2xvdChsMywgIXNsb3QpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWFtZF9sM19kaXNhYmxlX2luZGV4KGwzLCBjcHUsIHNsb3QsIGluZGV4KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmMKaW5kZXggMzM4NWVhMi4uZmYxYWU5YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmMKQEAgLTEwNSwyMCArMTA1LDYgQEAKIEFUT01JQ19OT1RJRklFUl9IRUFEKHg4Nl9tY2VfZGVjb2Rlcl9jaGFpbik7CiBFWFBPUlRfU1lNQk9MX0dQTCh4ODZfbWNlX2RlY29kZXJfY2hhaW4pOwogCi1zdGF0aWMgaW50IGRlZmF1bHRfZGVjb2RlX21jZShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIHZhbCwKLQkJCSAgICAgICB2b2lkICpkYXRhKQotewotCXByX2VtZXJnKEhXX0VSUiAiTm8gaHVtYW4gcmVhZGFibGUgTUNFIGRlY29kaW5nIHN1cHBvcnQgb24gdGhpcyBDUFUgdHlwZS5cbiIpOwotCXByX2VtZXJnKEhXX0VSUiAiUnVuIHRoZSBtZXNzYWdlIHRocm91Z2ggJ21jZWxvZyAtLWFzY2lpJyB0byBkZWNvZGUuXG4iKTsKLQotCXJldHVybiBOT1RJRllfU1RPUDsKLX0KLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBtY2VfZGVjX25iID0gewotCS5ub3RpZmllcl9jYWxsID0gZGVmYXVsdF9kZWNvZGVfbWNlLAotCS5wcmlvcml0eSAgICAgID0gLTEsCi19OwotCiAvKiBNQ0EgYmFua3MgcG9sbGVkIGJ5IHRoZSBwZXJpb2QgcG9sbGluZyB0aW1lciBmb3IgY29ycmVjdGVkIGV2ZW50cyAqLwogREVGSU5FX1BFUl9DUFUobWNlX2JhbmtzX3QsIG1jZV9wb2xsX2JhbmtzKSA9IHsKIAlbMCAuLi4gQklUU19UT19MT05HUyhNQVhfTlJfQkFOS1MpLTFdID0gfjBVTApAQCAtMjEyLDYgKzE5OCw4IEBACiAKIHN0YXRpYyB2b2lkIHByaW50X21jZShzdHJ1Y3QgbWNlICptKQogeworCWludCByZXQgPSAwOworCiAJcHJfZW1lcmcoSFdfRVJSICJDUFUgJWQ6IE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uOiAlTHggQmFuayAlZDogJTAxNkx4XG4iLAogCSAgICAgICBtLT5leHRjcHUsIG0tPm1jZ3N0YXR1cywgbS0+YmFuaywgbS0+c3RhdHVzKTsKIApAQCAtMjM5LDcgKzIyNywxMSBAQAogCSAqIFByaW50IG91dCBodW1hbi1yZWFkYWJsZSBkZXRhaWxzIGFib3V0IHRoZSBNQ0UgZXJyb3IsCiAJICogKGlmIHRoZSBDUFUgaGFzIGFuIGltcGxlbWVudGF0aW9uIGZvciB0aGF0KQogCSAqLwotCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZ4ODZfbWNlX2RlY29kZXJfY2hhaW4sIDAsIG0pOworCXJldCA9IGF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZ4ODZfbWNlX2RlY29kZXJfY2hhaW4sIDAsIG0pOworCWlmIChyZXQgPT0gTk9USUZZX1NUT1ApCisJCXJldHVybjsKKworCXByX2VtZXJnX3JhdGVsaW1pdGVkKEhXX0VSUiAiUnVuIHRoZSBhYm92ZSB0aHJvdWdoICdtY2Vsb2cgLS1hc2NpaSdcbiIpOwogfQogCiAjZGVmaW5lIFBBTklDX1RJTUVPVVQgNSAvKiA1IHNlY29uZHMgKi8KQEAgLTU5MCw3ICs1ODIsNiBAQAogCQlpZiAoIShmbGFncyAmIE1DUF9ET05UTE9HKSAmJiAhbWNlX2RvbnRfbG9nX2NlKSB7CiAJCQltY2VfbG9nKCZtKTsKIAkJCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZ4ODZfbWNlX2RlY29kZXJfY2hhaW4sIDAsICZtKTsKLQkJCWFkZF90YWludChUQUlOVF9NQUNISU5FX0NIRUNLKTsKIAkJfQogCiAJCS8qCkBAIC0xNzIyLDggKzE3MTMsNiBAQAogCiBpbnQgX19pbml0IG1jaGVja19pbml0KHZvaWQpCiB7Ci0JYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZ4ODZfbWNlX2RlY29kZXJfY2hhaW4sICZtY2VfZGVjX25iKTsKLQogCW1jaGVja19pbnRlbF90aGVybV9pbml0KCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL3RoZXJtX3Rocm90LmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay90aGVybV90aHJvdC5jCmluZGV4IDBmMDM0NDYuLjI3YzYyNTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL3RoZXJtX3Rocm90LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svdGhlcm1fdGhyb3QuYwpAQCAtMTg3LDggKzE4Nyw2IEBACiAJCQkJdGhpc19jcHUsCiAJCQkJbGV2ZWwgPT0gQ09SRV9MRVZFTCA/ICJDb3JlIiA6ICJQYWNrYWdlIiwKIAkJCQlzdGF0ZS0+Y291bnQpOwotCi0JCWFkZF90YWludChUQUlOVF9NQUNISU5FX0NIRUNLKTsKIAkJcmV0dXJuIDE7CiAJfQogCWlmIChvbGRfZXZlbnQpIHsKQEAgLTM1NSw3ICszNTMsNiBAQAogc3RhdGljIHZvaWQgaW50ZWxfdGhlcm1hbF9pbnRlcnJ1cHQodm9pZCkKIHsKIAlfX3U2NCBtc3JfdmFsOwotCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZjcHVfZGF0YShzbXBfcHJvY2Vzc29yX2lkKCkpOwogCiAJcmRtc3JsKE1TUl9JQTMyX1RIRVJNX1NUQVRVUywgbXNyX3ZhbCk7CiAKQEAgLTM2NywxOSArMzY0LDE5IEBACiAJCQkJQ09SRV9MRVZFTCkgIT0gMCkKIAkJbWNlX2xvZ190aGVybV90aHJvdF9ldmVudChDT1JFX1RIUk9UVExFRCB8IG1zcl92YWwpOwogCi0JaWYgKGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfUExOKSkKKwlpZiAodGhpc19jcHVfaGFzKFg4Nl9GRUFUVVJFX1BMTikpCiAJCWlmICh0aGVybV90aHJvdF9wcm9jZXNzKG1zcl92YWwgJiBUSEVSTV9TVEFUVVNfUE9XRVJfTElNSVQsCiAJCQkJCVBPV0VSX0xJTUlUX0VWRU5ULAogCQkJCQlDT1JFX0xFVkVMKSAhPSAwKQogCQkJbWNlX2xvZ190aGVybV90aHJvdF9ldmVudChDT1JFX1BPV0VSX0xJTUlUIHwgbXNyX3ZhbCk7CiAKLQlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9QVFMpKSB7CisJaWYgKHRoaXNfY3B1X2hhcyhYODZfRkVBVFVSRV9QVFMpKSB7CiAJCXJkbXNybChNU1JfSUEzMl9QQUNLQUdFX1RIRVJNX1NUQVRVUywgbXNyX3ZhbCk7CiAJCWlmICh0aGVybV90aHJvdF9wcm9jZXNzKG1zcl92YWwgJiBQQUNLQUdFX1RIRVJNX1NUQVRVU19QUk9DSE9ULAogCQkJCQlUSEVSTUFMX1RIUk9UVExJTkdfRVZFTlQsCiAJCQkJCVBBQ0tBR0VfTEVWRUwpICE9IDApCiAJCQltY2VfbG9nX3RoZXJtX3Rocm90X2V2ZW50KFBBQ0tBR0VfVEhST1RUTEVEIHwgbXNyX3ZhbCk7Ci0JCWlmIChjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1BMTikpCisJCWlmICh0aGlzX2NwdV9oYXMoWDg2X0ZFQVRVUkVfUExOKSkKIAkJCWlmICh0aGVybV90aHJvdF9wcm9jZXNzKG1zcl92YWwgJgogCQkJCQlQQUNLQUdFX1RIRVJNX1NUQVRVU19QT1dFUl9MSU1JVCwKIAkJCQkJUE9XRVJfTElNSVRfRVZFTlQsCkBAIC0zOTMsNyArMzkwLDYgQEAKIHsKIAlwcmludGsoS0VSTl9FUlIgIkNQVSVkOiBVbmV4cGVjdGVkIExWVCB0aGVybWFsIGludGVycnVwdCFcbiIsCiAJCQlzbXBfcHJvY2Vzc29yX2lkKCkpOwotCWFkZF90YWludChUQUlOVF9NQUNISU5FX0NIRUNLKTsKIH0KIAogc3RhdGljIHZvaWQgKCpzbXBfdGhlcm1hbF92ZWN0b3IpKHZvaWQpID0gdW5leHBlY3RlZF90aGVybWFsX2ludGVycnVwdDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50LmMKaW5kZXggZTYzODY4OS4uM2EwMzM4YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50LmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxhc20vbm1pLmg+CiAjaW5jbHVkZSA8YXNtL2NvbXBhdC5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vYWx0ZXJuYXRpdmUuaD4KIAogI2lmIDAKICN1bmRlZiB3cm1zcmwKQEAgLTM2MywxMiArMzY0LDE4IEBACiAJcmV0dXJuIG5ld19yYXdfY291bnQ7CiB9CiAKLS8qIHVzaW5nIFg4Nl9GRUFUVVJFX1BFUkZDVFJfQ09SRSB0byBsYXRlciBpbXBsZW1lbnQgQUxURVJOQVRJVkUoKSBoZXJlICovCiBzdGF0aWMgaW5saW5lIGludCB4ODZfcG11X2FkZHJfb2Zmc2V0KGludCBpbmRleCkKIHsKLQlpZiAoYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1BFUkZDVFJfQ09SRSkpCi0JCXJldHVybiBpbmRleCA8PCAxOwotCXJldHVybiBpbmRleDsKKwlpbnQgb2Zmc2V0OworCisJLyogb2Zmc2V0ID0gWDg2X0ZFQVRVUkVfUEVSRkNUUl9DT1JFID8gaW5kZXggPDwgMSA6IGluZGV4ICovCisJYWx0ZXJuYXRpdmVfaW8oQVNNX05PUDIsCisJCSAgICAgICAic2hsbCAkMSwgJSVlYXgiLAorCQkgICAgICAgWDg2X0ZFQVRVUkVfUEVSRkNUUl9DT1JFLAorCQkgICAgICAgIj1hIiAob2Zmc2V0KSwKKwkJICAgICAgICJhIiAgKGluZGV4KSk7CisKKwlyZXR1cm4gb2Zmc2V0OwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB4ODZfcG11X2NvbmZpZ19hZGRyKGludCBpbmRleCkKQEAgLTE3NjYsMTcgKzE3NzMsNiBAQAogICogY2FsbGNoYWluIHN1cHBvcnQKICAqLwogCi1zdGF0aWMgdm9pZAotYmFja3RyYWNlX3dhcm5pbmdfc3ltYm9sKHZvaWQgKmRhdGEsIGNoYXIgKm1zZywgdW5zaWduZWQgbG9uZyBzeW1ib2wpCi17Ci0JLyogSWdub3JlIHdhcm5pbmdzICovCi19Ci0KLXN0YXRpYyB2b2lkIGJhY2t0cmFjZV93YXJuaW5nKHZvaWQgKmRhdGEsIGNoYXIgKm1zZykKLXsKLQkvKiBJZ25vcmUgd2FybmluZ3MgKi8KLX0KLQogc3RhdGljIGludCBiYWNrdHJhY2Vfc3RhY2sodm9pZCAqZGF0YSwgY2hhciAqbmFtZSkKIHsKIAlyZXR1cm4gMDsKQEAgLTE3OTAsOCArMTc4Niw2IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgYmFja3RyYWNlX29wcyA9IHsKLQkud2FybmluZwkJPSBiYWNrdHJhY2Vfd2FybmluZywKLQkud2FybmluZ19zeW1ib2wJCT0gYmFja3RyYWNlX3dhcm5pbmdfc3ltYm9sLAogCS5zdGFjawkJCT0gYmFja3RyYWNlX3N0YWNrLAogCS5hZGRyZXNzCQk9IGJhY2t0cmFjZV9hZGRyZXNzLAogCS53YWxrX3N0YWNrCQk9IHByaW50X2NvbnRleHRfc3RhY2tfYnAsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfYW1kLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfYW1kLmMKaW5kZXggY2Y0ZTM2OS4uZmUyOWMxZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2FtZC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9hbWQuYwpAQCAtOTYsMTIgKzk2LDE0IEBACiAgKi8KIHN0YXRpYyBjb25zdCB1NjQgYW1kX3BlcmZtb25fZXZlbnRfbWFwW10gPQogewotICBbUEVSRl9DT1VOVF9IV19DUFVfQ1lDTEVTXQkJPSAweDAwNzYsCi0gIFtQRVJGX0NPVU5UX0hXX0lOU1RSVUNUSU9OU10JCT0gMHgwMGMwLAotICBbUEVSRl9DT1VOVF9IV19DQUNIRV9SRUZFUkVOQ0VTXQk9IDB4MDA4MCwKLSAgW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUlTU0VTXQkJPSAweDAwODEsCi0gIFtQRVJGX0NPVU5UX0hXX0JSQU5DSF9JTlNUUlVDVElPTlNdCT0gMHgwMGMyLAotICBbUEVSRl9DT1VOVF9IV19CUkFOQ0hfTUlTU0VTXQkJPSAweDAwYzMsCisgIFtQRVJGX0NPVU5UX0hXX0NQVV9DWUNMRVNdCQkJPSAweDAwNzYsCisgIFtQRVJGX0NPVU5UX0hXX0lOU1RSVUNUSU9OU10JCQk9IDB4MDBjMCwKKyAgW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVGRVJFTkNFU10JCT0gMHgwMDgwLAorICBbUEVSRl9DT1VOVF9IV19DQUNIRV9NSVNTRVNdCQkJPSAweDAwODEsCisgIFtQRVJGX0NPVU5UX0hXX0JSQU5DSF9JTlNUUlVDVElPTlNdCQk9IDB4MDBjMiwKKyAgW1BFUkZfQ09VTlRfSFdfQlJBTkNIX01JU1NFU10JCQk9IDB4MDBjMywKKyAgW1BFUkZfQ09VTlRfSFdfU1RBTExFRF9DWUNMRVNfRlJPTlRFTkRdCT0gMHgwMGQwLCAvKiAiRGVjb2RlciBlbXB0eSIgZXZlbnQgKi8KKyAgW1BFUkZfQ09VTlRfSFdfU1RBTExFRF9DWUNMRVNfQkFDS0VORF0JPSAweDAwZDEsIC8qICJEaXNwYXRjaCBzdGFsbHMiIGV2ZW50ICovCiB9OwogCiBzdGF0aWMgdTY0IGFtZF9wbXVfZXZlbnRfbWFwKGludCBod19ldmVudCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9pbnRlbC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2ludGVsLmMKaW5kZXggNDQ3YTI4ZC4uNDExNzhjOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2ludGVsLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2ludGVsLmMKQEAgLTM2LDcgKzM2LDcgQEAKICAgW1BFUkZfQ09VTlRfSFdfQlVTX0NZQ0xFU10JCT0gMHgwMTNjLAogfTsKIAotc3RhdGljIHN0cnVjdCBldmVudF9jb25zdHJhaW50IGludGVsX2NvcmVfZXZlbnRfY29uc3RyYWludHNbXSA9CitzdGF0aWMgc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgaW50ZWxfY29yZV9ldmVudF9jb25zdHJhaW50c1tdIF9fcmVhZF9tb3N0bHkgPQogewogCUlOVEVMX0VWRU5UX0NPTlNUUkFJTlQoMHgxMSwgMHgyKSwgLyogRlBfQVNTSVNUICovCiAJSU5URUxfRVZFTlRfQ09OU1RSQUlOVCgweDEyLCAweDIpLCAvKiBNVUwgKi8KQEAgLTQ3LDcgKzQ3LDcgQEAKIAlFVkVOVF9DT05TVFJBSU5UX0VORAogfTsKIAotc3RhdGljIHN0cnVjdCBldmVudF9jb25zdHJhaW50IGludGVsX2NvcmUyX2V2ZW50X2NvbnN0cmFpbnRzW10gPQorc3RhdGljIHN0cnVjdCBldmVudF9jb25zdHJhaW50IGludGVsX2NvcmUyX2V2ZW50X2NvbnN0cmFpbnRzW10gX19yZWFkX21vc3RseSA9CiB7CiAJRklYRURfRVZFTlRfQ09OU1RSQUlOVCgweDAwYzAsIDApLCAvKiBJTlNUX1JFVElSRUQuQU5ZICovCiAJRklYRURfRVZFTlRfQ09OU1RSQUlOVCgweDAwM2MsIDEpLCAvKiBDUFVfQ0xLX1VOSEFMVEVELkNPUkUgKi8KQEAgLTcwLDcgKzcwLDcgQEAKIAlFVkVOVF9DT05TVFJBSU5UX0VORAogfTsKIAotc3RhdGljIHN0cnVjdCBldmVudF9jb25zdHJhaW50IGludGVsX25laGFsZW1fZXZlbnRfY29uc3RyYWludHNbXSA9CitzdGF0aWMgc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgaW50ZWxfbmVoYWxlbV9ldmVudF9jb25zdHJhaW50c1tdIF9fcmVhZF9tb3N0bHkgPQogewogCUZJWEVEX0VWRU5UX0NPTlNUUkFJTlQoMHgwMGMwLCAwKSwgLyogSU5TVF9SRVRJUkVELkFOWSAqLwogCUZJWEVEX0VWRU5UX0NPTlNUUkFJTlQoMHgwMDNjLCAxKSwgLyogQ1BVX0NMS19VTkhBTFRFRC5DT1JFICovCkBAIC04NiwxOSArODYsMTkgQEAKIAlFVkVOVF9DT05TVFJBSU5UX0VORAogfTsKIAotc3RhdGljIHN0cnVjdCBleHRyYV9yZWcgaW50ZWxfbmVoYWxlbV9leHRyYV9yZWdzW10gPQorc3RhdGljIHN0cnVjdCBleHRyYV9yZWcgaW50ZWxfbmVoYWxlbV9leHRyYV9yZWdzW10gX19yZWFkX21vc3RseSA9CiB7CiAJSU5URUxfRVZFTlRfRVhUUkFfUkVHKDB4YjcsIE1TUl9PRkZDT1JFX1JTUF8wLCAweGZmZmYpLAogCUVWRU5UX0VYVFJBX0VORAogfTsKIAotc3RhdGljIHN0cnVjdCBldmVudF9jb25zdHJhaW50IGludGVsX25laGFsZW1fcGVyY29yZV9jb25zdHJhaW50c1tdID0KK3N0YXRpYyBzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCBpbnRlbF9uZWhhbGVtX3BlcmNvcmVfY29uc3RyYWludHNbXSBfX3JlYWRfbW9zdGx5ID0KIHsKIAlJTlRFTF9FVkVOVF9DT05TVFJBSU5UKDB4YjcsIDApLAogCUVWRU5UX0NPTlNUUkFJTlRfRU5ECiB9OwogCi1zdGF0aWMgc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgaW50ZWxfd2VzdG1lcmVfZXZlbnRfY29uc3RyYWludHNbXSA9CitzdGF0aWMgc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgaW50ZWxfd2VzdG1lcmVfZXZlbnRfY29uc3RyYWludHNbXSBfX3JlYWRfbW9zdGx5ID0KIHsKIAlGSVhFRF9FVkVOVF9DT05TVFJBSU5UKDB4MDBjMCwgMCksIC8qIElOU1RfUkVUSVJFRC5BTlkgKi8KIAlGSVhFRF9FVkVOVF9DT05TVFJBSU5UKDB4MDAzYywgMSksIC8qIENQVV9DTEtfVU5IQUxURUQuQ09SRSAqLwpAQCAtMTEwLDcgKzExMCw3IEBACiAJRVZFTlRfQ09OU1RSQUlOVF9FTkQKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCBpbnRlbF9zbmJfZXZlbnRfY29uc3RyYWludHNbXSA9CitzdGF0aWMgc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgaW50ZWxfc25iX2V2ZW50X2NvbnN0cmFpbnRzW10gX19yZWFkX21vc3RseSA9CiB7CiAJRklYRURfRVZFTlRfQ09OU1RSQUlOVCgweDAwYzAsIDApLCAvKiBJTlNUX1JFVElSRUQuQU5ZICovCiAJRklYRURfRVZFTlRfQ09OU1RSQUlOVCgweDAwM2MsIDEpLCAvKiBDUFVfQ0xLX1VOSEFMVEVELkNPUkUgKi8KQEAgLTEyMywyMSArMTIzLDIxIEBACiAJRVZFTlRfQ09OU1RSQUlOVF9FTkQKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZXh0cmFfcmVnIGludGVsX3dlc3RtZXJlX2V4dHJhX3JlZ3NbXSA9CitzdGF0aWMgc3RydWN0IGV4dHJhX3JlZyBpbnRlbF93ZXN0bWVyZV9leHRyYV9yZWdzW10gX19yZWFkX21vc3RseSA9CiB7CiAJSU5URUxfRVZFTlRfRVhUUkFfUkVHKDB4YjcsIE1TUl9PRkZDT1JFX1JTUF8wLCAweGZmZmYpLAogCUlOVEVMX0VWRU5UX0VYVFJBX1JFRygweGJiLCBNU1JfT0ZGQ09SRV9SU1BfMSwgMHhmZmZmKSwKIAlFVkVOVF9FWFRSQV9FTkQKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCBpbnRlbF93ZXN0bWVyZV9wZXJjb3JlX2NvbnN0cmFpbnRzW10gPQorc3RhdGljIHN0cnVjdCBldmVudF9jb25zdHJhaW50IGludGVsX3dlc3RtZXJlX3BlcmNvcmVfY29uc3RyYWludHNbXSBfX3JlYWRfbW9zdGx5ID0KIHsKIAlJTlRFTF9FVkVOVF9DT05TVFJBSU5UKDB4YjcsIDApLAogCUlOVEVMX0VWRU5UX0NPTlNUUkFJTlQoMHhiYiwgMCksCiAJRVZFTlRfQ09OU1RSQUlOVF9FTkQKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCBpbnRlbF9nZW5fZXZlbnRfY29uc3RyYWludHNbXSA9CitzdGF0aWMgc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgaW50ZWxfZ2VuX2V2ZW50X2NvbnN0cmFpbnRzW10gX19yZWFkX21vc3RseSA9CiB7CiAJRklYRURfRVZFTlRfQ09OU1RSQUlOVCgweDAwYzAsIDApLCAvKiBJTlNUX1JFVElSRUQuQU5ZICovCiAJRklYRURfRVZFTlRfQ09OU1RSQUlOVCgweDAwM2MsIDEpLCAvKiBDUFVfQ0xLX1VOSEFMVEVELkNPUkUgKi8KQEAgLTE0NDAsNiArMTQ0MCwxMSBAQAogCQl4ODZfcG11LmVuYWJsZV9hbGwgPSBpbnRlbF9wbXVfbmhtX2VuYWJsZV9hbGw7CiAJCXg4Nl9wbXUuZXh0cmFfcmVncyA9IGludGVsX25laGFsZW1fZXh0cmFfcmVnczsKIAorCQkvKiBVT1BTX0lTU1VFRC5TVEFMTEVEX0NZQ0xFUyAqLworCQlpbnRlbF9wZXJmbW9uX2V2ZW50X21hcFtQRVJGX0NPVU5UX0hXX1NUQUxMRURfQ1lDTEVTX0ZST05URU5EXSA9IDB4MTgwMDEwZTsKKwkJLyogVU9QU19FWEVDVVRFRC5DT1JFX0FDVElWRV9DWUNMRVMsYz0xLGk9MSAqLworCQlpbnRlbF9wZXJmbW9uX2V2ZW50X21hcFtQRVJGX0NPVU5UX0hXX1NUQUxMRURfQ1lDTEVTX0JBQ0tFTkRdID0gMHgxODAzZmIxOworCiAJCWlmIChlYnggJiAweDQwKSB7CiAJCQkvKgogCQkJICogRXJyYXR1bSBBQUo4MCBkZXRlY3RlZCwgd2Ugd29yayBpdCBhcm91bmQgYnkgdXNpbmcKQEAgLTE0ODAsNiArMTQ4NSwxMiBAQAogCQl4ODZfcG11LmVuYWJsZV9hbGwgPSBpbnRlbF9wbXVfbmhtX2VuYWJsZV9hbGw7CiAJCXg4Nl9wbXUucGVic19jb25zdHJhaW50cyA9IGludGVsX3dlc3RtZXJlX3BlYnNfZXZlbnRfY29uc3RyYWludHM7CiAJCXg4Nl9wbXUuZXh0cmFfcmVncyA9IGludGVsX3dlc3RtZXJlX2V4dHJhX3JlZ3M7CisKKwkJLyogVU9QU19JU1NVRUQuU1RBTExFRF9DWUNMRVMgKi8KKwkJaW50ZWxfcGVyZm1vbl9ldmVudF9tYXBbUEVSRl9DT1VOVF9IV19TVEFMTEVEX0NZQ0xFU19GUk9OVEVORF0gPSAweDE4MDAxMGU7CisJCS8qIFVPUFNfRVhFQ1VURUQuQ09SRV9BQ1RJVkVfQ1lDTEVTLGM9MSxpPTEgKi8KKwkJaW50ZWxfcGVyZm1vbl9ldmVudF9tYXBbUEVSRl9DT1VOVF9IV19TVEFMTEVEX0NZQ0xFU19CQUNLRU5EXSA9IDB4MTgwM2ZiMTsKKwogCQlwcl9jb250KCJXZXN0bWVyZSBldmVudHMsICIpOwogCQlicmVhazsKIApAQCAtMTQ5MSw2ICsxNTAyLDEyIEBACiAKIAkJeDg2X3BtdS5ldmVudF9jb25zdHJhaW50cyA9IGludGVsX3NuYl9ldmVudF9jb25zdHJhaW50czsKIAkJeDg2X3BtdS5wZWJzX2NvbnN0cmFpbnRzID0gaW50ZWxfc25iX3BlYnNfZXZlbnRzOworCisJCS8qIFVPUFNfSVNTVUVELkFOWSxjPTEsaT0xIHRvIGNvdW50IHN0YWxsIGN5Y2xlcyAqLworCQlpbnRlbF9wZXJmbW9uX2V2ZW50X21hcFtQRVJGX0NPVU5UX0hXX1NUQUxMRURfQ1lDTEVTX0ZST05URU5EXSA9IDB4MTgwMDEwZTsKKwkJLyogVU9QU19ESVNQQVRDSEVELlRIUkVBRCxjPTEsaT0xIHRvIGNvdW50IHN0YWxsIGN5Y2xlcyovCisJCWludGVsX3BlcmZtb25fZXZlbnRfbWFwW1BFUkZfQ09VTlRfSFdfU1RBTExFRF9DWUNMRVNfQkFDS0VORF0gPSAweDE4MDAxYjE7CisKIAkJcHJfY29udCgiU2FuZHlCcmlkZ2UgZXZlbnRzLCAiKTsKIAkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9wNC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X3A0LmMKaW5kZXggZTkzZmNkNS4uZWFkNTg0ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X3A0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X3A0LmMKQEAgLTQ2OCw3ICs0NjgsNyBAQAogCQkub3Bjb2RlCQk9IFA0X09QQ09ERShQNF9FVkVOVF9NSVNQUkVEX0JSQU5DSF9SRVRJUkVEKSwKIAkJLmVzY3JfbXNyCT0geyBNU1JfUDRfQ1JVX0VTQ1IwLCBNU1JfUDRfQ1JVX0VTQ1IxIH0sCiAJCS5lc2NyX2VtYXNrCT0KLQkJUDRfRVNDUl9FTUFTS19CSVQoUDRfRVZFTlRfTUlTUFJFRF9CUkFOQ0hfUkVUSVJFRCwgTkJPR1VTKSwKKwkJCVA0X0VTQ1JfRU1BU0tfQklUKFA0X0VWRU5UX01JU1BSRURfQlJBTkNIX1JFVElSRUQsIE5CT0dVUyksCiAJCS5jbnRyCQk9IHsgezEyLCAxMywgMTZ9LCB7MTQsIDE1LCAxN30gfSwKIAl9LAogCVtQNF9FVkVOVF9YODdfQVNTSVNUXSA9IHsKQEAgLTkxMiw4ICs5MTIsNyBAQAogCWludCBpZHgsIGhhbmRsZWQgPSAwOwogCXU2NCB2YWw7CiAKLQlkYXRhLmFkZHIgPSAwOwotCWRhdGEucmF3ID0gTlVMTDsKKwlwZXJmX3NhbXBsZV9kYXRhX2luaXQoJmRhdGEsIDApOwogCiAJY3B1YyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19ldmVudHMpOwogCkBAIC0xMTk3LDcgKzExOTYsNyBAQAogewogCXVuc2lnbmVkIGludCBsb3csIGhpZ2g7CiAKLQkvKiBJZiB3ZSBnZXQgc3RyaXBwZWQgLS0gaW5kZXhpZyBmYWlscyAqLworCS8qIElmIHdlIGdldCBzdHJpcHBlZCAtLSBpbmRleGluZyBmYWlscyAqLwogCUJVSUxEX0JVR19PTihBUkNIX1A0X01BWF9DQ0NSID4gWDg2X1BNQ19NQVhfR0VORVJJQyk7CiAKIAlyZG1zcihNU1JfSUEzMl9NSVNDX0VOQUJMRSwgbG93LCBoaWdoKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2suYyBiL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2suYwppbmRleCBlMmEzZjA2Li4xYWFlNzhmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFjay5jCkBAIC0xMzUsMjAgKzEzNSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwcmludF9jb250ZXh0X3N0YWNrX2JwKTsKIAotCi1zdGF0aWMgdm9pZAotcHJpbnRfdHJhY2Vfd2FybmluZ19zeW1ib2wodm9pZCAqZGF0YSwgY2hhciAqbXNnLCB1bnNpZ25lZCBsb25nIHN5bWJvbCkKLXsKLQlwcmludGsoZGF0YSk7Ci0JcHJpbnRfc3ltYm9sKG1zZywgc3ltYm9sKTsKLQlwcmludGsoIlxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkIHByaW50X3RyYWNlX3dhcm5pbmcodm9pZCAqZGF0YSwgY2hhciAqbXNnKQotewotCXByaW50aygiJXMlc1xuIiwgKGNoYXIgKilkYXRhLCBtc2cpOwotfQotCiBzdGF0aWMgaW50IHByaW50X3RyYWNlX3N0YWNrKHZvaWQgKmRhdGEsIGNoYXIgKm5hbWUpCiB7CiAJcHJpbnRrKCIlcyA8JXM+ICIsIChjaGFyICopZGF0YSwgbmFtZSk7CkBAIC0xNjYsOCArMTUyLDYgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzdGFja3RyYWNlX29wcyBwcmludF90cmFjZV9vcHMgPSB7Ci0JLndhcm5pbmcJCT0gcHJpbnRfdHJhY2Vfd2FybmluZywKLQkud2FybmluZ19zeW1ib2wJCT0gcHJpbnRfdHJhY2Vfd2FybmluZ19zeW1ib2wsCiAJLnN0YWNrCQkJPSBwcmludF90cmFjZV9zdGFjaywKIAkuYWRkcmVzcwkJPSBwcmludF90cmFjZV9hZGRyZXNzLAogCS53YWxrX3N0YWNrCQk9IHByaW50X2NvbnRleHRfc3RhY2ssCkBAIC0yNzksNyArMjYzLDYgQEAKIAlwcmludGsoIkRFQlVHX1BBR0VBTExPQyIpOwogI2VuZGlmCiAJcHJpbnRrKCJcbiIpOwotCXN5c2ZzX3ByaW50a19sYXN0X2ZpbGUoKTsKIAlpZiAobm90aWZ5X2RpZShESUVfT09QUywgc3RyLCByZWdzLCBlcnIsCiAJCQljdXJyZW50LT50aHJlYWQudHJhcF9ubywgU0lHU0VHVikgPT0gTk9USUZZX1NUT1ApCiAJCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2Z0cmFjZS5jIGIvYXJjaC94ODYva2VybmVsL2Z0cmFjZS5jCmluZGV4IGE5Mzc0MmEuLjBiYTE1YTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9mdHJhY2UuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZnRyYWNlLmMKQEAgLTI2MCw5ICsyNjAsOSBAQAogCXJldHVybiBtb2RfY29kZV9zdGF0dXM7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICpmdHJhY2Vfbm9wX3JlcGxhY2Uodm9pZCkKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyICpmdHJhY2Vfbm9wX3JlcGxhY2Uodm9pZCkKIHsKLQlyZXR1cm4gaWRlYWxfbm9wNTsKKwlyZXR1cm4gaWRlYWxfbm9wc1tOT1BfQVRPTUlDNV07CiB9CiAKIHN0YXRpYyBpbnQKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9oZWFkMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9oZWFkMzIuYwppbmRleCBkNmQ2YmIzLi4zYmIwODUwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaGVhZDMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2hlYWQzMi5jCkBAIC0yMyw3ICsyMyw2IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgaTM4Nl9kZWZhdWx0X2Vhcmx5X3NldHVwKHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSAzMmJpdCBzcGVjaWZpYyBzZXR1cCBmdW5jdGlvbnMgKi8KLQl4ODZfaW5pdC5yZXNvdXJjZXMucHJvYmVfcm9tcyA9IHByb2JlX3JvbXM7CiAJeDg2X2luaXQucmVzb3VyY2VzLnJlc2VydmVfcmVzb3VyY2VzID0gaTM4Nl9yZXNlcnZlX3Jlc291cmNlczsKIAl4ODZfaW5pdC5tcHBhcnNlLnNldHVwX2lvYXBpY19pZHMgPSBzZXR1cF9pb2FwaWNfaWRzX2Zyb21fbXBjOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaHBldC5jIGIvYXJjaC94ODYva2VybmVsL2hwZXQuYwppbmRleCBiZmU4ZjcyLi42NzgxNzY1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaHBldC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9ocGV0LmMKQEAgLTIxNyw3ICsyMTcsNyBAQAogLyoKICAqIENvbW1vbiBocGV0IGluZm8KICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9wZXJpb2Q7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X2ZyZXE7CiAKIHN0YXRpYyB2b2lkIGhwZXRfbGVnYWN5X3NldF9tb2RlKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAogCQkJICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpOwpAQCAtMjMyLDcgKzIzMiw2IEBACiAJLmZlYXR1cmVzCT0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMgfCBDTE9DS19FVlRfRkVBVF9PTkVTSE9ULAogCS5zZXRfbW9kZQk9IGhwZXRfbGVnYWN5X3NldF9tb2RlLAogCS5zZXRfbmV4dF9ldmVudCA9IGhwZXRfbGVnYWN5X25leHRfZXZlbnQsCi0JLnNoaWZ0CQk9IDMyLAogCS5pcnEJCT0gMCwKIAkucmF0aW5nCQk9IDUwLAogfTsKQEAgLTI5MCwyOCArMjg5LDEyIEBACiAJaHBldF9lbmFibGVfbGVnYWN5X2ludCgpOwogCiAJLyoKLQkgKiBUaGUgbXVsdCBmYWN0b3IgaXMgZGVmaW5lZCBhcyAoaW5jbHVkZS9saW51eC9jbG9ja2NoaXBzLmgpCi0JICogIG11bHQvMl5zaGlmdCA9IGN5Yy9ucyAoaW4gY29udHJhc3QgdG8gbnMvY3ljIGluIGNsb2Nrc291cmNlLmgpCi0JICogaHBldF9wZXJpb2QgaXMgaW4gdW5pdHMgb2YgZmVtdG9zZWNvbmRzIChwZXIgY3ljbGUpLCBzbwotCSAqICBtdWx0LzJec2hpZnQgPSBjeWMvbnMgPSAxMF42L2hwZXRfcGVyaW9kCi0JICogIG11bHQgPSAoMTBeNiAqIDJec2hpZnQpL2hwZXRfcGVyaW9kCi0JICogIG11bHQgPSAoRlNFQ19QRVJfTlNFQyA8PCBocGV0X2Nsb2NrZXZlbnQuc2hpZnQpL2hwZXRfcGVyaW9kCi0JICovCi0JaHBldF9jbG9ja2V2ZW50Lm11bHQgPSBkaXZfc2MoKHVuc2lnbmVkIGxvbmcpIEZTRUNfUEVSX05TRUMsCi0JCQkJICAgICAgaHBldF9wZXJpb2QsIGhwZXRfY2xvY2tldmVudC5zaGlmdCk7Ci0JLyogQ2FsY3VsYXRlIHRoZSBtaW4gLyBtYXggZGVsdGEgKi8KLQlocGV0X2Nsb2NrZXZlbnQubWF4X2RlbHRhX25zID0gY2xvY2tldmVudF9kZWx0YTJucygweDdGRkZGRkZGLAotCQkJCQkJCSAgICZocGV0X2Nsb2NrZXZlbnQpOwotCS8qIFNldHVwIG1pbmltdW0gcmVwcm9ncmFtbWluZyBkZWx0YS4gKi8KLQlocGV0X2Nsb2NrZXZlbnQubWluX2RlbHRhX25zID0gY2xvY2tldmVudF9kZWx0YTJucyhIUEVUX01JTl9QUk9HX0RFTFRBLAotCQkJCQkJCSAgICZocGV0X2Nsb2NrZXZlbnQpOwotCi0JLyoKIAkgKiBTdGFydCBocGV0IHdpdGggdGhlIGJvb3QgY3B1IG1hc2sgYW5kIG1ha2UgaXQKIAkgKiBnbG9iYWwgYWZ0ZXIgdGhlIElPX0FQSUMgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCiAJICovCiAJaHBldF9jbG9ja2V2ZW50LmNwdW1hc2sgPSBjcHVtYXNrX29mKHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0JY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKCZocGV0X2Nsb2NrZXZlbnQpOworCWNsb2NrZXZlbnRzX2NvbmZpZ19hbmRfcmVnaXN0ZXIoJmhwZXRfY2xvY2tldmVudCwgaHBldF9mcmVxLAorCQkJCQlIUEVUX01JTl9QUk9HX0RFTFRBLCAweDdGRkZGRkZGKTsKIAlnbG9iYWxfY2xvY2tfZXZlbnQgPSAmaHBldF9jbG9ja2V2ZW50OwogCXByaW50ayhLRVJOX0RFQlVHICJocGV0IGNsb2NrZXZlbnQgcmVnaXN0ZXJlZFxuIik7CiB9CkBAIC01NDksNyArNTMyLDYgQEAKIHN0YXRpYyB2b2lkIGluaXRfb25lX2hwZXRfbXNpX2Nsb2NrZXZlbnQoc3RydWN0IGhwZXRfZGV2ICpoZGV2LCBpbnQgY3B1KQogewogCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCA9ICZoZGV2LT5ldnQ7Ci0JdWludDY0X3QgaHBldF9mcmVxOwogCiAJV0FSTl9PTihjcHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAlpZiAoIShoZGV2LT5mbGFncyAmIEhQRVRfREVWX1ZBTElEKSkKQEAgLTU3MSwyNCArNTUzLDEwIEBACiAKIAlldnQtPnNldF9tb2RlID0gaHBldF9tc2lfc2V0X21vZGU7CiAJZXZ0LT5zZXRfbmV4dF9ldmVudCA9IGhwZXRfbXNpX25leHRfZXZlbnQ7Ci0JZXZ0LT5zaGlmdCA9IDMyOwotCi0JLyoKLQkgKiBUaGUgcGVyaW9kIGlzIGEgZmVtdG8gc2Vjb25kcyB2YWx1ZS4gV2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlCi0JICogc2NhbGVkIG1hdGggbXVsdGlwbGljYXRpb24gZmFjdG9yIGZvciBuYW5vc2Vjb25kIHRvIGhwZXQgdGljawotCSAqIGNvbnZlcnNpb24uCi0JICovCi0JaHBldF9mcmVxID0gRlNFQ19QRVJfU0VDOwotCWRvX2RpdihocGV0X2ZyZXEsIGhwZXRfcGVyaW9kKTsKLQlldnQtPm11bHQgPSBkaXZfc2MoKHVuc2lnbmVkIGxvbmcpIGhwZXRfZnJlcSwKLQkJCQkgICAgICBOU0VDX1BFUl9TRUMsIGV2dC0+c2hpZnQpOwotCS8qIENhbGN1bGF0ZSB0aGUgbWF4IGRlbHRhICovCi0JZXZ0LT5tYXhfZGVsdGFfbnMgPSBjbG9ja2V2ZW50X2RlbHRhMm5zKDB4N0ZGRkZGRkYsIGV2dCk7Ci0JLyogNSB1c2VjIG1pbmltdW0gcmVwcm9ncmFtbWluZyBkZWx0YS4gKi8KLQlldnQtPm1pbl9kZWx0YV9ucyA9IDUwMDA7Ci0KIAlldnQtPmNwdW1hc2sgPSBjcHVtYXNrX29mKGhkZXYtPmNwdSk7Ci0JY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKGV2dCk7CisKKwljbG9ja2V2ZW50c19jb25maWdfYW5kX3JlZ2lzdGVyKGV2dCwgaHBldF9mcmVxLCBIUEVUX01JTl9QUk9HX0RFTFRBLAorCQkJCQkweDdGRkZGRkZGKTsKIH0KIAogI2lmZGVmIENPTkZJR19IUEVUCkBAIC03OTIsNyArNzYwLDYgQEAKIHN0YXRpYyBpbnQgaHBldF9jbG9ja3NvdXJjZV9yZWdpc3Rlcih2b2lkKQogewogCXU2NCBzdGFydCwgbm93OwotCXU2NCBocGV0X2ZyZXE7CiAJY3ljbGVfdCB0MTsKIAogCS8qIFN0YXJ0IHRoZSBjb3VudGVyICovCkBAIC04MTksMjQgKzc4Niw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCS8qCi0JICogVGhlIGRlZmluaXRpb24gb2YgbXVsdCBpcyAoaW5jbHVkZS9saW51eC9jbG9ja3NvdXJjZS5oKQotCSAqIG11bHQvMl5zaGlmdCA9IG5zL2N5YyBhbmQgaHBldF9wZXJpb2QgaXMgaW4gdW5pdHMgb2YgZnNlYy9jeWMKLQkgKiBzbyB3ZSBmaXJzdCBuZWVkIHRvIGNvbnZlcnQgaHBldF9wZXJpb2QgdG8gbnMvY3ljIHVuaXRzOgotCSAqICBtdWx0LzJec2hpZnQgPSBucy9jeWMgPSBocGV0X3BlcmlvZC8xMF42Ci0JICogIG11bHQgPSAoaHBldF9wZXJpb2QgKiAyXnNoaWZ0KS8xMF42Ci0JICogIG11bHQgPSAoaHBldF9wZXJpb2QgPDwgc2hpZnQpL0ZTRUNfUEVSX05TRUMKLQkgKi8KLQotCS8qIE5lZWQgdG8gY29udmVydCBocGV0X3BlcmlvZCAoZnNlYy9jeWMpIHRvIGN5Yy9zZWM6Ci0JICoKLQkgKiBjeWMvc2VjID0gRlNFQ19QRVJfU0VDL2hwZXRfcGVyaW9kKGZzZWMvY3ljKQotCSAqIGN5Yy9zZWMgPSAoRlNFQ19QRVJfTlNFQyAqIE5TRUNfUEVSX1NFQykvaHBldF9wZXJpb2QKLQkgKi8KLQlocGV0X2ZyZXEgPSBGU0VDX1BFUl9TRUM7Ci0JZG9fZGl2KGhwZXRfZnJlcSwgaHBldF9wZXJpb2QpOwogCWNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KCZjbG9ja3NvdXJjZV9ocGV0LCAodTMyKWhwZXRfZnJlcSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtODQ1LDcgKzc5NSw5IEBACiAgKi8KIGludCBfX2luaXQgaHBldF9lbmFibGUodm9pZCkKIHsKKwl1bnNpZ25lZCBsb25nIGhwZXRfcGVyaW9kOwogCXVuc2lnbmVkIGludCBpZDsKKwl1NjQgZnJlcTsKIAlpbnQgaTsKIAogCWlmICghaXNfaHBldF9jYXBhYmxlKCkpCkBAIC04ODQsNiArODM2LDE0IEBACiAJCWdvdG8gb3V0X25vaHBldDsKIAogCS8qCisJICogVGhlIHBlcmlvZCBpcyBhIGZlbXRvIHNlY29uZHMgdmFsdWUuIENvbnZlcnQgaXQgdG8gYQorCSAqIGZyZXF1ZW5jeS4KKwkgKi8KKwlmcmVxID0gRlNFQ19QRVJfU0VDOworCWRvX2RpdihmcmVxLCBocGV0X3BlcmlvZCk7CisJaHBldF9mcmVxID0gZnJlcTsKKworCS8qCiAJICogUmVhZCB0aGUgSFBFVCBJRCByZWdpc3RlciB0byByZXRyaWV2ZSB0aGUgSVJRIHJvdXRpbmcKIAkgKiBpbmZvcm1hdGlvbiBhbmQgdGhlIG51bWJlciBvZiBjaGFubmVscwogCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2k4MjUzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvaTgyNTMuYwppbmRleCAyZGZkMzE1Li5mYjY2ZGM5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaTgyNTMuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaTgyNTMuYwpAQCAtOTMsNyArOTMsNiBAQAogCS5mZWF0dXJlcwk9IENMT0NLX0VWVF9GRUFUX1BFUklPRElDIHwgQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCwKIAkuc2V0X21vZGUJPSBpbml0X3BpdF90aW1lciwKIAkuc2V0X25leHRfZXZlbnQgPSBwaXRfbmV4dF9ldmVudCwKLQkuc2hpZnQJCT0gMzIsCiAJLmlycQkJPSAwLAogfTsKIApAQCAtMTA4LDkwICsxMDcsMTIgQEAKIAkgKiBJT19BUElDIGhhcyBiZWVuIGluaXRpYWxpemVkLgogCSAqLwogCXBpdF9jZS5jcHVtYXNrID0gY3B1bWFza19vZihzbXBfcHJvY2Vzc29yX2lkKCkpOwotCXBpdF9jZS5tdWx0ID0gZGl2X3NjKENMT0NLX1RJQ0tfUkFURSwgTlNFQ19QRVJfU0VDLCBwaXRfY2Uuc2hpZnQpOwotCXBpdF9jZS5tYXhfZGVsdGFfbnMgPSBjbG9ja2V2ZW50X2RlbHRhMm5zKDB4N0ZGRiwgJnBpdF9jZSk7Ci0JcGl0X2NlLm1pbl9kZWx0YV9ucyA9IGNsb2NrZXZlbnRfZGVsdGEybnMoMHhGLCAmcGl0X2NlKTsKIAotCWNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZSgmcGl0X2NlKTsKKwljbG9ja2V2ZW50c19jb25maWdfYW5kX3JlZ2lzdGVyKCZwaXRfY2UsIENMT0NLX1RJQ0tfUkFURSwgMHhGLCAweDdGRkYpOwogCWdsb2JhbF9jbG9ja19ldmVudCA9ICZwaXRfY2U7CiB9CiAKICNpZm5kZWYgQ09ORklHX1g4Nl82NAotLyoKLSAqIFNpbmNlIHRoZSBQSVQgb3ZlcmZsb3dzIGV2ZXJ5IHRpY2ssIGl0cyBub3QgdmVyeSB1c2VmdWwKLSAqIHRvIGp1c3QgcmVhZCBieSBpdHNlbGYuIFNvIHVzZSBqaWZmaWVzIHRvIGVtdWxhdGUgYSBmcmVlCi0gKiBydW5uaW5nIGNvdW50ZXI6Ci0gKi8KLXN0YXRpYyBjeWNsZV90IHBpdF9yZWFkKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCi17Ci0Jc3RhdGljIGludCBvbGRfY291bnQ7Ci0Jc3RhdGljIHUzMiBvbGRfamlmczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBjb3VudDsKLQl1MzIgamlmczsKLQotCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTNfbG9jaywgZmxhZ3MpOwotCS8qCi0JICogQWx0aG91Z2ggb3VyIGNhbGxlciBtYXkgaGF2ZSB0aGUgcmVhZCBzaWRlIG9mIHh0aW1lX2xvY2ssCi0JICogdGhpcyBpcyBub3cgYSBzZXFsb2NrLCBhbmQgd2UgYXJlIGNoZWF0aW5nIGluIHRoaXMgcm91dGluZQotCSAqIGJ5IGhhdmluZyBzaWRlIGVmZmVjdHMgb24gc3RhdGUgdGhhdCB3ZSBjYW5ub3QgdW5kbyBpZgotCSAqIHRoZXJlIGlzIGEgY29sbGlzaW9uIG9uIHRoZSBzZXFsb2NrIGFuZCBvdXIgY2FsbGVyIGhhcyB0bwotCSAqIHJldHJ5LiAgKE5hbWVseSwgb2xkX2ppZnMgYW5kIG9sZF9jb3VudC4pICBTbyB3ZSBtdXN0IHRyZWF0Ci0JICogamlmZmllcyBhcyB2b2xhdGlsZSBkZXNwaXRlIHRoZSBsb2NrLiAgV2UgcmVhZCBqaWZmaWVzCi0JICogYmVmb3JlIGxhdGNoaW5nIHRoZSB0aW1lciBjb3VudCB0byBndWFyYW50ZWUgdGhhdCBhbHRob3VnaAotCSAqIHRoZSBqaWZmaWVzIHZhbHVlIG1pZ2h0IGJlIG9sZGVyIHRoYW4gdGhlIGNvdW50ICh0aGF0IGlzLAotCSAqIHRoZSBjb3VudGVyIG1heSB1bmRlcmZsb3cgYmV0d2VlbiB0aGUgbGFzdCBwb2ludCB3aGVyZQotCSAqIGppZmZpZXMgd2FzIGluY3JlbWVudGVkIGFuZCB0aGUgcG9pbnQgd2hlcmUgd2UgbGF0Y2ggdGhlCi0JICogY291bnQpLCBpdCBjYW5ub3QgYmUgbmV3ZXIuCi0JICovCi0JamlmcyA9IGppZmZpZXM7Ci0Jb3V0Yl9waXQoMHgwMCwgUElUX01PREUpOwkvKiBsYXRjaCB0aGUgY291bnQgQVNBUCAqLwotCWNvdW50ID0gaW5iX3BpdChQSVRfQ0gwKTsJLyogcmVhZCB0aGUgbGF0Y2hlZCBjb3VudCAqLwotCWNvdW50IHw9IGluYl9waXQoUElUX0NIMCkgPDwgODsKLQotCS8qIFZJQTY4NmEgdGVzdCBjb2RlLi4uIHJlc2V0IHRoZSBsYXRjaCBpZiBjb3VudCA+IG1heCArIDEgKi8KLQlpZiAoY291bnQgPiBMQVRDSCkgewotCQlvdXRiX3BpdCgweDM0LCBQSVRfTU9ERSk7Ci0JCW91dGJfcGl0KExBVENIICYgMHhmZiwgUElUX0NIMCk7Ci0JCW91dGJfcGl0KExBVENIID4+IDgsIFBJVF9DSDApOwotCQljb3VudCA9IExBVENIIC0gMTsKLQl9Ci0KLQkvKgotCSAqIEl0J3MgcG9zc2libGUgZm9yIGNvdW50IHRvIGFwcGVhciB0byBnbyB0aGUgd3Jvbmcgd2F5IGZvciBhCi0JICogY291cGxlIG9mIHJlYXNvbnM6Ci0JICoKLQkgKiAgMS4gVGhlIHRpbWVyIGNvdW50ZXIgdW5kZXJmbG93cywgYnV0IHdlIGhhdmVuJ3QgaGFuZGxlZCB0aGUKLQkgKiAgICAgcmVzdWx0aW5nIGludGVycnVwdCBhbmQgaW5jcmVtZW50ZWQgamlmZmllcyB5ZXQuCi0JICogIDIuIEhhcmR3YXJlIHByb2JsZW0gd2l0aCB0aGUgdGltZXIsIG5vdCBnaXZpbmcgdXMgY29udGludW91cyB0aW1lLAotCSAqICAgICB0aGUgY291bnRlciBkb2VzIHNtYWxsICJqdW1wcyIgdXB3YXJkcyBvbiBzb21lIFBlbnRpdW0gc3lzdGVtcywKLQkgKiAgICAgKHNlZSBjJ3QgOTUvMTAgcGFnZSAzMzUgZm9yIE5lcHR1biBidWcuKQotCSAqCi0JICogUHJldmlvdXMgYXR0ZW1wdHMgdG8gaGFuZGxlIHRoZXNlIGNhc2VzIGludGVsbGlnZW50bHkgd2VyZQotCSAqIGJ1Z2d5LCBzbyB3ZSBqdXN0IGRvIHRoZSBzaW1wbGUgdGhpbmcgbm93LgotCSAqLwotCWlmIChjb3VudCA+IG9sZF9jb3VudCAmJiBqaWZzID09IG9sZF9qaWZzKQotCQljb3VudCA9IG9sZF9jb3VudDsKLQotCW9sZF9jb3VudCA9IGNvdW50OwotCW9sZF9qaWZzID0gamlmczsKLQotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZpODI1M19sb2NrLCBmbGFncyk7Ci0KLQljb3VudCA9IChMQVRDSCAtIDEpIC0gY291bnQ7Ci0KLQlyZXR1cm4gKGN5Y2xlX3QpKGppZnMgKiBMQVRDSCkgKyBjb3VudDsKLX0KLQotc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSBwaXRfY3MgPSB7Ci0JLm5hbWUJCT0gInBpdCIsCi0JLnJhdGluZwkJPSAxMTAsCi0JLnJlYWQJCT0gcGl0X3JlYWQsCi0JLm1hc2sJCT0gQ0xPQ0tTT1VSQ0VfTUFTSygzMiksCi0JLm11bHQJCT0gMCwKLQkuc2hpZnQJCT0gMjAsCi19OwotCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3BpdF9jbG9ja3NvdXJjZSh2b2lkKQogewogCSAvKgpAQCAtMjA1LDEwICsxMjYsNyBAQAogCSAgICBwaXRfY2UubW9kZSAhPSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQykKIAkJcmV0dXJuIDA7CiAKLQlwaXRfY3MubXVsdCA9IGNsb2Nrc291cmNlX2h6Mm11bHQoQ0xPQ0tfVElDS19SQVRFLCBwaXRfY3Muc2hpZnQpOwotCi0JcmV0dXJuIGNsb2Nrc291cmNlX3JlZ2lzdGVyKCZwaXRfY3MpOworCXJldHVybiBjbG9ja3NvdXJjZV9pODI1M19pbml0KCk7CiB9CiBhcmNoX2luaXRjYWxsKGluaXRfcGl0X2Nsb2Nrc291cmNlKTsKLQogI2VuZGlmIC8qICFDT05GSUdfWDg2XzY0ICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaXJxLmMgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxLmMKaW5kZXggMWNiMGI5Zi4uNmMwODAyZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2lycS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9pcnEuYwpAQCAtMjQ5LDcgKzI0OSw3IEBACiAKIAkJZGF0YSA9IGlycV9kZXNjX2dldF9pcnFfZGF0YShkZXNjKTsKIAkJYWZmaW5pdHkgPSBkYXRhLT5hZmZpbml0eTsKLQkJaWYgKCFpcnFfaGFzX2FjdGlvbihpcnEpIHx8CisJCWlmICghaXJxX2hhc19hY3Rpb24oaXJxKSB8fCBpcnFkX2lzX3Blcl9jcHUoZGF0YSkgfHwKIAkJICAgIGNwdW1hc2tfc3Vic2V0KGFmZmluaXR5LCBjcHVfb25saW5lX21hc2spKSB7CiAJCQlyYXdfc3Bpbl91bmxvY2soJmRlc2MtPmxvY2spOwogCQkJY29udGludWU7CkBAIC0yNzYsNyArMjc2LDggQEAKIAkJZWxzZSBpZiAoISh3YXJuZWQrKykpCiAJCQlzZXRfYWZmaW5pdHkgPSAwOwogCi0JCWlmICghaXJxZF9jYW5fbW92ZV9pbl9wcm9jZXNzX2NvbnRleHQoZGF0YSkgJiYgY2hpcC0+aXJxX3VubWFzaykKKwkJaWYgKCFpcnFkX2Nhbl9tb3ZlX2luX3Byb2Nlc3NfY29udGV4dChkYXRhKSAmJgorCQkgICAgIWlycWRfaXJxX2Rpc2FibGVkKGRhdGEpICYmIGNoaXAtPmlycV91bm1hc2spCiAJCQljaGlwLT5pcnFfdW5tYXNrKGRhdGEpOwogCiAJCXJhd19zcGluX3VubG9jaygmZGVzYy0+bG9jayk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvanVtcF9sYWJlbC5jIGIvYXJjaC94ODYva2VybmVsL2p1bXBfbGFiZWwuYwppbmRleCA5NjFiNmIzLi4zZmVlMzQ2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvanVtcF9sYWJlbC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9qdW1wX2xhYmVsLmMKQEAgLTM0LDcgKzM0LDcgQEAKIAkJY29kZS5vZmZzZXQgPSBlbnRyeS0+dGFyZ2V0IC0KIAkJCQkoZW50cnktPmNvZGUgKyBKVU1QX0xBQkVMX05PUF9TSVpFKTsKIAl9IGVsc2UKLQkJbWVtY3B5KCZjb2RlLCBpZGVhbF9ub3A1LCBKVU1QX0xBQkVMX05PUF9TSVpFKTsKKwkJbWVtY3B5KCZjb2RlLCBpZGVhbF9ub3BzW05PUF9BVE9NSUM1XSwgSlVNUF9MQUJFTF9OT1BfU0laRSk7CiAJZ2V0X29ubGluZV9jcHVzKCk7CiAJbXV0ZXhfbG9jaygmdGV4dF9tdXRleCk7CiAJdGV4dF9wb2tlX3NtcCgodm9pZCAqKWVudHJ5LT5jb2RlLCAmY29kZSwgSlVNUF9MQUJFTF9OT1BfU0laRSk7CkBAIC00NCw3ICs0NCw4IEBACiAKIHZvaWQgYXJjaF9qdW1wX2xhYmVsX3RleHRfcG9rZV9lYXJseShqdW1wX2xhYmVsX3QgYWRkcikKIHsKLQl0ZXh0X3Bva2VfZWFybHkoKHZvaWQgKilhZGRyLCBpZGVhbF9ub3A1LCBKVU1QX0xBQkVMX05PUF9TSVpFKTsKKwl0ZXh0X3Bva2VfZWFybHkoKHZvaWQgKilhZGRyLCBpZGVhbF9ub3BzW05PUF9BVE9NSUM1XSwKKwkJCUpVTVBfTEFCRUxfTk9QX1NJWkUpOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9rdm1jbG9jay5jIGIvYXJjaC94ODYva2VybmVsL2t2bWNsb2NrLmMKaW5kZXggZjk4ZDNlYS4uNjM4OWE2YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2t2bWNsb2NrLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2t2bWNsb2NrLmMKQEAgLTI2LDggKzI2LDYgQEAKICNpbmNsdWRlIDxhc20veDg2X2luaXQuaD4KICNpbmNsdWRlIDxhc20vcmVib290Lmg+CiAKLSNkZWZpbmUgS1ZNX1NDQUxFIDIyCi0KIHN0YXRpYyBpbnQga3ZtY2xvY2sgPSAxOwogc3RhdGljIGludCBtc3Jfa3ZtX3N5c3RlbV90aW1lID0gTVNSX0tWTV9TWVNURU1fVElNRTsKIHN0YXRpYyBpbnQgbXNyX2t2bV93YWxsX2Nsb2NrID0gTVNSX0tWTV9XQUxMX0NMT0NLOwpAQCAtMTIwLDggKzExOCw2IEBACiAJLnJlYWQgPSBrdm1fY2xvY2tfZ2V0X2N5Y2xlcywKIAkucmF0aW5nID0gNDAwLAogCS5tYXNrID0gQ0xPQ0tTT1VSQ0VfTUFTSyg2NCksCi0JLm11bHQgPSAxIDw8IEtWTV9TQ0FMRSwKLQkuc2hpZnQgPSBLVk1fU0NBTEUsCiAJLmZsYWdzID0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCkBAIC0yMDMsNyArMTk5LDcgQEAKIAltYWNoaW5lX29wcy5jcmFzaF9zaHV0ZG93biAgPSBrdm1fY3Jhc2hfc2h1dGRvd247CiAjZW5kaWYKIAlrdm1fZ2V0X3ByZXNldF9scGooKTsKLQljbG9ja3NvdXJjZV9yZWdpc3Rlcigma3ZtX2Nsb2NrKTsKKwljbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigma3ZtX2Nsb2NrLCBOU0VDX1BFUl9TRUMpOwogCXB2X2luZm8ucGFyYXZpcnRfZW5hYmxlZCA9IDE7CiAJcHZfaW5mby5uYW1lID0gIktWTSI7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gveDg2L2tlcm5lbC9tb2R1bGUuYwppbmRleCBhYjIzZjFhLi41MmYyNTZmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL21vZHVsZS5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9qdW1wX2xhYmVsLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9tcHBhcnNlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbXBwYXJzZS5jCmluZGV4IDVhNTMyY2UuLjZmOWJmZmYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9tcHBhcnNlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL21wcGFyc2UuYwpAQCAtNzE1LDE3ICs3MTUsMTUgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBpbnQgX19pbml0CiBjaGVja19zbG90KHVuc2lnbmVkIGxvbmcgbXBjX25ld19waHlzLCB1bnNpZ25lZCBsb25nIG1wY19uZXdfbGVuZ3RoLCBpbnQgY291bnQpCiB7Ci0JaW50IHJldCA9IDA7Ci0KIAlpZiAoIW1wY19uZXdfcGh5cyB8fCBjb3VudCA8PSBtcGNfbmV3X2xlbmd0aCkgewogCQlXQVJOKDEsICJ1cGRhdGVfbXB0YWJsZTogTm8gc3BhcmUgc2xvdHMgKGxlbmd0aDogJXgpXG4iLCBjb3VudCk7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogI2Vsc2UgLyogQ09ORklHX1g4Nl9JT19BUElDICovCiBzdGF0aWMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wY2ktaW9tbXVfdGFibGUuYyBiL2FyY2gveDg2L2tlcm5lbC9wY2ktaW9tbXVfdGFibGUuYwppbmRleCA1NWQ3NDVlLi4zNWNjZjc1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcGNpLWlvbW11X3RhYmxlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3BjaS1pb21tdV90YWJsZS5jCkBAIC01MCwyMCArNTAsMTQgQEAKIAkJCQlzdHJ1Y3QgaW9tbXVfdGFibGVfZW50cnkgKmZpbmlzaCkKIHsKIAlzdHJ1Y3QgaW9tbXVfdGFibGVfZW50cnkgKnAsICpxLCAqeDsKLQljaGFyIHN5bV9wW0tTWU1fU1lNQk9MX0xFTl07Ci0JY2hhciBzeW1fcVtLU1lNX1NZTUJPTF9MRU5dOwogCiAJLyogU2ltcGxlIGN5Y2xpYyBkZXBlbmRlbmN5IGNoZWNrZXIuICovCiAJZm9yIChwID0gc3RhcnQ7IHAgPCBmaW5pc2g7IHArKykgewogCQlxID0gZmluZF9kZXBlbmRlbnRzX29mKHN0YXJ0LCBmaW5pc2gsIHApOwogCQl4ID0gZmluZF9kZXBlbmRlbnRzX29mKHN0YXJ0LCBmaW5pc2gsIHEpOwogCQlpZiAocCA9PSB4KSB7Ci0JCQlzcHJpbnRfc3ltYm9sKHN5bV9wLCAodW5zaWduZWQgbG9uZylwLT5kZXRlY3QpOwotCQkJc3ByaW50X3N5bWJvbChzeW1fcSwgKHVuc2lnbmVkIGxvbmcpcS0+ZGV0ZWN0KTsKLQotCQkJcHJpbnRrKEtFUk5fRVJSICJDWUNMSUMgREVQRU5ERU5DWSBGT1VORCEgJXMgZGVwZW5kcyIgXAotCQkJCQkiIG9uICVzIGFuZCB2aWNlLXZlcnNhLiBCUkVBS0lORyBJVC5cbiIsCi0JCQkJCXN5bV9wLCBzeW1fcSk7CisJCQlwcmludGsoS0VSTl9FUlIgIkNZQ0xJQyBERVBFTkRFTkNZIEZPVU5EISAlcFMgZGVwZW5kcyBvbiAlcFMgYW5kIHZpY2UtdmVyc2EuIEJSRUFLSU5HIElULlxuIiwKKwkJCSAgICAgICBwLT5kZXRlY3QsIHEtPmRldGVjdCk7CiAJCQkvKiBIZWF2eSBoYW5kZWQgd2F5Li4qLwogCQkJeC0+ZGVwZW5kID0gMDsKIAkJfQpAQCAtNzIsMTIgKzY2LDggQEAKIAlmb3IgKHAgPSBzdGFydDsgcCA8IGZpbmlzaDsgcCsrKSB7CiAJCXEgPSBmaW5kX2RlcGVuZGVudHNfb2YocCwgZmluaXNoLCBwKTsKIAkJaWYgKHEgJiYgcSA+IHApIHsKLQkJCXNwcmludF9zeW1ib2woc3ltX3AsICh1bnNpZ25lZCBsb25nKXAtPmRldGVjdCk7Ci0JCQlzcHJpbnRfc3ltYm9sKHN5bV9xLCAodW5zaWduZWQgbG9uZylxLT5kZXRlY3QpOwotCi0JCQlwcmludGsoS0VSTl9FUlIgIkVYRUNVVElPTiBPUkRFUiBJTlZBTElEISAlcyAiXAotCQkJCQkic2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgJXMhXG4iLAotCQkJCQlzeW1fcCwgc3ltX3EpOworCQkJcHJpbnRrKEtFUk5fRVJSICJFWEVDVVRJT04gT1JERVIgSU5WQUxJRCEgJXBTIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlICVwUyFcbiIsCisJCQkgICAgICAgcC0+ZGV0ZWN0LCBxLT5kZXRlY3QpOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Byb2JlX3JvbXNfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9wcm9iZV9yb21zLmMKc2ltaWxhcml0eSBpbmRleCA2NSUKcmVuYW1lIGZyb20gYXJjaC94ODYva2VybmVsL3Byb2JlX3JvbXNfMzIuYwpyZW5hbWUgdG8gYXJjaC94ODYva2VybmVsL3Byb2JlX3JvbXMuYwppbmRleCAwNzFlN2ZlLi5iYTBhNGNjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvYmVfcm9tc18zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9iZV9yb21zLmMKQEAgLTczLDYgKzczLDEwNyBAQAogCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfUkVBRE9OTFkgfCBJT1JFU09VUkNFX01FTQogfTsKIAorLyogZG9lcyB0aGlzIG9wcm9tIHN1cHBvcnQgdGhlIGdpdmVuIHBjaSBkZXZpY2UsIG9yIGFueSBvZiB0aGUgZGV2aWNlcworICogdGhhdCB0aGUgZHJpdmVyIHN1cHBvcnRzPworICovCitzdGF0aWMgYm9vbCBtYXRjaF9pZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdW5zaWduZWQgc2hvcnQgdmVuZG9yLCB1bnNpZ25lZCBzaG9ydCBkZXZpY2UpCit7CisJc3RydWN0IHBjaV9kcml2ZXIgKmRydiA9IHBkZXYtPmRyaXZlcjsKKwljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQ7CisKKwlpZiAocGRldi0+dmVuZG9yID09IHZlbmRvciAmJiBwZGV2LT5kZXZpY2UgPT0gZGV2aWNlKQorCQlyZXR1cm4gdHJ1ZTsKKworCWZvciAoaWQgPSBkcnYgPyBkcnYtPmlkX3RhYmxlIDogTlVMTDsgaWQgJiYgaWQtPnZlbmRvcjsgaWQrKykKKwkJaWYgKGlkLT52ZW5kb3IgPT0gdmVuZG9yICYmIGlkLT5kZXZpY2UgPT0gZGV2aWNlKQorCQkJYnJlYWs7CisKKwlyZXR1cm4gaWQgJiYgaWQtPnZlbmRvcjsKK30KKworc3RhdGljIGJvb2wgcHJvYmVfbGlzdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdW5zaWduZWQgc2hvcnQgdmVuZG9yLAorCQkgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcm9tX2xpc3QpCit7CisJdW5zaWduZWQgc2hvcnQgZGV2aWNlOworCisJZG8geworCQlpZiAocHJvYmVfa2VybmVsX2FkZHJlc3Mocm9tX2xpc3QsIGRldmljZSkgIT0gMCkKKwkJCWRldmljZSA9IDA7CisKKwkJaWYgKGRldmljZSAmJiBtYXRjaF9pZChwZGV2LCB2ZW5kb3IsIGRldmljZSkpCisJCQlicmVhazsKKworCQlyb21fbGlzdCArPSAyOworCX0gd2hpbGUgKGRldmljZSk7CisKKwlyZXR1cm4gISFkZXZpY2U7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgKmZpbmRfb3Byb20oc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpvcHJvbSA9IE5VTEw7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhZGFwdGVyX3JvbV9yZXNvdXJjZXMpOyBpKyspIHsKKwkJc3RydWN0IHJlc291cmNlICpyZXMgPSAmYWRhcHRlcl9yb21fcmVzb3VyY2VzW2ldOworCQl1bnNpZ25lZCBzaG9ydCBvZmZzZXQsIHZlbmRvciwgZGV2aWNlLCBsaXN0LCByZXY7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnJvbTsKKworCQlpZiAocmVzLT5lbmQgPT0gMCkKKwkJCWJyZWFrOworCisJCXJvbSA9IGlzYV9idXNfdG9fdmlydChyZXMtPnN0YXJ0KTsKKwkJaWYgKHByb2JlX2tlcm5lbF9hZGRyZXNzKHJvbSArIDB4MTgsIG9mZnNldCkgIT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChwcm9iZV9rZXJuZWxfYWRkcmVzcyhyb20gKyBvZmZzZXQgKyAweDQsIHZlbmRvcikgIT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChwcm9iZV9rZXJuZWxfYWRkcmVzcyhyb20gKyBvZmZzZXQgKyAweDYsIGRldmljZSkgIT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChtYXRjaF9pZChwZGV2LCB2ZW5kb3IsIGRldmljZSkpIHsKKwkJCW9wcm9tID0gcmVzOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocHJvYmVfa2VybmVsX2FkZHJlc3Mocm9tICsgb2Zmc2V0ICsgMHg4LCBsaXN0KSA9PSAwICYmCisJCSAgICBwcm9iZV9rZXJuZWxfYWRkcmVzcyhyb20gKyBvZmZzZXQgKyAweGMsIHJldikgPT0gMCAmJgorCQkgICAgcmV2ID49IDMgJiYgbGlzdCAmJgorCQkgICAgcHJvYmVfbGlzdChwZGV2LCB2ZW5kb3IsIHJvbSArIG9mZnNldCArIGxpc3QpKSB7CisJCQlvcHJvbSA9IHJlczsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIG9wcm9tOworfQorCit2b2lkICpwY2lfbWFwX2Jpb3Nyb20oc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpvcHJvbSA9IGZpbmRfb3Byb20ocGRldik7CisKKwlpZiAoIW9wcm9tKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBpb3JlbWFwKG9wcm9tLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShvcHJvbSkpOworfQorRVhQT1JUX1NZTUJPTChwY2lfbWFwX2Jpb3Nyb20pOworCit2b2lkIHBjaV91bm1hcF9iaW9zcm9tKHZvaWQgX19pb21lbSAqaW1hZ2UpCit7CisJaW91bm1hcChpbWFnZSk7Cit9CitFWFBPUlRfU1lNQk9MKHBjaV91bm1hcF9iaW9zcm9tKTsKKworc2l6ZV90IHBjaV9iaW9zcm9tX3NpemUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpvcHJvbSA9IGZpbmRfb3Byb20ocGRldik7CisKKwlyZXR1cm4gb3Byb20gPyByZXNvdXJjZV9zaXplKG9wcm9tKSA6IDA7Cit9CitFWFBPUlRfU1lNQk9MKHBjaV9iaW9zcm9tX3NpemUpOworCiAjZGVmaW5lIFJPTVNJR05BVFVSRSAweGFhNTUKIAogc3RhdGljIGludCBfX2luaXQgcm9tc2lnbmF0dXJlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJvbSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGQ0NmNiZTQuLjg4YTkwYTkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3MuYwpAQCAtNDQ5LDcgKzQ0OSw3IEBACiB2b2lkIG13YWl0X2lkbGVfd2l0aF9oaW50cyh1bnNpZ25lZCBsb25nIGF4LCB1bnNpZ25lZCBsb25nIGN4KQogewogCWlmICghbmVlZF9yZXNjaGVkKCkpIHsKLQkJaWYgKGNwdV9oYXMoX190aGlzX2NwdV9wdHIoJmNwdV9pbmZvKSwgWDg2X0ZFQVRVUkVfQ0xGTFVTSF9NT05JVE9SKSkKKwkJaWYgKHRoaXNfY3B1X2hhcyhYODZfRkVBVFVSRV9DTEZMVVNIX01PTklUT1IpKQogCQkJY2xmbHVzaCgodm9pZCAqKSZjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzKTsKIAogCQlfX21vbml0b3IoKHZvaWQgKikmY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFncywgMCwgMCk7CkBAIC00NjUsNyArNDY1LDcgQEAKIAlpZiAoIW5lZWRfcmVzY2hlZCgpKSB7CiAJCXRyYWNlX3Bvd2VyX3N0YXJ0KFBPV0VSX0NTVEFURSwgMSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAkJdHJhY2VfY3B1X2lkbGUoMSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQkJaWYgKGNwdV9oYXMoX190aGlzX2NwdV9wdHIoJmNwdV9pbmZvKSwgWDg2X0ZFQVRVUkVfQ0xGTFVTSF9NT05JVE9SKSkKKwkJaWYgKHRoaXNfY3B1X2hhcyhYODZfRkVBVFVSRV9DTEZMVVNIX01PTklUT1IpKQogCQkJY2xmbHVzaCgodm9pZCAqKSZjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzKTsKIAogCQlfX21vbml0b3IoKHZvaWQgKikmY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFncywgMCwgMCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMKaW5kZXggMDhjNDRiMC4uMGMwMTZmNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3JlYm9vdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYwpAQCAtMzYsNyArMzYsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRlc2NfcHRyIG5vX2lkdCA9IHt9Owogc3RhdGljIGludCByZWJvb3RfbW9kZTsKLWVudW0gcmVib290X3R5cGUgcmVib290X3R5cGUgPSBCT09UX0tCRDsKK2VudW0gcmVib290X3R5cGUgcmVib290X3R5cGUgPSBCT09UX0FDUEk7CiBpbnQgcmVib290X2ZvcmNlOwogCiAjaWYgZGVmaW5lZChDT05GSUdfWDg2XzMyKSAmJiBkZWZpbmVkKENPTkZJR19TTVApCkBAIC00NzgsOSArNDc4LDI0IEBACiB7CiB9CiAKKy8qCisgKiBXaW5kb3dzIGNvbXBhdGlibGUgeDg2IGhhcmR3YXJlIGV4cGVjdHMgdGhlIGZvbGxvd2luZyBvbiByZWJvb3Q6CisgKgorICogMSkgSWYgdGhlIEZBRFQgaGFzIHRoZSBBQ1BJIHJlYm9vdCByZWdpc3RlciBmbGFnIHNldCwgdHJ5IGl0CisgKiAyKSBJZiBzdGlsbCBhbGl2ZSwgd3JpdGUgdG8gdGhlIGtleWJvYXJkIGNvbnRyb2xsZXIKKyAqIDMpIElmIHN0aWxsIGFsaXZlLCB3cml0ZSB0byB0aGUgQUNQSSByZWJvb3QgcmVnaXN0ZXIgYWdhaW4KKyAqIDQpIElmIHN0aWxsIGFsaXZlLCB3cml0ZSB0byB0aGUga2V5Ym9hcmQgY29udHJvbGxlciBhZ2FpbgorICoKKyAqIElmIHRoZSBtYWNoaW5lIGlzIHN0aWxsIGFsaXZlIGF0IHRoaXMgc3RhZ2UsIGl0IGdpdmVzIHVwLiBXZSBkZWZhdWx0IHRvCisgKiBmb2xsb3dpbmcgdGhlIHNhbWUgcGF0dGVybiwgZXhjZXB0IHRoYXQgaWYgd2UncmUgc3RpbGwgYWxpdmUgYWZ0ZXIgKDQpIHdlJ2xsCisgKiB0cnkgdG8gZm9yY2UgYSB0cmlwbGUgZmF1bHQgYW5kIHRoZW4gY3ljbGUgYmV0d2VlbiBoaXR0aW5nIHRoZSBrZXlib2FyZAorICogY29udHJvbGxlciBhbmQgZG9pbmcgdGhhdAorICovCiBzdGF0aWMgdm9pZCBuYXRpdmVfbWFjaGluZV9lbWVyZ2VuY3lfcmVzdGFydCh2b2lkKQogewogCWludCBpOworCWludCBhdHRlbXB0ID0gMDsKKwlpbnQgb3JpZ19yZWJvb3RfdHlwZSA9IHJlYm9vdF90eXBlOwogCiAJaWYgKHJlYm9vdF9lbWVyZ2VuY3kpCiAJCWVtZXJnZW5jeV92bXhfZGlzYWJsZV9hbGwoKTsKQEAgLTUwMiw2ICs1MTcsMTMgQEAKIAkJCQlvdXRiKDB4ZmUsIDB4NjQpOyAvKiBwdWxzZSByZXNldCBsb3cgKi8KIAkJCQl1ZGVsYXkoNTApOwogCQkJfQorCQkJaWYgKGF0dGVtcHQgPT0gMCAmJiBvcmlnX3JlYm9vdF90eXBlID09IEJPT1RfQUNQSSkgeworCQkJCWF0dGVtcHQgPSAxOworCQkJCXJlYm9vdF90eXBlID0gQk9PVF9BQ1BJOworCQkJfSBlbHNlIHsKKwkJCQlyZWJvb3RfdHlwZSA9IEJPT1RfVFJJUExFOworCQkJfQorCQkJYnJlYWs7CiAKIAkJY2FzZSBCT09UX1RSSVBMRToKIAkJCWxvYWRfaWR0KCZub19pZHQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3NldHVwLmMgYi9hcmNoL3g4Ni9rZXJuZWwvc2V0dXAuYwppbmRleCA0YmU5YjM5Li5jMzA1MGFmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc2V0dXAuYwpAQCAtNjkxLDggKzY5MSw2IEBACiAKIHZvaWQgX19pbml0IHNldHVwX2FyY2goY2hhciAqKmNtZGxpbmVfcCkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogCW1lbWNweSgmYm9vdF9jcHVfZGF0YSwgJm5ld19jcHVfZGF0YSwgc2l6ZW9mKG5ld19jcHVfZGF0YSkpOwogCXZpc3dzX2Vhcmx5X2RldGVjdCgpOwpAQCAtMTA0MSw5ICsxMDM5LDcgQEAKIAogCW1jaGVja19pbml0KCk7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JYXJjaF9pbml0X2lkZWFsX25vcDUoKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJYXJjaF9pbml0X2lkZWFsX25vcHMoKTsKIH0KIAogI2lmZGVmIENPTkZJR19YODZfMzIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9zbXAuYyBiL2FyY2gveDg2L2tlcm5lbC9zbXAuYwppbmRleCA1MTNkZWFjLi4wMTNlN2ViIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3NtcC5jCkBAIC0xOTQsMTQgKzE5NCwxMyBAQAogfQogCiAvKgotICogUmVzY2hlZHVsZSBjYWxsIGJhY2suIE5vdGhpbmcgdG8gZG8sCi0gKiBhbGwgdGhlIHdvcmsgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IHdoZW4KLSAqIHdlIHJldHVybiBmcm9tIHRoZSBpbnRlcnJ1cHQuCisgKiBSZXNjaGVkdWxlIGNhbGwgYmFjay4KICAqLwogdm9pZCBzbXBfcmVzY2hlZHVsZV9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJYWNrX0FQSUNfaXJxKCk7CiAJaW5jX2lycV9zdGF0KGlycV9yZXNjaGVkX2NvdW50KTsKKwlzY2hlZHVsZXJfaXBpKCk7CiAJLyoKIAkgKiBLVk0gdXNlcyB0aGlzIGludGVycnVwdCB0byBmb3JjZSBhIGNwdSBvdXQgb2YgZ3Vlc3QgbW9kZQogCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3NtcGJvb3QuYyBiL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMKaW5kZXggYzI4NzFkMy4uYTNjNDMwYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3NtcGJvb3QuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jCkBAIC0xMzMyLDkgKzEzMzIsOSBAQAogCXZvaWQgKm13YWl0X3B0cjsKIAlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBfX3RoaXNfY3B1X3B0cigmY3B1X2luZm8pOwogCi0JaWYgKCEoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9NV0FJVCkgJiYgbXdhaXRfdXNhYmxlKGMpKSkKKwlpZiAoIXRoaXNfY3B1X2hhcyhYODZfRkVBVFVSRV9NV0FJVCkgJiYgbXdhaXRfdXNhYmxlKGMpKQogCQlyZXR1cm47Ci0JaWYgKCFjcHVfaGFzKF9fdGhpc19jcHVfcHRyKCZjcHVfaW5mbyksIFg4Nl9GRUFUVVJFX0NMRkxTSCkpCisJaWYgKCF0aGlzX2NwdV9oYXMoWDg2X0ZFQVRVUkVfQ0xGTFNIKSkKIAkJcmV0dXJuOwogCWlmIChfX3RoaXNfY3B1X3JlYWQoY3B1X2luZm8uY3B1aWRfbGV2ZWwpIDwgQ1BVSURfTVdBSVRfTEVBRikKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3N0YWNrdHJhY2UuYyBiL2FyY2gveDg2L2tlcm5lbC9zdGFja3RyYWNlLmMKaW5kZXggNjUxNTczMy4uNTVkOWJjMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3N0YWNrdHJhY2UuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc3RhY2t0cmFjZS5jCkBAIC05LDE1ICs5LDYgQEAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3N0YWNrdHJhY2UuaD4KIAotc3RhdGljIHZvaWQgc2F2ZV9zdGFja193YXJuaW5nKHZvaWQgKmRhdGEsIGNoYXIgKm1zZykKLXsKLX0KLQotc3RhdGljIHZvaWQKLXNhdmVfc3RhY2tfd2FybmluZ19zeW1ib2wodm9pZCAqZGF0YSwgY2hhciAqbXNnLCB1bnNpZ25lZCBsb25nIHN5bWJvbCkKLXsKLX0KLQogc3RhdGljIGludCBzYXZlX3N0YWNrX3N0YWNrKHZvaWQgKmRhdGEsIGNoYXIgKm5hbWUpCiB7CiAJcmV0dXJuIDA7CkBAIC01MywxNiArNDQsMTIgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzdGFja3RyYWNlX29wcyBzYXZlX3N0YWNrX29wcyA9IHsKLQkud2FybmluZwk9IHNhdmVfc3RhY2tfd2FybmluZywKLQkud2FybmluZ19zeW1ib2wJPSBzYXZlX3N0YWNrX3dhcm5pbmdfc3ltYm9sLAogCS5zdGFjawkJPSBzYXZlX3N0YWNrX3N0YWNrLAogCS5hZGRyZXNzCT0gc2F2ZV9zdGFja19hZGRyZXNzLAogCS53YWxrX3N0YWNrCT0gcHJpbnRfY29udGV4dF9zdGFjaywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgc2F2ZV9zdGFja19vcHNfbm9zY2hlZCA9IHsKLQkud2FybmluZwk9IHNhdmVfc3RhY2tfd2FybmluZywKLQkud2FybmluZ19zeW1ib2wJPSBzYXZlX3N0YWNrX3dhcm5pbmdfc3ltYm9sLAogCS5zdGFjawkJPSBzYXZlX3N0YWNrX3N0YWNrLAogCS5hZGRyZXNzCT0gc2F2ZV9zdGFja19hZGRyZXNzX25vc2NoZWQsCiAJLndhbGtfc3RhY2sJPSBwcmludF9jb250ZXh0X3N0YWNrLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3g4Nl9pbml0LmMgYi9hcmNoL3g4Ni9rZXJuZWwveDg2X2luaXQuYwppbmRleCA3NWVmNGIxLi42ZjE2NGJkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwveDg2X2luaXQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwveDg2X2luaXQuYwpAQCAtMzUsNyArMzUsNyBAQAogc3RydWN0IHg4Nl9pbml0X29wcyB4ODZfaW5pdCBfX2luaXRkYXRhID0gewogCiAJLnJlc291cmNlcyA9IHsKLQkJLnByb2JlX3JvbXMJCT0geDg2X2luaXRfbm9vcCwKKwkJLnByb2JlX3JvbXMJCT0gcHJvYmVfcm9tcywKIAkJLnJlc2VydmVfcmVzb3VyY2VzCT0gcmVzZXJ2ZV9zdGFuZGFyZF9pb19yZXNvdXJjZXMsCiAJCS5tZW1vcnlfc2V0dXAJCT0gZGVmYXVsdF9tYWNoaW5lX3NwZWNpZmljX21lbW9yeV9zZXR1cCwKIAl9LApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGd1ZXN0L2Jvb3QuYyBiL2FyY2gveDg2L2xndWVzdC9ib290LmMKaW5kZXggMWNkNjA4OS4uZTE5MWMwOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGd1ZXN0L2Jvb3QuYworKysgYi9hcmNoL3g4Ni9sZ3Vlc3QvYm9vdC5jCkBAIC03LDcgKzcsNyBAQAogICoga2VybmVsIGFuZCBpbnNlcnQgYSBtb2R1bGUgKGxnLmtvKSB3aGljaCBhbGxvd3MgdXMgdG8gcnVuIG90aGVyIExpbnV4CiAgKiBrZXJuZWxzIHRoZSBzYW1lIHdheSB3ZSdkIHJ1biBwcm9jZXNzZXMuICBXZSBjYWxsIHRoZSBmaXJzdCBrZXJuZWwgdGhlIEhvc3QsCiAgKiBhbmQgdGhlIG90aGVycyB0aGUgR3Vlc3RzLiAgVGhlIHByb2dyYW0gd2hpY2ggc2V0cyB1cCBhbmQgY29uZmlndXJlcyBHdWVzdHMKLSAqIChzdWNoIGFzIHRoZSBleGFtcGxlIGluIERvY3VtZW50YXRpb24vbGd1ZXN0L2xndWVzdC5jKSBpcyBjYWxsZWQgdGhlCisgKiAoc3VjaCBhcyB0aGUgZXhhbXBsZSBpbiBEb2N1bWVudGF0aW9uL3ZpcnR1YWwvbGd1ZXN0L2xndWVzdC5jKSBpcyBjYWxsZWQgdGhlCiAgKiBMYXVuY2hlci4KICAqCiAgKiBTZWNvbmRseSwgd2Ugb25seSBydW4gc3BlY2lhbGx5IG1vZGlmaWVkIEd1ZXN0cywgbm90IG5vcm1hbCBrZXJuZWxzOiBzZXR0aW5nCkBAIC05MTMsOCArOTEzLDYgQEAKIAkucmF0aW5nCQk9IDIwMCwKIAkucmVhZAkJPSBsZ3Vlc3RfY2xvY2tfcmVhZCwKIAkubWFzawkJPSBDTE9DS1NPVVJDRV9NQVNLKDY0KSwKLQkubXVsdAkJPSAxIDw8IDIyLAotCS5zaGlmdAkJPSAyMiwKIAkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCkBAIC05OTcsNyArOTk1LDcgQEAKIAkvKiBTZXQgdXAgdGhlIHRpbWVyIGludGVycnVwdCAoMCkgdG8gZ28gdG8gb3VyIHNpbXBsZSB0aW1lciByb3V0aW5lICovCiAJaXJxX3NldF9oYW5kbGVyKDAsIGxndWVzdF90aW1lX2lycSk7CiAKLQljbG9ja3NvdXJjZV9yZWdpc3RlcigmbGd1ZXN0X2Nsb2NrKTsKKwljbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmbGd1ZXN0X2Nsb2NrLCBOU0VDX1BFUl9TRUMpOwogCiAJLyogV2UgY2FuJ3Qgc2V0IGNwdW1hc2sgaW4gdGhlIGluaXRpYWxpemVyOiBkYW1uIEMgbGltaXRhdGlvbnMhICBTZXQgaXQKIAkgKiBoZXJlIGFuZCByZWdpc3RlciBvdXIgdGltZXIgZGV2aWNlLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGliL2NsZWFyX3BhZ2VfNjQuUyBiL2FyY2gveDg2L2xpYi9jbGVhcl9wYWdlXzY0LlMKaW5kZXggYWE0MzI2Yi4uZjIxNDVjZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGliL2NsZWFyX3BhZ2VfNjQuUworKysgYi9hcmNoL3g4Ni9saWIvY2xlYXJfcGFnZV82NC5TCkBAIC0xLDUgKzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vZHdhcmYyLmg+CisjaW5jbHVkZSA8YXNtL2FsdGVybmF0aXZlLWFzbS5oPgogCiAvKgogICogWmVybyBhIHBhZ2UuIAkKQEAgLTE0LDYgKzE1LDE1IEBACiAJQ0ZJX0VORFBST0MKIEVORFBST0MoY2xlYXJfcGFnZV9jKQogCitFTlRSWShjbGVhcl9wYWdlX2NfZSkKKwlDRklfU1RBUlRQUk9DCisJbW92bCAkNDA5NiwlZWN4CisJeG9ybCAlZWF4LCVlYXgKKwlyZXAgc3Rvc2IKKwlyZXQKKwlDRklfRU5EUFJPQworRU5EUFJPQyhjbGVhcl9wYWdlX2NfZSkKKwogRU5UUlkoY2xlYXJfcGFnZSkKIAlDRklfU1RBUlRQUk9DCiAJeG9ybCAgICVlYXgsJWVheApAQCAtMzgsMjEgKzQ4LDI2IEBACiAuTGNsZWFyX3BhZ2VfZW5kOgogRU5EUFJPQyhjbGVhcl9wYWdlKQogCi0JLyogU29tZSBDUFVzIHJ1biBmYXN0ZXIgdXNpbmcgdGhlIHN0cmluZyBpbnN0cnVjdGlvbnMuCi0JICAgSXQgaXMgYWxzbyBhIGxvdCBzaW1wbGVyLiBVc2UgdGhpcyB3aGVuIHBvc3NpYmxlICovCisJLyoKKwkgKiBTb21lIENQVXMgc3VwcG9ydCBlbmhhbmNlZCBSRVAgTU9WU0IvU1RPU0IgaW5zdHJ1Y3Rpb25zLgorCSAqIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGlzIHdoZW4gcG9zc2libGUuCisJICogSWYgZW5oYW5jZWQgUkVQIE1PVlNCL1NUT1NCIGlzIG5vdCBhdmFpbGFibGUsIHRyeSB0byB1c2UgZmFzdCBzdHJpbmcuCisJICogT3RoZXJ3aXNlLCB1c2Ugb3JpZ2luYWwgZnVuY3Rpb24uCisJICoKKwkgKi8KIAogI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+CiAKIAkuc2VjdGlvbiAuYWx0aW5zdHJfcmVwbGFjZW1lbnQsImF4IgogMToJLmJ5dGUgMHhlYgkJCQkJLyogam1wIDxkaXNwOD4gKi8KIAkuYnl0ZSAoY2xlYXJfcGFnZV9jIC0gY2xlYXJfcGFnZSkgLSAoMmYgLSAxYikJLyogb2Zmc2V0ICovCi0yOgorMjoJLmJ5dGUgMHhlYgkJCQkJLyogam1wIDxkaXNwOD4gKi8KKwkuYnl0ZSAoY2xlYXJfcGFnZV9jX2UgLSBjbGVhcl9wYWdlKSAtICgzZiAtIDJiKQkvKiBvZmZzZXQgKi8KKzM6CiAJLnByZXZpb3VzCiAJLnNlY3Rpb24gLmFsdGluc3RydWN0aW9ucywiYSIKLQkuYWxpZ24gOAotCS5xdWFkIGNsZWFyX3BhZ2UKLQkucXVhZCAxYgotCS53b3JkIFg4Nl9GRUFUVVJFX1JFUF9HT09ECi0JLmJ5dGUgLkxjbGVhcl9wYWdlX2VuZCAtIGNsZWFyX3BhZ2UKLQkuYnl0ZSAyYiAtIDFiCisJYWx0aW5zdHJ1Y3Rpb25fZW50cnkgY2xlYXJfcGFnZSwxYixYODZfRkVBVFVSRV9SRVBfR09PRCxcCisJCQkgICAgIC5MY2xlYXJfcGFnZV9lbmQtY2xlYXJfcGFnZSwgMmItMWIKKwlhbHRpbnN0cnVjdGlvbl9lbnRyeSBjbGVhcl9wYWdlLDJiLFg4Nl9GRUFUVVJFX0VSTVMsICAgXAorCQkJICAgICAuTGNsZWFyX3BhZ2VfZW5kLWNsZWFyX3BhZ2UsM2ItMmIKIAkucHJldmlvdXMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xpYi9jb3B5X3VzZXJfNjQuUyBiL2FyY2gveDg2L2xpYi9jb3B5X3VzZXJfNjQuUwppbmRleCA5OWU0ODI2Li4wMjQ4NDAyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9saWIvY29weV91c2VyXzY0LlMKKysrIGIvYXJjaC94ODYvbGliL2NvcHlfdXNlcl82NC5TCkBAIC0xNSwyMyArMTUsMzAgQEAKICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgorI2luY2x1ZGUgPGFzbS9hbHRlcm5hdGl2ZS1hc20uaD4KIAotCS5tYWNybyBBTFRFUk5BVElWRV9KVU1QIGZlYXR1cmUsb3JpZyxhbHQKKy8qCisgKiBCeSBwbGFjaW5nIGZlYXR1cmUyIGFmdGVyIGZlYXR1cmUxIGluIGFsdGluc3RydWN0aW9ucyBzZWN0aW9uLCB3ZSBsb2dpY2FsbHkKKyAqIGltcGxlbWVudDoKKyAqIElmIENQVSBoYXMgZmVhdHVyZTIsIGptcCB0byBhbHQyIGlzIHVzZWQKKyAqIGVsc2UgaWYgQ1BVIGhhcyBmZWF0dXJlMSwgam1wIHRvIGFsdDEgaXMgdXNlZAorICogZWxzZSBqbXAgdG8gb3JpZyBpcyB1c2VkLgorICovCisJLm1hY3JvIEFMVEVSTkFUSVZFX0pVTVAgZmVhdHVyZTEsZmVhdHVyZTIsb3JpZyxhbHQxLGFsdDIKIDA6CiAJLmJ5dGUgMHhlOQkvKiAzMmJpdCBqdW1wICovCiAJLmxvbmcgXG9yaWctMWYJLyogYnkgZGVmYXVsdCBqdW1wIHRvIG9yaWcgKi8KIDE6CiAJLnNlY3Rpb24gLmFsdGluc3RyX3JlcGxhY2VtZW50LCJheCIKIDI6CS5ieXRlIDB4ZTkJCQkvKiBuZWFyIGp1bXAgd2l0aCAzMmJpdCBpbW1lZGlhdGUgKi8KLQkubG9uZyBcYWx0LTFiIC8qIG9mZnNldCAqLyAgIC8qIG9yIGFsdGVybmF0aXZlbHkgdG8gYWx0ICovCisJLmxvbmcgXGFsdDEtMWIgLyogb2Zmc2V0ICovICAgLyogb3IgYWx0ZXJuYXRpdmVseSB0byBhbHQxICovCiszOgkuYnl0ZSAweGU5CQkJLyogbmVhciBqdW1wIHdpdGggMzJiaXQgaW1tZWRpYXRlICovCisJLmxvbmcgXGFsdDItMWIgLyogb2Zmc2V0ICovICAgLyogb3IgYWx0ZXJuYXRpdmVseSB0byBhbHQyICovCiAJLnByZXZpb3VzCisKIAkuc2VjdGlvbiAuYWx0aW5zdHJ1Y3Rpb25zLCJhIgotCS5hbGlnbiA4Ci0JLnF1YWQgIDBiCi0JLnF1YWQgIDJiCi0JLndvcmQgIFxmZWF0dXJlCQkJLyogd2hlbiBmZWF0dXJlIGlzIHNldCAqLwotCS5ieXRlICA1Ci0JLmJ5dGUgIDUKKwlhbHRpbnN0cnVjdGlvbl9lbnRyeSAwYiwyYixcZmVhdHVyZTEsNSw1CisJYWx0aW5zdHJ1Y3Rpb25fZW50cnkgMGIsM2IsXGZlYXR1cmUyLDUsNQogCS5wcmV2aW91cwogCS5lbmRtCiAKQEAgLTcyLDggKzc5LDEwIEBACiAJYWRkcSAlcmR4LCVyY3gKIAlqYyBiYWRfdG9fdXNlcgogCWNtcHEgVElfYWRkcl9saW1pdCglcmF4KSwlcmN4Ci0JamFlIGJhZF90b191c2VyCi0JQUxURVJOQVRJVkVfSlVNUCBYODZfRkVBVFVSRV9SRVBfR09PRCxjb3B5X3VzZXJfZ2VuZXJpY191bnJvbGxlZCxjb3B5X3VzZXJfZ2VuZXJpY19zdHJpbmcKKwlqYSBiYWRfdG9fdXNlcgorCUFMVEVSTkFUSVZFX0pVTVAgWDg2X0ZFQVRVUkVfUkVQX0dPT0QsWDg2X0ZFQVRVUkVfRVJNUywJXAorCQljb3B5X3VzZXJfZ2VuZXJpY191bnJvbGxlZCxjb3B5X3VzZXJfZ2VuZXJpY19zdHJpbmcsCVwKKwkJY29weV91c2VyX2VuaGFuY2VkX2Zhc3Rfc3RyaW5nCiAJQ0ZJX0VORFBST0MKIEVORFBST0MoX2NvcHlfdG9fdXNlcikKIApAQCAtODUsOCArOTQsMTAgQEAKIAlhZGRxICVyZHgsJXJjeAogCWpjIGJhZF9mcm9tX3VzZXIKIAljbXBxIFRJX2FkZHJfbGltaXQoJXJheCksJXJjeAotCWphZSBiYWRfZnJvbV91c2VyCi0JQUxURVJOQVRJVkVfSlVNUCBYODZfRkVBVFVSRV9SRVBfR09PRCxjb3B5X3VzZXJfZ2VuZXJpY191bnJvbGxlZCxjb3B5X3VzZXJfZ2VuZXJpY19zdHJpbmcKKwlqYSBiYWRfZnJvbV91c2VyCisJQUxURVJOQVRJVkVfSlVNUCBYODZfRkVBVFVSRV9SRVBfR09PRCxYODZfRkVBVFVSRV9FUk1TLAlcCisJCWNvcHlfdXNlcl9nZW5lcmljX3Vucm9sbGVkLGNvcHlfdXNlcl9nZW5lcmljX3N0cmluZywJXAorCQljb3B5X3VzZXJfZW5oYW5jZWRfZmFzdF9zdHJpbmcKIAlDRklfRU5EUFJPQwogRU5EUFJPQyhfY29weV9mcm9tX3VzZXIpCiAKQEAgLTI1NSwzICsyNjYsMzcgQEAKIAkucHJldmlvdXMKIAlDRklfRU5EUFJPQwogRU5EUFJPQyhjb3B5X3VzZXJfZ2VuZXJpY19zdHJpbmcpCisKKy8qCisgKiBTb21lIENQVXMgYXJlIGFkZGluZyBlbmhhbmNlZCBSRVAgTU9WU0IvU1RPU0IgaW5zdHJ1Y3Rpb25zLgorICogSXQncyByZWNvbW1lbmRlZCB0byB1c2UgZW5oYW5jZWQgUkVQIE1PVlNCL1NUT1NCIGlmIGl0J3MgZW5hYmxlZC4KKyAqCisgKiBJbnB1dDoKKyAqIHJkaSBkZXN0aW5hdGlvbgorICogcnNpIHNvdXJjZQorICogcmR4IGNvdW50CisgKgorICogT3V0cHV0OgorICogZWF4IHVuY29waWVkIGJ5dGVzIG9yIDAgaWYgc3VjY2Vzc2Z1bC4KKyAqLworRU5UUlkoY29weV91c2VyX2VuaGFuY2VkX2Zhc3Rfc3RyaW5nKQorCUNGSV9TVEFSVFBST0MKKwlhbmRsICVlZHgsJWVkeAorCWp6IDJmCisJbW92bCAlZWR4LCVlY3gKKzE6CXJlcAorCW1vdnNiCisyOgl4b3JsICVlYXgsJWVheAorCXJldAorCisJLnNlY3Rpb24gLmZpeHVwLCJheCIKKzEyOgltb3ZsICVlY3gsJWVkeAkJLyogZWN4IGlzIHplcm9yZXN0IGFsc28gKi8KKwlqbXAgY29weV91c2VyX2hhbmRsZV90YWlsCisJLnByZXZpb3VzCisKKwkuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIgorCS5hbGlnbiA4CisJLnF1YWQgMWIsMTJiCisJLnByZXZpb3VzCisJQ0ZJX0VORFBST0MKK0VORFBST0MoY29weV91c2VyX2VuaGFuY2VkX2Zhc3Rfc3RyaW5nKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGliL21lbWNweV82NC5TIGIvYXJjaC94ODYvbGliL21lbWNweV82NC5TCmluZGV4IDc1ZWY2MWUuLmVmYmYyYTAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2xpYi9tZW1jcHlfNjQuUworKysgYi9hcmNoL3g4Ni9saWIvbWVtY3B5XzY0LlMKQEAgLTQsNiArNCw3IEBACiAKICNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgogI2luY2x1ZGUgPGFzbS9kd2FyZjIuaD4KKyNpbmNsdWRlIDxhc20vYWx0ZXJuYXRpdmUtYXNtLmg+CiAKIC8qCiAgKiBtZW1jcHkgLSBDb3B5IGEgbWVtb3J5IGJsb2NrLgpAQCAtMzcsNiArMzgsMjMgQEAKIC5MbWVtY3B5X2U6CiAJLnByZXZpb3VzCiAKKy8qCisgKiBtZW1jcHlfY19lKCkgLSBlbmhhbmNlZCBmYXN0IHN0cmluZyBtZW1jcHkuIFRoaXMgaXMgZmFzdGVyIGFuZCBzaW1wbGVyIHRoYW4KKyAqIG1lbWNweV9jLiBVc2UgbWVtY3B5X2NfZSB3aGVuIHBvc3NpYmxlLgorICoKKyAqIFRoaXMgZ2V0cyBwYXRjaGVkIG92ZXIgdGhlIHVucm9sbGVkIHZhcmlhbnQgKGJlbG93KSB2aWEgdGhlCisgKiBhbHRlcm5hdGl2ZSBpbnN0cnVjdGlvbnMgZnJhbWV3b3JrOgorICovCisJLnNlY3Rpb24gLmFsdGluc3RyX3JlcGxhY2VtZW50LCAiYXgiLCBAcHJvZ2JpdHMKKy5MbWVtY3B5X2NfZToKKwltb3ZxICVyZGksICVyYXgKKworCW1vdmwgJWVkeCwgJWVjeAorCXJlcCBtb3ZzYgorCXJldAorLkxtZW1jcHlfZV9lOgorCS5wcmV2aW91cworCiBFTlRSWShfX21lbWNweSkKIEVOVFJZKG1lbWNweSkKIAlDRklfU1RBUlRQUk9DCkBAIC00OSw3ICs2Nyw3IEBACiAJamIgLkxoYW5kbGVfdGFpbAogCiAJLyoKLQkgKiBXZSBjaGVjayB3aGV0aGVyIG1lbW9yeSBmYWxzZSBkZXBlbmRlY2UgY291bGQgb2NjdXIsCisJICogV2UgY2hlY2sgd2hldGhlciBtZW1vcnkgZmFsc2UgZGVwZW5kZW5jZSBjb3VsZCBvY2N1ciwKIAkgKiB0aGVuIGp1bXAgdG8gY29ycmVzcG9uZGluZyBjb3B5IG1vZGUuCiAJICovCiAJY21wICAlZGlsLCAlc2lsCkBAIC0xNzEsMjEgKzE4OSwyMiBAQAogRU5EUFJPQyhfX21lbWNweSkKIAogCS8qCi0JICogU29tZSBDUFVzIHJ1biBmYXN0ZXIgdXNpbmcgdGhlIHN0cmluZyBjb3B5IGluc3RydWN0aW9ucy4KLQkgKiBJdCBpcyBhbHNvIGEgbG90IHNpbXBsZXIuIFVzZSB0aGlzIHdoZW4gcG9zc2libGU6Ci0JICovCi0KLQkuc2VjdGlvbiAuYWx0aW5zdHJ1Y3Rpb25zLCAiYSIKLQkuYWxpZ24gOAotCS5xdWFkIG1lbWNweQotCS5xdWFkIC5MbWVtY3B5X2MKLQkud29yZCBYODZfRkVBVFVSRV9SRVBfR09PRAotCi0JLyoKKwkgKiBTb21lIENQVXMgYXJlIGFkZGluZyBlbmhhbmNlZCBSRVAgTU9WU0IvU1RPU0IgZmVhdHVyZQorCSAqIElmIHRoZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCwgbWVtY3B5X2NfZSgpIGlzIHRoZSBmaXJzdCBjaG9pY2UuCisJICogSWYgZW5oYW5jZWQgcmVwIG1vdnNiIGNvcHkgaXMgbm90IGF2YWlsYWJsZSwgdXNlIGZhc3Qgc3RyaW5nIGNvcHkKKwkgKiBtZW1jcHlfYygpIHdoZW4gcG9zc2libGUuIFRoaXMgaXMgZmFzdGVyIGFuZCBjb2RlIGlzIHNpbXBsZXIgdGhhbgorCSAqIG9yaWdpbmFsIG1lbWNweSgpLgorCSAqIE90aGVyd2lzZSwgb3JpZ2luYWwgbWVtY3B5KCkgaXMgdXNlZC4KKwkgKiBJbiAuYWx0aW5zdHJ1Y3Rpb25zIHNlY3Rpb24sIEVSTVMgZmVhdHVyZSBpcyBwbGFjZWQgYWZ0ZXIgUkVHX0dPT0QKKyAgICAgICAgICogZmVhdHVyZSB0byBpbXBsZW1lbnQgdGhlIHJpZ2h0IHBhdGNoIG9yZGVyLgorCSAqCiAJICogUmVwbGFjZSBvbmx5IGJlZ2lubmluZywgbWVtY3B5IGlzIHVzZWQgdG8gYXBwbHkgYWx0ZXJuYXRpdmVzLAogCSAqIHNvIGl0IGlzIHNpbGx5IHRvIG92ZXJ3cml0ZSBpdHNlbGYgd2l0aCBub3BzIC0gcmVib290IGlzIHRoZQogCSAqIG9ubHkgb3V0Y29tZS4uLgogCSAqLwotCS5ieXRlIC5MbWVtY3B5X2UgLSAuTG1lbWNweV9jCi0JLmJ5dGUgLkxtZW1jcHlfZSAtIC5MbWVtY3B5X2MKKwkuc2VjdGlvbiAuYWx0aW5zdHJ1Y3Rpb25zLCAiYSIKKwlhbHRpbnN0cnVjdGlvbl9lbnRyeSBtZW1jcHksLkxtZW1jcHlfYyxYODZfRkVBVFVSRV9SRVBfR09PRCxcCisJCQkgICAgIC5MbWVtY3B5X2UtLkxtZW1jcHlfYywuTG1lbWNweV9lLS5MbWVtY3B5X2MKKwlhbHRpbnN0cnVjdGlvbl9lbnRyeSBtZW1jcHksLkxtZW1jcHlfY19lLFg4Nl9GRUFUVVJFX0VSTVMsIFwKKwkJCSAgICAgLkxtZW1jcHlfZV9lLS5MbWVtY3B5X2NfZSwuTG1lbWNweV9lX2UtLkxtZW1jcHlfY19lCiAJLnByZXZpb3VzCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9saWIvbWVtbW92ZV82NC5TIGIvYXJjaC94ODYvbGliL21lbW1vdmVfNjQuUwppbmRleCAwZWNiODQzLi5kMGVjOWMyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9saWIvbWVtbW92ZV82NC5TCisrKyBiL2FyY2gveDg2L2xpYi9tZW1tb3ZlXzY0LlMKQEAgLTgsNiArOCw3IEBACiAjZGVmaW5lIF9TVFJJTkdfQwogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vZHdhcmYyLmg+CisjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KIAogI3VuZGVmIG1lbW1vdmUKIApAQCAtMjQsNiArMjUsNyBAQAogICovCiBFTlRSWShtZW1tb3ZlKQogCUNGSV9TVEFSVFBST0MKKwogCS8qIEhhbmRsZSBtb3JlIDMyYnl0ZXMgaW4gbG9vcCAqLwogCW1vdiAlcmRpLCAlcmF4CiAJY21wICQweDIwLCAlcmR4CkBAIC0zMSw4ICszMywxMyBAQAogCiAJLyogRGVjaWRlIGZvcndhcmQvYmFja3dhcmQgY29weSBtb2RlICovCiAJY21wICVyZGksICVyc2kKLQlqYgkyZgorCWpnZSAuTG1lbW1vdmVfYmVnaW5fZm9yd2FyZAorCW1vdiAlcnNpLCAlcjgKKwlhZGQgJXJkeCwgJXI4CisJY21wICVyZGksICVyOAorCWpnIDJmCiAKKy5MbWVtbW92ZV9iZWdpbl9mb3J3YXJkOgogCS8qCiAJICogbW92c3EgaW5zdHJ1Y3Rpb24gaGF2ZSBtYW55IHN0YXJ0dXAgbGF0ZW5jeQogCSAqIHNvIHdlIGhhbmRsZSBzbWFsbCBzaXplIGJ5IGdlbmVyYWwgcmVnaXN0ZXIuCkBAIC03OCw2ICs4NSw4IEBACiAJcmVwIG1vdnNxCiAJbW92cSAlcjExLCAoJXIxMCkKIAlqbXAgMTNmCisuTG1lbW1vdmVfZW5kX2ZvcndhcmQ6CisKIAkvKgogCSAqIEhhbmRsZSBkYXRhIGJhY2t3YXJkIGJ5IG1vdnNxLgogCSAqLwpAQCAtMTk0LDQgKzIwMywyMiBAQAogMTM6CiAJcmV0cQogCUNGSV9FTkRQUk9DCisKKwkuc2VjdGlvbiAuYWx0aW5zdHJfcmVwbGFjZW1lbnQsImF4IgorLkxtZW1tb3ZlX2JlZ2luX2ZvcndhcmRfZWZzOgorCS8qIEZvcndhcmQgbW92aW5nIGRhdGEuICovCisJbW92cSAlcmR4LCAlcmN4CisJcmVwIG1vdnNiCisJcmV0cQorLkxtZW1tb3ZlX2VuZF9mb3J3YXJkX2VmczoKKwkucHJldmlvdXMKKworCS5zZWN0aW9uIC5hbHRpbnN0cnVjdGlvbnMsImEiCisJLmFsaWduIDgKKwkucXVhZCAuTG1lbW1vdmVfYmVnaW5fZm9yd2FyZAorCS5xdWFkIC5MbWVtbW92ZV9iZWdpbl9mb3J3YXJkX2VmcworCS53b3JkIFg4Nl9GRUFUVVJFX0VSTVMKKwkuYnl0ZSAuTG1lbW1vdmVfZW5kX2ZvcndhcmQtLkxtZW1tb3ZlX2JlZ2luX2ZvcndhcmQKKwkuYnl0ZSAuTG1lbW1vdmVfZW5kX2ZvcndhcmRfZWZzLS5MbWVtbW92ZV9iZWdpbl9mb3J3YXJkX2VmcworCS5wcmV2aW91cwogRU5EUFJPQyhtZW1tb3ZlKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGliL21lbXNldF82NC5TIGIvYXJjaC94ODYvbGliL21lbXNldF82NC5TCmluZGV4IDA5ZDM0NDIuLjc5YmQ0NTQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2xpYi9tZW1zZXRfNjQuUworKysgYi9hcmNoL3g4Ni9saWIvbWVtc2V0XzY0LlMKQEAgLTIsOSArMiwxMyBAQAogCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGFzbS9kd2FyZjIuaD4KKyNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgorI2luY2x1ZGUgPGFzbS9hbHRlcm5hdGl2ZS1hc20uaD4KIAogLyoKLSAqIElTTyBDIG1lbXNldCAtIHNldCBhIG1lbW9yeSBibG9jayB0byBhIGJ5dGUgdmFsdWUuCisgKiBJU08gQyBtZW1zZXQgLSBzZXQgYSBtZW1vcnkgYmxvY2sgdG8gYSBieXRlIHZhbHVlLiBUaGlzIGZ1bmN0aW9uIHVzZXMgZmFzdAorICogc3RyaW5nIHRvIGdldCBiZXR0ZXIgcGVyZm9ybWFuY2UgdGhhbiB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uIFRoZSBjb2RlIGlzCisgKiBzaW1wbGVyIGFuZCBzaG9ydGVyIHRoYW4gdGhlIG9yaWduYWwgZnVuY3Rpb24gYXMgd2VsbC4KICAqCQogICogcmRpICAgZGVzdGluYXRpb24KICAqIHJzaSAgIHZhbHVlIChjaGFyKSAKQEAgLTMxLDYgKzM1LDI4IEBACiAuTG1lbXNldF9lOgogCS5wcmV2aW91cwogCisvKgorICogSVNPIEMgbWVtc2V0IC0gc2V0IGEgbWVtb3J5IGJsb2NrIHRvIGEgYnl0ZSB2YWx1ZS4gVGhpcyBmdW5jdGlvbiB1c2VzCisgKiBlbmhhbmNlZCByZXAgc3Rvc2IgdG8gb3ZlcnJpZGUgdGhlIGZhc3Qgc3RyaW5nIGZ1bmN0aW9uLgorICogVGhlIGNvZGUgaXMgc2ltcGxlciBhbmQgc2hvcnRlciB0aGFuIHRoZSBmYXN0IHN0cmluZyBmdW5jdGlvbiBhcyB3ZWxsLgorICoKKyAqIHJkaSAgIGRlc3RpbmF0aW9uCisgKiByc2kgICB2YWx1ZSAoY2hhcikKKyAqIHJkeCAgIGNvdW50IChieXRlcykKKyAqCisgKiByYXggICBvcmlnaW5hbCBkZXN0aW5hdGlvbgorICovCisJLnNlY3Rpb24gLmFsdGluc3RyX3JlcGxhY2VtZW50LCAiYXgiLCBAcHJvZ2JpdHMKKy5MbWVtc2V0X2NfZToKKwltb3ZxICVyZGksJXI5CisJbW92YiAlc2lsLCVhbAorCW1vdmwgJWVkeCwlZWN4CisJcmVwIHN0b3NiCisJbW92cSAlcjksJXJheAorCXJldAorLkxtZW1zZXRfZV9lOgorCS5wcmV2aW91cworCiBFTlRSWShtZW1zZXQpCiBFTlRSWShfX21lbXNldCkKIAlDRklfU1RBUlRQUk9DCkBAIC0xMTIsMTYgKzEzOCwyMCBAQAogRU5EUFJPQyhtZW1zZXQpCiBFTkRQUk9DKF9fbWVtc2V0KQogCi0JLyogU29tZSBDUFVzIHJ1biBmYXN0ZXIgdXNpbmcgdGhlIHN0cmluZyBpbnN0cnVjdGlvbnMuCi0JICAgSXQgaXMgYWxzbyBhIGxvdCBzaW1wbGVyLiBVc2UgdGhpcyB3aGVuIHBvc3NpYmxlICovCi0KLSNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgotCisJLyogU29tZSBDUFVzIHN1cHBvcnQgZW5oYW5jZWQgUkVQIE1PVlNCL1NUT1NCIGZlYXR1cmUuCisJICogSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHRoaXMgd2hlbiBwb3NzaWJsZS4KKwkgKgorCSAqIElmIGVuaGFuY2VkIFJFUCBNT1ZTQi9TVE9TQiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUsIHVzZSBmYXN0IHN0cmluZworCSAqIGluc3RydWN0aW9ucy4KKwkgKgorCSAqIE90aGVyd2lzZSwgdXNlIG9yaWdpbmFsIG1lbXNldCBmdW5jdGlvbi4KKwkgKgorCSAqIEluIC5hbHRpbnN0cnVjdGlvbnMgc2VjdGlvbiwgRVJNUyBmZWF0dXJlIGlzIHBsYWNlZCBhZnRlciBSRUdfR09PRAorICAgICAgICAgKiBmZWF0dXJlIHRvIGltcGxlbWVudCB0aGUgcmlnaHQgcGF0Y2ggb3JkZXIuCisJICovCiAJLnNlY3Rpb24gLmFsdGluc3RydWN0aW9ucywiYSIKLQkuYWxpZ24gOAotCS5xdWFkIG1lbXNldAotCS5xdWFkIC5MbWVtc2V0X2MKLQkud29yZCBYODZfRkVBVFVSRV9SRVBfR09PRAotCS5ieXRlIC5MZmluYWwgLSBtZW1zZXQKLQkuYnl0ZSAuTG1lbXNldF9lIC0gLkxtZW1zZXRfYworCWFsdGluc3RydWN0aW9uX2VudHJ5IG1lbXNldCwuTG1lbXNldF9jLFg4Nl9GRUFUVVJFX1JFUF9HT09ELFwKKwkJCSAgICAgLkxmaW5hbC1tZW1zZXQsLkxtZW1zZXRfZS0uTG1lbXNldF9jCisJYWx0aW5zdHJ1Y3Rpb25fZW50cnkgbWVtc2V0LC5MbWVtc2V0X2NfZSxYODZfRkVBVFVSRV9FUk1TLCBcCisJCQkgICAgIC5MZmluYWwtbWVtc2V0LC5MbWVtc2V0X2VfZS0uTG1lbXNldF9jX2UKIAkucHJldmlvdXMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL01ha2VmaWxlIGIvYXJjaC94ODYvbW0vTWFrZWZpbGUKaW5kZXggM2U2MDhlZC4uM2QxMTMyNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vTWFrZWZpbGUKKysrIGIvYXJjaC94ODYvbW0vTWFrZWZpbGUKQEAgLTIzLDggKzIzLDggQEAKIG9iai0kKENPTkZJR19NTUlPVFJBQ0VfVEVTVCkJKz0gdGVzdG1taW90cmFjZS5vCiAKIG9iai0kKENPTkZJR19OVU1BKQkJKz0gbnVtYS5vIG51bWFfJChCSVRTKS5vCi1vYmotJChDT05GSUdfQU1EX05VTUEpCQkrPSBhbWR0b3BvbG9neV82NC5vCi1vYmotJChDT05GSUdfQUNQSV9OVU1BKQkJKz0gc3JhdF8kKEJJVFMpLm8KK29iai0kKENPTkZJR19BTURfTlVNQSkJCSs9IGFtZHRvcG9sb2d5Lm8KK29iai0kKENPTkZJR19BQ1BJX05VTUEpCQkrPSBzcmF0Lm8KIG9iai0kKENPTkZJR19OVU1BX0VNVSkJCSs9IG51bWFfZW11bGF0aW9uLm8KIAogb2JqLSQoQ09ORklHX0hBVkVfTUVNQkxPQ0spCQkrPSBtZW1ibG9jay5vCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9hbWR0b3BvbG9neV82NC5jIGIvYXJjaC94ODYvbW0vYW1kdG9wb2xvZ3kuYwpzaW1pbGFyaXR5IGluZGV4IDg5JQpyZW5hbWUgZnJvbSBhcmNoL3g4Ni9tbS9hbWR0b3BvbG9neV82NC5jCnJlbmFtZSB0byBhcmNoL3g4Ni9tbS9hbWR0b3BvbG9neS5jCmluZGV4IDA5MTljMjYuLjUyNDdkMDEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2FtZHRvcG9sb2d5XzY0LmMKKysrIGIvYXJjaC94ODYvbW0vYW1kdG9wb2xvZ3kuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CkBAIC02OSwxMCArNzAsMTAgQEAKIAogaW50IF9faW5pdCBhbWRfbnVtYV9pbml0KHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBzdGFydCA9IFBGTl9QSFlTKDApOwotCXVuc2lnbmVkIGxvbmcgZW5kID0gUEZOX1BIWVMobWF4X3Bmbik7CisJdTY0IHN0YXJ0ID0gUEZOX1BIWVMoMCk7CisJdTY0IGVuZCA9IFBGTl9QSFlTKG1heF9wZm4pOwogCXVuc2lnbmVkIG51bW5vZGVzOwotCXVuc2lnbmVkIGxvbmcgcHJldmJhc2U7CisJdTY0IHByZXZiYXNlOwogCWludCBpLCBqLCBuYjsKIAl1MzIgbm9kZWlkLCByZWc7CiAJdW5zaWduZWQgaW50IGJpdHMsIGNvcmVzLCBhcGljaWRfYmFzZTsKQEAgLTk1LDcgKzk2LDcgQEAKIAogCXByZXZiYXNlID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgYmFzZSwgbGltaXQ7CisJCXU2NCBiYXNlLCBsaW1pdDsKIAogCQliYXNlID0gcmVhZF9wY2lfY29uZmlnKDAsIG5iLCAxLCAweDQwICsgaSo4KTsKIAkJbGltaXQgPSByZWFkX3BjaV9jb25maWcoMCwgbmIsIDEsIDB4NDQgKyBpKjgpOwpAQCAtMTA3LDE4ICsxMDgsMTggQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWlmIChub2RlaWQgPj0gbnVtbm9kZXMpIHsKLQkJCXByX2luZm8oIklnbm9yaW5nIGV4Y2VzcyBub2RlICVkICglbHg6JWx4KVxuIiwgbm9kZWlkLAorCQkJcHJfaW5mbygiSWdub3JpbmcgZXhjZXNzIG5vZGUgJWQgKCVMeDolTHgpXG4iLCBub2RlaWQsCiAJCQkJYmFzZSwgbGltaXQpOwogCQkJY29udGludWU7CiAJCX0KIAogCQlpZiAoIWxpbWl0KSB7Ci0JCQlwcl9pbmZvKCJTa2lwcGluZyBub2RlIGVudHJ5ICVkIChiYXNlICVseClcbiIsCisJCQlwcl9pbmZvKCJTa2lwcGluZyBub2RlIGVudHJ5ICVkIChiYXNlICVMeClcbiIsCiAJCQkJaSwgYmFzZSk7CiAJCQljb250aW51ZTsKIAkJfQogCQlpZiAoKGJhc2UgPj4gOCkgJiAzIHx8IChsaW1pdCA+PiA4KSAmIDMpIHsKLQkJCXByX2VycigiTm9kZSAlZCB1c2luZyBpbnRlcmxlYXZpbmcgbW9kZSAlbHgvJWx4XG4iLAorCQkJcHJfZXJyKCJOb2RlICVkIHVzaW5nIGludGVybGVhdmluZyBtb2RlICVMeC8lTHhcbiIsCiAJCQkgICAgICAgbm9kZWlkLCAoYmFzZSA+PiA4KSAmIDMsIChsaW1pdCA+PiA4KSAmIDMpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTE1MCwxOSArMTUxLDE5IEBACiAJCQljb250aW51ZTsKIAkJfQogCQlpZiAobGltaXQgPCBiYXNlKSB7Ci0JCQlwcl9lcnIoIk5vZGUgJWQgYm9ndXMgc2V0dGluZ3MgJWx4LSVseC5cbiIsCisJCQlwcl9lcnIoIk5vZGUgJWQgYm9ndXMgc2V0dGluZ3MgJUx4LSVMeC5cbiIsCiAJCQkgICAgICAgbm9kZWlkLCBiYXNlLCBsaW1pdCk7CiAJCQljb250aW51ZTsKIAkJfQogCiAJCS8qIENvdWxkIHNvcnQgaGVyZSwgYnV0IHB1biBmb3Igbm93LiBTaG91bGQgbm90IGhhcHBlbiBhbnlyb2Fkcy4gKi8KIAkJaWYgKHByZXZiYXNlID4gYmFzZSkgewotCQkJcHJfZXJyKCJOb2RlIG1hcCBub3Qgc29ydGVkICVseCwlbHhcbiIsCisJCQlwcl9lcnIoIk5vZGUgbWFwIG5vdCBzb3J0ZWQgJUx4LCVMeFxuIiwKIAkJCSAgICAgICBwcmV2YmFzZSwgYmFzZSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCi0JCXByX2luZm8oIk5vZGUgJWQgTWVtQmFzZSAlMDE2bHggTGltaXQgJTAxNmx4XG4iLAorCQlwcl9pbmZvKCJOb2RlICVkIE1lbUJhc2UgJTAxNkx4IExpbWl0ICUwMTZMeFxuIiwKIAkJCW5vZGVpZCwgYmFzZSwgbGltaXQpOwogCiAJCXByZXZiYXNlID0gYmFzZTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2luaXRfMzIuYyBiL2FyY2gveDg2L21tL2luaXRfMzIuYwppbmRleCA4MDA4OGY5Li4yOWY3YzZkOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vaW5pdF8zMi5jCisrKyBiL2FyY2gveDg2L21tL2luaXRfMzIuYwpAQCAtNjc4LDggKzY3OCwxMCBAQAogewogCXVuc2lnbmVkIGxvbmcgbWF4X3pvbmVfcGZuc1tNQVhfTlJfWk9ORVNdOwogCW1lbXNldChtYXhfem9uZV9wZm5zLCAwLCBzaXplb2YobWF4X3pvbmVfcGZucykpOworI2lmZGVmIENPTkZJR19aT05FX0RNQQogCW1heF96b25lX3BmbnNbWk9ORV9ETUFdID0KIAkJdmlydF90b19waHlzKChjaGFyICopTUFYX0RNQV9BRERSRVNTKSA+PiBQQUdFX1NISUZUOworI2VuZGlmCiAJbWF4X3pvbmVfcGZuc1taT05FX05PUk1BTF0gPSBtYXhfbG93X3BmbjsKICNpZmRlZiBDT05GSUdfSElHSE1FTQogCW1heF96b25lX3BmbnNbWk9ORV9ISUdITUVNXSA9IGhpZ2hlbmRfcGZuOwpAQCAtNzE2LDYgKzcxOCw3IEBACiAJICogTk9URTogYXQgdGhpcyBwb2ludCB0aGUgYm9vdG1lbSBhbGxvY2F0b3IgaXMgZnVsbHkgYXZhaWxhYmxlLgogCSAqLwogCW9scGNfZHRfYnVpbGRfZGV2aWNldHJlZSgpOworCXNwYXJzZV9tZW1vcnlfcHJlc2VudF93aXRoX2FjdGl2ZV9yZWdpb25zKE1BWF9OVU1OT0RFUyk7CiAJc3BhcnNlX2luaXQoKTsKIAl6b25lX3NpemVzX2luaXQoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2luaXRfNjQuYyBiL2FyY2gveDg2L21tL2luaXRfNjQuYwppbmRleCA3OTQyMzM1Li5kODY1YzRhZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vaW5pdF82NC5jCisrKyBiL2FyY2gveDg2L21tL2luaXRfNjQuYwpAQCAtNjE2LDcgKzYxNiw5IEBACiAJdW5zaWduZWQgbG9uZyBtYXhfem9uZV9wZm5zW01BWF9OUl9aT05FU107CiAKIAltZW1zZXQobWF4X3pvbmVfcGZucywgMCwgc2l6ZW9mKG1heF96b25lX3BmbnMpKTsKKyNpZmRlZiBDT05GSUdfWk9ORV9ETUEKIAltYXhfem9uZV9wZm5zW1pPTkVfRE1BXSA9IE1BWF9ETUFfUEZOOworI2VuZGlmCiAJbWF4X3pvbmVfcGZuc1taT05FX0RNQTMyXSA9IE1BWF9ETUEzMl9QRk47CiAJbWF4X3pvbmVfcGZuc1taT05FX05PUk1BTF0gPSBtYXhfcGZuOwogCkBAIC02NzksMTQgKzY4MSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhcmNoX2FkZF9tZW1vcnkpOwogCi0jaWYgIWRlZmluZWQoQ09ORklHX0FDUElfTlVNQSkgJiYgZGVmaW5lZChDT05GSUdfTlVNQSkKLWludCBtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZCh1NjQgc3RhcnQpCi17Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZCk7Ci0jZW5kaWYKLQogI2VuZGlmIC8qIENPTkZJR19NRU1PUllfSE9UUExVRyAqLwogCiBzdGF0aWMgc3RydWN0IGtjb3JlX2xpc3Qga2NvcmVfdnN5c2NhbGw7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9pb3JlbWFwLmMgYi9hcmNoL3g4Ni9tbS9pb3JlbWFwLmMKaW5kZXggMDM2OTg0My4uYmUxZWY1NyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vaW9yZW1hcC5jCisrKyBiL2FyY2gveDg2L21tL2lvcmVtYXAuYwpAQCAtOTEsMTMgKzkxLDYgQEAKIAkJcmV0dXJuIChfX2ZvcmNlIHZvaWQgX19pb21lbSAqKXBoeXNfdG9fdmlydChwaHlzX2FkZHIpOwogCiAJLyoKLQkgKiBDaGVjayBpZiB0aGUgcmVxdWVzdCBzcGFucyBtb3JlIHRoYW4gYW55IEJBUiBpbiB0aGUgaW9tZW0gcmVzb3VyY2UKLQkgKiB0cmVlLgotCSAqLwotCVdBUk5fT05DRShpb21lbV9tYXBfc2FuaXR5X2NoZWNrKHBoeXNfYWRkciwgc2l6ZSksCi0JCSAgS0VSTl9JTkZPICJJbmZvOiBtYXBwaW5nIG11bHRpcGxlIEJBUnMuIFlvdXIga2VybmVsIGlzIGZpbmUuIik7Ci0KLQkvKgogCSAqIERvbid0IGFsbG93IGFueWJvZHkgdG8gcmVtYXAgbm9ybWFsIFJBTSB0aGF0IHdlJ3JlIHVzaW5nLi4KIAkgKi8KIAlsYXN0X3BmbiA9IGxhc3RfYWRkciA+PiBQQUdFX1NISUZUOwpAQCAtMTcwLDYgKzE2MywxMyBAQAogCXJldF9hZGRyID0gKHZvaWQgX19pb21lbSAqKSAodmFkZHIgKyBvZmZzZXQpOwogCW1taW90cmFjZV9pb3JlbWFwKHVuYWxpZ25lZF9waHlzX2FkZHIsIHVuYWxpZ25lZF9zaXplLCByZXRfYWRkcik7CiAKKwkvKgorCSAqIENoZWNrIGlmIHRoZSByZXF1ZXN0IHNwYW5zIG1vcmUgdGhhbiBhbnkgQkFSIGluIHRoZSBpb21lbSByZXNvdXJjZQorCSAqIHRyZWUuCisJICovCisJV0FSTl9PTkNFKGlvbWVtX21hcF9zYW5pdHlfY2hlY2sodW5hbGlnbmVkX3BoeXNfYWRkciwgdW5hbGlnbmVkX3NpemUpLAorCQkgIEtFUk5fSU5GTyAiSW5mbzogbWFwcGluZyBtdWx0aXBsZSBCQVJzLiBZb3VyIGtlcm5lbCBpcyBmaW5lLiIpOworCiAJcmV0dXJuIHJldF9hZGRyOwogZXJyX2ZyZWVfYXJlYToKIAlmcmVlX3ZtX2FyZWEoYXJlYSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9udW1hLmMgYi9hcmNoL3g4Ni9tbS9udW1hLmMKaW5kZXggNzQ1MjU4ZC4uZjU1MTBkOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vbnVtYS5jCisrKyBiL2FyY2gveDg2L21tL251bWEuYwpAQCAtMSwxMSArMSwzOSBAQAogLyogQ29tbW9uIGNvZGUgZm9yIDMyIGFuZCA2NC1iaXQgTlVNQSAqLwotI2luY2x1ZGUgPGxpbnV4L3RvcG9sb2d5Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgotI2luY2x1ZGUgPGFzbS9udW1hLmg+CisjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90b3BvbG9neS5oPgorCisjaW5jbHVkZSA8YXNtL2U4MjAuaD4KKyNpbmNsdWRlIDxhc20vcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2FjcGkuaD4KKyNpbmNsdWRlIDxhc20vYW1kX25iLmg+CisKKyNpbmNsdWRlICJudW1hX2ludGVybmFsLmgiCiAKIGludCBfX2luaXRkYXRhIG51bWFfb2ZmOworbm9kZW1hc2tfdCBudW1hX25vZGVzX3BhcnNlZCBfX2luaXRkYXRhOworCitzdHJ1Y3QgcGdsaXN0X2RhdGEgKm5vZGVfZGF0YVtNQVhfTlVNTk9ERVNdIF9fcmVhZF9tb3N0bHk7CitFWFBPUlRfU1lNQk9MKG5vZGVfZGF0YSk7CisKK3N0YXRpYyBzdHJ1Y3QgbnVtYV9tZW1pbmZvIG51bWFfbWVtaW5mbworI2lmbmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUcKK19faW5pdGRhdGEKKyNlbmRpZgorOworCitzdGF0aWMgaW50IG51bWFfZGlzdGFuY2VfY250Oworc3RhdGljIHU4ICpudW1hX2Rpc3RhbmNlOwogCiBzdGF0aWMgX19pbml0IGludCBudW1hX3NldHVwKGNoYXIgKm9wdCkKIHsKQEAgLTMyLDYgKzYwLDE1IEBACiAJWzAgLi4uIE1BWF9MT0NBTF9BUElDLTFdID0gTlVNQV9OT19OT0RFCiB9OwogCitpbnQgX19jcHVpbml0IG51bWFfY3B1X25vZGUoaW50IGNwdSkKK3sKKwlpbnQgYXBpY2lkID0gZWFybHlfcGVyX2NwdSh4ODZfY3B1X3RvX2FwaWNpZCwgY3B1KTsKKworCWlmIChhcGljaWQgIT0gQkFEX0FQSUNJRCkKKwkJcmV0dXJuIF9fYXBpY2lkX3RvX25vZGVbYXBpY2lkXTsKKwlyZXR1cm4gTlVNQV9OT19OT0RFOworfQorCiBjcHVtYXNrX3Zhcl90IG5vZGVfdG9fY3B1bWFza19tYXBbTUFYX05VTU5PREVTXTsKIEVYUE9SVF9TWU1CT0wobm9kZV90b19jcHVtYXNrX21hcCk7CiAKQEAgLTk1LDYgKzEzMiw0MDcgQEAKIAlwcl9kZWJ1ZygiTm9kZSB0byBjcHVtYXNrIG1hcCBmb3IgJWQgbm9kZXNcbiIsIG5yX25vZGVfaWRzKTsKIH0KIAorc3RhdGljIGludCBfX2luaXQgbnVtYV9hZGRfbWVtYmxrX3RvKGludCBuaWQsIHU2NCBzdGFydCwgdTY0IGVuZCwKKwkJCQkgICAgIHN0cnVjdCBudW1hX21lbWluZm8gKm1pKQoreworCS8qIGlnbm9yZSB6ZXJvIGxlbmd0aCBibGtzICovCisJaWYgKHN0YXJ0ID09IGVuZCkKKwkJcmV0dXJuIDA7CisKKwkvKiB3aGluZSBhYm91dCBhbmQgaWdub3JlIGludmFsaWQgYmxrcyAqLworCWlmIChzdGFydCA+IGVuZCB8fCBuaWQgPCAwIHx8IG5pZCA+PSBNQVhfTlVNTk9ERVMpIHsKKwkJcHJfd2FybmluZygiTlVNQTogV2FybmluZzogaW52YWxpZCBtZW1ibGsgbm9kZSAlZCAoJUx4LSVMeClcbiIsCisJCQkgICBuaWQsIHN0YXJ0LCBlbmQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobWktPm5yX2Jsa3MgPj0gTlJfTk9ERV9NRU1CTEtTKSB7CisJCXByX2VycigiTlVNQTogdG9vIG1hbnkgbWVtYmxrIHJhbmdlc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1pLT5ibGtbbWktPm5yX2Jsa3NdLnN0YXJ0ID0gc3RhcnQ7CisJbWktPmJsa1ttaS0+bnJfYmxrc10uZW5kID0gZW5kOworCW1pLT5ibGtbbWktPm5yX2Jsa3NdLm5pZCA9IG5pZDsKKwltaS0+bnJfYmxrcysrOworCXJldHVybiAwOworfQorCisvKioKKyAqIG51bWFfcmVtb3ZlX21lbWJsa19mcm9tIC0gUmVtb3ZlIG9uZSBudW1hX21lbWJsayBmcm9tIGEgbnVtYV9tZW1pbmZvCisgKiBAaWR4OiBJbmRleCBvZiBtZW1ibGsgdG8gcmVtb3ZlCisgKiBAbWk6IG51bWFfbWVtaW5mbyB0byByZW1vdmUgbWVtYmxrIGZyb20KKyAqCisgKiBSZW1vdmUgQGlkeCd0aCBudW1hX21lbWJsayBmcm9tIEBtaSBieSBzaGlmdGluZyBAbWktPmJsa1tdIGFuZAorICogZGVjcmVtZW50aW5nIEBtaS0+bnJfYmxrcy4KKyAqLwordm9pZCBfX2luaXQgbnVtYV9yZW1vdmVfbWVtYmxrX2Zyb20oaW50IGlkeCwgc3RydWN0IG51bWFfbWVtaW5mbyAqbWkpCit7CisJbWktPm5yX2Jsa3MtLTsKKwltZW1tb3ZlKCZtaS0+YmxrW2lkeF0sICZtaS0+YmxrW2lkeCArIDFdLAorCQkobWktPm5yX2Jsa3MgLSBpZHgpICogc2l6ZW9mKG1pLT5ibGtbMF0pKTsKK30KKworLyoqCisgKiBudW1hX2FkZF9tZW1ibGsgLSBBZGQgb25lIG51bWFfbWVtYmxrIHRvIG51bWFfbWVtaW5mbworICogQG5pZDogTlVNQSBub2RlIElEIG9mIHRoZSBuZXcgbWVtYmxrCisgKiBAc3RhcnQ6IFN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG5ldyBtZW1ibGsKKyAqIEBlbmQ6IEVuZCBhZGRyZXNzIG9mIHRoZSBuZXcgbWVtYmxrCisgKgorICogQWRkIGEgbmV3IG1lbWJsayB0byB0aGUgZGVmYXVsdCBudW1hX21lbWluZm8uCisgKgorICogUkVUVVJOUzoKKyAqIDAgb24gc3VjY2VzcywgLWVycm5vIG9uIGZhaWx1cmUuCisgKi8KK2ludCBfX2luaXQgbnVtYV9hZGRfbWVtYmxrKGludCBuaWQsIHU2NCBzdGFydCwgdTY0IGVuZCkKK3sKKwlyZXR1cm4gbnVtYV9hZGRfbWVtYmxrX3RvKG5pZCwgc3RhcnQsIGVuZCwgJm51bWFfbWVtaW5mbyk7Cit9CisKKy8qIEluaXRpYWxpemUgTk9ERV9EQVRBIGZvciBhIG5vZGUgb24gdGhlIGxvY2FsIG1lbW9yeSAqLworc3RhdGljIHZvaWQgX19pbml0IHNldHVwX25vZGVfZGF0YShpbnQgbmlkLCB1NjQgc3RhcnQsIHU2NCBlbmQpCit7CisJY29uc3QgdTY0IG5kX2xvdyA9IFBGTl9QSFlTKE1BWF9ETUFfUEZOKTsKKwljb25zdCB1NjQgbmRfaGlnaCA9IFBGTl9QSFlTKG1heF9wZm5fbWFwcGVkKTsKKwljb25zdCBzaXplX3QgbmRfc2l6ZSA9IHJvdW5kdXAoc2l6ZW9mKHBnX2RhdGFfdCksIFBBR0VfU0laRSk7CisJYm9vbCByZW1hcHBlZCA9IGZhbHNlOworCXU2NCBuZF9wYTsKKwl2b2lkICpuZDsKKwlpbnQgdG5pZDsKKworCS8qCisJICogRG9uJ3QgY29uZnVzZSBWTSB3aXRoIGEgbm9kZSB0aGF0IGRvZXNuJ3QgaGF2ZSB0aGUKKwkgKiBtaW5pbXVtIGFtb3VudCBvZiBtZW1vcnk6CisJICovCisJaWYgKGVuZCAmJiAoZW5kIC0gc3RhcnQpIDwgTk9ERV9NSU5fU0laRSkKKwkJcmV0dXJuOworCisJLyogaW5pdGlhbGl6ZSByZW1hcCBhbGxvY2F0b3IgYmVmb3JlIGFsaWduaW5nIHRvIFpPTkVfQUxJR04gKi8KKwlpbml0X2FsbG9jX3JlbWFwKG5pZCwgc3RhcnQsIGVuZCk7CisKKwlzdGFydCA9IHJvdW5kdXAoc3RhcnQsIFpPTkVfQUxJR04pOworCisJcHJpbnRrKEtFUk5fSU5GTyAiSW5pdG1lbSBzZXR1cCBub2RlICVkICUwMTZMeC0lMDE2THhcbiIsCisJICAgICAgIG5pZCwgc3RhcnQsIGVuZCk7CisKKwkvKgorCSAqIEFsbG9jYXRlIG5vZGUgZGF0YS4gIFRyeSByZW1hcCBhbGxvY2F0b3IgZmlyc3QsIG5vZGUtbG9jYWwKKwkgKiBtZW1vcnkgYW5kIHRoZW4gYW55IG5vZGUuICBOZXZlciBhbGxvY2F0ZSBpbiBETUEgem9uZS4KKwkgKi8KKwluZCA9IGFsbG9jX3JlbWFwKG5pZCwgbmRfc2l6ZSk7CisJaWYgKG5kKSB7CisJCW5kX3BhID0gX19wYShuZCk7CisJCXJlbWFwcGVkID0gdHJ1ZTsKKwl9IGVsc2UgeworCQluZF9wYSA9IG1lbWJsb2NrX3g4Nl9maW5kX2luX3JhbmdlX25vZGUobmlkLCBuZF9sb3csIG5kX2hpZ2gsCisJCQkJCQluZF9zaXplLCBTTVBfQ0FDSEVfQllURVMpOworCQlpZiAobmRfcGEgPT0gTUVNQkxPQ0tfRVJST1IpCisJCQluZF9wYSA9IG1lbWJsb2NrX2ZpbmRfaW5fcmFuZ2UobmRfbG93LCBuZF9oaWdoLAorCQkJCQkJbmRfc2l6ZSwgU01QX0NBQ0hFX0JZVEVTKTsKKwkJaWYgKG5kX3BhID09IE1FTUJMT0NLX0VSUk9SKSB7CisJCQlwcl9lcnIoIkNhbm5vdCBmaW5kICV6dSBieXRlcyBpbiBub2RlICVkXG4iLAorCQkJICAgICAgIG5kX3NpemUsIG5pZCk7CisJCQlyZXR1cm47CisJCX0KKwkJbWVtYmxvY2tfeDg2X3Jlc2VydmVfcmFuZ2UobmRfcGEsIG5kX3BhICsgbmRfc2l6ZSwgIk5PREVfREFUQSIpOworCQluZCA9IF9fdmEobmRfcGEpOworCX0KKworCS8qIHJlcG9ydCBhbmQgaW5pdGlhbGl6ZSAqLworCXByaW50ayhLRVJOX0lORk8gIiAgTk9ERV9EQVRBIFslMDE2THggLSAlMDE2THhdJXNcbiIsCisJICAgICAgIG5kX3BhLCBuZF9wYSArIG5kX3NpemUgLSAxLCByZW1hcHBlZCA/ICIgKHJlbWFwcGVkKSIgOiAiIik7CisJdG5pZCA9IGVhcmx5X3Bmbl90b19uaWQobmRfcGEgPj4gUEFHRV9TSElGVCk7CisJaWYgKCFyZW1hcHBlZCAmJiB0bmlkICE9IG5pZCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICAgIE5PREVfREFUQSglZCkgb24gbm9kZSAlZFxuIiwgbmlkLCB0bmlkKTsKKworCW5vZGVfZGF0YVtuaWRdID0gbmQ7CisJbWVtc2V0KE5PREVfREFUQShuaWQpLCAwLCBzaXplb2YocGdfZGF0YV90KSk7CisJTk9ERV9EQVRBKG5pZCktPm5vZGVfaWQgPSBuaWQ7CisJTk9ERV9EQVRBKG5pZCktPm5vZGVfc3RhcnRfcGZuID0gc3RhcnQgPj4gUEFHRV9TSElGVDsKKwlOT0RFX0RBVEEobmlkKS0+bm9kZV9zcGFubmVkX3BhZ2VzID0gKGVuZCAtIHN0YXJ0KSA+PiBQQUdFX1NISUZUOworCisJbm9kZV9zZXRfb25saW5lKG5pZCk7Cit9CisKKy8qKgorICogbnVtYV9jbGVhbnVwX21lbWluZm8gLSBDbGVhbnVwIGEgbnVtYV9tZW1pbmZvCisgKiBAbWk6IG51bWFfbWVtaW5mbyB0byBjbGVhbiB1cAorICoKKyAqIFNhbml0aXplIEBtaSBieSBtZXJnaW5nIGFuZCByZW1vdmluZyB1bm5jZXNzYXJ5IG1lbWJsa3MuICBBbHNvIGNoZWNrIGZvcgorICogY29uZmxpY3RzIGFuZCBjbGVhciB1bnVzZWQgbWVtYmxrcy4KKyAqCisgKiBSRVRVUk5TOgorICogMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZS4KKyAqLworaW50IF9faW5pdCBudW1hX2NsZWFudXBfbWVtaW5mbyhzdHJ1Y3QgbnVtYV9tZW1pbmZvICptaSkKK3sKKwljb25zdCB1NjQgbG93ID0gMDsKKwljb25zdCB1NjQgaGlnaCA9IFBGTl9QSFlTKG1heF9wZm4pOworCWludCBpLCBqLCBrOworCisJLyogZmlyc3QsIHRyaW0gYWxsIGVudHJpZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbWktPm5yX2Jsa3M7IGkrKykgeworCQlzdHJ1Y3QgbnVtYV9tZW1ibGsgKmJpID0gJm1pLT5ibGtbaV07CisKKwkJLyogbWFrZSBzdXJlIGFsbCBibG9ja3MgYXJlIGluc2lkZSB0aGUgbGltaXRzICovCisJCWJpLT5zdGFydCA9IG1heChiaS0+c3RhcnQsIGxvdyk7CisJCWJpLT5lbmQgPSBtaW4oYmktPmVuZCwgaGlnaCk7CisKKwkJLyogYW5kIHRoZXJlJ3Mgbm8gZW1wdHkgYmxvY2sgKi8KKwkJaWYgKGJpLT5zdGFydCA+PSBiaS0+ZW5kKQorCQkJbnVtYV9yZW1vdmVfbWVtYmxrX2Zyb20oaS0tLCBtaSk7CisJfQorCisJLyogbWVyZ2UgbmVpZ2hib3JpbmcgLyBvdmVybGFwcGluZyBlbnRyaWVzICovCisJZm9yIChpID0gMDsgaSA8IG1pLT5ucl9ibGtzOyBpKyspIHsKKwkJc3RydWN0IG51bWFfbWVtYmxrICpiaSA9ICZtaS0+YmxrW2ldOworCisJCWZvciAoaiA9IGkgKyAxOyBqIDwgbWktPm5yX2Jsa3M7IGorKykgeworCQkJc3RydWN0IG51bWFfbWVtYmxrICpiaiA9ICZtaS0+YmxrW2pdOworCQkJdTY0IHN0YXJ0LCBlbmQ7CisKKwkJCS8qCisJCQkgKiBTZWUgd2hldGhlciB0aGVyZSBhcmUgb3ZlcmxhcHBpbmcgYmxvY2tzLiAgV2hpbmUKKwkJCSAqIGFib3V0IGJ1dCBhbGxvdyBvdmVybGFwcyBvZiB0aGUgc2FtZSBuaWQuICBUaGV5CisJCQkgKiB3aWxsIGJlIG1lcmdlZCBiZWxvdy4KKwkJCSAqLworCQkJaWYgKGJpLT5lbmQgPiBiai0+c3RhcnQgJiYgYmktPnN0YXJ0IDwgYmotPmVuZCkgeworCQkJCWlmIChiaS0+bmlkICE9IGJqLT5uaWQpIHsKKwkJCQkJcHJfZXJyKCJOVU1BOiBub2RlICVkICglTHgtJUx4KSBvdmVybGFwcyB3aXRoIG5vZGUgJWQgKCVMeC0lTHgpXG4iLAorCQkJCQkgICAgICAgYmktPm5pZCwgYmktPnN0YXJ0LCBiaS0+ZW5kLAorCQkJCQkgICAgICAgYmotPm5pZCwgYmotPnN0YXJ0LCBiai0+ZW5kKTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCXByX3dhcm5pbmcoIk5VTUE6IFdhcm5pbmc6IG5vZGUgJWQgKCVMeC0lTHgpIG92ZXJsYXBzIHdpdGggaXRzZWxmICglTHgtJUx4KVxuIiwKKwkJCQkJICAgYmktPm5pZCwgYmktPnN0YXJ0LCBiaS0+ZW5kLAorCQkJCQkgICBiai0+c3RhcnQsIGJqLT5lbmQpOworCQkJfQorCisJCQkvKgorCQkJICogSm9pbiB0b2dldGhlciBibG9ja3Mgb24gdGhlIHNhbWUgbm9kZSwgaG9sZXMKKwkJCSAqIGJldHdlZW4gd2hpY2ggZG9uJ3Qgb3ZlcmxhcCB3aXRoIG1lbW9yeSBvbiBvdGhlcgorCQkJICogbm9kZXMuCisJCQkgKi8KKwkJCWlmIChiaS0+bmlkICE9IGJqLT5uaWQpCisJCQkJY29udGludWU7CisJCQlzdGFydCA9IG1pbihiaS0+c3RhcnQsIGJqLT5zdGFydCk7CisJCQllbmQgPSBtYXgoYmktPmVuZCwgYmotPmVuZCk7CisJCQlmb3IgKGsgPSAwOyBrIDwgbWktPm5yX2Jsa3M7IGsrKykgeworCQkJCXN0cnVjdCBudW1hX21lbWJsayAqYmsgPSAmbWktPmJsa1trXTsKKworCQkJCWlmIChiaS0+bmlkID09IGJrLT5uaWQpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChzdGFydCA8IGJrLT5lbmQgJiYgZW5kID4gYmstPnN0YXJ0KQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChrIDwgbWktPm5yX2Jsa3MpCisJCQkJY29udGludWU7CisJCQlwcmludGsoS0VSTl9JTkZPICJOVU1BOiBOb2RlICVkIFslTHgsJUx4KSArIFslTHgsJUx4KSAtPiBbJUx4LCVMeClcbiIsCisJCQkgICAgICAgYmktPm5pZCwgYmktPnN0YXJ0LCBiaS0+ZW5kLCBiai0+c3RhcnQsIGJqLT5lbmQsCisJCQkgICAgICAgc3RhcnQsIGVuZCk7CisJCQliaS0+c3RhcnQgPSBzdGFydDsKKwkJCWJpLT5lbmQgPSBlbmQ7CisJCQludW1hX3JlbW92ZV9tZW1ibGtfZnJvbShqLS0sIG1pKTsKKwkJfQorCX0KKworCS8qIGNsZWFyIHVudXNlZCBvbmVzICovCisJZm9yIChpID0gbWktPm5yX2Jsa3M7IGkgPCBBUlJBWV9TSVpFKG1pLT5ibGspOyBpKyspIHsKKwkJbWktPmJsa1tpXS5zdGFydCA9IG1pLT5ibGtbaV0uZW5kID0gMDsKKwkJbWktPmJsa1tpXS5uaWQgPSBOVU1BX05PX05PREU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXQgbm9kZXMsIHdoaWNoIGhhdmUgbWVtb3J5IGluIEBtaSwgaW4gKkBub2RlbWFzay4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IG51bWFfbm9kZW1hc2tfZnJvbV9tZW1pbmZvKG5vZGVtYXNrX3QgKm5vZGVtYXNrLAorCQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbnVtYV9tZW1pbmZvICptaSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1pLT5ibGspOyBpKyspCisJCWlmIChtaS0+YmxrW2ldLnN0YXJ0ICE9IG1pLT5ibGtbaV0uZW5kICYmCisJCSAgICBtaS0+YmxrW2ldLm5pZCAhPSBOVU1BX05PX05PREUpCisJCQlub2RlX3NldChtaS0+YmxrW2ldLm5pZCwgKm5vZGVtYXNrKTsKK30KKworLyoqCisgKiBudW1hX3Jlc2V0X2Rpc3RhbmNlIC0gUmVzZXQgTlVNQSBkaXN0YW5jZSB0YWJsZQorICoKKyAqIFRoZSBjdXJyZW50IHRhYmxlIGlzIGZyZWVkLiAgVGhlIG5leHQgbnVtYV9zZXRfZGlzdGFuY2UoKSBjYWxsIHdpbGwKKyAqIGNyZWF0ZSBhIG5ldyBvbmUuCisgKi8KK3ZvaWQgX19pbml0IG51bWFfcmVzZXRfZGlzdGFuY2Uodm9pZCkKK3sKKwlzaXplX3Qgc2l6ZSA9IG51bWFfZGlzdGFuY2VfY250ICogbnVtYV9kaXN0YW5jZV9jbnQgKiBzaXplb2YobnVtYV9kaXN0YW5jZVswXSk7CisKKwkvKiBudW1hX2Rpc3RhbmNlIGNvdWxkIGJlIDFMVSBtYXJraW5nIGFsbG9jYXRpb24gZmFpbHVyZSwgdGVzdCBjbnQgKi8KKwlpZiAobnVtYV9kaXN0YW5jZV9jbnQpCisJCW1lbWJsb2NrX3g4Nl9mcmVlX3JhbmdlKF9fcGEobnVtYV9kaXN0YW5jZSksCisJCQkJCV9fcGEobnVtYV9kaXN0YW5jZSkgKyBzaXplKTsKKwludW1hX2Rpc3RhbmNlX2NudCA9IDA7CisJbnVtYV9kaXN0YW5jZSA9IE5VTEw7CS8qIGVuYWJsZSB0YWJsZSBjcmVhdGlvbiAqLworfQorCitzdGF0aWMgaW50IF9faW5pdCBudW1hX2FsbG9jX2Rpc3RhbmNlKHZvaWQpCit7CisJbm9kZW1hc2tfdCBub2Rlc19wYXJzZWQ7CisJc2l6ZV90IHNpemU7CisJaW50IGksIGosIGNudCA9IDA7CisJdTY0IHBoeXM7CisKKwkvKiBzaXplIHRoZSBuZXcgdGFibGUgYW5kIGFsbG9jYXRlIGl0ICovCisJbm9kZXNfcGFyc2VkID0gbnVtYV9ub2Rlc19wYXJzZWQ7CisJbnVtYV9ub2RlbWFza19mcm9tX21lbWluZm8oJm5vZGVzX3BhcnNlZCwgJm51bWFfbWVtaW5mbyk7CisKKwlmb3JfZWFjaF9ub2RlX21hc2soaSwgbm9kZXNfcGFyc2VkKQorCQljbnQgPSBpOworCWNudCsrOworCXNpemUgPSBjbnQgKiBjbnQgKiBzaXplb2YobnVtYV9kaXN0YW5jZVswXSk7CisKKwlwaHlzID0gbWVtYmxvY2tfZmluZF9pbl9yYW5nZSgwLCBQRk5fUEhZUyhtYXhfcGZuX21hcHBlZCksCisJCQkJICAgICAgc2l6ZSwgUEFHRV9TSVpFKTsKKwlpZiAocGh5cyA9PSBNRU1CTE9DS19FUlJPUikgeworCQlwcl93YXJuaW5nKCJOVU1BOiBXYXJuaW5nOiBjYW4ndCBhbGxvY2F0ZSBkaXN0YW5jZSB0YWJsZSFcbiIpOworCQkvKiBkb24ndCByZXRyeSB1bnRpbCBleHBsaWNpdGx5IHJlc2V0ICovCisJCW51bWFfZGlzdGFuY2UgPSAodm9pZCAqKTFMVTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbWJsb2NrX3g4Nl9yZXNlcnZlX3JhbmdlKHBoeXMsIHBoeXMgKyBzaXplLCAiTlVNQSBESVNUIik7CisKKwludW1hX2Rpc3RhbmNlID0gX192YShwaHlzKTsKKwludW1hX2Rpc3RhbmNlX2NudCA9IGNudDsKKworCS8qIGZpbGwgd2l0aCB0aGUgZGVmYXVsdCBkaXN0YW5jZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspCisJCWZvciAoaiA9IDA7IGogPCBjbnQ7IGorKykKKwkJCW51bWFfZGlzdGFuY2VbaSAqIGNudCArIGpdID0gaSA9PSBqID8KKwkJCQlMT0NBTF9ESVNUQU5DRSA6IFJFTU9URV9ESVNUQU5DRTsKKwlwcmludGsoS0VSTl9ERUJVRyAiTlVNQTogSW5pdGlhbGl6ZWQgZGlzdGFuY2UgdGFibGUsIGNudD0lZFxuIiwgY250KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIG51bWFfc2V0X2Rpc3RhbmNlIC0gU2V0IE5VTUEgZGlzdGFuY2UgZnJvbSBvbmUgTlVNQSB0byBhbm90aGVyCisgKiBAZnJvbTogdGhlICdmcm9tJyBub2RlIHRvIHNldCBkaXN0YW5jZQorICogQHRvOiB0aGUgJ3RvJyAgbm9kZSB0byBzZXQgZGlzdGFuY2UKKyAqIEBkaXN0YW5jZTogTlVNQSBkaXN0YW5jZQorICoKKyAqIFNldCB0aGUgZGlzdGFuY2UgZnJvbSBub2RlIEBmcm9tIHRvIEB0byB0byBAZGlzdGFuY2UuICBJZiBkaXN0YW5jZSB0YWJsZQorICogZG9lc24ndCBleGlzdCwgb25lIHdoaWNoIGlzIGxhcmdlIGVub3VnaCB0byBhY2NvbW1vZGF0ZSBhbGwgdGhlIGN1cnJlbnRseQorICoga25vd24gbm9kZXMgd2lsbCBiZSBjcmVhdGVkLgorICoKKyAqIElmIHN1Y2ggdGFibGUgY2Fubm90IGJlIGFsbG9jYXRlZCwgYSB3YXJuaW5nIGlzIHByaW50ZWQgYW5kIGZ1cnRoZXIKKyAqIGNhbGxzIGFyZSBpZ25vcmVkIHVudGlsIHRoZSBkaXN0YW5jZSB0YWJsZSBpcyByZXNldCB3aXRoCisgKiBudW1hX3Jlc2V0X2Rpc3RhbmNlKCkuCisgKgorICogSWYgQGZyb20gb3IgQHRvIGlzIGhpZ2hlciB0aGFuIHRoZSBoaWdoZXN0IGtub3duIG5vZGUgYXQgdGhlIHRpbWUgb2YKKyAqIHRhYmxlIGNyZWF0aW9uIG9yIEBkaXN0YW5jZSBkb2Vzbid0IG1ha2Ugc2Vuc2UsIHRoZSBjYWxsIGlzIGlnbm9yZWQuCisgKiBUaGlzIGlzIHRvIGFsbG93IHNpbXBsaWZpY2F0aW9uIG9mIHNwZWNpZmljIE5VTUEgY29uZmlnIGltcGxlbWVudGF0aW9ucy4KKyAqLwordm9pZCBfX2luaXQgbnVtYV9zZXRfZGlzdGFuY2UoaW50IGZyb20sIGludCB0bywgaW50IGRpc3RhbmNlKQoreworCWlmICghbnVtYV9kaXN0YW5jZSAmJiBudW1hX2FsbG9jX2Rpc3RhbmNlKCkgPCAwKQorCQlyZXR1cm47CisKKwlpZiAoZnJvbSA+PSBudW1hX2Rpc3RhbmNlX2NudCB8fCB0byA+PSBudW1hX2Rpc3RhbmNlX2NudCkgeworCQlwcmludGtfb25jZShLRVJOX0RFQlVHICJOVU1BOiBEZWJ1ZzogZGlzdGFuY2Ugb3V0IG9mIGJvdW5kLCBmcm9tPSVkIHRvPSVkIGRpc3RhbmNlPSVkXG4iLAorCQkJICAgIGZyb20sIHRvLCBkaXN0YW5jZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKHU4KWRpc3RhbmNlICE9IGRpc3RhbmNlIHx8CisJICAgIChmcm9tID09IHRvICYmIGRpc3RhbmNlICE9IExPQ0FMX0RJU1RBTkNFKSkgeworCQlwcl93YXJuX29uY2UoIk5VTUE6IFdhcm5pbmc6IGludmFsaWQgZGlzdGFuY2UgcGFyYW1ldGVyLCBmcm9tPSVkIHRvPSVkIGRpc3RhbmNlPSVkXG4iLAorCQkJICAgICBmcm9tLCB0bywgZGlzdGFuY2UpOworCQlyZXR1cm47CisJfQorCisJbnVtYV9kaXN0YW5jZVtmcm9tICogbnVtYV9kaXN0YW5jZV9jbnQgKyB0b10gPSBkaXN0YW5jZTsKK30KKworaW50IF9fbm9kZV9kaXN0YW5jZShpbnQgZnJvbSwgaW50IHRvKQoreworCWlmIChmcm9tID49IG51bWFfZGlzdGFuY2VfY250IHx8IHRvID49IG51bWFfZGlzdGFuY2VfY250KQorCQlyZXR1cm4gZnJvbSA9PSB0byA/IExPQ0FMX0RJU1RBTkNFIDogUkVNT1RFX0RJU1RBTkNFOworCXJldHVybiBudW1hX2Rpc3RhbmNlW2Zyb20gKiBudW1hX2Rpc3RhbmNlX2NudCArIHRvXTsKK30KK0VYUE9SVF9TWU1CT0woX19ub2RlX2Rpc3RhbmNlKTsKKworLyoKKyAqIFNhbml0eSBjaGVjayB0byBjYXRjaCBtb3JlIGJhZCBOVU1BIGNvbmZpZ3VyYXRpb25zICh0aGV5IGFyZSBhbWF6aW5nbHkKKyAqIGNvbW1vbikuICBNYWtlIHN1cmUgdGhlIG5vZGVzIGNvdmVyIGFsbCBtZW1vcnkuCisgKi8KK3N0YXRpYyBib29sIF9faW5pdCBudW1hX21lbWluZm9fY292ZXJfbWVtb3J5KGNvbnN0IHN0cnVjdCBudW1hX21lbWluZm8gKm1pKQoreworCXU2NCBudW1hcmFtLCBlODIwcmFtOworCWludCBpOworCisJbnVtYXJhbSA9IDA7CisJZm9yIChpID0gMDsgaSA8IG1pLT5ucl9ibGtzOyBpKyspIHsKKwkJdTY0IHMgPSBtaS0+YmxrW2ldLnN0YXJ0ID4+IFBBR0VfU0hJRlQ7CisJCXU2NCBlID0gbWktPmJsa1tpXS5lbmQgPj4gUEFHRV9TSElGVDsKKwkJbnVtYXJhbSArPSBlIC0gczsKKwkJbnVtYXJhbSAtPSBfX2Fic2VudF9wYWdlc19pbl9yYW5nZShtaS0+YmxrW2ldLm5pZCwgcywgZSk7CisJCWlmICgoczY0KW51bWFyYW0gPCAwKQorCQkJbnVtYXJhbSA9IDA7CisJfQorCisJZTgyMHJhbSA9IG1heF9wZm4gLSAobWVtYmxvY2tfeDg2X2hvbGVfc2l6ZSgwLAorCQkJCQlQRk5fUEhZUyhtYXhfcGZuKSkgPj4gUEFHRV9TSElGVCk7CisJLyogV2Ugc2VlbSB0byBsb3NlIDMgcGFnZXMgc29tZXdoZXJlLiBBbGxvdyAxTSBvZiBzbGFjay4gKi8KKwlpZiAoKHM2NCkoZTgyMHJhbSAtIG51bWFyYW0pID49ICgxIDw8ICgyMCAtIFBBR0VfU0hJRlQpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIk5VTUE6IG5vZGVzIG9ubHkgY292ZXIgJUx1TUIgb2YgeW91ciAlTHVNQiBlODIwIFJBTS4gTm90IHVzZWQuXG4iLAorCQkgICAgICAgKG51bWFyYW0gPDwgUEFHRV9TSElGVCkgPj4gMjAsCisJCSAgICAgICAoZTgyMHJhbSA8PCBQQUdFX1NISUZUKSA+PiAyMCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG51bWFfcmVnaXN0ZXJfbWVtYmxrcyhzdHJ1Y3QgbnVtYV9tZW1pbmZvICptaSkKK3sKKwlpbnQgaSwgbmlkOworCisJLyogQWNjb3VudCBmb3Igbm9kZXMgd2l0aCBjcHVzIGFuZCBubyBtZW1vcnkgKi8KKwlub2RlX3Bvc3NpYmxlX21hcCA9IG51bWFfbm9kZXNfcGFyc2VkOworCW51bWFfbm9kZW1hc2tfZnJvbV9tZW1pbmZvKCZub2RlX3Bvc3NpYmxlX21hcCwgbWkpOworCWlmIChXQVJOX09OKG5vZGVzX2VtcHR5KG5vZGVfcG9zc2libGVfbWFwKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChpID0gMDsgaSA8IG1pLT5ucl9ibGtzOyBpKyspCisJCW1lbWJsb2NrX3g4Nl9yZWdpc3Rlcl9hY3RpdmVfcmVnaW9ucyhtaS0+YmxrW2ldLm5pZCwKKwkJCQkJbWktPmJsa1tpXS5zdGFydCA+PiBQQUdFX1NISUZULAorCQkJCQltaS0+YmxrW2ldLmVuZCA+PiBQQUdFX1NISUZUKTsKKworCS8qIGZvciBvdXQgb2Ygb3JkZXIgZW50cmllcyAqLworCXNvcnRfbm9kZV9tYXAoKTsKKwlpZiAoIW51bWFfbWVtaW5mb19jb3Zlcl9tZW1vcnkobWkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEZpbmFsbHkgcmVnaXN0ZXIgbm9kZXMuICovCisJZm9yX2VhY2hfbm9kZV9tYXNrKG5pZCwgbm9kZV9wb3NzaWJsZV9tYXApIHsKKwkJdTY0IHN0YXJ0ID0gUEZOX1BIWVMobWF4X3Bmbik7CisJCXU2NCBlbmQgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBtaS0+bnJfYmxrczsgaSsrKSB7CisJCQlpZiAobmlkICE9IG1pLT5ibGtbaV0ubmlkKQorCQkJCWNvbnRpbnVlOworCQkJc3RhcnQgPSBtaW4obWktPmJsa1tpXS5zdGFydCwgc3RhcnQpOworCQkJZW5kID0gbWF4KG1pLT5ibGtbaV0uZW5kLCBlbmQpOworCQl9CisKKwkJaWYgKHN0YXJ0IDwgZW5kKQorCQkJc2V0dXBfbm9kZV9kYXRhKG5pZCwgc3RhcnQsIGVuZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBUaGVyZSBhcmUgdW5mb3J0dW5hdGVseSBzb21lIHBvb3JseSBkZXNpZ25lZCBtYWluYm9hcmRzIGFyb3VuZCB0aGF0CiAgKiBvbmx5IGNvbm5lY3QgbWVtb3J5IHRvIGEgc2luZ2xlIENQVS4gVGhpcyBicmVha3MgdGhlIDE6MSBjcHUtPm5vZGUKQEAgLTEwMiw3ICs1NDAsNyBAQAogICogYXMgdGhlIG51bWJlciBvZiBDUFVzIGlzIG5vdCBrbm93biB5ZXQuIFdlIHJvdW5kIHJvYmluIHRoZSBleGlzdGluZwogICogbm9kZXMuCiAgKi8KLXZvaWQgX19pbml0IG51bWFfaW5pdF9hcnJheSh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IG51bWFfaW5pdF9hcnJheSh2b2lkKQogewogCWludCByciwgaTsKIApAQCAtMTE3LDYgKzU1NSw5NSBAQAogCX0KIH0KIAorc3RhdGljIGludCBfX2luaXQgbnVtYV9pbml0KGludCAoKmluaXRfZnVuYykodm9pZCkpCit7CisJaW50IGk7CisJaW50IHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfTE9DQUxfQVBJQzsgaSsrKQorCQlzZXRfYXBpY2lkX3RvX25vZGUoaSwgTlVNQV9OT19OT0RFKTsKKworCW5vZGVzX2NsZWFyKG51bWFfbm9kZXNfcGFyc2VkKTsKKwlub2Rlc19jbGVhcihub2RlX3Bvc3NpYmxlX21hcCk7CisJbm9kZXNfY2xlYXIobm9kZV9vbmxpbmVfbWFwKTsKKwltZW1zZXQoJm51bWFfbWVtaW5mbywgMCwgc2l6ZW9mKG51bWFfbWVtaW5mbykpOworCXJlbW92ZV9hbGxfYWN0aXZlX3JhbmdlcygpOworCW51bWFfcmVzZXRfZGlzdGFuY2UoKTsKKworCXJldCA9IGluaXRfZnVuYygpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldCA9IG51bWFfY2xlYW51cF9tZW1pbmZvKCZudW1hX21lbWluZm8pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbnVtYV9lbXVsYXRpb24oJm51bWFfbWVtaW5mbywgbnVtYV9kaXN0YW5jZV9jbnQpOworCisJcmV0ID0gbnVtYV9yZWdpc3Rlcl9tZW1ibGtzKCZudW1hX21lbWluZm8pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IG5yX2NwdV9pZHM7IGkrKykgeworCQlpbnQgbmlkID0gZWFybHlfY3B1X3RvX25vZGUoaSk7CisKKwkJaWYgKG5pZCA9PSBOVU1BX05PX05PREUpCisJCQljb250aW51ZTsKKwkJaWYgKCFub2RlX29ubGluZShuaWQpKQorCQkJbnVtYV9jbGVhcl9ub2RlKGkpOworCX0KKwludW1hX2luaXRfYXJyYXkoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBkdW1teV9udW1hX2luaXQgLSBGYWxsYmFjayBkdW1teSBOVU1BIGluaXQKKyAqCisgKiBVc2VkIGlmIHRoZXJlJ3Mgbm8gdW5kZXJseWluZyBOVU1BIGFyY2hpdGVjdHVyZSwgTlVNQSBpbml0aWFsaXphdGlvbgorICogZmFpbHMsIG9yIE5VTUEgaXMgZGlzYWJsZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAqCisgKiBNdXN0IG9ubGluZSBhdCBsZWFzdCBvbmUgbm9kZSBhbmQgYWRkIG1lbW9yeSBibG9ja3MgdGhhdCBjb3ZlciBhbGwKKyAqIGFsbG93ZWQgbWVtb3J5LiAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBmYWlsLgorICovCitzdGF0aWMgaW50IF9faW5pdCBkdW1teV9udW1hX2luaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwKKwkgICAgICAgbnVtYV9vZmYgPyAiTlVNQSB0dXJuZWQgb2ZmIiA6ICJObyBOVU1BIGNvbmZpZ3VyYXRpb24gZm91bmQiKTsKKwlwcmludGsoS0VSTl9JTkZPICJGYWtpbmcgYSBub2RlIGF0ICUwMTZMeC0lMDE2THhcbiIsCisJICAgICAgIDBMTFUsIFBGTl9QSFlTKG1heF9wZm4pKTsKKworCW5vZGVfc2V0KDAsIG51bWFfbm9kZXNfcGFyc2VkKTsKKwludW1hX2FkZF9tZW1ibGsoMCwgMCwgUEZOX1BIWVMobWF4X3BmbikpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogeDg2X251bWFfaW5pdCAtIEluaXRpYWxpemUgTlVNQQorICoKKyAqIFRyeSBlYWNoIGNvbmZpZ3VyZWQgTlVNQSBpbml0aWFsaXphdGlvbiBtZXRob2QgdW50aWwgb25lIHN1Y2NlZWRzLiAgVGhlCisgKiBsYXN0IGZhbGxiYWNrIGlzIGR1bW15IHNpbmdsZSBub2RlIGNvbmZpZyBlbmNvbWFwc3Npbmcgd2hvbGUgbWVtb3J5IGFuZAorICogbmV2ZXIgZmFpbHMuCisgKi8KK3ZvaWQgX19pbml0IHg4Nl9udW1hX2luaXQodm9pZCkKK3sKKwlpZiAoIW51bWFfb2ZmKSB7CisjaWZkZWYgQ09ORklHX1g4Nl9OVU1BUQorCQlpZiAoIW51bWFfaW5pdChudW1hcV9udW1hX2luaXQpKQorCQkJcmV0dXJuOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0FDUElfTlVNQQorCQlpZiAoIW51bWFfaW5pdCh4ODZfYWNwaV9udW1hX2luaXQpKQorCQkJcmV0dXJuOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0FNRF9OVU1BCisJCWlmICghbnVtYV9pbml0KGFtZF9udW1hX2luaXQpKQorCQkJcmV0dXJuOworI2VuZGlmCisJfQorCisJbnVtYV9pbml0KGR1bW15X251bWFfaW5pdCk7Cit9CisKIHN0YXRpYyBfX2luaXQgaW50IGZpbmRfbmVhcl9vbmxpbmVfbm9kZShpbnQgbm9kZSkKIHsKIAlpbnQgbiwgdmFsOwpAQCAtMjgyLDMgKzgwOSwxOCBAQAogRVhQT1JUX1NZTUJPTChjcHVtYXNrX29mX25vZGUpOwogCiAjZW5kaWYJLyogIUNPTkZJR19ERUJVR19QRVJfQ1BVX01BUFMgKi8KKworI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUExVRworaW50IG1lbW9yeV9hZGRfcGh5c2FkZHJfdG9fbmlkKHU2NCBzdGFydCkKK3sKKwlzdHJ1Y3QgbnVtYV9tZW1pbmZvICptaSA9ICZudW1hX21lbWluZm87CisJaW50IG5pZCA9IG1pLT5ibGtbMF0ubmlkOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG1pLT5ucl9ibGtzOyBpKyspCisJCWlmIChtaS0+YmxrW2ldLnN0YXJ0IDw9IHN0YXJ0ICYmIG1pLT5ibGtbaV0uZW5kID4gc3RhcnQpCisJCQluaWQgPSBtaS0+YmxrW2ldLm5pZDsKKwlyZXR1cm4gbmlkOworfQorRVhQT1JUX1NZTUJPTF9HUEwobWVtb3J5X2FkZF9waHlzYWRkcl90b19uaWQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9udW1hXzMyLmMgYi9hcmNoL3g4Ni9tbS9udW1hXzMyLmMKaW5kZXggYmRlMzkwNi4uODQ5YTk3NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vbnVtYV8zMi5jCisrKyBiL2FyY2gveDg2L21tL251bWFfMzIuYwpAQCAtMjIsMzkgKzIyLDExIEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KLSNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+Ci0jaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgotI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgotI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KLSNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAKLSNpbmNsdWRlIDxhc20vZTgyMC5oPgotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9tbXpvbmUuaD4KLSNpbmNsdWRlIDxhc20vYmlvc19lYmRhLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb3RvLmg+Ci0KLXN0cnVjdCBwZ2xpc3RfZGF0YSAqbm9kZV9kYXRhW01BWF9OVU1OT0RFU10gX19yZWFkX21vc3RseTsKLUVYUE9SVF9TWU1CT0wobm9kZV9kYXRhKTsKLQotLyoKLSAqIG51bWEgaW50ZXJmYWNlIC0gd2UgZXhwZWN0IHRoZSBudW1hIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb2RlIHRvIGhhdmUKLSAqICAgICAgICAgICAgICAgICAgcG9wdWxhdGVkIHRoZSBmb2xsb3dpbmcgaW5pdGlhbGlzYXRpb24uCi0gKgotICogMSkgbm9kZV9vbmxpbmVfbWFwICAtIHRoZSBtYXAgb2YgYWxsIG5vZGVzIGNvbmZpZ3VyZWQgKG9ubGluZSkgaW4gdGhlIHN5c3RlbQotICogMikgbm9kZV9zdGFydF9wZm4gICAtIHRoZSBzdGFydGluZyBwYWdlIGZyYW1lIG51bWJlciBmb3IgYSBub2RlCi0gKiAzKSBub2RlX2VuZF9wZm4gICAgIC0gdGhlIGVuZGluZyBwYWdlIGZyYW0gbnVtYmVyIGZvciBhIG5vZGUKLSAqLwotdW5zaWduZWQgbG9uZyBub2RlX3N0YXJ0X3BmbltNQVhfTlVNTk9ERVNdIF9fcmVhZF9tb3N0bHk7Ci11bnNpZ25lZCBsb25nIG5vZGVfZW5kX3BmbltNQVhfTlVNTk9ERVNdIF9fcmVhZF9tb3N0bHk7Ci0KKyNpbmNsdWRlICJudW1hX2ludGVybmFsLmgiCiAKICNpZmRlZiBDT05GSUdfRElTQ09OVElHTUVNCiAvKgpAQCAtOTksMTA4ICs3MSw0NiBAQAogfQogI2VuZGlmCiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIGZpbmRfbWF4X2xvd19wZm4odm9pZCk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBoaWdoZW5kX3BmbiwgaGlnaHN0YXJ0X3BmbjsKIAogI2RlZmluZSBMQVJHRV9QQUdFX0JZVEVTIChQVFJTX1BFUl9QVEUgKiBQQUdFX1NJWkUpCiAKLXVuc2lnbmVkIGxvbmcgbm9kZV9yZW1hcF9zaXplW01BWF9OVU1OT0RFU107CiBzdGF0aWMgdm9pZCAqbm9kZV9yZW1hcF9zdGFydF92YWRkcltNQVhfTlVNTk9ERVNdOwogdm9pZCBzZXRfcG1kX3Bmbih1bnNpZ25lZCBsb25nIHZhZGRyLCB1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgZmxhZ3MpOwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBrdmFfc3RhcnRfcGZuOwotc3RhdGljIHVuc2lnbmVkIGxvbmcga3ZhX3BhZ2VzOwotCi1pbnQgX19jcHVpbml0IG51bWFfY3B1X25vZGUoaW50IGNwdSkKLXsKLQlyZXR1cm4gYXBpYy0+eDg2XzMyX251bWFfY3B1X25vZGUoY3B1KTsKLX0KLQogLyoKLSAqIEZMQVQgLSBzdXBwb3J0IGZvciBiYXNpYyBQQyBtZW1vcnkgbW9kZWwgd2l0aCBkaXNjb250aWcgZW5hYmxlZCwgZXNzZW50aWFsbHkKLSAqICAgICAgICBhIHNpbmdsZSBub2RlIHdpdGggYWxsIGF2YWlsYWJsZSBwcm9jZXNzb3JzIGluIGl0IHdpdGggYSBmbGF0Ci0gKiAgICAgICAgbWVtb3J5IG1hcC4KLSAqLwotaW50IF9faW5pdCBnZXRfbWVtY2ZnX251bWFfZmxhdCh2b2lkKQotewotCXByaW50ayhLRVJOX0RFQlVHICJOVU1BIC0gc2luZ2xlIG5vZGUsIGZsYXQgbWVtb3J5IG1vZGVcbiIpOwotCi0Jbm9kZV9zdGFydF9wZm5bMF0gPSAwOwotCW5vZGVfZW5kX3BmblswXSA9IG1heF9wZm47Ci0JbWVtYmxvY2tfeDg2X3JlZ2lzdGVyX2FjdGl2ZV9yZWdpb25zKDAsIDAsIG1heF9wZm4pOwotCW1lbW9yeV9wcmVzZW50KDAsIDAsIG1heF9wZm4pOwotCW5vZGVfcmVtYXBfc2l6ZVswXSA9IG5vZGVfbWVtbWFwX3NpemVfYnl0ZXMoMCwgMCwgbWF4X3Bmbik7Ci0KLSAgICAgICAgLyogSW5kaWNhdGUgdGhlcmUgaXMgb25lIG5vZGUgYXZhaWxhYmxlLiAqLwotCW5vZGVzX2NsZWFyKG5vZGVfb25saW5lX21hcCk7Ci0Jbm9kZV9zZXRfb25saW5lKDApOwotCXJldHVybiAxOwotfQotCi0vKgotICogRmluZCB0aGUgaGlnaGVzdCBwYWdlIGZyYW1lIG51bWJlciB3ZSBoYXZlIGF2YWlsYWJsZSBmb3IgdGhlIG5vZGUKLSAqLwotc3RhdGljIHZvaWQgX19pbml0IHByb3BhZ2F0ZV9lODIwX21hcF9ub2RlKGludCBuaWQpCi17Ci0JaWYgKG5vZGVfZW5kX3BmbltuaWRdID4gbWF4X3BmbikKLQkJbm9kZV9lbmRfcGZuW25pZF0gPSBtYXhfcGZuOwotCS8qCi0JICogaWYgYSB1c2VyIGhhcyBnaXZlbiBtZW09WFhYWCwgdGhlbiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSAKLQkgKiB0aGF0IHRoZSBub2RlIF9zdGFydHNfIGJlZm9yZSB0aGF0LCB0b28sIG5vdCBqdXN0IGVuZHMKLQkgKi8KLQlpZiAobm9kZV9zdGFydF9wZm5bbmlkXSA+IG1heF9wZm4pCi0JCW5vZGVfc3RhcnRfcGZuW25pZF0gPSBtYXhfcGZuOwotCUJVR19PTihub2RlX3N0YXJ0X3BmbltuaWRdID4gbm9kZV9lbmRfcGZuW25pZF0pOwotfQotCi0vKiAKLSAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHBnX2RhdGFfdCBmb3IgdGhpcyBub2RlIHZpYSBhIGNydWRlIHByZS1ib290bWVtCi0gKiBtZXRob2QuICBGb3Igbm9kZSB6ZXJvIHRha2UgdGhpcyBmcm9tIHRoZSBib3R0b20gb2YgbWVtb3J5LCBmb3IKLSAqIHN1YnNlcXVlbnQgbm9kZXMgcGxhY2UgdGhlbSBhdCBub2RlX3JlbWFwX3N0YXJ0X3ZhZGRyIHdoaWNoIGNvbnRhaW5zCi0gKiBub2RlIGxvY2FsIGRhdGEgaW4gcGh5c2ljYWxseSBub2RlIGxvY2FsIG1lbW9yeS4gIFNlZSBzZXR1cF9tZW1vcnkoKQotICogZm9yIGRldGFpbHMuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBhbGxvY2F0ZV9wZ2RhdChpbnQgbmlkKQotewotCWNoYXIgYnVmWzE2XTsKLQotCWlmIChub2RlX2hhc19vbmxpbmVfbWVtKG5pZCkgJiYgbm9kZV9yZW1hcF9zdGFydF92YWRkcltuaWRdKQotCQlOT0RFX0RBVEEobmlkKSA9IChwZ19kYXRhX3QgKilub2RlX3JlbWFwX3N0YXJ0X3ZhZGRyW25pZF07Ci0JZWxzZSB7Ci0JCXVuc2lnbmVkIGxvbmcgcGdkYXRfcGh5czsKLQkJcGdkYXRfcGh5cyA9IG1lbWJsb2NrX2ZpbmRfaW5fcmFuZ2UobWluX2xvd19wZm48PFBBR0VfU0hJRlQsCi0JCQkJIG1heF9wZm5fbWFwcGVkPDxQQUdFX1NISUZULAotCQkJCSBzaXplb2YocGdfZGF0YV90KSwKLQkJCQkgUEFHRV9TSVpFKTsKLQkJTk9ERV9EQVRBKG5pZCkgPSAocGdfZGF0YV90ICopKHBmbl90b19rYWRkcihwZ2RhdF9waHlzPj5QQUdFX1NISUZUKSk7Ci0JCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQkJc3ByaW50ZihidWYsICJOT0RFX0RBVEEgJWQiLCAgbmlkKTsKLQkJbWVtYmxvY2tfeDg2X3Jlc2VydmVfcmFuZ2UocGdkYXRfcGh5cywgcGdkYXRfcGh5cyArIHNpemVvZihwZ19kYXRhX3QpLCBidWYpOwotCX0KLQlwcmludGsoS0VSTl9ERUJVRyAiYWxsb2NhdGVfcGdkYXQ6IG5vZGUgJWQgTk9ERV9EQVRBICUwOGx4XG4iLAotCQluaWQsICh1bnNpZ25lZCBsb25nKU5PREVfREFUQShuaWQpKTsKLX0KLQotLyoKLSAqIEluIHRoZSBESVNDT05USUdNRU0gYW5kIFNQQVJTRU1FTSBtZW1vcnkgbW9kZWwsIGEgcG9ydGlvbiBvZiB0aGUga2VybmVsCi0gKiB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKEtWQSkgaXMgcmVzZXJ2ZWQgYW5kIHBvcnRpb25zIG9mIG5vZGVzIGFyZSBtYXBwZWQKLSAqIHVzaW5nIGl0LiBUaGlzIGlzIHRvIGFsbG93IG5vZGUtbG9jYWwgbWVtb3J5IHRvIGJlIGFsbG9jYXRlZCBmb3IKLSAqIHN0cnVjdHVyZXMgdGhhdCB3b3VsZCBub3JtYWxseSByZXF1aXJlIFpPTkVfTk9STUFMLiBUaGUgbWVtb3J5IGlzCi0gKiBhbGxvY2F0ZWQgd2l0aCBhbGxvY19yZW1hcCgpIGFuZCBjYWxsZXJzIHNob3VsZCBiZSBwcmVwYXJlZCB0byBhbGxvY2F0ZQotICogZnJvbSB0aGUgYm9vdG1lbSBhbGxvY2F0b3IgaW5zdGVhZC4KKyAqIFJlbWFwIG1lbW9yeSBhbGxvY2F0b3IKICAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgbm9kZV9yZW1hcF9zdGFydF9wZm5bTUFYX05VTU5PREVTXTsKIHN0YXRpYyB2b2lkICpub2RlX3JlbWFwX2VuZF92YWRkcltNQVhfTlVNTk9ERVNdOwogc3RhdGljIHZvaWQgKm5vZGVfcmVtYXBfYWxsb2NfdmFkZHJbTUFYX05VTU5PREVTXTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG5vZGVfcmVtYXBfb2Zmc2V0W01BWF9OVU1OT0RFU107CiAKKy8qKgorICogYWxsb2NfcmVtYXAgLSBBbGxvY2F0ZSByZW1hcHBlZCBtZW1vcnkKKyAqIEBuaWQ6IE5VTUEgbm9kZSB0byBhbGxvY2F0ZSBtZW1vcnkgZnJvbQorICogQHNpemU6IFRoZSBzaXplIG9mIGFsbG9jYXRpb24KKyAqCisgKiBBbGxvY2F0ZSBAc2l6ZSBieXRlcyBmcm9tIHRoZSByZW1hcCBhcmVhIG9mIE5VTUEgbm9kZSBAbmlkLiAgVGhlCisgKiBzaXplIG9mIHRoZSByZW1hcCBhcmVhIGlzIHByZWRldGVybWluZWQgYnkgaW5pdF9hbGxvY19yZW1hcCgpIGFuZAorICogb25seSB0aGUgY2FsbGVycyBjb25zaWRlcmVkIHRoZXJlIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24uICBGb3IKKyAqIG1vcmUgaW5mbywgcGxlYXNlIHJlYWQgdGhlIGNvbW1lbnQgb24gdG9wIG9mIGluaXRfYWxsb2NfcmVtYXAoKS4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgYmUgcmVhZHkgdG8gaGFuZGxlIGFsbG9jYXRpb24gZmFpbHVyZSBmcm9tIHRoaXMKKyAqIGZ1bmN0aW9uIGFuZCBmYWxsIGJhY2sgdG8gcmVndWxhciBtZW1vcnkgYWxsb2NhdG9yIGluIHN1Y2ggY2FzZXMuCisgKgorICogQ09OVEVYVDoKKyAqIFNpbmdsZSBDUFUgZWFybHkgYm9vdCBjb250ZXh0LgorICoKKyAqIFJFVFVSTlM6CisgKiBQb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IG9uIHN1Y2Nlc3MsICVOVUxMIG9uIGZhaWx1cmUuCisgKi8KIHZvaWQgKmFsbG9jX3JlbWFwKGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAl2b2lkICphbGxvY2F0aW9uID0gbm9kZV9yZW1hcF9hbGxvY192YWRkcltuaWRdOwogCiAJc2l6ZSA9IEFMSUdOKHNpemUsIEwxX0NBQ0hFX0JZVEVTKTsKIAotCWlmICghYWxsb2NhdGlvbiB8fCAoYWxsb2NhdGlvbiArIHNpemUpID49IG5vZGVfcmVtYXBfZW5kX3ZhZGRyW25pZF0pCisJaWYgKCFhbGxvY2F0aW9uIHx8IChhbGxvY2F0aW9uICsgc2l6ZSkgPiBub2RlX3JlbWFwX2VuZF92YWRkcltuaWRdKQogCQlyZXR1cm4gTlVMTDsKIAogCW5vZGVfcmVtYXBfYWxsb2NfdmFkZHJbbmlkXSArPSBzaXplOwpAQCAtMjA5LDI2ICsxMTksNiBAQAogCXJldHVybiBhbGxvY2F0aW9uOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgcmVtYXBfbnVtYV9rdmEodm9pZCkKLXsKLQl2b2lkICp2YWRkcjsKLQl1bnNpZ25lZCBsb25nIHBmbjsKLQlpbnQgbm9kZTsKLQotCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgInJlbWFwX251bWFfa3ZhOiBub2RlICVkXG4iLCBub2RlKTsKLQkJZm9yIChwZm49MDsgcGZuIDwgbm9kZV9yZW1hcF9zaXplW25vZGVdOyBwZm4gKz0gUFRSU19QRVJfUFRFKSB7Ci0JCQl2YWRkciA9IG5vZGVfcmVtYXBfc3RhcnRfdmFkZHJbbm9kZV0rKHBmbjw8UEFHRV9TSElGVCk7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAicmVtYXBfbnVtYV9rdmE6ICUwOGx4IHRvIHBmbiAlMDhseFxuIiwKLQkJCQkodW5zaWduZWQgbG9uZyl2YWRkciwKLQkJCQlub2RlX3JlbWFwX3N0YXJ0X3Bmbltub2RlXSArIHBmbik7Ci0JCQlzZXRfcG1kX3BmbigodWxvbmcpIHZhZGRyLCAKLQkJCQlub2RlX3JlbWFwX3N0YXJ0X3Bmbltub2RlXSArIHBmbiwgCi0JCQkJUEFHRV9LRVJORUxfTEFSR0UpOwotCQl9Ci0JfQotfQotCiAjaWZkZWYgQ09ORklHX0hJQkVSTkFUSU9OCiAvKioKICAqIHJlc3VtZV9tYXBfbnVtYV9rdmEgLSBhZGQgS1ZBIG1hcHBpbmcgdG8gdGhlIHRlbXBvcmFyeSBwYWdlIHRhYmxlcyBjcmVhdGVkCkBAIC0yNDAsMTUgKzEzMCwxNiBAQAogCWludCBub2RlOwogCiAJZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkgewotCQl1bnNpZ25lZCBsb25nIHN0YXJ0X3ZhLCBzdGFydF9wZm4sIHNpemUsIHBmbjsKKwkJdW5zaWduZWQgbG9uZyBzdGFydF92YSwgc3RhcnRfcGZuLCBucl9wYWdlcywgcGZuOwogCiAJCXN0YXJ0X3ZhID0gKHVuc2lnbmVkIGxvbmcpbm9kZV9yZW1hcF9zdGFydF92YWRkcltub2RlXTsKIAkJc3RhcnRfcGZuID0gbm9kZV9yZW1hcF9zdGFydF9wZm5bbm9kZV07Ci0JCXNpemUgPSBub2RlX3JlbWFwX3NpemVbbm9kZV07CisJCW5yX3BhZ2VzID0gKG5vZGVfcmVtYXBfZW5kX3ZhZGRyW25vZGVdIC0KKwkJCSAgICBub2RlX3JlbWFwX3N0YXJ0X3ZhZGRyW25vZGVdKSA+PiBQQUdFX1NISUZUOwogCiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogbm9kZSAlZFxuIiwgX19mdW5jX18sIG5vZGUpOwogCi0JCWZvciAocGZuID0gMDsgcGZuIDwgc2l6ZTsgcGZuICs9IFBUUlNfUEVSX1BURSkgeworCQlmb3IgKHBmbiA9IDA7IHBmbiA8IG5yX3BhZ2VzOyBwZm4gKz0gUFRSU19QRVJfUFRFKSB7CiAJCQl1bnNpZ25lZCBsb25nIHZhZGRyID0gc3RhcnRfdmEgKyAocGZuIDw8IFBBR0VfU0hJRlQpOwogCQkJcGdkX3QgKnBnZCA9IHBnZF9iYXNlICsgcGdkX2luZGV4KHZhZGRyKTsKIAkJCXB1ZF90ICpwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgdmFkZHIpOwpAQCAtMjY0LDEzMiArMTU1LDg5IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIF9faW5pdCB1bnNpZ25lZCBsb25nIGNhbGN1bGF0ZV9udW1hX3JlbWFwX3BhZ2VzKHZvaWQpCisvKioKKyAqIGluaXRfYWxsb2NfcmVtYXAgLSBJbml0aWFsaXplIHJlbWFwIGFsbG9jYXRvciBmb3IgYSBOVU1BIG5vZGUKKyAqIEBuaWQ6IE5VTUEgbm9kZSB0byBpbml0aXpsaWUgcmVtYXAgYWxsb2NhdG9yIGZvcgorICoKKyAqIE5VTUEgbm9kZXMgbWF5IGVuZCB1cCB3aXRob3V0IGFueSBsb3dtZW0uICBBcyBhbGxvY2F0aW5nIHBnZGF0IGFuZAorICogbWVtbWFwIG9uIGEgZGlmZmVyZW50IG5vZGUgd2l0aCBsb3dtZW0gaXMgaW5lZmZpY2llbnQsIGEgc3BlY2lhbAorICogcmVtYXAgYWxsb2NhdG9yIGlzIGltcGxlbWVudGVkIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGFsbG9jX3JlbWFwKCkuCisgKgorICogRm9yIGVhY2ggbm9kZSwgdGhlIGFtb3VudCBvZiBtZW1vcnkgd2hpY2ggd2lsbCBiZSBuZWNlc3NhcnkgZm9yCisgKiBwZ2RhdCBhbmQgbWVtbWFwIGlzIGNhbGN1bGF0ZWQgYW5kIHR3byBtZW1vcnkgYXJlYXMgb2YgdGhlIHNpemUgYXJlCisgKiBhbGxvY2F0ZWQgLSBvbmUgaW4gdGhlIG5vZGUgYW5kIHRoZSBvdGhlciBpbiBsb3dtZW07IHRoZW4sIHRoZSBhcmVhCisgKiBpbiB0aGUgbm9kZSBpcyByZW1hcHBlZCB0byB0aGUgbG93bWVtIGFyZWEuCisgKgorICogQXMgcGdkYXQgYW5kIG1lbW1hcCBtdXN0IGJlIGFsbG9jYXRlZCBpbiBsb3dtZW0gYW55d2F5LCB0aGlzCisgKiBkb2Vzbid0IHdhc3RlIGxvd21lbSBhZGRyZXNzIHNwYWNlOyBob3dldmVyLCB0aGUgYWN0dWFsIGxvd21lbQorICogd2hpY2ggZ2V0cyByZW1hcHBlZCBvdmVyIGlzIHdhc3RlZC4gIFRoZSBhbW91bnQgc2hvdWxkbid0IGJlCisgKiBwcm9ibGVtYXRpYyBvbiBtYWNoaW5lcyB0aGlzIGZlYXR1cmUgd2lsbCBiZSB1c2VkLgorICoKKyAqIEluaXRpYWxpemF0aW9uIGZhaWx1cmUgaXNuJ3QgZmF0YWwuICBhbGxvY19yZW1hcCgpIGlzIHVzZWQKKyAqIG9wcG9ydHVuaXN0aWNhbGx5IGFuZCB0aGUgY2FsbGVycyB3aWxsIGZhbGwgYmFjayB0byBvdGhlciBtZW1vcnkKKyAqIGFsbG9jYXRpb24gbWVjaGFuaXNtcyBvbiBmYWlsdXJlLgorICovCit2b2lkIF9faW5pdCBpbml0X2FsbG9jX3JlbWFwKGludCBuaWQsIHU2NCBzdGFydCwgdTY0IGVuZCkKIHsKLQlpbnQgbmlkOwotCXVuc2lnbmVkIGxvbmcgc2l6ZSwgcmVzZXJ2ZV9wYWdlcyA9IDA7CisJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4gPSBzdGFydCA+PiBQQUdFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgZW5kX3BmbiA9IGVuZCA+PiBQQUdFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgc2l6ZSwgcGZuOworCXU2NCBub2RlX3BhLCByZW1hcF9wYTsKKwl2b2lkICpyZW1hcF92YTsKIAotCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkgewotCQl1NjQgbm9kZV9rdmFfdGFyZ2V0OwotCQl1NjQgbm9kZV9rdmFfZmluYWw7CisJLyoKKwkgKiBUaGUgYWNwaS9zcmF0IG5vZGUgaW5mbyBjYW4gc2hvdyBob3QtYWRkIG1lbXJveSB6b25lcyB3aGVyZQorCSAqIG1lbW9yeSBjb3VsZCBiZSBhZGRlZCBidXQgbm90IGN1cnJlbnRseSBwcmVzZW50LgorCSAqLworCXByaW50ayhLRVJOX0RFQlVHICJub2RlICVkIHBmbjogWyVseCAtICVseF1cbiIsCisJICAgICAgIG5pZCwgc3RhcnRfcGZuLCBlbmRfcGZuKTsKIAotCQkvKgotCQkgKiBUaGUgYWNwaS9zcmF0IG5vZGUgaW5mbyBjYW4gc2hvdyBob3QtYWRkIG1lbXJveSB6b25lcwotCQkgKiB3aGVyZSBtZW1vcnkgY291bGQgYmUgYWRkZWQgYnV0IG5vdCBjdXJyZW50bHkgcHJlc2VudC4KLQkJICovCi0JCXByaW50ayhLRVJOX0RFQlVHICJub2RlICVkIHBmbjogWyVseCAtICVseF1cbiIsCi0JCQluaWQsIG5vZGVfc3RhcnRfcGZuW25pZF0sIG5vZGVfZW5kX3BmbltuaWRdKTsKLQkJaWYgKG5vZGVfc3RhcnRfcGZuW25pZF0gPiBtYXhfcGZuKQotCQkJY29udGludWU7Ci0JCWlmICghbm9kZV9lbmRfcGZuW25pZF0pCi0JCQljb250aW51ZTsKLQkJaWYgKG5vZGVfZW5kX3BmbltuaWRdID4gbWF4X3BmbikKLQkJCW5vZGVfZW5kX3BmbltuaWRdID0gbWF4X3BmbjsKKwkvKiBjYWxjdWxhdGUgdGhlIG5lY2Vzc2FyeSBzcGFjZSBhbGlnbmVkIHRvIGxhcmdlIHBhZ2Ugc2l6ZSAqLworCXNpemUgPSBub2RlX21lbW1hcF9zaXplX2J5dGVzKG5pZCwgc3RhcnRfcGZuLCBlbmRfcGZuKTsKKwlzaXplICs9IEFMSUdOKHNpemVvZihwZ19kYXRhX3QpLCBQQUdFX1NJWkUpOworCXNpemUgPSBBTElHTihzaXplLCBMQVJHRV9QQUdFX0JZVEVTKTsKIAotCQkvKiBlbnN1cmUgdGhlIHJlbWFwIGluY2x1ZGVzIHNwYWNlIGZvciB0aGUgcGdkYXQuICovCi0JCXNpemUgPSBub2RlX3JlbWFwX3NpemVbbmlkXSArIHNpemVvZihwZ19kYXRhX3QpOwotCi0JCS8qIGNvbnZlcnQgc2l6ZSB0byBsYXJnZSAocG1kIHNpemUpIHBhZ2VzLCByb3VuZGluZyB1cCAqLwotCQlzaXplID0gKHNpemUgKyBMQVJHRV9QQUdFX0JZVEVTIC0gMSkgLyBMQVJHRV9QQUdFX0JZVEVTOwotCQkvKiBub3cgdGhlIHJvdW5kdXAgaXMgY29ycmVjdCwgY29udmVydCB0byBQQUdFX1NJWkUgcGFnZXMgKi8KLQkJc2l6ZSA9IHNpemUgKiBQVFJTX1BFUl9QVEU7Ci0KLQkJbm9kZV9rdmFfdGFyZ2V0ID0gcm91bmRfZG93bihub2RlX2VuZF9wZm5bbmlkXSAtIHNpemUsCi0JCQkJCQkgUFRSU19QRVJfUFRFKTsKLQkJbm9kZV9rdmFfdGFyZ2V0IDw8PSBQQUdFX1NISUZUOwotCQlkbyB7Ci0JCQlub2RlX2t2YV9maW5hbCA9IG1lbWJsb2NrX2ZpbmRfaW5fcmFuZ2Uobm9kZV9rdmFfdGFyZ2V0LAotCQkJCQkoKHU2NClub2RlX2VuZF9wZm5bbmlkXSk8PFBBR0VfU0hJRlQsCi0JCQkJCQkoKHU2NClzaXplKTw8UEFHRV9TSElGVCwKLQkJCQkJCUxBUkdFX1BBR0VfQllURVMpOwotCQkJbm9kZV9rdmFfdGFyZ2V0IC09IExBUkdFX1BBR0VfQllURVM7Ci0JCX0gd2hpbGUgKG5vZGVfa3ZhX2ZpbmFsID09IE1FTUJMT0NLX0VSUk9SICYmCi0JCQkgKG5vZGVfa3ZhX3RhcmdldD4+UEFHRV9TSElGVCkgPiAobm9kZV9zdGFydF9wZm5bbmlkXSkpOwotCi0JCWlmIChub2RlX2t2YV9maW5hbCA9PSBNRU1CTE9DS19FUlJPUikKLQkJCXBhbmljKCJDYW4gbm90IGdldCBrdmEgcmFtXG4iKTsKLQotCQlub2RlX3JlbWFwX3NpemVbbmlkXSA9IHNpemU7Ci0JCW5vZGVfcmVtYXBfb2Zmc2V0W25pZF0gPSByZXNlcnZlX3BhZ2VzOwotCQlyZXNlcnZlX3BhZ2VzICs9IHNpemU7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJSZXNlcnZpbmcgJWxkIHBhZ2VzIG9mIEtWQSBmb3IgbG1lbV9tYXAgb2YiCi0JCQkJICAiIG5vZGUgJWQgYXQgJWxseFxuIiwKLQkJCQlzaXplLCBuaWQsIG5vZGVfa3ZhX2ZpbmFsPj5QQUdFX1NISUZUKTsKLQotCQkvKgotCQkgKiAgcHJldmVudCBrdmEgYWRkcmVzcyBiZWxvdyBtYXhfbG93X3BmbiB3YW50IGl0IG9uIHN5c3RlbQotCQkgKiAgd2l0aCBsZXNzIG1lbW9yeSBsYXRlci4KLQkJICogIGxheW91dCB3aWxsIGJlOiBLVkEgYWRkcmVzcyAsIEtWQSBSQU0KLQkJICoKLQkJICogIHdlIGFyZSBzdXBwb3NlZCB0byBvbmx5IHJlY29yZCB0aGUgb25lIGxlc3MgdGhlbiBtYXhfbG93X3BmbgotCQkgKiAgYnV0IHdlIGNvdWxkIGhhdmUgc29tZSBob2xlIGluIGhpZ2ggbWVtb3J5LCBhbmQgaXQgd2lsbCBvbmx5Ci0JCSAqICBjaGVjayBwYWdlX2lzX3JhbShwZm4pICYmICFwYWdlX2lzX3Jlc2VydmVkX2Vhcmx5KHBmbikgdG8gZGVjaWRlCi0JCSAqICB0byB1c2UgaXQgYXMgZnJlZS4KLQkJICogIFNvIG1lbWJsb2NrX3g4Nl9yZXNlcnZlX3JhbmdlIGhlcmUsIGhvcGUgd2UgZG9uJ3QgcnVuIG91dCBvZiB0aGF0IGFycmF5Ci0JCSAqLwotCQltZW1ibG9ja194ODZfcmVzZXJ2ZV9yYW5nZShub2RlX2t2YV9maW5hbCwKLQkJCSAgICAgIG5vZGVfa3ZhX2ZpbmFsKygoKHU2NClzaXplKTw8UEFHRV9TSElGVCksCi0JCQkgICAgICAiS1ZBIFJBTSIpOwotCi0JCW5vZGVfcmVtYXBfc3RhcnRfcGZuW25pZF0gPSBub2RlX2t2YV9maW5hbD4+UEFHRV9TSElGVDsKKwkvKiBhbGxvY2F0ZSBub2RlIG1lbW9yeSBhbmQgdGhlIGxvd21lbSByZW1hcCBhcmVhICovCisJbm9kZV9wYSA9IG1lbWJsb2NrX2ZpbmRfaW5fcmFuZ2Uoc3RhcnQsIGVuZCwgc2l6ZSwgTEFSR0VfUEFHRV9CWVRFUyk7CisJaWYgKG5vZGVfcGEgPT0gTUVNQkxPQ0tfRVJST1IpIHsKKwkJcHJfd2FybmluZygicmVtYXBfYWxsb2M6IGZhaWxlZCB0byBhbGxvY2F0ZSAlbHUgYnl0ZXMgZm9yIG5vZGUgJWRcbiIsCisJCQkgICBzaXplLCBuaWQpOworCQlyZXR1cm47CiAJfQotCXByaW50ayhLRVJOX0lORk8gIlJlc2VydmluZyB0b3RhbCBvZiAlbHggcGFnZXMgZm9yIG51bWEgS1ZBIHJlbWFwXG4iLAotCQkJcmVzZXJ2ZV9wYWdlcyk7Ci0JcmV0dXJuIHJlc2VydmVfcGFnZXM7Ci19CisJbWVtYmxvY2tfeDg2X3Jlc2VydmVfcmFuZ2Uobm9kZV9wYSwgbm9kZV9wYSArIHNpemUsICJLVkEgUkFNIik7CiAKLXN0YXRpYyB2b2lkIGluaXRfcmVtYXBfYWxsb2NhdG9yKGludCBuaWQpCi17Ci0Jbm9kZV9yZW1hcF9zdGFydF92YWRkcltuaWRdID0gcGZuX3RvX2thZGRyKAotCQkJa3ZhX3N0YXJ0X3BmbiArIG5vZGVfcmVtYXBfb2Zmc2V0W25pZF0pOwotCW5vZGVfcmVtYXBfZW5kX3ZhZGRyW25pZF0gPSBub2RlX3JlbWFwX3N0YXJ0X3ZhZGRyW25pZF0gKwotCQkobm9kZV9yZW1hcF9zaXplW25pZF0gKiBQQUdFX1NJWkUpOwotCW5vZGVfcmVtYXBfYWxsb2NfdmFkZHJbbmlkXSA9IG5vZGVfcmVtYXBfc3RhcnRfdmFkZHJbbmlkXSArCi0JCUFMSUdOKHNpemVvZihwZ19kYXRhX3QpLCBQQUdFX1NJWkUpOworCXJlbWFwX3BhID0gbWVtYmxvY2tfZmluZF9pbl9yYW5nZShtaW5fbG93X3BmbiA8PCBQQUdFX1NISUZULAorCQkJCQkgIG1heF9sb3dfcGZuIDw8IFBBR0VfU0hJRlQsCisJCQkJCSAgc2l6ZSwgTEFSR0VfUEFHRV9CWVRFUyk7CisJaWYgKHJlbWFwX3BhID09IE1FTUJMT0NLX0VSUk9SKSB7CisJCXByX3dhcm5pbmcoInJlbWFwX2FsbG9jOiBmYWlsZWQgdG8gYWxsb2NhdGUgJWx1IGJ5dGVzIHJlbWFwIGFyZWEgZm9yIG5vZGUgJWRcbiIsCisJCQkgICBzaXplLCBuaWQpOworCQltZW1ibG9ja194ODZfZnJlZV9yYW5nZShub2RlX3BhLCBub2RlX3BhICsgc2l6ZSk7CisJCXJldHVybjsKKwl9CisJbWVtYmxvY2tfeDg2X3Jlc2VydmVfcmFuZ2UocmVtYXBfcGEsIHJlbWFwX3BhICsgc2l6ZSwgIktWQSBQRyIpOworCXJlbWFwX3ZhID0gcGh5c190b192aXJ0KHJlbWFwX3BhKTsKIAotCXByaW50ayhLRVJOX0RFQlVHICJub2RlICVkIHdpbGwgcmVtYXAgdG8gdmFkZHIgJTA4bHggLSAlMDhseFxuIiwgbmlkLAotCQkodWxvbmcpIG5vZGVfcmVtYXBfc3RhcnRfdmFkZHJbbmlkXSwKLQkJKHVsb25nKSBub2RlX3JlbWFwX2VuZF92YWRkcltuaWRdKTsKKwkvKiBwZXJmb3JtIGFjdHVhbCByZW1hcCAqLworCWZvciAocGZuID0gMDsgcGZuIDwgc2l6ZSA+PiBQQUdFX1NISUZUOyBwZm4gKz0gUFRSU19QRVJfUFRFKQorCQlzZXRfcG1kX3BmbigodW5zaWduZWQgbG9uZylyZW1hcF92YSArIChwZm4gPDwgUEFHRV9TSElGVCksCisJCQkgICAgKG5vZGVfcGEgPj4gUEFHRV9TSElGVCkgKyBwZm4sCisJCQkgICAgUEFHRV9LRVJORUxfTEFSR0UpOworCisJLyogaW5pdGlhbGl6ZSByZW1hcCBhbGxvY2F0b3IgcGFyYW1ldGVycyAqLworCW5vZGVfcmVtYXBfc3RhcnRfcGZuW25pZF0gPSBub2RlX3BhID4+IFBBR0VfU0hJRlQ7CisJbm9kZV9yZW1hcF9zdGFydF92YWRkcltuaWRdID0gcmVtYXBfdmE7CisJbm9kZV9yZW1hcF9lbmRfdmFkZHJbbmlkXSA9IHJlbWFwX3ZhICsgc2l6ZTsKKwlub2RlX3JlbWFwX2FsbG9jX3ZhZGRyW25pZF0gPSByZW1hcF92YTsKKworCXByaW50ayhLRVJOX0RFQlVHICJyZW1hcF9hbGxvYzogbm9kZSAlZCBbJTA4bGx4LSUwOGxseCkgLT4gWyVwLSVwKVxuIiwKKwkgICAgICAgbmlkLCBub2RlX3BhLCBub2RlX3BhICsgc2l6ZSwgcmVtYXBfdmEsIHJlbWFwX3ZhICsgc2l6ZSk7CiB9CiAKIHZvaWQgX19pbml0IGluaXRtZW1faW5pdCh2b2lkKQogewotCWludCBuaWQ7Ci0JbG9uZyBrdmFfdGFyZ2V0X3BmbjsKKwl4ODZfbnVtYV9pbml0KCk7CiAKLQkvKgotCSAqIFdoZW4gbWFwcGluZyBhIE5VTUEgbWFjaGluZSB3ZSBhbGxvY2F0ZSB0aGUgbm9kZV9tZW1fbWFwIGFycmF5cwotCSAqIGZyb20gbm9kZSBsb2NhbCBtZW1vcnkuICBUaGV5IGFyZSB0aGVuIG1hcHBlZCBkaXJlY3RseSBpbnRvIEtWQQotCSAqIGJldHdlZW4gem9uZSBub3JtYWwgYW5kIHZtYWxsb2Mgc3BhY2UuICBDYWxjdWxhdGUgdGhlIHNpemUgb2YKLQkgKiB0aGlzIHNwYWNlIGFuZCB1c2UgaXQgdG8gYWRqdXN0IHRoZSBib3VuZGFyeSBiZXR3ZWVuIFpPTkVfTk9STUFMCi0JICogYW5kIFpPTkVfSElHSE1FTS4KLQkgKi8KLQotCWdldF9tZW1jZmdfbnVtYSgpOwotCW51bWFfaW5pdF9hcnJheSgpOwotCi0Ja3ZhX3BhZ2VzID0gcm91bmR1cChjYWxjdWxhdGVfbnVtYV9yZW1hcF9wYWdlcygpLCBQVFJTX1BFUl9QVEUpOwotCi0Ja3ZhX3RhcmdldF9wZm4gPSByb3VuZF9kb3duKG1heF9sb3dfcGZuIC0ga3ZhX3BhZ2VzLCBQVFJTX1BFUl9QVEUpOwotCWRvIHsKLQkJa3ZhX3N0YXJ0X3BmbiA9IG1lbWJsb2NrX2ZpbmRfaW5fcmFuZ2Uoa3ZhX3RhcmdldF9wZm48PFBBR0VfU0hJRlQsCi0JCQkJCW1heF9sb3dfcGZuPDxQQUdFX1NISUZULAotCQkJCQlrdmFfcGFnZXM8PFBBR0VfU0hJRlQsCi0JCQkJCVBUUlNfUEVSX1BURTw8UEFHRV9TSElGVCkgPj4gUEFHRV9TSElGVDsKLQkJa3ZhX3RhcmdldF9wZm4gLT0gUFRSU19QRVJfUFRFOwotCX0gd2hpbGUgKGt2YV9zdGFydF9wZm4gPT0gTUVNQkxPQ0tfRVJST1IgJiYga3ZhX3RhcmdldF9wZm4gPiBtaW5fbG93X3Bmbik7Ci0KLQlpZiAoa3ZhX3N0YXJ0X3BmbiA9PSBNRU1CTE9DS19FUlJPUikKLQkJcGFuaWMoIkNhbiBub3QgZ2V0IGt2YSBzcGFjZVxuIik7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJrdmFfc3RhcnRfcGZuIH4gJWx4IG1heF9sb3dfcGZuIH4gJWx4XG4iLAotCQlrdmFfc3RhcnRfcGZuLCBtYXhfbG93X3Bmbik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAibWF4X3BmbiA9ICVseFxuIiwgbWF4X3Bmbik7Ci0KLQkvKiBhdm9pZCBjbGFzaCB3aXRoIGluaXRyZCAqLwotCW1lbWJsb2NrX3g4Nl9yZXNlcnZlX3JhbmdlKGt2YV9zdGFydF9wZm48PFBBR0VfU0hJRlQsCi0JCSAgICAgIChrdmFfc3RhcnRfcGZuICsga3ZhX3BhZ2VzKTw8UEFHRV9TSElGVCwKLQkJICAgICAiS1ZBIFBHIik7CiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KIAloaWdoc3RhcnRfcGZuID0gaGlnaGVuZF9wZm4gPSBtYXhfcGZuOwogCWlmIChtYXhfcGZuID4gbWF4X2xvd19wZm4pCkBAIC00MDksNTEgKzI1Nyw5IEBACiAKIAlwcmludGsoS0VSTl9ERUJVRyAiTG93IG1lbW9yeSBlbmRzIGF0IHZhZGRyICUwOGx4XG4iLAogCQkJKHVsb25nKSBwZm5fdG9fa2FkZHIobWF4X2xvd19wZm4pKTsKLQlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHsKLQkJaW5pdF9yZW1hcF9hbGxvY2F0b3IobmlkKTsKLQotCQlhbGxvY2F0ZV9wZ2RhdChuaWQpOwotCX0KLQlyZW1hcF9udW1hX2t2YSgpOwogCiAJcHJpbnRrKEtFUk5fREVCVUcgIkhpZ2ggbWVtb3J5IHN0YXJ0cyBhdCB2YWRkciAlMDhseFxuIiwKIAkJCSh1bG9uZykgcGZuX3RvX2thZGRyKGhpZ2hzdGFydF9wZm4pKTsKLQlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpCi0JCXByb3BhZ2F0ZV9lODIwX21hcF9ub2RlKG5pZCk7Ci0KLQlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHsKLQkJbWVtc2V0KE5PREVfREFUQShuaWQpLCAwLCBzaXplb2Yoc3RydWN0IHBnbGlzdF9kYXRhKSk7Ci0JCU5PREVfREFUQShuaWQpLT5ub2RlX2lkID0gbmlkOwotCX0KIAogCXNldHVwX2Jvb3RtZW1fYWxsb2NhdG9yKCk7CiB9Ci0KLSNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUcKLXN0YXRpYyBpbnQgcGFkZHJfdG9fbmlkKHU2NCBhZGRyKQotewotCWludCBuaWQ7Ci0JdW5zaWduZWQgbG9uZyBwZm4gPSBQRk5fRE9XTihhZGRyKTsKLQotCWZvcl9lYWNoX25vZGUobmlkKQotCQlpZiAobm9kZV9zdGFydF9wZm5bbmlkXSA8PSBwZm4gJiYKLQkJICAgIHBmbiA8IG5vZGVfZW5kX3BmbltuaWRdKQotCQkJcmV0dXJuIG5pZDsKLQotCXJldHVybiAtMTsKLX0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhc2sgbm9kZSBpZCBCRUZPUkUgbWVtbWFwIGFuZCBtZW1fc2VjdGlvbidzCi0gKiBpbml0aWFsaXphdGlvbiAocGZuX3RvX25pZCgpIGNhbid0IGJlIHVzZWQgeWV0KS4KLSAqIElmIF9QWE0gaXMgbm90IGRlZmluZWQgb24gQUNQSSdzIERTRFQsIG5vZGUgaWQgbXVzdCBiZSBmb3VuZCBieSB0aGlzLgotICovCi1pbnQgbWVtb3J5X2FkZF9waHlzYWRkcl90b19uaWQodTY0IGFkZHIpCi17Ci0JaW50IG5pZCA9IHBhZGRyX3RvX25pZChhZGRyKTsKLQlyZXR1cm4gKG5pZCA+PSAwKSA/IG5pZCA6IDA7Ci19Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKG1lbW9yeV9hZGRfcGh5c2FkZHJfdG9fbmlkKTsKLSNlbmRpZgotCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9udW1hXzY0LmMgYi9hcmNoL3g4Ni9tbS9udW1hXzY0LmMKaW5kZXggODViNTJmYy4uZGQyN2Y0MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vbnVtYV82NC5jCisrKyBiL2FyY2gveDg2L21tL251bWFfNjQuYwpAQCAtMiw2NDYgKzIsMTMgQEAKICAqIEdlbmVyaWMgVk0gaW5pdGlhbGl6YXRpb24gZm9yIHg4Ni02NCBOVU1BIHNldHVwcy4KICAqIENvcHlyaWdodCAyMDAyLDIwMDMgQW5kaSBLbGVlbiwgU3VTRSBMYWJzLgogICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvbW16b25lLmg+Ci0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvYWNwaS5oPgotCi0jaW5jbHVkZSA8YXNtL2U4MjAuaD4KLSNpbmNsdWRlIDxhc20vcHJvdG8uaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL2FjcGkuaD4KLSNpbmNsdWRlIDxhc20vYW1kX25iLmg+CiAKICNpbmNsdWRlICJudW1hX2ludGVybmFsLmgiCiAKLXN0cnVjdCBwZ2xpc3RfZGF0YSAqbm9kZV9kYXRhW01BWF9OVU1OT0RFU10gX19yZWFkX21vc3RseTsKLUVYUE9SVF9TWU1CT0wobm9kZV9kYXRhKTsKLQotbm9kZW1hc2tfdCBudW1hX25vZGVzX3BhcnNlZCBfX2luaXRkYXRhOwotCi1zdHJ1Y3QgbWVtbm9kZSBtZW1ub2RlOwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIG5vZGVtYXBfYWRkcjsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgbm9kZW1hcF9zaXplOwotCi1zdGF0aWMgc3RydWN0IG51bWFfbWVtaW5mbyBudW1hX21lbWluZm8gX19pbml0ZGF0YTsKLQotc3RhdGljIGludCBudW1hX2Rpc3RhbmNlX2NudDsKLXN0YXRpYyB1OCAqbnVtYV9kaXN0YW5jZTsKLQotLyoKLSAqIEdpdmVuIGEgc2hpZnQgdmFsdWUsIHRyeSB0byBwb3B1bGF0ZSBtZW1ub2RlbWFwW10KLSAqIFJldHVybnMgOgotICogMSBpZiBPSwotICogMCBpZiBtZW1ub2RtYXBbXSB0b28gc21hbGwgKG9mIHNoaWZ0IHRvbyBzbWFsbCkKLSAqIC0xIGlmIG5vZGUgb3ZlcmxhcCBvciBsb3N0IHJhbSAoc2hpZnQgdG9vIGJpZykKLSAqLwotc3RhdGljIGludCBfX2luaXQgcG9wdWxhdGVfbWVtbm9kZW1hcChjb25zdCBzdHJ1Y3QgbnVtYV9tZW1pbmZvICptaSwgaW50IHNoaWZ0KQotewotCXVuc2lnbmVkIGxvbmcgYWRkciwgZW5kOwotCWludCBpLCByZXMgPSAtMTsKLQotCW1lbXNldChtZW1ub2RlbWFwLCAweGZmLCBzaXplb2YoczE2KSptZW1ub2RlbWFwc2l6ZSk7Ci0JZm9yIChpID0gMDsgaSA8IG1pLT5ucl9ibGtzOyBpKyspIHsKLQkJYWRkciA9IG1pLT5ibGtbaV0uc3RhcnQ7Ci0JCWVuZCA9IG1pLT5ibGtbaV0uZW5kOwotCQlpZiAoYWRkciA+PSBlbmQpCi0JCQljb250aW51ZTsKLQkJaWYgKChlbmQgPj4gc2hpZnQpID49IG1lbW5vZGVtYXBzaXplKQotCQkJcmV0dXJuIDA7Ci0JCWRvIHsKLQkJCWlmIChtZW1ub2RlbWFwW2FkZHIgPj4gc2hpZnRdICE9IE5VTUFfTk9fTk9ERSkKLQkJCQlyZXR1cm4gLTE7Ci0JCQltZW1ub2RlbWFwW2FkZHIgPj4gc2hpZnRdID0gbWktPmJsa1tpXS5uaWQ7Ci0JCQlhZGRyICs9ICgxVUwgPDwgc2hpZnQpOwotCQl9IHdoaWxlIChhZGRyIDwgZW5kKTsKLQkJcmVzID0gMTsKLQl9Ci0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludCBfX2luaXQgYWxsb2NhdGVfY2FjaGVhbGlnbmVkX21lbW5vZGVtYXAodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGFkZHI7Ci0KLQltZW1ub2RlbWFwID0gbWVtbm9kZS5lbWJlZGRlZF9tYXA7Ci0JaWYgKG1lbW5vZGVtYXBzaXplIDw9IEFSUkFZX1NJWkUobWVtbm9kZS5lbWJlZGRlZF9tYXApKQotCQlyZXR1cm4gMDsKLQotCWFkZHIgPSAweDgwMDA7Ci0Jbm9kZW1hcF9zaXplID0gcm91bmR1cChzaXplb2YoczE2KSAqIG1lbW5vZGVtYXBzaXplLCBMMV9DQUNIRV9CWVRFUyk7Ci0Jbm9kZW1hcF9hZGRyID0gbWVtYmxvY2tfZmluZF9pbl9yYW5nZShhZGRyLCBnZXRfbWF4X21hcHBlZCgpLAotCQkJCSAgICAgIG5vZGVtYXBfc2l6ZSwgTDFfQ0FDSEVfQllURVMpOwotCWlmIChub2RlbWFwX2FkZHIgPT0gTUVNQkxPQ0tfRVJST1IpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiTlVNQTogVW5hYmxlIHRvIGFsbG9jYXRlIE1lbW9yeSB0byBOb2RlIGhhc2ggbWFwXG4iKTsKLQkJbm9kZW1hcF9hZGRyID0gbm9kZW1hcF9zaXplID0gMDsKLQkJcmV0dXJuIC0xOwotCX0KLQltZW1ub2RlbWFwID0gcGh5c190b192aXJ0KG5vZGVtYXBfYWRkcik7Ci0JbWVtYmxvY2tfeDg2X3Jlc2VydmVfcmFuZ2Uobm9kZW1hcF9hZGRyLCBub2RlbWFwX2FkZHIgKyBub2RlbWFwX3NpemUsICJNRU1OT0RFTUFQIik7Ci0KLQlwcmludGsoS0VSTl9ERUJVRyAiTlVNQTogQWxsb2NhdGVkIG1lbW5vZGVtYXAgZnJvbSAlbHggLSAlbHhcbiIsCi0JICAgICAgIG5vZGVtYXBfYWRkciwgbm9kZW1hcF9hZGRyICsgbm9kZW1hcF9zaXplKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFRoZSBMU0Igb2YgYWxsIHN0YXJ0IGFuZCBlbmQgYWRkcmVzc2VzIGluIHRoZSBub2RlIG1hcCBpcyB0aGUgdmFsdWUgb2YgdGhlCi0gKiBtYXhpbXVtIHBvc3NpYmxlIHNoaWZ0LgotICovCi1zdGF0aWMgaW50IF9faW5pdCBleHRyYWN0X2xzYl9mcm9tX25vZGVzKGNvbnN0IHN0cnVjdCBudW1hX21lbWluZm8gKm1pKQotewotCWludCBpLCBub2Rlc191c2VkID0gMDsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7Ci0JdW5zaWduZWQgbG9uZyBiaXRmaWVsZCA9IDAsIG1lbXRvcCA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbWktPm5yX2Jsa3M7IGkrKykgewotCQlzdGFydCA9IG1pLT5ibGtbaV0uc3RhcnQ7Ci0JCWVuZCA9IG1pLT5ibGtbaV0uZW5kOwotCQlpZiAoc3RhcnQgPj0gZW5kKQotCQkJY29udGludWU7Ci0JCWJpdGZpZWxkIHw9IHN0YXJ0OwotCQlub2Rlc191c2VkKys7Ci0JCWlmIChlbmQgPiBtZW10b3ApCi0JCQltZW10b3AgPSBlbmQ7Ci0JfQotCWlmIChub2Rlc191c2VkIDw9IDEpCi0JCWkgPSA2MzsKLQllbHNlCi0JCWkgPSBmaW5kX2ZpcnN0X2JpdCgmYml0ZmllbGQsIHNpemVvZih1bnNpZ25lZCBsb25nKSo4KTsKLQltZW1ub2RlbWFwc2l6ZSA9IChtZW10b3AgPj4gaSkrMTsKLQlyZXR1cm4gaTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgY29tcHV0ZV9oYXNoX3NoaWZ0KGNvbnN0IHN0cnVjdCBudW1hX21lbWluZm8gKm1pKQotewotCWludCBzaGlmdDsKLQotCXNoaWZ0ID0gZXh0cmFjdF9sc2JfZnJvbV9ub2RlcyhtaSk7Ci0JaWYgKGFsbG9jYXRlX2NhY2hlYWxpZ25lZF9tZW1ub2RlbWFwKCkpCi0JCXJldHVybiAtMTsKLQlwcmludGsoS0VSTl9ERUJVRyAiTlVNQTogVXNpbmcgJWQgZm9yIHRoZSBoYXNoIHNoaWZ0LlxuIiwKLQkJc2hpZnQpOwotCi0JaWYgKHBvcHVsYXRlX21lbW5vZGVtYXAobWksIHNoaWZ0KSAhPSAxKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIllvdXIgbWVtb3J5IGlzIG5vdCBhbGlnbmVkIHlvdSBuZWVkIHRvICIKLQkJICAgICAgICJyZWJ1aWxkIHlvdXIga2VybmVsIHdpdGggYSBiaWdnZXIgTk9ERU1BUFNJWkUgIgotCQkgICAgICAgInNoaWZ0PSVkXG4iLCBzaGlmdCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIHNoaWZ0OwotfQotCi1pbnQgX19tZW1pbml0ICBfX2Vhcmx5X3Bmbl90b19uaWQodW5zaWduZWQgbG9uZyBwZm4pCi17Ci0JcmV0dXJuIHBoeXNfdG9fbmlkKHBmbiA8PCBQQUdFX1NISUZUKTsKLX0KLQotc3RhdGljIHZvaWQgKiBfX2luaXQgZWFybHlfbm9kZV9tZW0oaW50IG5vZGVpZCwgdW5zaWduZWQgbG9uZyBzdGFydCwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBlbmQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBhbGlnbikKLXsKLQl1bnNpZ25lZCBsb25nIG1lbTsKLQotCS8qCi0JICogcHV0IGl0IG9uIGhpZ2ggYXMgcG9zc2libGUKLQkgKiBzb21ldGhpbmcgd2lsbCBnbyB3aXRoIE5PREVfREFUQQotCSAqLwotCWlmIChzdGFydCA8IChNQVhfRE1BX1BGTjw8UEFHRV9TSElGVCkpCi0JCXN0YXJ0ID0gTUFYX0RNQV9QRk48PFBBR0VfU0hJRlQ7Ci0JaWYgKHN0YXJ0IDwgKE1BWF9ETUEzMl9QRk48PFBBR0VfU0hJRlQpICYmCi0JICAgIGVuZCA+IChNQVhfRE1BMzJfUEZOPDxQQUdFX1NISUZUKSkKLQkJc3RhcnQgPSBNQVhfRE1BMzJfUEZOPDxQQUdFX1NISUZUOwotCW1lbSA9IG1lbWJsb2NrX3g4Nl9maW5kX2luX3JhbmdlX25vZGUobm9kZWlkLCBzdGFydCwgZW5kLCBzaXplLCBhbGlnbik7Ci0JaWYgKG1lbSAhPSBNRU1CTE9DS19FUlJPUikKLQkJcmV0dXJuIF9fdmEobWVtKTsKLQotCS8qIGV4dGVuZCB0aGUgc2VhcmNoIHNjb3BlICovCi0JZW5kID0gbWF4X3Bmbl9tYXBwZWQgPDwgUEFHRV9TSElGVDsKLQlzdGFydCA9IE1BWF9ETUFfUEZOIDw8IFBBR0VfU0hJRlQ7Ci0JbWVtID0gbWVtYmxvY2tfZmluZF9pbl9yYW5nZShzdGFydCwgZW5kLCBzaXplLCBhbGlnbik7Ci0JaWYgKG1lbSAhPSBNRU1CTE9DS19FUlJPUikKLQkJcmV0dXJuIF9fdmEobWVtKTsKLQotCXByaW50ayhLRVJOX0VSUiAiQ2Fubm90IGZpbmQgJWx1IGJ5dGVzIGluIG5vZGUgJWRcbiIsCi0JCSAgICAgICBzaXplLCBub2RlaWQpOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IG51bWFfYWRkX21lbWJsa190byhpbnQgbmlkLCB1NjQgc3RhcnQsIHU2NCBlbmQsCi0JCQkJICAgICBzdHJ1Y3QgbnVtYV9tZW1pbmZvICptaSkKLXsKLQkvKiBpZ25vcmUgemVybyBsZW5ndGggYmxrcyAqLwotCWlmIChzdGFydCA9PSBlbmQpCi0JCXJldHVybiAwOwotCi0JLyogd2hpbmUgYWJvdXQgYW5kIGlnbm9yZSBpbnZhbGlkIGJsa3MgKi8KLQlpZiAoc3RhcnQgPiBlbmQgfHwgbmlkIDwgMCB8fCBuaWQgPj0gTUFYX05VTU5PREVTKSB7Ci0JCXByX3dhcm5pbmcoIk5VTUE6IFdhcm5pbmc6IGludmFsaWQgbWVtYmxrIG5vZGUgJWQgKCVMeC0lTHgpXG4iLAotCQkJICAgbmlkLCBzdGFydCwgZW5kKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKG1pLT5ucl9ibGtzID49IE5SX05PREVfTUVNQkxLUykgewotCQlwcl9lcnIoIk5VTUE6IHRvbyBtYW55IG1lbWJsayByYW5nZXNcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltaS0+YmxrW21pLT5ucl9ibGtzXS5zdGFydCA9IHN0YXJ0OwotCW1pLT5ibGtbbWktPm5yX2Jsa3NdLmVuZCA9IGVuZDsKLQltaS0+YmxrW21pLT5ucl9ibGtzXS5uaWQgPSBuaWQ7Ci0JbWktPm5yX2Jsa3MrKzsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBudW1hX3JlbW92ZV9tZW1ibGtfZnJvbSAtIFJlbW92ZSBvbmUgbnVtYV9tZW1ibGsgZnJvbSBhIG51bWFfbWVtaW5mbwotICogQGlkeDogSW5kZXggb2YgbWVtYmxrIHRvIHJlbW92ZQotICogQG1pOiBudW1hX21lbWluZm8gdG8gcmVtb3ZlIG1lbWJsayBmcm9tCi0gKgotICogUmVtb3ZlIEBpZHgndGggbnVtYV9tZW1ibGsgZnJvbSBAbWkgYnkgc2hpZnRpbmcgQG1pLT5ibGtbXSBhbmQKLSAqIGRlY3JlbWVudGluZyBAbWktPm5yX2Jsa3MuCi0gKi8KLXZvaWQgX19pbml0IG51bWFfcmVtb3ZlX21lbWJsa19mcm9tKGludCBpZHgsIHN0cnVjdCBudW1hX21lbWluZm8gKm1pKQotewotCW1pLT5ucl9ibGtzLS07Ci0JbWVtbW92ZSgmbWktPmJsa1tpZHhdLCAmbWktPmJsa1tpZHggKyAxXSwKLQkJKG1pLT5ucl9ibGtzIC0gaWR4KSAqIHNpemVvZihtaS0+YmxrWzBdKSk7Ci19Ci0KLS8qKgotICogbnVtYV9hZGRfbWVtYmxrIC0gQWRkIG9uZSBudW1hX21lbWJsayB0byBudW1hX21lbWluZm8KLSAqIEBuaWQ6IE5VTUEgbm9kZSBJRCBvZiB0aGUgbmV3IG1lbWJsawotICogQHN0YXJ0OiBTdGFydCBhZGRyZXNzIG9mIHRoZSBuZXcgbWVtYmxrCi0gKiBAZW5kOiBFbmQgYWRkcmVzcyBvZiB0aGUgbmV3IG1lbWJsawotICoKLSAqIEFkZCBhIG5ldyBtZW1ibGsgdG8gdGhlIGRlZmF1bHQgbnVtYV9tZW1pbmZvLgotICoKLSAqIFJFVFVSTlM6Ci0gKiAwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJlLgotICovCi1pbnQgX19pbml0IG51bWFfYWRkX21lbWJsayhpbnQgbmlkLCB1NjQgc3RhcnQsIHU2NCBlbmQpCi17Ci0JcmV0dXJuIG51bWFfYWRkX21lbWJsa190byhuaWQsIHN0YXJ0LCBlbmQsICZudW1hX21lbWluZm8pOwotfQotCi0vKiBJbml0aWFsaXplIGJvb3RtZW0gYWxsb2NhdG9yIGZvciBhIG5vZGUgKi8KLXZvaWQgX19pbml0Ci1zZXR1cF9ub2RlX2Jvb3RtZW0oaW50IG5vZGVpZCwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCi17Ci0JdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIGxhc3RfcGZuLCBub2RlZGF0YV9waHlzOwotCWNvbnN0IGludCBwZ2RhdF9zaXplID0gcm91bmR1cChzaXplb2YocGdfZGF0YV90KSwgUEFHRV9TSVpFKTsKLQlpbnQgbmlkOwotCi0JaWYgKCFlbmQpCi0JCXJldHVybjsKLQotCS8qCi0JICogRG9uJ3QgY29uZnVzZSBWTSB3aXRoIGEgbm9kZSB0aGF0IGRvZXNuJ3QgaGF2ZSB0aGUKLQkgKiBtaW5pbXVtIGFtb3VudCBvZiBtZW1vcnk6Ci0JICovCi0JaWYgKGVuZCAmJiAoZW5kIC0gc3RhcnQpIDwgTk9ERV9NSU5fU0laRSkKLQkJcmV0dXJuOwotCi0Jc3RhcnQgPSByb3VuZHVwKHN0YXJ0LCBaT05FX0FMSUdOKTsKLQotCXByaW50ayhLRVJOX0lORk8gIkluaXRtZW0gc2V0dXAgbm9kZSAlZCAlMDE2bHgtJTAxNmx4XG4iLCBub2RlaWQsCi0JICAgICAgIHN0YXJ0LCBlbmQpOwotCi0Jc3RhcnRfcGZuID0gc3RhcnQgPj4gUEFHRV9TSElGVDsKLQlsYXN0X3BmbiA9IGVuZCA+PiBQQUdFX1NISUZUOwotCi0Jbm9kZV9kYXRhW25vZGVpZF0gPSBlYXJseV9ub2RlX21lbShub2RlaWQsIHN0YXJ0LCBlbmQsIHBnZGF0X3NpemUsCi0JCQkJCSAgIFNNUF9DQUNIRV9CWVRFUyk7Ci0JaWYgKG5vZGVfZGF0YVtub2RlaWRdID09IE5VTEwpCi0JCXJldHVybjsKLQlub2RlZGF0YV9waHlzID0gX19wYShub2RlX2RhdGFbbm9kZWlkXSk7Ci0JbWVtYmxvY2tfeDg2X3Jlc2VydmVfcmFuZ2Uobm9kZWRhdGFfcGh5cywgbm9kZWRhdGFfcGh5cyArIHBnZGF0X3NpemUsICJOT0RFX0RBVEEiKTsKLQlwcmludGsoS0VSTl9JTkZPICIgIE5PREVfREFUQSBbJTAxNmx4IC0gJTAxNmx4XVxuIiwgbm9kZWRhdGFfcGh5cywKLQkJbm9kZWRhdGFfcGh5cyArIHBnZGF0X3NpemUgLSAxKTsKLQluaWQgPSBwaHlzX3RvX25pZChub2RlZGF0YV9waHlzKTsKLQlpZiAobmlkICE9IG5vZGVpZCkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiICAgIE5PREVfREFUQSglZCkgb24gbm9kZSAlZFxuIiwgbm9kZWlkLCBuaWQpOwotCi0JbWVtc2V0KE5PREVfREFUQShub2RlaWQpLCAwLCBzaXplb2YocGdfZGF0YV90KSk7Ci0JTk9ERV9EQVRBKG5vZGVpZCktPm5vZGVfaWQgPSBub2RlaWQ7Ci0JTk9ERV9EQVRBKG5vZGVpZCktPm5vZGVfc3RhcnRfcGZuID0gc3RhcnRfcGZuOwotCU5PREVfREFUQShub2RlaWQpLT5ub2RlX3NwYW5uZWRfcGFnZXMgPSBsYXN0X3BmbiAtIHN0YXJ0X3BmbjsKLQotCW5vZGVfc2V0X29ubGluZShub2RlaWQpOwotfQotCi0vKioKLSAqIG51bWFfY2xlYW51cF9tZW1pbmZvIC0gQ2xlYW51cCBhIG51bWFfbWVtaW5mbwotICogQG1pOiBudW1hX21lbWluZm8gdG8gY2xlYW4gdXAKLSAqCi0gKiBTYW5pdGl6ZSBAbWkgYnkgbWVyZ2luZyBhbmQgcmVtb3ZpbmcgdW5uY2Vzc2FyeSBtZW1ibGtzLiAgQWxzbyBjaGVjayBmb3IKLSAqIGNvbmZsaWN0cyBhbmQgY2xlYXIgdW51c2VkIG1lbWJsa3MuCi0gKgotICogUkVUVVJOUzoKLSAqIDAgb24gc3VjY2VzcywgLWVycm5vIG9uIGZhaWx1cmUuCi0gKi8KLWludCBfX2luaXQgbnVtYV9jbGVhbnVwX21lbWluZm8oc3RydWN0IG51bWFfbWVtaW5mbyAqbWkpCi17Ci0JY29uc3QgdTY0IGxvdyA9IDA7Ci0JY29uc3QgdTY0IGhpZ2ggPSAodTY0KW1heF9wZm4gPDwgUEFHRV9TSElGVDsKLQlpbnQgaSwgaiwgazsKLQotCWZvciAoaSA9IDA7IGkgPCBtaS0+bnJfYmxrczsgaSsrKSB7Ci0JCXN0cnVjdCBudW1hX21lbWJsayAqYmkgPSAmbWktPmJsa1tpXTsKLQotCQkvKiBtYWtlIHN1cmUgYWxsIGJsb2NrcyBhcmUgaW5zaWRlIHRoZSBsaW1pdHMgKi8KLQkJYmktPnN0YXJ0ID0gbWF4KGJpLT5zdGFydCwgbG93KTsKLQkJYmktPmVuZCA9IG1pbihiaS0+ZW5kLCBoaWdoKTsKLQotCQkvKiBhbmQgdGhlcmUncyBubyBlbXB0eSBibG9jayAqLwotCQlpZiAoYmktPnN0YXJ0ID49IGJpLT5lbmQpIHsKLQkJCW51bWFfcmVtb3ZlX21lbWJsa19mcm9tKGktLSwgbWkpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlmb3IgKGogPSBpICsgMTsgaiA8IG1pLT5ucl9ibGtzOyBqKyspIHsKLQkJCXN0cnVjdCBudW1hX21lbWJsayAqYmogPSAmbWktPmJsa1tqXTsKLQkJCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKLQotCQkJLyoKLQkJCSAqIFNlZSB3aGV0aGVyIHRoZXJlIGFyZSBvdmVybGFwcGluZyBibG9ja3MuICBXaGluZQotCQkJICogYWJvdXQgYnV0IGFsbG93IG92ZXJsYXBzIG9mIHRoZSBzYW1lIG5pZC4gIFRoZXkKLQkJCSAqIHdpbGwgYmUgbWVyZ2VkIGJlbG93LgotCQkJICovCi0JCQlpZiAoYmktPmVuZCA+IGJqLT5zdGFydCAmJiBiaS0+c3RhcnQgPCBiai0+ZW5kKSB7Ci0JCQkJaWYgKGJpLT5uaWQgIT0gYmotPm5pZCkgewotCQkJCQlwcl9lcnIoIk5VTUE6IG5vZGUgJWQgKCVMeC0lTHgpIG92ZXJsYXBzIHdpdGggbm9kZSAlZCAoJUx4LSVMeClcbiIsCi0JCQkJCSAgICAgICBiaS0+bmlkLCBiaS0+c3RhcnQsIGJpLT5lbmQsCi0JCQkJCSAgICAgICBiai0+bmlkLCBiai0+c3RhcnQsIGJqLT5lbmQpOwotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQl9Ci0JCQkJcHJfd2FybmluZygiTlVNQTogV2FybmluZzogbm9kZSAlZCAoJUx4LSVMeCkgb3ZlcmxhcHMgd2l0aCBpdHNlbGYgKCVMeC0lTHgpXG4iLAotCQkJCQkgICBiaS0+bmlkLCBiaS0+c3RhcnQsIGJpLT5lbmQsCi0JCQkJCSAgIGJqLT5zdGFydCwgYmotPmVuZCk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBKb2luIHRvZ2V0aGVyIGJsb2NrcyBvbiB0aGUgc2FtZSBub2RlLCBob2xlcwotCQkJICogYmV0d2VlbiB3aGljaCBkb24ndCBvdmVybGFwIHdpdGggbWVtb3J5IG9uIG90aGVyCi0JCQkgKiBub2Rlcy4KLQkJCSAqLwotCQkJaWYgKGJpLT5uaWQgIT0gYmotPm5pZCkKLQkJCQljb250aW51ZTsKLQkJCXN0YXJ0ID0gbWF4KG1pbihiaS0+c3RhcnQsIGJqLT5zdGFydCksIGxvdyk7Ci0JCQllbmQgPSBtaW4obWF4KGJpLT5lbmQsIGJqLT5lbmQpLCBoaWdoKTsKLQkJCWZvciAoayA9IDA7IGsgPCBtaS0+bnJfYmxrczsgaysrKSB7Ci0JCQkJc3RydWN0IG51bWFfbWVtYmxrICpiayA9ICZtaS0+YmxrW2tdOwotCi0JCQkJaWYgKGJpLT5uaWQgPT0gYmstPm5pZCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKHN0YXJ0IDwgYmstPmVuZCAmJiBlbmQgPiBiay0+c3RhcnQpCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGsgPCBtaS0+bnJfYmxrcykKLQkJCQljb250aW51ZTsKLQkJCXByaW50ayhLRVJOX0lORk8gIk5VTUE6IE5vZGUgJWQgWyVMeCwlTHgpICsgWyVMeCwlTHgpIC0+IFslbHgsJWx4KVxuIiwKLQkJCSAgICAgICBiaS0+bmlkLCBiaS0+c3RhcnQsIGJpLT5lbmQsIGJqLT5zdGFydCwgYmotPmVuZCwKLQkJCSAgICAgICBzdGFydCwgZW5kKTsKLQkJCWJpLT5zdGFydCA9IHN0YXJ0OwotCQkJYmktPmVuZCA9IGVuZDsKLQkJCW51bWFfcmVtb3ZlX21lbWJsa19mcm9tKGotLSwgbWkpOwotCQl9Ci0JfQotCi0JZm9yIChpID0gbWktPm5yX2Jsa3M7IGkgPCBBUlJBWV9TSVpFKG1pLT5ibGspOyBpKyspIHsKLQkJbWktPmJsa1tpXS5zdGFydCA9IG1pLT5ibGtbaV0uZW5kID0gMDsKLQkJbWktPmJsa1tpXS5uaWQgPSBOVU1BX05PX05PREU7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBTZXQgbm9kZXMsIHdoaWNoIGhhdmUgbWVtb3J5IGluIEBtaSwgaW4gKkBub2RlbWFzay4KLSAqLwotc3RhdGljIHZvaWQgX19pbml0IG51bWFfbm9kZW1hc2tfZnJvbV9tZW1pbmZvKG5vZGVtYXNrX3QgKm5vZGVtYXNrLAotCQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbnVtYV9tZW1pbmZvICptaSkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1pLT5ibGspOyBpKyspCi0JCWlmIChtaS0+YmxrW2ldLnN0YXJ0ICE9IG1pLT5ibGtbaV0uZW5kICYmCi0JCSAgICBtaS0+YmxrW2ldLm5pZCAhPSBOVU1BX05PX05PREUpCi0JCQlub2RlX3NldChtaS0+YmxrW2ldLm5pZCwgKm5vZGVtYXNrKTsKLX0KLQotLyoqCi0gKiBudW1hX3Jlc2V0X2Rpc3RhbmNlIC0gUmVzZXQgTlVNQSBkaXN0YW5jZSB0YWJsZQotICoKLSAqIFRoZSBjdXJyZW50IHRhYmxlIGlzIGZyZWVkLiAgVGhlIG5leHQgbnVtYV9zZXRfZGlzdGFuY2UoKSBjYWxsIHdpbGwKLSAqIGNyZWF0ZSBhIG5ldyBvbmUuCi0gKi8KLXZvaWQgX19pbml0IG51bWFfcmVzZXRfZGlzdGFuY2Uodm9pZCkKLXsKLQlzaXplX3Qgc2l6ZSA9IG51bWFfZGlzdGFuY2VfY250ICogbnVtYV9kaXN0YW5jZV9jbnQgKiBzaXplb2YobnVtYV9kaXN0YW5jZVswXSk7Ci0KLQkvKiBudW1hX2Rpc3RhbmNlIGNvdWxkIGJlIDFMVSBtYXJraW5nIGFsbG9jYXRpb24gZmFpbHVyZSwgdGVzdCBjbnQgKi8KLQlpZiAobnVtYV9kaXN0YW5jZV9jbnQpCi0JCW1lbWJsb2NrX3g4Nl9mcmVlX3JhbmdlKF9fcGEobnVtYV9kaXN0YW5jZSksCi0JCQkJCV9fcGEobnVtYV9kaXN0YW5jZSkgKyBzaXplKTsKLQludW1hX2Rpc3RhbmNlX2NudCA9IDA7Ci0JbnVtYV9kaXN0YW5jZSA9IE5VTEw7CS8qIGVuYWJsZSB0YWJsZSBjcmVhdGlvbiAqLwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBudW1hX2FsbG9jX2Rpc3RhbmNlKHZvaWQpCi17Ci0Jbm9kZW1hc2tfdCBub2Rlc19wYXJzZWQ7Ci0Jc2l6ZV90IHNpemU7Ci0JaW50IGksIGosIGNudCA9IDA7Ci0JdTY0IHBoeXM7Ci0KLQkvKiBzaXplIHRoZSBuZXcgdGFibGUgYW5kIGFsbG9jYXRlIGl0ICovCi0Jbm9kZXNfcGFyc2VkID0gbnVtYV9ub2Rlc19wYXJzZWQ7Ci0JbnVtYV9ub2RlbWFza19mcm9tX21lbWluZm8oJm5vZGVzX3BhcnNlZCwgJm51bWFfbWVtaW5mbyk7Ci0KLQlmb3JfZWFjaF9ub2RlX21hc2soaSwgbm9kZXNfcGFyc2VkKQotCQljbnQgPSBpOwotCWNudCsrOwotCXNpemUgPSBjbnQgKiBjbnQgKiBzaXplb2YobnVtYV9kaXN0YW5jZVswXSk7Ci0KLQlwaHlzID0gbWVtYmxvY2tfZmluZF9pbl9yYW5nZSgwLCAodTY0KW1heF9wZm5fbWFwcGVkIDw8IFBBR0VfU0hJRlQsCi0JCQkJICAgICAgc2l6ZSwgUEFHRV9TSVpFKTsKLQlpZiAocGh5cyA9PSBNRU1CTE9DS19FUlJPUikgewotCQlwcl93YXJuaW5nKCJOVU1BOiBXYXJuaW5nOiBjYW4ndCBhbGxvY2F0ZSBkaXN0YW5jZSB0YWJsZSFcbiIpOwotCQkvKiBkb24ndCByZXRyeSB1bnRpbCBleHBsaWNpdGx5IHJlc2V0ICovCi0JCW51bWFfZGlzdGFuY2UgPSAodm9pZCAqKTFMVTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCW1lbWJsb2NrX3g4Nl9yZXNlcnZlX3JhbmdlKHBoeXMsIHBoeXMgKyBzaXplLCAiTlVNQSBESVNUIik7Ci0KLQludW1hX2Rpc3RhbmNlID0gX192YShwaHlzKTsKLQludW1hX2Rpc3RhbmNlX2NudCA9IGNudDsKLQotCS8qIGZpbGwgd2l0aCB0aGUgZGVmYXVsdCBkaXN0YW5jZXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspCi0JCWZvciAoaiA9IDA7IGogPCBjbnQ7IGorKykKLQkJCW51bWFfZGlzdGFuY2VbaSAqIGNudCArIGpdID0gaSA9PSBqID8KLQkJCQlMT0NBTF9ESVNUQU5DRSA6IFJFTU9URV9ESVNUQU5DRTsKLQlwcmludGsoS0VSTl9ERUJVRyAiTlVNQTogSW5pdGlhbGl6ZWQgZGlzdGFuY2UgdGFibGUsIGNudD0lZFxuIiwgY250KTsKLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIG51bWFfc2V0X2Rpc3RhbmNlIC0gU2V0IE5VTUEgZGlzdGFuY2UgZnJvbSBvbmUgTlVNQSB0byBhbm90aGVyCi0gKiBAZnJvbTogdGhlICdmcm9tJyBub2RlIHRvIHNldCBkaXN0YW5jZQotICogQHRvOiB0aGUgJ3RvJyAgbm9kZSB0byBzZXQgZGlzdGFuY2UKLSAqIEBkaXN0YW5jZTogTlVNQSBkaXN0YW5jZQotICoKLSAqIFNldCB0aGUgZGlzdGFuY2UgZnJvbSBub2RlIEBmcm9tIHRvIEB0byB0byBAZGlzdGFuY2UuICBJZiBkaXN0YW5jZSB0YWJsZQotICogZG9lc24ndCBleGlzdCwgb25lIHdoaWNoIGlzIGxhcmdlIGVub3VnaCB0byBhY2NvbW1vZGF0ZSBhbGwgdGhlIGN1cnJlbnRseQotICoga25vd24gbm9kZXMgd2lsbCBiZSBjcmVhdGVkLgotICoKLSAqIElmIHN1Y2ggdGFibGUgY2Fubm90IGJlIGFsbG9jYXRlZCwgYSB3YXJuaW5nIGlzIHByaW50ZWQgYW5kIGZ1cnRoZXIKLSAqIGNhbGxzIGFyZSBpZ25vcmVkIHVudGlsIHRoZSBkaXN0YW5jZSB0YWJsZSBpcyByZXNldCB3aXRoCi0gKiBudW1hX3Jlc2V0X2Rpc3RhbmNlKCkuCi0gKgotICogSWYgQGZyb20gb3IgQHRvIGlzIGhpZ2hlciB0aGFuIHRoZSBoaWdoZXN0IGtub3duIG5vZGUgYXQgdGhlIHRpbWUgb2YKLSAqIHRhYmxlIGNyZWF0aW9uIG9yIEBkaXN0YW5jZSBkb2Vzbid0IG1ha2Ugc2Vuc2UsIHRoZSBjYWxsIGlzIGlnbm9yZWQuCi0gKiBUaGlzIGlzIHRvIGFsbG93IHNpbXBsaWZpY2F0aW9uIG9mIHNwZWNpZmljIE5VTUEgY29uZmlnIGltcGxlbWVudGF0aW9ucy4KLSAqLwotdm9pZCBfX2luaXQgbnVtYV9zZXRfZGlzdGFuY2UoaW50IGZyb20sIGludCB0bywgaW50IGRpc3RhbmNlKQotewotCWlmICghbnVtYV9kaXN0YW5jZSAmJiBudW1hX2FsbG9jX2Rpc3RhbmNlKCkgPCAwKQotCQlyZXR1cm47Ci0KLQlpZiAoZnJvbSA+PSBudW1hX2Rpc3RhbmNlX2NudCB8fCB0byA+PSBudW1hX2Rpc3RhbmNlX2NudCkgewotCQlwcmludGtfb25jZShLRVJOX0RFQlVHICJOVU1BOiBEZWJ1ZzogZGlzdGFuY2Ugb3V0IG9mIGJvdW5kLCBmcm9tPSVkIHRvPSVkIGRpc3RhbmNlPSVkXG4iLAotCQkJICAgIGZyb20sIHRvLCBkaXN0YW5jZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoKHU4KWRpc3RhbmNlICE9IGRpc3RhbmNlIHx8Ci0JICAgIChmcm9tID09IHRvICYmIGRpc3RhbmNlICE9IExPQ0FMX0RJU1RBTkNFKSkgewotCQlwcl93YXJuX29uY2UoIk5VTUE6IFdhcm5pbmc6IGludmFsaWQgZGlzdGFuY2UgcGFyYW1ldGVyLCBmcm9tPSVkIHRvPSVkIGRpc3RhbmNlPSVkXG4iLAotCQkJICAgICBmcm9tLCB0bywgZGlzdGFuY2UpOwotCQlyZXR1cm47Ci0JfQotCi0JbnVtYV9kaXN0YW5jZVtmcm9tICogbnVtYV9kaXN0YW5jZV9jbnQgKyB0b10gPSBkaXN0YW5jZTsKLX0KLQotaW50IF9fbm9kZV9kaXN0YW5jZShpbnQgZnJvbSwgaW50IHRvKQotewotCWlmIChmcm9tID49IG51bWFfZGlzdGFuY2VfY250IHx8IHRvID49IG51bWFfZGlzdGFuY2VfY250KQotCQlyZXR1cm4gZnJvbSA9PSB0byA/IExPQ0FMX0RJU1RBTkNFIDogUkVNT1RFX0RJU1RBTkNFOwotCXJldHVybiBudW1hX2Rpc3RhbmNlW2Zyb20gKiBudW1hX2Rpc3RhbmNlX2NudCArIHRvXTsKLX0KLUVYUE9SVF9TWU1CT0woX19ub2RlX2Rpc3RhbmNlKTsKLQotLyoKLSAqIFNhbml0eSBjaGVjayB0byBjYXRjaCBtb3JlIGJhZCBOVU1BIGNvbmZpZ3VyYXRpb25zICh0aGV5IGFyZSBhbWF6aW5nbHkKLSAqIGNvbW1vbikuICBNYWtlIHN1cmUgdGhlIG5vZGVzIGNvdmVyIGFsbCBtZW1vcnkuCi0gKi8KLXN0YXRpYyBib29sIF9faW5pdCBudW1hX21lbWluZm9fY292ZXJfbWVtb3J5KGNvbnN0IHN0cnVjdCBudW1hX21lbWluZm8gKm1pKQotewotCXVuc2lnbmVkIGxvbmcgbnVtYXJhbSwgZTgyMHJhbTsKLQlpbnQgaTsKLQotCW51bWFyYW0gPSAwOwotCWZvciAoaSA9IDA7IGkgPCBtaS0+bnJfYmxrczsgaSsrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgcyA9IG1pLT5ibGtbaV0uc3RhcnQgPj4gUEFHRV9TSElGVDsKLQkJdW5zaWduZWQgbG9uZyBlID0gbWktPmJsa1tpXS5lbmQgPj4gUEFHRV9TSElGVDsKLQkJbnVtYXJhbSArPSBlIC0gczsKLQkJbnVtYXJhbSAtPSBfX2Fic2VudF9wYWdlc19pbl9yYW5nZShtaS0+YmxrW2ldLm5pZCwgcywgZSk7Ci0JCWlmICgobG9uZyludW1hcmFtIDwgMCkKLQkJCW51bWFyYW0gPSAwOwotCX0KLQotCWU4MjByYW0gPSBtYXhfcGZuIC0gKG1lbWJsb2NrX3g4Nl9ob2xlX3NpemUoMCwKLQkJCQkJbWF4X3BmbiA8PCBQQUdFX1NISUZUKSA+PiBQQUdFX1NISUZUKTsKLQkvKiBXZSBzZWVtIHRvIGxvc2UgMyBwYWdlcyBzb21ld2hlcmUuIEFsbG93IDFNIG9mIHNsYWNrLiAqLwotCWlmICgobG9uZykoZTgyMHJhbSAtIG51bWFyYW0pID49ICgxIDw8ICgyMCAtIFBBR0VfU0hJRlQpKSkgewotCQlwcmludGsoS0VSTl9FUlIgIk5VTUE6IG5vZGVzIG9ubHkgY292ZXIgJWx1TUIgb2YgeW91ciAlbHVNQiBlODIwIFJBTS4gTm90IHVzZWQuXG4iLAotCQkgICAgICAgKG51bWFyYW0gPDwgUEFHRV9TSElGVCkgPj4gMjAsCi0JCSAgICAgICAoZTgyMHJhbSA8PCBQQUdFX1NISUZUKSA+PiAyMCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IG51bWFfcmVnaXN0ZXJfbWVtYmxrcyhzdHJ1Y3QgbnVtYV9tZW1pbmZvICptaSkKLXsKLQlpbnQgaSwgbmlkOwotCi0JLyogQWNjb3VudCBmb3Igbm9kZXMgd2l0aCBjcHVzIGFuZCBubyBtZW1vcnkgKi8KLQlub2RlX3Bvc3NpYmxlX21hcCA9IG51bWFfbm9kZXNfcGFyc2VkOwotCW51bWFfbm9kZW1hc2tfZnJvbV9tZW1pbmZvKCZub2RlX3Bvc3NpYmxlX21hcCwgbWkpOwotCWlmIChXQVJOX09OKG5vZGVzX2VtcHR5KG5vZGVfcG9zc2libGVfbWFwKSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbWVtbm9kZV9zaGlmdCA9IGNvbXB1dGVfaGFzaF9zaGlmdChtaSk7Ci0JaWYgKG1lbW5vZGVfc2hpZnQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTlVNQTogTm8gTlVNQSBub2RlIGhhc2ggZnVuY3Rpb24gZm91bmQuIENvbnRhY3QgbWFpbnRhaW5lclxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBtaS0+bnJfYmxrczsgaSsrKQotCQltZW1ibG9ja194ODZfcmVnaXN0ZXJfYWN0aXZlX3JlZ2lvbnMobWktPmJsa1tpXS5uaWQsCi0JCQkJCW1pLT5ibGtbaV0uc3RhcnQgPj4gUEFHRV9TSElGVCwKLQkJCQkJbWktPmJsa1tpXS5lbmQgPj4gUEFHRV9TSElGVCk7Ci0KLQkvKiBmb3Igb3V0IG9mIG9yZGVyIGVudHJpZXMgKi8KLQlzb3J0X25vZGVfbWFwKCk7Ci0JaWYgKCFudW1hX21lbWluZm9fY292ZXJfbWVtb3J5KG1pKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBGaW5hbGx5IHJlZ2lzdGVyIG5vZGVzLiAqLwotCWZvcl9lYWNoX25vZGVfbWFzayhuaWQsIG5vZGVfcG9zc2libGVfbWFwKSB7Ci0JCXU2NCBzdGFydCA9ICh1NjQpbWF4X3BmbiA8PCBQQUdFX1NISUZUOwotCQl1NjQgZW5kID0gMDsKLQotCQlmb3IgKGkgPSAwOyBpIDwgbWktPm5yX2Jsa3M7IGkrKykgewotCQkJaWYgKG5pZCAhPSBtaS0+YmxrW2ldLm5pZCkKLQkJCQljb250aW51ZTsKLQkJCXN0YXJ0ID0gbWluKG1pLT5ibGtbaV0uc3RhcnQsIHN0YXJ0KTsKLQkJCWVuZCA9IG1heChtaS0+YmxrW2ldLmVuZCwgZW5kKTsKLQkJfQotCi0JCWlmIChzdGFydCA8IGVuZCkKLQkJCXNldHVwX25vZGVfYm9vdG1lbShuaWQsIHN0YXJ0LCBlbmQpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGR1bW15X251bW1hX2luaXQgLSBGYWxsYmFjayBkdW1teSBOVU1BIGluaXQKLSAqCi0gKiBVc2VkIGlmIHRoZXJlJ3Mgbm8gdW5kZXJseWluZyBOVU1BIGFyY2hpdGVjdHVyZSwgTlVNQSBpbml0aWFsaXphdGlvbgotICogZmFpbHMsIG9yIE5VTUEgaXMgZGlzYWJsZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KLSAqCi0gKiBNdXN0IG9ubGluZSBhdCBsZWFzdCBvbmUgbm9kZSBhbmQgYWRkIG1lbW9yeSBibG9ja3MgdGhhdCBjb3ZlciBhbGwKLSAqIGFsbG93ZWQgbWVtb3J5LiAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBmYWlsLgotICovCi1zdGF0aWMgaW50IF9faW5pdCBkdW1teV9udW1hX2luaXQodm9pZCkKLXsKLQlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwKLQkgICAgICAgbnVtYV9vZmYgPyAiTlVNQSB0dXJuZWQgb2ZmIiA6ICJObyBOVU1BIGNvbmZpZ3VyYXRpb24gZm91bmQiKTsKLQlwcmludGsoS0VSTl9JTkZPICJGYWtpbmcgYSBub2RlIGF0ICUwMTZseC0lMDE2bHhcbiIsCi0JICAgICAgIDBMVSwgbWF4X3BmbiA8PCBQQUdFX1NISUZUKTsKLQotCW5vZGVfc2V0KDAsIG51bWFfbm9kZXNfcGFyc2VkKTsKLQludW1hX2FkZF9tZW1ibGsoMCwgMCwgKHU2NCltYXhfcGZuIDw8IFBBR0VfU0hJRlQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IG51bWFfaW5pdChpbnQgKCppbml0X2Z1bmMpKHZvaWQpKQotewotCWludCBpOwotCWludCByZXQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xPQ0FMX0FQSUM7IGkrKykKLQkJc2V0X2FwaWNpZF90b19ub2RlKGksIE5VTUFfTk9fTk9ERSk7Ci0KLQlub2Rlc19jbGVhcihudW1hX25vZGVzX3BhcnNlZCk7Ci0Jbm9kZXNfY2xlYXIobm9kZV9wb3NzaWJsZV9tYXApOwotCW5vZGVzX2NsZWFyKG5vZGVfb25saW5lX21hcCk7Ci0JbWVtc2V0KCZudW1hX21lbWluZm8sIDAsIHNpemVvZihudW1hX21lbWluZm8pKTsKLQlyZW1vdmVfYWxsX2FjdGl2ZV9yYW5nZXMoKTsKLQludW1hX3Jlc2V0X2Rpc3RhbmNlKCk7Ci0KLQlyZXQgPSBpbml0X2Z1bmMoKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQlyZXQgPSBudW1hX2NsZWFudXBfbWVtaW5mbygmbnVtYV9tZW1pbmZvKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCW51bWFfZW11bGF0aW9uKCZudW1hX21lbWluZm8sIG51bWFfZGlzdGFuY2VfY250KTsKLQotCXJldCA9IG51bWFfcmVnaXN0ZXJfbWVtYmxrcygmbnVtYV9tZW1pbmZvKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWZvciAoaSA9IDA7IGkgPCBucl9jcHVfaWRzOyBpKyspIHsKLQkJaW50IG5pZCA9IGVhcmx5X2NwdV90b19ub2RlKGkpOwotCi0JCWlmIChuaWQgPT0gTlVNQV9OT19OT0RFKQotCQkJY29udGludWU7Ci0JCWlmICghbm9kZV9vbmxpbmUobmlkKSkKLQkJCW51bWFfY2xlYXJfbm9kZShpKTsKLQl9Ci0JbnVtYV9pbml0X2FycmF5KCk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHZvaWQgX19pbml0IGluaXRtZW1faW5pdCh2b2lkKQogewotCWludCByZXQ7Ci0KLQlpZiAoIW51bWFfb2ZmKSB7Ci0jaWZkZWYgQ09ORklHX0FDUElfTlVNQQotCQlyZXQgPSBudW1hX2luaXQoeDg2X2FjcGlfbnVtYV9pbml0KTsKLQkJaWYgKCFyZXQpCi0JCQlyZXR1cm47Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQU1EX05VTUEKLQkJcmV0ID0gbnVtYV9pbml0KGFtZF9udW1hX2luaXQpOwotCQlpZiAoIXJldCkKLQkJCXJldHVybjsKLSNlbmRpZgotCX0KLQotCW51bWFfaW5pdChkdW1teV9udW1hX2luaXQpOworCXg4Nl9udW1hX2luaXQoKTsKIH0KIAogdW5zaWduZWQgbG9uZyBfX2luaXQgbnVtYV9mcmVlX2FsbF9ib290bWVtKHZvaWQpCkBAIC02NTYsMTIgKzIzLDMgQEAKIAogCXJldHVybiBwYWdlczsKIH0KLQotaW50IF9fY3B1aW5pdCBudW1hX2NwdV9ub2RlKGludCBjcHUpCi17Ci0JaW50IGFwaWNpZCA9IGVhcmx5X3Blcl9jcHUoeDg2X2NwdV90b19hcGljaWQsIGNwdSk7Ci0KLQlpZiAoYXBpY2lkICE9IEJBRF9BUElDSUQpCi0JCXJldHVybiBfX2FwaWNpZF90b19ub2RlW2FwaWNpZF07Ci0JcmV0dXJuIE5VTUFfTk9fTk9ERTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL251bWFfZW11bGF0aW9uLmMgYi9hcmNoL3g4Ni9tbS9udW1hX2VtdWxhdGlvbi5jCmluZGV4IGRlODRjYzEuLmQwZWQwODYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL251bWFfZW11bGF0aW9uLmMKKysrIGIvYXJjaC94ODYvbW0vbnVtYV9lbXVsYXRpb24uYwpAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3RvcG9sb2d5Lmg+CiAjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogCiAjaW5jbHVkZSAibnVtYV9pbnRlcm5hbC5oIgpAQCAtODQsNyArODUsMTMgQEAKIAkJbnJfbm9kZXMgPSBNQVhfTlVNTk9ERVM7CiAJfQogCi0Jc2l6ZSA9IChtYXhfYWRkciAtIGFkZHIgLSBtZW1ibG9ja194ODZfaG9sZV9zaXplKGFkZHIsIG1heF9hZGRyKSkgLyBucl9ub2RlczsKKwkvKgorCSAqIENhbGN1bGF0ZSB0YXJnZXQgbm9kZSBzaXplLiAgeDg2XzMyIGZyZWFrcyBvbiBfX3VkaXZkaTMoKSBzbyBkbworCSAqIHRoZSBkaXZpc2lvbiBpbiB1bG9uZyBudW1iZXIgb2YgcGFnZXMgYW5kIGNvbnZlcnQgYmFjay4KKwkgKi8KKwlzaXplID0gbWF4X2FkZHIgLSBhZGRyIC0gbWVtYmxvY2tfeDg2X2hvbGVfc2l6ZShhZGRyLCBtYXhfYWRkcik7CisJc2l6ZSA9IFBGTl9QSFlTKCh1bnNpZ25lZCBsb25nKShzaXplID4+IFBBR0VfU0hJRlQpIC8gbnJfbm9kZXMpOworCiAJLyoKIAkgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBiaWcgbm9kZXMgdGhhdCBjYW4gYmUgYWxsb2NhdGVkIGFzIGEgcmVzdWx0CiAJICogb2YgY29uc29saWRhdGluZyB0aGUgcmVtYWluZGVyLgpAQCAtMjI2LDcgKzIzMyw3IEBACiAJICovCiAJd2hpbGUgKG5vZGVzX3dlaWdodChwaHlzbm9kZV9tYXNrKSkgewogCQlmb3JfZWFjaF9ub2RlX21hc2soaSwgcGh5c25vZGVfbWFzaykgewotCQkJdTY0IGRtYTMyX2VuZCA9IE1BWF9ETUEzMl9QRk4gPDwgUEFHRV9TSElGVDsKKwkJCXU2NCBkbWEzMl9lbmQgPSBQRk5fUEhZUyhNQVhfRE1BMzJfUEZOKTsKIAkJCXU2NCBzdGFydCwgbGltaXQsIGVuZDsKIAkJCWludCBwaHlzX2JsazsKIApAQCAtMjk4LDcgKzMwNSw3IEBACiB7CiAJc3RhdGljIHN0cnVjdCBudW1hX21lbWluZm8gZWkgX19pbml0ZGF0YTsKIAlzdGF0aWMgc3RydWN0IG51bWFfbWVtaW5mbyBwaSBfX2luaXRkYXRhOwotCWNvbnN0IHU2NCBtYXhfYWRkciA9IG1heF9wZm4gPDwgUEFHRV9TSElGVDsKKwljb25zdCB1NjQgbWF4X2FkZHIgPSBQRk5fUEhZUyhtYXhfcGZuKTsKIAl1OCAqcGh5c19kaXN0ID0gTlVMTDsKIAlzaXplX3QgcGh5c19zaXplID0gbnVtYV9kaXN0X2NudCAqIG51bWFfZGlzdF9jbnQgKiBzaXplb2YocGh5c19kaXN0WzBdKTsKIAlpbnQgbWF4X2VtdV9uaWQsIGRmbF9waHlzX25pZDsKQEAgLTM0Miw4ICszNDksNyBAQAogCWlmIChudW1hX2Rpc3RfY250KSB7CiAJCXU2NCBwaHlzOwogCi0JCXBoeXMgPSBtZW1ibG9ja19maW5kX2luX3JhbmdlKDAsCi0JCQkJCSAgICAgICh1NjQpbWF4X3Bmbl9tYXBwZWQgPDwgUEFHRV9TSElGVCwKKwkJcGh5cyA9IG1lbWJsb2NrX2ZpbmRfaW5fcmFuZ2UoMCwgUEZOX1BIWVMobWF4X3Bmbl9tYXBwZWQpLAogCQkJCQkgICAgICBwaHlzX3NpemUsIFBBR0VfU0laRSk7CiAJCWlmIChwaHlzID09IE1FTUJMT0NLX0VSUk9SKSB7CiAJCQlwcl93YXJuaW5nKCJOVU1BOiBXYXJuaW5nOiBjYW4ndCBhbGxvY2F0ZSBjb3B5IG9mIGRpc3RhbmNlIHRhYmxlLCBkaXNhYmxpbmcgZW11bGF0aW9uXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL251bWFfaW50ZXJuYWwuaCBiL2FyY2gveDg2L21tL251bWFfaW50ZXJuYWwuaAppbmRleCBlZjJkOTczLi43MTc4YzNhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9udW1hX2ludGVybmFsLmgKKysrIGIvYXJjaC94ODYvbW0vbnVtYV9pbnRlcm5hbC5oCkBAIC0xOSw2ICsxOSwxNCBAQAogaW50IF9faW5pdCBudW1hX2NsZWFudXBfbWVtaW5mbyhzdHJ1Y3QgbnVtYV9tZW1pbmZvICptaSk7CiB2b2lkIF9faW5pdCBudW1hX3Jlc2V0X2Rpc3RhbmNlKHZvaWQpOwogCit2b2lkIF9faW5pdCB4ODZfbnVtYV9pbml0KHZvaWQpOworCisjaWZkZWYgQ09ORklHX1g4Nl82NAorc3RhdGljIGlubGluZSB2b2lkIGluaXRfYWxsb2NfcmVtYXAoaW50IG5pZCwgdTY0IHN0YXJ0LCB1NjQgZW5kKQl7IH0KKyNlbHNlCit2b2lkIF9faW5pdCBpbml0X2FsbG9jX3JlbWFwKGludCBuaWQsIHU2NCBzdGFydCwgdTY0IGVuZCk7CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19OVU1BX0VNVQogdm9pZCBfX2luaXQgbnVtYV9lbXVsYXRpb24oc3RydWN0IG51bWFfbWVtaW5mbyAqbnVtYV9tZW1pbmZvLAogCQkJICAgaW50IG51bWFfZGlzdF9jbnQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vc3JhdF82NC5jIGIvYXJjaC94ODYvbW0vc3JhdC5jCnNpbWlsYXJpdHkgaW5kZXggNjclCnJlbmFtZSBmcm9tIGFyY2gveDg2L21tL3NyYXRfNjQuYwpyZW5hbWUgdG8gYXJjaC94ODYvbW0vc3JhdC5jCmluZGV4IDhlOWQzMzkuLjgxZGJmZGUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL3NyYXRfNjQuYworKysgYi9hcmNoL3g4Ni9tbS9zcmF0LmMKQEAgLTI2LDggKzI2LDYgQEAKIAogaW50IGFjcGlfbnVtYSBfX2luaXRkYXRhOwogCi1zdGF0aWMgc3RydWN0IGJvb3Rub2RlIG5vZGVzX2FkZFtNQVhfTlVNTk9ERVNdOwotCiBzdGF0aWMgX19pbml0IGludCBzZXR1cF9ub2RlKGludCBweG0pCiB7CiAJcmV0dXJuIGFjcGlfbWFwX3B4bV90b19ub2RlKHB4bSk7CkBAIC0zNyw3ICszNSw2IEBACiB7CiAJcHJpbnRrKEtFUk5fRVJSICJTUkFUOiBTUkFUIG5vdCB1c2VkLlxuIik7CiAJYWNwaV9udW1hID0gLTE7Ci0JbWVtc2V0KG5vZGVzX2FkZCwgMCwgc2l6ZW9mKG5vZGVzX2FkZCkpOwogfQogCiBzdGF0aWMgX19pbml0IGlubGluZSBpbnQgc3JhdF9kaXNhYmxlZCh2b2lkKQpAQCAtMTMxLDczICsxMjgsMTcgQEAKIAkgICAgICAgcHhtLCBhcGljX2lkLCBub2RlKTsKIH0KIAotI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUExVR19TUEFSU0UKKyNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUcKIHN0YXRpYyBpbmxpbmUgaW50IHNhdmVfYWRkX2luZm8odm9pZCkge3JldHVybiAxO30KICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBzYXZlX2FkZF9pbmZvKHZvaWQpIHtyZXR1cm4gMDt9CiAjZW5kaWYKLS8qCi0gKiBVcGRhdGUgbm9kZXNfYWRkW10KLSAqIFRoaXMgY29kZSBzdXBwb3J0cyBvbmUgY29udGlndW91cyBob3QgYWRkIGFyZWEgcGVyIG5vZGUKLSAqLwotc3RhdGljIHZvaWQgX19pbml0Ci11cGRhdGVfbm9kZXNfYWRkKGludCBub2RlLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKLXsKLQl1bnNpZ25lZCBsb25nIHNfcGZuID0gc3RhcnQgPj4gUEFHRV9TSElGVDsKLQl1bnNpZ25lZCBsb25nIGVfcGZuID0gZW5kID4+IFBBR0VfU0hJRlQ7Ci0JaW50IGNoYW5nZWQgPSAwOwotCXN0cnVjdCBib290bm9kZSAqbmQgPSAmbm9kZXNfYWRkW25vZGVdOwotCi0JLyogSSBoYWQgc29tZSB0cm91YmxlIHdpdGggc3RyYW5nZSBtZW1vcnkgaG90YWRkIHJlZ2lvbnMgYnJlYWtpbmcKLQkgICB0aGUgYm9vdC4gQmUgdmVyeSBzdHJpY3QgaGVyZSBhbmQgcmVqZWN0IGFueXRoaW5nIHVuZXhwZWN0ZWQuCi0JICAgSWYgeW91IHdhbnQgd29ya2luZyBtZW1vcnkgaG90YWRkIHdyaXRlIGNvcnJlY3QgU1JBVHMuCi0KLQkgICBUaGUgbm9kZSBzaXplIGNoZWNrIGlzIGEgYmFzaWMgc2FuaXR5IGNoZWNrIHRvIGd1YXJkIGFnYWluc3QKLQkgICBtaXN0YWtlcyAqLwotCWlmICgoc2lnbmVkIGxvbmcpKGVuZCAtIHN0YXJ0KSA8IE5PREVfTUlOX1NJWkUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTUkFUOiBIb3RwbHVnIGFyZWEgdG9vIHNtYWxsXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFRoaXMgY2hlY2sgbWlnaHQgYmUgYSBiaXQgdG9vIHN0cmljdCwgYnV0IEknbSBrZWVwaW5nIGl0IGZvciBub3cuICovCi0JaWYgKGFic2VudF9wYWdlc19pbl9yYW5nZShzX3BmbiwgZV9wZm4pICE9IGVfcGZuIC0gc19wZm4pIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkiU1JBVDogSG90cGx1ZyBhcmVhICVsdSAtPiAlbHUgaGFzIGV4aXN0aW5nIG1lbW9yeVxuIiwKLQkJCXNfcGZuLCBlX3Bmbik7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBMb29rcyBnb29kICovCi0KLQlpZiAobmQtPnN0YXJ0ID09IG5kLT5lbmQpIHsKLQkJbmQtPnN0YXJ0ID0gc3RhcnQ7Ci0JCW5kLT5lbmQgPSBlbmQ7Ci0JCWNoYW5nZWQgPSAxOwotCX0gZWxzZSB7Ci0JCWlmIChuZC0+c3RhcnQgPT0gZW5kKSB7Ci0JCQluZC0+c3RhcnQgPSBzdGFydDsKLQkJCWNoYW5nZWQgPSAxOwotCQl9Ci0JCWlmIChuZC0+ZW5kID09IHN0YXJ0KSB7Ci0JCQluZC0+ZW5kID0gZW5kOwotCQkJY2hhbmdlZCA9IDE7Ci0JCX0KLQkJaWYgKCFjaGFuZ2VkKQotCQkJcHJpbnRrKEtFUk5fRVJSICJTUkFUOiBIb3RwbHVnIHpvbmUgbm90IGNvbnRpbnVvdXMuIFBhcnRseSBpZ25vcmVkXG4iKTsKLQl9Ci0KLQlpZiAoY2hhbmdlZCkgewotCQlub2RlX3NldChub2RlLCBudW1hX25vZGVzX3BhcnNlZCk7Ci0JCXByaW50ayhLRVJOX0lORk8gIlNSQVQ6IGhvdCBwbHVnIHpvbmUgZm91bmQgJUx4IC0gJUx4XG4iLAotCQkJCSBuZC0+c3RhcnQsIG5kLT5lbmQpOwotCX0KLX0KIAogLyogQ2FsbGJhY2sgZm9yIHBhcnNpbmcgb2YgdGhlIFByb3hpbWl0eSBEb21haW4gPC0+IE1lbW9yeSBBcmVhIG1hcHBpbmdzICovCiB2b2lkIF9faW5pdAogYWNwaV9udW1hX21lbW9yeV9hZmZpbml0eV9pbml0KHN0cnVjdCBhY3BpX3NyYXRfbWVtX2FmZmluaXR5ICptYSkKIHsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7CisJdTY0IHN0YXJ0LCBlbmQ7CiAJaW50IG5vZGUsIHB4bTsKIAogCWlmIChzcmF0X2Rpc2FibGVkKCkpCkBAIC0yMjYsMTEgKzE2Nyw4IEBACiAJCXJldHVybjsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPICJTUkFUOiBOb2RlICV1IFBYTSAldSAlbHgtJWx4XG4iLCBub2RlLCBweG0sCisJcHJpbnRrKEtFUk5fSU5GTyAiU1JBVDogTm9kZSAldSBQWE0gJXUgJUx4LSVMeFxuIiwgbm9kZSwgcHhtLAogCSAgICAgICBzdGFydCwgZW5kKTsKLQotCWlmIChtYS0+ZmxhZ3MgJiBBQ1BJX1NSQVRfTUVNX0hPVF9QTFVHR0FCTEUpCi0JCXVwZGF0ZV9ub2Rlc19hZGQobm9kZSwgc3RhcnQsIGVuZCk7CiB9CiAKIHZvaWQgX19pbml0IGFjcGlfbnVtYV9hcmNoX2ZpeHVwKHZvaWQpIHt9CkBAIC0yNDQsMTcgKzE4MiwzIEBACiAJCXJldHVybiByZXQ7CiAJcmV0dXJuIHNyYXRfZGlzYWJsZWQoKSA/IC1FSU5WQUwgOiAwOwogfQotCi0jaWYgZGVmaW5lZChDT05GSUdfTUVNT1JZX0hPVFBMVUdfU1BBUlNFKSB8fCBkZWZpbmVkKENPTkZJR19BQ1BJX0hPVFBMVUdfTUVNT1JZKQotaW50IG1lbW9yeV9hZGRfcGh5c2FkZHJfdG9fbmlkKHU2NCBzdGFydCkKLXsKLQlpbnQgaSwgcmV0ID0gMDsKLQotCWZvcl9lYWNoX25vZGUoaSkKLQkJaWYgKG5vZGVzX2FkZFtpXS5zdGFydCA8PSBzdGFydCAmJiBub2Rlc19hZGRbaV0uZW5kID4gc3RhcnQpCi0JCQlyZXQgPSBpOwotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKG1lbW9yeV9hZGRfcGh5c2FkZHJfdG9fbmlkKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vc3JhdF8zMi5jIGIvYXJjaC94ODYvbW0vc3JhdF8zMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjRmMzZiLi4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L21tL3NyYXRfMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0vKgotICogU29tZSBvZiB0aGUgY29kZSBpbiB0aGlzIGZpbGUgaGFzIGJlZW4gZ2xlYW5lZCBmcm9tIHRoZSA2NCBiaXQgCi0gKiBkaXNjb250aWdtZW0gc3VwcG9ydCBjb2RlIGJhc2UuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyLCBJQk0gQ29ycC4KLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgotICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKLSAqIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKiBTZW5kIGZlZWRiYWNrIHRvIFBhdCBHYXVnaGVuIDxnb25lQHVzLmlibS5jb20+Ci0gKi8KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgotI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgotI2luY2x1ZGUgPGFzbS9zcmF0Lmg+Ci0jaW5jbHVkZSA8YXNtL3RvcG9sb2d5Lmg+Ci0jaW5jbHVkZSA8YXNtL3NtcC5oPgotI2luY2x1ZGUgPGFzbS9lODIwLmg+Ci0KLS8qCi0gKiBwcm94aW1pdHkgbWFjcm9zIGFuZCBkZWZpbml0aW9ucwotICovCi0jZGVmaW5lIE5PREVfQVJSQVlfSU5ERVgoeCkJKCh4KSAvIDgpCS8qIDggYml0cy9jaGFyICovCi0jZGVmaW5lIE5PREVfQVJSQVlfT0ZGU0VUKHgpCSgoeCkgJSA4KQkvKiA4IGJpdHMvY2hhciAqLwotI2RlZmluZSBCTUFQX1NFVChibWFwLCBiaXQpCSgoYm1hcClbTk9ERV9BUlJBWV9JTkRFWChiaXQpXSB8PSAxIDw8IE5PREVfQVJSQVlfT0ZGU0VUKGJpdCkpCi0jZGVmaW5lIEJNQVBfVEVTVChibWFwLCBiaXQpCSgoYm1hcClbTk9ERV9BUlJBWV9JTkRFWChiaXQpXSAmICgxIDw8IE5PREVfQVJSQVlfT0ZGU0VUKGJpdCkpKQotLyogYml0bWFwIGxlbmd0aDsgX1BYTSBpcyBhdCBtb3N0IDI1NSAqLwotI2RlZmluZSBQWE1fQklUTUFQX0xFTiAoTUFYX1BYTV9ET01BSU5TIC8gOCkgCi1zdGF0aWMgdTggX19pbml0ZGF0YSBweG1fYml0bWFwW1BYTV9CSVRNQVBfTEVOXTsJLyogYml0bWFwIG9mIHByb3hpbWl0eSBkb21haW5zICovCi0KLSNkZWZpbmUgTUFYX0NIVU5LU19QRVJfTk9ERQkzCi0jZGVmaW5lIE1BWENIVU5LUwkJKE1BWF9DSFVOS1NfUEVSX05PREUgKiBNQVhfTlVNTk9ERVMpCi1zdHJ1Y3Qgbm9kZV9tZW1vcnlfY2h1bmtfcyB7Ci0JdW5zaWduZWQgbG9uZwlzdGFydF9wZm47Ci0JdW5zaWduZWQgbG9uZwllbmRfcGZuOwotCXU4CXB4bTsJCS8vIHByb3hpbWl0eSBkb21haW4gb2Ygbm9kZQotCXU4CW5pZDsJCS8vIHdoaWNoIGNub2RlIGNvbnRhaW5zIHRoaXMgY2h1bms/Ci0JdTgJYmFuazsJCS8vIHdoaWNoIG1lbSBiYW5rIG9uIHRoaXMgbm9kZQotfTsKLXN0YXRpYyBzdHJ1Y3Qgbm9kZV9tZW1vcnlfY2h1bmtfcyBfX2luaXRkYXRhIG5vZGVfbWVtb3J5X2NodW5rW01BWENIVU5LU107Ci0KLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBudW1fbWVtb3J5X2NodW5rczsgLyogdG90YWwgbnVtYmVyIG9mIG1lbW9yeSBjaHVua3MgKi8KLXN0YXRpYyB1OCBfX2luaXRkYXRhIGFwaWNpZF90b19weG1bTUFYX0xPQ0FMX0FQSUNdOwotCi1pbnQgYWNwaV9udW1hIF9faW5pdGRhdGE7Ci0KLXN0YXRpYyBfX2luaXQgdm9pZCBiYWRfc3JhdCh2b2lkKQotewotICAgICAgICBwcmludGsoS0VSTl9FUlIgIlNSQVQ6IFNSQVQgbm90IHVzZWQuXG4iKTsKLSAgICAgICAgYWNwaV9udW1hID0gLTE7Ci0JbnVtX21lbW9yeV9jaHVua3MgPSAwOwotfQotCi1zdGF0aWMgX19pbml0IGlubGluZSBpbnQgc3JhdF9kaXNhYmxlZCh2b2lkKQotewotCXJldHVybiBudW1hX29mZiB8fCBhY3BpX251bWEgPCAwOwotfQotCi0vKiBJZGVudGlmeSBDUFUgcHJveGltaXR5IGRvbWFpbnMgKi8KLXZvaWQgX19pbml0Ci1hY3BpX251bWFfcHJvY2Vzc29yX2FmZmluaXR5X2luaXQoc3RydWN0IGFjcGlfc3JhdF9jcHVfYWZmaW5pdHkgKmNwdV9hZmZpbml0eSkKLXsKLQlpZiAoc3JhdF9kaXNhYmxlZCgpKQotCQlyZXR1cm47Ci0JaWYgKGNwdV9hZmZpbml0eS0+aGVhZGVyLmxlbmd0aCAhPQotCSAgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3NyYXRfY3B1X2FmZmluaXR5KSkgewotCQliYWRfc3JhdCgpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKChjcHVfYWZmaW5pdHktPmZsYWdzICYgQUNQSV9TUkFUX0NQVV9FTkFCTEVEKSA9PSAwKQotCQlyZXR1cm47CQkvKiBlbXB0eSBlbnRyeSAqLwotCi0JLyogbWFyayB0aGlzIG5vZGUgYXMgInNlZW4iIGluIG5vZGUgYml0bWFwICovCi0JQk1BUF9TRVQocHhtX2JpdG1hcCwgY3B1X2FmZmluaXR5LT5wcm94aW1pdHlfZG9tYWluX2xvKTsKLQotCS8qIGRvbid0IG5lZWQgdG8gY2hlY2sgYXBpY19pZCBoZXJlLCBiZWNhdXNlIGl0IGlzIGFsd2F5cyA4IGJpdHMgKi8KLQlhcGljaWRfdG9fcHhtW2NwdV9hZmZpbml0eS0+YXBpY19pZF0gPSBjcHVfYWZmaW5pdHktPnByb3hpbWl0eV9kb21haW5fbG87Ci0KLQlwcmludGsoS0VSTl9ERUJVRyAiQ1BVICUwMnggaW4gcHJveGltaXR5IGRvbWFpbiAlMDJ4XG4iLAotCQljcHVfYWZmaW5pdHktPmFwaWNfaWQsIGNwdV9hZmZpbml0eS0+cHJveGltaXR5X2RvbWFpbl9sbyk7Ci19Ci0KLS8qCi0gKiBJZGVudGlmeSBtZW1vcnkgcHJveGltaXR5IGRvbWFpbnMgYW5kIGhvdC1yZW1vdmUgY2FwYWJpbGl0aWVzLgotICogRmlsbCBub2RlIG1lbW9yeSBjaHVuayBsaXN0IHN0cnVjdHVyZS4KLSAqLwotdm9pZCBfX2luaXQKLWFjcGlfbnVtYV9tZW1vcnlfYWZmaW5pdHlfaW5pdChzdHJ1Y3QgYWNwaV9zcmF0X21lbV9hZmZpbml0eSAqbWVtb3J5X2FmZmluaXR5KQotewotCXVuc2lnbmVkIGxvbmcgbG9uZyBwYWRkciwgc2l6ZTsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgZW5kX3BmbjsKLQl1OCBweG07Ci0Jc3RydWN0IG5vZGVfbWVtb3J5X2NodW5rX3MgKnAsICpxLCAqcGVuZDsKLQotCWlmIChzcmF0X2Rpc2FibGVkKCkpCi0JCXJldHVybjsKLQlpZiAobWVtb3J5X2FmZmluaXR5LT5oZWFkZXIubGVuZ3RoICE9Ci0JICAgICBzaXplb2Yoc3RydWN0IGFjcGlfc3JhdF9tZW1fYWZmaW5pdHkpKSB7Ci0JCWJhZF9zcmF0KCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoKG1lbW9yeV9hZmZpbml0eS0+ZmxhZ3MgJiBBQ1BJX1NSQVRfTUVNX0VOQUJMRUQpID09IDApCi0JCXJldHVybjsJCS8qIGVtcHR5IGVudHJ5ICovCi0KLQlweG0gPSBtZW1vcnlfYWZmaW5pdHktPnByb3hpbWl0eV9kb21haW4gJiAweGZmOwotCi0JLyogbWFyayB0aGlzIG5vZGUgYXMgInNlZW4iIGluIG5vZGUgYml0bWFwICovCi0JQk1BUF9TRVQocHhtX2JpdG1hcCwgcHhtKTsKLQotCS8qIGNhbGN1bGF0ZSBpbmZvIGZvciBtZW1vcnkgY2h1bmsgc3RydWN0dXJlICovCi0JcGFkZHIgPSBtZW1vcnlfYWZmaW5pdHktPmJhc2VfYWRkcmVzczsKLQlzaXplID0gbWVtb3J5X2FmZmluaXR5LT5sZW5ndGg7Ci0KLQlzdGFydF9wZm4gPSBwYWRkciA+PiBQQUdFX1NISUZUOwotCWVuZF9wZm4gPSAocGFkZHIgKyBzaXplKSA+PiBQQUdFX1NISUZUOwotCi0KLQlpZiAobnVtX21lbW9yeV9jaHVua3MgPj0gTUFYQ0hVTktTKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlRvbyBtYW55IG1lbSBjaHVua3MgaW4gU1JBVC4iCi0JCQkiIElnbm9yaW5nICVsbGQgTUJ5dGVzIGF0ICVsbHhcbiIsCi0JCQlzaXplLygxMDI0KjEwMjQpLCBwYWRkcik7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBJbnNlcnRpb24gc29ydCBiYXNlZCBvbiBiYXNlIGFkZHJlc3MgKi8KLQlwZW5kID0gJm5vZGVfbWVtb3J5X2NodW5rW251bV9tZW1vcnlfY2h1bmtzXTsKLQlmb3IgKHAgPSAmbm9kZV9tZW1vcnlfY2h1bmtbMF07IHAgPCBwZW5kOyBwKyspIHsKLQkJaWYgKHN0YXJ0X3BmbiA8IHAtPnN0YXJ0X3BmbikKLQkJCWJyZWFrOwotCX0KLQlpZiAocCA8IHBlbmQpIHsKLQkJZm9yIChxID0gcGVuZDsgcSA+PSBwOyBxLS0pCi0JCQkqKHEgKyAxKSA9ICpxOwotCX0KLQlwLT5zdGFydF9wZm4gPSBzdGFydF9wZm47Ci0JcC0+ZW5kX3BmbiA9IGVuZF9wZm47Ci0JcC0+cHhtID0gcHhtOwotCi0JbnVtX21lbW9yeV9jaHVua3MrKzsKLQotCXByaW50ayhLRVJOX0RFQlVHICJNZW1vcnkgcmFuZ2UgJTA4bHggdG8gJTA4bHgiCi0JCQkgICIgaW4gcHJveGltaXR5IGRvbWFpbiAlMDJ4ICVzXG4iLAotCQlzdGFydF9wZm4sIGVuZF9wZm4sCi0JCXB4bSwKLQkJKChtZW1vcnlfYWZmaW5pdHktPmZsYWdzICYgQUNQSV9TUkFUX01FTV9IT1RfUExVR0dBQkxFKSA/Ci0JCSAiZW5hYmxlZCBhbmQgcmVtb3ZhYmxlIiA6ICJlbmFibGVkIiApICk7Ci19Ci0KLS8qIENhbGxiYWNrIGZvciBTTElUIHBhcnNpbmcgKi8KLXZvaWQgX19pbml0IGFjcGlfbnVtYV9zbGl0X2luaXQoc3RydWN0IGFjcGlfdGFibGVfc2xpdCAqc2xpdCkKLXsKLX0KLQotdm9pZCBhY3BpX251bWFfYXJjaF9maXh1cCh2b2lkKQotewotfQotLyoKLSAqIFRoZSBTUkFUIHRhYmxlIGFsd2F5cyBsaXN0cyBhc2NlbmRpbmcgYWRkcmVzc2VzLCBzbyBjYW4gYWx3YXlzCi0gKiBhc3N1bWUgdGhhdCB0aGUgZmlyc3QgInN0YXJ0IiBhZGRyZXNzIHRoYXQgeW91IHNlZSBpcyB0aGUgcmVhbAotICogc3RhcnQgb2YgdGhlIG5vZGUsIGFuZCB0aGF0IHRoZSBjdXJyZW50ICJlbmQiIGFkZHJlc3MgaXMgYWZ0ZXIKLSAqIHRoZSBwcmV2aW91cyBvbmUuCi0gKi8KLXN0YXRpYyBfX2luaXQgaW50IG5vZGVfcmVhZF9jaHVuayhpbnQgbmlkLCBzdHJ1Y3Qgbm9kZV9tZW1vcnlfY2h1bmtfcyAqbWVtb3J5X2NodW5rKQotewotCS8qCi0JICogT25seSBhZGQgcHJlc2VudCBtZW1vcnkgYXMgdG9sZCBieSB0aGUgZTgyMC4KLQkgKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgZnJvbSB0aGUgU1JBVCB0aGF0IHRoZSBtZW1vcnkgaXQKLQkgKiBlbnVtZXJhdGVzIGlzIHByZXNlbnQgYXQgYm9vdCB0aW1lIGJlY2F1c2UgaXQgcmVwcmVzZW50cwotCSAqICpwb3NzaWJsZSogbWVtb3J5IGhvdHBsdWcgYXJlYXMgdGhlIHNhbWUgYXMgbm9ybWFsIFJBTS4KLQkgKi8KLQlpZiAobWVtb3J5X2NodW5rLT5zdGFydF9wZm4gPj0gbWF4X3BmbikgewotCQlwcmludGsoS0VSTl9JTkZPICJJZ25vcmluZyBTUkFUIHBmbnM6ICUwOGx4IC0gJTA4bHhcbiIsCi0JCQltZW1vcnlfY2h1bmstPnN0YXJ0X3BmbiwgbWVtb3J5X2NodW5rLT5lbmRfcGZuKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAobWVtb3J5X2NodW5rLT5uaWQgIT0gbmlkKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAoIW5vZGVfaGFzX29ubGluZV9tZW0obmlkKSkKLQkJbm9kZV9zdGFydF9wZm5bbmlkXSA9IG1lbW9yeV9jaHVuay0+c3RhcnRfcGZuOwotCi0JaWYgKG5vZGVfc3RhcnRfcGZuW25pZF0gPiBtZW1vcnlfY2h1bmstPnN0YXJ0X3BmbikKLQkJbm9kZV9zdGFydF9wZm5bbmlkXSA9IG1lbW9yeV9jaHVuay0+c3RhcnRfcGZuOwotCi0JaWYgKG5vZGVfZW5kX3BmbltuaWRdIDwgbWVtb3J5X2NodW5rLT5lbmRfcGZuKQotCQlub2RlX2VuZF9wZm5bbmlkXSA9IG1lbW9yeV9jaHVuay0+ZW5kX3BmbjsKLQotCXJldHVybiAwOwotfQotCi1pbnQgX19pbml0IGdldF9tZW1jZmdfZnJvbV9zcmF0KHZvaWQpCi17Ci0JaW50IGksIGosIG5pZDsKLQotCWlmIChzcmF0X2Rpc2FibGVkKCkpCi0JCWdvdG8gb3V0X2ZhaWw7Ci0KLQlpZiAoYWNwaV9udW1hX2luaXQoKSA8IDApCi0JCWdvdG8gb3V0X2ZhaWw7Ci0KLQlpZiAobnVtX21lbW9yeV9jaHVua3MgPT0gMCkgewotCQlwcmludGsoS0VSTl9ERUJVRwotCQkJICJjb3VsZCBub3QgZmluZCBhbnkgQUNQSSBTUkFUIG1lbW9yeSBhcmVhcy5cbiIpOwotCQlnb3RvIG91dF9mYWlsOwotCX0KLQotCS8qIENhbGN1bGF0ZSB0b3RhbCBudW1iZXIgb2Ygbm9kZXMgaW4gc3lzdGVtIGZyb20gUFhNIGJpdG1hcCBhbmQgY3JlYXRlCi0JICogYSBzZXQgb2Ygc2VxdWVudGlhbCBub2RlIElEcyBzdGFydGluZyBhdCB6ZXJvLiAgKEFDUEkgZG9lc24ndCBzZWVtCi0JICogdG8gc3BlY2lmeSB0aGUgcmFuZ2Ugb2YgX1BYTSB2YWx1ZXMuKQotCSAqLwotCS8qCi0JICogTUNEIC0gd2Ugbm8gbG9uZ2VyIEhBVkUgdG8gbnVtYmVyIG5vZGVzIHNlcXVlbnRpYWxseS4gIFBYTSBkb21haW4KLQkgKiBudW1iZXJzIGNvdWxkIGdvIGFzIGhpZ2ggYXMgMjU2LCBhbmQgTUFYX05VTU5PREVTIGZvciBpMzg2IGlzIHR5cGljYWxseQotCSAqIDMyLCBzbyB3ZSB3aWxsIGNvbnRpbnVlIG51bWJlcmluZyB0aGVtIGluIHRoaXMgbWFubmVyIHVudGlsIE1BWF9OVU1OT0RFUwotCSAqIGFwcHJvYWNoZXMgTUFYX1BYTV9ET01BSU5TIGZvciBpMzg2LgotCSAqLwotCW5vZGVzX2NsZWFyKG5vZGVfb25saW5lX21hcCk7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9QWE1fRE9NQUlOUzsgaSsrKSB7Ci0JCWlmIChCTUFQX1RFU1QocHhtX2JpdG1hcCwgaSkpIHsKLQkJCWludCBuaWQgPSBhY3BpX21hcF9weG1fdG9fbm9kZShpKTsKLQkJCW5vZGVfc2V0X29ubGluZShuaWQpOwotCQl9Ci0JfQotCUJVR19PTihudW1fb25saW5lX25vZGVzKCkgPT0gMCk7Ci0KLQkvKiBzZXQgY25vZGUgaWQgaW4gbWVtb3J5IGNodW5rIHN0cnVjdHVyZSAqLwotCWZvciAoaSA9IDA7IGkgPCBudW1fbWVtb3J5X2NodW5rczsgaSsrKQotCQlub2RlX21lbW9yeV9jaHVua1tpXS5uaWQgPSBweG1fdG9fbm9kZShub2RlX21lbW9yeV9jaHVua1tpXS5weG0pOwotCi0JcHJpbnRrKEtFUk5fREVCVUcgInB4bSBiaXRtYXA6ICIpOwotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocHhtX2JpdG1hcCk7IGkrKykgewotCQlwcmludGsoS0VSTl9DT05UICIlMDJ4ICIsIHB4bV9iaXRtYXBbaV0pOwotCX0KLQlwcmludGsoS0VSTl9DT05UICJcbiIpOwotCXByaW50ayhLRVJOX0RFQlVHICJOdW1iZXIgb2YgbG9naWNhbCBub2RlcyBpbiBzeXN0ZW0gPSAlZFxuIiwKLQkJCSBudW1fb25saW5lX25vZGVzKCkpOwotCXByaW50ayhLRVJOX0RFQlVHICJOdW1iZXIgb2YgbWVtb3J5IGNodW5rcyBpbiBzeXN0ZW0gPSAlZFxuIiwKLQkJCSBudW1fbWVtb3J5X2NodW5rcyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xPQ0FMX0FQSUM7IGkrKykKLQkJc2V0X2FwaWNpZF90b19ub2RlKGksIHB4bV90b19ub2RlKGFwaWNpZF90b19weG1baV0pKTsKLQotCWZvciAoaiA9IDA7IGogPCBudW1fbWVtb3J5X2NodW5rczsgaisrKXsKLQkJc3RydWN0IG5vZGVfbWVtb3J5X2NodW5rX3MgKiBjaHVuayA9ICZub2RlX21lbW9yeV9jaHVua1tqXTsKLQkJcHJpbnRrKEtFUk5fREVCVUcKLQkJCSJjaHVuayAlZCBuaWQgJWQgc3RhcnRfcGZuICUwOGx4IGVuZF9wZm4gJTA4bHhcbiIsCi0JCSAgICAgICBqLCBjaHVuay0+bmlkLCBjaHVuay0+c3RhcnRfcGZuLCBjaHVuay0+ZW5kX3Bmbik7Ci0JCWlmIChub2RlX3JlYWRfY2h1bmsoY2h1bmstPm5pZCwgY2h1bmspKQotCQkJY29udGludWU7Ci0KLQkJbWVtYmxvY2tfeDg2X3JlZ2lzdGVyX2FjdGl2ZV9yZWdpb25zKGNodW5rLT5uaWQsIGNodW5rLT5zdGFydF9wZm4sCi0JCQkJCSAgICAgbWluKGNodW5rLT5lbmRfcGZuLCBtYXhfcGZuKSk7Ci0JfQotCS8qIGZvciBvdXQgb2Ygb3JkZXIgZW50cmllcyBpbiBTUkFUICovCi0Jc29ydF9ub2RlX21hcCgpOwotCi0JZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7Ci0JCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBub2RlX3N0YXJ0X3BmbltuaWRdOwotCQl1bnNpZ25lZCBsb25nIGVuZCA9IG1pbihub2RlX2VuZF9wZm5bbmlkXSwgbWF4X3Bmbik7Ci0KLQkJbWVtb3J5X3ByZXNlbnQobmlkLCBzdGFydCwgZW5kKTsKLQkJbm9kZV9yZW1hcF9zaXplW25pZF0gPSBub2RlX21lbW1hcF9zaXplX2J5dGVzKG5pZCwgc3RhcnQsIGVuZCk7Ci0JfQotCXJldHVybiAxOwotb3V0X2ZhaWw6Ci0JcHJpbnRrKEtFUk5fREVCVUcgImZhaWxlZCB0byBnZXQgTlVNQSBtZW1vcnkgaW5mb3JtYXRpb24gZnJvbSBTUkFUIgotCQkJIiB0YWJsZVxuIik7Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9vcHJvZmlsZS9iYWNrdHJhY2UuYyBiL2FyY2gveDg2L29wcm9maWxlL2JhY2t0cmFjZS5jCmluZGV4IDJkNDlkNGUuLmE1YjY0YWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L29wcm9maWxlL2JhY2t0cmFjZS5jCisrKyBiL2FyY2gveDg2L29wcm9maWxlL2JhY2t0cmFjZS5jCkBAIC0xNiwxNyArMTYsNiBAQAogI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAKLXN0YXRpYyB2b2lkIGJhY2t0cmFjZV93YXJuaW5nX3N5bWJvbCh2b2lkICpkYXRhLCBjaGFyICptc2csCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIHN5bWJvbCkKLXsKLQkvKiBJZ25vcmUgd2FybmluZ3MgKi8KLX0KLQotc3RhdGljIHZvaWQgYmFja3RyYWNlX3dhcm5pbmcodm9pZCAqZGF0YSwgY2hhciAqbXNnKQotewotCS8qIElnbm9yZSB3YXJuaW5ncyAqLwotfQotCiBzdGF0aWMgaW50IGJhY2t0cmFjZV9zdGFjayh2b2lkICpkYXRhLCBjaGFyICpuYW1lKQogewogCS8qIFllcywgd2Ugd2FudCBhbGwgc3RhY2tzICovCkBAIC00Miw4ICszMSw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgYmFja3RyYWNlX29wcyA9IHsKLQkud2FybmluZwk9IGJhY2t0cmFjZV93YXJuaW5nLAotCS53YXJuaW5nX3N5bWJvbAk9IGJhY2t0cmFjZV93YXJuaW5nX3N5bWJvbCwKIAkuc3RhY2sJCT0gYmFja3RyYWNlX3N0YWNrLAogCS5hZGRyZXNzCT0gYmFja3RyYWNlX2FkZHJlc3MsCiAJLndhbGtfc3RhY2sJPSBwcmludF9jb250ZXh0X3N0YWNrLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL3hlbi5jIGIvYXJjaC94ODYvcGNpL3hlbi5jCmluZGV4IGUzN2I0MDcuLjgyMTQ3MjQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS94ZW4uYworKysgYi9hcmNoL3g4Ni9wY2kveGVuLmMKQEAgLTEwOCw3ICsxMDgsOCBAQAogCQl9CiAJCWlycSA9IHhlbl9iaW5kX3BpcnFfbXNpX3RvX2lycShkZXYsIG1zaWRlc2MsIHBpcnEsIDAsCiAJCQkJCSAgICAgICAodHlwZSA9PSBQQ0lfQ0FQX0lEX01TSVgpID8KLQkJCQkJICAgICAgICJtc2kteCIgOiAibXNpIik7CisJCQkJCSAgICAgICAibXNpLXgiIDogIm1zaSIsCisJCQkJCSAgICAgICBET01JRF9TRUxGKTsKIAkJaWYgKGlycSA8IDApCiAJCQlnb3RvIGVycm9yOwogCQlkZXZfZGJnKCZkZXYtPmRldiwKQEAgLTE0OCw3ICsxNDksOCBAQAogCQlpcnEgPSB4ZW5fYmluZF9waXJxX21zaV90b19pcnEoZGV2LCBtc2lkZXNjLCB2W2ldLCAwLAogCQkJCQkgICAgICAgKHR5cGUgPT0gUENJX0NBUF9JRF9NU0lYKSA/CiAJCQkJCSAgICAgICAicGNpZnJvbnQtbXNpLXgiIDoKLQkJCQkJICAgICAgICJwY2lmcm9udC1tc2kiKTsKKwkJCQkJICAgICAgICJwY2lmcm9udC1tc2kiLAorCQkJCQkJRE9NSURfU0VMRik7CiAJCWlmIChpcnEgPCAwKQogCQkJZ290byBmcmVlOwogCQlpKys7CkBAIC0xOTAsOSArMTkyLDE2IEBACiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1zaWRlc2MsICZkZXYtPm1zaV9saXN0LCBsaXN0KSB7CiAJCXN0cnVjdCBwaHlzZGV2X21hcF9waXJxIG1hcF9pcnE7CisJCWRvbWlkX3QgZG9taWQ7CisKKwkJZG9taWQgPSByZXQgPSB4ZW5fZmluZF9kZXZpY2VfZG9tYWluX293bmVyKGRldik7CisJCS8qIE4uQi4gQ2FzdGluZyBpbnQncyAtRU5PREVWIHRvIHVpbnQxNl90IHJlc3VsdHMgaW4gMHhGRkVELAorCQkgKiBoZW5jZSBjaGVjayByZXQgdmFsdWUgZm9yIDwgMC4gKi8KKwkJaWYgKHJldCA8IDApCisJCQlkb21pZCA9IERPTUlEX1NFTEY7CiAKIAkJbWVtc2V0KCZtYXBfaXJxLCAwLCBzaXplb2YobWFwX2lycSkpOwotCQltYXBfaXJxLmRvbWlkID0gRE9NSURfU0VMRjsKKwkJbWFwX2lycS5kb21pZCA9IGRvbWlkOwogCQltYXBfaXJxLnR5cGUgPSBNQVBfUElSUV9UWVBFX01TSTsKIAkJbWFwX2lycS5pbmRleCA9IC0xOwogCQltYXBfaXJxLnBpcnEgPSAtMTsKQEAgLTIxNSwxNCArMjI0LDE2IEBACiAKIAkJcmV0ID0gSFlQRVJWSVNPUl9waHlzZGV2X29wKFBIWVNERVZPUF9tYXBfcGlycSwgJm1hcF9pcnEpOwogCQlpZiAocmV0KSB7Ci0JCQlkZXZfd2FybigmZGV2LT5kZXYsICJ4ZW4gbWFwIGlycSBmYWlsZWQgJWRcbiIsIHJldCk7CisJCQlkZXZfd2FybigmZGV2LT5kZXYsICJ4ZW4gbWFwIGlycSBmYWlsZWQgJWQgZm9yICVkIGRvbWFpblxuIiwKKwkJCQkgcmV0LCBkb21pZCk7CiAJCQlnb3RvIG91dDsKIAkJfQogCiAJCXJldCA9IHhlbl9iaW5kX3BpcnFfbXNpX3RvX2lycShkZXYsIG1zaWRlc2MsCiAJCQkJCSAgICAgICBtYXBfaXJxLnBpcnEsIG1hcF9pcnEuaW5kZXgsCiAJCQkJCSAgICAgICAodHlwZSA9PSBQQ0lfQ0FQX0lEX01TSVgpID8KLQkJCQkJICAgICAgICJtc2kteCIgOiAibXNpIik7CisJCQkJCSAgICAgICAibXNpLXgiIDogIm1zaSIsCisJCQkJCQlkb21pZCk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7CiAJfQpAQCAtNDYxLDMgKzQ3Miw3OCBAQAogCX0KIH0KICNlbmRpZgorCisjaWZkZWYgQ09ORklHX1hFTl9ET00wCitzdHJ1Y3QgeGVuX2RldmljZV9kb21haW5fb3duZXIgeworCWRvbWlkX3QgZG9tYWluOworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhkZXZfZG9tYWluX2xpc3Rfc3BpbmxvY2spOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgZGV2X2RvbWFpbl9saXN0ID0gTElTVF9IRUFEX0lOSVQoZGV2X2RvbWFpbl9saXN0KTsKKworc3RhdGljIHN0cnVjdCB4ZW5fZGV2aWNlX2RvbWFpbl9vd25lciAqZmluZF9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgeGVuX2RldmljZV9kb21haW5fb3duZXIgKm93bmVyOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShvd25lciwgJmRldl9kb21haW5fbGlzdCwgbGlzdCkgeworCQlpZiAob3duZXItPmRldiA9PSBkZXYpCisJCQlyZXR1cm4gb3duZXI7CisJfQorCXJldHVybiBOVUxMOworfQorCitpbnQgeGVuX2ZpbmRfZGV2aWNlX2RvbWFpbl9vd25lcihzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCB4ZW5fZGV2aWNlX2RvbWFpbl9vd25lciAqb3duZXI7CisJaW50IGRvbWFpbiA9IC1FTk9ERVY7CisKKwlzcGluX2xvY2soJmRldl9kb21haW5fbGlzdF9zcGlubG9jayk7CisJb3duZXIgPSBmaW5kX2RldmljZShkZXYpOworCWlmIChvd25lcikKKwkJZG9tYWluID0gb3duZXItPmRvbWFpbjsKKwlzcGluX3VubG9jaygmZGV2X2RvbWFpbl9saXN0X3NwaW5sb2NrKTsKKwlyZXR1cm4gZG9tYWluOworfQorRVhQT1JUX1NZTUJPTF9HUEwoeGVuX2ZpbmRfZGV2aWNlX2RvbWFpbl9vd25lcik7CisKK2ludCB4ZW5fcmVnaXN0ZXJfZGV2aWNlX2RvbWFpbl9vd25lcihzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1aW50MTZfdCBkb21haW4pCit7CisJc3RydWN0IHhlbl9kZXZpY2VfZG9tYWluX293bmVyICpvd25lcjsKKworCW93bmVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHhlbl9kZXZpY2VfZG9tYWluX293bmVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvd25lcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzcGluX2xvY2soJmRldl9kb21haW5fbGlzdF9zcGlubG9jayk7CisJaWYgKGZpbmRfZGV2aWNlKGRldikpIHsKKwkJc3Bpbl91bmxvY2soJmRldl9kb21haW5fbGlzdF9zcGlubG9jayk7CisJCWtmcmVlKG93bmVyKTsKKwkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCW93bmVyLT5kb21haW4gPSBkb21haW47CisJb3duZXItPmRldiA9IGRldjsKKwlsaXN0X2FkZF90YWlsKCZvd25lci0+bGlzdCwgJmRldl9kb21haW5fbGlzdCk7CisJc3Bpbl91bmxvY2soJmRldl9kb21haW5fbGlzdF9zcGlubG9jayk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh4ZW5fcmVnaXN0ZXJfZGV2aWNlX2RvbWFpbl9vd25lcik7CisKK2ludCB4ZW5fdW5yZWdpc3Rlcl9kZXZpY2VfZG9tYWluX293bmVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IHhlbl9kZXZpY2VfZG9tYWluX293bmVyICpvd25lcjsKKworCXNwaW5fbG9jaygmZGV2X2RvbWFpbl9saXN0X3NwaW5sb2NrKTsKKwlvd25lciA9IGZpbmRfZGV2aWNlKGRldik7CisJaWYgKCFvd25lcikgeworCQlzcGluX3VubG9jaygmZGV2X2RvbWFpbl9saXN0X3NwaW5sb2NrKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWxpc3RfZGVsKCZvd25lci0+bGlzdCk7CisJc3Bpbl91bmxvY2soJmRldl9kb21haW5fbGlzdF9zcGlubG9jayk7CisJa2ZyZWUob3duZXIpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoeGVuX3VucmVnaXN0ZXJfZGV2aWNlX2RvbWFpbl9vd25lcik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmkuYyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmkuYwppbmRleCAwZmUyN2Q3Li5iMzBhYTI2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpLmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaS5jCkBAIC0xNDUsMTcgKzE0NSw2IEBACiAJCSAgICAgICBkYXRhX3NpemUsIGRhdGEpOwogfQogCi1zdGF0aWMgZWZpX3N0YXR1c190IHZpcnRfZWZpX3NldF92aXJ0dWFsX2FkZHJlc3NfbWFwKAotCXVuc2lnbmVkIGxvbmcgbWVtb3J5X21hcF9zaXplLAotCXVuc2lnbmVkIGxvbmcgZGVzY3JpcHRvcl9zaXplLAotCXUzMiBkZXNjcmlwdG9yX3ZlcnNpb24sCi0JZWZpX21lbW9yeV9kZXNjX3QgKnZpcnR1YWxfbWFwKQotewotCXJldHVybiBlZmlfY2FsbF92aXJ0NChzZXRfdmlydHVhbF9hZGRyZXNzX21hcCwKLQkJCSAgICAgIG1lbW9yeV9tYXBfc2l6ZSwgZGVzY3JpcHRvcl9zaXplLAotCQkJICAgICAgZGVzY3JpcHRvcl92ZXJzaW9uLCB2aXJ0dWFsX21hcCk7Ci19Ci0KIHN0YXRpYyBlZmlfc3RhdHVzX3QgX19pbml0IHBoeXNfZWZpX3NldF92aXJ0dWFsX2FkZHJlc3NfbWFwKAogCXVuc2lnbmVkIGxvbmcgbWVtb3J5X21hcF9zaXplLAogCXVuc2lnbmVkIGxvbmcgZGVzY3JpcHRvcl9zaXplLApAQCAtNDY4LDExICs0NTcsMjUgQEAKICNlbmRpZgogfQogCit2b2lkIF9faW5pdCBlZmlfc2V0X2V4ZWN1dGFibGUoZWZpX21lbW9yeV9kZXNjX3QgKm1kLCBib29sIGV4ZWN1dGFibGUpCit7CisJdTY0IGFkZHIsIG5wYWdlczsKKworCWFkZHIgPSBtZC0+dmlydF9hZGRyOworCW5wYWdlcyA9IG1kLT5udW1fcGFnZXM7CisKKwltZW1yYW5nZV9lZmlfdG9fbmF0aXZlKCZhZGRyLCAmbnBhZ2VzKTsKKworCWlmIChleGVjdXRhYmxlKQorCQlzZXRfbWVtb3J5X3goYWRkciwgbnBhZ2VzKTsKKwllbHNlCisJCXNldF9tZW1vcnlfbngoYWRkciwgbnBhZ2VzKTsKK30KKwogc3RhdGljIHZvaWQgX19pbml0IHJ1bnRpbWVfY29kZV9wYWdlX21rZXhlYyh2b2lkKQogewogCWVmaV9tZW1vcnlfZGVzY190ICptZDsKIAl2b2lkICpwOwotCXU2NCBhZGRyLCBucGFnZXM7CiAKIAkvKiBNYWtlIEVGSSBydW50aW1lIHNlcnZpY2UgY29kZSBhcmVhIGV4ZWN1dGFibGUgKi8KIAlmb3IgKHAgPSBtZW1tYXAubWFwOyBwIDwgbWVtbWFwLm1hcF9lbmQ7IHAgKz0gbWVtbWFwLmRlc2Nfc2l6ZSkgewpAQCAtNDgxLDEwICs0ODQsNyBAQAogCQlpZiAobWQtPnR5cGUgIT0gRUZJX1JVTlRJTUVfU0VSVklDRVNfQ09ERSkKIAkJCWNvbnRpbnVlOwogCi0JCWFkZHIgPSBtZC0+dmlydF9hZGRyOwotCQlucGFnZXMgPSBtZC0+bnVtX3BhZ2VzOwotCQltZW1yYW5nZV9lZmlfdG9fbmF0aXZlKCZhZGRyLCAmbnBhZ2VzKTsKLQkJc2V0X21lbW9yeV94KGFkZHIsIG5wYWdlcyk7CisJCWVmaV9zZXRfZXhlY3V0YWJsZShtZCwgdHJ1ZSk7CiAJfQogfQogCkBAIC00OTgsMTMgKzQ5OCw0MiBAQAogICovCiB2b2lkIF9faW5pdCBlZmlfZW50ZXJfdmlydHVhbF9tb2RlKHZvaWQpCiB7Ci0JZWZpX21lbW9yeV9kZXNjX3QgKm1kOworCWVmaV9tZW1vcnlfZGVzY190ICptZCwgKnByZXZfbWQgPSBOVUxMOwogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CiAJdW5zaWduZWQgbG9uZyBzaXplOwogCXU2NCBlbmQsIHN5c3RhYiwgYWRkciwgbnBhZ2VzLCBlbmRfcGZuOwotCXZvaWQgKnAsICp2YTsKKwl2b2lkICpwLCAqdmEsICpuZXdfbWVtbWFwID0gTlVMTDsKKwlpbnQgY291bnQgPSAwOwogCiAJZWZpLnN5c3RhYiA9IE5VTEw7CisKKwkvKiBNZXJnZSBjb250aWd1b3VzIHJlZ2lvbnMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgYXR0cmlidXRlICovCisJZm9yIChwID0gbWVtbWFwLm1hcDsgcCA8IG1lbW1hcC5tYXBfZW5kOyBwICs9IG1lbW1hcC5kZXNjX3NpemUpIHsKKwkJdTY0IHByZXZfc2l6ZTsKKwkJbWQgPSBwOworCisJCWlmICghcHJldl9tZCkgeworCQkJcHJldl9tZCA9IG1kOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAocHJldl9tZC0+dHlwZSAhPSBtZC0+dHlwZSB8fAorCQkgICAgcHJldl9tZC0+YXR0cmlidXRlICE9IG1kLT5hdHRyaWJ1dGUpIHsKKwkJCXByZXZfbWQgPSBtZDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcHJldl9zaXplID0gcHJldl9tZC0+bnVtX3BhZ2VzIDw8IEVGSV9QQUdFX1NISUZUOworCisJCWlmIChtZC0+cGh5c19hZGRyID09IChwcmV2X21kLT5waHlzX2FkZHIgKyBwcmV2X3NpemUpKSB7CisJCQlwcmV2X21kLT5udW1fcGFnZXMgKz0gbWQtPm51bV9wYWdlczsKKwkJCW1kLT50eXBlID0gRUZJX1JFU0VSVkVEX1RZUEU7CisJCQltZC0+YXR0cmlidXRlID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCXByZXZfbWQgPSBtZDsKKwl9CisKIAlmb3IgKHAgPSBtZW1tYXAubWFwOyBwIDwgbWVtbWFwLm1hcF9lbmQ7IHAgKz0gbWVtbWFwLmRlc2Nfc2l6ZSkgewogCQltZCA9IHA7CiAJCWlmICghKG1kLT5hdHRyaWJ1dGUgJiBFRklfTUVNT1JZX1JVTlRJTUUpKQpAQCAtNTQxLDE1ICs1NzAsMjEgQEAKIAkJCXN5c3RhYiArPSBtZC0+dmlydF9hZGRyIC0gbWQtPnBoeXNfYWRkcjsKIAkJCWVmaS5zeXN0YWIgPSAoZWZpX3N5c3RlbV90YWJsZV90ICopICh1bnNpZ25lZCBsb25nKSBzeXN0YWI7CiAJCX0KKwkJbmV3X21lbW1hcCA9IGtyZWFsbG9jKG5ld19tZW1tYXAsCisJCQkJICAgICAgKGNvdW50ICsgMSkgKiBtZW1tYXAuZGVzY19zaXplLAorCQkJCSAgICAgIEdGUF9LRVJORUwpOworCQltZW1jcHkobmV3X21lbW1hcCArIChjb3VudCAqIG1lbW1hcC5kZXNjX3NpemUpLCBtZCwKKwkJICAgICAgIG1lbW1hcC5kZXNjX3NpemUpOworCQljb3VudCsrOwogCX0KIAogCUJVR19PTighZWZpLnN5c3RhYik7CiAKIAlzdGF0dXMgPSBwaHlzX2VmaV9zZXRfdmlydHVhbF9hZGRyZXNzX21hcCgKLQkJbWVtbWFwLmRlc2Nfc2l6ZSAqIG1lbW1hcC5ucl9tYXAsCisJCW1lbW1hcC5kZXNjX3NpemUgKiBjb3VudCwKIAkJbWVtbWFwLmRlc2Nfc2l6ZSwKIAkJbWVtbWFwLmRlc2NfdmVyc2lvbiwKLQkJbWVtbWFwLnBoeXNfbWFwKTsKKwkJKGVmaV9tZW1vcnlfZGVzY190ICopX19wYShuZXdfbWVtbWFwKSk7CiAKIAlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CiAJCXByaW50ayhLRVJOX0FMRVJUICJVbmFibGUgdG8gc3dpdGNoIEVGSSBpbnRvIHZpcnR1YWwgbW9kZSAiCkBAIC01NzIsMTEgKzYwNywxMiBAQAogCWVmaS5zZXRfdmFyaWFibGUgPSB2aXJ0X2VmaV9zZXRfdmFyaWFibGU7CiAJZWZpLmdldF9uZXh0X2hpZ2hfbW9ub19jb3VudCA9IHZpcnRfZWZpX2dldF9uZXh0X2hpZ2hfbW9ub19jb3VudDsKIAllZmkucmVzZXRfc3lzdGVtID0gdmlydF9lZmlfcmVzZXRfc3lzdGVtOwotCWVmaS5zZXRfdmlydHVhbF9hZGRyZXNzX21hcCA9IHZpcnRfZWZpX3NldF92aXJ0dWFsX2FkZHJlc3NfbWFwOworCWVmaS5zZXRfdmlydHVhbF9hZGRyZXNzX21hcCA9IE5VTEw7CiAJaWYgKF9fc3VwcG9ydGVkX3B0ZV9tYXNrICYgX1BBR0VfTlgpCiAJCXJ1bnRpbWVfY29kZV9wYWdlX21rZXhlYygpOwogCWVhcmx5X2lvdW5tYXAobWVtbWFwLm1hcCwgbWVtbWFwLm5yX21hcCAqIG1lbW1hcC5kZXNjX3NpemUpOwogCW1lbW1hcC5tYXAgPSBOVUxMOworCWtmcmVlKG5ld19tZW1tYXApOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaV82NC5jIGIvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaV82NC5jCmluZGV4IGFjMDYyMWEuLjI2NDk0MjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmlfNjQuYworKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpXzY0LmMKQEAgLTQxLDIyICs0MSw3IEBACiBzdGF0aWMgcGdkX3Qgc2F2ZV9wZ2QgX19pbml0ZGF0YTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGVmaV9mbGFncyBfX2luaXRkYXRhOwogCi1zdGF0aWMgdm9pZCBfX2luaXQgZWFybHlfbWFwcGluZ19zZXRfZXhlYyh1bnNpZ25lZCBsb25nIHN0YXJ0LAotCQkJCQkgIHVuc2lnbmVkIGxvbmcgZW5kLAotCQkJCQkgIGludCBleGVjdXRhYmxlKQotewotCXVuc2lnbmVkIGxvbmcgbnVtX3BhZ2VzOwotCi0Jc3RhcnQgJj0gUE1EX01BU0s7Ci0JZW5kID0gKGVuZCArIFBNRF9TSVpFIC0gMSkgJiBQTURfTUFTSzsKLQludW1fcGFnZXMgPSAoZW5kIC0gc3RhcnQpID4+IFBBR0VfU0hJRlQ7Ci0JaWYgKGV4ZWN1dGFibGUpCi0JCXNldF9tZW1vcnlfeCgodW5zaWduZWQgbG9uZylfX3ZhKHN0YXJ0KSwgbnVtX3BhZ2VzKTsKLQllbHNlCi0JCXNldF9tZW1vcnlfbngoKHVuc2lnbmVkIGxvbmcpX192YShzdGFydCksIG51bV9wYWdlcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBlYXJseV9ydW50aW1lX2NvZGVfbWFwcGluZ19zZXRfZXhlYyhpbnQgZXhlY3V0YWJsZSkKK3N0YXRpYyB2b2lkIF9faW5pdCBlYXJseV9jb2RlX21hcHBpbmdfc2V0X2V4ZWMoaW50IGV4ZWN1dGFibGUpCiB7CiAJZWZpX21lbW9yeV9kZXNjX3QgKm1kOwogCXZvaWQgKnA7CkBAIC02NywxMSArNTIsOCBAQAogCS8qIE1ha2UgRUZJIHJ1bnRpbWUgc2VydmljZSBjb2RlIGFyZWEgZXhlY3V0YWJsZSAqLwogCWZvciAocCA9IG1lbW1hcC5tYXA7IHAgPCBtZW1tYXAubWFwX2VuZDsgcCArPSBtZW1tYXAuZGVzY19zaXplKSB7CiAJCW1kID0gcDsKLQkJaWYgKG1kLT50eXBlID09IEVGSV9SVU5USU1FX1NFUlZJQ0VTX0NPREUpIHsKLQkJCXVuc2lnbmVkIGxvbmcgZW5kOwotCQkJZW5kID0gbWQtPnBoeXNfYWRkciArIChtZC0+bnVtX3BhZ2VzIDw8IEVGSV9QQUdFX1NISUZUKTsKLQkJCWVhcmx5X21hcHBpbmdfc2V0X2V4ZWMobWQtPnBoeXNfYWRkciwgZW5kLCBleGVjdXRhYmxlKTsKLQkJfQorCQlpZiAobWQtPnR5cGUgPT0gRUZJX1JVTlRJTUVfU0VSVklDRVNfQ09ERSkKKwkJCWVmaV9zZXRfZXhlY3V0YWJsZShtZCwgZXhlY3V0YWJsZSk7CiAJfQogfQogCkBAIC03OSw3ICs2MSw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyB2YWRkcmVzczsKIAotCWVhcmx5X3J1bnRpbWVfY29kZV9tYXBwaW5nX3NldF9leGVjKDEpOworCWVhcmx5X2NvZGVfbWFwcGluZ19zZXRfZXhlYygxKTsKIAlsb2NhbF9pcnFfc2F2ZShlZmlfZmxhZ3MpOwogCXZhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpX192YSgweDBVTCk7CiAJc2F2ZV9wZ2QgPSAqcGdkX29mZnNldF9rKDB4MFVMKTsKQEAgLTk1LDcgKzc3LDcgQEAKIAlzZXRfcGdkKHBnZF9vZmZzZXRfaygweDBVTCksIHNhdmVfcGdkKTsKIAlfX2ZsdXNoX3RsYl9hbGwoKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShlZmlfZmxhZ3MpOwotCWVhcmx5X3J1bnRpbWVfY29kZV9tYXBwaW5nX3NldF9leGVjKDApOworCWVhcmx5X2NvZGVfbWFwcGluZ19zZXRfZXhlYygwKTsKIH0KIAogdm9pZCBfX2lvbWVtICpfX2luaXQgZWZpX2lvcmVtYXAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKQEAgLTEwNyw4ICs4OSwxMCBAQAogCQlyZXR1cm4gaW9yZW1hcChwaHlzX2FkZHIsIHNpemUpOwogCiAJbGFzdF9tYXBfcGZuID0gaW5pdF9tZW1vcnlfbWFwcGluZyhwaHlzX2FkZHIsIHBoeXNfYWRkciArIHNpemUpOwotCWlmICgobGFzdF9tYXBfcGZuIDw8IFBBR0VfU0hJRlQpIDwgcGh5c19hZGRyICsgc2l6ZSkKLQkJcmV0dXJuIE5VTEw7CisJaWYgKChsYXN0X21hcF9wZm4gPDwgUEFHRV9TSElGVCkgPCBwaHlzX2FkZHIgKyBzaXplKSB7CisJCXVuc2lnbmVkIGxvbmcgdG9wID0gbGFzdF9tYXBfcGZuIDw8IFBBR0VfU0hJRlQ7CisJCWVmaV9pb3JlbWFwKHRvcCwgc2l6ZSAtICh0b3AgLSBwaHlzX2FkZHIpLCB0eXBlKTsKKwl9CiAKIAlyZXR1cm4gKHZvaWQgX19pb21lbSAqKV9fdmEocGh5c19hZGRyKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL21yc3QvbXJzdC5jIGIvYXJjaC94ODYvcGxhdGZvcm0vbXJzdC9tcnN0LmMKaW5kZXggMjc1ZGJjMS4uNzAwMGU3NGIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL21yc3QvbXJzdC5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL21yc3QvbXJzdC5jCkBAIC0xOTQsNyArMTk0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBfX2luaXQgbXJzdF90aW1lX2luaXQodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBtcnN0X3RpbWVfaW5pdCh2b2lkKQogewogCXNmaV90YWJsZV9wYXJzZShTRklfU0lHX01UTVIsIE5VTEwsIE5VTEwsIHNmaV9wYXJzZV9tdG1yKTsKIAlzd2l0Y2ggKG1yc3RfdGltZXJfb3B0aW9ucykgewpAQCAtMjE2LDcgKzIxNiw3IEBACiAJYXBidF90aW1lX2luaXQoKTsKIH0KIAotdm9pZCBfX2NwdWluaXQgbXJzdF9hcmNoX3NldHVwKHZvaWQpCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgbXJzdF9hcmNoX3NldHVwKHZvaWQpCiB7CiAJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID09IDYgJiYgYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPT0gMHgyNykKIAkJX19tcnN0X2NwdV9jaGlwID0gTVJTVF9DUFVfQ0hJUF9QRU5XRUxMOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vb2xwYy9NYWtlZmlsZSBiL2FyY2gveDg2L3BsYXRmb3JtL29scGMvTWFrZWZpbGUKaW5kZXggYzJhOGNhYi4uODFjNWUyMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vb2xwYy9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9vbHBjL01ha2VmaWxlCkBAIC0xLDQgKzEsMiBAQAotb2JqLSQoQ09ORklHX09MUEMpCQkrPSBvbHBjLm8KK29iai0kKENPTkZJR19PTFBDKQkJKz0gb2xwYy5vIG9scGNfb2Z3Lm8gb2xwY19kdC5vCiBvYmotJChDT05GSUdfT0xQQ19YTzEpCQkrPSBvbHBjLXhvMS5vCi1vYmotJChDT05GSUdfT0xQQykJCSs9IG9scGNfb2Z3Lm8KLW9iai0kKENPTkZJR19PRl9QUk9NVFJFRSkJKz0gb2xwY19kdC5vCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9vbHBjL29scGMuYyBiL2FyY2gveDg2L3BsYXRmb3JtL29scGMvb2xwYy5jCmluZGV4IGVkYWYzZmUuLjAwNjBmZDUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL29scGMvb2xwYy5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL29scGMvb2xwYy5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgogCiAjaW5jbHVkZSA8YXNtL2dlb2RlLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CkBAIC0xODcsNDEgKzE4OCw0MyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwob2xwY19lY19jbWQpOwogCi1zdGF0aWMgYm9vbCBfX2luaXQgY2hlY2tfb2Z3X2FyY2hpdGVjdHVyZSh2b2lkKQorc3RhdGljIGJvb2wgX19pbml0IGNoZWNrX29md19hcmNoaXRlY3R1cmUoc3RydWN0IGRldmljZV9ub2RlICpyb290KQogewotCXNpemVfdCBwcm9wc2l6ZTsKLQljaGFyIG9scGNfYXJjaFs1XTsKLQljb25zdCB2b2lkICphcmdzW10gPSB7IE5VTEwsICJhcmNoaXRlY3R1cmUiLCBvbHBjX2FyY2gsICh2b2lkICopNSB9OwotCXZvaWQgKnJlc1tdID0geyAmcHJvcHNpemUgfTsKKwljb25zdCBjaGFyICpvbHBjX2FyY2g7CisJaW50IHByb3BzaXplOwogCi0JaWYgKG9scGNfb2Z3KCJnZXRwcm9wIiwgYXJncywgcmVzKSkgewotCQlwcmludGsoS0VSTl9FUlIgIm9mdzogZ2V0cHJvcCBjYWxsIGZhaWxlZCFcbiIpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQorCW9scGNfYXJjaCA9IG9mX2dldF9wcm9wZXJ0eShyb290LCAiYXJjaGl0ZWN0dXJlIiwgJnByb3BzaXplKTsKIAlyZXR1cm4gcHJvcHNpemUgPT0gNSAmJiBzdHJuY21wKCJPTFBDIiwgb2xwY19hcmNoLCA1KSA9PSAwOwogfQogCi1zdGF0aWMgdTMyIF9faW5pdCBnZXRfYm9hcmRfcmV2aXNpb24odm9pZCkKK3N0YXRpYyB1MzIgX19pbml0IGdldF9ib2FyZF9yZXZpc2lvbihzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3QpCiB7Ci0Jc2l6ZV90IHByb3BzaXplOwotCV9fYmUzMiByZXY7Ci0JY29uc3Qgdm9pZCAqYXJnc1tdID0geyBOVUxMLCAiYm9hcmQtcmV2aXNpb24taW50IiwgJnJldiwgKHZvaWQgKik0IH07Ci0Jdm9pZCAqcmVzW10gPSB7ICZwcm9wc2l6ZSB9OworCWludCBwcm9wc2l6ZTsKKwljb25zdCBfX2JlMzIgKnJldjsKIAotCWlmIChvbHBjX29mdygiZ2V0cHJvcCIsIGFyZ3MsIHJlcykgfHwgcHJvcHNpemUgIT0gNCkgewotCQlwcmludGsoS0VSTl9FUlIgIm9mdzogZ2V0cHJvcCBjYWxsIGZhaWxlZCFcbiIpOwotCQlyZXR1cm4gY3B1X3RvX2JlMzIoMCk7Ci0JfQotCXJldHVybiBiZTMyX3RvX2NwdShyZXYpOworCXJldiA9IG9mX2dldF9wcm9wZXJ0eShyb290LCAiYm9hcmQtcmV2aXNpb24taW50IiwgJnByb3BzaXplKTsKKwlpZiAocHJvcHNpemUgIT0gNCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gYmUzMl90b19jcHUoKnJldik7CiB9CiAKIHN0YXRpYyBib29sIF9faW5pdCBwbGF0Zm9ybV9kZXRlY3Qodm9pZCkKIHsKLQlpZiAoIWNoZWNrX29md19hcmNoaXRlY3R1cmUoKSkKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3QgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOworCWJvb2wgc3VjY2VzczsKKworCWlmICghcm9vdCkKIAkJcmV0dXJuIGZhbHNlOwotCW9scGNfcGxhdGZvcm1faW5mby5mbGFncyB8PSBPTFBDX0ZfUFJFU0VOVDsKLQlvbHBjX3BsYXRmb3JtX2luZm8uYm9hcmRyZXYgPSBnZXRfYm9hcmRfcmV2aXNpb24oKTsKLQlyZXR1cm4gdHJ1ZTsKKworCXN1Y2Nlc3MgPSBjaGVja19vZndfYXJjaGl0ZWN0dXJlKHJvb3QpOworCWlmIChzdWNjZXNzKSB7CisJCW9scGNfcGxhdGZvcm1faW5mby5ib2FyZHJldiA9IGdldF9ib2FyZF9yZXZpc2lvbihyb290KTsKKwkJb2xwY19wbGF0Zm9ybV9pbmZvLmZsYWdzIHw9IE9MUENfRl9QUkVTRU5UOworCX0KKworCW9mX25vZGVfcHV0KHJvb3QpOworCXJldHVybiBzdWNjZXNzOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBhZGRfeG8xX3BsYXRmb3JtX2RldmljZXModm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL29scGMvb2xwY19kdC5jIGIvYXJjaC94ODYvcGxhdGZvcm0vb2xwYy9vbHBjX2R0LmMKaW5kZXggMDQ0YmRhNS4uZDM5ZjYzZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vb2xwYy9vbHBjX2R0LmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vb2xwYy9vbHBjX2R0LmMKQEAgLTE5LDcgKzE5LDkgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BkdC5oPgorI2luY2x1ZGUgPGFzbS9vbHBjLmg+CiAjaW5jbHVkZSA8YXNtL29scGNfb2Z3Lmg+CiAKIHN0YXRpYyBwaGFuZGxlIF9faW5pdCBvbHBjX2R0X2dldHNpYmxpbmcocGhhbmRsZSBub2RlKQpAQCAtMTgwLDMgKzE4MiwyMCBAQAogCXByX2luZm8oIlBST00gRFQ6IEJ1aWx0IGRldmljZSB0cmVlIHdpdGggJXUgYnl0ZXMgb2YgbWVtb3J5LlxuIiwKIAkJCXByb21fZWFybHlfYWxsb2NhdGVkKTsKIH0KKworLyogQSBsaXN0IG9mIERUIG5vZGUvYnVzIG1hdGNoZXMgdGhhdCB3ZSB3YW50IHRvIGV4cG9zZSBhcyBwbGF0Zm9ybSBkZXZpY2VzICovCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBfX2luaXRkYXRhIG9mX2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAib2xwYyx4bzEtYmF0dGVyeSIgfSwKKwl7IC5jb21wYXRpYmxlID0gIm9scGMseG8xLWRjb24iIH0sCisJeyAuY29tcGF0aWJsZSA9ICJvbHBjLHhvMS1ydGMiIH0sCisJe30sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBvbHBjX2NyZWF0ZV9wbGF0Zm9ybV9kZXZpY2VzKHZvaWQpCit7CisJaWYgKG1hY2hpbmVfaXNfb2xwYygpKQorCQlyZXR1cm4gb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIG9mX2lkcywgTlVMTCk7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KK2RldmljZV9pbml0Y2FsbChvbHBjX2NyZWF0ZV9wbGF0Zm9ybV9kZXZpY2VzKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL3V2L3V2X3RpbWUuYyBiL2FyY2gveDg2L3BsYXRmb3JtL3V2L3V2X3RpbWUuYwppbmRleCA5ZGFmNWQxLi4wZWI5MDE4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS91di91dl90aW1lLmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vdXYvdXZfdGltZS5jCkBAIC00MCw3ICs0MCw2IEBACiAJLnJhdGluZwkJPSA0MDAsCiAJLnJlYWQJCT0gdXZfcmVhZF9ydGMsCiAJLm1hc2sJCT0gKGN5Y2xlX3QpVVZIX1JUQ19SRUFMX1RJTUVfQ0xPQ0tfTUFTSywKLQkuc2hpZnQJCT0gMTAsCiAJLmZsYWdzCQk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAogfTsKIApAQCAtMzcyLDE0ICszNzEsMTEgQEAKIAlpZiAoIWlzX3V2X3N5c3RlbSgpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWNsb2Nrc291cmNlX3V2Lm11bHQgPSBjbG9ja3NvdXJjZV9oejJtdWx0KHNuX3J0Y19jeWNsZXNfcGVyX3NlY29uZCwKLQkJCQljbG9ja3NvdXJjZV91di5zaGlmdCk7Ci0KIAkvKiBJZiBzaW5nbGUgYmxhZGUsIHByZWZlciB0c2MgKi8KIAlpZiAodXZfbnVtX3Bvc3NpYmxlX2JsYWRlcygpID09IDEpCiAJCWNsb2Nrc291cmNlX3V2LnJhdGluZyA9IDI1MDsKIAotCXJjID0gY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNsb2Nrc291cmNlX3V2KTsKKwlyYyA9IGNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KCZjbG9ja3NvdXJjZV91diwgc25fcnRjX2N5Y2xlc19wZXJfc2Vjb25kKTsKIAlpZiAocmMpCiAJCXByaW50ayhLRVJOX0lORk8gIlVWIFJUQyBjbG9ja3NvdXJjZSBmYWlsZWQgcmMgJWRcbiIsIHJjKTsKIAllbHNlCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMgYi9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMKaW5kZXggZTNjNmEwNi4uZGQ3Yjg4ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jCisrKyBiL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYwpAQCAtMjM1LDcgKzIzNSw3IEBACiAJKmR4ICY9IG1hc2tlZHg7CiB9CiAKLXN0YXRpYyBfX2luaXQgdm9pZCB4ZW5faW5pdF9jcHVpZF9tYXNrKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgeGVuX2luaXRfY3B1aWRfbWFzayh2b2lkKQogewogCXVuc2lnbmVkIGludCBheCwgYngsIGN4LCBkeDsKIAl1bnNpZ25lZCBpbnQgeHNhdmVfbWFzazsKQEAgLTQwMCw3ICs0MDAsNyBAQAogLyoKICAqIGxvYWRfZ2R0IGZvciBlYXJseSBib290LCB3aGVuIHRoZSBnZHQgaXMgb25seSBtYXBwZWQgb25jZQogICovCi1zdGF0aWMgX19pbml0IHZvaWQgeGVuX2xvYWRfZ2R0X2Jvb3QoY29uc3Qgc3RydWN0IGRlc2NfcHRyICpkdHIpCitzdGF0aWMgdm9pZCBfX2luaXQgeGVuX2xvYWRfZ2R0X2Jvb3QoY29uc3Qgc3RydWN0IGRlc2NfcHRyICpkdHIpCiB7CiAJdW5zaWduZWQgbG9uZyB2YSA9IGR0ci0+YWRkcmVzczsKIAl1bnNpZ25lZCBpbnQgc2l6ZSA9IGR0ci0+c2l6ZSArIDE7CkBAIC02NjIsNyArNjYyLDcgQEAKICAqIFZlcnNpb24gb2Ygd3JpdGVfZ2R0X2VudHJ5IGZvciB1c2UgYXQgZWFybHkgYm9vdC10aW1lIG5lZWRlZCB0bwogICogdXBkYXRlIGFuIGVudHJ5IGFzIHNpbXBseSBhcyBwb3NzaWJsZS4KICAqLwotc3RhdGljIF9faW5pdCB2b2lkIHhlbl93cml0ZV9nZHRfZW50cnlfYm9vdChzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmR0LCBpbnQgZW50cnksCitzdGF0aWMgdm9pZCBfX2luaXQgeGVuX3dyaXRlX2dkdF9lbnRyeV9ib290KHN0cnVjdCBkZXNjX3N0cnVjdCAqZHQsIGludCBlbnRyeSwKIAkJCQkJICAgIGNvbnN0IHZvaWQgKmRlc2MsIGludCB0eXBlKQogewogCXN3aXRjaCAodHlwZSkgewpAQCAtOTMzLDE4ICs5MzMsMTggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHB2X2luZm8geGVuX2luZm8gX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHZfaW5mbyB4ZW5faW5mbyBfX2luaXRjb25zdCA9IHsKIAkucGFyYXZpcnRfZW5hYmxlZCA9IDEsCiAJLnNoYXJlZF9rZXJuZWxfcG1kID0gMCwKIAogCS5uYW1lID0gIlhlbiIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHB2X2luaXRfb3BzIHhlbl9pbml0X29wcyBfX2luaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwdl9pbml0X29wcyB4ZW5faW5pdF9vcHMgX19pbml0Y29uc3QgPSB7CiAJLnBhdGNoID0geGVuX3BhdGNoLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBwdl9jcHVfb3BzIHhlbl9jcHVfb3BzIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHB2X2NwdV9vcHMgeGVuX2NwdV9vcHMgX19pbml0Y29uc3QgPSB7CiAJLmNwdWlkID0geGVuX2NwdWlkLAogCiAJLnNldF9kZWJ1Z3JlZyA9IHhlbl9zZXRfZGVidWdyZWcsCkBAIC0xMDA0LDcgKzEwMDQsNyBAQAogCS5lbmRfY29udGV4dF9zd2l0Y2ggPSB4ZW5fZW5kX2NvbnRleHRfc3dpdGNoLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBwdl9hcGljX29wcyB4ZW5fYXBpY19vcHMgX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHZfYXBpY19vcHMgeGVuX2FwaWNfb3BzIF9faW5pdGNvbnN0ID0gewogI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwogCS5zdGFydHVwX2lwaV9ob29rID0gcGFyYXZpcnRfbm9wLAogI2VuZGlmCkBAIC0xMDU1LDcgKzEwNTUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1hY2hpbmVfb3BzIF9faW5pdGRhdGEgeGVuX21hY2hpbmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBtYWNoaW5lX29wcyB4ZW5fbWFjaGluZV9vcHMgX19pbml0Y29uc3QgPSB7CiAJLnJlc3RhcnQgPSB4ZW5fcmVzdGFydCwKIAkuaGFsdCA9IHhlbl9tYWNoaW5lX2hhbHQsCiAJLnBvd2VyX29mZiA9IHhlbl9tYWNoaW5lX2hhbHQsCkBAIC0xMzMyLDcgKzEzMzIsNyBAQAogCXJldHVybiBOT1RJRllfT0s7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgX19jcHVpbml0ZGF0YSB4ZW5faHZtX2NwdV9ub3RpZmllciA9IHsKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgeGVuX2h2bV9jcHVfbm90aWZpZXIgX19jcHVpbml0ZGF0YSA9IHsKIAkubm90aWZpZXJfY2FsbAk9IHhlbl9odm1fY3B1X25vdGlmeSwKIH07CiAKQEAgLTEzODEsNyArMTM4MSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh4ZW5faHZtX25lZWRfbGFwaWMpOwogCi1jb25zdCBfX3JlZmNvbnN0IHN0cnVjdCBoeXBlcnZpc29yX3g4NiB4ODZfaHlwZXJfeGVuX2h2bSA9IHsKK2NvbnN0IHN0cnVjdCBoeXBlcnZpc29yX3g4NiB4ODZfaHlwZXJfeGVuX2h2bSBfX3JlZmNvbnN0ID0gewogCS5uYW1lCQkJPSAiWGVuIEhWTSIsCiAJLmRldGVjdAkJCT0geGVuX2h2bV9wbGF0Zm9ybSwKIAkuaW5pdF9wbGF0Zm9ybQkJPSB4ZW5faHZtX2d1ZXN0X2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vaXJxLmMgYi9hcmNoL3g4Ni94ZW4vaXJxLmMKaW5kZXggNmE2ZmU4OS4uOGJiYjQ2NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL2lycS5jCisrKyBiL2FyY2gveDg2L3hlbi9pcnEuYwpAQCAtMTEzLDcgKzExMyw3IEBACiAJCXhlbl9zYWZlX2hhbHQoKTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBwdl9pcnFfb3BzIHhlbl9pcnFfb3BzIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHB2X2lycV9vcHMgeGVuX2lycV9vcHMgX19pbml0Y29uc3QgPSB7CiAJLnNhdmVfZmwgPSBQVl9DQUxMRUVfU0FWRSh4ZW5fc2F2ZV9mbCksCiAJLnJlc3RvcmVfZmwgPSBQVl9DQUxMRUVfU0FWRSh4ZW5fcmVzdG9yZV9mbCksCiAJLmlycV9kaXNhYmxlID0gUFZfQ0FMTEVFX1NBVkUoeGVuX2lycV9kaXNhYmxlKSwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9tbXUuYyBiL2FyY2gveDg2L3hlbi9tbXUuYwppbmRleCAwNjg0ZjNjLi4wMmQ3NTI0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vbW11LmMKKysrIGIvYXJjaC94ODYveGVuL21tdS5jCkBAIC0xMDU0LDcgKzEwNTQsNyBAQAogICogdGhhdCdzIGJlZm9yZSB3ZSBoYXZlIHBhZ2Ugc3RydWN0dXJlcyB0byBzdG9yZSB0aGUgYml0cy4gIFNvIGRvIGFsbAogICogdGhlIGJvb2sta2VlcGluZyBub3cuCiAgKi8KLXN0YXRpYyBfX2luaXQgaW50IHhlbl9tYXJrX3Bpbm5lZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHBhZ2UgKnBhZ2UsCitzdGF0aWMgaW50IF9faW5pdCB4ZW5fbWFya19waW5uZWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBwYWdlICpwYWdlLAogCQkJCSAgZW51bSBwdF9sZXZlbCBsZXZlbCkKIHsKIAlTZXRQYWdlUGlubmVkKHBhZ2UpOwpAQCAtMTE4Nyw3ICsxMTg3LDcgQEAKIAogCWFjdGl2ZV9tbSA9IHBlcmNwdV9yZWFkKGNwdV90bGJzdGF0ZS5hY3RpdmVfbW0pOwogCi0JaWYgKGFjdGl2ZV9tbSA9PSBtbSkKKwlpZiAoYWN0aXZlX21tID09IG1tICYmIHBlcmNwdV9yZWFkKGNwdV90bGJzdGF0ZS5zdGF0ZSkgIT0gVExCU1RBVEVfT0spCiAJCWxlYXZlX21tKHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAKIAkvKiBJZiB0aGlzIGNwdSBzdGlsbCBoYXMgYSBzdGFsZSBjcjMgcmVmZXJlbmNlLCB0aGVuIG1ha2Ugc3VyZQpAQCAtMTI3MSw3ICsxMjcxLDcgQEAKIAlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CiB9CiAKLXN0YXRpYyBfX2luaXQgdm9pZCB4ZW5fcGFnZXRhYmxlX3NldHVwX3N0YXJ0KHBnZF90ICpiYXNlKQorc3RhdGljIHZvaWQgX19pbml0IHhlbl9wYWdldGFibGVfc2V0dXBfc3RhcnQocGdkX3QgKmJhc2UpCiB7CiB9CiAKQEAgLTEyOTEsNyArMTI5MSw3IEBACiAKIHN0YXRpYyB2b2lkIHhlbl9wb3N0X2FsbG9jYXRvcl9pbml0KHZvaWQpOwogCi1zdGF0aWMgX19pbml0IHZvaWQgeGVuX3BhZ2V0YWJsZV9zZXR1cF9kb25lKHBnZF90ICpiYXNlKQorc3RhdGljIHZvaWQgX19pbml0IHhlbl9wYWdldGFibGVfc2V0dXBfZG9uZShwZ2RfdCAqYmFzZSkKIHsKIAl4ZW5fc2V0dXBfc2hhcmVkX2luZm8oKTsKIAl4ZW5fcG9zdF9hbGxvY2F0b3JfaW5pdCgpOwpAQCAtMTQ4OCw3ICsxNDg4LDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19YODZfMzIKLXN0YXRpYyBfX2luaXQgcHRlX3QgbWFza19yd19wdGUocHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSkKK3N0YXRpYyBwdGVfdCBfX2luaXQgbWFza19yd19wdGUocHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSkKIHsKIAkvKiBJZiB0aGVyZSdzIGFuIGV4aXN0aW5nIHB0ZSwgdGhlbiBkb24ndCBhbGxvdyBfUEFHRV9SVyB0byBiZSBzZXQgKi8KIAlpZiAocHRlX3ZhbF9tYSgqcHRlcCkgJiBfUEFHRV9QUkVTRU5UKQpAQCAtMTQ5OCw3ICsxNDk4LDcgQEAKIAlyZXR1cm4gcHRlOwogfQogI2Vsc2UgLyogQ09ORklHX1g4Nl82NCAqLwotc3RhdGljIF9faW5pdCBwdGVfdCBtYXNrX3J3X3B0ZShwdGVfdCAqcHRlcCwgcHRlX3QgcHRlKQorc3RhdGljIHB0ZV90IF9faW5pdCBtYXNrX3J3X3B0ZShwdGVfdCAqcHRlcCwgcHRlX3QgcHRlKQogewogCXVuc2lnbmVkIGxvbmcgcGZuID0gcHRlX3BmbihwdGUpOwogCkBAIC0xNTE5LDcgKzE1MTksNyBAQAogCiAvKiBJbml0LXRpbWUgc2V0X3B0ZSB3aGlsZSBjb25zdHJ1Y3RpbmcgaW5pdGlhbCBwYWdldGFibGVzLCB3aGljaAogICAgZG9lc24ndCBhbGxvdyBSTyBwYWdldGFibGUgcGFnZXMgdG8gYmUgcmVtYXBwZWQgUlcgKi8KLXN0YXRpYyBfX2luaXQgdm9pZCB4ZW5fc2V0X3B0ZV9pbml0KHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUpCitzdGF0aWMgdm9pZCBfX2luaXQgeGVuX3NldF9wdGVfaW5pdChwdGVfdCAqcHRlcCwgcHRlX3QgcHRlKQogewogCXB0ZSA9IG1hc2tfcndfcHRlKHB0ZXAsIHB0ZSk7CiAKQEAgLTE1MzcsNyArMTUzNyw3IEBACiAKIC8qIEVhcmx5IGluIGJvb3QsIHdoaWxlIHNldHRpbmcgdXAgdGhlIGluaXRpYWwgcGFnZXRhYmxlLCBhc3N1bWUKICAgIGV2ZXJ5dGhpbmcgaXMgcGlubmVkLiAqLwotc3RhdGljIF9faW5pdCB2b2lkIHhlbl9hbGxvY19wdGVfaW5pdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBwZm4pCitzdGF0aWMgdm9pZCBfX2luaXQgeGVuX2FsbG9jX3B0ZV9pbml0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHBmbikKIHsKICNpZmRlZiBDT05GSUdfRkxBVE1FTQogCUJVR19PTihtZW1fbWFwKTsJLyogc2hvdWxkIG9ubHkgYmUgdXNlZCBlYXJseSAqLwpAQCAtMTU0Nyw3ICsxNTQ3LDcgQEAKIH0KIAogLyogVXNlZCBmb3IgcG1kIGFuZCBwdWQgKi8KLXN0YXRpYyBfX2luaXQgdm9pZCB4ZW5fYWxsb2NfcG1kX2luaXQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcGZuKQorc3RhdGljIHZvaWQgX19pbml0IHhlbl9hbGxvY19wbWRfaW5pdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBwZm4pCiB7CiAjaWZkZWYgQ09ORklHX0ZMQVRNRU0KIAlCVUdfT04obWVtX21hcCk7CS8qIHNob3VsZCBvbmx5IGJlIHVzZWQgZWFybHkgKi8KQEAgLTE1NTcsMTMgKzE1NTcsMTMgQEAKIAogLyogRWFybHkgcmVsZWFzZV9wdGUgYXNzdW1lcyB0aGF0IGFsbCBwdHMgYXJlIHBpbm5lZCwgc2luY2UgdGhlcmUncwogICAgb25seSBpbml0X21tIGFuZCBhbnl0aGluZyBhdHRhY2hlZCB0byB0aGF0IGlzIHBpbm5lZC4gKi8KLXN0YXRpYyBfX2luaXQgdm9pZCB4ZW5fcmVsZWFzZV9wdGVfaW5pdCh1bnNpZ25lZCBsb25nIHBmbikKK3N0YXRpYyB2b2lkIF9faW5pdCB4ZW5fcmVsZWFzZV9wdGVfaW5pdCh1bnNpZ25lZCBsb25nIHBmbikKIHsKIAlwaW5fcGFnZXRhYmxlX3BmbihNTVVFWFRfVU5QSU5fVEFCTEUsIHBmbik7CiAJbWFrZV9sb3dtZW1fcGFnZV9yZWFkd3JpdGUoX192YShQRk5fUEhZUyhwZm4pKSk7CiB9CiAKLXN0YXRpYyBfX2luaXQgdm9pZCB4ZW5fcmVsZWFzZV9wbWRfaW5pdCh1bnNpZ25lZCBsb25nIHBmbikKK3N0YXRpYyB2b2lkIF9faW5pdCB4ZW5fcmVsZWFzZV9wbWRfaW5pdCh1bnNpZ25lZCBsb25nIHBmbikKIHsKIAltYWtlX2xvd21lbV9wYWdlX3JlYWR3cml0ZShfX3ZhKFBGTl9QSFlTKHBmbikpKTsKIH0KQEAgLTE2ODksNyArMTY4OSw3IEBACiAJCUJVRygpOwogfQogCi1zdGF0aWMgX19pbml0IHZvaWQgeGVuX21hcF9pZGVudGl0eV9lYXJseShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIG1heF9wZm4pCitzdGF0aWMgdm9pZCBfX2luaXQgeGVuX21hcF9pZGVudGl0eV9lYXJseShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIG1heF9wZm4pCiB7CiAJdW5zaWduZWQgcG1kaWR4LCBwdGVpZHg7CiAJdW5zaWduZWQgaWRlbnRfcHRlOwpAQCAtMTc3Miw3ICsxNzcyLDcgQEAKICAqIG9mIHRoZSBwaHlzaWNhbCBtYXBwaW5nIG9uY2Ugc29tZSBzb3J0IG9mIGFsbG9jYXRvciBoYXMgYmVlbiBzZXQKICAqIHVwLgogICovCi1fX2luaXQgcGdkX3QgKnhlbl9zZXR1cF9rZXJuZWxfcGFnZXRhYmxlKHBnZF90ICpwZ2QsCitwZ2RfdCAqIF9faW5pdCB4ZW5fc2V0dXBfa2VybmVsX3BhZ2V0YWJsZShwZ2RfdCAqcGdkLAogCQkJCQkgdW5zaWduZWQgbG9uZyBtYXhfcGZuKQogewogCXB1ZF90ICpsMzsKQEAgLTE4NDMsNyArMTg0Myw3IEBACiBzdGF0aWMgUkVTRVJWRV9CUktfQVJSQVkocG1kX3QsIGluaXRpYWxfa2VybmVsX3BtZCwgUFRSU19QRVJfUE1EKTsKIHN0YXRpYyBSRVNFUlZFX0JSS19BUlJBWShwbWRfdCwgc3dhcHBlcl9rZXJuZWxfcG1kLCBQVFJTX1BFUl9QTUQpOwogCi1zdGF0aWMgX19pbml0IHZvaWQgeGVuX3dyaXRlX2NyM19pbml0KHVuc2lnbmVkIGxvbmcgY3IzKQorc3RhdGljIHZvaWQgX19pbml0IHhlbl93cml0ZV9jcjNfaW5pdCh1bnNpZ25lZCBsb25nIGNyMykKIHsKIAl1bnNpZ25lZCBsb25nIHBmbiA9IFBGTl9ET1dOKF9fcGEoc3dhcHBlcl9wZ19kaXIpKTsKIApAQCAtMTg4MCw3ICsxODgwLDcgQEAKIAlwdl9tbXVfb3BzLndyaXRlX2NyMyA9ICZ4ZW5fd3JpdGVfY3IzOwogfQogCi1fX2luaXQgcGdkX3QgKnhlbl9zZXR1cF9rZXJuZWxfcGFnZXRhYmxlKHBnZF90ICpwZ2QsCitwZ2RfdCAqIF9faW5pdCB4ZW5fc2V0dXBfa2VybmVsX3BhZ2V0YWJsZShwZ2RfdCAqcGdkLAogCQkJCQkgdW5zaWduZWQgbG9uZyBtYXhfcGZuKQogewogCXBtZF90ICprZXJuZWxfcG1kOwpAQCAtMTk4Niw3ICsxOTg2LDcgQEAKICNlbmRpZgogfQogCi1fX2luaXQgdm9pZCB4ZW5faWRlbnRfbWFwX0lTQSh2b2lkKQordm9pZCBfX2luaXQgeGVuX2lkZW50X21hcF9JU0Eodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHBhOwogCkBAIC0yMDA5LDcgKzIwMDksNyBAQAogCXhlbl9mbHVzaF90bGIoKTsKIH0KIAotc3RhdGljIF9faW5pdCB2b2lkIHhlbl9wb3N0X2FsbG9jYXRvcl9pbml0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgeGVuX3Bvc3RfYWxsb2NhdG9yX2luaXQodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfWEVOX0RFQlVHCiAJcHZfbW11X29wcy5tYWtlX3B0ZSA9IFBWX0NBTExFRV9TQVZFKHhlbl9tYWtlX3B0ZV9kZWJ1Zyk7CkBAIC0yMDQ2LDcgKzIwNDYsNyBAQAogCXByZWVtcHRfZW5hYmxlKCk7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcHZfbW11X29wcyB4ZW5fbW11X29wcyBfX2luaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwdl9tbXVfb3BzIHhlbl9tbXVfb3BzIF9faW5pdGNvbnN0ID0gewogCS5yZWFkX2NyMiA9IHhlbl9yZWFkX2NyMiwKIAkud3JpdGVfY3IyID0geGVuX3dyaXRlX2NyMiwKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3AybS5jIGIvYXJjaC94ODYveGVuL3AybS5jCmluZGV4IDE0MWViMGQuLjU4ZWZlYjkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9wMm0uYworKysgYi9hcmNoL3g4Ni94ZW4vcDJtLmMKQEAgLTUyMiwxMSArNTIyLDIwIEBACiAJLyogQm91bmRhcnkgY3Jvc3Mtb3ZlciBmb3IgdGhlIGVkZ2VzOiAqLwogCWlmIChpZHgpIHsKIAkJdW5zaWduZWQgbG9uZyAqcDJtID0gZXh0ZW5kX2JyayhQQUdFX1NJWkUsIFBBR0VfU0laRSk7CisJCXVuc2lnbmVkIGxvbmcgKm1pZF9tZm5fcDsKIAogCQlwMm1faW5pdChwMm0pOwogCiAJCXAybV90b3BbdG9waWR4XVttaWRpZHhdID0gcDJtOwogCisJCS8qIEZvciBzYXZlL3Jlc3RvcmUgd2UgbmVlZCB0byBNRk4gb2YgdGhlIFAyTSBzYXZlZCAqLworCQkKKwkJbWlkX21mbl9wID0gcDJtX3RvcF9tZm5fcFt0b3BpZHhdOworCQlXQVJOKG1pZF9tZm5fcFttaWRpZHhdICE9IHZpcnRfdG9fbWZuKHAybV9taXNzaW5nKSwKKwkJCSJQMk1fVE9QX1BbJWRdWyVkXSAhPSBNRk4gb2YgcDJtX21pc3NpbmchXG4iLAorCQkJdG9waWR4LCBtaWRpZHgpOworCQltaWRfbWZuX3BbbWlkaWR4XSA9IHZpcnRfdG9fbWZuKHAybSk7CisKIAl9CiAJcmV0dXJuIGlkeCAhPSAwOwogfQpAQCAtNTQ5LDEyICs1NTgsMjkgQEAKIAkJcGZuICs9IFAyTV9NSURfUEVSX1BBR0UgKiBQMk1fUEVSX1BBR0UpCiAJewogCQl1bnNpZ25lZCB0b3BpZHggPSBwMm1fdG9wX2luZGV4KHBmbik7Ci0JCWlmIChwMm1fdG9wW3RvcGlkeF0gPT0gcDJtX21pZF9taXNzaW5nKSB7Ci0JCQl1bnNpZ25lZCBsb25nICoqbWlkID0gZXh0ZW5kX2JyayhQQUdFX1NJWkUsIFBBR0VfU0laRSk7CisJCXVuc2lnbmVkIGxvbmcgKm1pZF9tZm5fcDsKKwkJdW5zaWduZWQgbG9uZyAqKm1pZDsKKworCQltaWQgPSBwMm1fdG9wW3RvcGlkeF07CisJCW1pZF9tZm5fcCA9IHAybV90b3BfbWZuX3BbdG9waWR4XTsKKwkJaWYgKG1pZCA9PSBwMm1fbWlkX21pc3NpbmcpIHsKKwkJCW1pZCA9IGV4dGVuZF9icmsoUEFHRV9TSVpFLCBQQUdFX1NJWkUpOwogCiAJCQlwMm1fbWlkX2luaXQobWlkKTsKIAogCQkJcDJtX3RvcFt0b3BpZHhdID0gbWlkOworCisJCQlCVUdfT04obWlkX21mbl9wICE9IHAybV9taWRfbWlzc2luZ19tZm4pOworCQl9CisJCS8qIEFuZCB0aGUgc2F2ZS9yZXN0b3JlIFAyTSB0YWJsZXMuLiAqLworCQlpZiAobWlkX21mbl9wID09IHAybV9taWRfbWlzc2luZ19tZm4pIHsKKwkJCW1pZF9tZm5fcCA9IGV4dGVuZF9icmsoUEFHRV9TSVpFLCBQQUdFX1NJWkUpOworCQkJcDJtX21pZF9tZm5faW5pdChtaWRfbWZuX3ApOworCisJCQlwMm1fdG9wX21mbl9wW3RvcGlkeF0gPSBtaWRfbWZuX3A7CisJCQlwMm1fdG9wX21mblt0b3BpZHhdID0gdmlydF90b19tZm4obWlkX21mbl9wKTsKKwkJCS8qIE5vdGU6IHdlIGRvbid0IHNldCBtaWRfbWZuX3BbbWlkaXhdIGhlcmUsCisJCSAJICogbG9vayBpbiBfX2Vhcmx5X2FsbG9jX3AybSAqLwogCQl9CiAJfQogCkBAIC02NTAsNyArNjc2LDcgQEAKIH0KIAogLyogQWRkIGFuIE1GTiBvdmVycmlkZSBmb3IgYSBwYXJ0aWN1bGFyIHBhZ2UgKi8KLWludCBtMnBfYWRkX292ZXJyaWRlKHVuc2lnbmVkIGxvbmcgbWZuLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK2ludCBtMnBfYWRkX292ZXJyaWRlKHVuc2lnbmVkIGxvbmcgbWZuLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgYm9vbCBjbGVhcl9wdGUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBsb25nIHBmbjsKQEAgLTY2Miw3ICs2ODgsNiBAQAogCWlmICghUGFnZUhpZ2hNZW0ocGFnZSkpIHsKIAkJYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKV9fdmEocGZuIDw8IFBBR0VfU0hJRlQpOwogCQlwdGVwID0gbG9va3VwX2FkZHJlc3MoYWRkcmVzcywgJmxldmVsKTsKLQogCQlpZiAoV0FSTihwdGVwID09IE5VTEwgfHwgbGV2ZWwgIT0gUEdfTEVWRUxfNEssCiAJCQkJCSJtMnBfYWRkX292ZXJyaWRlOiBwZm4gJWx4IG5vdCBtYXBwZWQiLCBwZm4pKQogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC02NzQsMTggKzY5OSwxNyBAQAogCWlmICh1bmxpa2VseSghc2V0X3BoeXNfdG9fbWFjaGluZShwZm4sIEZPUkVJR05fRlJBTUUobWZuKSkpKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmICghUGFnZUhpZ2hNZW0ocGFnZSkpCisJaWYgKGNsZWFyX3B0ZSAmJiAhUGFnZUhpZ2hNZW0ocGFnZSkpCiAJCS8qIEp1c3QgemFwIG9sZCBtYXBwaW5nIGZvciBub3cgKi8KIAkJcHRlX2NsZWFyKCZpbml0X21tLCBhZGRyZXNzLCBwdGVwKTsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZtMnBfb3ZlcnJpZGVfbG9jaywgZmxhZ3MpOwogCWxpc3RfYWRkKCZwYWdlLT5scnUsICAmbTJwX292ZXJyaWRlc1ttZm5faGFzaChtZm4pXSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbTJwX292ZXJyaWRlX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQotCi1pbnQgbTJwX3JlbW92ZV9vdmVycmlkZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK0VYUE9SVF9TWU1CT0xfR1BMKG0ycF9hZGRfb3ZlcnJpZGUpOworaW50IG0ycF9yZW1vdmVfb3ZlcnJpZGUoc3RydWN0IHBhZ2UgKnBhZ2UsIGJvb2wgY2xlYXJfcHRlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyBtZm47CkBAIC03MTMsNyArNzM3LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtMnBfb3ZlcnJpZGVfbG9jaywgZmxhZ3MpOwogCXNldF9waHlzX3RvX21hY2hpbmUocGZuLCBwYWdlLT5pbmRleCk7CiAKLQlpZiAoIVBhZ2VIaWdoTWVtKHBhZ2UpKQorCWlmIChjbGVhcl9wdGUgJiYgIVBhZ2VIaWdoTWVtKHBhZ2UpKQogCQlzZXRfcHRlX2F0KCZpbml0X21tLCBhZGRyZXNzLCBwdGVwLAogCQkJCXBmbl9wdGUocGZuLCBQQUdFX0tFUk5FTCkpOwogCQkvKiBObyB0bGIgZmx1c2ggbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGNhbGxlciBhbHJlYWR5CkBAIC03MjEsNiArNzQ1LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobTJwX3JlbW92ZV9vdmVycmlkZSk7CiAKIHN0cnVjdCBwYWdlICptMnBfZmluZF9vdmVycmlkZSh1bnNpZ25lZCBsb25nIG1mbikKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9zZXR1cC5jIGIvYXJjaC94ODYveGVuL3NldHVwLmMKaW5kZXggOTBiYWMwYS4uYmUxYTQ2NCAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL3NldHVwLmMKKysrIGIvYXJjaC94ODYveGVuL3NldHVwLmMKQEAgLTUwLDcgKzUwLDcgQEAKICAqLwogI2RlZmluZSBFWFRSQV9NRU1fUkFUSU8JCSgxMCkKIAotc3RhdGljIF9faW5pdCB2b2lkIHhlbl9hZGRfZXh0cmFfbWVtKHVuc2lnbmVkIGxvbmcgcGFnZXMpCitzdGF0aWMgdm9pZCBfX2luaXQgeGVuX2FkZF9leHRyYV9tZW0odW5zaWduZWQgbG9uZyBwYWdlcykKIHsKIAl1bnNpZ25lZCBsb25nIHBmbjsKIApAQCAtMTY2LDcgKzE2Niw3IEBACiAJCWlmIChsYXN0ID4gZW5kKQogCQkJY29udGludWU7CiAKLQkJaWYgKGVudHJ5LT50eXBlID09IEU4MjBfUkFNKSB7CisJCWlmICgoZW50cnktPnR5cGUgPT0gRTgyMF9SQU0pIHx8IChlbnRyeS0+dHlwZSA9PSBFODIwX1VOVVNBQkxFKSkgewogCQkJaWYgKHN0YXJ0ID4gc3RhcnRfcGNpKQogCQkJCWlkZW50aXR5ICs9IHNldF9waHlzX3JhbmdlX2lkZW50aXR5KAogCQkJCQkJUEZOX1VQKHN0YXJ0X3BjaSksIFBGTl9ET1dOKHN0YXJ0KSk7CkBAIC0yMjcsNyArMjI3LDExIEBACiAKIAltZW1jcHkobWFwX3JhdywgbWFwLCBzaXplb2YobWFwKSk7CiAJZTgyMC5ucl9tYXAgPSAwOworI2lmZGVmIENPTkZJR19YODZfMzIKKwl4ZW5fZXh0cmFfbWVtX3N0YXJ0ID0gbWVtX2VuZDsKKyNlbHNlCiAJeGVuX2V4dHJhX21lbV9zdGFydCA9IG1heCgoMVVMTCA8PCAzMiksIG1lbV9lbmQpOworI2VuZGlmCiAJZm9yIChpID0gMDsgaSA8IG1lbW1hcC5ucl9lbnRyaWVzOyBpKyspIHsKIAkJdW5zaWduZWQgbG9uZyBsb25nIGVuZDsKIApAQCAtMzM2LDcgKzM0MCw3IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIF9fY3B1aW5pdCBpbnQgcmVnaXN0ZXJfY2FsbGJhY2sodW5zaWduZWQgdHlwZSwgY29uc3Qgdm9pZCAqZnVuYykKK3N0YXRpYyBpbnQgX19jcHVpbml0IHJlZ2lzdGVyX2NhbGxiYWNrKHVuc2lnbmVkIHR5cGUsIGNvbnN0IHZvaWQgKmZ1bmMpCiB7CiAJc3RydWN0IGNhbGxiYWNrX3JlZ2lzdGVyIGNhbGxiYWNrID0gewogCQkudHlwZSA9IHR5cGUsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vc21wLmMgYi9hcmNoL3g4Ni94ZW4vc21wLmMKaW5kZXggMzA2MTI0NC4uNDEwMzhjMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL3NtcC5jCisrKyBiL2FyY2gveDg2L3hlbi9zbXAuYwpAQCAtNDYsMTggKzQ2LDE3IEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgeGVuX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogCiAvKgotICogUmVzY2hlZHVsZSBjYWxsIGJhY2suIE5vdGhpbmcgdG8gZG8sCi0gKiBhbGwgdGhlIHdvcmsgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IHdoZW4KLSAqIHdlIHJldHVybiBmcm9tIHRoZSBpbnRlcnJ1cHQuCisgKiBSZXNjaGVkdWxlIGNhbGwgYmFjay4KICAqLwogc3RhdGljIGlycXJldHVybl90IHhlbl9yZXNjaGVkdWxlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJaW5jX2lycV9zdGF0KGlycV9yZXNjaGVkX2NvdW50KTsKKwlzY2hlZHVsZXJfaXBpKCk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBfX2NwdWluaXQgdm9pZCBjcHVfYnJpbmd1cCh2b2lkKQorc3RhdGljIHZvaWQgX19jcHVpbml0IGNwdV9icmluZ3VwKHZvaWQpCiB7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIApAQCAtODUsNyArODQsNyBAQAogCXdtYigpOwkJCS8qIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIG91dCAqLwogfQogCi1zdGF0aWMgX19jcHVpbml0IHZvaWQgY3B1X2JyaW5ndXBfYW5kX2lkbGUodm9pZCkKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBjcHVfYnJpbmd1cF9hbmRfaWRsZSh2b2lkKQogewogCWNwdV9icmluZ3VwKCk7CiAJY3B1X2lkbGUoKTsKQEAgLTI0Miw3ICsyNDEsNyBAQAogCX0KIH0KIAotc3RhdGljIF9fY3B1aW5pdCBpbnQKK3N0YXRpYyBpbnQgX19jcHVpbml0CiBjcHVfaW5pdGlhbGl6ZV9jb250ZXh0KHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZSkKIHsKIAlzdHJ1Y3QgdmNwdV9ndWVzdF9jb250ZXh0ICpjdHh0OwpAQCAtNDg2LDcgKzQ4NSw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNtcF9vcHMgeGVuX3NtcF9vcHMgX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc21wX29wcyB4ZW5fc21wX29wcyBfX2luaXRjb25zdCA9IHsKIAkuc21wX3ByZXBhcmVfYm9vdF9jcHUgPSB4ZW5fc21wX3ByZXBhcmVfYm9vdF9jcHUsCiAJLnNtcF9wcmVwYXJlX2NwdXMgPSB4ZW5fc21wX3ByZXBhcmVfY3B1cywKIAkuc21wX2NwdXNfZG9uZSA9IHhlbl9zbXBfY3B1c19kb25lLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3RpbWUuYyBiL2FyY2gveDg2L3hlbi90aW1lLmMKaW5kZXggMmUyZDM3MC4uNTE1OGM1MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL3RpbWUuYworKysgYi9hcmNoL3g4Ni94ZW4vdGltZS5jCkBAIC0yNiw4ICsyNiw2IEBACiAKICNpbmNsdWRlICJ4ZW4tb3BzLmgiCiAKLSNkZWZpbmUgWEVOX1NISUZUIDIyCi0KIC8qIFhlbiBtYXkgZmlyZSBhIHRpbWVyIHVwIHRvIHRoaXMgbWFueSBucyBlYXJseSAqLwogI2RlZmluZSBUSU1FUl9TTE9QCTEwMDAwMAogI2RlZmluZSBOU19QRVJfVElDSwkoMTAwMDAwMDAwMExMIC8gSFopCkBAIC0yMTEsOCArMjA5LDYgQEAKIAkucmF0aW5nID0gNDAwLAogCS5yZWFkID0geGVuX2Nsb2Nrc291cmNlX2dldF9jeWNsZXMsCiAJLm1hc2sgPSB+MCwKLQkubXVsdCA9IDE8PFhFTl9TSElGVCwJCS8qIHRpbWUgZGlyZWN0bHkgaW4gbmFub3NlY29uZHMgKi8KLQkuc2hpZnQgPSBYRU5fU0hJRlQsCiAJLmZsYWdzID0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCkBAIC00MzksMTYgKzQzNSwxNiBAQAogCX0KIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBwdl90aW1lX29wcyB4ZW5fdGltZV9vcHMgX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHZfdGltZV9vcHMgeGVuX3RpbWVfb3BzIF9faW5pdGNvbnN0ID0gewogCS5zY2hlZF9jbG9jayA9IHhlbl9jbG9ja3NvdXJjZV9yZWFkLAogfTsKIAotc3RhdGljIF9faW5pdCB2b2lkIHhlbl90aW1lX2luaXQodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCB4ZW5fdGltZV9pbml0KHZvaWQpCiB7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAlzdHJ1Y3QgdGltZXNwZWMgdHA7CiAKLQljbG9ja3NvdXJjZV9yZWdpc3RlcigmeGVuX2Nsb2Nrc291cmNlKTsKKwljbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmeGVuX2Nsb2Nrc291cmNlLCBOU0VDX1BFUl9TRUMpOwogCiAJaWYgKEhZUEVSVklTT1JfdmNwdV9vcChWQ1BVT1Bfc3RvcF9wZXJpb2RpY190aW1lciwgY3B1LCBOVUxMKSA9PSAwKSB7CiAJCS8qIFN1Y2Nlc3NmdWxseSB0dXJuZWQgb2ZmIDEwMEh6IHRpY2ssIHNvIHdlIGhhdmUgdGhlCkBAIC00NjgsNyArNDY0LDcgQEAKIAl4ZW5fc2V0dXBfY3B1X2Nsb2NrZXZlbnRzKCk7CiB9CiAKLV9faW5pdCB2b2lkIHhlbl9pbml0X3RpbWVfb3BzKHZvaWQpCit2b2lkIF9faW5pdCB4ZW5faW5pdF90aW1lX29wcyh2b2lkKQogewogCXB2X3RpbWVfb3BzID0geGVuX3RpbWVfb3BzOwogCkBAIC00OTAsNyArNDg2LDcgQEAKIAl4ZW5fc2V0dXBfY3B1X2Nsb2NrZXZlbnRzKCk7CiB9CiAKLV9faW5pdCB2b2lkIHhlbl9odm1faW5pdF90aW1lX29wcyh2b2lkKQordm9pZCBfX2luaXQgeGVuX2h2bV9pbml0X3RpbWVfb3BzKHZvaWQpCiB7CiAJLyogdmVjdG9yIGNhbGxiYWNrIGlzIG5lZWRlZCBvdGhlcndpc2Ugd2UgY2Fubm90IHJlY2VpdmUgaW50ZXJydXB0cwogCSAqIG9uIGNwdSA+IDAgYW5kIGF0IHRoaXMgcG9pbnQgd2UgZG9uJ3Qga25vdyBob3cgbWFueSBjcHVzIGFyZQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3hlbi1vcHMuaCBiL2FyY2gveDg2L3hlbi94ZW4tb3BzLmgKaW5kZXggMzExMmY1NS4uOTdkZmRjOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL3hlbi1vcHMuaAorKysgYi9hcmNoL3g4Ni94ZW4veGVuLW9wcy5oCkBAIC03NCw3ICs3NCw3IEBACiAKICNpZmRlZiBDT05GSUdfUEFSQVZJUlRfU1BJTkxPQ0tTCiB2b2lkIF9faW5pdCB4ZW5faW5pdF9zcGlubG9ja3Modm9pZCk7Ci1fX2NwdWluaXQgdm9pZCB4ZW5faW5pdF9sb2NrX2NwdShpbnQgY3B1KTsKK3ZvaWQgX19jcHVpbml0IHhlbl9pbml0X2xvY2tfY3B1KGludCBjcHUpOwogdm9pZCB4ZW5fdW5pbml0X2xvY2tfY3B1KGludCBjcHUpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCB4ZW5faW5pdF9zcGlubG9ja3Modm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvS2NvbmZpZyBiL2RyaXZlcnMvS2NvbmZpZwppbmRleCAxNzdjN2QxLi41NTdhNDY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL0tjb25maWcKKysrIGIvZHJpdmVycy9LY29uZmlnCkBAIC0xMTksNCArMTE5LDcgQEAKIHNvdXJjZSAiZHJpdmVycy9jbGsvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL2h3c3BpbmxvY2svS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL2Nsb2Nrc291cmNlL0tjb25maWciCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9wZXJmbGliLmMKaW5kZXggM2E3M2E5My4uODViMzIzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9wZXJmbGliLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9wZXJmbGliLmMKQEAgLTQ5LDEwICs0OSw2IEBACiAKIHN0YXRpYyBERUZJTkVfTVVURVgocGVyZm9ybWFuY2VfbXV0ZXgpOwogCi0vKiBVc2UgY3B1ZnJlcSBkZWJ1ZyBsYXllciBmb3IgX1BQQyBjaGFuZ2VzLiAqLwotI2RlZmluZSBjcHVmcmVxX3ByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfQ09SRSwgXAotCQkJCQkJImNwdWZyZXEtY29yZSIsIG1zZykKLQogLyoKICAqIF9QUEMgc3VwcG9ydCBpcyBpbXBsZW1lbnRlZCBhcyBhIENQVWZyZXEgcG9saWN5IG5vdGlmaWVyOgogICogVGhpcyBtZWFucyBlYWNoIHRpbWUgYSBDUFVmcmVxIGRyaXZlciByZWdpc3RlcmVkIGFsc28gd2l0aApAQCAtMTQ1LDcgKzE0MSw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWNwdWZyZXFfcHJpbnRrKCJDUFUgJWQ6IF9QUEMgaXMgJWQgLSBmcmVxdWVuY3kgJXMgbGltaXRlZFxuIiwgcHItPmlkLAorCXByX2RlYnVnKCJDUFUgJWQ6IF9QUEMgaXMgJWQgLSBmcmVxdWVuY3kgJXMgbGltaXRlZFxuIiwgcHItPmlkLAogCQkgICAgICAgKGludClwcGMsIHBwYyA/ICIiIDogIm5vdCIpOwogCiAJcHItPnBlcmZvcm1hbmNlX3BsYXRmb3JtX2xpbWl0ID0gKGludClwcGM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3Rocm90dGxpbmcuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhyb3R0bGluZy5jCmluZGV4IGFkMzUwMTcuLjYwNWEyOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhyb3R0bGluZy5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhyb3R0bGluZy5jCkBAIC03MTAsMjAgKzcxMCwxNCBAQAogfQogCiAjaWZkZWYgQ09ORklHX1g4Ngotc3RhdGljIGludCBhY3BpX3Rocm90dGxpbmdfcmRtc3Ioc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwKLQkJCQkJdTY0ICp2YWx1ZSkKK3N0YXRpYyBpbnQgYWNwaV90aHJvdHRsaW5nX3JkbXNyKHU2NCAqdmFsdWUpCiB7Ci0Jc3RydWN0IGNwdWluZm9feDg2ICpjOwogCXU2NCBtc3JfaGlnaCwgbXNyX2xvdzsKLQl1bnNpZ25lZCBpbnQgY3B1OwogCXU2NCBtc3IgPSAwOwogCWludCByZXQgPSAtMTsKIAotCWNwdSA9IHByLT5pZDsKLQljID0gJmNwdV9kYXRhKGNwdSk7Ci0KLQlpZiAoKGMtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCkgfHwKLQkJIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfQUNQSSkpIHsKKwlpZiAoKHRoaXNfY3B1X3JlYWQoY3B1X2luZm8ueDg2X3ZlbmRvcikgIT0gWDg2X1ZFTkRPUl9JTlRFTCkgfHwKKwkJIXRoaXNfY3B1X2hhcyhYODZfRkVBVFVSRV9BQ1BJKSkgewogCQlwcmludGsoS0VSTl9FUlIgUFJFRklYCiAJCQkiSEFSRFdBUkUgYWRkciBzcGFjZSxOT1Qgc3VwcG9ydGVkIHlldFxuIik7CiAJfSBlbHNlIHsKQEAgLTczOCwxOCArNzMyLDEzIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBhY3BpX3Rocm90dGxpbmdfd3Jtc3Ioc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwgdTY0IHZhbHVlKQorc3RhdGljIGludCBhY3BpX3Rocm90dGxpbmdfd3Jtc3IodTY0IHZhbHVlKQogewotCXN0cnVjdCBjcHVpbmZvX3g4NiAqYzsKLQl1bnNpZ25lZCBpbnQgY3B1OwogCWludCByZXQgPSAtMTsKIAl1NjQgbXNyOwogCi0JY3B1ID0gcHItPmlkOwotCWMgPSAmY3B1X2RhdGEoY3B1KTsKLQotCWlmICgoYy0+eDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0lOVEVMKSB8fAotCQkhY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9BQ1BJKSkgeworCWlmICgodGhpc19jcHVfcmVhZChjcHVfaW5mby54ODZfdmVuZG9yKSAhPSBYODZfVkVORE9SX0lOVEVMKSB8fAorCQkhdGhpc19jcHVfaGFzKFg4Nl9GRUFUVVJFX0FDUEkpKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKIAkJCSJIQVJEV0FSRSBhZGRyIHNwYWNlLE5PVCBzdXBwb3J0ZWQgeWV0XG4iKTsKIAl9IGVsc2UgewpAQCAtNzYxLDE1ICs3NTAsMTQgQEAKIAlyZXR1cm4gcmV0OwogfQogI2Vsc2UKLXN0YXRpYyBpbnQgYWNwaV90aHJvdHRsaW5nX3JkbXNyKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsCi0JCQkJdTY0ICp2YWx1ZSkKK3N0YXRpYyBpbnQgYWNwaV90aHJvdHRsaW5nX3JkbXNyKHU2NCAqdmFsdWUpCiB7CiAJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAogCQkiSEFSRFdBUkUgYWRkciBzcGFjZSxOT1Qgc3VwcG9ydGVkIHlldFxuIik7CiAJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgaW50IGFjcGlfdGhyb3R0bGluZ193cm1zcihzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLCB1NjQgdmFsdWUpCitzdGF0aWMgaW50IGFjcGlfdGhyb3R0bGluZ193cm1zcih1NjQgdmFsdWUpCiB7CiAJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAogCQkiSEFSRFdBUkUgYWRkciBzcGFjZSxOT1Qgc3VwcG9ydGVkIHlldFxuIik7CkBAIC04MDEsNyArNzg5LDcgQEAKIAkJcmV0ID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBBQ1BJX0FEUl9TUEFDRV9GSVhFRF9IQVJEV0FSRToKLQkJcmV0ID0gYWNwaV90aHJvdHRsaW5nX3JkbXNyKHByLCB2YWx1ZSk7CisJCXJldCA9IGFjcGlfdGhyb3R0bGluZ19yZG1zcih2YWx1ZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIlVua25vd24gYWRkciBzcGFjZSAlZFxuIiwKQEAgLTgzNCw3ICs4MjIsNyBAQAogCQlyZXQgPSAwOwogCQlicmVhazsKIAljYXNlIEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFOgotCQlyZXQgPSBhY3BpX3Rocm90dGxpbmdfd3Jtc3IocHIsIHZhbHVlKTsKKwkJcmV0ID0gYWNwaV90aHJvdHRsaW5nX3dybXNyKHZhbHVlKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiVW5rbm93biBhZGRyIHNwYWNlICVkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL0tjb25maWcgYi9kcml2ZXJzL2Jhc2UvS2NvbmZpZwppbmRleCBlOWU1MjM4Li5kNTdlOGQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvS2NvbmZpZworKysgYi9kcml2ZXJzL2Jhc2UvS2NvbmZpZwpAQCAtMTY4LDExICsxNjgsNCBAQAogCWJvb2wKIAlkZWZhdWx0IG4KIAotY29uZmlnIEFSQ0hfTk9fU1lTREVWX09QUwotCWJvb2wKLQktLS1oZWxwLS0tCi0JICBUbyBiZSBzZWxlY3RlZCBieSBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgdXNlIHN5c2RldiBjbGFzcyBvcgotCSAgc3lzZGV2IGRyaXZlciBwb3dlciBtYW5hZ2VtZW50IChzdXNwZW5kL3Jlc3VtZSkgYW5kIHNodXRkb3duCi0JICBvcGVyYXRpb25zLgotCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvYmFzZS5oIGIvZHJpdmVycy9iYXNlL2Jhc2UuaAppbmRleCAxOWY0OWU0Li5hMzRkY2EwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvYmFzZS5oCisrKyBiL2RyaXZlcnMvYmFzZS9iYXNlLmgKQEAgLTExMSw4ICsxMTEsNiBAQAogCXJldHVybiBkcnYtPmJ1cy0+bWF0Y2ggPyBkcnYtPmJ1cy0+bWF0Y2goZGV2LCBkcnYpIDogMTsKIH0KIAotZXh0ZXJuIHZvaWQgc3lzZGV2X3NodXRkb3duKHZvaWQpOwotCiBleHRlcm4gY2hhciAqbWFrZV9jbGFzc19uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBrb2JqZWN0ICprb2JqKTsKIAogZXh0ZXJuIGludCBkZXZyZXNfcmVsZWFzZV9hbGwoc3RydWN0IGRldmljZSAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9jb3JlLmMgYi9kcml2ZXJzL2Jhc2UvY29yZS5jCmluZGV4IDgxYjc4ZWQuLmJjODcyOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9jb3JlLmMKKysrIGIvZHJpdmVycy9iYXNlL2NvcmUuYwpAQCAtNDAwLDcgKzQwMCw3IEBACiBzdGF0aWMgaW50IGRldmljZV9hZGRfYXR0cnMoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBjbGFzcyAqY2xhc3MgPSBkZXYtPmNsYXNzOwotCXN0cnVjdCBkZXZpY2VfdHlwZSAqdHlwZSA9IGRldi0+dHlwZTsKKwljb25zdCBzdHJ1Y3QgZGV2aWNlX3R5cGUgKnR5cGUgPSBkZXYtPnR5cGU7CiAJaW50IGVycm9yOwogCiAJaWYgKGNsYXNzKSB7CkBAIC00NDAsNyArNDQwLDcgQEAKIHN0YXRpYyB2b2lkIGRldmljZV9yZW1vdmVfYXR0cnMoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBjbGFzcyAqY2xhc3MgPSBkZXYtPmNsYXNzOwotCXN0cnVjdCBkZXZpY2VfdHlwZSAqdHlwZSA9IGRldi0+dHlwZTsKKwljb25zdCBzdHJ1Y3QgZGV2aWNlX3R5cGUgKnR5cGUgPSBkZXYtPnR5cGU7CiAKIAlkZXZpY2VfcmVtb3ZlX2dyb3VwcyhkZXYsIGRldi0+Z3JvdXBzKTsKIApAQCAtMTMxNCw4ICsxMzE0LDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGRldmljZV9jcmVhdGVfZmlsZSk7CiBFWFBPUlRfU1lNQk9MX0dQTChkZXZpY2VfcmVtb3ZlX2ZpbGUpOwogCi1zdHJ1Y3Qgcm9vdF9kZXZpY2UKLXsKK3N0cnVjdCByb290X2RldmljZSB7CiAJc3RydWN0IGRldmljZSBkZXY7CiAJc3RydWN0IG1vZHVsZSAqb3duZXI7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2RkLmMgYi9kcml2ZXJzL2Jhc2UvZGQuYwppbmRleCBkYTU3ZWU5Li42NjU4ZGE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZGQuYworKysgYi9kcml2ZXJzL2Jhc2UvZGQuYwpAQCAtMjQ1LDYgKzI0NSwxMCBAQAogCiAJZGV2aWNlX2xvY2soZGV2KTsKIAlpZiAoZGV2LT5kcml2ZXIpIHsKKwkJaWYgKGtsaXN0X25vZGVfYXR0YWNoZWQoJmRldi0+cC0+a25vZGVfZHJpdmVyKSkgeworCQkJcmV0ID0gMTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQogCQlyZXQgPSBkZXZpY2VfYmluZF9kcml2ZXIoZGV2KTsKIAkJaWYgKHJldCA9PSAwKQogCQkJcmV0ID0gMTsKQEAgLTI1Nyw2ICsyNjEsNyBAQAogCQlyZXQgPSBidXNfZm9yX2VhY2hfZHJ2KGRldi0+YnVzLCBOVUxMLCBkZXYsIF9fZGV2aWNlX2F0dGFjaCk7CiAJCXBtX3J1bnRpbWVfcHV0X3N5bmMoZGV2KTsKIAl9CitvdXRfdW5sb2NrOgogCWRldmljZV91bmxvY2soZGV2KTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzE2LDggKzMyMSw3IEBACiAKIAlkcnYgPSBkZXYtPmRyaXZlcjsKIAlpZiAoZHJ2KSB7Ci0JCXBtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKGRldik7Ci0JCXBtX3J1bnRpbWVfYmFycmllcihkZXYpOworCQlwbV9ydW50aW1lX2dldF9zeW5jKGRldik7CiAKIAkJZHJpdmVyX3N5c2ZzX3JlbW92ZShkZXYpOwogCkBAIC0zMjYsNiArMzMwLDggQEAKIAkJCQkJCSAgICAgQlVTX05PVElGWV9VTkJJTkRfRFJJVkVSLAogCQkJCQkJICAgICBkZXYpOwogCisJCXBtX3J1bnRpbWVfcHV0X3N5bmMoZGV2KTsKKwogCQlpZiAoZGV2LT5idXMgJiYgZGV2LT5idXMtPnJlbW92ZSkKIAkJCWRldi0+YnVzLT5yZW1vdmUoZGV2KTsKIAkJZWxzZSBpZiAoZHJ2LT5yZW1vdmUpCkBAIC0zMzgsNyArMzQ0LDYgQEAKIAkJCQkJCSAgICAgQlVTX05PVElGWV9VTkJPVU5EX0RSSVZFUiwKIAkJCQkJCSAgICAgZGV2KTsKIAotCQlwbV9ydW50aW1lX3B1dF9zeW5jKGRldik7CiAJfQogfQogCkBAIC00MDgsMTcgKzQxMywxNiBAQAogfQogRVhQT1JUX1NZTUJPTChkZXZfZ2V0X2RydmRhdGEpOwogCi12b2lkIGRldl9zZXRfZHJ2ZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCitpbnQgZGV2X3NldF9kcnZkYXRhKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKIHsKIAlpbnQgZXJyb3I7CiAKLQlpZiAoIWRldikKLQkJcmV0dXJuOwogCWlmICghZGV2LT5wKSB7CiAJCWVycm9yID0gZGV2aWNlX3ByaXZhdGVfaW5pdChkZXYpOwogCQlpZiAoZXJyb3IpCi0JCQlyZXR1cm47CisJCQlyZXR1cm4gZXJyb3I7CiAJfQogCWRldi0+cC0+ZHJpdmVyX2RhdGEgPSBkYXRhOworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChkZXZfc2V0X2RydmRhdGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMgYi9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYwppbmRleCA4Yzc5OGVmLi5iYmIwM2U2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYworKysgYi9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYwpAQCAtNTIxLDYgKzUyMSwxMSBAQAogCWlmICghZmlybXdhcmVfcCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAoV0FSTl9PTih1c2VybW9kZWhlbHBlcl9pc19kaXNhYmxlZCgpKSkgeworCQlkZXZfZXJyKGRldmljZSwgImZpcm13YXJlOiAlcyB3aWxsIG5vdCBiZSBsb2FkZWRcbiIsIG5hbWUpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwogCSpmaXJtd2FyZV9wID0gZmlybXdhcmUgPSBremFsbG9jKHNpemVvZigqZmlybXdhcmUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZpcm13YXJlKSB7CiAJCWRldl9lcnIoZGV2aWNlLCAiJXM6IGttYWxsb2Moc3RydWN0IGZpcm13YXJlKSBmYWlsZWRcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvbWVtb3J5LmMgYi9kcml2ZXJzL2Jhc2UvbWVtb3J5LmMKaW5kZXggM2RhNmE0My4uMGExMzRhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL21lbW9yeS5jCisrKyBiL2RyaXZlcnMvYmFzZS9tZW1vcnkuYwpAQCAtNDgsNyArNDgsOCBAQAogCXJldHVybiBNRU1PUllfQ0xBU1NfTkFNRTsKIH0KIAotc3RhdGljIGludCBtZW1vcnlfdWV2ZW50KHN0cnVjdCBrc2V0ICprc2V0LCBzdHJ1Y3Qga29iamVjdCAqb2JqLCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpCitzdGF0aWMgaW50IG1lbW9yeV91ZXZlbnQoc3RydWN0IGtzZXQgKmtzZXQsIHN0cnVjdCBrb2JqZWN0ICpvYmosCisJCQlzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpCiB7CiAJaW50IHJldHZhbCA9IDA7CiAKQEAgLTIyOCwxMCArMjI5LDExIEBACiAgKiBPSyB0byBoYXZlIGRpcmVjdCByZWZlcmVuY2VzIHRvIHNwYXJzZW1lbSB2YXJpYWJsZXMgaW4gaGVyZS4KICAqLwogc3RhdGljIGludAotbWVtb3J5X3NlY3Rpb25fYWN0aW9uKHVuc2lnbmVkIGxvbmcgcGh5c19pbmRleCwgdW5zaWduZWQgbG9uZyBhY3Rpb24pCittZW1vcnlfYmxvY2tfYWN0aW9uKHVuc2lnbmVkIGxvbmcgcGh5c19pbmRleCwgdW5zaWduZWQgbG9uZyBhY3Rpb24pCiB7CiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHN0YXJ0X3BhZGRyOworCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBQQUdFU19QRVJfU0VDVElPTiAqIHNlY3Rpb25zX3Blcl9ibG9jazsKIAlzdHJ1Y3QgcGFnZSAqZmlyc3RfcGFnZTsKIAlpbnQgcmV0OwogCkBAIC0yNDMsNyArMjQ1LDcgQEAKIAkgKiB0aGF0IHdheS4KIAkgKi8KIAlpZiAoYWN0aW9uID09IE1FTV9PTkxJTkUpIHsKLQkJZm9yIChpID0gMDsgaSA8IFBBR0VTX1BFUl9TRUNUSU9OOyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKIAkJCWlmIChQYWdlUmVzZXJ2ZWQoZmlyc3RfcGFnZStpKSkKIAkJCQljb250aW51ZTsKIApAQCAtMjU3LDEyICsyNTksMTIgQEAKIAlzd2l0Y2ggKGFjdGlvbikgewogCQljYXNlIE1FTV9PTkxJTkU6CiAJCQlzdGFydF9wZm4gPSBwYWdlX3RvX3BmbihmaXJzdF9wYWdlKTsKLQkJCXJldCA9IG9ubGluZV9wYWdlcyhzdGFydF9wZm4sIFBBR0VTX1BFUl9TRUNUSU9OKTsKKwkJCXJldCA9IG9ubGluZV9wYWdlcyhzdGFydF9wZm4sIG5yX3BhZ2VzKTsKIAkJCWJyZWFrOwogCQljYXNlIE1FTV9PRkZMSU5FOgogCQkJc3RhcnRfcGFkZHIgPSBwYWdlX3RvX3BmbihmaXJzdF9wYWdlKSA8PCBQQUdFX1NISUZUOwogCQkJcmV0ID0gcmVtb3ZlX21lbW9yeShzdGFydF9wYWRkciwKLQkJCQkJICAgIFBBR0VTX1BFUl9TRUNUSU9OIDw8IFBBR0VfU0hJRlQpOworCQkJCQkgICAgbnJfcGFnZXMgPDwgUEFHRV9TSElGVCk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVdBUk4oMSwgS0VSTl9XQVJOSU5HICIlcyglbGQsICVsZCkgdW5rbm93biBhY3Rpb246ICIKQEAgLTI3Niw3ICsyNzgsNyBAQAogc3RhdGljIGludCBtZW1vcnlfYmxvY2tfY2hhbmdlX3N0YXRlKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSwKIAkJdW5zaWduZWQgbG9uZyB0b19zdGF0ZSwgdW5zaWduZWQgbG9uZyBmcm9tX3N0YXRlX3JlcSkKIHsKLQlpbnQgaSwgcmV0ID0gMDsKKwlpbnQgcmV0ID0gMDsKIAogCW11dGV4X2xvY2soJm1lbS0+c3RhdGVfbXV0ZXgpOwogCkBAIC0yODgsMjAgKzI5MCwxMSBAQAogCWlmICh0b19zdGF0ZSA9PSBNRU1fT0ZGTElORSkKIAkJbWVtLT5zdGF0ZSA9IE1FTV9HT0lOR19PRkZMSU5FOwogCi0JZm9yIChpID0gMDsgaSA8IHNlY3Rpb25zX3Blcl9ibG9jazsgaSsrKSB7Ci0JCXJldCA9IG1lbW9yeV9zZWN0aW9uX2FjdGlvbihtZW0tPnN0YXJ0X3NlY3Rpb25fbnIgKyBpLAotCQkJCQkgICAgdG9fc3RhdGUpOwotCQlpZiAocmV0KQotCQkJYnJlYWs7Ci0JfQorCXJldCA9IG1lbW9yeV9ibG9ja19hY3Rpb24obWVtLT5zdGFydF9zZWN0aW9uX25yLCB0b19zdGF0ZSk7CiAKLQlpZiAocmV0KSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBzZWN0aW9uc19wZXJfYmxvY2s7IGkrKykKLQkJCW1lbW9yeV9zZWN0aW9uX2FjdGlvbihtZW0tPnN0YXJ0X3NlY3Rpb25fbnIgKyBpLAotCQkJCQkgICAgICBmcm9tX3N0YXRlX3JlcSk7Ci0KKwlpZiAocmV0KQogCQltZW0tPnN0YXRlID0gZnJvbV9zdGF0ZV9yZXE7Ci0JfSBlbHNlCisJZWxzZQogCQltZW0tPnN0YXRlID0gdG9fc3RhdGU7CiAKIG91dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKaW5kZXggOWUwZTRmYy4uMWMyOTFhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKQEAgLTE5MiwxOCArMTkyLDE4IEBACiBpbnQgcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKIAkJCQkgIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqcmVzLCB1bnNpZ25lZCBpbnQgbnVtKQogewotCXN0cnVjdCByZXNvdXJjZSAqcjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSBOVUxMOwogCi0JaWYgKCFyZXMpCi0JCXJldHVybiAwOwotCi0JciA9IGttZW1kdXAocmVzLCBzaXplb2Yoc3RydWN0IHJlc291cmNlKSAqIG51bSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHIpIHsKLQkJcGRldi0+cmVzb3VyY2UgPSByOwotCQlwZGV2LT5udW1fcmVzb3VyY2VzID0gbnVtOwotCQlyZXR1cm4gMDsKKwlpZiAocmVzKSB7CisJCXIgPSBrbWVtZHVwKHJlcywgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkgKiBudW0sIEdGUF9LRVJORUwpOworCQlpZiAoIXIpCisJCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JcmV0dXJuIC1FTk9NRU07CisKKwlrZnJlZShwZGV2LT5yZXNvdXJjZSk7CisJcGRldi0+cmVzb3VyY2UgPSByOworCXBkZXYtPm51bV9yZXNvdXJjZXMgPSBudW07CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyk7CiAKQEAgLTIyMCwxNyArMjIwLDE3IEBACiBpbnQgcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGNvbnN0IHZvaWQgKmRhdGEsCiAJCQkgICAgIHNpemVfdCBzaXplKQogewotCXZvaWQgKmQ7CisJdm9pZCAqZCA9IE5VTEw7CiAKLQlpZiAoIWRhdGEpCi0JCXJldHVybiAwOwotCi0JZCA9IGttZW1kdXAoZGF0YSwgc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGQpIHsKLQkJcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBkOwotCQlyZXR1cm4gMDsKKwlpZiAoZGF0YSkgeworCQlkID0ga21lbWR1cChkYXRhLCBzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFkKQorCQkJcmV0dXJuIC1FTk9NRU07CiAJfQotCXJldHVybiAtRU5PTUVNOworCisJa2ZyZWUocGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpOworCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gZDsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YSk7CiAKQEAgLTY2Nyw3ICs2NjcsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcGxhdGZvcm1fcG1fcHJlcGFyZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitpbnQgcGxhdGZvcm1fcG1fcHJlcGFyZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCByZXQgPSAwOwpAQCAtNjc4LDcgKzY3OCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgcGxhdGZvcm1fcG1fY29tcGxldGUoc3RydWN0IGRldmljZSAqZGV2KQordm9pZCBwbGF0Zm9ybV9wbV9jb21wbGV0ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCkBAIC02ODYsMTYgKzY4NiwxMSBAQAogCQlkcnYtPnBtLT5jb21wbGV0ZShkZXYpOwogfQogCi0jZWxzZSAvKiAhQ09ORklHX1BNX1NMRUVQICovCi0KLSNkZWZpbmUgcGxhdGZvcm1fcG1fcHJlcGFyZQkJTlVMTAotI2RlZmluZSBwbGF0Zm9ybV9wbV9jb21wbGV0ZQkJTlVMTAotCi0jZW5kaWYgLyogIUNPTkZJR19QTV9TTEVFUCAqLworI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLwogCiAjaWZkZWYgQ09ORklHX1NVU1BFTkQKIAotaW50IF9fd2VhayBwbGF0Zm9ybV9wbV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK2ludCBwbGF0Zm9ybV9wbV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IHJldCA9IDA7CkBAIC03MTMsNyArNzA4LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgX193ZWFrIHBsYXRmb3JtX3BtX3N1c3BlbmRfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQoraW50IHBsYXRmb3JtX3BtX3N1c3BlbmRfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgcmV0ID0gMDsKQEAgLTcyOSw3ICs3MjQsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBfX3dlYWsgcGxhdGZvcm1fcG1fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK2ludCBwbGF0Zm9ybV9wbV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgcmV0ID0gMDsKQEAgLTc0Nyw3ICs3NDIsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBfX3dlYWsgcGxhdGZvcm1fcG1fcmVzdW1lX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKK2ludCBwbGF0Zm9ybV9wbV9yZXN1bWVfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgcmV0ID0gMDsKQEAgLTc2MywxOCArNzU4LDExIEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2Vsc2UgLyogIUNPTkZJR19TVVNQRU5EICovCi0KLSNkZWZpbmUgcGxhdGZvcm1fcG1fc3VzcGVuZAkJTlVMTAotI2RlZmluZSBwbGF0Zm9ybV9wbV9yZXN1bWUJCU5VTEwKLSNkZWZpbmUgcGxhdGZvcm1fcG1fc3VzcGVuZF9ub2lycQlOVUxMCi0jZGVmaW5lIHBsYXRmb3JtX3BtX3Jlc3VtZV9ub2lycQlOVUxMCi0KLSNlbmRpZiAvKiAhQ09ORklHX1NVU1BFTkQgKi8KKyNlbmRpZiAvKiBDT05GSUdfU1VTUEVORCAqLwogCiAjaWZkZWYgQ09ORklHX0hJQkVSTkFURV9DQUxMQkFDS1MKIAotc3RhdGljIGludCBwbGF0Zm9ybV9wbV9mcmVlemUoc3RydWN0IGRldmljZSAqZGV2KQoraW50IHBsYXRmb3JtX3BtX2ZyZWV6ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCByZXQgPSAwOwpAQCAtNzkyLDcgKzc4MCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBwbGF0Zm9ybV9wbV9mcmVlemVfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQoraW50IHBsYXRmb3JtX3BtX2ZyZWV6ZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCByZXQgPSAwOwpAQCAtODA4LDcgKzc5Niw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBwbGF0Zm9ybV9wbV90aGF3KHN0cnVjdCBkZXZpY2UgKmRldikKK2ludCBwbGF0Zm9ybV9wbV90aGF3KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IHJldCA9IDA7CkBAIC04MjYsNyArODE0LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHBsYXRmb3JtX3BtX3RoYXdfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQoraW50IHBsYXRmb3JtX3BtX3RoYXdfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgcmV0ID0gMDsKQEAgLTg0Miw3ICs4MzAsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcGxhdGZvcm1fcG1fcG93ZXJvZmYoc3RydWN0IGRldmljZSAqZGV2KQoraW50IHBsYXRmb3JtX3BtX3Bvd2Vyb2ZmKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IHJldCA9IDA7CkBAIC04NjAsNyArODQ4LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHBsYXRmb3JtX3BtX3Bvd2Vyb2ZmX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKK2ludCBwbGF0Zm9ybV9wbV9wb3dlcm9mZl9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCByZXQgPSAwOwpAQCAtODc2LDcgKzg2NCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBwbGF0Zm9ybV9wbV9yZXN0b3JlKHN0cnVjdCBkZXZpY2UgKmRldikKK2ludCBwbGF0Zm9ybV9wbV9yZXN0b3JlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IHJldCA9IDA7CkBAIC04OTQsNyArODgyLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHBsYXRmb3JtX3BtX3Jlc3RvcmVfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQoraW50IHBsYXRmb3JtX3BtX3Jlc3RvcmVfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgcmV0ID0gMDsKQEAgLTkxMCw2MiArODk4LDEzIEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2Vsc2UgLyogIUNPTkZJR19ISUJFUk5BVEVfQ0FMTEJBQ0tTICovCi0KLSNkZWZpbmUgcGxhdGZvcm1fcG1fZnJlZXplCQlOVUxMCi0jZGVmaW5lIHBsYXRmb3JtX3BtX3RoYXcJCU5VTEwKLSNkZWZpbmUgcGxhdGZvcm1fcG1fcG93ZXJvZmYJCU5VTEwKLSNkZWZpbmUgcGxhdGZvcm1fcG1fcmVzdG9yZQkJTlVMTAotI2RlZmluZSBwbGF0Zm9ybV9wbV9mcmVlemVfbm9pcnEJTlVMTAotI2RlZmluZSBwbGF0Zm9ybV9wbV90aGF3X25vaXJxCQlOVUxMCi0jZGVmaW5lIHBsYXRmb3JtX3BtX3Bvd2Vyb2ZmX25vaXJxCU5VTEwKLSNkZWZpbmUgcGxhdGZvcm1fcG1fcmVzdG9yZV9ub2lycQlOVUxMCi0KLSNlbmRpZiAvKiAhQ09ORklHX0hJQkVSTkFURV9DQUxMQkFDS1MgKi8KLQotI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCi0KLWludCBfX3dlYWsgcGxhdGZvcm1fcG1fcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gcG1fZ2VuZXJpY19ydW50aW1lX3N1c3BlbmQoZGV2KTsKLX07Ci0KLWludCBfX3dlYWsgcGxhdGZvcm1fcG1fcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiBwbV9nZW5lcmljX3J1bnRpbWVfcmVzdW1lKGRldik7Ci19OwotCi1pbnQgX193ZWFrIHBsYXRmb3JtX3BtX3J1bnRpbWVfaWRsZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIHBtX2dlbmVyaWNfcnVudGltZV9pZGxlKGRldik7Ci19OwotCi0jZWxzZSAvKiAhQ09ORklHX1BNX1JVTlRJTUUgKi8KLQotI2RlZmluZSBwbGF0Zm9ybV9wbV9ydW50aW1lX3N1c3BlbmQgTlVMTAotI2RlZmluZSBwbGF0Zm9ybV9wbV9ydW50aW1lX3Jlc3VtZSBOVUxMCi0jZGVmaW5lIHBsYXRmb3JtX3BtX3J1bnRpbWVfaWRsZSBOVUxMCi0KLSNlbmRpZiAvKiAhQ09ORklHX1BNX1JVTlRJTUUgKi8KKyNlbmRpZiAvKiBDT05GSUdfSElCRVJOQVRFX0NBTExCQUNLUyAqLwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgcGxhdGZvcm1fZGV2X3BtX29wcyA9IHsKLQkucHJlcGFyZSA9IHBsYXRmb3JtX3BtX3ByZXBhcmUsCi0JLmNvbXBsZXRlID0gcGxhdGZvcm1fcG1fY29tcGxldGUsCi0JLnN1c3BlbmQgPSBwbGF0Zm9ybV9wbV9zdXNwZW5kLAotCS5yZXN1bWUgPSBwbGF0Zm9ybV9wbV9yZXN1bWUsCi0JLmZyZWV6ZSA9IHBsYXRmb3JtX3BtX2ZyZWV6ZSwKLQkudGhhdyA9IHBsYXRmb3JtX3BtX3RoYXcsCi0JLnBvd2Vyb2ZmID0gcGxhdGZvcm1fcG1fcG93ZXJvZmYsCi0JLnJlc3RvcmUgPSBwbGF0Zm9ybV9wbV9yZXN0b3JlLAotCS5zdXNwZW5kX25vaXJxID0gcGxhdGZvcm1fcG1fc3VzcGVuZF9ub2lycSwKLQkucmVzdW1lX25vaXJxID0gcGxhdGZvcm1fcG1fcmVzdW1lX25vaXJxLAotCS5mcmVlemVfbm9pcnEgPSBwbGF0Zm9ybV9wbV9mcmVlemVfbm9pcnEsCi0JLnRoYXdfbm9pcnEgPSBwbGF0Zm9ybV9wbV90aGF3X25vaXJxLAotCS5wb3dlcm9mZl9ub2lycSA9IHBsYXRmb3JtX3BtX3Bvd2Vyb2ZmX25vaXJxLAotCS5yZXN0b3JlX25vaXJxID0gcGxhdGZvcm1fcG1fcmVzdG9yZV9ub2lycSwKLQkucnVudGltZV9zdXNwZW5kID0gcGxhdGZvcm1fcG1fcnVudGltZV9zdXNwZW5kLAotCS5ydW50aW1lX3Jlc3VtZSA9IHBsYXRmb3JtX3BtX3J1bnRpbWVfcmVzdW1lLAotCS5ydW50aW1lX2lkbGUgPSBwbGF0Zm9ybV9wbV9ydW50aW1lX2lkbGUsCisJLnJ1bnRpbWVfc3VzcGVuZCA9IHBtX2dlbmVyaWNfcnVudGltZV9zdXNwZW5kLAorCS5ydW50aW1lX3Jlc3VtZSA9IHBtX2dlbmVyaWNfcnVudGltZV9yZXN1bWUsCisJLnJ1bnRpbWVfaWRsZSA9IHBtX2dlbmVyaWNfcnVudGltZV9pZGxlLAorCVVTRV9QTEFURk9STV9QTV9TTEVFUF9PUFMKIH07CiAKIHN0cnVjdCBidXNfdHlwZSBwbGF0Zm9ybV9idXNfdHlwZSA9IHsKQEAgLTk3Nyw0MSArOTE2LDYgQEAKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChwbGF0Zm9ybV9idXNfdHlwZSk7CiAKLS8qKgotICogcGxhdGZvcm1fYnVzX2dldF9wbV9vcHMoKSAtIHJldHVybiBwb2ludGVyIHRvIGJ1c3NlcyBkZXZfcG1fb3BzCi0gKgotICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBieSBwbGF0Zm9ybSBjb2RlIHRvIGdldCB0aGUgY3VycmVudAotICogc2V0IG9mIGRldl9wbV9vcHMgZnVuY3Rpb25zIHVzZWQgYnkgdGhlIHBsYXRmb3JtX2J1c190eXBlLgotICovCi1jb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyAqIF9faW5pdCBwbGF0Zm9ybV9idXNfZ2V0X3BtX29wcyh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9idXNfdHlwZS5wbTsKLX0KLQotLyoqCi0gKiBwbGF0Zm9ybV9idXNfc2V0X3BtX29wcygpIC0gdXBkYXRlIGRldl9wbV9vcHMgZm9yIHRoZSBwbGF0Zm9ybV9idXNfdHlwZQotICoKLSAqIEBwbTogcG9pbnRlciB0byBuZXcgZGV2X3BtX29wcyBzdHJ1Y3QgdG8gYmUgdXNlZCBmb3IgcGxhdGZvcm1fYnVzX3R5cGUKLSAqCi0gKiBQbGF0Zm9ybSBjb2RlIGNhbiBvdmVycmlkZSB0aGUgZGV2X3BtX29wcyBtZXRob2RzIG9mCi0gKiBwbGF0Zm9ybV9idXNfdHlwZSBieSB1c2luZyB0aGlzIGZ1bmN0aW9uLiAgSXQgaXMgZXhwZWN0ZWQgdGhhdAotICogcGxhdGZvcm0gY29kZSB3aWxsIGZpcnN0IGRvIGEgcGxhdGZvcm1fYnVzX2dldF9wbV9vcHMoKSwgdGhlbgotICoga21lbWR1cCBpdCwgdGhlbiBjdXN0b21pemUgc2VsZWN0ZWQgbWV0aG9kcyBhbmQgcGFzcyBhIHBvaW50ZXIgdG8KLSAqIHRoZSBuZXcgc3RydWN0IGRldl9wbV9vcHMgdG8gdGhpcyBmdW5jdGlvbi4KLSAqCi0gKiBTaW5jZSBwbGF0Zm9ybS1zcGVjaWZpYyBjb2RlIGlzIGN1c3RvbWl6aW5nIG1ldGhvZHMgZm9yICphbGwqCi0gKiBkZXZpY2VzIChub3QganVzdCBwbGF0Zm9ybS1zcGVjaWZpYyBkZXZpY2VzKSBpdCBpcyBleHBlY3RlZCB0aGF0Ci0gKiBhbnkgY3VzdG9tIG92ZXJyaWRlcyBvZiB0aGVzZSBmdW5jdGlvbnMgd2lsbCBrZWVwIGV4aXN0aW5nIGJlaGF2aW9yCi0gKiBhbmQgc2ltcGx5IGV4dGVuZCBpdC4gIEZvciBleGFtcGxlLCBhbnkgY3VzdG9taXphdGlvbiBvZiB0aGUKLSAqIHJ1bnRpbWUgUE0gbWV0aG9kcyBzaG91bGQgY29udGludWUgdG8gY2FsbCB0aGUgcG1fZ2VuZXJpY18qCi0gKiBmdW5jdGlvbnMgYXMgdGhlIGRlZmF1bHQgb25lcyBkbyBpbiBhZGRpdGlvbiB0byB0aGUKLSAqIHBsYXRmb3JtLXNwZWNpZmljIGJlaGF2aW9yLgotICovCi12b2lkIF9faW5pdCBwbGF0Zm9ybV9idXNfc2V0X3BtX29wcyhjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyAqcG0pCi17Ci0JcGxhdGZvcm1fYnVzX3R5cGUucG0gPSBwbTsKLX0KLQogaW50IF9faW5pdCBwbGF0Zm9ybV9idXNfaW5pdCh2b2lkKQogewogCWludCBlcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9NYWtlZmlsZSBiL2RyaXZlcnMvYmFzZS9wb3dlci9NYWtlZmlsZQppbmRleCAxMThjMWI5Li4zNjQ3ZTExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL01ha2VmaWxlCkBAIC0zLDYgKzMsNiBAQAogb2JqLSQoQ09ORklHX1BNX1JVTlRJTUUpCSs9IHJ1bnRpbWUubwogb2JqLSQoQ09ORklHX1BNX1RSQUNFX1JUQykJKz0gdHJhY2Uubwogb2JqLSQoQ09ORklHX1BNX09QUCkJKz0gb3BwLm8KK29iai0kKENPTkZJR19IQVZFX0NMSykJKz0gY2xvY2tfb3BzLm8KIAotY2NmbGFncy0kKENPTkZJR19ERUJVR19EUklWRVIpIDo9IC1EREVCVUcKLWNjZmxhZ3MtJChDT05GSUdfUE1fVkVSQk9TRSkgICArPSAtRERFQlVHCitjY2ZsYWdzLSQoQ09ORklHX0RFQlVHX0RSSVZFUikgOj0gLURERUJVRwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9jbG9ja19vcHMuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9jbG9ja19vcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGRkMDlkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL2Nsb2NrX29wcy5jCkBAIC0wLDAgKzEsNDMxIEBACisvKgorICogZHJpdmVycy9iYXNlL3Bvd2VyL2Nsb2NrX29wcy5jIC0gR2VuZXJpYyBjbG9jayBtYW5pcHVsYXRpb24gUE0gY2FsbGJhY2tzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFJhZmFlbCBKLiBXeXNvY2tpIDxyandAc2lzay5wbD4sIFJlbmVzYXMgRWxlY3Ryb25pY3MgQ29ycC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQorCitzdHJ1Y3QgcG1fcnVudGltZV9jbGtfZGF0YSB7CisJc3RydWN0IGxpc3RfaGVhZCBjbG9ja19saXN0OworCXN0cnVjdCBtdXRleCBsb2NrOworfTsKKworZW51bSBwY2Vfc3RhdHVzIHsKKwlQQ0VfU1RBVFVTX05PTkUgPSAwLAorCVBDRV9TVEFUVVNfQUNRVUlSRUQsCisJUENFX1NUQVRVU19FTkFCTEVELAorCVBDRV9TVEFUVVNfRVJST1IsCit9OworCitzdHJ1Y3QgcG1fY2xvY2tfZW50cnkgeworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKwljaGFyICpjb25faWQ7CisJc3RydWN0IGNsayAqY2xrOworCWVudW0gcGNlX3N0YXR1cyBzdGF0dXM7Cit9OworCitzdGF0aWMgc3RydWN0IHBtX3J1bnRpbWVfY2xrX2RhdGEgKl9fdG9fcHJkKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2ID8gZGV2LT5wb3dlci5zdWJzeXNfZGF0YSA6IE5VTEw7Cit9CisKKy8qKgorICogcG1fcnVudGltZV9jbGtfYWRkIC0gU3RhcnQgdXNpbmcgYSBkZXZpY2UgY2xvY2sgZm9yIHJ1bnRpbWUgUE0uCisgKiBAZGV2OiBEZXZpY2Ugd2hvc2UgY2xvY2sgaXMgZ29pbmcgdG8gYmUgdXNlZCBmb3IgcnVudGltZSBQTS4KKyAqIEBjb25faWQ6IENvbm5lY3Rpb24gSUQgb2YgdGhlIGNsb2NrLgorICoKKyAqIEFkZCB0aGUgY2xvY2sgcmVwcmVzZW50ZWQgYnkgQGNvbl9pZCB0byB0aGUgbGlzdCBvZiBjbG9ja3MgdXNlZCBmb3IKKyAqIHRoZSBydW50aW1lIFBNIG9mIEBkZXYuCisgKi8KK2ludCBwbV9ydW50aW1lX2Nsa19hZGQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpjb25faWQpCit7CisJc3RydWN0IHBtX3J1bnRpbWVfY2xrX2RhdGEgKnByZCA9IF9fdG9fcHJkKGRldik7CisJc3RydWN0IHBtX2Nsb2NrX2VudHJ5ICpjZTsKKworCWlmICghcHJkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNlID0ga3phbGxvYyhzaXplb2YoKmNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjZSkgeworCQlkZXZfZXJyKGRldiwgIk5vdCBlbm91Z2ggbWVtb3J5IGZvciBjbG9jayBlbnRyeS5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoY29uX2lkKSB7CisJCWNlLT5jb25faWQgPSBrc3RyZHVwKGNvbl9pZCwgR0ZQX0tFUk5FTCk7CisJCWlmICghY2UtPmNvbl9pZCkgeworCQkJZGV2X2VycihkZXYsCisJCQkJIk5vdCBlbm91Z2ggbWVtb3J5IGZvciBjbG9jayBjb25uZWN0aW9uIElELlxuIik7CisJCQlrZnJlZShjZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCW11dGV4X2xvY2soJnByZC0+bG9jayk7CisJbGlzdF9hZGRfdGFpbCgmY2UtPm5vZGUsICZwcmQtPmNsb2NrX2xpc3QpOworCW11dGV4X3VubG9jaygmcHJkLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBfX3BtX3J1bnRpbWVfY2xrX3JlbW92ZSAtIERlc3Ryb3kgcnVudGltZSBQTSBjbG9jayBlbnRyeS4KKyAqIEBjZTogUnVudGltZSBQTSBjbG9jayBlbnRyeSB0byBkZXN0cm95LgorICoKKyAqIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCB1bmRlciB0aGUgbXV0ZXggcHJvdGVjdGluZyB0aGUgcnVudGltZSBQTSBsaXN0CisgKiBvZiBjbG9ja3MgY29ycmVzcG9uZGluZyB0aGUgdGhlIEBjZSdzIGRldmljZS4KKyAqLworc3RhdGljIHZvaWQgX19wbV9ydW50aW1lX2Nsa19yZW1vdmUoc3RydWN0IHBtX2Nsb2NrX2VudHJ5ICpjZSkKK3sKKwlpZiAoIWNlKQorCQlyZXR1cm47CisKKwlsaXN0X2RlbCgmY2UtPm5vZGUpOworCisJaWYgKGNlLT5zdGF0dXMgPCBQQ0VfU1RBVFVTX0VSUk9SKSB7CisJCWlmIChjZS0+c3RhdHVzID09IFBDRV9TVEFUVVNfRU5BQkxFRCkKKwkJCWNsa19kaXNhYmxlKGNlLT5jbGspOworCisJCWlmIChjZS0+c3RhdHVzID49IFBDRV9TVEFUVVNfQUNRVUlSRUQpCisJCQljbGtfcHV0KGNlLT5jbGspOworCX0KKworCWlmIChjZS0+Y29uX2lkKQorCQlrZnJlZShjZS0+Y29uX2lkKTsKKworCWtmcmVlKGNlKTsKK30KKworLyoqCisgKiBwbV9ydW50aW1lX2Nsa19yZW1vdmUgLSBTdG9wIHVzaW5nIGEgZGV2aWNlIGNsb2NrIGZvciBydW50aW1lIFBNLgorICogQGRldjogRGV2aWNlIHdob3NlIGNsb2NrIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgcnVudGltZSBQTSBhbnkgbW9yZS4KKyAqIEBjb25faWQ6IENvbm5lY3Rpb24gSUQgb2YgdGhlIGNsb2NrLgorICoKKyAqIFJlbW92ZSB0aGUgY2xvY2sgcmVwcmVzZW50ZWQgYnkgQGNvbl9pZCBmcm9tIHRoZSBsaXN0IG9mIGNsb2NrcyB1c2VkIGZvcgorICogdGhlIHJ1bnRpbWUgUE0gb2YgQGRldi4KKyAqLwordm9pZCBwbV9ydW50aW1lX2Nsa19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpjb25faWQpCit7CisJc3RydWN0IHBtX3J1bnRpbWVfY2xrX2RhdGEgKnByZCA9IF9fdG9fcHJkKGRldik7CisJc3RydWN0IHBtX2Nsb2NrX2VudHJ5ICpjZTsKKworCWlmICghcHJkKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZwcmQtPmxvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjZSwgJnByZC0+Y2xvY2tfbGlzdCwgbm9kZSkgeworCQlpZiAoIWNvbl9pZCAmJiAhY2UtPmNvbl9pZCkgeworCQkJX19wbV9ydW50aW1lX2Nsa19yZW1vdmUoY2UpOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoIWNvbl9pZCB8fCAhY2UtPmNvbl9pZCkgeworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChjb25faWQsIGNlLT5jb25faWQpKSB7CisJCQlfX3BtX3J1bnRpbWVfY2xrX3JlbW92ZShjZSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCW11dGV4X3VubG9jaygmcHJkLT5sb2NrKTsKK30KKworLyoqCisgKiBwbV9ydW50aW1lX2Nsa19pbml0IC0gSW5pdGlhbGl6ZSBhIGRldmljZSdzIGxpc3Qgb2YgcnVudGltZSBQTSBjbG9ja3MuCisgKiBAZGV2OiBEZXZpY2UgdG8gaW5pdGlhbGl6ZSB0aGUgbGlzdCBvZiBydW50aW1lIFBNIGNsb2NrcyBmb3IuCisgKgorICogQWxsb2NhdGUgYSBzdHJ1Y3QgcG1fcnVudGltZV9jbGtfZGF0YSBvYmplY3QsIGluaXRpYWxpemUgaXRzIGxvY2sgbWVtYmVyIGFuZAorICogbWFrZSB0aGUgQGRldidzIHBvd2VyLnN1YnN5c19kYXRhIGZpZWxkIHBvaW50IHRvIGl0LgorICovCitpbnQgcG1fcnVudGltZV9jbGtfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBtX3J1bnRpbWVfY2xrX2RhdGEgKnByZDsKKworCXByZCA9IGt6YWxsb2Moc2l6ZW9mKCpwcmQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByZCkgeworCQlkZXZfZXJyKGRldiwgIk5vdCBlbm91Z2ggbWVtb3J5IGZvIHJ1bnRpbWUgUE0gZGF0YS5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmcHJkLT5jbG9ja19saXN0KTsKKwltdXRleF9pbml0KCZwcmQtPmxvY2spOworCWRldi0+cG93ZXIuc3Vic3lzX2RhdGEgPSBwcmQ7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcG1fcnVudGltZV9jbGtfZGVzdHJveSAtIERlc3Ryb3kgYSBkZXZpY2UncyBsaXN0IG9mIHJ1bnRpbWUgUE0gY2xvY2tzLgorICogQGRldjogRGV2aWNlIHRvIGRlc3Ryb3kgdGhlIGxpc3Qgb2YgcnVudGltZSBQTSBjbG9ja3MgZm9yLgorICoKKyAqIENsZWFyIHRoZSBAZGV2J3MgcG93ZXIuc3Vic3lzX2RhdGEgZmllbGQsIHJlbW92ZSB0aGUgbGlzdCBvZiBjbG9jayBlbnRyaWVzCisgKiBmcm9tIHRoZSBzdHJ1Y3QgcG1fcnVudGltZV9jbGtfZGF0YSBvYmplY3QgcG9pbnRlZCB0byBieSBpdCBiZWZvcmUgYW5kIGZyZWUKKyAqIHRoYXQgb2JqZWN0LgorICovCit2b2lkIHBtX3J1bnRpbWVfY2xrX2Rlc3Ryb3koc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbV9ydW50aW1lX2Nsa19kYXRhICpwcmQgPSBfX3RvX3ByZChkZXYpOworCXN0cnVjdCBwbV9jbG9ja19lbnRyeSAqY2UsICpjOworCisJaWYgKCFwcmQpCisJCXJldHVybjsKKworCWRldi0+cG93ZXIuc3Vic3lzX2RhdGEgPSBOVUxMOworCisJbXV0ZXhfbG9jaygmcHJkLT5sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9yZXZlcnNlKGNlLCBjLCAmcHJkLT5jbG9ja19saXN0LCBub2RlKQorCQlfX3BtX3J1bnRpbWVfY2xrX3JlbW92ZShjZSk7CisKKwltdXRleF91bmxvY2soJnByZC0+bG9jayk7CisKKwlrZnJlZShwcmQpOworfQorCisvKioKKyAqIHBtX3J1bnRpbWVfY2xrX2FjcXVpcmUgLSBBY3F1aXJlIGEgZGV2aWNlIGNsb2NrLgorICogQGRldjogRGV2aWNlIHdob3NlIGNsb2NrIGlzIHRvIGJlIGFjcXVpcmVkLgorICogQGNvbl9pZDogQ29ubmVjdGlvbiBJRCBvZiB0aGUgY2xvY2suCisgKi8KK3N0YXRpYyB2b2lkIHBtX3J1bnRpbWVfY2xrX2FjcXVpcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgcG1fY2xvY2tfZW50cnkgKmNlKQoreworCWNlLT5jbGsgPSBjbGtfZ2V0KGRldiwgY2UtPmNvbl9pZCk7CisJaWYgKElTX0VSUihjZS0+Y2xrKSkgeworCQljZS0+c3RhdHVzID0gUENFX1NUQVRVU19FUlJPUjsKKwl9IGVsc2UgeworCQljZS0+c3RhdHVzID0gUENFX1NUQVRVU19BQ1FVSVJFRDsKKwkJZGV2X2RiZyhkZXYsICJDbG9jayAlcyBtYW5hZ2VkIGJ5IHJ1bnRpbWUgUE0uXG4iLCBjZS0+Y29uX2lkKTsKKwl9Cit9CisKKy8qKgorICogcG1fcnVudGltZV9jbGtfc3VzcGVuZCAtIERpc2FibGUgY2xvY2tzIGluIGEgZGV2aWNlJ3MgcnVudGltZSBQTSBjbG9jayBsaXN0LgorICogQGRldjogRGV2aWNlIHRvIGRpc2FibGUgdGhlIGNsb2NrcyBmb3IuCisgKi8KK2ludCBwbV9ydW50aW1lX2Nsa19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcG1fcnVudGltZV9jbGtfZGF0YSAqcHJkID0gX190b19wcmQoZGV2KTsKKwlzdHJ1Y3QgcG1fY2xvY2tfZW50cnkgKmNlOworCisJZGV2X2RiZyhkZXYsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoIXByZCkKKwkJcmV0dXJuIDA7CisKKwltdXRleF9sb2NrKCZwcmQtPmxvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGNlLCAmcHJkLT5jbG9ja19saXN0LCBub2RlKSB7CisJCWlmIChjZS0+c3RhdHVzID09IFBDRV9TVEFUVVNfTk9ORSkKKwkJCXBtX3J1bnRpbWVfY2xrX2FjcXVpcmUoZGV2LCBjZSk7CisKKwkJaWYgKGNlLT5zdGF0dXMgPCBQQ0VfU1RBVFVTX0VSUk9SKSB7CisJCQljbGtfZGlzYWJsZShjZS0+Y2xrKTsKKwkJCWNlLT5zdGF0dXMgPSBQQ0VfU1RBVFVTX0FDUVVJUkVEOworCQl9CisJfQorCisJbXV0ZXhfdW5sb2NrKCZwcmQtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcG1fcnVudGltZV9jbGtfcmVzdW1lIC0gRW5hYmxlIGNsb2NrcyBpbiBhIGRldmljZSdzIHJ1bnRpbWUgUE0gY2xvY2sgbGlzdC4KKyAqIEBkZXY6IERldmljZSB0byBlbmFibGUgdGhlIGNsb2NrcyBmb3IuCisgKi8KK2ludCBwbV9ydW50aW1lX2Nsa19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbV9ydW50aW1lX2Nsa19kYXRhICpwcmQgPSBfX3RvX3ByZChkZXYpOworCXN0cnVjdCBwbV9jbG9ja19lbnRyeSAqY2U7CisKKwlkZXZfZGJnKGRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWlmICghcHJkKQorCQlyZXR1cm4gMDsKKworCW11dGV4X2xvY2soJnByZC0+bG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNlLCAmcHJkLT5jbG9ja19saXN0LCBub2RlKSB7CisJCWlmIChjZS0+c3RhdHVzID09IFBDRV9TVEFUVVNfTk9ORSkKKwkJCXBtX3J1bnRpbWVfY2xrX2FjcXVpcmUoZGV2LCBjZSk7CisKKwkJaWYgKGNlLT5zdGF0dXMgPCBQQ0VfU1RBVFVTX0VSUk9SKSB7CisJCQljbGtfZW5hYmxlKGNlLT5jbGspOworCQkJY2UtPnN0YXR1cyA9IFBDRV9TVEFUVVNfRU5BQkxFRDsKKwkJfQorCX0KKworCW11dGV4X3VubG9jaygmcHJkLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHBtX3J1bnRpbWVfY2xrX25vdGlmeSAtIE5vdGlmeSByb3V0aW5lIGZvciBkZXZpY2UgYWRkaXRpb24gYW5kIHJlbW92YWwuCisgKiBAbmI6IE5vdGlmaWVyIGJsb2NrIG9iamVjdCB0aGlzIGZ1bmN0aW9uIGlzIGEgbWVtYmVyIG9mLgorICogQGFjdGlvbjogT3BlcmF0aW9uIGJlaW5nIGNhcnJpZWQgb3V0IGJ5IHRoZSBjYWxsZXIuCisgKiBAZGF0YTogRGV2aWNlIHRoZSByb3V0aW5lIGlzIGJlaW5nIHJ1biBmb3IuCisgKgorICogRm9yIHRoaXMgZnVuY3Rpb24gdG8gd29yaywgQG5iIG11c3QgYmUgYSBtZW1iZXIgb2YgYW4gb2JqZWN0IG9mIHR5cGUKKyAqIHN0cnVjdCBwbV9jbGtfbm90aWZpZXJfYmxvY2sgY29udGFpbmluZyBhbGwgb2YgdGhlIHJlcXVpc2l0ZSBkYXRhLgorICogU3BlY2lmaWNhbGx5LCB0aGUgcHdyX2RvbWFpbiBtZW1iZXIgb2YgdGhhdCBvYmplY3QgaXMgY29waWVkIHRvIHRoZSBkZXZpY2UncworICogcHdyX2RvbWFpbiBmaWVsZCBhbmQgaXRzIGNvbl9pZHMgbWVtYmVyIGlzIHVzZWQgdG8gcG9wdWxhdGUgdGhlIGRldmljZSdzIGxpc3QKKyAqIG9mIHJ1bnRpbWUgUE0gY2xvY2tzLCBkZXBlbmRpbmcgb24gQGFjdGlvbi4KKyAqCisgKiBJZiB0aGUgZGV2aWNlJ3MgcHdyX2RvbWFpbiBmaWVsZCBpcyBhbHJlYWR5IHBvcHVsYXRlZCB3aXRoIGEgdmFsdWUgZGlmZmVyZW50CisgKiBmcm9tIHRoZSBvbmUgc3RvcmVkIGluIHRoZSBzdHJ1Y3QgcG1fY2xrX25vdGlmaWVyX2Jsb2NrIG9iamVjdCwgdGhlIGZ1bmN0aW9uCisgKiBkb2VzIG5vdGhpbmcuCisgKi8KK3N0YXRpYyBpbnQgcG1fcnVudGltZV9jbGtfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkJIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwbV9jbGtfbm90aWZpZXJfYmxvY2sgKmNsa25iOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRhdGE7CisJY2hhciAqY29uX2lkOworCWludCBlcnJvcjsKKworCWRldl9kYmcoZGV2LCAiJXMoKSAlbGRcbiIsIF9fZnVuY19fLCBhY3Rpb24pOworCisJY2xrbmIgPSBjb250YWluZXJfb2YobmIsIHN0cnVjdCBwbV9jbGtfbm90aWZpZXJfYmxvY2ssIG5iKTsKKworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBCVVNfTk9USUZZX0FERF9ERVZJQ0U6CisJCWlmIChkZXYtPnB3cl9kb21haW4pCisJCQlicmVhazsKKworCQllcnJvciA9IHBtX3J1bnRpbWVfY2xrX2luaXQoZGV2KTsKKwkJaWYgKGVycm9yKQorCQkJYnJlYWs7CisKKwkJZGV2LT5wd3JfZG9tYWluID0gY2xrbmItPnB3cl9kb21haW47CisJCWlmIChjbGtuYi0+Y29uX2lkc1swXSkgeworCQkJZm9yIChjb25faWQgPSBjbGtuYi0+Y29uX2lkc1swXTsgKmNvbl9pZDsgY29uX2lkKyspCisJCQkJcG1fcnVudGltZV9jbGtfYWRkKGRldiwgY29uX2lkKTsKKwkJfSBlbHNlIHsKKwkJCXBtX3J1bnRpbWVfY2xrX2FkZChkZXYsIE5VTEwpOworCQl9CisKKwkJYnJlYWs7CisJY2FzZSBCVVNfTk9USUZZX0RFTF9ERVZJQ0U6CisJCWlmIChkZXYtPnB3cl9kb21haW4gIT0gY2xrbmItPnB3cl9kb21haW4pCisJCQlicmVhazsKKworCQlkZXYtPnB3cl9kb21haW4gPSBOVUxMOworCQlwbV9ydW50aW1lX2Nsa19kZXN0cm95KGRldik7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisjZWxzZSAvKiAhQ09ORklHX1BNX1JVTlRJTUUgKi8KKworLyoqCisgKiBlbmFibGVfY2xvY2sgLSBFbmFibGUgYSBkZXZpY2UgY2xvY2suCisgKiBAZGV2OiBEZXZpY2Ugd2hvc2UgY2xvY2sgaXMgdG8gYmUgZW5hYmxlZC4KKyAqIEBjb25faWQ6IENvbm5lY3Rpb24gSUQgb2YgdGhlIGNsb2NrLgorICovCitzdGF0aWMgdm9pZCBlbmFibGVfY2xvY2soc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpjb25faWQpCit7CisJc3RydWN0IGNsayAqY2xrOworCisJY2xrID0gY2xrX2dldChkZXYsIGNvbl9pZCk7CisJaWYgKCFJU19FUlIoY2xrKSkgeworCQljbGtfZW5hYmxlKGNsayk7CisJCWNsa19wdXQoY2xrKTsKKwkJZGV2X2luZm8oZGV2LCAiUnVudGltZSBQTSBkaXNhYmxlZCwgY2xvY2sgZm9yY2VkIG9uLlxuIik7CisJfQorfQorCisvKioKKyAqIGRpc2FibGVfY2xvY2sgLSBEaXNhYmxlIGEgZGV2aWNlIGNsb2NrLgorICogQGRldjogRGV2aWNlIHdob3NlIGNsb2NrIGlzIHRvIGJlIGRpc2FibGVkLgorICogQGNvbl9pZDogQ29ubmVjdGlvbiBJRCBvZiB0aGUgY2xvY2suCisgKi8KK3N0YXRpYyB2b2lkIGRpc2FibGVfY2xvY2soc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpjb25faWQpCit7CisJc3RydWN0IGNsayAqY2xrOworCisJY2xrID0gY2xrX2dldChkZXYsIGNvbl9pZCk7CisJaWYgKCFJU19FUlIoY2xrKSkgeworCQljbGtfZGlzYWJsZShjbGspOworCQljbGtfcHV0KGNsayk7CisJCWRldl9pbmZvKGRldiwgIlJ1bnRpbWUgUE0gZGlzYWJsZWQsIGNsb2NrIGZvcmNlZCBvZmYuXG4iKTsKKwl9Cit9CisKKy8qKgorICogcG1fcnVudGltZV9jbGtfbm90aWZ5IC0gTm90aWZ5IHJvdXRpbmUgZm9yIGRldmljZSBhZGRpdGlvbiBhbmQgcmVtb3ZhbC4KKyAqIEBuYjogTm90aWZpZXIgYmxvY2sgb2JqZWN0IHRoaXMgZnVuY3Rpb24gaXMgYSBtZW1iZXIgb2YuCisgKiBAYWN0aW9uOiBPcGVyYXRpb24gYmVpbmcgY2FycmllZCBvdXQgYnkgdGhlIGNhbGxlci4KKyAqIEBkYXRhOiBEZXZpY2UgdGhlIHJvdXRpbmUgaXMgYmVpbmcgcnVuIGZvci4KKyAqCisgKiBGb3IgdGhpcyBmdW5jdGlvbiB0byB3b3JrLCBAbmIgbXVzdCBiZSBhIG1lbWJlciBvZiBhbiBvYmplY3Qgb2YgdHlwZQorICogc3RydWN0IHBtX2Nsa19ub3RpZmllcl9ibG9jayBjb250YWluaW5nIGFsbCBvZiB0aGUgcmVxdWlzaXRlIGRhdGEuCisgKiBTcGVjaWZpY2FsbHksIHRoZSBjb25faWRzIG1lbWJlciBvZiB0aGF0IG9iamVjdCBpcyB1c2VkIHRvIGVuYWJsZSBvciBkaXNhYmxlCisgKiB0aGUgZGV2aWNlJ3MgY2xvY2tzLCBkZXBlbmRpbmcgb24gQGFjdGlvbi4KKyAqLworc3RhdGljIGludCBwbV9ydW50aW1lX2Nsa19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBtX2Nsa19ub3RpZmllcl9ibG9jayAqY2xrbmI7CisJc3RydWN0IGRldmljZSAqZGV2ID0gZGF0YTsKKwljaGFyICpjb25faWQ7CisKKwlkZXZfZGJnKGRldiwgIiVzKCkgJWxkXG4iLCBfX2Z1bmNfXywgYWN0aW9uKTsKKworCWNsa25iID0gY29udGFpbmVyX29mKG5iLCBzdHJ1Y3QgcG1fY2xrX25vdGlmaWVyX2Jsb2NrLCBuYik7CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgQlVTX05PVElGWV9BRERfREVWSUNFOgorCQlpZiAoY2xrbmItPmNvbl9pZHNbMF0pIHsKKwkJCWZvciAoY29uX2lkID0gY2xrbmItPmNvbl9pZHNbMF07ICpjb25faWQ7IGNvbl9pZCsrKQorCQkJCWVuYWJsZV9jbG9jayhkZXYsIGNvbl9pZCk7CisJCX0gZWxzZSB7CisJCQllbmFibGVfY2xvY2soZGV2LCBOVUxMKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEJVU19OT1RJRllfREVMX0RFVklDRToKKwkJaWYgKGNsa25iLT5jb25faWRzWzBdKSB7CisJCQlmb3IgKGNvbl9pZCA9IGNsa25iLT5jb25faWRzWzBdOyAqY29uX2lkOyBjb25faWQrKykKKwkJCQlkaXNhYmxlX2Nsb2NrKGRldiwgY29uX2lkKTsKKwkJfSBlbHNlIHsKKwkJCWRpc2FibGVfY2xvY2soZGV2LCBOVUxMKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qICFDT05GSUdfUE1fUlVOVElNRSAqLworCisvKioKKyAqIHBtX3J1bnRpbWVfY2xrX2FkZF9ub3RpZmllciAtIEFkZCBidXMgdHlwZSBub3RpZmllciBmb3IgcnVudGltZSBQTSBjbG9ja3MuCisgKiBAYnVzOiBCdXMgdHlwZSB0byBhZGQgdGhlIG5vdGlmaWVyIHRvLgorICogQGNsa25iOiBOb3RpZmllciB0byBiZSBhZGRlZCB0byB0aGUgZ2l2ZW4gYnVzIHR5cGUuCisgKgorICogVGhlIG5iIG1lbWJlciBvZiBAY2xrbmIgaXMgbm90IGV4cGVjdGVkIHRvIGJlIGluaXRpYWxpemVkIGFuZCBpdHMKKyAqIG5vdGlmaWVyX2NhbGwgbWVtYmVyIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBwbV9ydW50aW1lX2Nsa19ub3RpZnkoKS4gIEhvd2V2ZXIsCisgKiB0aGUgcmVtYWluaW5nIG1lbWJlcnMgb2YgQGNsa25iIHNob3VsZCBiZSBwb3B1bGF0ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGlzCisgKiByb3V0aW5lLgorICovCit2b2lkIHBtX3J1bnRpbWVfY2xrX2FkZF9ub3RpZmllcihzdHJ1Y3QgYnVzX3R5cGUgKmJ1cywKKwkJCQkgc3RydWN0IHBtX2Nsa19ub3RpZmllcl9ibG9jayAqY2xrbmIpCit7CisJaWYgKCFidXMgfHwgIWNsa25iKQorCQlyZXR1cm47CisKKwljbGtuYi0+bmIubm90aWZpZXJfY2FsbCA9IHBtX3J1bnRpbWVfY2xrX25vdGlmeTsKKwlidXNfcmVnaXN0ZXJfbm90aWZpZXIoYnVzLCAmY2xrbmItPm5iKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9nZW5lcmljX29wcy5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL2dlbmVyaWNfb3BzLmMKaW5kZXggNDJmOTdmOS4uY2IzYmIzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL2dlbmVyaWNfb3BzLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL2dlbmVyaWNfb3BzLmMKQEAgLTc0LDYgKzc0LDIzIEBACiAKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIC8qKgorICogcG1fZ2VuZXJpY19wcmVwYXJlIC0gR2VuZXJpYyByb3V0aW5lIHByZXBhcmluZyBhIGRldmljZSBmb3IgcG93ZXIgdHJhbnNpdGlvbi4KKyAqIEBkZXY6IERldmljZSB0byBwcmVwYXJlLgorICoKKyAqIFByZXBhcmUgYSBkZXZpY2UgZm9yIGEgc3lzdGVtLXdpZGUgcG93ZXIgdHJhbnNpdGlvbi4KKyAqLworaW50IHBtX2dlbmVyaWNfcHJlcGFyZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOworCWludCByZXQgPSAwOworCisJaWYgKGRydiAmJiBkcnYtPnBtICYmIGRydi0+cG0tPnByZXBhcmUpCisJCXJldCA9IGRydi0+cG0tPnByZXBhcmUoZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgogICogX19wbV9nZW5lcmljX2NhbGwgLSBHZW5lcmljIHN1c3BlbmQvZnJlZXplL3Bvd2Vyb2ZmL3RoYXcgc3Vic3lzdGVtIGNhbGxiYWNrLgogICogQGRldjogRGV2aWNlIHRvIGhhbmRsZS4KICAqIEBldmVudDogUE0gdHJhbnNpdGlvbiBvZiB0aGUgc3lzdGVtIHVuZGVyIHdheS4KQEAgLTIxMywxNiArMjMwLDM4IEBACiAJcmV0dXJuIF9fcG1fZ2VuZXJpY19yZXN1bWUoZGV2LCBQTV9FVkVOVF9SRVNUT1JFKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBtX2dlbmVyaWNfcmVzdG9yZSk7CisKKy8qKgorICogcG1fZ2VuZXJpY19jb21wbGV0ZSAtIEdlbmVyaWMgcm91dGluZSBjb21wZXRpbmcgYSBkZXZpY2UgcG93ZXIgdHJhbnNpdGlvbi4KKyAqIEBkZXY6IERldmljZSB0byBoYW5kbGUuCisgKgorICogQ29tcGxldGUgYSBkZXZpY2UgcG93ZXIgdHJhbnNpdGlvbiBkdXJpbmcgYSBzeXN0ZW0td2lkZSBwb3dlciB0cmFuc2l0aW9uLgorICovCit2b2lkIHBtX2dlbmVyaWNfY29tcGxldGUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKKworCWlmIChkcnYgJiYgZHJ2LT5wbSAmJiBkcnYtPnBtLT5jb21wbGV0ZSkKKwkJZHJ2LT5wbS0+Y29tcGxldGUoZGV2KTsKKworCS8qCisJICogTGV0IHJ1bnRpbWUgUE0gdHJ5IHRvIHN1c3BlbmQgZGV2aWNlcyB0aGF0IGhhdmVuJ3QgYmVlbiBpbiB1c2UgYmVmb3JlCisJICogZ29pbmcgaW50byB0aGUgc3lzdGVtLXdpZGUgc2xlZXAgc3RhdGUgd2UncmUgcmVzdW1pbmcgZnJvbS4KKwkgKi8KKwlwbV9ydW50aW1lX2lkbGUoZGV2KTsKK30KICNlbmRpZiAvKiBDT05GSUdfUE1fU0xFRVAgKi8KIAogc3RydWN0IGRldl9wbV9vcHMgZ2VuZXJpY19zdWJzeXNfcG1fb3BzID0gewogI2lmZGVmIENPTkZJR19QTV9TTEVFUAorCS5wcmVwYXJlID0gcG1fZ2VuZXJpY19wcmVwYXJlLAogCS5zdXNwZW5kID0gcG1fZ2VuZXJpY19zdXNwZW5kLAogCS5yZXN1bWUgPSBwbV9nZW5lcmljX3Jlc3VtZSwKIAkuZnJlZXplID0gcG1fZ2VuZXJpY19mcmVlemUsCiAJLnRoYXcgPSBwbV9nZW5lcmljX3RoYXcsCiAJLnBvd2Vyb2ZmID0gcG1fZ2VuZXJpY19wb3dlcm9mZiwKIAkucmVzdG9yZSA9IHBtX2dlbmVyaWNfcmVzdG9yZSwKKwkuY29tcGxldGUgPSBwbV9nZW5lcmljX2NvbXBsZXRlLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKIAkucnVudGltZV9zdXNwZW5kID0gcG1fZ2VuZXJpY19ydW50aW1lX3N1c3BlbmQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYwppbmRleCBhYmUzYWI3Li5hYTYzMjAyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jCkBAIC00MjYsMTAgKzQyNiw4IEBACiAKIAlpZiAoZGV2LT5wd3JfZG9tYWluKSB7CiAJCXBtX2Rldl9kYmcoZGV2LCBzdGF0ZSwgIkVBUkxZIHBvd2VyIGRvbWFpbiAiKTsKLQkJcG1fbm9pcnFfb3AoZGV2LCAmZGV2LT5wd3JfZG9tYWluLT5vcHMsIHN0YXRlKTsKLQl9Ci0KLQlpZiAoZGV2LT50eXBlICYmIGRldi0+dHlwZS0+cG0pIHsKKwkJZXJyb3IgPSBwbV9ub2lycV9vcChkZXYsICZkZXYtPnB3cl9kb21haW4tPm9wcywgc3RhdGUpOworCX0gZWxzZSBpZiAoZGV2LT50eXBlICYmIGRldi0+dHlwZS0+cG0pIHsKIAkJcG1fZGV2X2RiZyhkZXYsIHN0YXRlLCAiRUFSTFkgdHlwZSAiKTsKIAkJZXJyb3IgPSBwbV9ub2lycV9vcChkZXYsIGRldi0+dHlwZS0+cG0sIHN0YXRlKTsKIAl9IGVsc2UgaWYgKGRldi0+Y2xhc3MgJiYgZGV2LT5jbGFzcy0+cG0pIHsKQEAgLTUxNyw3ICs1MTUsOCBAQAogCiAJaWYgKGRldi0+cHdyX2RvbWFpbikgewogCQlwbV9kZXZfZGJnKGRldiwgc3RhdGUsICJwb3dlciBkb21haW4gIik7Ci0JCXBtX29wKGRldiwgJmRldi0+cHdyX2RvbWFpbi0+b3BzLCBzdGF0ZSk7CisJCWVycm9yID0gcG1fb3AoZGV2LCAmZGV2LT5wd3JfZG9tYWluLT5vcHMsIHN0YXRlKTsKKwkJZ290byBFbmQ7CiAJfQogCiAJaWYgKGRldi0+dHlwZSAmJiBkZXYtPnR5cGUtPnBtKSB7CkBAIC01ODAsMTEgKzU3OSwxMyBAQAogICogRXhlY3V0ZSB0aGUgYXBwcm9wcmlhdGUgInJlc3VtZSIgY2FsbGJhY2sgZm9yIGFsbCBkZXZpY2VzIHdob3NlIHN0YXR1cwogICogaW5kaWNhdGVzIHRoYXQgdGhleSBhcmUgc3VzcGVuZGVkLgogICovCi1zdGF0aWMgdm9pZCBkcG1fcmVzdW1lKHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3ZvaWQgZHBtX3Jlc3VtZShwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCWt0aW1lX3Qgc3RhcnR0aW1lID0ga3RpbWVfZ2V0KCk7CiAKKwltaWdodF9zbGVlcCgpOworCiAJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKIAlwbV90cmFuc2l0aW9uID0gc3RhdGU7CiAJYXN5bmNfZXJyb3IgPSAwOwpAQCAtNjI5LDEyICs2MzAsMTEgQEAKIHsKIAlkZXZpY2VfbG9jayhkZXYpOwogCi0JaWYgKGRldi0+cHdyX2RvbWFpbiAmJiBkZXYtPnB3cl9kb21haW4tPm9wcy5jb21wbGV0ZSkgeworCWlmIChkZXYtPnB3cl9kb21haW4pIHsKIAkJcG1fZGV2X2RiZyhkZXYsIHN0YXRlLCAiY29tcGxldGluZyBwb3dlciBkb21haW4gIik7Ci0JCWRldi0+cHdyX2RvbWFpbi0+b3BzLmNvbXBsZXRlKGRldik7Ci0JfQotCi0JaWYgKGRldi0+dHlwZSAmJiBkZXYtPnR5cGUtPnBtKSB7CisJCWlmIChkZXYtPnB3cl9kb21haW4tPm9wcy5jb21wbGV0ZSkKKwkJCWRldi0+cHdyX2RvbWFpbi0+b3BzLmNvbXBsZXRlKGRldik7CisJfSBlbHNlIGlmIChkZXYtPnR5cGUgJiYgZGV2LT50eXBlLT5wbSkgewogCQlwbV9kZXZfZGJnKGRldiwgc3RhdGUsICJjb21wbGV0aW5nIHR5cGUgIik7CiAJCWlmIChkZXYtPnR5cGUtPnBtLT5jb21wbGV0ZSkKIAkJCWRldi0+dHlwZS0+cG0tPmNvbXBsZXRlKGRldik7CkBAIC02NTgsMTAgKzY1OCwxMiBAQAogICogRXhlY3V0ZSB0aGUgLT5jb21wbGV0ZSgpIGNhbGxiYWNrcyBmb3IgYWxsIGRldmljZXMgd2hvc2UgUE0gc3RhdHVzIGlzIG5vdAogICogRFBNX09OICh0aGlzIGFsbG93cyBuZXcgZGV2aWNlcyB0byBiZSByZWdpc3RlcmVkKS4KICAqLwotc3RhdGljIHZvaWQgZHBtX2NvbXBsZXRlKHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3ZvaWQgZHBtX2NvbXBsZXRlKHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAKKwltaWdodF9zbGVlcCgpOworCiAJSU5JVF9MSVNUX0hFQUQoJmxpc3QpOwogCW11dGV4X2xvY2soJmRwbV9saXN0X210eCk7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZkcG1fcHJlcGFyZWRfbGlzdCkpIHsKQEAgLTY5MCw3ICs2OTIsNiBAQAogICovCiB2b2lkIGRwbV9yZXN1bWVfZW5kKHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQltaWdodF9zbGVlcCgpOwogCWRwbV9yZXN1bWUoc3RhdGUpOwogCWRwbV9jb21wbGV0ZShzdGF0ZSk7CiB9CkBAIC03MzIsNyArNzMzLDEyIEBACiB7CiAJaW50IGVycm9yOwogCi0JaWYgKGRldi0+dHlwZSAmJiBkZXYtPnR5cGUtPnBtKSB7CisJaWYgKGRldi0+cHdyX2RvbWFpbikgeworCQlwbV9kZXZfZGJnKGRldiwgc3RhdGUsICJMQVRFIHBvd2VyIGRvbWFpbiAiKTsKKwkJZXJyb3IgPSBwbV9ub2lycV9vcChkZXYsICZkZXYtPnB3cl9kb21haW4tPm9wcywgc3RhdGUpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJfSBlbHNlIGlmIChkZXYtPnR5cGUgJiYgZGV2LT50eXBlLT5wbSkgewogCQlwbV9kZXZfZGJnKGRldiwgc3RhdGUsICJMQVRFIHR5cGUgIik7CiAJCWVycm9yID0gcG1fbm9pcnFfb3AoZGV2LCBkZXYtPnR5cGUtPnBtLCBzdGF0ZSk7CiAJCWlmIChlcnJvcikKQEAgLTc0OSwxMSArNzU1LDYgQEAKIAkJCXJldHVybiBlcnJvcjsKIAl9CiAKLQlpZiAoZGV2LT5wd3JfZG9tYWluKSB7Ci0JCXBtX2Rldl9kYmcoZGV2LCBzdGF0ZSwgIkxBVEUgcG93ZXIgZG9tYWluICIpOwotCQlwbV9ub2lycV9vcChkZXYsICZkZXYtPnB3cl9kb21haW4tPm9wcywgc3RhdGUpOwotCX0KLQogCXJldHVybiAwOwogfQogCkBAIC04NDEsMjEgKzg0MiwyNyBAQAogCQlnb3RvIEVuZDsKIAl9CiAKKwlpZiAoZGV2LT5wd3JfZG9tYWluKSB7CisJCXBtX2Rldl9kYmcoZGV2LCBzdGF0ZSwgInBvd2VyIGRvbWFpbiAiKTsKKwkJZXJyb3IgPSBwbV9vcChkZXYsICZkZXYtPnB3cl9kb21haW4tPm9wcywgc3RhdGUpOworCQlnb3RvIEVuZDsKKwl9CisKIAlpZiAoZGV2LT50eXBlICYmIGRldi0+dHlwZS0+cG0pIHsKIAkJcG1fZGV2X2RiZyhkZXYsIHN0YXRlLCAidHlwZSAiKTsKIAkJZXJyb3IgPSBwbV9vcChkZXYsIGRldi0+dHlwZS0+cG0sIHN0YXRlKTsKLQkJZ290byBEb21haW47CisJCWdvdG8gRW5kOwogCX0KIAogCWlmIChkZXYtPmNsYXNzKSB7CiAJCWlmIChkZXYtPmNsYXNzLT5wbSkgewogCQkJcG1fZGV2X2RiZyhkZXYsIHN0YXRlLCAiY2xhc3MgIik7CiAJCQllcnJvciA9IHBtX29wKGRldiwgZGV2LT5jbGFzcy0+cG0sIHN0YXRlKTsKLQkJCWdvdG8gRG9tYWluOworCQkJZ290byBFbmQ7CiAJCX0gZWxzZSBpZiAoZGV2LT5jbGFzcy0+c3VzcGVuZCkgewogCQkJcG1fZGV2X2RiZyhkZXYsIHN0YXRlLCAibGVnYWN5IGNsYXNzICIpOwogCQkJZXJyb3IgPSBsZWdhY3lfc3VzcGVuZChkZXYsIHN0YXRlLCBkZXYtPmNsYXNzLT5zdXNwZW5kKTsKLQkJCWdvdG8gRG9tYWluOworCQkJZ290byBFbmQ7CiAJCX0KIAl9CiAKQEAgLTg2OSwxMiArODc2LDYgQEAKIAkJfQogCX0KIAotIERvbWFpbjoKLQlpZiAoIWVycm9yICYmIGRldi0+cHdyX2RvbWFpbikgewotCQlwbV9kZXZfZGJnKGRldiwgc3RhdGUsICJwb3dlciBkb21haW4gIik7Ci0JCXBtX29wKGRldiwgJmRldi0+cHdyX2RvbWFpbi0+b3BzLCBzdGF0ZSk7Ci0JfQotCiAgRW5kOgogCWRldmljZV91bmxvY2soZGV2KTsKIAljb21wbGV0ZV9hbGwoJmRldi0+cG93ZXIuY29tcGxldGlvbik7CkBAIC05MTQsMTEgKzkxNSwxMyBAQAogICogZHBtX3N1c3BlbmQgLSBFeGVjdXRlICJzdXNwZW5kIiBjYWxsYmFja3MgZm9yIGFsbCBub24tc3lzZGV2IGRldmljZXMuCiAgKiBAc3RhdGU6IFBNIHRyYW5zaXRpb24gb2YgdGhlIHN5c3RlbSBiZWluZyBjYXJyaWVkIG91dC4KICAqLwotc3RhdGljIGludCBkcG1fc3VzcGVuZChwbV9tZXNzYWdlX3Qgc3RhdGUpCitpbnQgZHBtX3N1c3BlbmQocG1fbWVzc2FnZV90IHN0YXRlKQogewogCWt0aW1lX3Qgc3RhcnR0aW1lID0ga3RpbWVfZ2V0KCk7CiAJaW50IGVycm9yID0gMDsKIAorCW1pZ2h0X3NsZWVwKCk7CisKIAltdXRleF9sb2NrKCZkcG1fbGlzdF9tdHgpOwogCXBtX3RyYW5zaXRpb24gPSBzdGF0ZTsKIAlhc3luY19lcnJvciA9IDA7CkBAIC05NjUsNyArOTY4LDE0IEBACiAKIAlkZXZpY2VfbG9jayhkZXYpOwogCi0JaWYgKGRldi0+dHlwZSAmJiBkZXYtPnR5cGUtPnBtKSB7CisJaWYgKGRldi0+cHdyX2RvbWFpbikgeworCQlwbV9kZXZfZGJnKGRldiwgc3RhdGUsICJwcmVwYXJpbmcgcG93ZXIgZG9tYWluICIpOworCQlpZiAoZGV2LT5wd3JfZG9tYWluLT5vcHMucHJlcGFyZSkKKwkJCWVycm9yID0gZGV2LT5wd3JfZG9tYWluLT5vcHMucHJlcGFyZShkZXYpOworCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQoZGV2LT5wd3JfZG9tYWluLT5vcHMucHJlcGFyZSwgZXJyb3IpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIEVuZDsKKwl9IGVsc2UgaWYgKGRldi0+dHlwZSAmJiBkZXYtPnR5cGUtPnBtKSB7CiAJCXBtX2Rldl9kYmcoZGV2LCBzdGF0ZSwgInByZXBhcmluZyB0eXBlICIpOwogCQlpZiAoZGV2LT50eXBlLT5wbS0+cHJlcGFyZSkKIAkJCWVycm9yID0gZGV2LT50eXBlLT5wbS0+cHJlcGFyZShkZXYpOwpAQCAtOTg0LDEzICs5OTQsNiBAQAogCQlpZiAoZGV2LT5idXMtPnBtLT5wcmVwYXJlKQogCQkJZXJyb3IgPSBkZXYtPmJ1cy0+cG0tPnByZXBhcmUoZGV2KTsKIAkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRldi0+YnVzLT5wbS0+cHJlcGFyZSwgZXJyb3IpOwotCQlpZiAoZXJyb3IpCi0JCQlnb3RvIEVuZDsKLQl9Ci0KLQlpZiAoZGV2LT5wd3JfZG9tYWluICYmIGRldi0+cHdyX2RvbWFpbi0+b3BzLnByZXBhcmUpIHsKLQkJcG1fZGV2X2RiZyhkZXYsIHN0YXRlLCAicHJlcGFyaW5nIHBvd2VyIGRvbWFpbiAiKTsKLQkJZGV2LT5wd3JfZG9tYWluLT5vcHMucHJlcGFyZShkZXYpOwogCX0KIAogIEVuZDoKQEAgLTEwMDUsMTAgKzEwMDgsMTIgQEAKICAqCiAgKiBFeGVjdXRlIHRoZSAtPnByZXBhcmUoKSBjYWxsYmFjayhzKSBmb3IgYWxsIGRldmljZXMuCiAgKi8KLXN0YXRpYyBpbnQgZHBtX3ByZXBhcmUocG1fbWVzc2FnZV90IHN0YXRlKQoraW50IGRwbV9wcmVwYXJlKHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlpbnQgZXJyb3IgPSAwOwogCisJbWlnaHRfc2xlZXAoKTsKKwogCW11dGV4X2xvY2soJmRwbV9saXN0X210eCk7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZkcG1fbGlzdCkpIHsKIAkJc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2aWNlKGRwbV9saXN0Lm5leHQpOwpAQCAtMTA1Nyw3ICsxMDYyLDYgQEAKIHsKIAlpbnQgZXJyb3I7CiAKLQltaWdodF9zbGVlcCgpOwogCWVycm9yID0gZHBtX3ByZXBhcmUoc3RhdGUpOwogCWlmICghZXJyb3IpCiAJCWVycm9yID0gZHBtX3N1c3BlbmQoc3RhdGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL3J1bnRpbWUuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9ydW50aW1lLmMKaW5kZXggMzE3MmM2MGQuLjBkNDU4N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9ydW50aW1lLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3J1bnRpbWUuYwpAQCAtMTY4LDcgKzE2OCw2IEBACiBzdGF0aWMgaW50IHJwbV9pZGxlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHJwbWZsYWdzKQogewogCWludCAoKmNhbGxiYWNrKShzdHJ1Y3QgZGV2aWNlICopOwotCWludCAoKmRvbWFpbl9jYWxsYmFjaykoc3RydWN0IGRldmljZSAqKTsKIAlpbnQgcmV0dmFsOwogCiAJcmV0dmFsID0gcnBtX2NoZWNrX3N1c3BlbmRfYWxsb3dlZChkZXYpOwpAQCAtMjE0LDcgKzIxMyw5IEBACiAKIAlkZXYtPnBvd2VyLmlkbGVfbm90aWZpY2F0aW9uID0gdHJ1ZTsKIAotCWlmIChkZXYtPnR5cGUgJiYgZGV2LT50eXBlLT5wbSkKKwlpZiAoZGV2LT5wd3JfZG9tYWluKQorCQljYWxsYmFjayA9IGRldi0+cHdyX2RvbWFpbi0+b3BzLnJ1bnRpbWVfaWRsZTsKKwllbHNlIGlmIChkZXYtPnR5cGUgJiYgZGV2LT50eXBlLT5wbSkKIAkJY2FsbGJhY2sgPSBkZXYtPnR5cGUtPnBtLT5ydW50aW1lX2lkbGU7CiAJZWxzZSBpZiAoZGV2LT5jbGFzcyAmJiBkZXYtPmNsYXNzLT5wbSkKIAkJY2FsbGJhY2sgPSBkZXYtPmNsYXNzLT5wbS0+cnVudGltZV9pZGxlOwpAQCAtMjIzLDE5ICsyMjQsMTAgQEAKIAllbHNlCiAJCWNhbGxiYWNrID0gTlVMTDsKIAotCWlmIChkZXYtPnB3cl9kb21haW4pCi0JCWRvbWFpbl9jYWxsYmFjayA9IGRldi0+cHdyX2RvbWFpbi0+b3BzLnJ1bnRpbWVfaWRsZTsKLQllbHNlCi0JCWRvbWFpbl9jYWxsYmFjayA9IE5VTEw7Ci0KLQlpZiAoY2FsbGJhY2sgfHwgZG9tYWluX2NhbGxiYWNrKSB7CisJaWYgKGNhbGxiYWNrKSB7CiAJCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5wb3dlci5sb2NrKTsKIAotCQlpZiAoZG9tYWluX2NhbGxiYWNrKQotCQkJcmV0dmFsID0gZG9tYWluX2NhbGxiYWNrKGRldik7Ci0KLQkJaWYgKCFyZXR2YWwgJiYgY2FsbGJhY2spCi0JCQljYWxsYmFjayhkZXYpOworCQljYWxsYmFjayhkZXYpOwogCiAJCXNwaW5fbG9ja19pcnEoJmRldi0+cG93ZXIubG9jayk7CiAJfQpAQCAtMzgyLDcgKzM3NCw5IEBACiAKIAlfX3VwZGF0ZV9ydW50aW1lX3N0YXR1cyhkZXYsIFJQTV9TVVNQRU5ESU5HKTsKIAotCWlmIChkZXYtPnR5cGUgJiYgZGV2LT50eXBlLT5wbSkKKwlpZiAoZGV2LT5wd3JfZG9tYWluKQorCQljYWxsYmFjayA9IGRldi0+cHdyX2RvbWFpbi0+b3BzLnJ1bnRpbWVfc3VzcGVuZDsKKwllbHNlIGlmIChkZXYtPnR5cGUgJiYgZGV2LT50eXBlLT5wbSkKIAkJY2FsbGJhY2sgPSBkZXYtPnR5cGUtPnBtLT5ydW50aW1lX3N1c3BlbmQ7CiAJZWxzZSBpZiAoZGV2LT5jbGFzcyAmJiBkZXYtPmNsYXNzLT5wbSkKIAkJY2FsbGJhY2sgPSBkZXYtPmNsYXNzLT5wbS0+cnVudGltZV9zdXNwZW5kOwpAQCAtNDAwLDggKzM5NCw2IEBACiAJCWVsc2UKIAkJCXBtX3J1bnRpbWVfY2FuY2VsX3BlbmRpbmcoZGV2KTsKIAl9IGVsc2UgewotCQlpZiAoZGV2LT5wd3JfZG9tYWluKQotCQkJcnBtX2NhbGxiYWNrKGRldi0+cHdyX2RvbWFpbi0+b3BzLnJ1bnRpbWVfc3VzcGVuZCwgZGV2KTsKICBub19jYWxsYmFjazoKIAkJX191cGRhdGVfcnVudGltZV9zdGF0dXMoZGV2LCBSUE1fU1VTUEVOREVEKTsKIAkJcG1fcnVudGltZV9kZWFjdGl2YXRlX3RpbWVyKGRldik7CkBAIC01ODIsOSArNTc0LDggQEAKIAlfX3VwZGF0ZV9ydW50aW1lX3N0YXR1cyhkZXYsIFJQTV9SRVNVTUlORyk7CiAKIAlpZiAoZGV2LT5wd3JfZG9tYWluKQotCQlycG1fY2FsbGJhY2soZGV2LT5wd3JfZG9tYWluLT5vcHMucnVudGltZV9yZXN1bWUsIGRldik7Ci0KLQlpZiAoZGV2LT50eXBlICYmIGRldi0+dHlwZS0+cG0pCisJCWNhbGxiYWNrID0gZGV2LT5wd3JfZG9tYWluLT5vcHMucnVudGltZV9yZXN1bWU7CisJZWxzZSBpZiAoZGV2LT50eXBlICYmIGRldi0+dHlwZS0+cG0pCiAJCWNhbGxiYWNrID0gZGV2LT50eXBlLT5wbS0+cnVudGltZV9yZXN1bWU7CiAJZWxzZSBpZiAoZGV2LT5jbGFzcyAmJiBkZXYtPmNsYXNzLT5wbSkKIAkJY2FsbGJhY2sgPSBkZXYtPmNsYXNzLT5wbS0+cnVudGltZV9yZXN1bWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvc3lzZnMuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9zeXNmcy5jCmluZGV4IGZmZjQ5YmUuLmE5ZjViODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9zeXNmcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9zeXNmcy5jCkBAIC0yMTIsOCArMjEyLDkgQEAKIHN0YXRpYyBERVZJQ0VfQVRUUihhdXRvc3VzcGVuZF9kZWxheV9tcywgMDY0NCwgYXV0b3N1c3BlbmRfZGVsYXlfbXNfc2hvdywKIAkJYXV0b3N1c3BlbmRfZGVsYXlfbXNfc3RvcmUpOwogCi0jZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfUE1fUlVOVElNRSAqLwogCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBzdGF0aWMgc3NpemVfdAogd2FrZV9zaG93KHN0cnVjdCBkZXZpY2UgKiBkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICogYnVmKQogewpAQCAtMjQ4LDcgKzI0OSw2IEBACiAKIHN0YXRpYyBERVZJQ0VfQVRUUih3YWtldXAsIDA2NDQsIHdha2Vfc2hvdywgd2FrZV9zdG9yZSk7CiAKLSNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIHN0YXRpYyBzc2l6ZV90IHdha2V1cF9jb3VudF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL3dha2V1cC5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3dha2V1cC5jCmluZGV4IGFiYmJkMzMuLjg0ZjdjN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci93YWtldXAuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvd2FrZXVwLmMKQEAgLTExMCw3ICsxMTAsNiBAQAogCXNwaW5fbG9ja19pcnEoJmV2ZW50c19sb2NrKTsKIAlsaXN0X2FkZF9yY3UoJndzLT5lbnRyeSwgJndha2V1cF9zb3VyY2VzKTsKIAlzcGluX3VubG9ja19pcnEoJmV2ZW50c19sb2NrKTsKLQlzeW5jaHJvbml6ZV9yY3UoKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHdha2V1cF9zb3VyY2VfYWRkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3N5cy5jIGIvZHJpdmVycy9iYXNlL3N5cy5jCmluZGV4IGFjZGU5YjUuLjlkZmY3N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9zeXMuYworKysgYi9kcml2ZXJzL2Jhc2Uvc3lzLmMKQEAgLTMyOCwyMDMgKzMyOCw4IEBACiAJa29iamVjdF9wdXQoJnN5c2Rldi0+a29iaik7CiB9CiAKLQotI2lmbmRlZiBDT05GSUdfQVJDSF9OT19TWVNERVZfT1BTCi0vKioKLSAqCXN5c2Rldl9zaHV0ZG93biAtIFNodXQgZG93biBhbGwgc3lzdGVtIGRldmljZXMuCi0gKgotICoJTG9vcCBvdmVyIGVhY2ggY2xhc3Mgb2Ygc3lzdGVtIGRldmljZXMsIGFuZCB0aGUgZGV2aWNlcyBpbiBlYWNoCi0gKglvZiB0aG9zZSBjbGFzc2VzLiBGb3IgZWFjaCBkZXZpY2UsIHdlIGNhbGwgdGhlIHNodXRkb3duIG1ldGhvZCBmb3IKLSAqCWVhY2ggZHJpdmVyIHJlZ2lzdGVyZWQgZm9yIHRoZSBkZXZpY2UgLSB0aGUgYXV4aWxpYXJpZXMsCi0gKglhbmQgdGhlIGNsYXNzIGRyaXZlci4KLSAqCi0gKglOb3RlOiBUaGUgbGlzdCBpcyBpdGVyYXRlZCBpbiByZXZlcnNlIG9yZGVyLCBzbyB0aGF0IHdlIHNodXQgZG93bgotICoJY2hpbGQgZGV2aWNlcyBiZWZvcmUgd2Ugc2h1dCBkb3duIHRoZWlyIHBhcmVudHMuIFRoZSBsaXN0IG9yZGVyaW5nCi0gKglpcyBndWFyYW50ZWVkIGJ5IHZpcnR1ZSBvZiB0aGUgZmFjdCB0aGF0IGNoaWxkIGRldmljZXMgYXJlIHJlZ2lzdGVyZWQKLSAqCWFmdGVyIHRoZWlyIHBhcmVudHMuCi0gKi8KLXZvaWQgc3lzZGV2X3NodXRkb3duKHZvaWQpCi17Ci0Jc3RydWN0IHN5c2Rldl9jbGFzcyAqY2xzOwotCi0JcHJfZGVidWcoIlNodXR0aW5nIERvd24gU3lzdGVtIERldmljZXNcbiIpOwotCi0JbXV0ZXhfbG9jaygmc3lzZGV2X2RyaXZlcnNfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGNscywgJnN5c3RlbV9rc2V0LT5saXN0LCBrc2V0LmtvYmouZW50cnkpIHsKLQkJc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldjsKLQotCQlwcl9kZWJ1ZygiU2h1dHRpbmcgZG93biB0eXBlICclcyc6XG4iLAotCQkJIGtvYmplY3RfbmFtZSgmY2xzLT5rc2V0LmtvYmopKTsKLQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN5c2RldiwgJmNscy0+a3NldC5saXN0LCBrb2JqLmVudHJ5KSB7Ci0JCQlzdHJ1Y3Qgc3lzZGV2X2RyaXZlciAqZHJ2OwotCQkJcHJfZGVidWcoIiAlc1xuIiwga29iamVjdF9uYW1lKCZzeXNkZXYtPmtvYmopKTsKLQotCQkJLyogQ2FsbCBhdXhpbGlhcnkgZHJpdmVycyBmaXJzdCAqLwotCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShkcnYsICZjbHMtPmRyaXZlcnMsIGVudHJ5KSB7Ci0JCQkJaWYgKGRydi0+c2h1dGRvd24pCi0JCQkJCWRydi0+c2h1dGRvd24oc3lzZGV2KTsKLQkJCX0KLQotCQkJLyogTm93IGNhbGwgdGhlIGdlbmVyaWMgb25lICovCi0JCQlpZiAoY2xzLT5zaHV0ZG93bikKLQkJCQljbHMtPnNodXRkb3duKHN5c2Rldik7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZzeXNkZXZfZHJpdmVyc19sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgX19zeXNkZXZfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHN5c2Rldl9jbGFzcyAqY2xzID0gZGV2LT5jbHM7Ci0Jc3RydWN0IHN5c2Rldl9kcml2ZXIgKmRydjsKLQotCS8qIEZpcnN0LCBjYWxsIHRoZSBjbGFzcy1zcGVjaWZpYyBvbmUgKi8KLQlpZiAoY2xzLT5yZXN1bWUpCi0JCWNscy0+cmVzdW1lKGRldik7Ci0JV0FSTl9PTkNFKCFpcnFzX2Rpc2FibGVkKCksCi0JCSJJbnRlcnJ1cHRzIGVuYWJsZWQgYWZ0ZXIgJXBGXG4iLCBjbHMtPnJlc3VtZSk7Ci0KLQkvKiBDYWxsIGF1eGlsaWFyeSBkcml2ZXJzIG5leHQuICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkcnYsICZjbHMtPmRyaXZlcnMsIGVudHJ5KSB7Ci0JCWlmIChkcnYtPnJlc3VtZSkKLQkJCWRydi0+cmVzdW1lKGRldik7Ci0JCVdBUk5fT05DRSghaXJxc19kaXNhYmxlZCgpLAotCQkJIkludGVycnVwdHMgZW5hYmxlZCBhZnRlciAlcEZcbiIsIGRydi0+cmVzdW1lKTsKLQl9Ci19Ci0KLS8qKgotICoJc3lzZGV2X3N1c3BlbmQgLSBTdXNwZW5kIGFsbCBzeXN0ZW0gZGV2aWNlcy4KLSAqCUBzdGF0ZToJCVBvd2VyIHN0YXRlIHRvIGVudGVyLgotICoKLSAqCVdlIHBlcmZvcm0gYW4gYWxtb3N0IGlkZW50aWNhbCBvcGVyYXRpb24gYXMgc3lzZGV2X3NodXRkb3duKCkKLSAqCWFib3ZlLCB0aG91Z2ggY2FsbGluZyAtPnN1c3BlbmQoKSBpbnN0ZWFkLiBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZAotICoJd2hlbiB0aGlzIGNhbGxlZC4gRGV2aWNlcyBhcmUgcmVzcG9uc2libGUgZm9yIGJvdGggc2F2aW5nIHN0YXRlIGFuZAotICoJcXVpZXNjaW5nIG9yIHBvd2VyaW5nIGRvd24gdGhlIGRldmljZS4KLSAqCi0gKglUaGlzIGlzIG9ubHkgY2FsbGVkIGJ5IHRoZSBkZXZpY2UgUE0gY29yZSwgc28gd2UgbGV0IHRoZW0gaGFuZGxlCi0gKglhbGwgc3luY2hyb25pemF0aW9uLgotICovCi1pbnQgc3lzZGV2X3N1c3BlbmQocG1fbWVzc2FnZV90IHN0YXRlKQotewotCXN0cnVjdCBzeXNkZXZfY2xhc3MgKmNsczsKLQlzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2LCAqZXJyX2RldjsKLQlzdHJ1Y3Qgc3lzZGV2X2RyaXZlciAqZHJ2LCAqZXJyX2RydjsKLQlpbnQgcmV0OwotCi0JcHJfZGVidWcoIkNoZWNraW5nIHdha2UtdXAgaW50ZXJydXB0c1xuIik7Ci0KLQkvKiBSZXR1cm4gZXJyb3IgY29kZSBpZiB0aGVyZSBhcmUgYW55IHdha2UtdXAgaW50ZXJydXB0cyBwZW5kaW5nICovCi0JcmV0ID0gY2hlY2tfd2FrZXVwX2lycXMoKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JV0FSTl9PTkNFKCFpcnFzX2Rpc2FibGVkKCksCi0JCSJJbnRlcnJ1cHRzIGVuYWJsZWQgd2hpbGUgc3VzcGVuZGluZyBzeXN0ZW0gZGV2aWNlc1xuIik7Ci0KLQlwcl9kZWJ1ZygiU3VzcGVuZGluZyBTeXN0ZW0gRGV2aWNlc1xuIik7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoY2xzLCAmc3lzdGVtX2tzZXQtPmxpc3QsIGtzZXQua29iai5lbnRyeSkgewotCQlwcl9kZWJ1ZygiU3VzcGVuZGluZyB0eXBlICclcyc6XG4iLAotCQkJIGtvYmplY3RfbmFtZSgmY2xzLT5rc2V0LmtvYmopKTsKLQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN5c2RldiwgJmNscy0+a3NldC5saXN0LCBrb2JqLmVudHJ5KSB7Ci0JCQlwcl9kZWJ1ZygiICVzXG4iLCBrb2JqZWN0X25hbWUoJnN5c2Rldi0+a29iaikpOwotCi0JCQkvKiBDYWxsIGF1eGlsaWFyeSBkcml2ZXJzIGZpcnN0ICovCi0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRydiwgJmNscy0+ZHJpdmVycywgZW50cnkpIHsKLQkJCQlpZiAoZHJ2LT5zdXNwZW5kKSB7Ci0JCQkJCXJldCA9IGRydi0+c3VzcGVuZChzeXNkZXYsIHN0YXRlKTsKLQkJCQkJaWYgKHJldCkKLQkJCQkJCWdvdG8gYXV4X2RyaXZlcjsKLQkJCQl9Ci0JCQkJV0FSTl9PTkNFKCFpcnFzX2Rpc2FibGVkKCksCi0JCQkJCSJJbnRlcnJ1cHRzIGVuYWJsZWQgYWZ0ZXIgJXBGXG4iLAotCQkJCQlkcnYtPnN1c3BlbmQpOwotCQkJfQotCi0JCQkvKiBOb3cgY2FsbCB0aGUgZ2VuZXJpYyBvbmUgKi8KLQkJCWlmIChjbHMtPnN1c3BlbmQpIHsKLQkJCQlyZXQgPSBjbHMtPnN1c3BlbmQoc3lzZGV2LCBzdGF0ZSk7Ci0JCQkJaWYgKHJldCkKLQkJCQkJZ290byBjbHNfZHJpdmVyOwotCQkJCVdBUk5fT05DRSghaXJxc19kaXNhYmxlZCgpLAotCQkJCQkiSW50ZXJydXB0cyBlbmFibGVkIGFmdGVyICVwRlxuIiwKLQkJCQkJY2xzLT5zdXNwZW5kKTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gMDsKLQkvKiByZXN1bWUgY3VycmVudCBzeXNkZXYgKi8KLWNsc19kcml2ZXI6Ci0JZHJ2ID0gTlVMTDsKLQlwcmludGsoS0VSTl9FUlIgIkNsYXNzIHN1c3BlbmQgZmFpbGVkIGZvciAlczogJWRcbiIsCi0JCWtvYmplY3RfbmFtZSgmc3lzZGV2LT5rb2JqKSwgcmV0KTsKLQotYXV4X2RyaXZlcjoKLQlpZiAoZHJ2KQotCQlwcmludGsoS0VSTl9FUlIgIkNsYXNzIGRyaXZlciBzdXNwZW5kIGZhaWxlZCBmb3IgJXM6ICVkXG4iLAotCQkJCWtvYmplY3RfbmFtZSgmc3lzZGV2LT5rb2JqKSwgcmV0KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVycl9kcnYsICZjbHMtPmRyaXZlcnMsIGVudHJ5KSB7Ci0JCWlmIChlcnJfZHJ2ID09IGRydikKLQkJCWJyZWFrOwotCQlpZiAoZXJyX2Rydi0+cmVzdW1lKQotCQkJZXJyX2Rydi0+cmVzdW1lKHN5c2Rldik7Ci0JfQotCi0JLyogcmVzdW1lIG90aGVyIHN5c2RldnMgaW4gY3VycmVudCBjbGFzcyAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZXJyX2RldiwgJmNscy0+a3NldC5saXN0LCBrb2JqLmVudHJ5KSB7Ci0JCWlmIChlcnJfZGV2ID09IHN5c2RldikKLQkJCWJyZWFrOwotCQlwcl9kZWJ1ZygiICVzXG4iLCBrb2JqZWN0X25hbWUoJmVycl9kZXYtPmtvYmopKTsKLQkJX19zeXNkZXZfcmVzdW1lKGVycl9kZXYpOwotCX0KLQotCS8qIHJlc3VtZSBvdGhlciBjbGFzc2VzICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZShjbHMsICZzeXN0ZW1fa3NldC0+bGlzdCwga3NldC5rb2JqLmVudHJ5KSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoZXJyX2RldiwgJmNscy0+a3NldC5saXN0LCBrb2JqLmVudHJ5KSB7Ci0JCQlwcl9kZWJ1ZygiICVzXG4iLCBrb2JqZWN0X25hbWUoJmVycl9kZXYtPmtvYmopKTsKLQkJCV9fc3lzZGV2X3Jlc3VtZShlcnJfZGV2KTsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc3lzZGV2X3N1c3BlbmQpOwotCi0vKioKLSAqCXN5c2Rldl9yZXN1bWUgLSBCcmluZyBzeXN0ZW0gZGV2aWNlcyBiYWNrIHRvIGxpZmUuCi0gKgotICoJU2ltaWxhciB0byBzeXNkZXZfc3VzcGVuZCgpLCBidXQgd2UgaXRlcmF0ZSB0aGUgbGlzdCBmb3J3YXJkcwotICoJdG8gZ3VhcmFudGVlIHRoYXQgcGFyZW50IGRldmljZXMgYXJlIHJlc3VtZWQgYmVmb3JlIHRoZWlyIGNoaWxkcmVuLgotICoKLSAqCU5vdGU6IEludGVycnVwdHMgYXJlIGRpc2FibGVkIHdoZW4gY2FsbGVkLgotICovCi1pbnQgc3lzZGV2X3Jlc3VtZSh2b2lkKQotewotCXN0cnVjdCBzeXNkZXZfY2xhc3MgKmNsczsKLQotCVdBUk5fT05DRSghaXJxc19kaXNhYmxlZCgpLAotCQkiSW50ZXJydXB0cyBlbmFibGVkIHdoaWxlIHJlc3VtaW5nIHN5c3RlbSBkZXZpY2VzXG4iKTsKLQotCXByX2RlYnVnKCJSZXN1bWluZyBTeXN0ZW0gRGV2aWNlc1xuIik7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNscywgJnN5c3RlbV9rc2V0LT5saXN0LCBrc2V0LmtvYmouZW50cnkpIHsKLQkJc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldjsKLQotCQlwcl9kZWJ1ZygiUmVzdW1pbmcgdHlwZSAnJXMnOlxuIiwKLQkJCSBrb2JqZWN0X25hbWUoJmNscy0+a3NldC5rb2JqKSk7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShzeXNkZXYsICZjbHMtPmtzZXQubGlzdCwga29iai5lbnRyeSkgewotCQkJcHJfZGVidWcoIiAlc1xuIiwga29iamVjdF9uYW1lKCZzeXNkZXYtPmtvYmopKTsKLQotCQkJX19zeXNkZXZfcmVzdW1lKHN5c2Rldik7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzeXNkZXZfcmVzdW1lKTsKLSNlbmRpZiAvKiBDT05GSUdfQVJDSF9OT19TWVNERVZfT1BTICovCitFWFBPUlRfU1lNQk9MX0dQTChzeXNkZXZfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTF9HUEwoc3lzZGV2X3VucmVnaXN0ZXIpOwogCiBpbnQgX19pbml0IHN5c3RlbV9idXNfaW5pdCh2b2lkKQogewpAQCAtNTM0LDkgKzMzOSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLUVYUE9SVF9TWU1CT0xfR1BMKHN5c2Rldl9yZWdpc3Rlcik7Ci1FWFBPUlRfU1lNQk9MX0dQTChzeXNkZXZfdW5yZWdpc3Rlcik7Ci0KICNkZWZpbmUgdG9fZXh0X2F0dHIoeCkgY29udGFpbmVyX29mKHgsIHN0cnVjdCBzeXNkZXZfZXh0X2F0dHJpYnV0ZSwgYXR0cikKIAogc3NpemVfdCBzeXNkZXZfc3RvcmVfdWxvbmcoc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9LY29uZmlnIGIvZHJpdmVycy9jaGFyL0tjb25maWcKaW5kZXggYWQ1OWI0ZS4uNDk1MDJiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL0tjb25maWcKQEAgLTUyMyw3ICs1MjMsNyBAQAogICAgICAgICAgIHdpdGggdGhlIE9fRElSRUNUIGZsYWcuCiAKIGNvbmZpZyBNQVhfUkFXX0RFVlMKLQlpbnQgIk1heGltdW0gbnVtYmVyIG9mIFJBVyBkZXZpY2VzIHRvIHN1cHBvcnQgKDEtODE5MikiCisJaW50ICJNYXhpbXVtIG51bWJlciBvZiBSQVcgZGV2aWNlcyB0byBzdXBwb3J0ICgxLTY1NTM2KSIKIAlkZXBlbmRzIG9uIFJBV19EUklWRVIKIAlkZWZhdWx0ICIyNTYiCiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2hwZXQuYyBiL2RyaXZlcnMvY2hhci9ocGV0LmMKaW5kZXggNzA2NmU4MC4uMDUxNDc0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2hwZXQuYworKysgYi9kcml2ZXJzL2NoYXIvaHBldC5jCkBAIC04NCw4ICs4NCw2IEBACiAJLnJhdGluZwkJPSAyNTAsCiAJLnJlYWQJCT0gcmVhZF9ocGV0LAogCS5tYXNrCQk9IENMT0NLU09VUkNFX01BU0soNjQpLAotCS5tdWx0CQk9IDAsCQkvKiB0byBiZSBjYWxjdWxhdGVkICovCi0JLnNoaWZ0CQk9IDEwLAogCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIH07CiBzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlICpocGV0X2Nsb2Nrc291cmNlOwpAQCAtOTM0LDkgKzkzMiw3IEBACiAJaWYgKCFocGV0X2Nsb2Nrc291cmNlKSB7CiAJCWhwZXRfbWN0ciA9ICh2b2lkIF9faW9tZW0gKikmaHBldHAtPmhwX2hwZXQtPmhwZXRfbWM7CiAJCUNMS1NSQ19GU1lTX01NSU9fU0VUKGNsb2Nrc291cmNlX2hwZXQuZnN5c19tbWlvLCBocGV0X21jdHIpOwotCQljbG9ja3NvdXJjZV9ocGV0Lm11bHQgPSBjbG9ja3NvdXJjZV9oejJtdWx0KGhwZXRwLT5ocF90aWNrX2ZyZXEsCi0JCQkJCQljbG9ja3NvdXJjZV9ocGV0LnNoaWZ0KTsKLQkJY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNsb2Nrc291cmNlX2hwZXQpOworCQljbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmY2xvY2tzb3VyY2VfaHBldCwgaHBldHAtPmhwX3RpY2tfZnJlcSk7CiAJCWhwZXRwLT5ocF9jbG9ja3NvdXJjZSA9ICZjbG9ja3NvdXJjZV9ocGV0OwogCQlocGV0X2Nsb2Nrc291cmNlID0gJmNsb2Nrc291cmNlX2hwZXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21lbS5jIGIvZHJpdmVycy9jaGFyL21lbS5jCmluZGV4IDQzNmE5OTAuLjhmYzA0YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9tZW0uYworKysgYi9kcml2ZXJzL2NoYXIvbWVtLmMKQEAgLTgwNiwyOSArODA2LDQxIEBACiB9OwogI2VuZGlmCiAKLXN0YXRpYyBzc2l6ZV90IGttc2dfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQorc3RhdGljIHNzaXplX3Qga21zZ193cml0ZXYoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKml2LAorCQkJICAgdW5zaWduZWQgbG9uZyBjb3VudCwgbG9mZl90IHBvcykKIHsKLQljaGFyICp0bXA7Ci0Jc3NpemVfdCByZXQ7CisJY2hhciAqbGluZSwgKnA7CisJaW50IGk7CisJc3NpemVfdCByZXQgPSAtRUZBVUxUOworCXNpemVfdCBsZW4gPSBpb3ZfbGVuZ3RoKGl2LCBjb3VudCk7CiAKLQl0bXAgPSBrbWFsbG9jKGNvdW50ICsgMSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHRtcCA9PSBOVUxMKQorCWxpbmUgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOworCWlmIChsaW5lID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCXJldCA9IC1FRkFVTFQ7Ci0JaWYgKCFjb3B5X2Zyb21fdXNlcih0bXAsIGJ1ZiwgY291bnQpKSB7Ci0JCXRtcFtjb3VudF0gPSAwOwotCQlyZXQgPSBwcmludGsoIiVzIiwgdG1wKTsKLQkJaWYgKHJldCA+IGNvdW50KQotCQkJLyogcHJpbnRrIGNhbiBhZGQgYSBwcmVmaXggKi8KLQkJCXJldCA9IGNvdW50OworCisJLyoKKwkgKiBjb3B5IGFsbCB2ZWN0b3JzIGludG8gYSBzaW5nbGUgc3RyaW5nLCB0byBlbnN1cmUgd2UgZG8KKwkgKiBub3QgaW50ZXJsZWF2ZSBvdXIgbG9nIGxpbmUgd2l0aCBvdGhlciBwcmludGsgY2FsbHMKKwkgKi8KKwlwID0gbGluZTsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlpZiAoY29weV9mcm9tX3VzZXIocCwgaXZbaV0uaW92X2Jhc2UsIGl2W2ldLmlvdl9sZW4pKQorCQkJZ290byBvdXQ7CisJCXAgKz0gaXZbaV0uaW92X2xlbjsKIAl9Ci0Ja2ZyZWUodG1wKTsKKwlwWzBdID0gJ1wwJzsKKworCXJldCA9IHByaW50aygiJXMiLCBsaW5lKTsKKwkvKiBwcmludGsgY2FuIGFkZCBhIHByZWZpeCAqLworCWlmIChyZXQgPiBsZW4pCisJCXJldCA9IGxlbjsKK291dDoKKwlrZnJlZShsaW5lKTsKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBrbXNnX2ZvcHMgPSB7Ci0JLndyaXRlID0ga21zZ193cml0ZSwKKwkuYWlvX3dyaXRlID0ga21zZ193cml0ZXYsCiAJLmxsc2VlayA9IG5vb3BfbGxzZWVrLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jhdy5jIGIvZHJpdmVycy9jaGFyL3Jhdy5jCmluZGV4IGI0YjlkNWEuLmIzM2U4ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yYXcuYworKysgYi9kcml2ZXJzL2NoYXIvcmF3LmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTMwLDEwICszMSwxNSBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGFzcyAqcmF3X2NsYXNzOwotc3RhdGljIHN0cnVjdCByYXdfZGV2aWNlX2RhdGEgcmF3X2RldmljZXNbTUFYX1JBV19NSU5PUlNdOworc3RhdGljIHN0cnVjdCByYXdfZGV2aWNlX2RhdGEgKnJhd19kZXZpY2VzOwogc3RhdGljIERFRklORV9NVVRFWChyYXdfbXV0ZXgpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmF3X2N0bF9mb3BzOyAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCiAKK3N0YXRpYyBpbnQgbWF4X3Jhd19taW5vcnMgPSBNQVhfUkFXX01JTk9SUzsKKworbW9kdWxlX3BhcmFtKG1heF9yYXdfbWlub3JzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYXhfcmF3X21pbm9ycywgIk1heGltdW0gbnVtYmVyIG9mIHJhdyBkZXZpY2VzICgxLTY1NTM2KSIpOworCiAvKgogICogT3Blbi9jbG9zZSBjb2RlIGZvciByYXcgSU8uCiAgKgpAQCAtMTI1LDcgKzEzMSw3IEBACiAJc3RydWN0IHJhd19kZXZpY2VfZGF0YSAqcmF3ZGV2OwogCWludCBlcnIgPSAwOwogCi0JaWYgKG51bWJlciA8PSAwIHx8IG51bWJlciA+PSBNQVhfUkFXX01JTk9SUykKKwlpZiAobnVtYmVyIDw9IDAgfHwgbnVtYmVyID49IG1heF9yYXdfbWlub3JzKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChNQUpPUihkZXYpICE9IG1ham9yIHx8IE1JTk9SKGRldikgIT0gbWlub3IpCkBAIC0zMTIsMTQgKzMxOCwyNyBAQAogCWRldl90IGRldiA9IE1LREVWKFJBV19NQUpPUiwgMCk7CiAJaW50IHJldDsKIAotCXJldCA9IHJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCBNQVhfUkFXX01JTk9SUywgInJhdyIpOworCWlmIChtYXhfcmF3X21pbm9ycyA8IDEgfHwgbWF4X3Jhd19taW5vcnMgPiA2NTUzNikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJyYXc6IGludmFsaWQgbWF4X3Jhd19taW5vcnMgKG11c3QgYmUiCisJCQkiIGJldHdlZW4gMSBhbmQgNjU1MzYpLCB1c2luZyAlZFxuIiwgTUFYX1JBV19NSU5PUlMpOworCQltYXhfcmF3X21pbm9ycyA9IE1BWF9SQVdfTUlOT1JTOworCX0KKworCXJhd19kZXZpY2VzID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IHJhd19kZXZpY2VfZGF0YSkgKiBtYXhfcmF3X21pbm9ycyk7CisJaWYgKCFyYXdfZGV2aWNlcykgeworCQlwcmludGsoS0VSTl9FUlIgIk5vdCBlbm91Z2ggbWVtb3J5IGZvciByYXcgZGV2aWNlIHN0cnVjdHVyZXNcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KKwltZW1zZXQocmF3X2RldmljZXMsIDAsIHNpemVvZihzdHJ1Y3QgcmF3X2RldmljZV9kYXRhKSAqIG1heF9yYXdfbWlub3JzKTsKKworCXJldCA9IHJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCBtYXhfcmF3X21pbm9ycywgInJhdyIpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3I7CiAKIAljZGV2X2luaXQoJnJhd19jZGV2LCAmcmF3X2ZvcHMpOwotCXJldCA9IGNkZXZfYWRkKCZyYXdfY2RldiwgZGV2LCBNQVhfUkFXX01JTk9SUyk7CisJcmV0ID0gY2Rldl9hZGQoJnJhd19jZGV2LCBkZXYsIG1heF9yYXdfbWlub3JzKTsKIAlpZiAocmV0KSB7Ci0JCWtvYmplY3RfcHV0KCZyYXdfY2Rldi5rb2JqKTsKIAkJZ290byBlcnJvcl9yZWdpb247CiAJfQogCkBAIC0zMzYsOCArMzU1LDkgQEAKIAlyZXR1cm4gMDsKIAogZXJyb3JfcmVnaW9uOgotCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihkZXYsIE1BWF9SQVdfTUlOT1JTKTsKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCBtYXhfcmF3X21pbm9ycyk7CiBlcnJvcjoKKwl2ZnJlZShyYXdfZGV2aWNlcyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMzQ2LDcgKzM2Niw3IEBACiAJZGV2aWNlX2Rlc3Ryb3kocmF3X2NsYXNzLCBNS0RFVihSQVdfTUFKT1IsIDApKTsKIAljbGFzc19kZXN0cm95KHJhd19jbGFzcyk7CiAJY2Rldl9kZWwoJnJhd19jZGV2KTsKLQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYoUkFXX01BSk9SLCAwKSwgTUFYX1JBV19NSU5PUlMpOworCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihSQVdfTUFKT1IsIDApLCBtYXhfcmF3X21pbm9ycyk7CiB9CiAKIG1vZHVsZV9pbml0KHJhd19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvS2NvbmZpZyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTBhZWViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9LY29uZmlnCkBAIC0wLDAgKzEsMiBAQAorY29uZmlnIENMS1NSQ19JODI1MworCWJvb2wKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvTWFrZWZpbGUgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL01ha2VmaWxlCmluZGV4IGJlNjFlY2UuLmNmYjYzODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9NYWtlZmlsZQpAQCAtNiwzICs2LDQgQEAKIG9iai0kKENPTkZJR19TSF9USU1FUl9DTVQpCSs9IHNoX2NtdC5vCiBvYmotJChDT05GSUdfU0hfVElNRVJfTVRVMikJKz0gc2hfbXR1Mi5vCiBvYmotJChDT05GSUdfU0hfVElNRVJfVE1VKQkrPSBzaF90bXUubworb2JqLSQoQ09ORklHX0NMS1NSQ19JODI1MykJKz0gaTgyNTMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9jeWNsb25lLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2N5Y2xvbmUuYwppbmRleCA2NGU1MjhlLi43MmY4MTFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2N5Y2xvbmUuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2N5Y2xvbmUuYwpAQCAtMjksOCArMjksNiBAQAogCS5yYXRpbmcJCT0gMjUwLAogCS5yZWFkCQk9IHJlYWRfY3ljbG9uZSwKIAkubWFzawkJPSBDWUNMT05FX1RJTUVSX01BU0ssCi0JLm11bHQJCT0gMTAsCi0JLnNoaWZ0CQk9IDAsCiAJLmZsYWdzCQk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAogfTsKIApAQCAtMTA4LDEyICsxMDYsOCBAQAogCX0KIAljeWNsb25lX3B0ciA9IGN5Y2xvbmVfdGltZXI7CiAKLQkvKiBzb3J0IG91dCBtdWx0L3NoaWZ0IHZhbHVlczogKi8KLQljbG9ja3NvdXJjZV9jeWNsb25lLnNoaWZ0ID0gMjI7Ci0JY2xvY2tzb3VyY2VfY3ljbG9uZS5tdWx0ID0gY2xvY2tzb3VyY2VfaHoybXVsdChDWUNMT05FX1RJTUVSX0ZSRVEsCi0JCQkJCQljbG9ja3NvdXJjZV9jeWNsb25lLnNoaWZ0KTsKLQotCXJldHVybiBjbG9ja3NvdXJjZV9yZWdpc3RlcigmY2xvY2tzb3VyY2VfY3ljbG9uZSk7CisJcmV0dXJuIGNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KCZjbG9ja3NvdXJjZV9jeWNsb25lLAorCQkJCQlDWUNMT05FX1RJTUVSX0ZSRVEpOwogfQogCiBhcmNoX2luaXRjYWxsKGluaXRfY3ljbG9uZV9jbG9ja3NvdXJjZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2k4MjUzLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2k4MjUzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI1YzE3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvaTgyNTMuYwpAQCAtMCwwICsxLDg4IEBACisvKgorICogaTgyNTMgUElUIGNsb2Nrc291cmNlCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXguaD4KKworI2luY2x1ZGUgPGFzbS9pODI1My5oPgorCisvKgorICogU2luY2UgdGhlIFBJVCBvdmVyZmxvd3MgZXZlcnkgdGljaywgaXRzIG5vdCB2ZXJ5IHVzZWZ1bAorICogdG8ganVzdCByZWFkIGJ5IGl0c2VsZi4gU28gdXNlIGppZmZpZXMgdG8gZW11bGF0ZSBhIGZyZWUKKyAqIHJ1bm5pbmcgY291bnRlcjoKKyAqLworc3RhdGljIGN5Y2xlX3QgaTgyNTNfcmVhZChzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQoreworCXN0YXRpYyBpbnQgb2xkX2NvdW50OworCXN0YXRpYyB1MzIgb2xkX2ppZnM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY291bnQ7CisJdTMyIGppZnM7CisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmk4MjUzX2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqIEFsdGhvdWdoIG91ciBjYWxsZXIgbWF5IGhhdmUgdGhlIHJlYWQgc2lkZSBvZiB4dGltZV9sb2NrLAorCSAqIHRoaXMgaXMgbm93IGEgc2VxbG9jaywgYW5kIHdlIGFyZSBjaGVhdGluZyBpbiB0aGlzIHJvdXRpbmUKKwkgKiBieSBoYXZpbmcgc2lkZSBlZmZlY3RzIG9uIHN0YXRlIHRoYXQgd2UgY2Fubm90IHVuZG8gaWYKKwkgKiB0aGVyZSBpcyBhIGNvbGxpc2lvbiBvbiB0aGUgc2VxbG9jayBhbmQgb3VyIGNhbGxlciBoYXMgdG8KKwkgKiByZXRyeS4gIChOYW1lbHksIG9sZF9qaWZzIGFuZCBvbGRfY291bnQuKSAgU28gd2UgbXVzdCB0cmVhdAorCSAqIGppZmZpZXMgYXMgdm9sYXRpbGUgZGVzcGl0ZSB0aGUgbG9jay4gIFdlIHJlYWQgamlmZmllcworCSAqIGJlZm9yZSBsYXRjaGluZyB0aGUgdGltZXIgY291bnQgdG8gZ3VhcmFudGVlIHRoYXQgYWx0aG91Z2gKKwkgKiB0aGUgamlmZmllcyB2YWx1ZSBtaWdodCBiZSBvbGRlciB0aGFuIHRoZSBjb3VudCAodGhhdCBpcywKKwkgKiB0aGUgY291bnRlciBtYXkgdW5kZXJmbG93IGJldHdlZW4gdGhlIGxhc3QgcG9pbnQgd2hlcmUKKwkgKiBqaWZmaWVzIHdhcyBpbmNyZW1lbnRlZCBhbmQgdGhlIHBvaW50IHdoZXJlIHdlIGxhdGNoIHRoZQorCSAqIGNvdW50KSwgaXQgY2Fubm90IGJlIG5ld2VyLgorCSAqLworCWppZnMgPSBqaWZmaWVzOworCW91dGJfcGl0KDB4MDAsIFBJVF9NT0RFKTsJLyogbGF0Y2ggdGhlIGNvdW50IEFTQVAgKi8KKwljb3VudCA9IGluYl9waXQoUElUX0NIMCk7CS8qIHJlYWQgdGhlIGxhdGNoZWQgY291bnQgKi8KKwljb3VudCB8PSBpbmJfcGl0KFBJVF9DSDApIDw8IDg7CisKKwkvKiBWSUE2ODZhIHRlc3QgY29kZS4uLiByZXNldCB0aGUgbGF0Y2ggaWYgY291bnQgPiBtYXggKyAxICovCisJaWYgKGNvdW50ID4gTEFUQ0gpIHsKKwkJb3V0Yl9waXQoMHgzNCwgUElUX01PREUpOworCQlvdXRiX3BpdChQSVRfTEFUQ0ggJiAweGZmLCBQSVRfQ0gwKTsKKwkJb3V0Yl9waXQoUElUX0xBVENIID4+IDgsIFBJVF9DSDApOworCQljb3VudCA9IFBJVF9MQVRDSCAtIDE7CisJfQorCisJLyoKKwkgKiBJdCdzIHBvc3NpYmxlIGZvciBjb3VudCB0byBhcHBlYXIgdG8gZ28gdGhlIHdyb25nIHdheSBmb3IgYQorCSAqIGNvdXBsZSBvZiByZWFzb25zOgorCSAqCisJICogIDEuIFRoZSB0aW1lciBjb3VudGVyIHVuZGVyZmxvd3MsIGJ1dCB3ZSBoYXZlbid0IGhhbmRsZWQgdGhlCisJICogICAgIHJlc3VsdGluZyBpbnRlcnJ1cHQgYW5kIGluY3JlbWVudGVkIGppZmZpZXMgeWV0LgorCSAqICAyLiBIYXJkd2FyZSBwcm9ibGVtIHdpdGggdGhlIHRpbWVyLCBub3QgZ2l2aW5nIHVzIGNvbnRpbnVvdXMgdGltZSwKKwkgKiAgICAgdGhlIGNvdW50ZXIgZG9lcyBzbWFsbCAianVtcHMiIHVwd2FyZHMgb24gc29tZSBQZW50aXVtIHN5c3RlbXMsCisJICogICAgIChzZWUgYyd0IDk1LzEwIHBhZ2UgMzM1IGZvciBOZXB0dW4gYnVnLikKKwkgKgorCSAqIFByZXZpb3VzIGF0dGVtcHRzIHRvIGhhbmRsZSB0aGVzZSBjYXNlcyBpbnRlbGxpZ2VudGx5IHdlcmUKKwkgKiBidWdneSwgc28gd2UganVzdCBkbyB0aGUgc2ltcGxlIHRoaW5nIG5vdy4KKwkgKi8KKwlpZiAoY291bnQgPiBvbGRfY291bnQgJiYgamlmcyA9PSBvbGRfamlmcykKKwkJY291bnQgPSBvbGRfY291bnQ7CisKKwlvbGRfY291bnQgPSBjb3VudDsKKwlvbGRfamlmcyA9IGppZnM7CisKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTgyNTNfbG9jaywgZmxhZ3MpOworCisJY291bnQgPSAoUElUX0xBVENIIC0gMSkgLSBjb3VudDsKKworCXJldHVybiAoY3ljbGVfdCkoamlmcyAqIFBJVF9MQVRDSCkgKyBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSBpODI1M19jcyA9IHsKKwkubmFtZQkJPSAicGl0IiwKKwkucmF0aW5nCQk9IDExMCwKKwkucmVhZAkJPSBpODI1M19yZWFkLAorCS5tYXNrCQk9IENMT0NLU09VUkNFX01BU0soMzIpLAorfTsKKworaW50IF9faW5pdCBjbG9ja3NvdXJjZV9pODI1M19pbml0KHZvaWQpCit7CisJcmV0dXJuIGNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KCZpODI1M19jcywgUElUX1RJQ0tfUkFURSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZyBiL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnCmluZGV4IGNhOGVlODAuLjlmYjg0ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnCkBAIC0xLDMgKzEsNSBAQAorbWVudSAiQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nIgorCiBjb25maWcgQ1BVX0ZSRVEKIAlib29sICJDUFUgRnJlcXVlbmN5IHNjYWxpbmciCiAJaGVscApAQCAtMTgsMTkgKzIwLDYgQEAKIGNvbmZpZyBDUFVfRlJFUV9UQUJMRQogCXRyaXN0YXRlCiAKLWNvbmZpZyBDUFVfRlJFUV9ERUJVRwotCWJvb2wgIkVuYWJsZSBDUFVmcmVxIGRlYnVnZ2luZyIKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBDUFVmcmVxIHN1YnN5c3RlbSAoaW5jbHVkaW5nIGRyaXZlcnMpCi0JICBkZWJ1Z2dpbmcuIFlvdSB3aWxsIG5lZWQgdG8gYWN0aXZhdGUgaXQgdmlhIHRoZSBrZXJuZWwKLQkgIGNvbW1hbmQgbGluZSBieSBwYXNzaW5nCi0JICAgICBjcHVmcmVxLmRlYnVnPTx2YWx1ZT4KLQotCSAgVG8gZ2V0IDx2YWx1ZT4sIGFkZCAKLQkgICAgICAgMSB0byBhY3RpdmF0ZSBDUFVmcmVxIGNvcmUgZGVidWdnaW5nLAotCSAgICAgICAyIHRvIGFjdGl2YXRlIENQVWZyZXEgZHJpdmVycyBkZWJ1Z2dpbmcsIGFuZAotCSAgICAgICA0IHRvIGFjdGl2YXRlIENQVWZyZXEgZ292ZXJub3IgZGVidWdnaW5nCi0KIGNvbmZpZyBDUFVfRlJFUV9TVEFUCiAJdHJpc3RhdGUgIkNQVSBmcmVxdWVuY3kgdHJhbnNsYXRpb24gc3RhdGlzdGljcyIKIAlzZWxlY3QgQ1BVX0ZSRVFfVEFCTEUKQEAgLTE5MCw0ICsxNzksMTAgQEAKIAogCSAgSWYgaW4gZG91YnQsIHNheSBOLgogCi1lbmRpZgkjIENQVV9GUkVRCittZW51ICJ4ODYgQ1BVIGZyZXF1ZW5jeSBzY2FsaW5nIGRyaXZlcnMiCitkZXBlbmRzIG9uIFg4Ngorc291cmNlICJkcml2ZXJzL2NwdWZyZXEvS2NvbmZpZy54ODYiCitlbmRtZW51CisKK2VuZGlmCitlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvS2NvbmZpZyBiL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnLng4NgpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBhcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvS2NvbmZpZwpyZW5hbWUgdG8gZHJpdmVycy9jcHVmcmVxL0tjb25maWcueDg2CmluZGV4IDg3MGU2Y2MuLjc4ZmY3ZWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9LY29uZmlnCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnLng4NgpAQCAtMSwxNSArMSw3IEBACiAjCi0jIENQVSBGcmVxdWVuY3kgc2NhbGluZworIyB4ODYgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nIGRyaXZlcnMKICMKIAotbWVudSAiQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nIgotCi1zb3VyY2UgImRyaXZlcnMvY3B1ZnJlcS9LY29uZmlnIgotCi1pZiBDUFVfRlJFUQotCi1jb21tZW50ICJDUFVGcmVxIHByb2Nlc3NvciBkcml2ZXJzIgotCiBjb25maWcgWDg2X1BDQ19DUFVGUkVRCiAJdHJpc3RhdGUgIlByb2Nlc3NvciBDbG9ja2luZyBDb250cm9sIGludGVyZmFjZSBkcml2ZXIiCiAJZGVwZW5kcyBvbiBBQ1BJICYmIEFDUElfUFJPQ0VTU09SCkBAIC00Myw3ICszNSw3IEBACiBjb25maWcgRUxBTl9DUFVGUkVRCiAJdHJpc3RhdGUgIkFNRCBFbGFuIFNDNDAwIGFuZCBTQzQxMCIKIAlzZWxlY3QgQ1BVX0ZSRVFfVEFCTEUKLQlkZXBlbmRzIG9uIFg4Nl9FTEFOCisJZGVwZW5kcyBvbiBNRUxBTgogCS0tLWhlbHAtLS0KIAkgIFRoaXMgYWRkcyB0aGUgQ1BVRnJlcSBkcml2ZXIgZm9yIEFNRCBFbGFuIFNDNDAwIGFuZCBTQzQxMAogCSAgcHJvY2Vzc29ycy4KQEAgLTU5LDcgKzUxLDcgQEAKIGNvbmZpZyBTQzUyMF9DUFVGUkVRCiAJdHJpc3RhdGUgIkFNRCBFbGFuIFNDNTIwIgogCXNlbGVjdCBDUFVfRlJFUV9UQUJMRQotCWRlcGVuZHMgb24gWDg2X0VMQU4KKwlkZXBlbmRzIG9uIE1FTEFOCiAJLS0taGVscC0tLQogCSAgVGhpcyBhZGRzIHRoZSBDUFVGcmVxIGRyaXZlciBmb3IgQU1EIEVsYW4gU0M1MjAgcHJvY2Vzc29yLgogCkBAIC0yNjEsNiArMjUzLDMgQEAKIAkgIG9wdGlvbiBsZXRzIHRoZSBwcm9iaW5nIGNvZGUgYnlwYXNzIHNvbWUgb2YgdGhvc2UgY2hlY2tzIGlmIHRoZQogCSAgcGFyYW1ldGVyICJyZWxheGVkX2NoZWNrPTEiIGlzIHBhc3NlZCB0byB0aGUgbW9kdWxlLgogCi1lbmRpZgkjIENQVV9GUkVRCi0KLWVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9NYWtlZmlsZSBiL2RyaXZlcnMvY3B1ZnJlcS9NYWtlZmlsZQppbmRleCA3MWZjM2I0Li5jN2YxYTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jcHVmcmVxL01ha2VmaWxlCkBAIC0xMywzICsxMywyOSBAQAogIyBDUFVmcmVxIGNyb3NzLWFyY2ggaGVscGVycwogb2JqLSQoQ09ORklHX0NQVV9GUkVRX1RBQkxFKQkJKz0gZnJlcV90YWJsZS5vCiAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNkCisjIHg4NiBkcml2ZXJzLgorIyBMaW5rIG9yZGVyIG1hdHRlcnMuIEs4IGlzIHByZWZlcnJlZCB0byBBQ1BJIGJlY2F1c2Ugb2YgZmlybXdhcmUgYnVncyBpbiBlYXJseQorIyBLOCBzeXN0ZW1zLiBBQ1BJIGlzIHByZWZlcnJlZCB0byBhbGwgb3RoZXIgaGFyZHdhcmUtc3BlY2lmaWMgZHJpdmVycy4KKyMgc3BlZWRzdGVwLSogaXMgcHJlZmVycmVkIG92ZXIgcDQtY2xvY2ttb2QuCisKK29iai0kKENPTkZJR19YODZfUE9XRVJOT1dfSzgpCQkrPSBwb3dlcm5vdy1rOC5vIG1wZXJmLm8KK29iai0kKENPTkZJR19YODZfQUNQSV9DUFVGUkVRKQkJKz0gYWNwaS1jcHVmcmVxLm8gbXBlcmYubworb2JqLSQoQ09ORklHX1g4Nl9QQ0NfQ1BVRlJFUSkJCSs9IHBjYy1jcHVmcmVxLm8KK29iai0kKENPTkZJR19YODZfUE9XRVJOT1dfSzYpCQkrPSBwb3dlcm5vdy1rNi5vCitvYmotJChDT05GSUdfWDg2X1BPV0VSTk9XX0s3KQkJKz0gcG93ZXJub3ctazcubworb2JqLSQoQ09ORklHX1g4Nl9MT05HSEFVTCkJCSs9IGxvbmdoYXVsLm8KK29iai0kKENPTkZJR19YODZfRV9QT1dFUlNBVkVSKQkJKz0gZV9wb3dlcnNhdmVyLm8KK29iai0kKENPTkZJR19FTEFOX0NQVUZSRVEpCQkrPSBlbGFuZnJlcS5vCitvYmotJChDT05GSUdfU0M1MjBfQ1BVRlJFUSkJCSs9IHNjNTIwX2ZyZXEubworb2JqLSQoQ09ORklHX1g4Nl9MT05HUlVOKQkJKz0gbG9uZ3J1bi5vCitvYmotJChDT05GSUdfWDg2X0dYX1NVU1BNT0QpCQkrPSBneC1zdXNwbW9kLm8KK29iai0kKENPTkZJR19YODZfU1BFRURTVEVQX0lDSCkJCSs9IHNwZWVkc3RlcC1pY2gubworb2JqLSQoQ09ORklHX1g4Nl9TUEVFRFNURVBfTElCKQkJKz0gc3BlZWRzdGVwLWxpYi5vCitvYmotJChDT05GSUdfWDg2X1NQRUVEU1RFUF9TTUkpCQkrPSBzcGVlZHN0ZXAtc21pLm8KK29iai0kKENPTkZJR19YODZfU1BFRURTVEVQX0NFTlRSSU5PKQkrPSBzcGVlZHN0ZXAtY2VudHJpbm8ubworb2JqLSQoQ09ORklHX1g4Nl9QNF9DTE9DS01PRCkJCSs9IHA0LWNsb2NrbW9kLm8KK29iai0kKENPTkZJR19YODZfQ1BVRlJFUV9ORk9SQ0UyKQkrPSBjcHVmcmVxLW5mb3JjZTIubworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjZAorCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCnJlbmFtZSB0byBkcml2ZXJzL2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKaW5kZXggYTJiYWFmYi4uNGUwNGUxMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYwpAQCAtNDcsOSArNDcsNiBAQAogI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+CiAjaW5jbHVkZSAibXBlcmYuaCIKIAotI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsIFwKLQkJImFjcGktY3B1ZnJlcSIsIG1zZykKLQogTU9EVUxFX0FVVEhPUigiUGF1bCBEaWVmZW5iYXVnaCwgRG9taW5payBCcm9kb3dza2kiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQUNQSSBQcm9jZXNzb3IgUC1TdGF0ZXMgRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CkBAIC0yMzMsNyArMjMwLDcgQEAKIAljbWQubWFzayA9IG1hc2s7CiAJZHJ2X3JlYWQoJmNtZCk7CiAKLQlkcHJpbnRrKCJnZXRfY3VyX3ZhbCA9ICV1XG4iLCBjbWQudmFsKTsKKwlwcl9kZWJ1ZygiZ2V0X2N1cl92YWwgPSAldVxuIiwgY21kLnZhbCk7CiAKIAlyZXR1cm4gY21kLnZhbDsKIH0KQEAgLTI0NCw3ICsyNDEsNyBAQAogCXVuc2lnbmVkIGludCBmcmVxOwogCXVuc2lnbmVkIGludCBjYWNoZWRfZnJlcTsKIAotCWRwcmludGsoImdldF9jdXJfZnJlcV9vbl9jcHUgKCVkKVxuIiwgY3B1KTsKKwlwcl9kZWJ1ZygiZ2V0X2N1cl9mcmVxX29uX2NwdSAoJWQpXG4iLCBjcHUpOwogCiAJaWYgKHVubGlrZWx5KGRhdGEgPT0gTlVMTCB8fAogCQkgICAgIGRhdGEtPmFjcGlfZGF0YSA9PSBOVUxMIHx8IGRhdGEtPmZyZXFfdGFibGUgPT0gTlVMTCkpIHsKQEAgLTI2MSw3ICsyNTgsNyBAQAogCQlkYXRhLT5yZXN1bWUgPSAxOwogCX0KIAotCWRwcmludGsoImN1ciBmcmVxID0gJXVcbiIsIGZyZXEpOworCXByX2RlYnVnKCJjdXIgZnJlcSA9ICV1XG4iLCBmcmVxKTsKIAogCXJldHVybiBmcmVxOwogfQpAQCAtMjkzLDcgKzI5MCw3IEBACiAJdW5zaWduZWQgaW50IGk7CiAJaW50IHJlc3VsdCA9IDA7CiAKLQlkcHJpbnRrKCJhY3BpX2NwdWZyZXFfdGFyZ2V0ICVkICglZClcbiIsIHRhcmdldF9mcmVxLCBwb2xpY3ktPmNwdSk7CisJcHJfZGVidWcoImFjcGlfY3B1ZnJlcV90YXJnZXQgJWQgKCVkKVxuIiwgdGFyZ2V0X2ZyZXEsIHBvbGljeS0+Y3B1KTsKIAogCWlmICh1bmxpa2VseShkYXRhID09IE5VTEwgfHwKIAkgICAgIGRhdGEtPmFjcGlfZGF0YSA9PSBOVUxMIHx8IGRhdGEtPmZyZXFfdGFibGUgPT0gTlVMTCkpIHsKQEAgLTMxMywxMSArMzEwLDExIEBACiAJbmV4dF9wZXJmX3N0YXRlID0gZGF0YS0+ZnJlcV90YWJsZVtuZXh0X3N0YXRlXS5pbmRleDsKIAlpZiAocGVyZi0+c3RhdGUgPT0gbmV4dF9wZXJmX3N0YXRlKSB7CiAJCWlmICh1bmxpa2VseShkYXRhLT5yZXN1bWUpKSB7Ci0JCQlkcHJpbnRrKCJDYWxsZWQgYWZ0ZXIgcmVzdW1lLCByZXNldHRpbmcgdG8gUCVkXG4iLAorCQkJcHJfZGVidWcoIkNhbGxlZCBhZnRlciByZXN1bWUsIHJlc2V0dGluZyB0byBQJWRcbiIsCiAJCQkJbmV4dF9wZXJmX3N0YXRlKTsKIAkJCWRhdGEtPnJlc3VtZSA9IDA7CiAJCX0gZWxzZSB7Ci0JCQlkcHJpbnRrKCJBbHJlYWR5IGF0IHRhcmdldCBzdGF0ZSAoUCVkKVxuIiwKKwkJCXByX2RlYnVnKCJBbHJlYWR5IGF0IHRhcmdldCBzdGF0ZSAoUCVkKVxuIiwKIAkJCQluZXh0X3BlcmZfc3RhdGUpOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTM1Nyw3ICszNTQsNyBAQAogCiAJaWYgKGFjcGlfcHN0YXRlX3N0cmljdCkgewogCQlpZiAoIWNoZWNrX2ZyZXFzKGNtZC5tYXNrLCBmcmVxcy5uZXcsIGRhdGEpKSB7Ci0JCQlkcHJpbnRrKCJhY3BpX2NwdWZyZXFfdGFyZ2V0IGZhaWxlZCAoJWQpXG4iLAorCQkJcHJfZGVidWcoImFjcGlfY3B1ZnJlcV90YXJnZXQgZmFpbGVkICglZClcbiIsCiAJCQkJcG9saWN5LT5jcHUpOwogCQkJcmVzdWx0ID0gLUVBR0FJTjsKIAkJCWdvdG8gb3V0OwpAQCAtMzc4LDcgKzM3NSw3IEBACiB7CiAJc3RydWN0IGFjcGlfY3B1ZnJlcV9kYXRhICpkYXRhID0gcGVyX2NwdShhY2ZyZXFfZGF0YSwgcG9saWN5LT5jcHUpOwogCi0JZHByaW50aygiYWNwaV9jcHVmcmVxX3ZlcmlmeVxuIik7CisJcHJfZGVidWcoImFjcGlfY3B1ZnJlcV92ZXJpZnlcbiIpOwogCiAJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksIGRhdGEtPmZyZXFfdGFibGUpOwogfQpAQCAtNDMzLDExICs0MzAsMTEgQEAKIHN0YXRpYyBpbnQgX19pbml0IGFjcGlfY3B1ZnJlcV9lYXJseV9pbml0KHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IGk7Ci0JZHByaW50aygiYWNwaV9jcHVmcmVxX2Vhcmx5X2luaXRcbiIpOworCXByX2RlYnVnKCJhY3BpX2NwdWZyZXFfZWFybHlfaW5pdFxuIik7CiAKIAlhY3BpX3BlcmZfZGF0YSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UpOwogCWlmICghYWNwaV9wZXJmX2RhdGEpIHsKLQkJZHByaW50aygiTWVtb3J5IGFsbG9jYXRpb24gZXJyb3IgZm9yIGFjcGlfcGVyZl9kYXRhLlxuIik7CisJCXByX2RlYnVnKCJNZW1vcnkgYWxsb2NhdGlvbiBlcnJvciBmb3IgYWNwaV9wZXJmX2RhdGEuXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CkBAIC01MTksNyArNTE2LDcgQEAKIAlzdGF0aWMgaW50IGJsYWNrbGlzdGVkOwogI2VuZGlmCiAKLQlkcHJpbnRrKCJhY3BpX2NwdWZyZXFfY3B1X2luaXRcbiIpOworCXByX2RlYnVnKCJhY3BpX2NwdWZyZXFfY3B1X2luaXRcbiIpOwogCiAjaWZkZWYgQ09ORklHX1NNUAogCWlmIChibGFja2xpc3RlZCkKQEAgLTU2Niw3ICs1NjMsNyBAQAogCiAJLyogY2FwYWJpbGl0eSBjaGVjayAqLwogCWlmIChwZXJmLT5zdGF0ZV9jb3VudCA8PSAxKSB7Ci0JCWRwcmludGsoIk5vIFAtU3RhdGVzXG4iKTsKKwkJcHJfZGVidWcoIk5vIFAtU3RhdGVzXG4iKTsKIAkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJZ290byBlcnJfdW5yZWc7CiAJfQpAQCAtNTc4LDExICs1NzUsMTEgQEAKIAogCXN3aXRjaCAocGVyZi0+Y29udHJvbF9yZWdpc3Rlci5zcGFjZV9pZCkgewogCWNhc2UgQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPOgotCQlkcHJpbnRrKCJTWVNURU0gSU8gYWRkciBzcGFjZVxuIik7CisJCXByX2RlYnVnKCJTWVNURU0gSU8gYWRkciBzcGFjZVxuIik7CiAJCWRhdGEtPmNwdV9mZWF0dXJlID0gU1lTVEVNX0lPX0NBUEFCTEU7CiAJCWJyZWFrOwogCWNhc2UgQUNQSV9BRFJfU1BBQ0VfRklYRURfSEFSRFdBUkU6Ci0JCWRwcmludGsoIkhBUkRXQVJFIGFkZHIgc3BhY2VcbiIpOworCQlwcl9kZWJ1ZygiSEFSRFdBUkUgYWRkciBzcGFjZVxuIik7CiAJCWlmICghY2hlY2tfZXN0X2NwdShjcHUpKSB7CiAJCQlyZXN1bHQgPSAtRU5PREVWOwogCQkJZ290byBlcnJfdW5yZWc7CkBAIC01OTAsNyArNTg3LDcgQEAKIAkJZGF0YS0+Y3B1X2ZlYXR1cmUgPSBTWVNURU1fSU5URUxfTVNSX0NBUEFCTEU7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRwcmludGsoIlVua25vd24gYWRkciBzcGFjZSAlZFxuIiwKKwkJcHJfZGVidWcoIlVua25vd24gYWRkciBzcGFjZSAlZFxuIiwKIAkJCSh1MzIpIChwZXJmLT5jb250cm9sX3JlZ2lzdGVyLnNwYWNlX2lkKSk7CiAJCXJlc3VsdCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX3VucmVnOwpAQCAtNjYxLDkgKzY1OCw5IEBACiAJaWYgKGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfQVBFUkZNUEVSRikpCiAJCWFjcGlfY3B1ZnJlcV9kcml2ZXIuZ2V0YXZnID0gY3B1ZnJlcV9nZXRfbWVhc3VyZWRfcGVyZjsKIAotCWRwcmludGsoIkNQVSV1IC0gQUNQSSBwZXJmb3JtYW5jZSBtYW5hZ2VtZW50IGFjdGl2YXRlZC5cbiIsIGNwdSk7CisJcHJfZGVidWcoIkNQVSV1IC0gQUNQSSBwZXJmb3JtYW5jZSBtYW5hZ2VtZW50IGFjdGl2YXRlZC5cbiIsIGNwdSk7CiAJZm9yIChpID0gMDsgaSA8IHBlcmYtPnN0YXRlX2NvdW50OyBpKyspCi0JCWRwcmludGsoIiAgICAgJWNQJWQ6ICVkIE1IeiwgJWQgbVcsICVkIHVTXG4iLAorCQlwcl9kZWJ1ZygiICAgICAlY1AlZDogJWQgTUh6LCAlZCBtVywgJWQgdVNcbiIsCiAJCQkoaSA9PSBwZXJmLT5zdGF0ZSA/ICcqJyA6ICcgJyksIGksCiAJCQkodTMyKSBwZXJmLT5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3ksCiAJCQkodTMyKSBwZXJmLT5zdGF0ZXNbaV0ucG93ZXIsCkBAIC02OTQsNyArNjkxLDcgQEAKIHsKIAlzdHJ1Y3QgYWNwaV9jcHVmcmVxX2RhdGEgKmRhdGEgPSBwZXJfY3B1KGFjZnJlcV9kYXRhLCBwb2xpY3ktPmNwdSk7CiAKLQlkcHJpbnRrKCJhY3BpX2NwdWZyZXFfY3B1X2V4aXRcbiIpOworCXByX2RlYnVnKCJhY3BpX2NwdWZyZXFfY3B1X2V4aXRcbiIpOwogCiAJaWYgKGRhdGEpIHsKIAkJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9saWN5LT5jcHUpOwpAQCAtNzEyLDcgKzcwOSw3IEBACiB7CiAJc3RydWN0IGFjcGlfY3B1ZnJlcV9kYXRhICpkYXRhID0gcGVyX2NwdShhY2ZyZXFfZGF0YSwgcG9saWN5LT5jcHUpOwogCi0JZHByaW50aygiYWNwaV9jcHVmcmVxX3Jlc3VtZVxuIik7CisJcHJfZGVidWcoImFjcGlfY3B1ZnJlcV9yZXN1bWVcbiIpOwogCiAJZGF0YS0+cmVzdW1lID0gMTsKIApAQCAtNzQzLDcgKzc0MCw3IEBACiAJaWYgKGFjcGlfZGlzYWJsZWQpCiAJCXJldHVybiAwOwogCi0JZHByaW50aygiYWNwaV9jcHVmcmVxX2luaXRcbiIpOworCXByX2RlYnVnKCJhY3BpX2NwdWZyZXFfaW5pdFxuIik7CiAKIAlyZXQgPSBhY3BpX2NwdWZyZXFfZWFybHlfaW5pdCgpOwogCWlmIChyZXQpCkBAIC03NTgsNyArNzU1LDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGFjcGlfY3B1ZnJlcV9leGl0KHZvaWQpCiB7Ci0JZHByaW50aygiYWNwaV9jcHVmcmVxX2V4aXRcbiIpOworCXByX2RlYnVnKCJhY3BpX2NwdWZyZXFfZXhpdFxuIik7CiAKIAljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2NwdWZyZXFfZHJpdmVyKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2NwdWZyZXEtbmZvcmNlMi5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEtbmZvcmNlMi5jCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGFyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9jcHVmcmVxLW5mb3JjZTIuYwpyZW5hbWUgdG8gZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEtbmZvcmNlMi5jCmluZGV4IDE0MWFiZWIuLjdiYWM4MDggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9jcHVmcmVxLW5mb3JjZTIuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS1uZm9yY2UyLmMKQEAgLTU3LDggKzU3LDYgQEAKIAkJIk1pbmltdW0gRlNCIHRvIHVzZSwgaWYgbm90IGRlZmluZWQ6IGN1cnJlbnQgRlNCIC0gNTAiKTsKIAogI2RlZmluZSBQRlggImNwdWZyZXEtbmZvcmNlMjogIgotI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsIFwKLQkJImNwdWZyZXEtbmZvcmNlMiIsIG1zZykKIAogLyoqCiAgKiBuZm9yY2UyX2NhbGNfZnNiIC0gY2FsY3VsYXRlIEZTQgpAQCAtMjcwLDcgKzI2OCw3IEBACiAJaWYgKGZyZXFzLm9sZCA9PSBmcmVxcy5uZXcpCiAJCXJldHVybiAwOwogCi0JZHByaW50aygiT2xkIENQVSBmcmVxdWVuY3kgJWQga0h6LCBuZXcgJWQga0h6XG4iLAorCXByX2RlYnVnKCJPbGQgQ1BVIGZyZXF1ZW5jeSAlZCBrSHosIG5ldyAlZCBrSHpcbiIsCiAJICAgICAgIGZyZXFzLm9sZCwgZnJlcXMubmV3KTsKIAogCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CkBAIC0yODIsNyArMjgwLDcgQEAKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2hhbmdpbmcgRlNCIHRvICVkIGZhaWxlZFxuIiwKIAkJCXRhcmdldF9mc2IpOwogCWVsc2UKLQkJZHByaW50aygiQ2hhbmdlZCBGU0Igc3VjY2Vzc2Z1bGx5IHRvICVkXG4iLAorCQlwcl9kZWJ1ZygiQ2hhbmdlZCBGU0Igc3VjY2Vzc2Z1bGx5IHRvICVkXG4iLAogCQkJdGFyZ2V0X2ZzYik7CiAKIAkvKiBFbmFibGUgSVJRcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKaW5kZXggMmRhZmM1Yy4uMGE1YmVhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCkBAIC0zMiw5ICszMiw2IEBACiAKICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvcG93ZXIuaD4KIAotI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19DT1JFLCBcCi0JCQkJCQkiY3B1ZnJlcS1jb3JlIiwgbXNnKQotCiAvKioKICAqIFRoZSAiY3B1ZnJlcSBkcml2ZXIiIC0gdGhlIGFyY2gtIG9yIGhhcmR3YXJlLWRlcGVuZGVudCBsb3cKICAqIGxldmVsIGRyaXZlciBvZiBDUFVGcmVxIHN1cHBvcnQsIGFuZCBpdHMgc3BpbmxvY2suIFRoaXMgbG9jawpAQCAtMTgxLDkzICsxNzgsNiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgVU5JRklFRCBERUJVRyBIRUxQRVJTICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQ09ORklHX0NQVV9GUkVRX0RFQlVHCi0KLS8qIHdoYXQgcGFydChzKSBvZiB0aGUgQ1BVZnJlcSBzdWJzeXN0ZW0gYXJlIGRlYnVnZ2VkPyAqLwotc3RhdGljIHVuc2lnbmVkIGludCBkZWJ1ZzsKLQotLyogaXMgdGhlIGRlYnVnIG91dHB1dCByYXRlbGltaXQnZWQgdXNpbmcgcHJpbnRrX3JhdGVsaW1pdD8gVXNlciBjYW4KLSAqIHNldCBvciBtb2RpZnkgdGhpcyB2YWx1ZS4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBkZWJ1Z19yYXRlbGltaXQgPSAxOwotCi0vKiBpcyB0aGUgcHJpbnRrX3JhdGVsaW1pdCdpbmcgZW5hYmxlZD8gSXQncyBlbmFibGVkIGFmdGVyIGEgc3VjY2Vzc2Z1bAotICogbG9hZGluZyBvZiBhIGNwdWZyZXEgZHJpdmVyLCB0ZW1wb3JhcmlseSBkaXNhYmxlZCB3aGVuIGEgbmV3IHBvbGljeQotICogaXMgc2V0LCBhbmQgZGlzYWJsZWQgdXBvbiBjcHVmcmVxIGRyaXZlciByZW1vdmFsCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGlzYWJsZV9yYXRlbGltaXQgPSAxOwotc3RhdGljIERFRklORV9TUElOTE9DSyhkaXNhYmxlX3JhdGVsaW1pdF9sb2NrKTsKLQotc3RhdGljIHZvaWQgY3B1ZnJlcV9kZWJ1Z19lbmFibGVfcmF0ZWxpbWl0KHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkaXNhYmxlX3JhdGVsaW1pdF9sb2NrLCBmbGFncyk7Ci0JaWYgKGRpc2FibGVfcmF0ZWxpbWl0KQotCQlkaXNhYmxlX3JhdGVsaW1pdC0tOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpc2FibGVfcmF0ZWxpbWl0X2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgY3B1ZnJlcV9kZWJ1Z19kaXNhYmxlX3JhdGVsaW1pdCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGlzYWJsZV9yYXRlbGltaXRfbG9jaywgZmxhZ3MpOwotCWRpc2FibGVfcmF0ZWxpbWl0Kys7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGlzYWJsZV9yYXRlbGltaXRfbG9jaywgZmxhZ3MpOwotfQotCi12b2lkIGNwdWZyZXFfZGVidWdfcHJpbnRrKHVuc2lnbmVkIGludCB0eXBlLCBjb25zdCBjaGFyICpwcmVmaXgsCi0JCQljb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLQljaGFyIHNbMjU2XTsKLQl2YV9saXN0IGFyZ3M7Ci0JdW5zaWduZWQgaW50IGxlbjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JV0FSTl9PTighcHJlZml4KTsKLQlpZiAodHlwZSAmIGRlYnVnKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZkaXNhYmxlX3JhdGVsaW1pdF9sb2NrLCBmbGFncyk7Ci0JCWlmICghZGlzYWJsZV9yYXRlbGltaXQgJiYgZGVidWdfcmF0ZWxpbWl0Ci0JCQkJCSYmICFwcmludGtfcmF0ZWxpbWl0KCkpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpc2FibGVfcmF0ZWxpbWl0X2xvY2ssIGZsYWdzKTsKLQkJCXJldHVybjsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkaXNhYmxlX3JhdGVsaW1pdF9sb2NrLCBmbGFncyk7Ci0KLQkJbGVuID0gc25wcmludGYocywgMjU2LCBLRVJOX0RFQlVHICIlczogIiwgcHJlZml4KTsKLQotCQl2YV9zdGFydChhcmdzLCBmbXQpOwotCQlsZW4gKz0gdnNucHJpbnRmKCZzW2xlbl0sICgyNTYgLSBsZW4pLCBmbXQsIGFyZ3MpOwotCQl2YV9lbmQoYXJncyk7Ci0KLQkJcHJpbnRrKHMpOwotCi0JCVdBUk5fT04obGVuIDwgNSk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChjcHVmcmVxX2RlYnVnX3ByaW50ayk7Ci0KLQotbW9kdWxlX3BhcmFtKGRlYnVnLCB1aW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJDUFVmcmVxIGRlYnVnZ2luZzogYWRkIDEgdG8gZGVidWcgY29yZSwiCi0JCQkiIDIgdG8gZGVidWcgZHJpdmVycywgYW5kIDQgdG8gZGVidWcgZ292ZXJub3JzLiIpOwotCi1tb2R1bGVfcGFyYW0oZGVidWdfcmF0ZWxpbWl0LCB1aW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWdfcmF0ZWxpbWl0LCAiQ1BVZnJlcSBkZWJ1Z2dpbmc6IgotCQkJCQkiIHNldCB0byAwIHRvIGRpc2FibGUgcmF0ZWxpbWl0aW5nLiIpOwotCi0jZWxzZSAvKiAhQ09ORklHX0NQVV9GUkVRX0RFQlVHICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjcHVmcmVxX2RlYnVnX2VuYWJsZV9yYXRlbGltaXQodm9pZCkgeyByZXR1cm47IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjcHVmcmVxX2RlYnVnX2Rpc2FibGVfcmF0ZWxpbWl0KHZvaWQpIHsgcmV0dXJuOyB9Ci0KLSNlbmRpZiAvKiBDT05GSUdfQ1BVX0ZSRVFfREVCVUcgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgIEVYVEVSTkFMTFkgQUZGRUNUSU5HIEZSRVFVRU5DWSBDSEFOR0VTICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0yOTEsNyArMjAxLDcgQEAKIAlpZiAoIWxfcF9qX3JlZl9mcmVxKSB7CiAJCWxfcF9qX3JlZiA9IGxvb3BzX3Blcl9qaWZmeTsKIAkJbF9wX2pfcmVmX2ZyZXEgPSBjaS0+b2xkOwotCQlkcHJpbnRrKCJzYXZpbmcgJWx1IGFzIHJlZmVyZW5jZSB2YWx1ZSBmb3IgbG9vcHNfcGVyX2ppZmZ5OyAiCisJCXByX2RlYnVnKCJzYXZpbmcgJWx1IGFzIHJlZmVyZW5jZSB2YWx1ZSBmb3IgbG9vcHNfcGVyX2ppZmZ5OyAiCiAJCQkiZnJlcSBpcyAldSBrSHpcbiIsIGxfcF9qX3JlZiwgbF9wX2pfcmVmX2ZyZXEpOwogCX0KIAlpZiAoKHZhbCA9PSBDUFVGUkVRX1BSRUNIQU5HRSAgJiYgY2ktPm9sZCA8IGNpLT5uZXcpIHx8CkBAIC0yOTksNyArMjA5LDcgQEAKIAkgICAgKHZhbCA9PSBDUFVGUkVRX1JFU1VNRUNIQU5HRSB8fCB2YWwgPT0gQ1BVRlJFUV9TVVNQRU5EQ0hBTkdFKSkgewogCQlsb29wc19wZXJfamlmZnkgPSBjcHVmcmVxX3NjYWxlKGxfcF9qX3JlZiwgbF9wX2pfcmVmX2ZyZXEsCiAJCQkJCQkJCWNpLT5uZXcpOwotCQlkcHJpbnRrKCJzY2FsaW5nIGxvb3BzX3Blcl9qaWZmeSB0byAlbHUgIgorCQlwcl9kZWJ1Zygic2NhbGluZyBsb29wc19wZXJfamlmZnkgdG8gJWx1ICIKIAkJCSJmb3IgZnJlcXVlbmN5ICV1IGtIelxuIiwgbG9vcHNfcGVyX2ppZmZ5LCBjaS0+bmV3KTsKIAl9CiB9CkBAIC0zMjYsNyArMjM2LDcgQEAKIAlCVUdfT04oaXJxc19kaXNhYmxlZCgpKTsKIAogCWZyZXFzLT5mbGFncyA9IGNwdWZyZXFfZHJpdmVyLT5mbGFnczsKLQlkcHJpbnRrKCJub3RpZmljYXRpb24gJXUgb2YgZnJlcXVlbmN5IHRyYW5zaXRpb24gdG8gJXUga0h6XG4iLAorCXByX2RlYnVnKCJub3RpZmljYXRpb24gJXUgb2YgZnJlcXVlbmN5IHRyYW5zaXRpb24gdG8gJXUga0h6XG4iLAogCQlzdGF0ZSwgZnJlcXMtPm5ldyk7CiAKIAlwb2xpY3kgPSBwZXJfY3B1KGNwdWZyZXFfY3B1X2RhdGEsIGZyZXFzLT5jcHUpOwpAQCAtMzQwLDcgKzI1MCw3IEBACiAJCWlmICghKGNwdWZyZXFfZHJpdmVyLT5mbGFncyAmIENQVUZSRVFfQ09OU1RfTE9PUFMpKSB7CiAJCQlpZiAoKHBvbGljeSkgJiYgKHBvbGljeS0+Y3B1ID09IGZyZXFzLT5jcHUpICYmCiAJCQkgICAgKHBvbGljeS0+Y3VyKSAmJiAocG9saWN5LT5jdXIgIT0gZnJlcXMtPm9sZCkpIHsKLQkJCQlkcHJpbnRrKCJXYXJuaW5nOiBDUFUgZnJlcXVlbmN5IGlzIgorCQkJCXByX2RlYnVnKCJXYXJuaW5nOiBDUFUgZnJlcXVlbmN5IGlzIgogCQkJCQkiICV1LCBjcHVmcmVxIGFzc3VtZWQgJXUga0h6LlxuIiwKIAkJCQkJZnJlcXMtPm9sZCwgcG9saWN5LT5jdXIpOwogCQkJCWZyZXFzLT5vbGQgPSBwb2xpY3ktPmN1cjsKQEAgLTM1Myw3ICsyNjMsNyBAQAogCiAJY2FzZSBDUFVGUkVRX1BPU1RDSEFOR0U6CiAJCWFkanVzdF9qaWZmaWVzKENQVUZSRVFfUE9TVENIQU5HRSwgZnJlcXMpOwotCQlkcHJpbnRrKCJGUkVROiAlbHUgLSBDUFU6ICVsdSIsICh1bnNpZ25lZCBsb25nKWZyZXFzLT5uZXcsCisJCXByX2RlYnVnKCJGUkVROiAlbHUgLSBDUFU6ICVsdSIsICh1bnNpZ25lZCBsb25nKWZyZXFzLT5uZXcsCiAJCQkodW5zaWduZWQgbG9uZylmcmVxcy0+Y3B1KTsKIAkJdHJhY2VfcG93ZXJfZnJlcXVlbmN5KFBPV0VSX1BTVEFURSwgZnJlcXMtPm5ldywgZnJlcXMtPmNwdSk7CiAJCXRyYWNlX2NwdV9mcmVxdWVuY3koZnJlcXMtPm5ldywgZnJlcXMtPmNwdSk7CkBAIC00MTEsMjEgKzMyMSwxNCBAQAogCQl0ID0gX19maW5kX2dvdmVybm9yKHN0cl9nb3Zlcm5vcik7CiAKIAkJaWYgKHQgPT0gTlVMTCkgewotCQkJY2hhciAqbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiY3B1ZnJlcV8lcyIsCi0JCQkJCQkJCXN0cl9nb3Zlcm5vcik7CisJCQlpbnQgcmV0OwogCi0JCQlpZiAobmFtZSkgewotCQkJCWludCByZXQ7CisJCQltdXRleF91bmxvY2soJmNwdWZyZXFfZ292ZXJub3JfbXV0ZXgpOworCQkJcmV0ID0gcmVxdWVzdF9tb2R1bGUoImNwdWZyZXFfJXMiLCBzdHJfZ292ZXJub3IpOworCQkJbXV0ZXhfbG9jaygmY3B1ZnJlcV9nb3Zlcm5vcl9tdXRleCk7CiAKLQkJCQltdXRleF91bmxvY2soJmNwdWZyZXFfZ292ZXJub3JfbXV0ZXgpOwotCQkJCXJldCA9IHJlcXVlc3RfbW9kdWxlKCIlcyIsIG5hbWUpOwotCQkJCW11dGV4X2xvY2soJmNwdWZyZXFfZ292ZXJub3JfbXV0ZXgpOwotCi0JCQkJaWYgKHJldCA9PSAwKQotCQkJCQl0ID0gX19maW5kX2dvdmVybm9yKHN0cl9nb3Zlcm5vcik7Ci0JCQl9Ci0KLQkJCWtmcmVlKG5hbWUpOworCQkJaWYgKHJldCA9PSAwKQorCQkJCXQgPSBfX2ZpbmRfZ292ZXJub3Ioc3RyX2dvdmVybm9yKTsKIAkJfQogCiAJCWlmICh0ICE9IE5VTEwpIHsKQEAgLTc1Myw3ICs2NTYsNyBAQAogc3RhdGljIHZvaWQgY3B1ZnJlcV9zeXNmc19yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQogewogCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5ID0gdG9fcG9saWN5KGtvYmopOwotCWRwcmludGsoImxhc3QgcmVmZXJlbmNlIGlzIGRyb3BwZWRcbiIpOworCXByX2RlYnVnKCJsYXN0IHJlZmVyZW5jZSBpcyBkcm9wcGVkXG4iKTsKIAljb21wbGV0ZSgmcG9saWN5LT5rb2JqX3VucmVnaXN0ZXIpOwogfQogCkBAIC03ODgsNyArNjkxLDcgQEAKIAlnb3YgPSBfX2ZpbmRfZ292ZXJub3IocGVyX2NwdShjcHVmcmVxX2NwdV9nb3Zlcm5vciwgY3B1KSk7CiAJaWYgKGdvdikgewogCQlwb2xpY3ktPmdvdmVybm9yID0gZ292OwotCQlkcHJpbnRrKCJSZXN0b3JpbmcgZ292ZXJub3IgJXMgZm9yIGNwdSAlZFxuIiwKKwkJcHJfZGVidWcoIlJlc3RvcmluZyBnb3Zlcm5vciAlcyBmb3IgY3B1ICVkXG4iLAogCQkgICAgICAgcG9saWN5LT5nb3Zlcm5vci0+bmFtZSwgY3B1KTsKIAl9CiAjZW5kaWYKQEAgLTgyNCw3ICs3MjcsNyBAQAogCQkJcGVyX2NwdShjcHVmcmVxX2NwdV9kYXRhLCBjcHUpID0gbWFuYWdlZF9wb2xpY3k7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcHVmcmVxX2RyaXZlcl9sb2NrLCBmbGFncyk7CiAKLQkJCWRwcmludGsoIkNQVSBhbHJlYWR5IG1hbmFnZWQsIGFkZGluZyBsaW5rXG4iKTsKKwkJCXByX2RlYnVnKCJDUFUgYWxyZWFkeSBtYW5hZ2VkLCBhZGRpbmcgbGlua1xuIik7CiAJCQlyZXQgPSBzeXNmc19jcmVhdGVfbGluaygmc3lzX2Rldi0+a29iaiwKIAkJCQkJCSZtYW5hZ2VkX3BvbGljeS0+a29iaiwKIAkJCQkJCSJjcHVmcmVxIik7CkBAIC04NjUsNyArNzY4LDcgQEAKIAkJaWYgKCFjcHVfb25saW5lKGopKQogCQkJY29udGludWU7CiAKLQkJZHByaW50aygiQ1BVICV1IGFscmVhZHkgbWFuYWdlZCwgYWRkaW5nIGxpbmtcbiIsIGopOworCQlwcl9kZWJ1ZygiQ1BVICV1IGFscmVhZHkgbWFuYWdlZCwgYWRkaW5nIGxpbmtcbiIsIGopOwogCQltYW5hZ2VkX3BvbGljeSA9IGNwdWZyZXFfY3B1X2dldChjcHUpOwogCQljcHVfc3lzX2RldiA9IGdldF9jcHVfc3lzZGV2KGopOwogCQlyZXQgPSBzeXNmc19jcmVhdGVfbGluaygmY3B1X3N5c19kZXYtPmtvYmosICZwb2xpY3ktPmtvYmosCkBAIC05NDEsNyArODQ0LDcgQEAKIAlwb2xpY3ktPnVzZXJfcG9saWN5LmdvdmVybm9yID0gcG9saWN5LT5nb3Zlcm5vcjsKIAogCWlmIChyZXQpIHsKLQkJZHByaW50aygic2V0dGluZyBwb2xpY3kgZmFpbGVkXG4iKTsKKwkJcHJfZGVidWcoInNldHRpbmcgcG9saWN5IGZhaWxlZFxuIik7CiAJCWlmIChjcHVmcmVxX2RyaXZlci0+ZXhpdCkKIAkJCWNwdWZyZXFfZHJpdmVyLT5leGl0KHBvbGljeSk7CiAJfQpAQCAtOTc3LDggKzg4MCw3IEBACiAJaWYgKGNwdV9pc19vZmZsaW5lKGNwdSkpCiAJCXJldHVybiAwOwogCi0JY3B1ZnJlcV9kZWJ1Z19kaXNhYmxlX3JhdGVsaW1pdCgpOwotCWRwcmludGsoImFkZGluZyBDUFUgJXVcbiIsIGNwdSk7CisJcHJfZGVidWcoImFkZGluZyBDUFUgJXVcbiIsIGNwdSk7CiAKICNpZmRlZiBDT05GSUdfU01QCiAJLyogY2hlY2sgd2hldGhlciBhIGRpZmZlcmVudCBDUFUgYWxyZWFkeSByZWdpc3RlcmVkIHRoaXMKQEAgLTk4Niw3ICs4ODgsNiBAQAogCXBvbGljeSA9IGNwdWZyZXFfY3B1X2dldChjcHUpOwogCWlmICh1bmxpa2VseShwb2xpY3kpKSB7CiAJCWNwdWZyZXFfY3B1X3B1dChwb2xpY3kpOwotCQljcHVmcmVxX2RlYnVnX2VuYWJsZV9yYXRlbGltaXQoKTsKIAkJcmV0dXJuIDA7CiAJfQogI2VuZGlmCkBAIC0xMDM3LDcgKzkzOCw3IEBACiAJICovCiAJcmV0ID0gY3B1ZnJlcV9kcml2ZXItPmluaXQocG9saWN5KTsKIAlpZiAocmV0KSB7Ci0JCWRwcmludGsoImluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CisJCXByX2RlYnVnKCJpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl91bmxvY2tfcG9saWN5OwogCX0KIAlwb2xpY3ktPnVzZXJfcG9saWN5Lm1pbiA9IHBvbGljeS0+bWluOwpAQCAtMTA2Myw4ICs5NjQsNyBAQAogCiAJa29iamVjdF91ZXZlbnQoJnBvbGljeS0+a29iaiwgS09CSl9BREQpOwogCW1vZHVsZV9wdXQoY3B1ZnJlcV9kcml2ZXItPm93bmVyKTsKLQlkcHJpbnRrKCJpbml0aWFsaXphdGlvbiBjb21wbGV0ZVxuIik7Ci0JY3B1ZnJlcV9kZWJ1Z19lbmFibGVfcmF0ZWxpbWl0KCk7CisJcHJfZGVidWcoImluaXRpYWxpemF0aW9uIGNvbXBsZXRlXG4iKTsKIAogCXJldHVybiAwOwogCkBAIC0xMDg4LDcgKzk4OCw2IEBACiBub21lbV9vdXQ6CiAJbW9kdWxlX3B1dChjcHVmcmVxX2RyaXZlci0+b3duZXIpOwogbW9kdWxlX291dDoKLQljcHVmcmVxX2RlYnVnX2VuYWJsZV9yYXRlbGltaXQoKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMTEyLDE1ICsxMDExLDEzIEBACiAJdW5zaWduZWQgaW50IGo7CiAjZW5kaWYKIAotCWNwdWZyZXFfZGVidWdfZGlzYWJsZV9yYXRlbGltaXQoKTsKLQlkcHJpbnRrKCJ1bnJlZ2lzdGVyaW5nIENQVSAldVxuIiwgY3B1KTsKKwlwcl9kZWJ1ZygidW5yZWdpc3RlcmluZyBDUFUgJXVcbiIsIGNwdSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY3B1ZnJlcV9kcml2ZXJfbG9jaywgZmxhZ3MpOwogCWRhdGEgPSBwZXJfY3B1KGNwdWZyZXFfY3B1X2RhdGEsIGNwdSk7CiAKIAlpZiAoIWRhdGEpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3B1ZnJlcV9kcml2ZXJfbG9jaywgZmxhZ3MpOwotCQljcHVmcmVxX2RlYnVnX2VuYWJsZV9yYXRlbGltaXQoKTsKIAkJdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xMTMyLDEyICsxMDI5LDExIEBACiAJICogb25seSBuZWVkIHRvIHVubGluaywgcHV0IGFuZCBleGl0CiAJICovCiAJaWYgKHVubGlrZWx5KGNwdSAhPSBkYXRhLT5jcHUpKSB7Ci0JCWRwcmludGsoInJlbW92aW5nIGxpbmtcbiIpOworCQlwcl9kZWJ1ZygicmVtb3ZpbmcgbGlua1xuIik7CiAJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgZGF0YS0+Y3B1cyk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwdWZyZXFfZHJpdmVyX2xvY2ssIGZsYWdzKTsKIAkJa29iaiA9ICZzeXNfZGV2LT5rb2JqOwogCQljcHVmcmVxX2NwdV9wdXQoZGF0YSk7Ci0JCWNwdWZyZXFfZGVidWdfZW5hYmxlX3JhdGVsaW1pdCgpOwogCQl1bmxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKGNwdSk7CiAJCXN5c2ZzX3JlbW92ZV9saW5rKGtvYmosICJjcHVmcmVxIik7CiAJCXJldHVybiAwOwpAQCAtMTE3MCw3ICsxMDY2LDcgQEAKIAkJZm9yX2VhY2hfY3B1KGosIGRhdGEtPmNwdXMpIHsKIAkJCWlmIChqID09IGNwdSkKIAkJCQljb250aW51ZTsKLQkJCWRwcmludGsoInJlbW92aW5nIGxpbmsgZm9yIGNwdSAldVxuIiwgaik7CisJCQlwcl9kZWJ1ZygicmVtb3ZpbmcgbGluayBmb3IgY3B1ICV1XG4iLCBqKTsKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAkJCXN0cm5jcHkocGVyX2NwdShjcHVmcmVxX2NwdV9nb3Zlcm5vciwgaiksCiAJCQkJZGF0YS0+Z292ZXJub3ItPm5hbWUsIENQVUZSRVFfTkFNRV9MRU4pOwpAQCAtMTE5OSwyMSArMTA5NSwzNSBAQAogCSAqIG5vdCByZWZlcmVuY2VkIGFueW1vcmUgYnkgYW55Ym9keSBiZWZvcmUgd2UgcHJvY2VlZCB3aXRoCiAJICogdW5sb2FkaW5nLgogCSAqLwotCWRwcmludGsoIndhaXRpbmcgZm9yIGRyb3BwaW5nIG9mIHJlZmNvdW50XG4iKTsKKwlwcl9kZWJ1Zygid2FpdGluZyBmb3IgZHJvcHBpbmcgb2YgcmVmY291bnRcbiIpOwogCXdhaXRfZm9yX2NvbXBsZXRpb24oY21wKTsKLQlkcHJpbnRrKCJ3YWl0IGNvbXBsZXRlXG4iKTsKKwlwcl9kZWJ1Zygid2FpdCBjb21wbGV0ZVxuIik7CiAKIAlsb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpOwogCWlmIChjcHVmcmVxX2RyaXZlci0+ZXhpdCkKIAkJY3B1ZnJlcV9kcml2ZXItPmV4aXQoZGF0YSk7CiAJdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpOwogCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJLyogd2hlbiB0aGUgQ1BVIHdoaWNoIGlzIHRoZSBwYXJlbnQgb2YgdGhlIGtvYmogaXMgaG90cGx1Z2dlZAorCSAqIG9mZmxpbmUsIGNoZWNrIGZvciBzaWJsaW5ncywgYW5kIGNyZWF0ZSBjcHVmcmVxIHN5c2ZzIGludGVyZmFjZQorCSAqIGFuZCBzeW1saW5rcworCSAqLworCWlmICh1bmxpa2VseShjcHVtYXNrX3dlaWdodChkYXRhLT5jcHVzKSA+IDEpKSB7CisJCS8qIGZpcnN0IHNpYmxpbmcgbm93IG93bnMgdGhlIG5ldyBzeXNmcyBkaXIgKi8KKwkJY3B1bWFza19jbGVhcl9jcHUoY3B1LCBkYXRhLT5jcHVzKTsKKwkJY3B1ZnJlcV9hZGRfZGV2KGdldF9jcHVfc3lzZGV2KGNwdW1hc2tfZmlyc3QoZGF0YS0+Y3B1cykpKTsKKworCQkvKiBmaW5hbGx5IHJlbW92ZSBvdXIgb3duIHN5bWxpbmsgKi8KKwkJbG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KTsKKwkJX19jcHVmcmVxX3JlbW92ZV9kZXYoc3lzX2Rldik7CisJfQorI2VuZGlmCisKIAlmcmVlX2NwdW1hc2tfdmFyKGRhdGEtPnJlbGF0ZWRfY3B1cyk7CiAJZnJlZV9jcHVtYXNrX3ZhcihkYXRhLT5jcHVzKTsKIAlrZnJlZShkYXRhKTsKLQlwZXJfY3B1KGNwdWZyZXFfY3B1X2RhdGEsIGNwdSkgPSBOVUxMOwogCi0JY3B1ZnJlcV9kZWJ1Z19lbmFibGVfcmF0ZWxpbWl0KCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyMzksNyArMTE0OSw3IEBACiAJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kgPQogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGNwdWZyZXFfcG9saWN5LCB1cGRhdGUpOwogCXVuc2lnbmVkIGludCBjcHUgPSBwb2xpY3ktPmNwdTsKLQlkcHJpbnRrKCJoYW5kbGVfdXBkYXRlIGZvciBjcHUgJXUgY2FsbGVkXG4iLCBjcHUpOworCXByX2RlYnVnKCJoYW5kbGVfdXBkYXRlIGZvciBjcHUgJXUgY2FsbGVkXG4iLCBjcHUpOwogCWNwdWZyZXFfdXBkYXRlX3BvbGljeShjcHUpOwogfQogCkBAIC0xMjU3LDcgKzExNjcsNyBAQAogewogCXN0cnVjdCBjcHVmcmVxX2ZyZXFzIGZyZXFzOwogCi0JZHByaW50aygiV2FybmluZzogQ1BVIGZyZXF1ZW5jeSBvdXQgb2Ygc3luYzogY3B1ZnJlcSBhbmQgdGltaW5nICIKKwlwcl9kZWJ1ZygiV2FybmluZzogQ1BVIGZyZXF1ZW5jeSBvdXQgb2Ygc3luYzogY3B1ZnJlcSBhbmQgdGltaW5nICIKIAkgICAgICAgImNvcmUgdGhpbmtzIG9mICV1LCBpcyAldSBrSHouXG4iLCBvbGRfZnJlcSwgbmV3X2ZyZXEpOwogCiAJZnJlcXMuY3B1ID0gY3B1OwpAQCAtMTM2MCw3ICsxMjcwLDcgQEAKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqY3B1X3BvbGljeTsKIAotCWRwcmludGsoInN1c3BlbmRpbmcgY3B1ICV1XG4iLCBjcHUpOworCXByX2RlYnVnKCJzdXNwZW5kaW5nIGNwdSAldVxuIiwgY3B1KTsKIAogCS8qIElmIHRoZXJlJ3Mgbm8gcG9saWN5IGZvciB0aGUgYm9vdCBDUFUsIHdlIGhhdmUgbm90aGluZyB0byBkby4gKi8KIAljcHVfcG9saWN5ID0gY3B1ZnJlcV9jcHVfZ2V0KGNwdSk7CkBAIC0xMzk4LDcgKzEzMDgsNyBAQAogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpjcHVfcG9saWN5OwogCi0JZHByaW50aygicmVzdW1pbmcgY3B1ICV1XG4iLCBjcHUpOworCXByX2RlYnVnKCJyZXN1bWluZyBjcHUgJXVcbiIsIGNwdSk7CiAKIAkvKiBJZiB0aGVyZSdzIG5vIHBvbGljeSBmb3IgdGhlIGJvb3QgQ1BVLCB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8uICovCiAJY3B1X3BvbGljeSA9IGNwdWZyZXFfY3B1X2dldChjcHUpOwpAQCAtMTUxMCw3ICsxNDIwLDcgQEAKIHsKIAlpbnQgcmV0dmFsID0gLUVJTlZBTDsKIAotCWRwcmludGsoInRhcmdldCBmb3IgQ1BVICV1OiAldSBrSHosIHJlbGF0aW9uICV1XG4iLCBwb2xpY3ktPmNwdSwKKwlwcl9kZWJ1ZygidGFyZ2V0IGZvciBDUFUgJXU6ICV1IGtIeiwgcmVsYXRpb24gJXVcbiIsIHBvbGljeS0+Y3B1LAogCQl0YXJnZXRfZnJlcSwgcmVsYXRpb24pOwogCWlmIChjcHVfb25saW5lKHBvbGljeS0+Y3B1KSAmJiBjcHVmcmVxX2RyaXZlci0+dGFyZ2V0KQogCQlyZXR2YWwgPSBjcHVmcmVxX2RyaXZlci0+dGFyZ2V0KHBvbGljeSwgdGFyZ2V0X2ZyZXEsIHJlbGF0aW9uKTsKQEAgLTE1OTYsNyArMTUwNiw3IEBACiAJaWYgKCF0cnlfbW9kdWxlX2dldChwb2xpY3ktPmdvdmVybm9yLT5vd25lcikpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZHByaW50aygiX19jcHVmcmVxX2dvdmVybm9yIGZvciBDUFUgJXUsIGV2ZW50ICV1XG4iLAorCXByX2RlYnVnKCJfX2NwdWZyZXFfZ292ZXJub3IgZm9yIENQVSAldSwgZXZlbnQgJXVcbiIsCiAJCQkJCQlwb2xpY3ktPmNwdSwgZXZlbnQpOwogCXJldCA9IHBvbGljeS0+Z292ZXJub3ItPmdvdmVybm9yKHBvbGljeSwgZXZlbnQpOwogCkBAIC0xNjk3LDggKzE2MDcsNyBAQAogewogCWludCByZXQgPSAwOwogCi0JY3B1ZnJlcV9kZWJ1Z19kaXNhYmxlX3JhdGVsaW1pdCgpOwotCWRwcmludGsoInNldHRpbmcgbmV3IHBvbGljeSBmb3IgQ1BVICV1OiAldSAtICV1IGtIelxuIiwgcG9saWN5LT5jcHUsCisJcHJfZGVidWcoInNldHRpbmcgbmV3IHBvbGljeSBmb3IgQ1BVICV1OiAldSAtICV1IGtIelxuIiwgcG9saWN5LT5jcHUsCiAJCXBvbGljeS0+bWluLCBwb2xpY3ktPm1heCk7CiAKIAltZW1jcHkoJnBvbGljeS0+Y3B1aW5mbywgJmRhdGEtPmNwdWluZm8sCkBAIC0xNzM1LDE5ICsxNjQ0LDE5IEBACiAJZGF0YS0+bWluID0gcG9saWN5LT5taW47CiAJZGF0YS0+bWF4ID0gcG9saWN5LT5tYXg7CiAKLQlkcHJpbnRrKCJuZXcgbWluIGFuZCBtYXggZnJlcXMgYXJlICV1IC0gJXUga0h6XG4iLAorCXByX2RlYnVnKCJuZXcgbWluIGFuZCBtYXggZnJlcXMgYXJlICV1IC0gJXUga0h6XG4iLAogCQkJCQlkYXRhLT5taW4sIGRhdGEtPm1heCk7CiAKIAlpZiAoY3B1ZnJlcV9kcml2ZXItPnNldHBvbGljeSkgewogCQlkYXRhLT5wb2xpY3kgPSBwb2xpY3ktPnBvbGljeTsKLQkJZHByaW50aygic2V0dGluZyByYW5nZVxuIik7CisJCXByX2RlYnVnKCJzZXR0aW5nIHJhbmdlXG4iKTsKIAkJcmV0ID0gY3B1ZnJlcV9kcml2ZXItPnNldHBvbGljeShwb2xpY3kpOwogCX0gZWxzZSB7CiAJCWlmIChwb2xpY3ktPmdvdmVybm9yICE9IGRhdGEtPmdvdmVybm9yKSB7CiAJCQkvKiBzYXZlIG9sZCwgd29ya2luZyB2YWx1ZXMgKi8KIAkJCXN0cnVjdCBjcHVmcmVxX2dvdmVybm9yICpvbGRfZ292ID0gZGF0YS0+Z292ZXJub3I7CiAKLQkJCWRwcmludGsoImdvdmVybm9yIHN3aXRjaFxuIik7CisJCQlwcl9kZWJ1ZygiZ292ZXJub3Igc3dpdGNoXG4iKTsKIAogCQkJLyogZW5kIG9sZCBnb3Zlcm5vciAqLwogCQkJaWYgKGRhdGEtPmdvdmVybm9yKQpAQCAtMTc1Nyw3ICsxNjY2LDcgQEAKIAkJCWRhdGEtPmdvdmVybm9yID0gcG9saWN5LT5nb3Zlcm5vcjsKIAkJCWlmIChfX2NwdWZyZXFfZ292ZXJub3IoZGF0YSwgQ1BVRlJFUV9HT1ZfU1RBUlQpKSB7CiAJCQkJLyogbmV3IGdvdmVybm9yIGZhaWxlZCwgc28gcmUtc3RhcnQgb2xkIG9uZSAqLwotCQkJCWRwcmludGsoInN0YXJ0aW5nIGdvdmVybm9yICVzIGZhaWxlZFxuIiwKKwkJCQlwcl9kZWJ1Zygic3RhcnRpbmcgZ292ZXJub3IgJXMgZmFpbGVkXG4iLAogCQkJCQkJCWRhdGEtPmdvdmVybm9yLT5uYW1lKTsKIAkJCQlpZiAob2xkX2dvdikgewogCQkJCQlkYXRhLT5nb3Zlcm5vciA9IG9sZF9nb3Y7CkBAIC0xNzY5LDEyICsxNjc4LDExIEBACiAJCQl9CiAJCQkvKiBtaWdodCBiZSBhIHBvbGljeSBjaGFuZ2UsIHRvbywgc28gZmFsbCB0aHJvdWdoICovCiAJCX0KLQkJZHByaW50aygiZ292ZXJub3I6IGNoYW5nZSBvciB1cGRhdGUgbGltaXRzXG4iKTsKKwkJcHJfZGVidWcoImdvdmVybm9yOiBjaGFuZ2Ugb3IgdXBkYXRlIGxpbWl0c1xuIik7CiAJCV9fY3B1ZnJlcV9nb3Zlcm5vcihkYXRhLCBDUFVGUkVRX0dPVl9MSU1JVFMpOwogCX0KIAogZXJyb3Jfb3V0OgotCWNwdWZyZXFfZGVidWdfZW5hYmxlX3JhdGVsaW1pdCgpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE4MDEsNyArMTcwOSw3IEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKLQlkcHJpbnRrKCJ1cGRhdGluZyBwb2xpY3kgZm9yIENQVSAldVxuIiwgY3B1KTsKKwlwcl9kZWJ1ZygidXBkYXRpbmcgcG9saWN5IGZvciBDUFUgJXVcbiIsIGNwdSk7CiAJbWVtY3B5KCZwb2xpY3ksIGRhdGEsIHNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kpKTsKIAlwb2xpY3kubWluID0gZGF0YS0+dXNlcl9wb2xpY3kubWluOwogCXBvbGljeS5tYXggPSBkYXRhLT51c2VyX3BvbGljeS5tYXg7CkBAIC0xODEzLDcgKzE3MjEsNyBAQAogCWlmIChjcHVmcmVxX2RyaXZlci0+Z2V0KSB7CiAJCXBvbGljeS5jdXIgPSBjcHVmcmVxX2RyaXZlci0+Z2V0KGNwdSk7CiAJCWlmICghZGF0YS0+Y3VyKSB7Ci0JCQlkcHJpbnRrKCJEcml2ZXIgZGlkIG5vdCBpbml0aWFsaXplIGN1cnJlbnQgZnJlcSIpOworCQkJcHJfZGVidWcoIkRyaXZlciBkaWQgbm90IGluaXRpYWxpemUgY3VycmVudCBmcmVxIik7CiAJCQlkYXRhLT5jdXIgPSBwb2xpY3kuY3VyOwogCQl9IGVsc2UgewogCQkJaWYgKGRhdGEtPmN1ciAhPSBwb2xpY3kuY3VyKQpAQCAtMTg4OSw3ICsxNzk3LDcgQEAKIAkgICAgKCghZHJpdmVyX2RhdGEtPnNldHBvbGljeSkgJiYgKCFkcml2ZXJfZGF0YS0+dGFyZ2V0KSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZHByaW50aygidHJ5aW5nIHRvIHJlZ2lzdGVyIGRyaXZlciAlc1xuIiwgZHJpdmVyX2RhdGEtPm5hbWUpOworCXByX2RlYnVnKCJ0cnlpbmcgdG8gcmVnaXN0ZXIgZHJpdmVyICVzXG4iLCBkcml2ZXJfZGF0YS0+bmFtZSk7CiAKIAlpZiAoZHJpdmVyX2RhdGEtPnNldHBvbGljeSkKIAkJZHJpdmVyX2RhdGEtPmZsYWdzIHw9IENQVUZSRVFfQ09OU1RfTE9PUFM7CkBAIC0xOTIwLDE1ICsxODI4LDE0IEBACiAKIAkJLyogaWYgYWxsIC0+aW5pdCgpIGNhbGxzIGZhaWxlZCwgdW5yZWdpc3RlciAqLwogCQlpZiAocmV0KSB7Ci0JCQlkcHJpbnRrKCJubyBDUFUgaW5pdGlhbGl6ZWQgZm9yIGRyaXZlciAlc1xuIiwKKwkJCXByX2RlYnVnKCJubyBDUFUgaW5pdGlhbGl6ZWQgZm9yIGRyaXZlciAlc1xuIiwKIAkJCQkJCQlkcml2ZXJfZGF0YS0+bmFtZSk7CiAJCQlnb3RvIGVycl9zeXNkZXZfdW5yZWc7CiAJCX0KIAl9CiAKIAlyZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJmNwdWZyZXFfY3B1X25vdGlmaWVyKTsKLQlkcHJpbnRrKCJkcml2ZXIgJXMgdXAgYW5kIHJ1bm5pbmdcbiIsIGRyaXZlcl9kYXRhLT5uYW1lKTsKLQljcHVmcmVxX2RlYnVnX2VuYWJsZV9yYXRlbGltaXQoKTsKKwlwcl9kZWJ1ZygiZHJpdmVyICVzIHVwIGFuZCBydW5uaW5nXG4iLCBkcml2ZXJfZGF0YS0+bmFtZSk7CiAKIAlyZXR1cm4gMDsKIGVycl9zeXNkZXZfdW5yZWc6CkBAIC0xOTU1LDE0ICsxODYyLDEwIEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWNwdWZyZXFfZGVidWdfZGlzYWJsZV9yYXRlbGltaXQoKTsKLQotCWlmICghY3B1ZnJlcV9kcml2ZXIgfHwgKGRyaXZlciAhPSBjcHVmcmVxX2RyaXZlcikpIHsKLQkJY3B1ZnJlcV9kZWJ1Z19lbmFibGVfcmF0ZWxpbWl0KCk7CisJaWYgKCFjcHVmcmVxX2RyaXZlciB8fCAoZHJpdmVyICE9IGNwdWZyZXFfZHJpdmVyKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCi0JZHByaW50aygidW5yZWdpc3RlcmluZyBkcml2ZXIgJXNcbiIsIGRyaXZlci0+bmFtZSk7CisJcHJfZGVidWcoInVucmVnaXN0ZXJpbmcgZHJpdmVyICVzXG4iLCBkcml2ZXItPm5hbWUpOwogCiAJc3lzZGV2X2RyaXZlcl91bnJlZ2lzdGVyKCZjcHVfc3lzZGV2X2NsYXNzLCAmY3B1ZnJlcV9zeXNkZXZfZHJpdmVyKTsKIAl1bnJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmY3B1ZnJlcV9jcHVfbm90aWZpZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfcGVyZm9ybWFuY2UuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3BlcmZvcm1hbmNlLmMKaW5kZXggN2UyZTUxNTAuLmYxM2E4YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3BlcmZvcm1hbmNlLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfcGVyZm9ybWFuY2UuYwpAQCAtMTUsOSArMTUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKLSNkZWZpbmUgZHByaW50ayhtc2cuLi4pIFwKLQljcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0dPVkVSTk9SLCAicGVyZm9ybWFuY2UiLCBtc2cpCi0KIAogc3RhdGljIGludCBjcHVmcmVxX2dvdmVybm9yX3BlcmZvcm1hbmNlKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAogCQkJCQl1bnNpZ25lZCBpbnQgZXZlbnQpCkBAIC0yNSw3ICsyMiw3IEBACiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgQ1BVRlJFUV9HT1ZfU1RBUlQ6CiAJY2FzZSBDUFVGUkVRX0dPVl9MSU1JVFM6Ci0JCWRwcmludGsoInNldHRpbmcgdG8gJXUga0h6IGJlY2F1c2Ugb2YgZXZlbnQgJXVcbiIsCisJCXByX2RlYnVnKCJzZXR0aW5nIHRvICV1IGtIeiBiZWNhdXNlIG9mIGV2ZW50ICV1XG4iLAogCQkJCQkJcG9saWN5LT5tYXgsIGV2ZW50KTsKIAkJX19jcHVmcmVxX2RyaXZlcl90YXJnZXQocG9saWN5LCBwb2xpY3ktPm1heCwKIAkJCQkJCUNQVUZSRVFfUkVMQVRJT05fSCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9wb3dlcnNhdmUuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3Bvd2Vyc2F2ZS5jCmluZGV4IGU2ZGI1ZmEuLjRjMmViNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3Bvd2Vyc2F2ZS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3Bvd2Vyc2F2ZS5jCkBAIC0xNSwxNiArMTUsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCi0jZGVmaW5lIGRwcmludGsobXNnLi4uKSBcCi0JY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19HT1ZFUk5PUiwgInBvd2Vyc2F2ZSIsIG1zZykKLQogc3RhdGljIGludCBjcHVmcmVxX2dvdmVybm9yX3Bvd2Vyc2F2ZShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKIAkJCQkJdW5zaWduZWQgaW50IGV2ZW50KQogewogCXN3aXRjaCAoZXZlbnQpIHsKIAljYXNlIENQVUZSRVFfR09WX1NUQVJUOgogCWNhc2UgQ1BVRlJFUV9HT1ZfTElNSVRTOgotCQlkcHJpbnRrKCJzZXR0aW5nIHRvICV1IGtIeiBiZWNhdXNlIG9mIGV2ZW50ICV1XG4iLAorCQlwcl9kZWJ1Zygic2V0dGluZyB0byAldSBrSHogYmVjYXVzZSBvZiBldmVudCAldVxuIiwKIAkJCQkJCQlwb2xpY3ktPm1pbiwgZXZlbnQpOwogCQlfX2NwdWZyZXFfZHJpdmVyX3RhcmdldChwb2xpY3ksIHBvbGljeS0+bWluLAogCQkJCQkJQ1BVRlJFUV9SRUxBVElPTl9MKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3N0YXRzLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9zdGF0cy5jCmluZGV4IDAwZDczZmMuLmI2MGE0YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3N0YXRzLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfc3RhdHMuYwpAQCAtMTY1LDE3ICsxNjUsMjcgQEAKIAlyZXR1cm4gLTE7CiB9CiAKKy8qIHNob3VsZCBiZSBjYWxsZWQgbGF0ZSBpbiB0aGUgQ1BVIHJlbW92YWwgc2VxdWVuY2Ugc28gdGhhdCB0aGUgc3RhdHMKKyAqIG1lbW9yeSBpcyBzdGlsbCBhdmFpbGFibGUgaW4gY2FzZSBzb21lb25lIHRyaWVzIHRvIHVzZSBpdC4KKyAqLwogc3RhdGljIHZvaWQgY3B1ZnJlcV9zdGF0c19mcmVlX3RhYmxlKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJc3RydWN0IGNwdWZyZXFfc3RhdHMgKnN0YXQgPSBwZXJfY3B1KGNwdWZyZXFfc3RhdHNfdGFibGUsIGNwdSk7Ci0Jc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kgPSBjcHVmcmVxX2NwdV9nZXQoY3B1KTsKLQlpZiAocG9saWN5ICYmIHBvbGljeS0+Y3B1ID09IGNwdSkKLQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwb2xpY3ktPmtvYmosICZzdGF0c19hdHRyX2dyb3VwKTsKIAlpZiAoc3RhdCkgewogCQlrZnJlZShzdGF0LT50aW1lX2luX3N0YXRlKTsKIAkJa2ZyZWUoc3RhdCk7CiAJfQogCXBlcl9jcHUoY3B1ZnJlcV9zdGF0c190YWJsZSwgY3B1KSA9IE5VTEw7Cit9CisKKy8qIG11c3QgYmUgY2FsbGVkIGVhcmx5IGluIHRoZSBDUFUgcmVtb3ZhbCBzZXF1ZW5jZSAoYmVmb3JlCisgKiBjcHVmcmVxX3JlbW92ZV9kZXYpIHNvIHRoYXQgcG9saWN5IGlzIHN0aWxsIHZhbGlkLgorICovCitzdGF0aWMgdm9pZCBjcHVmcmVxX3N0YXRzX2ZyZWVfc3lzZnModW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSA9IGNwdWZyZXFfY3B1X2dldChjcHUpOworCWlmIChwb2xpY3kgJiYgcG9saWN5LT5jcHUgPT0gY3B1KQorCQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBvbGljeS0+a29iaiwgJnN0YXRzX2F0dHJfZ3JvdXApOwogCWlmIChwb2xpY3kpCiAJCWNwdWZyZXFfY3B1X3B1dChwb2xpY3kpOwogfQpAQCAtMzE2LDYgKzMyNiw5IEBACiAJY2FzZSBDUFVfT05MSU5FX0ZST1pFTjoKIAkJY3B1ZnJlcV91cGRhdGVfcG9saWN5KGNwdSk7CiAJCWJyZWFrOworCWNhc2UgQ1BVX0RPV05fUFJFUEFSRToKKwkJY3B1ZnJlcV9zdGF0c19mcmVlX3N5c2ZzKGNwdSk7CisJCWJyZWFrOwogCWNhc2UgQ1BVX0RFQUQ6CiAJY2FzZSBDUFVfREVBRF9GUk9aRU46CiAJCWNwdWZyZXFfc3RhdHNfZnJlZV90YWJsZShjcHUpOwpAQCAtMzI0LDkgKzMzNywxMCBAQAogCXJldHVybiBOT1RJRllfT0s7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgY3B1ZnJlcV9zdGF0X2NwdV9ub3RpZmllciBfX3JlZmRhdGEgPQoteworLyogcHJpb3JpdHk9MSBzbyB0aGlzIHdpbGwgZ2V0IGNhbGxlZCBiZWZvcmUgY3B1ZnJlcV9yZW1vdmVfZGV2ICovCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGNwdWZyZXFfc3RhdF9jcHVfbm90aWZpZXIgX19yZWZkYXRhID0gewogCS5ub3RpZmllcl9jYWxsID0gY3B1ZnJlcV9zdGF0X2NwdV9jYWxsYmFjaywKKwkucHJpb3JpdHkgPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBub3RpZmllcl9wb2xpY3lfYmxvY2sgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV91c2Vyc3BhY2UuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3VzZXJzcGFjZS5jCmluZGV4IDY2ZDJkMWQuLmYyMzEwMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3VzZXJzcGFjZS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3VzZXJzcGFjZS5jCkBAIC0zNyw5ICszNyw2IEBACiBzdGF0aWMgREVGSU5FX01VVEVYKHVzZXJzcGFjZV9tdXRleCk7CiBzdGF0aWMgaW50IGNwdXNfdXNpbmdfdXNlcnNwYWNlX2dvdmVybm9yOwogCi0jZGVmaW5lIGRwcmludGsobXNnLi4uKSBcCi0JY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19HT1ZFUk5PUiwgInVzZXJzcGFjZSIsIG1zZykKLQogLyoga2VlcCB0cmFjayBvZiBmcmVxdWVuY3kgdHJhbnNpdGlvbnMgKi8KIHN0YXRpYyBpbnQKIHVzZXJzcGFjZV9jcHVmcmVxX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgdmFsLApAQCAtNTAsNyArNDcsNyBAQAogCWlmICghcGVyX2NwdShjcHVfaXNfbWFuYWdlZCwgZnJlcS0+Y3B1KSkKIAkJcmV0dXJuIDA7CiAKLQlkcHJpbnRrKCJzYXZpbmcgY3B1X2N1cl9mcmVxIG9mIGNwdSAldSB0byBiZSAldSBrSHpcbiIsCisJcHJfZGVidWcoInNhdmluZyBjcHVfY3VyX2ZyZXEgb2YgY3B1ICV1IHRvIGJlICV1IGtIelxuIiwKIAkJCWZyZXEtPmNwdSwgZnJlcS0+bmV3KTsKIAlwZXJfY3B1KGNwdV9jdXJfZnJlcSwgZnJlcS0+Y3B1KSA9IGZyZXEtPm5ldzsKIApAQCAtNzMsNyArNzAsNyBAQAogewogCWludCByZXQgPSAtRUlOVkFMOwogCi0JZHByaW50aygiY3B1ZnJlcV9zZXQgZm9yIGNwdSAldSwgZnJlcSAldSBrSHpcbiIsIHBvbGljeS0+Y3B1LCBmcmVxKTsKKwlwcl9kZWJ1ZygiY3B1ZnJlcV9zZXQgZm9yIGNwdSAldSwgZnJlcSAldSBrSHpcbiIsIHBvbGljeS0+Y3B1LCBmcmVxKTsKIAogCW11dGV4X2xvY2soJnVzZXJzcGFjZV9tdXRleCk7CiAJaWYgKCFwZXJfY3B1KGNwdV9pc19tYW5hZ2VkLCBwb2xpY3ktPmNwdSkpCkBAIC0xMzQsNyArMTMxLDcgQEAKIAkJcGVyX2NwdShjcHVfbWF4X2ZyZXEsIGNwdSkgPSBwb2xpY3ktPm1heDsKIAkJcGVyX2NwdShjcHVfY3VyX2ZyZXEsIGNwdSkgPSBwb2xpY3ktPmN1cjsKIAkJcGVyX2NwdShjcHVfc2V0X2ZyZXEsIGNwdSkgPSBwb2xpY3ktPmN1cjsKLQkJZHByaW50aygibWFuYWdpbmcgY3B1ICV1IHN0YXJ0ZWQgIgorCQlwcl9kZWJ1ZygibWFuYWdpbmcgY3B1ICV1IHN0YXJ0ZWQgIgogCQkJIigldSAtICV1IGtIeiwgY3VycmVudGx5ICV1IGtIeilcbiIsCiAJCQkJY3B1LAogCQkJCXBlcl9jcHUoY3B1X21pbl9mcmVxLCBjcHUpLApAQCAtMTU2LDEyICsxNTMsMTIgQEAKIAkJcGVyX2NwdShjcHVfbWluX2ZyZXEsIGNwdSkgPSAwOwogCQlwZXJfY3B1KGNwdV9tYXhfZnJlcSwgY3B1KSA9IDA7CiAJCXBlcl9jcHUoY3B1X3NldF9mcmVxLCBjcHUpID0gMDsKLQkJZHByaW50aygibWFuYWdpbmcgY3B1ICV1IHN0b3BwZWRcbiIsIGNwdSk7CisJCXByX2RlYnVnKCJtYW5hZ2luZyBjcHUgJXUgc3RvcHBlZFxuIiwgY3B1KTsKIAkJbXV0ZXhfdW5sb2NrKCZ1c2Vyc3BhY2VfbXV0ZXgpOwogCQlicmVhazsKIAljYXNlIENQVUZSRVFfR09WX0xJTUlUUzoKIAkJbXV0ZXhfbG9jaygmdXNlcnNwYWNlX211dGV4KTsKLQkJZHByaW50aygibGltaXQgZXZlbnQgZm9yIGNwdSAldTogJXUgLSAldSBrSHosICIKKwkJcHJfZGVidWcoImxpbWl0IGV2ZW50IGZvciBjcHUgJXU6ICV1IC0gJXUga0h6LCAiCiAJCQkiY3VycmVudGx5ICV1IGtIeiwgbGFzdCBzZXQgdG8gJXUga0h6XG4iLAogCQkJY3B1LCBwb2xpY3ktPm1pbiwgcG9saWN5LT5tYXgsCiAJCQlwZXJfY3B1KGNwdV9jdXJfZnJlcSwgY3B1KSwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9lX3Bvd2Vyc2F2ZXIuYyBiL2RyaXZlcnMvY3B1ZnJlcS9lX3Bvd2Vyc2F2ZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2VfcG93ZXJzYXZlci5jCnJlbmFtZSB0byBkcml2ZXJzL2NwdWZyZXEvZV9wb3dlcnNhdmVyLmMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9lbGFuZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL2VsYW5mcmVxLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9lbGFuZnJlcS5jCnJlbmFtZSB0byBkcml2ZXJzL2NwdWZyZXEvZWxhbmZyZXEuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2ZyZXFfdGFibGUuYyBiL2RyaXZlcnMvY3B1ZnJlcS9mcmVxX3RhYmxlLmMKaW5kZXggMDU0MzIyMS4uOTA0MzFjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2ZyZXFfdGFibGUuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvZnJlcV90YWJsZS5jCkBAIC0xNCw5ICsxNCw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KIAotI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgXAotCWNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfQ09SRSwgImZyZXEtdGFibGUiLCBtc2cpCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICAgICAgRlJFUVVFTkNZIFRBQkxFIEhFTFBFUlMgICAgICAgICAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zMSwxMSArMjgsMTEgQEAKIAlmb3IgKGkgPSAwOyAodGFibGVbaV0uZnJlcXVlbmN5ICE9IENQVUZSRVFfVEFCTEVfRU5EKTsgaSsrKSB7CiAJCXVuc2lnbmVkIGludCBmcmVxID0gdGFibGVbaV0uZnJlcXVlbmN5OwogCQlpZiAoZnJlcSA9PSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQpIHsKLQkJCWRwcmludGsoInRhYmxlIGVudHJ5ICV1IGlzIGludmFsaWQsIHNraXBwaW5nXG4iLCBpKTsKKwkJCXByX2RlYnVnKCJ0YWJsZSBlbnRyeSAldSBpcyBpbnZhbGlkLCBza2lwcGluZ1xuIiwgaSk7CiAKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWRwcmludGsoInRhYmxlIGVudHJ5ICV1OiAldSBrSHosICV1IGluZGV4XG4iLAorCQlwcl9kZWJ1ZygidGFibGUgZW50cnkgJXU6ICV1IGtIeiwgJXUgaW5kZXhcbiIsCiAJCQkJCWksIGZyZXEsIHRhYmxlW2ldLmluZGV4KTsKIAkJaWYgKGZyZXEgPCBtaW5fZnJlcSkKIAkJCW1pbl9mcmVxID0gZnJlcTsKQEAgLTYxLDcgKzU4LDcgQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwogCi0JZHByaW50aygicmVxdWVzdCBmb3IgdmVyaWZpY2F0aW9uIG9mIHBvbGljeSAoJXUgLSAldSBrSHopIGZvciBjcHUgJXVcbiIsCisJcHJfZGVidWcoInJlcXVlc3QgZm9yIHZlcmlmaWNhdGlvbiBvZiBwb2xpY3kgKCV1IC0gJXUga0h6KSBmb3IgY3B1ICV1XG4iLAogCQkJCQlwb2xpY3ktPm1pbiwgcG9saWN5LT5tYXgsIHBvbGljeS0+Y3B1KTsKIAogCWlmICghY3B1X29ubGluZShwb2xpY3ktPmNwdSkpCkBAIC04Niw3ICs4Myw3IEBACiAJY3B1ZnJlcV92ZXJpZnlfd2l0aGluX2xpbWl0cyhwb2xpY3ksIHBvbGljeS0+Y3B1aW5mby5taW5fZnJlcSwKIAkJCQkgICAgIHBvbGljeS0+Y3B1aW5mby5tYXhfZnJlcSk7CiAKLQlkcHJpbnRrKCJ2ZXJpZmljYXRpb24gbGVhZCB0byAoJXUgLSAldSBrSHopIGZvciBjcHUgJXVcbiIsCisJcHJfZGVidWcoInZlcmlmaWNhdGlvbiBsZWFkIHRvICgldSAtICV1IGtIeikgZm9yIGNwdSAldVxuIiwKIAkJCQlwb2xpY3ktPm1pbiwgcG9saWN5LT5tYXgsIHBvbGljeS0+Y3B1KTsKIAogCXJldHVybiAwOwpAQCAtMTEwLDcgKzEwNyw3IEBACiAJfTsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCWRwcmludGsoInJlcXVlc3QgZm9yIHRhcmdldCAldSBrSHogKHJlbGF0aW9uOiAldSkgZm9yIGNwdSAldVxuIiwKKwlwcl9kZWJ1ZygicmVxdWVzdCBmb3IgdGFyZ2V0ICV1IGtIeiAocmVsYXRpb246ICV1KSBmb3IgY3B1ICV1XG4iLAogCQkJCQl0YXJnZXRfZnJlcSwgcmVsYXRpb24sIHBvbGljeS0+Y3B1KTsKIAogCXN3aXRjaCAocmVsYXRpb24pIHsKQEAgLTE2Nyw3ICsxNjQsNyBAQAogCX0gZWxzZQogCQkqaW5kZXggPSBvcHRpbWFsLmluZGV4OwogCi0JZHByaW50aygidGFyZ2V0IGlzICV1ICgldSBrSHosICV1KVxuIiwgKmluZGV4LCB0YWJsZVsqaW5kZXhdLmZyZXF1ZW5jeSwKKwlwcl9kZWJ1ZygidGFyZ2V0IGlzICV1ICgldSBrSHosICV1KVxuIiwgKmluZGV4LCB0YWJsZVsqaW5kZXhdLmZyZXF1ZW5jeSwKIAkJdGFibGVbKmluZGV4XS5pbmRleCk7CiAKIAlyZXR1cm4gMDsKQEAgLTIxNiwxNCArMjEzLDE0IEBACiB2b2lkIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9hdHRyKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqdGFibGUsCiAJCQkJICAgICAgdW5zaWduZWQgaW50IGNwdSkKIHsKLQlkcHJpbnRrKCJzZXR0aW5nIHNob3dfdGFibGUgZm9yIGNwdSAldSB0byAlcFxuIiwgY3B1LCB0YWJsZSk7CisJcHJfZGVidWcoInNldHRpbmcgc2hvd190YWJsZSBmb3IgY3B1ICV1IHRvICVwXG4iLCBjcHUsIHRhYmxlKTsKIAlwZXJfY3B1KGNwdWZyZXFfc2hvd190YWJsZSwgY3B1KSA9IHRhYmxlOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIpOwogCiB2b2lkIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0JZHByaW50aygiY2xlYXJpbmcgc2hvd190YWJsZSBmb3IgY3B1ICV1XG4iLCBjcHUpOworCXByX2RlYnVnKCJjbGVhcmluZyBzaG93X3RhYmxlIGZvciBjcHUgJXVcbiIsIGNwdSk7CiAJcGVyX2NwdShjcHVmcmVxX3Nob3dfdGFibGUsIGNwdSkgPSBOVUxMOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2d4LXN1c3Btb2QuYyBiL2RyaXZlcnMvY3B1ZnJlcS9neC1zdXNwbW9kLmMKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2d4LXN1c3Btb2QuYwpyZW5hbWUgdG8gZHJpdmVycy9jcHVmcmVxL2d4LXN1c3Btb2QuYwppbmRleCAzMjk3NGNmLi5mZmUxZjJjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvZ3gtc3VzcG1vZC5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9neC1zdXNwbW9kLmMKQEAgLTE0Miw5ICsxNDIsNiBAQAogI2RlZmluZSBQT0xJQ1lfTUlOX0RJViAyMAogCiAKLSNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCBcCi0JCSJneC1zdXNwbW9kIiwgbXNnKQotCiAvKioKICAqIHdlIGNhbiBkZXRlY3QgYSBjb3JlIG11bHRpcGlsZXIgZnJvbSBkaXIwX2xzYgogICogZnJvbSBHWDEgZGF0YXNoZWV0IHAuNTYsCkBAIC0xOTEsNyArMTg4LDcgQEAKIAkvKiBjaGVjayBpZiBDUFUgaXMgYSBNZWRpYUdYIG9yIGEgR2VvZGUuICovCiAJaWYgKChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9OU0MpICYmCiAJICAgIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9DWVJJWCkpIHsKLQkJZHByaW50aygiZXJyb3I6IG5vIE1lZGlhR1gvR2VvZGUgcHJvY2Vzc29yIGZvdW5kIVxuIik7CisJCXByX2RlYnVnKCJlcnJvcjogbm8gTWVkaWFHWC9HZW9kZSBwcm9jZXNzb3IgZm91bmQhXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0yMDEsNyArMTk4LDcgQEAKIAkJCXJldHVybiBneF9wY2k7CiAJfQogCi0JZHByaW50aygiZXJyb3I6IG5vIHN1cHBvcnRlZCBjaGlwc2V0IGZvdW5kIVxuIik7CisJcHJfZGVidWcoImVycm9yOiBubyBzdXBwb3J0ZWQgY2hpcHNldCBmb3VuZCFcbiIpOwogCXJldHVybiBOVUxMOwogfQogCkBAIC0zMDUsMTQgKzMwMiwxNCBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCQlkcHJpbnRrKCJmYXRhbDogdHJ5IHRvIHNldCB1bmtub3duIGNoaXBzZXQuXG4iKTsKKwkJCXByX2RlYnVnKCJmYXRhbDogdHJ5IHRvIHNldCB1bmtub3duIGNoaXBzZXQuXG4iKTsKIAkJCXJldHVybjsKIAkJfQogCX0gZWxzZSB7CiAJCXN1c2NmZyA9IGd4X3BhcmFtcy0+cGNpX3N1c2NmZyAmIH4oU1VTTU9EKTsKIAkJZ3hfcGFyYW1zLT5vZmZfZHVyYXRpb24gPSAwOwogCQlneF9wYXJhbXMtPm9uX2R1cmF0aW9uID0gMDsKLQkJZHByaW50aygic3VzcGVuZCBtb2R1bGF0aW9uIGRpc2FibGVkOiBjcHUgcnVucyAxMDAlJSBzcGVlZC5cbiIpOworCQlwcl9kZWJ1Zygic3VzcGVuZCBtb2R1bGF0aW9uIGRpc2FibGVkOiBjcHUgcnVucyAxMDAlJSBzcGVlZC5cbiIpOwogCX0KIAogCWd4X3dyaXRlX2J5dGUoUENJX01PRE9GRiwgZ3hfcGFyYW1zLT5vZmZfZHVyYXRpb24pOwpAQCAtMzI3LDkgKzMyNCw5IEBACiAKIAljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QT1NUQ0hBTkdFKTsKIAotCWRwcmludGsoInN1c3BlbmQgbW9kdWxhdGlvbiB3LyBkdXJhdGlvbiBvZiBPTjolZCB1cywgT0ZGOiVkIHVzXG4iLAorCXByX2RlYnVnKCJzdXNwZW5kIG1vZHVsYXRpb24gdy8gZHVyYXRpb24gb2YgT046JWQgdXMsIE9GRjolZCB1c1xuIiwKIAkJZ3hfcGFyYW1zLT5vbl9kdXJhdGlvbiAqIDMyLCBneF9wYXJhbXMtPm9mZl9kdXJhdGlvbiAqIDMyKTsKLQlkcHJpbnRrKCJzdXNwZW5kIG1vZHVsYXRpb24gdy8gY2xvY2sgc3BlZWQ6ICVkIGtIei5cbiIsIGZyZXFzLm5ldyk7CisJcHJfZGVidWcoInN1c3BlbmQgbW9kdWxhdGlvbiB3LyBjbG9jayBzcGVlZDogJWQga0h6LlxuIiwgZnJlcXMubmV3KTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQyOCw4ICs0MjUsOCBAQAogCXN0b2NrX2ZyZXEgPSBtYXhmcmVxOwogCWN1cmZyZXEgPSBneF9nZXRfY3B1c3BlZWQoMCk7CiAKLQlkcHJpbnRrKCJjcHUgbWF4IGZyZXF1ZW5jeSBpcyAlZC5cbiIsIG1heGZyZXEpOwotCWRwcmludGsoImNwdSBjdXJyZW50IGZyZXF1ZW5jeSBpcyAlZGtIei5cbiIsIGN1cmZyZXEpOworCXByX2RlYnVnKCJjcHUgbWF4IGZyZXF1ZW5jeSBpcyAlZC5cbiIsIG1heGZyZXEpOworCXByX2RlYnVnKCJjcHUgY3VycmVudCBmcmVxdWVuY3kgaXMgJWRrSHouXG4iLCBjdXJmcmVxKTsKIAogCS8qIHNldHVwIGJhc2ljIHN0cnVjdCBmb3IgY3B1ZnJlcSBBUEkgKi8KIAlwb2xpY3ktPmNwdSA9IDA7CkBAIC00NzUsNyArNDcyLDcgQEAKIAlpZiAobWF4X2R1cmF0aW9uID4gMHhmZikKIAkJbWF4X2R1cmF0aW9uID0gMHhmZjsKIAotCWRwcmludGsoImdlb2RlIHN1c3BlbmQgbW9kdWxhdGlvbiBhdmFpbGFibGUuXG4iKTsKKwlwcl9kZWJ1ZygiZ2VvZGUgc3VzcGVuZCBtb2R1bGF0aW9uIGF2YWlsYWJsZS5cbiIpOwogCiAJcGFyYW1zID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGd4ZnJlcV9wYXJhbXMpLCBHRlBfS0VSTkVMKTsKIAlpZiAocGFyYW1zID09IE5VTEwpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYyBiL2RyaXZlcnMvY3B1ZnJlcS9sb25naGF1bC5jCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIGFyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5jCnJlbmFtZSB0byBkcml2ZXJzL2NwdWZyZXEvbG9uZ2hhdWwuYwppbmRleCBjZjQ4Y2RkLi5mNDdkMjZlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvbG9uZ2hhdWwuYwpAQCAtNzcsOSArNzcsNiBAQAogc3RhdGljIGludCBkaXNhYmxlX2FjcGlfYzM7CiBzdGF0aWMgaW50IHJldmlkX2VycmF0YTsKIAotI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsIFwKLQkJImxvbmdoYXVsIiwgbXNnKQotCiAKIC8qIENsb2NrIHJhdGlvcyBtdWx0aXBsaWVkIGJ5IDEwICovCiBzdGF0aWMgaW50IG11bHRzWzMyXTsKQEAgLTg3LDcgKzg0LDYgQEAKIHN0YXRpYyBpbnQgbG9uZ2hhdWxfdmVyc2lvbjsKIHN0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKmxvbmdoYXVsX3RhYmxlOwogCi0jaWZkZWYgQ09ORklHX0NQVV9GUkVRX0RFQlVHCiBzdGF0aWMgY2hhciBzcGVlZGJ1ZmZlcls4XTsKIAogc3RhdGljIGNoYXIgKnByaW50X3NwZWVkKGludCBzcGVlZCkKQEAgLTEwNiw3ICsxMDIsNiBAQAogCiAJcmV0dXJuIHNwZWVkYnVmZmVyOwogfQotI2VuZGlmCiAKIAogc3RhdGljIHVuc2lnbmVkIGludCBjYWxjX3NwZWVkKGludCBtdWx0KQpAQCAtMjc1LDcgKzI3MCw3IEBACiAKIAljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOwogCi0JZHByaW50aygiU2V0dGluZyB0byBGU0I6JWRNSHogTXVsdDolZC4lZHggKCVzKVxuIiwKKwlwcl9kZWJ1ZygiU2V0dGluZyB0byBGU0I6JWRNSHogTXVsdDolZC4lZHggKCVzKVxuIiwKIAkJCWZzYiwgbXVsdC8xMCwgbXVsdCUxMCwgcHJpbnRfc3BlZWQoc3BlZWQvMTAwMCkpOwogcmV0cnlfbG9vcDoKIAlwcmVlbXB0X2Rpc2FibGUoKTsKQEAgLTQ2MCwxMiArNDU1LDEyIEBACiAJCWJyZWFrOwogCX0KIAotCWRwcmludGsoIk1pbk11bHQ6JWQuJWR4IE1heE11bHQ6JWQuJWR4XG4iLAorCXByX2RlYnVnKCJNaW5NdWx0OiVkLiVkeCBNYXhNdWx0OiVkLiVkeFxuIiwKIAkJIG1pbm11bHQvMTAsIG1pbm11bHQlMTAsIG1heG11bHQvMTAsIG1heG11bHQlMTApOwogCiAJaGlnaGVzdF9zcGVlZCA9IGNhbGNfc3BlZWQobWF4bXVsdCk7CiAJbG93ZXN0X3NwZWVkID0gY2FsY19zcGVlZChtaW5tdWx0KTsKLQlkcHJpbnRrKCJGU0I6JWRNSHogIExvd2VzdCBzcGVlZDogJXMgICBIaWdoZXN0IHNwZWVkOiVzXG4iLCBmc2IsCisJcHJfZGVidWcoIkZTQjolZE1IeiAgTG93ZXN0IHNwZWVkOiAlcyAgIEhpZ2hlc3Qgc3BlZWQ6JXNcbiIsIGZzYiwKIAkJIHByaW50X3NwZWVkKGxvd2VzdF9zcGVlZC8xMDAwKSwKIAkJIHByaW50X3NwZWVkKGhpZ2hlc3Rfc3BlZWQvMTAwMCkpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuaCBiL2RyaXZlcnMvY3B1ZnJlcS9sb25naGF1bC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuaApyZW5hbWUgdG8gZHJpdmVycy9jcHVmcmVxL2xvbmdoYXVsLmgKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25ncnVuLmMgYi9kcml2ZXJzL2NwdWZyZXEvbG9uZ3J1bi5jCnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIGFyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25ncnVuLmMKcmVuYW1lIHRvIGRyaXZlcnMvY3B1ZnJlcS9sb25ncnVuLmMKaW5kZXggZDlmNTEzNi4uMzRlYTM1OSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdydW4uYworKysgYi9kcml2ZXJzL2NwdWZyZXEvbG9uZ3J1bi5jCkBAIC0xNSw5ICsxNSw2IEBACiAjaW5jbHVkZSA8YXNtL21zci5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KIAotI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsIFwKLQkJImxvbmdydW4iLCBtc2cpCi0KIHN0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIJbG9uZ3J1bl9kcml2ZXI7CiAKIC8qKgpAQCAtNDAsMTQgKzM3LDE0IEBACiAJdTMyIG1zcl9sbywgbXNyX2hpOwogCiAJcmRtc3IoTVNSX1RNVEFfTE9OR1JVTl9GTEFHUywgbXNyX2xvLCBtc3JfaGkpOwotCWRwcmludGsoImxvbmdydW4gZmxhZ3MgYXJlICV4IC0gJXhcbiIsIG1zcl9sbywgbXNyX2hpKTsKKwlwcl9kZWJ1ZygibG9uZ3J1biBmbGFncyBhcmUgJXggLSAleFxuIiwgbXNyX2xvLCBtc3JfaGkpOwogCWlmIChtc3JfbG8gJiAweDAxKQogCQlwb2xpY3ktPnBvbGljeSA9IENQVUZSRVFfUE9MSUNZX1BFUkZPUk1BTkNFOwogCWVsc2UKIAkJcG9saWN5LT5wb2xpY3kgPSBDUFVGUkVRX1BPTElDWV9QT1dFUlNBVkU7CiAKIAlyZG1zcihNU1JfVE1UQV9MT05HUlVOX0NUUkwsIG1zcl9sbywgbXNyX2hpKTsKLQlkcHJpbnRrKCJsb25ncnVuIGN0cmwgaXMgJXggLSAleFxuIiwgbXNyX2xvLCBtc3JfaGkpOworCXByX2RlYnVnKCJsb25ncnVuIGN0cmwgaXMgJXggLSAleFxuIiwgbXNyX2xvLCBtc3JfaGkpOwogCW1zcl9sbyAmPSAweDAwMDAwMDdGOwogCW1zcl9oaSAmPSAweDAwMDAwMDdGOwogCkBAIC0xNTAsNyArMTQ3LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAljcHVpZCgweDgwODYwMDA3LCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKLQlkcHJpbnRrKCJjcHVpZCBlYXggaXMgJXVcbiIsIGVheCk7CisJcHJfZGVidWcoImNwdWlkIGVheCBpcyAldVxuIiwgZWF4KTsKIAogCXJldHVybiBlYXggKiAxMDAwOwogfQpAQCAtMTk2LDcgKzE5Myw3IEBACiAJCXJkbXNyKE1TUl9UTVRBX0xSVElfVk9MVF9NSFosIG1zcl9sbywgbXNyX2hpKTsKIAkJKmhpZ2hfZnJlcSA9IG1zcl9sbyAqIDEwMDA7IC8qIHRvIGtIeiAqLwogCi0JCWRwcmludGsoImxvbmdydW4gdGFibGUgaW50ZXJmYWNlIHRvbGQgJXUgLSAldSBrSHpcbiIsCisJCXByX2RlYnVnKCJsb25ncnVuIHRhYmxlIGludGVyZmFjZSB0b2xkICV1IC0gJXUga0h6XG4iLAogCQkJCSpsb3dfZnJlcSwgKmhpZ2hfZnJlcSk7CiAKIAkJaWYgKCpsb3dfZnJlcSA+ICpoaWdoX2ZyZXEpCkBAIC0yMDcsNyArMjA0LDcgQEAKIAkvKiBzZXQgdGhlIHVwcGVyIGJvcmRlciB0byB0aGUgdmFsdWUgZGV0ZXJtaW5lZCBkdXJpbmcgVFNDIGluaXQgKi8KIAkqaGlnaF9mcmVxID0gKGNwdV9raHogLyAxMDAwKTsKIAkqaGlnaF9mcmVxID0gKmhpZ2hfZnJlcSAqIDEwMDA7Ci0JZHByaW50aygiaGlnaCBmcmVxdWVuY3kgaXMgJXUga0h6XG4iLCAqaGlnaF9mcmVxKTsKKwlwcl9kZWJ1ZygiaGlnaCBmcmVxdWVuY3kgaXMgJXUga0h6XG4iLCAqaGlnaF9mcmVxKTsKIAogCS8qIGdldCBjdXJyZW50IGJvcmRlcnMgKi8KIAlyZG1zcihNU1JfVE1UQV9MT05HUlVOX0NUUkwsIG1zcl9sbywgbXNyX2hpKTsKQEAgLTIzMyw3ICsyMzAsNyBAQAogCQkvKiByZXN0b3JlIHZhbHVlcyAqLwogCQl3cm1zcihNU1JfVE1UQV9MT05HUlVOX0NUUkwsIHNhdmVfbG8sIHNhdmVfaGkpOwogCX0KLQlkcHJpbnRrKCJwZXJjZW50YWdlIGlzICV1ICUlLCBmcmVxIGlzICV1IE1IelxuIiwgZWN4LCBlYXgpOworCXByX2RlYnVnKCJwZXJjZW50YWdlIGlzICV1ICUlLCBmcmVxIGlzICV1IE1IelxuIiwgZWN4LCBlYXgpOwogCiAJLyogcGVyZm9ybWFuY2VfcGN0ZyA9IChjdXJyZW50X2ZyZXEgLSBsb3dfZnJlcSkvKGhpZ2hfZnJlcSAtIGxvd19mcmVxKQogCSAqIGVxYWxzCkBAIC0yNDksNyArMjQ2LDcgQEAKIAllZHggPSAoKGVheCAtIGVieCkgKiAxMDApIC8gKDEwMCAtIGVjeCk7CiAJKmxvd19mcmVxID0gZWR4ICogMTAwMDsgLyogYmFjayB0byBrSHogKi8KIAotCWRwcmludGsoImxvdyBmcmVxdWVuY3kgaXMgJXUga0h6XG4iLCAqbG93X2ZyZXEpOworCXByX2RlYnVnKCJsb3cgZnJlcXVlbmN5IGlzICV1IGtIelxuIiwgKmxvd19mcmVxKTsKIAogCWlmICgqbG93X2ZyZXEgPiAqaGlnaF9mcmVxKQogCQkqbG93X2ZyZXEgPSAqaGlnaF9mcmVxOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL21wZXJmLmMgYi9kcml2ZXJzL2NwdWZyZXEvbXBlcmYuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL21wZXJmLmMKcmVuYW1lIHRvIGRyaXZlcnMvY3B1ZnJlcS9tcGVyZi5jCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbXBlcmYuaCBiL2RyaXZlcnMvY3B1ZnJlcS9tcGVyZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbXBlcmYuaApyZW5hbWUgdG8gZHJpdmVycy9jcHVmcmVxL21wZXJmLmgKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wNC1jbG9ja21vZC5jIGIvZHJpdmVycy9jcHVmcmVxL3A0LWNsb2NrbW9kLmMKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3A0LWNsb2NrbW9kLmMKcmVuYW1lIHRvIGRyaXZlcnMvY3B1ZnJlcS9wNC1jbG9ja21vZC5jCmluZGV4IDUyYzkzNjQ4Li42YmUzZTA3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcDQtY2xvY2ttb2QuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvcDQtY2xvY2ttb2QuYwpAQCAtMzUsOCArMzUsNiBAQAogI2luY2x1ZGUgInNwZWVkc3RlcC1saWIuaCIKIAogI2RlZmluZSBQRlgJInA0LWNsb2NrbW9kOiAiCi0jZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgXAotCQkicDQtY2xvY2ttb2QiLCBtc2cpCiAKIC8qCiAgKiBEdXR5IEN5Y2xlICgzYml0cyksIG5vdGUgRENfRElTQUJMRSBpcyBub3Qgc3BlY2lmaWVkIGluCkBAIC02Niw3ICs2NCw3IEBACiAJcmRtc3Jfb25fY3B1KGNwdSwgTVNSX0lBMzJfVEhFUk1fU1RBVFVTLCAmbCwgJmgpOwogCiAJaWYgKGwgJiAweDAxKQotCQlkcHJpbnRrKCJDUFUjJWQgY3VycmVudGx5IHRoZXJtYWwgdGhyb3R0bGVkXG4iLCBjcHUpOworCQlwcl9kZWJ1ZygiQ1BVIyVkIGN1cnJlbnRseSB0aGVybWFsIHRocm90dGxlZFxuIiwgY3B1KTsKIAogCWlmIChoYXNfTjQ0X08xN19lcnJhdGFbY3B1XSAmJgogCSAgICAobmV3c3RhdGUgPT0gRENfMjVQVCB8fCBuZXdzdGF0ZSA9PSBEQ19ERkxUKSkKQEAgLTc0LDEwICs3MiwxMCBAQAogCiAJcmRtc3Jfb25fY3B1KGNwdSwgTVNSX0lBMzJfVEhFUk1fQ09OVFJPTCwgJmwsICZoKTsKIAlpZiAobmV3c3RhdGUgPT0gRENfRElTQUJMRSkgewotCQlkcHJpbnRrKCJDUFUjJWQgZGlzYWJsaW5nIG1vZHVsYXRpb25cbiIsIGNwdSk7CisJCXByX2RlYnVnKCJDUFUjJWQgZGlzYWJsaW5nIG1vZHVsYXRpb25cbiIsIGNwdSk7CiAJCXdybXNyX29uX2NwdShjcHUsIE1TUl9JQTMyX1RIRVJNX0NPTlRST0wsIGwgJiB+KDE8PDQpLCBoKTsKIAl9IGVsc2UgewotCQlkcHJpbnRrKCJDUFUjJWQgc2V0dGluZyBkdXR5IGN5Y2xlIHRvICVkJSVcbiIsCisJCXByX2RlYnVnKCJDUFUjJWQgc2V0dGluZyBkdXR5IGN5Y2xlIHRvICVkJSVcbiIsCiAJCQljcHUsICgoMTI1ICogbmV3c3RhdGUpIC8gMTApKTsKIAkJLyogYml0cyA2MyAtIDUJOiByZXNlcnZlZAogCQkgKiBiaXQgIDQJOiBlbmFibGUvZGlzYWJsZQpAQCAtMjE3LDcgKzIxNSw3IEBACiAJY2FzZSAweDBmMTE6CiAJY2FzZSAweDBmMTI6CiAJCWhhc19ONDRfTzE3X2VycmF0YVtwb2xpY3ktPmNwdV0gPSAxOwotCQlkcHJpbnRrKCJoYXMgZXJyYXRhIC0tIGRpc2FibGluZyBsb3cgZnJlcXVlbmNpZXNcbiIpOworCQlwcl9kZWJ1ZygiaGFzIGVycmF0YSAtLSBkaXNhYmxpbmcgbG93IGZyZXF1ZW5jaWVzXG4iKTsKIAl9CiAKIAlpZiAoc3BlZWRzdGVwX2RldGVjdF9wcm9jZXNzb3IoKSA9PSBTUEVFRFNURVBfQ1BVX1A0RCAmJgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3BjYy1jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvcGNjLWNwdWZyZXEuYwpzaW1pbGFyaXR5IGluZGV4IDkwJQpyZW5hbWUgZnJvbSBhcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcGNjLWNwdWZyZXEuYwpyZW5hbWUgdG8gZHJpdmVycy9jcHVmcmVxL3BjYy1jcHVmcmVxLmMKaW5kZXggNzU1YTMxZS4uN2IwNjAzZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3BjYy1jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL3BjYy1jcHVmcmVxLmMKQEAgLTM5LDcgKzM5LDcgQEAKIAogI2luY2x1ZGUgPGFjcGkvcHJvY2Vzc29yLmg+CiAKLSNkZWZpbmUgUENDX1ZFUlNJT04gCSIxLjAwLjAwIgorI2RlZmluZSBQQ0NfVkVSU0lPTgkiMS4xMC4wMCIKICNkZWZpbmUgUE9MTF9MT09QUyAJMzAwCiAKICNkZWZpbmUgQ01EX0NPTVBMRVRFIAkweDEKQEAgLTQ4LDkgKzQ4LDYgQEAKIAogI2RlZmluZSBCVUZfU1oJCTQKIAotI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsCVwKLQkJCQkJICAgICAicGNjLWNwdWZyZXEiLCBtc2cpCi0KIHN0cnVjdCBwY2NfcmVnaXN0ZXJfcmVzb3VyY2UgewogCXU4IGRlc2NyaXB0b3I7CiAJdTE2IGxlbmd0aDsKQEAgLTEwMiw3ICs5OSw3IEBACiBzdGF0aWMgdTY0IGRvb3JiZWxsX3ByZXNlcnZlOwogc3RhdGljIHU2NCBkb29yYmVsbF93cml0ZTsKIAotc3RhdGljIHU4IE9TQ19VVUlEWzE2XSA9IHsweDYzLCAweDlCLCAweDJDLCAweDlGLCAweDcwLCAweDkxLCAweDQ5LCAweDFmLAorc3RhdGljIHU4IE9TQ19VVUlEWzE2XSA9IHsweDlGLCAweDJDLCAweDlCLCAweDYzLCAweDkxLCAweDcwLCAweDFmLCAweDQ5LAogCQkJICAweEJCLCAweDRGLCAweEE1LCAweDk4LCAweDJGLCAweEExLCAweEI1LCAweDQ2fTsKIAogc3RydWN0IHBjY19jcHUgewpAQCAtMTUyLDcgKzE0OSw3IEBACiAKIAlzcGluX2xvY2soJnBjY19sb2NrKTsKIAotCWRwcmludGsoImdldDogZ2V0X2ZyZXEgZm9yIENQVSAlZFxuIiwgY3B1KTsKKwlwcl9kZWJ1ZygiZ2V0OiBnZXRfZnJlcSBmb3IgQ1BVICVkXG4iLCBjcHUpOwogCXBjY19jcHVfZGF0YSA9IHBlcl9jcHVfcHRyKHBjY19jcHVfaW5mbywgY3B1KTsKIAogCWlucHV0X2J1ZmZlciA9IDB4MTsKQEAgLTE3MCw3ICsxNjcsNyBAQAogCiAJc3RhdHVzID0gaW9yZWFkMTYoJnBjY2hfaGRyLT5zdGF0dXMpOwogCWlmIChzdGF0dXMgIT0gQ01EX0NPTVBMRVRFKSB7Ci0JCWRwcmludGsoImdldDogRkFJTEVEOiBmb3IgQ1BVICVkLCBzdGF0dXMgaXMgJWRcbiIsCisJCXByX2RlYnVnKCJnZXQ6IEZBSUxFRDogZm9yIENQVSAlZCwgc3RhdHVzIGlzICVkXG4iLAogCQkJY3B1LCBzdGF0dXMpOwogCQlnb3RvIGNtZF9pbmNvbXBsZXRlOwogCX0KQEAgLTE3OCwxNCArMTc1LDE0IEBACiAJY3Vycl9mcmVxID0gKCgoaW9yZWFkMzIoJnBjY2hfaGRyLT5ub21pbmFsKSAqIChvdXRwdXRfYnVmZmVyICYgMHhmZikpCiAJCQkvIDEwMCkgKiAxMDAwKTsKIAotCWRwcmludGsoImdldDogU1VDQ0VTUzogKHZpcnR1YWwpIG91dHB1dF9vZmZzZXQgZm9yIGNwdSAlZCBpcyAiCi0JCSIweCV4LCBjb250YWlucyBhIHZhbHVlIG9mOiAweCV4LiBTcGVlZCBpczogJWQgTUh6XG4iLAorCXByX2RlYnVnKCJnZXQ6IFNVQ0NFU1M6ICh2aXJ0dWFsKSBvdXRwdXRfb2Zmc2V0IGZvciBjcHUgJWQgaXMgIgorCQkiMHglcCwgY29udGFpbnMgYSB2YWx1ZSBvZjogMHgleC4gU3BlZWQgaXM6ICVkIE1IelxuIiwKIAkJY3B1LCAocGNjaF92aXJ0X2FkZHIgKyBwY2NfY3B1X2RhdGEtPm91dHB1dF9vZmZzZXQpLAogCQlvdXRwdXRfYnVmZmVyLCBjdXJyX2ZyZXEpOwogCiAJZnJlcV9saW1pdCA9IChvdXRwdXRfYnVmZmVyID4+IDgpICYgMHhmZjsKIAlpZiAoZnJlcV9saW1pdCAhPSAweGZmKSB7Ci0JCWRwcmludGsoImdldDogZnJlcXVlbmN5IGZvciBjcHUgJWQgaXMgYmVpbmcgdGVtcG9yYXJpbHkiCisJCXByX2RlYnVnKCJnZXQ6IGZyZXF1ZW5jeSBmb3IgY3B1ICVkIGlzIGJlaW5nIHRlbXBvcmFyaWx5IgogCQkJIiBjYXBwZWQgYXQgJWRcbiIsIGNwdSwgY3Vycl9mcmVxKTsKIAl9CiAKQEAgLTIxMiw4ICsyMDksOCBAQAogCWNwdSA9IHBvbGljeS0+Y3B1OwogCXBjY19jcHVfZGF0YSA9IHBlcl9jcHVfcHRyKHBjY19jcHVfaW5mbywgY3B1KTsKIAotCWRwcmludGsoInRhcmdldDogQ1BVICVkIHNob3VsZCBnbyB0byB0YXJnZXQgZnJlcTogJWQgIgotCQkiKHZpcnR1YWwpIGlucHV0X29mZnNldCBpcyAweCV4XG4iLAorCXByX2RlYnVnKCJ0YXJnZXQ6IENQVSAlZCBzaG91bGQgZ28gdG8gdGFyZ2V0IGZyZXE6ICVkICIKKwkJIih2aXJ0dWFsKSBpbnB1dF9vZmZzZXQgaXMgMHglcFxuIiwKIAkJY3B1LCB0YXJnZXRfZnJlcSwKIAkJKHBjY2hfdmlydF9hZGRyICsgcGNjX2NwdV9kYXRhLT5pbnB1dF9vZmZzZXQpKTsKIApAQCAtMjM0LDE0ICsyMzEsMTQgQEAKIAogCXN0YXR1cyA9IGlvcmVhZDE2KCZwY2NoX2hkci0+c3RhdHVzKTsKIAlpZiAoc3RhdHVzICE9IENNRF9DT01QTEVURSkgewotCQlkcHJpbnRrKCJ0YXJnZXQ6IEZBSUxFRCBmb3IgY3B1ICVkLCB3aXRoIHN0YXR1czogMHgleFxuIiwKKwkJcHJfZGVidWcoInRhcmdldDogRkFJTEVEIGZvciBjcHUgJWQsIHdpdGggc3RhdHVzOiAweCV4XG4iLAogCQkJY3B1LCBzdGF0dXMpOwogCQlnb3RvIGNtZF9pbmNvbXBsZXRlOwogCX0KIAlpb3dyaXRlMTYoMCwgJnBjY2hfaGRyLT5zdGF0dXMpOwogCiAJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7Ci0JZHByaW50aygidGFyZ2V0OiB3YXMgU1VDQ0VTU0ZVTCBmb3IgY3B1ICVkXG4iLCBjcHUpOworCXByX2RlYnVnKCJ0YXJnZXQ6IHdhcyBTVUNDRVNTRlVMIGZvciBjcHUgJWRcbiIsIGNwdSk7CiAJc3Bpbl91bmxvY2soJnBjY19sb2NrKTsKIAogCXJldHVybiAwOwpAQCAtMjkzLDcgKzI5MCw3IEBACiAJbWVtc2V0X2lvKChwY2NoX3ZpcnRfYWRkciArIHBjY19jcHVfZGF0YS0+aW5wdXRfb2Zmc2V0KSwgMCwgQlVGX1NaKTsKIAltZW1zZXRfaW8oKHBjY2hfdmlydF9hZGRyICsgcGNjX2NwdV9kYXRhLT5vdXRwdXRfb2Zmc2V0KSwgMCwgQlVGX1NaKTsKIAotCWRwcmludGsoInBjY19nZXRfb2Zmc2V0OiBmb3IgQ1BVICVkOiBwY2NfY3B1X2RhdGEgIgorCXByX2RlYnVnKCJwY2NfZ2V0X29mZnNldDogZm9yIENQVSAlZDogcGNjX2NwdV9kYXRhICIKIAkJImlucHV0X29mZnNldDogMHgleCwgcGNjX2NwdV9kYXRhIG91dHB1dF9vZmZzZXQ6IDB4JXhcbiIsCiAJCWNwdSwgcGNjX2NwdV9kYXRhLT5pbnB1dF9vZmZzZXQsIHBjY19jcHVfZGF0YS0+b3V0cHV0X29mZnNldCk7CiBvdXRfZnJlZToKQEAgLTQxMCw3ICs0MDcsNyBAQAogCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQlyZXQgPSBwY2NfY3B1ZnJlcV9kb19vc2MoJm9zY19oYW5kbGUpOwogCQlpZiAocmV0KQotCQkJZHByaW50aygicHJvYmU6IF9PU0MgZXZhbHVhdGlvbiBkaWQgbm90IHN1Y2NlZWRcbiIpOworCQkJcHJfZGVidWcoInByb2JlOiBfT1NDIGV2YWx1YXRpb24gZGlkIG5vdCBzdWNjZWVkXG4iKTsKIAkJLyogRmlybXdhcmUncyB1c2Ugb2YgX09TQyBpcyBvcHRpb25hbCAqLwogCQlyZXQgPSAwOwogCX0KQEAgLTQzMyw3ICs0MzAsNyBAQAogCiAJbWVtX3Jlc291cmNlID0gKHN0cnVjdCBwY2NfbWVtb3J5X3Jlc291cmNlICopbWVtYmVyLT5idWZmZXIucG9pbnRlcjsKIAotCWRwcmludGsoInByb2JlOiBtZW1fcmVzb3VyY2UgZGVzY3JpcHRvcjogMHgleCwiCisJcHJfZGVidWcoInByb2JlOiBtZW1fcmVzb3VyY2UgZGVzY3JpcHRvcjogMHgleCwiCiAJCSIgbGVuZ3RoOiAlZCwgc3BhY2VfaWQ6ICVkLCByZXNvdXJjZV91c2FnZTogJWQsIgogCQkiIHR5cGVfc3BlY2lmaWM6ICVkLCBncmFudWxhcml0eTogMHglbGx4LCIKIAkJIiBtaW5pbXVtOiAweCVsbHgsIG1heGltdW06IDB4JWxseCwiCkBAIC00NTMsMTMgKzQ1MCwxMyBAQAogCXBjY2hfdmlydF9hZGRyID0gaW9yZW1hcF9ub2NhY2hlKG1lbV9yZXNvdXJjZS0+bWluaW11bSwKIAkJCQkJbWVtX3Jlc291cmNlLT5hZGRyZXNzX2xlbmd0aCk7CiAJaWYgKHBjY2hfdmlydF9hZGRyID09IE5VTEwpIHsKLQkJZHByaW50aygicHJvYmU6IGNvdWxkIG5vdCBtYXAgc2hhcmVkIG1lbSByZWdpb25cbiIpOworCQlwcl9kZWJ1ZygicHJvYmU6IGNvdWxkIG5vdCBtYXAgc2hhcmVkIG1lbSByZWdpb25cbiIpOwogCQlnb3RvIG91dF9mcmVlOwogCX0KIAlwY2NoX2hkciA9IHBjY2hfdmlydF9hZGRyOwogCi0JZHByaW50aygicHJvYmU6IFBDQ0ggaGVhZGVyICh2aXJ0dWFsKSBhZGRyOiAweCVwXG4iLCBwY2NoX2hkcik7Ci0JZHByaW50aygicHJvYmU6IFBDQ0ggaGVhZGVyIGlzIGF0IHBoeXNpY2FsIGFkZHJlc3M6IDB4JWxseCwiCisJcHJfZGVidWcoInByb2JlOiBQQ0NIIGhlYWRlciAodmlydHVhbCkgYWRkcjogMHglcFxuIiwgcGNjaF9oZHIpOworCXByX2RlYnVnKCJwcm9iZTogUENDSCBoZWFkZXIgaXMgYXQgcGh5c2ljYWwgYWRkcmVzczogMHglbGx4LCIKIAkJIiBzaWduYXR1cmU6IDB4JXgsIGxlbmd0aDogJWQgYnl0ZXMsIG1ham9yOiAlZCwgbWlub3I6ICVkLCIKIAkJIiBzdXBwb3J0ZWQgZmVhdHVyZXM6IDB4JXgsIGNvbW1hbmQgZmllbGQ6IDB4JXgsIgogCQkiIHN0YXR1cyBmaWVsZDogMHgleCwgbm9taW5hbCBsYXRlbmN5OiAlZCB1c1xuIiwKQEAgLTQ2OSw3ICs0NjYsNyBAQAogCQlpb3JlYWQxNigmcGNjaF9oZHItPmNvbW1hbmQpLCBpb3JlYWQxNigmcGNjaF9oZHItPnN0YXR1cyksCiAJCWlvcmVhZDMyKCZwY2NoX2hkci0+bGF0ZW5jeSkpOwogCi0JZHByaW50aygicHJvYmU6IG1pbiB0aW1lIGJldHdlZW4gY29tbWFuZHM6ICVkIHVzLCIKKwlwcl9kZWJ1ZygicHJvYmU6IG1pbiB0aW1lIGJldHdlZW4gY29tbWFuZHM6ICVkIHVzLCIKIAkJIiBtYXggdGltZSBiZXR3ZWVuIGNvbW1hbmRzOiAlZCB1cywiCiAJCSIgbm9taW5hbCBDUFUgZnJlcXVlbmN5OiAlZCBNSHosIgogCQkiIG1pbmltdW0gQ1BVIGZyZXF1ZW5jeTogJWQgTUh6LCIKQEAgLTQ5NCw3ICs0OTEsNyBAQAogCWRvb3JiZWxsLmFjY2Vzc193aWR0aCA9IDY0OwogCWRvb3JiZWxsLmFkZHJlc3MgPSByZWdfcmVzb3VyY2UtPmFkZHJlc3M7CiAKLQlkcHJpbnRrKCJwcm9iZTogZG9vcmJlbGw6IHNwYWNlX2lkIGlzICVkLCBiaXRfd2lkdGggaXMgJWQsICIKKwlwcl9kZWJ1ZygicHJvYmU6IGRvb3JiZWxsOiBzcGFjZV9pZCBpcyAlZCwgYml0X3dpZHRoIGlzICVkLCAiCiAJCSJiaXRfb2Zmc2V0IGlzICVkLCBhY2Nlc3Nfd2lkdGggaXMgJWQsIGFkZHJlc3MgaXMgMHglbGx4XG4iLAogCQlkb29yYmVsbC5zcGFjZV9pZCwgZG9vcmJlbGwuYml0X3dpZHRoLCBkb29yYmVsbC5iaXRfb2Zmc2V0LAogCQlkb29yYmVsbC5hY2Nlc3Nfd2lkdGgsIHJlZ19yZXNvdXJjZS0+YWRkcmVzcyk7CkBAIC01MTUsNyArNTEyLDcgQEAKIAogCWRvb3JiZWxsX3dyaXRlID0gbWVtYmVyLT5pbnRlZ2VyLnZhbHVlOwogCi0JZHByaW50aygicHJvYmU6IGRvb3JiZWxsX3ByZXNlcnZlOiAweCVsbHgsIgorCXByX2RlYnVnKCJwcm9iZTogZG9vcmJlbGxfcHJlc2VydmU6IDB4JWxseCwiCiAJCSIgZG9vcmJlbGxfd3JpdGU6IDB4JWxseFxuIiwKIAkJZG9vcmJlbGxfcHJlc2VydmUsIGRvb3JiZWxsX3dyaXRlKTsKIApAQCAtNTUwLDcgKzU0Nyw3IEBACiAKIAlyZXN1bHQgPSBwY2NfZ2V0X29mZnNldChjcHUpOwogCWlmIChyZXN1bHQpIHsKLQkJZHByaW50aygiaW5pdDogUENDUCBldmFsdWF0aW9uIGZhaWxlZFxuIik7CisJCXByX2RlYnVnKCJpbml0OiBQQ0NQIGV2YWx1YXRpb24gZmFpbGVkXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC01NjEsMTIgKzU1OCwxMiBAQAogCXBvbGljeS0+Y3VyID0gcGNjX2dldF9mcmVxKGNwdSk7CiAKIAlpZiAoIXBvbGljeS0+Y3VyKSB7Ci0JCWRwcmludGsoImluaXQ6IFVuYWJsZSB0byBnZXQgY3VycmVudCBDUFUgZnJlcXVlbmN5XG4iKTsKKwkJcHJfZGVidWcoImluaXQ6IFVuYWJsZSB0byBnZXQgY3VycmVudCBDUFUgZnJlcXVlbmN5XG4iKTsKIAkJcmVzdWx0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQogCi0JZHByaW50aygiaW5pdDogcG9saWN5LT5tYXggaXMgJWQsIHBvbGljeS0+bWluIGlzICVkXG4iLAorCXByX2RlYnVnKCJpbml0OiBwb2xpY3ktPm1heCBpcyAlZCwgcG9saWN5LT5taW4gaXMgJWRcbiIsCiAJCXBvbGljeS0+bWF4LCBwb2xpY3ktPm1pbik7CiBvdXQ6CiAJcmV0dXJuIHJlc3VsdDsKQEAgLTU5Nyw3ICs1OTQsNyBAQAogCiAJcmV0ID0gcGNjX2NwdWZyZXFfcHJvYmUoKTsKIAlpZiAocmV0KSB7Ci0JCWRwcmludGsoInBjY19jcHVmcmVxX2luaXQ6IFBDQ0ggZXZhbHVhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9kZWJ1ZygicGNjX2NwdWZyZXFfaW5pdDogUENDSCBldmFsdWF0aW9uIGZhaWxlZFxuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazYuYyBiL2RyaXZlcnMvY3B1ZnJlcS9wb3dlcm5vdy1rNi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazYuYwpyZW5hbWUgdG8gZHJpdmVycy9jcHVmcmVxL3Bvd2Vybm93LWs2LmMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rNy5jIGIvZHJpdmVycy9jcHVmcmVxL3Bvd2Vybm93LWs3LmMKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs3LmMKcmVuYW1lIHRvIGRyaXZlcnMvY3B1ZnJlcS9wb3dlcm5vdy1rNy5jCmluZGV4IDRhNDVmZDYuLmQ3MWQ5ZjMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rNy5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9wb3dlcm5vdy1rNy5jCkBAIC02OCw3ICs2OCw2IEBACiB9OwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfQ1BVX0ZSRVFfREVCVUcKIC8qIGRpdmlkZSBieSAxMDAwIHRvIGdldCBWQ29yZSB2b2x0YWdlIGluIFYuICovCiBzdGF0aWMgY29uc3QgaW50IG1vYmlsZV92aWRfdGFibGVbMzJdID0gewogICAgIDIwMDAsIDE5NTAsIDE5MDAsIDE4NTAsIDE4MDAsIDE3NTAsIDE3MDAsIDE2NTAsCkBAIC03Niw3ICs3NSw2IEBACiAgICAgMTI3NSwgMTI1MCwgMTIyNSwgMTIwMCwgMTE3NSwgMTE1MCwgMTEyNSwgMTEwMCwKICAgICAxMDc1LCAxMDUwLCAxMDI1LCAxMDAwLCA5NzUsIDk1MCwgOTI1LCAwLAogfTsKLSNlbmRpZgogCiAvKiBkaXZpZGUgYnkgMTAgdG8gZ2V0IEZJRC4gKi8KIHN0YXRpYyBjb25zdCBpbnQgZmlkX2NvZGVzWzMyXSA9IHsKQEAgLTEwMyw5ICsxMDEsNiBAQAogc3RhdGljIHVuc2lnbmVkIGludCBsYXRlbmN5Owogc3RhdGljIGNoYXIgaGF2ZV9hMDsKIAotI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsIFwKLQkJInBvd2Vybm93LWs3IiwgbXNnKQotCiBzdGF0aWMgaW50IGNoZWNrX2ZzYih1bnNpZ25lZCBpbnQgZnNic3BlZWQpCiB7CiAJaW50IGRlbHRhOwpAQCAtMjA5LDcgKzIwNCw3IEBACiAJCXZpZCA9ICpwc3QrKzsKIAkJcG93ZXJub3dfdGFibGVbal0uaW5kZXggfD0gKHZpZCA8PCA4KTsgLyogdXBwZXIgOCBiaXRzICovCiAKLQkJZHByaW50aygiICAgRklEOiAweCV4ICglZC4lZHggWyVkTUh6XSkgICIKKwkJcHJfZGVidWcoIiAgIEZJRDogMHgleCAoJWQuJWR4IFslZE1Iel0pICAiCiAJCQkgIlZJRDogMHgleCAoJWQuJTAzZFYpXG4iLCBmaWQsIGZpZF9jb2Rlc1tmaWRdIC8gMTAsCiAJCQkgZmlkX2NvZGVzW2ZpZF0gJSAxMCwgc3BlZWQvMTAwMCwgdmlkLAogCQkJIG1vYmlsZV92aWRfdGFibGVbdmlkXS8xMDAwLApAQCAtMzY3LDcgKzM2Miw3IEBACiAJCXVuc2lnbmVkIGludCBzcGVlZCwgc3BlZWRfbWh6OwogCiAJCXBjLnZhbCA9ICh1bnNpZ25lZCBsb25nKSBzdGF0ZS0+Y29udHJvbDsKLQkJZHByaW50aygiYWNwaTogIFAlZDogJWQgTUh6ICVkIG1XICVkIHVTIGNvbnRyb2wgJTA4eCBTR1RDICVkXG4iLAorCQlwcl9kZWJ1ZygiYWNwaTogIFAlZDogJWQgTUh6ICVkIG1XICVkIHVTIGNvbnRyb2wgJTA4eCBTR1RDICVkXG4iLAogCQkJIGksCiAJCQkgKHUzMikgc3RhdGUtPmNvcmVfZnJlcXVlbmN5LAogCQkJICh1MzIpIHN0YXRlLT5wb3dlciwKQEAgLTQwMSw3ICszOTYsNyBAQAogCQkJCWludmFsaWRhdGVfZW50cnkoaSk7CiAJCX0KIAotCQlkcHJpbnRrKCIgICBGSUQ6IDB4JXggKCVkLiVkeCBbJWRNSHpdKSAgIgorCQlwcl9kZWJ1ZygiICAgRklEOiAweCV4ICglZC4lZHggWyVkTUh6XSkgICIKIAkJCSAiVklEOiAweCV4ICglZC4lMDNkVilcbiIsIGZpZCwgZmlkX2NvZGVzW2ZpZF0gLyAxMCwKIAkJCSBmaWRfY29kZXNbZmlkXSAlIDEwLCBzcGVlZF9taHosIHZpZCwKIAkJCSBtb2JpbGVfdmlkX3RhYmxlW3ZpZF0vMTAwMCwKQEAgLTQwOSw3ICs0MDQsNyBAQAogCiAJCWlmIChzdGF0ZS0+Y29yZV9mcmVxdWVuY3kgIT0gc3BlZWRfbWh6KSB7CiAJCQlzdGF0ZS0+Y29yZV9mcmVxdWVuY3kgPSBzcGVlZF9taHo7Ci0JCQlkcHJpbnRrKCIgICBDb3JyZWN0ZWQgQUNQSSBmcmVxdWVuY3kgdG8gJWRcbiIsCisJCQlwcl9kZWJ1ZygiICAgQ29ycmVjdGVkIEFDUEkgZnJlcXVlbmN5IHRvICVkXG4iLAogCQkJCXNwZWVkX21oeik7CiAJCX0KIApAQCAtNDUzLDggKzQ0OCw4IEBACiAKIHN0YXRpYyB2b2lkIHByaW50X3BzdF9lbnRyeShzdHJ1Y3QgcHN0X3MgKnBzdCwgdW5zaWduZWQgaW50IGopCiB7Ci0JZHByaW50aygiUFNUOiVkIChAJXApXG4iLCBqLCBwc3QpOwotCWRwcmludGsoIiBjcHVpZDogMHgleCAgZnNiOiAlZCAgbWF4RklEOiAweCV4ICBzdGFydHZpZDogMHgleFxuIiwKKwlwcl9kZWJ1ZygiUFNUOiVkIChAJXApXG4iLCBqLCBwc3QpOworCXByX2RlYnVnKCIgY3B1aWQ6IDB4JXggIGZzYjogJWQgIG1heEZJRDogMHgleCAgc3RhcnR2aWQ6IDB4JXhcbiIsCiAJCXBzdC0+Y3B1aWQsIHBzdC0+ZnNic3BlZWQsIHBzdC0+bWF4ZmlkLCBwc3QtPnN0YXJ0dmlkKTsKIH0KIApAQCAtNDc0LDIwICs0NjksMjAgQEAKIAkJcCA9IHBoeXNfdG9fdmlydChpKTsKIAogCQlpZiAobWVtY21wKHAsICJBTURLN1BOT1chIiwgIDEwKSA9PSAwKSB7Ci0JCQlkcHJpbnRrKCJGb3VuZCBQU0IgaGVhZGVyIGF0ICVwXG4iLCBwKTsKKwkJCXByX2RlYnVnKCJGb3VuZCBQU0IgaGVhZGVyIGF0ICVwXG4iLCBwKTsKIAkJCXBzYiA9IChzdHJ1Y3QgcHNiX3MgKikgcDsKLQkJCWRwcmludGsoIlRhYmxlIHZlcnNpb246IDB4JXhcbiIsIHBzYi0+dGFibGV2ZXJzaW9uKTsKKwkJCXByX2RlYnVnKCJUYWJsZSB2ZXJzaW9uOiAweCV4XG4iLCBwc2ItPnRhYmxldmVyc2lvbik7CiAJCQlpZiAocHNiLT50YWJsZXZlcnNpb24gIT0gMHgxMikgewogCQkJCXByaW50ayhLRVJOX0lORk8gUEZYICJTb3JyeSwgb25seSB2MS4yIHRhYmxlcyIKIAkJCQkJCSIgc3VwcG9ydGVkIHJpZ2h0IG5vd1xuIik7CiAJCQkJcmV0dXJuIC1FTk9ERVY7CiAJCQl9CiAKLQkJCWRwcmludGsoIkZsYWdzOiAweCV4XG4iLCBwc2ItPmZsYWdzKTsKKwkJCXByX2RlYnVnKCJGbGFnczogMHgleFxuIiwgcHNiLT5mbGFncyk7CiAJCQlpZiAoKHBzYi0+ZmxhZ3MgJiAxKSA9PSAwKQotCQkJCWRwcmludGsoIk1vYmlsZSB2b2x0YWdlIHJlZ3VsYXRvclxuIik7CisJCQkJcHJfZGVidWcoIk1vYmlsZSB2b2x0YWdlIHJlZ3VsYXRvclxuIik7CiAJCQllbHNlCi0JCQkJZHByaW50aygiRGVza3RvcCB2b2x0YWdlIHJlZ3VsYXRvclxuIik7CisJCQkJcHJfZGVidWcoIkRlc2t0b3Agdm9sdGFnZSByZWd1bGF0b3JcbiIpOwogCiAJCQlsYXRlbmN5ID0gcHNiLT5zZXR0bGluZ3RpbWU7CiAJCQlpZiAobGF0ZW5jeSA8IDEwMCkgewpAQCAtNDk3LDkgKzQ5Miw5IEBACiAJCQkJCQkiQ29ycmVjdGluZy5cbiIsIGxhdGVuY3kpOwogCQkJCWxhdGVuY3kgPSAxMDA7CiAJCQl9Ci0JCQlkcHJpbnRrKCJTZXR0bGluZyBUaW1lOiAlZCBtaWNyb3NlY29uZHMuXG4iLAorCQkJcHJfZGVidWcoIlNldHRsaW5nIFRpbWU6ICVkIG1pY3Jvc2Vjb25kcy5cbiIsCiAJCQkJCXBzYi0+c2V0dGxpbmd0aW1lKTsKLQkJCWRwcmludGsoIkhhcyAlZCBQU1QgdGFibGVzLiAoT25seSBkdW1waW5nIG9uZXMgIgorCQkJcHJfZGVidWcoIkhhcyAlZCBQU1QgdGFibGVzLiAoT25seSBkdW1waW5nIG9uZXMgIgogCQkJCQkicmVsZXZhbnQgdG8gdGhpcyBDUFUpLlxuIiwKIAkJCQkJcHNiLT5udW1wc3QpOwogCkBAIC02NTAsNyArNjQ1LDcgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggImNhbiBub3QgZGV0ZXJtaW5lIGJ1cyBmcmVxdWVuY3lcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JZHByaW50aygiRlNCOiAlM2RNSHpcbiIsIGZzYi8xMDAwKTsKKwlwcl9kZWJ1ZygiRlNCOiAlM2RNSHpcbiIsIGZzYi8xMDAwKTsKIAogCWlmIChkbWlfY2hlY2tfc3lzdGVtKHBvd2Vybm93X2RtaV90YWJsZSkgfHwgYWNwaV9mb3JjZSkgewogCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiUFNCL1BTVCBrbm93biB0byBiZSBicm9rZW4uICAiCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazcuaCBiL2RyaXZlcnMvY3B1ZnJlcS9wb3dlcm5vdy1rNy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazcuaApyZW5hbWUgdG8gZHJpdmVycy9jcHVmcmVxL3Bvd2Vybm93LWs3LmgKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rOC5jIGIvZHJpdmVycy9jcHVmcmVxL3Bvd2Vybm93LWs4LmMKc2ltaWxhcml0eSBpbmRleCA5MyUKcmVuYW1lIGZyb20gYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmMKcmVuYW1lIHRvIGRyaXZlcnMvY3B1ZnJlcS9wb3dlcm5vdy1rOC5jCmluZGV4IDIzNjhlMzguLjgzNDc5YjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rOC5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9wb3dlcm5vdy1rOC5jCkBAIC0xMzksNyArMTM5LDcgQEAKIAl9CiAJZG8gewogCQlpZiAoaSsrID4gMTAwMDApIHsKLQkJCWRwcmludGsoImRldGVjdGVkIGNoYW5nZSBwZW5kaW5nIHN0dWNrXG4iKTsKKwkJCXByX2RlYnVnKCJkZXRlY3RlZCBjaGFuZ2UgcGVuZGluZyBzdHVja1xuIik7CiAJCQlyZXR1cm4gMTsKIAkJfQogCQlyZG1zcihNU1JfRklEVklEX1NUQVRVUywgbG8sIGhpKTsKQEAgLTE3Niw3ICsxNzYsNyBAQAogCWZpZCA9IGxvICYgTVNSX1NfTE9fQ1VSUkVOVF9GSUQ7CiAJbG8gPSBmaWQgfCAodmlkIDw8IE1TUl9DX0xPX1ZJRF9TSElGVCk7CiAJaGkgPSBNU1JfQ19ISV9TVFBfR05UX0JFTklHTjsKLQlkcHJpbnRrKCJjcHUlZCwgaW5pdCBsbyAweCV4LCBoaSAweCV4XG4iLCBzbXBfcHJvY2Vzc29yX2lkKCksIGxvLCBoaSk7CisJcHJfZGVidWcoImNwdSVkLCBpbml0IGxvIDB4JXgsIGhpIDB4JXhcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgbG8sIGhpKTsKIAl3cm1zcihNU1JfRklEVklEX0NUTCwgbG8sIGhpKTsKIH0KIApAQCAtMTk2LDcgKzE5Niw3IEBACiAJbG8gfD0gKGRhdGEtPmN1cnJ2aWQgPDwgTVNSX0NfTE9fVklEX1NISUZUKTsKIAlsbyB8PSBNU1JfQ19MT19JTklUX0ZJRF9WSUQ7CiAKLQlkcHJpbnRrKCJ3cml0aW5nIGZpZCAweCV4LCBsbyAweCV4LCBoaSAweCV4XG4iLAorCXByX2RlYnVnKCJ3cml0aW5nIGZpZCAweCV4LCBsbyAweCV4LCBoaSAweCV4XG4iLAogCQlmaWQsIGxvLCBkYXRhLT5wbGxsb2NrICogUExMX0xPQ0tfQ09OVkVSU0lPTik7CiAKIAlkbyB7CkBAIC0yNDQsNyArMjQ0LDcgQEAKIAlsbyB8PSAodmlkIDw8IE1TUl9DX0xPX1ZJRF9TSElGVCk7CiAJbG8gfD0gTVNSX0NfTE9fSU5JVF9GSURfVklEOwogCi0JZHByaW50aygid3JpdGluZyB2aWQgMHgleCwgbG8gMHgleCwgaGkgMHgleFxuIiwKKwlwcl9kZWJ1Zygid3JpdGluZyB2aWQgMHgleCwgbG8gMHgleCwgaGkgMHgleFxuIiwKIAkJdmlkLCBsbywgU1RPUF9HUkFOVF81TlMpOwogCiAJZG8gewpAQCAtMzI1LDcgKzMyNSw3IEBACiAJCXJldHVybiAxOwogCX0KIAotCWRwcmludGsoInRyYW5zaXRpb25lZCAoY3B1JWQpOiBuZXcgZmlkIDB4JXgsIHZpZCAweCV4XG4iLAorCXByX2RlYnVnKCJ0cmFuc2l0aW9uZWQgKGNwdSVkKTogbmV3IGZpZCAweCV4LCB2aWQgMHgleFxuIiwKIAkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBkYXRhLT5jdXJyZmlkLCBkYXRhLT5jdXJydmlkKTsKIAogCXJldHVybiAwOwpAQCAtMzM5LDcgKzMzOSw3IEBACiAJdTMyIHNhdmVmaWQgPSBkYXRhLT5jdXJyZmlkOwogCXUzMiBtYXh2aWQsIGxvLCBydm9tdWx0ID0gMTsKIAotCWRwcmludGsoInBoMSAoY3B1JWQpOiBzdGFydCwgY3VycmZpZCAweCV4LCBjdXJydmlkIDB4JXgsICIKKwlwcl9kZWJ1ZygicGgxIChjcHUlZCk6IHN0YXJ0LCBjdXJyZmlkIDB4JXgsIGN1cnJ2aWQgMHgleCwgIgogCQkicmVxdmlkIDB4JXgsIHJ2byAweCV4XG4iLAogCQlzbXBfcHJvY2Vzc29yX2lkKCksCiAJCWRhdGEtPmN1cnJmaWQsIGRhdGEtPmN1cnJ2aWQsIHJlcXZpZCwgZGF0YS0+cnZvKTsKQEAgLTM0OSwxMiArMzQ5LDEyIEBACiAJcnZvc3RlcHMgKj0gcnZvbXVsdDsKIAlyZG1zcihNU1JfRklEVklEX1NUQVRVUywgbG8sIG1heHZpZCk7CiAJbWF4dmlkID0gMHgxZiAmIChtYXh2aWQgPj4gMTYpOwotCWRwcmludGsoInBoMSBtYXh2aWQ9MHgleFxuIiwgbWF4dmlkKTsKKwlwcl9kZWJ1ZygicGgxIG1heHZpZD0weCV4XG4iLCBtYXh2aWQpOwogCWlmIChyZXF2aWQgPCBtYXh2aWQpIC8qIGxvd2VyIG51bWJlcnMgYXJlIGhpZ2hlciB2b2x0YWdlcyAqLwogCQlyZXF2aWQgPSBtYXh2aWQ7CiAKIAl3aGlsZSAoZGF0YS0+Y3VycnZpZCA+IHJlcXZpZCkgewotCQlkcHJpbnRrKCJwaDE6IGN1cnIgMHgleCwgcmVxIHZpZCAweCV4XG4iLAorCQlwcl9kZWJ1ZygicGgxOiBjdXJyIDB4JXgsIHJlcSB2aWQgMHgleFxuIiwKIAkJCWRhdGEtPmN1cnJ2aWQsIHJlcXZpZCk7CiAJCWlmIChkZWNyZWFzZV92aWRfY29kZV9ieV9zdGVwKGRhdGEsIHJlcXZpZCwgZGF0YS0+dmlkbXZzKSkKIAkJCXJldHVybiAxOwpAQCAtMzY1LDcgKzM2NSw3IEBACiAJCWlmIChkYXRhLT5jdXJydmlkID09IG1heHZpZCkgewogCQkJcnZvc3RlcHMgPSAwOwogCQl9IGVsc2UgewotCQkJZHByaW50aygicGgxOiBjaGFuZ2luZyB2aWQgZm9yIHJ2bywgcmVxIDB4JXhcbiIsCisJCQlwcl9kZWJ1ZygicGgxOiBjaGFuZ2luZyB2aWQgZm9yIHJ2bywgcmVxIDB4JXhcbiIsCiAJCQkJZGF0YS0+Y3VycnZpZCAtIDEpOwogCQkJaWYgKGRlY3JlYXNlX3ZpZF9jb2RlX2J5X3N0ZXAoZGF0YSwgZGF0YS0+Y3VycnZpZC0xLCAxKSkKIAkJCQlyZXR1cm4gMTsKQEAgLTM4Miw3ICszODIsNyBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlkcHJpbnRrKCJwaDEgY29tcGxldGUsIGN1cnJmaWQgMHgleCwgY3VycnZpZCAweCV4XG4iLAorCXByX2RlYnVnKCJwaDEgY29tcGxldGUsIGN1cnJmaWQgMHgleCwgY3VycnZpZCAweCV4XG4iLAogCQlkYXRhLT5jdXJyZmlkLCBkYXRhLT5jdXJydmlkKTsKIAogCXJldHVybiAwOwpAQCAtNDAwLDcgKzQwMCw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCWRwcmludGsoInBoMiAoY3B1JWQpOiBzdGFydGluZywgY3VycmZpZCAweCV4LCBjdXJydmlkIDB4JXgsICIKKwlwcl9kZWJ1ZygicGgyIChjcHUlZCk6IHN0YXJ0aW5nLCBjdXJyZmlkIDB4JXgsIGN1cnJ2aWQgMHgleCwgIgogCQkicmVxZmlkIDB4JXhcbiIsCiAJCXNtcF9wcm9jZXNzb3JfaWQoKSwKIAkJZGF0YS0+Y3VycmZpZCwgZGF0YS0+Y3VycnZpZCwgcmVxZmlkKTsKQEAgLTQ1Nyw3ICs0NTcsNyBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlkcHJpbnRrKCJwaDIgY29tcGxldGUsIGN1cnJmaWQgMHgleCwgY3VycnZpZCAweCV4XG4iLAorCXByX2RlYnVnKCJwaDIgY29tcGxldGUsIGN1cnJmaWQgMHgleCwgY3VycnZpZCAweCV4XG4iLAogCQlkYXRhLT5jdXJyZmlkLCBkYXRhLT5jdXJydmlkKTsKIAogCXJldHVybiAwOwpAQCAtNDcwLDcgKzQ3MCw3IEBACiAJdTMyIHNhdmVmaWQgPSBkYXRhLT5jdXJyZmlkOwogCXUzMiBzYXZlcmVxdmlkID0gcmVxdmlkOwogCi0JZHByaW50aygicGgzIChjcHUlZCk6IHN0YXJ0aW5nLCBjdXJyZmlkIDB4JXgsIGN1cnJ2aWQgMHgleFxuIiwKKwlwcl9kZWJ1ZygicGgzIChjcHUlZCk6IHN0YXJ0aW5nLCBjdXJyZmlkIDB4JXgsIGN1cnJ2aWQgMHgleFxuIiwKIAkJc21wX3Byb2Nlc3Nvcl9pZCgpLAogCQlkYXRhLT5jdXJyZmlkLCBkYXRhLT5jdXJydmlkKTsKIApAQCAtNDk4LDE3ICs0OTgsMTcgQEAKIAkJcmV0dXJuIDE7CiAKIAlpZiAoc2F2ZXJlcXZpZCAhPSBkYXRhLT5jdXJydmlkKSB7Ci0JCWRwcmludGsoInBoMyBmYWlsZWQsIGN1cnJ2aWQgMHgleFxuIiwgZGF0YS0+Y3VycnZpZCk7CisJCXByX2RlYnVnKCJwaDMgZmFpbGVkLCBjdXJydmlkIDB4JXhcbiIsIGRhdGEtPmN1cnJ2aWQpOwogCQlyZXR1cm4gMTsKIAl9CiAKIAlpZiAoc2F2ZWZpZCAhPSBkYXRhLT5jdXJyZmlkKSB7Ci0JCWRwcmludGsoInBoMyBmYWlsZWQsIGN1cnJmaWQgY2hhbmdlZCAweCV4XG4iLAorCQlwcl9kZWJ1ZygicGgzIGZhaWxlZCwgY3VycmZpZCBjaGFuZ2VkIDB4JXhcbiIsCiAJCQlkYXRhLT5jdXJyZmlkKTsKIAkJcmV0dXJuIDE7CiAJfQogCi0JZHByaW50aygicGgzIGNvbXBsZXRlLCBjdXJyZmlkIDB4JXgsIGN1cnJ2aWQgMHgleFxuIiwKKwlwcl9kZWJ1ZygicGgzIGNvbXBsZXRlLCBjdXJyZmlkIDB4JXgsIGN1cnJ2aWQgMHgleFxuIiwKIAkJZGF0YS0+Y3VycmZpZCwgZGF0YS0+Y3VycnZpZCk7CiAKIAlyZXR1cm4gMDsKQEAgLTcwNyw3ICs3MDcsNyBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlkcHJpbnRrKCJjZmlkIDB4JXgsIGN2aWQgMHgleFxuIiwgZGF0YS0+Y3VycmZpZCwgZGF0YS0+Y3VycnZpZCk7CisJcHJfZGVidWcoImNmaWQgMHgleCwgY3ZpZCAweCV4XG4iLCBkYXRhLT5jdXJyZmlkLCBkYXRhLT5jdXJydmlkKTsKIAlkYXRhLT5wb3dlcm5vd190YWJsZSA9IHBvd2Vybm93X3RhYmxlOwogCWlmIChjcHVtYXNrX2ZpcnN0KGNwdV9jb3JlX21hc2soZGF0YS0+Y3B1KSkgPT0gZGF0YS0+Y3B1KQogCQlwcmludF9iYXNpY3MoZGF0YSk7CkBAIC03MTcsNyArNzE3LDcgQEAKIAkJICAgIChwc3Rbal0udmlkID09IGRhdGEtPmN1cnJ2aWQpKQogCQkJcmV0dXJuIDA7CiAKLQlkcHJpbnRrKCJjdXJyZmlkL3ZpZCBkbyBub3QgbWF0Y2ggUFNULCBpZ25vcmluZ1xuIik7CisJcHJfZGVidWcoImN1cnJmaWQvdmlkIGRvIG5vdCBtYXRjaCBQU1QsIGlnbm9yaW5nXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzM5LDM2ICs3MzksMzYgQEAKIAkJaWYgKG1lbWNtcChwc2IsIFBTQl9JRF9TVFJJTkcsIFBTQl9JRF9TVFJJTkdfTEVOKSAhPSAwKQogCQkJY29udGludWU7CiAKLQkJZHByaW50aygiZm91bmQgUFNCIGhlYWRlciBhdCAweCVwXG4iLCBwc2IpOworCQlwcl9kZWJ1ZygiZm91bmQgUFNCIGhlYWRlciBhdCAweCVwXG4iLCBwc2IpOwogCi0JCWRwcmludGsoInRhYmxlIHZlcnM6IDB4JXhcbiIsIHBzYi0+dGFibGV2ZXJzaW9uKTsKKwkJcHJfZGVidWcoInRhYmxlIHZlcnM6IDB4JXhcbiIsIHBzYi0+dGFibGV2ZXJzaW9uKTsKIAkJaWYgKHBzYi0+dGFibGV2ZXJzaW9uICE9IFBTQl9WRVJTSU9OXzFfNCkgewogCQkJcHJpbnRrKEtFUk5fRVJSIEZXX0JVRyBQRlggIlBTQiB0YWJsZSBpcyBub3QgdjEuNFxuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCi0JCWRwcmludGsoImZsYWdzOiAweCV4XG4iLCBwc2ItPmZsYWdzMSk7CisJCXByX2RlYnVnKCJmbGFnczogMHgleFxuIiwgcHNiLT5mbGFnczEpOwogCQlpZiAocHNiLT5mbGFnczEpIHsKIAkJCXByaW50ayhLRVJOX0VSUiBGV19CVUcgUEZYICJ1bmtub3duIGZsYWdzXG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAKIAkJZGF0YS0+dnN0YWJsZSA9IHBzYi0+dnN0YWJsZTsKLQkJZHByaW50aygidm9sdGFnZSBzdGFiaWxpemF0aW9uIHRpbWU6ICVkKCoyMHVzKVxuIiwKKwkJcHJfZGVidWcoInZvbHRhZ2Ugc3RhYmlsaXphdGlvbiB0aW1lOiAlZCgqMjB1cylcbiIsCiAJCQkJZGF0YS0+dnN0YWJsZSk7CiAKLQkJZHByaW50aygiZmxhZ3MyOiAweCV4XG4iLCBwc2ItPmZsYWdzMik7CisJCXByX2RlYnVnKCJmbGFnczI6IDB4JXhcbiIsIHBzYi0+ZmxhZ3MyKTsKIAkJZGF0YS0+cnZvID0gcHNiLT5mbGFnczIgJiAzOwogCQlkYXRhLT5pcnQgPSAoKHBzYi0+ZmxhZ3MyKSA+PiAyKSAmIDM7CiAJCW12cyA9ICgocHNiLT5mbGFnczIpID4+IDQpICYgMzsKIAkJZGF0YS0+dmlkbXZzID0gMSA8PCBtdnM7CiAJCWRhdGEtPmJhdHBzID0gKChwc2ItPmZsYWdzMikgPj4gNikgJiAzOwogCi0JCWRwcmludGsoInJhbXAgdm9sdGFnZSBvZmZzZXQ6ICVkXG4iLCBkYXRhLT5ydm8pOwotCQlkcHJpbnRrKCJpc29jaHJvbm91cyByZWxpZWYgdGltZTogJWRcbiIsIGRhdGEtPmlydCk7Ci0JCWRwcmludGsoIm1heGltdW0gdm9sdGFnZSBzdGVwOiAlZCAtIDB4JXhcbiIsIG12cywgZGF0YS0+dmlkbXZzKTsKKwkJcHJfZGVidWcoInJhbXAgdm9sdGFnZSBvZmZzZXQ6ICVkXG4iLCBkYXRhLT5ydm8pOworCQlwcl9kZWJ1ZygiaXNvY2hyb25vdXMgcmVsaWVmIHRpbWU6ICVkXG4iLCBkYXRhLT5pcnQpOworCQlwcl9kZWJ1ZygibWF4aW11bSB2b2x0YWdlIHN0ZXA6ICVkIC0gMHgleFxuIiwgbXZzLCBkYXRhLT52aWRtdnMpOwogCi0JCWRwcmludGsoIm51bXBzdDogMHgleFxuIiwgcHNiLT5udW1fdGFibGVzKTsKKwkJcHJfZGVidWcoIm51bXBzdDogMHgleFxuIiwgcHNiLT5udW1fdGFibGVzKTsKIAkJY3BzdCA9IHBzYi0+bnVtX3RhYmxlczsKIAkJaWYgKChwc2ItPmNwdWlkID09IDB4MDAwMDBmYzApIHx8CiAJCSAgICAocHNiLT5jcHVpZCA9PSAweDAwMDAwZmUwKSkgewpAQCAtNzgzLDEzICs3ODMsMTMgQEAKIAkJfQogCiAJCWRhdGEtPnBsbGxvY2sgPSBwc2ItPnBsbGxvY2t0aW1lOwotCQlkcHJpbnRrKCJwbGxsb2NrdGltZTogMHgleCAodW5pdHMgMXVzKVxuIiwgcHNiLT5wbGxsb2NrdGltZSk7Ci0JCWRwcmludGsoIm1heGZpZDogMHgleFxuIiwgcHNiLT5tYXhmaWQpOwotCQlkcHJpbnRrKCJtYXh2aWQ6IDB4JXhcbiIsIHBzYi0+bWF4dmlkKTsKKwkJcHJfZGVidWcoInBsbGxvY2t0aW1lOiAweCV4ICh1bml0cyAxdXMpXG4iLCBwc2ItPnBsbGxvY2t0aW1lKTsKKwkJcHJfZGVidWcoIm1heGZpZDogMHgleFxuIiwgcHNiLT5tYXhmaWQpOworCQlwcl9kZWJ1ZygibWF4dmlkOiAweCV4XG4iLCBwc2ItPm1heHZpZCk7CiAJCW1heHZpZCA9IHBzYi0+bWF4dmlkOwogCiAJCWRhdGEtPm51bXBzID0gcHNiLT5udW1wczsKLQkJZHByaW50aygibnVtcHN0YXRlczogMHgleFxuIiwgZGF0YS0+bnVtcHMpOworCQlwcl9kZWJ1ZygibnVtcHN0YXRlczogMHgleFxuIiwgZGF0YS0+bnVtcHMpOwogCQlyZXR1cm4gZmlsbF9wb3dlcm5vd190YWJsZShkYXRhLAogCQkJCShzdHJ1Y3QgcHN0X3MgKikocHNiKzEpLCBtYXh2aWQpOwogCX0KQEAgLTgzNCwxMyArODM0LDEzIEBACiAJdTY0IGNvbnRyb2wsIHN0YXR1czsKIAogCWlmIChhY3BpX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wZXJmb3JtYW5jZSgmZGF0YS0+YWNwaV9kYXRhLCBkYXRhLT5jcHUpKSB7Ci0JCWRwcmludGsoInJlZ2lzdGVyIHBlcmZvcm1hbmNlIGZhaWxlZDogYmFkIEFDUEkgZGF0YVxuIik7CisJCXByX2RlYnVnKCJyZWdpc3RlciBwZXJmb3JtYW5jZSBmYWlsZWQ6IGJhZCBBQ1BJIGRhdGFcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAkvKiB2ZXJpZnkgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBBQ1BJIHN0cnVjdHVyZXMgKi8KIAlpZiAoZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50IDw9IDEpIHsKLQkJZHByaW50aygiTm8gQUNQSSBQLVN0YXRlc1xuIik7CisJCXByX2RlYnVnKCJObyBBQ1BJIFAtU3RhdGVzXG4iKTsKIAkJZ290byBlcnJfb3V0OwogCX0KIApAQCAtODQ5LDcgKzg0OSw3IEBACiAKIAlpZiAoKGNvbnRyb2wgIT0gQUNQSV9BRFJfU1BBQ0VfRklYRURfSEFSRFdBUkUpIHx8CiAJICAgIChzdGF0dXMgIT0gQUNQSV9BRFJfU1BBQ0VfRklYRURfSEFSRFdBUkUpKSB7Ci0JCWRwcmludGsoIkludmFsaWQgY29udHJvbC9zdGF0dXMgcmVnaXN0ZXJzICgleCAtICV4KVxuIiwKKwkJcHJfZGVidWcoIkludmFsaWQgY29udHJvbC9zdGF0dXMgcmVnaXN0ZXJzICglbGx4IC0gJWxseClcbiIsCiAJCQljb250cm9sLCBzdGF0dXMpOwogCQlnb3RvIGVycl9vdXQ7CiAJfQpAQCAtODU4LDcgKzg1OCw3IEBACiAJcG93ZXJub3dfdGFibGUgPSBrbWFsbG9jKChzaXplb2Yoc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlKQogCQkqIChkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQgKyAxKSksIEdGUF9LRVJORUwpOwogCWlmICghcG93ZXJub3dfdGFibGUpIHsKLQkJZHByaW50aygicG93ZXJub3dfdGFibGUgbWVtb3J5IGFsbG9jIGZhaWx1cmVcbiIpOworCQlwcl9kZWJ1ZygicG93ZXJub3dfdGFibGUgbWVtb3J5IGFsbG9jIGZhaWx1cmVcbiIpOwogCQlnb3RvIGVycl9vdXQ7CiAJfQogCkBAIC05MjgsNyArOTI4LDcgQEAKIAkJfQogCQlyZG1zcihNU1JfUFNUQVRFX0RFRl9CQVNFICsgaW5kZXgsIGxvLCBoaSk7CiAJCWlmICghKGhpICYgSFdfUFNUQVRFX1ZBTElEX01BU0spKSB7Ci0JCQlkcHJpbnRrKCJpbnZhbGlkIHBzdGF0ZSAlZCwgaWdub3JpbmdcbiIsIGluZGV4KTsKKwkJCXByX2RlYnVnKCJpbnZhbGlkIHBzdGF0ZSAlZCwgaWdub3JpbmdcbiIsIGluZGV4KTsKIAkJCWludmFsaWRhdGVfZW50cnkocG93ZXJub3dfdGFibGUsIGkpOwogCQkJY29udGludWU7CiAJCX0KQEAgLTk2OCw3ICs5NjgsNyBAQAogCQkJdmlkID0gKGNvbnRyb2wgPj4gVklEX1NISUZUKSAmIFZJRF9NQVNLOwogCQl9CiAKLQkJZHByaW50aygiICAgJWQgOiBmaWQgMHgleCwgdmlkIDB4JXhcbiIsIGksIGZpZCwgdmlkKTsKKwkJcHJfZGVidWcoIiAgICVkIDogZmlkIDB4JXgsIHZpZCAweCV4XG4iLCBpLCBmaWQsIHZpZCk7CiAKIAkJaW5kZXggPSBmaWQgfCAodmlkPDw4KTsKIAkJcG93ZXJub3dfdGFibGVbaV0uaW5kZXggPSBpbmRleDsKQEAgLTk3OCw3ICs5NzgsNyBAQAogCiAJCS8qIHZlcmlmeSBmcmVxdWVuY3kgaXMgT0sgKi8KIAkJaWYgKChmcmVxID4gKE1BWF9GUkVRICogMTAwMCkpIHx8IChmcmVxIDwgKE1JTl9GUkVRICogMTAwMCkpKSB7Ci0JCQlkcHJpbnRrKCJpbnZhbGlkIGZyZXEgJXUga0h6LCBpZ25vcmluZ1xuIiwgZnJlcSk7CisJCQlwcl9kZWJ1ZygiaW52YWxpZCBmcmVxICV1IGtIeiwgaWdub3JpbmdcbiIsIGZyZXEpOwogCQkJaW52YWxpZGF0ZV9lbnRyeShwb3dlcm5vd190YWJsZSwgaSk7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtOTg2LDcgKzk4Niw3IEBACiAJCS8qIHZlcmlmeSB2b2x0YWdlIGlzIE9LIC0KIAkJICogQklPU3MgYXJlIHVzaW5nICJvZmYiIHRvIGluZGljYXRlIGludmFsaWQgKi8KIAkJaWYgKHZpZCA9PSBWSURfT0ZGKSB7Ci0JCQlkcHJpbnRrKCJpbnZhbGlkIHZpZCAldSwgaWdub3JpbmdcbiIsIHZpZCk7CisJCQlwcl9kZWJ1ZygiaW52YWxpZCB2aWQgJXUsIGlnbm9yaW5nXG4iLCB2aWQpOwogCQkJaW52YWxpZGF0ZV9lbnRyeShwb3dlcm5vd190YWJsZSwgaSk7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtMTA0Nyw3ICsxMDQ3LDcgQEAKIAlpbnQgcmVzLCBpOwogCXN0cnVjdCBjcHVmcmVxX2ZyZXFzIGZyZXFzOwogCi0JZHByaW50aygiY3B1ICVkIHRyYW5zaXRpb24gdG8gaW5kZXggJXVcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgaW5kZXgpOworCXByX2RlYnVnKCJjcHUgJWQgdHJhbnNpdGlvbiB0byBpbmRleCAldVxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBpbmRleCk7CiAKIAkvKiBmaWQvdmlkIGNvcnJlY3RuZXNzIGNoZWNrIGZvciBrOCAqLwogCS8qIGZpZCBhcmUgdGhlIGxvd2VyIDggYml0cyBvZiB0aGUgaW5kZXggd2Ugc3RvcmVkIGludG8KQEAgLTEwNTcsMTggKzEwNTcsMTggQEAKIAlmaWQgPSBkYXRhLT5wb3dlcm5vd190YWJsZVtpbmRleF0uaW5kZXggJiAweEZGOwogCXZpZCA9IChkYXRhLT5wb3dlcm5vd190YWJsZVtpbmRleF0uaW5kZXggJiAweEZGMDApID4+IDg7CiAKLQlkcHJpbnRrKCJ0YWJsZSBtYXRjaGVkIGZpZCAweCV4LCBnaXZpbmcgdmlkIDB4JXhcbiIsIGZpZCwgdmlkKTsKKwlwcl9kZWJ1ZygidGFibGUgbWF0Y2hlZCBmaWQgMHgleCwgZ2l2aW5nIHZpZCAweCV4XG4iLCBmaWQsIHZpZCk7CiAKIAlpZiAocXVlcnlfY3VycmVudF92YWx1ZXNfd2l0aF9wZW5kaW5nX3dhaXQoZGF0YSkpCiAJCXJldHVybiAxOwogCiAJaWYgKChkYXRhLT5jdXJydmlkID09IHZpZCkgJiYgKGRhdGEtPmN1cnJmaWQgPT0gZmlkKSkgewotCQlkcHJpbnRrKCJ0YXJnZXQgbWF0Y2hlcyBjdXJyZW50IHZhbHVlcyAoZmlkIDB4JXgsIHZpZCAweCV4KVxuIiwKKwkJcHJfZGVidWcoInRhcmdldCBtYXRjaGVzIGN1cnJlbnQgdmFsdWVzIChmaWQgMHgleCwgdmlkIDB4JXgpXG4iLAogCQkJZmlkLCB2aWQpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlkcHJpbnRrKCJjcHUgJWQsIGNoYW5naW5nIHRvIGZpZCAweCV4LCB2aWQgMHgleFxuIiwKKwlwcl9kZWJ1ZygiY3B1ICVkLCBjaGFuZ2luZyB0byBmaWQgMHgleCwgdmlkIDB4JXhcbiIsCiAJCXNtcF9wcm9jZXNzb3JfaWQoKSwgZmlkLCB2aWQpOwogCWZyZXFzLm9sZCA9IGZpbmRfa2h6X2ZyZXFfZnJvbV9maWQoZGF0YS0+Y3VycmZpZCk7CiAJZnJlcXMubmV3ID0gZmluZF9raHpfZnJlcV9mcm9tX2ZpZChmaWQpOwpAQCAtMTA5Niw3ICsxMDk2LDcgQEAKIAlpbnQgcmVzLCBpOwogCXN0cnVjdCBjcHVmcmVxX2ZyZXFzIGZyZXFzOwogCi0JZHByaW50aygiY3B1ICVkIHRyYW5zaXRpb24gdG8gaW5kZXggJXVcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgaW5kZXgpOworCXByX2RlYnVnKCJjcHUgJWQgdHJhbnNpdGlvbiB0byBpbmRleCAldVxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBpbmRleCk7CiAKIAkvKiBnZXQgTVNSIGluZGV4IGZvciBoYXJkd2FyZSBwc3RhdGUgdHJhbnNpdGlvbiAqLwogCXBzdGF0ZSA9IGluZGV4ICYgSFdfUFNUQVRFX01BU0s7CkBAIC0xMTU2LDE0ICsxMTU2LDE0IEBACiAJCWdvdG8gZXJyX291dDsKIAl9CiAKLQlkcHJpbnRrKCJ0YXJnOiBjcHUgJWQsICVkIGtIeiwgbWluICVkLCBtYXggJWQsIHJlbGF0aW9uICVkXG4iLAorCXByX2RlYnVnKCJ0YXJnOiBjcHUgJWQsICVkIGtIeiwgbWluICVkLCBtYXggJWQsIHJlbGF0aW9uICVkXG4iLAogCQlwb2wtPmNwdSwgdGFyZ2ZyZXEsIHBvbC0+bWluLCBwb2wtPm1heCwgcmVsYXRpb24pOwogCiAJaWYgKHF1ZXJ5X2N1cnJlbnRfdmFsdWVzX3dpdGhfcGVuZGluZ193YWl0KGRhdGEpKQogCQlnb3RvIGVycl9vdXQ7CiAKIAlpZiAoY3B1X2ZhbWlseSAhPSBDUFVfSFdfUFNUQVRFKSB7Ci0JCWRwcmludGsoInRhcmc6IGN1cnIgZmlkIDB4JXgsIHZpZCAweCV4XG4iLAorCQlwcl9kZWJ1ZygidGFyZzogY3VyciBmaWQgMHgleCwgdmlkIDB4JXhcbiIsCiAJCWRhdGEtPmN1cnJmaWQsIGRhdGEtPmN1cnJ2aWQpOwogCiAJCWlmICgoY2hlY2t2aWQgIT0gZGF0YS0+Y3VycnZpZCkgfHwKQEAgLTEzMTksNyArMTMxOSw3IEBACiAJCQkJZGF0YS0+Y3VycnBzdGF0ZSk7CiAJZWxzZQogCQlwb2wtPmN1ciA9IGZpbmRfa2h6X2ZyZXFfZnJvbV9maWQoZGF0YS0+Y3VycmZpZCk7Ci0JZHByaW50aygicG9saWN5IGN1cnJlbnQgZnJlcXVlbmN5ICVkIGtIelxuIiwgcG9sLT5jdXIpOworCXByX2RlYnVnKCJwb2xpY3kgY3VycmVudCBmcmVxdWVuY3kgJWQga0h6XG4iLCBwb2wtPmN1cik7CiAKIAkvKiBtaW4vbWF4IHRoZSBjcHUgaXMgY2FwYWJsZSBvZiAqLwogCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9jcHVpbmZvKHBvbCwgZGF0YS0+cG93ZXJub3dfdGFibGUpKSB7CkBAIC0xMzM3LDEwICsxMzM3LDEwIEBACiAJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIoZGF0YS0+cG93ZXJub3dfdGFibGUsIHBvbC0+Y3B1KTsKIAogCWlmIChjcHVfZmFtaWx5ID09IENQVV9IV19QU1RBVEUpCi0JCWRwcmludGsoImNwdV9pbml0IGRvbmUsIGN1cnJlbnQgcHN0YXRlIDB4JXhcbiIsCisJCXByX2RlYnVnKCJjcHVfaW5pdCBkb25lLCBjdXJyZW50IHBzdGF0ZSAweCV4XG4iLAogCQkJCWRhdGEtPmN1cnJwc3RhdGUpOwogCWVsc2UKLQkJZHByaW50aygiY3B1X2luaXQgZG9uZSwgY3VycmVudCBmaWQgMHgleCwgdmlkIDB4JXhcbiIsCisJCXByX2RlYnVnKCJjcHVfaW5pdCBkb25lLCBjdXJyZW50IGZpZCAweCV4LCB2aWQgMHgleFxuIiwKIAkJCWRhdGEtPmN1cnJmaWQsIGRhdGEtPmN1cnJ2aWQpOwogCiAJcGVyX2NwdShwb3dlcm5vd19kYXRhLCBwb2wtPmNwdSkgPSBkYXRhOwpAQCAtMTU4Niw3ICsxNTg2LDcgQEAKIC8qIGRyaXZlciBlbnRyeSBwb2ludCBmb3IgdGVybSAqLwogc3RhdGljIHZvaWQgX19leGl0IHBvd2Vybm93azhfZXhpdCh2b2lkKQogewotCWRwcmludGsoImV4aXRcbiIpOworCXByX2RlYnVnKCJleGl0XG4iKTsKIAogCWlmIChib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQ1BCKSkgewogCQltc3JzX2ZyZWUobXNycyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguaCBiL2RyaXZlcnMvY3B1ZnJlcS9wb3dlcm5vdy1rOC5oCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIGFyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rOC5oCnJlbmFtZSB0byBkcml2ZXJzL2NwdWZyZXEvcG93ZXJub3ctazguaAppbmRleCBkZjM1MjliLi4zNzQ0ZDI2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguaAorKysgYi9kcml2ZXJzL2NwdWZyZXEvcG93ZXJub3ctazguaApAQCAtMjExLDggKzIxMSw2IEBACiAJdTggdmlkOwogfTsKIAotI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsICJwb3dlcm5vdy1rOCIsIG1zZykKLQogc3RhdGljIGludCBjb3JlX3ZvbHRhZ2VfcHJlX3RyYW5zaXRpb24oc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsCiAJdTMyIHJlcXZpZCwgdTMyIHJlZ2ZpZCk7CiBzdGF0aWMgaW50IGNvcmVfdm9sdGFnZV9wb3N0X3RyYW5zaXRpb24oc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHUzMiByZXF2aWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NjNTIwX2ZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9zYzUyMF9mcmVxLmMKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NjNTIwX2ZyZXEuYwpyZW5hbWUgdG8gZHJpdmVycy9jcHVmcmVxL3NjNTIwX2ZyZXEuYwppbmRleCA0MzVhOTk2Li4xZTIwNWU2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc2M1MjBfZnJlcS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9zYzUyMF9mcmVxLmMKQEAgLTI5LDggKzI5LDYgQEAKIAogc3RhdGljIF9fdTggX19pb21lbSAqY3B1Y3RsOwogCi0jZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgXAotCQkic2M1MjBfZnJlcSIsIG1zZykKICNkZWZpbmUgUEZYICJzYzUyMF9mcmVxOiAiCiAKIHN0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgc2M1MjBfZnJlcV90YWJsZVtdID0gewpAQCAtNjYsNyArNjQsNyBAQAogCiAJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKIAotCWRwcmludGsoImF0dGVtcHRpbmcgdG8gc2V0IGZyZXF1ZW5jeSB0byAlaSBrSHpcbiIsCisJcHJfZGVidWcoImF0dGVtcHRpbmcgdG8gc2V0IGZyZXF1ZW5jeSB0byAlaSBrSHpcbiIsCiAJCQlzYzUyMF9mcmVxX3RhYmxlW3N0YXRlXS5mcmVxdWVuY3kpOwogCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKQEAgLTE2MSw3ICsxNTksNyBAQAogCS8qIFRlc3QgaWYgd2UgaGF2ZSB0aGUgcmlnaHQgaGFyZHdhcmUgKi8KIAlpZiAoYy0+eDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0FNRCB8fAogCSAgICBjLT54ODYgIT0gNCB8fCBjLT54ODZfbW9kZWwgIT0gOSkgewotCQlkcHJpbnRrKCJubyBFbGFuIFNDNTIwIHByb2Nlc3NvciBmb3VuZCFcbiIpOworCQlwcl9kZWJ1Zygibm8gRWxhbiBTQzUyMCBwcm9jZXNzb3IgZm91bmQhXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCWNwdWN0bCA9IGlvcmVtYXAoKHVuc2lnbmVkIGxvbmcpKE1NQ1JfQkFTRSArIE9GRlNfQ1BVQ1RMKSwgMSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWNlbnRyaW5vLmMgYi9kcml2ZXJzL2NwdWZyZXEvc3BlZWRzdGVwLWNlbnRyaW5vLmMKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1jZW50cmluby5jCnJlbmFtZSB0byBkcml2ZXJzL2NwdWZyZXEvc3BlZWRzdGVwLWNlbnRyaW5vLmMKaW5kZXggOWIxZmYzNy4uNmVhMzQ1NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1jZW50cmluby5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYwpAQCAtMjksOSArMjksNiBAQAogI2RlZmluZSBQRlgJCSJzcGVlZHN0ZXAtY2VudHJpbm86ICIKICNkZWZpbmUgTUFJTlRBSU5FUgkiY3B1ZnJlcUB2Z2VyLmtlcm5lbC5vcmciCiAKLSNkZWZpbmUgZHByaW50ayhtc2cuLi4pIFwKLQljcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgInNwZWVkc3RlcC1jZW50cmlubyIsIG1zZykKLQogI2RlZmluZSBJTlRFTF9NU1JfUkFOR0UJKDB4ZmZmZikKIAogc3RydWN0IGNwdV9pZApAQCAtMjQ0LDcgKzI0MSw3IEBACiAKIAlpZiAobW9kZWwtPmNwdV9pZCA9PSBOVUxMKSB7CiAJCS8qIE5vIG1hdGNoIGF0IGFsbCAqLwotCQlkcHJpbnRrKCJubyBzdXBwb3J0IGZvciBDUFUgbW9kZWwgXCIlc1wiOiAiCisJCXByX2RlYnVnKCJubyBzdXBwb3J0IGZvciBDUFUgbW9kZWwgXCIlc1wiOiAiCiAJCSAgICAgICAic2VuZCAvcHJvYy9jcHVpbmZvIHRvICIgTUFJTlRBSU5FUiAiXG4iLAogCQkgICAgICAgY3B1LT54ODZfbW9kZWxfaWQpOwogCQlyZXR1cm4gLUVOT0VOVDsKQEAgLTI1MiwxNSArMjQ5LDE1IEBACiAKIAlpZiAobW9kZWwtPm9wX3BvaW50cyA9PSBOVUxMKSB7CiAJCS8qIE1hdGNoZWQgYSBub24tbWF0Y2ggKi8KLQkJZHByaW50aygibm8gdGFibGUgc3VwcG9ydCBmb3IgQ1BVIG1vZGVsIFwiJXNcIlxuIiwKKwkJcHJfZGVidWcoIm5vIHRhYmxlIHN1cHBvcnQgZm9yIENQVSBtb2RlbCBcIiVzXCJcbiIsCiAJCSAgICAgICBjcHUtPng4Nl9tb2RlbF9pZCk7Ci0JCWRwcmludGsoInRyeSB1c2luZyB0aGUgYWNwaS1jcHVmcmVxIGRyaXZlclxuIik7CisJCXByX2RlYnVnKCJ0cnkgdXNpbmcgdGhlIGFjcGktY3B1ZnJlcSBkcml2ZXJcbiIpOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKIAlwZXJfY3B1KGNlbnRyaW5vX21vZGVsLCBwb2xpY3ktPmNwdSkgPSBtb2RlbDsKIAotCWRwcmludGsoImZvdW5kIFwiJXNcIjogbWF4IGZyZXF1ZW5jeTogJWRrSHpcbiIsCisJcHJfZGVidWcoImZvdW5kIFwiJXNcIjogbWF4IGZyZXF1ZW5jeTogJWRrSHpcbiIsCiAJICAgICAgIG1vZGVsLT5tb2RlbF9uYW1lLCBtb2RlbC0+bWF4X2ZyZXEpOwogCiAJcmV0dXJuIDA7CkBAIC0zNjksNyArMzY2LDcgQEAKIAkJcGVyX2NwdShjZW50cmlub19jcHUsIHBvbGljeS0+Y3B1KSA9ICZjcHVfaWRzW2ldOwogCiAJaWYgKCFwZXJfY3B1KGNlbnRyaW5vX2NwdSwgcG9saWN5LT5jcHUpKSB7Ci0JCWRwcmludGsoImZvdW5kIHVuc3VwcG9ydGVkIENQVSB3aXRoICIKKwkJcHJfZGVidWcoImZvdW5kIHVuc3VwcG9ydGVkIENQVSB3aXRoICIKIAkJIkVuaGFuY2VkIFNwZWVkU3RlcDogc2VuZCAvcHJvYy9jcHVpbmZvIHRvICIKIAkJTUFJTlRBSU5FUiAiXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0zODUsNyArMzgyLDcgQEAKIAogCWlmICghKGwgJiBNU1JfSUEzMl9NSVNDX0VOQUJMRV9FTkhBTkNFRF9TUEVFRFNURVApKSB7CiAJCWwgfD0gTVNSX0lBMzJfTUlTQ19FTkFCTEVfRU5IQU5DRURfU1BFRURTVEVQOwotCQlkcHJpbnRrKCJ0cnlpbmcgdG8gZW5hYmxlIEVuaGFuY2VkIFNwZWVkU3RlcCAoJXgpXG4iLCBsKTsKKwkJcHJfZGVidWcoInRyeWluZyB0byBlbmFibGUgRW5oYW5jZWQgU3BlZWRTdGVwICgleClcbiIsIGwpOwogCQl3cm1zcihNU1JfSUEzMl9NSVNDX0VOQUJMRSwgbCwgaCk7CiAKIAkJLyogY2hlY2sgdG8gc2VlIGlmIGl0IHN0dWNrICovCkBAIC00MDIsNyArMzk5LDcgQEAKIAkJCQkJCS8qIDEwdVMgdHJhbnNpdGlvbiBsYXRlbmN5ICovCiAJcG9saWN5LT5jdXIgPSBmcmVxOwogCi0JZHByaW50aygiY2VudHJpbm9fY3B1X2luaXQ6IGN1cj0lZGtIelxuIiwgcG9saWN5LT5jdXIpOworCXByX2RlYnVnKCJjZW50cmlub19jcHVfaW5pdDogY3VyPSVka0h6XG4iLCBwb2xpY3ktPmN1cik7CiAKIAlyZXQgPSBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9jcHVpbmZvKHBvbGljeSwKIAkJcGVyX2NwdShjZW50cmlub19tb2RlbCwgcG9saWN5LT5jcHUpLT5vcF9wb2ludHMpOwpAQCAtNDk4LDcgKzQ5NSw3IEBACiAJCQlnb29kX2NwdSA9IGo7CiAKIAkJaWYgKGdvb2RfY3B1ID49IG5yX2NwdV9pZHMpIHsKLQkJCWRwcmludGsoImNvdWxkbid0IGxpbWl0IHRvIENQVXMgaW4gdGhpcyBkb21haW5cbiIpOworCQkJcHJfZGVidWcoImNvdWxkbid0IGxpbWl0IHRvIENQVXMgaW4gdGhpcyBkb21haW5cbiIpOwogCQkJcmV0dmFsID0gLUVBR0FJTjsKIAkJCWlmIChmaXJzdF9jcHUpIHsKIAkJCQkvKiBXZSBoYXZlbid0IHN0YXJ0ZWQgdGhlIHRyYW5zaXRpb24geWV0LiAqLwpAQCAtNTEyLDcgKzUwOSw3IEBACiAJCWlmIChmaXJzdF9jcHUpIHsKIAkJCXJkbXNyX29uX2NwdShnb29kX2NwdSwgTVNSX0lBMzJfUEVSRl9DVEwsICZvbGRtc3IsICZoKTsKIAkJCWlmIChtc3IgPT0gKG9sZG1zciAmIDB4ZmZmZikpIHsKLQkJCQlkcHJpbnRrKCJubyBjaGFuZ2UgbmVlZGVkIC0gbXNyIHdhcyBhbmQgbmVlZHMgIgorCQkJCXByX2RlYnVnKCJubyBjaGFuZ2UgbmVlZGVkIC0gbXNyIHdhcyBhbmQgbmVlZHMgIgogCQkJCQkidG8gYmUgJXhcbiIsIG9sZG1zcik7CiAJCQkJcmV0dmFsID0gMDsKIAkJCQlnb3RvIG91dDsKQEAgLTUyMSw3ICs1MTgsNyBAQAogCQkJZnJlcXMub2xkID0gZXh0cmFjdF9jbG9jayhvbGRtc3IsIGNwdSwgMCk7CiAJCQlmcmVxcy5uZXcgPSBleHRyYWN0X2Nsb2NrKG1zciwgY3B1LCAwKTsKIAotCQkJZHByaW50aygidGFyZ2V0PSVka0h6IG9sZD0lZCBuZXc9JWQgbXNyPSUwNHhcbiIsCisJCQlwcl9kZWJ1ZygidGFyZ2V0PSVka0h6IG9sZD0lZCBuZXc9JWQgbXNyPSUwNHhcbiIsCiAJCQkJdGFyZ2V0X2ZyZXEsIGZyZXFzLm9sZCwgZnJlcXMubmV3LCBtc3IpOwogCiAJCQlmb3JfZWFjaF9jcHUoaywgcG9saWN5LT5jcHVzKSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWljaC5jIGIvZHJpdmVycy9jcHVmcmVxL3NwZWVkc3RlcC1pY2guYwpzaW1pbGFyaXR5IGluZGV4IDkyJQpyZW5hbWUgZnJvbSBhcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWljaC5jCnJlbmFtZSB0byBkcml2ZXJzL2NwdWZyZXEvc3BlZWRzdGVwLWljaC5jCmluZGV4IDU2MTc1OGUuLmE3NDhjZTcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtaWNoLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL3NwZWVkc3RlcC1pY2guYwpAQCAtNTMsMTAgKzUzLDYgQEAKIH07CiAKIAotI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsIFwKLQkJInNwZWVkc3RlcC1pY2giLCBtc2cpCi0KLQogLyoqCiAgKiBzcGVlZHN0ZXBfZmluZF9yZWdpc3RlciAtIHJlYWQgdGhlIFBNQkFTRSBhZGRyZXNzCiAgKgpAQCAtODAsNyArNzYsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlkcHJpbnRrKCJwbWJhc2UgaXMgMHgleFxuIiwgcG1iYXNlKTsKKwlwcl9kZWJ1ZygicG1iYXNlIGlzIDB4JXhcbiIsIHBtYmFzZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwNiwxMyArMTAyLDEzIEBACiAJLyogcmVhZCBzdGF0ZSAqLwogCXZhbHVlID0gaW5iKHBtYmFzZSArIDB4NTApOwogCi0JZHByaW50aygicmVhZCBhdCBwbWJhc2UgMHgleCArIDB4NTAgcmV0dXJuZWQgMHgleFxuIiwgcG1iYXNlLCB2YWx1ZSk7CisJcHJfZGVidWcoInJlYWQgYXQgcG1iYXNlIDB4JXggKyAweDUwIHJldHVybmVkIDB4JXhcbiIsIHBtYmFzZSwgdmFsdWUpOwogCiAJLyogd3JpdGUgbmV3IHN0YXRlICovCiAJdmFsdWUgJj0gMHhGRTsKIAl2YWx1ZSB8PSBzdGF0ZTsKIAotCWRwcmludGsoIndyaXRpbmcgMHgleCB0byBwbWJhc2UgMHgleCArIDB4NTBcbiIsIHZhbHVlLCBwbWJhc2UpOworCXByX2RlYnVnKCJ3cml0aW5nIDB4JXggdG8gcG1iYXNlIDB4JXggKyAweDUwXG4iLCB2YWx1ZSwgcG1iYXNlKTsKIAogCS8qIERpc2FibGUgYnVzIG1hc3RlciBhcmJpdHJhdGlvbiAqLwogCXBtMl9ibGsgPSBpbmIocG1iYXNlICsgMHgyMCk7CkBAIC0xMzIsMTAgKzEyOCwxMCBAQAogCS8qIEVuYWJsZSBJUlFzICovCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCi0JZHByaW50aygicmVhZCBhdCBwbWJhc2UgMHgleCArIDB4NTAgcmV0dXJuZWQgMHgleFxuIiwgcG1iYXNlLCB2YWx1ZSk7CisJcHJfZGVidWcoInJlYWQgYXQgcG1iYXNlIDB4JXggKyAweDUwIHJldHVybmVkIDB4JXhcbiIsIHBtYmFzZSwgdmFsdWUpOwogCiAJaWYgKHN0YXRlID09ICh2YWx1ZSAmIDB4MSkpCi0JCWRwcmludGsoImNoYW5nZSB0byAldSBNSHogc3VjY2VlZGVkXG4iLAorCQlwcl9kZWJ1ZygiY2hhbmdlIHRvICV1IE1IeiBzdWNjZWVkZWRcbiIsCiAJCQlzcGVlZHN0ZXBfZ2V0X2ZyZXF1ZW5jeShzcGVlZHN0ZXBfcHJvY2Vzc29yKSAvIDEwMDApOwogCWVsc2UKIAkJcHJpbnRrKEtFUk5fRVJSICJjcHVmcmVxOiBjaGFuZ2UgZmFpbGVkIC0gSS9PIGVycm9yXG4iKTsKQEAgLTE2NSw3ICsxNjEsNyBAQAogCXBjaV9yZWFkX2NvbmZpZ193b3JkKHNwZWVkc3RlcF9jaGlwc2V0X2RldiwgMHgwMEEwLCAmdmFsdWUpOwogCWlmICghKHZhbHVlICYgMHgwOCkpIHsKIAkJdmFsdWUgfD0gMHgwODsKLQkJZHByaW50aygiYWN0aXZhdGluZyBTcGVlZFN0ZXAgKFRNKSByZWdpc3RlcnNcbiIpOworCQlwcl9kZWJ1ZygiYWN0aXZhdGluZyBTcGVlZFN0ZXAgKFRNKSByZWdpc3RlcnNcbiIpOwogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoc3BlZWRzdGVwX2NoaXBzZXRfZGV2LCAweDAwQTAsIHZhbHVlKTsKIAl9CiAKQEAgLTIxOCw3ICsyMTQsNyBAQAogCQkJcmV0dXJuIDI7IC8qIDItTSAqLwogCiAJCWlmIChob3N0YnJpZGdlLT5yZXZpc2lvbiA8IDUpIHsKLQkJCWRwcmludGsoImhvc3RicmlkZ2UgZG9lcyBub3Qgc3VwcG9ydCBzcGVlZHN0ZXBcbiIpOworCQkJcHJfZGVidWcoImhvc3RicmlkZ2UgZG9lcyBub3Qgc3VwcG9ydCBzcGVlZHN0ZXBcbiIpOwogCQkJc3BlZWRzdGVwX2NoaXBzZXRfZGV2ID0gTlVMTDsKIAkJCXBjaV9kZXZfcHV0KGhvc3RicmlkZ2UpOwogCQkJcmV0dXJuIDA7CkBAIC0yNDYsNyArMjQyLDcgQEAKIAlpZiAoc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgZ2V0X2ZyZXFfZGF0YSwgJnNwZWVkLCAxKSAhPSAwKQogCQlCVUcoKTsKIAotCWRwcmludGsoImRldGVjdGVkICV1IGtIeiBhcyBjdXJyZW50IGZyZXF1ZW5jeVxuIiwgc3BlZWQpOworCXByX2RlYnVnKCJkZXRlY3RlZCAldSBrSHogYXMgY3VycmVudCBmcmVxdWVuY3lcbiIsIHNwZWVkKTsKIAlyZXR1cm4gc3BlZWQ7CiB9CiAKQEAgLTI3Niw3ICsyNzIsNyBAQAogCWZyZXFzLm5ldyA9IHNwZWVkc3RlcF9mcmVxc1tuZXdzdGF0ZV0uZnJlcXVlbmN5OwogCWZyZXFzLmNwdSA9IHBvbGljeS0+Y3B1OwogCi0JZHByaW50aygidHJhbnNpdGluZyBmcm9tICV1IHRvICV1IGtIelxuIiwgZnJlcXMub2xkLCBmcmVxcy5uZXcpOworCXByX2RlYnVnKCJ0cmFuc2l0aW5nIGZyb20gJXUgdG8gJXUga0h6XG4iLCBmcmVxcy5vbGQsIGZyZXFzLm5ldyk7CiAKIAkvKiBubyB0cmFuc2l0aW9uIG5lY2Vzc2FyeSAqLwogCWlmIChmcmVxcy5vbGQgPT0gZnJlcXMubmV3KQpAQCAtMzUxLDcgKzM0Nyw3IEBACiAJaWYgKCFzcGVlZCkKIAkJcmV0dXJuIC1FSU87CiAKLQlkcHJpbnRrKCJjdXJyZW50bHkgYXQgJXMgc3BlZWQgc2V0dGluZyAtICVpIE1IelxuIiwKKwlwcl9kZWJ1ZygiY3VycmVudGx5IGF0ICVzIHNwZWVkIHNldHRpbmcgLSAlaSBNSHpcbiIsCiAJCShzcGVlZCA9PSBzcGVlZHN0ZXBfZnJlcXNbU1BFRURTVEVQX0xPV10uZnJlcXVlbmN5KQogCQk/ICJsb3ciIDogImhpZ2giLAogCQkoc3BlZWQgLyAxMDAwKSk7CkBAIC00MDUsMTQgKzQwMSwxNCBAQAogCS8qIGRldGVjdCBwcm9jZXNzb3IgKi8KIAlzcGVlZHN0ZXBfcHJvY2Vzc29yID0gc3BlZWRzdGVwX2RldGVjdF9wcm9jZXNzb3IoKTsKIAlpZiAoIXNwZWVkc3RlcF9wcm9jZXNzb3IpIHsKLQkJZHByaW50aygiSW50ZWwoUikgU3BlZWRTdGVwKFRNKSBjYXBhYmxlIHByb2Nlc3NvciAiCisJCXByX2RlYnVnKCJJbnRlbChSKSBTcGVlZFN0ZXAoVE0pIGNhcGFibGUgcHJvY2Vzc29yICIKIAkJCQkibm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJLyogZGV0ZWN0IGNoaXBzZXQgKi8KIAlpZiAoIXNwZWVkc3RlcF9kZXRlY3RfY2hpcHNldCgpKSB7Ci0JCWRwcmludGsoIkludGVsKFIpIFNwZWVkU3RlcChUTSkgZm9yIHRoaXMgY2hpcHNldCBub3QgIgorCQlwcl9kZWJ1ZygiSW50ZWwoUikgU3BlZWRTdGVwKFRNKSBmb3IgdGhpcyBjaGlwc2V0IG5vdCAiCiAJCQkJIih5ZXQpIGF2YWlsYWJsZS5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5jIGIvZHJpdmVycy9jcHVmcmVxL3NwZWVkc3RlcC1saWIuYwpzaW1pbGFyaXR5IGluZGV4IDg5JQpyZW5hbWUgZnJvbSBhcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5jCnJlbmFtZSB0byBkcml2ZXJzL2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5jCmluZGV4IGE5NGVjNmIuLjhhZjJkMmYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL3NwZWVkc3RlcC1saWIuYwpAQCAtMTgsOSArMTgsNiBAQAogI2luY2x1ZGUgPGFzbS90c2MuaD4KICNpbmNsdWRlICJzcGVlZHN0ZXAtbGliLmgiCiAKLSNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCBcCi0JCSJzcGVlZHN0ZXAtbGliIiwgbXNnKQotCiAjZGVmaW5lIFBGWCAic3BlZWRzdGVwLWxpYjogIgogCiAjaWZkZWYgQ09ORklHX1g4Nl9TUEVFRFNURVBfUkVMQVhFRF9DQVBfQ0hFQ0sKQEAgLTc1LDcgKzcyLDcgQEAKIAogCS8qIHJlYWQgTVNSIDB4MmEgLSB3ZSBvbmx5IG5lZWQgdGhlIGxvdyAzMiBiaXRzICovCiAJcmRtc3IoTVNSX0lBMzJfRUJMX0NSX1BPV0VST04sIG1zcl9sbywgbXNyX3RtcCk7Ci0JZHByaW50aygiUDMgLSBNU1JfSUEzMl9FQkxfQ1JfUE9XRVJPTjogMHgleCAweCV4XG4iLCBtc3JfbG8sIG1zcl90bXApOworCXByX2RlYnVnKCJQMyAtIE1TUl9JQTMyX0VCTF9DUl9QT1dFUk9OOiAweCV4IDB4JXhcbiIsIG1zcl9sbywgbXNyX3RtcCk7CiAJbXNyX3RtcCA9IG1zcl9sbzsKIAogCS8qIGRlY29kZSB0aGUgRlNCICovCkBAIC04OSw3ICs4Niw3IEBACiAKIAkvKiBkZWNvZGUgdGhlIG11bHRpcGxpZXIgKi8KIAlpZiAocHJvY2Vzc29yID09IFNQRUVEU1RFUF9DUFVfUElJSV9DX0VBUkxZKSB7Ci0JCWRwcmludGsoIndvcmthcm91bmQgZm9yIGVhcmx5IFBJSUlzXG4iKTsKKwkJcHJfZGVidWcoIndvcmthcm91bmQgZm9yIGVhcmx5IFBJSUlzXG4iKTsKIAkJbXNyX2xvICY9IDB4MDNjMDAwMDA7CiAJfSBlbHNlCiAJCW1zcl9sbyAmPSAweDBiYzAwMDAwOwpAQCAtMTAwLDcgKzk3LDcgQEAKIAkJaisrOwogCX0KIAotCWRwcmludGsoInNwZWVkIGlzICV1XG4iLAorCXByX2RlYnVnKCJzcGVlZCBpcyAldVxuIiwKIAkJKG1zcl9kZWNvZGVfbXVsdFtqXS5yYXRpbyAqIG1zcl9kZWNvZGVfZnNiW2ldLnZhbHVlICogMTAwKSk7CiAKIAlyZXR1cm4gbXNyX2RlY29kZV9tdWx0W2pdLnJhdGlvICogbXNyX2RlY29kZV9mc2JbaV0udmFsdWUgKiAxMDA7CkBAIC0xMTIsNyArMTA5LDcgQEAKIAl1MzIgbXNyX2xvLCBtc3JfdG1wOwogCiAJcmRtc3IoTVNSX0lBMzJfRUJMX0NSX1BPV0VST04sIG1zcl9sbywgbXNyX3RtcCk7Ci0JZHByaW50aygiUE0gLSBNU1JfSUEzMl9FQkxfQ1JfUE9XRVJPTjogMHgleCAweCV4XG4iLCBtc3JfbG8sIG1zcl90bXApOworCXByX2RlYnVnKCJQTSAtIE1TUl9JQTMyX0VCTF9DUl9QT1dFUk9OOiAweCV4IDB4JXhcbiIsIG1zcl9sbywgbXNyX3RtcCk7CiAKIAkvKiBzZWUgdGFibGUgQi0yIG9mIDI0NTQ3MjEyLnBkZiAqLwogCWlmIChtc3JfbG8gJiAweDAwMDQwMDAwKSB7CkBAIC0xMjIsNyArMTE5LDcgQEAKIAl9CiAKIAltc3JfdG1wID0gKG1zcl9sbyA+PiAyMikgJiAweDFmOwotCWRwcmludGsoImJpdHMgMjItMjYgYXJlIDB4JXgsIHNwZWVkIGlzICV1XG4iLAorCXByX2RlYnVnKCJiaXRzIDIyLTI2IGFyZSAweCV4LCBzcGVlZCBpcyAldVxuIiwKIAkJCW1zcl90bXAsIChtc3JfdG1wICogMTAwICogMTAwMCkpOwogCiAJcmV0dXJuIG1zcl90bXAgKiAxMDAgKiAxMDAwOwpAQCAtMTYwLDExICsxNTcsMTEgQEAKIAl9CiAKIAlyZG1zcihNU1JfSUEzMl9FQkxfQ1JfUE9XRVJPTiwgbXNyX2xvLCBtc3JfdG1wKTsKLQlkcHJpbnRrKCJQQ09SRSAtIE1TUl9JQTMyX0VCTF9DUl9QT1dFUk9OOiAweCV4IDB4JXhcbiIsCisJcHJfZGVidWcoIlBDT1JFIC0gTVNSX0lBMzJfRUJMX0NSX1BPV0VST046IDB4JXggMHgleFxuIiwKIAkJCW1zcl9sbywgbXNyX3RtcCk7CiAKIAltc3JfdG1wID0gKG1zcl9sbyA+PiAyMikgJiAweDFmOwotCWRwcmludGsoImJpdHMgMjItMjYgYXJlIDB4JXgsIHNwZWVkIGlzICV1XG4iLAorCXByX2RlYnVnKCJiaXRzIDIyLTI2IGFyZSAweCV4LCBzcGVlZCBpcyAldVxuIiwKIAkJCW1zcl90bXAsIChtc3JfdG1wICogZnNiKSk7CiAKIAlyZXQgPSAobXNyX3RtcCAqIGZzYik7CkBAIC0xOTAsNyArMTg3LDcgQEAKIAogCXJkbXNyKDB4MmMsIG1zcl9sbywgbXNyX2hpKTsKIAotCWRwcmludGsoIlA0IC0gTVNSX0VCQ19GUkVRVUVOQ1lfSUQ6IDB4JXggMHgleFxuIiwgbXNyX2xvLCBtc3JfaGkpOworCXByX2RlYnVnKCJQNCAtIE1TUl9FQkNfRlJFUVVFTkNZX0lEOiAweCV4IDB4JXhcbiIsIG1zcl9sbywgbXNyX2hpKTsKIAogCS8qIGRlY29kZSB0aGUgRlNCOiBzZWUgSUEtMzIgSW50ZWwgKEMpIEFyY2hpdGVjdHVyZSBTb2Z0d2FyZQogCSAqIERldmVsb3BlcidzIE1hbnVhbCwgVm9sdW1lIDM6IFN5c3RlbSBQcmdyYW1taW5nIEd1aWRlLApAQCAtMjE3LDcgKzIxNCw3IEBACiAJLyogTXVsdGlwbGllci4gKi8KIAltdWx0ID0gbXNyX2xvID4+IDI0OwogCi0JZHByaW50aygiUDQgLSBGU0IgJXUga0h6OyBNdWx0aXBsaWVyICV1OyBTcGVlZCAldSBrSHpcbiIsCisJcHJfZGVidWcoIlA0IC0gRlNCICV1IGtIejsgTXVsdGlwbGllciAldTsgU3BlZWQgJXUga0h6XG4iLAogCQkJZnNiLCBtdWx0LCAoZnNiICogbXVsdCkpOwogCiAJcmV0ID0gKGZzYiAqIG11bHQpOwpAQCAtMjU3LDcgKzI1NCw3IEBACiAJc3RydWN0IGNwdWluZm9feDg2ICpjID0gJmNwdV9kYXRhKDApOwogCXUzMiBlYngsIG1zcl9sbywgbXNyX2hpOwogCi0JZHByaW50aygieDg2OiAleCwgbW9kZWw6ICV4XG4iLCBjLT54ODYsIGMtPng4Nl9tb2RlbCk7CisJcHJfZGVidWcoIng4NjogJXgsIG1vZGVsOiAleFxuIiwgYy0+eDg2LCBjLT54ODZfbW9kZWwpOwogCiAJaWYgKChjLT54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfSU5URUwpIHx8CiAJICAgICgoYy0+eDg2ICE9IDYpICYmIChjLT54ODYgIT0gMHhGKSkpCkBAIC0yNzIsNyArMjY5LDcgQEAKIAkJZWJ4ID0gY3B1aWRfZWJ4KDB4MDAwMDAwMDEpOwogCQllYnggJj0gMHgwMDAwMDBGRjsKIAotCQlkcHJpbnRrKCJlYnggdmFsdWUgaXMgJXgsIHg4Nl9tYXNrIGlzICV4XG4iLCBlYngsIGMtPng4Nl9tYXNrKTsKKwkJcHJfZGVidWcoImVieCB2YWx1ZSBpcyAleCwgeDg2X21hc2sgaXMgJXhcbiIsIGVieCwgYy0+eDg2X21hc2spOwogCiAJCXN3aXRjaCAoYy0+eDg2X21hc2spIHsKIAkJY2FzZSA0OgpAQCAtMzI3LDcgKzMyNCw3IEBACiAJCS8qIGNwdWlkX2VieCgxKSBpcyAweDA0IGZvciBkZXNrdG9wIFBJSUksCiAJCSAqIDB4MDYgZm9yIG1vYmlsZSBQSUlJLU0gKi8KIAkJZWJ4ID0gY3B1aWRfZWJ4KDB4MDAwMDAwMDEpOwotCQlkcHJpbnRrKCJlYnggaXMgJXhcbiIsIGVieCk7CisJCXByX2RlYnVnKCJlYnggaXMgJXhcbiIsIGVieCk7CiAKIAkJZWJ4ICY9IDB4MDAwMDAwRkY7CiAKQEAgLTM0NCw3ICszNDEsNyBAQAogCQkvKiBhbGwgbW9iaWxlIFBJSUkgQ29wcGVybWluZXMgaGF2ZSBGU0IgMTAwIE1IegogCQkgKiA9PT4gc29ydCBvdXQgYSBmZXcgZGVza3RvcCBQSUlJcy4gKi8KIAkJcmRtc3IoTVNSX0lBMzJfRUJMX0NSX1BPV0VST04sIG1zcl9sbywgbXNyX2hpKTsKLQkJZHByaW50aygiQ29wcGVybWluZTogTVNSX0lBMzJfRUJMX0NSX1BPV0VST04gaXMgMHgleCwgMHgleFxuIiwKKwkJcHJfZGVidWcoIkNvcHBlcm1pbmU6IE1TUl9JQTMyX0VCTF9DUl9QT1dFUk9OIGlzIDB4JXgsIDB4JXhcbiIsCiAJCQkJbXNyX2xvLCBtc3JfaGkpOwogCQltc3JfbG8gJj0gMHgwMGMwMDAwOwogCQlpZiAobXNyX2xvICE9IDB4MDA4MDAwMCkKQEAgLTM1NywxMiArMzU0LDEyIEBACiAJCSAqIGJpdCA1NiBvciA1NyBpcyBzZXQKIAkJICovCiAJCXJkbXNyKE1TUl9JQTMyX1BMQVRGT1JNX0lELCBtc3JfbG8sIG1zcl9oaSk7Ci0JCWRwcmludGsoIkNvcHBlcm1pbmU6IE1TUl9JQTMyX1BMQVRGT1JNIElEIGlzIDB4JXgsIDB4JXhcbiIsCisJCXByX2RlYnVnKCJDb3BwZXJtaW5lOiBNU1JfSUEzMl9QTEFURk9STSBJRCBpcyAweCV4LCAweCV4XG4iLAogCQkJCW1zcl9sbywgbXNyX2hpKTsKIAkJaWYgKChtc3JfaGkgJiAoMTw8MTgpKSAmJgogCQkgICAgKHJlbGF4ZWRfY2hlY2sgPyAxIDogKG1zcl9oaSAmICgzPDwyNCkpKSkgewogCQkJaWYgKGMtPng4Nl9tYXNrID09IDB4MDEpIHsKLQkJCQlkcHJpbnRrKCJlYXJseSBQSUlJIHZlcnNpb25cbiIpOworCQkJCXByX2RlYnVnKCJlYXJseSBQSUlJIHZlcnNpb25cbiIpOwogCQkJCXJldHVybiBTUEVFRFNURVBfQ1BVX1BJSUlfQ19FQVJMWTsKIAkJCX0gZWxzZQogCQkJCXJldHVybiBTUEVFRFNURVBfQ1BVX1BJSUlfQzsKQEAgLTM5MywxNCArMzkwLDE0IEBACiAJaWYgKCghcHJvY2Vzc29yKSB8fCAoIWxvd19zcGVlZCkgfHwgKCFoaWdoX3NwZWVkKSB8fCAoIXNldF9zdGF0ZSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZHByaW50aygidHJ5aW5nIHRvIGRldGVybWluZSBib3RoIHNwZWVkc1xuIik7CisJcHJfZGVidWcoInRyeWluZyB0byBkZXRlcm1pbmUgYm90aCBzcGVlZHNcbiIpOwogCiAJLyogZ2V0IGN1cnJlbnQgc3BlZWQgKi8KIAlwcmV2X3NwZWVkID0gc3BlZWRzdGVwX2dldF9mcmVxdWVuY3kocHJvY2Vzc29yKTsKIAlpZiAoIXByZXZfc3BlZWQpCiAJCXJldHVybiAtRUlPOwogCi0JZHByaW50aygicHJldmlvdXMgc3BlZWQgaXMgJXVcbiIsIHByZXZfc3BlZWQpOworCXByX2RlYnVnKCJwcmV2aW91cyBzcGVlZCBpcyAldVxuIiwgcHJldl9zcGVlZCk7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKQEAgLTQxMiw3ICs0MDksNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlkcHJpbnRrKCJsb3cgc3BlZWQgaXMgJXVcbiIsICpsb3dfc3BlZWQpOworCXByX2RlYnVnKCJsb3cgc3BlZWQgaXMgJXVcbiIsICpsb3dfc3BlZWQpOwogCiAJLyogc3RhcnQgbGF0ZW5jeSBtZWFzdXJlbWVudCAqLwogCWlmICh0cmFuc2l0aW9uX2xhdGVuY3kpCkBAIC00MzEsNyArNDI4LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JZHByaW50aygiaGlnaCBzcGVlZCBpcyAldVxuIiwgKmhpZ2hfc3BlZWQpOworCXByX2RlYnVnKCJoaWdoIHNwZWVkIGlzICV1XG4iLCAqaGlnaF9zcGVlZCk7CiAKIAlpZiAoKmxvd19zcGVlZCA9PSAqaGlnaF9zcGVlZCkgewogCQlyZXQgPSAtRU5PREVWOwpAQCAtNDQ1LDcgKzQ0Miw3IEBACiAJaWYgKHRyYW5zaXRpb25fbGF0ZW5jeSkgewogCQkqdHJhbnNpdGlvbl9sYXRlbmN5ID0gKHR2Mi50dl9zZWMgLSB0djEudHZfc2VjKSAqIFVTRUNfUEVSX1NFQyArCiAJCQl0djIudHZfdXNlYyAtIHR2MS50dl91c2VjOwotCQlkcHJpbnRrKCJ0cmFuc2l0aW9uIGxhdGVuY3kgaXMgJXUgdVNlY1xuIiwgKnRyYW5zaXRpb25fbGF0ZW5jeSk7CisJCXByX2RlYnVnKCJ0cmFuc2l0aW9uIGxhdGVuY3kgaXMgJXUgdVNlY1xuIiwgKnRyYW5zaXRpb25fbGF0ZW5jeSk7CiAKIAkJLyogY29udmVydCB1U2VjIHRvIG5TZWMgYW5kIGFkZCAyMCUgZm9yIHNhZmV0eSByZWFzb25zICovCiAJCSp0cmFuc2l0aW9uX2xhdGVuY3kgKj0gMTIwMDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmggYi9kcml2ZXJzL2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5oCnJlbmFtZSB0byBkcml2ZXJzL2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5oCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLXNtaS5jIGIvZHJpdmVycy9jcHVmcmVxL3NwZWVkc3RlcC1zbWkuYwpzaW1pbGFyaXR5IGluZGV4IDg5JQpyZW5hbWUgZnJvbSBhcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLXNtaS5jCnJlbmFtZSB0byBkcml2ZXJzL2NwdWZyZXEvc3BlZWRzdGVwLXNtaS5jCmluZGV4IDkxYmMyNWIuLmM3NmVhZDMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtc21pLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL3NwZWVkc3RlcC1zbWkuYwpAQCAtNTUsOSArNTUsNiBAQAogICogb2YgRE1BIGFjdGl2aXR5IGdvaW5nIG9uPyAqLwogI2RlZmluZSBTTUlfVFJJRVMgNQogCi0jZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgXAotCQkic3BlZWRzdGVwLXNtaSIsIG1zZykKLQogLyoqCiAgKiBzcGVlZHN0ZXBfc21pX293bmVyc2hpcAogICovCkBAIC03MCw3ICs2Nyw3IEBACiAJY29tbWFuZCA9IChzbWlfc2lnICYgMHhmZmZmZmYwMCkgfCAoc21pX2NtZCAmIDB4ZmYpOwogCW1hZ2ljID0gdmlydF90b19waHlzKG1hZ2ljX2RhdGEpOwogCi0JZHByaW50aygidHJ5aW5nIHRvIG9idGFpbiBvd25lcnNoaXAgd2l0aCBjb21tYW5kICV4IGF0IHBvcnQgJXhcbiIsCisJcHJfZGVidWcoInRyeWluZyB0byBvYnRhaW4gb3duZXJzaGlwIHdpdGggY29tbWFuZCAleCBhdCBwb3J0ICV4XG4iLAogCQkJY29tbWFuZCwgc21pX3BvcnQpOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCkBAIC04NSw3ICs4Miw3IEBACiAJCTogIm1lbW9yeSIKIAkpOwogCi0JZHByaW50aygicmVzdWx0IGlzICV4XG4iLCByZXN1bHQpOworCXByX2RlYnVnKCJyZXN1bHQgaXMgJXhcbiIsIHJlc3VsdCk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMTA2LDEzICsxMDMsMTMgQEAKIAl1MzIgZnVuY3Rpb24gPSBHRVRfU1BFRURTVEVQX0ZSRVFTOwogCiAJaWYgKCEoaXN0X2luZm8uZXZlbnQgJiAweEZGRkYpKSB7Ci0JCWRwcmludGsoImJ1ZyAjMTQyMiAtLSBjYW4ndCByZWFkIGZyZXFzIGZyb20gQklPU1xuIik7CisJCXByX2RlYnVnKCJidWcgIzE0MjIgLS0gY2FuJ3QgcmVhZCBmcmVxcyBmcm9tIEJJT1NcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAljb21tYW5kID0gKHNtaV9zaWcgJiAweGZmZmZmZjAwKSB8IChzbWlfY21kICYgMHhmZik7CiAKLQlkcHJpbnRrKCJ0cnlpbmcgdG8gZGV0ZXJtaW5lIGZyZXF1ZW5jaWVzIHdpdGggY29tbWFuZCAleCBhdCBwb3J0ICV4XG4iLAorCXByX2RlYnVnKCJ0cnlpbmcgdG8gZGV0ZXJtaW5lIGZyZXF1ZW5jaWVzIHdpdGggY29tbWFuZCAleCBhdCBwb3J0ICV4XG4iLAogCQkJY29tbWFuZCwgc21pX3BvcnQpOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCkBAIC0xMjksNyArMTI2LDcgQEAKIAkJICAiZCIgKHNtaV9wb3J0KSwgIlMiICgwKSwgIkQiICgwKQogCSk7CiAKLQlkcHJpbnRrKCJyZXN1bHQgJXgsIGxvd19mcmVxICV1LCBoaWdoX2ZyZXEgJXVcbiIsCisJcHJfZGVidWcoInJlc3VsdCAleCwgbG93X2ZyZXEgJXUsIGhpZ2hfZnJlcSAldVxuIiwKIAkJCXJlc3VsdCwgbG93X21oeiwgaGlnaF9taHopOwogCiAJLyogYWJvcnQgaWYgcmVzdWx0cyBhcmUgb2J2aW91c2x5IGluY29ycmVjdC4uLiAqLwpAQCAtMTU0LDcgKzE1MSw3IEBACiAKIAljb21tYW5kID0gKHNtaV9zaWcgJiAweGZmZmZmZjAwKSB8IChzbWlfY21kICYgMHhmZik7CiAKLQlkcHJpbnRrKCJ0cnlpbmcgdG8gZGV0ZXJtaW5lIGN1cnJlbnQgc2V0dGluZyB3aXRoIGNvbW1hbmQgJXggIgorCXByX2RlYnVnKCJ0cnlpbmcgdG8gZGV0ZXJtaW5lIGN1cnJlbnQgc2V0dGluZyB3aXRoIGNvbW1hbmQgJXggIgogCQkiYXQgcG9ydCAleFxuIiwgY29tbWFuZCwgc21pX3BvcnQpOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCkBAIC0xNjgsNyArMTY1LDcgQEAKIAkJICAiZCIgKHNtaV9wb3J0KSwgIlMiICgwKSwgIkQiICgwKQogCSk7CiAKLQlkcHJpbnRrKCJzdGF0ZSBpcyAleCwgcmVzdWx0IGlzICV4XG4iLCBzdGF0ZSwgcmVzdWx0KTsKKwlwcl9kZWJ1Zygic3RhdGUgaXMgJXgsIHJlc3VsdCBpcyAleFxuIiwgc3RhdGUsIHJlc3VsdCk7CiAKIAlyZXR1cm4gc3RhdGUgJiAxOwogfQpAQCAtMTk0LDEzICsxOTEsMTMgQEAKIAogCWNvbW1hbmQgPSAoc21pX3NpZyAmIDB4ZmZmZmZmMDApIHwgKHNtaV9jbWQgJiAweGZmKTsKIAotCWRwcmludGsoInRyeWluZyB0byBzZXQgZnJlcXVlbmN5IHRvIHN0YXRlICV1ICIKKwlwcl9kZWJ1ZygidHJ5aW5nIHRvIHNldCBmcmVxdWVuY3kgdG8gc3RhdGUgJXUgIgogCQkid2l0aCBjb21tYW5kICV4IGF0IHBvcnQgJXhcbiIsCiAJCXN0YXRlLCBjb21tYW5kLCBzbWlfcG9ydCk7CiAKIAlkbyB7CiAJCWlmIChyZXRyeSkgewotCQkJZHByaW50aygicmV0cnkgJXUsIHByZXZpb3VzIHJlc3VsdCAldSwgd2FpdGluZy4uLlxuIiwKKwkJCXByX2RlYnVnKCJyZXRyeSAldSwgcHJldmlvdXMgcmVzdWx0ICV1LCB3YWl0aW5nLi4uXG4iLAogCQkJCQlyZXRyeSwgcmVzdWx0KTsKIAkJCW1kZWxheShyZXRyeSAqIDUwKTsKIAkJfQpAQCAtMjIxLDcgKzIxOCw3IEBACiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCiAJaWYgKG5ld19zdGF0ZSA9PSBzdGF0ZSkKLQkJZHByaW50aygiY2hhbmdlIHRvICV1IE1IeiBzdWNjZWVkZWQgYWZ0ZXIgJXUgdHJpZXMgIgorCQlwcl9kZWJ1ZygiY2hhbmdlIHRvICV1IE1IeiBzdWNjZWVkZWQgYWZ0ZXIgJXUgdHJpZXMgIgogCQkJIndpdGggcmVzdWx0ICV1XG4iLAogCQkJKHNwZWVkc3RlcF9mcmVxc1tuZXdfc3RhdGVdLmZyZXF1ZW5jeSAvIDEwMDApLAogCQkJcmV0cnksIHJlc3VsdCk7CkBAIC0yOTIsNyArMjg5LDcgQEAKIAogCXJlc3VsdCA9IHNwZWVkc3RlcF9zbWlfb3duZXJzaGlwKCk7CiAJaWYgKHJlc3VsdCkgewotCQlkcHJpbnRrKCJmYWlscyBpbiBhY3F1aXJpbmcgb3duZXJzaGlwIG9mIGEgU01JIGludGVyZmFjZS5cbiIpOworCQlwcl9kZWJ1ZygiZmFpbHMgaW4gYWNxdWlyaW5nIG93bmVyc2hpcCBvZiBhIFNNSSBpbnRlcmZhY2UuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0zMDQsNyArMzAxLDcgQEAKIAlpZiAocmVzdWx0KSB7CiAJCS8qIGZhbGwgYmFjayB0byBzcGVlZHN0ZXBfbGliLmMgZGVjdGlvbiBtZWNoYW5pc206CiAJCSAqIHRyeSBib3RoIHN0YXRlcyBvdXQgKi8KLQkJZHByaW50aygiY291bGQgbm90IGRldGVjdCBsb3cgYW5kIGhpZ2ggZnJlcXVlbmNpZXMgIgorCQlwcl9kZWJ1ZygiY291bGQgbm90IGRldGVjdCBsb3cgYW5kIGhpZ2ggZnJlcXVlbmNpZXMgIgogCQkJCSJieSBTTUkgY2FsbC5cbiIpOwogCQlyZXN1bHQgPSBzcGVlZHN0ZXBfZ2V0X2ZyZXFzKHNwZWVkc3RlcF9wcm9jZXNzb3IsCiAJCQkJbG93LCBoaWdoLApAQCAtMzEyLDE4ICszMDksMTggQEAKIAkJCQkmc3BlZWRzdGVwX3NldF9zdGF0ZSk7CiAKIAkJaWYgKHJlc3VsdCkgewotCQkJZHByaW50aygiY291bGQgbm90IGRldGVjdCB0d28gZGlmZmVyZW50IHNwZWVkcyIKKwkJCXByX2RlYnVnKCJjb3VsZCBub3QgZGV0ZWN0IHR3byBkaWZmZXJlbnQgc3BlZWRzIgogCQkJCQkiIC0tIGFib3J0aW5nLlxuIik7CiAJCQlyZXR1cm4gcmVzdWx0OwogCQl9IGVsc2UKLQkJCWRwcmludGsoIndvcmthcm91bmQgd29ya2VkLlxuIik7CisJCQlwcl9kZWJ1Zygid29ya2Fyb3VuZCB3b3JrZWQuXG4iKTsKIAl9CiAKIAkvKiBnZXQgY3VycmVudCBzcGVlZCBzZXR0aW5nICovCiAJc3RhdGUgPSBzcGVlZHN0ZXBfZ2V0X3N0YXRlKCk7CiAJc3BlZWQgPSBzcGVlZHN0ZXBfZnJlcXNbc3RhdGVdLmZyZXF1ZW5jeTsKIAotCWRwcmludGsoImN1cnJlbnRseSBhdCAlcyBzcGVlZCBzZXR0aW5nIC0gJWkgTUh6XG4iLAorCXByX2RlYnVnKCJjdXJyZW50bHkgYXQgJXMgc3BlZWQgc2V0dGluZyAtICVpIE1IelxuIiwKIAkJKHNwZWVkID09IHNwZWVkc3RlcF9mcmVxc1tTUEVFRFNURVBfTE9XXS5mcmVxdWVuY3kpCiAJCT8gImxvdyIgOiAiaGlnaCIsCiAJCShzcGVlZCAvIDEwMDApKTsKQEAgLTM2MCw3ICszNTcsNyBAQAogCWludCByZXN1bHQgPSBzcGVlZHN0ZXBfc21pX293bmVyc2hpcCgpOwogCiAJaWYgKHJlc3VsdCkKLQkJZHByaW50aygiZmFpbHMgaW4gcmUtYWNxdWlyaW5nIG93bmVyc2hpcCBvZiBhIFNNSSBpbnRlcmZhY2UuXG4iKTsKKwkJcHJfZGVidWcoImZhaWxzIGluIHJlLWFjcXVpcmluZyBvd25lcnNoaXAgb2YgYSBTTUkgaW50ZXJmYWNlLlxuIik7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtNDAzLDEyICs0MDAsMTIgQEAKIAl9CiAKIAlpZiAoIXNwZWVkc3RlcF9wcm9jZXNzb3IpIHsKLQkJZHByaW50aygiTm8gc3VwcG9ydGVkIEludGVsIENQVSBkZXRlY3RlZC5cbiIpOworCQlwcl9kZWJ1ZygiTm8gc3VwcG9ydGVkIEludGVsIENQVSBkZXRlY3RlZC5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlkcHJpbnRrKCJzaWduYXR1cmU6MHglLjhseCwgY29tbWFuZDoweCUuOGx4LCAiCi0JCSJldmVudDoweCUuOGx4LCBwZXJmX2xldmVsOjB4JS44bHguXG4iLAorCXByX2RlYnVnKCJzaWduYXR1cmU6MHglLjh1bHgsIGNvbW1hbmQ6MHglLjh1bHgsICIKKwkJImV2ZW50OjB4JS44dWx4LCBwZXJmX2xldmVsOjB4JS44dWx4LlxuIiwKIAkJaXN0X2luZm8uc2lnbmF0dXJlLCBpc3RfaW5mby5jb21tYW5kLAogCQlpc3RfaW5mby5ldmVudCwgaXN0X2luZm8ucGVyZl9sZXZlbCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZyBiL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZwppbmRleCBiM2EyNWE1Li5lZmJhMTYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWcKKysrIGIvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnCkBAIC0xNTcsNCArMTU3LDYgQEAKIAkgIElmIHVuc3VyZSwgc2F5IE4gaGVyZS4gIERyaXZlcnMgdGhhdCBuZWVkIHRoZXNlIGhlbHBlcnMgd2lsbCBzZWxlY3QKIAkgIHRoaXMgb3B0aW9uIGF1dG9tYXRpY2FsbHkuCiAKK3NvdXJjZSAiZHJpdmVycy9maXJtd2FyZS9nb29nbGUvS2NvbmZpZyIKKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGUKaW5kZXggMDBiYjBiOC4uNDczMzhjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlCkBAIC0xMywzICsxMyw1IEBACiBvYmotJChDT05GSUdfSVNDU0lfSUJGVCkJKz0gaXNjc2lfaWJmdC5vCiBvYmotJChDT05GSUdfRklSTVdBUkVfTUVNTUFQKQkrPSBtZW1tYXAubwogb2JqLSQoQ09ORklHX1NJR01BKQkJKz0gc2lnbWEubworCitvYmotJChDT05GSUdfR09PR0xFX0ZJUk1XQVJFKQkrPSBnb29nbGUvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VkZC5jIGIvZHJpdmVycy9maXJtd2FyZS9lZGQuYwppbmRleCA5NmMyNWQ5Li5mMWI3ZjY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VkZC5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWRkLmMKQEAgLTUzMSw4ICs1MzEsOCBAQAogZWRkX2hhc19lZGQzMChzdHJ1Y3QgZWRkX2RldmljZSAqZWRldikKIHsKIAlzdHJ1Y3QgZWRkX2luZm8gKmluZm87Ci0JaW50IGksIG5vbnplcm9fcGF0aCA9IDA7Ci0JY2hhciBjOworCWludCBpOworCXU4IGNzdW0gPSAwOwogCiAJaWYgKCFlZGV2KQogCQlyZXR1cm4gMDsKQEAgLTU0NCwxNiArNTQ0LDE2IEBACiAJCXJldHVybiAwOwogCX0KIAotCWZvciAoaSA9IDMwOyBpIDw9IDczOyBpKyspIHsKLQkJYyA9ICooKCh1aW50OF90ICopIGluZm8pICsgaSArIDQpOwotCQlpZiAoYykgewotCQkJbm9uemVyb19wYXRoKys7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoIW5vbnplcm9fcGF0aCkgeworCisJLyogV2Ugc3VwcG9ydCBvbmx5IFQxMyBzcGVjICovCisJaWYgKGluZm8tPnBhcmFtcy5kZXZpY2VfcGF0aF9pbmZvX2xlbmd0aCAhPSA0NCkKIAkJcmV0dXJuIDA7Ci0JfQorCisJZm9yIChpID0gMzA7IGkgPCBpbmZvLT5wYXJhbXMuZGV2aWNlX3BhdGhfaW5mb19sZW5ndGggKyAzMDsgaSsrKQorCQljc3VtICs9ICooKCh1OCAqKSZpbmZvLT5wYXJhbXMpICsgaSk7CisKKwlpZiAoY3N1bSkKKwkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWZpdmFycy5jIGIvZHJpdmVycy9maXJtd2FyZS9lZml2YXJzLmMKaW5kZXggZmYwYzM3My4uYTJkMmYxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9lZml2YXJzLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZml2YXJzLmMKQEAgLTY3Nyw4ICs2NzcsOCBAQAogCiAJcmV0dXJuIDA7CiBvdXRfZnJlZToKLQlrZnJlZShlZml2YXJzLT5uZXdfdmFyKTsKLQllZml2YXJzLT5uZXdfdmFyID0gTlVMTDsKKwlrZnJlZShlZml2YXJzLT5kZWxfdmFyKTsKKwllZml2YXJzLT5kZWxfdmFyID0gTlVMTDsKIAlrZnJlZShlZml2YXJzLT5uZXdfdmFyKTsKIAllZml2YXJzLT5uZXdfdmFyID0gTlVMTDsKIAlyZXR1cm4gZXJyb3I7CkBAIC04MDMsNiArODAzLDggQEAKIAlvcHMuc2V0X3ZhcmlhYmxlID0gZWZpLnNldF92YXJpYWJsZTsKIAlvcHMuZ2V0X25leHRfdmFyaWFibGUgPSBlZmkuZ2V0X25leHRfdmFyaWFibGU7CiAJZXJyb3IgPSByZWdpc3Rlcl9lZml2YXJzKCZfX2VmaXZhcnMsICZvcHMsIGVmaV9rb2JqKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyX3B1dDsKIAogCS8qIERvbid0IGZvcmdldCB0aGUgc3lzdGFiIGVudHJ5ICovCiAJZXJyb3IgPSBzeXNmc19jcmVhdGVfZ3JvdXAoZWZpX2tvYmosICZlZmlfc3Vic3lzX2F0dHJfZ3JvdXApOwpAQCAtODEwLDE4ICs4MTIsMjUgQEAKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCSAgICAgICAiZWZpdmFyczogU3lzZnMgYXR0cmlidXRlIGV4cG9ydCBmYWlsZWQgd2l0aCBlcnJvciAlZC5cbiIsCiAJCSAgICAgICBlcnJvcik7Ci0JCXVucmVnaXN0ZXJfZWZpdmFycygmX19lZml2YXJzKTsKLQkJa29iamVjdF9wdXQoZWZpX2tvYmopOworCQlnb3RvIGVycl91bnJlZ2lzdGVyOwogCX0KIAorCXJldHVybiAwOworCitlcnJfdW5yZWdpc3RlcjoKKwl1bnJlZ2lzdGVyX2VmaXZhcnMoJl9fZWZpdmFycyk7CitlcnJfcHV0OgorCWtvYmplY3RfcHV0KGVmaV9rb2JqKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdAogZWZpdmFyc19leGl0KHZvaWQpCiB7Ci0JdW5yZWdpc3Rlcl9lZml2YXJzKCZfX2VmaXZhcnMpOwotCWtvYmplY3RfcHV0KGVmaV9rb2JqKTsKKwlpZiAoZWZpX2VuYWJsZWQpIHsKKwkJdW5yZWdpc3Rlcl9lZml2YXJzKCZfX2VmaXZhcnMpOworCQlrb2JqZWN0X3B1dChlZmlfa29iaik7CisJfQogfQogCiBtb2R1bGVfaW5pdChlZml2YXJzX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9nb29nbGUvS2NvbmZpZyBiL2RyaXZlcnMvZmlybXdhcmUvZ29vZ2xlL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcwOTZiNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZ29vZ2xlL0tjb25maWcKQEAgLTAsMCArMSwzMSBAQAorY29uZmlnIEdPT0dMRV9GSVJNV0FSRQorCWJvb2wgIkdvb2dsZSBGaXJtd2FyZSBEcml2ZXJzIgorCWRlcGVuZHMgb24gWDg2CisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhlc2UgZmlybXdhcmUgZHJpdmVycyBhcmUgdXNlZCBieSBHb29nbGUncyBzZXJ2ZXJzLiAgVGhleSBhcmUKKwkgIG9ubHkgdXNlZnVsIGlmIHlvdSBhcmUgd29ya2luZyBkaXJlY3RseSBvbiBvbmUgb2YgdGhlaXIKKwkgIHByb3ByaWV0YXJ5IHNlcnZlcnMuICBJZiBpbiBkb3VidCwgc2F5ICJOIi4KKworbWVudSAiR29vZ2xlIEZpcm13YXJlIERyaXZlcnMiCisJZGVwZW5kcyBvbiBHT09HTEVfRklSTVdBUkUKKworY29uZmlnIEdPT0dMRV9TTUkKKwl0cmlzdGF0ZSAiU01JIGludGVyZmFjZSBmb3IgR29vZ2xlIHBsYXRmb3JtcyIKKwlkZXBlbmRzIG9uIEFDUEkgJiYgRE1JCisJc2VsZWN0IEVGSV9WQVJTCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgU01JIGNhbGxiYWNrcyBmb3IgR29vZ2xlCisJICBwbGF0Zm9ybXMuICBUaGlzIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3Igd3JpdGluZyB0byBhbmQKKwkgIGNsZWFyaW5nIHRoZSBFRkkgZXZlbnQgbG9nIGFuZCByZWFkaW5nIGFuZCB3cml0aW5nIE5WUkFNCisJICB2YXJpYWJsZXMuCisKK2NvbmZpZyBHT09HTEVfTUVNQ09OU09MRQorCXRyaXN0YXRlICJGaXJtd2FyZSBNZW1vcnkgQ29uc29sZSIKKwlkZXBlbmRzIG9uIERNSQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIGtlcm5lbCB0byBzZWFyY2ggZm9yIGEgZmlybXdhcmUgbG9nIGluCisJICB0aGUgRUJEQSBvbiBHb29nbGUgc2VydmVycy4gIElmIGZvdW5kLCB0aGlzIGxvZyBpcyBleHBvcnRlZCB0bworCSAgdXNlcmxhbmQgaW4gdGhlIGZpbGUgL3N5cy9maXJtd2FyZS9sb2cuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZ29vZ2xlL01ha2VmaWxlIGIvZHJpdmVycy9maXJtd2FyZS9nb29nbGUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhMjk0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZ29vZ2xlL01ha2VmaWxlCkBAIC0wLDAgKzEsMyBAQAorCitvYmotJChDT05GSUdfR09PR0xFX1NNSSkJCSs9IGdzbWkubworb2JqLSQoQ09ORklHX0dPT0dMRV9NRU1DT05TT0xFKQkJKz0gbWVtY29uc29sZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2dvb2dsZS9nc21pLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2dvb2dsZS9nc21pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE3ZjBiMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZ29vZ2xlL2dzbWkuYwpAQCAtMCwwICsxLDk0MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBBdXRob3I6IGRsYXVyaWVAZ29vZ2xlLmNvbSAoRHVuY2FuIExhdXJpZSkKKyAqCisgKiBSZS13b3JrZWQgdG8gZXhwb3NlIHN5c2ZzIEFQSXMgYnkgbWlrZXdAZ29vZ2xlLmNvbSAoTWlrZSBXYXljaGlzb24pCisgKgorICogRUZJIFNNSSBpbnRlcmZhY2UgZm9yIEdvb2dsZSBwbGF0Zm9ybXMKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZG1hcG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgorCisjZGVmaW5lIEdTTUlfU0hVVERPV05fQ0xFQU4JMAkvKiBDbGVhbiBTaHV0ZG93biAqLworLyogVE9ETyhtaWtld0Bnb29nbGUuY29tKTogVGllIGluIEhBUkRMT0NLVVBfREVURUNUT1Igd2l0aCBOTUlXRFQgKi8KKyNkZWZpbmUgR1NNSV9TSFVURE9XTl9OTUlXRFQJMQkvKiBOTUkgV2F0Y2hkb2cgKi8KKyNkZWZpbmUgR1NNSV9TSFVURE9XTl9QQU5JQwkyCS8qIFBhbmljICovCisjZGVmaW5lIEdTTUlfU0hVVERPV05fT09QUwkzCS8qIE9vcHMgKi8KKyNkZWZpbmUgR1NNSV9TSFVURE9XTl9ESUUJNAkvKiBEaWUgLS0gTm8gbG9uZ2VyIG1lYW5pbmdmdWwgKi8KKyNkZWZpbmUgR1NNSV9TSFVURE9XTl9NQ0UJNQkvKiBNYWNoaW5lIENoZWNrICovCisjZGVmaW5lIEdTTUlfU0hVVERPV05fU09GVFdEVAk2CS8qIFNvZnR3YXJlIFdhdGNoZG9nICovCisjZGVmaW5lIEdTTUlfU0hVVERPV05fTUJFCTcJLyogVW5jb3JyZWN0ZWQgRUNDICovCisjZGVmaW5lIEdTTUlfU0hVVERPV05fVFJJUExFCTgJLyogVHJpcGxlIEZhdWx0ICovCisKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JCSIxLjAiCisjZGVmaW5lIEdTTUlfR1VJRF9TSVpFCQkxNgorI2RlZmluZSBHU01JX0JVRl9TSVpFCQkxMDI0CisjZGVmaW5lIEdTTUlfQlVGX0FMSUdOCQlzaXplb2YodTY0KQorI2RlZmluZSBHU01JX0NBTExCQUNLCQkweGVmCisKKy8qIFNNSSByZXR1cm4gY29kZXMgKi8KKyNkZWZpbmUgR1NNSV9TVUNDRVNTCQkweDAwCisjZGVmaW5lIEdTTUlfVU5TVVBQT1JURUQyCTB4MDMKKyNkZWZpbmUgR1NNSV9MT0dfRlVMTAkJMHgwYgorI2RlZmluZSBHU01JX1ZBUl9OT1RfRk9VTkQJMHgwZQorI2RlZmluZSBHU01JX0hBTkRTSEFLRV9TUElOCTB4N2QKKyNkZWZpbmUgR1NNSV9IQU5EU0hBS0VfQ0YJMHg3ZQorI2RlZmluZSBHU01JX0hBTkRTSEFLRV9OT05FCTB4N2YKKyNkZWZpbmUgR1NNSV9JTlZBTElEX1BBUkFNRVRFUgkweDgyCisjZGVmaW5lIEdTTUlfVU5TVVBQT1JURUQJMHg4MworI2RlZmluZSBHU01JX0JVRkZFUl9UT09fU01BTEwJMHg4NQorI2RlZmluZSBHU01JX05PVF9SRUFEWQkJMHg4NgorI2RlZmluZSBHU01JX0RFVklDRV9FUlJPUgkweDg3CisjZGVmaW5lIEdTTUlfTk9UX0ZPVU5ECQkweDhlCisKKyNkZWZpbmUgUVVJUktZX0JPQVJEX0hBU0ggMHg3OGEzMGE1MAorCisvKiBJbnRlcm5hbGx5IHVzZWQgY29tbWFuZHMgcGFzc2VkIHRvIHRoZSBmaXJtd2FyZSAqLworI2RlZmluZSBHU01JX0NNRF9HRVRfTlZSQU1fVkFSCQkweDAxCisjZGVmaW5lIEdTTUlfQ01EX0dFVF9ORVhUX1ZBUgkJMHgwMgorI2RlZmluZSBHU01JX0NNRF9TRVRfTlZSQU1fVkFSCQkweDAzCisjZGVmaW5lIEdTTUlfQ01EX1NFVF9FVkVOVF9MT0cJCTB4MDgKKyNkZWZpbmUgR1NNSV9DTURfQ0xFQVJfRVZFTlRfTE9HCTB4MDkKKyNkZWZpbmUgR1NNSV9DTURfQ0xFQVJfQ09ORklHCQkweDIwCisjZGVmaW5lIEdTTUlfQ01EX0hBTkRTSEFLRV9UWVBFCQkweEMxCisKKy8qIE1hZ2ljIGVudHJ5IHR5cGUgZm9yIGtlcm5lbCBldmVudHMgKi8KKyNkZWZpbmUgR1NNSV9MT0dfRU5UUllfVFlQRV9LRVJORUwgICAgIDB4REVBRAorCisvKiBTTUkgYnVmZmVycyBtdXN0IGJlIGluIDMyYml0IHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UgKi8KK3N0cnVjdCBnc21pX2J1ZiB7CisJdTggKnN0YXJ0OwkJCS8qIHN0YXJ0IG9mIGJ1ZmZlciAqLworCXNpemVfdCBsZW5ndGg7CQkJLyogbGVuZ3RoIG9mIGJ1ZmZlciAqLworCWRtYV9hZGRyX3QgaGFuZGxlOwkJLyogZG1hIGFsbG9jYXRpb24gaGFuZGxlICovCisJdTMyIGFkZHJlc3M7CQkJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBidWZmZXIgKi8KK307CisKK3N0cnVjdCBnc21pX2RldmljZSB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsJLyogcGxhdGZvcm0gZGV2aWNlICovCisJc3RydWN0IGdzbWlfYnVmICpuYW1lX2J1ZjsJLyogdmFyaWFibGUgbmFtZSBidWZmZXIgKi8KKwlzdHJ1Y3QgZ3NtaV9idWYgKmRhdGFfYnVmOwkvKiBnZW5lcmljIGRhdGEgYnVmZmVyICovCisJc3RydWN0IGdzbWlfYnVmICpwYXJhbV9idWY7CS8qIHBhcmFtZXRlciBidWZmZXIgKi8KKwlzcGlubG9ja190IGxvY2s7CQkvKiBzZXJpYWxpemUgYWNjZXNzIHRvIFNNSXMgKi8KKwl1MTYgc21pX2NtZDsJCQkvKiBTTUkgY29tbWFuZCBwb3J0ICovCisJaW50IGhhbmRzaGFrZV90eXBlOwkJLyogZmlybXdhcmUgaGFuZGxlciBpbnRlcmxvY2sgdHlwZSAqLworCXN0cnVjdCBkbWFfcG9vbCAqZG1hX3Bvb2w7CS8qIERNQSBidWZmZXIgcG9vbCAqLworfSBnc21pX2RldjsKKworLyogUGFja2VkIHN0cnVjdHVyZXMgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgZmlybXdhcmUgKi8KK3N0cnVjdCBnc21pX252cmFtX3Zhcl9wYXJhbSB7CisJZWZpX2d1aWRfdAlndWlkOworCXUzMgkJbmFtZV9wdHI7CisJdTMyCQlhdHRyaWJ1dGVzOworCXUzMgkJZGF0YV9sZW47CisJdTMyCQlkYXRhX3B0cjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnc21pX2dldF9uZXh0X3Zhcl9wYXJhbSB7CisJdTgJZ3VpZFtHU01JX0dVSURfU0laRV07CisJdTMyCW5hbWVfcHRyOworCXUzMgluYW1lX2xlbjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnc21pX3NldF9ldmVudGxvZ19wYXJhbSB7CisJdTMyCWRhdGFfcHRyOworCXUzMglkYXRhX2xlbjsKKwl1MzIJdHlwZTsKK30gX19wYWNrZWQ7CisKKy8qIEV2ZW50IGxvZyBmb3JtYXRzICovCitzdHJ1Y3QgZ3NtaV9sb2dfZW50cnlfdHlwZV8xIHsKKwl1MTYJdHlwZTsKKwl1MzIJaW5zdGFuY2U7Cit9IF9fcGFja2VkOworCisKKy8qCisgKiBTb21lIHBsYXRmb3JtcyBkb24ndCBoYXZlIGV4cGxpY2l0IFNNSSBoYW5kc2hha2UKKyAqIGFuZCBuZWVkIHRvIHdhaXQgZm9yIFNNSSB0byBjb21wbGV0ZS4KKyAqLworI2RlZmluZSBHU01JX0RFRkFVTFRfU1BJTkNPVU5UCTB4MTAwMDAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3BpbmNvdW50ID0gR1NNSV9ERUZBVUxUX1NQSU5DT1VOVDsKK21vZHVsZV9wYXJhbShzcGluY291bnQsIHVpbnQsIDA2MDApOworTU9EVUxFX1BBUk1fREVTQyhzcGluY291bnQsCisJIlRoZSBudW1iZXIgb2YgbG9vcCBpdGVyYXRpb25zIHRvIHVzZSB3aGVuIHVzaW5nIHRoZSBzcGluIGhhbmRzaGFrZS4iKTsKKworc3RhdGljIHN0cnVjdCBnc21pX2J1ZiAqZ3NtaV9idWZfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgZ3NtaV9idWYgKnNtaWJ1ZjsKKworCXNtaWJ1ZiA9IGt6YWxsb2Moc2l6ZW9mKCpzbWlidWYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNtaWJ1ZikgeworCQlwcmludGsoS0VSTl9FUlIgImdzbWk6IG91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBhbGxvY2F0ZSBidWZmZXIgaW4gMzJiaXQgYWRkcmVzcyBzcGFjZSAqLworCXNtaWJ1Zi0+c3RhcnQgPSBkbWFfcG9vbF9hbGxvYyhnc21pX2Rldi5kbWFfcG9vbCwgR0ZQX0tFUk5FTCwKKwkJCQkgICAgICAgJnNtaWJ1Zi0+aGFuZGxlKTsKKwlpZiAoIXNtaWJ1Zi0+c3RhcnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJnc21pOiBmYWlsZWQgdG8gYWxsb2NhdGUgbmFtZSBidWZmZXJcbiIpOworCQlrZnJlZShzbWlidWYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBmaWxsIGluIHRoZSBidWZmZXIgaGFuZGxlICovCisJc21pYnVmLT5sZW5ndGggPSBHU01JX0JVRl9TSVpFOworCXNtaWJ1Zi0+YWRkcmVzcyA9ICh1MzIpdmlydF90b19waHlzKHNtaWJ1Zi0+c3RhcnQpOworCisJcmV0dXJuIHNtaWJ1ZjsKK30KKworc3RhdGljIHZvaWQgZ3NtaV9idWZfZnJlZShzdHJ1Y3QgZ3NtaV9idWYgKnNtaWJ1ZikKK3sKKwlpZiAoc21pYnVmKSB7CisJCWlmIChzbWlidWYtPnN0YXJ0KQorCQkJZG1hX3Bvb2xfZnJlZShnc21pX2Rldi5kbWFfcG9vbCwgc21pYnVmLT5zdGFydCwKKwkJCQkgICAgICBzbWlidWYtPmhhbmRsZSk7CisJCWtmcmVlKHNtaWJ1Zik7CisJfQorfQorCisvKgorICogTWFrZSBhIGNhbGwgdG8gZ3NtaSBmdW5jKHN1YikuICBHU01JIGVycm9yIGNvZGVzIGFyZSB0cmFuc2xhdGVkIHRvCisgKiBpbi1rZXJuZWwgZXJybm9zICgwIG9uIHN1Y2Nlc3MsIC1FUlJOTyBvbiBlcnJvcikuCisgKi8KK3N0YXRpYyBpbnQgZ3NtaV9leGVjKHU4IGZ1bmMsIHU4IHN1YikKK3sKKwl1MTYgY21kID0gKHN1YiA8PCA4KSB8IGZ1bmM7CisJdTE2IHJlc3VsdCA9IDA7CisJaW50IHJjID0gMDsKKworCS8qCisJICogQUggIDogU3ViZnVuY3Rpb24gbnVtYmVyCisJICogQUwgIDogRnVuY3Rpb24gbnVtYmVyCisJICogRUJYIDogUGFyYW1ldGVyIGJsb2NrIGFkZHJlc3MKKwkgKiBEWCAgOiBTTUkgY29tbWFuZCBwb3J0CisJICoKKwkgKiBUaHJlZSBwcm90b2NvbHMgaGVyZS4gU2VlIGFsc28gdGhlIGNvbW1lbnQgaW4gZ3NtaV9pbml0KCkuCisJICovCisJaWYgKGdzbWlfZGV2LmhhbmRzaGFrZV90eXBlID09IEdTTUlfSEFORFNIQUtFX0NGKSB7CisJCS8qCisJCSAqIElmIGhhbmRzaGFrZV90eXBlID09IEhBTkRTSEFLRV9DRiB0aGVuIHNldCBDRiBvbiB0aGUKKwkJICogd2F5IGluIGFuZCB3YWl0IGZvciB0aGUgaGFuZGxlciB0byBjbGVhciBpdDsgdGhpcyBhdm9pZHMKKwkJICogY29ycnVwdGluZyByZWdpc3RlciBzdGF0ZSBvbiB0aG9zZSBjaGlwc2V0cyB3aGljaCBoYXZlCisJCSAqIGEgZGVsYXkgYmV0d2VlbiB3cml0aW5nIHRoZSBTTUkgdHJpZ2dlciByZWdpc3RlciBhbmQKKwkJICogZW50ZXJpbmcgU01NLgorCQkgKi8KKwkJYXNtIHZvbGF0aWxlICgKKwkJCSJzdGNcbiIKKwkJCSJvdXRiICUlYWwsICUlZHhcbiIKKwkJIjE6ICAgICAgamMgMWJcbiIKKwkJCTogIj1hIiAocmVzdWx0KQorCQkJOiAiMCIgKGNtZCksCisJCQkgICJkIiAoZ3NtaV9kZXYuc21pX2NtZCksCisJCQkgICJiIiAoZ3NtaV9kZXYucGFyYW1fYnVmLT5hZGRyZXNzKQorCQkJOiAibWVtb3J5IiwgImNjIgorCQkpOworCX0gZWxzZSBpZiAoZ3NtaV9kZXYuaGFuZHNoYWtlX3R5cGUgPT0gR1NNSV9IQU5EU0hBS0VfU1BJTikgeworCQkvKgorCQkgKiBJZiBoYW5kc2hha2VfdHlwZSA9PSBIQU5EU0hBS0VfU1BJTiB3ZSBzcGluIGEKKwkJICogaHVuZHJlZC1pc2ggdXNlY3MgdG8gZW5zdXJlIHRoZSBTTUkgaGFzIHRyaWdnZXJlZC4KKwkJICovCisJCWFzbSB2b2xhdGlsZSAoCisJCQkib3V0YiAlJWFsLCAlJWR4XG4iCisJCSIxOiAgICAgIGxvb3AgMWJcbiIKKwkJCTogIj1hIiAocmVzdWx0KQorCQkJOiAiMCIgKGNtZCksCisJCQkgICJkIiAoZ3NtaV9kZXYuc21pX2NtZCksCisJCQkgICJiIiAoZ3NtaV9kZXYucGFyYW1fYnVmLT5hZGRyZXNzKSwKKwkJCSAgImMiIChzcGluY291bnQpCisJCQk6ICJtZW1vcnkiLCAiY2MiCisJCSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSWYgaGFuZHNoYWtlX3R5cGUgPT0gSEFORFNIQUtFX05PTkUgd2UgZG8gbm90aGluZzsKKwkJICogZWl0aGVyIHdlIGRvbid0IG5lZWQgdG8gb3IgaXQncyBsZWdhY3kgZmlybXdhcmUgdGhhdAorCQkgKiBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlIENGIHByb3RvY29sLgorCQkgKi8KKwkJYXNtIHZvbGF0aWxlICgKKwkJCSJvdXRiICUlYWwsICUlZHhcblx0IgorCQkJOiAiPWEiIChyZXN1bHQpCisJCQk6ICIwIiAoY21kKSwKKwkJCSAgImQiIChnc21pX2Rldi5zbWlfY21kKSwKKwkJCSAgImIiIChnc21pX2Rldi5wYXJhbV9idWYtPmFkZHJlc3MpCisJCQk6ICJtZW1vcnkiLCAiY2MiCisJCSk7CisJfQorCisJLyogY2hlY2sgcmV0dXJuIGNvZGUgZnJvbSBTTUkgaGFuZGxlciAqLworCXN3aXRjaCAocmVzdWx0KSB7CisJY2FzZSBHU01JX1NVQ0NFU1M6CisJCWJyZWFrOworCWNhc2UgR1NNSV9WQVJfTk9UX0ZPVU5EOgorCQkvKiBub3QgcmVhbGx5IGFuIGVycm9yLCBidXQgbGV0IHRoZSBjYWxsZXIga25vdyAqLworCQlyYyA9IDE7CisJCWJyZWFrOworCWNhc2UgR1NNSV9JTlZBTElEX1BBUkFNRVRFUjoKKwkJcHJpbnRrKEtFUk5fRVJSICJnc21pOiBleGVjIDB4JTA0eDogSW52YWxpZCBwYXJhbWV0ZXJcbiIsIGNtZCk7CisJCXJjID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBHU01JX0JVRkZFUl9UT09fU01BTEw6CisJCXByaW50ayhLRVJOX0VSUiAiZ3NtaTogZXhlYyAweCUwNHg6IEJ1ZmZlciB0b28gc21hbGxcbiIsIGNtZCk7CisJCXJjID0gLUVOT01FTTsKKwkJYnJlYWs7CisJY2FzZSBHU01JX1VOU1VQUE9SVEVEOgorCWNhc2UgR1NNSV9VTlNVUFBPUlRFRDI6CisJCWlmIChzdWIgIT0gR1NNSV9DTURfSEFORFNIQUtFX1RZUEUpCisJCQlwcmludGsoS0VSTl9FUlIgImdzbWk6IGV4ZWMgMHglMDR4OiBOb3Qgc3VwcG9ydGVkXG4iLAorCQkJICAgICAgIGNtZCk7CisJCXJjID0gLUVOT1NZUzsKKwkJYnJlYWs7CisJY2FzZSBHU01JX05PVF9SRUFEWToKKwkJcHJpbnRrKEtFUk5fRVJSICJnc21pOiBleGVjIDB4JTA0eDogTm90IHJlYWR5XG4iLCBjbWQpOworCQlyYyA9IC1FQlVTWTsKKwkJYnJlYWs7CisJY2FzZSBHU01JX0RFVklDRV9FUlJPUjoKKwkJcHJpbnRrKEtFUk5fRVJSICJnc21pOiBleGVjIDB4JTA0eDogRGV2aWNlIGVycm9yXG4iLCBjbWQpOworCQlyYyA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgR1NNSV9OT1RfRk9VTkQ6CisJCXByaW50ayhLRVJOX0VSUiAiZ3NtaTogZXhlYyAweCUwNHg6IERhdGEgbm90IGZvdW5kXG4iLCBjbWQpOworCQlyYyA9IC1FTk9FTlQ7CisJCWJyZWFrOworCWNhc2UgR1NNSV9MT0dfRlVMTDoKKwkJcHJpbnRrKEtFUk5fRVJSICJnc21pOiBleGVjIDB4JTA0eDogTG9nIGZ1bGxcbiIsIGNtZCk7CisJCXJjID0gLUVOT1NQQzsKKwkJYnJlYWs7CisJY2FzZSBHU01JX0hBTkRTSEFLRV9DRjoKKwljYXNlIEdTTUlfSEFORFNIQUtFX1NQSU46CisJY2FzZSBHU01JX0hBTkRTSEFLRV9OT05FOgorCQlyYyA9IHJlc3VsdDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJnc21pOiBleGVjIDB4JTA0eDogVW5rbm93biBlcnJvciAweCUwNHhcbiIsCisJCSAgICAgICBjbWQsIHJlc3VsdCk7CisJCXJjID0gLUVOWElPOworCX0KKworCXJldHVybiByYzsKK30KKworLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgdW5pY29kZSBjaGFyYWN0ZXJzIGluIGRhdGEgKi8KK3N0YXRpYyBzaXplX3QKK3V0ZjE2X3N0cmxlbihlZmlfY2hhcjE2X3QgKmRhdGEsIHVuc2lnbmVkIGxvbmcgbWF4bGVuZ3RoKQoreworCXVuc2lnbmVkIGxvbmcgbGVuZ3RoID0gMDsKKworCXdoaWxlICgqZGF0YSsrICE9IDAgJiYgbGVuZ3RoIDwgbWF4bGVuZ3RoKQorCQlsZW5ndGgrKzsKKwlyZXR1cm4gbGVuZ3RoOworfQorCitzdGF0aWMgZWZpX3N0YXR1c190IGdzbWlfZ2V0X3ZhcmlhYmxlKGVmaV9jaGFyMTZfdCAqbmFtZSwKKwkJCQkgICAgICBlZmlfZ3VpZF90ICp2ZW5kb3IsIHUzMiAqYXR0ciwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nICpkYXRhX3NpemUsCisJCQkJICAgICAgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtaV9udnJhbV92YXJfcGFyYW0gcGFyYW0gPSB7CisJCS5uYW1lX3B0ciA9IGdzbWlfZGV2Lm5hbWVfYnVmLT5hZGRyZXNzLAorCQkuZGF0YV9wdHIgPSBnc21pX2Rldi5kYXRhX2J1Zi0+YWRkcmVzcywKKwkJLmRhdGFfbGVuID0gKHUzMikqZGF0YV9zaXplLAorCX07CisJZWZpX3N0YXR1c190IHJldCA9IEVGSV9TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc2l6ZV90IG5hbWVfbGVuID0gdXRmMTZfc3RybGVuKG5hbWUsIEdTTUlfQlVGX1NJWkUgLyAyKTsKKwlpbnQgcmM7CisKKwlpZiAobmFtZV9sZW4gPj0gR1NNSV9CVUZfU0laRSAvIDIpCisJCXJldHVybiBFRklfQkFEX0JVRkZFUl9TSVpFOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdzbWlfZGV2LmxvY2ssIGZsYWdzKTsKKworCS8qIFZlbmRvciBndWlkICovCisJbWVtY3B5KCZwYXJhbS5ndWlkLCB2ZW5kb3IsIHNpemVvZihwYXJhbS5ndWlkKSk7CisKKwkvKiB2YXJpYWJsZSBuYW1lLCBhbHJlYWR5IGluIFVURi0xNiAqLworCW1lbXNldChnc21pX2Rldi5uYW1lX2J1Zi0+c3RhcnQsIDAsIGdzbWlfZGV2Lm5hbWVfYnVmLT5sZW5ndGgpOworCW1lbWNweShnc21pX2Rldi5uYW1lX2J1Zi0+c3RhcnQsIG5hbWUsIG5hbWVfbGVuICogMik7CisKKwkvKiBkYXRhIHBvaW50ZXIgKi8KKwltZW1zZXQoZ3NtaV9kZXYuZGF0YV9idWYtPnN0YXJ0LCAwLCBnc21pX2Rldi5kYXRhX2J1Zi0+bGVuZ3RoKTsKKworCS8qIHBhcmFtZXRlciBidWZmZXIgKi8KKwltZW1zZXQoZ3NtaV9kZXYucGFyYW1fYnVmLT5zdGFydCwgMCwgZ3NtaV9kZXYucGFyYW1fYnVmLT5sZW5ndGgpOworCW1lbWNweShnc21pX2Rldi5wYXJhbV9idWYtPnN0YXJ0LCAmcGFyYW0sIHNpemVvZihwYXJhbSkpOworCisJcmMgPSBnc21pX2V4ZWMoR1NNSV9DQUxMQkFDSywgR1NNSV9DTURfR0VUX05WUkFNX1ZBUik7CisJaWYgKHJjIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImdzbWk6IEdldCBWYXJpYWJsZSBmYWlsZWRcbiIpOworCQlyZXQgPSBFRklfTE9BRF9FUlJPUjsKKwl9IGVsc2UgaWYgKHJjID09IDEpIHsKKwkJLyogdmFyaWFibGUgd2FzIG5vdCBmb3VuZCAqLworCQlyZXQgPSBFRklfTk9UX0ZPVU5EOworCX0gZWxzZSB7CisJCS8qIEdldCB0aGUgYXJndW1lbnRzIGJhY2sgKi8KKwkJbWVtY3B5KCZwYXJhbSwgZ3NtaV9kZXYucGFyYW1fYnVmLT5zdGFydCwgc2l6ZW9mKHBhcmFtKSk7CisKKwkJLyogVGhlIHNpemUgcmVwb3J0ZWQgaXMgdGhlIG1pbiBvZiBhbGwgb2Ygb3VyIGJ1ZmZlcnMgKi8KKwkJKmRhdGFfc2l6ZSA9IG1pbigqZGF0YV9zaXplLCBnc21pX2Rldi5kYXRhX2J1Zi0+bGVuZ3RoKTsKKwkJKmRhdGFfc2l6ZSA9IG1pbl90KHVuc2lnbmVkIGxvbmcsICpkYXRhX3NpemUsIHBhcmFtLmRhdGFfbGVuKTsKKworCQkvKiBDb3B5IGRhdGEgYmFjayB0byByZXR1cm4gYnVmZmVyLiAqLworCQltZW1jcHkoZGF0YSwgZ3NtaV9kZXYuZGF0YV9idWYtPnN0YXJ0LCAqZGF0YV9zaXplKTsKKworCQkvKiBBbGwgdmFyaWFibGVzIGFyZSBoYXZlIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyAqLworCQkqYXR0ciA9IEVGSV9WQVJJQUJMRV9OT05fVk9MQVRJTEUgfAorCQkJRUZJX1ZBUklBQkxFX0JPT1RTRVJWSUNFX0FDQ0VTUyB8CisJCQlFRklfVkFSSUFCTEVfUlVOVElNRV9BQ0NFU1M7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3NtaV9kZXYubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGVmaV9zdGF0dXNfdCBnc21pX2dldF9uZXh0X3ZhcmlhYmxlKHVuc2lnbmVkIGxvbmcgKm5hbWVfc2l6ZSwKKwkJCQkJICAgZWZpX2NoYXIxNl90ICpuYW1lLAorCQkJCQkgICBlZmlfZ3VpZF90ICp2ZW5kb3IpCit7CisJc3RydWN0IGdzbWlfZ2V0X25leHRfdmFyX3BhcmFtIHBhcmFtID0geworCQkubmFtZV9wdHIgPSBnc21pX2Rldi5uYW1lX2J1Zi0+YWRkcmVzcywKKwkJLm5hbWVfbGVuID0gZ3NtaV9kZXYubmFtZV9idWYtPmxlbmd0aCwKKwl9OworCWVmaV9zdGF0dXNfdCByZXQgPSBFRklfU1VDQ0VTUzsKKwlpbnQgcmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIEZvciB0aGUgbW9tZW50LCBvbmx5IHN1cHBvcnQgYnVmZmVycyB0aGF0IGV4YWN0bHkgbWF0Y2ggaW4gc2l6ZSAqLworCWlmICgqbmFtZV9zaXplICE9IEdTTUlfQlVGX1NJWkUpCisJCXJldHVybiBFRklfQkFEX0JVRkZFUl9TSVpFOworCisJLyogTGV0J3MgbWFrZSBzdXJlIHRoZSB0aGluZyBpcyBhdCBsZWFzdCBudWxsLXRlcm1pbmF0ZWQgKi8KKwlpZiAodXRmMTZfc3RybGVuKG5hbWUsIEdTTUlfQlVGX1NJWkUgLyAyKSA9PSBHU01JX0JVRl9TSVpFIC8gMikKKwkJcmV0dXJuIEVGSV9JTlZBTElEX1BBUkFNRVRFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZnc21pX2Rldi5sb2NrLCBmbGFncyk7CisKKwkvKiBndWlkICovCisJbWVtY3B5KCZwYXJhbS5ndWlkLCB2ZW5kb3IsIHNpemVvZihwYXJhbS5ndWlkKSk7CisKKwkvKiB2YXJpYWJsZSBuYW1lLCBhbHJlYWR5IGluIFVURi0xNiAqLworCW1lbWNweShnc21pX2Rldi5uYW1lX2J1Zi0+c3RhcnQsIG5hbWUsICpuYW1lX3NpemUpOworCisJLyogcGFyYW1ldGVyIGJ1ZmZlciAqLworCW1lbXNldChnc21pX2Rldi5wYXJhbV9idWYtPnN0YXJ0LCAwLCBnc21pX2Rldi5wYXJhbV9idWYtPmxlbmd0aCk7CisJbWVtY3B5KGdzbWlfZGV2LnBhcmFtX2J1Zi0+c3RhcnQsICZwYXJhbSwgc2l6ZW9mKHBhcmFtKSk7CisKKwlyYyA9IGdzbWlfZXhlYyhHU01JX0NBTExCQUNLLCBHU01JX0NNRF9HRVRfTkVYVF9WQVIpOworCWlmIChyYyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJnc21pOiBHZXQgTmV4dCBWYXJpYWJsZSBOYW1lIGZhaWxlZFxuIik7CisJCXJldCA9IEVGSV9MT0FEX0VSUk9SOworCX0gZWxzZSBpZiAocmMgPT0gMSkgeworCQkvKiB2YXJpYWJsZSBub3QgZm91bmQgLS0gZW5kIG9mIGxpc3QgKi8KKwkJcmV0ID0gRUZJX05PVF9GT1VORDsKKwl9IGVsc2UgeworCQkvKiBjb3B5IHZhcmlhYmxlIGRhdGEgYmFjayB0byByZXR1cm4gYnVmZmVyICovCisJCW1lbWNweSgmcGFyYW0sIGdzbWlfZGV2LnBhcmFtX2J1Zi0+c3RhcnQsIHNpemVvZihwYXJhbSkpOworCisJCS8qIENvcHkgdGhlIG5hbWUgYmFjayAqLworCQltZW1jcHkobmFtZSwgZ3NtaV9kZXYubmFtZV9idWYtPnN0YXJ0LCBHU01JX0JVRl9TSVpFKTsKKwkJKm5hbWVfc2l6ZSA9IHV0ZjE2X3N0cmxlbihuYW1lLCBHU01JX0JVRl9TSVpFIC8gMikgKiAyOworCisJCS8qIGNvcHkgZ3VpZCB0byByZXR1cm4gYnVmZmVyICovCisJCW1lbWNweSh2ZW5kb3IsICZwYXJhbS5ndWlkLCBzaXplb2YocGFyYW0uZ3VpZCkpOworCQlyZXQgPSBFRklfU1VDQ0VTUzsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnc21pX2Rldi5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgZWZpX3N0YXR1c190IGdzbWlfc2V0X3ZhcmlhYmxlKGVmaV9jaGFyMTZfdCAqbmFtZSwKKwkJCQkgICAgICBlZmlfZ3VpZF90ICp2ZW5kb3IsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBhdHRyLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZGF0YV9zaXplLAorCQkJCSAgICAgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdzbWlfbnZyYW1fdmFyX3BhcmFtIHBhcmFtID0geworCQkubmFtZV9wdHIgPSBnc21pX2Rldi5uYW1lX2J1Zi0+YWRkcmVzcywKKwkJLmRhdGFfcHRyID0gZ3NtaV9kZXYuZGF0YV9idWYtPmFkZHJlc3MsCisJCS5kYXRhX2xlbiA9ICh1MzIpZGF0YV9zaXplLAorCQkuYXR0cmlidXRlcyA9IEVGSV9WQVJJQUJMRV9OT05fVk9MQVRJTEUgfAorCQkJICAgICAgRUZJX1ZBUklBQkxFX0JPT1RTRVJWSUNFX0FDQ0VTUyB8CisJCQkgICAgICBFRklfVkFSSUFCTEVfUlVOVElNRV9BQ0NFU1MsCisJfTsKKwlzaXplX3QgbmFtZV9sZW4gPSB1dGYxNl9zdHJsZW4obmFtZSwgR1NNSV9CVUZfU0laRSAvIDIpOworCWVmaV9zdGF0dXNfdCByZXQgPSBFRklfU1VDQ0VTUzsKKwlpbnQgcmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChuYW1lX2xlbiA+PSBHU01JX0JVRl9TSVpFIC8gMikKKwkJcmV0dXJuIEVGSV9CQURfQlVGRkVSX1NJWkU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3NtaV9kZXYubG9jaywgZmxhZ3MpOworCisJLyogZ3VpZCAqLworCW1lbWNweSgmcGFyYW0uZ3VpZCwgdmVuZG9yLCBzaXplb2YocGFyYW0uZ3VpZCkpOworCisJLyogdmFyaWFibGUgbmFtZSwgYWxyZWFkeSBpbiBVVEYtMTYgKi8KKwltZW1zZXQoZ3NtaV9kZXYubmFtZV9idWYtPnN0YXJ0LCAwLCBnc21pX2Rldi5uYW1lX2J1Zi0+bGVuZ3RoKTsKKwltZW1jcHkoZ3NtaV9kZXYubmFtZV9idWYtPnN0YXJ0LCBuYW1lLCBuYW1lX2xlbiAqIDIpOworCisJLyogZGF0YSBwb2ludGVyICovCisJbWVtc2V0KGdzbWlfZGV2LmRhdGFfYnVmLT5zdGFydCwgMCwgZ3NtaV9kZXYuZGF0YV9idWYtPmxlbmd0aCk7CisJbWVtY3B5KGdzbWlfZGV2LmRhdGFfYnVmLT5zdGFydCwgZGF0YSwgZGF0YV9zaXplKTsKKworCS8qIHBhcmFtZXRlciBidWZmZXIgKi8KKwltZW1zZXQoZ3NtaV9kZXYucGFyYW1fYnVmLT5zdGFydCwgMCwgZ3NtaV9kZXYucGFyYW1fYnVmLT5sZW5ndGgpOworCW1lbWNweShnc21pX2Rldi5wYXJhbV9idWYtPnN0YXJ0LCAmcGFyYW0sIHNpemVvZihwYXJhbSkpOworCisJcmMgPSBnc21pX2V4ZWMoR1NNSV9DQUxMQkFDSywgR1NNSV9DTURfU0VUX05WUkFNX1ZBUik7CisJaWYgKHJjIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImdzbWk6IFNldCBWYXJpYWJsZSBmYWlsZWRcbiIpOworCQlyZXQgPSBFRklfSU5WQUxJRF9QQVJBTUVURVI7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3NtaV9kZXYubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBlZml2YXJfb3BlcmF0aW9ucyBlZml2YXJfb3BzID0geworCS5nZXRfdmFyaWFibGUgPSBnc21pX2dldF92YXJpYWJsZSwKKwkuc2V0X3ZhcmlhYmxlID0gZ3NtaV9zZXRfdmFyaWFibGUsCisJLmdldF9uZXh0X3ZhcmlhYmxlID0gZ3NtaV9nZXRfbmV4dF92YXJpYWJsZSwKK307CisKK3N0YXRpYyBzc2l6ZV90IGV2ZW50bG9nX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCSAgICAgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCisJCQkgICAgICAgY2hhciAqYnVmLCBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGdzbWlfc2V0X2V2ZW50bG9nX3BhcmFtIHBhcmFtID0geworCQkuZGF0YV9wdHIgPSBnc21pX2Rldi5kYXRhX2J1Zi0+YWRkcmVzcywKKwl9OworCWludCByYyA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFB1bGwgdGhlIHR5cGUgb3V0ICovCisJaWYgKGNvdW50IDwgc2l6ZW9mKHUzMikpCisJCXJldHVybiAtRUlOVkFMOworCXBhcmFtLnR5cGUgPSAqKHUzMiAqKWJ1ZjsKKwljb3VudCAtPSBzaXplb2YodTMyKTsKKwlidWYgKz0gc2l6ZW9mKHUzMik7CisKKwkvKiBUaGUgcmVtYWluaW5nIGJ1ZmZlciBpcyB0aGUgZGF0YSBwYXlsb2FkICovCisJaWYgKGNvdW50ID4gZ3NtaV9kZXYuZGF0YV9idWYtPmxlbmd0aCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcGFyYW0uZGF0YV9sZW4gPSBjb3VudCAtIHNpemVvZih1MzIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdzbWlfZGV2LmxvY2ssIGZsYWdzKTsKKworCS8qIGRhdGEgcG9pbnRlciAqLworCW1lbXNldChnc21pX2Rldi5kYXRhX2J1Zi0+c3RhcnQsIDAsIGdzbWlfZGV2LmRhdGFfYnVmLT5sZW5ndGgpOworCW1lbWNweShnc21pX2Rldi5kYXRhX2J1Zi0+c3RhcnQsIGJ1ZiwgcGFyYW0uZGF0YV9sZW4pOworCisJLyogcGFyYW1ldGVyIGJ1ZmZlciAqLworCW1lbXNldChnc21pX2Rldi5wYXJhbV9idWYtPnN0YXJ0LCAwLCBnc21pX2Rldi5wYXJhbV9idWYtPmxlbmd0aCk7CisJbWVtY3B5KGdzbWlfZGV2LnBhcmFtX2J1Zi0+c3RhcnQsICZwYXJhbSwgc2l6ZW9mKHBhcmFtKSk7CisKKwlyYyA9IGdzbWlfZXhlYyhHU01JX0NBTExCQUNLLCBHU01JX0NNRF9TRVRfRVZFTlRfTE9HKTsKKwlpZiAocmMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImdzbWk6IFNldCBFdmVudCBMb2cgZmFpbGVkXG4iKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdzbWlfZGV2LmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByYzsKKworfQorCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgZXZlbnRsb2dfYmluX2F0dHIgPSB7CisJLmF0dHIgPSB7Lm5hbWUgPSAiYXBwZW5kX3RvX2V2ZW50bG9nIiwgLm1vZGUgPSAwMjAwfSwKKwkud3JpdGUgPSBldmVudGxvZ193cml0ZSwKK307CisKK3N0YXRpYyBzc2l6ZV90IGdzbWlfY2xlYXJfZXZlbnRsb2dfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJCSBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgcmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlzdHJ1Y3QgeworCQl1MzIgcGVyY2VudGFnZTsKKwkJdTMyIGRhdGFfdHlwZTsKKwl9IHBhcmFtOworCisJcmMgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZ2YWwpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyoKKwkgKiBWYWx1ZSBlbnRlcmVkIGlzIGEgcGVyY2VudGFnZSwgMCB0aHJvdWdoIDEwMCwgYW55dGhpbmcgZWxzZQorCSAqIGlzIGludmFsaWQuCisJICovCisJaWYgKHZhbCA+IDEwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBkYXRhX3R5cGUgaGVyZSBzZWxlY3RzIHRoZSBzbWJpb3MgZXZlbnQgbG9nLiAqLworCXBhcmFtLnBlcmNlbnRhZ2UgPSB2YWw7CisJcGFyYW0uZGF0YV90eXBlID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZnc21pX2Rldi5sb2NrLCBmbGFncyk7CisKKwkvKiBwYXJhbWV0ZXIgYnVmZmVyICovCisJbWVtc2V0KGdzbWlfZGV2LnBhcmFtX2J1Zi0+c3RhcnQsIDAsIGdzbWlfZGV2LnBhcmFtX2J1Zi0+bGVuZ3RoKTsKKwltZW1jcHkoZ3NtaV9kZXYucGFyYW1fYnVmLT5zdGFydCwgJnBhcmFtLCBzaXplb2YocGFyYW0pKTsKKworCXJjID0gZ3NtaV9leGVjKEdTTUlfQ0FMTEJBQ0ssIEdTTUlfQ01EX0NMRUFSX0VWRU5UX0xPRyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnc21pX2Rldi5sb2NrLCBmbGFncyk7CisKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgZ3NtaV9jbGVhcl9ldmVudGxvZ19hdHRyID0geworCS5hdHRyID0gey5uYW1lID0gImNsZWFyX2V2ZW50bG9nIiwgLm1vZGUgPSAwMjAwfSwKKwkuc3RvcmUgPSBnc21pX2NsZWFyX2V2ZW50bG9nX3N0b3JlLAorfTsKKworc3RhdGljIHNzaXplX3QgZ3NtaV9jbGVhcl9jb25maWdfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgICAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IHJjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3NtaV9kZXYubG9jaywgZmxhZ3MpOworCisJLyogY2xlYXIgcGFyYW1ldGVyIGJ1ZmZlciAqLworCW1lbXNldChnc21pX2Rldi5wYXJhbV9idWYtPnN0YXJ0LCAwLCBnc21pX2Rldi5wYXJhbV9idWYtPmxlbmd0aCk7CisKKwlyYyA9IGdzbWlfZXhlYyhHU01JX0NBTExCQUNLLCBHU01JX0NNRF9DTEVBUl9DT05GSUcpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3NtaV9kZXYubG9jaywgZmxhZ3MpOworCisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIGdzbWlfY2xlYXJfY29uZmlnX2F0dHIgPSB7CisJLmF0dHIgPSB7Lm5hbWUgPSAiY2xlYXJfY29uZmlnIiwgLm1vZGUgPSAwMjAwfSwKKwkuc3RvcmUgPSBnc21pX2NsZWFyX2NvbmZpZ19zdG9yZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICpnc21pX2F0dHJzW10gPSB7CisJJmdzbWlfY2xlYXJfY29uZmlnX2F0dHIuYXR0ciwKKwkmZ3NtaV9jbGVhcl9ldmVudGxvZ19hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBpbnQgZ3NtaV9zaHV0ZG93bl9yZWFzb24oaW50IHJlYXNvbikKK3sKKwlzdHJ1Y3QgZ3NtaV9sb2dfZW50cnlfdHlwZV8xIGVudHJ5ID0geworCQkudHlwZSAgICAgPSBHU01JX0xPR19FTlRSWV9UWVBFX0tFUk5FTCwKKwkJLmluc3RhbmNlID0gcmVhc29uLAorCX07CisJc3RydWN0IGdzbWlfc2V0X2V2ZW50bG9nX3BhcmFtIHBhcmFtID0geworCQkuZGF0YV9sZW4gPSBzaXplb2YoZW50cnkpLAorCQkudHlwZSAgICAgPSAxLAorCX07CisJc3RhdGljIGludCBzYXZlZF9yZWFzb247CisJaW50IHJjID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogYXZvaWQgZHVwbGljYXRlIGVudHJpZXMgaW4gdGhlIGxvZyAqLworCWlmIChzYXZlZF9yZWFzb24gJiAoMSA8PCByZWFzb24pKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZnc21pX2Rldi5sb2NrLCBmbGFncyk7CisKKwlzYXZlZF9yZWFzb24gfD0gKDEgPDwgcmVhc29uKTsKKworCS8qIGRhdGEgcG9pbnRlciAqLworCW1lbXNldChnc21pX2Rldi5kYXRhX2J1Zi0+c3RhcnQsIDAsIGdzbWlfZGV2LmRhdGFfYnVmLT5sZW5ndGgpOworCW1lbWNweShnc21pX2Rldi5kYXRhX2J1Zi0+c3RhcnQsICZlbnRyeSwgc2l6ZW9mKGVudHJ5KSk7CisKKwkvKiBwYXJhbWV0ZXIgYnVmZmVyICovCisJcGFyYW0uZGF0YV9wdHIgPSBnc21pX2Rldi5kYXRhX2J1Zi0+YWRkcmVzczsKKwltZW1zZXQoZ3NtaV9kZXYucGFyYW1fYnVmLT5zdGFydCwgMCwgZ3NtaV9kZXYucGFyYW1fYnVmLT5sZW5ndGgpOworCW1lbWNweShnc21pX2Rldi5wYXJhbV9idWYtPnN0YXJ0LCAmcGFyYW0sIHNpemVvZihwYXJhbSkpOworCisJcmMgPSBnc21pX2V4ZWMoR1NNSV9DQUxMQkFDSywgR1NNSV9DTURfU0VUX0VWRU5UX0xPRyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnc21pX2Rldi5sb2NrLCBmbGFncyk7CisKKwlpZiAocmMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImdzbWk6IExvZyBTaHV0ZG93biBSZWFzb24gZmFpbGVkXG4iKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0VNRVJHICJnc21pOiBMb2cgU2h1dGRvd24gUmVhc29uIDB4JTAyeFxuIiwKKwkJICAgICAgIHJlYXNvbik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZ3NtaV9yZWJvb3RfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQl1bnNpZ25lZCBsb25nIHJlYXNvbiwgdm9pZCAqYXJnKQoreworCWdzbWlfc2h1dGRvd25fcmVhc29uKEdTTUlfU0hVVERPV05fQ0xFQU4pOworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBnc21pX3JlYm9vdF9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGdzbWlfcmVib290X2NhbGxiYWNrCit9OworCitzdGF0aWMgaW50IGdzbWlfZGllX2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgcmVhc29uLCB2b2lkICphcmcpCit7CisJaWYgKHJlYXNvbiA9PSBESUVfT09QUykKKwkJZ3NtaV9zaHV0ZG93bl9yZWFzb24oR1NNSV9TSFVURE9XTl9PT1BTKTsKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZ3NtaV9kaWVfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBnc21pX2RpZV9jYWxsYmFjaworfTsKKworc3RhdGljIGludCBnc21pX3BhbmljX2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyByZWFzb24sIHZvaWQgKmFyZykKK3sKKwlnc21pX3NodXRkb3duX3JlYXNvbihHU01JX1NIVVRET1dOX1BBTklDKTsKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZ3NtaV9wYW5pY19ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGdzbWlfcGFuaWNfY2FsbGJhY2ssCit9OworCisvKgorICogVGhpcyBoYXNoIGZ1bmN0aW9uIHdhcyBibGF0YW50bHkgY29waWVkIGZyb20gaW5jbHVkZS9saW51eC9oYXNoLmguCisgKiBJdCBpcyB1c2VkIGJ5IHRoaXMgZHJpdmVyIHRvIG9iZnVzY2F0ZSBhIGJvYXJkIG5hbWUgdGhhdCByZXF1aXJlcyBhCisgKiBxdWlyayB3aXRoaW4gdGhpcyBkcml2ZXIuCisgKgorICogUGxlYXNlIGRvIG5vdCByZW1vdmUgdGhpcyBjb3B5IG9mIHRoZSBmdW5jdGlvbiBhcyBhbnkgY2hhbmdlcyB0byB0aGUKKyAqIGdsb2JhbCB1dGlsaXR5IGhhc2hfNjQoKSBmdW5jdGlvbiB3b3VsZCBicmVhayB0aGlzIGRyaXZlcidzIGFiaWxpdHkKKyAqIHRvIGlkZW50aWZ5IGEgYm9hcmQgYW5kIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIHF1aXJrIC0tIG1pa2V3QGdvb2dsZS5jb20KKyAqLworc3RhdGljIHU2NCBfX2luaXQgbG9jYWxfaGFzaF82NCh1NjQgdmFsLCB1bnNpZ25lZCBiaXRzKQoreworCXU2NCBoYXNoID0gdmFsOworCisJLyogIFNpZ2gsIGdjYyBjYW4ndCBvcHRpbWlzZSB0aGlzIGFsb25lIGxpa2UgaXQgZG9lcyBmb3IgMzIgYml0cy4gKi8KKwl1NjQgbiA9IGhhc2g7CisJbiA8PD0gMTg7CisJaGFzaCAtPSBuOworCW4gPDw9IDMzOworCWhhc2ggLT0gbjsKKwluIDw8PSAzOworCWhhc2ggKz0gbjsKKwluIDw8PSAzOworCWhhc2ggLT0gbjsKKwluIDw8PSA0OworCWhhc2ggKz0gbjsKKwluIDw8PSAyOworCWhhc2ggKz0gbjsKKworCS8qIEhpZ2ggYml0cyBhcmUgbW9yZSByYW5kb20sIHNvIHVzZSB0aGVtLiAqLworCXJldHVybiBoYXNoID4+ICg2NCAtIGJpdHMpOworfQorCitzdGF0aWMgdTMyIF9faW5pdCBoYXNoX29lbV90YWJsZV9pZChjaGFyIHNbOF0pCit7CisJdTY0IGlucHV0OworCW1lbWNweSgmaW5wdXQsIHMsIDgpOworCXJldHVybiBsb2NhbF9oYXNoXzY0KGlucHV0LCAzMik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBnc21pX2RtaV90YWJsZVtdIF9faW5pdGRhdGEgPSB7CisJeworCQkuaWRlbnQgPSAiR29vZ2xlIEJvYXJkIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkdvb2dsZSwgSW5jLiIpLAorCQl9LAorCX0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGRtaSwgZ3NtaV9kbWlfdGFibGUpOworCitzdGF0aWMgX19pbml0IGludCBnc21pX3N5c3RlbV92YWxpZCh2b2lkKQoreworCXUzMiBoYXNoOworCisJaWYgKCFkbWlfY2hlY2tfc3lzdGVtKGdzbWlfZG1pX3RhYmxlKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKgorCSAqIE9ubHkgbmV3ZXIgZmlybXdhcmUgc3VwcG9ydHMgdGhlIGdzbWkgaW50ZXJmYWNlLiAgQWxsIG9sZGVyCisJICogZmlybXdhcmUgdGhhdCBkaWRuJ3Qgc3VwcG9ydCB0aGlzIGludGVyZmFjZSB1c2VkIHRvIHBsdWcgdGhlCisJICogdGFibGUgbmFtZSBpbiB0aGUgZmlyc3QgZm91ciBieXRlcyBvZiB0aGUgb2VtX3RhYmxlX2lkIGZpZWxkLgorCSAqIE5ld2VyIGZpcm13YXJlIGRvZXNuJ3QgZG8gdGhhdCB0aG91Z2gsIHNvIHVzZSB0aGF0IGFzIHRoZQorCSAqIGRpc2NyaW1pbmFudCBmYWN0b3IuICBXZSBoYXZlIHRvIGRvIHRoaXMgaW4gb3JkZXIgdG8KKwkgKiB3aGl0ZXdhc2ggb3VyIGJvYXJkIG5hbWVzIG91dCBvZiB0aGUgcHVibGljIGRyaXZlci4KKwkgKi8KKwlpZiAoIXN0cm5jbXAoYWNwaV9nYmxfRkFEVC5oZWFkZXIub2VtX3RhYmxlX2lkLCAiRkFDUCIsIDQpKSB7CisJCXByaW50ayhLRVJOX0lORk8gImdzbWk6IEJvYXJkIGlzIHRvbyBvbGRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBEaXNhYmxlIG9uIGJvYXJkIHdpdGggMS4wIEJJT1MgZHVlIHRvIEdvb2dsZSBidWcgMjYwMjY1NyAqLworCWhhc2ggPSBoYXNoX29lbV90YWJsZV9pZChhY3BpX2dibF9GQURULmhlYWRlci5vZW1fdGFibGVfaWQpOworCWlmIChoYXNoID09IFFVSVJLWV9CT0FSRF9IQVNIKSB7CisJCWNvbnN0IGNoYXIgKmJpb3NfdmVyID0gZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfQklPU19WRVJTSU9OKTsKKwkJaWYgKHN0cm5jbXAoYmlvc192ZXIsICIxLjAiLCAzKSA9PSAwKSB7CisJCQlwcl9pbmZvKCJnc21pOiBkaXNhYmxlZCBvbiB0aGlzIGJvYXJkJ3MgQklPUyAlc1xuIiwKKwkJCQliaW9zX3Zlcik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCS8qIGNoZWNrIGZvciB2YWxpZCBTTUkgY29tbWFuZCBwb3J0IGluIEFDUEkgRkFEVCAqLworCWlmIChhY3BpX2dibF9GQURULnNtaV9jb21tYW5kID09IDApIHsKKwkJcHJfaW5mbygiZ3NtaTogbWlzc2luZyBzbWlfY29tbWFuZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIEZvdW5kICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga29iamVjdCAqZ3NtaV9rb2JqOworc3RhdGljIHN0cnVjdCBlZml2YXJzIGVmaXZhcnM7CisKK3N0YXRpYyBfX2luaXQgaW50IGdzbWlfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCXJldCA9IGdzbWlfc3lzdGVtX3ZhbGlkKCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWdzbWlfZGV2LnNtaV9jbWQgPSBhY3BpX2dibF9GQURULnNtaV9jb21tYW5kOworCisJLyogcmVnaXN0ZXIgZGV2aWNlICovCisJZ3NtaV9kZXYucGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoImdzbWkiLCAtMSwgTlVMTCwgMCk7CisJaWYgKElTX0VSUihnc21pX2Rldi5wZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgImdzbWk6IHVuYWJsZSB0byByZWdpc3RlciBwbGF0Zm9ybSBkZXZpY2VcbiIpOworCQlyZXR1cm4gUFRSX0VSUihnc21pX2Rldi5wZGV2KTsKKwl9CisKKwkvKiBTTUkgYWNjZXNzIG5lZWRzIHRvIGJlIHNlcmlhbGl6ZWQgKi8KKwlzcGluX2xvY2tfaW5pdCgmZ3NtaV9kZXYubG9jayk7CisKKwkvKiBTTUkgY2FsbGJhY2tzIHJlcXVpcmUgMzJiaXQgYWRkcmVzc2VzICovCisJZ3NtaV9kZXYucGRldi0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKwlnc21pX2Rldi5wZGV2LT5kZXYuZG1hX21hc2sgPQorCQkmZ3NtaV9kZXYucGRldi0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrOworCXJldCA9IC1FTk9NRU07CisJZ3NtaV9kZXYuZG1hX3Bvb2wgPSBkbWFfcG9vbF9jcmVhdGUoImdzbWkiLCAmZ3NtaV9kZXYucGRldi0+ZGV2LAorCQkJCQkgICAgIEdTTUlfQlVGX1NJWkUsIEdTTUlfQlVGX0FMSUdOLCAwKTsKKwlpZiAoIWdzbWlfZGV2LmRtYV9wb29sKQorCQlnb3RvIG91dF9lcnI7CisKKwkvKgorCSAqIHByZS1hbGxvY2F0ZSBidWZmZXJzIGJlY2F1c2Ugc29tZXRpbWVzIHdlIGFyZSBjYWxsZWQgd2hlbgorCSAqIHRoaXMgaXMgbm90IGZlYXNpYmxlOiBvb3BzLCBwYW5pYywgZGllLCBtY2UsIGV0YworCSAqLworCWdzbWlfZGV2Lm5hbWVfYnVmID0gZ3NtaV9idWZfYWxsb2MoKTsKKwlpZiAoIWdzbWlfZGV2Lm5hbWVfYnVmKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZ3NtaTogZmFpbGVkIHRvIGFsbG9jYXRlIG5hbWUgYnVmZmVyXG4iKTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCWdzbWlfZGV2LmRhdGFfYnVmID0gZ3NtaV9idWZfYWxsb2MoKTsKKwlpZiAoIWdzbWlfZGV2LmRhdGFfYnVmKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZ3NtaTogZmFpbGVkIHRvIGFsbG9jYXRlIGRhdGEgYnVmZmVyXG4iKTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCWdzbWlfZGV2LnBhcmFtX2J1ZiA9IGdzbWlfYnVmX2FsbG9jKCk7CisJaWYgKCFnc21pX2Rldi5wYXJhbV9idWYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJnc21pOiBmYWlsZWQgdG8gYWxsb2NhdGUgcGFyYW0gYnVmZmVyXG4iKTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCS8qCisJICogRGV0ZXJtaW5lIHR5cGUgb2YgaGFuZHNoYWtlIHVzZWQgdG8gc2VyaWFsaXplIHRoZSBTTUkKKwkgKiBlbnRyeS4gU2VlIGFsc28gZ3NtaV9leGVjKCkuCisJICoKKwkgKiBUaGVyZSdzIGEgImJlaGF2aW9yIiBwcmVzZW50IG9uIHNvbWUgY2hpcHNldHMgd2hlcmUgd3JpdGluZyB0aGUKKwkgKiBTTUkgdHJpZ2dlciByZWdpc3RlciBpbiB0aGUgc291dGhicmlkZ2UgZG9lc24ndCByZXN1bHQgaW4gYW4KKwkgKiBpbW1lZGlhdGUgU01JLiBSYXRoZXIsIHRoZSBwcm9jZXNzb3IgY2FuIGV4ZWN1dGUgImEgZmV3IiBtb3JlCisJICogaW5zdHJ1Y3Rpb25zIGJlZm9yZSB0aGUgU01JIHRha2VzIGVmZmVjdC4gVG8gZW5zdXJlIHN5bmNocm9ub3VzCisJICogYmVoYXZpb3IsIGltcGxlbWVudCBhIGhhbmRzaGFrZSBiZXR3ZWVuIHRoZSBrZXJuZWwgZHJpdmVyIGFuZCB0aGUKKwkgKiBmaXJtd2FyZSBoYW5kbGVyIHRvIHNwaW4gdW50aWwgcmVsZWFzZWQuIFRoaXMgaW9jdGwgZGV0ZXJtaW5lcworCSAqIHRoZSB0eXBlIG9mIGhhbmRzaGFrZS4KKwkgKgorCSAqIE5PTkU6IFRoZSBmaXJtd2FyZSBoYW5kbGVyIGRvZXMgbm90IGltcGxlbWVudCBhbnkKKwkgKiBoYW5kc2hha2UuIEVpdGhlciBpdCBkb2Vzbid0IG5lZWQgdG8sIG9yIGl0J3MgbGVnYWN5IGZpcm13YXJlCisJICogdGhhdCBkb2Vzbid0IGtub3cgaXQgbmVlZHMgdG8gYW5kIG5ldmVyIHdpbGwuCisJICoKKwkgKiBDRjogVGhlIGZpcm13YXJlIGhhbmRsZXIgd2lsbCBjbGVhciB0aGUgQ0YgaW4gdGhlIHNhdmVkCisJICogc3RhdGUgYmVmb3JlIHJldHVybmluZy4gVGhlIGRyaXZlciBtYXkgc2V0IHRoZSBDRiBhbmQgdGVzdCBmb3IKKwkgKiBpdCB0byBjbGVhciBiZWZvcmUgcHJvY2VlZGluZy4KKwkgKgorCSAqIFNQSU46IFRoZSBmaXJtd2FyZSBoYW5kbGVyIGRvZXMgbm90IGltcGxlbWVudCBhbnkgaGFuZHNoYWtlCisJICogYnV0IHRoZSBkcml2ZXIgc2hvdWxkIHNwaW4gZm9yIGEgaHVuZHJlZCBvciBzbyBtaWNyb3NlY29uZHMKKwkgKiB0byBlbnN1cmUgdGhlIFNNSSBoYXMgdHJpZ2dlcmVkLgorCSAqCisJICogRmluYWxseSwgdGhlIGhhbmRsZXIgd2lsbCByZXR1cm4gLUVOT1NZUyBpZgorCSAqIEdTTUlfQ01EX0hBTkRTSEFLRV9UWVBFIGlzIHVuaW1wbGVtZW50ZWQsIHdoaWNoIGltcGxpZXMKKwkgKiBIQU5EU0hBS0VfTk9ORS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3NtaV9kZXYubG9jaywgZmxhZ3MpOworCWdzbWlfZGV2LmhhbmRzaGFrZV90eXBlID0gR1NNSV9IQU5EU0hBS0VfU1BJTjsKKwlnc21pX2Rldi5oYW5kc2hha2VfdHlwZSA9CisJICAgIGdzbWlfZXhlYyhHU01JX0NBTExCQUNLLCBHU01JX0NNRF9IQU5EU0hBS0VfVFlQRSk7CisJaWYgKGdzbWlfZGV2LmhhbmRzaGFrZV90eXBlID09IC1FTk9TWVMpCisJCWdzbWlfZGV2LmhhbmRzaGFrZV90eXBlID0gR1NNSV9IQU5EU0hBS0VfTk9ORTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnc21pX2Rldi5sb2NrLCBmbGFncyk7CisKKwkvKiBSZW1vdmUgYW5kIGNsZWFuIHVwIGdzbWkgaWYgdGhlIGhhbmRzaGFrZSBjb3VsZCBub3QgY29tcGxldGUuICovCisJaWYgKGdzbWlfZGV2LmhhbmRzaGFrZV90eXBlID09IC1FTlhJTykgeworCQlwcmludGsoS0VSTl9JTkZPICJnc21pIHZlcnNpb24gIiBEUklWRVJfVkVSU0lPTgorCQkgICAgICAgIiBmYWlsZWQgdG8gbG9hZFxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJnc21pIHZlcnNpb24gIiBEUklWRVJfVkVSU0lPTiAiIGxvYWRlZFxuIik7CisKKwkvKiBSZWdpc3RlciBpbiB0aGUgZmlybXdhcmUgZGlyZWN0b3J5ICovCisJcmV0ID0gLUVOT01FTTsKKwlnc21pX2tvYmogPSBrb2JqZWN0X2NyZWF0ZV9hbmRfYWRkKCJnc21pIiwgZmlybXdhcmVfa29iaik7CisJaWYgKCFnc21pX2tvYmopIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZ3NtaTogRmFpbGVkIHRvIGNyZWF0ZSBmaXJtd2FyZSBrb2JqXG4iKTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCS8qIFNldHVwIGV2ZW50bG9nIGFjY2VzcyAqLworCXJldCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZShnc21pX2tvYmosICZldmVudGxvZ19iaW5fYXR0cik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9JTkZPICJnc21pOiBGYWlsZWQgdG8gc2V0dXAgZXZlbnRsb2ciKTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCS8qIE90aGVyIGF0dHJpYnV0ZXMgKi8KKwlyZXQgPSBzeXNmc19jcmVhdGVfZmlsZXMoZ3NtaV9rb2JqLCBnc21pX2F0dHJzKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0lORk8gImdzbWk6IEZhaWxlZCB0byBhZGQgYXR0cnMiKTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCWlmIChyZWdpc3Rlcl9lZml2YXJzKCZlZml2YXJzLCAmZWZpdmFyX29wcywgZ3NtaV9rb2JqKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJnc21pOiBGYWlsZWQgdG8gcmVnaXN0ZXIgZWZpdmFyc1xuIik7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmdzbWlfcmVib290X25vdGlmaWVyKTsKKwlyZWdpc3Rlcl9kaWVfbm90aWZpZXIoJmdzbWlfZGllX25vdGlmaWVyKTsKKwlhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJnBhbmljX25vdGlmaWVyX2xpc3QsCisJCQkJICAgICAgICZnc21pX3BhbmljX25vdGlmaWVyKTsKKworCXJldHVybiAwOworCisgb3V0X2VycjoKKwlrb2JqZWN0X3B1dChnc21pX2tvYmopOworCWdzbWlfYnVmX2ZyZWUoZ3NtaV9kZXYucGFyYW1fYnVmKTsKKwlnc21pX2J1Zl9mcmVlKGdzbWlfZGV2LmRhdGFfYnVmKTsKKwlnc21pX2J1Zl9mcmVlKGdzbWlfZGV2Lm5hbWVfYnVmKTsKKwlpZiAoZ3NtaV9kZXYuZG1hX3Bvb2wpCisJCWRtYV9wb29sX2Rlc3Ryb3koZ3NtaV9kZXYuZG1hX3Bvb2wpOworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGdzbWlfZGV2LnBkZXYpOworCXByX2luZm8oImdzbWk6IGZhaWxlZCB0byBsb2FkOiAlZFxuIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZ3NtaV9leGl0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmdzbWlfcmVib290X25vdGlmaWVyKTsKKwl1bnJlZ2lzdGVyX2RpZV9ub3RpZmllcigmZ3NtaV9kaWVfbm90aWZpZXIpOworCWF0b21pY19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZwYW5pY19ub3RpZmllcl9saXN0LAorCQkJCQkgJmdzbWlfcGFuaWNfbm90aWZpZXIpOworCXVucmVnaXN0ZXJfZWZpdmFycygmZWZpdmFycyk7CisKKwlrb2JqZWN0X3B1dChnc21pX2tvYmopOworCWdzbWlfYnVmX2ZyZWUoZ3NtaV9kZXYucGFyYW1fYnVmKTsKKwlnc21pX2J1Zl9mcmVlKGdzbWlfZGV2LmRhdGFfYnVmKTsKKwlnc21pX2J1Zl9mcmVlKGdzbWlfZGV2Lm5hbWVfYnVmKTsKKwlkbWFfcG9vbF9kZXN0cm95KGdzbWlfZGV2LmRtYV9wb29sKTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcihnc21pX2Rldi5wZGV2KTsKK30KKworbW9kdWxlX2luaXQoZ3NtaV9pbml0KTsKK21vZHVsZV9leGl0KGdzbWlfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkdvb2dsZSwgSW5jLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9nb29nbGUvbWVtY29uc29sZS5jIGIvZHJpdmVycy9maXJtd2FyZS9nb29nbGUvbWVtY29uc29sZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhOTBiYTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Zpcm13YXJlL2dvb2dsZS9tZW1jb25zb2xlLmMKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBtZW1jb25zb2xlLmMKKyAqCisgKiBJbmZyYXN0cnVjdHVyZSBmb3IgaW1wb3J0aW5nIHRoZSBCSU9TIG1lbW9yeSBiYXNlZCBjb25zb2xlCisgKiBpbnRvIHRoZSBrZXJuZWwgbG9nIHJpbmdidWZmZXIuCisgKgorICogQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8YXNtL2Jpb3NfZWJkYS5oPgorCisjZGVmaW5lIEJJT1NfTUVNQ09OU09MRV9WMV9NQUdJQwkweERFQURCQUJFCisjZGVmaW5lIEJJT1NfTUVNQ09OU09MRV9WMl9NQUdJQwkoKCdNJyl8KCdDJzw8OCl8KCdPJzw8MTYpfCgnTic8PDI0KSkKKworc3RydWN0IGJpb3NtZW1jb25fZWJkYSB7CisJdTMyIHNpZ25hdHVyZTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1OCAgZW5hYmxlZDsKKwkJCXUzMiBidWZmZXJfYWRkcjsKKwkJCXUxNiBzdGFydDsKKwkJCXUxNiBlbmQ7CisJCQl1MTYgbnVtX2NoYXJzOworCQkJdTggIHdyYXBwZWQ7CisJCX0gX19wYWNrZWQgdjE7CisJCXN0cnVjdCB7CisJCQl1MzIgYnVmZmVyX2FkZHI7CisJCQkvKiBNaXNkb2N1bWVudGVkIGFzIG51bWJlciBvZiBwYWdlcyEgKi8KKwkJCXUxNiBudW1fYnl0ZXM7CisJCQl1MTYgc3RhcnQ7CisJCQl1MTYgZW5kOworCQl9IF9fcGFja2VkIHYyOworCX07Cit9IF9fcGFja2VkOworCitzdGF0aWMgY2hhciAqbWVtY29uc29sZV9iYXNlYWRkcjsKK3N0YXRpYyBzaXplX3QgbWVtY29uc29sZV9sZW5ndGg7CisKK3N0YXRpYyBzc2l6ZV90IG1lbWNvbnNvbGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYnAsCisJCQkgICAgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLCBjaGFyICpidWYsCisJCQkgICAgICAgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBtZW1vcnlfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCAmcG9zLCBtZW1jb25zb2xlX2Jhc2VhZGRyLAorCQkJCSAgICAgICBtZW1jb25zb2xlX2xlbmd0aCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBtZW1jb25zb2xlX2Jpbl9hdHRyID0geworCS5hdHRyID0gey5uYW1lID0gImxvZyIsIC5tb2RlID0gMDQ0NH0sCisJLnJlYWQgPSBtZW1jb25zb2xlX3JlYWQsCit9OworCisKK3N0YXRpYyB2b2lkIGZvdW5kX3YxX2hlYWRlcihzdHJ1Y3QgYmlvc21lbWNvbl9lYmRhICpoZHIpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiQklPUyBjb25zb2xlIHYxIEVCREEgc3RydWN0dXJlIGZvdW5kIGF0ICVwXG4iLCBoZHIpOworCXByaW50ayhLRVJOX0lORk8gIkJJT1MgY29uc29sZSBidWZmZXIgYXQgMHglLjh4LCAiCisJICAgICAgICJzdGFydCA9ICVkLCBlbmQgPSAlZCwgbnVtID0gJWRcbiIsCisJICAgICAgIGhkci0+djEuYnVmZmVyX2FkZHIsIGhkci0+djEuc3RhcnQsCisJICAgICAgIGhkci0+djEuZW5kLCBoZHItPnYxLm51bV9jaGFycyk7CisKKwltZW1jb25zb2xlX2xlbmd0aCA9IGhkci0+djEubnVtX2NoYXJzOworCW1lbWNvbnNvbGVfYmFzZWFkZHIgPSBwaHlzX3RvX3ZpcnQoaGRyLT52MS5idWZmZXJfYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIGZvdW5kX3YyX2hlYWRlcihzdHJ1Y3QgYmlvc21lbWNvbl9lYmRhICpoZHIpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiQklPUyBjb25zb2xlIHYyIEVCREEgc3RydWN0dXJlIGZvdW5kIGF0ICVwXG4iLCBoZHIpOworCXByaW50ayhLRVJOX0lORk8gIkJJT1MgY29uc29sZSBidWZmZXIgYXQgMHglLjh4LCAiCisJICAgICAgICJzdGFydCA9ICVkLCBlbmQgPSAlZCwgbnVtX2J5dGVzID0gJWRcbiIsCisJICAgICAgIGhkci0+djIuYnVmZmVyX2FkZHIsIGhkci0+djIuc3RhcnQsCisJICAgICAgIGhkci0+djIuZW5kLCBoZHItPnYyLm51bV9ieXRlcyk7CisKKwltZW1jb25zb2xlX2xlbmd0aCA9IGhkci0+djIuZW5kIC0gaGRyLT52Mi5zdGFydDsKKwltZW1jb25zb2xlX2Jhc2VhZGRyID0gcGh5c190b192aXJ0KGhkci0+djIuYnVmZmVyX2FkZHIKKwkJCQkJICAgKyBoZHItPnYyLnN0YXJ0KTsKK30KKworLyoKKyAqIFNlYXJjaCB0aHJvdWdoIHRoZSBFQkRBIGZvciB0aGUgQklPUyBNZW1vcnkgQ29uc29sZSwgYW5kCisgKiBzZXQgdGhlIGdsb2JhbCB2YXJpYWJsZXMgdG8gcG9pbnQgdG8gaXQuICBSZXR1cm4gdHJ1ZSBpZiBmb3VuZC4KKyAqLworc3RhdGljIGJvb2wgZm91bmRfbWVtY29uc29sZSh2b2lkKQoreworCXVuc2lnbmVkIGludCBhZGRyZXNzOworCXNpemVfdCBsZW5ndGgsIGN1cjsKKworCWFkZHJlc3MgPSBnZXRfYmlvc19lYmRhKCk7CisJaWYgKCFhZGRyZXNzKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkJJT1MgRUJEQSBub24tZXhpc3RlbnQuXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qIEVCREEgbGVuZ3RoIGlzIGJ5dGUgMCBvZiBFQkRBIChpbiBLQikgKi8KKwlsZW5ndGggPSAqKHU4ICopcGh5c190b192aXJ0KGFkZHJlc3MpOworCWxlbmd0aCA8PD0gMTA7IC8qIGNvbnZlcnQgdG8gYnl0ZXMgKi8KKworCS8qCisJICogU2VhcmNoIHRocm91Z2ggRUJEQSBmb3IgQklPUyBtZW1vcnkgY29uc29sZSBzdHJ1Y3R1cmUKKwkgKiBub3RlOiBzaWduYXR1cmUgaXMgbm90IG5lY2Vzc2FyaWx5IGR3b3JkLWFsaWduZWQKKwkgKi8KKwlmb3IgKGN1ciA9IDA7IGN1ciA8IGxlbmd0aDsgY3VyKyspIHsKKwkJc3RydWN0IGJpb3NtZW1jb25fZWJkYSAqaGRyID0gcGh5c190b192aXJ0KGFkZHJlc3MgKyBjdXIpOworCisJCS8qIG1lbWNvbnNvbGUgdjEgKi8KKwkJaWYgKGhkci0+c2lnbmF0dXJlID09IEJJT1NfTUVNQ09OU09MRV9WMV9NQUdJQykgeworCQkJZm91bmRfdjFfaGVhZGVyKGhkcik7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCS8qIG1lbWNvbnNvbGUgdjIgKi8KKwkJaWYgKGhkci0+c2lnbmF0dXJlID09IEJJT1NfTUVNQ09OU09MRV9WMl9NQUdJQykgeworCQkJZm91bmRfdjJfaGVhZGVyKGhkcik7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKworCXByaW50ayhLRVJOX0lORk8gIkJJT1MgY29uc29sZSBFQkRBIHN0cnVjdHVyZSBub3QgZm91bmQhXG4iKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBtZW1jb25zb2xlX2RtaV90YWJsZVtdIF9faW5pdGRhdGEgPSB7CisJeworCQkuaWRlbnQgPSAiR29vZ2xlIEJvYXJkIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkdvb2dsZSwgSW5jLiIpLAorCQl9LAorCX0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGRtaSwgbWVtY29uc29sZV9kbWlfdGFibGUpOworCitzdGF0aWMgaW50IF9faW5pdCBtZW1jb25zb2xlX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKCFkbWlfY2hlY2tfc3lzdGVtKG1lbWNvbnNvbGVfZG1pX3RhYmxlKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIWZvdW5kX21lbWNvbnNvbGUoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltZW1jb25zb2xlX2Jpbl9hdHRyLnNpemUgPSBtZW1jb25zb2xlX2xlbmd0aDsKKworCXJldCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZShmaXJtd2FyZV9rb2JqLCAmbWVtY29uc29sZV9iaW5fYXR0cik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWVtY29uc29sZV9leGl0KHZvaWQpCit7CisJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKGZpcm13YXJlX2tvYmosICZtZW1jb25zb2xlX2Jpbl9hdHRyKTsKK30KKworbW9kdWxlX2luaXQobWVtY29uc29sZV9pbml0KTsKK21vZHVsZV9leGl0KG1lbWNvbnNvbGVfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkdvb2dsZSwgSW5jLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9pc2NzaV9pYmZ0X2ZpbmQuYyBiL2RyaXZlcnMvZmlybXdhcmUvaXNjc2lfaWJmdF9maW5kLmMKaW5kZXggMjE5MjQ1Ni4uZjAzMmU0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9pc2NzaV9pYmZ0X2ZpbmQuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2lzY3NpX2liZnRfZmluZC5jCkBAIC00Miw3ICs0MiwyMCBAQAogc3RydWN0IGFjcGlfdGFibGVfaWJmdCAqaWJmdF9hZGRyOwogRVhQT1JUX1NZTUJPTF9HUEwoaWJmdF9hZGRyKTsKIAotI2RlZmluZSBJQkZUX1NJR04gImlCRlQiCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwljaGFyICpzaWduOworfSBpYmZ0X3NpZ25zW10gPSB7CisjaWZkZWYgQ09ORklHX0FDUEkKKwkvKgorCSAqIE9uZSBzcGVjIHNheXMgIklCRlQiLCB0aGUgb3RoZXIgc2F5cyAiaUJGVCIuIFdlIGhhdmUgdG8gY2hlY2sKKwkgKiBmb3IgYm90aC4KKwkgKi8KKwl7IEFDUElfU0lHX0lCRlQgfSwKKyNlbmRpZgorCXsgImlCRlQiIH0sCisJeyAiQklGVCIgfSwJLyogQnJvYWRjb20gaVNDU0kgT2ZmbG9hZCAqLworfTsKKwogI2RlZmluZSBJQkZUX1NJR05fTEVOIDQKICNkZWZpbmUgSUJGVF9TVEFSVCAweDgwMDAwIC8qIDUxMmtCICovCiAjZGVmaW5lIElCRlRfRU5EIDB4MTAwMDAwIC8qIDFNQiAqLwpAQCAtNjIsNiArNzUsNyBAQAogCXVuc2lnbmVkIGxvbmcgcG9zOwogCXVuc2lnbmVkIGludCBsZW4gPSAwOwogCXZvaWQgKnZpcnQ7CisJaW50IGk7CiAKIAlmb3IgKHBvcyA9IElCRlRfU1RBUlQ7IHBvcyA8IElCRlRfRU5EOyBwb3MgKz0gMTYpIHsKIAkJLyogVGhlIHRhYmxlIGNhbid0IGJlIGluc2lkZSB0aGUgVkdBIEJJT1MgcmVzZXJ2ZWQgc3BhY2UsCkBAIC02OSwxOCArODMsMjMgQEAKIAkJaWYgKHBvcyA9PSBWR0FfTUVNKQogCQkJcG9zICs9IFZHQV9TSVpFOwogCQl2aXJ0ID0gaXNhX2J1c190b192aXJ0KHBvcyk7Ci0JCWlmIChtZW1jbXAodmlydCwgSUJGVF9TSUdOLCBJQkZUX1NJR05fTEVOKSA9PSAwKSB7Ci0JCQl1bnNpZ25lZCBsb25nICphZGRyID0KLQkJCSAgICAodW5zaWduZWQgbG9uZyAqKWlzYV9idXNfdG9fdmlydChwb3MgKyA0KTsKLQkJCWxlbiA9ICphZGRyOwotCQkJLyogaWYgdGhlIGxlbmd0aCBvZiB0aGUgdGFibGUgZXh0ZW5kcyBwYXN0IDFNLAotCQkJICogdGhlIHRhYmxlIGNhbm5vdCBiZSB2YWxpZC4gKi8KLQkJCWlmIChwb3MgKyBsZW4gPD0gKElCRlRfRU5ELTEpKSB7Ci0JCQkJaWJmdF9hZGRyID0gKHN0cnVjdCBhY3BpX3RhYmxlX2liZnQgKil2aXJ0OwotCQkJCWJyZWFrOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGliZnRfc2lnbnMpOyBpKyspIHsKKwkJCWlmIChtZW1jbXAodmlydCwgaWJmdF9zaWduc1tpXS5zaWduLCBJQkZUX1NJR05fTEVOKSA9PQorCQkJICAgIDApIHsKKwkJCQl1bnNpZ25lZCBsb25nICphZGRyID0KKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcgKilpc2FfYnVzX3RvX3ZpcnQocG9zICsgNCk7CisJCQkJbGVuID0gKmFkZHI7CisJCQkJLyogaWYgdGhlIGxlbmd0aCBvZiB0aGUgdGFibGUgZXh0ZW5kcyBwYXN0IDFNLAorCQkJCSAqIHRoZSB0YWJsZSBjYW5ub3QgYmUgdmFsaWQuICovCisJCQkJaWYgKHBvcyArIGxlbiA8PSAoSUJGVF9FTkQtMSkpIHsKKwkJCQkJaWJmdF9hZGRyID0gKHN0cnVjdCBhY3BpX3RhYmxlX2liZnQgKil2aXJ0OworCQkJCQlnb3RvIGRvbmU7CisJCQkJfQogCQkJfQogCQl9CiAJfQorZG9uZToKIAlyZXR1cm4gbGVuOwogfQogLyoKQEAgLTg5LDE4ICsxMDgsMTIgQEAKICAqLwogdW5zaWduZWQgbG9uZyBfX2luaXQgZmluZF9pYmZ0X3JlZ2lvbih1bnNpZ25lZCBsb25nICpzaXplcCkKIHsKLQorCWludCBpOwogCWliZnRfYWRkciA9IE5VTEw7CiAKICNpZmRlZiBDT05GSUdfQUNQSQotCS8qCi0JICogT25lIHNwZWMgc2F5cyAiSUJGVCIsIHRoZSBvdGhlciBzYXlzICJpQkZUIi4gV2UgaGF2ZSB0byBjaGVjawotCSAqIGZvciBib3RoLgotCSAqLwotCWlmICghaWJmdF9hZGRyKQotCQlhY3BpX3RhYmxlX3BhcnNlKEFDUElfU0lHX0lCRlQsIGFjcGlfZmluZF9pYmZ0KTsKLQlpZiAoIWliZnRfYWRkcikKLQkJYWNwaV90YWJsZV9wYXJzZShJQkZUX1NJR04sIGFjcGlfZmluZF9pYmZ0KTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpYmZ0X3NpZ25zKSAmJiAhaWJmdF9hZGRyOyBpKyspCisJCWFjcGlfdGFibGVfcGFyc2UoaWJmdF9zaWduc1tpXS5zaWduLCBhY3BpX2ZpbmRfaWJmdCk7CiAjZW5kaWYgLyogQ09ORklHX0FDUEkgKi8KIAogCS8qIGlCRlQgMS4wMyBzZWN0aW9uIDEuNC4zLjEgbWFuZGF0ZXMgdGhhdCBVRUZJIG1hY2hpbmVzIHdpbGwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtYS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY21hLmMKaW5kZXggNWVkOWQyNS4uOTlkZGU4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY21hLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY21hLmMKQEAgLTE0OCw2ICsxNDgsNyBAQAogCXUzMgkJCXFwX251bTsKIAl1OAkJCXNycTsKIAl1OAkJCXRvczsKKwl1OAkJCXJldXNlYWRkcjsKIH07CiAKIHN0cnVjdCBjbWFfbXVsdGljYXN0IHsKQEAgLTcxMiw2ICs3MTMsMjEgQEAKIAlyZXR1cm4gY21hX3plcm9fYWRkcihhZGRyKSB8fCBjbWFfbG9vcGJhY2tfYWRkcihhZGRyKTsKIH0KIAorc3RhdGljIGludCBjbWFfYWRkcl9jbXAoc3RydWN0IHNvY2thZGRyICpzcmMsIHN0cnVjdCBzb2NrYWRkciAqZHN0KQoreworCWlmIChzcmMtPnNhX2ZhbWlseSAhPSBkc3QtPnNhX2ZhbWlseSkKKwkJcmV0dXJuIC0xOworCisJc3dpdGNoIChzcmMtPnNhX2ZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJcmV0dXJuICgoc3RydWN0IHNvY2thZGRyX2luICopIHNyYyktPnNpbl9hZGRyLnNfYWRkciAhPQorCQkgICAgICAgKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgZHN0KS0+c2luX2FkZHIuc19hZGRyOworCWRlZmF1bHQ6CisJCXJldHVybiBpcHY2X2FkZHJfY21wKCYoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgc3JjKS0+c2luNl9hZGRyLAorCQkJCSAgICAgJigoc3RydWN0IHNvY2thZGRyX2luNiAqKSBkc3QpLT5zaW42X2FkZHIpOworCX0KK30KKwogc3RhdGljIGlubGluZSBfX2JlMTYgY21hX3BvcnQoc3RydWN0IHNvY2thZGRyICphZGRyKQogewogCWlmIChhZGRyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkKQEAgLTE1NjQsNTAgKzE1ODAsNiBAQAogCW11dGV4X3VubG9jaygmbG9jayk7CiB9CiAKLWludCByZG1hX2xpc3RlbihzdHJ1Y3QgcmRtYV9jbV9pZCAqaWQsIGludCBiYWNrbG9nKQotewotCXN0cnVjdCByZG1hX2lkX3ByaXZhdGUgKmlkX3ByaXY7Ci0JaW50IHJldDsKLQotCWlkX3ByaXYgPSBjb250YWluZXJfb2YoaWQsIHN0cnVjdCByZG1hX2lkX3ByaXZhdGUsIGlkKTsKLQlpZiAoaWRfcHJpdi0+c3RhdGUgPT0gQ01BX0lETEUpIHsKLQkJKChzdHJ1Y3Qgc29ja2FkZHIgKikgJmlkLT5yb3V0ZS5hZGRyLnNyY19hZGRyKS0+c2FfZmFtaWx5ID0gQUZfSU5FVDsKLQkJcmV0ID0gcmRtYV9iaW5kX2FkZHIoaWQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmlkLT5yb3V0ZS5hZGRyLnNyY19hZGRyKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKCFjbWFfY29tcF9leGNoKGlkX3ByaXYsIENNQV9BRERSX0JPVU5ELCBDTUFfTElTVEVOKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZF9wcml2LT5iYWNrbG9nID0gYmFja2xvZzsKLQlpZiAoaWQtPmRldmljZSkgewotCQlzd2l0Y2ggKHJkbWFfbm9kZV9nZXRfdHJhbnNwb3J0KGlkLT5kZXZpY2UtPm5vZGVfdHlwZSkpIHsKLQkJY2FzZSBSRE1BX1RSQU5TUE9SVF9JQjoKLQkJCXJldCA9IGNtYV9pYl9saXN0ZW4oaWRfcHJpdik7Ci0JCQlpZiAocmV0KQotCQkJCWdvdG8gZXJyOwotCQkJYnJlYWs7Ci0JCWNhc2UgUkRNQV9UUkFOU1BPUlRfSVdBUlA6Ci0JCQlyZXQgPSBjbWFfaXdfbGlzdGVuKGlkX3ByaXYsIGJhY2tsb2cpOwotCQkJaWYgKHJldCkKLQkJCQlnb3RvIGVycjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0ID0gLUVOT1NZUzsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfSBlbHNlCi0JCWNtYV9saXN0ZW5fb25fYWxsKGlkX3ByaXYpOwotCi0JcmV0dXJuIDA7Ci1lcnI6Ci0JaWRfcHJpdi0+YmFja2xvZyA9IDA7Ci0JY21hX2NvbXBfZXhjaChpZF9wcml2LCBDTUFfTElTVEVOLCBDTUFfQUREUl9CT1VORCk7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0wocmRtYV9saXN0ZW4pOwotCiB2b2lkIHJkbWFfc2V0X3NlcnZpY2VfdHlwZShzdHJ1Y3QgcmRtYV9jbV9pZCAqaWQsIGludCB0b3MpCiB7CiAJc3RydWN0IHJkbWFfaWRfcHJpdmF0ZSAqaWRfcHJpdjsKQEAgLTIwOTAsNiArMjA2MiwyNSBAQAogfQogRVhQT1JUX1NZTUJPTChyZG1hX3Jlc29sdmVfYWRkcik7CiAKK2ludCByZG1hX3NldF9yZXVzZWFkZHIoc3RydWN0IHJkbWFfY21faWQgKmlkLCBpbnQgcmV1c2UpCit7CisJc3RydWN0IHJkbWFfaWRfcHJpdmF0ZSAqaWRfcHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlpZF9wcml2ID0gY29udGFpbmVyX29mKGlkLCBzdHJ1Y3QgcmRtYV9pZF9wcml2YXRlLCBpZCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkX3ByaXYtPmxvY2ssIGZsYWdzKTsKKwlpZiAoaWRfcHJpdi0+c3RhdGUgPT0gQ01BX0lETEUpIHsKKwkJaWRfcHJpdi0+cmV1c2VhZGRyID0gcmV1c2U7CisJCXJldCA9IDA7CisJfSBlbHNlIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRfcHJpdi0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHJkbWFfc2V0X3JldXNlYWRkcik7CisKIHN0YXRpYyB2b2lkIGNtYV9iaW5kX3BvcnQoc3RydWN0IHJkbWFfYmluZF9saXN0ICpiaW5kX2xpc3QsCiAJCQkgIHN0cnVjdCByZG1hX2lkX3ByaXZhdGUgKmlkX3ByaXYpCiB7CkBAIC0yMTY1LDQxICsyMTU2LDcxIEBACiAJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwogfQogCi1zdGF0aWMgaW50IGNtYV91c2VfcG9ydChzdHJ1Y3QgaWRyICpwcywgc3RydWN0IHJkbWFfaWRfcHJpdmF0ZSAqaWRfcHJpdikKKy8qCisgKiBDaGVjayB0aGF0IHRoZSByZXF1ZXN0ZWQgcG9ydCBpcyBhdmFpbGFibGUuICBUaGlzIGlzIGNhbGxlZCB3aGVuIHRyeWluZyB0bworICogYmluZCB0byBhIHNwZWNpZmljIHBvcnQsIG9yIHdoZW4gdHJ5aW5nIHRvIGxpc3RlbiBvbiBhIGJvdW5kIHBvcnQuICBJbgorICogdGhlIGxhdHRlciBjYXNlLCB0aGUgcHJvdmlkZWQgaWRfcHJpdiBtYXkgYWxyZWFkeSBiZSBvbiB0aGUgYmluZF9saXN0LCBidXQKKyAqIHdlIHN0aWxsIG5lZWQgdG8gY2hlY2sgdGhhdCBpdCdzIG9rYXkgdG8gc3RhcnQgbGlzdGVuaW5nLgorICovCitzdGF0aWMgaW50IGNtYV9jaGVja19wb3J0KHN0cnVjdCByZG1hX2JpbmRfbGlzdCAqYmluZF9saXN0LAorCQkJICBzdHJ1Y3QgcmRtYV9pZF9wcml2YXRlICppZF9wcml2LCB1aW50OF90IHJldXNlYWRkcikKIHsKIAlzdHJ1Y3QgcmRtYV9pZF9wcml2YXRlICpjdXJfaWQ7Ci0Jc3RydWN0IHNvY2thZGRyX2luICpzaW4sICpjdXJfc2luOwotCXN0cnVjdCByZG1hX2JpbmRfbGlzdCAqYmluZF9saXN0OworCXN0cnVjdCBzb2NrYWRkciAqYWRkciwgKmN1cl9hZGRyOwogCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwotCXVuc2lnbmVkIHNob3J0IHNudW07CiAKLQlzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopICZpZF9wcml2LT5pZC5yb3V0ZS5hZGRyLnNyY19hZGRyOwotCXNudW0gPSBudG9ocyhzaW4tPnNpbl9wb3J0KTsKKwlhZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSAmaWRfcHJpdi0+aWQucm91dGUuYWRkci5zcmNfYWRkcjsKKwlpZiAoY21hX2FueV9hZGRyKGFkZHIpICYmICFyZXVzZWFkZHIpCisJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGN1cl9pZCwgbm9kZSwgJmJpbmRfbGlzdC0+b3duZXJzLCBub2RlKSB7CisJCWlmIChpZF9wcml2ID09IGN1cl9pZCkKKwkJCWNvbnRpbnVlOworCisJCWlmICgoY3VyX2lkLT5zdGF0ZSA9PSBDTUFfTElTVEVOKSB8fAorCQkgICAgIXJldXNlYWRkciB8fCAhY3VyX2lkLT5yZXVzZWFkZHIpIHsKKwkJCWN1cl9hZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSAmY3VyX2lkLT5pZC5yb3V0ZS5hZGRyLnNyY19hZGRyOworCQkJaWYgKGNtYV9hbnlfYWRkcihjdXJfYWRkcikpCisJCQkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCisJCQlpZiAoIWNtYV9hZGRyX2NtcChhZGRyLCBjdXJfYWRkcikpCisJCQkJcmV0dXJuIC1FQUREUklOVVNFOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNtYV91c2VfcG9ydChzdHJ1Y3QgaWRyICpwcywgc3RydWN0IHJkbWFfaWRfcHJpdmF0ZSAqaWRfcHJpdikKK3sKKwlzdHJ1Y3QgcmRtYV9iaW5kX2xpc3QgKmJpbmRfbGlzdDsKKwl1bnNpZ25lZCBzaG9ydCBzbnVtOworCWludCByZXQ7CisKKwlzbnVtID0gbnRvaHMoY21hX3BvcnQoKHN0cnVjdCBzb2NrYWRkciAqKSAmaWRfcHJpdi0+aWQucm91dGUuYWRkci5zcmNfYWRkcikpOwogCWlmIChzbnVtIDwgUFJPVF9TT0NLICYmICFjYXBhYmxlKENBUF9ORVRfQklORF9TRVJWSUNFKSkKIAkJcmV0dXJuIC1FQUNDRVM7CiAKIAliaW5kX2xpc3QgPSBpZHJfZmluZChwcywgc251bSk7Ci0JaWYgKCFiaW5kX2xpc3QpCi0JCXJldHVybiBjbWFfYWxsb2NfcG9ydChwcywgaWRfcHJpdiwgc251bSk7Ci0KLQkvKgotCSAqIFdlIGRvbid0IHN1cHBvcnQgYmluZGluZyB0byBhbnkgYWRkcmVzcyBpZiBhbnlvbmUgaXMgYm91bmQgdG8KLQkgKiBhIHNwZWNpZmljIGFkZHJlc3Mgb24gdGhlIHNhbWUgcG9ydC4KLQkgKi8KLQlpZiAoY21hX2FueV9hZGRyKChzdHJ1Y3Qgc29ja2FkZHIgKikgJmlkX3ByaXYtPmlkLnJvdXRlLmFkZHIuc3JjX2FkZHIpKQotCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7Ci0KLQlobGlzdF9mb3JfZWFjaF9lbnRyeShjdXJfaWQsIG5vZGUsICZiaW5kX2xpc3QtPm93bmVycywgbm9kZSkgewotCQlpZiAoY21hX2FueV9hZGRyKChzdHJ1Y3Qgc29ja2FkZHIgKikgJmN1cl9pZC0+aWQucm91dGUuYWRkci5zcmNfYWRkcikpCi0JCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7Ci0KLQkJY3VyX3NpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJmN1cl9pZC0+aWQucm91dGUuYWRkci5zcmNfYWRkcjsKLQkJaWYgKHNpbi0+c2luX2FkZHIuc19hZGRyID09IGN1cl9zaW4tPnNpbl9hZGRyLnNfYWRkcikKLQkJCXJldHVybiAtRUFERFJJTlVTRTsKKwlpZiAoIWJpbmRfbGlzdCkgeworCQlyZXQgPSBjbWFfYWxsb2NfcG9ydChwcywgaWRfcHJpdiwgc251bSk7CisJfSBlbHNlIHsKKwkJcmV0ID0gY21hX2NoZWNrX3BvcnQoYmluZF9saXN0LCBpZF9wcml2LCBpZF9wcml2LT5yZXVzZWFkZHIpOworCQlpZiAoIXJldCkKKwkJCWNtYV9iaW5kX3BvcnQoYmluZF9saXN0LCBpZF9wcml2KTsKIAl9CisJcmV0dXJuIHJldDsKK30KIAotCWNtYV9iaW5kX3BvcnQoYmluZF9saXN0LCBpZF9wcml2KTsKLQlyZXR1cm4gMDsKK3N0YXRpYyBpbnQgY21hX2JpbmRfbGlzdGVuKHN0cnVjdCByZG1hX2lkX3ByaXZhdGUgKmlkX3ByaXYpCit7CisJc3RydWN0IHJkbWFfYmluZF9saXN0ICpiaW5kX2xpc3QgPSBpZF9wcml2LT5iaW5kX2xpc3Q7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZsb2NrKTsKKwlpZiAoYmluZF9saXN0LT5vd25lcnMuZmlyc3QtPm5leHQpCisJCXJldCA9IGNtYV9jaGVja19wb3J0KGJpbmRfbGlzdCwgaWRfcHJpdiwgMCk7CisJbXV0ZXhfdW5sb2NrKCZsb2NrKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGNtYV9nZXRfcG9ydChzdHJ1Y3QgcmRtYV9pZF9wcml2YXRlICppZF9wcml2KQpAQCAtMjI1Myw2ICsyMjc0LDU2IEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCByZG1hX2xpc3RlbihzdHJ1Y3QgcmRtYV9jbV9pZCAqaWQsIGludCBiYWNrbG9nKQoreworCXN0cnVjdCByZG1hX2lkX3ByaXZhdGUgKmlkX3ByaXY7CisJaW50IHJldDsKKworCWlkX3ByaXYgPSBjb250YWluZXJfb2YoaWQsIHN0cnVjdCByZG1hX2lkX3ByaXZhdGUsIGlkKTsKKwlpZiAoaWRfcHJpdi0+c3RhdGUgPT0gQ01BX0lETEUpIHsKKwkJKChzdHJ1Y3Qgc29ja2FkZHIgKikgJmlkLT5yb3V0ZS5hZGRyLnNyY19hZGRyKS0+c2FfZmFtaWx5ID0gQUZfSU5FVDsKKwkJcmV0ID0gcmRtYV9iaW5kX2FkZHIoaWQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmlkLT5yb3V0ZS5hZGRyLnNyY19hZGRyKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCFjbWFfY29tcF9leGNoKGlkX3ByaXYsIENNQV9BRERSX0JPVU5ELCBDTUFfTElTVEVOKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoaWRfcHJpdi0+cmV1c2VhZGRyKSB7CisJCXJldCA9IGNtYV9iaW5kX2xpc3RlbihpZF9wcml2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOworCX0KKworCWlkX3ByaXYtPmJhY2tsb2cgPSBiYWNrbG9nOworCWlmIChpZC0+ZGV2aWNlKSB7CisJCXN3aXRjaCAocmRtYV9ub2RlX2dldF90cmFuc3BvcnQoaWQtPmRldmljZS0+bm9kZV90eXBlKSkgeworCQljYXNlIFJETUFfVFJBTlNQT1JUX0lCOgorCQkJcmV0ID0gY21hX2liX2xpc3RlbihpZF9wcml2KTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnI7CisJCQlicmVhazsKKwkJY2FzZSBSRE1BX1RSQU5TUE9SVF9JV0FSUDoKKwkJCXJldCA9IGNtYV9pd19saXN0ZW4oaWRfcHJpdiwgYmFja2xvZyk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRU5PU1lTOworCQkJZ290byBlcnI7CisJCX0KKwl9IGVsc2UKKwkJY21hX2xpc3Rlbl9vbl9hbGwoaWRfcHJpdik7CisKKwlyZXR1cm4gMDsKK2VycjoKKwlpZF9wcml2LT5iYWNrbG9nID0gMDsKKwljbWFfY29tcF9leGNoKGlkX3ByaXYsIENNQV9MSVNURU4sIENNQV9BRERSX0JPVU5EKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChyZG1hX2xpc3Rlbik7CisKIGludCByZG1hX2JpbmRfYWRkcihzdHJ1Y3QgcmRtYV9jbV9pZCAqaWQsIHN0cnVjdCBzb2NrYWRkciAqYWRkcikKIHsKIAlzdHJ1Y3QgcmRtYV9pZF9wcml2YXRlICppZF9wcml2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvaXdjbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvaXdjbS5jCmluZGV4IDJhMWU5YWUuLmE5YzA0MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2l3Y20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9pd2NtLmMKQEAgLTcyNSw3ICs3MjUsNyBAQAogCSAqLwogCWNsZWFyX2JpdChJV0NNX0ZfQ09OTkVDVF9XQUlULCAmY21faWRfcHJpdi0+ZmxhZ3MpOwogCUJVR19PTihjbV9pZF9wcml2LT5zdGF0ZSAhPSBJV19DTV9TVEFURV9DT05OX1NFTlQpOwotCWlmIChpd19ldmVudC0+c3RhdHVzID09IElXX0NNX0VWRU5UX1NUQVRVU19BQ0NFUFRFRCkgeworCWlmIChpd19ldmVudC0+c3RhdHVzID09IDApIHsKIAkJY21faWRfcHJpdi0+aWQubG9jYWxfYWRkciA9IGl3X2V2ZW50LT5sb2NhbF9hZGRyOwogCQljbV9pZF9wcml2LT5pZC5yZW1vdGVfYWRkciA9IGl3X2V2ZW50LT5yZW1vdGVfYWRkcjsKIAkJY21faWRfcHJpdi0+c3RhdGUgPSBJV19DTV9TVEFURV9FU1RBQkxJU0hFRDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbWEuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbWEuYwppbmRleCBlYzFlOWRhLi5iM2ZhNzk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y21hLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdWNtYS5jCkBAIC04ODMsNiArODgzLDEzIEBACiAJCX0KIAkJcmRtYV9zZXRfc2VydmljZV90eXBlKGN0eC0+Y21faWQsICooKHU4ICopIG9wdHZhbCkpOwogCQlicmVhazsKKwljYXNlIFJETUFfT1BUSU9OX0lEX1JFVVNFQUREUjoKKwkJaWYgKG9wdGxlbiAhPSBzaXplb2YoaW50KSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IHJkbWFfc2V0X3JldXNlYWRkcihjdHgtPmNtX2lkLCAqKChpbnQgKikgb3B0dmFsKSA/IDEgOiAwKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVOT1NZUzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jbS5jCmluZGV4IDlkOGRjZmEuLmQ3ZWU3MGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jbS5jCkBAIC0xMTk4LDkgKzExOTgsNyBAQAogCX0KIAlQREJHKCIlcyBlcCAlcCBzdGF0dXMgJWQgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCBlcCwKIAkgICAgIHJwbC0+c3RhdHVzLCBzdGF0dXMyZXJybm8ocnBsLT5zdGF0dXMpKTsKLQllcC0+Y29tLndyX3dhaXQucmV0ID0gc3RhdHVzMmVycm5vKHJwbC0+c3RhdHVzKTsKLQllcC0+Y29tLndyX3dhaXQuZG9uZSA9IDE7Ci0Jd2FrZV91cCgmZXAtPmNvbS53cl93YWl0LndhaXQpOworCWM0aXdfd2FrZV91cCgmZXAtPmNvbS53cl93YWl0LCBzdGF0dXMyZXJybm8ocnBsLT5zdGF0dXMpKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTIzNCw5ICsxMjMyLDcgQEAKIAlzdHJ1Y3QgYzRpd19saXN0ZW5fZXAgKmVwID0gbG9va3VwX3N0aWQodCwgc3RpZCk7CiAKIAlQREJHKCIlcyBlcCAlcFxuIiwgX19mdW5jX18sIGVwKTsKLQllcC0+Y29tLndyX3dhaXQucmV0ID0gc3RhdHVzMmVycm5vKHJwbC0+c3RhdHVzKTsKLQllcC0+Y29tLndyX3dhaXQuZG9uZSA9IDE7Ci0Jd2FrZV91cCgmZXAtPmNvbS53cl93YWl0LndhaXQpOworCWM0aXdfd2FrZV91cCgmZXAtPmNvbS53cl93YWl0LCBzdGF0dXMyZXJybm8ocnBsLT5zdGF0dXMpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQ2Niw3ICsxNDYyLDcgQEAKIAlzdHJ1Y3QgYzRpd19xcF9hdHRyaWJ1dGVzIGF0dHJzOwogCWludCBkaXNjb25uZWN0ID0gMTsKIAlpbnQgcmVsZWFzZSA9IDA7Ci0JaW50IGNsb3NpbmcgPSAwOworCWludCBhYm9ydCA9IDA7CiAJc3RydWN0IHRpZF9pbmZvICp0ID0gZGV2LT5yZGV2LmxsZGkudGlkczsKIAl1bnNpZ25lZCBpbnQgdGlkID0gR0VUX1RJRChoZHIpOwogCkBAIC0xNDkyLDIzICsxNDg4LDIyIEBACiAJCSAqIGluIHJkbWEgY29ubmVjdGlvbiBtaWdyYXRpb24gKHNlZSBjNGl3X2FjY2VwdF9jcigpKS4KIAkJICovCiAJCV9fc3RhdGVfc2V0KCZlcC0+Y29tLCBDTE9TSU5HKTsKLQkJZXAtPmNvbS53cl93YWl0LmRvbmUgPSAxOwotCQllcC0+Y29tLndyX3dhaXQucmV0ID0gLUVDT05OUkVTRVQ7CiAJCVBEQkcoIndha2luZyB1cCBlcCAlcCB0aWQgJXVcbiIsIGVwLCBlcC0+aHd0aWQpOwotCQl3YWtlX3VwKCZlcC0+Y29tLndyX3dhaXQud2FpdCk7CisJCWM0aXdfd2FrZV91cCgmZXAtPmNvbS53cl93YWl0LCAtRUNPTk5SRVNFVCk7CiAJCWJyZWFrOwogCWNhc2UgTVBBX1JFUF9TRU5UOgogCQlfX3N0YXRlX3NldCgmZXAtPmNvbSwgQ0xPU0lORyk7Ci0JCWVwLT5jb20ud3Jfd2FpdC5kb25lID0gMTsKLQkJZXAtPmNvbS53cl93YWl0LnJldCA9IC1FQ09OTlJFU0VUOwogCQlQREJHKCJ3YWtpbmcgdXAgZXAgJXAgdGlkICV1XG4iLCBlcCwgZXAtPmh3dGlkKTsKLQkJd2FrZV91cCgmZXAtPmNvbS53cl93YWl0LndhaXQpOworCQljNGl3X3dha2VfdXAoJmVwLT5jb20ud3Jfd2FpdCwgLUVDT05OUkVTRVQpOwogCQlicmVhazsKIAljYXNlIEZQRFVfTU9ERToKIAkJc3RhcnRfZXBfdGltZXIoZXApOwogCQlfX3N0YXRlX3NldCgmZXAtPmNvbSwgQ0xPU0lORyk7Ci0JCWNsb3NpbmcgPSAxOworCQlhdHRycy5uZXh0X3N0YXRlID0gQzRJV19RUF9TVEFURV9DTE9TSU5HOworCQlhYm9ydCA9IGM0aXdfbW9kaWZ5X3FwKGVwLT5jb20ucXAtPnJocCwgZXAtPmNvbS5xcCwKKwkJCQkgICAgICAgQzRJV19RUF9BVFRSX05FWFRfU1RBVEUsICZhdHRycywgMSk7CiAJCXBlZXJfY2xvc2VfdXBjYWxsKGVwKTsKKwkJZGlzY29ubmVjdCA9IDE7CiAJCWJyZWFrOwogCWNhc2UgQUJPUlRJTkc6CiAJCWRpc2Nvbm5lY3QgPSAwOwpAQCAtMTUzNiwxMSArMTUzMSw2IEBACiAJCUJVR19PTigxKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZlcC0+Y29tLm11dGV4KTsKLQlpZiAoY2xvc2luZykgewotCQlhdHRycy5uZXh0X3N0YXRlID0gQzRJV19RUF9TVEFURV9DTE9TSU5HOwotCQljNGl3X21vZGlmeV9xcChlcC0+Y29tLnFwLT5yaHAsIGVwLT5jb20ucXAsCi0JCQkgICAgICAgQzRJV19RUF9BVFRSX05FWFRfU1RBVEUsICZhdHRycywgMSk7Ci0JfQogCWlmIChkaXNjb25uZWN0KQogCQljNGl3X2VwX2Rpc2Nvbm5lY3QoZXAsIDAsIEdGUF9LRVJORUwpOwogCWlmIChyZWxlYXNlKQpAQCAtMTU4MSw5ICsxNTcxLDcgQEAKIAkvKgogCSAqIFdha2UgdXAgYW55IHRocmVhZHMgaW4gcmRtYV9pbml0KCkgb3IgcmRtYV9maW5pKCkuCiAJICovCi0JZXAtPmNvbS53cl93YWl0LmRvbmUgPSAxOwotCWVwLT5jb20ud3Jfd2FpdC5yZXQgPSAtRUNPTk5SRVNFVDsKLQl3YWtlX3VwKCZlcC0+Y29tLndyX3dhaXQud2FpdCk7CisJYzRpd193YWtlX3VwKCZlcC0+Y29tLndyX3dhaXQsIC1FQ09OTlJFU0VUKTsKIAogCW11dGV4X2xvY2soJmVwLT5jb20ubXV0ZXgpOwogCXN3aXRjaCAoZXAtPmNvbS5zdGF0ZSkgewpAQCAtMTcxMCwxNCArMTY5OCwxNCBAQAogCWVwID0gbG9va3VwX3RpZCh0LCB0aWQpOwogCUJVR19PTighZXApOwogCi0JaWYgKGVwLT5jb20ucXApIHsKKwlpZiAoZXAgJiYgZXAtPmNvbS5xcCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HIE1PRCAiVEVSTSByZWNlaXZlZCB0aWQgJXUgcXBpZCAldVxuIiwgdGlkLAogCQkgICAgICAgZXAtPmNvbS5xcC0+d3Euc3EucWlkKTsKIAkJYXR0cnMubmV4dF9zdGF0ZSA9IEM0SVdfUVBfU1RBVEVfVEVSTUlOQVRFOwogCQljNGl3X21vZGlmeV9xcChlcC0+Y29tLnFwLT5yaHAsIGVwLT5jb20ucXAsCiAJCQkgICAgICAgQzRJV19RUF9BVFRSX05FWFRfU1RBVEUsICZhdHRycywgMSk7CiAJfSBlbHNlCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgTU9EICJURVJNIHJlY2VpdmVkIHRpZCAldSBubyBxcFxuIiwgdGlkKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBNT0QgIlRFUk0gcmVjZWl2ZWQgdGlkICV1IG5vIGVwL3FwXG4iLCB0aWQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMjk2LDE0ICsyMjg0LDggQEAKIAkJcmV0ID0gKGludCkoKGJlNjRfdG9fY3B1KHJwbC0+ZGF0YVswXSkgPj4gOCkgJiAweGZmKTsKIAkJd3Jfd2FpdHAgPSAoc3RydWN0IGM0aXdfd3Jfd2FpdCAqKShfX2ZvcmNlIHVuc2lnbmVkIGxvbmcpIHJwbC0+ZGF0YVsxXTsKIAkJUERCRygiJXMgd3Jfd2FpdHAgJXAgcmV0ICV1XG4iLCBfX2Z1bmNfXywgd3Jfd2FpdHAsIHJldCk7Ci0JCWlmICh3cl93YWl0cCkgewotCQkJaWYgKHJldCkKLQkJCQl3cl93YWl0cC0+cmV0ID0gLXJldDsKLQkJCWVsc2UKLQkJCQl3cl93YWl0cC0+cmV0ID0gMDsKLQkJCXdyX3dhaXRwLT5kb25lID0gMTsKLQkJCXdha2VfdXAoJndyX3dhaXRwLT53YWl0KTsKLQkJfQorCQlpZiAod3Jfd2FpdHApCisJCQljNGl3X3dha2VfdXAod3Jfd2FpdHAsIHJldCA/IC1yZXQgOiAwKTsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCWJyZWFrOwogCWNhc2UgMjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9kZXZpY2UuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9kZXZpY2UuYwppbmRleCBlMjkxNzJjLi40MGExM2NjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvZGV2aWNlLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2RldmljZS5jCkBAIC00NCw3ICs0NCw3IEBACiBNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CiBNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CiAKLXN0YXRpYyBMSVNUX0hFQUQoZGV2X2xpc3QpOworc3RhdGljIExJU1RfSEVBRCh1bGRfY3R4X2xpc3QpOwogc3RhdGljIERFRklORV9NVVRFWChkZXZfbXV0ZXgpOwogCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqYzRpd19kZWJ1Z2ZzX3Jvb3Q7CkBAIC0zNzAsMTggKzM3MCwyMyBAQAogCWM0aXdfZGVzdHJveV9yZXNvdXJjZSgmcmRldi0+cmVzb3VyY2UpOwogfQogCi1zdGF0aWMgdm9pZCBjNGl3X3JlbW92ZShzdHJ1Y3QgYzRpd19kZXYgKmRldikKK3N0cnVjdCB1bGRfY3R4IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJ5OworCXN0cnVjdCBjeGdiNF9sbGRfaW5mbyBsbGRpOworCXN0cnVjdCBjNGl3X2RldiAqZGV2OworfTsKKworc3RhdGljIHZvaWQgYzRpd19yZW1vdmUoc3RydWN0IHVsZF9jdHggKmN0eCkKIHsKLQlQREJHKCIlcyBjNGl3X2RldiAlcFxuIiwgX19mdW5jX18sICBkZXYpOwotCWxpc3RfZGVsKCZkZXYtPmVudHJ5KTsKLQlpZiAoZGV2LT5yZWdpc3RlcmVkKQotCQljNGl3X3VucmVnaXN0ZXJfZGV2aWNlKGRldik7Ci0JYzRpd19yZGV2X2Nsb3NlKCZkZXYtPnJkZXYpOwotCWlkcl9kZXN0cm95KCZkZXYtPmNxaWRyKTsKLQlpZHJfZGVzdHJveSgmZGV2LT5xcGlkcik7Ci0JaWRyX2Rlc3Ryb3koJmRldi0+bW1pZHIpOwotCWlvdW5tYXAoZGV2LT5yZGV2Lm9jX213X2t2YSk7Ci0JaWJfZGVhbGxvY19kZXZpY2UoJmRldi0+aWJkZXYpOworCVBEQkcoIiVzIGM0aXdfZGV2ICVwXG4iLCBfX2Z1bmNfXywgIGN0eC0+ZGV2KTsKKwljNGl3X3VucmVnaXN0ZXJfZGV2aWNlKGN0eC0+ZGV2KTsKKwljNGl3X3JkZXZfY2xvc2UoJmN0eC0+ZGV2LT5yZGV2KTsKKwlpZHJfZGVzdHJveSgmY3R4LT5kZXYtPmNxaWRyKTsKKwlpZHJfZGVzdHJveSgmY3R4LT5kZXYtPnFwaWRyKTsKKwlpZHJfZGVzdHJveSgmY3R4LT5kZXYtPm1taWRyKTsKKwlpb3VubWFwKGN0eC0+ZGV2LT5yZGV2Lm9jX213X2t2YSk7CisJaWJfZGVhbGxvY19kZXZpY2UoJmN0eC0+ZGV2LT5pYmRldik7CisJY3R4LT5kZXYgPSBOVUxMOwogfQogCiBzdGF0aWMgc3RydWN0IGM0aXdfZGV2ICpjNGl3X2FsbG9jKGNvbnN0IHN0cnVjdCBjeGdiNF9sbGRfaW5mbyAqaW5mb3ApCkBAIC0zOTIsNyArMzk3LDcgQEAKIAlkZXZwID0gKHN0cnVjdCBjNGl3X2RldiAqKWliX2FsbG9jX2RldmljZShzaXplb2YoKmRldnApKTsKIAlpZiAoIWRldnApIHsKIAkJcHJpbnRrKEtFUk5fRVJSIE1PRCAiQ2Fubm90IGFsbG9jYXRlIGliIGRldmljZVxuIik7Ci0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAJZGV2cC0+cmRldi5sbGRpID0gKmluZm9wOwogCkBAIC00MDIsMjcgKzQwNywyMyBAQAogCWRldnAtPnJkZXYub2NfbXdfa3ZhID0gaW9yZW1hcF93YyhkZXZwLT5yZGV2Lm9jX213X3BhLAogCQkJCQkgICAgICAgZGV2cC0+cmRldi5sbGRpLnZyLT5vY3Euc2l6ZSk7CiAKLQlwcmludGsoS0VSTl9JTkZPIE1PRCAib2NxIG1lbW9yeTogIgorCVBEQkcoS0VSTl9JTkZPIE1PRCAib2NxIG1lbW9yeTogIgogCSAgICAgICAiaHdfc3RhcnQgMHgleCBzaXplICV1IG13X3BhIDB4JWx4IG13X2t2YSAlcFxuIiwKIAkgICAgICAgZGV2cC0+cmRldi5sbGRpLnZyLT5vY3Euc3RhcnQsIGRldnAtPnJkZXYubGxkaS52ci0+b2NxLnNpemUsCiAJICAgICAgIGRldnAtPnJkZXYub2NfbXdfcGEsIGRldnAtPnJkZXYub2NfbXdfa3ZhKTsKIAotCW11dGV4X2xvY2soJmRldl9tdXRleCk7Ci0KIAlyZXQgPSBjNGl3X3JkZXZfb3BlbigmZGV2cC0+cmRldik7CiAJaWYgKHJldCkgewogCQltdXRleF91bmxvY2soJmRldl9tdXRleCk7CiAJCXByaW50ayhLRVJOX0VSUiBNT0QgIlVuYWJsZSB0byBvcGVuIENYSU8gcmRldiBlcnIgJWRcbiIsIHJldCk7CiAJCWliX2RlYWxsb2NfZGV2aWNlKCZkZXZwLT5pYmRldik7Ci0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCX0KIAogCWlkcl9pbml0KCZkZXZwLT5jcWlkcik7CiAJaWRyX2luaXQoJmRldnAtPnFwaWRyKTsKIAlpZHJfaW5pdCgmZGV2cC0+bW1pZHIpOwogCXNwaW5fbG9ja19pbml0KCZkZXZwLT5sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZkZXZwLT5lbnRyeSwgJmRldl9saXN0KTsKLQltdXRleF91bmxvY2soJmRldl9tdXRleCk7CiAKIAlpZiAoYzRpd19kZWJ1Z2ZzX3Jvb3QpIHsKIAkJZGV2cC0+ZGVidWdmc19yb290ID0gZGVidWdmc19jcmVhdGVfZGlyKApAQCAtNDM1LDcgKzQzNiw3IEBACiAKIHN0YXRpYyB2b2lkICpjNGl3X3VsZF9hZGQoY29uc3Qgc3RydWN0IGN4Z2I0X2xsZF9pbmZvICppbmZvcCkKIHsKLQlzdHJ1Y3QgYzRpd19kZXYgKmRldjsKKwlzdHJ1Y3QgdWxkX2N0eCAqY3R4OwogCXN0YXRpYyBpbnQgdmVyc19wcmludGVkOwogCWludCBpOwogCkBAIC00NDMsMjUgKzQ0NCwzMyBAQAogCQlwcmludGsoS0VSTl9JTkZPIE1PRCAiQ2hlbHNpbyBUNCBSRE1BIERyaXZlciAtIHZlcnNpb24gJXNcbiIsCiAJCSAgICAgICBEUlZfVkVSU0lPTik7CiAKLQlkZXYgPSBjNGl3X2FsbG9jKGluZm9wKTsKLQlpZiAoIWRldikKKwljdHggPSBremFsbG9jKHNpemVvZiAqY3R4LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWN0eCkgeworCQljdHggPSBFUlJfUFRSKC1FTk9NRU0pOwogCQlnb3RvIG91dDsKKwl9CisJY3R4LT5sbGRpID0gKmluZm9wOwogCiAJUERCRygiJXMgZm91bmQgZGV2aWNlICVzIG5jaGFuICV1IG5yeHEgJXUgbnR4cSAldSBucG9ydHMgJXVcbiIsCi0JICAgICBfX2Z1bmNfXywgcGNpX25hbWUoZGV2LT5yZGV2LmxsZGkucGRldiksCi0JICAgICBkZXYtPnJkZXYubGxkaS5uY2hhbiwgZGV2LT5yZGV2LmxsZGkubnJ4cSwKLQkgICAgIGRldi0+cmRldi5sbGRpLm50eHEsIGRldi0+cmRldi5sbGRpLm5wb3J0cyk7CisJICAgICBfX2Z1bmNfXywgcGNpX25hbWUoY3R4LT5sbGRpLnBkZXYpLAorCSAgICAgY3R4LT5sbGRpLm5jaGFuLCBjdHgtPmxsZGkubnJ4cSwKKwkgICAgIGN0eC0+bGxkaS5udHhxLCBjdHgtPmxsZGkubnBvcnRzKTsKIAotCWZvciAoaSA9IDA7IGkgPCBkZXYtPnJkZXYubGxkaS5ucnhxOyBpKyspCi0JCVBEQkcoInJ4cWlkWyV1XSAldVxuIiwgaSwgZGV2LT5yZGV2LmxsZGkucnhxX2lkc1tpXSk7CisJbXV0ZXhfbG9jaygmZGV2X211dGV4KTsKKwlsaXN0X2FkZF90YWlsKCZjdHgtPmVudHJ5LCAmdWxkX2N0eF9saXN0KTsKKwltdXRleF91bmxvY2soJmRldl9tdXRleCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY3R4LT5sbGRpLm5yeHE7IGkrKykKKwkJUERCRygicnhxaWRbJXVdICV1XG4iLCBpLCBjdHgtPmxsZGkucnhxX2lkc1tpXSk7CiBvdXQ6Ci0JcmV0dXJuIGRldjsKKwlyZXR1cm4gY3R4OwogfQogCiBzdGF0aWMgaW50IGM0aXdfdWxkX3J4X2hhbmRsZXIodm9pZCAqaGFuZGxlLCBjb25zdCBfX2JlNjQgKnJzcCwKIAkJCWNvbnN0IHN0cnVjdCBwa3RfZ2wgKmdsKQogewotCXN0cnVjdCBjNGl3X2RldiAqZGV2ID0gaGFuZGxlOworCXN0cnVjdCB1bGRfY3R4ICpjdHggPSBoYW5kbGU7CisJc3RydWN0IGM0aXdfZGV2ICpkZXYgPSBjdHgtPmRldjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWNvbnN0IHN0cnVjdCBjcGxfYWN0X2VzdGFibGlzaCAqcnBsOwogCXVuc2lnbmVkIGludCBvcGNvZGU7CkBAIC01MDMsNDcgKzUxMiw0OSBAQAogCiBzdGF0aWMgaW50IGM0aXdfdWxkX3N0YXRlX2NoYW5nZSh2b2lkICpoYW5kbGUsIGVudW0gY3hnYjRfc3RhdGUgbmV3X3N0YXRlKQogewotCXN0cnVjdCBjNGl3X2RldiAqZGV2ID0gaGFuZGxlOworCXN0cnVjdCB1bGRfY3R4ICpjdHggPSBoYW5kbGU7CiAKIAlQREJHKCIlcyBuZXdfc3RhdGUgJXVcbiIsIF9fZnVuY19fLCBuZXdfc3RhdGUpOwogCXN3aXRjaCAobmV3X3N0YXRlKSB7CiAJY2FzZSBDWEdCNF9TVEFURV9VUDoKLQkJcHJpbnRrKEtFUk5fSU5GTyBNT0QgIiVzOiBVcFxuIiwgcGNpX25hbWUoZGV2LT5yZGV2LmxsZGkucGRldikpOwotCQlpZiAoIWRldi0+cmVnaXN0ZXJlZCkgewotCQkJaW50IHJldDsKLQkJCXJldCA9IGM0aXdfcmVnaXN0ZXJfZGV2aWNlKGRldik7Ci0JCQlpZiAocmV0KQorCQlwcmludGsoS0VSTl9JTkZPIE1PRCAiJXM6IFVwXG4iLCBwY2lfbmFtZShjdHgtPmxsZGkucGRldikpOworCQlpZiAoIWN0eC0+ZGV2KSB7CisJCQlpbnQgcmV0ID0gMDsKKworCQkJY3R4LT5kZXYgPSBjNGl3X2FsbG9jKCZjdHgtPmxsZGkpOworCQkJaWYgKCFJU19FUlIoY3R4LT5kZXYpKQorCQkJCXJldCA9IGM0aXdfcmVnaXN0ZXJfZGV2aWNlKGN0eC0+ZGV2KTsKKwkJCWlmIChJU19FUlIoY3R4LT5kZXYpIHx8IHJldCkKIAkJCQlwcmludGsoS0VSTl9FUlIgTU9ECiAJCQkJICAgICAgICIlczogUkRNQSByZWdpc3RyYXRpb24gZmFpbGVkOiAlZFxuIiwKLQkJCQkgICAgICAgcGNpX25hbWUoZGV2LT5yZGV2LmxsZGkucGRldiksIHJldCk7CisJCQkJICAgICAgIHBjaV9uYW1lKGN0eC0+bGxkaS5wZGV2KSwgcmV0KTsKIAkJfQogCQlicmVhazsKIAljYXNlIENYR0I0X1NUQVRFX0RPV046CiAJCXByaW50ayhLRVJOX0lORk8gTU9EICIlczogRG93blxuIiwKLQkJICAgICAgIHBjaV9uYW1lKGRldi0+cmRldi5sbGRpLnBkZXYpKTsKLQkJaWYgKGRldi0+cmVnaXN0ZXJlZCkKLQkJCWM0aXdfdW5yZWdpc3Rlcl9kZXZpY2UoZGV2KTsKKwkJICAgICAgIHBjaV9uYW1lKGN0eC0+bGxkaS5wZGV2KSk7CisJCWlmIChjdHgtPmRldikKKwkJCWM0aXdfcmVtb3ZlKGN0eCk7CiAJCWJyZWFrOwogCWNhc2UgQ1hHQjRfU1RBVEVfU1RBUlRfUkVDT1ZFUlk6CiAJCXByaW50ayhLRVJOX0lORk8gTU9EICIlczogRmF0YWwgRXJyb3JcbiIsCi0JCSAgICAgICBwY2lfbmFtZShkZXYtPnJkZXYubGxkaS5wZGV2KSk7Ci0JCWRldi0+cmRldi5mbGFncyB8PSBUNF9GQVRBTF9FUlJPUjsKLQkJaWYgKGRldi0+cmVnaXN0ZXJlZCkgeworCQkgICAgICAgcGNpX25hbWUoY3R4LT5sbGRpLnBkZXYpKTsKKwkJaWYgKGN0eC0+ZGV2KSB7CiAJCQlzdHJ1Y3QgaWJfZXZlbnQgZXZlbnQ7CiAKKwkJCWN0eC0+ZGV2LT5yZGV2LmZsYWdzIHw9IFQ0X0ZBVEFMX0VSUk9SOwogCQkJbWVtc2V0KCZldmVudCwgMCwgc2l6ZW9mIGV2ZW50KTsKIAkJCWV2ZW50LmV2ZW50ICA9IElCX0VWRU5UX0RFVklDRV9GQVRBTDsKLQkJCWV2ZW50LmRldmljZSA9ICZkZXYtPmliZGV2OworCQkJZXZlbnQuZGV2aWNlID0gJmN0eC0+ZGV2LT5pYmRldjsKIAkJCWliX2Rpc3BhdGNoX2V2ZW50KCZldmVudCk7Ci0JCQljNGl3X3VucmVnaXN0ZXJfZGV2aWNlKGRldik7CisJCQljNGl3X3JlbW92ZShjdHgpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgQ1hHQjRfU1RBVEVfREVUQUNIOgogCQlwcmludGsoS0VSTl9JTkZPIE1PRCAiJXM6IERldGFjaFxuIiwKLQkJICAgICAgIHBjaV9uYW1lKGRldi0+cmRldi5sbGRpLnBkZXYpKTsKLQkJbXV0ZXhfbG9jaygmZGV2X211dGV4KTsKLQkJYzRpd19yZW1vdmUoZGV2KTsKLQkJbXV0ZXhfdW5sb2NrKCZkZXZfbXV0ZXgpOworCQkgICAgICAgcGNpX25hbWUoY3R4LT5sbGRpLnBkZXYpKTsKKwkJaWYgKGN0eC0+ZGV2KQorCQkJYzRpd19yZW1vdmUoY3R4KTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiAwOwpAQCAtNTc2LDExICs1ODcsMTMgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGM0aXdfZXhpdF9tb2R1bGUodm9pZCkKIHsKLQlzdHJ1Y3QgYzRpd19kZXYgKmRldiwgKnRtcDsKKwlzdHJ1Y3QgdWxkX2N0eCAqY3R4LCAqdG1wOwogCiAJbXV0ZXhfbG9jaygmZGV2X211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGV2LCB0bXAsICZkZXZfbGlzdCwgZW50cnkpIHsKLQkJYzRpd19yZW1vdmUoZGV2KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY3R4LCB0bXAsICZ1bGRfY3R4X2xpc3QsIGVudHJ5KSB7CisJCWlmIChjdHgtPmRldikKKwkJCWM0aXdfcmVtb3ZlKGN0eCk7CisJCWtmcmVlKGN0eCk7CiAJfQogCW11dGV4X3VubG9jaygmZGV2X211dGV4KTsKIAljeGdiNF91bnJlZ2lzdGVyX3VsZChDWEdCNF9VTERfUkRNQSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvaXdfY3hnYjQuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9pd19jeGdiNC5oCmluZGV4IDlmNjE2NmYuLjM1ZDJhNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9pd19jeGdiNC5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9pd19jeGdiNC5oCkBAIC0xMzEsNDIgKzEzMSw1OCBAQAogCiAjZGVmaW5lIEM0SVdfV1JfVE8gKDEwKkhaKQogCitlbnVtIHsKKwlSRVBMWV9SRUFEWSA9IDAsCit9OworCiBzdHJ1Y3QgYzRpd193cl93YWl0IHsKIAl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCWludCBkb25lOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOwogCWludCByZXQ7CiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgYzRpd19pbml0X3dyX3dhaXQoc3RydWN0IGM0aXdfd3Jfd2FpdCAqd3Jfd2FpdHApCiB7CiAJd3Jfd2FpdHAtPnJldCA9IDA7Ci0Jd3Jfd2FpdHAtPmRvbmUgPSAwOworCXdyX3dhaXRwLT5zdGF0dXMgPSAwOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJndyX3dhaXRwLT53YWl0KTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGM0aXdfd2FrZV91cChzdHJ1Y3QgYzRpd193cl93YWl0ICp3cl93YWl0cCwgaW50IHJldCkKK3sKKwl3cl93YWl0cC0+cmV0ID0gcmV0OworCXNldF9iaXQoUkVQTFlfUkVBRFksICZ3cl93YWl0cC0+c3RhdHVzKTsKKwl3YWtlX3VwKCZ3cl93YWl0cC0+d2FpdCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGM0aXdfd2FpdF9mb3JfcmVwbHkoc3RydWN0IGM0aXdfcmRldiAqcmRldiwKIAkJCQkgc3RydWN0IGM0aXdfd3Jfd2FpdCAqd3Jfd2FpdHAsCiAJCQkJIHUzMiBod3RpZCwgdTMyIHFwaWQsCiAJCQkJIGNvbnN0IGNoYXIgKmZ1bmMpCiB7CiAJdW5zaWduZWQgdG8gPSBDNElXX1dSX1RPOwotCWRvIHsKKwlpbnQgcmV0OwogCi0JCXdhaXRfZXZlbnRfdGltZW91dCh3cl93YWl0cC0+d2FpdCwgd3Jfd2FpdHAtPmRvbmUsIHRvKTsKLQkJaWYgKCF3cl93YWl0cC0+ZG9uZSkgeworCWRvIHsKKwkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHdyX3dhaXRwLT53YWl0LAorCQkJdGVzdF9hbmRfY2xlYXJfYml0KFJFUExZX1JFQURZLCAmd3Jfd2FpdHAtPnN0YXR1cyksIHRvKTsKKwkJaWYgKCFyZXQpIHsKIAkJCXByaW50ayhLRVJOX0VSUiBNT0QgIiVzIC0gRGV2aWNlICVzIG5vdCByZXNwb25kaW5nIC0gIgogCQkJICAgICAgICJ0aWQgJXUgcXBpZCAldVxuIiwgZnVuYywKIAkJCSAgICAgICBwY2lfbmFtZShyZGV2LT5sbGRpLnBkZXYpLCBod3RpZCwgcXBpZCk7CisJCQlpZiAoYzRpd19mYXRhbF9lcnJvcihyZGV2KSkgeworCQkJCXdyX3dhaXRwLT5yZXQgPSAtRUlPOworCQkJCWJyZWFrOworCQkJfQogCQkJdG8gPSB0byA8PCAyOwogCQl9Ci0JfSB3aGlsZSAoIXdyX3dhaXRwLT5kb25lKTsKKwl9IHdoaWxlICghcmV0KTsKIAlpZiAod3Jfd2FpdHAtPnJldCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBNT0QgIiVzOiBGVyByZXBseSAlZCB0aWQgJXUgcXBpZCAldVxuIiwKLQkJICAgICAgIHBjaV9uYW1lKHJkZXYtPmxsZGkucGRldiksIHdyX3dhaXRwLT5yZXQsIGh3dGlkLCBxcGlkKTsKKwkJUERCRygiJXM6IEZXIHJlcGx5ICVkIHRpZCAldSBxcGlkICV1XG4iLAorCQkgICAgIHBjaV9uYW1lKHJkZXYtPmxsZGkucGRldiksIHdyX3dhaXRwLT5yZXQsIGh3dGlkLCBxcGlkKTsKIAlyZXR1cm4gd3Jfd2FpdHAtPnJldDsKIH0KIAotCiBzdHJ1Y3QgYzRpd19kZXYgewogCXN0cnVjdCBpYl9kZXZpY2UgaWJkZXY7CiAJc3RydWN0IGM0aXdfcmRldiByZGV2OwpAQCAtMTc1LDkgKzE5MSw3IEBACiAJc3RydWN0IGlkciBxcGlkcjsKIAlzdHJ1Y3QgaWRyIG1taWRyOwogCXNwaW5sb2NrX3QgbG9jazsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJ5OwogCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfcm9vdDsKLQl1OCByZWdpc3RlcmVkOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgYzRpd19kZXYgKnRvX2M0aXdfZGV2KHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L3Byb3ZpZGVyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvcHJvdmlkZXIuYwppbmRleCBmNjZkZDhiLi41YjllNDIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvcHJvdmlkZXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvcHJvdmlkZXIuYwpAQCAtNTE2LDcgKzUxNiw2IEBACiAJCWlmIChyZXQpCiAJCQlnb3RvIGJhaWwyOwogCX0KLQlkZXYtPnJlZ2lzdGVyZWQgPSAxOwogCXJldHVybiAwOwogYmFpbDI6CiAJaWJfdW5yZWdpc3Rlcl9kZXZpY2UoJmRldi0+aWJkZXYpOwpAQCAtNTM1LDYgKzUzNCw1IEBACiAJCQkJICAgYzRpd19jbGFzc19hdHRyaWJ1dGVzW2ldKTsKIAlpYl91bnJlZ2lzdGVyX2RldmljZSgmZGV2LT5pYmRldik7CiAJa2ZyZWUoZGV2LT5pYmRldi5pd2NtKTsKLQlkZXYtPnJlZ2lzdGVyZWQgPSAwOwogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9xcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L3FwLmMKaW5kZXggNzBhNWEzYy4uM2I3NzNiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L3FwLmMKQEAgLTIxNCw3ICsyMTQsNyBAQAogCQlWX0ZXX1JJX1JFU19XUl9IT1NURkNNT0RFKDApIHwJLyogbm8gaG9zdCBjaWR4IHVwZGF0ZXMgKi8KIAkJVl9GV19SSV9SRVNfV1JfQ1BSSU8oMCkgfAkvKiBkb24ndCBrZWVwIGluIGNoaXAgY2FjaGUgKi8KIAkJVl9GV19SSV9SRVNfV1JfUENJRUNITigwKSB8CS8qIHNldCBieSB1UCBhdCByaV9pbml0IHRpbWUgKi8KLQkJdDRfc3Ffb25jaGlwKCZ3cS0+c3EpID8gRl9GV19SSV9SRVNfV1JfT05DSElQIDogMCB8CisJCSh0NF9zcV9vbmNoaXAoJndxLT5zcSkgPyBGX0ZXX1JJX1JFU19XUl9PTkNISVAgOiAwKSB8CiAJCVZfRldfUklfUkVTX1dSX0lRSUQoc2NxLT5jcWlkKSk7CiAJcmVzLT51LnNxcnEuZGNhZW5fdG9fZXFzaXplID0gY3B1X3RvX2JlMzIoCiAJCVZfRldfUklfUkVTX1dSX0RDQUVOKDApIHwKQEAgLTEyMTAsNyArMTIxMCw2IEBACiAJCQlpZiAocmV0KSB7CiAJCQkJaWYgKGludGVybmFsKQogCQkJCQljNGl3X2dldF9lcCgmcWhwLT5lcC0+Y29tKTsKLQkJCQlkaXNjb25uZWN0ID0gYWJvcnQgPSAxOwogCQkJCWdvdG8gZXJyOwogCQkJfQogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZHJpdmVyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZHJpdmVyLmMKaW5kZXggNThjMGU0MS4uYmUyNGFjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kcml2ZXIuYwpAQCAtMzk4LDcgKzM5OCw2IEBACiAJc3RydWN0IGlwYXRoX2RldmRhdGEgKmRkOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBhZGRyOwogCXUzMiBiYXIwID0gMCwgYmFyMSA9IDA7Ci0JdTggcmV2OwogCiAJZGQgPSBpcGF0aF9hbGxvY19kZXZkYXRhKHBkZXYpOwogCWlmIChJU19FUlIoZGQpKSB7CkBAIC01NDAsMTMgKzUzOSw3IEBACiAJCWdvdG8gYmFpbF9yZWdpb25zOwogCX0KIAotCXJldCA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnJldik7Ci0JaWYgKHJldCkgewotCQlpcGF0aF9kZXZfZXJyKGRkLCAiRmFpbGVkIHRvIHJlYWQgUENJIHJldmlzaW9uIElEIHVuaXQgIgotCQkJICAgICAgIiV1OiBlcnIgJWRcbiIsIGRkLT5pcGF0aF91bml0LCAtcmV0KTsKLQkJZ290byBiYWlsX3JlZ2lvbnM7CS8qIHNob3VsZG4ndCBldmVyIGhhcHBlbiAqLwotCX0KLQlkZC0+aXBhdGhfcGNpcmV2ID0gcmV2OworCWRkLT5pcGF0aF9wY2lyZXYgPSBwZGV2LT5yZXZpc2lvbjsKIAogI2lmIGRlZmluZWQoX19wb3dlcnBjX18pCiAJLyogVGhlcmUgaXNuJ3QgYSBnZW5lcmljIHdheSB0byBzcGVjaWZ5IHdyaXRldGhyb3VnaCBtYXBwaW5ncyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfY20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2NtLmMKaW5kZXggMzNjN2VlZC4uZTc0Y2RmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfY20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19jbS5jCkBAIC0yNTYzLDcgKzI1NjMsNyBAQAogCXUxNiBsYXN0X2FlOwogCXU4IG9yaWdpbmFsX2h3X3RjcF9zdGF0ZTsKIAl1OCBvcmlnaW5hbF9pYnFwX3N0YXRlOwotCWVudW0gaXdfY21fZXZlbnRfc3RhdHVzIGRpc2Nvbm5fc3RhdHVzID0gSVdfQ01fRVZFTlRfU1RBVFVTX09LOworCWludCBkaXNjb25uX3N0YXR1cyA9IDA7CiAJaW50IGlzc3VlX2Rpc2Nvbm4gPSAwOwogCWludCBpc3N1ZV9jbG9zZSA9IDA7CiAJaW50IGlzc3VlX2ZsdXNoID0gMDsKQEAgLTI2MDUsNyArMjYwNSw3IEBACiAJCQkobGFzdF9hZSA9PSBORVNfQUVRRV9BRUlEX0xMUF9DT05ORUNUSU9OX1JFU0VUKSkpIHsKIAkJaXNzdWVfZGlzY29ubiA9IDE7CiAJCWlmIChsYXN0X2FlID09IE5FU19BRVFFX0FFSURfTExQX0NPTk5FQ1RJT05fUkVTRVQpCi0JCQlkaXNjb25uX3N0YXR1cyA9IElXX0NNX0VWRU5UX1NUQVRVU19SRVNFVDsKKwkJCWRpc2Nvbm5fc3RhdHVzID0gLUVDT05OUkVTRVQ7CiAJfQogCiAJaWYgKCgob3JpZ2luYWxfaHdfdGNwX3N0YXRlID09IE5FU19BRVFFX1RDUF9TVEFURV9DTE9TRUQpIHx8CkBAIC0yNjY2LDcgKzI2NjYsNyBAQAogCQkJY21faWQtPnByb3ZpZGVyX2RhdGEgPSBuZXNxcDsKIAkJCS8qIFNlbmQgdXAgdGhlIGNsb3NlIGNvbXBsZXRlIGV2ZW50ICovCiAJCQljbV9ldmVudC5ldmVudCA9IElXX0NNX0VWRU5UX0NMT1NFOwotCQkJY21fZXZlbnQuc3RhdHVzID0gSVdfQ01fRVZFTlRfU1RBVFVTX09LOworCQkJY21fZXZlbnQuc3RhdHVzID0gMDsKIAkJCWNtX2V2ZW50LnByb3ZpZGVyX2RhdGEgPSBjbV9pZC0+cHJvdmlkZXJfZGF0YTsKIAkJCWNtX2V2ZW50LmxvY2FsX2FkZHIgPSBjbV9pZC0+bG9jYWxfYWRkcjsKIAkJCWNtX2V2ZW50LnJlbW90ZV9hZGRyID0gY21faWQtPnJlbW90ZV9hZGRyOwpAQCAtMjk2Niw3ICsyOTY2LDcgQEAKIAluZXNfYWRkX3JlZigmbmVzcXAtPmlicXApOwogCiAJY21fZXZlbnQuZXZlbnQgPSBJV19DTV9FVkVOVF9FU1RBQkxJU0hFRDsKLQljbV9ldmVudC5zdGF0dXMgPSBJV19DTV9FVkVOVF9TVEFUVVNfQUNDRVBURUQ7CisJY21fZXZlbnQuc3RhdHVzID0gMDsKIAljbV9ldmVudC5wcm92aWRlcl9kYXRhID0gKHZvaWQgKiluZXNxcDsKIAljbV9ldmVudC5sb2NhbF9hZGRyID0gY21faWQtPmxvY2FsX2FkZHI7CiAJY21fZXZlbnQucmVtb3RlX2FkZHIgPSBjbV9pZC0+cmVtb3RlX2FkZHI7CkBAIC0zMzc3LDcgKzMzNzcsNyBAQAogCiAJLyogbm90aWZ5IE9GIGxheWVyIHdlIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIHRoZSByZXF1ZXN0ZWQgY29ubmVjdGlvbiAqLwogCWNtX2V2ZW50LmV2ZW50ID0gSVdfQ01fRVZFTlRfQ09OTkVDVF9SRVBMWTsKLQljbV9ldmVudC5zdGF0dXMgPSBJV19DTV9FVkVOVF9TVEFUVVNfQUNDRVBURUQ7CisJY21fZXZlbnQuc3RhdHVzID0gMDsKIAljbV9ldmVudC5wcm92aWRlcl9kYXRhID0gY21faWQtPnByb3ZpZGVyX2RhdGE7CiAJY21fZXZlbnQubG9jYWxfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKIAljbV9ldmVudC5sb2NhbF9hZGRyLnNpbl9wb3J0ID0gY21faWQtPmxvY2FsX2FkZHIuc2luX3BvcnQ7CkBAIC0zNDg0LDcgKzM0ODQsNyBAQAogCW5lc3FwLT5jbV9pZCA9IE5VTEw7CiAJLyogY21faWQtPnByb3ZpZGVyX2RhdGEgPSBOVUxMOyAqLwogCWNtX2V2ZW50LmV2ZW50ID0gSVdfQ01fRVZFTlRfRElTQ09OTkVDVDsKLQljbV9ldmVudC5zdGF0dXMgPSBJV19DTV9FVkVOVF9TVEFUVVNfUkVTRVQ7CisJY21fZXZlbnQuc3RhdHVzID0gLUVDT05OUkVTRVQ7CiAJY21fZXZlbnQucHJvdmlkZXJfZGF0YSA9IGNtX2lkLT5wcm92aWRlcl9kYXRhOwogCWNtX2V2ZW50LmxvY2FsX2FkZHIgPSBjbV9pZC0+bG9jYWxfYWRkcjsKIAljbV9ldmVudC5yZW1vdGVfYWRkciA9IGNtX2lkLT5yZW1vdGVfYWRkcjsKQEAgLTM0OTUsNyArMzQ5NSw3IEBACiAJcmV0ID0gY21faWQtPmV2ZW50X2hhbmRsZXIoY21faWQsICZjbV9ldmVudCk7CiAJYXRvbWljX2luYygmY21fY2xvc2VzKTsKIAljbV9ldmVudC5ldmVudCA9IElXX0NNX0VWRU5UX0NMT1NFOwotCWNtX2V2ZW50LnN0YXR1cyA9IElXX0NNX0VWRU5UX1NUQVRVU19PSzsKKwljbV9ldmVudC5zdGF0dXMgPSAwOwogCWNtX2V2ZW50LnByb3ZpZGVyX2RhdGEgPSBjbV9pZC0+cHJvdmlkZXJfZGF0YTsKIAljbV9ldmVudC5sb2NhbF9hZGRyID0gY21faWQtPmxvY2FsX2FkZHI7CiAJY21fZXZlbnQucmVtb3RlX2FkZHIgPSBjbV9pZC0+cmVtb3RlX2FkZHI7CkBAIC0zNTM0LDcgKzM1MzQsNyBAQAogCQkJY21fbm9kZSwgY21faWQsIGppZmZpZXMpOwogCiAJY21fZXZlbnQuZXZlbnQgPSBJV19DTV9FVkVOVF9DT05ORUNUX1JFUVVFU1Q7Ci0JY21fZXZlbnQuc3RhdHVzID0gSVdfQ01fRVZFTlRfU1RBVFVTX09LOworCWNtX2V2ZW50LnN0YXR1cyA9IDA7CiAJY21fZXZlbnQucHJvdmlkZXJfZGF0YSA9ICh2b2lkICopY21fbm9kZTsKIAogCWNtX2V2ZW50LmxvY2FsX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc192ZXJicy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfdmVyYnMuYwppbmRleCAyNmQ4MDE4Li45NWNhOTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc192ZXJicy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX3ZlcmJzLmMKQEAgLTE0ODQsNyArMTQ4NCw3IEBACiAJCQkobmVzcXAtPmlicXBfc3RhdGUgPT0gSUJfUVBTX1JUUikpICYmIChuZXNxcC0+Y21faWQpKSB7CiAJCWNtX2lkID0gbmVzcXAtPmNtX2lkOwogCQljbV9ldmVudC5ldmVudCA9IElXX0NNX0VWRU5UX0NPTk5FQ1RfUkVQTFk7Ci0JCWNtX2V2ZW50LnN0YXR1cyA9IElXX0NNX0VWRU5UX1NUQVRVU19USU1FT1VUOworCQljbV9ldmVudC5zdGF0dXMgPSAtRVRJTUVET1VUOwogCQljbV9ldmVudC5sb2NhbF9hZGRyID0gY21faWQtPmxvY2FsX2FkZHI7CiAJCWNtX2V2ZW50LnJlbW90ZV9hZGRyID0gY21faWQtPnJlbW90ZV9hZGRyOwogCQljbV9ldmVudC5wcml2YXRlX2RhdGEgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNzMyMi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNzMyMi5jCmluZGV4IDZiYWIzZWEuLjlmNTNlNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2liYTczMjIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE3MzIyLmMKQEAgLTc1MzQsNyArNzUzNCw4IEBACiAJaWJzZF93cl9hbGxjaGFucyhwcGQsIDQsICgxIDw8IDEwKSwgQk1BU0soMTAsIDEwKSk7CiAJdHN0YXJ0ID0gZ2V0X2ppZmZpZXNfNjQoKTsKIAl3aGlsZSAoY2hhbl9kb25lICYmCi0JICAgICAgICF0aW1lX2FmdGVyNjQodHN0YXJ0LCB0c3RhcnQgKyBtc2Vjc190b19qaWZmaWVzKDUwMCkpKSB7CisJICAgICAgICF0aW1lX2FmdGVyNjQoZ2V0X2ppZmZpZXNfNjQoKSwKKwkJCXRzdGFydCArIG1zZWNzX3RvX2ppZmZpZXMoNTAwKSkpIHsKIAkJbXNsZWVwKDIwKTsKIAkJZm9yIChjaGFuID0gMDsgY2hhbiA8IFNFUkRFU19DSEFOUzsgKytjaGFuKSB7CiAJCQlyeGNhbGRvbmUgPSBhaGJfbW9kKHBwZC0+ZGQsIElCU0QocHBkLT5od19waWR4KSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3BjaWUuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3BjaWUuYwppbmRleCA0OGI2Njc0Li44OTFjYzJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9wY2llLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcGNpZS5jCkBAIC01MjYsMTEgKzUyNiw4IEBACiAJICovCiAJZGV2aWQgPSBwYXJlbnQtPmRldmljZTsKIAlpZiAoZGV2aWQgPj0gMHgyNWUyICYmIGRldmlkIDw9IDB4MjVmYSkgewotCQl1OCByZXY7Ci0KIAkJLyogNTAwMCBQL1YvWC9aICovCi0JCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBhcmVudCwgUENJX1JFVklTSU9OX0lELCAmcmV2KTsKLQkJaWYgKHJldiA8PSAweGIyKQorCQlpZiAocGFyZW50LT5yZXZpc2lvbiA8PSAweGIyKQogCQkJYml0cyA9IDFVIDw8IDEwOwogCQllbHNlCiAJCQliaXRzID0gN1UgPDwgMTA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0YWtiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGFrYmQuYwppbmRleCAxODM5MTk0Li4xMGJjZDRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0YWtiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYXRha2JkLmMKQEAgLTIyMyw4ICsyMjMsOSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8vIG5lZWQgdG8gaW5pdCBjb3JlIGRyaXZlciBpZiBub3QgYWxyZWFkeSBkb25lIHNvCi0JaWYgKGF0YXJpX2tleWJfaW5pdCgpKQotCQlyZXR1cm4gLUVOT0RFVjsKKwllcnJvciA9IGF0YXJpX2tleWJfaW5pdCgpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOwogCiAJYXRha2JkX2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwogCWlmICghYXRha2JkX2RldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvYXRhcmltb3VzZS5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9hdGFyaW1vdXNlLmMKaW5kZXggYWRmNDViMy4uNWM0YTY5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9hdGFyaW1vdXNlLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9hdGFyaW1vdXNlLmMKQEAgLTc3LDE1ICs3NywxNSBAQAogI2VuZGlmCiAKIAkvKiBvbmx5IHJlbGF0aXZlIGV2ZW50cyBnZXQgaGVyZSAqLwotCWR4ID0gIGJ1ZlsxXTsKLQlkeSA9IC1idWZbMl07CisJZHggPSBidWZbMV07CisJZHkgPSBidWZbMl07CiAKIAlpbnB1dF9yZXBvcnRfcmVsKGF0YW1vdXNlX2RldiwgUkVMX1gsIGR4KTsKIAlpbnB1dF9yZXBvcnRfcmVsKGF0YW1vdXNlX2RldiwgUkVMX1ksIGR5KTsKIAotCWlucHV0X3JlcG9ydF9rZXkoYXRhbW91c2VfZGV2LCBCVE5fTEVGVCwgICBidXR0b25zICYgMHgxKTsKKwlpbnB1dF9yZXBvcnRfa2V5KGF0YW1vdXNlX2RldiwgQlROX0xFRlQsICAgYnV0dG9ucyAmIDB4NCk7CiAJaW5wdXRfcmVwb3J0X2tleShhdGFtb3VzZV9kZXYsIEJUTl9NSURETEUsIGJ1dHRvbnMgJiAweDIpOwotCWlucHV0X3JlcG9ydF9rZXkoYXRhbW91c2VfZGV2LCBCVE5fUklHSFQsICBidXR0b25zICYgMHg0KTsKKwlpbnB1dF9yZXBvcnRfa2V5KGF0YW1vdXNlX2RldiwgQlROX1JJR0hULCAgYnV0dG9ucyAmIDB4MSk7CiAKIAlpbnB1dF9zeW5jKGF0YW1vdXNlX2Rldik7CiAKQEAgLTEwOCw3ICsxMDgsNyBAQAogc3RhdGljIHZvaWQgYXRhbW91c2VfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQogewogCWlrYmRfbW91c2VfZGlzYWJsZSgpOwotCWF0YXJpX21vdXNlX2ludGVycnVwdF9ob29rID0gTlVMTDsKKwlhdGFyaV9pbnB1dF9tb3VzZV9pbnRlcnJ1cHRfaG9vayA9IE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGF0YW1vdXNlX2luaXQodm9pZCkKQEAgLTExOCw4ICsxMTgsOSBAQAogCWlmICghTUFDSF9JU19BVEFSSSB8fCAhQVRBUklIV19QUkVTRU5UKFNUX01GUCkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKCFhdGFyaV9rZXliX2luaXQoKSkKLQkJcmV0dXJuIC1FTk9ERVY7CisJZXJyb3IgPSBhdGFyaV9rZXliX2luaXQoKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKIAogCWF0YW1vdXNlX2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwogCWlmICghYXRhbW91c2VfZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZ3Vlc3QvS2NvbmZpZyBiL2RyaXZlcnMvbGd1ZXN0L0tjb25maWcKaW5kZXggMGFhYTA1OS4uMzRhZTQ5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZ3Vlc3QvS2NvbmZpZworKysgYi9kcml2ZXJzL2xndWVzdC9LY29uZmlnCkBAIC01LDggKzUsMTAgQEAKIAktLS1oZWxwLS0tCiAJICBUaGlzIGlzIGEgdmVyeSBzaW1wbGUgbW9kdWxlIHdoaWNoIGFsbG93cyB5b3UgdG8gcnVuCiAJICBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgTGludXgga2VybmVsLCB1c2luZyB0aGUKLQkgICJsZ3Vlc3QiIGNvbW1hbmQgZm91bmQgaW4gdGhlIERvY3VtZW50YXRpb24vbGd1ZXN0IGRpcmVjdG9yeS4KKwkgICJsZ3Vlc3QiIGNvbW1hbmQgZm91bmQgaW4gdGhlIERvY3VtZW50YXRpb24vdmlydHVhbC9sZ3Vlc3QKKwkgIGRpcmVjdG9yeS4KKwogCSAgTm90ZSB0aGF0ICJsZ3Vlc3QiIGlzIHByb25vdW5jZWQgdG8gcmh5bWUgd2l0aCAiZmVsbCBxdWVzdCIsCi0JICBub3QgInJ1c3R5dmlzb3IiLiAgU2VlIERvY3VtZW50YXRpb24vbGd1ZXN0L2xndWVzdC50eHQuCisJICBub3QgInJ1c3R5dmlzb3IiLiBTZWUgRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2xndWVzdC9sZ3Vlc3QudHh0LgogCiAJICBJZiB1bnN1cmUsIHNheSBOLiAgSWYgY3VyaW91cywgc2F5IE0uICBJZiBtYXNvY2hpc3RpYywgc2F5IFkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xndWVzdC9NYWtlZmlsZSBiL2RyaXZlcnMvbGd1ZXN0L01ha2VmaWxlCmluZGV4IDdkNDYzYzIuLjhhYzk0N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGd1ZXN0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbGd1ZXN0L01ha2VmaWxlCkBAIC0xOCw3ICsxOCw3IEBACiBCZWVyOgogCUBmb3IgZiBpbiBQcmVwYXJhdGlvbiBHdWVzdCBEcml2ZXJzIExhdW5jaGVyIEhvc3QgU3dpdGNoZXIgTWFzdGVyeTsgZG8gZWNobyAiez09LSAkJGYgLT09fSI7IG1ha2UgLXMgJCRmOyBkb25lOyBlY2hvICJ7PT0tPT19IgogUHJlcGFyYXRpb24gUHJlcGFyYXRpb24hIEd1ZXN0IERyaXZlcnMgTGF1bmNoZXIgSG9zdCBTd2l0Y2hlciBNYXN0ZXJ5OgotCUBzaCAuLi8uLi9Eb2N1bWVudGF0aW9uL2xndWVzdC9leHRyYWN0ICQoUFJFRklYKSBgZmluZCAuLi8uLi8qIC1uYW1lICcqLltjaFNdJyAtd2hvbGVuYW1lICcqbGd1ZXN0KidgCisJQHNoIC4uLy4uL0RvY3VtZW50YXRpb24vdmlydHVhbC9sZ3Vlc3QvZXh0cmFjdCAkKFBSRUZJWCkgYGZpbmQgLi4vLi4vKiAtbmFtZSAnKi5bY2hTXScgLXdob2xlbmFtZSAnKmxndWVzdConYAogUHVwcHk6CiAJQGNsZWFyCiAJQHByaW50ZiAiICAgICAgX18gIFxuIChfX18oKSdcYDtcbiAvLCAgICAvXGBcbiBcXFxcXFxcIi0tXFxcXFxcICAgXG4iCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvdGktc3QvS2NvbmZpZyBiL2RyaXZlcnMvbWlzYy90aS1zdC9LY29uZmlnCmluZGV4IDJjOGMzZjM5Li5hYmI1ZGUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvdGktc3QvS2NvbmZpZworKysgYi9kcml2ZXJzL21pc2MvdGktc3QvS2NvbmZpZwpAQCAtNSw3ICs1LDcgQEAKIG1lbnUgIlRleGFzIEluc3RydW1lbnRzIHNoYXJlZCB0cmFuc3BvcnQgbGluZSBkaXNjaXBsaW5lIgogY29uZmlnIFRJX1NUCiAJdHJpc3RhdGUgIlNoYXJlZCB0cmFuc3BvcnQgY29yZSBkcml2ZXIiCi0JZGVwZW5kcyBvbiBSRktJTEwKKwlkZXBlbmRzIG9uIE5FVCAmJiBHUElPTElCCiAJc2VsZWN0IEZXX0xPQURFUgogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyB0aGUgc2hhcmVkIHRyYW5zcG9ydCBjb3JlIGRyaXZlciBmb3IgVEkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy90aS1zdC9zdF9jb3JlLmMgYi9kcml2ZXJzL21pc2MvdGktc3Qvc3RfY29yZS5jCmluZGV4IDQ4NjExN2YuLmY5MWY4MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy90aS1zdC9zdF9jb3JlLmMKKysrIGIvZHJpdmVycy9taXNjL3RpLXN0L3N0X2NvcmUuYwpAQCAtNDMsMTMgKzQzLDE1IEBACiAJcHJfaW5mbygiJXM6IGlkICVkXG4iLCBfX2Z1bmNfXywgbmV3X3Byb3RvLT5jaG5sX2lkKTsKIAkvKiBsaXN0IG5vdyBoYXMgdGhlIGNoYW5uZWwgaWQgYXMgaW5kZXggaXRzZWxmICovCiAJc3RfZ2RhdGEtPmxpc3RbbmV3X3Byb3RvLT5jaG5sX2lkXSA9IG5ld19wcm90bzsKKwlzdF9nZGF0YS0+aXNfcmVnaXN0ZXJlZFtuZXdfcHJvdG8tPmNobmxfaWRdID0gdHJ1ZTsKIH0KIAogc3RhdGljIHZvaWQgcmVtb3ZlX2NoYW5uZWxfZnJvbV90YWJsZShzdHJ1Y3Qgc3RfZGF0YV9zICpzdF9nZGF0YSwKIAkJc3RydWN0IHN0X3Byb3RvX3MgKnByb3RvKQogewogCXByX2luZm8oIiVzOiBpZCAlZFxuIiwgX19mdW5jX18sIHByb3RvLT5jaG5sX2lkKTsKLQlzdF9nZGF0YS0+bGlzdFtwcm90by0+Y2hubF9pZF0gPSBOVUxMOworLyoJc3RfZ2RhdGEtPmxpc3RbcHJvdG8tPmNobmxfaWRdID0gTlVMTDsgKi8KKwlzdF9nZGF0YS0+aXNfcmVnaXN0ZXJlZFtwcm90by0+Y2hubF9pZF0gPSBmYWxzZTsKIH0KIAogLyoKQEAgLTEwNCw3ICsxMDYsNyBAQAogCiAJaWYgKHVubGlrZWx5CiAJICAgIChzdF9nZGF0YSA9PSBOVUxMIHx8IHN0X2dkYXRhLT5yeF9za2IgPT0gTlVMTAotCSAgICAgfHwgc3RfZ2RhdGEtPmxpc3RbY2hubF9pZF0gPT0gTlVMTCkpIHsKKwkgICAgIHx8IHN0X2dkYXRhLT5pc19yZWdpc3RlcmVkW2NobmxfaWRdID09IGZhbHNlKSkgewogCQlwcl9lcnIoImNobmxfaWQgJWQgbm90IHJlZ2lzdGVyZWQsIG5vIGRhdGEgdG8gc2VuZD8iLAogCQkJICAgY2hubF9pZCk7CiAJCWtmcmVlX3NrYihzdF9nZGF0YS0+cnhfc2tiKTsKQEAgLTE0MSwxNCArMTQzLDE1IEBACiAJdW5zaWduZWQgY2hhciBpID0gMDsKIAlwcl9pbmZvKCIgJXMgIiwgX19mdW5jX18pOwogCWZvciAoaSA9IDA7IGkgPCBTVF9NQVhfQ0hBTk5FTFM7IGkrKykgewotCQlpZiAobGlrZWx5KHN0X2dkYXRhICE9IE5VTEwgJiYgc3RfZ2RhdGEtPmxpc3RbaV0gIT0gTlVMTCAmJgotCQkJICAgc3RfZ2RhdGEtPmxpc3RbaV0tPnJlZ19jb21wbGV0ZV9jYiAhPSBOVUxMKSkgeworCQlpZiAobGlrZWx5KHN0X2dkYXRhICE9IE5VTEwgJiYKKwkJCXN0X2dkYXRhLT5pc19yZWdpc3RlcmVkW2ldID09IHRydWUgJiYKKwkJCQlzdF9nZGF0YS0+bGlzdFtpXS0+cmVnX2NvbXBsZXRlX2NiICE9IE5VTEwpKSB7CiAJCQlzdF9nZGF0YS0+bGlzdFtpXS0+cmVnX2NvbXBsZXRlX2NiCiAJCQkJKHN0X2dkYXRhLT5saXN0W2ldLT5wcml2X2RhdGEsIGVycik7CiAJCQlwcl9pbmZvKCJwcm90b2NvbCAlZCdzIGNiIHNlbnQgJWRcbiIsIGksIGVycik7CiAJCQlpZiAoZXJyKSB7IC8qIGNsZWFudXAgcmVnaXN0ZXJlZCBwcm90b2NvbCAqLwogCQkJCXN0X2dkYXRhLT5wcm90b3NfcmVnaXN0ZXJlZC0tOwotCQkJCXN0X2dkYXRhLT5saXN0W2ldID0gTlVMTDsKKwkJCQlzdF9nZGF0YS0+aXNfcmVnaXN0ZXJlZFtpXSA9IGZhbHNlOwogCQkJfQogCQl9CiAJfQpAQCAtNDc1LDkgKzQ3OCw5IEBACiB7CiAJc2VxX3ByaW50ZihidWYsICJbJWRdXG5CVD0lY1xuRk09JWNcbkdQUz0lY1xuIiwKIAkJCXN0X2dkYXRhLT5wcm90b3NfcmVnaXN0ZXJlZCwKLQkJCXN0X2dkYXRhLT5saXN0WzB4MDRdICE9IE5VTEwgPyAnUicgOiAnVScsCi0JCQlzdF9nZGF0YS0+bGlzdFsweDA4XSAhPSBOVUxMID8gJ1InIDogJ1UnLAotCQkJc3RfZ2RhdGEtPmxpc3RbMHgwOV0gIT0gTlVMTCA/ICdSJyA6ICdVJyk7CisJCQlzdF9nZGF0YS0+aXNfcmVnaXN0ZXJlZFsweDA0XSA9PSB0cnVlID8gJ1InIDogJ1UnLAorCQkJc3RfZ2RhdGEtPmlzX3JlZ2lzdGVyZWRbMHgwOF0gPT0gdHJ1ZSA/ICdSJyA6ICdVJywKKwkJCXN0X2dkYXRhLT5pc19yZWdpc3RlcmVkWzB4MDldID09IHRydWUgPyAnUicgOiAnVScpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC01MDQsNyArNTA3LDcgQEAKIAkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CiAJfQogCi0JaWYgKHN0X2dkYXRhLT5saXN0W25ld19wcm90by0+Y2hubF9pZF0gIT0gTlVMTCkgeworCWlmIChzdF9nZGF0YS0+aXNfcmVnaXN0ZXJlZFtuZXdfcHJvdG8tPmNobmxfaWRdID09IHRydWUpIHsKIAkJcHJfZXJyKCJjaG5sX2lkICVkIGFscmVhZHkgcmVnaXN0ZXJlZCIsIG5ld19wcm90by0+Y2hubF9pZCk7CiAJCXJldHVybiAtRUFMUkVBRFk7CiAJfQpAQCAtNTYzLDcgKzU2Niw3IEBACiAJCS8qIGNoZWNrIGZvciBhbHJlYWR5IHJlZ2lzdGVyZWQgb25jZSBtb3JlLAogCQkgKiBzaW5jZSB0aGUgYWJvdmUgY2hlY2sgaXMgb2xkCiAJCSAqLwotCQlpZiAoc3RfZ2RhdGEtPmxpc3RbbmV3X3Byb3RvLT5jaG5sX2lkXSAhPSBOVUxMKSB7CisJCWlmIChzdF9nZGF0YS0+aXNfcmVnaXN0ZXJlZFtuZXdfcHJvdG8tPmNobmxfaWRdID09IHRydWUpIHsKIAkJCXByX2VycigiIHByb3RvICVkIGFscmVhZHkgcmVnaXN0ZXJlZCAiLAogCQkJCSAgIG5ld19wcm90by0+Y2hubF9pZCk7CiAJCQlyZXR1cm4gLUVBTFJFQURZOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3RpLXN0L3N0X2tpbS5jIGIvZHJpdmVycy9taXNjL3RpLXN0L3N0X2tpbS5jCmluZGV4IGI0NDg4YzguLjVkYTkzZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy90aS1zdC9zdF9raW0uYworKysgYi9kcml2ZXJzL21pc2MvdGktc3Qvc3Rfa2ltLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZyBiL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZwppbmRleCA0NGIxZjQ2Li41MDY5MTExIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnCkBAIC0yNjAsNiArMjYwLDEzIEBACiAJICBTdXBwb3J0IGZvciBwYXJzaW5nIENGRSBpbWFnZSB0YWcgYW5kIGNyZWF0aW5nIE1URCBwYXJ0aXRpb25zIG9uCiAJICBCcm9hZGNvbSBCQ002M3h4IGJvYXJkcy4KIAorY29uZmlnIE1URF9MQU5USVEKKwl0cmlzdGF0ZSAiTGFudGlxIFNvQyBOT1Igc3VwcG9ydCIKKwlkZXBlbmRzIG9uIExBTlRJUQorCXNlbGVjdCBNVERfUEFSVElUSU9OUworCWhlbHAKKwkgIFN1cHBvcnQgZm9yIE5PUiBmbGFzaCBhdHRhY2hlZCB0byB0aGUgTGFudGlxIFNvQydzIEV4dGVybmFsIEJ1cyBVbml0LgorCiBjb25maWcgTVREX0RJTE5FVFBDCiAJdHJpc3RhdGUgIkNGSSBGbGFzaCBkZXZpY2UgbWFwcGVkIG9uIERJTC9OZXQgUEMiCiAJZGVwZW5kcyBvbiBYODYgJiYgTVREX1BBUlRJVElPTlMgJiYgTVREX0NGSV9JTlRFTEVYVCAmJiBCUk9LRU4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvTWFrZWZpbGUgYi9kcml2ZXJzL210ZC9tYXBzL01ha2VmaWxlCmluZGV4IDA4NTMzYmQuLjZhZGY0YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9NYWtlZmlsZQpAQCAtNjAsMyArNjAsNCBAQAogb2JqLSQoQ09ORklHX01URF9HUElPX0FERFIpCSs9IGdwaW8tYWRkci1mbGFzaC5vCiBvYmotJChDT05GSUdfTVREX0JDTTk2M1hYKQkrPSBiY205NjN4eC1mbGFzaC5vCiBvYmotJChDT05GSUdfTVREX0xBVENIX0FERFIpCSs9IGxhdGNoLWFkZHItZmxhc2gubworb2JqLSQoQ09ORklHX01URF9MQU5USVEpCSs9IGxhbnRpcS1mbGFzaC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2xhbnRpcS1mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9sYW50aXEtZmxhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTBjYWJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9sYW50aXEtZmxhc2guYwpAQCAtMCwwICsxLDI1MSBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAorICogIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBMaXUgUGVuZyBJbmZpbmVvbiBJRkFQIERDIENPTSBDUEUKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgSm9obiBDcmlzcGluIDxibG9naWNAb3BlbndydC5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvY2ZpLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKworI2luY2x1ZGUgPGxhbnRpcV9zb2MuaD4KKyNpbmNsdWRlIDxsYW50aXFfcGxhdGZvcm0uaD4KKworLyoKKyAqIFRoZSBOT1IgZmxhc2ggaXMgY29ubmVjdGVkIHRvIHRoZSBzYW1lIGV4dGVybmFsIGJ1cyB1bml0IChFQlUpIGFzIFBDSS4KKyAqIFRvIG1ha2UgUENJIHdvcmsgd2UgbmVlZCB0byBlbmFibGUgdGhlIGVuZGlhbm5lc3Mgc3dhcHBpbmcgZm9yIHRoZSBhZGRyZXNzCisgKiB3cml0dGVuIHRvIHRoZSBFQlUuIFRoaXMgZW5kaWFubmVzcyBzd2FwcGluZyB3b3JrcyBmb3IgUENJIGNvcnJlY3RseSBidXQKKyAqIGZhaWxzIGZvciBhdHRhY2hlZCBOT1IgZGV2aWNlcy4gVG8gd29ya2Fyb3VuZCB0aGlzIHdlIG5lZWQgdG8gdXNlIGEgY29tcGxleAorICogbWFwLiBUaGUgd29ya2Fyb3VuZCBpbnZvbHZlcyBzd2FwcGluZyBhbGwgYWRkcmVzc2VzIHdoaWxzdCBwcm9iaW5nIHRoZSBjaGlwLgorICogT25jZSBwcm9iaW5nIGlzIGNvbXBsZXRlIHdlIHN0b3Agc3dhcHBpbmcgdGhlIGFkZHJlc3NlcyBidXQgc3dpenpsZSB0aGUKKyAqIHVubG9jayBhZGRyZXNzZXMgdG8gZW5zdXJlIHRoYXQgYWNjZXNzIHRvIHRoZSBOT1IgZGV2aWNlIHdvcmtzIGNvcnJlY3RseS4KKyAqLworCitlbnVtIHsKKwlMVFFfTk9SX1BST0JJTkcsCisJTFRRX05PUl9OT1JNQUwKK307CisKK3N0cnVjdCBsdHFfbXRkIHsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKKwlzdHJ1Y3QgbWFwX2luZm8gKm1hcDsKK307CisKK3N0YXRpYyBjaGFyIGx0cV9tYXBfbmFtZVtdID0gImx0cV9ub3IiOworCitzdGF0aWMgbWFwX3dvcmQKK2x0cV9yZWFkMTYoc3RydWN0IG1hcF9pbmZvICptYXAsIHVuc2lnbmVkIGxvbmcgYWRyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJbWFwX3dvcmQgdGVtcDsKKworCWlmIChtYXAtPm1hcF9wcml2XzEgPT0gTFRRX05PUl9QUk9CSU5HKQorCQlhZHIgXj0gMjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWJ1X2xvY2ssIGZsYWdzKTsKKwl0ZW1wLnhbMF0gPSAqKHUxNiAqKShtYXAtPnZpcnQgKyBhZHIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVidV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHRlbXA7Cit9CisKK3N0YXRpYyB2b2lkCitsdHFfd3JpdGUxNihzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgbWFwX3dvcmQgZCwgdW5zaWduZWQgbG9uZyBhZHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChtYXAtPm1hcF9wcml2XzEgPT0gTFRRX05PUl9QUk9CSU5HKQorCQlhZHIgXj0gMjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWJ1X2xvY2ssIGZsYWdzKTsKKwkqKHUxNiAqKShtYXAtPnZpcnQgKyBhZHIpID0gZC54WzBdOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVidV9sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIDIgZnVuY3Rpb25zIGNvcHkgZGF0YSBiZXR3ZWVuIGlvbWVtIGFuZCBhIGNhY2hlZCBtZW1vcnkKKyAqIHNlY3Rpb24uIEFzIG1lbWNweSgpIG1ha2VzIHVzZSBvZiBwcmUtZmV0Y2hpbmcgd2UgY2Fubm90IHVzZSBpdCBoZXJlLgorICogVGhlIG5vcm1hbCBhbHRlcm5hdGl2ZSBvZiB1c2luZyBtZW1jcHlfe3RvLGZyb219aW8gYWxzbyBtYWtlcyB1c2Ugb2YKKyAqIG1lbWNweSgpIG9uIE1JUFMgc28gaXQgaXMgbm90IGFwcGxpY2FibGUgZWl0aGVyLiBXZSBhcmUgdGhlcmVmb3JlIHN0dWNrCisgKiB3aXRoIGhhdmluZyB0byB1c2Ugb3VyIG93biBsb29wLgorICovCitzdGF0aWMgdm9pZAorbHRxX2NvcHlfZnJvbShzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgdm9pZCAqdG8sCisJdW5zaWduZWQgbG9uZyBmcm9tLCBzc2l6ZV90IGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICpmID0gKHVuc2lnbmVkIGNoYXIgKiltYXAtPnZpcnQgKyBmcm9tOworCXVuc2lnbmVkIGNoYXIgKnQgPSAodW5zaWduZWQgY2hhciAqKXRvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWJ1X2xvY2ssIGZsYWdzKTsKKwl3aGlsZSAobGVuLS0pCisJCSp0KysgPSAqZisrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVidV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitsdHFfY29weV90byhzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgdW5zaWduZWQgbG9uZyB0bywKKwljb25zdCB2b2lkICpmcm9tLCBzc2l6ZV90IGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICpmID0gKHVuc2lnbmVkIGNoYXIgKilmcm9tOworCXVuc2lnbmVkIGNoYXIgKnQgPSAodW5zaWduZWQgY2hhciAqKW1hcC0+dmlydCArIHRvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWJ1X2xvY2ssIGZsYWdzKTsKKwl3aGlsZSAobGVuLS0pCisJCSp0KysgPSAqZisrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVidV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGNvbnN0ICpwYXJ0X3Byb2JlX3R5cGVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKKworc3RhdGljIGludCBfX2luaXQKK2x0cV9tdGRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhICpsdHFfbXRkX2RhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOworCXN0cnVjdCBsdHFfbXRkICpsdHFfbXRkOworCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0czsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgbnJfcGFydHMgPSAwOworCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpOworCWludCBlcnI7CisKKwlsdHFfbXRkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGx0cV9tdGQpLCBHRlBfS0VSTkVMKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBsdHFfbXRkKTsKKworCWx0cV9tdGQtPnJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFsdHFfbXRkLT5yZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBtZW1vcnkgcmVzb3VyY2UiKTsKKwkJZXJyID0gLUVOT0VOVDsKKwkJZ290byBlcnJfb3V0OworCX0KKworCXJlcyA9IGRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIGx0cV9tdGQtPnJlcy0+c3RhcnQsCisJCXJlc291cmNlX3NpemUobHRxX210ZC0+cmVzKSwgZGV2X25hbWUoJnBkZXYtPmRldikpOworCWlmICghbHRxX210ZC0+cmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IG1lbSByZXNvdXJjZSIpOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlsdHFfbXRkLT5tYXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWFwX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlsdHFfbXRkLT5tYXAtPnBoeXMgPSByZXMtPnN0YXJ0OworCWx0cV9tdGQtPm1hcC0+c2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKKwlsdHFfbXRkLT5tYXAtPnZpcnQgPSBkZXZtX2lvcmVtYXBfbm9jYWNoZSgmcGRldi0+ZGV2LAorCQkJCWx0cV9tdGQtPm1hcC0+cGh5cywgbHRxX210ZC0+bWFwLT5zaXplKTsKKwlpZiAoIWx0cV9tdGQtPm1hcC0+dmlydCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gaW9yZW1hcCFcbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCWx0cV9tdGQtPm1hcC0+bmFtZSA9IGx0cV9tYXBfbmFtZTsKKwlsdHFfbXRkLT5tYXAtPmJhbmt3aWR0aCA9IDI7CisJbHRxX210ZC0+bWFwLT5yZWFkID0gbHRxX3JlYWQxNjsKKwlsdHFfbXRkLT5tYXAtPndyaXRlID0gbHRxX3dyaXRlMTY7CisJbHRxX210ZC0+bWFwLT5jb3B5X2Zyb20gPSBsdHFfY29weV9mcm9tOworCWx0cV9tdGQtPm1hcC0+Y29weV90byA9IGx0cV9jb3B5X3RvOworCisJbHRxX210ZC0+bWFwLT5tYXBfcHJpdl8xID0gTFRRX05PUl9QUk9CSU5HOworCWx0cV9tdGQtPm10ZCA9IGRvX21hcF9wcm9iZSgiY2ZpX3Byb2JlIiwgbHRxX210ZC0+bWFwKTsKKwlsdHFfbXRkLT5tYXAtPm1hcF9wcml2XzEgPSBMVFFfTk9SX05PUk1BTDsKKworCWlmICghbHRxX210ZC0+bXRkKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInByb2JpbmcgZmFpbGVkXG4iKTsKKwkJZXJyID0gLUVOWElPOworCQlnb3RvIGVycl91bm1hcDsKKwl9CisKKwlsdHFfbXRkLT5tdGQtPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwljZmkgPSBsdHFfbXRkLT5tYXAtPmZsZHJ2X3ByaXY7CisJY2ZpLT5hZGRyX3VubG9jazEgXj0gMTsKKwljZmktPmFkZHJfdW5sb2NrMiBePSAxOworCisJbnJfcGFydHMgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhsdHFfbXRkLT5tdGQsCisJCQkJcGFydF9wcm9iZV90eXBlcywgJnBhcnRzLCAwKTsKKwlpZiAobnJfcGFydHMgPiAwKSB7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkidXNpbmcgJWQgcGFydGl0aW9ucyBmcm9tIGNtZGxpbmUiLCBucl9wYXJ0cyk7CisJfSBlbHNlIHsKKwkJbnJfcGFydHMgPSBsdHFfbXRkX2RhdGEtPm5yX3BhcnRzOworCQlwYXJ0cyA9IGx0cV9tdGRfZGF0YS0+cGFydHM7CisJfQorCisJZXJyID0gYWRkX210ZF9wYXJ0aXRpb25zKGx0cV9tdGQtPm10ZCwgcGFydHMsIG5yX3BhcnRzKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhZGQgcGFydGl0aW9uc1xuIik7CisJCWdvdG8gZXJyX2Rlc3Ryb3k7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9kZXN0cm95OgorCW1hcF9kZXN0cm95KGx0cV9tdGQtPm10ZCk7CitlcnJfdW5tYXA6CisJaW91bm1hcChsdHFfbXRkLT5tYXAtPnZpcnQpOworZXJyX2ZyZWU6CisJa2ZyZWUobHRxX210ZC0+bWFwKTsKK2Vycl9vdXQ6CisJa2ZyZWUobHRxX210ZCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQKK2x0cV9tdGRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGx0cV9tdGQgKmx0cV9tdGQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChsdHFfbXRkKSB7CisJCWlmIChsdHFfbXRkLT5tdGQpIHsKKwkJCWRlbF9tdGRfcGFydGl0aW9ucyhsdHFfbXRkLT5tdGQpOworCQkJbWFwX2Rlc3Ryb3kobHRxX210ZC0+bXRkKTsKKwkJfQorCQlpZiAobHRxX210ZC0+bWFwLT52aXJ0KQorCQkJaW91bm1hcChsdHFfbXRkLT5tYXAtPnZpcnQpOworCQlrZnJlZShsdHFfbXRkLT5tYXApOworCQlrZnJlZShsdHFfbXRkKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGx0cV9tdGRfZHJpdmVyID0geworCS5yZW1vdmUgPSBfX2RldmV4aXRfcChsdHFfbXRkX3JlbW92ZSksCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibHRxX25vciIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdAoraW5pdF9sdHFfbXRkKHZvaWQpCit7CisJaW50IHJldCA9IHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmbHRxX210ZF9kcml2ZXIsIGx0cV9tdGRfcHJvYmUpOworCisJaWYgKHJldCkKKwkJcHJfZXJyKCJsdHFfbm9yOiBlcnJvciByZWdpc3RlcmluZyBwbGF0Zm9ybSBkcml2ZXIiKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2V4aXRfbHRxX210ZCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZsdHFfbXRkX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbHRxX210ZCk7Cittb2R1bGVfZXhpdChleGl0X2x0cV9tdGQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJKb2huIENyaXNwaW4gPGJsb2dpY0BvcGVud3J0Lm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTGFudGlxIFNvQyBOT1IiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvYXUxNTUwbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvYXUxNTUwbmQuYwppbmRleCAzZmZlMDVkLi41ZDUxM2I1IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2F1MTU1MG5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9hdTE1NTBuZC5jCkBAIC0xMCw2ICsxMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtNDcwLDcgKzQ3MSw3IEBACiAKICNpZmRlZiBDT05GSUdfTUlQU19QQjE1NTAKIAkvKiBzZXQgZ3BpbzIwNiBoaWdoICovCi0JYXVfd3JpdGVsKGF1X3JlYWRsKEdQSU8yX0RJUikgJiB+KDEgPDwgNiksIEdQSU8yX0RJUik7CisJZ3Bpb19kaXJlY3Rpb25faW5wdXQoMjA2KTsKIAogCWJvb3Rfc3dhcGJvb3QgPSAoYXVfcmVhZGwoTUVNX1NUU1RBVCkgJiAoMHg3IDw8IDEpKSB8ICgoYmNzcl9yZWFkKEJDU1JfU1RBVFVTKSA+PiA2KSAmIDB4MSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L0tjb25maWcgYi9kcml2ZXJzL25ldC9LY29uZmlnCmluZGV4IDZjODg0ZWYuLjE5ZjA0YTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvS2NvbmZpZwpAQCAtMjAxNyw2ICsyMDE3LDEzIEBACiAJICBmcm9tIEZhcmFkYXkuIEl0IGlzIHVzZWQgb24gRmFyYWRheSBBMzIwLCBBbmRlcyBBRzEwMSBhbmQgc29tZQogCSAgb3RoZXIgQVJNL05EUzMyIFNvQydzLgogCitjb25maWcgTEFOVElRX0VUT1AKKwl0cmlzdGF0ZSAiTGFudGlxIFNvQyBFVE9QIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNPQ19UWVBFX1hXQVkKKwloZWxwCisJICBTdXBwb3J0IGZvciB0aGUgTUlJMCBpbnNpZGUgdGhlIExhbnRpcSBTb0MKKworCiBzb3VyY2UgImRyaXZlcnMvbmV0L2ZzX2VuZXQvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL25ldC9vY3Rlb24vS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvTWFrZWZpbGUKaW5kZXggZTVhNzM3NS4uMjA5ZmJiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvTWFrZWZpbGUKQEAgLTI1OSw2ICsyNTksNyBAQAogb2JqLSQoQ09ORklHX0VOQzI4SjYwKSArPSBlbmMyOGo2MC5vCiBvYmotJChDT05GSUdfRVRIT0MpICs9IGV0aG9jLm8KIG9iai0kKENPTkZJR19HUkVUSCkgKz0gZ3JldGgubworb2JqLSQoQ09ORklHX0xBTlRJUV9FVE9QKSArPSBsYW50aXFfZXRvcC5vCiAKIG9iai0kKENPTkZJR19YVEVOU0FfWFQyMDAwX1NPTklDKSArPSB4dHNvbmljLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXRhcmlsYW5jZS5jIGIvZHJpdmVycy9uZXQvYXRhcmlsYW5jZS5jCmluZGV4IGNlMDA5MWUuLjEyNjRkNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2F0YXJpbGFuY2UuYworKysgYi9kcml2ZXJzL25ldC9hdGFyaWxhbmNlLmMKQEAgLTU1NCw3ICs1NTQsNyBAQAogCQltZW1hZGRyID09ICh1bnNpZ25lZCBzaG9ydCAqKTB4ZmZlMDAwMDApIHsKIAkJLyogUEFNcyBjYXJkIGFuZCBSaWVibCBvbiBTVCB1c2UgbGV2ZWwgNSBhdXRvdmVjdG9yICovCiAJCWlmIChyZXF1ZXN0X2lycShJUlFfQVVUT181LCBsYW5jZV9pbnRlcnJ1cHQsIElSUV9UWVBFX1BSSU8sCi0JCSAgICAgICAgICAgICJQQU0vUmllYmwtU1QgRXRoZXJuZXQiLCBkZXYpKSB7CisJCSAgICAgICAgICAgICJQQU0sUmllYmwtU1QgRXRoZXJuZXQiLCBkZXYpKSB7CiAJCQlwcmludGsoICJMYW5jZTogcmVxdWVzdCBmb3IgaXJxICVkIGZhaWxlZFxuIiwgSVJRX0FVVE9fNSApOwogCQkJcmV0dXJuIDA7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX21haW4uYyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX21haW4uYwppbmRleCA2ZjhhZGM3Li5lMTQ1ZjJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfbWFpbi5jCkBAIC01MTAwLDExICs1MTAwLDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCByaW5nX2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKLXsKLQlrZnJlZShjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IGl4Z2JlX3JpbmcsIHJjdSkpOwotfQotCiAvKioKICAqIGl4Z2JlX2NsZWFyX2ludGVycnVwdF9zY2hlbWUgLSBDbGVhciB0aGUgY3VycmVudCBpbnRlcnJ1cHQgc2NoZW1lIHNldHRpbmdzCiAgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUgdG8gY2xlYXIgaW50ZXJydXB0IHNjaGVtZSBvbgpAQCAtNTEyNiw3ICs1MTIxLDcgQEAKIAkJLyogaXhnYmVfZ2V0X3N0YXRzNjQoKSBtaWdodCBhY2Nlc3MgdGhpcyByaW5nLCB3ZSBtdXN0IHdhaXQKIAkJICogYSBncmFjZSBwZXJpb2QgYmVmb3JlIGZyZWVpbmcgaXQuCiAJCSAqLwotCQljYWxsX3JjdSgmcmluZy0+cmN1LCByaW5nX2ZyZWVfcmN1KTsKKwkJa2ZyZWVfcmN1KHJpbmcsIHJjdSk7CiAJCWFkYXB0ZXItPnJ4X3JpbmdbaV0gPSBOVUxMOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbGFudGlxX2V0b3AuYyBiL2RyaXZlcnMvbmV0L2xhbnRpcV9ldG9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVmMjUyYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2xhbnRpcV9ldG9wLmMKQEAgLTAsMCArMSw4MDUgQEAKKy8qCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAorICogICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiAgIENvcHlyaWdodCAoQykgMjAxMSBKb2huIENyaXNwaW4gPGJsb2dpY0BvcGVud3J0Lm9yZz4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgorCisjaW5jbHVkZSA8bGFudGlxX3NvYy5oPgorI2luY2x1ZGUgPHh3YXlfZG1hLmg+CisjaW5jbHVkZSA8bGFudGlxX3BsYXRmb3JtLmg+CisKKyNkZWZpbmUgTFRRX0VUT1BfTURJTwkJMHgxMTgwNAorI2RlZmluZSBNRElPX1JFUVVFU1QJCTB4ODAwMDAwMDAKKyNkZWZpbmUgTURJT19SRUFECQkweDQwMDAwMDAwCisjZGVmaW5lIE1ESU9fQUREUl9NQVNLCQkweDFmCisjZGVmaW5lIE1ESU9fQUREUl9PRkZTRVQJMHgxNQorI2RlZmluZSBNRElPX1JFR19NQVNLCQkweDFmCisjZGVmaW5lIE1ESU9fUkVHX09GRlNFVAkJMHgxMAorI2RlZmluZSBNRElPX1ZBTF9NQVNLCQkweGZmZmYKKworI2RlZmluZSBQUEUzMl9DR0VOCQkweDgwMAorI2RlZmluZSBMUV9QUEUzMl9FTkVUX01BQ19DRkcJMHgxODQwCisKKyNkZWZpbmUgTFRRX0VUT1BfRU5FVFMwCQkweDExODUwCisjZGVmaW5lIExUUV9FVE9QX01BQ19EQTAJMHgxMTg2QworI2RlZmluZSBMVFFfRVRPUF9NQUNfREExCTB4MTE4NzAKKyNkZWZpbmUgTFRRX0VUT1BfQ0ZHCQkweDE2MDIwCisjZGVmaW5lIExUUV9FVE9QX0lHUExFTgkJMHgxNjA4MAorCisjZGVmaW5lIE1BWF9ETUFfQ0hBTgkJMHg4CisjZGVmaW5lIE1BWF9ETUFfQ1JDX0xFTgkJMHg0CisjZGVmaW5lIE1BWF9ETUFfREFUQV9MRU4JMHg2MDAKKworI2RlZmluZSBFVE9QX0ZUQ1UJCUJJVCgyOCkKKyNkZWZpbmUgRVRPUF9NSUlfTUFTSwkJMHhmCisjZGVmaW5lIEVUT1BfTUlJX05PUk1BTAkJMHhkCisjZGVmaW5lIEVUT1BfTUlJX1JFVkVSU0UJMHhlCisjZGVmaW5lIEVUT1BfUExFTl9VTkRFUgkJMHg0MAorI2RlZmluZSBFVE9QX0NHRU4JCTB4ODAwCisKKy8qIHVzZSAyIHN0YXRpYyBjaGFubmVscyBmb3IgVFgvUlggKi8KKyNkZWZpbmUgTFRRX0VUT1BfVFhfQ0hBTk5FTAkxCisjZGVmaW5lIExUUV9FVE9QX1JYX0NIQU5ORUwJNgorI2RlZmluZSBJU19UWCh4KQkJKHggPT0gTFRRX0VUT1BfVFhfQ0hBTk5FTCkKKyNkZWZpbmUgSVNfUlgoeCkJCSh4ID09IExUUV9FVE9QX1JYX0NIQU5ORUwpCisKKyNkZWZpbmUgbHRxX2V0b3BfcjMyKHgpCQlsdHFfcjMyKGx0cV9ldG9wX21lbWJhc2UgKyAoeCkpCisjZGVmaW5lIGx0cV9ldG9wX3czMih4LCB5KQlsdHFfdzMyKHgsIGx0cV9ldG9wX21lbWJhc2UgKyAoeSkpCisjZGVmaW5lIGx0cV9ldG9wX3czMl9tYXNrKHgsIHksIHopCVwKKwkJbHRxX3czMl9tYXNrKHgsIHksIGx0cV9ldG9wX21lbWJhc2UgKyAoeikpCisKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMCIKKworc3RhdGljIHZvaWQgX19pb21lbSAqbHRxX2V0b3BfbWVtYmFzZTsKKworc3RydWN0IGx0cV9ldG9wX2NoYW4geworCWludCBpZHg7CisJaW50IHR4X2ZyZWU7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgbmFwaV9zdHJ1Y3QgbmFwaTsKKwlzdHJ1Y3QgbHRxX2RtYV9jaGFubmVsIGRtYTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiW0xUUV9ERVNDX05VTV07Cit9OworCitzdHJ1Y3QgbHRxX2V0b3BfcHJpdiB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgbHRxX2V0aF9kYXRhICpwbGRhdGE7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisKKwlzdHJ1Y3QgbWlpX2J1cyAqbWlpX2J1czsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2OworCisJc3RydWN0IGx0cV9ldG9wX2NoYW4gY2hbTUFYX0RNQV9DSEFOXTsKKwlpbnQgdHhfZnJlZVtNQVhfRE1BX0NIQU4gPj4gMV07CisKKwlzcGlubG9ja190IGxvY2s7Cit9OworCitzdGF0aWMgaW50CitsdHFfZXRvcF9hbGxvY19za2Ioc3RydWN0IGx0cV9ldG9wX2NoYW4gKmNoKQoreworCWNoLT5za2JbY2gtPmRtYS5kZXNjXSA9IGRldl9hbGxvY19za2IoTUFYX0RNQV9EQVRBX0xFTik7CisJaWYgKCFjaC0+c2tiW2NoLT5kbWEuZGVzY10pCisJCXJldHVybiAtRU5PTUVNOworCWNoLT5kbWEuZGVzY19iYXNlW2NoLT5kbWEuZGVzY10uYWRkciA9IGRtYV9tYXBfc2luZ2xlKE5VTEwsCisJCWNoLT5za2JbY2gtPmRtYS5kZXNjXS0+ZGF0YSwgTUFYX0RNQV9EQVRBX0xFTiwKKwkJRE1BX0ZST01fREVWSUNFKTsKKwljaC0+ZG1hLmRlc2NfYmFzZVtjaC0+ZG1hLmRlc2NdLmFkZHIgPQorCQlDUEhZU0FERFIoY2gtPnNrYltjaC0+ZG1hLmRlc2NdLT5kYXRhKTsKKwljaC0+ZG1hLmRlc2NfYmFzZVtjaC0+ZG1hLmRlc2NdLmN0bCA9CisJCUxUUV9ETUFfT1dOIHwgTFRRX0RNQV9SWF9PRkZTRVQoTkVUX0lQX0FMSUdOKSB8CisJCU1BWF9ETUFfREFUQV9MRU47CisJc2tiX3Jlc2VydmUoY2gtPnNrYltjaC0+ZG1hLmRlc2NdLCBORVRfSVBfQUxJR04pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbHRxX2V0b3BfaHdfcmVjZWl2ZShzdHJ1Y3QgbHRxX2V0b3BfY2hhbiAqY2gpCit7CisJc3RydWN0IGx0cV9ldG9wX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihjaC0+bmV0ZGV2KTsKKwlzdHJ1Y3QgbHRxX2RtYV9kZXNjICpkZXNjID0gJmNoLT5kbWEuZGVzY19iYXNlW2NoLT5kbWEuZGVzY107CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGNoLT5za2JbY2gtPmRtYS5kZXNjXTsKKwlpbnQgbGVuID0gKGRlc2MtPmN0bCAmIExUUV9ETUFfU0laRV9NQVNLKSAtIE1BWF9ETUFfQ1JDX0xFTjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlpZiAobHRxX2V0b3BfYWxsb2Nfc2tiKGNoKSkgeworCQluZXRkZXZfZXJyKGNoLT5uZXRkZXYsCisJCQkiZmFpbGVkIHRvIGFsbG9jYXRlIG5ldyByeCBidWZmZXIsIHN0b3BwaW5nIERNQVxuIik7CisJCWx0cV9kbWFfY2xvc2UoJmNoLT5kbWEpOworCX0KKwljaC0+ZG1hLmRlc2MrKzsKKwljaC0+ZG1hLmRlc2MgJT0gTFRRX0RFU0NfTlVNOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXNrYl9wdXQoc2tiLCBsZW4pOworCXNrYi0+ZGV2ID0gY2gtPm5ldGRldjsKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBjaC0+bmV0ZGV2KTsKKwluZXRpZl9yZWNlaXZlX3NrYihza2IpOworfQorCitzdGF0aWMgaW50CitsdHFfZXRvcF9wb2xsX3J4KHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKK3sKKwlzdHJ1Y3QgbHRxX2V0b3BfY2hhbiAqY2ggPSBjb250YWluZXJfb2YobmFwaSwKKwkJCQlzdHJ1Y3QgbHRxX2V0b3BfY2hhbiwgbmFwaSk7CisJaW50IHJ4ID0gMDsKKwlpbnQgY29tcGxldGUgPSAwOworCisJd2hpbGUgKChyeCA8IGJ1ZGdldCkgJiYgIWNvbXBsZXRlKSB7CisJCXN0cnVjdCBsdHFfZG1hX2Rlc2MgKmRlc2MgPSAmY2gtPmRtYS5kZXNjX2Jhc2VbY2gtPmRtYS5kZXNjXTsKKworCQlpZiAoKGRlc2MtPmN0bCAmIChMVFFfRE1BX09XTiB8IExUUV9ETUFfQykpID09IExUUV9ETUFfQykgeworCQkJbHRxX2V0b3BfaHdfcmVjZWl2ZShjaCk7CisJCQlyeCsrOworCQl9IGVsc2UgeworCQkJY29tcGxldGUgPSAxOworCQl9CisJfQorCWlmIChjb21wbGV0ZSB8fCAhcngpIHsKKwkJbmFwaV9jb21wbGV0ZSgmY2gtPm5hcGkpOworCQlsdHFfZG1hX2Fja19pcnEoJmNoLT5kbWEpOworCX0KKwlyZXR1cm4gcng7Cit9CisKK3N0YXRpYyBpbnQKK2x0cV9ldG9wX3BvbGxfdHgoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQoreworCXN0cnVjdCBsdHFfZXRvcF9jaGFuICpjaCA9CisJCWNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgbHRxX2V0b3BfY2hhbiwgbmFwaSk7CisJc3RydWN0IGx0cV9ldG9wX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihjaC0+bmV0ZGV2KTsKKwlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHEgPQorCQluZXRkZXZfZ2V0X3R4X3F1ZXVlKGNoLT5uZXRkZXYsIGNoLT5pZHggPj4gMSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJd2hpbGUgKChjaC0+ZG1hLmRlc2NfYmFzZVtjaC0+dHhfZnJlZV0uY3RsICYKKwkJCShMVFFfRE1BX09XTiB8IExUUV9ETUFfQykpID09IExUUV9ETUFfQykgeworCQlkZXZfa2ZyZWVfc2tiX2FueShjaC0+c2tiW2NoLT50eF9mcmVlXSk7CisJCWNoLT5za2JbY2gtPnR4X2ZyZWVdID0gTlVMTDsKKwkJbWVtc2V0KCZjaC0+ZG1hLmRlc2NfYmFzZVtjaC0+dHhfZnJlZV0sIDAsCisJCQlzaXplb2Yoc3RydWN0IGx0cV9kbWFfZGVzYykpOworCQljaC0+dHhfZnJlZSsrOworCQljaC0+dHhfZnJlZSAlPSBMVFFfREVTQ19OVU07CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCWlmIChuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKHR4cSkpCisJCW5ldGlmX3R4X3N0YXJ0X3F1ZXVlKHR4cSk7CisJbmFwaV9jb21wbGV0ZSgmY2gtPm5hcGkpOworCWx0cV9kbWFfYWNrX2lycSgmY2gtPmRtYSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAorbHRxX2V0b3BfZG1hX2lycShpbnQgaXJxLCB2b2lkICpfcHJpdikKK3sKKwlzdHJ1Y3QgbHRxX2V0b3BfcHJpdiAqcHJpdiA9IF9wcml2OworCWludCBjaCA9IGlycSAtIExUUV9ETUFfQ0gwX0lOVDsKKworCW5hcGlfc2NoZWR1bGUoJnByaXYtPmNoW2NoXS5uYXBpKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkCitsdHFfZXRvcF9mcmVlX2NoYW5uZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGx0cV9ldG9wX2NoYW4gKmNoKQoreworCXN0cnVjdCBsdHFfZXRvcF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWx0cV9kbWFfZnJlZSgmY2gtPmRtYSk7CisJaWYgKGNoLT5kbWEuaXJxKQorCQlmcmVlX2lycShjaC0+ZG1hLmlycSwgcHJpdik7CisJaWYgKElTX1JYKGNoLT5pZHgpKSB7CisJCWludCBkZXNjOworCQlmb3IgKGRlc2MgPSAwOyBkZXNjIDwgTFRRX0RFU0NfTlVNOyBkZXNjKyspCisJCQlkZXZfa2ZyZWVfc2tiX2FueShjaC0+c2tiW2NoLT5kbWEuZGVzY10pOworCX0KK30KKworc3RhdGljIHZvaWQKK2x0cV9ldG9wX2h3X2V4aXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbHRxX2V0b3BfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwlsdHFfcG11X2Rpc2FibGUoUE1VX1BQRSk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9ETUFfQ0hBTjsgaSsrKQorCQlpZiAoSVNfVFgoaSkgfHwgSVNfUlgoaSkpCisJCQlsdHFfZXRvcF9mcmVlX2NoYW5uZWwoZGV2LCAmcHJpdi0+Y2hbaV0pOworfQorCitzdGF0aWMgaW50CitsdHFfZXRvcF9od19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGx0cV9ldG9wX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJbHRxX3BtdV9lbmFibGUoUE1VX1BQRSk7CisKKwlzd2l0Y2ggKHByaXYtPnBsZGF0YS0+bWlpX21vZGUpIHsKKwljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9STUlJOgorCQlsdHFfZXRvcF93MzJfbWFzayhFVE9QX01JSV9NQVNLLAorCQkJRVRPUF9NSUlfUkVWRVJTRSwgTFRRX0VUT1BfQ0ZHKTsKKwkJYnJlYWs7CisKKwljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9NSUk6CisJCWx0cV9ldG9wX3czMl9tYXNrKEVUT1BfTUlJX01BU0ssCisJCQlFVE9QX01JSV9OT1JNQUwsIExUUV9FVE9QX0NGRyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJbmV0ZGV2X2VycihkZXYsICJ1bmtub3duIG1paSBtb2RlICVkXG4iLAorCQkJcHJpdi0+cGxkYXRhLT5taWlfbW9kZSk7CisJCXJldHVybiAtRU5PVFNVUFA7CisJfQorCisJLyogZW5hYmxlIGNyYyBnZW5lcmF0aW9uICovCisJbHRxX2V0b3BfdzMyKFBQRTMyX0NHRU4sIExRX1BQRTMyX0VORVRfTUFDX0NGRyk7CisKKwlsdHFfZG1hX2luaXRfcG9ydChETUFfUE9SVF9FVE9QKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfRE1BX0NIQU47IGkrKykgeworCQlpbnQgaXJxID0gTFRRX0RNQV9DSDBfSU5UICsgaTsKKwkJc3RydWN0IGx0cV9ldG9wX2NoYW4gKmNoID0gJnByaXYtPmNoW2ldOworCisJCWNoLT5pZHggPSBjaC0+ZG1hLm5yID0gaTsKKworCQlpZiAoSVNfVFgoaSkpIHsKKwkJCWx0cV9kbWFfYWxsb2NfdHgoJmNoLT5kbWEpOworCQkJcmVxdWVzdF9pcnEoaXJxLCBsdHFfZXRvcF9kbWFfaXJxLCBJUlFGX0RJU0FCTEVELAorCQkJCSJldG9wX3R4IiwgcHJpdik7CisJCX0gZWxzZSBpZiAoSVNfUlgoaSkpIHsKKwkJCWx0cV9kbWFfYWxsb2NfcngoJmNoLT5kbWEpOworCQkJZm9yIChjaC0+ZG1hLmRlc2MgPSAwOyBjaC0+ZG1hLmRlc2MgPCBMVFFfREVTQ19OVU07CisJCQkJCWNoLT5kbWEuZGVzYysrKQorCQkJCWlmIChsdHFfZXRvcF9hbGxvY19za2IoY2gpKQorCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCWNoLT5kbWEuZGVzYyA9IDA7CisJCQlyZXF1ZXN0X2lycShpcnEsIGx0cV9ldG9wX2RtYV9pcnEsIElSUUZfRElTQUJMRUQsCisJCQkJImV0b3BfcngiLCBwcml2KTsKKwkJfQorCQljaC0+ZG1hLmlycSA9IGlycTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitsdHFfZXRvcF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cmNweShpbmZvLT5kcml2ZXIsICJMYW50aXEgRVRPUCIpOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgImludGVybmFsIik7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKK30KKworc3RhdGljIGludAorbHRxX2V0b3BfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBsdHFfZXRvcF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiBwaHlfZXRodG9vbF9nc2V0KHByaXYtPnBoeWRldiwgY21kKTsKK30KKworc3RhdGljIGludAorbHRxX2V0b3Bfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBsdHFfZXRvcF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiBwaHlfZXRodG9vbF9zc2V0KHByaXYtPnBoeWRldiwgY21kKTsKK30KKworc3RhdGljIGludAorbHRxX2V0b3BfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsdHFfZXRvcF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiBwaHlfc3RhcnRfYW5lZyhwcml2LT5waHlkZXYpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGx0cV9ldG9wX2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbyA9IGx0cV9ldG9wX2dldF9kcnZpbmZvLAorCS5nZXRfc2V0dGluZ3MgPSBsdHFfZXRvcF9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncyA9IGx0cV9ldG9wX3NldF9zZXR0aW5ncywKKwkubndheV9yZXNldCA9IGx0cV9ldG9wX253YXlfcmVzZXQsCit9OworCitzdGF0aWMgaW50CitsdHFfZXRvcF9tZGlvX3dyKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBwaHlfYWRkciwgaW50IHBoeV9yZWcsIHUxNiBwaHlfZGF0YSkKK3sKKwl1MzIgdmFsID0gTURJT19SRVFVRVNUIHwKKwkJKChwaHlfYWRkciAmIE1ESU9fQUREUl9NQVNLKSA8PCBNRElPX0FERFJfT0ZGU0VUKSB8CisJCSgocGh5X3JlZyAmIE1ESU9fUkVHX01BU0spIDw8IE1ESU9fUkVHX09GRlNFVCkgfAorCQlwaHlfZGF0YTsKKworCXdoaWxlIChsdHFfZXRvcF9yMzIoTFRRX0VUT1BfTURJTykgJiBNRElPX1JFUVVFU1QpCisJCTsKKwlsdHFfZXRvcF93MzIodmFsLCBMVFFfRVRPUF9NRElPKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbHRxX2V0b3BfbWRpb19yZChzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgcGh5X2FkZHIsIGludCBwaHlfcmVnKQoreworCXUzMiB2YWwgPSBNRElPX1JFUVVFU1QgfCBNRElPX1JFQUQgfAorCQkoKHBoeV9hZGRyICYgTURJT19BRERSX01BU0spIDw8IE1ESU9fQUREUl9PRkZTRVQpIHwKKwkJKChwaHlfcmVnICYgTURJT19SRUdfTUFTSykgPDwgTURJT19SRUdfT0ZGU0VUKTsKKworCXdoaWxlIChsdHFfZXRvcF9yMzIoTFRRX0VUT1BfTURJTykgJiBNRElPX1JFUVVFU1QpCisJCTsKKwlsdHFfZXRvcF93MzIodmFsLCBMVFFfRVRPUF9NRElPKTsKKwl3aGlsZSAobHRxX2V0b3BfcjMyKExUUV9FVE9QX01ESU8pICYgTURJT19SRVFVRVNUKQorCQk7CisJdmFsID0gbHRxX2V0b3BfcjMyKExUUV9FVE9QX01ESU8pICYgTURJT19WQUxfTUFTSzsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZAorbHRxX2V0b3BfbWRpb19saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogbm90aGluZyB0byBkbyAgKi8KK30KKworc3RhdGljIGludAorbHRxX2V0b3BfbWRpb19wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsdHFfZXRvcF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gTlVMTDsKKwlpbnQgcGh5X2FkZHI7CisKKwlmb3IgKHBoeV9hZGRyID0gMDsgcGh5X2FkZHIgPCBQSFlfTUFYX0FERFI7IHBoeV9hZGRyKyspIHsKKwkJaWYgKHByaXYtPm1paV9idXMtPnBoeV9tYXBbcGh5X2FkZHJdKSB7CisJCQlwaHlkZXYgPSBwcml2LT5taWlfYnVzLT5waHlfbWFwW3BoeV9hZGRyXTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFwaHlkZXYpIHsKKwkJbmV0ZGV2X2VycihkZXYsICJubyBQSFkgZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwaHlkZXYgPSBwaHlfY29ubmVjdChkZXYsIGRldl9uYW1lKCZwaHlkZXYtPmRldiksICZsdHFfZXRvcF9tZGlvX2xpbmssCisJCQkwLCBwcml2LT5wbGRhdGEtPm1paV9tb2RlKTsKKworCWlmIChJU19FUlIocGh5ZGV2KSkgeworCQluZXRkZXZfZXJyKGRldiwgIkNvdWxkIG5vdCBhdHRhY2ggdG8gUEhZXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIocGh5ZGV2KTsKKwl9CisKKwlwaHlkZXYtPnN1cHBvcnRlZCAmPSAoU1VQUE9SVEVEXzEwYmFzZVRfSGFsZgorCQkJICAgICAgfCBTVVBQT1JURURfMTBiYXNlVF9GdWxsCisJCQkgICAgICB8IFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmCisJCQkgICAgICB8IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsCisJCQkgICAgICB8IFNVUFBPUlRFRF9BdXRvbmVnCisJCQkgICAgICB8IFNVUFBPUlRFRF9NSUkKKwkJCSAgICAgIHwgU1VQUE9SVEVEX1RQKTsKKworCXBoeWRldi0+YWR2ZXJ0aXNpbmcgPSBwaHlkZXYtPnN1cHBvcnRlZDsKKwlwcml2LT5waHlkZXYgPSBwaHlkZXY7CisJcHJfaW5mbygiJXM6IGF0dGFjaGVkIFBIWSBbJXNdIChwaHlfYWRkcj0lcywgaXJxPSVkKVxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBwaHlkZXYtPmRydi0+bmFtZSwKKwkgICAgICAgZGV2X25hbWUoJnBoeWRldi0+ZGV2KSwgcGh5ZGV2LT5pcnEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2x0cV9ldG9wX21kaW9faW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsdHFfZXRvcF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwlpbnQgZXJyOworCisJcHJpdi0+bWlpX2J1cyA9IG1kaW9idXNfYWxsb2MoKTsKKwlpZiAoIXByaXYtPm1paV9idXMpIHsKKwkJbmV0ZGV2X2VycihkZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgbWlpIGJ1c1xuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlwcml2LT5taWlfYnVzLT5wcml2ID0gZGV2OworCXByaXYtPm1paV9idXMtPnJlYWQgPSBsdHFfZXRvcF9tZGlvX3JkOworCXByaXYtPm1paV9idXMtPndyaXRlID0gbHRxX2V0b3BfbWRpb193cjsKKwlwcml2LT5taWlfYnVzLT5uYW1lID0gImx0cV9taWkiOworCXNucHJpbnRmKHByaXYtPm1paV9idXMtPmlkLCBNSUlfQlVTX0lEX1NJWkUsICIleCIsIDApOworCXByaXYtPm1paV9idXMtPmlycSA9IGttYWxsb2Moc2l6ZW9mKGludCkgKiBQSFlfTUFYX0FERFIsIEdGUF9LRVJORUwpOworCWlmICghcHJpdi0+bWlpX2J1cy0+aXJxKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9mcmVlX21kaW9idXM7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFBIWV9NQVhfQUREUjsgKytpKQorCQlwcml2LT5taWlfYnVzLT5pcnFbaV0gPSBQSFlfUE9MTDsKKworCWlmIChtZGlvYnVzX3JlZ2lzdGVyKHByaXYtPm1paV9idXMpKSB7CisJCWVyciA9IC1FTlhJTzsKKwkJZ290byBlcnJfb3V0X2ZyZWVfbWRpb19pcnE7CisJfQorCisJaWYgKGx0cV9ldG9wX21kaW9fcHJvYmUoZGV2KSkgeworCQllcnIgPSAtRU5YSU87CisJCWdvdG8gZXJyX291dF91bnJlZ2lzdGVyX2J1czsKKwl9CisJcmV0dXJuIDA7CisKK2Vycl9vdXRfdW5yZWdpc3Rlcl9idXM6CisJbWRpb2J1c191bnJlZ2lzdGVyKHByaXYtPm1paV9idXMpOworZXJyX291dF9mcmVlX21kaW9faXJxOgorCWtmcmVlKHByaXYtPm1paV9idXMtPmlycSk7CitlcnJfb3V0X2ZyZWVfbWRpb2J1czoKKwltZGlvYnVzX2ZyZWUocHJpdi0+bWlpX2J1cyk7CitlcnJfb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkCitsdHFfZXRvcF9tZGlvX2NsZWFudXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbHRxX2V0b3BfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlwaHlfZGlzY29ubmVjdChwcml2LT5waHlkZXYpOworCW1kaW9idXNfdW5yZWdpc3Rlcihwcml2LT5taWlfYnVzKTsKKwlrZnJlZShwcml2LT5taWlfYnVzLT5pcnEpOworCW1kaW9idXNfZnJlZShwcml2LT5taWlfYnVzKTsKK30KKworc3RhdGljIGludAorbHRxX2V0b3Bfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsdHFfZXRvcF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfRE1BX0NIQU47IGkrKykgeworCQlzdHJ1Y3QgbHRxX2V0b3BfY2hhbiAqY2ggPSAmcHJpdi0+Y2hbaV07CisKKwkJaWYgKCFJU19UWChpKSAmJiAoIUlTX1JYKGkpKSkKKwkJCWNvbnRpbnVlOworCQlsdHFfZG1hX29wZW4oJmNoLT5kbWEpOworCQluYXBpX2VuYWJsZSgmY2gtPm5hcGkpOworCX0KKwlwaHlfc3RhcnQocHJpdi0+cGh5ZGV2KTsKKwluZXRpZl90eF9zdGFydF9hbGxfcXVldWVzKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2x0cV9ldG9wX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbHRxX2V0b3BfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMoZGV2KTsKKwlwaHlfc3RvcChwcml2LT5waHlkZXYpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfRE1BX0NIQU47IGkrKykgeworCQlzdHJ1Y3QgbHRxX2V0b3BfY2hhbiAqY2ggPSAmcHJpdi0+Y2hbaV07CisKKwkJaWYgKCFJU19SWChpKSAmJiAhSVNfVFgoaSkpCisJCQljb250aW51ZTsKKwkJbmFwaV9kaXNhYmxlKCZjaC0+bmFwaSk7CisJCWx0cV9kbWFfY2xvc2UoJmNoLT5kbWEpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbHRxX2V0b3BfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcXVldWUgPSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKTsKKwlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKGRldiwgcXVldWUpOworCXN0cnVjdCBsdHFfZXRvcF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbHRxX2V0b3BfY2hhbiAqY2ggPSAmcHJpdi0+Y2hbKHF1ZXVlIDw8IDEpIHwgMV07CisJc3RydWN0IGx0cV9kbWFfZGVzYyAqZGVzYyA9ICZjaC0+ZG1hLmRlc2NfYmFzZVtjaC0+ZG1hLmRlc2NdOworCWludCBsZW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgYnl0ZV9vZmZzZXQ7CisKKwlsZW4gPSBza2ItPmxlbiA8IEVUSF9aTEVOID8gRVRIX1pMRU4gOiBza2ItPmxlbjsKKworCWlmICgoZGVzYy0+Y3RsICYgKExUUV9ETUFfT1dOIHwgTFRRX0RNQV9DKSkgfHwgY2gtPnNrYltjaC0+ZG1hLmRlc2NdKSB7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCW5ldGRldl9lcnIoZGV2LCAidHggcmluZyBmdWxsXG4iKTsKKwkJbmV0aWZfdHhfc3RvcF9xdWV1ZSh0eHEpOworCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CisJfQorCisJLyogZG1hIG5lZWRzIHRvIHN0YXJ0IG9uIGEgMTYgYnl0ZSBhbGlnbmVkIGFkZHJlc3MgKi8KKwlieXRlX29mZnNldCA9IENQSFlTQUREUihza2ItPmRhdGEpICUgMTY7CisJY2gtPnNrYltjaC0+ZG1hLmRlc2NdID0gc2tiOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCWRlc2MtPmFkZHIgPSAoKHVuc2lnbmVkIGludCkgZG1hX21hcF9zaW5nbGUoTlVMTCwgc2tiLT5kYXRhLCBsZW4sCisJCQkJCQlETUFfVE9fREVWSUNFKSkgLSBieXRlX29mZnNldDsKKwl3bWIoKTsKKwlkZXNjLT5jdGwgPSBMVFFfRE1BX09XTiB8IExUUV9ETUFfU09QIHwgTFRRX0RNQV9FT1AgfAorCQlMVFFfRE1BX1RYX09GRlNFVChieXRlX29mZnNldCkgfCAobGVuICYgTFRRX0RNQV9TSVpFX01BU0spOworCWNoLT5kbWEuZGVzYysrOworCWNoLT5kbWEuZGVzYyAlPSBMVFFfREVTQ19OVU07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJaWYgKGNoLT5kbWEuZGVzY19iYXNlW2NoLT5kbWEuZGVzY10uY3RsICYgTFRRX0RNQV9PV04pCisJCW5ldGlmX3R4X3N0b3BfcXVldWUodHhxKTsKKworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKK3N0YXRpYyBpbnQKK2x0cV9ldG9wX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJaW50IHJldCA9IGV0aF9jaGFuZ2VfbXR1KGRldiwgbmV3X210dSk7CisKKwlpZiAoIXJldCkgeworCQlzdHJ1Y3QgbHRxX2V0b3BfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJbHRxX2V0b3BfdzMyKChFVE9QX1BMRU5fVU5ERVIgPDwgMTYpIHwgbmV3X210dSwKKwkJCUxUUV9FVE9QX0lHUExFTik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorbHRxX2V0b3BfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgbHRxX2V0b3BfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBUT0RPOiBtaWktdG9sbCByZXBvcnRzICJObyBNSUkgdHJhbnNjZWl2ZXIgcHJlc2VudCEuIiA/ISovCisJcmV0dXJuIHBoeV9taWlfaW9jdGwocHJpdi0+cGh5ZGV2LCBycSwgY21kKTsKK30KKworc3RhdGljIGludAorbHRxX2V0b3Bfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApCit7CisJaW50IHJldCA9IGV0aF9tYWNfYWRkcihkZXYsIHApOworCisJaWYgKCFyZXQpIHsKKwkJc3RydWN0IGx0cV9ldG9wX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCS8qIHN0b3JlIHRoZSBtYWMgZm9yIHRoZSB1bmljYXN0IGZpbHRlciAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQlsdHFfZXRvcF93MzIoKigodTMyICopZGV2LT5kZXZfYWRkciksIExUUV9FVE9QX01BQ19EQTApOworCQlsdHFfZXRvcF93MzIoKigodTE2ICopJmRldi0+ZGV2X2FkZHJbNF0pIDw8IDE2LAorCQkJTFRRX0VUT1BfTUFDX0RBMSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2x0cV9ldG9wX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsdHFfZXRvcF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogZW5zdXJlIHRoYXQgdGhlIHVuaWNhc3QgZmlsdGVyIGlzIG5vdCBlbmFibGVkIGluIHByb21pc2Npb3VzIG1vZGUgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCWlmICgoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB8fCAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpCisJCWx0cV9ldG9wX3czMl9tYXNrKEVUT1BfRlRDVSwgMCwgTFRRX0VUT1BfRU5FVFMwKTsKKwllbHNlCisJCWx0cV9ldG9wX3czMl9tYXNrKDAsIEVUT1BfRlRDVSwgTFRRX0VUT1BfRU5FVFMwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB1MTYKK2x0cV9ldG9wX3NlbGVjdF9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCS8qIHdlIGFyZSBjdXJyZW50bHkgb25seSB1c2luZyB0aGUgZmlyc3QgcXVldWUgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbHRxX2V0b3BfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsdHFfZXRvcF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgbWFjOworCWludCBlcnI7CisKKwlldGhlcl9zZXR1cChkZXYpOworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSAxMCAqIEhaOworCWVyciA9IGx0cV9ldG9wX2h3X2luaXQoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9odzsKKwlsdHFfZXRvcF9jaGFuZ2VfbXR1KGRldiwgMTUwMCk7CisKKwltZW1jcHkoJm1hYywgJnByaXYtPnBsZGF0YS0+bWFjLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSk7CisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKG1hYy5zYV9kYXRhKSkgeworCQlwcl93YXJuKCJldG9wOiBpbnZhbGlkIE1BQywgdXNpbmcgcmFuZG9tXG4iKTsKKwkJcmFuZG9tX2V0aGVyX2FkZHIobWFjLnNhX2RhdGEpOworCX0KKworCWVyciA9IGx0cV9ldG9wX3NldF9tYWNfYWRkcmVzcyhkZXYsICZtYWMpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX25ldGRldjsKKwlsdHFfZXRvcF9zZXRfbXVsdGljYXN0X2xpc3QoZGV2KTsKKwllcnIgPSBsdHFfZXRvcF9tZGlvX2luaXQoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9uZXRkZXY7CisJcmV0dXJuIDA7CisKK2Vycl9uZXRkZXY6CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlmcmVlX25ldGRldihkZXYpOworZXJyX2h3OgorCWx0cV9ldG9wX2h3X2V4aXQoZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZAorbHRxX2V0b3BfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBlcnI7CisKKwlsdHFfZXRvcF9od19leGl0KGRldik7CisJZXJyID0gbHRxX2V0b3BfaHdfaW5pdChkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2h3OworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlyZXR1cm47CisKK2Vycl9odzoKKwlsdHFfZXRvcF9od19leGl0KGRldik7CisJbmV0ZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVzdGFydCBldG9wIGFmdGVyIFRYIHRpbWVvdXRcbiIpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGx0cV9ldGhfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4gPSBsdHFfZXRvcF9vcGVuLAorCS5uZG9fc3RvcCA9IGx0cV9ldG9wX3N0b3AsCisJLm5kb19zdGFydF94bWl0ID0gbHRxX2V0b3BfdHgsCisJLm5kb19jaGFuZ2VfbXR1ID0gbHRxX2V0b3BfY2hhbmdlX210dSwKKwkubmRvX2RvX2lvY3RsID0gbHRxX2V0b3BfaW9jdGwsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgPSBsdHFfZXRvcF9zZXRfbWFjX2FkZHJlc3MsCisJLm5kb192YWxpZGF0ZV9hZGRyID0gZXRoX3ZhbGlkYXRlX2FkZHIsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBsdHFfZXRvcF9zZXRfbXVsdGljYXN0X2xpc3QsCisJLm5kb19zZWxlY3RfcXVldWUgPSBsdHFfZXRvcF9zZWxlY3RfcXVldWUsCisJLm5kb19pbml0ID0gbHRxX2V0b3BfaW5pdCwKKwkubmRvX3R4X3RpbWVvdXQgPSBsdHFfZXRvcF90eF90aW1lb3V0LAorfTsKKworc3RhdGljIGludCBfX2luaXQKK2x0cV9ldG9wX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbHRxX2V0b3BfcHJpdiAqcHJpdjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgZXJyOworCWludCBpOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGV0b3AgcmVzb3VyY2VcbiIpOworCQllcnIgPSAtRU5PRU5UOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJcmVzID0gZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJnBkZXYtPmRldiwgcmVzLT5zdGFydCwKKwkJcmVzb3VyY2Vfc2l6ZShyZXMpLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgZXRvcCByZXNvdXJjZVxuIik7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWx0cV9ldG9wX21lbWJhc2UgPSBkZXZtX2lvcmVtYXBfbm9jYWNoZSgmcGRldi0+ZGV2LAorCQlyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICghbHRxX2V0b3BfbWVtYmFzZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVtYXAgZXRvcCBlbmdpbmUgJWRcbiIsCisJCQlwZGV2LT5pZCk7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldl9tcShzaXplb2Yoc3RydWN0IGx0cV9ldG9wX3ByaXYpLCA0KTsKKwlzdHJjcHkoZGV2LT5uYW1lLCAiZXRoJWQiKTsKKwlkZXYtPm5ldGRldl9vcHMgPSAmbHRxX2V0aF9uZXRkZXZfb3BzOworCWRldi0+ZXRodG9vbF9vcHMgPSAmbHRxX2V0b3BfZXRodG9vbF9vcHM7CisJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJcHJpdi0+cmVzID0gcmVzOworCXByaXYtPnBsZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CisJcHJpdi0+bmV0ZGV2ID0gZGV2OworCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfRE1BX0NIQU47IGkrKykgeworCQlpZiAoSVNfVFgoaSkpCisJCQluZXRpZl9uYXBpX2FkZChkZXYsICZwcml2LT5jaFtpXS5uYXBpLAorCQkJCWx0cV9ldG9wX3BvbGxfdHgsIDgpOworCQllbHNlIGlmIChJU19SWChpKSkKKwkJCW5ldGlmX25hcGlfYWRkKGRldiwgJnByaXYtPmNoW2ldLm5hcGksCisJCQkJbHRxX2V0b3BfcG9sbF9yeCwgMzIpOworCQlwcml2LT5jaFtpXS5uZXRkZXYgPSBkZXY7CisJfQorCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfZnJlZTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisJcmV0dXJuIDA7CisKK2Vycl9mcmVlOgorCWtmcmVlKGRldik7CitlcnJfb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0CitsdHFfZXRvcF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoZGV2KSB7CisJCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhkZXYpOworCQlsdHFfZXRvcF9od19leGl0KGRldik7CisJCWx0cV9ldG9wX21kaW9fY2xlYW51cChkZXYpOworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbHRxX21paV9kcml2ZXIgPSB7CisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGx0cV9ldG9wX3JlbW92ZSksCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibHRxX2V0b3AiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworaW50IF9faW5pdAoraW5pdF9sdHFfZXRvcCh2b2lkKQoreworCWludCByZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmx0cV9taWlfZHJpdmVyLCBsdHFfZXRvcF9wcm9iZSk7CisKKwlpZiAocmV0KQorCQlwcl9lcnIoImx0cV9ldG9wOiBFcnJvciByZWdpc3RlcmluZyBwbGF0Zm9tIGRyaXZlciEiKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2V4aXRfbHRxX2V0b3Aodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbHRxX21paV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpbml0X2x0cV9ldG9wKTsKK21vZHVsZV9leGl0KGV4aXRfbHRxX2V0b3ApOworCitNT0RVTEVfQVVUSE9SKCJKb2huIENyaXNwaW4gPGJsb2dpY0BvcGVud3J0Lm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTGFudGlxIFNvQyBFVE9QIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWN2bGFuLmMgYi9kcml2ZXJzL25ldC9tYWN2bGFuLmMKaW5kZXggNzhlMzRlOS4uZDhlNGU2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWFjdmxhbi5jCisrKyBiL2RyaXZlcnMvbmV0L21hY3ZsYW4uYwpAQCAtNjAzLDIxICs2MDMsMTMgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCBtYWN2bGFuX3BvcnRfcmN1X2ZyZWUoc3RydWN0IHJjdV9oZWFkICpoZWFkKQotewotCXN0cnVjdCBtYWN2bGFuX3BvcnQgKnBvcnQ7Ci0KLQlwb3J0ID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBtYWN2bGFuX3BvcnQsIHJjdSk7Ci0Ja2ZyZWUocG9ydCk7Ci19Ci0KIHN0YXRpYyB2b2lkIG1hY3ZsYW5fcG9ydF9kZXN0cm95KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG1hY3ZsYW5fcG9ydCAqcG9ydCA9IG1hY3ZsYW5fcG9ydF9nZXQoZGV2KTsKIAogCWRldi0+cHJpdl9mbGFncyAmPSB+SUZGX01BQ1ZMQU5fUE9SVDsKIAluZXRkZXZfcnhfaGFuZGxlcl91bnJlZ2lzdGVyKGRldik7Ci0JY2FsbF9yY3UoJnBvcnQtPnJjdSwgbWFjdmxhbl9wb3J0X3JjdV9mcmVlKTsKKwlrZnJlZV9yY3UocG9ydCwgcmN1KTsKIH0KIAogc3RhdGljIGludCBtYWN2bGFuX3ZhbGlkYXRlKHN0cnVjdCBubGF0dHIgKnRiW10sIHN0cnVjdCBubGF0dHIgKmRhdGFbXSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2ludGVsLWlvbW11LmMgYi9kcml2ZXJzL3BjaS9pbnRlbC1pb21tdS5jCmluZGV4IGQ1NTJkMmMuLjZhZjZiNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2ludGVsLWlvbW11LmMKKysrIGIvZHJpdmVycy9wY2kvaW50ZWwtaW9tbXUuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvdGJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2ktYXRzLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vaW9tbXUuaD4KICNpbmNsdWRlICJwY2kuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2lvdi5jIGIvZHJpdmVycy9wY2kvaW92LmMKaW5kZXggNTUzZDhlZS4uNDJmYWU0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaW92LmMKKysrIGIvZHJpdmVycy9wY2kvaW92LmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLWF0cy5oPgogI2luY2x1ZGUgInBjaS5oIgogCiAjZGVmaW5lIFZJUlRGTl9JRF9MRU4JMTYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS5oIGIvZHJpdmVycy9wY2kvcGNpLmgKaW5kZXggYTZlYzIwMC4uNDAyMDAyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLmgKKysrIGIvZHJpdmVycy9wY2kvcGNpLmgKQEAgLTI1MCwxNSArMjUwLDYgQEAKIAl1OCBfX2lvbWVtICptc3RhdGU7CS8qIFZGIE1pZ3JhdGlvbiBTdGF0ZSBBcnJheSAqLwogfTsKIAotLyogQWRkcmVzcyBUcmFuc2xhdGlvbiBTZXJ2aWNlICovCi1zdHJ1Y3QgcGNpX2F0cyB7Ci0JaW50IHBvczsJLyogY2FwYWJpbGl0eSBwb3NpdGlvbiAqLwotCWludCBzdHU7CS8qIFNtYWxsZXN0IFRyYW5zbGF0aW9uIFVuaXQgKi8KLQlpbnQgcWRlcDsJLyogSW52YWxpZGF0ZSBRdWV1ZSBEZXB0aCAqLwotCWludCByZWZfY250OwkvKiBQaHlzaWNhbCBGdW5jdGlvbiByZWZlcmVuY2UgY291bnQgKi8KLQl1bnNpZ25lZCBpbnQgaXNfZW5hYmxlZDoxOwkvKiBFbmFibGUgYml0IGlzIHNldCAqLwotfTsKLQogI2lmZGVmIENPTkZJR19QQ0lfSU9WCiBleHRlcm4gaW50IHBjaV9pb3ZfaW5pdChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGV4dGVybiB2b2lkIHBjaV9pb3ZfcmVsZWFzZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKQEAgLTI2OSwxOSArMjYwLDYgQEAKIGV4dGVybiB2b2lkIHBjaV9yZXN0b3JlX2lvdl9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGV4dGVybiBpbnQgcGNpX2lvdl9idXNfcmFuZ2Uoc3RydWN0IHBjaV9idXMgKmJ1cyk7CiAKLWV4dGVybiBpbnQgcGNpX2VuYWJsZV9hdHMoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBzKTsKLWV4dGVybiB2b2lkIHBjaV9kaXNhYmxlX2F0cyhzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLWV4dGVybiBpbnQgcGNpX2F0c19xdWV1ZV9kZXB0aChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLS8qKgotICogcGNpX2F0c19lbmFibGVkIC0gcXVlcnkgdGhlIEFUUyBzdGF0dXMKLSAqIEBkZXY6IHRoZSBQQ0kgZGV2aWNlCi0gKgotICogUmV0dXJucyAxIGlmIEFUUyBjYXBhYmlsaXR5IGlzIGVuYWJsZWQsIG9yIDAgaWYgbm90LgotICovCi1zdGF0aWMgaW5saW5lIGludCBwY2lfYXRzX2VuYWJsZWQoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQlyZXR1cm4gZGV2LT5hdHMgJiYgZGV2LT5hdHMtPmlzX2VuYWJsZWQ7Ci19CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgcGNpX2lvdl9pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CkBAIC0zMDQsMjEgKzI4Miw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHBjaV9lbmFibGVfYXRzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwcykKLXsKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwY2lfZGlzYWJsZV9hdHMoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLX0KLXN0YXRpYyBpbmxpbmUgaW50IHBjaV9hdHNfcXVldWVfZGVwdGgoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLXN0YXRpYyBpbmxpbmUgaW50IHBjaV9hdHNfZW5hYmxlZChzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXJldHVybiAwOwotfQogI2VuZGlmIC8qIENPTkZJR19QQ0lfSU9WICovCiAKIHN0YXRpYyBpbmxpbmUgcmVzb3VyY2Vfc2l6ZV90IHBjaV9yZXNvdXJjZV9hbGlnbm1lbnQoc3RydWN0IHBjaV9kZXYgKmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL0tjb25maWcgYi9kcml2ZXJzL3J0Yy9LY29uZmlnCmluZGV4IGUxODc4ODcuLjQyODkxNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL0tjb25maWcKKysrIGIvZHJpdmVycy9ydGMvS2NvbmZpZwpAQCAtMywxMCArMywxMCBAQAogIwogCiBjb25maWcgUlRDX0xJQgotCXRyaXN0YXRlCisJYm9vbAogCiBtZW51Y29uZmlnIFJUQ19DTEFTUwotCXRyaXN0YXRlICJSZWFsIFRpbWUgQ2xvY2siCisJYm9vbCAiUmVhbCBUaW1lIENsb2NrIgogCWRlZmF1bHQgbgogCWRlcGVuZHMgb24gIVMzOTAKIAlzZWxlY3QgUlRDX0xJQgpAQCAtMTUsOSArMTUsNiBAQAogIAkgIGJlIGFsbG93ZWQgdG8gcGx1ZyBvbmUgb3IgbW9yZSBSVENzIHRvIHlvdXIgc3lzdGVtLiBZb3Ugd2lsbAogCSAgcHJvYmFibHkgd2FudCB0byBlbmFibGUgb25lIG9yIG1vcmUgb2YgdGhlIGludGVyZmFjZXMgYmVsb3cuCiAKLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgcnRjLWNvcmUuCi0KIGlmIFJUQ19DTEFTUwogCiBjb25maWcgUlRDX0hDVE9TWVMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL2NsYXNzLmMgYi9kcml2ZXJzL3J0Yy9jbGFzcy5jCmluZGV4IDM5MDEzODYuLjQxOTRlNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL2NsYXNzLmMKKysrIGIvZHJpdmVycy9ydGMvY2xhc3MuYwpAQCAtNDEsMjYgKzQxLDIxIEBACiAgKiBzeXN0ZW0ncyB3YWxsIGNsb2NrOyByZXN0b3JlIGl0IG9uIHJlc3VtZSgpLgogICovCiAKLXN0YXRpYyBzdHJ1Y3QgdGltZXNwZWMJZGVsdGE7CiBzdGF0aWMgdGltZV90CQlvbGR0aW1lOworc3RhdGljIHN0cnVjdCB0aW1lc3BlYwlvbGR0czsKIAogc3RhdGljIGludCBydGNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQogewogCXN0cnVjdCBydGNfZGV2aWNlCSpydGMgPSB0b19ydGNfZGV2aWNlKGRldik7CiAJc3RydWN0IHJ0Y190aW1lCQl0bTsKLQlzdHJ1Y3QgdGltZXNwZWMJCXRzID0gY3VycmVudF9rZXJuZWxfdGltZSgpOwogCiAJaWYgKHN0cmNtcChkZXZfbmFtZSgmcnRjLT5kZXYpLCBDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFKSAhPSAwKQogCQlyZXR1cm4gMDsKIAogCXJ0Y19yZWFkX3RpbWUocnRjLCAmdG0pOworCWt0aW1lX2dldF90cygmb2xkdHMpOwogCXJ0Y190bV90b190aW1lKCZ0bSwgJm9sZHRpbWUpOwogCi0JLyogUlRDIHByZWNpc2lvbiBpcyAxIHNlY29uZDsgYWRqdXN0IGRlbHRhIGZvciBhdmcgMS8yIHNlYyBlcnIgKi8KLQlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmZGVsdGEsCi0JCQkJdHMudHZfc2VjIC0gb2xkdGltZSwKLQkJCQl0cy50dl9uc2VjIC0gKE5TRUNfUEVSX1NFQyA+PiAxKSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNzAsMTAgKzY1LDEyIEBACiAJc3RydWN0IHJ0Y190aW1lCQl0bTsKIAl0aW1lX3QJCQluZXd0aW1lOwogCXN0cnVjdCB0aW1lc3BlYwkJdGltZTsKKwlzdHJ1Y3QgdGltZXNwZWMJCW5ld3RzOwogCiAJaWYgKHN0cmNtcChkZXZfbmFtZSgmcnRjLT5kZXYpLCBDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFKSAhPSAwKQogCQlyZXR1cm4gMDsKIAorCWt0aW1lX2dldF90cygmbmV3dHMpOwogCXJ0Y19yZWFkX3RpbWUocnRjLCAmdG0pOwogCWlmIChydGNfdmFsaWRfdG0oJnRtKSAhPSAwKSB7CiAJCXByX2RlYnVnKCIlczogIGJvZ3VzIHJlc3VtZSB0aW1lXG4iLCBkZXZfbmFtZSgmcnRjLT5kZXYpKTsKQEAgLTg1LDE1ICs4MiwxMyBAQAogCQkJcHJfZGVidWcoIiVzOiAgdGltZSB0cmF2ZWwhXG4iLCBkZXZfbmFtZSgmcnRjLT5kZXYpKTsKIAkJcmV0dXJuIDA7CiAJfQorCS8qIGNhbGN1bGF0ZSB0aGUgUlRDIHRpbWUgZGVsdGEgKi8KKwlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmdGltZSwgbmV3dGltZSAtIG9sZHRpbWUsIDApOwogCi0JLyogcmVzdG9yZSB3YWxsIGNsb2NrIHVzaW5nIGRlbHRhIGFnYWluc3QgdGhpcyBSVEM7Ci0JICogYWRqdXN0IGFnYWluIGZvciBhdmcgMS8yIHNlY29uZCBSVEMgc2FtcGxpbmcgZXJyb3IKLQkgKi8KLQlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmdGltZSwKLQkJCQluZXd0aW1lICsgZGVsdGEudHZfc2VjLAotCQkJCShOU0VDX1BFUl9TRUMgPj4gMSkgKyBkZWx0YS50dl9uc2VjKTsKLQlkb19zZXR0aW1lb2ZkYXkoJnRpbWUpOworCS8qIHN1YnRyYWN0IGtlcm5lbCB0aW1lIGJldHdlZW4gcnRjX3N1c3BlbmQgdG8gcnRjX3Jlc3VtZSAqLworCXRpbWUgPSB0aW1lc3BlY19zdWIodGltZSwgdGltZXNwZWNfc3ViKG5ld3RzLCBvbGR0cykpOwogCisJdGltZWtlZXBpbmdfaW5qZWN0X3NsZWVwdGltZSgmdGltZSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3NiL3BjaS5jIGIvZHJpdmVycy9zc2IvcGNpLmMKaW5kZXggNmYzNDk2My4uN2FkNDg1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zc2IvcGNpLmMKKysrIGIvZHJpdmVycy9zc2IvcGNpLmMKQEAgLTY2Miw3ICs2NjIsNiBAQAogc3RhdGljIGludCBzc2JfcGNpX3Nwcm9tX2dldChzdHJ1Y3Qgc3NiX2J1cyAqYnVzLAogCQkJICAgICBzdHJ1Y3Qgc3NiX3Nwcm9tICpzcHJvbSkKIHsKLQljb25zdCBzdHJ1Y3Qgc3NiX3Nwcm9tICpmYWxsYmFjazsKIAlpbnQgZXJyOwogCXUxNiAqYnVmOwogCkBAIC03MDcsMTAgKzcwNiwxNyBAQAogCQlpZiAoZXJyKSB7CiAJCQkvKiBBbGwgQ1JDIGF0dGVtcHRzIGZhaWxlZC4KIAkJCSAqIE1heWJlIHRoZXJlIGlzIG5vIFNQUk9NIG9uIHRoZSBkZXZpY2U/Ci0JCQkgKiBJZiB3ZSBoYXZlIGEgZmFsbGJhY2ssIHVzZSB0aGF0LiAqLwotCQkJZmFsbGJhY2sgPSBzc2JfZ2V0X2ZhbGxiYWNrX3Nwcm9tKCk7Ci0JCQlpZiAoZmFsbGJhY2spIHsKLQkJCQltZW1jcHkoc3Byb20sIGZhbGxiYWNrLCBzaXplb2YoKnNwcm9tKSk7CisJCQkgKiBOb3cgd2UgYXNrIHRoZSBhcmNoIGNvZGUgaWYgdGhlcmUgaXMgc29tZSBzcHJvbQorCQkJICogYXZhaWxhYmxlIGZvciB0aGlzIGRldmljZSBpbiBzb21lIG90aGVyIHN0b3JhZ2UgKi8KKwkJCWVyciA9IHNzYl9maWxsX3Nwcm9tX3dpdGhfZmFsbGJhY2soYnVzLCBzcHJvbSk7CisJCQlpZiAoZXJyKSB7CisJCQkJc3NiX3ByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJXQVJOSU5HOiBVc2luZyIKKwkJCQkJICAgIiBmYWxsYmFjayBTUFJPTSBmYWlsZWQgKGVyciAlZClcbiIsCisJCQkJCSAgIGVycik7CisJCQl9IGVsc2UgeworCQkJCXNzYl9kcHJpbnRrKEtFUk5fREVCVUcgUEZYICJVc2luZyBTUFJPTSIKKwkJCQkJICAgICIgcmV2aXNpb24gJWQgcHJvdmlkZWQgYnkiCisJCQkJCSAgICAiIHBsYXRmb3JtLlxuIiwgc3Byb20tPnJldmlzaW9uKTsKIAkJCQllcnIgPSAwOwogCQkJCWdvdG8gb3V0X2ZyZWU7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NzYi9zcHJvbS5jIGIvZHJpdmVycy9zc2Ivc3Byb20uYwppbmRleCA1ZjM0ZDdhLi40NWZmMGUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NzYi9zcHJvbS5jCisrKyBiL2RyaXZlcnMvc3NiL3Nwcm9tLmMKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzc2Jfc3Byb20gKmZhbGxiYWNrX3Nwcm9tOworc3RhdGljIGludCgqZ2V0X2ZhbGxiYWNrX3Nwcm9tKShzdHJ1Y3Qgc3NiX2J1cyAqZGV2LCBzdHJ1Y3Qgc3NiX3Nwcm9tICpvdXQpOwogCiAKIHN0YXRpYyBpbnQgc3Byb20yaGV4KGNvbnN0IHUxNiAqc3Byb20sIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCkBAIC0xNDUsMzYgKzE0NSw0MyBAQAogfQogCiAvKioKLSAqIHNzYl9hcmNoX3NldF9mYWxsYmFja19zcHJvbSAtIFNldCBhIGZhbGxiYWNrIFNQUk9NIGZvciB1c2UgaWYgbm8gU1BST00gaXMgZm91bmQuCisgKiBzc2JfYXJjaF9yZWdpc3Rlcl9mYWxsYmFja19zcHJvbSAtIFJlZ2lzdGVycyBhIG1ldGhvZCBwcm92aWRpbmcgYQorICogZmFsbGJhY2sgU1BST00gaWYgbm8gU1BST00gaXMgZm91bmQuCiAgKgotICogQHNwcm9tOiBUaGUgU1BST00gZGF0YSBzdHJ1Y3R1cmUgdG8gcmVnaXN0ZXIuCisgKiBAc3Byb21fY2FsbGJhY2s6IFRoZSBjYWxsYmFjayBmdW5jdGlvbi4KICAqCi0gKiBXaXRoIHRoaXMgZnVuY3Rpb24gdGhlIGFyY2hpdGVjdHVyZSBpbXBsZW1lbnRhdGlvbiBtYXkgcmVnaXN0ZXIgYSBmYWxsYmFjawotICogU1BST00gZGF0YSBzdHJ1Y3R1cmUuIFRoZSBmYWxsYmFjayBpcyBvbmx5IHVzZWQgZm9yIFBDSSBiYXNlZCBTU0IgZGV2aWNlcywKLSAqIHdoZXJlIG5vIHZhbGlkIFNQUk9NIGNhbiBiZSBmb3VuZCBpbiB0aGUgc2hhZG93IHJlZ2lzdGVycy4KKyAqIFdpdGggdGhpcyBmdW5jdGlvbiB0aGUgYXJjaGl0ZWN0dXJlIGltcGxlbWVudGF0aW9uIG1heSByZWdpc3RlciBhCisgKiBjYWxsYmFjayBoYW5kbGVyIHdoaWNoIGZpbGxzIHRoZSBTUFJPTSBkYXRhIHN0cnVjdHVyZS4gVGhlIGZhbGxiYWNrIGlzCisgKiBvbmx5IHVzZWQgZm9yIFBDSSBiYXNlZCBTU0IgZGV2aWNlcywgd2hlcmUgbm8gdmFsaWQgU1BST00gY2FuIGJlIGZvdW5kCisgKiBpbiB0aGUgc2hhZG93IHJlZ2lzdGVycy4KICAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3Igd2VpcmQgYXJjaGl0ZWN0dXJlcyB0aGF0IGhhdmUgYSBoYWxmLWFzc2VkIFNTQiBkZXZpY2UKLSAqIGhhcmR3aXJlZCB0byB0aGVpciBQQ0kgYnVzLgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgZm9yIHdlaXJkIGFyY2hpdGVjdHVyZXMgdGhhdCBoYXZlIGEgaGFsZi1hc3NlZAorICogU1NCIGRldmljZSBoYXJkd2lyZWQgdG8gdGhlaXIgUENJIGJ1cy4KICAqCi0gKiBOb3RlIHRoYXQgaXQgZG9lcyBvbmx5IHdvcmsgd2l0aCBQQ0kgYXR0YWNoZWQgU1NCIGRldmljZXMuIFBDTUNJQSBkZXZpY2VzIGN1cnJlbnRseQotICogZG9uJ3QgdXNlIHRoaXMgZmFsbGJhY2suCi0gKiBBcmNoaXRlY3R1cmVzIG11c3QgcHJvdmlkZSB0aGUgU1BST00gZm9yIG5hdGl2ZSBTU0IgZGV2aWNlcyBhbnl3YXksCi0gKiBzbyB0aGUgZmFsbGJhY2sgYWxzbyBpc24ndCB1c2VkIGZvciBuYXRpdmUgZGV2aWNlcy4KKyAqIE5vdGUgdGhhdCBpdCBkb2VzIG9ubHkgd29yayB3aXRoIFBDSSBhdHRhY2hlZCBTU0IgZGV2aWNlcy4gUENNQ0lBCisgKiBkZXZpY2VzIGN1cnJlbnRseSBkb24ndCB1c2UgdGhpcyBmYWxsYmFjay4KKyAqIEFyY2hpdGVjdHVyZXMgbXVzdCBwcm92aWRlIHRoZSBTUFJPTSBmb3IgbmF0aXZlIFNTQiBkZXZpY2VzIGFueXdheSwgc28KKyAqIHRoZSBmYWxsYmFjayBhbHNvIGlzbid0IHVzZWQgZm9yIG5hdGl2ZSBkZXZpY2VzLgogICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIGZvciBhcmNoaXRlY3R1cmUgY29kZSwgb25seS4gU28gaXQgaXMgbm90IGV4cG9ydGVkLgorICogVGhpcyBmdW5jdGlvbiBpcyBhdmFpbGFibGUgZm9yIGFyY2hpdGVjdHVyZSBjb2RlLCBvbmx5LiBTbyBpdCBpcyBub3QKKyAqIGV4cG9ydGVkLgogICovCi1pbnQgc3NiX2FyY2hfc2V0X2ZhbGxiYWNrX3Nwcm9tKGNvbnN0IHN0cnVjdCBzc2Jfc3Byb20gKnNwcm9tKQoraW50IHNzYl9hcmNoX3JlZ2lzdGVyX2ZhbGxiYWNrX3Nwcm9tKGludCAoKnNwcm9tX2NhbGxiYWNrKShzdHJ1Y3Qgc3NiX2J1cyAqYnVzLAorCQkJCSAgICAgc3RydWN0IHNzYl9zcHJvbSAqb3V0KSkKIHsKLQlpZiAoZmFsbGJhY2tfc3Byb20pCisJaWYgKGdldF9mYWxsYmFja19zcHJvbSkKIAkJcmV0dXJuIC1FRVhJU1Q7Ci0JZmFsbGJhY2tfc3Byb20gPSBzcHJvbTsKKwlnZXRfZmFsbGJhY2tfc3Byb20gPSBzcHJvbV9jYWxsYmFjazsKIAogCXJldHVybiAwOwogfQogCi1jb25zdCBzdHJ1Y3Qgc3NiX3Nwcm9tICpzc2JfZ2V0X2ZhbGxiYWNrX3Nwcm9tKHZvaWQpCitpbnQgc3NiX2ZpbGxfc3Byb21fd2l0aF9mYWxsYmFjayhzdHJ1Y3Qgc3NiX2J1cyAqYnVzLCBzdHJ1Y3Qgc3NiX3Nwcm9tICpvdXQpCiB7Ci0JcmV0dXJuIGZhbGxiYWNrX3Nwcm9tOworCWlmICghZ2V0X2ZhbGxiYWNrX3Nwcm9tKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXJldHVybiBnZXRfZmFsbGJhY2tfc3Byb20oYnVzLCBvdXQpOwogfQogCiAvKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL0lzU3Byb21BdmFpbGFibGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3NiL3NzYl9wcml2YXRlLmggYi9kcml2ZXJzL3NzYi9zc2JfcHJpdmF0ZS5oCmluZGV4IDAzMzExMzkuLjc3NjUzMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3NiL3NzYl9wcml2YXRlLmgKKysrIGIvZHJpdmVycy9zc2Ivc3NiX3ByaXZhdGUuaApAQCAtMTcxLDcgKzE3MSw4IEBACiAJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAogCQkJICAgICBpbnQgKCpzcHJvbV9jaGVja19jcmMpKGNvbnN0IHUxNiAqc3Byb20sIHNpemVfdCBzaXplKSwKIAkJCSAgICAgaW50ICgqc3Byb21fd3JpdGUpKHN0cnVjdCBzc2JfYnVzICpidXMsIGNvbnN0IHUxNiAqc3Byb20pKTsKLWV4dGVybiBjb25zdCBzdHJ1Y3Qgc3NiX3Nwcm9tICpzc2JfZ2V0X2ZhbGxiYWNrX3Nwcm9tKHZvaWQpOworZXh0ZXJuIGludCBzc2JfZmlsbF9zcHJvbV93aXRoX2ZhbGxiYWNrKHN0cnVjdCBzc2JfYnVzICpidXMsCisJCQkJCXN0cnVjdCBzc2Jfc3Byb20gKm91dCk7CiAKIAogLyogY29yZS5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvS2NvbmZpZyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9LY29uZmlnCmluZGV4IDgwNDg0YWYuLmIxZjBmODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9LY29uZmlnCkBAIC0xMzkxLDYgKzEzOTEsMTQgQEAKIAloZWxwCiAJICBTdXBwb3J0IGZvciBDb25zb2xlIG9uIHRoZSBOV1Agc2VyaWFsIHBvcnRzLgogCitjb25maWcgU0VSSUFMX0xBTlRJUQorCWJvb2wgIkxhbnRpcSBzZXJpYWwgZHJpdmVyIgorCWRlcGVuZHMgb24gTEFOVElRCisJc2VsZWN0IFNFUklBTF9DT1JFCisJc2VsZWN0IFNFUklBTF9DT1JFX0NPTlNPTEUKKwloZWxwCisJICBTdXBwb3J0IGZvciBjb25zb2xlIGFuZCBVQVJUIG9uIExhbnRpcSBTb0NzLgorCiBjb25maWcgU0VSSUFMX1FFCiAJdHJpc3RhdGUgIkZyZWVzY2FsZSBRVUlDQyBFbmdpbmUgc2VyaWFsIHBvcnQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFFVSUNDX0VOR0lORQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL01ha2VmaWxlIGIvZHJpdmVycy90dHkvc2VyaWFsL01ha2VmaWxlCmluZGV4IGZlZTA2OTAuLjM1Mjc2MDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvTWFrZWZpbGUKQEAgLTk0LDMgKzk0LDQgQEAKIG9iai0kKENPTkZJR19TRVJJQUxfUENIX1VBUlQpCSs9IHBjaF91YXJ0Lm8KIG9iai0kKENPTkZJR19TRVJJQUxfTVNNX1NNRCkJKz0gbXNtX3NtZF90dHkubwogb2JqLSQoQ09ORklHX1NFUklBTF9NWFNfQVVBUlQpICs9IG14cy1hdWFydC5vCitvYmotJChDT05GSUdfU0VSSUFMX0xBTlRJUSkJKz0gbGFudGlxLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9sYW50aXEuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9sYW50aXEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGNmMjc5ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9sYW50aXEuYwpAQCAtMCwwICsxLDc1NiBAQAorLyoKKyAqICBCYXNlZCBvbiBkcml2ZXJzL2NoYXIvc2VyaWFsLmMsIGJ5IExpbnVzIFRvcnZhbGRzLCBUaGVvZG9yZSBUcydvLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgSW5maW5lb24gSUZBUCBEQyBDT00gQ1BFCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRmVsaXggRmlldGthdSA8bmJkQG9wZW53cnQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA3IEpvaG4gQ3Jpc3BpbiA8YmxvZ2ljQG9wZW53cnQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRob21hcyBMYW5nZXIsIDx0aG9tYXMubGFuZ2VyQGxhbnRpcS5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c3JxLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisKKyNpbmNsdWRlIDxsYW50aXFfc29jLmg+CisKKyNkZWZpbmUgUE9SVF9MVFFfQVNDCQkxMTEKKyNkZWZpbmUgTUFYUE9SVFMJCTIKKyNkZWZpbmUgVUFSVF9EVU1NWV9VRVJfUlgJMQorI2RlZmluZSBEUlZOQU1FCQkJImx0cV9hc2MiCisjaWZkZWYgX19CSUdfRU5ESUFOCisjZGVmaW5lIExUUV9BU0NfVEJVRgkJKDB4MDAyMCArIDMpCisjZGVmaW5lIExUUV9BU0NfUkJVRgkJKDB4MDAyNCArIDMpCisjZWxzZQorI2RlZmluZSBMVFFfQVNDX1RCVUYJCTB4MDAyMAorI2RlZmluZSBMVFFfQVNDX1JCVUYJCTB4MDAyNAorI2VuZGlmCisjZGVmaW5lIExUUV9BU0NfRlNUQVQJCTB4MDA0OAorI2RlZmluZSBMVFFfQVNDX1dIQlNUQVRFCTB4MDAxOAorI2RlZmluZSBMVFFfQVNDX1NUQVRFCQkweDAwMTQKKyNkZWZpbmUgTFRRX0FTQ19JUk5DUgkJMHgwMEY4CisjZGVmaW5lIExUUV9BU0NfQ0xDCQkweDAwMDAKKyNkZWZpbmUgTFRRX0FTQ19JRAkJMHgwMDA4CisjZGVmaW5lIExUUV9BU0NfUElTRUwJCTB4MDAwNAorI2RlZmluZSBMVFFfQVNDX1RYRkNPTgkJMHgwMDQ0CisjZGVmaW5lIExUUV9BU0NfUlhGQ09OCQkweDAwNDAKKyNkZWZpbmUgTFRRX0FTQ19DT04JCTB4MDAxMAorI2RlZmluZSBMVFFfQVNDX0JHCQkweDAwNTAKKyNkZWZpbmUgTFRRX0FTQ19JUk5SRU4JCTB4MDBGNAorCisjZGVmaW5lIEFTQ19JUk5SRU5fVFgJCTB4MQorI2RlZmluZSBBU0NfSVJOUkVOX1JYCQkweDIKKyNkZWZpbmUgQVNDX0lSTlJFTl9FUlIJCTB4NAorI2RlZmluZSBBU0NfSVJOUkVOX1RYX0JVRgkweDgKKyNkZWZpbmUgQVNDX0lSTkNSX1RJUgkJMHgxCisjZGVmaW5lIEFTQ19JUk5DUl9SSVIJCTB4MgorI2RlZmluZSBBU0NfSVJOQ1JfRUlSCQkweDQKKworI2RlZmluZSBBU0NPUFRfQ1NJWkUJCTB4MworI2RlZmluZSBUWEZJRk9fRkwJCTEKKyNkZWZpbmUgUlhGSUZPX0ZMCQkxCisjZGVmaW5lIEFTQ0NMQ19ESVNTCQkweDIKKyNkZWZpbmUgQVNDQ0xDX1JNQ01BU0sJCTB4MDAwMEZGMDAKKyNkZWZpbmUgQVNDQ0xDX1JNQ09GRlNFVAk4CisjZGVmaW5lIEFTQ0NPTl9NXzhBU1lOQwkJMHgwCisjZGVmaW5lIEFTQ0NPTl9NXzdBU1lOQwkJMHgyCisjZGVmaW5lIEFTQ0NPTl9PREQJCTB4MDAwMDAwMjAKKyNkZWZpbmUgQVNDQ09OX1NUUAkJMHgwMDAwMDA4MAorI2RlZmluZSBBU0NDT05fQlJTCQkweDAwMDAwMTAwCisjZGVmaW5lIEFTQ0NPTl9GREUJCTB4MDAwMDAyMDAKKyNkZWZpbmUgQVNDQ09OX1IJCTB4MDAwMDgwMDAKKyNkZWZpbmUgQVNDQ09OX0ZFTgkJMHgwMDAyMDAwMAorI2RlZmluZSBBU0NDT05fUk9FTgkJMHgwMDA4MDAwMAorI2RlZmluZSBBU0NDT05fVE9FTgkJMHgwMDEwMDAwMAorI2RlZmluZSBBU0NTVEFURV9QRQkJMHgwMDAxMDAwMAorI2RlZmluZSBBU0NTVEFURV9GRQkJMHgwMDAyMDAwMAorI2RlZmluZSBBU0NTVEFURV9ST0UJCTB4MDAwODAwMDAKKyNkZWZpbmUgQVNDU1RBVEVfQU5ZCQkoQVNDU1RBVEVfUk9FfEFTQ1NUQVRFX1BFfEFTQ1NUQVRFX0ZFKQorI2RlZmluZSBBU0NXSEJTVEFURV9DTFJSRU4JMHgwMDAwMDAwMQorI2RlZmluZSBBU0NXSEJTVEFURV9TRVRSRU4JMHgwMDAwMDAwMgorI2RlZmluZSBBU0NXSEJTVEFURV9DTFJQRQkweDAwMDAwMDA0CisjZGVmaW5lIEFTQ1dIQlNUQVRFX0NMUkZFCTB4MDAwMDAwMDgKKyNkZWZpbmUgQVNDV0hCU1RBVEVfQ0xSUk9FCTB4MDAwMDAwMjAKKyNkZWZpbmUgQVNDVFhGQ09OX1RYRkVOCQkweDAwMDEKKyNkZWZpbmUgQVNDVFhGQ09OX1RYRkZMVQkweDAwMDIKKyNkZWZpbmUgQVNDVFhGQ09OX1RYRklUTE1BU0sJMHgzRjAwCisjZGVmaW5lIEFTQ1RYRkNPTl9UWEZJVExPRkYJOAorI2RlZmluZSBBU0NSWEZDT05fUlhGRU4JCTB4MDAwMQorI2RlZmluZSBBU0NSWEZDT05fUlhGRkxVCTB4MDAwMgorI2RlZmluZSBBU0NSWEZDT05fUlhGSVRMTUFTSwkweDNGMDAKKyNkZWZpbmUgQVNDUlhGQ09OX1JYRklUTE9GRgk4CisjZGVmaW5lIEFTQ0ZTVEFUX1JYRkZMTUFTSwkweDAwM0YKKyNkZWZpbmUgQVNDRlNUQVRfVFhGRkxNQVNLCTB4M0YwMAorI2RlZmluZSBBU0NGU1RBVF9UWEZSRUVNQVNLCTB4M0YwMDAwMDAKKyNkZWZpbmUgQVNDRlNUQVRfVFhGUkVFT0ZGCTI0CisKK3N0YXRpYyB2b2lkIGxxYXNjX3R4X2NoYXJzKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpOworc3RhdGljIHN0cnVjdCBsdHFfdWFydF9wb3J0ICpscWFzY19wb3J0W01BWFBPUlRTXTsKK3N0YXRpYyBzdHJ1Y3QgdWFydF9kcml2ZXIgbHFhc2NfcmVnOworc3RhdGljIERFRklORV9TUElOTE9DSyhsdHFfYXNjX2xvY2spOworCitzdHJ1Y3QgbHRxX3VhcnRfcG9ydCB7CisJc3RydWN0IHVhcnRfcG9ydAlwb3J0OworCXN0cnVjdCBjbGsJCSpjbGs7CisJdW5zaWduZWQgaW50CQl0eF9pcnE7CisJdW5zaWduZWQgaW50CQlyeF9pcnE7CisJdW5zaWduZWQgaW50CQllcnJfaXJxOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QKK2x0cV91YXJ0X3BvcnQgKnRvX2x0cV91YXJ0X3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBsdHFfdWFydF9wb3J0LCBwb3J0KTsKK30KKworc3RhdGljIHZvaWQKK2xxYXNjX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitscWFzY19zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmx0cV9hc2NfbG9jaywgZmxhZ3MpOworCWxxYXNjX3R4X2NoYXJzKHBvcnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmx0cV9hc2NfbG9jaywgZmxhZ3MpOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2xxYXNjX3N0b3Bfcngoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlsdHFfdzMyKEFTQ1dIQlNUQVRFX0NMUlJFTiwgcG9ydC0+bWVtYmFzZSArIExUUV9BU0NfV0hCU1RBVEUpOworfQorCitzdGF0aWMgdm9pZAorbHFhc2NfZW5hYmxlX21zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7Cit9CisKK3N0YXRpYyBpbnQKK2xxYXNjX3J4X2NoYXJzKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnQtPnN0YXRlLT5wb3J0KTsKKwl1bnNpZ25lZCBpbnQgY2ggPSAwLCByc3IgPSAwLCBmaWZvY250OworCisJaWYgKCF0dHkpIHsKKwkJZGV2X2RiZyhwb3J0LT5kZXYsICIlczp0dHkgaXMgYnVzeSBub3ciLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWZpZm9jbnQgPQorCQlsdHFfcjMyKHBvcnQtPm1lbWJhc2UgKyBMVFFfQVNDX0ZTVEFUKSAmIEFTQ0ZTVEFUX1JYRkZMTUFTSzsKKwl3aGlsZSAoZmlmb2NudC0tKSB7CisJCXU4IGZsYWcgPSBUVFlfTk9STUFMOworCQljaCA9IGx0cV9yOChwb3J0LT5tZW1iYXNlICsgTFRRX0FTQ19SQlVGKTsKKwkJcnNyID0gKGx0cV9yMzIocG9ydC0+bWVtYmFzZSArIExUUV9BU0NfU1RBVEUpCisJCQkmIEFTQ1NUQVRFX0FOWSkgfCBVQVJUX0RVTU1ZX1VFUl9SWDsKKwkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKKwkJcG9ydC0+aWNvdW50LnJ4Kys7CisKKwkJLyoKKwkJICogTm90ZSB0aGF0IHRoZSBlcnJvciBoYW5kbGluZyBjb2RlIGlzCisJCSAqIG91dCBvZiB0aGUgbWFpbiBleGVjdXRpb24gcGF0aAorCQkgKi8KKwkJaWYgKHJzciAmIEFTQ1NUQVRFX0FOWSkgeworCQkJaWYgKHJzciAmIEFTQ1NUQVRFX1BFKSB7CisJCQkJcG9ydC0+aWNvdW50LnBhcml0eSsrOworCQkJCWx0cV93MzJfbWFzaygwLCBBU0NXSEJTVEFURV9DTFJQRSwKKwkJCQkJcG9ydC0+bWVtYmFzZSArIExUUV9BU0NfV0hCU1RBVEUpOworCQkJfSBlbHNlIGlmIChyc3IgJiBBU0NTVEFURV9GRSkgeworCQkJCXBvcnQtPmljb3VudC5mcmFtZSsrOworCQkJCWx0cV93MzJfbWFzaygwLCBBU0NXSEJTVEFURV9DTFJGRSwKKwkJCQkJcG9ydC0+bWVtYmFzZSArIExUUV9BU0NfV0hCU1RBVEUpOworCQkJfQorCQkJaWYgKHJzciAmIEFTQ1NUQVRFX1JPRSkgeworCQkJCXBvcnQtPmljb3VudC5vdmVycnVuKys7CisJCQkJbHRxX3czMl9tYXNrKDAsIEFTQ1dIQlNUQVRFX0NMUlJPRSwKKwkJCQkJcG9ydC0+bWVtYmFzZSArIExUUV9BU0NfV0hCU1RBVEUpOworCQkJfQorCisJCQlyc3IgJj0gcG9ydC0+cmVhZF9zdGF0dXNfbWFzazsKKworCQkJaWYgKHJzciAmIEFTQ1NUQVRFX1BFKQorCQkJCWZsYWcgPSBUVFlfUEFSSVRZOworCQkJZWxzZSBpZiAocnNyICYgQVNDU1RBVEVfRkUpCisJCQkJZmxhZyA9IFRUWV9GUkFNRTsKKwkJfQorCisJCWlmICgocnNyICYgcG9ydC0+aWdub3JlX3N0YXR1c19tYXNrKSA9PSAwKQorCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgZmxhZyk7CisKKwkJaWYgKHJzciAmIEFTQ1NUQVRFX1JPRSkKKwkJCS8qCisJCQkgKiBPdmVycnVuIGlzIHNwZWNpYWwsIHNpbmNlIGl0J3MgcmVwb3J0ZWQKKwkJCSAqIGltbWVkaWF0ZWx5LCBhbmQgZG9lc24ndCBhZmZlY3QgdGhlIGN1cnJlbnQKKwkJCSAqIGNoYXJhY3RlcgorCQkJICovCisJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIDAsIFRUWV9PVkVSUlVOKTsKKwl9CisJaWYgKGNoICE9IDApCisJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CisJdHR5X2tyZWZfcHV0KHR0eSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitscWFzY190eF9jaGFycyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZwb3J0LT5zdGF0ZS0+eG1pdDsKKwlpZiAodWFydF90eF9zdG9wcGVkKHBvcnQpKSB7CisJCWxxYXNjX3N0b3BfdHgocG9ydCk7CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAoKChsdHFfcjMyKHBvcnQtPm1lbWJhc2UgKyBMVFFfQVNDX0ZTVEFUKSAmCisJCUFTQ0ZTVEFUX1RYRlJFRU1BU0spID4+IEFTQ0ZTVEFUX1RYRlJFRU9GRikgIT0gMCkgeworCQlpZiAocG9ydC0+eF9jaGFyKSB7CisJCQlsdHFfdzgocG9ydC0+eF9jaGFyLCBwb3J0LT5tZW1iYXNlICsgTFRRX0FTQ19UQlVGKTsKKwkJCXBvcnQtPmljb3VudC50eCsrOworCQkJcG9ydC0+eF9jaGFyID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSkKKwkJCWJyZWFrOworCisJCWx0cV93OChwb3J0LT5zdGF0ZS0+eG1pdC5idWZbcG9ydC0+c3RhdGUtPnhtaXQudGFpbF0sCisJCQlwb3J0LT5tZW1iYXNlICsgTFRRX0FTQ19UQlVGKTsKKwkJeG1pdC0+dGFpbCA9ICh4bWl0LT50YWlsICsgMSkgJiAoVUFSVF9YTUlUX1NJWkUgLSAxKTsKKwkJcG9ydC0+aWNvdW50LnR4Kys7CisJfQorCisJaWYgKHVhcnRfY2lyY19jaGFyc19wZW5kaW5nKHhtaXQpIDwgV0FLRVVQX0NIQVJTKQorCQl1YXJ0X3dyaXRlX3dha2V1cChwb3J0KTsKK30KKworc3RhdGljIGlycXJldHVybl90CitscWFzY190eF9pbnQoaW50IGlycSwgdm9pZCAqX3BvcnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1YXJ0X3BvcnQgKilfcG9ydDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHRxX2FzY19sb2NrLCBmbGFncyk7CisJbHRxX3czMihBU0NfSVJOQ1JfVElSLCBwb3J0LT5tZW1iYXNlICsgTFRRX0FTQ19JUk5DUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHRxX2FzY19sb2NrLCBmbGFncyk7CisJbHFhc2Nfc3RhcnRfdHgocG9ydCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QKK2xxYXNjX2Vycl9pbnQoaW50IGlycSwgdm9pZCAqX3BvcnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1YXJ0X3BvcnQgKilfcG9ydDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHRxX2FzY19sb2NrLCBmbGFncyk7CisJLyogY2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0cyAqLworCWx0cV93MzJfbWFzaygwLCBBU0NXSEJTVEFURV9DTFJQRSB8IEFTQ1dIQlNUQVRFX0NMUkZFIHwKKwkJQVNDV0hCU1RBVEVfQ0xSUk9FLCBwb3J0LT5tZW1iYXNlICsgTFRRX0FTQ19XSEJTVEFURSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHRxX2FzY19sb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QKK2xxYXNjX3J4X2ludChpbnQgaXJxLCB2b2lkICpfcG9ydCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSAoc3RydWN0IHVhcnRfcG9ydCAqKV9wb3J0OworCXNwaW5fbG9ja19pcnFzYXZlKCZsdHFfYXNjX2xvY2ssIGZsYWdzKTsKKwlsdHFfdzMyKEFTQ19JUk5DUl9SSVIsIHBvcnQtPm1lbWJhc2UgKyBMVFFfQVNDX0lSTkNSKTsKKwlscWFzY19yeF9jaGFycyhwb3J0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsdHFfYXNjX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2xxYXNjX3R4X2VtcHR5KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJaW50IHN0YXR1czsKKwlzdGF0dXMgPSBsdHFfcjMyKHBvcnQtPm1lbWJhc2UgKyBMVFFfQVNDX0ZTVEFUKSAmIEFTQ0ZTVEFUX1RYRkZMTUFTSzsKKwlyZXR1cm4gc3RhdHVzID8gMCA6IFRJT0NTRVJfVEVNVDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorbHFhc2NfZ2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcmV0dXJuIFRJT0NNX0NUUyB8IFRJT0NNX0NBUiB8IFRJT0NNX0RTUjsKK30KKworc3RhdGljIHZvaWQKK2xxYXNjX3NldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1X2ludCBtY3RybCkKK3sKK30KKworc3RhdGljIHZvaWQKK2xxYXNjX2JyZWFrX2N0bChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgYnJlYWtfc3RhdGUpCit7Cit9CisKK3N0YXRpYyBpbnQKK2xxYXNjX3N0YXJ0dXAoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgbHRxX3VhcnRfcG9ydCAqbHRxX3BvcnQgPSB0b19sdHFfdWFydF9wb3J0KHBvcnQpOworCWludCByZXR2YWw7CisKKwlwb3J0LT51YXJ0Y2xrID0gY2xrX2dldF9yYXRlKGx0cV9wb3J0LT5jbGspOworCisJbHRxX3czMl9tYXNrKEFTQ0NMQ19ESVNTIHwgQVNDQ0xDX1JNQ01BU0ssICgxIDw8IEFTQ0NMQ19STUNPRkZTRVQpLAorCQlwb3J0LT5tZW1iYXNlICsgTFRRX0FTQ19DTEMpOworCisJbHRxX3czMigwLCBwb3J0LT5tZW1iYXNlICsgTFRRX0FTQ19QSVNFTCk7CisJbHRxX3czMigKKwkJKChUWEZJRk9fRkwgPDwgQVNDVFhGQ09OX1RYRklUTE9GRikgJiBBU0NUWEZDT05fVFhGSVRMTUFTSykgfAorCQlBU0NUWEZDT05fVFhGRU4gfCBBU0NUWEZDT05fVFhGRkxVLAorCQlwb3J0LT5tZW1iYXNlICsgTFRRX0FTQ19UWEZDT04pOworCWx0cV93MzIoCisJCSgoUlhGSUZPX0ZMIDw8IEFTQ1JYRkNPTl9SWEZJVExPRkYpICYgQVNDUlhGQ09OX1JYRklUTE1BU0spCisJCXwgQVNDUlhGQ09OX1JYRkVOIHwgQVNDUlhGQ09OX1JYRkZMVSwKKwkJcG9ydC0+bWVtYmFzZSArIExUUV9BU0NfUlhGQ09OKTsKKwkvKiBtYWtlIHN1cmUgb3RoZXIgc2V0dGluZ3MgYXJlIHdyaXR0ZW4gdG8gaGFyZHdhcmUgYmVmb3JlCisJICogc2V0dGluZyBlbmFibGUgYml0cworCSAqLworCXdtYigpOworCWx0cV93MzJfbWFzaygwLCBBU0NDT05fTV84QVNZTkMgfCBBU0NDT05fRkVOIHwgQVNDQ09OX1RPRU4gfAorCQlBU0NDT05fUk9FTiwgcG9ydC0+bWVtYmFzZSArIExUUV9BU0NfQ09OKTsKKworCXJldHZhbCA9IHJlcXVlc3RfaXJxKGx0cV9wb3J0LT50eF9pcnEsIGxxYXNjX3R4X2ludCwKKwkJSVJRRl9ESVNBQkxFRCwgImFzY190eCIsIHBvcnQpOworCWlmIChyZXR2YWwpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gcmVxdWVzdCBscWFzY190eF9pbnRcbiIpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCXJldHZhbCA9IHJlcXVlc3RfaXJxKGx0cV9wb3J0LT5yeF9pcnEsIGxxYXNjX3J4X2ludCwKKwkJSVJRRl9ESVNBQkxFRCwgImFzY19yeCIsIHBvcnQpOworCWlmIChyZXR2YWwpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gcmVxdWVzdCBscWFzY19yeF9pbnRcbiIpOworCQlnb3RvIGVycjE7CisJfQorCisJcmV0dmFsID0gcmVxdWVzdF9pcnEobHRxX3BvcnQtPmVycl9pcnEsIGxxYXNjX2Vycl9pbnQsCisJCUlSUUZfRElTQUJMRUQsICJhc2NfZXJyIiwgcG9ydCk7CisJaWYgKHJldHZhbCkgeworCQlwcl9lcnIoImZhaWxlZCB0byByZXF1ZXN0IGxxYXNjX2Vycl9pbnRcbiIpOworCQlnb3RvIGVycjI7CisJfQorCisJbHRxX3czMihBU0NfSVJOUkVOX1JYIHwgQVNDX0lSTlJFTl9FUlIgfCBBU0NfSVJOUkVOX1RYLAorCQlwb3J0LT5tZW1iYXNlICsgTFRRX0FTQ19JUk5SRU4pOworCXJldHVybiAwOworCitlcnIyOgorCWZyZWVfaXJxKGx0cV9wb3J0LT5yeF9pcnEsIHBvcnQpOworZXJyMToKKwlmcmVlX2lycShsdHFfcG9ydC0+dHhfaXJxLCBwb3J0KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZAorbHFhc2Nfc2h1dGRvd24oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgbHRxX3VhcnRfcG9ydCAqbHRxX3BvcnQgPSB0b19sdHFfdWFydF9wb3J0KHBvcnQpOworCWZyZWVfaXJxKGx0cV9wb3J0LT50eF9pcnEsIHBvcnQpOworCWZyZWVfaXJxKGx0cV9wb3J0LT5yeF9pcnEsIHBvcnQpOworCWZyZWVfaXJxKGx0cV9wb3J0LT5lcnJfaXJxLCBwb3J0KTsKKworCWx0cV93MzIoMCwgcG9ydC0+bWVtYmFzZSArIExUUV9BU0NfQ09OKTsKKwlsdHFfdzMyX21hc2soQVNDUlhGQ09OX1JYRkVOLCBBU0NSWEZDT05fUlhGRkxVLAorCQlwb3J0LT5tZW1iYXNlICsgTFRRX0FTQ19SWEZDT04pOworCWx0cV93MzJfbWFzayhBU0NUWEZDT05fVFhGRU4sIEFTQ1RYRkNPTl9UWEZGTFUsCisJCXBvcnQtPm1lbWJhc2UgKyBMVFFfQVNDX1RYRkNPTik7Cit9CisKK3N0YXRpYyB2b2lkCitscWFzY19zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAorCXN0cnVjdCBrdGVybWlvcyAqbmV3LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCkKK3sKKwl1bnNpZ25lZCBpbnQgY2ZsYWc7CisJdW5zaWduZWQgaW50IGlmbGFnOworCXVuc2lnbmVkIGludCBkaXZpc29yOworCXVuc2lnbmVkIGludCBiYXVkOworCXVuc2lnbmVkIGludCBjb24gPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwljZmxhZyA9IG5ldy0+Y19jZmxhZzsKKwlpZmxhZyA9IG5ldy0+Y19pZmxhZzsKKworCXN3aXRjaCAoY2ZsYWcgJiBDU0laRSkgeworCWNhc2UgQ1M3OgorCQljb24gPSBBU0NDT05fTV83QVNZTkM7CisJCWJyZWFrOworCisJY2FzZSBDUzU6CisJY2FzZSBDUzY6CisJZGVmYXVsdDoKKwkJbmV3LT5jX2NmbGFnICY9IH4gQ1NJWkU7CisJCW5ldy0+Y19jZmxhZyB8PSBDUzg7CisJCWNvbiA9IEFTQ0NPTl9NXzhBU1lOQzsKKwkJYnJlYWs7CisJfQorCisJY2ZsYWcgJj0gfkNNU1BBUjsgLyogTWFyay9TcGFjZSBwYXJpdHkgaXMgbm90IHN1cHBvcnRlZCAqLworCisJaWYgKGNmbGFnICYgQ1NUT1BCKQorCQljb24gfD0gQVNDQ09OX1NUUDsKKworCWlmIChjZmxhZyAmIFBBUkVOQikgeworCQlpZiAoIShjZmxhZyAmIFBBUk9ERCkpCisJCQljb24gJj0gfkFTQ0NPTl9PREQ7CisJCWVsc2UKKwkJCWNvbiB8PSBBU0NDT05fT0REOworCX0KKworCXBvcnQtPnJlYWRfc3RhdHVzX21hc2sgPSBBU0NTVEFURV9ST0U7CisJaWYgKGlmbGFnICYgSU5QQ0spCisJCXBvcnQtPnJlYWRfc3RhdHVzX21hc2sgfD0gQVNDU1RBVEVfRkUgfCBBU0NTVEFURV9QRTsKKworCXBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayA9IDA7CisJaWYgKGlmbGFnICYgSUdOUEFSKQorCQlwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gQVNDU1RBVEVfRkUgfCBBU0NTVEFURV9QRTsKKworCWlmIChpZmxhZyAmIElHTkJSSykgeworCQkvKgorCQkgKiBJZiB3ZSdyZSBpZ25vcmluZyBwYXJpdHkgYW5kIGJyZWFrIGluZGljYXRvcnMsCisJCSAqIGlnbm9yZSBvdmVycnVucyB0b28gKGZvciByZWFsIHJhdyBzdXBwb3J0KS4KKwkJICovCisJCWlmIChpZmxhZyAmIElHTlBBUikKKwkJCXBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBBU0NTVEFURV9ST0U7CisJfQorCisJaWYgKChjZmxhZyAmIENSRUFEKSA9PSAwKQorCQlwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gVUFSVF9EVU1NWV9VRVJfUlg7CisKKwkvKiBzZXQgZXJyb3Igc2lnbmFscyAgLSBmcmFtaW5nLCBwYXJpdHkgIGFuZCBvdmVycnVuLCBlbmFibGUgcmVjZWl2ZXIgKi8KKwljb24gfD0gQVNDQ09OX0ZFTiB8IEFTQ0NPTl9UT0VOIHwgQVNDQ09OX1JPRU47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHRxX2FzY19sb2NrLCBmbGFncyk7CisKKwkvKiBzZXQgdXAgQ09OICovCisJbHRxX3czMl9tYXNrKDAsIGNvbiwgcG9ydC0+bWVtYmFzZSArIExUUV9BU0NfQ09OKTsKKworCS8qIFNldCBiYXVkIHJhdGUgLSB0YWtlIGEgZGl2aWRlciBvZiAyIGludG8gYWNjb3VudCAqLworCWJhdWQgPSB1YXJ0X2dldF9iYXVkX3JhdGUocG9ydCwgbmV3LCBvbGQsIDAsIHBvcnQtPnVhcnRjbGsgLyAxNik7CisJZGl2aXNvciA9IHVhcnRfZ2V0X2Rpdmlzb3IocG9ydCwgYmF1ZCk7CisJZGl2aXNvciA9IGRpdmlzb3IgLyAyIC0gMTsKKworCS8qIGRpc2FibGUgdGhlIGJhdWRyYXRlIGdlbmVyYXRvciAqLworCWx0cV93MzJfbWFzayhBU0NDT05fUiwgMCwgcG9ydC0+bWVtYmFzZSArIExUUV9BU0NfQ09OKTsKKworCS8qIG1ha2Ugc3VyZSB0aGUgZnJhY3Rpb25hbCBkaXZpZGVyIGlzIG9mZiAqLworCWx0cV93MzJfbWFzayhBU0NDT05fRkRFLCAwLCBwb3J0LT5tZW1iYXNlICsgTFRRX0FTQ19DT04pOworCisJLyogc2V0IHVwIHRvIHVzZSBkaXZpc29yIG9mIDIgKi8KKwlsdHFfdzMyX21hc2soQVNDQ09OX0JSUywgMCwgcG9ydC0+bWVtYmFzZSArIExUUV9BU0NfQ09OKTsKKworCS8qIG5vdyB3ZSBjYW4gd3JpdGUgdGhlIG5ldyBiYXVkcmF0ZSBpbnRvIHRoZSByZWdpc3RlciAqLworCWx0cV93MzIoZGl2aXNvciwgcG9ydC0+bWVtYmFzZSArIExUUV9BU0NfQkcpOworCisJLyogdHVybiB0aGUgYmF1ZHJhdGUgZ2VuZXJhdG9yIGJhY2sgb24gKi8KKwlsdHFfdzMyX21hc2soMCwgQVNDQ09OX1IsIHBvcnQtPm1lbWJhc2UgKyBMVFFfQVNDX0NPTik7CisKKwkvKiBlbmFibGUgcnggKi8KKwlsdHFfdzMyKEFTQ1dIQlNUQVRFX1NFVFJFTiwgcG9ydC0+bWVtYmFzZSArIExUUV9BU0NfV0hCU1RBVEUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHRxX2FzY19sb2NrLCBmbGFncyk7CisKKwkvKiBEb24ndCByZXdyaXRlIEIwICovCisgICAgICAgIGlmICh0dHlfdGVybWlvc19iYXVkX3JhdGUobmV3KSkKKwkJdHR5X3Rlcm1pb3NfZW5jb2RlX2JhdWRfcmF0ZShuZXcsIGJhdWQsIGJhdWQpOworfQorCitzdGF0aWMgY29uc3QgY2hhcioKK2xxYXNjX3R5cGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlpZiAocG9ydC0+dHlwZSA9PSBQT1JUX0xUUV9BU0MpCisJCXJldHVybiBEUlZOQU1FOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitscWFzY19yZWxlYXNlX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlpZiAocG9ydC0+ZmxhZ3MgJiBVUEZfSU9SRU1BUCkgeworCQlpb3VubWFwKHBvcnQtPm1lbWJhc2UpOworCQlwb3J0LT5tZW1iYXNlID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2xxYXNjX3JlcXVlc3RfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UocG9ydC0+ZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgc2l6ZTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IG9idGFpbiBJL08gbWVtb3J5IHJlZ2lvbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKKworCXJlcyA9IGRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCisJCXNpemUsIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKKwlpZiAoIXJlcykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgcmVxdWVzdCBJL08gbWVtb3J5IHJlZ2lvbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmIChwb3J0LT5mbGFncyAmIFVQRl9JT1JFTUFQKSB7CisJCXBvcnQtPm1lbWJhc2UgPSBkZXZtX2lvcmVtYXBfbm9jYWNoZSgmcGRldi0+ZGV2LAorCQkJcG9ydC0+bWFwYmFzZSwgc2l6ZSk7CisJCWlmIChwb3J0LT5tZW1iYXNlID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitscWFzY19jb25maWdfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgZmxhZ3MpCit7CisJaWYgKGZsYWdzICYgVUFSVF9DT05GSUdfVFlQRSkgeworCQlwb3J0LT50eXBlID0gUE9SVF9MVFFfQVNDOworCQlscWFzY19yZXF1ZXN0X3BvcnQocG9ydCk7CisJfQorfQorCitzdGF0aWMgaW50CitscWFzY192ZXJpZnlfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAorCXN0cnVjdCBzZXJpYWxfc3RydWN0ICpzZXIpCit7CisJaW50IHJldCA9IDA7CisJaWYgKHNlci0+dHlwZSAhPSBQT1JUX1VOS05PV04gJiYgc2VyLT50eXBlICE9IFBPUlRfTFRRX0FTQykKKwkJcmV0ID0gLUVJTlZBTDsKKwlpZiAoc2VyLT5pcnEgPCAwIHx8IHNlci0+aXJxID49IE5SX0lSUVMpCisJCXJldCA9IC1FSU5WQUw7CisJaWYgKHNlci0+YmF1ZF9iYXNlIDwgOTYwMCkKKwkJcmV0ID0gLUVJTlZBTDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHVhcnRfb3BzIGxxYXNjX3BvcHMgPSB7CisJLnR4X2VtcHR5ID0JbHFhc2NfdHhfZW1wdHksCisJLnNldF9tY3RybCA9CWxxYXNjX3NldF9tY3RybCwKKwkuZ2V0X21jdHJsID0JbHFhc2NfZ2V0X21jdHJsLAorCS5zdG9wX3R4ID0JbHFhc2Nfc3RvcF90eCwKKwkuc3RhcnRfdHggPQlscWFzY19zdGFydF90eCwKKwkuc3RvcF9yeCA9CWxxYXNjX3N0b3BfcngsCisJLmVuYWJsZV9tcyA9CWxxYXNjX2VuYWJsZV9tcywKKwkuYnJlYWtfY3RsID0JbHFhc2NfYnJlYWtfY3RsLAorCS5zdGFydHVwID0JbHFhc2Nfc3RhcnR1cCwKKwkuc2h1dGRvd24gPQlscWFzY19zaHV0ZG93biwKKwkuc2V0X3Rlcm1pb3MgPQlscWFzY19zZXRfdGVybWlvcywKKwkudHlwZSA9CQlscWFzY190eXBlLAorCS5yZWxlYXNlX3BvcnQgPQlscWFzY19yZWxlYXNlX3BvcnQsCisJLnJlcXVlc3RfcG9ydCA9CWxxYXNjX3JlcXVlc3RfcG9ydCwKKwkuY29uZmlnX3BvcnQgPQlscWFzY19jb25maWdfcG9ydCwKKwkudmVyaWZ5X3BvcnQgPQlscWFzY192ZXJpZnlfcG9ydCwKK307CisKK3N0YXRpYyB2b2lkCitscWFzY19jb25zb2xlX3B1dGNoYXIoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50IGNoKQoreworCWludCBmaWZvZnJlZTsKKworCWlmICghcG9ydC0+bWVtYmFzZSkKKwkJcmV0dXJuOworCisJZG8geworCQlmaWZvZnJlZSA9IChsdHFfcjMyKHBvcnQtPm1lbWJhc2UgKyBMVFFfQVNDX0ZTVEFUKQorCQkJJiBBU0NGU1RBVF9UWEZSRUVNQVNLKSA+PiBBU0NGU1RBVF9UWEZSRUVPRkY7CisJfSB3aGlsZSAoZmlmb2ZyZWUgPT0gMCk7CisJbHRxX3c4KGNoLCBwb3J0LT5tZW1iYXNlICsgTFRRX0FTQ19UQlVGKTsKK30KKworCitzdGF0aWMgdm9pZAorbHFhc2NfY29uc29sZV93cml0ZShzdHJ1Y3QgY29uc29sZSAqY28sIGNvbnN0IGNoYXIgKnMsIHVfaW50IGNvdW50KQoreworCXN0cnVjdCBsdHFfdWFydF9wb3J0ICpsdHFfcG9ydDsKKwlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoY28tPmluZGV4ID49IE1BWFBPUlRTKQorCQlyZXR1cm47CisKKwlsdHFfcG9ydCA9IGxxYXNjX3BvcnRbY28tPmluZGV4XTsKKwlpZiAoIWx0cV9wb3J0KQorCQlyZXR1cm47CisKKwlwb3J0ID0gJmx0cV9wb3J0LT5wb3J0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmx0cV9hc2NfbG9jaywgZmxhZ3MpOworCXVhcnRfY29uc29sZV93cml0ZShwb3J0LCBzLCBjb3VudCwgbHFhc2NfY29uc29sZV9wdXRjaGFyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsdHFfYXNjX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBfX2luaXQKK2xxYXNjX2NvbnNvbGVfc2V0dXAoc3RydWN0IGNvbnNvbGUgKmNvLCBjaGFyICpvcHRpb25zKQoreworCXN0cnVjdCBsdHFfdWFydF9wb3J0ICpsdHFfcG9ydDsKKwlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0OworCWludCBiYXVkID0gMTE1MjAwOworCWludCBiaXRzID0gODsKKwlpbnQgcGFyaXR5ID0gJ24nOworCWludCBmbG93ID0gJ24nOworCisJaWYgKGNvLT5pbmRleCA+PSBNQVhQT1JUUykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlsdHFfcG9ydCA9IGxxYXNjX3BvcnRbY28tPmluZGV4XTsKKwlpZiAoIWx0cV9wb3J0KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBvcnQgPSAmbHRxX3BvcnQtPnBvcnQ7CisKKwlwb3J0LT51YXJ0Y2xrID0gY2xrX2dldF9yYXRlKGx0cV9wb3J0LT5jbGspOworCisJaWYgKG9wdGlvbnMpCisJCXVhcnRfcGFyc2Vfb3B0aW9ucyhvcHRpb25zLCAmYmF1ZCwgJnBhcml0eSwgJmJpdHMsICZmbG93KTsKKwlyZXR1cm4gdWFydF9zZXRfb3B0aW9ucyhwb3J0LCBjbywgYmF1ZCwgcGFyaXR5LCBiaXRzLCBmbG93KTsKK30KKworc3RhdGljIHN0cnVjdCBjb25zb2xlIGxxYXNjX2NvbnNvbGUgPSB7CisJLm5hbWUgPQkJInR0eUxUUSIsCisJLndyaXRlID0JbHFhc2NfY29uc29sZV93cml0ZSwKKwkuZGV2aWNlID0JdWFydF9jb25zb2xlX2RldmljZSwKKwkuc2V0dXAgPQlscWFzY19jb25zb2xlX3NldHVwLAorCS5mbGFncyA9CUNPTl9QUklOVEJVRkZFUiwKKwkuaW5kZXggPQktMSwKKwkuZGF0YSA9CQkmbHFhc2NfcmVnLAorfTsKKworc3RhdGljIGludCBfX2luaXQKK2xxYXNjX2NvbnNvbGVfaW5pdCh2b2lkKQoreworCXJlZ2lzdGVyX2NvbnNvbGUoJmxxYXNjX2NvbnNvbGUpOworCXJldHVybiAwOworfQorY29uc29sZV9pbml0Y2FsbChscWFzY19jb25zb2xlX2luaXQpOworCitzdGF0aWMgc3RydWN0IHVhcnRfZHJpdmVyIGxxYXNjX3JlZyA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkuZHJpdmVyX25hbWUgPQlEUlZOQU1FLAorCS5kZXZfbmFtZSA9CSJ0dHlMVFEiLAorCS5tYWpvciA9CTAsCisJLm1pbm9yID0JMCwKKwkubnIgPQkJTUFYUE9SVFMsCisJLmNvbnMgPQkJJmxxYXNjX2NvbnNvbGUsCit9OworCitzdGF0aWMgaW50IF9faW5pdAorbHFhc2NfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbHRxX3VhcnRfcG9ydCAqbHRxX3BvcnQ7CisJc3RydWN0IHVhcnRfcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1tcmVzLCAqaXJxcmVzOworCWludCB0eF9pcnEsIHJ4X2lycSwgZXJyX2lycTsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJaW50IHJldDsKKworCW1tcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpcnFyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOworCWlmICghbW1yZXMgfHwgIWlycXJlcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAocGRldi0+aWQgPj0gTUFYUE9SVFMpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAobHFhc2NfcG9ydFtwZGV2LT5pZF0gIT0gTlVMTCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgImZwaSIpOworCWlmIChJU19FUlIoY2xrKSkgeworCQlwcl9lcnIoImZhaWxlZCB0byBnZXQgZnBpIGNsa1xuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXR4X2lycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJ0eCIpOworCXJ4X2lycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJyeCIpOworCWVycl9pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAiZXJyIik7CisJaWYgKCh0eF9pcnEgPCAwKSB8IChyeF9pcnEgPCAwKSB8IChlcnJfaXJxIDwgMCkpCisJCXJldHVybiAtRU5PREVWOworCisJbHRxX3BvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbHRxX3VhcnRfcG9ydCksIEdGUF9LRVJORUwpOworCWlmICghbHRxX3BvcnQpCisJCXJldHVybiAtRU5PTUVNOworCisJcG9ydCA9ICZsdHFfcG9ydC0+cG9ydDsKKworCXBvcnQtPmlvdHlwZQk9IFNFUklBTF9JT19NRU07CisJcG9ydC0+ZmxhZ3MJPSBBU1lOQ19CT09UX0FVVE9DT05GIHwgVVBGX0lPUkVNQVA7CisJcG9ydC0+b3BzCT0gJmxxYXNjX3BvcHM7CisJcG9ydC0+Zmlmb3NpemUJPSAxNjsKKwlwb3J0LT50eXBlCT0gUE9SVF9MVFFfQVNDLAorCXBvcnQtPmxpbmUJPSBwZGV2LT5pZDsKKwlwb3J0LT5kZXYJPSAmcGRldi0+ZGV2OworCisJcG9ydC0+aXJxCT0gdHhfaXJxOyAvKiB1bnVzZWQsIGp1c3QgdG8gYmUgYmFja3dhcmQtY29tcGF0aWJlICovCisJcG9ydC0+bWFwYmFzZQk9IG1tcmVzLT5zdGFydDsKKworCWx0cV9wb3J0LT5jbGsJPSBjbGs7CisKKwlsdHFfcG9ydC0+dHhfaXJxID0gdHhfaXJxOworCWx0cV9wb3J0LT5yeF9pcnEgPSByeF9pcnE7CisJbHRxX3BvcnQtPmVycl9pcnEgPSBlcnJfaXJxOworCisJbHFhc2NfcG9ydFtwZGV2LT5pZF0gPSBsdHFfcG9ydDsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBsdHFfcG9ydCk7CisKKwlyZXQgPSB1YXJ0X2FkZF9vbmVfcG9ydCgmbHFhc2NfcmVnLCBwb3J0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGxxYXNjX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSBEUlZOQU1FLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworaW50IF9faW5pdAoraW5pdF9scWFzYyh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSB1YXJ0X3JlZ2lzdGVyX2RyaXZlcigmbHFhc2NfcmVnKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmxxYXNjX2RyaXZlciwgbHFhc2NfcHJvYmUpOworCWlmIChyZXQgIT0gMCkKKwkJdWFydF91bnJlZ2lzdGVyX2RyaXZlcigmbHFhc2NfcmVnKTsKKworCXJldHVybiByZXQ7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbHFhc2MpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkxhbnRpcSBzZXJpYWwgcG9ydCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdWlvL3Vpby5jIGIvZHJpdmVycy91aW8vdWlvLmMKaW5kZXggNTFmZTE3OS4uZDJlZmU4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91aW8vdWlvLmMKKysrIGIvZHJpdmVycy91aW8vdWlvLmMKQEAgLTM4MSw3ICszODEsMTMgQEAKIAkJCXJldHZhbCA9IC1FTk9NRU07CiAJCWdvdG8gZXhpdDsKIAl9Ci0JaWRldi0+bWlub3IgPSBpZCAmIE1BWF9JRF9NQVNLOworCWlmIChpZCA8IFVJT19NQVhfREVWSUNFUykgeworCQlpZGV2LT5taW5vciA9IGlkOworCX0gZWxzZSB7CisJCWRldl9lcnIoaWRldi0+ZGV2LCAidG9vIG1hbnkgdWlvIGRldmljZXNcbiIpOworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlpZHJfcmVtb3ZlKCZ1aW9faWRyLCBpZCk7CisJfQogZXhpdDoKIAltdXRleF91bmxvY2soJm1pbm9yX2xvY2spOwogCXJldHVybiByZXR2YWw7CkBAIC01ODcsMTQgKzU5MywxMiBAQAogCiBzdGF0aWMgaW50IHVpb19maW5kX21lbV9pbmRleChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlpbnQgbWk7CiAJc3RydWN0IHVpb19kZXZpY2UgKmlkZXYgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKIAotCWZvciAobWkgPSAwOyBtaSA8IE1BWF9VSU9fTUFQUzsgbWkrKykgewotCQlpZiAoaWRldi0+aW5mby0+bWVtW21pXS5zaXplID09IDApCisJaWYgKHZtYS0+dm1fcGdvZmYgPCBNQVhfVUlPX01BUFMpIHsKKwkJaWYgKGlkZXYtPmluZm8tPm1lbVt2bWEtPnZtX3Bnb2ZmXS5zaXplID09IDApCiAJCQlyZXR1cm4gLTE7Ci0JCWlmICh2bWEtPnZtX3Bnb2ZmID09IG1pKQotCQkJcmV0dXJuIG1pOworCQlyZXR1cm4gKGludCl2bWEtPnZtX3Bnb2ZmOwogCX0KIAlyZXR1cm4gLTE7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Vpby91aW9fbmV0eC5jIGIvZHJpdmVycy91aW8vdWlvX25ldHguYwppbmRleCA1ZmZkYjQ4Li5hODc5ZmQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Vpby91aW9fbmV0eC5jCisrKyBiL2RyaXZlcnMvdWlvL3Vpb19uZXR4LmMKQEAgLTE4LDYgKzE4LDkgQEAKIAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX0hJTFNDSEVSCQkweDE1Q0YKICNkZWZpbmUgUENJX0RFVklDRV9JRF9ISUxTQ0hFUl9ORVRYCTB4MDAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0hJTFNDSEVSX05FVFBMQwkweDAwMTAKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9ORVRQTENfUkFNCTB4MDAwMAorI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX05FVFBMQ19GTEFTSAkweDAwMDEKICNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9OWFNCX1BDQQkweDMyMzUKICNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9OWFBDQQkJMHgzMzM1CiAKQEAgLTY2LDYgKzY5LDEwIEBACiAJCWJhciA9IDA7CiAJCWluZm8tPm5hbWUgPSAibmV0eCI7CiAJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9ISUxTQ0hFUl9ORVRQTEM6CisJCWJhciA9IDA7CisJCWluZm8tPm5hbWUgPSAibmV0cGxjIjsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYmFyID0gMjsKIAkJaW5mby0+bmFtZSA9ICJuZXR4X3BseCI7CkBAIC0xMzQsNiArMTQxLDE4IEBACiAJCS5zdWJkZXZpY2UgPQkwLAogCX0sCiAJeworCQkudmVuZG9yID0gICAgICAgUENJX1ZFTkRPUl9JRF9ISUxTQ0hFUiwKKwkJLmRldmljZSA9ICAgICAgIFBDSV9ERVZJQ0VfSURfSElMU0NIRVJfTkVUUExDLAorCQkuc3VidmVuZG9yID0gICAgUENJX1ZFTkRPUl9JRF9ISUxTQ0hFUiwKKwkJLnN1YmRldmljZSA9ICAgIFBDSV9TVUJERVZJQ0VfSURfTkVUUExDX1JBTSwKKwl9LAorCXsKKwkJLnZlbmRvciA9ICAgICAgIFBDSV9WRU5ET1JfSURfSElMU0NIRVIsCisJCS5kZXZpY2UgPSAgICAgICBQQ0lfREVWSUNFX0lEX0hJTFNDSEVSX05FVFBMQywKKwkJLnN1YnZlbmRvciA9ICAgIFBDSV9WRU5ET1JfSURfSElMU0NIRVIsCisJCS5zdWJkZXZpY2UgPSAgICBQQ0lfU1VCREVWSUNFX0lEX05FVFBMQ19GTEFTSCwKKwl9LAorCXsKIAkJLnZlbmRvciA9CVBDSV9WRU5ET1JfSURfUExYLAogCQkuZGV2aWNlID0JUENJX0RFVklDRV9JRF9QTFhfOTAzMCwKIAkJLnN1YnZlbmRvciA9CVBDSV9WRU5ET1JfSURfUExYLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91aW8vdWlvX3BkcnZfZ2VuaXJxLmMgYi9kcml2ZXJzL3Vpby91aW9fcGRydl9nZW5pcnEuYwppbmRleCA3MTc0ZDUxLi4wZjQyNGFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Vpby91aW9fcGRydl9nZW5pcnEuYworKysgYi9kcml2ZXJzL3Vpby91aW9fcGRydl9nZW5pcnEuYwpAQCAtMTg5LDYgKzE4OSwxMCBAQAogCiAJdWlvX3VucmVnaXN0ZXJfZGV2aWNlKHByaXYtPnVpb2luZm8pOwogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKKworCXByaXYtPnVpb2luZm8tPmhhbmRsZXIgPSBOVUxMOworCXByaXYtPnVpb2luZm8tPmlycWNvbnRyb2wgPSBOVUxMOworCiAJa2ZyZWUocHJpdik7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmMgYi9kcml2ZXJzL3Zob3N0L3Zob3N0LmMKaW5kZXggMmFiMjkxMi4uN2FhNGVlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aG9zdC92aG9zdC5jCisrKyBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuYwpAQCAtNCw3ICs0LDcgQEAKICAqIEF1dGhvcjogTWljaGFlbCBTLiBUc2lya2luIDxtc3RAcmVkaGF0LmNvbT4KICAqCiAgKiBJbnNwaXJhdGlvbiwgc29tZSBjb2RlLCBhbmQgbW9zdCB3aXR0eSBjb21tZW50cyBjb21lIGZyb20KLSAqIERvY3VtZW50YXRpb24vbGd1ZXN0L2xndWVzdC5jLCBieSBSdXN0eSBSdXNzZWxsCisgKiBEb2N1bWVudGF0aW9uL3ZpcnR1YWwvbGd1ZXN0L2xndWVzdC5jLCBieSBSdXN0eSBSdXNzZWxsCiAgKgogICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyLgogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXRhZmIuYyBiL2RyaXZlcnMvdmlkZW8vYXRhZmIuYwppbmRleCA1YjJiNWVmLi42NGU0MWY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0YWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9hdGFmYi5jCkBAIC0zMTE3LDcgKzMxMTcsNyBAQAogCQkJYXRhZmJfb3BzLmZiX3NldGNvbHJlZyA9ICZmYWxjb25fc2V0Y29scmVnOwogCQkJZXJyb3IgPSByZXF1ZXN0X2lycShJUlFfQVVUT180LCBmYWxjb25fdmJsX3N3aXRjaGVyLAogCQkJCQkgICAgSVJRX1RZUEVfUFJJTywKLQkJCQkJICAgICJmcmFtZWJ1ZmZlci9tb2Rlc3dpdGNoIiwKKwkJCQkJICAgICJmcmFtZWJ1ZmZlcjptb2Rlc3dpdGNoIiwKIAkJCQkJICAgIGZhbGNvbl92Ymxfc3dpdGNoZXIpOwogCQkJaWYgKGVycm9yKQogCQkJCXJldHVybiBlcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZyBiL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZwppbmRleCAxYjBmOThiLi4wMjJmOWViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL0tjb25maWcKKysrIGIvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnCkBAIC05OTAsNiArOTkwLDEyIEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbG9hZGFibGUgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLgogCSAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBiY202M3h4X3dkdC4KIAorY29uZmlnIExBTlRJUV9XRFQKKwl0cmlzdGF0ZSAiTGFudGlxIFNvQyB3YXRjaGRvZyIKKwlkZXBlbmRzIG9uIExBTlRJUQorCWhlbHAKKwkgIEhhcmR3YXJlIGRyaXZlciBmb3IgdGhlIExhbnRpcSBTb0MgV2F0Y2hkb2cgVGltZXIuCisKICMgUEFSSVNDIEFyY2hpdGVjdHVyZQogCiAjIFBPV0VSUEMgQXJjaGl0ZWN0dXJlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL01ha2VmaWxlIGIvZHJpdmVycy93YXRjaGRvZy9NYWtlZmlsZQppbmRleCAzZjg2MDhiLi5lZDI2ZjcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvTWFrZWZpbGUKQEAgLTEyMyw2ICsxMjMsNyBAQAogb2JqLSQoQ09ORklHX1RYWDlfV0RUKSArPSB0eHg5d2R0Lm8KIG9iai0kKENPTkZJR19PQ1RFT05fV0RUKSArPSBvY3Rlb24td2R0Lm8KIG9jdGVvbi13ZHQteSA6PSBvY3Rlb24td2R0LW1haW4ubyBvY3Rlb24td2R0LW5taS5vCitvYmotJChDT05GSUdfTEFOVElRX1dEVCkgKz0gbGFudGlxX3dkdC5vCiAKICMgUEFSSVNDIEFyY2hpdGVjdHVyZQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2xhbnRpcV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvbGFudGlxX3dkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkODJhZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3dhdGNoZG9nL2xhbnRpcV93ZHQuYwpAQCAtMCwwICsxLDI2MSBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAorICogIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBKb2huIENyaXNwaW4gPGJsb2dpY0BvcGVud3J0Lm9yZz4KKyAqICBCYXNlZCBvbiBFUDkzeHggd2R0IGRyaXZlcgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8bGFudGlxLmg+CisKKy8qIFNlY3Rpb24gMy40IG9mIHRoZSBkYXRhc2hlZXQKKyAqIFRoZSBwYXNzd29yZCBzZXF1ZW5jZSBwcm90ZWN0cyB0aGUgV0RUIGNvbnRyb2wgcmVnaXN0ZXIgZnJvbSB1bmludGVuZGVkCisgKiB3cml0ZSBhY3Rpb25zLCB3aGljaCBtaWdodCBjYXVzZSBtYWxmdW5jdGlvbiBvZiB0aGUgV0RULgorICoKKyAqIGVzc2VudGlhbGx5IHRoZSBmb2xsb3dpbmcgdHdvIG1hZ2ljIHBhc3N3b3JkcyBuZWVkIHRvIGJlIHdyaXR0ZW4gdG8gYWxsb3cKKyAqIElPIGFjY2VzcyB0byB0aGUgV0RUIGNvcmUKKyAqLworI2RlZmluZSBMVFFfV0RUX1BXMQkJMHgwMEJFMDAwMAorI2RlZmluZSBMVFFfV0RUX1BXMgkJMHgwMERDMDAwMAorCisjZGVmaW5lIExUUV9XRFRfQ1IJCTB4MAkvKiB3YXRjaGRvZyBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIExUUV9XRFRfU1IJCTB4OAkvKiB3YXRjaGRvZyBzdGF0dXMgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBMVFFfV0RUX1NSX0VOCQkoMHgxIDw8IDMxKQkvKiBlbmFibGUgYml0ICovCisjZGVmaW5lIExUUV9XRFRfU1JfUFdECQkoMHgzIDw8IDI2KQkvKiB0dXJuIG9uIHBvd2VyICovCisjZGVmaW5lIExUUV9XRFRfU1JfQ0xLRElWCSgweDMgPDwgMjQpCS8qIHR1cm4gb24gY2xvY2sgYW5kIHNldCAqLworCQkJCQkJLyogZGl2aWRlciB0byAweDQwMDAwICovCisjZGVmaW5lIExUUV9XRFRfRElWSURFUgkJMHg0MDAwMAorI2RlZmluZSBMVFFfTUFYX1RJTUVPVVQJCSgoMSA8PCAxNikgLSAxKQkvKiB0aGUgcmVsb2FkIGZpZWxkIGlzIDE2IGJpdCAqLworCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gV0FUQ0hET0dfTk9XQVlPVVQ7CisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKmx0cV93ZHRfbWVtYmFzZTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGx0cV9pb19yZWdpb25fY2xrX3JhdGU7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGx0cV93ZHRfYm9vdHN0YXR1czsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGx0cV93ZHRfaW5fdXNlOworc3RhdGljIGludCBsdHFfd2R0X3RpbWVvdXQgPSAzMDsKK3N0YXRpYyBpbnQgbHRxX3dkdF9va190b19jbG9zZTsKKworc3RhdGljIHZvaWQKK2x0cV93ZHRfZW5hYmxlKHZvaWQpCit7CisJbHRxX3dkdF90aW1lb3V0ID0gbHRxX3dkdF90aW1lb3V0ICoKKwkJCShsdHFfaW9fcmVnaW9uX2Nsa19yYXRlIC8gTFRRX1dEVF9ESVZJREVSKSArIDB4MTAwMDsKKwlpZiAobHRxX3dkdF90aW1lb3V0ID4gTFRRX01BWF9USU1FT1VUKQorCQlsdHFfd2R0X3RpbWVvdXQgPSBMVFFfTUFYX1RJTUVPVVQ7CisKKwkvKiB3cml0ZSB0aGUgZmlyc3QgcGFzc3dvcmQgbWFnaWMgKi8KKwlsdHFfdzMyKExUUV9XRFRfUFcxLCBsdHFfd2R0X21lbWJhc2UgKyBMVFFfV0RUX0NSKTsKKwkvKiB3cml0ZSB0aGUgc2Vjb25kIG1hZ2ljIHBsdXMgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIG5ldyB0aW1lb3V0ICovCisJbHRxX3czMihMVFFfV0RUX1NSX0VOIHwgTFRRX1dEVF9TUl9QV0QgfCBMVFFfV0RUX1NSX0NMS0RJViB8CisJCUxUUV9XRFRfUFcyIHwgbHRxX3dkdF90aW1lb3V0LCBsdHFfd2R0X21lbWJhc2UgKyBMVFFfV0RUX0NSKTsKK30KKworc3RhdGljIHZvaWQKK2x0cV93ZHRfZGlzYWJsZSh2b2lkKQoreworCS8qIHdyaXRlIHRoZSBmaXJzdCBwYXNzd29yZCBtYWdpYyAqLworCWx0cV93MzIoTFRRX1dEVF9QVzEsIGx0cV93ZHRfbWVtYmFzZSArIExUUV9XRFRfQ1IpOworCS8qIHdyaXRlIHRoZSBzZWNvbmQgcGFzc3dvcmQgbWFnaWMgd2l0aCBubyBjb25maWcKKwkgKiB0aGlzIHR1cm5zIHRoZSB3YXRjaGRvZyBvZmYKKwkgKi8KKwlsdHFfdzMyKExUUV9XRFRfUFcyLCBsdHFfd2R0X21lbWJhc2UgKyBMVFFfV0RUX0NSKTsKK30KKworc3RhdGljIHNzaXplX3QKK2x0cV93ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLAorCQlzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJaWYgKGxlbikgeworCQlpZiAoIW5vd2F5b3V0KSB7CisJCQlzaXplX3QgaTsKKworCQkJbHRxX3dkdF9va190b19jbG9zZSA9IDA7CisJCQlmb3IgKGkgPSAwOyBpICE9IGxlbjsgaSsrKSB7CisJCQkJY2hhciBjOworCisJCQkJaWYgKGdldF91c2VyKGMsIGRhdGEgKyBpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQlsdHFfd2R0X29rX3RvX2Nsb3NlID0gMTsKKwkJCQllbHNlCisJCQkJCWx0cV93ZHRfb2tfdG9fY2xvc2UgPSAwOworCQkJfQorCQl9CisJCWx0cV93ZHRfZW5hYmxlKCk7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCS5vcHRpb25zID0gV0RJT0ZfTUFHSUNDTE9TRSB8IFdESU9GX1NFVFRJTUVPVVQgfCBXRElPRl9LRUVQQUxJVkVQSU5HIHwKKwkJCVdESU9GX0NBUkRSRVNFVCwKKwkuaWRlbnRpdHkgPSAibHRxX3dkdCIsCit9OworCitzdGF0aWMgbG9uZworbHRxX3dkdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJldCA9IC1FTk9UVFk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJcmV0ID0gY29weV90b191c2VyKChzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBfX3VzZXIgKilhcmcsICZpZGVudCwKKwkJCQlzaXplb2YoaWRlbnQpKSA/IC1FRkFVTFQgOiAwOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJcmV0ID0gcHV0X3VzZXIobHRxX3dkdF9ib290c3RhdHVzLCAoaW50IF9fdXNlciAqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJCXJldCA9IHB1dF91c2VyKDAsIChpbnQgX191c2VyICopYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCXJldCA9IGdldF91c2VyKGx0cV93ZHRfdGltZW91dCwgKGludCBfX3VzZXIgKilhcmcpOworCQlpZiAoIXJldCkKKwkJCWx0cV93ZHRfZW5hYmxlKCk7CisJCS8qIGludGVudGlvbmFsIGRyb3AgdGhyb3VnaCAqLworCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJcmV0ID0gcHV0X3VzZXIobHRxX3dkdF90aW1lb3V0LCAoaW50IF9fdXNlciAqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCWx0cV93ZHRfZW5hYmxlKCk7CisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitsdHFfd2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmx0cV93ZHRfaW5fdXNlKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwlsdHFfd2R0X2luX3VzZSA9IDE7CisJbHRxX3dkdF9lbmFibGUoKTsKKworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludAorbHRxX3dkdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChsdHFfd2R0X29rX3RvX2Nsb3NlKQorCQlsdHFfd2R0X2Rpc2FibGUoKTsKKwllbHNlCisJCXByX2VycigibHRxX3dkdDogd2F0Y2hkb2cgY2xvc2VkIHdpdGhvdXQgd2FybmluZ1xuIik7CisJbHRxX3dkdF9va190b19jbG9zZSA9IDA7CisJY2xlYXJfYml0KDAsICZsdHFfd2R0X2luX3VzZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbHRxX3dkdF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkud3JpdGUJCT0gbHRxX3dkdF93cml0ZSwKKwkudW5sb2NrZWRfaW9jdGwJPSBsdHFfd2R0X2lvY3RsLAorCS5vcGVuCQk9IGx0cV93ZHRfb3BlbiwKKwkucmVsZWFzZQk9IGx0cV93ZHRfcmVsZWFzZSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBsdHFfd2R0X21pc2NkZXYgPSB7CisJLm1pbm9yCT0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUJPSAid2F0Y2hkb2ciLAorCS5mb3BzCT0gJmx0cV93ZHRfZm9wcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0CitsdHFfd2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXN0cnVjdCBjbGsgKmNsazsKKworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBvYnRhaW4gSS9PIG1lbW9yeSByZWdpb24iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCXJlcyA9IGRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCisJCXJlc291cmNlX3NpemUocmVzKSwgZGV2X25hbWUoJnBkZXYtPmRldikpOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCByZXF1ZXN0IEkvTyBtZW1vcnkgcmVnaW9uIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWx0cV93ZHRfbWVtYmFzZSA9IGRldm1faW9yZW1hcF9ub2NhY2hlKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCisJCXJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFsdHFfd2R0X21lbWJhc2UpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IHJlbWFwIEkvTyBtZW1vcnkgcmVnaW9uXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogd2UgZG8gbm90IG5lZWQgdG8gZW5hYmxlIHRoZSBjbG9jayBhcyBpdCBpcyBhbHdheXMgcnVubmluZyAqLworCWNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgImlvIik7CisJV0FSTl9PTighY2xrKTsKKwlsdHFfaW9fcmVnaW9uX2Nsa19yYXRlID0gY2xrX2dldF9yYXRlKGNsayk7CisJY2xrX3B1dChjbGspOworCisJaWYgKGx0cV9yZXNldF9jYXVzZSgpID09IExUUV9SU1RfQ0FVU0VfV0RUUlNUKQorCQlsdHFfd2R0X2Jvb3RzdGF0dXMgPSBXRElPRl9DQVJEUkVTRVQ7CisKKwlyZXR1cm4gbWlzY19yZWdpc3RlcigmbHRxX3dkdF9taXNjZGV2KTsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQKK2x0cV93ZHRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZsdHFfd2R0X21pc2NkZXYpOworCisJaWYgKGx0cV93ZHRfbWVtYmFzZSkKKwkJaW91bm1hcChsdHFfd2R0X21lbWJhc2UpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbHRxX3dkdF9kcml2ZXIgPSB7CisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGx0cV93ZHRfcmVtb3ZlKSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJsdHFfd2R0IiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0Citpbml0X2x0cV93ZHQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZsdHFfd2R0X2RyaXZlciwgbHRxX3dkdF9wcm9iZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorZXhpdF9sdHFfd2R0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZsdHFfd2R0X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbHRxX3dkdCk7Cittb2R1bGVfZXhpdChleGl0X2x0cV93ZHQpOworCittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIik7CisKK01PRFVMRV9BVVRIT1IoIkpvaG4gQ3Jpc3BpbiA8YmxvZ2ljQG9wZW53cnQub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMYW50aXEgU29DIFdhdGNoZG9nIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL210eC0xX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9tdHgtMV93ZHQuYwppbmRleCA1ZWM1YWMxLi4xNDc5ZGM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL210eC0xX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvbXR4LTFfd2R0LmMKQEAgLTY2LDYgKzY2LDcgQEAKIAlpbnQgZGVmYXVsdF90aWNrczsKIAl1bnNpZ25lZCBsb25nIGludXNlOwogCXVuc2lnbmVkIGdwaW87CisJaW50IGdzdGF0ZTsKIH0gbXR4MV93ZHRfZGV2aWNlOwogCiBzdGF0aWMgdm9pZCBtdHgxX3dkdF90cmlnZ2VyKHVuc2lnbmVkIGxvbmcgdW51c2VkKQpAQCAtNzUsMTMgKzc2LDEzIEBACiAJc3Bpbl9sb2NrKCZtdHgxX3dkdF9kZXZpY2UubG9jayk7CiAJaWYgKG10eDFfd2R0X2RldmljZS5ydW5uaW5nKQogCQl0aWNrcy0tOwotCS8qCi0JICogdG9nZ2xlIEdQSU8yXzE1Ci0JICovCi0JdG1wID0gYXVfcmVhZGwoR1BJTzJfRElSKTsKLQl0bXAgPSAodG1wICYgfigxIDw8IG10eDFfd2R0X2RldmljZS5ncGlvKSkgfAotCSAgICAgICgofnRtcCkgJiAoMSA8PCBtdHgxX3dkdF9kZXZpY2UuZ3BpbykpOwotCWF1X3dyaXRlbCh0bXAsIEdQSU8yX0RJUik7CisKKwkvKiB0b2dnbGUgd2R0IGdwaW8gKi8KKwltdHgxX3dkdF9kZXZpY2UuZ3N0YXRlID0gfm10eDFfd2R0X2RldmljZS5nc3RhdGU7CisJaWYgKG10eDFfd2R0X2RldmljZS5nc3RhdGUpCisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChtdHgxX3dkdF9kZXZpY2UuZ3BpbywgMSk7CisJZWxzZQorCQlncGlvX2RpcmVjdGlvbl9pbnB1dChtdHgxX3dkdF9kZXZpY2UuZ3Bpbyk7CiAKIAlpZiAobXR4MV93ZHRfZGV2aWNlLnF1ZXVlICYmIHRpY2tzKQogCQltb2RfdGltZXIoJm10eDFfd2R0X2RldmljZS50aW1lciwgamlmZmllcyArIE1UWDFfV0RUX0lOVEVSVkFMKTsKQEAgLTEwMyw3ICsxMDQsOCBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZtdHgxX3dkdF9kZXZpY2UubG9jaywgZmxhZ3MpOwogCWlmICghbXR4MV93ZHRfZGV2aWNlLnF1ZXVlKSB7CiAJCW10eDFfd2R0X2RldmljZS5xdWV1ZSA9IDE7Ci0JCWdwaW9fc2V0X3ZhbHVlKG10eDFfd2R0X2RldmljZS5ncGlvLCAxKTsKKwkJbXR4MV93ZHRfZGV2aWNlLmdzdGF0ZSA9IDE7CisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChtdHgxX3dkdF9kZXZpY2UuZ3BpbywgMSk7CiAJCW1vZF90aW1lcigmbXR4MV93ZHRfZGV2aWNlLnRpbWVyLCBqaWZmaWVzICsgTVRYMV9XRFRfSU5URVJWQUwpOwogCX0KIAltdHgxX3dkdF9kZXZpY2UucnVubmluZysrOwpAQCAtMTE3LDcgKzExOSw4IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJm10eDFfd2R0X2RldmljZS5sb2NrLCBmbGFncyk7CiAJaWYgKG10eDFfd2R0X2RldmljZS5xdWV1ZSkgewogCQltdHgxX3dkdF9kZXZpY2UucXVldWUgPSAwOwotCQlncGlvX3NldF92YWx1ZShtdHgxX3dkdF9kZXZpY2UuZ3BpbywgMCk7CisJCW10eDFfd2R0X2RldmljZS5nc3RhdGUgPSAwOworCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQobXR4MV93ZHRfZGV2aWNlLmdwaW8sIDApOwogCX0KIAl0aWNrcyA9IG10eDFfd2R0X2RldmljZS5kZWZhdWx0X3RpY2tzOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm10eDFfd2R0X2RldmljZS5sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9NYWtlZmlsZSBiL2RyaXZlcnMveGVuL01ha2VmaWxlCmluZGV4IGY0MjBmMWYuLjQ3ODFmODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL01ha2VmaWxlCisrKyBiL2RyaXZlcnMveGVuL01ha2VmaWxlCkBAIC00LDIxICs0LDIxIEBACiBub3N0YWNrcCA6PSAkKGNhbGwgY2Mtb3B0aW9uLCAtZm5vLXN0YWNrLXByb3RlY3RvcikKIENGTEFHU19mZWF0dXJlcy5vCQkJOj0gJChub3N0YWNrcCkKIAotb2JqLSQoQ09ORklHX0JMT0NLKQkJKz0gYmlvbWVyZ2Uubwotb2JqLSQoQ09ORklHX0hPVFBMVUdfQ1BVKQkrPSBjcHVfaG90cGx1Zy5vCi1vYmotJChDT05GSUdfWEVOX1hFTkNPTU0pCSs9IHhlbmNvbW0ubwotb2JqLSQoQ09ORklHX1hFTl9CQUxMT09OKQkrPSB4ZW4tYmFsbG9vbi5vCi1vYmotJChDT05GSUdfWEVOX0RFVl9FVlRDSE4pCSs9IHhlbi1ldnRjaG4ubwotb2JqLSQoQ09ORklHX1hFTl9HTlRERVYpCSs9IHhlbi1nbnRkZXYubworb2JqLSQoQ09ORklHX0JMT0NLKQkJCSs9IGJpb21lcmdlLm8KK29iai0kKENPTkZJR19IT1RQTFVHX0NQVSkJCSs9IGNwdV9ob3RwbHVnLm8KK29iai0kKENPTkZJR19YRU5fWEVOQ09NTSkJCSs9IHhlbmNvbW0ubworb2JqLSQoQ09ORklHX1hFTl9CQUxMT09OKQkJKz0geGVuLWJhbGxvb24ubworb2JqLSQoQ09ORklHX1hFTl9ERVZfRVZUQ0hOKQkJKz0geGVuLWV2dGNobi5vCitvYmotJChDT05GSUdfWEVOX0dOVERFVikJCSs9IHhlbi1nbnRkZXYubwogb2JqLSQoQ09ORklHX1hFTl9HUkFOVF9ERVZfQUxMT0MpCSs9IHhlbi1nbnRhbGxvYy5vCi1vYmotJChDT05GSUdfWEVORlMpCQkrPSB4ZW5mcy8KK29iai0kKENPTkZJR19YRU5GUykJCQkrPSB4ZW5mcy8KIG9iai0kKENPTkZJR19YRU5fU1lTX0hZUEVSVklTT1IpCSs9IHN5cy1oeXBlcnZpc29yLm8KLW9iai0kKENPTkZJR19YRU5fUExBVEZPUk1fUENJKQkrPSB4ZW4tcGxhdGZvcm0tcGNpLm8KLW9iai0kKENPTkZJR19TV0lPVExCX1hFTikJKz0gc3dpb3RsYi14ZW4ubwotb2JqLSQoQ09ORklHX1hFTl9ET00wKQkJKz0gcGNpLm8KK29iai0kKENPTkZJR19YRU5fUExBVEZPUk1fUENJKQkJKz0geGVuLXBsYXRmb3JtLXBjaS5vCitvYmotJChDT05GSUdfU1dJT1RMQl9YRU4pCQkrPSBzd2lvdGxiLXhlbi5vCitvYmotJChDT05GSUdfWEVOX0RPTTApCQkJKz0gcGNpLm8KIAoteGVuLWV2dGNobi15CQkJOj0gZXZ0Y2huLm8KK3hlbi1ldnRjaG4teQkJCQk6PSBldnRjaG4ubwogeGVuLWdudGRldi15CQkJCTo9IGdudGRldi5vCiB4ZW4tZ250YWxsb2MteQkJCQk6PSBnbnRhbGxvYy5vCiAKLXhlbi1wbGF0Zm9ybS1wY2kteQkJOj0gcGxhdGZvcm0tcGNpLm8KK3hlbi1wbGF0Zm9ybS1wY2kteQkJCTo9IHBsYXRmb3JtLXBjaS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9iYWxsb29uLmMgYi9kcml2ZXJzL3hlbi9iYWxsb29uLmMKaW5kZXggMDQzYWY4YS4uZjU0MjkwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vYmFsbG9vbi5jCisrKyBiL2RyaXZlcnMveGVuL2JhbGxvb24uYwpAQCAtMTE0LDcgKzExNCw2IEBACiAJaWYgKFBhZ2VIaWdoTWVtKHBhZ2UpKSB7CiAJCWxpc3RfYWRkX3RhaWwoJnBhZ2UtPmxydSwgJmJhbGxvb25lZF9wYWdlcyk7CiAJCWJhbGxvb25fc3RhdHMuYmFsbG9vbl9oaWdoKys7Ci0JCWRlY190b3RhbGhpZ2hfcGFnZXMoKTsKIAl9IGVsc2UgewogCQlsaXN0X2FkZCgmcGFnZS0+bHJ1LCAmYmFsbG9vbmVkX3BhZ2VzKTsKIAkJYmFsbG9vbl9zdGF0cy5iYWxsb29uX2xvdysrOwpAQCAtMTI0LDYgKzEyMyw4IEBACiBzdGF0aWMgdm9pZCBiYWxsb29uX2FwcGVuZChzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlfX2JhbGxvb25fYXBwZW5kKHBhZ2UpOworCWlmIChQYWdlSGlnaE1lbShwYWdlKSkKKwkJZGVjX3RvdGFsaGlnaF9wYWdlcygpOwogCXRvdGFscmFtX3BhZ2VzLS07CiB9CiAKQEAgLTE5Myw3ICsxOTQsNyBAQAogCXJldHVybiBCUF9FQUdBSU47CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGN1cnJlbnRfdGFyZ2V0KHZvaWQpCitzdGF0aWMgbG9uZyBjdXJyZW50X2NyZWRpdCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgdGFyZ2V0ID0gYmFsbG9vbl9zdGF0cy50YXJnZXRfcGFnZXM7CiAKQEAgLTIwMiw3ICsyMDMsNyBAQAogCQkgICAgIGJhbGxvb25fc3RhdHMuYmFsbG9vbl9sb3cgKwogCQkgICAgIGJhbGxvb25fc3RhdHMuYmFsbG9vbl9oaWdoKTsKIAotCXJldHVybiB0YXJnZXQ7CisJcmV0dXJuIHRhcmdldCAtIGJhbGxvb25fc3RhdHMuY3VycmVudF9wYWdlczsKIH0KIAogc3RhdGljIGVudW0gYnBfc3RhdGUgaW5jcmVhc2VfcmVzZXJ2YXRpb24odW5zaWduZWQgbG9uZyBucl9wYWdlcykKQEAgLTI0Niw3ICsyNDcsNyBAQAogCQlzZXRfcGh5c190b19tYWNoaW5lKHBmbiwgZnJhbWVfbGlzdFtpXSk7CiAKIAkJLyogTGluayBiYWNrIGludG8gdGhlIHBhZ2UgdGFibGVzIGlmIG5vdCBoaWdobWVtLiAqLwotCQlpZiAoIXhlbl9odm1fZG9tYWluKCkgJiYgcGZuIDwgbWF4X2xvd19wZm4pIHsKKwkJaWYgKHhlbl9wdl9kb21haW4oKSAmJiAhUGFnZUhpZ2hNZW0ocGFnZSkpIHsKIAkJCWludCByZXQ7CiAJCQlyZXQgPSBIWVBFUlZJU09SX3VwZGF0ZV92YV9tYXBwaW5nKAogCQkJCSh1bnNpZ25lZCBsb25nKV9fdmEocGZuIDw8IFBBR0VfU0hJRlQpLApAQCAtMjkzLDcgKzI5NCw3IEBACiAKIAkJc2NydWJfcGFnZShwYWdlKTsKIAotCQlpZiAoIXhlbl9odm1fZG9tYWluKCkgJiYgIVBhZ2VIaWdoTWVtKHBhZ2UpKSB7CisJCWlmICh4ZW5fcHZfZG9tYWluKCkgJiYgIVBhZ2VIaWdoTWVtKHBhZ2UpKSB7CiAJCQlyZXQgPSBIWVBFUlZJU09SX3VwZGF0ZV92YV9tYXBwaW5nKAogCQkJCSh1bnNpZ25lZCBsb25nKV9fdmEocGZuIDw8IFBBR0VfU0hJRlQpLAogCQkJCV9fcHRlX21hKDApLCAwKTsKQEAgLTMzNyw3ICszMzgsNyBAQAogCW11dGV4X2xvY2soJmJhbGxvb25fbXV0ZXgpOwogCiAJZG8gewotCQljcmVkaXQgPSBjdXJyZW50X3RhcmdldCgpIC0gYmFsbG9vbl9zdGF0cy5jdXJyZW50X3BhZ2VzOworCQljcmVkaXQgPSBjdXJyZW50X2NyZWRpdCgpOwogCiAJCWlmIChjcmVkaXQgPiAwKQogCQkJc3RhdGUgPSBpbmNyZWFzZV9yZXNlcnZhdGlvbihjcmVkaXQpOwpAQCAtNDIwLDcgKzQyMSw3IEBACiAJfQogCiAJLyogVGhlIGJhbGxvb24gbWF5IGJlIHRvbyBsYXJnZSBub3cuIFNocmluayBpdCBpZiBuZWVkZWQuICovCi0JaWYgKGN1cnJlbnRfdGFyZ2V0KCkgIT0gYmFsbG9vbl9zdGF0cy5jdXJyZW50X3BhZ2VzKQorCWlmIChjdXJyZW50X2NyZWRpdCgpKQogCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmJhbGxvb25fd29ya2VyLCAwKTsKIAogCW11dGV4X3VubG9jaygmYmFsbG9vbl9tdXRleCk7CkBAIC00MjksNyArNDMwLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgYmFsbG9vbl9pbml0KHZvaWQpCiB7Ci0gCXVuc2lnbmVkIGxvbmcgcGZuLCBucl9wYWdlcywgZXh0cmFfcGZuX2VuZDsKKwl1bnNpZ25lZCBsb25nIHBmbiwgZXh0cmFfcGZuX2VuZDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAogCWlmICgheGVuX2RvbWFpbigpKQpAQCAtNDM3LDExICs0MzgsNyBAQAogCiAJcHJfaW5mbygieGVuL2JhbGxvb246IEluaXRpYWxpc2luZyBiYWxsb29uIGRyaXZlci5cbiIpOwogCi0gCWlmICh4ZW5fcHZfZG9tYWluKCkpCi0gCQlucl9wYWdlcyA9IHhlbl9zdGFydF9pbmZvLT5ucl9wYWdlczsKLSAJZWxzZQotIAkJbnJfcGFnZXMgPSBtYXhfcGZuOwotIAliYWxsb29uX3N0YXRzLmN1cnJlbnRfcGFnZXMgPSBtaW4obnJfcGFnZXMsIG1heF9wZm4pOworCWJhbGxvb25fc3RhdHMuY3VycmVudF9wYWdlcyA9IHhlbl9wdl9kb21haW4oKSA/IG1pbih4ZW5fc3RhcnRfaW5mby0+bnJfcGFnZXMsIG1heF9wZm4pIDogbWF4X3BmbjsKIAliYWxsb29uX3N0YXRzLnRhcmdldF9wYWdlcyAgPSBiYWxsb29uX3N0YXRzLmN1cnJlbnRfcGFnZXM7CiAJYmFsbG9vbl9zdGF0cy5iYWxsb29uX2xvdyAgID0gMDsKIAliYWxsb29uX3N0YXRzLmJhbGxvb25faGlnaCAgPSAwOwpAQCAtNDY2LDcgKzQ2Myw3IEBACiAJICAgICBwZm4gPCBleHRyYV9wZm5fZW5kOwogCSAgICAgcGZuKyspIHsKIAkJcGFnZSA9IHBmbl90b19wYWdlKHBmbik7Ci0JCS8qIHRvdGFscmFtX3BhZ2VzIGRvZXNuJ3QgaW5jbHVkZSB0aGUgYm9vdC10aW1lCisJCS8qIHRvdGFscmFtX3BhZ2VzIGFuZCB0b3RhbGhpZ2hfcGFnZXMgZG8gbm90IGluY2x1ZGUgdGhlIGJvb3QtdGltZQogCQkgICBiYWxsb29uIGV4dGVuc2lvbiwgc28gZG9uJ3Qgc3VidHJhY3QgZnJvbSBpdC4gKi8KIAkJX19iYWxsb29uX2FwcGVuZChwYWdlKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9ldmVudHMuYyBiL2RyaXZlcnMveGVuL2V2ZW50cy5jCmluZGV4IDMzMTY3YjQuLjNmZjgyMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL2V2ZW50cy5jCisrKyBiL2RyaXZlcnMveGVuL2V2ZW50cy5jCkBAIC0xMDEsNiArMTAxLDcgQEAKIAkJCXVuc2lnbmVkIHNob3J0IGdzaTsKIAkJCXVuc2lnbmVkIGNoYXIgdmVjdG9yOwogCQkJdW5zaWduZWQgY2hhciBmbGFnczsKKwkJCXVpbnQxNl90IGRvbWlkOwogCQl9IHBpcnE7CiAJfSB1OwogfTsKQEAgLTExOCw2ICsxMTksOCBAQAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCB4ZW5fZHluYW1pY19jaGlwOwogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCB4ZW5fcGVyY3B1X2NoaXA7CiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHhlbl9waXJxX2NoaXA7CitzdGF0aWMgdm9pZCBlbmFibGVfZHluaXJxKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSk7CitzdGF0aWMgdm9pZCBkaXNhYmxlX2R5bmlycShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpOwogCiAvKiBHZXQgaW5mbyBmb3IgSVJRICovCiBzdGF0aWMgc3RydWN0IGlycV9pbmZvICppbmZvX2Zvcl9pcnEodW5zaWduZWQgaXJxKQpAQCAtMTg0LDYgKzE4Nyw3IEBACiAJCQkJICAgdW5zaWduZWQgc2hvcnQgcGlycSwKIAkJCQkgICB1bnNpZ25lZCBzaG9ydCBnc2ksCiAJCQkJICAgdW5zaWduZWQgc2hvcnQgdmVjdG9yLAorCQkJCSAgIHVpbnQxNl90IGRvbWlkLAogCQkJCSAgIHVuc2lnbmVkIGNoYXIgZmxhZ3MpCiB7CiAJc3RydWN0IGlycV9pbmZvICppbmZvID0gaW5mb19mb3JfaXJxKGlycSk7CkBAIC0xOTMsNiArMTk3LDcgQEAKIAlpbmZvLT51LnBpcnEucGlycSA9IHBpcnE7CiAJaW5mby0+dS5waXJxLmdzaSA9IGdzaTsKIAlpbmZvLT51LnBpcnEudmVjdG9yID0gdmVjdG9yOworCWluZm8tPnUucGlycS5kb21pZCA9IGRvbWlkOwogCWluZm8tPnUucGlycS5mbGFncyA9IGZsYWdzOwogfQogCkBAIC00NzMsMTYgKzQ3OCw2IEBACiAJaXJxX2ZyZWVfZGVzYyhpcnEpOwogfQogCi1zdGF0aWMgdm9pZCBwaXJxX3VubWFza19ub3RpZnkoaW50IGlycSkKLXsKLQlzdHJ1Y3QgcGh5c2Rldl9lb2kgZW9pID0geyAuaXJxID0gcGlycV9mcm9tX2lycShpcnEpIH07Ci0KLQlpZiAodW5saWtlbHkocGlycV9uZWVkc19lb2koaXJxKSkpIHsKLQkJaW50IHJjID0gSFlQRVJWSVNPUl9waHlzZGV2X29wKFBIWVNERVZPUF9lb2ksICZlb2kpOwotCQlXQVJOX09OKHJjKTsKLQl9Ci19Ci0KIHN0YXRpYyB2b2lkIHBpcnFfcXVlcnlfdW5tYXNrKGludCBpcnEpCiB7CiAJc3RydWN0IHBoeXNkZXZfaXJxX3N0YXR1c19xdWVyeSBpcnFfc3RhdHVzOwpAQCAtNTA2LDYgKzUwMSwyOSBAQAogCXJldHVybiBkZXNjICYmIGRlc2MtPmFjdGlvbiA9PSBOVUxMOwogfQogCitzdGF0aWMgdm9pZCBlb2lfcGlycShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJaW50IGV2dGNobiA9IGV2dGNobl9mcm9tX2lycShkYXRhLT5pcnEpOworCXN0cnVjdCBwaHlzZGV2X2VvaSBlb2kgPSB7IC5pcnEgPSBwaXJxX2Zyb21faXJxKGRhdGEtPmlycSkgfTsKKwlpbnQgcmMgPSAwOworCisJaXJxX21vdmVfaXJxKGRhdGEpOworCisJaWYgKFZBTElEX0VWVENITihldnRjaG4pKQorCQljbGVhcl9ldnRjaG4oZXZ0Y2huKTsKKworCWlmIChwaXJxX25lZWRzX2VvaShkYXRhLT5pcnEpKSB7CisJCXJjID0gSFlQRVJWSVNPUl9waHlzZGV2X29wKFBIWVNERVZPUF9lb2ksICZlb2kpOworCQlXQVJOX09OKHJjKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1hc2tfYWNrX3BpcnEoc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCWRpc2FibGVfZHluaXJxKGRhdGEpOworCWVvaV9waXJxKGRhdGEpOworfQorCiBzdGF0aWMgdW5zaWduZWQgaW50IF9fc3RhcnR1cF9waXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJc3RydWN0IGV2dGNobl9iaW5kX3BpcnEgYmluZF9waXJxOwpAQCAtNTM5LDcgKzU1Nyw3IEBACiAKIG91dDoKIAl1bm1hc2tfZXZ0Y2huKGV2dGNobik7Ci0JcGlycV91bm1hc2tfbm90aWZ5KGlycSk7CisJZW9pX3BpcnEoaXJxX2dldF9pcnFfZGF0YShpcnEpKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTc5LDE4ICs1OTcsNyBAQAogCiBzdGF0aWMgdm9pZCBkaXNhYmxlX3BpcnEoc3RydWN0IGlycV9kYXRhICpkYXRhKQogewotfQotCi1zdGF0aWMgdm9pZCBhY2tfcGlycShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCi17Ci0JaW50IGV2dGNobiA9IGV2dGNobl9mcm9tX2lycShkYXRhLT5pcnEpOwotCi0JaXJxX21vdmVfaXJxKGRhdGEpOwotCi0JaWYgKFZBTElEX0VWVENITihldnRjaG4pKSB7Ci0JCW1hc2tfZXZ0Y2huKGV2dGNobik7Ci0JCWNsZWFyX2V2dGNobihldnRjaG4pOwotCX0KKwlkaXNhYmxlX2R5bmlycShkYXRhKTsKIH0KIAogc3RhdGljIGludCBmaW5kX2lycV9ieV9nc2kodW5zaWduZWQgZ3NpKQpAQCAtNjM5LDkgKzY0Niw2IEBACiAJaWYgKGlycSA8IDApCiAJCWdvdG8gb3V0OwogCi0JaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCAmeGVuX3BpcnFfY2hpcCwgaGFuZGxlX2xldmVsX2lycSwKLQkJCQkgICAgICBuYW1lKTsKLQogCWlycV9vcC5pcnEgPSBpcnE7CiAJaXJxX29wLnZlY3RvciA9IDA7CiAKQEAgLTY1NSw5ICs2NTksMzUgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JeGVuX2lycV9pbmZvX3BpcnFfaW5pdChpcnEsIDAsIHBpcnEsIGdzaSwgaXJxX29wLnZlY3RvciwKKwl4ZW5faXJxX2luZm9fcGlycV9pbml0KGlycSwgMCwgcGlycSwgZ3NpLCBpcnFfb3AudmVjdG9yLCBET01JRF9TRUxGLAogCQkJICAgICAgIHNoYXJlYWJsZSA/IFBJUlFfU0hBUkVBQkxFIDogMCk7CiAKKwlwaXJxX3F1ZXJ5X3VubWFzayhpcnEpOworCS8qIFdlIHRyeSB0byB1c2UgdGhlIGhhbmRsZXIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgc2VtYW50aWMgZm9yIHRoZQorCSAqIHR5cGUgb2YgaW50ZXJydXB0OiBpZiB0aGUgaW50ZXJydXB0IGRvZXNuJ3QgbmVlZCBhbiBlb2kKKwkgKiAocGlycV9uZWVkc19lb2kgcmV0dXJucyBmYWxzZSksIHdlIHRyZWF0IGl0IGxpa2UgYW4gZWRnZQorCSAqIHRyaWdnZXJlZCBpbnRlcnJ1cHQgc28gd2UgdXNlIGhhbmRsZV9lZGdlX2lycS4KKwkgKiBBcyBhIG1hdHRlciBvZiBmYWN0IHRoaXMgb25seSBoYXBwZW5zIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcKKwkgKiBwaHlzaWNhbCBpbnRlcnJ1cHQgaXMgZWRnZSB0cmlnZ2VyZWQgb3IgYW4gbXNpLgorCSAqCisJICogT24gdGhlIG90aGVyIGhhbmQgaWYgdGhlIGludGVycnVwdCBuZWVkcyBhbiBlb2kgKHBpcnFfbmVlZHNfZW9pCisJICogcmV0dXJucyB0cnVlKSB3ZSB0cmVhdCBpdCBsaWtlIGEgbGV2ZWwgdHJpZ2dlcmVkIGludGVycnVwdCBzbyB3ZQorCSAqIHVzZSBoYW5kbGVfZmFzdGVvaV9pcnEgbGlrZSB0aGUgbmF0aXZlIGNvZGUgZG9lcyBmb3IgdGhpcyBraW5kIG9mCisJICogaW50ZXJydXB0cy4KKwkgKiBEZXBlbmRpbmcgb24gdGhlIFhlbiB2ZXJzaW9uLCBwaXJxX25lZWRzX2VvaSBtaWdodCByZXR1cm4gdHJ1ZQorCSAqIG5vdCBvbmx5IGZvciBsZXZlbCB0cmlnZ2VyZWQgaW50ZXJydXB0cyBidXQgZm9yIGVkZ2UgdHJpZ2dlcmVkCisJICogaW50ZXJydXB0cyB0b28uIEluIGFueSBjYXNlIFhlbiBhbHdheXMgaG9ub3JzIHRoZSBlb2kgbWVjaGFuaXNtLAorCSAqIG5vdCBpbmplY3RpbmcgYW55IG1vcmUgcGlycXMgb2YgdGhlIHNhbWUga2luZCBpZiB0aGUgZmlyc3Qgb25lCisJICogaGFzbid0IHJlY2VpdmVkIGFuIGVvaSB5ZXQuIFRoZXJlZm9yZSB1c2luZyB0aGUgZmFzdGVvaSBoYW5kbGVyCisJICogaXMgdGhlIHJpZ2h0IGNob2ljZSBlaXRoZXIgd2F5LgorCSAqLworCWlmIChwaXJxX25lZWRzX2VvaShpcnEpKQorCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpcnEsICZ4ZW5fcGlycV9jaGlwLAorCQkJCWhhbmRsZV9mYXN0ZW9pX2lycSwgbmFtZSk7CisJZWxzZQorCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpcnEsICZ4ZW5fcGlycV9jaGlwLAorCQkJCWhhbmRsZV9lZGdlX2lycSwgbmFtZSk7CisKIG91dDoKIAlzcGluX3VubG9jaygmaXJxX21hcHBpbmdfdXBkYXRlX2xvY2spOwogCkBAIC02ODAsNyArNzEwLDggQEAKIH0KIAogaW50IHhlbl9iaW5kX3BpcnFfbXNpX3RvX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgbXNpX2Rlc2MgKm1zaWRlc2MsCi0JCQkgICAgIGludCBwaXJxLCBpbnQgdmVjdG9yLCBjb25zdCBjaGFyICpuYW1lKQorCQkJICAgICBpbnQgcGlycSwgaW50IHZlY3RvciwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICAgZG9taWRfdCBkb21pZCkKIHsKIAlpbnQgaXJxLCByZXQ7CiAKQEAgLTY5MCwxMCArNzIxLDEwIEBACiAJaWYgKGlycSA9PSAtMSkKIAkJZ290byBvdXQ7CiAKLQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpcnEsICZ4ZW5fcGlycV9jaGlwLCBoYW5kbGVfbGV2ZWxfaXJxLAotCQkJCSAgICAgIG5hbWUpOworCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGlycSwgJnhlbl9waXJxX2NoaXAsIGhhbmRsZV9lZGdlX2lycSwKKwkJCW5hbWUpOwogCi0JeGVuX2lycV9pbmZvX3BpcnFfaW5pdChpcnEsIDAsIHBpcnEsIDAsIHZlY3RvciwgMCk7CisJeGVuX2lycV9pbmZvX3BpcnFfaW5pdChpcnEsIDAsIHBpcnEsIDAsIHZlY3RvciwgZG9taWQsIDApOwogCXJldCA9IGlycV9zZXRfbXNpX2Rlc2MoaXJxLCBtc2lkZXNjKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvcl9pcnE7CkBAIC03MjIsOSArNzUzLDE2IEBACiAKIAlpZiAoeGVuX2luaXRpYWxfZG9tYWluKCkpIHsKIAkJdW5tYXBfaXJxLnBpcnEgPSBpbmZvLT51LnBpcnEucGlycTsKLQkJdW5tYXBfaXJxLmRvbWlkID0gRE9NSURfU0VMRjsKKwkJdW5tYXBfaXJxLmRvbWlkID0gaW5mby0+dS5waXJxLmRvbWlkOwogCQlyYyA9IEhZUEVSVklTT1JfcGh5c2Rldl9vcChQSFlTREVWT1BfdW5tYXBfcGlycSwgJnVubWFwX2lycSk7Ci0JCWlmIChyYykgeworCQkvKiBJZiBhbm90aGVyIGRvbWFpbiBxdWl0cyB3aXRob3V0IG1ha2luZyB0aGUgcGNpX2Rpc2FibGVfbXNpeAorCQkgKiBjYWxsLCB0aGUgWGVuIGh5cGVydmlzb3IgdGFrZXMgY2FyZSBvZiBmcmVlaW5nIHRoZSBQSVJRcworCQkgKiAoZnJlZV9kb21haW5fcGlycXMpLgorCQkgKi8KKwkJaWYgKChyYyA9PSAtRVNSQ0ggJiYgaW5mby0+dS5waXJxLmRvbWlkICE9IERPTUlEX1NFTEYpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiZG9tYWluICVkIGRvZXMgbm90IGhhdmUgJWQgYW55bW9yZVxuIiwKKwkJCQlpbmZvLT51LnBpcnEuZG9taWQsIGluZm8tPnUucGlycS5waXJxKTsKKwkJZWxzZSBpZiAocmMpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgInVubWFwIGlycSBmYWlsZWQgJWRcbiIsIHJjKTsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC03NTksNiArNzk3LDEyIEBACiAJcmV0dXJuIGlycTsKIH0KIAorCitpbnQgeGVuX3BpcnFfZnJvbV9pcnEodW5zaWduZWQgaXJxKQoreworCXJldHVybiBwaXJxX2Zyb21faXJxKGlycSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh4ZW5fcGlycV9mcm9tX2lycSk7CiBpbnQgYmluZF9ldnRjaG5fdG9faXJxKHVuc2lnbmVkIGludCBldnRjaG4pCiB7CiAJaW50IGlycTsKQEAgLTc3Myw3ICs4MTcsNyBAQAogCQkJZ290byBvdXQ7CiAKIAkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCAmeGVuX2R5bmFtaWNfY2hpcCwKLQkJCQkJICAgICAgaGFuZGxlX2Zhc3Rlb2lfaXJxLCAiZXZlbnQiKTsKKwkJCQkJICAgICAgaGFuZGxlX2VkZ2VfaXJxLCAiZXZlbnQiKTsKIAogCQl4ZW5faXJxX2luZm9fZXZ0Y2huX2luaXQoaXJxLCBldnRjaG4pOwogCX0KQEAgLTExNzksOSArMTIyMyw2IEBACiAJCQkJcG9ydCA9ICh3b3JkX2lkeCAqIEJJVFNfUEVSX0xPTkcpICsgYml0X2lkeDsKIAkJCQlpcnEgPSBldnRjaG5fdG9faXJxW3BvcnRdOwogCi0JCQkJbWFza19ldnRjaG4ocG9ydCk7Ci0JCQkJY2xlYXJfZXZ0Y2huKHBvcnQpOwotCiAJCQkJaWYgKGlycSAhPSAtMSkgewogCQkJCQlkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKIAkJCQkJaWYgKGRlc2MpCkBAIC0xMzM3LDEwICsxMzc4LDE2IEBACiB7CiAJaW50IGV2dGNobiA9IGV2dGNobl9mcm9tX2lycShkYXRhLT5pcnEpOwogCi0JaXJxX21vdmVfbWFza2VkX2lycShkYXRhKTsKKwlpcnFfbW92ZV9pcnEoZGF0YSk7CiAKIAlpZiAoVkFMSURfRVZUQ0hOKGV2dGNobikpCi0JCXVubWFza19ldnRjaG4oZXZ0Y2huKTsKKwkJY2xlYXJfZXZ0Y2huKGV2dGNobik7Cit9CisKK3N0YXRpYyB2b2lkIG1hc2tfYWNrX2R5bmlycShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJZGlzYWJsZV9keW5pcnEoZGF0YSk7CisJYWNrX2R5bmlycShkYXRhKTsKIH0KIAogc3RhdGljIGludCByZXRyaWdnZXJfZHluaXJxKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKQEAgLTE1MDIsNiArMTU0OSwxOCBAQAogCXhlbl9wb2xsX2lycV90aW1lb3V0KGlycSwgMCAvKiBubyB0aW1lb3V0ICovKTsKIH0KIAorLyogQ2hlY2sgd2hldGhlciB0aGUgSVJRIGxpbmUgaXMgc2hhcmVkIHdpdGggb3RoZXIgZ3Vlc3RzLiAqLworaW50IHhlbl90ZXN0X2lycV9zaGFyZWQoaW50IGlycSkKK3sKKwlzdHJ1Y3QgaXJxX2luZm8gKmluZm8gPSBpbmZvX2Zvcl9pcnEoaXJxKTsKKwlzdHJ1Y3QgcGh5c2Rldl9pcnFfc3RhdHVzX3F1ZXJ5IGlycV9zdGF0dXMgPSB7IC5pcnEgPSBpbmZvLT51LnBpcnEucGlycSB9OworCisJaWYgKEhZUEVSVklTT1JfcGh5c2Rldl9vcChQSFlTREVWT1BfaXJxX3N0YXR1c19xdWVyeSwgJmlycV9zdGF0dXMpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gIShpcnFfc3RhdHVzLmZsYWdzICYgWEVOSVJRU1RBVF9zaGFyZWQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoeGVuX3Rlc3RfaXJxX3NoYXJlZCk7CisKIHZvaWQgeGVuX2lycV9yZXN1bWUodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgY3B1LCBldnRjaG47CkBAIC0xNTM1LDcgKzE1OTQsOSBAQAogCS5pcnFfbWFzawkJPSBkaXNhYmxlX2R5bmlycSwKIAkuaXJxX3VubWFzawkJPSBlbmFibGVfZHluaXJxLAogCi0JLmlycV9lb2kJCT0gYWNrX2R5bmlycSwKKwkuaXJxX2FjawkJPSBhY2tfZHluaXJxLAorCS5pcnFfbWFza19hY2sJCT0gbWFza19hY2tfZHluaXJxLAorCiAJLmlycV9zZXRfYWZmaW5pdHkJPSBzZXRfYWZmaW5pdHlfaXJxLAogCS5pcnFfcmV0cmlnZ2VyCQk9IHJldHJpZ2dlcl9keW5pcnEsCiB9OwpAQCAtMTU0NSwxNCArMTYwNiwxNSBAQAogCiAJLmlycV9zdGFydHVwCQk9IHN0YXJ0dXBfcGlycSwKIAkuaXJxX3NodXRkb3duCQk9IHNodXRkb3duX3BpcnEsCi0KIAkuaXJxX2VuYWJsZQkJPSBlbmFibGVfcGlycSwKLQkuaXJxX3VubWFzawkJPSBlbmFibGVfcGlycSwKLQogCS5pcnFfZGlzYWJsZQkJPSBkaXNhYmxlX3BpcnEsCi0JLmlycV9tYXNrCQk9IGRpc2FibGVfcGlycSwKIAotCS5pcnFfYWNrCQk9IGFja19waXJxLAorCS5pcnFfbWFzawkJPSBkaXNhYmxlX2R5bmlycSwKKwkuaXJxX3VubWFzawkJPSBlbmFibGVfZHluaXJxLAorCisJLmlycV9hY2sJCT0gZW9pX3BpcnEsCisJLmlycV9lb2kJCT0gZW9pX3BpcnEsCisJLmlycV9tYXNrX2FjawkJPSBtYXNrX2Fja19waXJxLAogCiAJLmlycV9zZXRfYWZmaW5pdHkJPSBzZXRfYWZmaW5pdHlfaXJxLAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9nbnRhbGxvYy5jIGIvZHJpdmVycy94ZW4vZ250YWxsb2MuYwppbmRleCBhN2ZmZGZlLi5mNjgzMmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9nbnRhbGxvYy5jCisrKyBiL2RyaXZlcnMveGVuL2dudGFsbG9jLmMKQEAgLTQyNyw2ICs0MjcsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgZ250YWxsb2Nfdm1hX29wZW4oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGdudGFsbG9jX2dyZWYgKmdyZWYgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKKwlpZiAoIWdyZWYpCisJCXJldHVybjsKKworCXNwaW5fbG9jaygmZ3JlZl9sb2NrKTsKKwlncmVmLT51c2VycysrOworCXNwaW5fdW5sb2NrKCZncmVmX2xvY2spOworfQorCiBzdGF0aWMgdm9pZCBnbnRhbGxvY192bWFfY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IGdudGFsbG9jX2dyZWYgKmdyZWYgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKQEAgLTQ0MSw2ICs0NTIsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGdudGFsbG9jX3Ztb3BzID0geworCS5vcGVuID0gZ250YWxsb2Nfdm1hX29wZW4sCiAJLmNsb3NlID0gZ250YWxsb2Nfdm1hX2Nsb3NlLAogfTsKIApAQCAtNDcxLDggKzQ4Myw2IEBACiAJdm1hLT52bV9wcml2YXRlX2RhdGEgPSBncmVmOwogCiAJdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsKLQl2bWEtPnZtX2ZsYWdzIHw9IFZNX0RPTlRDT1BZOwotCXZtYS0+dm1fZmxhZ3MgfD0gVk1fUEZOTUFQIHwgVk1fUEZOX0FUX01NQVA7CiAKIAl2bWEtPnZtX29wcyA9ICZnbnRhbGxvY192bW9wczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZ250ZGV2LmMgYi9kcml2ZXJzL3hlbi9nbnRkZXYuYwppbmRleCBiMGY5ZThmLi5mOTE0YjI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9nbnRkZXYuYworKysgYi9kcml2ZXJzL3hlbi9nbnRkZXYuYwpAQCAtMzMwLDE3ICszMzAsMjYgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKK3N0YXRpYyB2b2lkIGdudGRldl92bWFfb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgZ3JhbnRfbWFwICptYXAgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKKworCXByX2RlYnVnKCJnbnRkZXZfdm1hX29wZW4gJXBcbiIsIHZtYSk7CisJYXRvbWljX2luYygmbWFwLT51c2Vycyk7Cit9CisKIHN0YXRpYyB2b2lkIGdudGRldl92bWFfY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IGdyYW50X21hcCAqbWFwID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CiAKLQlwcl9kZWJ1ZygiY2xvc2UgJXBcbiIsIHZtYSk7CisJcHJfZGVidWcoImdudGRldl92bWFfY2xvc2UgJXBcbiIsIHZtYSk7CiAJbWFwLT52bWEgPSBOVUxMOwogCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gTlVMTDsKIAlnbnRkZXZfcHV0X21hcChtYXApOwogfQogCiBzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGdudGRldl92bW9wcyA9IHsKKwkub3BlbiA9IGdudGRldl92bWFfb3BlbiwKIAkuY2xvc2UgPSBnbnRkZXZfdm1hX2Nsb3NlLAogfTsKIApAQCAtNjUyLDcgKzY2MSwxMCBAQAogCiAJdm1hLT52bV9vcHMgPSAmZ250ZGV2X3Ztb3BzOwogCi0Jdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRHxWTV9ET05UQ09QWXxWTV9ET05URVhQQU5EfFZNX1BGTk1BUDsKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX1JFU0VSVkVEfFZNX0RPTlRFWFBBTkQ7CisKKwlpZiAodXNlX3B0ZW1vZCkKKwkJdm1hLT52bV9mbGFncyB8PSBWTV9ET05UQ09QWXxWTV9QRk5NQVA7CiAKIAl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9IG1hcDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZ3JhbnQtdGFibGUuYyBiL2RyaXZlcnMveGVuL2dyYW50LXRhYmxlLmMKaW5kZXggMzc0NWEzMS4uZmQ3MjVjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vZ3JhbnQtdGFibGUuYworKysgYi9kcml2ZXJzL3hlbi9ncmFudC10YWJsZS5jCkBAIC00NjYsMTMgKzQ2NiwzMCBAQAogCQlpZiAobWFwX29wc1tpXS5zdGF0dXMpCiAJCQljb250aW51ZTsKIAotCQkvKiBtMnAgb3ZlcnJpZGUgb25seSBzdXBwb3J0ZWQgZm9yIEdOVE1BUF9jb250YWluc19wdGUgbWFwcGluZ3MgKi8KLQkJaWYgKCEobWFwX29wc1tpXS5mbGFncyAmIEdOVE1BUF9jb250YWluc19wdGUpKQotCQkJY29udGludWU7Ci0JCXB0ZSA9IChwdGVfdCAqKSAobWZuX3RvX3ZpcnQoUEZOX0RPV04obWFwX29wc1tpXS5ob3N0X2FkZHIpKSArCisJCWlmIChtYXBfb3BzW2ldLmZsYWdzICYgR05UTUFQX2NvbnRhaW5zX3B0ZSkgeworCQkJcHRlID0gKHB0ZV90ICopIChtZm5fdG9fdmlydChQRk5fRE9XTihtYXBfb3BzW2ldLmhvc3RfYWRkcikpICsKIAkJCQkobWFwX29wc1tpXS5ob3N0X2FkZHIgJiB+UEFHRV9NQVNLKSk7Ci0JCW1mbiA9IHB0ZV9tZm4oKnB0ZSk7Ci0JCXJldCA9IG0ycF9hZGRfb3ZlcnJpZGUobWZuLCBwYWdlc1tpXSk7CisJCQltZm4gPSBwdGVfbWZuKCpwdGUpOworCQl9IGVsc2UgeworCQkJLyogSWYgeW91IHJlYWxseSB3YW50ZWQgdG8gZG8gdGhpczoKKwkJCSAqIG1mbiA9IFBGTl9ET1dOKG1hcF9vcHNbaV0uZGV2X2J1c19hZGRyKTsKKwkJCSAqCisJCQkgKiBUaGUgcmVhc29uIHdlIGRvIG5vdCBpbXBsZW1lbnQgaXQgaXMgYi9jIG9uIHRoZQorCQkJICogdW5tYXAgcGF0aCAoZ250dGFiX3VubWFwX3JlZnMpIHdlIGhhdmUgbm8gbWVhbnMgb2YKKwkJCSAqIGNoZWNraW5nIHdoZXRoZXIgdGhlIHBhZ2UgaXMgIUdOVE1BUF9jb250YWluc19wdGUuCisJCQkgKgorCQkJICogVGhhdCBpcyB3aXRob3V0IHNvbWUgZXh0cmEgZGF0YS1zdHJ1Y3R1cmUgdG8gY2FycnkKKwkJCSAqIHRoZSBzdHJ1Y3QgcGFnZSwgYm9vbCBjbGVhcl9wdGUsIGFuZCBsaXN0X2hlYWQgbmV4dAorCQkJICogdHVwbGVzIGFuZCBkZWFsIHdpdGggYWxsb2NhdGlvbi9kZWxhbGxvY2F0aW9uLCBldGMuCisJCQkgKgorCQkJICogVGhlIHVzZXJzIG9mIHRoaXMgQVBJIHNldCB0aGUgR05UTUFQX2NvbnRhaW5zX3B0ZQorCQkJICogZmxhZyBzbyBsZXRzIGp1c3QgcmV0dXJuIG5vdCBzdXBwb3J0ZWQgdW50aWwgaXQKKwkJCSAqIGJlY29tZXMgbmVjY2Vzc2FyeSB0byBpbXBsZW1lbnQuCisJCQkgKi8KKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJfQorCQlyZXQgPSBtMnBfYWRkX292ZXJyaWRlKG1mbiwgcGFnZXNbaV0sCisJCQkJICAgICAgIG1hcF9vcHNbaV0uZmxhZ3MgJiBHTlRNQVBfY29udGFpbnNfcHRlKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJfQpAQCAtNDk0LDcgKzUxMSw3IEBACiAJCXJldHVybiByZXQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQlyZXQgPSBtMnBfcmVtb3ZlX292ZXJyaWRlKHBhZ2VzW2ldKTsKKwkJcmV0ID0gbTJwX3JlbW92ZV9vdmVycmlkZShwYWdlc1tpXSwgdHJ1ZSAvKiBjbGVhciB0aGUgUFRFICovKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vbWFuYWdlLmMgYi9kcml2ZXJzL3hlbi9tYW5hZ2UuYwppbmRleCBhMmVlZTU3Li4wYjUzNjZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9tYW5hZ2UuYworKysgYi9kcml2ZXJzL3hlbi9tYW5hZ2UuYwpAQCAtNzAsMTIgKzcwLDcgQEAKIAogCUJVR19PTighaXJxc19kaXNhYmxlZCgpKTsKIAotCWVyciA9IHN5c2Rldl9zdXNwZW5kKFBNU0dfRlJFRVpFKTsKLQlpZiAoIWVycikgewotCQllcnIgPSBzeXNjb3JlX3N1c3BlbmQoKTsKLQkJaWYgKGVycikKLQkJCXN5c2Rldl9yZXN1bWUoKTsKLQl9CisJZXJyID0gc3lzY29yZV9zdXNwZW5kKCk7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgInhlbl9zdXNwZW5kOiBzeXN0ZW0gY29yZSBzdXNwZW5kIGZhaWxlZDogJWRcbiIsCiAJCQllcnIpOwpAQCAtMTAyLDcgKzk3LDYgQEAKIAl9CiAKIAlzeXNjb3JlX3Jlc3VtZSgpOwotCXN5c2Rldl9yZXN1bWUoKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vc3lzLWh5cGVydmlzb3IuYyBiL2RyaXZlcnMveGVuL3N5cy1oeXBlcnZpc29yLmMKaW5kZXggNjBmMTgyNy4uMWUwZmUwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vc3lzLWh5cGVydmlzb3IuYworKysgYi9kcml2ZXJzL3hlbi9zeXMtaHlwZXJ2aXNvci5jCkBAIC0yMTUsNyArMjE1LDcgQEAKIAkuYXR0cnMgPSB4ZW5fY29tcGlsZV9hdHRycywKIH07CiAKLWludCBfX2luaXQgc3RhdGljIHhlbl9jb21waWxhdGlvbl9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCB4ZW5fY29tcGlsYXRpb25faW5pdCh2b2lkKQogewogCXJldHVybiBzeXNmc19jcmVhdGVfZ3JvdXAoaHlwZXJ2aXNvcl9rb2JqLCAmeGVuX2NvbXBpbGF0aW9uX2dyb3VwKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2NvbmZpZ2ZzL2Rpci5jIGIvZnMvY29uZmlnZnMvZGlyLmMKaW5kZXggMzMxM2RkMS4uOWEzN2E5YiAxMDA2NDQKLS0tIGEvZnMvY29uZmlnZnMvZGlyLmMKKysrIGIvZnMvY29uZmlnZnMvZGlyLmMKQEAgLTUzLDExICs1MywxNCBAQAogc3RhdGljIHZvaWQgY29uZmlnZnNfZF9pcHV0KHN0cnVjdCBkZW50cnkgKiBkZW50cnksCiAJCQkgICAgc3RydWN0IGlub2RlICogaW5vZGUpCiB7Ci0Jc3RydWN0IGNvbmZpZ2ZzX2RpcmVudCAqIHNkID0gZGVudHJ5LT5kX2ZzZGF0YTsKKwlzdHJ1Y3QgY29uZmlnZnNfZGlyZW50ICpzZCA9IGRlbnRyeS0+ZF9mc2RhdGE7CiAKIAlpZiAoc2QpIHsKIAkJQlVHX09OKHNkLT5zX2RlbnRyeSAhPSBkZW50cnkpOworCQkvKiBDb29yZGluYXRlIHdpdGggY29uZmlnZnNfcmVhZGRpciAqLworCQlzcGluX2xvY2soJmNvbmZpZ2ZzX2RpcmVudF9sb2NrKTsKIAkJc2QtPnNfZGVudHJ5ID0gTlVMTDsKKwkJc3Bpbl91bmxvY2soJmNvbmZpZ2ZzX2RpcmVudF9sb2NrKTsKIAkJY29uZmlnZnNfcHV0KHNkKTsKIAl9CiAJaXB1dChpbm9kZSk7CkBAIC02ODksNyArNjkyLDggQEAKIAkJCXNkID0gY2hpbGQtPmRfZnNkYXRhOwogCQkJc2QtPnNfdHlwZSB8PSBDT05GSUdGU19VU0VUX0RFRkFVTFQ7CiAJCX0gZWxzZSB7Ci0JCQlkX2RlbGV0ZShjaGlsZCk7CisJCQlCVUdfT04oY2hpbGQtPmRfaW5vZGUpOworCQkJZF9kcm9wKGNoaWxkKTsKIAkJCWRwdXQoY2hpbGQpOwogCQl9CiAJfQpAQCAtMTU0NSw3ICsxNTQ5LDcgQEAKIAlzdHJ1Y3QgY29uZmlnZnNfZGlyZW50ICogcGFyZW50X3NkID0gZGVudHJ5LT5kX2ZzZGF0YTsKIAlzdHJ1Y3QgY29uZmlnZnNfZGlyZW50ICpjdXJzb3IgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGxpc3RfaGVhZCAqcCwgKnEgPSAmY3Vyc29yLT5zX3NpYmxpbmc7Ci0JaW5vX3QgaW5vOworCWlub190IGlubyA9IDA7CiAJaW50IGkgPSBmaWxwLT5mX3BvczsKIAogCXN3aXRjaCAoaSkgewpAQCAtMTU3Myw2ICsxNTc3LDcgQEAKIAkJCQlzdHJ1Y3QgY29uZmlnZnNfZGlyZW50ICpuZXh0OwogCQkJCWNvbnN0IGNoYXIgKiBuYW1lOwogCQkJCWludCBsZW47CisJCQkJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CiAKIAkJCQluZXh0ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgY29uZmlnZnNfZGlyZW50LAogCQkJCQkJICAgc19zaWJsaW5nKTsKQEAgLTE1ODEsOSArMTU4NiwyOCBAQAogCiAJCQkJbmFtZSA9IGNvbmZpZ2ZzX2dldF9uYW1lKG5leHQpOwogCQkJCWxlbiA9IHN0cmxlbihuYW1lKTsKLQkJCQlpZiAobmV4dC0+c19kZW50cnkpCi0JCQkJCWlubyA9IG5leHQtPnNfZGVudHJ5LT5kX2lub2RlLT5pX2lubzsKLQkJCQllbHNlCisKKwkJCQkvKgorCQkJCSAqIFdlJ2xsIGhhdmUgYSBkZW50cnkgYW5kIGFuIGlub2RlIGZvcgorCQkJCSAqIFBJTk5FRCBpdGVtcyBhbmQgZm9yIG9wZW4gYXR0cmlidXRlCisJCQkJICogZmlsZXMuICBXZSBsb2NrIGhlcmUgdG8gcHJldmVudCBhIHJhY2UKKwkJCQkgKiB3aXRoIGNvbmZpZ2ZzX2RfaXB1dCgpIGNsZWFyaW5nCisJCQkJICogc19kZW50cnkgYmVmb3JlIGNhbGxpbmcgaXB1dCgpLgorCQkJCSAqCisJCQkJICogV2h5IGRvIHdlIGdvIHRvIHRoZSB0cm91YmxlPyAgSWYKKwkJCQkgKiBzb21lb25lIGhhcyBhbiBhdHRyaWJ1dGUgZmlsZSBvcGVuLAorCQkJCSAqIHRoZSBpbm9kZSBudW1iZXIgc2hvdWxkIG1hdGNoIHVudGlsCisJCQkJICogdGhleSBjbG9zZSBpdC4gIEJleW9uZCB0aGF0LCB3ZSBkb24ndAorCQkJCSAqIGNhcmUuCisJCQkJICovCisJCQkJc3Bpbl9sb2NrKCZjb25maWdmc19kaXJlbnRfbG9jayk7CisJCQkJZGVudHJ5ID0gbmV4dC0+c19kZW50cnk7CisJCQkJaWYgKGRlbnRyeSkKKwkJCQkJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJCQkJaWYgKGlub2RlKQorCQkJCQlpbm8gPSBpbm9kZS0+aV9pbm87CisJCQkJc3Bpbl91bmxvY2soJmNvbmZpZ2ZzX2RpcmVudF9sb2NrKTsKKwkJCQlpZiAoIWlub2RlKQogCQkJCQlpbm8gPSBpdW5pcXVlKGNvbmZpZ2ZzX3NiLCAyKTsKIAogCQkJCWlmIChmaWxsZGlyKGRpcmVudCwgbmFtZSwgbGVuLCBmaWxwLT5mX3BvcywgaW5vLApAQCAtMTY4Myw3ICsxNzA3LDggQEAKIAkJZXJyID0gY29uZmlnZnNfYXR0YWNoX2dyb3VwKHNkLT5zX2VsZW1lbnQsICZncm91cC0+Y2dfaXRlbSwKIAkJCQkJICAgIGRlbnRyeSk7CiAJCWlmIChlcnIpIHsKLQkJCWRfZGVsZXRlKGRlbnRyeSk7CisJCQlCVUdfT04oZGVudHJ5LT5kX2lub2RlKTsKKwkJCWRfZHJvcChkZW50cnkpOwogCQkJZHB1dChkZW50cnkpOwogCQl9IGVsc2UgewogCQkJc3Bpbl9sb2NrKCZjb25maWdmc19kaXJlbnRfbG9jayk7CmRpZmYgLS1naXQgYS9mcy9kZWJ1Z2ZzL2ZpbGUuYyBiL2ZzL2RlYnVnZnMvZmlsZS5jCmluZGV4IDg5ZDM5NGQuLjkwZjc2NTcgMTAwNjQ0Ci0tLSBhL2ZzL2RlYnVnZnMvZmlsZS5jCisrKyBiL2ZzL2RlYnVnZnMvZmlsZS5jCkBAIC00MjgsMjYgKzQyOCwxNyBAQAogCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCWNoYXIgYnVmWzMyXTsKLQlpbnQgYnVmX3NpemU7CisJc2l6ZV90IGJ1Zl9zaXplOworCWJvb2wgYnY7CiAJdTMyICp2YWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAlidWZfc2l6ZSA9IG1pbihjb3VudCwgKHNpemVvZihidWYpLTEpKTsKIAlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXN3aXRjaCAoYnVmWzBdKSB7Ci0JY2FzZSAneSc6Ci0JY2FzZSAnWSc6Ci0JY2FzZSAnMSc6Ci0JCSp2YWwgPSAxOwotCQlicmVhazsKLQljYXNlICduJzoKLQljYXNlICdOJzoKLQljYXNlICcwJzoKLQkJKnZhbCA9IDA7Ci0JCWJyZWFrOwotCX0KLQkKKwlpZiAoc3RydG9ib29sKGJ1ZiwgJmJ2KSA9PSAwKQorCQkqdmFsID0gYnY7CisKIAlyZXR1cm4gY291bnQ7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmMgYi9mcy9vY2ZzMi9jbHVzdGVyL2hlYXJ0YmVhdC5jCmluZGV4IDY0MzcyMDIuLjlhM2U2YmIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmMKKysrIGIvZnMvb2NmczIvY2x1c3Rlci9oZWFydGJlYXQuYwpAQCAtNTM5LDI1ICs1MzksNDEgQEAKIAogLyogV2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCBub2JvZHkgaXMgaGVhcnRiZWF0aW5nIG9uIHRvcCBvZiB1cyAtLQogICogdGhpcyB3aWxsIGhlbHAgZGV0ZWN0IGFuIGludmFsaWQgY29uZmlndXJhdGlvbi4gKi8KLXN0YXRpYyBpbnQgbzJoYl9jaGVja19sYXN0X3RpbWVzdGFtcChzdHJ1Y3QgbzJoYl9yZWdpb24gKnJlZykKK3N0YXRpYyB2b2lkIG8yaGJfY2hlY2tfbGFzdF90aW1lc3RhbXAoc3RydWN0IG8yaGJfcmVnaW9uICpyZWcpCiB7Ci0JaW50IG5vZGVfbnVtLCByZXQ7CiAJc3RydWN0IG8yaGJfZGlza19zbG90ICpzbG90OwogCXN0cnVjdCBvMmhiX2Rpc2tfaGVhcnRiZWF0X2Jsb2NrICpoYl9ibG9jazsKKwljaGFyICplcnJzdHI7CiAKLQlub2RlX251bSA9IG8ybm1fdGhpc19ub2RlKCk7Ci0KLQlyZXQgPSAxOwotCXNsb3QgPSAmcmVnLT5ocl9zbG90c1tub2RlX251bV07CisJc2xvdCA9ICZyZWctPmhyX3Nsb3RzW28ybm1fdGhpc19ub2RlKCldOwogCS8qIERvbid0IGNoZWNrIG9uIG91ciAxc3QgdGltZXN0YW1wICovCi0JaWYgKHNsb3QtPmRzX2xhc3RfdGltZSkgewotCQloYl9ibG9jayA9IHNsb3QtPmRzX3Jhd19ibG9jazsKKwlpZiAoIXNsb3QtPmRzX2xhc3RfdGltZSkKKwkJcmV0dXJuOwogCi0JCWlmIChsZTY0X3RvX2NwdShoYl9ibG9jay0+aGJfc2VxKSAhPSBzbG90LT5kc19sYXN0X3RpbWUpCi0JCQlyZXQgPSAwOwotCX0KKwloYl9ibG9jayA9IHNsb3QtPmRzX3Jhd19ibG9jazsKKwlpZiAobGU2NF90b19jcHUoaGJfYmxvY2stPmhiX3NlcSkgPT0gc2xvdC0+ZHNfbGFzdF90aW1lICYmCisJICAgIGxlNjRfdG9fY3B1KGhiX2Jsb2NrLT5oYl9nZW5lcmF0aW9uKSA9PSBzbG90LT5kc19sYXN0X2dlbmVyYXRpb24gJiYKKwkgICAgaGJfYmxvY2stPmhiX25vZGUgPT0gc2xvdC0+ZHNfbm9kZV9udW0pCisJCXJldHVybjsKIAotCXJldHVybiByZXQ7CisjZGVmaW5lIEVSUlNUUjEJCSJBbm90aGVyIG5vZGUgaXMgaGVhcnRiZWF0aW5nIG9uIGRldmljZSIKKyNkZWZpbmUgRVJSU1RSMgkJIkhlYXJ0YmVhdCBnZW5lcmF0aW9uIG1pc21hdGNoIG9uIGRldmljZSIKKyNkZWZpbmUgRVJSU1RSMwkJIkhlYXJ0YmVhdCBzZXF1ZW5jZSBtaXNtYXRjaCBvbiBkZXZpY2UiCisKKwlpZiAoaGJfYmxvY2stPmhiX25vZGUgIT0gc2xvdC0+ZHNfbm9kZV9udW0pCisJCWVycnN0ciA9IEVSUlNUUjE7CisJZWxzZSBpZiAobGU2NF90b19jcHUoaGJfYmxvY2stPmhiX2dlbmVyYXRpb24pICE9CisJCSBzbG90LT5kc19sYXN0X2dlbmVyYXRpb24pCisJCWVycnN0ciA9IEVSUlNUUjI7CisJZWxzZQorCQllcnJzdHIgPSBFUlJTVFIzOworCisJbWxvZyhNTF9FUlJPUiwgIiVzICglcyk6IGV4cGVjdGVkKCV1OjB4JWxseCwgMHglbGx4KSwgIgorCSAgICAgIm9uZGlzaygldToweCVsbHgsIDB4JWxseClcbiIsIGVycnN0ciwgcmVnLT5ocl9kZXZfbmFtZSwKKwkgICAgIHNsb3QtPmRzX25vZGVfbnVtLCAodW5zaWduZWQgbG9uZyBsb25nKXNsb3QtPmRzX2xhc3RfZ2VuZXJhdGlvbiwKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2xvdC0+ZHNfbGFzdF90aW1lLCBoYl9ibG9jay0+aGJfbm9kZSwKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoaGJfYmxvY2stPmhiX2dlbmVyYXRpb24pLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShoYl9ibG9jay0+aGJfc2VxKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBvMmhiX3ByZXBhcmVfYmxvY2soc3RydWN0IG8yaGJfcmVnaW9uICpyZWcsCkBAIC05ODMsOSArOTk5LDcgQEAKIAkvKiBXaXRoIGFuIHVwIHRvIGRhdGUgdmlldyBvZiB0aGUgc2xvdHMsIHdlIGNhbiBjaGVjayB0aGF0IG5vCiAJICogb3RoZXIgbm9kZSBoYXMgYmVlbiBpbXByb3Blcmx5IGNvbmZpZ3VyZWQgdG8gaGVhcnRiZWF0IGluCiAJICogb3VyIHNsb3QuICovCi0JaWYgKCFvMmhiX2NoZWNrX2xhc3RfdGltZXN0YW1wKHJlZykpCi0JCW1sb2coTUxfRVJST1IsICJEZXZpY2UgXCIlc1wiOiBhbm90aGVyIG5vZGUgaXMgaGVhcnRiZWF0aW5nICIKLQkJICAgICAiaW4gb3VyIHNsb3QhXG4iLCByZWctPmhyX2Rldl9uYW1lKTsKKwlvMmhiX2NoZWNrX2xhc3RfdGltZXN0YW1wKHJlZyk7CiAKIAkvKiBmaWxsIGluIHRoZSBwcm9wZXIgaW5mbyBmb3Igb3VyIG5leHQgaGVhcnRiZWF0ICovCiAJbzJoYl9wcmVwYXJlX2Jsb2NrKHJlZywgcmVnLT5ocl9nZW5lcmF0aW9uKTsKQEAgLTk5OSw4ICsxMDEzLDggQEAKIAl9CiAKIAlpID0gLTE7Ci0Jd2hpbGUoKGkgPSBmaW5kX25leHRfYml0KGNvbmZpZ3VyZWRfbm9kZXMsIE8yTk1fTUFYX05PREVTLCBpICsgMSkpIDwgTzJOTV9NQVhfTk9ERVMpIHsKLQorCXdoaWxlKChpID0gZmluZF9uZXh0X2JpdChjb25maWd1cmVkX25vZGVzLAorCQkJCSBPMk5NX01BWF9OT0RFUywgaSArIDEpKSA8IE8yTk1fTUFYX05PREVTKSB7CiAJCWNoYW5nZSB8PSBvMmhiX2NoZWNrX3Nsb3QocmVnLCAmcmVnLT5ocl9zbG90c1tpXSk7CiAJfQogCkBAIC0xNjkwLDYgKzE3MDQsNyBAQAogCXN0cnVjdCBmaWxlICpmaWxwID0gTlVMTDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKIAlzc2l6ZV90IHJldCA9IC1FSU5WQUw7CisJaW50IGxpdmVfdGhyZXNob2xkOwogCiAJaWYgKHJlZy0+aHJfYmRldikKIAkJZ290byBvdXQ7CkBAIC0xNzY2LDggKzE3ODEsMTggQEAKIAkgKiBBIG5vZGUgaXMgY29uc2lkZXJlZCBsaXZlIGFmdGVyIGl0IGhhcyBiZWF0IExJVkVfVEhSRVNIT0xECiAJICogdGltZXMuICBXZSdyZSBub3Qgc3RlYWR5IHVudGlsIHdlJ3ZlIGdpdmVuIHRoZW0gYSBjaGFuY2UKIAkgKiBfYWZ0ZXJfIG91ciBmaXJzdCByZWFkLgorCSAqIFRoZSBkZWZhdWx0IHRocmVzaG9sZCBpcyBiYXJlIG1pbmltdW0gc28gYXMgdG8gbGltaXQgdGhlIGRlbGF5CisJICogZHVyaW5nIG1vdW50cy4gRm9yIGdsb2JhbCBoZWFydGJlYXQsIHRoZSB0aHJlc2hvbGQgZG91YmxlZCBmb3IgdGhlCisJICogZmlyc3QgcmVnaW9uLgogCSAqLwotCWF0b21pY19zZXQoJnJlZy0+aHJfc3RlYWR5X2l0ZXJhdGlvbnMsIE8ySEJfTElWRV9USFJFU0hPTEQgKyAxKTsKKwlsaXZlX3RocmVzaG9sZCA9IE8ySEJfTElWRV9USFJFU0hPTEQ7CisJaWYgKG8yaGJfZ2xvYmFsX2hlYXJ0YmVhdF9hY3RpdmUoKSkgeworCQlzcGluX2xvY2soJm8yaGJfbGl2ZV9sb2NrKTsKKwkJaWYgKG8yaGJfcG9wX2NvdW50KCZvMmhiX3JlZ2lvbl9iaXRtYXAsIE8yTk1fTUFYX1JFR0lPTlMpID09IDEpCisJCQlsaXZlX3RocmVzaG9sZCA8PD0gMTsKKwkJc3Bpbl91bmxvY2soJm8yaGJfbGl2ZV9sb2NrKTsKKwl9CisJYXRvbWljX3NldCgmcmVnLT5ocl9zdGVhZHlfaXRlcmF0aW9ucywgbGl2ZV90aHJlc2hvbGQgKyAxKTsKIAogCWhiX3Rhc2sgPSBrdGhyZWFkX3J1bihvMmhiX3RocmVhZCwgcmVnLCAibzJoYi0lcyIsCiAJCQkgICAgICByZWctPmhyX2l0ZW0uY2lfbmFtZSk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kaXIuYyBiL2ZzL29jZnMyL2Rpci5jCmluZGV4IDlmZTViOGZkLi44NTgyZTNmIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kaXIuYworKysgYi9mcy9vY2ZzMi9kaXIuYwpAQCAtMjg2OCw3ICsyODY4LDcgQEAKIAkJYnl0ZXMgPSBibG9ja3Nfd2FudGVkIDw8IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoZGlyLT5pX3NiKTsKIAlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGRpcik7Ci0Jc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWM7CisJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMgPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpcmRhdGFfYmggPSBOVUxMOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqZHhfcm9vdF9iaCA9IE5VTEw7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtZG9tYWluLmMgYi9mcy9vY2ZzMi9kbG0vZGxtZG9tYWluLmMKaW5kZXggNzU0MGE0OS4uM2IxNzlkNiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWRvbWFpbi5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1kb21haW4uYwpAQCAtMTYxNCw3ICsxNjE0LDggQEAKIAlzcGluX3VubG9jaygmZGxtLT5zcGlubG9jayk7CiAKIAkvKiBTdXBwb3J0IGZvciBnbG9iYWwgaGVhcnRiZWF0IGFuZCBub2RlIGluZm8gd2FzIGFkZGVkIGluIDEuMSAqLwotCWlmIChkbG1fcHJvdG9jb2wucHZfbWFqb3IgPiAxIHx8IGRsbV9wcm90b2NvbC5wdl9taW5vciA+IDApIHsKKwlpZiAoZGxtLT5kbG1fbG9ja2luZ19wcm90by5wdl9tYWpvciA+IDEgfHwKKwkgICAgZGxtLT5kbG1fbG9ja2luZ19wcm90by5wdl9taW5vciA+IDApIHsKIAkJc3RhdHVzID0gZGxtX3NlbmRfbm9kZWluZm8oZGxtLCBjdHh0LT55ZXNfcmVzcF9tYXApOwogCQlpZiAoc3RhdHVzKSB7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtbWFzdGVyLmMgYi9mcy9vY2ZzMi9kbG0vZGxtbWFzdGVyLmMKaW5kZXggZmVkZTU3ZS4uODRkMTY2MyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbW1hc3Rlci5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1tYXN0ZXIuYwpAQCAtMjU3NCw2ICsyNTc0LDkgQEAKIAkJcmVzLT5zdGF0ZSAmPSB+RExNX0xPQ0tfUkVTX01JR1JBVElORzsKIAkJd2FrZSA9IDE7CiAJCXNwaW5fdW5sb2NrKCZyZXMtPnNwaW5sb2NrKTsKKwkJaWYgKGRsbV9pc19ob3N0X2Rvd24ocmV0KSkKKwkJCWRsbV93YWl0X2Zvcl9ub2RlX2RlYXRoKGRsbSwgdGFyZ2V0LAorCQkJCQkJRExNX05PREVfREVBVEhfV0FJVF9NQVgpOwogCQlnb3RvIGxlYXZlOwogCX0KIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZmlsZS5jIGIvZnMvb2NmczIvZmlsZS5jCmluZGV4IDQxNTY1YWUuLjg5NjU5ZDYgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2ZpbGUuYworKysgYi9mcy9vY2ZzMi9maWxlLmMKQEAgLTE2MDcsNiArMTYwNyw5IEBACiAJcmFuZ2UgPSBsZTMyX3RvX2NwdShyZWMtPmVfY3BvcykgKyBvY2ZzMl9yZWNfY2x1c3RlcnMoZWwsIHJlYyk7CiAKIAlpZiAobGUzMl90b19jcHUocmVjLT5lX2Nwb3MpID49IHRydW5jX3N0YXJ0KSB7CisJCS8qCisJCSAqIHJlbW92ZSBhbiBlbnRpcmUgZXh0ZW50IHJlY29yZC4KKwkJICovCiAJCSp0cnVuY19jcG9zID0gbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpOwogCQkvKgogCQkgKiBTa2lwIGhvbGVzIGlmIGFueS4KQEAgLTE2MTcsNyArMTYyMCwxNiBAQAogCQkqYmxrbm8gPSBsZTY0X3RvX2NwdShyZWMtPmVfYmxrbm8pOwogCQkqdHJ1bmNfZW5kID0gbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpOwogCX0gZWxzZSBpZiAocmFuZ2UgPiB0cnVuY19zdGFydCkgeworCQkvKgorCQkgKiByZW1vdmUgYSBwYXJ0aWFsIGV4dGVudCByZWNvcmQsIHdoaWNoIG1lYW5zIHdlJ3JlCisJCSAqIHJlbW92aW5nIHRoZSBsYXN0IGV4dGVudCByZWNvcmQuCisJCSAqLwogCQkqdHJ1bmNfY3BvcyA9IHRydW5jX3N0YXJ0OworCQkvKgorCQkgKiBza2lwIGhvbGUgaWYgYW55LgorCQkgKi8KKwkJaWYgKHJhbmdlIDwgKnRydW5jX2VuZCkKKwkJCSp0cnVuY19lbmQgPSByYW5nZTsKIAkJKnRydW5jX2xlbiA9ICp0cnVuY19lbmQgLSB0cnVuY19zdGFydDsKIAkJY29mZiA9IHRydW5jX3N0YXJ0IC0gbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpOwogCQkqYmxrbm8gPSBsZTY0X3RvX2NwdShyZWMtPmVfYmxrbm8pICsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2pvdXJuYWwuYyBiL2ZzL29jZnMyL2pvdXJuYWwuYwppbmRleCBiMTQxYTQ0Li4yOTVkNTY0IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9qb3VybmFsLmMKKysrIGIvZnMvb2NmczIvam91cm5hbC5jCkBAIC0xMjYwLDYgKzEyNjAsOSBAQAogewogCXN0cnVjdCBvY2ZzMl9qb3VybmFsICpqb3VybmFsID0gb3NiLT5qb3VybmFsOwogCisJaWYgKG9jZnMyX2lzX2hhcmRfcmVhZG9ubHkob3NiKSkKKwkJcmV0dXJuOworCiAJLyogTm8gbmVlZCB0byBxdWV1ZSB1cCBvdXIgdHJ1bmNhdGVfbG9nIGFzIHJlZ3VsYXIgY2xlYW51cCB3aWxsIGNhdGNoCiAJICogdGhhdCAqLwogCW9jZnMyX3F1ZXVlX3JlY292ZXJ5X2NvbXBsZXRpb24oam91cm5hbCwgb3NiLT5zbG90X251bSwKZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL2ZpbGUuYyBiL2ZzL3N5c2ZzL2ZpbGUuYwppbmRleCBkYTNmZWZlLi4xYWQ4YzkzIDEwMDY0NAotLS0gYS9mcy9zeXNmcy9maWxlLmMKKysrIGIvZnMvc3lzZnMvZmlsZS5jCkBAIC0yNCwxMyArMjQsNiBAQAogCiAjaW5jbHVkZSAic3lzZnMuaCIKIAotLyogdXNlZCBpbiBjcmFzaCBkdW1wcyB0byBoZWxwIHdpdGggZGVidWdnaW5nICovCi1zdGF0aWMgY2hhciBsYXN0X3N5c2ZzX2ZpbGVbUEFUSF9NQVhdOwotdm9pZCBzeXNmc19wcmludGtfbGFzdF9maWxlKHZvaWQpCi17Ci0JcHJpbnRrKEtFUk5fRU1FUkcgImxhc3Qgc3lzZnMgZmlsZTogJXNcbiIsIGxhc3Rfc3lzZnNfZmlsZSk7Ci19Ci0KIC8qCiAgKiBUaGVyZSdzIG9uZSBzeXNmc19idWZmZXIgZm9yIGVhY2ggb3BlbiBmaWxlIGFuZCBvbmUKICAqIHN5c2ZzX29wZW5fZGlyZW50IGZvciBlYWNoIHN5c2ZzX2RpcmVudCB3aXRoIG9uZSBvciBtb3JlIG9wZW4KQEAgLTMzNywxMSArMzMwLDYgQEAKIAlzdHJ1Y3Qgc3lzZnNfYnVmZmVyICpidWZmZXI7CiAJY29uc3Qgc3RydWN0IHN5c2ZzX29wcyAqb3BzOwogCWludCBlcnJvciA9IC1FQUNDRVM7Ci0JY2hhciAqcDsKLQotCXAgPSBkX3BhdGgoJmZpbGUtPmZfcGF0aCwgbGFzdF9zeXNmc19maWxlLCBzaXplb2YobGFzdF9zeXNmc19maWxlKSk7Ci0JaWYgKCFJU19FUlIocCkpCi0JCW1lbW1vdmUobGFzdF9zeXNmc19maWxlLCBwLCBzdHJsZW4ocCkgKyAxKTsKIAogCS8qIG5lZWQgYXR0cl9zZCBmb3IgYXR0ciBhbmQgb3BzLCBpdHMgcGFyZW50IGZvciBrb2JqICovCiAJaWYgKCFzeXNmc19nZXRfYWN0aXZlKGF0dHJfc2QpKQpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvZ3JvdXAuYyBiL2ZzL3N5c2ZzL2dyb3VwLmMKaW5kZXggYzg3NjlkYzIuLjE5NDQxNGYgMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL2dyb3VwLmMKKysrIGIvZnMvc3lzZnMvZ3JvdXAuYwpAQCAtMTAxLDkgKzEwMSw5IEBACiB9CiAKIC8qKgotICogc3lzZnNfdXBkYXRlX2dyb3VwIC0gZ2l2ZW4gYSBkaXJlY3Rvcnkga29iamVjdCwgY3JlYXRlIGFuIGF0dHJpYnV0ZSBncm91cAotICogQGtvYmo6CVRoZSBrb2JqZWN0IHRvIGNyZWF0ZSB0aGUgZ3JvdXAgb24KLSAqIEBncnA6CVRoZSBhdHRyaWJ1dGUgZ3JvdXAgdG8gY3JlYXRlCisgKiBzeXNmc191cGRhdGVfZ3JvdXAgLSBnaXZlbiBhIGRpcmVjdG9yeSBrb2JqZWN0LCB1cGRhdGUgYW4gYXR0cmlidXRlIGdyb3VwCisgKiBAa29iajoJVGhlIGtvYmplY3QgdG8gdXBkYXRlIHRoZSBncm91cCBvbgorICogQGdycDoJVGhlIGF0dHJpYnV0ZSBncm91cCB0byB1cGRhdGUKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgYW4gYXR0cmlidXRlIGdyb3VwLiAgVW5saWtlCiAgKiBzeXNmc19jcmVhdGVfZ3JvdXAoKSwgaXQgd2lsbCBleHBsaWNpdGx5IG5vdCB3YXJuIG9yIGVycm9yIGlmIGFueQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oCmluZGV4IGJkMjk3YTIuLjA3N2MwMGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmgKQEAgLTE3MCw2ICsxNzAsMTAgQEAKIAlTVFJVQ1RfQUxJR04oKTsJCQkJCQkJXAogCSooX190cmFjZXBvaW50cykJCQkJCQlcCiAJLyogaW1wbGVtZW50IGR5bmFtaWMgcHJpbnRrIGRlYnVnICovCQkJCVwKKwkuID0gQUxJR04oOCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCVZNTElOVVhfU1lNQk9MKF9fc3RhcnRfX19qdW1wX3RhYmxlKSA9IC47ICAgICAgICAgICAgICAgICAgICAgICBcCisJKihfX2p1bXBfdGFibGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlWTUxJTlVYX1NZTUJPTChfX3N0b3BfX19qdW1wX3RhYmxlKSA9IC47ICAgICAgICAgICAgICAgICAgICAgICAgXAogCS4gPSBBTElHTig4KTsJCQkJCQkJXAogCVZNTElOVVhfU1lNQk9MKF9fc3RhcnRfX192ZXJib3NlKSA9IC47ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJKihfX3ZlcmJvc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTIyOCw4ICsyMzIsNiBAQAogCQkJCQkJCQkJXAogCUJVR19UQUJMRQkJCQkJCQlcCiAJCQkJCQkJCQlcCi0JSlVNUF9UQUJMRQkJCQkJCQlcCi0JCQkJCQkJCQlcCiAJLyogUENJIHF1aXJrcyAqLwkJCQkJCVwKIAkucGNpX2ZpeHVwICAgICAgICA6IEFUKEFERFIoLnBjaV9maXh1cCkgLSBMT0FEX09GRlNFVCkgewlcCiAJCVZNTElOVVhfU1lNQk9MKF9fc3RhcnRfcGNpX2ZpeHVwc19lYXJseSkgPSAuOwkJXApAQCAtMjc0LDcwICsyNzYsNzAgQEAKIAkvKiBLZXJuZWwgc3ltYm9sIHRhYmxlOiBOb3JtYWwgc3ltYm9scyAqLwkJCVwKIAlfX2tzeW10YWIgICAgICAgICA6IEFUKEFERFIoX19rc3ltdGFiKSAtIExPQURfT0ZGU0VUKSB7CQlcCiAJCVZNTElOVVhfU1lNQk9MKF9fc3RhcnRfX19rc3ltdGFiKSA9IC47CQkJXAotCQkqKF9fa3N5bXRhYikJCQkJCQlcCisJCSooU09SVChfX19rc3ltdGFiKyopKQkJCQkJXAogCQlWTUxJTlVYX1NZTUJPTChfX3N0b3BfX19rc3ltdGFiKSA9IC47CQkJXAogCX0JCQkJCQkJCVwKIAkJCQkJCQkJCVwKIAkvKiBLZXJuZWwgc3ltYm9sIHRhYmxlOiBHUEwtb25seSBzeW1ib2xzICovCQkJXAogCV9fa3N5bXRhYl9ncGwgICAgIDogQVQoQUREUihfX2tzeW10YWJfZ3BsKSAtIExPQURfT0ZGU0VUKSB7CVwKIAkJVk1MSU5VWF9TWU1CT0woX19zdGFydF9fX2tzeW10YWJfZ3BsKSA9IC47CQlcCi0JCSooX19rc3ltdGFiX2dwbCkJCQkJCVwKKwkJKihTT1JUKF9fX2tzeW10YWJfZ3BsKyopKQkJCQlcCiAJCVZNTElOVVhfU1lNQk9MKF9fc3RvcF9fX2tzeW10YWJfZ3BsKSA9IC47CQlcCiAJfQkJCQkJCQkJXAogCQkJCQkJCQkJXAogCS8qIEtlcm5lbCBzeW1ib2wgdGFibGU6IE5vcm1hbCB1bnVzZWQgc3ltYm9scyAqLwkJXAogCV9fa3N5bXRhYl91bnVzZWQgIDogQVQoQUREUihfX2tzeW10YWJfdW51c2VkKSAtIExPQURfT0ZGU0VUKSB7CVwKIAkJVk1MSU5VWF9TWU1CT0woX19zdGFydF9fX2tzeW10YWJfdW51c2VkKSA9IC47CQlcCi0JCSooX19rc3ltdGFiX3VudXNlZCkJCQkJCVwKKwkJKihTT1JUKF9fX2tzeW10YWJfdW51c2VkKyopKQkJCQlcCiAJCVZNTElOVVhfU1lNQk9MKF9fc3RvcF9fX2tzeW10YWJfdW51c2VkKSA9IC47CQlcCiAJfQkJCQkJCQkJXAogCQkJCQkJCQkJXAogCS8qIEtlcm5lbCBzeW1ib2wgdGFibGU6IEdQTC1vbmx5IHVudXNlZCBzeW1ib2xzICovCQlcCiAJX19rc3ltdGFiX3VudXNlZF9ncGwgOiBBVChBRERSKF9fa3N5bXRhYl91bnVzZWRfZ3BsKSAtIExPQURfT0ZGU0VUKSB7IFwKIAkJVk1MSU5VWF9TWU1CT0woX19zdGFydF9fX2tzeW10YWJfdW51c2VkX2dwbCkgPSAuOwlcCi0JCSooX19rc3ltdGFiX3VudXNlZF9ncGwpCQkJCQlcCisJCSooU09SVChfX19rc3ltdGFiX3VudXNlZF9ncGwrKikpCQkJXAogCQlWTUxJTlVYX1NZTUJPTChfX3N0b3BfX19rc3ltdGFiX3VudXNlZF9ncGwpID0gLjsJXAogCX0JCQkJCQkJCVwKIAkJCQkJCQkJCVwKIAkvKiBLZXJuZWwgc3ltYm9sIHRhYmxlOiBHUEwtZnV0dXJlLW9ubHkgc3ltYm9scyAqLwkJXAogCV9fa3N5bXRhYl9ncGxfZnV0dXJlIDogQVQoQUREUihfX2tzeW10YWJfZ3BsX2Z1dHVyZSkgLSBMT0FEX09GRlNFVCkgeyBcCiAJCVZNTElOVVhfU1lNQk9MKF9fc3RhcnRfX19rc3ltdGFiX2dwbF9mdXR1cmUpID0gLjsJXAotCQkqKF9fa3N5bXRhYl9ncGxfZnV0dXJlKQkJCQkJXAorCQkqKFNPUlQoX19fa3N5bXRhYl9ncGxfZnV0dXJlKyopKQkJCVwKIAkJVk1MSU5VWF9TWU1CT0woX19zdG9wX19fa3N5bXRhYl9ncGxfZnV0dXJlKSA9IC47CVwKIAl9CQkJCQkJCQlcCiAJCQkJCQkJCQlcCiAJLyogS2VybmVsIHN5bWJvbCB0YWJsZTogTm9ybWFsIHN5bWJvbHMgKi8JCQlcCiAJX19rY3JjdGFiICAgICAgICAgOiBBVChBRERSKF9fa2NyY3RhYikgLSBMT0FEX09GRlNFVCkgewkJXAogCQlWTUxJTlVYX1NZTUJPTChfX3N0YXJ0X19fa2NyY3RhYikgPSAuOwkJCVwKLQkJKihfX2tjcmN0YWIpCQkJCQkJXAorCQkqKFNPUlQoX19fa2NyY3RhYisqKSkJCQkJCVwKIAkJVk1MSU5VWF9TWU1CT0woX19zdG9wX19fa2NyY3RhYikgPSAuOwkJCVwKIAl9CQkJCQkJCQlcCiAJCQkJCQkJCQlcCiAJLyogS2VybmVsIHN5bWJvbCB0YWJsZTogR1BMLW9ubHkgc3ltYm9scyAqLwkJCVwKIAlfX2tjcmN0YWJfZ3BsICAgICA6IEFUKEFERFIoX19rY3JjdGFiX2dwbCkgLSBMT0FEX09GRlNFVCkgewlcCiAJCVZNTElOVVhfU1lNQk9MKF9fc3RhcnRfX19rY3JjdGFiX2dwbCkgPSAuOwkJXAotCQkqKF9fa2NyY3RhYl9ncGwpCQkJCQlcCisJCSooU09SVChfX19rY3JjdGFiX2dwbCsqKSkJCQkJXAogCQlWTUxJTlVYX1NZTUJPTChfX3N0b3BfX19rY3JjdGFiX2dwbCkgPSAuOwkJXAogCX0JCQkJCQkJCVwKIAkJCQkJCQkJCVwKIAkvKiBLZXJuZWwgc3ltYm9sIHRhYmxlOiBOb3JtYWwgdW51c2VkIHN5bWJvbHMgKi8JCVwKIAlfX2tjcmN0YWJfdW51c2VkICA6IEFUKEFERFIoX19rY3JjdGFiX3VudXNlZCkgLSBMT0FEX09GRlNFVCkgewlcCiAJCVZNTElOVVhfU1lNQk9MKF9fc3RhcnRfX19rY3JjdGFiX3VudXNlZCkgPSAuOwkJXAotCQkqKF9fa2NyY3RhYl91bnVzZWQpCQkJCQlcCisJCSooU09SVChfX19rY3JjdGFiX3VudXNlZCsqKSkJCQkJXAogCQlWTUxJTlVYX1NZTUJPTChfX3N0b3BfX19rY3JjdGFiX3VudXNlZCkgPSAuOwkJXAogCX0JCQkJCQkJCVwKIAkJCQkJCQkJCVwKIAkvKiBLZXJuZWwgc3ltYm9sIHRhYmxlOiBHUEwtb25seSB1bnVzZWQgc3ltYm9scyAqLwkJXAogCV9fa2NyY3RhYl91bnVzZWRfZ3BsIDogQVQoQUREUihfX2tjcmN0YWJfdW51c2VkX2dwbCkgLSBMT0FEX09GRlNFVCkgeyBcCiAJCVZNTElOVVhfU1lNQk9MKF9fc3RhcnRfX19rY3JjdGFiX3VudXNlZF9ncGwpID0gLjsJXAotCQkqKF9fa2NyY3RhYl91bnVzZWRfZ3BsKQkJCQkJXAorCQkqKFNPUlQoX19fa2NyY3RhYl91bnVzZWRfZ3BsKyopKQkJCVwKIAkJVk1MSU5VWF9TWU1CT0woX19zdG9wX19fa2NyY3RhYl91bnVzZWRfZ3BsKSA9IC47CVwKIAl9CQkJCQkJCQlcCiAJCQkJCQkJCQlcCiAJLyogS2VybmVsIHN5bWJvbCB0YWJsZTogR1BMLWZ1dHVyZS1vbmx5IHN5bWJvbHMgKi8JCVwKIAlfX2tjcmN0YWJfZ3BsX2Z1dHVyZSA6IEFUKEFERFIoX19rY3JjdGFiX2dwbF9mdXR1cmUpIC0gTE9BRF9PRkZTRVQpIHsgXAogCQlWTUxJTlVYX1NZTUJPTChfX3N0YXJ0X19fa2NyY3RhYl9ncGxfZnV0dXJlKSA9IC47CVwKLQkJKihfX2tjcmN0YWJfZ3BsX2Z1dHVyZSkJCQkJCVwKKwkJKihTT1JUKF9fX2tjcmN0YWJfZ3BsX2Z1dHVyZSsqKSkJCQlcCiAJCVZNTElOVVhfU1lNQk9MKF9fc3RvcF9fX2tjcmN0YWJfZ3BsX2Z1dHVyZSkgPSAuOwlcCiAJfQkJCQkJCQkJXAogCQkJCQkJCQkJXApAQCAtNTg5LDE0ICs1OTEsNiBAQAogI2RlZmluZSBCVUdfVEFCTEUKICNlbmRpZgogCi0jZGVmaW5lIEpVTVBfVEFCTEUJCQkJCQkJXAotCS4gPSBBTElHTig4KTsJCQkJCQkJXAotCV9fanVtcF90YWJsZSA6IEFUKEFERFIoX19qdW1wX3RhYmxlKSAtIExPQURfT0ZGU0VUKSB7CQlcCi0JCVZNTElOVVhfU1lNQk9MKF9fc3RhcnRfX19qdW1wX3RhYmxlKSA9IC47CQlcCi0JCSooX19qdW1wX3RhYmxlKQkJCQkJCVwKLQkJVk1MSU5VWF9TWU1CT0woX19zdG9wX19fanVtcF90YWJsZSkgPSAuOwkJXAotCX0KLQogI2lmZGVmIENPTkZJR19QTV9UUkFDRQogI2RlZmluZSBUUkFDRURBVEEJCQkJCQkJXAogCS4gPSBBTElHTig0KTsJCQkJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hbGFybXRpbWVyLmggYi9pbmNsdWRlL2xpbnV4L2FsYXJtdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWQ2MDk1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9hbGFybXRpbWVyLmgKQEAgLTAsMCArMSw0MCBAQAorI2lmbmRlZiBfTElOVVhfQUxBUk1USU1FUl9ICisjZGVmaW5lIF9MSU5VWF9BTEFSTVRJTUVSX0gKKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXJxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCitlbnVtIGFsYXJtdGltZXJfdHlwZSB7CisJQUxBUk1fUkVBTFRJTUUsCisJQUxBUk1fQk9PVFRJTUUsCisKKwlBTEFSTV9OVU1UWVBFLAorfTsKKworLyoqCisgKiBzdHJ1Y3QgYWxhcm0gLSBBbGFybSB0aW1lciBzdHJ1Y3R1cmUKKyAqIEBub2RlOgl0aW1lcnF1ZXVlIG5vZGUgZm9yIGFkZGluZyB0byB0aGUgZXZlbnQgbGlzdCB0aGlzIHZhbHVlCisgKgkJYWxzbyBpbmNsdWRlcyB0aGUgZXhwaXJhdGlvbiB0aW1lLgorICogQHBlcmlvZDoJUGVyaW9kIGZvciByZWN1cmluZyBhbGFybXMKKyAqIEBmdW5jdGlvbjoJRnVuY3Rpb24gcG9pbnRlciB0byBiZSBleGVjdXRlZCB3aGVuIHRoZSB0aW1lciBmaXJlcy4KKyAqIEB0eXBlOglBbGFybSB0eXBlIChCT09UVElNRS9SRUFMVElNRSkKKyAqIEBlbmFibGVkOglGbGFnIHRoYXQgcmVwcmVzZW50cyBpZiB0aGUgYWxhcm0gaXMgc2V0IHRvIGZpcmUgb3Igbm90CisgKiBAZGF0YToJSW50ZXJuYWwgZGF0YSB2YWx1ZS4KKyAqLworc3RydWN0IGFsYXJtIHsKKwlzdHJ1Y3QgdGltZXJxdWV1ZV9ub2RlCW5vZGU7CisJa3RpbWVfdAkJCXBlcmlvZDsKKwl2b2lkCQkJKCpmdW5jdGlvbikoc3RydWN0IGFsYXJtICopOworCWVudW0gYWxhcm10aW1lcl90eXBlCXR5cGU7CisJYm9vbAkJCWVuYWJsZWQ7CisJdm9pZAkJCSpkYXRhOworfTsKKwordm9pZCBhbGFybV9pbml0KHN0cnVjdCBhbGFybSAqYWxhcm0sIGVudW0gYWxhcm10aW1lcl90eXBlIHR5cGUsCisJCXZvaWQgKCpmdW5jdGlvbikoc3RydWN0IGFsYXJtICopKTsKK3ZvaWQgYWxhcm1fc3RhcnQoc3RydWN0IGFsYXJtICphbGFybSwga3RpbWVfdCBzdGFydCwga3RpbWVfdCBwZXJpb2QpOwordm9pZCBhbGFybV9jYW5jZWwoc3RydWN0IGFsYXJtICphbGFybSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ic2VhcmNoLmggYi9pbmNsdWRlL2xpbnV4L2JzZWFyY2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGIxYWE4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9ic2VhcmNoLmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9MSU5VWF9CU0VBUkNIX0gKKyNkZWZpbmUgX0xJTlVYX0JTRUFSQ0hfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwordm9pZCAqYnNlYXJjaChjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKmJhc2UsIHNpemVfdCBudW0sIHNpemVfdCBzaXplLAorCSAgICAgIGludCAoKmNtcCkoY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB2b2lkICplbHQpKTsKKworI2VuZGlmIC8qIF9MSU5VWF9CU0VBUkNIX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2FwYWJpbGl0eS5oIGIvaW5jbHVkZS9saW51eC9jYXBhYmlsaXR5LmgKaW5kZXggZDQ2NzVhZi4uNDU1NGRiMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jYXBhYmlsaXR5LmgKKysrIGIvaW5jbHVkZS9saW51eC9jYXBhYmlsaXR5LmgKQEAgLTM1NSw3ICszNTUsMTIgQEAKIAogI2RlZmluZSBDQVBfU1lTTE9HICAgICAgICAgICAzNAogCi0jZGVmaW5lIENBUF9MQVNUX0NBUCAgICAgICAgIENBUF9TWVNMT0cKKy8qIEFsbG93IHRyaWdnZXJpbmcgc29tZXRoaW5nIHRoYXQgd2lsbCB3YWtlIHRoZSBzeXN0ZW0gKi8KKworI2RlZmluZSBDQVBfV0FLRV9BTEFSTSAgICAgICAgICAgIDM1CisKKworI2RlZmluZSBDQVBfTEFTVF9DQVAgICAgICAgICBDQVBfV0FLRV9BTEFSTQogCiAjZGVmaW5lIGNhcF92YWxpZCh4KSAoKHgpID49IDAgJiYgKHgpIDw9IENBUF9MQVNUX0NBUCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jbG9ja2NoaXBzLmggYi9pbmNsdWRlL2xpbnV4L2Nsb2NrY2hpcHMuaAppbmRleCBmYzUzNDkyLi5kNjczM2UyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Nsb2NrY2hpcHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nsb2NrY2hpcHMuaApAQCAtNTYsNDYgKzU2LDUyIEBACiAKIC8qKgogICogc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAtIGNsb2NrIGV2ZW50IGRldmljZSBkZXNjcmlwdG9yCi0gKiBAbmFtZToJCXB0ciB0byBjbG9jayBldmVudCBuYW1lCi0gKiBAZmVhdHVyZXM6CQlmZWF0dXJlcworICogQGV2ZW50X2hhbmRsZXI6CUFzc2lnbmVkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gYmUgY2FsbGVkIGJ5IHRoZSBsb3cKKyAqCQkJbGV2ZWwgaGFuZGxlciBvZiB0aGUgZXZlbnQgc291cmNlCisgKiBAc2V0X25leHRfZXZlbnQ6CXNldCBuZXh0IGV2ZW50IGZ1bmN0aW9uCisgKiBAbmV4dF9ldmVudDoJCWxvY2FsIHN0b3JhZ2UgZm9yIHRoZSBuZXh0IGV2ZW50IGluIG9uZXNob3QgbW9kZQogICogQG1heF9kZWx0YV9uczoJbWF4aW11bSBkZWx0YSB2YWx1ZSBpbiBucwogICogQG1pbl9kZWx0YV9uczoJbWluaW11bSBkZWx0YSB2YWx1ZSBpbiBucwogICogQG11bHQ6CQluYW5vc2Vjb25kIHRvIGN5Y2xlcyBtdWx0aXBsaWVyCiAgKiBAc2hpZnQ6CQluYW5vc2Vjb25kcyB0byBjeWNsZXMgZGl2aXNvciAocG93ZXIgb2YgdHdvKQorICogQG1vZGU6CQlvcGVyYXRpbmcgbW9kZSBhc3NpZ25lZCBieSB0aGUgbWFuYWdlbWVudCBjb2RlCisgKiBAZmVhdHVyZXM6CQlmZWF0dXJlcworICogQHJldHJpZXM6CQludW1iZXIgb2YgZm9yY2VkIHByb2dyYW1taW5nIHJldHJpZXMKKyAqIEBzZXRfbW9kZToJCXNldCBtb2RlIGZ1bmN0aW9uCisgKiBAYnJvYWRjYXN0OgkJZnVuY3Rpb24gdG8gYnJvYWRjYXN0IGV2ZW50cworICogQG1pbl9kZWx0YV90aWNrczoJbWluaW11bSBkZWx0YSB2YWx1ZSBpbiB0aWNrcyBzdG9yZWQgZm9yIHJlY29uZmlndXJhdGlvbgorICogQG1heF9kZWx0YV90aWNrczoJbWF4aW11bSBkZWx0YSB2YWx1ZSBpbiB0aWNrcyBzdG9yZWQgZm9yIHJlY29uZmlndXJhdGlvbgorICogQG5hbWU6CQlwdHIgdG8gY2xvY2sgZXZlbnQgbmFtZQogICogQHJhdGluZzoJCXZhcmlhYmxlIHRvIHJhdGUgY2xvY2sgZXZlbnQgZGV2aWNlcwogICogQGlycToJCUlSUSBudW1iZXIgKG9ubHkgZm9yIG5vbiBDUFUgbG9jYWwgZGV2aWNlcykKICAqIEBjcHVtYXNrOgkJY3B1bWFzayB0byBpbmRpY2F0ZSBmb3Igd2hpY2ggQ1BVcyB0aGlzIGRldmljZSB3b3JrcwotICogQHNldF9uZXh0X2V2ZW50OglzZXQgbmV4dCBldmVudCBmdW5jdGlvbgotICogQHNldF9tb2RlOgkJc2V0IG1vZGUgZnVuY3Rpb24KLSAqIEBldmVudF9oYW5kbGVyOglBc3NpZ25lZCBieSB0aGUgZnJhbWV3b3JrIHRvIGJlIGNhbGxlZCBieSB0aGUgbG93Ci0gKgkJCWxldmVsIGhhbmRsZXIgb2YgdGhlIGV2ZW50IHNvdXJjZQotICogQGJyb2FkY2FzdDoJCWZ1bmN0aW9uIHRvIGJyb2FkY2FzdCBldmVudHMKICAqIEBsaXN0OgkJbGlzdCBoZWFkIGZvciB0aGUgbWFuYWdlbWVudCBjb2RlCi0gKiBAbW9kZToJCW9wZXJhdGluZyBtb2RlIGFzc2lnbmVkIGJ5IHRoZSBtYW5hZ2VtZW50IGNvZGUKLSAqIEBuZXh0X2V2ZW50OgkJbG9jYWwgc3RvcmFnZSBmb3IgdGhlIG5leHQgZXZlbnQgaW4gb25lc2hvdCBtb2RlCi0gKiBAcmV0cmllczoJCW51bWJlciBvZiBmb3JjZWQgcHJvZ3JhbW1pbmcgcmV0cmllcwogICovCiBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIHsKLQljb25zdCBjaGFyCQkqbmFtZTsKLQl1bnNpZ25lZCBpbnQJCWZlYXR1cmVzOworCXZvaWQJCQkoKmV2ZW50X2hhbmRsZXIpKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKik7CisJaW50CQkJKCpzZXRfbmV4dF9ldmVudCkodW5zaWduZWQgbG9uZyBldnQsCisJCQkJCQkgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKik7CisJa3RpbWVfdAkJCW5leHRfZXZlbnQ7CiAJdTY0CQkJbWF4X2RlbHRhX25zOwogCXU2NAkJCW1pbl9kZWx0YV9uczsKIAl1MzIJCQltdWx0OwogCXUzMgkJCXNoaWZ0OworCWVudW0gY2xvY2tfZXZlbnRfbW9kZQltb2RlOworCXVuc2lnbmVkIGludAkJZmVhdHVyZXM7CisJdW5zaWduZWQgbG9uZwkJcmV0cmllczsKKworCXZvaWQJCQkoKmJyb2FkY2FzdCkoY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spOworCXZvaWQJCQkoKnNldF9tb2RlKShlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSwKKwkJCQkJICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKik7CisJdW5zaWduZWQgbG9uZwkJbWluX2RlbHRhX3RpY2tzOworCXVuc2lnbmVkIGxvbmcJCW1heF9kZWx0YV90aWNrczsKKworCWNvbnN0IGNoYXIJCSpuYW1lOwogCWludAkJCXJhdGluZzsKIAlpbnQJCQlpcnE7CiAJY29uc3Qgc3RydWN0IGNwdW1hc2sJKmNwdW1hc2s7Ci0JaW50CQkJKCpzZXRfbmV4dF9ldmVudCkodW5zaWduZWQgbG9uZyBldnQsCi0JCQkJCQkgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKik7Ci0Jdm9pZAkJCSgqc2V0X21vZGUpKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAotCQkJCQkgICAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKTsKLQl2b2lkCQkJKCpldmVudF9oYW5kbGVyKShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICopOwotCXZvaWQJCQkoKmJyb2FkY2FzdCkoY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spOwogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKLQllbnVtIGNsb2NrX2V2ZW50X21vZGUJbW9kZTsKLQlrdGltZV90CQkJbmV4dF9ldmVudDsKLQl1bnNpZ25lZCBsb25nCQlyZXRyaWVzOwotfTsKK30gX19fX2NhY2hlbGluZV9hbGlnbmVkOwogCiAvKgogICogQ2FsY3VsYXRlIGEgbXVsdGlwbGljYXRpb24gZmFjdG9yIGZvciBzY2FsZWQgbWF0aCwgd2hpY2ggaXMgdXNlZCB0byBjb252ZXJ0CkBAIC0xMjIsNiArMTI4LDEyIEBACiAJCQkgICAgICAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KTsKIGV4dGVybiB2b2lkIGNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpOwogCitleHRlcm4gdm9pZCBjbG9ja2V2ZW50c19jb25maWdfYW5kX3JlZ2lzdGVyKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwKKwkJCQkJICAgIHUzMiBmcmVxLCB1bnNpZ25lZCBsb25nIG1pbl9kZWx0YSwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgbWF4X2RlbHRhKTsKKworZXh0ZXJuIGludCBjbG9ja2V2ZW50c191cGRhdGVfZnJlcShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpjZSwgdTMyIGZyZXEpOworCiBleHRlcm4gdm9pZCBjbG9ja2V2ZW50c19leGNoYW5nZV9kZXZpY2Uoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqb2xkLAogCQkJCQlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpuZXcpOwogZXh0ZXJuIHZvaWQgY2xvY2tldmVudHNfc2V0X21vZGUoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jbG9ja3NvdXJjZS5oIGIvaW5jbHVkZS9saW51eC9jbG9ja3NvdXJjZS5oCmluZGV4IGMzN2IyMWEuLmM5MThmYmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2xvY2tzb3VyY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nsb2Nrc291cmNlLmgKQEAgLTE1OSw0MiArMTU5LDM4IEBACiAgKi8KIHN0cnVjdCBjbG9ja3NvdXJjZSB7CiAJLyoKLQkgKiBGaXJzdCBwYXJ0IG9mIHN0cnVjdHVyZSBpcyByZWFkIG1vc3RseQorCSAqIEhvdHBhdGggZGF0YSwgZml0cyBpbiBhIHNpbmdsZSBjYWNoZSBsaW5lIHdoZW4gdGhlCisJICogY2xvY2tzb3VyY2UgaXRzZWxmIGlzIGNhY2hlbGluZSBhbGlnbmVkLgogCSAqLwotCWNoYXIgKm5hbWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCWludCByYXRpbmc7CiAJY3ljbGVfdCAoKnJlYWQpKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpOwotCWludCAoKmVuYWJsZSkoc3RydWN0IGNsb2Nrc291cmNlICpjcyk7Ci0Jdm9pZCAoKmRpc2FibGUpKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpOworCWN5Y2xlX3QgY3ljbGVfbGFzdDsKIAljeWNsZV90IG1hc2s7CiAJdTMyIG11bHQ7CiAJdTMyIHNoaWZ0OwogCXU2NCBtYXhfaWRsZV9uczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWN5Y2xlX3QgKCp2cmVhZCkodm9pZCk7Ci0Jdm9pZCAoKnN1c3BlbmQpKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpOwotCXZvaWQgKCpyZXN1bWUpKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpOworCiAjaWZkZWYgQ09ORklHX0lBNjQKIAl2b2lkICpmc3lzX21taW87ICAgICAgICAvKiB1c2VkIGJ5IGZzeXNjYWxsIGFzbSBjb2RlICovCiAjZGVmaW5lIENMS1NSQ19GU1lTX01NSU9fU0VUKG1taW8sIGFkZHIpICAgICAgKChtbWlvKSA9IChhZGRyKSkKICNlbHNlCiAjZGVmaW5lIENMS1NSQ19GU1lTX01NSU9fU0VUKG1taW8sIGFkZHIpICAgICAgZG8geyB9IHdoaWxlICgwKQogI2VuZGlmCi0KLQkvKgotCSAqIFNlY29uZCBwYXJ0IGlzIHdyaXR0ZW4gYXQgZWFjaCB0aW1lciBpbnRlcnJ1cHQKLQkgKiBLZWVwIGl0IGluIGEgZGlmZmVyZW50IGNhY2hlIGxpbmUgdG8gZGlydHkgbm8KLQkgKiBtb3JlIHRoYW4gb25lIGNhY2hlIGxpbmUuCi0JICovCi0JY3ljbGVfdCBjeWNsZV9sYXN0IF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJaW50IHJhdGluZzsKKwljeWNsZV90ICgqdnJlYWQpKHZvaWQpOworCWludCAoKmVuYWJsZSkoc3RydWN0IGNsb2Nrc291cmNlICpjcyk7CisJdm9pZCAoKmRpc2FibGUpKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9pZCAoKnN1c3BlbmQpKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpOworCXZvaWQgKCpyZXN1bWUpKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpOwogCiAjaWZkZWYgQ09ORklHX0NMT0NLU09VUkNFX1dBVENIRE9HCiAJLyogV2F0Y2hkb2cgcmVsYXRlZCBkYXRhLCB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIHdkX2xpc3Q7CiAJY3ljbGVfdCB3ZF9sYXN0OwogI2VuZGlmCi19OworfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CiAKIC8qCiAgKiBDbG9jayBzb3VyY2UgZmxhZ3MgYml0czo6CkBAIC0zNDEsNCArMzM3LDYgQEAKIAogZXh0ZXJuIHZvaWQgdGltZWtlZXBpbmdfbm90aWZ5KHN0cnVjdCBjbG9ja3NvdXJjZSAqY2xvY2spOwogCitleHRlcm4gaW50IGNsb2Nrc291cmNlX2k4MjUzX2luaXQodm9pZCk7CisKICNlbmRpZiAvKiBfTElOVVhfQ0xPQ0tTT1VSQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHVmcmVxLmggYi9pbmNsdWRlL2xpbnV4L2NwdWZyZXEuaAppbmRleCA5MzQzZGQzLi4xMWJlNDhlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdWZyZXEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdWZyZXEuaApAQCAtMyw3ICszLDcgQEAKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAxIFJ1c3NlbGwgS2luZwogICogICAgICAgICAgICAoQykgMjAwMiAtIDIwMDMgRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPgotICogICAgICAgICAgICAKKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgpAQCAtNTYsOSArNTYsOSBAQAogI2RlZmluZSBDUFVGUkVRX1BPTElDWV9QT1dFUlNBVkUJKDEpCiAjZGVmaW5lIENQVUZSRVFfUE9MSUNZX1BFUkZPUk1BTkNFCSgyKQogCi0vKiBGcmVxdWVuY3kgdmFsdWVzIGhlcmUgYXJlIENQVSBrSHogc28gdGhhdCBoYXJkd2FyZSB3aGljaCBkb2Vzbid0IHJ1biAKLSAqIHdpdGggc29tZSBmcmVxdWVuY2llcyBjYW4gY29tcGxhaW4gd2l0aG91dCBoYXZpbmcgdG8gZ3Vlc3Mgd2hhdCBwZXIgCi0gKiBjZW50IC8gcGVyIG1pbGxlIG1lYW5zLiAKKy8qIEZyZXF1ZW5jeSB2YWx1ZXMgaGVyZSBhcmUgQ1BVIGtIeiBzbyB0aGF0IGhhcmR3YXJlIHdoaWNoIGRvZXNuJ3QgcnVuCisgKiB3aXRoIHNvbWUgZnJlcXVlbmNpZXMgY2FuIGNvbXBsYWluIHdpdGhvdXQgaGF2aW5nIHRvIGd1ZXNzIHdoYXQgcGVyCisgKiBjZW50IC8gcGVyIG1pbGxlIG1lYW5zLgogICogTWF4aW11bSB0cmFuc2l0aW9uIGxhdGVuY3kgaXMgaW4gbmFub3NlY29uZHMgLSBpZiBpdCdzIHVua25vd24sCiAgKiBDUFVGUkVRX0VURVJOQUwgc2hhbGwgYmUgdXNlZC4KICAqLwpAQCAtNzIsMTMgKzcyLDE1IEBACiBzdHJ1Y3QgY3B1ZnJlcV9jcHVpbmZvIHsKIAl1bnNpZ25lZCBpbnQJCW1heF9mcmVxOwogCXVuc2lnbmVkIGludAkJbWluX2ZyZXE7Ci0JdW5zaWduZWQgaW50CQl0cmFuc2l0aW9uX2xhdGVuY3k7IC8qIGluIDEwXigtOSkgcyA9IG5hbm9zZWNvbmRzICovCisKKwkvKiBpbiAxMF4oLTkpIHMgPSBuYW5vc2Vjb25kcyAqLworCXVuc2lnbmVkIGludAkJdHJhbnNpdGlvbl9sYXRlbmN5OwogfTsKIAogc3RydWN0IGNwdWZyZXFfcmVhbF9wb2xpY3kgewogCXVuc2lnbmVkIGludAkJbWluOyAgICAvKiBpbiBrSHogKi8KIAl1bnNpZ25lZCBpbnQJCW1heDsgICAgLyogaW4ga0h6ICovCi0gICAgICAgIHVuc2lnbmVkIGludAkJcG9saWN5OyAvKiBzZWUgYWJvdmUgKi8KKwl1bnNpZ25lZCBpbnQJCXBvbGljeTsgLyogc2VlIGFib3ZlICovCiAJc3RydWN0IGNwdWZyZXFfZ292ZXJub3IJKmdvdmVybm9yOyAvKiBzZWUgYmVsb3cgKi8KIH07CiAKQEAgLTk0LDcgKzk2LDcgQEAKIAl1bnNpZ25lZCBpbnQJCW1heDsgICAgLyogaW4ga0h6ICovCiAJdW5zaWduZWQgaW50CQljdXI7ICAgIC8qIGluIGtIeiwgb25seSBuZWVkZWQgaWYgY3B1ZnJlcQogCQkJCQkgKiBnb3Zlcm5vcnMgYXJlIHVzZWQgKi8KLSAgICAgICAgdW5zaWduZWQgaW50CQlwb2xpY3k7IC8qIHNlZSBhYm92ZSAqLworCXVuc2lnbmVkIGludAkJcG9saWN5OyAvKiBzZWUgYWJvdmUgKi8KIAlzdHJ1Y3QgY3B1ZnJlcV9nb3Zlcm5vcgkqZ292ZXJub3I7IC8qIHNlZSBiZWxvdyAqLwogCiAJc3RydWN0IHdvcmtfc3RydWN0CXVwZGF0ZTsgLyogaWYgdXBkYXRlX3BvbGljeSgpIG5lZWRzIHRvIGJlCkBAIC0xNjcsMTEgKzE2OSwxMSBAQAogCiBzdHJ1Y3QgY3B1ZnJlcV9nb3Zlcm5vciB7CiAJY2hhcgluYW1lW0NQVUZSRVFfTkFNRV9MRU5dOwotCWludCAJKCpnb3Zlcm5vcikJKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCWludAkoKmdvdmVybm9yKQkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCiAJCQkJIHVuc2lnbmVkIGludCBldmVudCk7CiAJc3NpemVfdAkoKnNob3dfc2V0c3BlZWQpCShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKIAkJCQkJIGNoYXIgKmJ1Zik7Ci0JaW50IAkoKnN0b3JlX3NldHNwZWVkKQkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJaW50CSgqc3RvcmVfc2V0c3BlZWQpCShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKIAkJCQkJIHVuc2lnbmVkIGludCBmcmVxKTsKIAl1bnNpZ25lZCBpbnQgbWF4X3RyYW5zaXRpb25fbGF0ZW5jeTsgLyogSFcgbXVzdCBiZSBhYmxlIHRvIHN3aXRjaCB0bwogCQkJbmV4dCBmcmVxIGZhc3RlciB0aGFuIHRoaXMgdmFsdWUgaW4gbmFubyBzZWNzIG9yIHdlCkBAIC0xODAsNyArMTgyLDggQEAKIAlzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7CiB9OwogCi0vKiBwYXNzIGEgdGFyZ2V0IHRvIHRoZSBjcHVmcmVxIGRyaXZlciAKKy8qCisgKiBQYXNzIGEgdGFyZ2V0IHRvIHRoZSBjcHVmcmVxIGRyaXZlci4KICAqLwogZXh0ZXJuIGludCBjcHVmcmVxX2RyaXZlcl90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCiAJCQkJIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKQEAgLTIzNyw5ICsyNDAsOSBAQAogCiAvKiBmbGFncyAqLwogCi0jZGVmaW5lIENQVUZSRVFfU1RJQ0tZCQkweDAxCS8qIHRoZSBkcml2ZXIgaXNuJ3QgcmVtb3ZlZCBldmVuIGlmIAorI2RlZmluZSBDUFVGUkVRX1NUSUNLWQkJMHgwMQkvKiB0aGUgZHJpdmVyIGlzbid0IHJlbW92ZWQgZXZlbiBpZgogCQkJCQkgKiBhbGwgLT5pbml0KCkgY2FsbHMgZmFpbGVkICovCi0jZGVmaW5lIENQVUZSRVFfQ09OU1RfTE9PUFMgCTB4MDIJLyogbG9vcHNfcGVyX2ppZmZ5IG9yIG90aGVyIGtlcm5lbAorI2RlZmluZSBDUFVGUkVRX0NPTlNUX0xPT1BTCTB4MDIJLyogbG9vcHNfcGVyX2ppZmZ5IG9yIG90aGVyIGtlcm5lbAogCQkJCQkgKiAiY29uc3RhbnRzIiBhcmVuJ3QgYWZmZWN0ZWQgYnkKIAkJCQkJICogZnJlcXVlbmN5IHRyYW5zaXRpb25zICovCiAjZGVmaW5lIENQVUZSRVFfUE1fTk9fV0FSTgkweDA0CS8qIGRvbid0IHdhcm4gb24gc3VzcGVuZC9yZXN1bWUgc3BlZWQKQEAgLTI1Miw3ICsyNTUsNyBAQAogdm9pZCBjcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKHN0cnVjdCBjcHVmcmVxX2ZyZXFzICpmcmVxcywgdW5zaWduZWQgaW50IHN0YXRlKTsKIAogCi1zdGF0aWMgaW5saW5lIHZvaWQgY3B1ZnJlcV92ZXJpZnlfd2l0aGluX2xpbWl0cyhzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwgdW5zaWduZWQgaW50IG1pbiwgdW5zaWduZWQgaW50IG1heCkgCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1ZnJlcV92ZXJpZnlfd2l0aGluX2xpbWl0cyhzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwgdW5zaWduZWQgaW50IG1pbiwgdW5zaWduZWQgaW50IG1heCkKIHsKIAlpZiAocG9saWN5LT5taW4gPCBtaW4pCiAJCXBvbGljeS0+bWluID0gbWluOwpAQCAtMzg2LDM0ICszODksMTUgQEAKIC8qIHRoZSBmb2xsb3dpbmcgMyBmdW50aW9ucyBhcmUgZm9yIGNwdWZyZXEgY29yZSB1c2Ugb25seSAqLwogc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpjcHVmcmVxX2ZyZXF1ZW5jeV9nZXRfdGFibGUodW5zaWduZWQgaW50IGNwdSk7CiBzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKmNwdWZyZXFfY3B1X2dldCh1bnNpZ25lZCBpbnQgY3B1KTsKLXZvaWQgICBjcHVmcmVxX2NwdV9wdXQgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqZGF0YSk7Cit2b2lkICAgY3B1ZnJlcV9jcHVfcHV0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqZGF0YSk7CiAKIC8qIHRoZSBmb2xsb3dpbmcgYXJlIHJlYWxseSByZWFsbHkgb3B0aW9uYWwgKi8KIGV4dGVybiBzdHJ1Y3QgZnJlcV9hdHRyIGNwdWZyZXFfZnJlcV9hdHRyX3NjYWxpbmdfYXZhaWxhYmxlX2ZyZXFzOwogCi12b2lkIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9hdHRyKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqdGFibGUsIAordm9pZCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cihzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKnRhYmxlLAogCQkJCSAgICAgIHVuc2lnbmVkIGludCBjcHUpOwogCiB2b2lkIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKHVuc2lnbmVkIGludCBjcHUpOwogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgVU5JRklFRCBERUJVRyBIRUxQRVJTICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgQ1BVRlJFUV9ERUJVR19DT1JFCTEKLSNkZWZpbmUgQ1BVRlJFUV9ERUJVR19EUklWRVIJMgotI2RlZmluZSBDUFVGUkVRX0RFQlVHX0dPVkVSTk9SCTQKLQotI2lmZGVmIENPTkZJR19DUFVfRlJFUV9ERUJVRwotCi1leHRlcm4gdm9pZCBjcHVmcmVxX2RlYnVnX3ByaW50ayh1bnNpZ25lZCBpbnQgdHlwZSwgY29uc3QgY2hhciAqcHJlZml4LCAKLQkJCQkgY29uc3QgY2hhciAqZm10LCAuLi4pOwotCi0jZWxzZQotCi0jZGVmaW5lIGNwdWZyZXFfZGVidWdfcHJpbnRrKG1zZy4uLikgZG8geyB9IHdoaWxlKDApCi0KLSNlbmRpZiAvKiBDT05GSUdfQ1BVX0ZSRVFfREVCVUcgKi8KLQogI2VuZGlmIC8qIF9MSU5VWF9DUFVGUkVRX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCmluZGV4IGQwODM5OWQuLmM2NjExMWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaApAQCAtNDcsNiArNDcsMzggQEAKIAkJCQkJc3RydWN0IGJ1c19hdHRyaWJ1dGUgKik7CiBleHRlcm4gdm9pZCBidXNfcmVtb3ZlX2ZpbGUoc3RydWN0IGJ1c190eXBlICosIHN0cnVjdCBidXNfYXR0cmlidXRlICopOwogCisvKioKKyAqIHN0cnVjdCBidXNfdHlwZSAtIFRoZSBidXMgdHlwZSBvZiB0aGUgZGV2aWNlCisgKgorICogQG5hbWU6CVRoZSBuYW1lIG9mIHRoZSBidXMuCisgKiBAYnVzX2F0dHJzOglEZWZhdWx0IGF0dHJpYnV0ZXMgb2YgdGhlIGJ1cy4KKyAqIEBkZXZfYXR0cnM6CURlZmF1bHQgYXR0cmlidXRlcyBvZiB0aGUgZGV2aWNlcyBvbiB0aGUgYnVzLgorICogQGRydl9hdHRyczoJRGVmYXVsdCBhdHRyaWJ1dGVzIG9mIHRoZSBkZXZpY2UgZHJpdmVycyBvbiB0aGUgYnVzLgorICogQG1hdGNoOglDYWxsZWQsIHBlcmhhcHMgbXVsdGlwbGUgdGltZXMsIHdoZW5ldmVyIGEgbmV3IGRldmljZSBvciBkcml2ZXIKKyAqCQlpcyBhZGRlZCBmb3IgdGhpcyBidXMuIEl0IHNob3VsZCByZXR1cm4gYSBub256ZXJvIHZhbHVlIGlmIHRoZQorICoJCWdpdmVuIGRldmljZSBjYW4gYmUgaGFuZGxlZCBieSB0aGUgZ2l2ZW4gZHJpdmVyLgorICogQHVldmVudDoJQ2FsbGVkIHdoZW4gYSBkZXZpY2UgaXMgYWRkZWQsIHJlbW92ZWQsIG9yIGEgZmV3IG90aGVyIHRoaW5ncworICoJCXRoYXQgZ2VuZXJhdGUgdWV2ZW50cyB0byBhZGQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKyAqIEBwcm9iZToJQ2FsbGVkIHdoZW4gYSBuZXcgZGV2aWNlIG9yIGRyaXZlciBhZGQgdG8gdGhpcyBidXMsIGFuZCBjYWxsYmFjaworICoJCXRoZSBzcGVjaWZpYyBkcml2ZXIncyBwcm9iZSB0byBpbml0aWFsIHRoZSBtYXRjaGVkIGRldmljZS4KKyAqIEByZW1vdmU6CUNhbGxlZCB3aGVuIGEgZGV2aWNlIHJlbW92ZWQgZnJvbSB0aGlzIGJ1cy4KKyAqIEBzaHV0ZG93bjoJQ2FsbGVkIGF0IHNodXQtZG93biB0aW1lIHRvIHF1aWVzY2UgdGhlIGRldmljZS4KKyAqIEBzdXNwZW5kOglDYWxsZWQgd2hlbiBhIGRldmljZSBvbiB0aGlzIGJ1cyB3YW50cyB0byBnbyB0byBzbGVlcCBtb2RlLgorICogQHJlc3VtZToJQ2FsbGVkIHRvIGJyaW5nIGEgZGV2aWNlIG9uIHRoaXMgYnVzIG91dCBvZiBzbGVlcCBtb2RlLgorICogQHBtOgkJUG93ZXIgbWFuYWdlbWVudCBvcGVyYXRpb25zIG9mIHRoaXMgYnVzLCBjYWxsYmFjayB0aGUgc3BlY2lmaWMKKyAqCQlkZXZpY2UgZHJpdmVyJ3MgcG0tb3BzLgorICogQHA6CQlUaGUgcHJpdmF0ZSBkYXRhIG9mIHRoZSBkcml2ZXIgY29yZSwgb25seSB0aGUgZHJpdmVyIGNvcmUgY2FuCisgKgkJdG91Y2ggdGhpcy4KKyAqCisgKiBBIGJ1cyBpcyBhIGNoYW5uZWwgYmV0d2VlbiB0aGUgcHJvY2Vzc29yIGFuZCBvbmUgb3IgbW9yZSBkZXZpY2VzLiBGb3IgdGhlCisgKiBwdXJwb3NlcyBvZiB0aGUgZGV2aWNlIG1vZGVsLCBhbGwgZGV2aWNlcyBhcmUgY29ubmVjdGVkIHZpYSBhIGJ1cywgZXZlbiBpZgorICogaXQgaXMgYW4gaW50ZXJuYWwsIHZpcnR1YWwsICJwbGF0Zm9ybSIgYnVzLiBCdXNlcyBjYW4gcGx1ZyBpbnRvIGVhY2ggb3RoZXIuCisgKiBBIFVTQiBjb250cm9sbGVyIGlzIHVzdWFsbHkgYSBQQ0kgZGV2aWNlLCBmb3IgZXhhbXBsZS4gVGhlIGRldmljZSBtb2RlbAorICogcmVwcmVzZW50cyB0aGUgYWN0dWFsIGNvbm5lY3Rpb25zIGJldHdlZW4gYnVzZXMgYW5kIHRoZSBkZXZpY2VzIHRoZXkgY29udHJvbC4KKyAqIEEgYnVzIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBidXNfdHlwZSBzdHJ1Y3R1cmUuIEl0IGNvbnRhaW5zIHRoZSBuYW1lLCB0aGUKKyAqIGRlZmF1bHQgYXR0cmlidXRlcywgdGhlIGJ1cycgbWV0aG9kcywgUE0gb3BlcmF0aW9ucywgYW5kIHRoZSBkcml2ZXIgY29yZSdzCisgKiBwcml2YXRlIGRhdGEuCisgKi8KIHN0cnVjdCBidXNfdHlwZSB7CiAJY29uc3QgY2hhcgkJKm5hbWU7CiAJc3RydWN0IGJ1c19hdHRyaWJ1dGUJKmJ1c19hdHRyczsKQEAgLTExOSw2ICsxNTEsMzcgQEAKIGV4dGVybiBzdHJ1Y3Qga3NldCAqYnVzX2dldF9rc2V0KHN0cnVjdCBidXNfdHlwZSAqYnVzKTsKIGV4dGVybiBzdHJ1Y3Qga2xpc3QgKmJ1c19nZXRfZGV2aWNlX2tsaXN0KHN0cnVjdCBidXNfdHlwZSAqYnVzKTsKIAorLyoqCisgKiBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAtIFRoZSBiYXNpYyBkZXZpY2UgZHJpdmVyIHN0cnVjdHVyZQorICogQG5hbWU6CU5hbWUgb2YgdGhlIGRldmljZSBkcml2ZXIuCisgKiBAYnVzOglUaGUgYnVzIHdoaWNoIHRoZSBkZXZpY2Ugb2YgdGhpcyBkcml2ZXIgYmVsb25ncyB0by4KKyAqIEBvd25lcjoJVGhlIG1vZHVsZSBvd25lci4KKyAqIEBtb2RfbmFtZToJVXNlZCBmb3IgYnVpbHQtaW4gbW9kdWxlcy4KKyAqIEBzdXBwcmVzc19iaW5kX2F0dHJzOiBEaXNhYmxlcyBiaW5kL3VuYmluZCB2aWEgc3lzZnMuCisgKiBAb2ZfbWF0Y2hfdGFibGU6IFRoZSBvcGVuIGZpcm13YXJlIHRhYmxlLgorICogQHByb2JlOglDYWxsZWQgdG8gcXVlcnkgdGhlIGV4aXN0ZW5jZSBvZiBhIHNwZWNpZmljIGRldmljZSwKKyAqCQl3aGV0aGVyIHRoaXMgZHJpdmVyIGNhbiB3b3JrIHdpdGggaXQsIGFuZCBiaW5kIHRoZSBkcml2ZXIKKyAqCQl0byBhIHNwZWNpZmljIGRldmljZS4KKyAqIEByZW1vdmU6CUNhbGxlZCB3aGVuIHRoZSBkZXZpY2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzeXN0ZW0gdG8KKyAqCQl1bmJpbmQgYSBkZXZpY2UgZnJvbSB0aGlzIGRyaXZlci4KKyAqIEBzaHV0ZG93bjoJQ2FsbGVkIGF0IHNodXQtZG93biB0aW1lIHRvIHF1aWVzY2UgdGhlIGRldmljZS4KKyAqIEBzdXNwZW5kOglDYWxsZWQgdG8gcHV0IHRoZSBkZXZpY2UgdG8gc2xlZXAgbW9kZS4gVXN1YWxseSB0byBhCisgKgkJbG93IHBvd2VyIHN0YXRlLgorICogQHJlc3VtZToJQ2FsbGVkIHRvIGJyaW5nIGEgZGV2aWNlIGZyb20gc2xlZXAgbW9kZS4KKyAqIEBncm91cHM6CURlZmF1bHQgYXR0cmlidXRlcyB0aGF0IGdldCBjcmVhdGVkIGJ5IHRoZSBkcml2ZXIgY29yZQorICoJCWF1dG9tYXRpY2FsbHkuCisgKiBAcG06CQlQb3dlciBtYW5hZ2VtZW50IG9wZXJhdGlvbnMgb2YgdGhlIGRldmljZSB3aGljaCBtYXRjaGVkCisgKgkJdGhpcyBkcml2ZXIuCisgKiBAcDoJCURyaXZlciBjb3JlJ3MgcHJpdmF0ZSBkYXRhLCBubyBvbmUgb3RoZXIgdGhhbiB0aGUgZHJpdmVyCisgKgkJY29yZSBjYW4gdG91Y2ggdGhpcy4KKyAqCisgKiBUaGUgZGV2aWNlIGRyaXZlci1tb2RlbCB0cmFja3MgYWxsIG9mIHRoZSBkcml2ZXJzIGtub3duIHRvIHRoZSBzeXN0ZW0uCisgKiBUaGUgbWFpbiByZWFzb24gZm9yIHRoaXMgdHJhY2tpbmcgaXMgdG8gZW5hYmxlIHRoZSBkcml2ZXIgY29yZSB0byBtYXRjaAorICogdXAgZHJpdmVycyB3aXRoIG5ldyBkZXZpY2VzLiBPbmNlIGRyaXZlcnMgYXJlIGtub3duIG9iamVjdHMgd2l0aGluIHRoZQorICogc3lzdGVtLCBob3dldmVyLCBhIG51bWJlciBvZiBvdGhlciB0aGluZ3MgYmVjb21lIHBvc3NpYmxlLiBEZXZpY2UgZHJpdmVycworICogY2FuIGV4cG9ydCBpbmZvcm1hdGlvbiBhbmQgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgdGhhdCBhcmUgaW5kZXBlbmRlbnQKKyAqIG9mIGFueSBzcGVjaWZpYyBkZXZpY2UuCisgKi8KIHN0cnVjdCBkZXZpY2VfZHJpdmVyIHsKIAljb25zdCBjaGFyCQkqbmFtZTsKIAlzdHJ1Y3QgYnVzX3R5cGUJCSpidXM7CkBAIC0xODUsOCArMjQ4LDM0IEBACiAJCQkJICBzdHJ1Y3QgZGV2aWNlICpzdGFydCwgdm9pZCAqZGF0YSwKIAkJCQkgIGludCAoKm1hdGNoKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpKTsKIAotLyoKLSAqIGRldmljZSBjbGFzc2VzCisvKioKKyAqIHN0cnVjdCBjbGFzcyAtIGRldmljZSBjbGFzc2VzCisgKiBAbmFtZToJTmFtZSBvZiB0aGUgY2xhc3MuCisgKiBAb3duZXI6CVRoZSBtb2R1bGUgb3duZXIuCisgKiBAY2xhc3NfYXR0cnM6IERlZmF1bHQgYXR0cmlidXRlcyBvZiB0aGlzIGNsYXNzLgorICogQGRldl9hdHRyczoJRGVmYXVsdCBhdHRyaWJ1dGVzIG9mIHRoZSBkZXZpY2VzIGJlbG9uZyB0byB0aGUgY2xhc3MuCisgKiBAZGV2X2Jpbl9hdHRyczogRGVmYXVsdCBiaW5hcnkgYXR0cmlidXRlcyBvZiB0aGUgZGV2aWNlcyBiZWxvbmcgdG8gdGhlIGNsYXNzLgorICogQGRldl9rb2JqOglUaGUga29iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhpcyBjbGFzcyBhbmQgbGlua3MgaXQgaW50byB0aGUgaGllcmFyY2h5LgorICogQGRldl91ZXZlbnQ6CUNhbGxlZCB3aGVuIGEgZGV2aWNlIGlzIGFkZGVkLCByZW1vdmVkIGZyb20gdGhpcyBjbGFzcywgb3IgYQorICoJCWZldyBvdGhlciB0aGluZ3MgdGhhdCBnZW5lcmF0ZSB1ZXZlbnRzIHRvIGFkZCB0aGUgZW52aXJvbm1lbnQKKyAqCQl2YXJpYWJsZXMuCisgKiBAZGV2bm9kZToJQ2FsbGJhY2sgdG8gcHJvdmlkZSB0aGUgZGV2dG1wZnMuCisgKiBAY2xhc3NfcmVsZWFzZTogQ2FsbGVkIHRvIHJlbGVhc2UgdGhpcyBjbGFzcy4KKyAqIEBkZXZfcmVsZWFzZTogQ2FsbGVkIHRvIHJlbGVhc2UgdGhlIGRldmljZS4KKyAqIEBzdXNwZW5kOglVc2VkIHRvIHB1dCB0aGUgZGV2aWNlIHRvIHNsZWVwIG1vZGUsIHVzdWFsbHkgdG8gYSBsb3cgcG93ZXIKKyAqCQlzdGF0ZS4KKyAqIEByZXN1bWU6CVVzZWQgdG8gYnJpbmcgdGhlIGRldmljZSBmcm9tIHRoZSBzbGVlcCBtb2RlLgorICogQG5zX3R5cGU6CUNhbGxiYWNrcyBzbyBzeXNmcyBjYW4gZGV0ZW1pbmUgbmFtZXNwYWNlcy4KKyAqIEBuYW1lc3BhY2U6CU5hbWVzcGFjZSBvZiB0aGUgZGV2aWNlIGJlbG9uZ3MgdG8gdGhpcyBjbGFzcy4KKyAqIEBwbToJCVRoZSBkZWZhdWx0IGRldmljZSBwb3dlciBtYW5hZ2VtZW50IG9wZXJhdGlvbnMgb2YgdGhpcyBjbGFzcy4KKyAqIEBwOgkJVGhlIHByaXZhdGUgZGF0YSBvZiB0aGUgZHJpdmVyIGNvcmUsIG5vIG9uZSBvdGhlciB0aGFuIHRoZQorICoJCWRyaXZlciBjb3JlIGNhbiB0b3VjaCB0aGlzLgorICoKKyAqIEEgY2xhc3MgaXMgYSBoaWdoZXItbGV2ZWwgdmlldyBvZiBhIGRldmljZSB0aGF0IGFic3RyYWN0cyBvdXQgbG93LWxldmVsCisgKiBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLiBEcml2ZXJzIG1heSBzZWUgYSBTQ1NJIGRpc2sgb3IgYW4gQVRBIGRpc2ssIGJ1dCwKKyAqIGF0IHRoZSBjbGFzcyBsZXZlbCwgdGhleSBhcmUgYWxsIHNpbXBseSBkaXNrcy4gQ2xhc3NlcyBhbGxvdyB1c2VyIHNwYWNlCisgKiB0byB3b3JrIHdpdGggZGV2aWNlcyBiYXNlZCBvbiB3aGF0IHRoZXkgZG8sIHJhdGhlciB0aGFuIGhvdyB0aGV5IGFyZQorICogY29ubmVjdGVkIG9yIGhvdyB0aGV5IHdvcmsuCiAgKi8KIHN0cnVjdCBjbGFzcyB7CiAJY29uc3QgY2hhcgkJKm5hbWU7CkBAIC00MDEsNiArNDkwLDY1IEBACiAJdW5zaWduZWQgbG9uZyBzZWdtZW50X2JvdW5kYXJ5X21hc2s7CiB9OwogCisvKioKKyAqIHN0cnVjdCBkZXZpY2UgLSBUaGUgYmFzaWMgZGV2aWNlIHN0cnVjdHVyZQorICogQHBhcmVudDoJVGhlIGRldmljZSdzICJwYXJlbnQiIGRldmljZSwgdGhlIGRldmljZSB0byB3aGljaCBpdCBpcyBhdHRhY2hlZC4KKyAqIAkJSW4gbW9zdCBjYXNlcywgYSBwYXJlbnQgZGV2aWNlIGlzIHNvbWUgc29ydCBvZiBidXMgb3IgaG9zdAorICogCQljb250cm9sbGVyLiBJZiBwYXJlbnQgaXMgTlVMTCwgdGhlIGRldmljZSwgaXMgYSB0b3AtbGV2ZWwgZGV2aWNlLAorICogCQl3aGljaCBpcyBub3QgdXN1YWxseSB3aGF0IHlvdSB3YW50LgorICogQHA6CQlIb2xkcyB0aGUgcHJpdmF0ZSBkYXRhIG9mIHRoZSBkcml2ZXIgY29yZSBwb3J0aW9ucyBvZiB0aGUgZGV2aWNlLgorICogCQlTZWUgdGhlIGNvbW1lbnQgb2YgdGhlIHN0cnVjdCBkZXZpY2VfcHJpdmF0ZSBmb3IgZGV0YWlsLgorICogQGtvYmo6CUEgdG9wLWxldmVsLCBhYnN0cmFjdCBjbGFzcyBmcm9tIHdoaWNoIG90aGVyIGNsYXNzZXMgYXJlIGRlcml2ZWQuCisgKiBAaW5pdF9uYW1lOglJbml0aWFsIG5hbWUgb2YgdGhlIGRldmljZS4KKyAqIEB0eXBlOglUaGUgdHlwZSBvZiBkZXZpY2UuCisgKiAJCVRoaXMgaWRlbnRpZmllcyB0aGUgZGV2aWNlIHR5cGUgYW5kIGNhcnJpZXMgdHlwZS1zcGVjaWZpYworICogCQlpbmZvcm1hdGlvbi4KKyAqIEBtdXRleDoJTXV0ZXggdG8gc3luY2hyb25pemUgY2FsbHMgdG8gaXRzIGRyaXZlci4KKyAqIEBidXM6CVR5cGUgb2YgYnVzIGRldmljZSBpcyBvbi4KKyAqIEBkcml2ZXI6CVdoaWNoIGRyaXZlciBoYXMgYWxsb2NhdGVkIHRoaXMKKyAqIEBwbGF0Zm9ybV9kYXRhOiBQbGF0Zm9ybSBkYXRhIHNwZWNpZmljIHRvIHRoZSBkZXZpY2UuCisgKiAJCUV4YW1wbGU6IEZvciBkZXZpY2VzIG9uIGN1c3RvbSBib2FyZHMsIGFzIHR5cGljYWwgb2YgZW1iZWRkZWQKKyAqIAkJYW5kIFNPQyBiYXNlZCBoYXJkd2FyZSwgTGludXggb2Z0ZW4gdXNlcyBwbGF0Zm9ybV9kYXRhIHRvIHBvaW50CisgKiAJCXRvIGJvYXJkLXNwZWNpZmljIHN0cnVjdHVyZXMgZGVzY3JpYmluZyBkZXZpY2VzIGFuZCBob3cgdGhleQorICogCQlhcmUgd2lyZWQuICBUaGF0IGNhbiBpbmNsdWRlIHdoYXQgcG9ydHMgYXJlIGF2YWlsYWJsZSwgY2hpcAorICogCQl2YXJpYW50cywgd2hpY2ggR1BJTyBwaW5zIGFjdCBpbiB3aGF0IGFkZGl0aW9uYWwgcm9sZXMsIGFuZCBzbworICogCQlvbi4gIFRoaXMgc2hyaW5rcyB0aGUgIkJvYXJkIFN1cHBvcnQgUGFja2FnZXMiIChCU1BzKSBhbmQKKyAqIAkJbWluaW1pemVzIGJvYXJkLXNwZWNpZmljICNpZmRlZnMgaW4gZHJpdmVycy4KKyAqIEBwb3dlcjoJRm9yIGRldmljZSBwb3dlciBtYW5hZ2VtZW50LgorICogCQlTZWUgRG9jdW1lbnRhdGlvbi9wb3dlci9kZXZpY2VzLnR4dCBmb3IgZGV0YWlscy4KKyAqIEBwd3JfZG9tYWluOglQcm92aWRlIGNhbGxiYWNrcyB0aGF0IGFyZSBleGVjdXRlZCBkdXJpbmcgc3lzdGVtIHN1c3BlbmQsCisgKiAJCWhpYmVybmF0aW9uLCBzeXN0ZW0gcmVzdW1lIGFuZCBkdXJpbmcgcnVudGltZSBQTSB0cmFuc2l0aW9ucworICogCQlhbG9uZyB3aXRoIHN1YnN5c3RlbS1sZXZlbCBhbmQgZHJpdmVyLWxldmVsIGNhbGxiYWNrcy4KKyAqIEBudW1hX25vZGU6CU5VTUEgbm9kZSB0aGlzIGRldmljZSBpcyBjbG9zZSB0by4KKyAqIEBkbWFfbWFzazoJRG1hIG1hc2sgKGlmIGRtYSdibGUgZGV2aWNlKS4KKyAqIEBjb2hlcmVudF9kbWFfbWFzazogTGlrZSBkbWFfbWFzaywgYnV0IGZvciBhbGxvY19jb2hlcmVudCBtYXBwaW5nIGFzIG5vdCBhbGwKKyAqIAkJaGFyZHdhcmUgc3VwcG9ydHMgNjQtYml0IGFkZHJlc3NlcyBmb3IgY29uc2lzdGVudCBhbGxvY2F0aW9ucworICogCQlzdWNoIGRlc2NyaXB0b3JzLgorICogQGRtYV9wYXJtczoJQSBsb3cgbGV2ZWwgZHJpdmVyIG1heSBzZXQgdGhlc2UgdG8gdGVhY2ggSU9NTVUgY29kZSBhYm91dAorICogCQlzZWdtZW50IGxpbWl0YXRpb25zLgorICogQGRtYV9wb29sczoJRG1hIHBvb2xzIChpZiBkbWEnYmxlIGRldmljZSkuCisgKiBAZG1hX21lbToJSW50ZXJuYWwgZm9yIGNvaGVyZW50IG1lbSBvdmVycmlkZS4KKyAqIEBhcmNoZGF0YToJRm9yIGFyY2gtc3BlY2lmaWMgYWRkaXRpb25zLgorICogQG9mX25vZGU6CUFzc29jaWF0ZWQgZGV2aWNlIHRyZWUgbm9kZS4KKyAqIEBvZl9tYXRjaDoJTWF0Y2hpbmcgb2ZfZGV2aWNlX2lkIGZyb20gZHJpdmVyLgorICogQGRldnQ6CUZvciBjcmVhdGluZyB0aGUgc3lzZnMgImRldiIuCisgKiBAZGV2cmVzX2xvY2s6IFNwaW5sb2NrIHRvIHByb3RlY3QgdGhlIHJlc291cmNlIG9mIHRoZSBkZXZpY2UuCisgKiBAZGV2cmVzX2hlYWQ6IFRoZSByZXNvdXJjZXMgbGlzdCBvZiB0aGUgZGV2aWNlLgorICogQGtub2RlX2NsYXNzOiBUaGUgbm9kZSB1c2VkIHRvIGFkZCB0aGUgZGV2aWNlIHRvIHRoZSBjbGFzcyBsaXN0LgorICogQGNsYXNzOglUaGUgY2xhc3Mgb2YgdGhlIGRldmljZS4KKyAqIEBncm91cHM6CU9wdGlvbmFsIGF0dHJpYnV0ZSBncm91cHMuCisgKiBAcmVsZWFzZToJQ2FsbGJhY2sgdG8gZnJlZSB0aGUgZGV2aWNlIGFmdGVyIGFsbCByZWZlcmVuY2VzIGhhdmUKKyAqIAkJZ29uZSBhd2F5LiBUaGlzIHNob3VsZCBiZSBzZXQgYnkgdGhlIGFsbG9jYXRvciBvZiB0aGUKKyAqIAkJZGV2aWNlIChpLmUuIHRoZSBidXMgZHJpdmVyIHRoYXQgZGlzY292ZXJlZCB0aGUgZGV2aWNlKS4KKyAqCisgKiBBdCB0aGUgbG93ZXN0IGxldmVsLCBldmVyeSBkZXZpY2UgaW4gYSBMaW51eCBzeXN0ZW0gaXMgcmVwcmVzZW50ZWQgYnkgYW4KKyAqIGluc3RhbmNlIG9mIHN0cnVjdCBkZXZpY2UuIFRoZSBkZXZpY2Ugc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbgorICogdGhhdCB0aGUgZGV2aWNlIG1vZGVsIGNvcmUgbmVlZHMgdG8gbW9kZWwgdGhlIHN5c3RlbS4gTW9zdCBzdWJzeXN0ZW1zLAorICogaG93ZXZlciwgdHJhY2sgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV2aWNlcyB0aGV5IGhvc3QuIEFzIGEKKyAqIHJlc3VsdCwgaXQgaXMgcmFyZSBmb3IgZGV2aWNlcyB0byBiZSByZXByZXNlbnRlZCBieSBiYXJlIGRldmljZSBzdHJ1Y3R1cmVzOworICogaW5zdGVhZCwgdGhhdCBzdHJ1Y3R1cmUsIGxpa2Uga29iamVjdCBzdHJ1Y3R1cmVzLCBpcyB1c3VhbGx5IGVtYmVkZGVkIHdpdGhpbgorICogYSBoaWdoZXItbGV2ZWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRldmljZS4KKyAqLwogc3RydWN0IGRldmljZSB7CiAJc3RydWN0IGRldmljZQkJKnBhcmVudDsKIApAQCAtNDA4LDcgKzU1Niw3IEBACiAKIAlzdHJ1Y3Qga29iamVjdCBrb2JqOwogCWNvbnN0IGNoYXIJCSppbml0X25hbWU7IC8qIGluaXRpYWwgbmFtZSBvZiB0aGUgZGV2aWNlICovCi0Jc3RydWN0IGRldmljZV90eXBlCSp0eXBlOworCWNvbnN0IHN0cnVjdCBkZXZpY2VfdHlwZSAqdHlwZTsKIAogCXN0cnVjdCBtdXRleAkJbXV0ZXg7CS8qIG11dGV4IHRvIHN5bmNocm9uaXplIGNhbGxzIHRvCiAJCQkJCSAqIGl0cyBkcml2ZXIuCkBAIC01NTYsNyArNzA0LDcgQEAKIGV4dGVybiBjb25zdCBjaGFyICpkZXZpY2VfZ2V0X2Rldm5vZGUoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgICAgIG1vZGVfdCAqbW9kZSwgY29uc3QgY2hhciAqKnRtcCk7CiBleHRlcm4gdm9pZCAqZGV2X2dldF9kcnZkYXRhKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldik7Ci1leHRlcm4gdm9pZCBkZXZfc2V0X2RydmRhdGEoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKTsKK2V4dGVybiBpbnQgZGV2X3NldF9kcnZkYXRhKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSk7CiAKIC8qCiAgKiBSb290IGRldmljZSBvYmplY3RzIGZvciBncm91cGluZyB1bmRlciAvc3lzL2RldmljZXMKQEAgLTYxMCw3ICs3NTgsNyBAQAogZXh0ZXJuIGludCAoKnBsYXRmb3JtX25vdGlmeV9yZW1vdmUpKHN0cnVjdCBkZXZpY2UgKmRldik7CiAKIAotLyoqCisvKgogICogZ2V0X2RldmljZSAtIGF0b21pY2FsbHkgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgZm9yIHRoZSBkZXZpY2UuCiAgKgogICovCkBAIC02MzIsMTMgKzc4MCw2IEBACiAvKiBkcml2ZXJzL2Jhc2UvcG93ZXIvc2h1dGRvd24uYyAqLwogZXh0ZXJuIHZvaWQgZGV2aWNlX3NodXRkb3duKHZvaWQpOwogCi0jaWZuZGVmIENPTkZJR19BUkNIX05PX1NZU0RFVl9PUFMKLS8qIGRyaXZlcnMvYmFzZS9zeXMuYyAqLwotZXh0ZXJuIHZvaWQgc3lzZGV2X3NodXRkb3duKHZvaWQpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBzeXNkZXZfc2h1dGRvd24odm9pZCkgeyB9Ci0jZW5kaWYKLQogLyogZGVidWdnaW5nIGFuZCB0cm91Ymxlc2hvb3RpbmcvZGlhZ25vc3RpYyBoZWxwZXJzLiAqLwogZXh0ZXJuIGNvbnN0IGNoYXIgKmRldl9kcml2ZXJfc3RyaW5nKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldik7CiAKQEAgLTc0MSwxMyArODgyLDE3IEBACiAjZW5kaWYKIAogLyoKLSAqIGRldl9XQVJOKCkgYWN0cyBsaWtlIGRldl9wcmludGsoKSwgYnV0IHdpdGggdGhlIGtleSBkaWZmZXJlbmNlCisgKiBkZXZfV0FSTiooKSBhY3RzIGxpa2UgZGV2X3ByaW50aygpLCBidXQgd2l0aCB0aGUga2V5IGRpZmZlcmVuY2UKICAqIG9mIHVzaW5nIGEgV0FSTi9XQVJOX09OIHRvIGdldCB0aGUgbWVzc2FnZSBvdXQsIGluY2x1ZGluZyB0aGUKICAqIGZpbGUvbGluZSBpbmZvcm1hdGlvbiBhbmQgYSBiYWNrdHJhY2UuCiAgKi8KICNkZWZpbmUgZGV2X1dBUk4oZGV2LCBmb3JtYXQsIGFyZy4uLikgXAogCVdBUk4oMSwgIkRldmljZTogJXNcbiIgZm9ybWF0LCBkZXZfZHJpdmVyX3N0cmluZyhkZXYpLCAjIyBhcmcpOwogCisjZGVmaW5lIGRldl9XQVJOX09OQ0UoZGV2LCBjb25kaXRpb24sIGZvcm1hdCwgYXJnLi4uKSBcCisJV0FSTl9PTkNFKGNvbmRpdGlvbiwgIkRldmljZSAlc1xuIiBmb3JtYXQsIFwKKwkJCWRldl9kcml2ZXJfc3RyaW5nKGRldiksICMjIGFyZykKKwogLyogQ3JlYXRlIGFsaWFzLCBzbyBJIGNhbiBiZSBhdXRvbG9hZGVkLiAqLwogI2RlZmluZSBNT0RVTEVfQUxJQVNfQ0hBUkRFVihtYWpvcixtaW5vcikgXAogCU1PRFVMRV9BTElBUygiY2hhci1tYWpvci0iIF9fc3RyaW5naWZ5KG1ham9yKSAiLSIgX19zdHJpbmdpZnkobWlub3IpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9keW5hbWljX2RlYnVnLmggYi9pbmNsdWRlL2xpbnV4L2R5bmFtaWNfZGVidWcuaAppbmRleCAwYzk2NTNmLi5lNzQ3ZWNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2R5bmFtaWNfZGVidWcuaAorKysgYi9pbmNsdWRlL2xpbnV4L2R5bmFtaWNfZGVidWcuaApAQCAtMSw4ICsxLDYgQEAKICNpZm5kZWYgX0RZTkFNSUNfREVCVUdfSAogI2RlZmluZSBfRFlOQU1JQ19ERUJVR19ICiAKLSNpbmNsdWRlIDxsaW51eC9qdW1wX2xhYmVsLmg+Ci0KIC8qIGR5bmFtaWNfcHJpbnRrX2VuYWJsZWQsIGFuZCBkeW5hbWljX3ByaW50a19lbmFibGVkMiBhcmUgYml0bWFza3MgaW4gd2hpY2gKICAqIGJpdCBuIGlzIHNldCB0byAxIGlmIGFueSBtb2RuYW1lIGhhc2hlcyBpbnRvIHRoZSBidWNrZXQgbiwgMCBvdGhlcndpc2UuIFRoZXkKICAqIHVzZSBpbmRlcGVuZGVudCBoYXNoIGZ1bmN0aW9ucywgdG8gcmVkdWNlIHRoZSBjaGFuY2Ugb2YgZmFsc2UgcG9zaXRpdmVzLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mdHJhY2UuaCBiL2luY2x1ZGUvbGludXgvZnRyYWNlLmgKaW5kZXggY2EyOWUwMy4uOWQ4OGUxYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mdHJhY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oCkBAIC0yOSw5ICsyOSwyMiBAQAogCiB0eXBlZGVmIHZvaWQgKCpmdHJhY2VfZnVuY190KSh1bnNpZ25lZCBsb25nIGlwLCB1bnNpZ25lZCBsb25nIHBhcmVudF9pcCk7CiAKK3N0cnVjdCBmdHJhY2VfaGFzaDsKKworZW51bSB7CisJRlRSQUNFX09QU19GTF9FTkFCTEVECQk9IDEgPDwgMCwKKwlGVFJBQ0VfT1BTX0ZMX0dMT0JBTAkJPSAxIDw8IDEsCisJRlRSQUNFX09QU19GTF9EWU5BTUlDCQk9IDEgPDwgMiwKK307CisKIHN0cnVjdCBmdHJhY2Vfb3BzIHsKLQlmdHJhY2VfZnVuY190CSAgZnVuYzsKLQlzdHJ1Y3QgZnRyYWNlX29wcyAqbmV4dDsKKwlmdHJhY2VfZnVuY190CQkJZnVuYzsKKwlzdHJ1Y3QgZnRyYWNlX29wcwkJKm5leHQ7CisJdW5zaWduZWQgbG9uZwkJCWZsYWdzOworI2lmZGVmIENPTkZJR19EWU5BTUlDX0ZUUkFDRQorCXN0cnVjdCBmdHJhY2VfaGFzaAkJKm5vdHJhY2VfaGFzaDsKKwlzdHJ1Y3QgZnRyYWNlX2hhc2gJCSpmaWx0ZXJfaGFzaDsKKyNlbmRpZgogfTsKIAogZXh0ZXJuIGludCBmdW5jdGlvbl90cmFjZV9zdG9wOwpAQCAtMTQ2LDE0ICsxNTksMTMgQEAKIGV4dGVybiBpbnQgZnRyYWNlX3RleHRfcmVzZXJ2ZWQodm9pZCAqc3RhcnQsIHZvaWQgKmVuZCk7CiAKIGVudW0gewotCUZUUkFDRV9GTF9GUkVFCQk9ICgxIDw8IDApLAotCUZUUkFDRV9GTF9GQUlMRUQJPSAoMSA8PCAxKSwKLQlGVFJBQ0VfRkxfRklMVEVSCT0gKDEgPDwgMiksCi0JRlRSQUNFX0ZMX0VOQUJMRUQJPSAoMSA8PCAzKSwKLQlGVFJBQ0VfRkxfTk9UUkFDRQk9ICgxIDw8IDQpLAotCUZUUkFDRV9GTF9DT05WRVJURUQJPSAoMSA8PCA1KSwKKwlGVFJBQ0VfRkxfRU5BQkxFRAk9ICgxIDw8IDMwKSwKKwlGVFJBQ0VfRkxfRlJFRQkJPSAoMSA8PCAzMSksCiB9OwogCisjZGVmaW5lIEZUUkFDRV9GTF9NQVNLCQkoMHgzVUwgPDwgMzApCisjZGVmaW5lIEZUUkFDRV9SRUZfTUFYCQkoKDEgPDwgMzApIC0gMSkKKwogc3RydWN0IGR5bl9mdHJhY2UgewogCXVuaW9uIHsKIAkJdW5zaWduZWQgbG9uZwkJaXA7IC8qIGFkZHJlc3Mgb2YgbWNvdW50IGNhbGwtc2l0ZSAqLwpAQCAtMTY3LDcgKzE3OSwxMiBAQAogfTsKIAogaW50IGZ0cmFjZV9mb3JjZV91cGRhdGUodm9pZCk7Ci12b2lkIGZ0cmFjZV9zZXRfZmlsdGVyKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbiwgaW50IHJlc2V0KTsKK3ZvaWQgZnRyYWNlX3NldF9maWx0ZXIoc3RydWN0IGZ0cmFjZV9vcHMgKm9wcywgdW5zaWduZWQgY2hhciAqYnVmLAorCQkgICAgICAgaW50IGxlbiwgaW50IHJlc2V0KTsKK3ZvaWQgZnRyYWNlX3NldF9ub3RyYWNlKHN0cnVjdCBmdHJhY2Vfb3BzICpvcHMsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCWludCBsZW4sIGludCByZXNldCk7Cit2b2lkIGZ0cmFjZV9zZXRfZ2xvYmFsX2ZpbHRlcih1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4sIGludCByZXNldCk7Cit2b2lkIGZ0cmFjZV9zZXRfZ2xvYmFsX25vdHJhY2UodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuLCBpbnQgcmVzZXQpOwogCiBpbnQgcmVnaXN0ZXJfZnRyYWNlX2NvbW1hbmQoc3RydWN0IGZ0cmFjZV9mdW5jX2NvbW1hbmQgKmNtZCk7CiBpbnQgdW5yZWdpc3Rlcl9mdHJhY2VfY29tbWFuZChzdHJ1Y3QgZnRyYWNlX2Z1bmNfY29tbWFuZCAqY21kKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5pdC5oIGIvaW5jbHVkZS9saW51eC9pbml0LmgKaW5kZXggNTc3NjcxYy4uOTE0NmYzOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbml0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbml0LmgKQEAgLTc5LDI5ICs3OSwyOSBAQAogI2RlZmluZSBfX2V4aXR1c2VkICBfX3VzZWQKICNlbmRpZgogCi0jZGVmaW5lIF9fZXhpdCAgICAgICAgICBfX3NlY3Rpb24oLmV4aXQudGV4dCkgX19leGl0dXNlZCBfX2NvbGQKKyNkZWZpbmUgX19leGl0ICAgICAgICAgIF9fc2VjdGlvbiguZXhpdC50ZXh0KSBfX2V4aXR1c2VkIF9fY29sZCBub3RyYWNlCiAKIC8qIFVzZWQgZm9yIEhPVFBMVUcgKi8KLSNkZWZpbmUgX19kZXZpbml0ICAgICAgICBfX3NlY3Rpb24oLmRldmluaXQudGV4dCkgX19jb2xkCisjZGVmaW5lIF9fZGV2aW5pdCAgICAgICAgX19zZWN0aW9uKC5kZXZpbml0LnRleHQpIF9fY29sZCBub3RyYWNlCiAjZGVmaW5lIF9fZGV2aW5pdGRhdGEgICAgX19zZWN0aW9uKC5kZXZpbml0LmRhdGEpCiAjZGVmaW5lIF9fZGV2aW5pdGNvbnN0ICAgX19zZWN0aW9uKC5kZXZpbml0LnJvZGF0YSkKLSNkZWZpbmUgX19kZXZleGl0ICAgICAgICBfX3NlY3Rpb24oLmRldmV4aXQudGV4dCkgX19leGl0dXNlZCBfX2NvbGQKKyNkZWZpbmUgX19kZXZleGl0ICAgICAgICBfX3NlY3Rpb24oLmRldmV4aXQudGV4dCkgX19leGl0dXNlZCBfX2NvbGQgbm90cmFjZQogI2RlZmluZSBfX2RldmV4aXRkYXRhICAgIF9fc2VjdGlvbiguZGV2ZXhpdC5kYXRhKQogI2RlZmluZSBfX2RldmV4aXRjb25zdCAgIF9fc2VjdGlvbiguZGV2ZXhpdC5yb2RhdGEpCiAKIC8qIFVzZWQgZm9yIEhPVFBMVUdfQ1BVICovCi0jZGVmaW5lIF9fY3B1aW5pdCAgICAgICAgX19zZWN0aW9uKC5jcHVpbml0LnRleHQpIF9fY29sZAorI2RlZmluZSBfX2NwdWluaXQgICAgICAgIF9fc2VjdGlvbiguY3B1aW5pdC50ZXh0KSBfX2NvbGQgbm90cmFjZQogI2RlZmluZSBfX2NwdWluaXRkYXRhICAgIF9fc2VjdGlvbiguY3B1aW5pdC5kYXRhKQogI2RlZmluZSBfX2NwdWluaXRjb25zdCAgIF9fc2VjdGlvbiguY3B1aW5pdC5yb2RhdGEpCi0jZGVmaW5lIF9fY3B1ZXhpdCAgICAgICAgX19zZWN0aW9uKC5jcHVleGl0LnRleHQpIF9fZXhpdHVzZWQgX19jb2xkCisjZGVmaW5lIF9fY3B1ZXhpdCAgICAgICAgX19zZWN0aW9uKC5jcHVleGl0LnRleHQpIF9fZXhpdHVzZWQgX19jb2xkIG5vdHJhY2UKICNkZWZpbmUgX19jcHVleGl0ZGF0YSAgICBfX3NlY3Rpb24oLmNwdWV4aXQuZGF0YSkKICNkZWZpbmUgX19jcHVleGl0Y29uc3QgICBfX3NlY3Rpb24oLmNwdWV4aXQucm9kYXRhKQogCiAvKiBVc2VkIGZvciBNRU1PUllfSE9UUExVRyAqLwotI2RlZmluZSBfX21lbWluaXQgICAgICAgIF9fc2VjdGlvbigubWVtaW5pdC50ZXh0KSBfX2NvbGQKKyNkZWZpbmUgX19tZW1pbml0ICAgICAgICBfX3NlY3Rpb24oLm1lbWluaXQudGV4dCkgX19jb2xkIG5vdHJhY2UKICNkZWZpbmUgX19tZW1pbml0ZGF0YSAgICBfX3NlY3Rpb24oLm1lbWluaXQuZGF0YSkKICNkZWZpbmUgX19tZW1pbml0Y29uc3QgICBfX3NlY3Rpb24oLm1lbWluaXQucm9kYXRhKQotI2RlZmluZSBfX21lbWV4aXQgICAgICAgIF9fc2VjdGlvbigubWVtZXhpdC50ZXh0KSBfX2V4aXR1c2VkIF9fY29sZAorI2RlZmluZSBfX21lbWV4aXQgICAgICAgIF9fc2VjdGlvbigubWVtZXhpdC50ZXh0KSBfX2V4aXR1c2VkIF9fY29sZCBub3RyYWNlCiAjZGVmaW5lIF9fbWVtZXhpdGRhdGEgICAgX19zZWN0aW9uKC5tZW1leGl0LmRhdGEpCiAjZGVmaW5lIF9fbWVtZXhpdGNvbnN0ICAgX19zZWN0aW9uKC5tZW1leGl0LnJvZGF0YSkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbml0X3Rhc2suaCBiL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmgKaW5kZXggY2FhMTUxZi4uNjg5NDk2YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbml0X3Rhc2suaAorKysgYi9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oCkBAIC0xMzQsNyArMTM0LDYgQEAKIAkuc3RhY2sJCT0gJmluaXRfdGhyZWFkX2luZm8sCQkJCVwKIAkudXNhZ2UJCT0gQVRPTUlDX0lOSVQoMiksCQkJCVwKIAkuZmxhZ3MJCT0gUEZfS1RIUkVBRCwJCQkJCVwKLQkubG9ja19kZXB0aAk9IC0xLAkJCQkJCVwKIAkucHJpbwkJPSBNQVhfUFJJTy0yMCwJCQkJCVwKIAkuc3RhdGljX3ByaW8JPSBNQVhfUFJJTy0yMCwJCQkJCVwKIAkubm9ybWFsX3ByaW8JPSBNQVhfUFJJTy0yMCwJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmggYi9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCmluZGV4IGJlYTBhYzcuLjZjMTI5ODkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaApAQCAtNDE0LDcgKzQxNCw2IEBACiAJVEFTS0xFVF9TT0ZUSVJRLAogCVNDSEVEX1NPRlRJUlEsCiAJSFJUSU1FUl9TT0ZUSVJRLAotCVJDVV9TT0ZUSVJRLAkvKiBQcmVmZXJhYmxlIFJDVSBzaG91bGQgYWx3YXlzIGJlIHRoZSBsYXN0IHNvZnRpcnEgKi8KIAogCU5SX1NPRlRJUlFTCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcnEuaCBiL2luY2x1ZGUvbGludXgvaXJxLmgKaW5kZXggMDlhMzA4MC4uOGI0NTM4NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcnEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lycS5oCkBAIC01MywxMiArNTMsMTMgQEAKICAqIEJpdHMgd2hpY2ggY2FuIGJlIG1vZGlmaWVkIHZpYSBpcnFfc2V0L2NsZWFyL21vZGlmeV9zdGF0dXNfZmxhZ3MoKQogICogSVJRX0xFVkVMCQkJLSBJbnRlcnJ1cHQgaXMgbGV2ZWwgdHlwZS4gV2lsbCBiZSBhbHNvCiAgKgkJCQkgIHVwZGF0ZWQgaW4gdGhlIGNvZGUgd2hlbiB0aGUgYWJvdmUgdHJpZ2dlcgotICoJCQkJICBiaXRzIGFyZSBtb2RpZmllZCB2aWEgc2V0X2lycV90eXBlKCkKKyAqCQkJCSAgYml0cyBhcmUgbW9kaWZpZWQgdmlhIGlycV9zZXRfaXJxX3R5cGUoKQogICogSVJRX1BFUl9DUFUJCQktIE1hcmsgYW4gaW50ZXJydXB0IFBFUl9DUFUuIFdpbGwgcHJvdGVjdAogICoJCQkJICBpdCBmcm9tIGFmZmluaXR5IHNldHRpbmcKICAqIElSUV9OT1BST0JFCQkJLSBJbnRlcnJ1cHQgY2Fubm90IGJlIHByb2JlZCBieSBhdXRvcHJvYmluZwogICogSVJRX05PUkVRVUVTVAkJLSBJbnRlcnJ1cHQgY2Fubm90IGJlIHJlcXVlc3RlZCB2aWEKICAqCQkJCSAgcmVxdWVzdF9pcnEoKQorICogSVJRX05PVEhSRUFECQkJLSBJbnRlcnJ1cHQgY2Fubm90IGJlIHRocmVhZGVkCiAgKiBJUlFfTk9BVVRPRU4JCQktIEludGVycnVwdCBpcyBub3QgYXV0b21hdGljYWxseSBlbmFibGVkIGluCiAgKgkJCQkgIHJlcXVlc3Qvc2V0dXBfaXJxKCkKICAqIElSUV9OT19CQUxBTkNJTkcJCS0gSW50ZXJydXB0IGNhbm5vdCBiZSBiYWxhbmNlZCAoYWZmaW5pdHkgc2V0KQpAQCAtODUsNiArODYsNyBAQAogCUlSUV9OT19CQUxBTkNJTkcJPSAoMSA8PCAxMyksCiAJSVJRX01PVkVfUENOVFhUCQk9ICgxIDw8IDE0KSwKIAlJUlFfTkVTVEVEX1RIUkVBRAk9ICgxIDw8IDE1KSwKKwlJUlFfTk9USFJFQUQJCT0gKDEgPDwgMTYpLAogfTsKIAogI2RlZmluZSBJUlFGX01PRElGWV9NQVNLCVwKQEAgLTI2MSwyMyArMjYzLDYgQEAKICAqIHN0cnVjdCBpcnFfY2hpcCAtIGhhcmR3YXJlIGludGVycnVwdCBjaGlwIGRlc2NyaXB0b3IKICAqCiAgKiBAbmFtZToJCW5hbWUgZm9yIC9wcm9jL2ludGVycnVwdHMKLSAqIEBzdGFydHVwOgkJZGVwcmVjYXRlZCwgcmVwbGFjZWQgYnkgaXJxX3N0YXJ0dXAKLSAqIEBzaHV0ZG93bjoJCWRlcHJlY2F0ZWQsIHJlcGxhY2VkIGJ5IGlycV9zaHV0ZG93bgotICogQGVuYWJsZToJCWRlcHJlY2F0ZWQsIHJlcGxhY2VkIGJ5IGlycV9lbmFibGUKLSAqIEBkaXNhYmxlOgkJZGVwcmVjYXRlZCwgcmVwbGFjZWQgYnkgaXJxX2Rpc2FibGUKLSAqIEBhY2s6CQlkZXByZWNhdGVkLCByZXBsYWNlZCBieSBpcnFfYWNrCi0gKiBAbWFzazoJCWRlcHJlY2F0ZWQsIHJlcGxhY2VkIGJ5IGlycV9tYXNrCi0gKiBAbWFza19hY2s6CQlkZXByZWNhdGVkLCByZXBsYWNlZCBieSBpcnFfbWFza19hY2sKLSAqIEB1bm1hc2s6CQlkZXByZWNhdGVkLCByZXBsYWNlZCBieSBpcnFfdW5tYXNrCi0gKiBAZW9pOgkJZGVwcmVjYXRlZCwgcmVwbGFjZWQgYnkgaXJxX2VvaQotICogQGVuZDoJCWRlcHJlY2F0ZWQsIHdpbGwgZ28gYXdheSB3aXRoIF9fZG9fSVJRKCkKLSAqIEBzZXRfYWZmaW5pdHk6CWRlcHJlY2F0ZWQsIHJlcGxhY2VkIGJ5IGlycV9zZXRfYWZmaW5pdHkKLSAqIEByZXRyaWdnZXI6CQlkZXByZWNhdGVkLCByZXBsYWNlZCBieSBpcnFfcmV0cmlnZ2VyCi0gKiBAc2V0X3R5cGU6CQlkZXByZWNhdGVkLCByZXBsYWNlZCBieSBpcnFfc2V0X3R5cGUKLSAqIEBzZXRfd2FrZToJCWRlcHJlY2F0ZWQsIHJlcGxhY2VkIGJ5IGlycV93YWtlCi0gKiBAYnVzX2xvY2s6CQlkZXByZWNhdGVkLCByZXBsYWNlZCBieSBpcnFfYnVzX2xvY2sKLSAqIEBidXNfc3luY191bmxvY2s6CWRlcHJlY2F0ZWQsIHJlcGxhY2VkIGJ5IGlycV9idXNfc3luY191bmxvY2sKLSAqCiAgKiBAaXJxX3N0YXJ0dXA6CXN0YXJ0IHVwIHRoZSBpbnRlcnJ1cHQgKGRlZmF1bHRzIHRvIC0+ZW5hYmxlIGlmIE5VTEwpCiAgKiBAaXJxX3NodXRkb3duOglzaHV0IGRvd24gdGhlIGludGVycnVwdCAoZGVmYXVsdHMgdG8gLT5kaXNhYmxlIGlmIE5VTEwpCiAgKiBAaXJxX2VuYWJsZToJCWVuYWJsZSB0aGUgaW50ZXJydXB0IChkZWZhdWx0cyB0byBjaGlwLT51bm1hc2sgaWYgTlVMTCkKQEAgLTI5NSw2ICsyODAsOSBAQAogICogQGlycV9idXNfc3luY191bmxvY2s6ZnVuY3Rpb24gdG8gc3luYyBhbmQgdW5sb2NrIHNsb3cgYnVzIChpMmMpIGNoaXBzCiAgKiBAaXJxX2NwdV9vbmxpbmU6CWNvbmZpZ3VyZSBhbiBpbnRlcnJ1cHQgc291cmNlIGZvciBhIHNlY29uZGFyeSBDUFUKICAqIEBpcnFfY3B1X29mZmxpbmU6CXVuLWNvbmZpZ3VyZSBhbiBpbnRlcnJ1cHQgc291cmNlIGZvciBhIHNlY29uZGFyeSBDUFUKKyAqIEBpcnFfc3VzcGVuZDoJZnVuY3Rpb24gY2FsbGVkIGZyb20gY29yZSBjb2RlIG9uIHN1c3BlbmQgb25jZSBwZXIgY2hpcAorICogQGlycV9yZXN1bWU6CQlmdW5jdGlvbiBjYWxsZWQgZnJvbSBjb3JlIGNvZGUgb24gcmVzdW1lIG9uY2UgcGVyIGNoaXAKKyAqIEBpcnFfcG1fc2h1dGRvd246CWZ1bmN0aW9uIGNhbGxlZCBmcm9tIGNvcmUgY29kZSBvbiBzaHV0ZG93biBvbmNlIHBlciBjaGlwCiAgKiBAaXJxX3ByaW50X2NoaXA6CW9wdGlvbmFsIHRvIHByaW50IHNwZWNpYWwgY2hpcCBpbmZvIGluIHNob3dfaW50ZXJydXB0cwogICogQGZsYWdzOgkJY2hpcCBzcGVjaWZpYyBmbGFncwogICoKQEAgLTMyNCw2ICszMTIsMTAgQEAKIAl2b2lkCQkoKmlycV9jcHVfb25saW5lKShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpOwogCXZvaWQJCSgqaXJxX2NwdV9vZmZsaW5lKShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpOwogCisJdm9pZAkJKCppcnFfc3VzcGVuZCkoc3RydWN0IGlycV9kYXRhICpkYXRhKTsKKwl2b2lkCQkoKmlycV9yZXN1bWUpKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSk7CisJdm9pZAkJKCppcnFfcG1fc2h1dGRvd24pKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSk7CisKIAl2b2lkCQkoKmlycV9wcmludF9jaGlwKShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHN0cnVjdCBzZXFfZmlsZSAqcCk7CiAKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwpAQCAtNDM5LDcgKzQzMSw3IEBACiAvKgogICogU2V0IGEgaGlnaGxldmVsIGNoYWluZWQgZmxvdyBoYW5kbGVyIGZvciBhIGdpdmVuIElSUS4KICAqIChhIGNoYWluZWQgaGFuZGxlciBpcyBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgYW5kIHNldCB0bwotICogIElSUV9OT1JFUVVFU1QgYW5kIElSUV9OT1BST0JFKQorICogIElSUV9OT1JFUVVFU1QsIElSUV9OT1BST0JFLCBhbmQgSVJRX05PVEhSRUFEKQogICovCiBzdGF0aWMgaW5saW5lIHZvaWQKIGlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIGlycV9mbG93X2hhbmRsZXJfdCBoYW5kbGUpCkBAIC00NjksNiArNDYxLDE2IEBACiAJaXJxX21vZGlmeV9zdGF0dXMoaXJxLCBJUlFfTk9QUk9CRSwgMCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcnFfc2V0X25vdGhyZWFkKHVuc2lnbmVkIGludCBpcnEpCit7CisJaXJxX21vZGlmeV9zdGF0dXMoaXJxLCAwLCBJUlFfTk9USFJFQUQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXJxX3NldF90aHJlYWQodW5zaWduZWQgaW50IGlycSkKK3sKKwlpcnFfbW9kaWZ5X3N0YXR1cyhpcnEsIElSUV9OT1RIUkVBRCwgMCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBpcnFfc2V0X25lc3RlZF90aHJlYWQodW5zaWduZWQgaW50IGlycSwgYm9vbCBuZXN0KQogewogCWlmIChuZXN0KQpAQCAtNTczLDYgKzU3NSwxNDUgQEAKIAlyZXR1cm4gaXJxX3Jlc2VydmVfaXJxcyhpcnEsIDEpOwogfQogCisjaWZuZGVmIGlycV9yZWdfd3JpdGVsCisjIGRlZmluZSBpcnFfcmVnX3dyaXRlbCh2YWwsIGFkZHIpCXdyaXRlbCh2YWwsIGFkZHIpCisjZW5kaWYKKyNpZm5kZWYgaXJxX3JlZ19yZWFkbAorIyBkZWZpbmUgaXJxX3JlZ19yZWFkbChhZGRyKQkJcmVhZGwoYWRkcikKKyNlbmRpZgorCisvKioKKyAqIHN0cnVjdCBpcnFfY2hpcF9yZWdzIC0gcmVnaXN0ZXIgb2Zmc2V0cyBmb3Igc3RydWN0IGlycV9nY2kKKyAqIEBlbmFibGU6CUVuYWJsZSByZWdpc3RlciBvZmZzZXQgdG8gcmVnX2Jhc2UKKyAqIEBkaXNhYmxlOglEaXNhYmxlIHJlZ2lzdGVyIG9mZnNldCB0byByZWdfYmFzZQorICogQG1hc2s6CU1hc2sgcmVnaXN0ZXIgb2Zmc2V0IHRvIHJlZ19iYXNlCisgKiBAYWNrOglBY2sgcmVnaXN0ZXIgb2Zmc2V0IHRvIHJlZ19iYXNlCisgKiBAZW9pOglFb2kgcmVnaXN0ZXIgb2Zmc2V0IHRvIHJlZ19iYXNlCisgKiBAdHlwZToJVHlwZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIG9mZnNldCB0byByZWdfYmFzZQorICogQHBvbGFyaXR5OglQb2xhcml0eSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIG9mZnNldCB0byByZWdfYmFzZQorICovCitzdHJ1Y3QgaXJxX2NoaXBfcmVncyB7CisJdW5zaWduZWQgbG9uZwkJZW5hYmxlOworCXVuc2lnbmVkIGxvbmcJCWRpc2FibGU7CisJdW5zaWduZWQgbG9uZwkJbWFzazsKKwl1bnNpZ25lZCBsb25nCQlhY2s7CisJdW5zaWduZWQgbG9uZwkJZW9pOworCXVuc2lnbmVkIGxvbmcJCXR5cGU7CisJdW5zaWduZWQgbG9uZwkJcG9sYXJpdHk7Cit9OworCisvKioKKyAqIHN0cnVjdCBpcnFfY2hpcF90eXBlIC0gR2VuZXJpYyBpbnRlcnJ1cHQgY2hpcCBpbnN0YW5jZSBmb3IgYSBmbG93IHR5cGUKKyAqIEBjaGlwOgkJVGhlIHJlYWwgaW50ZXJydXB0IGNoaXAgd2hpY2ggcHJvdmlkZXMgdGhlIGNhbGxiYWNrcworICogQHJlZ3M6CQlSZWdpc3RlciBvZmZzZXRzIGZvciB0aGlzIGNoaXAKKyAqIEBoYW5kbGVyOgkJRmxvdyBoYW5kbGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNoaXAKKyAqIEB0eXBlOgkJQ2hpcCBjYW4gaGFuZGxlIHRoZXNlIGZsb3cgdHlwZXMKKyAqCisgKiBBIGlycV9nZW5lcmljX2NoaXAgY2FuIGhhdmUgc2V2ZXJhbCBpbnN0YW5jZXMgb2YgaXJxX2NoaXBfdHlwZSB3aGVuCisgKiBpdCByZXF1aXJlcyBkaWZmZXJlbnQgZnVuY3Rpb25zIGFuZCByZWdpc3RlciBvZmZzZXRzIGZvciBkaWZmZXJlbnQKKyAqIGZsb3cgdHlwZXMuCisgKi8KK3N0cnVjdCBpcnFfY2hpcF90eXBlIHsKKwlzdHJ1Y3QgaXJxX2NoaXAJCWNoaXA7CisJc3RydWN0IGlycV9jaGlwX3JlZ3MJcmVnczsKKwlpcnFfZmxvd19oYW5kbGVyX3QJaGFuZGxlcjsKKwl1MzIJCQl0eXBlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAtIEdlbmVyaWMgaXJxIGNoaXAgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBsb2NrOgkJTG9jayB0byBwcm90ZWN0IHJlZ2lzdGVyIGFuZCBjYWNoZSBkYXRhIGFjY2VzcworICogQHJlZ19iYXNlOgkJUmVnaXN0ZXIgYmFzZSBhZGRyZXNzICh2aXJ0dWFsKQorICogQGlycV9iYXNlOgkJSW50ZXJydXB0IGJhc2UgbnIgZm9yIHRoaXMgY2hpcAorICogQGlycV9jbnQ6CQlOdW1iZXIgb2YgaW50ZXJydXB0cyBoYW5kbGVkIGJ5IHRoaXMgY2hpcAorICogQG1hc2tfY2FjaGU6CQlDYWNoZWQgbWFzayByZWdpc3RlcgorICogQHR5cGVfY2FjaGU6CQlDYWNoZWQgdHlwZSByZWdpc3RlcgorICogQHBvbGFyaXR5X2NhY2hlOglDYWNoZWQgcG9sYXJpdHkgcmVnaXN0ZXIKKyAqIEB3YWtlX2VuYWJsZWQ6CUludGVycnVwdCBjYW4gd2FrZXVwIGZyb20gc3VzcGVuZAorICogQHdha2VfYWN0aXZlOglJbnRlcnJ1cHQgaXMgbWFya2VkIGFzIGFuIHdha2V1cCBmcm9tIHN1c3BlbmQgc291cmNlCisgKiBAbnVtX2N0OgkJTnVtYmVyIG9mIGF2YWlsYWJsZSBpcnFfY2hpcF90eXBlIGluc3RhbmNlcyAodXN1YWxseSAxKQorICogQHByaXZhdGU6CQlQcml2YXRlIGRhdGEgZm9yIG5vbiBnZW5lcmljIGNoaXAgY2FsbGJhY2tzCisgKiBAbGlzdDoJCUxpc3QgaGVhZCBmb3Iga2VlcGluZyB0cmFjayBvZiBpbnN0YW5jZXMKKyAqIEBjaGlwX3R5cGVzOgkJQXJyYXkgb2YgaW50ZXJydXB0IGlycV9jaGlwX3R5cGVzCisgKgorICogTm90ZSwgdGhhdCBpcnFfY2hpcF9nZW5lcmljIGNhbiBoYXZlIG11bHRpcGxlIGlycV9jaGlwX3R5cGUKKyAqIGltcGxlbWVudGF0aW9ucyB3aGljaCBjYW4gYmUgYXNzb2NpYXRlZCB0byBhIHBhcnRpY3VsYXIgaXJxIGxpbmUgb2YKKyAqIGFuIGlycV9jaGlwX2dlbmVyaWMgaW5zdGFuY2UuIFRoYXQgYWxsb3dzIHRvIHNoYXJlIGFuZCBwcm90ZWN0CisgKiBzdGF0ZSBpbiBhbiBpcnFfY2hpcF9nZW5lcmljIGluc3RhbmNlIHdoZW4gd2UgbmVlZCB0byBpbXBsZW1lbnQKKyAqIGRpZmZlcmVudCBmbG93IG1lY2hhbmlzbXMgKGxldmVsL2VkZ2UpIGZvciBpdC4KKyAqLworc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgeworCXJhd19zcGlubG9ja190CQlsb2NrOworCXZvaWQgX19pb21lbQkJKnJlZ19iYXNlOworCXVuc2lnbmVkIGludAkJaXJxX2Jhc2U7CisJdW5zaWduZWQgaW50CQlpcnFfY250OworCXUzMgkJCW1hc2tfY2FjaGU7CisJdTMyCQkJdHlwZV9jYWNoZTsKKwl1MzIJCQlwb2xhcml0eV9jYWNoZTsKKwl1MzIJCQl3YWtlX2VuYWJsZWQ7CisJdTMyCQkJd2FrZV9hY3RpdmU7CisJdW5zaWduZWQgaW50CQludW1fY3Q7CisJdm9pZAkJCSpwcml2YXRlOworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwlzdHJ1Y3QgaXJxX2NoaXBfdHlwZQljaGlwX3R5cGVzWzBdOworfTsKKworLyoqCisgKiBlbnVtIGlycV9nY19mbGFncyAtIEluaXRpYWxpemF0aW9uIGZsYWdzIGZvciBnZW5lcmljIGlycSBjaGlwcworICogQElSUV9HQ19JTklUX01BU0tfQ0FDSEU6CUluaXRpYWxpemUgdGhlIG1hc2tfY2FjaGUgYnkgcmVhZGluZyBtYXNrIHJlZworICogQElSUV9HQ19JTklUX05FU1RFRF9MT0NLOglTZXQgdGhlIGxvY2sgY2xhc3Mgb2YgdGhlIGlycXMgdG8gbmVzdGVkIGZvcgorICoJCQkJaXJxIGNoaXBzIHdoaWNoIG5lZWQgdG8gY2FsbCBpcnFfc2V0X3dha2UoKSBvbgorICoJCQkJdGhlIHBhcmVudCBpcnEuIFVzdWFsbHkgR1BJTyBpbXBsZW1lbnRhdGlvbnMKKyAqLworZW51bSBpcnFfZ2NfZmxhZ3MgeworCUlSUV9HQ19JTklUX01BU0tfQ0FDSEUJCT0gMSA8PCAwLAorCUlSUV9HQ19JTklUX05FU1RFRF9MT0NLCQk9IDEgPDwgMSwKK307CisKKy8qIEdlbmVyaWMgY2hpcCBjYWxsYmFjayBmdW5jdGlvbnMgKi8KK3ZvaWQgaXJxX2djX25vb3Aoc3RydWN0IGlycV9kYXRhICpkKTsKK3ZvaWQgaXJxX2djX21hc2tfZGlzYWJsZV9yZWcoc3RydWN0IGlycV9kYXRhICpkKTsKK3ZvaWQgaXJxX2djX21hc2tfc2V0X2JpdChzdHJ1Y3QgaXJxX2RhdGEgKmQpOwordm9pZCBpcnFfZ2NfbWFza19jbHJfYml0KHN0cnVjdCBpcnFfZGF0YSAqZCk7Cit2b2lkIGlycV9nY191bm1hc2tfZW5hYmxlX3JlZyhzdHJ1Y3QgaXJxX2RhdGEgKmQpOwordm9pZCBpcnFfZ2NfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZCk7Cit2b2lkIGlycV9nY19tYXNrX2Rpc2FibGVfcmVnX2FuZF9hY2soc3RydWN0IGlycV9kYXRhICpkKTsKK3ZvaWQgaXJxX2djX2VvaShzdHJ1Y3QgaXJxX2RhdGEgKmQpOworaW50IGlycV9nY19zZXRfd2FrZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCBvbik7CisKKy8qIFNldHVwIGZ1bmN0aW9ucyBmb3IgaXJxX2NoaXBfZ2VuZXJpYyAqLworc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKgoraXJxX2FsbG9jX2dlbmVyaWNfY2hpcChjb25zdCBjaGFyICpuYW1lLCBpbnQgbnJfY3QsIHVuc2lnbmVkIGludCBpcnFfYmFzZSwKKwkJICAgICAgIHZvaWQgX19pb21lbSAqcmVnX2Jhc2UsIGlycV9mbG93X2hhbmRsZXJfdCBoYW5kbGVyKTsKK3ZvaWQgaXJxX3NldHVwX2dlbmVyaWNfY2hpcChzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2MsIHUzMiBtc2ssCisJCQkgICAgZW51bSBpcnFfZ2NfZmxhZ3MgZmxhZ3MsIHVuc2lnbmVkIGludCBjbHIsCisJCQkgICAgdW5zaWduZWQgaW50IHNldCk7CitpbnQgaXJxX3NldHVwX2FsdF9jaGlwKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IHR5cGUpOwordm9pZCBpcnFfcmVtb3ZlX2dlbmVyaWNfY2hpcChzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2MsIHUzMiBtc2ssCisJCQkgICAgIHVuc2lnbmVkIGludCBjbHIsIHVuc2lnbmVkIGludCBzZXQpOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpcnFfY2hpcF90eXBlICppcnFfZGF0YV9nZXRfY2hpcF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGQtPmNoaXAsIHN0cnVjdCBpcnFfY2hpcF90eXBlLCBjaGlwKTsKK30KKworI2RlZmluZSBJUlFfTVNLKG4pICh1MzIpKChuKSA8IDMyID8gKCgxIDw8IChuKSkgLSAxKSA6IFVJTlRfTUFYKQorCisjaWZkZWYgQ09ORklHX1NNUAorc3RhdGljIGlubGluZSB2b2lkIGlycV9nY19sb2NrKHN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYykKK3sKKwlyYXdfc3Bpbl9sb2NrKCZnYy0+bG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcnFfZ2NfdW5sb2NrKHN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYykKK3sKKwlyYXdfc3Bpbl91bmxvY2soJmdjLT5sb2NrKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgaXJxX2djX2xvY2soc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBpcnFfZ2NfdW5sb2NrKHN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYykgeyB9CisjZW5kaWYKKwogI2VuZGlmIC8qIENPTkZJR19HRU5FUklDX0hBUkRJUlFTICovCiAKICNlbmRpZiAvKiAhQ09ORklHX1MzOTAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXJxZGVzYy5oIGIvaW5jbHVkZS9saW51eC9pcnFkZXNjLmgKaW5kZXggYTA4MjkwNS4uMmQ5MjFiMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcnFkZXNjLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcnFkZXNjLmgKQEAgLTE2LDE2ICsxNiwxOCBAQAogICogQGlycV9kYXRhOgkJcGVyIGlycSBhbmQgY2hpcCBkYXRhIHBhc3NlZCBkb3duIHRvIGNoaXAgZnVuY3Rpb25zCiAgKiBAdGltZXJfcmFuZF9zdGF0ZToJcG9pbnRlciB0byB0aW1lciByYW5kIHN0YXRlIHN0cnVjdAogICogQGtzdGF0X2lycXM6CQlpcnEgc3RhdHMgcGVyIGNwdQotICogQGhhbmRsZV9pcnE6CQloaWdobGV2ZWwgaXJxLWV2ZW50cyBoYW5kbGVyIFtpZiBOVUxMLCBfX2RvX0lSUSgpXQorICogQGhhbmRsZV9pcnE6CQloaWdobGV2ZWwgaXJxLWV2ZW50cyBoYW5kbGVyCisgKiBAcHJlZmxvd19oYW5kbGVyOgloYW5kbGVyIGNhbGxlZCBiZWZvcmUgdGhlIGZsb3cgaGFuZGxlciAoY3VycmVudGx5IHVzZWQgYnkgc3BhcmMpCiAgKiBAYWN0aW9uOgkJdGhlIGlycSBhY3Rpb24gY2hhaW4KICAqIEBzdGF0dXM6CQlzdGF0dXMgaW5mb3JtYXRpb24KICAqIEBjb3JlX2ludGVybmFsX3N0YXRlX19kb19ub3RfbWVzc193aXRoX2l0OiBjb3JlIGludGVybmFsIHN0YXR1cyBpbmZvcm1hdGlvbgogICogQGRlcHRoOgkJZGlzYWJsZS1kZXB0aCwgZm9yIG5lc3RlZCBpcnFfZGlzYWJsZSgpIGNhbGxzCi0gKiBAd2FrZV9kZXB0aDoJCWVuYWJsZSBkZXB0aCwgZm9yIG11bHRpcGxlIHNldF9pcnFfd2FrZSgpIGNhbGxlcnMKKyAqIEB3YWtlX2RlcHRoOgkJZW5hYmxlIGRlcHRoLCBmb3IgbXVsdGlwbGUgaXJxX3NldF9pcnFfd2FrZSgpIGNhbGxlcnMKICAqIEBpcnFfY291bnQ6CQlzdGF0cyBmaWVsZCB0byBkZXRlY3Qgc3RhbGxlZCBpcnFzCiAgKiBAbGFzdF91bmhhbmRsZWQ6CWFnaW5nIHRpbWVyIGZvciB1bmhhbmRsZWQgY291bnQKICAqIEBpcnFzX3VuaGFuZGxlZDoJc3RhdHMgZmllbGQgZm9yIHNwdXJpb3VzIHVuaGFuZGxlZCBpbnRlcnJ1cHRzCiAgKiBAbG9jazoJCWxvY2tpbmcgZm9yIFNNUAorICogQGFmZmluaXR5X2hpbnQ6CWhpbnQgdG8gdXNlciBzcGFjZSBmb3IgcHJlZmVycmVkIGlycSBhZmZpbml0eQogICogQGFmZmluaXR5X25vdGlmeToJY29udGV4dCBmb3Igbm90aWZpY2F0aW9uIG9mIGFmZmluaXR5IGNoYW5nZXMKICAqIEBwZW5kaW5nX21hc2s6CXBlbmRpbmcgcmViYWxhbmNlZCBpbnRlcnJ1cHRzCiAgKiBAdGhyZWFkc19vbmVzaG90OgliaXRmaWVsZCB0byBoYW5kbGUgc2hhcmVkIG9uZXNob3QgdGhyZWFkcwpAQCAtMTA5LDEwICsxMTEsNyBAQAogCWRlc2MtPmhhbmRsZV9pcnEoaXJxLCBkZXNjKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGdlbmVyaWNfaGFuZGxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWdlbmVyaWNfaGFuZGxlX2lycV9kZXNjKGlycSwgaXJxX3RvX2Rlc2MoaXJxKSk7Ci19CitpbnQgZ2VuZXJpY19oYW5kbGVfaXJxKHVuc2lnbmVkIGludCBpcnEpOwogCiAvKiBUZXN0IHRvIHNlZSBpZiBhIGRyaXZlciBoYXMgc3VjY2Vzc2Z1bGx5IHJlcXVlc3RlZCBhbiBpcnEgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGlycV9oYXNfYWN0aW9uKHVuc2lnbmVkIGludCBpcnEpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2p1bXBfbGFiZWwuaCBiL2luY2x1ZGUvbGludXgvanVtcF9sYWJlbC5oCmluZGV4IDc4ODBmMTguLjgzZTc0NWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvanVtcF9sYWJlbC5oCisrKyBiL2luY2x1ZGUvbGludXgvanVtcF9sYWJlbC5oCkBAIC0xLDIwICsxLDQzIEBACiAjaWZuZGVmIF9MSU5VWF9KVU1QX0xBQkVMX0gKICNkZWZpbmUgX0xJTlVYX0pVTVBfTEFCRUxfSAogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCiAjaWYgZGVmaW5lZChDQ19IQVZFX0FTTV9HT1RPKSAmJiBkZWZpbmVkKENPTkZJR19KVU1QX0xBQkVMKQorCitzdHJ1Y3QganVtcF9sYWJlbF9rZXkgeworCWF0b21pY190IGVuYWJsZWQ7CisJc3RydWN0IGp1bXBfZW50cnkgKmVudHJpZXM7CisjaWZkZWYgQ09ORklHX01PRFVMRVMKKwlzdHJ1Y3QganVtcF9sYWJlbF9tb2QgKm5leHQ7CisjZW5kaWYKK307CisKICMgaW5jbHVkZSA8YXNtL2p1bXBfbGFiZWwuaD4KICMgZGVmaW5lIEhBVkVfSlVNUF9MQUJFTAogI2VuZGlmCiAKIGVudW0ganVtcF9sYWJlbF90eXBlIHsKKwlKVU1QX0xBQkVMX0RJU0FCTEUgPSAwLAogCUpVTVBfTEFCRUxfRU5BQkxFLAotCUpVTVBfTEFCRUxfRElTQUJMRQogfTsKIAogc3RydWN0IG1vZHVsZTsKIAogI2lmZGVmIEhBVkVfSlVNUF9MQUJFTAogCisjaWZkZWYgQ09ORklHX01PRFVMRVMKKyNkZWZpbmUgSlVNUF9MQUJFTF9JTklUIHt7IDAgfSwgTlVMTCwgTlVMTH0KKyNlbHNlCisjZGVmaW5lIEpVTVBfTEFCRUxfSU5JVCB7eyAwIH0sIE5VTEx9CisjZW5kaWYKKworc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIHN0YXRpY19icmFuY2goc3RydWN0IGp1bXBfbGFiZWxfa2V5ICprZXkpCit7CisJcmV0dXJuIGFyY2hfc3RhdGljX2JyYW5jaChrZXkpOworfQorCiBleHRlcm4gc3RydWN0IGp1bXBfZW50cnkgX19zdGFydF9fX2p1bXBfdGFibGVbXTsKIGV4dGVybiBzdHJ1Y3QganVtcF9lbnRyeSBfX3N0b3BfX19qdW1wX3RhYmxlW107CiAKQEAgLTIzLDM3ICs0NiwzNyBAQAogZXh0ZXJuIHZvaWQgYXJjaF9qdW1wX2xhYmVsX3RyYW5zZm9ybShzdHJ1Y3QganVtcF9lbnRyeSAqZW50cnksCiAJCQkJIGVudW0ganVtcF9sYWJlbF90eXBlIHR5cGUpOwogZXh0ZXJuIHZvaWQgYXJjaF9qdW1wX2xhYmVsX3RleHRfcG9rZV9lYXJseShqdW1wX2xhYmVsX3QgYWRkcik7Ci1leHRlcm4gdm9pZCBqdW1wX2xhYmVsX3VwZGF0ZSh1bnNpZ25lZCBsb25nIGtleSwgZW51bSBqdW1wX2xhYmVsX3R5cGUgdHlwZSk7Ci1leHRlcm4gdm9pZCBqdW1wX2xhYmVsX2FwcGx5X25vcHMoc3RydWN0IG1vZHVsZSAqbW9kKTsKIGV4dGVybiBpbnQganVtcF9sYWJlbF90ZXh0X3Jlc2VydmVkKHZvaWQgKnN0YXJ0LCB2b2lkICplbmQpOwotCi0jZGVmaW5lIGp1bXBfbGFiZWxfZW5hYmxlKGtleSkgXAotCWp1bXBfbGFiZWxfdXBkYXRlKCh1bnNpZ25lZCBsb25nKWtleSwgSlVNUF9MQUJFTF9FTkFCTEUpOwotCi0jZGVmaW5lIGp1bXBfbGFiZWxfZGlzYWJsZShrZXkpIFwKLQlqdW1wX2xhYmVsX3VwZGF0ZSgodW5zaWduZWQgbG9uZylrZXksIEpVTVBfTEFCRUxfRElTQUJMRSk7CitleHRlcm4gdm9pZCBqdW1wX2xhYmVsX2luYyhzdHJ1Y3QganVtcF9sYWJlbF9rZXkgKmtleSk7CitleHRlcm4gdm9pZCBqdW1wX2xhYmVsX2RlYyhzdHJ1Y3QganVtcF9sYWJlbF9rZXkgKmtleSk7CitleHRlcm4gYm9vbCBqdW1wX2xhYmVsX2VuYWJsZWQoc3RydWN0IGp1bXBfbGFiZWxfa2V5ICprZXkpOworZXh0ZXJuIHZvaWQganVtcF9sYWJlbF9hcHBseV9ub3BzKHN0cnVjdCBtb2R1bGUgKm1vZCk7CiAKICNlbHNlCiAKLSNkZWZpbmUgSlVNUF9MQUJFTChrZXksIGxhYmVsKQkJCVwKLWRvIHsJCQkJCQlcCi0JaWYgKHVubGlrZWx5KCprZXkpKQkJCVwKLQkJZ290byBsYWJlbDsJCQlcCi19IHdoaWxlICgwKQorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIAotI2RlZmluZSBqdW1wX2xhYmVsX2VuYWJsZShjb25kX3ZhcikJXAotZG8gewkJCQkJXAotICAgICAgICooY29uZF92YXIpID0gMTsJCQlcCi19IHdoaWxlICgwKQorI2RlZmluZSBKVU1QX0xBQkVMX0lOSVQge0FUT01JQ19JTklUKDApfQogCi0jZGVmaW5lIGp1bXBfbGFiZWxfZGlzYWJsZShjb25kX3ZhcikJXAotZG8gewkJCQkJXAotICAgICAgICooY29uZF92YXIpID0gMDsJCQlcCi19IHdoaWxlICgwKQorc3RydWN0IGp1bXBfbGFiZWxfa2V5IHsKKwlhdG9taWNfdCBlbmFibGVkOworfTsKIAotc3RhdGljIGlubGluZSBpbnQganVtcF9sYWJlbF9hcHBseV9ub3BzKHN0cnVjdCBtb2R1bGUgKm1vZCkKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBzdGF0aWNfYnJhbmNoKHN0cnVjdCBqdW1wX2xhYmVsX2tleSAqa2V5KQogewotCXJldHVybiAwOworCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgma2V5LT5lbmFibGVkKSkpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGp1bXBfbGFiZWxfaW5jKHN0cnVjdCBqdW1wX2xhYmVsX2tleSAqa2V5KQoreworCWF0b21pY19pbmMoJmtleS0+ZW5hYmxlZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBqdW1wX2xhYmVsX2RlYyhzdHJ1Y3QganVtcF9sYWJlbF9rZXkgKmtleSkKK3sKKwlhdG9taWNfZGVjKCZrZXktPmVuYWJsZWQpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBqdW1wX2xhYmVsX3RleHRfcmVzZXJ2ZWQodm9pZCAqc3RhcnQsIHZvaWQgKmVuZCkKQEAgLTY0LDE2ICs4NywxNiBAQAogc3RhdGljIGlubGluZSB2b2lkIGp1bXBfbGFiZWxfbG9jayh2b2lkKSB7fQogc3RhdGljIGlubGluZSB2b2lkIGp1bXBfbGFiZWxfdW5sb2NrKHZvaWQpIHt9CiAKLSNlbmRpZgorc3RhdGljIGlubGluZSBib29sIGp1bXBfbGFiZWxfZW5hYmxlZChzdHJ1Y3QganVtcF9sYWJlbF9rZXkgKmtleSkKK3sKKwlyZXR1cm4gISFhdG9taWNfcmVhZCgma2V5LT5lbmFibGVkKTsKK30KIAotI2RlZmluZSBDT05EX1NUTVQoa2V5LCBzdG10KQkJCQkJXAotZG8gewkJCQkJCQkJXAotCV9fbGFiZWxfXyBqbF9lbmFibGVkOwkJCQkJXAotCUpVTVBfTEFCRUwoa2V5LCBqbF9lbmFibGVkKTsJCQkJXAotCWlmICgwKSB7CQkJCQkJXAotamxfZW5hYmxlZDoJCQkJCQkJXAotCQlzdG10OwkJCQkJCVwKLQl9CQkJCQkJCVwKLX0gd2hpbGUgKDApCitzdGF0aWMgaW5saW5lIGludCBqdW1wX2xhYmVsX2FwcGx5X25vcHMoc3RydWN0IG1vZHVsZSAqbW9kKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2p1bXBfbGFiZWxfcmVmLmggYi9pbmNsdWRlL2xpbnV4L2p1bXBfbGFiZWxfcmVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZDAxMmEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9qdW1wX2xhYmVsX3JlZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotI2lmbmRlZiBfTElOVVhfSlVNUF9MQUJFTF9SRUZfSAotI2RlZmluZSBfTElOVVhfSlVNUF9MQUJFTF9SRUZfSAotCi0jaW5jbHVkZSA8bGludXgvanVtcF9sYWJlbC5oPgotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLQotI2lmZGVmIEhBVkVfSlVNUF9MQUJFTAotCi1zdGF0aWMgaW5saW5lIHZvaWQganVtcF9sYWJlbF9pbmMoYXRvbWljX3QgKmtleSkKLXsKLQlpZiAoYXRvbWljX2FkZF9yZXR1cm4oMSwga2V5KSA9PSAxKQotCQlqdW1wX2xhYmVsX2VuYWJsZShrZXkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQganVtcF9sYWJlbF9kZWMoYXRvbWljX3QgKmtleSkKLXsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdChrZXkpKQotCQlqdW1wX2xhYmVsX2Rpc2FibGUoa2V5KTsKLX0KLQotI2Vsc2UgLyogIUhBVkVfSlVNUF9MQUJFTCAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQganVtcF9sYWJlbF9pbmMoYXRvbWljX3QgKmtleSkKLXsKLQlhdG9taWNfaW5jKGtleSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBqdW1wX2xhYmVsX2RlYyhhdG9taWNfdCAqa2V5KQotewotCWF0b21pY19kZWMoa2V5KTsKLX0KLQotI3VuZGVmIEpVTVBfTEFCRUwKLSNkZWZpbmUgSlVNUF9MQUJFTChrZXksIGxhYmVsKQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JaWYgKHVubGlrZWx5KF9fYnVpbHRpbl9jaG9vc2VfZXhwcigJCQkJXAotCSAgICAgIF9fYnVpbHRpbl90eXBlc19jb21wYXRpYmxlX3AodHlwZW9mKGtleSksIGF0b21pY190ICopLAlcCi0JICAgICAgYXRvbWljX3JlYWQoKGF0b21pY190ICopKGtleSkpLCAqKGtleSkpKSkJCQlcCi0JCWdvdG8gbGFiZWw7CQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2VuZGlmIC8qIEhBVkVfSlVNUF9MQUJFTCAqLwotCi0jZW5kaWYgLyogX0xJTlVYX0pVTVBfTEFCRUxfUkVGX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2VybmVsLmggYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCmluZGV4IDAwY2VjNGQuLmYzN2JhNzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2VybmVsLmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaApAQCAtMjgzLDYgKzI4Myw3IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIG1lbXBhcnNlKGNvbnN0IGNoYXIgKnB0ciwgY2hhciAqKnJldHB0cik7CiAKIGV4dGVybiBpbnQgY29yZV9rZXJuZWxfdGV4dCh1bnNpZ25lZCBsb25nIGFkZHIpOworZXh0ZXJuIGludCBjb3JlX2tlcm5lbF9kYXRhKHVuc2lnbmVkIGxvbmcgYWRkcik7CiBleHRlcm4gaW50IF9fa2VybmVsX3RleHRfYWRkcmVzcyh1bnNpZ25lZCBsb25nIGFkZHIpOwogZXh0ZXJuIGludCBrZXJuZWxfdGV4dF9hZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkcik7CiBleHRlcm4gaW50IGZ1bmNfcHRyX2lzX2tlcm5lbF90ZXh0KHZvaWQgKnB0cik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ttb2QuaCBiL2luY2x1ZGUvbGludXgva21vZC5oCmluZGV4IDZlZmQ3YTcuLjMxMDIzMTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva21vZC5oCisrKyBiL2luY2x1ZGUvbGludXgva21vZC5oCkBAIC0xMTMsNSArMTEzLDYgQEAKIAogZXh0ZXJuIGludCB1c2VybW9kZWhlbHBlcl9kaXNhYmxlKHZvaWQpOwogZXh0ZXJuIHZvaWQgdXNlcm1vZGVoZWxwZXJfZW5hYmxlKHZvaWQpOworZXh0ZXJuIGJvb2wgdXNlcm1vZGVoZWxwZXJfaXNfZGlzYWJsZWQodm9pZCk7CiAKICNlbmRpZiAvKiBfX0xJTlVYX0tNT0RfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpc3QuaCBiL2luY2x1ZGUvbGludXgvbGlzdC5oCmluZGV4IDNhNTQyNjYuLmNjNmQyYWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGlzdC5oCisrKyBiL2luY2x1ZGUvbGludXgvbGlzdC5oCkBAIC00LDcgKzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvcG9pc29uLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zdC5oPgogCiAvKgogICogU2ltcGxlIGRvdWJseSBsaW5rZWQgbGlzdCBpbXBsZW1lbnRhdGlvbi4KQEAgLTM2NywxOCArMzY3LDE1IEBACiAgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KICAqLwogI2RlZmluZSBsaXN0X2Zvcl9lYWNoKHBvcywgaGVhZCkgXAotCWZvciAocG9zID0gKGhlYWQpLT5uZXh0OyBwcmVmZXRjaChwb3MtPm5leHQpLCBwb3MgIT0gKGhlYWQpOyBcCi0gICAgICAgIAlwb3MgPSBwb3MtPm5leHQpCisJZm9yIChwb3MgPSAoaGVhZCktPm5leHQ7IHBvcyAhPSAoaGVhZCk7IHBvcyA9IHBvcy0+bmV4dCkKIAogLyoqCiAgKiBfX2xpc3RfZm9yX2VhY2gJLQlpdGVyYXRlIG92ZXIgYSBsaXN0CiAgKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCiAgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KICAqCi0gKiBUaGlzIHZhcmlhbnQgZGlmZmVycyBmcm9tIGxpc3RfZm9yX2VhY2goKSBpbiB0aGF0IGl0J3MgdGhlCi0gKiBzaW1wbGVzdCBwb3NzaWJsZSBsaXN0IGl0ZXJhdGlvbiBjb2RlLCBubyBwcmVmZXRjaGluZyBpcyBkb25lLgotICogVXNlIHRoaXMgZm9yIGNvZGUgdGhhdCBrbm93cyB0aGUgbGlzdCB0byBiZSB2ZXJ5IHNob3J0IChlbXB0eQotICogb3IgMSBlbnRyeSkgbW9zdCBvZiB0aGUgdGltZS4KKyAqIFRoaXMgdmFyaWFudCBkb2Vzbid0IGRpZmZlciBmcm9tIGxpc3RfZm9yX2VhY2goKSBhbnkgbW9yZS4KKyAqIFdlIGRvbid0IGRvIHByZWZldGNoaW5nIGluIGVpdGhlciBjYXNlLgogICovCiAjZGVmaW5lIF9fbGlzdF9mb3JfZWFjaChwb3MsIGhlYWQpIFwKIAlmb3IgKHBvcyA9IChoZWFkKS0+bmV4dDsgcG9zICE9IChoZWFkKTsgcG9zID0gcG9zLT5uZXh0KQpAQCAtMzg5LDggKzM4Niw3IEBACiAgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KICAqLwogI2RlZmluZSBsaXN0X2Zvcl9lYWNoX3ByZXYocG9zLCBoZWFkKSBcCi0JZm9yIChwb3MgPSAoaGVhZCktPnByZXY7IHByZWZldGNoKHBvcy0+cHJldiksIHBvcyAhPSAoaGVhZCk7IFwKLSAgICAgICAgCXBvcyA9IHBvcy0+cHJldikKKwlmb3IgKHBvcyA9IChoZWFkKS0+cHJldjsgcG9zICE9IChoZWFkKTsgcG9zID0gcG9zLT5wcmV2KQogCiAvKioKICAqIGxpc3RfZm9yX2VhY2hfc2FmZSAtIGl0ZXJhdGUgb3ZlciBhIGxpc3Qgc2FmZSBhZ2FpbnN0IHJlbW92YWwgb2YgbGlzdCBlbnRyeQpAQCAtNDEwLDcgKzQwNiw3IEBACiAgKi8KICNkZWZpbmUgbGlzdF9mb3JfZWFjaF9wcmV2X3NhZmUocG9zLCBuLCBoZWFkKSBcCiAJZm9yIChwb3MgPSAoaGVhZCktPnByZXYsIG4gPSBwb3MtPnByZXY7IFwKLQkgICAgIHByZWZldGNoKHBvcy0+cHJldiksIHBvcyAhPSAoaGVhZCk7IFwKKwkgICAgIHBvcyAhPSAoaGVhZCk7IFwKIAkgICAgIHBvcyA9IG4sIG4gPSBwb3MtPnByZXYpCiAKIC8qKgpAQCAtNDIxLDcgKzQxNyw3IEBACiAgKi8KICNkZWZpbmUgbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsIGhlYWQsIG1lbWJlcikJCQkJXAogCWZvciAocG9zID0gbGlzdF9lbnRyeSgoaGVhZCktPm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKTsJXAotCSAgICAgcHJlZmV0Y2gocG9zLT5tZW1iZXIubmV4dCksICZwb3MtPm1lbWJlciAhPSAoaGVhZCk7IAlcCisJICAgICAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOyAJXAogCSAgICAgcG9zID0gbGlzdF9lbnRyeShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlcikpCiAKIC8qKgpAQCAtNDMyLDcgKzQyOCw3IEBACiAgKi8KICNkZWZpbmUgbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKHBvcywgaGVhZCwgbWVtYmVyKQkJCVwKIAlmb3IgKHBvcyA9IGxpc3RfZW50cnkoKGhlYWQpLT5wcmV2LCB0eXBlb2YoKnBvcyksIG1lbWJlcik7CVwKLQkgICAgIHByZWZldGNoKHBvcy0+bWVtYmVyLnByZXYpLCAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOyAJXAorCSAgICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsgCVwKIAkgICAgIHBvcyA9IGxpc3RfZW50cnkocG9zLT5tZW1iZXIucHJldiwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpKQogCiAvKioKQEAgLTQ1Nyw3ICs0NTMsNyBAQAogICovCiAjZGVmaW5lIGxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUocG9zLCBoZWFkLCBtZW1iZXIpIAkJXAogCWZvciAocG9zID0gbGlzdF9lbnRyeShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlcik7CVwKLQkgICAgIHByZWZldGNoKHBvcy0+bWVtYmVyLm5leHQpLCAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOwlcCisJICAgICAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOwlcCiAJICAgICBwb3MgPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSkKIAogLyoqCkBAIC00NzEsNyArNDY3LDcgQEAKICAqLwogI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlX3JldmVyc2UocG9zLCBoZWFkLCBtZW1iZXIpCQlcCiAJZm9yIChwb3MgPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLnByZXYsIHR5cGVvZigqcG9zKSwgbWVtYmVyKTsJXAotCSAgICAgcHJlZmV0Y2gocG9zLT5tZW1iZXIucHJldiksICZwb3MtPm1lbWJlciAhPSAoaGVhZCk7CVwKKwkgICAgICZwb3MtPm1lbWJlciAhPSAoaGVhZCk7CVwKIAkgICAgIHBvcyA9IGxpc3RfZW50cnkocG9zLT5tZW1iZXIucHJldiwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpKQogCiAvKioKQEAgLTQ4Myw3ICs0NzksNyBAQAogICogSXRlcmF0ZSBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZSwgY29udGludWluZyBmcm9tIGN1cnJlbnQgcG9zaXRpb24uCiAgKi8KICNkZWZpbmUgbGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tKHBvcywgaGVhZCwgbWVtYmVyKSAJCQlcCi0JZm9yICg7IHByZWZldGNoKHBvcy0+bWVtYmVyLm5leHQpLCAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOwlcCisJZm9yICg7ICZwb3MtPm1lbWJlciAhPSAoaGVhZCk7CVwKIAkgICAgIHBvcyA9IGxpc3RfZW50cnkocG9zLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpKQogCiAvKioKQEAgLTY2NCw4ICs2NjAsNyBAQAogI2RlZmluZSBobGlzdF9lbnRyeShwdHIsIHR5cGUsIG1lbWJlcikgY29udGFpbmVyX29mKHB0cix0eXBlLG1lbWJlcikKIAogI2RlZmluZSBobGlzdF9mb3JfZWFjaChwb3MsIGhlYWQpIFwKLQlmb3IgKHBvcyA9IChoZWFkKS0+Zmlyc3Q7IHBvcyAmJiAoeyBwcmVmZXRjaChwb3MtPm5leHQpOyAxOyB9KTsgXAotCSAgICAgcG9zID0gcG9zLT5uZXh0KQorCWZvciAocG9zID0gKGhlYWQpLT5maXJzdDsgcG9zIDsgcG9zID0gcG9zLT5uZXh0KQogCiAjZGVmaW5lIGhsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuLCBoZWFkKSBcCiAJZm9yIChwb3MgPSAoaGVhZCktPmZpcnN0OyBwb3MgJiYgKHsgbiA9IHBvcy0+bmV4dDsgMTsgfSk7IFwKQEAgLTY4MCw3ICs2NzUsNyBAQAogICovCiAjZGVmaW5lIGhsaXN0X2Zvcl9lYWNoX2VudHJ5KHRwb3MsIHBvcywgaGVhZCwgbWVtYmVyKQkJCSBcCiAJZm9yIChwb3MgPSAoaGVhZCktPmZpcnN0OwkJCQkJIFwKLQkgICAgIHBvcyAmJiAoeyBwcmVmZXRjaChwb3MtPm5leHQpOyAxO30pICYmCQkJIFwKKwkgICAgIHBvcyAmJgkJCQkJCQkgXAogCQkoeyB0cG9zID0gaGxpc3RfZW50cnkocG9zLCB0eXBlb2YoKnRwb3MpLCBtZW1iZXIpOyAxO30pOyBcCiAJICAgICBwb3MgPSBwb3MtPm5leHQpCiAKQEAgLTY5Miw3ICs2ODcsNyBAQAogICovCiAjZGVmaW5lIGhsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlKHRwb3MsIHBvcywgbWVtYmVyKQkJIFwKIAlmb3IgKHBvcyA9IChwb3MpLT5uZXh0OwkJCQkJCSBcCi0JICAgICBwb3MgJiYgKHsgcHJlZmV0Y2gocG9zLT5uZXh0KTsgMTt9KSAmJgkJCSBcCisJICAgICBwb3MgJiYJCQkJCQkJIFwKIAkJKHsgdHBvcyA9IGhsaXN0X2VudHJ5KHBvcywgdHlwZW9mKCp0cG9zKSwgbWVtYmVyKTsgMTt9KTsgXAogCSAgICAgcG9zID0gcG9zLT5uZXh0KQogCkBAIC03MDMsNyArNjk4LDcgQEAKICAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBobGlzdF9ub2RlIHdpdGhpbiB0aGUgc3RydWN0LgogICovCiAjZGVmaW5lIGhsaXN0X2Zvcl9lYWNoX2VudHJ5X2Zyb20odHBvcywgcG9zLCBtZW1iZXIpCQkJIFwKLQlmb3IgKDsgcG9zICYmICh7IHByZWZldGNoKHBvcy0+bmV4dCk7IDE7fSkgJiYJCQkgXAorCWZvciAoOyBwb3MgJiYJCQkJCQkJIFwKIAkJKHsgdHBvcyA9IGhsaXN0X2VudHJ5KHBvcywgdHlwZW9mKCp0cG9zKSwgbWVtYmVyKTsgMTt9KTsgXAogCSAgICAgcG9zID0gcG9zLT5uZXh0KQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oIGIvaW5jbHVkZS9saW51eC9tb2R1bGUuaAppbmRleCA1ZGU0MjA0Li5kOWNhMmQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKQEAgLTY0LDYgKzY0LDkgQEAKIAljb25zdCBjaGFyICp2ZXJzaW9uOwogfSBfX2F0dHJpYnV0ZV9fICgoX19hbGlnbmVkX18oc2l6ZW9mKHZvaWQgKikpKSk7CiAKK2V4dGVybiBzc2l6ZV90IF9fbW9kdmVyX3ZlcnNpb25fc2hvdyhzdHJ1Y3QgbW9kdWxlX2F0dHJpYnV0ZSAqLAorCQkJCSAgICAgc3RydWN0IG1vZHVsZSAqLCBjaGFyICopOworCiBzdHJ1Y3QgbW9kdWxlX2tvYmplY3QKIHsKIAlzdHJ1Y3Qga29iamVjdCBrb2JqOwpAQCAtMTcyLDEyICsxNzUsNyBAQAogI2RlZmluZSBNT0RVTEVfVkVSU0lPTihfdmVyc2lvbikgTU9EVUxFX0lORk8odmVyc2lvbiwgX3ZlcnNpb24pCiAjZWxzZQogI2RlZmluZSBNT0RVTEVfVkVSU0lPTihfdmVyc2lvbikJCQkJCVwKLQlleHRlcm4gc3NpemVfdCBfX21vZHZlcl92ZXJzaW9uX3Nob3coc3RydWN0IG1vZHVsZV9hdHRyaWJ1dGUgKiwJXAotCQkJCQkgICAgIHN0cnVjdCBtb2R1bGUgKiwgY2hhciAqKTsJXAotCXN0YXRpYyBzdHJ1Y3QgbW9kdWxlX3ZlcnNpb25fYXR0cmlidXRlIF9fbW9kdmVyX3ZlcnNpb25fYXR0cglcCi0JX191c2VkCQkJCQkJCQlcCi0gICAgX19hdHRyaWJ1dGVfXyAoKF9fc2VjdGlvbl9fICgiX19tb2R2ZXIiKSxhbGlnbmVkKHNpemVvZih2b2lkICopKSkpIFwKLQk9IHsJCQkJCQkJCVwKKwlzdGF0aWMgc3RydWN0IG1vZHVsZV92ZXJzaW9uX2F0dHJpYnV0ZSBfX19tb2R2ZXJfYXR0ciA9IHsJXAogCQkubWF0dHIJPSB7CQkJCQkJXAogCQkJLmF0dHIJPSB7CQkJCQlcCiAJCQkJLm5hbWUJPSAidmVyc2lvbiIsCQkJXApAQCAtMTg3LDcgKzE4NSwxMCBAQAogCQl9LAkJCQkJCQlcCiAJCS5tb2R1bGVfbmFtZQk9IEtCVUlMRF9NT0ROQU1FLAkJCVwKIAkJLnZlcnNpb24JPSBfdmVyc2lvbiwJCQkJXAotCX0KKwl9OwkJCQkJCQkJXAorCXN0YXRpYyBjb25zdCBzdHJ1Y3QgbW9kdWxlX3ZlcnNpb25fYXR0cmlidXRlCQkJXAorCV9fdXNlZCBfX2F0dHJpYnV0ZV9fICgoX19zZWN0aW9uX18gKCJfX21vZHZlciIpKSkJCVwKKwkqIF9fbW9kdWxlcGFyYW1fY29uc3QgX19tb2R2ZXJfYXR0ciA9ICZfX19tb2R2ZXJfYXR0cgogI2VuZGlmCiAKIC8qIE9wdGlvbmFsIGZpcm13YXJlIGZpbGUgKG9yIGZpbGVzKSBuZWVkZWQgYnkgdGhlIG1vZHVsZQpAQCAtMjIzLDcgKzIyNCw3IEBACiAJZXh0ZXJuIHZvaWQgKl9fY3JjXyMjc3ltIF9fYXR0cmlidXRlX18oKHdlYWspKTsJCVwKIAlzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBfX2tjcmN0YWJfIyNzeW0JCVwKIAlfX3VzZWQJCQkJCQkJXAotCV9fYXR0cmlidXRlX18oKHNlY3Rpb24oIl9fa2NyY3RhYiIgc2VjKSwgdW51c2VkKSkJXAorCV9fYXR0cmlidXRlX18oKHNlY3Rpb24oIl9fX2tjcmN0YWIiIHNlYyAiKyIgI3N5bSksIHVudXNlZCkpCVwKIAk9ICh1bnNpZ25lZCBsb25nKSAmX19jcmNfIyNzeW07CiAjZWxzZQogI2RlZmluZSBfX0NSQ19TWU1CT0woc3ltLCBzZWMpCkBAIC0yMzgsNyArMjM5LDcgQEAKIAk9IE1PRFVMRV9TWU1CT0xfUFJFRklYICNzeW07ICAgICAgICAgICAgICAgICAgICAJXAogCXN0YXRpYyBjb25zdCBzdHJ1Y3Qga2VybmVsX3N5bWJvbCBfX2tzeW10YWJfIyNzeW0JXAogCV9fdXNlZAkJCQkJCQlcCi0JX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiX19rc3ltdGFiIiBzZWMpLCB1bnVzZWQpKQlcCisJX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiX19fa3N5bXRhYiIgc2VjICIrIiAjc3ltKSwgdW51c2VkKSkJXAogCT0geyAodW5zaWduZWQgbG9uZykmc3ltLCBfX2tzdHJ0YWJfIyNzeW0gfQogCiAjZGVmaW5lIEVYUE9SVF9TWU1CT0woc3ltKQkJCQkJXApAQCAtMzY3LDM0ICszNjgsMzUgQEAKIAlzdHJ1Y3QgbW9kdWxlX25vdGVzX2F0dHJzICpub3Rlc19hdHRyczsKICNlbmRpZgogCisJLyogVGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgKG1heSBiZSBtYW5nbGVkKS4gIFBlb3BsZSBsaWtlCisJICAga2VlcGluZyBwb2ludGVycyB0byB0aGlzIHN0dWZmICovCisJY2hhciAqYXJnczsKKwogI2lmZGVmIENPTkZJR19TTVAKIAkvKiBQZXItY3B1IGRhdGEuICovCiAJdm9pZCBfX3BlcmNwdSAqcGVyY3B1OwogCXVuc2lnbmVkIGludCBwZXJjcHVfc2l6ZTsKICNlbmRpZgogCi0JLyogVGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgKG1heSBiZSBtYW5nbGVkKS4gIFBlb3BsZSBsaWtlCi0JICAga2VlcGluZyBwb2ludGVycyB0byB0aGlzIHN0dWZmICovCi0JY2hhciAqYXJnczsKICNpZmRlZiBDT05GSUdfVFJBQ0VQT0lOVFMKLQlzdHJ1Y3QgdHJhY2Vwb2ludCAqIGNvbnN0ICp0cmFjZXBvaW50c19wdHJzOwogCXVuc2lnbmVkIGludCBudW1fdHJhY2Vwb2ludHM7CisJc3RydWN0IHRyYWNlcG9pbnQgKiBjb25zdCAqdHJhY2Vwb2ludHNfcHRyczsKICNlbmRpZgogI2lmZGVmIEhBVkVfSlVNUF9MQUJFTAogCXN0cnVjdCBqdW1wX2VudHJ5ICpqdW1wX2VudHJpZXM7CiAJdW5zaWduZWQgaW50IG51bV9qdW1wX2VudHJpZXM7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfVFJBQ0lORwotCWNvbnN0IGNoYXIgKip0cmFjZV9icHJpbnRrX2ZtdF9zdGFydDsKIAl1bnNpZ25lZCBpbnQgbnVtX3RyYWNlX2JwcmludGtfZm10OworCWNvbnN0IGNoYXIgKip0cmFjZV9icHJpbnRrX2ZtdF9zdGFydDsKICNlbmRpZgogI2lmZGVmIENPTkZJR19FVkVOVF9UUkFDSU5HCiAJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICoqdHJhY2VfZXZlbnRzOwogCXVuc2lnbmVkIGludCBudW1fdHJhY2VfZXZlbnRzOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0ZUUkFDRV9NQ09VTlRfUkVDT1JECi0JdW5zaWduZWQgbG9uZyAqZnRyYWNlX2NhbGxzaXRlczsKIAl1bnNpZ25lZCBpbnQgbnVtX2Z0cmFjZV9jYWxsc2l0ZXM7CisJdW5zaWduZWQgbG9uZyAqZnRyYWNlX2NhbGxzaXRlczsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX01PRFVMRV9VTkxPQUQKQEAgLTQ3NSw4ICs0NzcsOSBAQAogCQkJCQlib29sIHdhcm4pOwogCiAvKiBXYWxrIHRoZSBleHBvcnRlZCBzeW1ib2wgdGFibGUgKi8KLWJvb2wgZWFjaF9zeW1ib2woYm9vbCAoKmZuKShjb25zdCBzdHJ1Y3Qgc3ltc2VhcmNoICphcnIsIHN0cnVjdCBtb2R1bGUgKm93bmVyLAotCQkJICAgIHVuc2lnbmVkIGludCBzeW1udW0sIHZvaWQgKmRhdGEpLCB2b2lkICpkYXRhKTsKK2Jvb2wgZWFjaF9zeW1ib2xfc2VjdGlvbihib29sICgqZm4pKGNvbnN0IHN0cnVjdCBzeW1zZWFyY2ggKmFyciwKKwkJCQkgICAgc3RydWN0IG1vZHVsZSAqb3duZXIsCisJCQkJICAgIHZvaWQgKmRhdGEpLCB2b2lkICpkYXRhKTsKIAogLyogUmV0dXJucyAwIGFuZCBmaWxscyBpbiB2YWx1ZSwgZGVmaW5lZCBhbmQgbmFtZWJ1Ziwgb3IgLUVSQU5HRSBpZgogICAgc3ltbnVtIG91dCBvZiByYW5nZS4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW9kdWxlcGFyYW0uaCBiL2luY2x1ZGUvbGludXgvbW9kdWxlcGFyYW0uaAppbmRleCAwN2I0MTk1Li5kZGFhZTk4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vZHVsZXBhcmFtLmgKKysrIGIvaW5jbHVkZS9saW51eC9tb2R1bGVwYXJhbS5oCkBAIC02Nyw5ICs2Nyw5IEBACiBzdHJ1Y3Qga3BhcmFtX2FycmF5CiB7CiAJdW5zaWduZWQgaW50IG1heDsKKwl1bnNpZ25lZCBpbnQgZWxlbXNpemU7CiAJdW5zaWduZWQgaW50ICpudW07CiAJY29uc3Qgc3RydWN0IGtlcm5lbF9wYXJhbV9vcHMgKm9wczsKLQl1bnNpZ25lZCBpbnQgZWxlbXNpemU7CiAJdm9pZCAqZWxlbTsKIH07CiAKQEAgLTM3MSw4ICszNzEsOSBAQAogICovCiAjZGVmaW5lIG1vZHVsZV9wYXJhbV9hcnJheV9uYW1lZChuYW1lLCBhcnJheSwgdHlwZSwgbnVtcCwgcGVybSkJCVwKIAlzdGF0aWMgY29uc3Qgc3RydWN0IGtwYXJhbV9hcnJheSBfX3BhcmFtX2Fycl8jI25hbWUJCVwKLQk9IHsgQVJSQVlfU0laRShhcnJheSksIG51bXAsICZwYXJhbV9vcHNfIyN0eXBlLAkJCVwKLQkgICAgc2l6ZW9mKGFycmF5WzBdKSwgYXJyYXkgfTsJCQkJCVwKKwk9IHsgLm1heCA9IEFSUkFZX1NJWkUoYXJyYXkpLCAubnVtID0gbnVtcCwgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAub3BzID0gJnBhcmFtX29wc18jI3R5cGUsCQkJCQlcCisJICAgIC5lbGVtc2l6ZSA9IHNpemVvZihhcnJheVswXSksIC5lbGVtID0gYXJyYXkgfTsJCVwKIAlfX21vZHVsZV9wYXJhbV9jYWxsKE1PRFVMRV9QQVJBTV9QUkVGSVgsIG5hbWUsCQkJXAogCQkJICAgICZwYXJhbV9hcnJheV9vcHMsCQkJCVwKIAkJCSAgICAuYXJyID0gJl9fcGFyYW1fYXJyXyMjbmFtZSwJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L211dGV4LmggYi9pbmNsdWRlL2xpbnV4L211dGV4LmgKaW5kZXggOTRiNDhiZC4uYzc1NDcxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tdXRleC5oCisrKyBiL2luY2x1ZGUvbGludXgvbXV0ZXguaApAQCAtNTEsNyArNTEsNyBAQAogCXNwaW5sb2NrX3QJCXdhaXRfbG9jazsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXdhaXRfbGlzdDsKICNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19NVVRFWEVTKSB8fCBkZWZpbmVkKENPTkZJR19TTVApCi0Jc3RydWN0IHRocmVhZF9pbmZvCSpvd25lcjsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKm93bmVyOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0RFQlVHX01VVEVYRVMKIAljb25zdCBjaGFyIAkJKm5hbWU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaS1hdHMuaCBiL2luY2x1ZGUvbGludXgvcGNpLWF0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NTgyNGYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS1hdHMuaApAQCAtMCwwICsxLDUyIEBACisjaWZuZGVmIExJTlVYX1BDSV9BVFNfSAorI2RlZmluZSBMSU5VWF9QQ0lfQVRTX0gKKworLyogQWRkcmVzcyBUcmFuc2xhdGlvbiBTZXJ2aWNlICovCitzdHJ1Y3QgcGNpX2F0cyB7CisJaW50IHBvczsgICAgICAgIC8qIGNhcGFiaWxpdHkgcG9zaXRpb24gKi8KKwlpbnQgc3R1OyAgICAgICAgLyogU21hbGxlc3QgVHJhbnNsYXRpb24gVW5pdCAqLworCWludCBxZGVwOyAgICAgICAvKiBJbnZhbGlkYXRlIFF1ZXVlIERlcHRoICovCisJaW50IHJlZl9jbnQ7ICAgIC8qIFBoeXNpY2FsIEZ1bmN0aW9uIHJlZmVyZW5jZSBjb3VudCAqLworCXVuc2lnbmVkIGludCBpc19lbmFibGVkOjE7ICAgICAgLyogRW5hYmxlIGJpdCBpcyBzZXQgKi8KK307CisKKyNpZmRlZiBDT05GSUdfUENJX0lPVgorCitleHRlcm4gaW50IHBjaV9lbmFibGVfYXRzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwcyk7CitleHRlcm4gdm9pZCBwY2lfZGlzYWJsZV9hdHMoc3RydWN0IHBjaV9kZXYgKmRldik7CitleHRlcm4gaW50IHBjaV9hdHNfcXVldWVfZGVwdGgoc3RydWN0IHBjaV9kZXYgKmRldik7CisvKioKKyAqIHBjaV9hdHNfZW5hYmxlZCAtIHF1ZXJ5IHRoZSBBVFMgc3RhdHVzCisgKiBAZGV2OiB0aGUgUENJIGRldmljZQorICoKKyAqIFJldHVybnMgMSBpZiBBVFMgY2FwYWJpbGl0eSBpcyBlbmFibGVkLCBvciAwIGlmIG5vdC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcGNpX2F0c19lbmFibGVkKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJcmV0dXJuIGRldi0+YXRzICYmIGRldi0+YXRzLT5pc19lbmFibGVkOworfQorCisjZWxzZSAvKiBDT05GSUdfUENJX0lPViAqLworCitzdGF0aWMgaW5saW5lIGludCBwY2lfZW5hYmxlX2F0cyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcHMpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2lfZGlzYWJsZV9hdHMoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQgcGNpX2F0c19xdWV1ZV9kZXB0aChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW5saW5lIGludCBwY2lfYXRzX2VuYWJsZWQoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19QQ0lfSU9WICovCisKKyNlbmRpZiAvKiBMSU5VWF9QQ0lfQVRTX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZXJmX2V2ZW50LmggYi9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaAppbmRleCBlZTlmMWU3Li4zNDEyNjg0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaApAQCAtMiw4ICsyLDggQEAKICAqIFBlcmZvcm1hbmNlIGV2ZW50czoKICAqCiAgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSwgVGhvbWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+Ci0gKiAgICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSwgUmVkIEhhdCwgSW5jLiwgSW5nbyBNb2xuYXIKLSAqICAgIENvcHlyaWdodCAoQykgMjAwOC0yMDA5LCBSZWQgSGF0LCBJbmMuLCBQZXRlciBaaWpsc3RyYQorICogICAgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEsIFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSwgUmVkIEhhdCwgSW5jLiwgUGV0ZXIgWmlqbHN0cmEKICAqCiAgKiBEYXRhIHR5cGUgZGVmaW5pdGlvbnMsIGRlY2xhcmF0aW9ucywgcHJvdG90eXBlcy4KICAqCkBAIC01Miw2ICs1Miw4IEBACiAJUEVSRl9DT1VOVF9IV19CUkFOQ0hfSU5TVFJVQ1RJT05TCT0gNCwKIAlQRVJGX0NPVU5UX0hXX0JSQU5DSF9NSVNTRVMJCT0gNSwKIAlQRVJGX0NPVU5UX0hXX0JVU19DWUNMRVMJCT0gNiwKKwlQRVJGX0NPVU5UX0hXX1NUQUxMRURfQ1lDTEVTX0ZST05URU5ECT0gNywKKwlQRVJGX0NPVU5UX0hXX1NUQUxMRURfQ1lDTEVTX0JBQ0tFTkQJPSA4LAogCiAJUEVSRl9DT1VOVF9IV19NQVgsCQkJLyogbm9uLUFCSSAqLwogfTsKQEAgLTQ2OCw5ICs0NzAsOSBAQAogCVBFUkZfQ09OVEVYVF9NQVgJCT0gKF9fdTY0KS00MDk1LAogfTsKIAotI2RlZmluZSBQRVJGX0ZMQUdfRkRfTk9fR1JPVVAJKDFVIDw8IDApCi0jZGVmaW5lIFBFUkZfRkxBR19GRF9PVVRQVVQJKDFVIDw8IDEpCi0jZGVmaW5lIFBFUkZfRkxBR19QSURfQ0dST1VQCSgxVSA8PCAyKSAvKiBwaWQ9Y2dyb3VwIGlkLCBwZXItY3B1IG1vZGUgb25seSAqLworI2RlZmluZSBQRVJGX0ZMQUdfRkRfTk9fR1JPVVAJCSgxVSA8PCAwKQorI2RlZmluZSBQRVJGX0ZMQUdfRkRfT1VUUFVUCQkoMVUgPDwgMSkKKyNkZWZpbmUgUEVSRl9GTEFHX1BJRF9DR1JPVVAJCSgxVSA8PCAyKSAvKiBwaWQ9Y2dyb3VwIGlkLCBwZXItY3B1IG1vZGUgb25seSAqLwogCiAjaWZkZWYgX19LRVJORUxfXwogLyoKQEAgLTQ4NCw5ICs0ODYsOSBAQAogI2VuZGlmCiAKIHN0cnVjdCBwZXJmX2d1ZXN0X2luZm9fY2FsbGJhY2tzIHsKLQlpbnQgKCppc19pbl9ndWVzdCkgKHZvaWQpOwotCWludCAoKmlzX3VzZXJfbW9kZSkgKHZvaWQpOwotCXVuc2lnbmVkIGxvbmcgKCpnZXRfZ3Vlc3RfaXApICh2b2lkKTsKKwlpbnQJCQkJKCppc19pbl9ndWVzdCkodm9pZCk7CisJaW50CQkJCSgqaXNfdXNlcl9tb2RlKSh2b2lkKTsKKwl1bnNpZ25lZCBsb25nCQkJKCpnZXRfZ3Vlc3RfaXApKHZvaWQpOwogfTsKIAogI2lmZGVmIENPTkZJR19IQVZFX0hXX0JSRUFLUE9JTlQKQEAgLTUwNSw3ICs1MDcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycV93b3JrLmg+Ci0jaW5jbHVkZSA8bGludXgvanVtcF9sYWJlbF9yZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9qdW1wX2xhYmVsLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9sb2NhbC5oPgogCkBAIC02NTIsMTkgKzY1NCwxOSBAQAogCSAqIFN0YXJ0IHRoZSB0cmFuc2FjdGlvbiwgYWZ0ZXIgdGhpcyAtPmFkZCgpIGRvZXNuJ3QgbmVlZCB0bwogCSAqIGRvIHNjaGVkdWxhYmlsaXR5IHRlc3RzLgogCSAqLwotCXZvaWQgKCpzdGFydF90eG4pCShzdHJ1Y3QgcG11ICpwbXUpOyAvKiBvcHRpb25hbCAqLworCXZvaWQgKCpzdGFydF90eG4pCQkoc3RydWN0IHBtdSAqcG11KTsgLyogb3B0aW9uYWwgKi8KIAkvKgogCSAqIElmIC0+c3RhcnRfdHhuKCkgZGlzYWJsZWQgdGhlIC0+YWRkKCkgc2NoZWR1bGFiaWxpdHkgdGVzdAogCSAqIHRoZW4gLT5jb21taXRfdHhuKCkgaXMgcmVxdWlyZWQgdG8gcGVyZm9ybSBvbmUuIE9uIHN1Y2Nlc3MKIAkgKiB0aGUgdHJhbnNhY3Rpb24gaXMgY2xvc2VkLiBPbiBlcnJvciB0aGUgdHJhbnNhY3Rpb24gaXMga2VwdAogCSAqIG9wZW4gdW50aWwgLT5jYW5jZWxfdHhuKCkgaXMgY2FsbGVkLgogCSAqLwotCWludCAgKCpjb21taXRfdHhuKQkoc3RydWN0IHBtdSAqcG11KTsgLyogb3B0aW9uYWwgKi8KKwlpbnQgICgqY29tbWl0X3R4bikJCShzdHJ1Y3QgcG11ICpwbXUpOyAvKiBvcHRpb25hbCAqLwogCS8qCiAJICogV2lsbCBjYW5jZWwgdGhlIHRyYW5zYWN0aW9uLCBhc3N1bWVzIC0+ZGVsKCkgaXMgY2FsbGVkCiAJICogZm9yIGVhY2ggc3VjY2Vzc2Z1bCAtPmFkZCgpIGR1cmluZyB0aGUgdHJhbnNhY3Rpb24uCiAJICovCi0Jdm9pZCAoKmNhbmNlbF90eG4pCShzdHJ1Y3QgcG11ICpwbXUpOyAvKiBvcHRpb25hbCAqLworCXZvaWQgKCpjYW5jZWxfdHhuKQkJKHN0cnVjdCBwbXUgKnBtdSk7IC8qIG9wdGlvbmFsICovCiB9OwogCiAvKioKQEAgLTcxMiwxNSArNzE0LDE1IEBACiAJCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIAogZW51bSBwZXJmX2dyb3VwX2ZsYWcgewotCVBFUkZfR1JPVVBfU09GVFdBUkUgPSAweDEsCisJUEVSRl9HUk9VUF9TT0ZUV0FSRQkJPSAweDEsCiB9OwogCi0jZGVmaW5lIFNXRVZFTlRfSExJU1RfQklUUwk4Ci0jZGVmaW5lIFNXRVZFTlRfSExJU1RfU0laRQkoMSA8PCBTV0VWRU5UX0hMSVNUX0JJVFMpCisjZGVmaW5lIFNXRVZFTlRfSExJU1RfQklUUwkJOAorI2RlZmluZSBTV0VWRU5UX0hMSVNUX1NJWkUJCSgxIDw8IFNXRVZFTlRfSExJU1RfQklUUykKIAogc3RydWN0IHN3ZXZlbnRfaGxpc3QgewotCXN0cnVjdCBobGlzdF9oZWFkCWhlYWRzW1NXRVZFTlRfSExJU1RfU0laRV07Ci0Jc3RydWN0IHJjdV9oZWFkCQlyY3VfaGVhZDsKKwlzdHJ1Y3QgaGxpc3RfaGVhZAkJaGVhZHNbU1dFVkVOVF9ITElTVF9TSVpFXTsKKwlzdHJ1Y3QgcmN1X2hlYWQJCQlyY3VfaGVhZDsKIH07CiAKICNkZWZpbmUgUEVSRl9BVFRBQ0hfQ09OVEVYVAkweDAxCkBAIC03MzMsMTMgKzczNSwxMyBAQAogICogVGhpcyBpcyBhIHBlci1jcHUgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlLgogICovCiBzdHJ1Y3QgcGVyZl9jZ3JvdXBfaW5mbyB7Ci0JdTY0IHRpbWU7Ci0JdTY0IHRpbWVzdGFtcDsKKwl1NjQJCQkJdGltZTsKKwl1NjQJCQkJdGltZXN0YW1wOwogfTsKIAogc3RydWN0IHBlcmZfY2dyb3VwIHsKLQlzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSBjc3M7Ci0Jc3RydWN0IHBlcmZfY2dyb3VwX2luZm8gKmluZm87CS8qIHRpbWluZyBpbmZvLCBvbmUgcGVyIGNwdSAqLworCXN0cnVjdAkJCQljZ3JvdXBfc3Vic3lzX3N0YXRlIGNzczsKKwlzdHJ1Y3QJCQkJcGVyZl9jZ3JvdXBfaW5mbyAqaW5mbzsJLyogdGltaW5nIGluZm8sIG9uZSBwZXIgY3B1ICovCiB9OwogI2VuZGlmCiAKQEAgLTkyMyw3ICs5MjUsNyBAQAogCiAvKgogICogTnVtYmVyIG9mIGNvbnRleHRzIHdoZXJlIGFuIGV2ZW50IGNhbiB0cmlnZ2VyOgotICogCXRhc2ssIHNvZnRpcnEsIGhhcmRpcnEsIG5taS4KKyAqCXRhc2ssIHNvZnRpcnEsIGhhcmRpcnEsIG5taS4KICAqLwogI2RlZmluZSBQRVJGX05SX0NPTlRFWFRTCTQKIApAQCAtMTAwMSw4ICsxMDAzLDcgQEAKIAlzdHJ1Y3QgcGVyZl9yYXdfcmVjb3JkCQkqcmF3OwogfTsKIAotc3RhdGljIGlubGluZQotdm9pZCBwZXJmX3NhbXBsZV9kYXRhX2luaXQoc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgKmRhdGEsIHU2NCBhZGRyKQorc3RhdGljIGlubGluZSB2b2lkIHBlcmZfc2FtcGxlX2RhdGFfaW5pdChzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSAqZGF0YSwgdTY0IGFkZHIpCiB7CiAJZGF0YS0+YWRkciA9IGFkZHI7CiAJZGF0YS0+cmF3ICA9IE5VTEw7CkBAIC0xMDM0LDEzICsxMDM1LDEyIEBACiAJcmV0dXJuIGV2ZW50LT5wbXUtPnRhc2tfY3R4X25yID09IHBlcmZfc3dfY29udGV4dDsKIH0KIAotZXh0ZXJuIGF0b21pY190IHBlcmZfc3dldmVudF9lbmFibGVkW1BFUkZfQ09VTlRfU1dfTUFYXTsKK2V4dGVybiBzdHJ1Y3QganVtcF9sYWJlbF9rZXkgcGVyZl9zd2V2ZW50X2VuYWJsZWRbUEVSRl9DT1VOVF9TV19NQVhdOwogCiBleHRlcm4gdm9pZCBfX3BlcmZfc3dfZXZlbnQodTMyLCB1NjQsIGludCwgc3RydWN0IHB0X3JlZ3MgKiwgdTY0KTsKIAogI2lmbmRlZiBwZXJmX2FyY2hfZmV0Y2hfY2FsbGVyX3JlZ3MKLXN0YXRpYyBpbmxpbmUgdm9pZAotcGVyZl9hcmNoX2ZldGNoX2NhbGxlcl9yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGlwKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBwZXJmX2FyY2hfZmV0Y2hfY2FsbGVyX3JlZ3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgaXApIHsgfQogI2VuZGlmCiAKIC8qCkBAIC0xMDYzLDI2ICsxMDYzLDI0IEBACiB7CiAJc3RydWN0IHB0X3JlZ3MgaG90X3JlZ3M7CiAKLQlKVU1QX0xBQkVMKCZwZXJmX3N3ZXZlbnRfZW5hYmxlZFtldmVudF9pZF0sIGhhdmVfZXZlbnQpOwotCXJldHVybjsKLQotaGF2ZV9ldmVudDoKLQlpZiAoIXJlZ3MpIHsKLQkJcGVyZl9mZXRjaF9jYWxsZXJfcmVncygmaG90X3JlZ3MpOwotCQlyZWdzID0gJmhvdF9yZWdzOworCWlmIChzdGF0aWNfYnJhbmNoKCZwZXJmX3N3ZXZlbnRfZW5hYmxlZFtldmVudF9pZF0pKSB7CisJCWlmICghcmVncykgeworCQkJcGVyZl9mZXRjaF9jYWxsZXJfcmVncygmaG90X3JlZ3MpOworCQkJcmVncyA9ICZob3RfcmVnczsKKwkJfQorCQlfX3BlcmZfc3dfZXZlbnQoZXZlbnRfaWQsIG5yLCBubWksIHJlZ3MsIGFkZHIpOwogCX0KLQlfX3BlcmZfc3dfZXZlbnQoZXZlbnRfaWQsIG5yLCBubWksIHJlZ3MsIGFkZHIpOwogfQogCi1leHRlcm4gYXRvbWljX3QgcGVyZl9zY2hlZF9ldmVudHM7CitleHRlcm4gc3RydWN0IGp1bXBfbGFiZWxfa2V5IHBlcmZfc2NoZWRfZXZlbnRzOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgcGVyZl9ldmVudF90YXNrX3NjaGVkX2luKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKLQlDT05EX1NUTVQoJnBlcmZfc2NoZWRfZXZlbnRzLCBfX3BlcmZfZXZlbnRfdGFza19zY2hlZF9pbih0YXNrKSk7CisJaWYgKHN0YXRpY19icmFuY2goJnBlcmZfc2NoZWRfZXZlbnRzKSkKKwkJX19wZXJmX2V2ZW50X3Rhc2tfc2NoZWRfaW4odGFzayk7CiB9CiAKLXN0YXRpYyBpbmxpbmUKLXZvaWQgcGVyZl9ldmVudF90YXNrX3NjaGVkX291dChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwZXJmX2V2ZW50X3Rhc2tfc2NoZWRfb3V0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0KQogewogCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19DT05URVhUX1NXSVRDSEVTLCAxLCAxLCBOVUxMLCAwKTsKIApAQCAtMTEwMCwxNCArMTA5OCwxMCBAQAogLyogQ2FsbGNoYWlucyAqLwogREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBwZXJmX2NhbGxjaGFpbl9lbnRyeSwgcGVyZl9jYWxsY2hhaW5fZW50cnkpOwogCi1leHRlcm4gdm9pZCBwZXJmX2NhbGxjaGFpbl91c2VyKHN0cnVjdCBwZXJmX2NhbGxjaGFpbl9lbnRyeSAqZW50cnksCi0JCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotZXh0ZXJuIHZvaWQgcGVyZl9jYWxsY2hhaW5fa2VybmVsKHN0cnVjdCBwZXJmX2NhbGxjaGFpbl9lbnRyeSAqZW50cnksCi0JCQkJICBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitleHRlcm4gdm9pZCBwZXJmX2NhbGxjaGFpbl91c2VyKHN0cnVjdCBwZXJmX2NhbGxjaGFpbl9lbnRyeSAqZW50cnksIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2V4dGVybiB2b2lkIHBlcmZfY2FsbGNoYWluX2tlcm5lbChzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkgKmVudHJ5LCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKLQotc3RhdGljIGlubGluZSB2b2lkCi1wZXJmX2NhbGxjaGFpbl9zdG9yZShzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkgKmVudHJ5LCB1NjQgaXApCitzdGF0aWMgaW5saW5lIHZvaWQgcGVyZl9jYWxsY2hhaW5fc3RvcmUoc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5ICplbnRyeSwgdTY0IGlwKQogewogCWlmIChlbnRyeS0+bnIgPCBQRVJGX01BWF9TVEFDS19ERVBUSCkKIAkJZW50cnktPmlwW2VudHJ5LT5ucisrXSA9IGlwOwpAQCAtMTE0Myw5ICsxMTM3LDkgQEAKIGV4dGVybiB2b2lkIHBlcmZfYnBfZXZlbnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCB2b2lkICpkYXRhKTsKIAogI2lmbmRlZiBwZXJmX21pc2NfZmxhZ3MKLSNkZWZpbmUgcGVyZl9taXNjX2ZsYWdzKHJlZ3MpCSh1c2VyX21vZGUocmVncykgPyBQRVJGX1JFQ09SRF9NSVNDX1VTRVIgOiBcCi0JCQkJIFBFUkZfUkVDT1JEX01JU0NfS0VSTkVMKQotI2RlZmluZSBwZXJmX2luc3RydWN0aW9uX3BvaW50ZXIocmVncykJaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKQorIyBkZWZpbmUgcGVyZl9taXNjX2ZsYWdzKHJlZ3MpIFwKKwkJKHVzZXJfbW9kZShyZWdzKSA/IFBFUkZfUkVDT1JEX01JU0NfVVNFUiA6IFBFUkZfUkVDT1JEX01JU0NfS0VSTkVMKQorIyBkZWZpbmUgcGVyZl9pbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpCWluc3RydWN0aW9uX3BvaW50ZXIocmVncykKICNlbmRpZgogCiBleHRlcm4gaW50IHBlcmZfb3V0cHV0X2JlZ2luKHN0cnVjdCBwZXJmX291dHB1dF9oYW5kbGUgKmhhbmRsZSwKQEAgLTExODAsOSArMTE3NCw5IEBACiBwZXJmX2JwX2V2ZW50KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgdm9pZCAqZGF0YSkJCQl7IH0KIAogc3RhdGljIGlubGluZSBpbnQgcGVyZl9yZWdpc3Rlcl9ndWVzdF9pbmZvX2NhbGxiYWNrcwotKHN0cnVjdCBwZXJmX2d1ZXN0X2luZm9fY2FsbGJhY2tzICpjYWxsYmFja3MpIHsgcmV0dXJuIDA7IH0KKyhzdHJ1Y3QgcGVyZl9ndWVzdF9pbmZvX2NhbGxiYWNrcyAqY2FsbGJhY2tzKQkJCQl7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIGludCBwZXJmX3VucmVnaXN0ZXJfZ3Vlc3RfaW5mb19jYWxsYmFja3MKLShzdHJ1Y3QgcGVyZl9ndWVzdF9pbmZvX2NhbGxiYWNrcyAqY2FsbGJhY2tzKSB7IHJldHVybiAwOyB9Cisoc3RydWN0IHBlcmZfZ3Vlc3RfaW5mb19jYWxsYmFja3MgKmNhbGxiYWNrcykJCQkJeyByZXR1cm4gMDsgfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcGVyZl9ldmVudF9tbWFwKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQkJeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgcGVyZl9ldmVudF9jb21tKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQkJeyB9CkBAIC0xMTk1LDIzICsxMTg5LDIyIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgcGVyZl9ldmVudF90YXNrX3RpY2sodm9pZCkJCQkJeyB9CiAjZW5kaWYKIAotI2RlZmluZSBwZXJmX291dHB1dF9wdXQoaGFuZGxlLCB4KSBcCi0JcGVyZl9vdXRwdXRfY29weSgoaGFuZGxlKSwgJih4KSwgc2l6ZW9mKHgpKQorI2RlZmluZSBwZXJmX291dHB1dF9wdXQoaGFuZGxlLCB4KSBwZXJmX291dHB1dF9jb3B5KChoYW5kbGUpLCAmKHgpLCBzaXplb2YoeCkpCiAKIC8qCiAgKiBUaGlzIGhhcyB0byBoYXZlIGEgaGlnaGVyIHByaW9yaXR5IHRoYW4gbWlncmF0aW9uX25vdGlmaWVyIGluIHNjaGVkLmMuCiAgKi8KLSNkZWZpbmUgcGVyZl9jcHVfbm90aWZpZXIoZm4pCQkJCQlcCi1kbyB7CQkJCQkJCQlcCi0Jc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBmbiMjX25iIF9fY3B1aW5pdGRhdGEgPQlcCi0JCXsgLm5vdGlmaWVyX2NhbGwgPSBmbiwgLnByaW9yaXR5ID0gQ1BVX1BSSV9QRVJGIH07IFwKLQlmbigmZm4jI19uYiwgKHVuc2lnbmVkIGxvbmcpQ1BVX1VQX1BSRVBBUkUsCQlcCi0JCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpc21wX3Byb2Nlc3Nvcl9pZCgpKTsJXAotCWZuKCZmbiMjX25iLCAodW5zaWduZWQgbG9uZylDUFVfU1RBUlRJTkcsCQlcCi0JCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpc21wX3Byb2Nlc3Nvcl9pZCgpKTsJXAotCWZuKCZmbiMjX25iLCAodW5zaWduZWQgbG9uZylDUFVfT05MSU5FLAkJCVwKLQkJKHZvaWQgKikodW5zaWduZWQgbG9uZylzbXBfcHJvY2Vzc29yX2lkKCkpOwlcCi0JcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZmbiMjX25iKTsJCQlcCisjZGVmaW5lIHBlcmZfY3B1X25vdGlmaWVyKGZuKQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBmbiMjX25iIF9fY3B1aW5pdGRhdGEgPQkJXAorCQl7IC5ub3RpZmllcl9jYWxsID0gZm4sIC5wcmlvcml0eSA9IENQVV9QUklfUEVSRiB9OwlcCisJZm4oJmZuIyNfbmIsICh1bnNpZ25lZCBsb25nKUNQVV9VUF9QUkVQQVJFLAkJCVwKKwkJKHZvaWQgKikodW5zaWduZWQgbG9uZylzbXBfcHJvY2Vzc29yX2lkKCkpOwkJXAorCWZuKCZmbiMjX25iLCAodW5zaWduZWQgbG9uZylDUFVfU1RBUlRJTkcsCQkJXAorCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKXNtcF9wcm9jZXNzb3JfaWQoKSk7CQlcCisJZm4oJmZuIyNfbmIsICh1bnNpZ25lZCBsb25nKUNQVV9PTkxJTkUsCQkJCVwKKwkJKHZvaWQgKikodW5zaWduZWQgbG9uZylzbXBfcHJvY2Vzc29yX2lkKCkpOwkJXAorCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmZm4jI19uYik7CQkJCVwKIH0gd2hpbGUgKDApCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kZXZpY2UuaAppbmRleCA3NDQ5NDJjLi5lZGUxYTgwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGV2aWNlLmgKQEAgLTE1MCw5ICsxNTAsNiBAQAogCQkJCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgdW5zaWduZWQgaW50IG5fcmVzLAogCQkJCQljb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyAqIHBsYXRmb3JtX2J1c19nZXRfcG1fb3BzKHZvaWQpOwotZXh0ZXJuIHZvaWQgcGxhdGZvcm1fYnVzX3NldF9wbV9vcHMoY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgKnBtKTsKLQogLyogZWFybHkgcGxhdGZvcm0gZHJpdmVyIGludGVyZmFjZSAqLwogc3RydWN0IGVhcmx5X3BsYXRmb3JtX2RyaXZlciB7CiAJY29uc3QgY2hhciAqY2xhc3Nfc3RyOwpAQCAtMjA1LDQgKzIwMiw2NCBAQAogfQogI2VuZGlmIC8qIE1PRFVMRSAqLwogCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitleHRlcm4gaW50IHBsYXRmb3JtX3BtX3ByZXBhcmUoc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIHBsYXRmb3JtX3BtX2NvbXBsZXRlKHN0cnVjdCBkZXZpY2UgKmRldik7CisjZWxzZQorI2RlZmluZSBwbGF0Zm9ybV9wbV9wcmVwYXJlCU5VTEwKKyNkZWZpbmUgcGxhdGZvcm1fcG1fY29tcGxldGUJTlVMTAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU1VTUEVORAorZXh0ZXJuIGludCBwbGF0Zm9ybV9wbV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gaW50IHBsYXRmb3JtX3BtX3N1c3BlbmRfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgcGxhdGZvcm1fcG1fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gaW50IHBsYXRmb3JtX3BtX3Jlc3VtZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpOworI2Vsc2UKKyNkZWZpbmUgcGxhdGZvcm1fcG1fc3VzcGVuZAkJTlVMTAorI2RlZmluZSBwbGF0Zm9ybV9wbV9yZXN1bWUJCU5VTEwKKyNkZWZpbmUgcGxhdGZvcm1fcG1fc3VzcGVuZF9ub2lycQlOVUxMCisjZGVmaW5lIHBsYXRmb3JtX3BtX3Jlc3VtZV9ub2lycQlOVUxMCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19ISUJFUk5BVEVfQ0FMTEJBQ0tTCitleHRlcm4gaW50IHBsYXRmb3JtX3BtX2ZyZWV6ZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBwbGF0Zm9ybV9wbV9mcmVlemVfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgcGxhdGZvcm1fcG1fdGhhdyhzdHJ1Y3QgZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBwbGF0Zm9ybV9wbV90aGF3X25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gaW50IHBsYXRmb3JtX3BtX3Bvd2Vyb2ZmKHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gaW50IHBsYXRmb3JtX3BtX3Bvd2Vyb2ZmX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gaW50IHBsYXRmb3JtX3BtX3Jlc3RvcmUoc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgcGxhdGZvcm1fcG1fcmVzdG9yZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpOworI2Vsc2UKKyNkZWZpbmUgcGxhdGZvcm1fcG1fZnJlZXplCQlOVUxMCisjZGVmaW5lIHBsYXRmb3JtX3BtX3RoYXcJCU5VTEwKKyNkZWZpbmUgcGxhdGZvcm1fcG1fcG93ZXJvZmYJCU5VTEwKKyNkZWZpbmUgcGxhdGZvcm1fcG1fcmVzdG9yZQkJTlVMTAorI2RlZmluZSBwbGF0Zm9ybV9wbV9mcmVlemVfbm9pcnEJTlVMTAorI2RlZmluZSBwbGF0Zm9ybV9wbV90aGF3X25vaXJxCQlOVUxMCisjZGVmaW5lIHBsYXRmb3JtX3BtX3Bvd2Vyb2ZmX25vaXJxCU5VTEwKKyNkZWZpbmUgcGxhdGZvcm1fcG1fcmVzdG9yZV9ub2lycQlOVUxMCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorI2RlZmluZSBVU0VfUExBVEZPUk1fUE1fU0xFRVBfT1BTIFwKKwkucHJlcGFyZSA9IHBsYXRmb3JtX3BtX3ByZXBhcmUsIFwKKwkuY29tcGxldGUgPSBwbGF0Zm9ybV9wbV9jb21wbGV0ZSwgXAorCS5zdXNwZW5kID0gcGxhdGZvcm1fcG1fc3VzcGVuZCwgXAorCS5yZXN1bWUgPSBwbGF0Zm9ybV9wbV9yZXN1bWUsIFwKKwkuZnJlZXplID0gcGxhdGZvcm1fcG1fZnJlZXplLCBcCisJLnRoYXcgPSBwbGF0Zm9ybV9wbV90aGF3LCBcCisJLnBvd2Vyb2ZmID0gcGxhdGZvcm1fcG1fcG93ZXJvZmYsIFwKKwkucmVzdG9yZSA9IHBsYXRmb3JtX3BtX3Jlc3RvcmUsIFwKKwkuc3VzcGVuZF9ub2lycSA9IHBsYXRmb3JtX3BtX3N1c3BlbmRfbm9pcnEsIFwKKwkucmVzdW1lX25vaXJxID0gcGxhdGZvcm1fcG1fcmVzdW1lX25vaXJxLCBcCisJLmZyZWV6ZV9ub2lycSA9IHBsYXRmb3JtX3BtX2ZyZWV6ZV9ub2lycSwgXAorCS50aGF3X25vaXJxID0gcGxhdGZvcm1fcG1fdGhhd19ub2lycSwgXAorCS5wb3dlcm9mZl9ub2lycSA9IHBsYXRmb3JtX3BtX3Bvd2Vyb2ZmX25vaXJxLCBcCisJLnJlc3RvcmVfbm9pcnEgPSBwbGF0Zm9ybV9wbV9yZXN0b3JlX25vaXJxLAorI2Vsc2UKKyNkZWZpbmUgVVNFX1BMQVRGT1JNX1BNX1NMRUVQX09QUworI2VuZGlmCisKICNlbmRpZiAvKiBfUExBVEZPUk1fREVWSUNFX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BtLmggYi9pbmNsdWRlL2xpbnV4L3BtLmgKaW5kZXggNTEyZTA5MS4uMzE2MDY0OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG0uaApAQCAtNDYwLDYgKzQ2MCw3IEBACiAJdW5zaWduZWQgbG9uZwkJYWN0aXZlX2ppZmZpZXM7CiAJdW5zaWduZWQgbG9uZwkJc3VzcGVuZGVkX2ppZmZpZXM7CiAJdW5zaWduZWQgbG9uZwkJYWNjb3VudGluZ190aW1lc3RhbXA7CisJdm9pZAkJCSpzdWJzeXNfZGF0YTsgIC8qIE93bmVkIGJ5IHRoZSBzdWJzeXN0ZW0uICovCiAjZW5kaWYKIH07CiAKQEAgLTUyOSwyMSArNTMwLDE3IEBACiAgKi8KIAogI2lmZGVmIENPTkZJR19QTV9TTEVFUAotI2lmbmRlZiBDT05GSUdfQVJDSF9OT19TWVNERVZfT1BTCi1leHRlcm4gaW50IHN5c2Rldl9zdXNwZW5kKHBtX21lc3NhZ2VfdCBzdGF0ZSk7Ci1leHRlcm4gaW50IHN5c2Rldl9yZXN1bWUodm9pZCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBpbnQgc3lzZGV2X3N1c3BlbmQocG1fbWVzc2FnZV90IHN0YXRlKSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIGludCBzeXNkZXZfcmVzdW1lKHZvaWQpIHsgcmV0dXJuIDA7IH0KLSNlbmRpZgotCiBleHRlcm4gdm9pZCBkZXZpY2VfcG1fbG9jayh2b2lkKTsKIGV4dGVybiB2b2lkIGRwbV9yZXN1bWVfbm9pcnEocG1fbWVzc2FnZV90IHN0YXRlKTsKIGV4dGVybiB2b2lkIGRwbV9yZXN1bWVfZW5kKHBtX21lc3NhZ2VfdCBzdGF0ZSk7CitleHRlcm4gdm9pZCBkcG1fcmVzdW1lKHBtX21lc3NhZ2VfdCBzdGF0ZSk7CitleHRlcm4gdm9pZCBkcG1fY29tcGxldGUocG1fbWVzc2FnZV90IHN0YXRlKTsKIAogZXh0ZXJuIHZvaWQgZGV2aWNlX3BtX3VubG9jayh2b2lkKTsKIGV4dGVybiBpbnQgZHBtX3N1c3BlbmRfbm9pcnEocG1fbWVzc2FnZV90IHN0YXRlKTsKIGV4dGVybiBpbnQgZHBtX3N1c3BlbmRfc3RhcnQocG1fbWVzc2FnZV90IHN0YXRlKTsKK2V4dGVybiBpbnQgZHBtX3N1c3BlbmQocG1fbWVzc2FnZV90IHN0YXRlKTsKK2V4dGVybiBpbnQgZHBtX3ByZXBhcmUocG1fbWVzc2FnZV90IHN0YXRlKTsKIAogZXh0ZXJuIHZvaWQgX19zdXNwZW5kX3JlcG9ydF9yZXN1bHQoY29uc3QgY2hhciAqZnVuY3Rpb24sIHZvaWQgKmZuLCBpbnQgcmV0KTsKIApAQCAtNTUzLDYgKzU1MCwxNiBAQAogCX0gd2hpbGUgKDApCiAKIGV4dGVybiBpbnQgZGV2aWNlX3BtX3dhaXRfZm9yX2RldihzdHJ1Y3QgZGV2aWNlICpzdWIsIHN0cnVjdCBkZXZpY2UgKmRldik7CisKK2V4dGVybiBpbnQgcG1fZ2VuZXJpY19wcmVwYXJlKHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gaW50IHBtX2dlbmVyaWNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBwbV9nZW5lcmljX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBwbV9nZW5lcmljX2ZyZWV6ZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBwbV9nZW5lcmljX3RoYXcoc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgcG1fZ2VuZXJpY19yZXN0b3JlKHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gaW50IHBtX2dlbmVyaWNfcG93ZXJvZmYoc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIHBtX2dlbmVyaWNfY29tcGxldGUoc3RydWN0IGRldmljZSAqZGV2KTsKKwogI2Vsc2UgLyogIUNPTkZJR19QTV9TTEVFUCAqLwogCiAjZGVmaW5lIGRldmljZV9wbV9sb2NrKCkgZG8ge30gd2hpbGUgKDApCkBAIC01NjksNiArNTc2LDE1IEBACiB7CiAJcmV0dXJuIDA7CiB9CisKKyNkZWZpbmUgcG1fZ2VuZXJpY19wcmVwYXJlCU5VTEwKKyNkZWZpbmUgcG1fZ2VuZXJpY19zdXNwZW5kCU5VTEwKKyNkZWZpbmUgcG1fZ2VuZXJpY19yZXN1bWUJTlVMTAorI2RlZmluZSBwbV9nZW5lcmljX2ZyZWV6ZQlOVUxMCisjZGVmaW5lIHBtX2dlbmVyaWNfdGhhdwkJTlVMTAorI2RlZmluZSBwbV9nZW5lcmljX3Jlc3RvcmUJTlVMTAorI2RlZmluZSBwbV9nZW5lcmljX3Bvd2Vyb2ZmCU5VTEwKKyNkZWZpbmUgcG1fZ2VuZXJpY19jb21wbGV0ZQlOVUxMCiAjZW5kaWYgLyogIUNPTkZJR19QTV9TTEVFUCAqLwogCiAvKiBIb3cgdG8gcmVvcmRlciBkcG1fbGlzdCBhZnRlciBkZXZpY2VfbW92ZSgpICovCkBAIC01NzksMTEgKzU5NSw0IEBACiAJRFBNX09SREVSX0RFVl9MQVNULAogfTsKIAotZXh0ZXJuIGludCBwbV9nZW5lcmljX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KTsKLWV4dGVybiBpbnQgcG1fZ2VuZXJpY19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KTsKLWV4dGVybiBpbnQgcG1fZ2VuZXJpY19mcmVlemUoc3RydWN0IGRldmljZSAqZGV2KTsKLWV4dGVybiBpbnQgcG1fZ2VuZXJpY190aGF3KHN0cnVjdCBkZXZpY2UgKmRldik7Ci1leHRlcm4gaW50IHBtX2dlbmVyaWNfcmVzdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotZXh0ZXJuIGludCBwbV9nZW5lcmljX3Bvd2Vyb2ZmKHN0cnVjdCBkZXZpY2UgKmRldik7Ci0KICNlbmRpZiAvKiBfTElOVVhfUE1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbV9ydW50aW1lLmggYi9pbmNsdWRlL2xpbnV4L3BtX3J1bnRpbWUuaAppbmRleCA4ZGU5YWE2Li44NzhjZjg0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BtX3J1bnRpbWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BtX3J1bnRpbWUuaApAQCAtMjQ1LDQgKzI0NSw0NiBAQAogCV9fcG1fcnVudGltZV91c2VfYXV0b3N1c3BlbmQoZGV2LCBmYWxzZSk7CiB9CiAKK3N0cnVjdCBwbV9jbGtfbm90aWZpZXJfYmxvY2sgeworCXN0cnVjdCBub3RpZmllcl9ibG9jayBuYjsKKwlzdHJ1Y3QgZGV2X3Bvd2VyX2RvbWFpbiAqcHdyX2RvbWFpbjsKKwljaGFyICpjb25faWRzW107Cit9OworCisjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUVfQ0xLCitleHRlcm4gaW50IHBtX3J1bnRpbWVfY2xrX2luaXQoc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIHBtX3J1bnRpbWVfY2xrX2Rlc3Ryb3koc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgcG1fcnVudGltZV9jbGtfYWRkKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqY29uX2lkKTsKK2V4dGVybiB2b2lkIHBtX3J1bnRpbWVfY2xrX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmNvbl9pZCk7CitleHRlcm4gaW50IHBtX3J1bnRpbWVfY2xrX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgcG1fcnVudGltZV9jbGtfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldik7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgcG1fcnVudGltZV9jbGtfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgcG1fcnVudGltZV9jbGtfZGVzdHJveShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7Cit9CitzdGF0aWMgaW5saW5lIGludCBwbV9ydW50aW1lX2Nsa19hZGQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpjb25faWQpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgcG1fcnVudGltZV9jbGtfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqY29uX2lkKQoreworfQorI2RlZmluZSBwbV9ydW50aW1lX2Nsb2NrX3N1c3BlbmQJTlVMTAorI2RlZmluZSBwbV9ydW50aW1lX2Nsb2NrX3Jlc3VtZQkJTlVMTAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfSEFWRV9DTEsKK2V4dGVybiB2b2lkIHBtX3J1bnRpbWVfY2xrX2FkZF9ub3RpZmllcihzdHJ1Y3QgYnVzX3R5cGUgKmJ1cywKKwkJCQkJc3RydWN0IHBtX2Nsa19ub3RpZmllcl9ibG9jayAqY2xrbmIpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbV9ydW50aW1lX2Nsa19hZGRfbm90aWZpZXIoc3RydWN0IGJ1c190eXBlICpidXMsCisJCQkJCXN0cnVjdCBwbV9jbGtfbm90aWZpZXJfYmxvY2sgKmNsa25iKQoreworfQorI2VuZGlmCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wb3NpeC10aW1lcnMuaCBiL2luY2x1ZGUvbGludXgvcG9zaXgtdGltZXJzLmgKaW5kZXggZDUxMjQzYS4uODA4MjI3ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wb3NpeC10aW1lcnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Bvc2l4LXRpbWVycy5oCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CisjaW5jbHVkZSA8bGludXgvYWxhcm10aW1lci5oPgogCiB1bmlvbiBjcHVfdGltZV9jb3VudCB7CiAJY3B1dGltZV90IGNwdTsKQEAgLTgwLDYgKzgxLDcgQEAKIAkJCXVuc2lnbmVkIGxvbmcgaW5jcjsKIAkJCXVuc2lnbmVkIGxvbmcgZXhwaXJlczsKIAkJfSBtbXRpbWVyOworCQlzdHJ1Y3QgYWxhcm0gYWxhcm10aW1lcjsKIAl9IGl0OwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYnRyZWUuaCBiL2luY2x1ZGUvbGludXgvcmJ0cmVlLmgKaW5kZXggNzA2NmFjYi4uMDMzYjUwNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYnRyZWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JidHJlZS5oCkBAIC0xMzYsNiArMTM2LDE0IEBACiAjZGVmaW5lIFJCX0VNUFRZX05PREUobm9kZSkJKHJiX3BhcmVudChub2RlKSA9PSBub2RlKQogI2RlZmluZSBSQl9DTEVBUl9OT0RFKG5vZGUpCShyYl9zZXRfcGFyZW50KG5vZGUsIG5vZGUpKQogCitzdGF0aWMgaW5saW5lIHZvaWQgcmJfaW5pdF9ub2RlKHN0cnVjdCByYl9ub2RlICpyYikKK3sKKwlyYi0+cmJfcGFyZW50X2NvbG9yID0gMDsKKwlyYi0+cmJfcmlnaHQgPSBOVUxMOworCXJiLT5yYl9sZWZ0ID0gTlVMTDsKKwlSQl9DTEVBUl9OT0RFKHJiKTsKK30KKwogZXh0ZXJuIHZvaWQgcmJfaW5zZXJ0X2NvbG9yKHN0cnVjdCByYl9ub2RlICosIHN0cnVjdCByYl9yb290ICopOwogZXh0ZXJuIHZvaWQgcmJfZXJhc2Uoc3RydWN0IHJiX25vZGUgKiwgc3RydWN0IHJiX3Jvb3QgKik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmN1bGlzdC5oIGIvaW5jbHVkZS9saW51eC9yY3VsaXN0LmgKaW5kZXggMmRlYTk0Zi4uZTNiZWIzMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yY3VsaXN0LmgKKysrIGIvaW5jbHVkZS9saW51eC9yY3VsaXN0LmgKQEAgLTI1Myw3ICsyNTMsNyBAQAogICovCiAjZGVmaW5lIGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHBvcywgaGVhZCwgbWVtYmVyKSBcCiAJZm9yIChwb3MgPSBsaXN0X2VudHJ5X3JjdSgoaGVhZCktPm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKTsgXAotCQlwcmVmZXRjaChwb3MtPm1lbWJlci5uZXh0KSwgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsgXAorCQkmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOyBcCiAJCXBvcyA9IGxpc3RfZW50cnlfcmN1KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSkKIAogCkBAIC0yNzAsNyArMjcwLDcgQEAKICAqLwogI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2NvbnRpbnVlX3JjdShwb3MsIGhlYWQpIFwKIAlmb3IgKChwb3MpID0gcmN1X2RlcmVmZXJlbmNlX3JhdyhsaXN0X25leHRfcmN1KHBvcykpOyBcCi0JCXByZWZldGNoKChwb3MpLT5uZXh0KSwgKHBvcykgIT0gKGhlYWQpOyBcCisJCShwb3MpICE9IChoZWFkKTsgXAogCQkocG9zKSA9IHJjdV9kZXJlZmVyZW5jZV9yYXcobGlzdF9uZXh0X3JjdShwb3MpKSkKIAogLyoqCkBAIC0yODQsNyArMjg0LDcgQEAKICAqLwogI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlX3JjdShwb3MsIGhlYWQsIG1lbWJlcikgCQlcCiAJZm9yIChwb3MgPSBsaXN0X2VudHJ5X3JjdShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlcik7IFwKLQkgICAgIHByZWZldGNoKHBvcy0+bWVtYmVyLm5leHQpLCAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOwlcCisJICAgICAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOwlcCiAJICAgICBwb3MgPSBsaXN0X2VudHJ5X3JjdShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlcikpCiAKIC8qKgpAQCAtNDI3LDcgKzQyNyw3IEBACiAKICNkZWZpbmUgX19obGlzdF9mb3JfZWFjaF9yY3UocG9zLCBoZWFkKQkJCQlcCiAJZm9yIChwb3MgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfZmlyc3RfcmN1KGhlYWQpKTsJXAotCSAgICAgcG9zICYmICh7IHByZWZldGNoKHBvcy0+bmV4dCk7IDE7IH0pOwkJXAorCSAgICAgcG9zOwkJCQkJCVwKIAkgICAgIHBvcyA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9uZXh0X3JjdShwb3MpKSkKIAogLyoqCkBAIC00NDMsNyArNDQzLDcgQEAKICAqLwogI2RlZmluZSBobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UodHBvcywgcG9zLCBoZWFkLCBtZW1iZXIpCQlcCiAJZm9yIChwb3MgPSByY3VfZGVyZWZlcmVuY2VfcmF3KGhsaXN0X2ZpcnN0X3JjdShoZWFkKSk7CQlcCi0JCXBvcyAmJiAoeyBwcmVmZXRjaChwb3MtPm5leHQpOyAxOyB9KSAmJgkJCSBcCisJCXBvcyAmJgkJCQkJCQkgXAogCQkoeyB0cG9zID0gaGxpc3RfZW50cnkocG9zLCB0eXBlb2YoKnRwb3MpLCBtZW1iZXIpOyAxOyB9KTsgXAogCQlwb3MgPSByY3VfZGVyZWZlcmVuY2VfcmF3KGhsaXN0X25leHRfcmN1KHBvcykpKQogCkBAIC00NjAsNyArNDYwLDcgQEAKICAqLwogI2RlZmluZSBobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3VfYmgodHBvcywgcG9zLCBoZWFkLCBtZW1iZXIpCQkgXAogCWZvciAocG9zID0gcmN1X2RlcmVmZXJlbmNlX2JoKChoZWFkKS0+Zmlyc3QpOwkJCSBcCi0JCXBvcyAmJiAoeyBwcmVmZXRjaChwb3MtPm5leHQpOyAxOyB9KSAmJgkJCSBcCisJCXBvcyAmJgkJCQkJCQkgXAogCQkoeyB0cG9zID0gaGxpc3RfZW50cnkocG9zLCB0eXBlb2YoKnRwb3MpLCBtZW1iZXIpOyAxOyB9KTsgXAogCQlwb3MgPSByY3VfZGVyZWZlcmVuY2VfYmgocG9zLT5uZXh0KSkKIApAQCAtNDcyLDcgKzQ3Miw3IEBACiAgKi8KICNkZWZpbmUgaGxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWVfcmN1KHRwb3MsIHBvcywgbWVtYmVyKQkJXAogCWZvciAocG9zID0gcmN1X2RlcmVmZXJlbmNlKChwb3MpLT5uZXh0KTsJCQlcCi0JICAgICBwb3MgJiYgKHsgcHJlZmV0Y2gocG9zLT5uZXh0KTsgMTsgfSkgJiYJCQlcCisJICAgICBwb3MgJiYJCQkJCQkJXAogCSAgICAgKHsgdHBvcyA9IGhsaXN0X2VudHJ5KHBvcywgdHlwZW9mKCp0cG9zKSwgbWVtYmVyKTsgMTsgfSk7ICBcCiAJICAgICBwb3MgPSByY3VfZGVyZWZlcmVuY2UocG9zLT5uZXh0KSkKIApAQCAtNDg0LDcgKzQ4NCw3IEBACiAgKi8KICNkZWZpbmUgaGxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWVfcmN1X2JoKHRwb3MsIHBvcywgbWVtYmVyKQkJXAogCWZvciAocG9zID0gcmN1X2RlcmVmZXJlbmNlX2JoKChwb3MpLT5uZXh0KTsJCQlcCi0JICAgICBwb3MgJiYgKHsgcHJlZmV0Y2gocG9zLT5uZXh0KTsgMTsgfSkgJiYJCQlcCisJICAgICBwb3MgJiYJCQkJCQkJXAogCSAgICAgKHsgdHBvcyA9IGhsaXN0X2VudHJ5KHBvcywgdHlwZW9mKCp0cG9zKSwgbWVtYmVyKTsgMTsgfSk7ICBcCiAJICAgICBwb3MgPSByY3VfZGVyZWZlcmVuY2VfYmgocG9zLT5uZXh0KSkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oIGIvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oCmluZGV4IGZmNDIyZDIuLjk5ZjlhYTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgKQEAgLTQ3LDYgKzQ3LDE4IEBACiBleHRlcm4gaW50IHJjdXRvcnR1cmVfcnVubmFibGU7IC8qIGZvciBzeXNjdGwgKi8KICNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgKi8KIAorI2lmIGRlZmluZWQoQ09ORklHX1RSRUVfUkNVKSB8fCBkZWZpbmVkKENPTkZJR19UUkVFX1BSRUVNUFRfUkNVKQorZXh0ZXJuIHZvaWQgcmN1dG9ydHVyZV9yZWNvcmRfdGVzdF90cmFuc2l0aW9uKHZvaWQpOworZXh0ZXJuIHZvaWQgcmN1dG9ydHVyZV9yZWNvcmRfcHJvZ3Jlc3ModW5zaWduZWQgbG9uZyB2ZXJudW0pOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCByY3V0b3J0dXJlX3JlY29yZF90ZXN0X3RyYW5zaXRpb24odm9pZCkKK3sKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCByY3V0b3J0dXJlX3JlY29yZF9wcm9ncmVzcyh1bnNpZ25lZCBsb25nIHZlcm51bSkKK3sKK30KKyNlbmRpZgorCiAjZGVmaW5lIFVJTlRfQ01QX0dFKGEsIGIpCShVSU5UX01BWCAvIDIgPj0gKGEpIC0gKGIpKQogI2RlZmluZSBVSU5UX0NNUF9MVChhLCBiKQkoVUlOVF9NQVggLyAyIDwgKGEpIC0gKGIpKQogI2RlZmluZSBVTE9OR19DTVBfR0UoYSwgYikJKFVMT05HX01BWCAvIDIgPj0gKGEpIC0gKGIpKQpAQCAtNjgsNyArODAsNiBAQAogZXh0ZXJuIHZvaWQgc3luY2hyb25pemVfc2NoZWQodm9pZCk7CiBleHRlcm4gdm9pZCByY3VfYmFycmllcl9iaCh2b2lkKTsKIGV4dGVybiB2b2lkIHJjdV9iYXJyaWVyX3NjaGVkKHZvaWQpOwotZXh0ZXJuIGludCBzY2hlZF9leHBlZGl0ZWRfdG9ydHVyZV9zdGF0cyhjaGFyICpwYWdlKTsKIAogc3RhdGljIGlubGluZSB2b2lkIF9fcmN1X3JlYWRfbG9ja19iaCh2b2lkKQogewpAQCAtNzc0LDYgKzc4NSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZWJ1Z19yY3VfaGVhZF9xdWV1ZShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCiB7CisJV0FSTl9PTl9PTkNFKCh1bnNpZ25lZCBsb25nKWhlYWQgJiAweDMpOwogCWRlYnVnX29iamVjdF9hY3RpdmF0ZShoZWFkLCAmcmN1aGVhZF9kZWJ1Z19kZXNjcik7CiAJZGVidWdfb2JqZWN0X2FjdGl2ZV9zdGF0ZShoZWFkLCAmcmN1aGVhZF9kZWJ1Z19kZXNjciwKIAkJCQkgIFNUQVRFX1JDVV9IRUFEX1JFQURZLApAQCAtNzk3LDQgKzgwOSw2MCBAQAogfQogI2VuZGlmCS8qICNlbHNlICFDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRCAqLwogCitzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgX19pc19rZnJlZV9yY3Vfb2Zmc2V0KHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXJldHVybiBvZmZzZXQgPCA0MDk2OworfQorCitzdGF0aWMgX19hbHdheXNfaW5saW5lCit2b2lkIF9fa2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqaGVhZCwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJdHlwZWRlZiB2b2lkICgqcmN1X2NhbGxiYWNrKShzdHJ1Y3QgcmN1X2hlYWQgKik7CisKKwlCVUlMRF9CVUdfT04oIV9fYnVpbHRpbl9jb25zdGFudF9wKG9mZnNldCkpOworCisJLyogU2VlIHRoZSBrZnJlZV9yY3UoKSBoZWFkZXIgY29tbWVudC4gKi8KKwlCVUlMRF9CVUdfT04oIV9faXNfa2ZyZWVfcmN1X29mZnNldChvZmZzZXQpKTsKKworCWNhbGxfcmN1KGhlYWQsIChyY3VfY2FsbGJhY2spb2Zmc2V0KTsKK30KKworZXh0ZXJuIHZvaWQga2ZyZWUoY29uc3Qgdm9pZCAqKTsKKworc3RhdGljIGlubGluZSB2b2lkIF9fcmN1X3JlY2xhaW0oc3RydWN0IHJjdV9oZWFkICpoZWFkKQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaGVhZC0+ZnVuYzsKKworCWlmIChfX2lzX2tmcmVlX3JjdV9vZmZzZXQob2Zmc2V0KSkKKwkJa2ZyZWUoKHZvaWQgKiloZWFkIC0gb2Zmc2V0KTsKKwllbHNlCisJCWhlYWQtPmZ1bmMoaGVhZCk7Cit9CisKKy8qKgorICoga2ZyZWVfcmN1KCkgLSBrZnJlZSBhbiBvYmplY3QgYWZ0ZXIgYSBncmFjZSBwZXJpb2QuCisgKiBAcHRyOglwb2ludGVyIHRvIGtmcmVlCisgKiBAcmN1X2hlYWQ6CXRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QgcmN1X2hlYWQgd2l0aGluIHRoZSB0eXBlIG9mIEBwdHIuCisgKgorICogTWFueSByY3UgY2FsbGJhY2tzIGZ1bmN0aW9ucyBqdXN0IGNhbGwga2ZyZWUoKSBvbiB0aGUgYmFzZSBzdHJ1Y3R1cmUuCisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHRyaXZpYWwsIGJ1dCB0aGVpciBzaXplIGFkZHMgdXAsIGFuZCBmdXJ0aGVybW9yZQorICogd2hlbiB0aGV5IGFyZSB1c2VkIGluIGEga2VybmVsIG1vZHVsZSwgdGhhdCBtb2R1bGUgbXVzdCBpbnZva2UgdGhlCisgKiBoaWdoLWxhdGVuY3kgcmN1X2JhcnJpZXIoKSBmdW5jdGlvbiBhdCBtb2R1bGUtdW5sb2FkIHRpbWUuCisgKgorICogVGhlIGtmcmVlX3JjdSgpIGZ1bmN0aW9uIGhhbmRsZXMgdGhpcyBpc3N1ZS4gIFJhdGhlciB0aGFuIGVuY29kaW5nIGEKKyAqIGZ1bmN0aW9uIGFkZHJlc3MgaW4gdGhlIGVtYmVkZGVkIHJjdV9oZWFkIHN0cnVjdHVyZSwga2ZyZWVfcmN1KCkgaW5zdGVhZAorICogZW5jb2RlcyB0aGUgb2Zmc2V0IG9mIHRoZSByY3VfaGVhZCBzdHJ1Y3R1cmUgd2l0aGluIHRoZSBiYXNlIHN0cnVjdHVyZS4KKyAqIEJlY2F1c2UgdGhlIGZ1bmN0aW9ucyBhcmUgbm90IGFsbG93ZWQgaW4gdGhlIGxvdy1vcmRlciA0MDk2IGJ5dGVzIG9mCisgKiBrZXJuZWwgdmlydHVhbCBtZW1vcnksIG9mZnNldHMgdXAgdG8gNDA5NSBieXRlcyBjYW4gYmUgYWNjb21tb2RhdGVkLgorICogSWYgdGhlIG9mZnNldCBpcyBsYXJnZXIgdGhhbiA0MDk1IGJ5dGVzLCBhIGNvbXBpbGUtdGltZSBlcnJvciB3aWxsCisgKiBiZSBnZW5lcmF0ZWQgaW4gX19rZnJlZV9yY3UoKS4gIElmIHRoaXMgZXJyb3IgaXMgdHJpZ2dlcmVkLCB5b3UgY2FuCisgKiBlaXRoZXIgZmFsbCBiYWNrIHRvIHVzZSBvZiBjYWxsX3JjdSgpIG9yIHJlYXJyYW5nZSB0aGUgc3RydWN0dXJlIHRvCisgKiBwb3NpdGlvbiB0aGUgcmN1X2hlYWQgc3RydWN0dXJlIGludG8gdGhlIGZpcnN0IDQwOTYgYnl0ZXMuCisgKgorICogTm90ZSB0aGF0IHRoZSBhbGxvd2FibGUgb2Zmc2V0IG1pZ2h0IGRlY3JlYXNlIGluIHRoZSBmdXR1cmUsIGZvciBleGFtcGxlLAorICogdG8gYWxsb3cgc29tZXRoaW5nIGxpa2Uga21lbV9jYWNoZV9mcmVlX3JjdSgpLgorICovCisjZGVmaW5lIGtmcmVlX3JjdShwdHIsIHJjdV9oZWFkKQkJCQkJXAorCV9fa2ZyZWVfcmN1KCYoKHB0ciktPnJjdV9oZWFkKSwgb2Zmc2V0b2YodHlwZW9mKCoocHRyKSksIHJjdV9oZWFkKSkKKwogI2VuZGlmIC8qIF9fTElOVVhfUkNVUERBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yY3V0aW55LmggYi9pbmNsdWRlL2xpbnV4L3JjdXRpbnkuaAppbmRleCAzMGViZDdjLi41MmIzZTAyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JjdXRpbnkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JjdXRpbnkuaApAQCAtMTAwLDYgKzEwMCwxNCBAQAogfQogCiAvKgorICogVGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBDUFUsIHdoaWNoCisgKiBhbGxvd3MgdXMgdG8gaWdub3JlIHZpcnR1YWxpemF0aW9uLWJhc2VkIGNvbnRleHQgc3dpdGNoZXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByY3VfdmlydF9ub3RlX2NvbnRleHRfc3dpdGNoKGludCBjcHUpCit7Cit9CisKKy8qCiAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBncmFjZSBwZXJpb2RzLgogICovCiBzdGF0aWMgaW5saW5lIGxvbmcgcmN1X2JhdGNoZXNfY29tcGxldGVkKHZvaWQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JjdXRyZWUuaCBiL2luY2x1ZGUvbGludXgvcmN1dHJlZS5oCmluZGV4IDNhOTMzNDguLmU2NWQwNjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmN1dHJlZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmN1dHJlZS5oCkBAIC0zNSw2ICszNSwxNiBAQAogZXh0ZXJuIGludCByY3VfbmVlZHNfY3B1KGludCBjcHUpOwogZXh0ZXJuIHZvaWQgcmN1X2NwdV9zdGFsbF9yZXNldCh2b2lkKTsKIAorLyoKKyAqIE5vdGUgYSB2aXJ0dWFsaXphdGlvbi1iYXNlZCBjb250ZXh0IHN3aXRjaC4gIFRoaXMgaXMgc2ltcGx5IGEKKyAqIHdyYXBwZXIgYXJvdW5kIHJjdV9ub3RlX2NvbnRleHRfc3dpdGNoKCksIHdoaWNoIGFsbG93cyBUSU5ZX1JDVQorICogdG8gc2F2ZSBhIGZldyBieXRlcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJjdV92aXJ0X25vdGVfY29udGV4dF9zd2l0Y2goaW50IGNwdSkKK3sKKwlyY3Vfbm90ZV9jb250ZXh0X3N3aXRjaChjcHUpOworfQorCiAjaWZkZWYgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UKIAogZXh0ZXJuIHZvaWQgZXhpdF9yY3Uodm9pZCk7CkBAIC01OCw5ICs2OCwxMiBAQAogCiBleHRlcm4gdm9pZCByY3VfYmFycmllcih2b2lkKTsKIAorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcmN1dG9ydHVyZV90ZXN0c2VxOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcmN1dG9ydHVyZV92ZXJudW07CiBleHRlcm4gbG9uZyByY3VfYmF0Y2hlc19jb21wbGV0ZWQodm9pZCk7CiBleHRlcm4gbG9uZyByY3VfYmF0Y2hlc19jb21wbGV0ZWRfYmgodm9pZCk7CiBleHRlcm4gbG9uZyByY3VfYmF0Y2hlc19jb21wbGV0ZWRfc2NoZWQodm9pZCk7CisKIGV4dGVybiB2b2lkIHJjdV9mb3JjZV9xdWllc2NlbnRfc3RhdGUodm9pZCk7CiBleHRlcm4gdm9pZCByY3VfYmhfZm9yY2VfcXVpZXNjZW50X3N0YXRlKHZvaWQpOwogZXh0ZXJuIHZvaWQgcmN1X3NjaGVkX2ZvcmNlX3F1aWVzY2VudF9zdGF0ZSh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaAppbmRleCA3ODFhYmQxLi4xMjIxMWUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCkBAIC0zNjAsNyArMzYwLDcgQEAKIGV4dGVybiBzaWduZWQgbG9uZyBzY2hlZHVsZV90aW1lb3V0X2tpbGxhYmxlKHNpZ25lZCBsb25nIHRpbWVvdXQpOwogZXh0ZXJuIHNpZ25lZCBsb25nIHNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKHNpZ25lZCBsb25nIHRpbWVvdXQpOwogYXNtbGlua2FnZSB2b2lkIHNjaGVkdWxlKHZvaWQpOwotZXh0ZXJuIGludCBtdXRleF9zcGluX29uX293bmVyKHN0cnVjdCBtdXRleCAqbG9jaywgc3RydWN0IHRocmVhZF9pbmZvICpvd25lcik7CitleHRlcm4gaW50IG11dGV4X3NwaW5fb25fb3duZXIoc3RydWN0IG11dGV4ICpsb2NrLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm93bmVyKTsKIAogc3RydWN0IG5zcHJveHk7CiBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2U7CkBAIC03MzEsMTAgKzczMSw2IEBACiAJLyogdGltZXN0YW1wcyAqLwogCXVuc2lnbmVkIGxvbmcgbG9uZyBsYXN0X2Fycml2YWwsLyogd2hlbiB3ZSBsYXN0IHJhbiBvbiBhIGNwdSAqLwogCQkJICAgbGFzdF9xdWV1ZWQ7CS8qIHdoZW4gd2Ugd2VyZSBsYXN0IHF1ZXVlZCB0byBydW4gKi8KLSNpZmRlZiBDT05GSUdfU0NIRURTVEFUUwotCS8qIEJLTCBzdGF0cyAqLwotCXVuc2lnbmVkIGludCBia2xfY291bnQ7Ci0jZW5kaWYKIH07CiAjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfU0NIRURTVEFUUykgfHwgZGVmaW5lZChDT05GSUdfVEFTS19ERUxBWV9BQ0NUKSAqLwogCkBAIC04NjgsNiArODY0LDcgQEAKIAogc3RydWN0IHNjaGVkX2dyb3VwIHsKIAlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKm5leHQ7CS8qIE11c3QgYmUgYSBjaXJjdWxhciBsaXN0ICovCisJYXRvbWljX3QgcmVmOwogCiAJLyoKIAkgKiBDUFUgcG93ZXIgb2YgdGhpcyBncm91cCwgU0NIRURfTE9BRF9TQ0FMRSBiZWluZyBtYXggcG93ZXIgZm9yIGEKQEAgLTg4Miw5ICs4NzksNiBAQAogCSAqIE5PVEU6IHRoaXMgZmllbGQgaXMgdmFyaWFibGUgbGVuZ3RoLiAoQWxsb2NhdGVkIGR5bmFtaWNhbGx5CiAJICogYnkgYXR0YWNoaW5nIGV4dHJhIHNwYWNlIHRvIHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZSwKIAkgKiBkZXBlbmRpbmcgb24gaG93IG1hbnkgQ1BVcyB0aGUga2VybmVsIGhhcyBib290ZWQgdXAgd2l0aCkKLQkgKgotCSAqIEl0IGlzIGFsc28gYmUgZW1iZWRkZWQgaW50byBzdGF0aWMgZGF0YSBzdHJ1Y3R1cmVzIGF0IGJ1aWxkCi0JICogdGltZS4gKFNlZSAnc3RydWN0IHN0YXRpY19zY2hlZF9ncm91cCcgaW4ga2VybmVsL3NjaGVkLmMpCiAJICovCiAJdW5zaWduZWQgbG9uZyBjcHVtYXNrWzBdOwogfTsKQEAgLTg5NCwxNyArODg4LDYgQEAKIAlyZXR1cm4gdG9fY3B1bWFzayhzZy0+Y3B1bWFzayk7CiB9CiAKLWVudW0gc2NoZWRfZG9tYWluX2xldmVsIHsKLQlTRF9MVl9OT05FID0gMCwKLQlTRF9MVl9TSUJMSU5HLAotCVNEX0xWX01DLAotCVNEX0xWX0JPT0ssCi0JU0RfTFZfQ1BVLAotCVNEX0xWX05PREUsCi0JU0RfTFZfQUxMTk9ERVMsCi0JU0RfTFZfTUFYCi19OwotCiBzdHJ1Y3Qgc2NoZWRfZG9tYWluX2F0dHIgewogCWludCByZWxheF9kb21haW5fbGV2ZWw7CiB9OwpAQCAtOTEzLDYgKzg5Niw4IEBACiAJLnJlbGF4X2RvbWFpbl9sZXZlbCA9IC0xLAkJCVwKIH0KIAorZXh0ZXJuIGludCBzY2hlZF9kb21haW5fbGV2ZWxfbWF4OworCiBzdHJ1Y3Qgc2NoZWRfZG9tYWluIHsKIAkvKiBUaGVzZSBmaWVsZHMgbXVzdCBiZSBzZXR1cCAqLwogCXN0cnVjdCBzY2hlZF9kb21haW4gKnBhcmVudDsJLyogdG9wIGRvbWFpbiBtdXN0IGJlIG51bGwgdGVybWluYXRlZCAqLwpAQCAtOTMwLDcgKzkxNSw3IEBACiAJdW5zaWduZWQgaW50IGZvcmtleGVjX2lkeDsKIAl1bnNpZ25lZCBpbnQgc210X2dhaW47CiAJaW50IGZsYWdzOwkJCS8qIFNlZSBTRF8qICovCi0JZW51bSBzY2hlZF9kb21haW5fbGV2ZWwgbGV2ZWw7CisJaW50IGxldmVsOwogCiAJLyogUnVudGltZSBmaWVsZHMuICovCiAJdW5zaWduZWQgbG9uZyBsYXN0X2JhbGFuY2U7CS8qIGluaXQgdG8gamlmZmllcy4gdW5pdHMgaW4gamlmZmllcyAqLwpAQCAtOTczLDYgKzk1OCwxMCBAQAogI2lmZGVmIENPTkZJR19TQ0hFRF9ERUJVRwogCWNoYXIgKm5hbWU7CiAjZW5kaWYKKwl1bmlvbiB7CisJCXZvaWQgKnByaXZhdGU7CQkvKiB1c2VkIGR1cmluZyBjb25zdHJ1Y3Rpb24gKi8KKwkJc3RydWN0IHJjdV9oZWFkIHJjdTsJLyogdXNlZCBkdXJpbmcgZGVzdHJ1Y3Rpb24gKi8KKwl9OwogCiAJdW5zaWduZWQgaW50IHNwYW5fd2VpZ2h0OwogCS8qCkBAIC05ODEsOSArOTcwLDYgQEAKIAkgKiBOT1RFOiB0aGlzIGZpZWxkIGlzIHZhcmlhYmxlIGxlbmd0aC4gKEFsbG9jYXRlZCBkeW5hbWljYWxseQogCSAqIGJ5IGF0dGFjaGluZyBleHRyYSBzcGFjZSB0byB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUsCiAJICogZGVwZW5kaW5nIG9uIGhvdyBtYW55IENQVXMgdGhlIGtlcm5lbCBoYXMgYm9vdGVkIHVwIHdpdGgpCi0JICoKLQkgKiBJdCBpcyBhbHNvIGJlIGVtYmVkZGVkIGludG8gc3RhdGljIGRhdGEgc3RydWN0dXJlcyBhdCBidWlsZAotCSAqIHRpbWUuIChTZWUgJ3N0cnVjdCBzdGF0aWNfc2NoZWRfZG9tYWluJyBpbiBrZXJuZWwvc2NoZWQuYykKIAkgKi8KIAl1bnNpZ25lZCBsb25nIHNwYW5bMF07CiB9OwpAQCAtMTA0OCw4ICsxMDM0LDEyIEBACiAjZGVmaW5lIFdGX0ZPUksJCTB4MDIJCS8qIGNoaWxkIHdha2V1cCBhZnRlciBmb3JrICovCiAKICNkZWZpbmUgRU5RVUVVRV9XQUtFVVAJCTEKLSNkZWZpbmUgRU5RVUVVRV9XQUtJTkcJCTIKLSNkZWZpbmUgRU5RVUVVRV9IRUFECQk0CisjZGVmaW5lIEVOUVVFVUVfSEVBRAkJMgorI2lmZGVmIENPTkZJR19TTVAKKyNkZWZpbmUgRU5RVUVVRV9XQUtJTkcJCTQJLyogc2NoZWRfY2xhc3M6OnRhc2tfd2FraW5nIHdhcyBjYWxsZWQgKi8KKyNlbHNlCisjZGVmaW5lIEVOUVVFVUVfV0FLSU5HCQkwCisjZW5kaWYKIAogI2RlZmluZSBERVFVRVVFX1NMRUVQCQkxCiAKQEAgLTEwNjcsMTIgKzEwNTcsMTEgQEAKIAl2b2lkICgqcHV0X3ByZXZfdGFzaykgKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiAKICNpZmRlZiBDT05GSUdfU01QCi0JaW50ICAoKnNlbGVjdF90YXNrX3JxKShzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCi0JCQkgICAgICAgaW50IHNkX2ZsYWcsIGludCBmbGFncyk7CisJaW50ICAoKnNlbGVjdF90YXNrX3JxKShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBzZF9mbGFnLCBpbnQgZmxhZ3MpOwogCiAJdm9pZCAoKnByZV9zY2hlZHVsZSkgKHN0cnVjdCBycSAqdGhpc19ycSwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKIAl2b2lkICgqcG9zdF9zY2hlZHVsZSkgKHN0cnVjdCBycSAqdGhpc19ycSk7Ci0Jdm9pZCAoKnRhc2tfd2FraW5nKSAoc3RydWN0IHJxICp0aGlzX3JxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOworCXZvaWQgKCp0YXNrX3dha2luZykgKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CiAJdm9pZCAoKnRhc2tfd29rZW4pIChzdHJ1Y3QgcnEgKnRoaXNfcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CiAKIAl2b2lkICgqc2V0X2NwdXNfYWxsb3dlZCkoc3RydWN0IHRhc2tfc3RydWN0ICpwLApAQCAtMTE5NywxMyArMTE4NiwxMSBAQAogCXVuc2lnbmVkIGludCBmbGFnczsJLyogcGVyIHByb2Nlc3MgZmxhZ3MsIGRlZmluZWQgYmVsb3cgKi8KIAl1bnNpZ25lZCBpbnQgcHRyYWNlOwogCi0JaW50IGxvY2tfZGVwdGg7CQkvKiBCS0wgbG9jayBkZXB0aCAqLwotCiAjaWZkZWYgQ09ORklHX1NNUAotI2lmZGVmIF9fQVJDSF9XQU5UX1VOTE9DS0VEX0NUWFNXCi0JaW50IG9uY3B1OworCXN0cnVjdCB0YXNrX3N0cnVjdCAqd2FrZV9lbnRyeTsKKwlpbnQgb25fY3B1OwogI2VuZGlmCi0jZW5kaWYKKwlpbnQgb25fcnE7CiAKIAlpbnQgcHJpbywgc3RhdGljX3ByaW8sIG5vcm1hbF9wcmlvOwogCXVuc2lnbmVkIGludCBydF9wcmlvcml0eTsKQEAgLTEyNzQsNiArMTI2MSw3IEBACiAKIAkvKiBSZXZlcnQgdG8gZGVmYXVsdCBwcmlvcml0eS9wb2xpY3kgd2hlbiBmb3JraW5nICovCiAJdW5zaWduZWQgc2NoZWRfcmVzZXRfb25fZm9yazoxOworCXVuc2lnbmVkIHNjaGVkX2NvbnRyaWJ1dGVzX3RvX2xvYWQ6MTsKIAogCXBpZF90IHBpZDsKIAlwaWRfdCB0Z2lkOwpAQCAtMjA2MywxNCArMjA1MSwxMyBAQAogCiBleHRlcm4gaW50IHdha2VfdXBfc3RhdGUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGludCBzdGF0ZSk7CiBleHRlcm4gaW50IHdha2VfdXBfcHJvY2VzcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7Ci1leHRlcm4gdm9pZCB3YWtlX3VwX25ld190YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAotCQkJCXVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3MpOworZXh0ZXJuIHZvaWQgd2FrZV91cF9uZXdfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CiAjaWZkZWYgQ09ORklHX1NNUAogIGV4dGVybiB2b2lkIGtpY2tfcHJvY2VzcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CiAjZWxzZQogIHN0YXRpYyBpbmxpbmUgdm9pZCBraWNrX3Byb2Nlc3Moc3RydWN0IHRhc2tfc3RydWN0ICp0c2spIHsgfQogI2VuZGlmCi1leHRlcm4gdm9pZCBzY2hlZF9mb3JrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IGNsb25lX2ZsYWdzKTsKK2V4dGVybiB2b2lkIHNjaGVkX2Zvcmsoc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKIGV4dGVybiB2b2lkIHNjaGVkX2RlYWQoc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKIAogZXh0ZXJuIHZvaWQgcHJvY19jYWNoZXNfaW5pdCh2b2lkKTsKQEAgLTIxOTUsOCArMjE4MiwxMCBAQAogZXh0ZXJuIGNoYXIgKmdldF90YXNrX2NvbW0oY2hhciAqdG8sIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKIAogI2lmZGVmIENPTkZJR19TTVAKK3ZvaWQgc2NoZWR1bGVyX2lwaSh2b2lkKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIHdhaXRfdGFza19pbmFjdGl2ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgbG9uZyBtYXRjaF9zdGF0ZSk7CiAjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHNjaGVkdWxlcl9pcGkodm9pZCkgeyB9CiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgd2FpdF90YXNrX2luYWN0aXZlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwKIAkJCQkJICAgICAgIGxvbmcgbWF0Y2hfc3RhdGUpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcWxvY2suaCBiL2luY2x1ZGUvbGludXgvc2VxbG9jay5oCmluZGV4IGU5OGNkMmUuLjA2ZDY5NjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VxbG9jay5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VxbG9jay5oCkBAIC04OCwxMiArODgsMTIgQEAKIAl1bnNpZ25lZCByZXQ7CiAKIHJlcGVhdDoKLQlyZXQgPSBzbC0+c2VxdWVuY2U7Ci0Jc21wX3JtYigpOworCXJldCA9IEFDQ0VTU19PTkNFKHNsLT5zZXF1ZW5jZSk7CiAJaWYgKHVubGlrZWx5KHJldCAmIDEpKSB7CiAJCWNwdV9yZWxheCgpOwogCQlnb3RvIHJlcGVhdDsKIAl9CisJc21wX3JtYigpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2lnbmFsLmggYi9pbmNsdWRlL2xpbnV4L3NpZ25hbC5oCmluZGV4IGZjZDJiMTQuLjI5YTY4YWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2lnbmFsLmgKKysrIGIvaW5jbHVkZS9saW51eC9zaWduYWwuaApAQCAtNyw2ICs3LDggQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogCitzdHJ1Y3QgdGFza19zdHJ1Y3Q7CisKIC8qIGZvciBzeXNjdGwgKi8KIGV4dGVybiBpbnQgcHJpbnRfZmF0YWxfc2lnbmFsczsKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NzYi9zc2IuaCBiL2luY2x1ZGUvbGludXgvc3NiL3NzYi5oCmluZGV4IDk2NTllZmYuLjA0NWY3MmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3NiL3NzYi5oCisrKyBiL2luY2x1ZGUvbGludXgvc3NiL3NzYi5oCkBAIC00MDQsNyArNDA0LDkgQEAKIAogLyogU2V0IGEgZmFsbGJhY2sgU1BST00uCiAgKiBTZWUga2RvYyBhdCB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBmb3IgY29tcGxldGUgZG9jdW1lbnRhdGlvbi4gKi8KLWV4dGVybiBpbnQgc3NiX2FyY2hfc2V0X2ZhbGxiYWNrX3Nwcm9tKGNvbnN0IHN0cnVjdCBzc2Jfc3Byb20gKnNwcm9tKTsKK2V4dGVybiBpbnQgc3NiX2FyY2hfcmVnaXN0ZXJfZmFsbGJhY2tfc3Byb20oCisJCWludCAoKnNwcm9tX2NhbGxiYWNrKShzdHJ1Y3Qgc3NiX2J1cyAqYnVzLAorCQlzdHJ1Y3Qgc3NiX3Nwcm9tICpvdXQpKTsKIAogLyogU3VzcGVuZCBhIFNTQiBidXMuCiAgKiBDYWxsIHRoaXMgZnJvbSB0aGUgcGFyZW50IGJ1cyBzdXNwZW5kIHJvdXRpbmUuICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N0cmluZy5oIGIvaW5jbHVkZS9saW51eC9zdHJpbmcuaAppbmRleCBhNzE2ZWUyLi5hMTc2ZGIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N0cmluZy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3RyaW5nLmgKQEAgLTEyMyw2ICsxMjMsNyBAQAogZXh0ZXJuIHZvaWQgYXJndl9mcmVlKGNoYXIgKiphcmd2KTsKIAogZXh0ZXJuIGJvb2wgc3lzZnNfc3RyZXEoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKTsKK2V4dGVybiBpbnQgc3RydG9ib29sKGNvbnN0IGNoYXIgKnMsIGJvb2wgKnJlcyk7CiAKICNpZmRlZiBDT05GSUdfQklOQVJZX1BSSU5URgogaW50IHZiaW5fcHJpbnRmKHUzMiAqYmluX2J1Ziwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3lzZGV2LmggYi9pbmNsdWRlL2xpbnV4L3N5c2Rldi5oCmluZGV4IGRmYjA3OGQuLmQzNWU3ODMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3lzZGV2LmgKKysrIGIvaW5jbHVkZS9saW51eC9zeXNkZXYuaApAQCAtMzQsMTIgKzM0LDYgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWRyaXZlcnM7CiAJc3RydWN0IHN5c2Rldl9jbGFzc19hdHRyaWJ1dGUgKiphdHRyczsKIAlzdHJ1Y3Qga3NldAkJa3NldDsKLSNpZm5kZWYgQ09ORklHX0FSQ0hfTk9fU1lTREVWX09QUwotCS8qIERlZmF1bHQgb3BlcmF0aW9ucyBmb3IgdGhlc2UgdHlwZXMgb2YgZGV2aWNlcyAqLwotCWludAkoKnNodXRkb3duKShzdHJ1Y3Qgc3lzX2RldmljZSAqKTsKLQlpbnQJKCpzdXNwZW5kKShzdHJ1Y3Qgc3lzX2RldmljZSAqLCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwotCWludAkoKnJlc3VtZSkoc3RydWN0IHN5c19kZXZpY2UgKik7Ci0jZW5kaWYKIH07CiAKIHN0cnVjdCBzeXNkZXZfY2xhc3NfYXR0cmlidXRlIHsKQEAgLTc3LDExICs3MSw2IEBACiAJc3RydWN0IGxpc3RfaGVhZAllbnRyeTsKIAlpbnQJKCphZGQpKHN0cnVjdCBzeXNfZGV2aWNlICopOwogCWludAkoKnJlbW92ZSkoc3RydWN0IHN5c19kZXZpY2UgKik7Ci0jaWZuZGVmIENPTkZJR19BUkNIX05PX1NZU0RFVl9PUFMKLQlpbnQJKCpzaHV0ZG93bikoc3RydWN0IHN5c19kZXZpY2UgKik7Ci0JaW50CSgqc3VzcGVuZCkoc3RydWN0IHN5c19kZXZpY2UgKiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKLQlpbnQJKCpyZXN1bWUpKHN0cnVjdCBzeXNfZGV2aWNlICopOwotI2VuZGlmCiB9OwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3lzZnMuaCBiL2luY2x1ZGUvbGludXgvc3lzZnMuaAppbmRleCAzMGI4ODE1Li5jM2FjZGE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9zeXNmcy5oCkBAIC0xNzYsNyArMTc2LDYgQEAKIAkJCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lKTsKIHN0cnVjdCBzeXNmc19kaXJlbnQgKnN5c2ZzX2dldChzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCk7CiB2b2lkIHN5c2ZzX3B1dChzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCk7Ci12b2lkIHN5c2ZzX3ByaW50a19sYXN0X2ZpbGUodm9pZCk7CiAKIC8qIENhbGxlZCB0byBjbGVhciBhIG5zIHRhZyB3aGVuIGl0IGlzIG5vIGxvbmdlciB2YWxpZCAqLwogdm9pZCBzeXNmc19leGl0X25zKGVudW0ga29ial9uc190eXBlIHR5cGUsIGNvbnN0IHZvaWQgKnRhZyk7CkBAIC0zNDgsMTAgKzM0Nyw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzeXNmc19wcmludGtfbGFzdF9maWxlKHZvaWQpCi17Ci19Ci0KICNlbmRpZiAvKiBDT05GSUdfU1lTRlMgKi8KIAogI2VuZGlmIC8qIF9TWVNGU19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aV93aWxpbmtfc3QuaCBiL2luY2x1ZGUvbGludXgvdGlfd2lsaW5rX3N0LmgKaW5kZXggNzA3MWVjNS4uYjAwNGU1NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aV93aWxpbmtfc3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RpX3dpbGlua19zdC5oCkBAIC0xNDAsMTIgKzE0MCwxMiBAQAogICovCiBzdHJ1Y3Qgc3RfZGF0YV9zIHsKIAl1bnNpZ25lZCBsb25nIHN0X3N0YXRlOwotCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKICNkZWZpbmUgU1RfVFhfU0VORElORwkxCiAjZGVmaW5lIFNUX1RYX1dBS0VVUAkyCiAJdW5zaWduZWQgbG9uZyB0eF9zdGF0ZTsKIAlzdHJ1Y3Qgc3RfcHJvdG9fcyAqbGlzdFtTVF9NQVhfQ0hBTk5FTFNdOworCWJvb2wgaXNfcmVnaXN0ZXJlZFtTVF9NQVhfQ0hBTk5FTFNdOwogCXVuc2lnbmVkIGxvbmcgcnhfc3RhdGU7CiAJdW5zaWduZWQgbG9uZyByeF9jb3VudDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiOwpAQCAtMTU1LDYgKzE1NSw3IEBACiAJdW5zaWduZWQgY2hhcglwcm90b3NfcmVnaXN0ZXJlZDsKIAl1bnNpZ25lZCBsb25nIGxsX3N0YXRlOwogCXZvaWQgKmtpbV9kYXRhOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aW1lLmggYi9pbmNsdWRlL2xpbnV4L3RpbWUuaAppbmRleCA0NTRhMjYyMC4uYjMwNjE3OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aW1lLmgKKysrIGIvaW5jbHVkZS9saW51eC90aW1lLmgKQEAgLTEyNiw2ICsxMjYsNyBAQAogc3RydWN0IHRpbWVzcGVjIGdldF9tb25vdG9uaWNfY29hcnNlKHZvaWQpOwogdm9pZCBnZXRfeHRpbWVfYW5kX21vbm90b25pY19hbmRfc2xlZXBfb2Zmc2V0KHN0cnVjdCB0aW1lc3BlYyAqeHRpbSwKIAkJCQlzdHJ1Y3QgdGltZXNwZWMgKnd0b20sIHN0cnVjdCB0aW1lc3BlYyAqc2xlZXApOwordm9pZCB0aW1la2VlcGluZ19pbmplY3Rfc2xlZXB0aW1lKHN0cnVjdCB0aW1lc3BlYyAqZGVsdGEpOwogCiAjZGVmaW5lIENVUlJFTlRfVElNRQkJKGN1cnJlbnRfa2VybmVsX3RpbWUoKSkKICNkZWZpbmUgQ1VSUkVOVF9USU1FX1NFQwkoKHN0cnVjdCB0aW1lc3BlYykgeyBnZXRfc2Vjb25kcygpLCAwIH0pCkBAIC0yOTQsNiArMjk1LDggQEAKICNkZWZpbmUgQ0xPQ0tfUkVBTFRJTUVfQ09BUlNFCQk1CiAjZGVmaW5lIENMT0NLX01PTk9UT05JQ19DT0FSU0UJCTYKICNkZWZpbmUgQ0xPQ0tfQk9PVFRJTUUJCQk3CisjZGVmaW5lIENMT0NLX1JFQUxUSU1FX0FMQVJNCQk4CisjZGVmaW5lIENMT0NLX0JPT1RUSU1FX0FMQVJNCQk5CiAKIC8qCiAgKiBUaGUgSURzIG9mIHZhcmlvdXMgaGFyZHdhcmUgY2xvY2tzOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aW1lcnF1ZXVlLmggYi9pbmNsdWRlL2xpbnV4L3RpbWVycXVldWUuaAppbmRleCBhNTIwZmQ3Li41MDg4NzI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RpbWVycXVldWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RpbWVycXVldWUuaApAQCAtMzksNyArMzksNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJxdWV1ZV9pbml0KHN0cnVjdCB0aW1lcnF1ZXVlX25vZGUgKm5vZGUpCiB7Ci0JUkJfQ0xFQVJfTk9ERSgmbm9kZS0+bm9kZSk7CisJcmJfaW5pdF9ub2RlKCZub2RlLT5ub2RlKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHRpbWVycXVldWVfaW5pdF9oZWFkKHN0cnVjdCB0aW1lcnF1ZXVlX2hlYWQgKmhlYWQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RyYWNlcG9pbnQuaCBiL2luY2x1ZGUvbGludXgvdHJhY2Vwb2ludC5oCmluZGV4IDk3Yzg0YTUuLmQ1MzBhNDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdHJhY2Vwb2ludC5oCisrKyBiL2luY2x1ZGUvbGludXgvdHJhY2Vwb2ludC5oCkBAIC0yOSw3ICsyOSw3IEBACiAKIHN0cnVjdCB0cmFjZXBvaW50IHsKIAljb25zdCBjaGFyICpuYW1lOwkJLyogVHJhY2Vwb2ludCBuYW1lICovCi0JaW50IHN0YXRlOwkJCS8qIFN0YXRlLiAqLworCXN0cnVjdCBqdW1wX2xhYmVsX2tleSBrZXk7CiAJdm9pZCAoKnJlZ2Z1bmMpKHZvaWQpOwogCXZvaWQgKCp1bnJlZ2Z1bmMpKHZvaWQpOwogCXN0cnVjdCB0cmFjZXBvaW50X2Z1bmMgX19yY3UgKmZ1bmNzOwpAQCAtMTQ2LDkgKzE0Niw3IEBACiAJZXh0ZXJuIHN0cnVjdCB0cmFjZXBvaW50IF9fdHJhY2Vwb2ludF8jI25hbWU7CQkJXAogCXN0YXRpYyBpbmxpbmUgdm9pZCB0cmFjZV8jI25hbWUocHJvdG8pCQkJCVwKIAl7CQkJCQkJCQlcCi0JCUpVTVBfTEFCRUwoJl9fdHJhY2Vwb2ludF8jI25hbWUuc3RhdGUsIGRvX3RyYWNlKTsJXAotCQlyZXR1cm47CQkJCQkJCVwKLWRvX3RyYWNlOgkJCQkJCQkJXAorCQlpZiAoc3RhdGljX2JyYW5jaCgmX190cmFjZXBvaW50XyMjbmFtZS5rZXkpKQkJXAogCQkJX19ET19UUkFDRSgmX190cmFjZXBvaW50XyMjbmFtZSwJCVwKIAkJCQlUUF9QUk9UTyhkYXRhX3Byb3RvKSwJCQlcCiAJCQkJVFBfQVJHUyhkYXRhX2FyZ3MpLAkJCVwKQEAgLTE3NiwxNCArMTc0LDE0IEBACiAgKiBzdHJ1Y3R1cmVzLCBzbyB3ZSBjcmVhdGUgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIGl0ZXJhdGlvbgogICogb24gdGhlIHRyYWNlcG9pbnRzLgogICovCi0jZGVmaW5lIERFRklORV9UUkFDRV9GTihuYW1lLCByZWcsIHVucmVnKQkJCQlcCi0Jc3RhdGljIGNvbnN0IGNoYXIgX190cHN0cnRhYl8jI25hbWVbXQkJCQlcCi0JX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiX190cmFjZXBvaW50c19zdHJpbmdzIikpKSA9ICNuYW1lOwlcCi0Jc3RydWN0IHRyYWNlcG9pbnQgX190cmFjZXBvaW50XyMjbmFtZQkJCQlcCi0JX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiX190cmFjZXBvaW50cyIpKSkgPQkJCVwKLQkJeyBfX3Rwc3RydGFiXyMjbmFtZSwgMCwgcmVnLCB1bnJlZywgTlVMTCB9OwkJXAotCXN0YXRpYyBzdHJ1Y3QgdHJhY2Vwb2ludCAqIGNvbnN0IF9fdHJhY2Vwb2ludF9wdHJfIyNuYW1lIF9fdXNlZAlcCi0JX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiX190cmFjZXBvaW50c19wdHJzIikpKSA9CQlcCisjZGVmaW5lIERFRklORV9UUkFDRV9GTihuYW1lLCByZWcsIHVucmVnKQkJCQkgXAorCXN0YXRpYyBjb25zdCBjaGFyIF9fdHBzdHJ0YWJfIyNuYW1lW10JCQkJIFwKKwlfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJfX3RyYWNlcG9pbnRzX3N0cmluZ3MiKSkpID0gI25hbWU7CSBcCisJc3RydWN0IHRyYWNlcG9pbnQgX190cmFjZXBvaW50XyMjbmFtZQkJCQkgXAorCV9fYXR0cmlidXRlX18oKHNlY3Rpb24oIl9fdHJhY2Vwb2ludHMiKSkpID0JCQkgXAorCQl7IF9fdHBzdHJ0YWJfIyNuYW1lLCBKVU1QX0xBQkVMX0lOSVQsIHJlZywgdW5yZWcsIE5VTEwgfTtcCisJc3RhdGljIHN0cnVjdCB0cmFjZXBvaW50ICogY29uc3QgX190cmFjZXBvaW50X3B0cl8jI25hbWUgX191c2VkCSBcCisJX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiX190cmFjZXBvaW50c19wdHJzIikpKSA9CQkgXAogCQkmX190cmFjZXBvaW50XyMjbmFtZTsKIAogI2RlZmluZSBERUZJTkVfVFJBQ0UobmFtZSkJCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaCBiL2luY2x1ZGUvbmV0L3NjdHAvc2N0cC5oCmluZGV4IDUwNTg0NWQuLjAxZTA5NGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvc2N0cC5oCisrKyBiL2luY2x1ZGUvbmV0L3NjdHAvc2N0cC5oCkBAIC0xMTUsNyArMTE1LDYgQEAKICAqIHNjdHAvcHJvdG9jb2wuYwogICovCiBleHRlcm4gc3RydWN0IHNvY2sgKnNjdHBfZ2V0X2N0bF9zb2NrKHZvaWQpOwotZXh0ZXJuIHZvaWQgc2N0cF9sb2NhbF9hZGRyX2ZyZWUoc3RydWN0IHJjdV9oZWFkICpoZWFkKTsKIGV4dGVybiBpbnQgc2N0cF9jb3B5X2xvY2FsX2FkZHJfbGlzdChzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKiwKIAkJCQkgICAgIHNjdHBfc2NvcGVfdCwgZ2ZwX3QgZ2ZwLAogCQkJCSAgICAgaW50IGZsYWdzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmRtYS9pd19jbS5oIGIvaW5jbHVkZS9yZG1hL2l3X2NtLmgKaW5kZXggY2JiODIyZS4uMmQwMTkxYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9yZG1hL2l3X2NtLmgKKysrIGIvaW5jbHVkZS9yZG1hL2l3X2NtLmgKQEAgLTQ2LDE4ICs0Niw5IEBACiAJSVdfQ01fRVZFTlRfQ0xPU0UJCSAvKiBjbG9zZSBjb21wbGV0ZSAqLwogfTsKIAotZW51bSBpd19jbV9ldmVudF9zdGF0dXMgewotCUlXX0NNX0VWRU5UX1NUQVRVU19PSyA9IDAsCSAvKiByZXF1ZXN0IHN1Y2Nlc3NmdWwgKi8KLQlJV19DTV9FVkVOVF9TVEFUVVNfQUNDRVBURUQgPSAwLCAvKiBjb25uZWN0IHJlcXVlc3QgYWNjZXB0ZWQgKi8KLQlJV19DTV9FVkVOVF9TVEFUVVNfUkVKRUNURUQsCSAvKiBjb25uZWN0IHJlcXVlc3QgcmVqZWN0ZWQgKi8KLQlJV19DTV9FVkVOVF9TVEFUVVNfVElNRU9VVCwJIC8qIHRoZSBvcGVyYXRpb24gdGltZWQgb3V0ICovCi0JSVdfQ01fRVZFTlRfU1RBVFVTX1JFU0VULAkgLyogcmVzZXQgZnJvbSByZW1vdGUgcGVlciAqLwotCUlXX0NNX0VWRU5UX1NUQVRVU19FSU5WQUwsCSAvKiBhc3luY2hyb25vdXMgZmFpbHVyZSBmb3IgYmFkIHBhcm0gKi8KLX07Ci0KIHN0cnVjdCBpd19jbV9ldmVudCB7CiAJZW51bSBpd19jbV9ldmVudF90eXBlIGV2ZW50OwotCWVudW0gaXdfY21fZXZlbnRfc3RhdHVzIHN0YXR1czsKKwlpbnQJCQkgc3RhdHVzOwogCXN0cnVjdCBzb2NrYWRkcl9pbiBsb2NhbF9hZGRyOwogCXN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGVfYWRkcjsKIAl2b2lkICpwcml2YXRlX2RhdGE7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3JkbWEvcmRtYV9jbS5oIGIvaW5jbHVkZS9yZG1hL3JkbWFfY20uaAppbmRleCA0ZmFlOTAzLi4xNjlmN2E1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3JkbWEvcmRtYV9jbS5oCisrKyBiL2luY2x1ZGUvcmRtYS9yZG1hX2NtLmgKQEAgLTMyOSw0ICszMjksMTQgQEAKICAqLwogdm9pZCByZG1hX3NldF9zZXJ2aWNlX3R5cGUoc3RydWN0IHJkbWFfY21faWQgKmlkLCBpbnQgdG9zKTsKIAorLyoqCisgKiByZG1hX3NldF9yZXVzZWFkZHIgLSBBbGxvdyB0aGUgcmV1c2Ugb2YgbG9jYWwgYWRkcmVzc2VzIHdoZW4gYmluZGluZworICogICAgdGhlIHJkbWFfY21faWQuCisgKiBAaWQ6IENvbW11bmljYXRpb24gaWRlbnRpZmllciB0byBjb25maWd1cmUuCisgKiBAcmV1c2U6IFZhbHVlIGluZGljYXRpbmcgaWYgdGhlIGJvdW5kIGFkZHJlc3MgaXMgcmV1c2FibGUuCisgKgorICogUmV1c2UgbXVzdCBiZSBzZXQgYmVmb3JlIGFuIGFkZHJlc3MgaXMgYm91bmQgdG8gdGhlIGlkLgorICovCitpbnQgcmRtYV9zZXRfcmV1c2VhZGRyKHN0cnVjdCByZG1hX2NtX2lkICppZCwgaW50IHJldXNlKTsKKwogI2VuZGlmIC8qIFJETUFfQ01fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZG1hL3JkbWFfdXNlcl9jbS5oIGIvaW5jbHVkZS9yZG1hL3JkbWFfdXNlcl9jbS5oCmluZGV4IDFkMTY1MDIuLmZjODJjMTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcmRtYS9yZG1hX3VzZXJfY20uaAorKysgYi9pbmNsdWRlL3JkbWEvcmRtYV91c2VyX2NtLmgKQEAgLTIyMSw4ICsyMjEsOSBAQAogCiAvKiBPcHRpb24gZGV0YWlscyAqLwogZW51bSB7Ci0JUkRNQV9PUFRJT05fSURfVE9TCT0gMCwKLQlSRE1BX09QVElPTl9JQl9QQVRICT0gMQorCVJETUFfT1BUSU9OX0lEX1RPUwkgPSAwLAorCVJETUFfT1BUSU9OX0lEX1JFVVNFQUREUiA9IDEsCisJUkRNQV9PUFRJT05fSUJfUEFUSAkgPSAxCiB9OwogCiBzdHJ1Y3QgcmRtYV91Y21fc2V0X29wdGlvbiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pcnEuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2lycS5oCmluZGV4IDFjMDk4MjAuLmFlMDQ1Y2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2lycS5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2lycS5oCkBAIC0yMCw4ICsyMCw3IEBACiAJCQkgc29mdGlycV9uYW1lKEJMT0NLX0lPUE9MTCksCVwKIAkJCSBzb2Z0aXJxX25hbWUoVEFTS0xFVCksCQlcCiAJCQkgc29mdGlycV9uYW1lKFNDSEVEKSwJCVwKLQkJCSBzb2Z0aXJxX25hbWUoSFJUSU1FUiksCQlcCi0JCQkgc29mdGlycV9uYW1lKFJDVSkpCisJCQkgc29mdGlycV9uYW1lKEhSVElNRVIpKQogCiAvKioKICAqIGlycV9oYW5kbGVyX2VudHJ5IC0gY2FsbGVkIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgaXJxIGFjdGlvbiBoYW5kbGVyCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi9ldmVudHMuaCBiL2luY2x1ZGUveGVuL2V2ZW50cy5oCmluZGV4IGYxYjg3YWQuLjlhZjIxZTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveGVuL2V2ZW50cy5oCisrKyBiL2luY2x1ZGUveGVuL2V2ZW50cy5oCkBAIC04NSw3ICs4NSw4IEBACiBpbnQgeGVuX2FsbG9jYXRlX3BpcnFfbXNpKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBtc2lfZGVzYyAqbXNpZGVzYyk7CiAvKiBCaW5kIGFuIFBTSSBwaXJxIHRvIGFuIGlycS4gKi8KIGludCB4ZW5fYmluZF9waXJxX21zaV90b19pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IG1zaV9kZXNjICptc2lkZXNjLAotCQkJICAgICBpbnQgcGlycSwgaW50IHZlY3RvciwgY29uc3QgY2hhciAqbmFtZSk7CisJCQkgICAgIGludCBwaXJxLCBpbnQgdmVjdG9yLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICBkb21pZF90IGRvbWlkKTsKICNlbmRpZgogCiAvKiBEZS1hbGxvY2F0ZXMgdGhlIGFib3ZlIG1lbnRpb25lZCBwaHlzaWNhbCBpbnRlcnJ1cHQuICovCkBAIC05NCw0ICs5NSwxMCBAQAogLyogUmV0dXJuIGlycSBmcm9tIHBpcnEgKi8KIGludCB4ZW5faXJxX2Zyb21fcGlycSh1bnNpZ25lZCBwaXJxKTsKIAorLyogUmV0dXJuIHRoZSBwaXJxIGFsbG9jYXRlZCB0byB0aGUgaXJxLiAqLworaW50IHhlbl9waXJxX2Zyb21faXJxKHVuc2lnbmVkIGlycSk7CisKKy8qIERldGVybWluZSB3aGV0aGVyIHRvIGlnbm9yZSB0aGlzIElSUSBpZiBpdCBpcyBwYXNzZWQgdG8gYSBndWVzdC4gKi8KK2ludCB4ZW5fdGVzdF9pcnFfc2hhcmVkKGludCBpcnEpOworCiAjZW5kaWYJLyogX1hFTl9FVkVOVFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5pdC9LY29uZmlnIGIvaW5pdC9LY29uZmlnCmluZGV4IDdhNzFlMGEuLjQ5ODZlY2MgMTAwNjQ0Ci0tLSBhL2luaXQvS2NvbmZpZworKysgYi9pbml0L0tjb25maWcKQEAgLTQ4NSw3ICs0ODUsNyBAQAogCiBjb25maWcgUkNVX0JPT1NUCiAJYm9vbCAiRW5hYmxlIFJDVSBwcmlvcml0eSBib29zdGluZyIKLQlkZXBlbmRzIG9uIFJUX01VVEVYRVMgJiYgVElOWV9QUkVFTVBUX1JDVQorCWRlcGVuZHMgb24gUlRfTVVURVhFUyAmJiBQUkVFTVBUX1JDVQogCWRlZmF1bHQgbgogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGJvb3N0cyB0aGUgcHJpb3JpdHkgb2YgcHJlZW1wdGVkIFJDVSByZWFkZXJzIHRoYXQKQEAgLTgyNyw2ICs4MjcsMTEgQEAKIAkgIGRlc2t0b3AgYXBwbGljYXRpb25zLiAgVGFzayBncm91cCBhdXRvZ2VuZXJhdGlvbiBpcyBjdXJyZW50bHkgYmFzZWQKIAkgIHVwb24gdGFzayBzZXNzaW9uLgogCitjb25maWcgU0NIRURfVFRXVV9RVUVVRQorCWJvb2wKKwlkZXBlbmRzIG9uICFTUEFSQzMyCisJZGVmYXVsdCB5CisKIGNvbmZpZyBNTV9PV05FUgogCWJvb2wKIApkaWZmIC0tZ2l0IGEvaW5pdC9tYWluLmMgYi9pbml0L21haW4uYwppbmRleCA0YTk0NzllLi40OGRmODgyIDEwMDY0NAotLS0gYS9pbml0L21haW4uYworKysgYi9pbml0L21haW4uYwpAQCAtNTgwLDggKzU4MCw4IEBACiAjZW5kaWYKIAlwYWdlX2Nncm91cF9pbml0KCk7CiAJZW5hYmxlX2RlYnVnX3BhZ2VhbGxvYygpOwotCWttZW1sZWFrX2luaXQoKTsKIAlkZWJ1Z19vYmplY3RzX21lbV9pbml0KCk7CisJa21lbWxlYWtfaW5pdCgpOwogCXNldHVwX3Blcl9jcHVfcGFnZXNldCgpOwogCW51bWFfcG9saWN5X2luaXQoKTsKIAlpZiAobGF0ZV90aW1lX2luaXQpCmRpZmYgLS1naXQgYS9rZXJuZWwvTWFrZWZpbGUgYi9rZXJuZWwvTWFrZWZpbGUKaW5kZXggODVjYmZiMy4uZTljZjE5MSAxMDA2NDQKLS0tIGEva2VybmVsL01ha2VmaWxlCisrKyBiL2tlcm5lbC9NYWtlZmlsZQpAQCAtMjEsNyArMjEsNiBAQAogQ0ZMQUdTX1JFTU9WRV9ydG11dGV4LWRlYnVnLm8gPSAtcGcKIENGTEFHU19SRU1PVkVfY2dyb3VwLWRlYnVnLm8gPSAtcGcKIENGTEFHU19SRU1PVkVfc2NoZWRfY2xvY2subyA9IC1wZwotQ0ZMQUdTX1JFTU9WRV9wZXJmX2V2ZW50Lm8gPSAtcGcKIENGTEFHU19SRU1PVkVfaXJxX3dvcmsubyA9IC1wZwogZW5kaWYKIApAQCAtMTAzLDggKzEwMiw5IEBACiBvYmotJChDT05GSUdfVFJBQ0VQT0lOVFMpICs9IHRyYWNlLwogb2JqLSQoQ09ORklHX1NNUCkgKz0gc2NoZWRfY3B1cHJpLm8KIG9iai0kKENPTkZJR19JUlFfV09SSykgKz0gaXJxX3dvcmsubwotb2JqLSQoQ09ORklHX1BFUkZfRVZFTlRTKSArPSBwZXJmX2V2ZW50Lm8KLW9iai0kKENPTkZJR19IQVZFX0hXX0JSRUFLUE9JTlQpICs9IGh3X2JyZWFrcG9pbnQubworCitvYmotJChDT05GSUdfUEVSRl9FVkVOVFMpICs9IGV2ZW50cy8KKwogb2JqLSQoQ09ORklHX1VTRVJfUkVUVVJOX05PVElGSUVSKSArPSB1c2VyLXJldHVybi1ub3RpZmllci5vCiBvYmotJChDT05GSUdfUEFEQVRBKSArPSBwYWRhdGEubwogb2JqLSQoQ09ORklHX0NSQVNIX0RVTVApICs9IGNyYXNoX2R1bXAubwpkaWZmIC0tZ2l0IGEva2VybmVsL2Nncm91cC5jIGIva2VybmVsL2Nncm91cC5jCmluZGV4IDI1YzdlYjUuLjkwOWEzNTUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jZ3JvdXAuYworKysgYi9rZXJuZWwvY2dyb3VwLmMKQEAgLTMyNiwxMiArMzI2LDYgQEAKIAlyZXR1cm4gJmNzc19zZXRfdGFibGVbaW5kZXhdOwogfQogCi1zdGF0aWMgdm9pZCBmcmVlX2Nzc19zZXRfcmN1KHN0cnVjdCByY3VfaGVhZCAqb2JqKQotewotCXN0cnVjdCBjc3Nfc2V0ICpjZyA9IGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBjc3Nfc2V0LCByY3VfaGVhZCk7Ci0Ja2ZyZWUoY2cpOwotfQotCiAvKiBXZSBkb24ndCBtYWludGFpbiB0aGUgbGlzdHMgcnVubmluZyB0aHJvdWdoIGVhY2ggY3NzX3NldCB0byBpdHMKICAqIHRhc2sgdW50aWwgYWZ0ZXIgdGhlIGZpcnN0IGNhbGwgdG8gY2dyb3VwX2l0ZXJfc3RhcnQoKS4gVGhpcwogICogcmVkdWNlcyB0aGUgZm9yaygpL2V4aXQoKSBvdmVyaGVhZCBmb3IgcGVvcGxlIHdobyBoYXZlIGNncm91cHMKQEAgLTM3NSw3ICszNjksNyBAQAogCX0KIAogCXdyaXRlX3VubG9jaygmY3NzX3NldF9sb2NrKTsKLQljYWxsX3JjdSgmY2ctPnJjdV9oZWFkLCBmcmVlX2Nzc19zZXRfcmN1KTsKKwlrZnJlZV9yY3UoY2csIHJjdV9oZWFkKTsKIH0KIAogLyoKQEAgLTgxMiwxMyArODA2LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBmcmVlX2Nncm91cF9yY3Uoc3RydWN0IHJjdV9oZWFkICpvYmopCi17Ci0Jc3RydWN0IGNncm91cCAqY2dycCA9IGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBjZ3JvdXAsIHJjdV9oZWFkKTsKLQotCWtmcmVlKGNncnApOwotfQotCiBzdGF0aWMgdm9pZCBjZ3JvdXBfZGlwdXQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCS8qIGlzIGRlbnRyeSBhIGRpcmVjdG9yeSA/IGlmIHNvLCBrZnJlZSgpIGFzc29jaWF0ZWQgY2dyb3VwICovCkBAIC04NTYsNyArODQzLDcgQEAKIAkJICovCiAJCUJVR19PTighbGlzdF9lbXB0eSgmY2dycC0+cGlkbGlzdHMpKTsKIAotCQljYWxsX3JjdSgmY2dycC0+cmN1X2hlYWQsIGZyZWVfY2dyb3VwX3JjdSk7CisJCWtmcmVlX3JjdShjZ3JwLCByY3VfaGVhZCk7CiAJfQogCWlwdXQoaW5vZGUpOwogfQpAQCAtNDYyMywxNCArNDYxMCw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgX19mcmVlX2Nzc19pZF9jYihzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCi17Ci0Jc3RydWN0IGNzc19pZCAqaWQ7Ci0KLQlpZCA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgY3NzX2lkLCByY3VfaGVhZCk7Ci0Ja2ZyZWUoaWQpOwotfQotCiB2b2lkIGZyZWVfY3NzX2lkKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywgc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcykKIHsKIAlzdHJ1Y3QgY3NzX2lkICppZCA9IGNzcy0+aWQ7CkBAIC00NjQ1LDcgKzQ2MjQsNyBAQAogCXNwaW5fbG9jaygmc3MtPmlkX2xvY2spOwogCWlkcl9yZW1vdmUoJnNzLT5pZHIsIGlkLT5pZCk7CiAJc3Bpbl91bmxvY2soJnNzLT5pZF9sb2NrKTsKLQljYWxsX3JjdSgmaWQtPnJjdV9oZWFkLCBfX2ZyZWVfY3NzX2lkX2NiKTsKKwlrZnJlZV9yY3UoaWQsIHJjdV9oZWFkKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGZyZWVfY3NzX2lkKTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL2NwdXNldC5jIGIva2VybmVsL2NwdXNldC5jCmluZGV4IDMzZWVlMTYuLjJiYjhjMmUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jcHVzZXQuYworKysgYi9rZXJuZWwvY3B1c2V0LmMKQEAgLTExNTksNyArMTE1OSw3IEBACiBzdGF0aWMgaW50IHVwZGF0ZV9yZWxheF9kb21haW5fbGV2ZWwoc3RydWN0IGNwdXNldCAqY3MsIHM2NCB2YWwpCiB7CiAjaWZkZWYgQ09ORklHX1NNUAotCWlmICh2YWwgPCAtMSB8fCB2YWwgPj0gU0RfTFZfTUFYKQorCWlmICh2YWwgPCAtMSB8fCB2YWwgPj0gc2NoZWRfZG9tYWluX2xldmVsX21heCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEva2VybmVsL2V2ZW50cy9NYWtlZmlsZSBiL2tlcm5lbC9ldmVudHMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNlMjNkMwotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC9ldmVudHMvTWFrZWZpbGUKQEAgLTAsMCArMSw2IEBACitpZmRlZiBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSCitDRkxBR1NfUkVNT1ZFX2NvcmUubyA9IC1wZworZW5kaWYKKworb2JqLXkgOj0gY29yZS5vCitvYmotJChDT05GSUdfSEFWRV9IV19CUkVBS1BPSU5UKSArPSBod19icmVha3BvaW50Lm8KZGlmZiAtLWdpdCBhL2tlcm5lbC9wZXJmX2V2ZW50LmMgYi9rZXJuZWwvZXZlbnRzL2NvcmUuYwpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBrZXJuZWwvcGVyZl9ldmVudC5jCnJlbmFtZSB0byBrZXJuZWwvZXZlbnRzL2NvcmUuYwppbmRleCA4ZTgxYTk4Li5jMDk3NjdmIDEwMDY0NAotLS0gYS9rZXJuZWwvcGVyZl9ldmVudC5jCisrKyBiL2tlcm5lbC9ldmVudHMvY29yZS5jCkBAIC0yLDggKzIsOCBAQAogICogUGVyZm9ybWFuY2UgZXZlbnRzIGNvcmUgY29kZToKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA4IFRob21hcyBHbGVpeG5lciA8dGdseEBsaW51dHJvbml4LmRlPgotICogIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgUmVkIEhhdCwgSW5jLiwgUGV0ZXIgWmlqbHN0cmEgPHB6aWpsc3RyQHJlZGhhdC5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgUmVkIEhhdCwgSW5jLiwgSW5nbyBNb2xuYXIKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBSZWQgSGF0LCBJbmMuLCBQZXRlciBaaWpsc3RyYSA8cHppamxzdHJAcmVkaGF0LmNvbT4KICAqICBDb3B5cmlnaHQgIKkgIDIwMDkgUGF1bCBNYWNrZXJyYXMsIElCTSBDb3JwLiA8cGF1bHVzQGF1MS5pYm0uY29tPgogICoKICAqIEZvciBsaWNlbnNpbmcgZGV0YWlscyBzZWUga2VybmVsLWJhc2UvQ09QWUlORwpAQCAtMzksMTAgKzM5LDEwIEBACiAjaW5jbHVkZSA8YXNtL2lycV9yZWdzLmg+CiAKIHN0cnVjdCByZW1vdGVfZnVuY3Rpb25fY2FsbCB7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICpwOwotCWludCAoKmZ1bmMpKHZvaWQgKmluZm8pOwotCXZvaWQgKmluZm87Ci0JaW50IHJldDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnA7CisJaW50CQkJKCpmdW5jKSh2b2lkICppbmZvKTsKKwl2b2lkCQkJKmluZm87CisJaW50CQkJcmV0OwogfTsKIAogc3RhdGljIHZvaWQgcmVtb3RlX2Z1bmN0aW9uKHZvaWQgKmRhdGEpCkBAIC03NiwxMCArNzYsMTAgQEAKIHRhc2tfZnVuY3Rpb25fY2FsbChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCAoKmZ1bmMpICh2b2lkICppbmZvKSwgdm9pZCAqaW5mbykKIHsKIAlzdHJ1Y3QgcmVtb3RlX2Z1bmN0aW9uX2NhbGwgZGF0YSA9IHsKLQkJLnAgPSBwLAotCQkuZnVuYyA9IGZ1bmMsCi0JCS5pbmZvID0gaW5mbywKLQkJLnJldCA9IC1FU1JDSCwgLyogTm8gc3VjaCAocnVubmluZykgcHJvY2VzcyAqLworCQkucAk9IHAsCisJCS5mdW5jCT0gZnVuYywKKwkJLmluZm8JPSBpbmZvLAorCQkucmV0CT0gLUVTUkNILCAvKiBObyBzdWNoIChydW5uaW5nKSBwcm9jZXNzICovCiAJfTsKIAogCWlmICh0YXNrX2N1cnIocCkpCkBAIC0xMDAsMTAgKzEwMCwxMCBAQAogc3RhdGljIGludCBjcHVfZnVuY3Rpb25fY2FsbChpbnQgY3B1LCBpbnQgKCpmdW5jKSAodm9pZCAqaW5mbyksIHZvaWQgKmluZm8pCiB7CiAJc3RydWN0IHJlbW90ZV9mdW5jdGlvbl9jYWxsIGRhdGEgPSB7Ci0JCS5wID0gTlVMTCwKLQkJLmZ1bmMgPSBmdW5jLAotCQkuaW5mbyA9IGluZm8sCi0JCS5yZXQgPSAtRU5YSU8sIC8qIE5vIHN1Y2ggQ1BVICovCisJCS5wCT0gTlVMTCwKKwkJLmZ1bmMJPSBmdW5jLAorCQkuaW5mbwk9IGluZm8sCisJCS5yZXQJPSAtRU5YSU8sIC8qIE5vIHN1Y2ggQ1BVICovCiAJfTsKIAogCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIHJlbW90ZV9mdW5jdGlvbiwgJmRhdGEsIDEpOwpAQCAtMTI1LDcgKzEyNSw3IEBACiAgKiBwZXJmX3NjaGVkX2V2ZW50cyA6ID4wIGV2ZW50cyBleGlzdAogICogcGVyZl9jZ3JvdXBfZXZlbnRzOiA+MCBwZXItY3B1IGNncm91cCBldmVudHMgZXhpc3Qgb24gdGhpcyBjcHUKICAqLwotYXRvbWljX3QgcGVyZl9zY2hlZF9ldmVudHMgX19yZWFkX21vc3RseTsKK3N0cnVjdCBqdW1wX2xhYmVsX2tleSBwZXJmX3NjaGVkX2V2ZW50cyBfX3JlYWRfbW9zdGx5Owogc3RhdGljIERFRklORV9QRVJfQ1BVKGF0b21pY190LCBwZXJmX2Nncm91cF9ldmVudHMpOwogCiBzdGF0aWMgYXRvbWljX3QgbnJfbW1hcF9ldmVudHMgX19yZWFkX21vc3RseTsKQEAgLTU4NiwxNCArNTg2LDYgQEAKIAlXQVJOX09OKCFhdG9taWNfaW5jX25vdF96ZXJvKCZjdHgtPnJlZmNvdW50KSk7CiB9CiAKLXN0YXRpYyB2b2lkIGZyZWVfY3R4KHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKLXsKLQlzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHg7Ci0KLQljdHggPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCwgcmN1X2hlYWQpOwotCWtmcmVlKGN0eCk7Ci19Ci0KIHN0YXRpYyB2b2lkIHB1dF9jdHgoc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY3R4KQogewogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjdHgtPnJlZmNvdW50KSkgewpAQCAtNjAxLDcgKzU5Myw3IEBACiAJCQlwdXRfY3R4KGN0eC0+cGFyZW50X2N0eCk7CiAJCWlmIChjdHgtPnRhc2spCiAJCQlwdXRfdGFza19zdHJ1Y3QoY3R4LT50YXNrKTsKLQkJY2FsbF9yY3UoJmN0eC0+cmN1X2hlYWQsIGZyZWVfY3R4KTsKKwkJa2ZyZWVfcmN1KGN0eCwgcmN1X2hlYWQpOwogCX0KIH0KIApAQCAtNTMzMSwxNCArNTMyMyw2IEBACiAJCQkJCSBsb2NrZGVwX2lzX2hlbGQoJnN3aGFzaC0+aGxpc3RfbXV0ZXgpKTsKIH0KIAotc3RhdGljIHZvaWQgc3dldmVudF9obGlzdF9yZWxlYXNlX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKnJjdV9oZWFkKQotewotCXN0cnVjdCBzd2V2ZW50X2hsaXN0ICpobGlzdDsKLQotCWhsaXN0ID0gY29udGFpbmVyX29mKHJjdV9oZWFkLCBzdHJ1Y3Qgc3dldmVudF9obGlzdCwgcmN1X2hlYWQpOwotCWtmcmVlKGhsaXN0KTsKLX0KLQogc3RhdGljIHZvaWQgc3dldmVudF9obGlzdF9yZWxlYXNlKHN0cnVjdCBzd2V2ZW50X2h0YWJsZSAqc3doYXNoKQogewogCXN0cnVjdCBzd2V2ZW50X2hsaXN0ICpobGlzdCA9IHN3ZXZlbnRfaGxpc3RfZGVyZWYoc3doYXNoKTsKQEAgLTUzNDcsNyArNTMzMSw3IEBACiAJCXJldHVybjsKIAogCXJjdV9hc3NpZ25fcG9pbnRlcihzd2hhc2gtPnN3ZXZlbnRfaGxpc3QsIE5VTEwpOwotCWNhbGxfcmN1KCZobGlzdC0+cmN1X2hlYWQsIHN3ZXZlbnRfaGxpc3RfcmVsZWFzZV9yY3UpOworCWtmcmVlX3JjdShobGlzdCwgcmN1X2hlYWQpOwogfQogCiBzdGF0aWMgdm9pZCBzd2V2ZW50X2hsaXN0X3B1dF9jcHUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgY3B1KQpAQCAtNTQyOSw3ICs1NDEzLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1hdG9taWNfdCBwZXJmX3N3ZXZlbnRfZW5hYmxlZFtQRVJGX0NPVU5UX1NXX01BWF07CitzdHJ1Y3QganVtcF9sYWJlbF9rZXkgcGVyZl9zd2V2ZW50X2VuYWJsZWRbUEVSRl9DT1VOVF9TV19NQVhdOwogCiBzdGF0aWMgdm9pZCBzd19wZXJmX2V2ZW50X2Rlc3Ryb3koc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewpAQCAtNzQ0NSwxMSArNzQyOSwxMSBAQAogfQogCiBzdHJ1Y3QgY2dyb3VwX3N1YnN5cyBwZXJmX3N1YnN5cyA9IHsKLQkubmFtZSA9ICJwZXJmX2V2ZW50IiwKLQkuc3Vic3lzX2lkID0gcGVyZl9zdWJzeXNfaWQsCi0JLmNyZWF0ZSA9IHBlcmZfY2dyb3VwX2NyZWF0ZSwKLQkuZGVzdHJveSA9IHBlcmZfY2dyb3VwX2Rlc3Ryb3ksCi0JLmV4aXQgPSBwZXJmX2Nncm91cF9leGl0LAotCS5hdHRhY2ggPSBwZXJmX2Nncm91cF9hdHRhY2gsCisJLm5hbWUJCT0gInBlcmZfZXZlbnQiLAorCS5zdWJzeXNfaWQJPSBwZXJmX3N1YnN5c19pZCwKKwkuY3JlYXRlCQk9IHBlcmZfY2dyb3VwX2NyZWF0ZSwKKwkuZGVzdHJveQk9IHBlcmZfY2dyb3VwX2Rlc3Ryb3ksCisJLmV4aXQJCT0gcGVyZl9jZ3JvdXBfZXhpdCwKKwkuYXR0YWNoCQk9IHBlcmZfY2dyb3VwX2F0dGFjaCwKIH07CiAjZW5kaWYgLyogQ09ORklHX0NHUk9VUF9QRVJGICovCmRpZmYgLS1naXQgYS9rZXJuZWwvaHdfYnJlYWtwb2ludC5jIGIva2VybmVsL2V2ZW50cy9od19icmVha3BvaW50LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGtlcm5lbC9od19icmVha3BvaW50LmMKcmVuYW1lIHRvIGtlcm5lbC9ldmVudHMvaHdfYnJlYWtwb2ludC5jCmRpZmYgLS1naXQgYS9rZXJuZWwvZXh0YWJsZS5jIGIva2VybmVsL2V4dGFibGUuYwppbmRleCA3ZjhmMjYzLi5jMmQ2MjVmIDEwMDY0NAotLS0gYS9rZXJuZWwvZXh0YWJsZS5jCisrKyBiL2tlcm5lbC9leHRhYmxlLmMKQEAgLTcyLDYgKzcyLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCBjb3JlX2tlcm5lbF9kYXRhKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlpZiAoYWRkciA+PSAodW5zaWduZWQgbG9uZylfc2RhdGEgJiYKKwkgICAgYWRkciA8ICh1bnNpZ25lZCBsb25nKV9lZGF0YSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKIGludCBfX2tlcm5lbF90ZXh0X2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyKQogewogCWlmIChjb3JlX2tlcm5lbF90ZXh0KGFkZHIpKQpkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggZTc1NDhkZS4uMmI0NGQ4MiAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYworKysgYi9rZXJuZWwvZm9yay5jCkBAIC0xMTAzLDcgKzExMDMsNiBAQAogCiAJcG9zaXhfY3B1X3RpbWVyc19pbml0KHApOwogCi0JcC0+bG9ja19kZXB0aCA9IC0xOwkJLyogLTEgPSBubyBsb2NrICovCiAJZG9fcG9zaXhfY2xvY2tfbW9ub3RvbmljX2dldHRpbWUoJnAtPnN0YXJ0X3RpbWUpOwogCXAtPnJlYWxfc3RhcnRfdGltZSA9IHAtPnN0YXJ0X3RpbWU7CiAJbW9ub3RvbmljX3RvX2Jvb3RiYXNlZCgmcC0+cmVhbF9zdGFydF90aW1lKTsKQEAgLTExNTMsNyArMTE1Miw3IEBACiAjZW5kaWYKIAogCS8qIFBlcmZvcm0gc2NoZWR1bGVyIHJlbGF0ZWQgc2V0dXAuIEFzc2lnbiB0aGlzIHRhc2sgdG8gYSBDUFUuICovCi0Jc2NoZWRfZm9yayhwLCBjbG9uZV9mbGFncyk7CisJc2NoZWRfZm9yayhwKTsKIAogCXJldHZhbCA9IHBlcmZfZXZlbnRfaW5pdF90YXNrKHApOwogCWlmIChyZXR2YWwpCkBAIC0xNDY0LDcgKzE0NjMsNyBAQAogCQkgKi8KIAkJcC0+ZmxhZ3MgJj0gflBGX1NUQVJUSU5HOwogCi0JCXdha2VfdXBfbmV3X3Rhc2socCwgY2xvbmVfZmxhZ3MpOworCQl3YWtlX3VwX25ld190YXNrKHApOwogCiAJCXRyYWNlaG9va19yZXBvcnRfY2xvbmVfY29tcGxldGUodHJhY2UsIHJlZ3MsCiAJCQkJCQljbG9uZV9mbGFncywgbnIsIHApOwpkaWZmIC0tZ2l0IGEva2VybmVsL2ZyZWV6ZXIuYyBiL2tlcm5lbC9mcmVlemVyLmMKaW5kZXggNjZlY2QyZS4uN2IwMWRlOTggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mcmVlemVyLmMKKysrIGIva2VybmVsL2ZyZWV6ZXIuYwpAQCAtMTcsNyArMTcsNyBAQAogewogCWlmICghdW5saWtlbHkoY3VycmVudC0+ZmxhZ3MgJiBQRl9OT0ZSRUVaRSkpIHsKIAkJY3VycmVudC0+ZmxhZ3MgfD0gUEZfRlJPWkVOOwotCQl3bWIoKTsKKwkJc21wX3dtYigpOwogCX0KIAljbGVhcl9mcmVlemVfZmxhZyhjdXJyZW50KTsKIH0KQEAgLTkzLDcgKzkzLDcgQEAKIAkgKiB0aGUgdGFzayBhcyBmcm96ZW4gYW5kIG5leHQgY2xlYXJzIGl0cyBUSUZfRlJFRVpFLgogCSAqLwogCWlmICghZnJlZXppbmcocCkpIHsKLQkJcm1iKCk7CisJCXNtcF9ybWIoKTsKIAkJaWYgKGZyb3plbihwKSkKIAkJCXJldHVybiBmYWxzZTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL2hydGltZXIuYyBiL2tlcm5lbC9ocnRpbWVyLmMKaW5kZXggODdmZGIzZi4uZGJiYmY3ZCAxMDA2NDQKLS0tIGEva2VybmVsL2hydGltZXIuYworKysgYi9rZXJuZWwvaHJ0aW1lci5jCkBAIC04MSw3ICs4MSw3IEBACiAJfQogfTsKIAotc3RhdGljIGludCBocnRpbWVyX2Nsb2NrX3RvX2Jhc2VfdGFibGVbTUFYX0NMT0NLU10gPSB7CitzdGF0aWMgY29uc3QgaW50IGhydGltZXJfY2xvY2tfdG9fYmFzZV90YWJsZVtNQVhfQ0xPQ0tTXSA9IHsKIAlbQ0xPQ0tfUkVBTFRJTUVdCT0gSFJUSU1FUl9CQVNFX1JFQUxUSU1FLAogCVtDTE9DS19NT05PVE9OSUNdCT0gSFJUSU1FUl9CQVNFX01PTk9UT05JQywKIAlbQ0xPQ0tfQk9PVFRJTUVdCT0gSFJUSU1FUl9CQVNFX0JPT1RUSU1FLApkaWZmIC0tZ2l0IGEva2VybmVsL2h1bmdfdGFzay5jIGIva2VybmVsL2h1bmdfdGFzay5jCmluZGV4IDUzZWFkMTcuLmVhNjQwMTIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9odW5nX3Rhc2suYworKysgYi9rZXJuZWwvaHVuZ190YXNrLmMKQEAgLTMzLDcgKzMzLDcgQEAKIC8qCiAgKiBaZXJvIG1lYW5zIGluZmluaXRlIHRpbWVvdXQgLSBubyBjaGVja2luZyBkb25lOgogICovCi11bnNpZ25lZCBsb25nIF9fcmVhZF9tb3N0bHkgc3lzY3RsX2h1bmdfdGFza190aW1lb3V0X3NlY3MgPSAxMjA7Cit1bnNpZ25lZCBsb25nIF9fcmVhZF9tb3N0bHkgc3lzY3RsX2h1bmdfdGFza190aW1lb3V0X3NlY3MgPSBDT05GSUdfREVGQVVMVF9IVU5HX1RBU0tfVElNRU9VVDsKIAogdW5zaWduZWQgbG9uZyBfX3JlYWRfbW9zdGx5IHN5c2N0bF9odW5nX3Rhc2tfd2FybmluZ3MgPSAxMDsKIApkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9LY29uZmlnIGIva2VybmVsL2lycS9LY29uZmlnCmluZGV4IGM1NzRmOWEuLmQxZDA1MWIzIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL0tjb25maWcKKysrIGIva2VybmVsL2lycS9LY29uZmlnCkBAIC00OCw2ICs0OCwxMCBAQAogY29uZmlnIElSUV9FREdFX0VPSV9IQU5ETEVSCiAgICAgICAgYm9vbAogCisjIEdlbmVyaWMgY29uZmlndXJhYmxlIGludGVycnVwdCBjaGlwIGltcGxlbWVudGF0aW9uCitjb25maWcgR0VORVJJQ19JUlFfQ0hJUAorICAgICAgIGJvb2wKKwogIyBTdXBwb3J0IGZvcmNlZCBpcnEgdGhyZWFkaW5nCiBjb25maWcgSVJRX0ZPUkNFRF9USFJFQURJTkcKICAgICAgICBib29sCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL01ha2VmaWxlIGIva2VybmVsL2lycS9NYWtlZmlsZQppbmRleCA1NDMyOWNkLi43MzI5MDA1IDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL01ha2VmaWxlCisrKyBiL2tlcm5lbC9pcnEvTWFrZWZpbGUKQEAgLTEsNSArMSw2IEBACiAKIG9iai15IDo9IGlycWRlc2MubyBoYW5kbGUubyBtYW5hZ2UubyBzcHVyaW91cy5vIHJlc2VuZC5vIGNoaXAubyBkdW1teWNoaXAubyBkZXZyZXMubworb2JqLSQoQ09ORklHX0dFTkVSSUNfSVJRX0NISVApICs9IGdlbmVyaWMtY2hpcC5vCiBvYmotJChDT05GSUdfR0VORVJJQ19JUlFfUFJPQkUpICs9IGF1dG9wcm9iZS5vCiBvYmotJChDT05GSUdfUFJPQ19GUykgKz0gcHJvYy5vCiBvYmotJChDT05GSUdfR0VORVJJQ19QRU5ESU5HX0lSUSkgKz0gbWlncmF0aW9uLm8KZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvY2hpcC5jIGIva2VybmVsL2lycS9jaGlwLmMKaW5kZXggNGFmMWUyYi4uZDVhMzAwOSAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9jaGlwLmMKKysrIGIva2VybmVsL2lycS9jaGlwLmMKQEAgLTMxMCw2ICszMTAsNyBAQAogb3V0X3VubG9jazoKIAlyYXdfc3Bpbl91bmxvY2soJmRlc2MtPmxvY2spOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoaGFuZGxlX3NpbXBsZV9pcnEpOwogCiAvKioKICAqCWhhbmRsZV9sZXZlbF9pcnEgLSBMZXZlbCB0eXBlIGlycSBoYW5kbGVyCkBAIC01NzMsNiArNTc0LDcgQEAKIAlpZiAoaGFuZGxlICE9IGhhbmRsZV9iYWRfaXJxICYmIGlzX2NoYWluZWQpIHsKIAkJaXJxX3NldHRpbmdzX3NldF9ub3Byb2JlKGRlc2MpOwogCQlpcnFfc2V0dGluZ3Nfc2V0X25vcmVxdWVzdChkZXNjKTsKKwkJaXJxX3NldHRpbmdzX3NldF9ub3RocmVhZChkZXNjKTsKIAkJaXJxX3N0YXJ0dXAoZGVzYyk7CiAJfQogb3V0OgpAQCAtNjEyLDYgKzYxNCw3IEBACiAKIAlpcnFfcHV0X2Rlc2NfdW5sb2NrKGRlc2MsIGZsYWdzKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGlycV9tb2RpZnlfc3RhdHVzKTsKIAogLyoqCiAgKglpcnFfY3B1X29ubGluZSAtIEludm9rZSBhbGwgaXJxX2NwdV9vbmxpbmUgZnVuY3Rpb25zLgpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9kZWJ1Zy5oIGIva2VybmVsL2lycS9kZWJ1Zy5oCmluZGV4IDMwNmNiYTMuLjk3YThiZmEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvZGVidWcuaAorKysgYi9rZXJuZWwvaXJxL2RlYnVnLmgKQEAgLTI3LDYgKzI3LDcgQEAKIAlQKElSUV9QRVJfQ1BVKTsKIAlQKElSUV9OT1BST0JFKTsKIAlQKElSUV9OT1JFUVVFU1QpOworCVAoSVJRX05PVEhSRUFEKTsKIAlQKElSUV9OT0FVVE9FTik7CiAKIAlQUyhJUlFTX0FVVE9ERVRFQ1QpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9nZW5lcmljLWNoaXAuYyBiL2tlcm5lbC9pcnEvZ2VuZXJpYy1jaGlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFhOWRiNwotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC9pcnEvZ2VuZXJpYy1jaGlwLmMKQEAgLTAsMCArMSwzNTQgQEAKKy8qCisgKiBMaWJyYXJ5IGltcGxlbWVudGluZyB0aGUgbW9zdCBjb21tb24gaXJxIGNoaXAgY2FsbGJhY2sgZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExLCBUaG9tYXMgR2xlaXhuZXIKKyAqLworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KKworI2luY2x1ZGUgImludGVybmFscy5oIgorCitzdGF0aWMgTElTVF9IRUFEKGdjX2xpc3QpOworc3RhdGljIERFRklORV9SQVdfU1BJTkxPQ0soZ2NfbG9jayk7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlycV9jaGlwX3JlZ3MgKmN1cl9yZWdzKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlyZXR1cm4gJmNvbnRhaW5lcl9vZihkLT5jaGlwLCBzdHJ1Y3QgaXJxX2NoaXBfdHlwZSwgY2hpcCktPnJlZ3M7Cit9CisKKy8qKgorICogaXJxX2djX25vb3AgLSBOT09QIGZ1bmN0aW9uCisgKiBAZDogaXJxX2RhdGEKKyAqLwordm9pZCBpcnFfZ2Nfbm9vcChzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7Cit9CisKKy8qKgorICogaXJxX2djX21hc2tfZGlzYWJsZV9yZWcgLSBNYXNrIGNoaXAgdmlhIGRpc2FibGUgcmVnaXN0ZXIKKyAqIEBkOiBpcnFfZGF0YQorICoKKyAqIENoaXAgaGFzIHNlcGFyYXRlIGVuYWJsZS9kaXNhYmxlIHJlZ2lzdGVycyBpbnN0ZWFkIG9mIGEgc2luZ2xlIG1hc2sKKyAqIHJlZ2lzdGVyLgorICovCit2b2lkIGlycV9nY19tYXNrX2Rpc2FibGVfcmVnKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwl1MzIgbWFzayA9IDEgPDwgKGQtPmlycSAtIGdjLT5pcnFfYmFzZSk7CisKKwlpcnFfZ2NfbG9jayhnYyk7CisJaXJxX3JlZ193cml0ZWwobWFzaywgZ2MtPnJlZ19iYXNlICsgY3VyX3JlZ3MoZCktPmRpc2FibGUpOworCWdjLT5tYXNrX2NhY2hlICY9IH5tYXNrOworCWlycV9nY191bmxvY2soZ2MpOworfQorCisvKioKKyAqIGlycV9nY19tYXNrX3NldF9tYXNrX2JpdCAtIE1hc2sgY2hpcCB2aWEgc2V0dGluZyBiaXQgaW4gbWFzayByZWdpc3RlcgorICogQGQ6IGlycV9kYXRhCisgKgorICogQ2hpcCBoYXMgYSBzaW5nbGUgbWFzayByZWdpc3Rlci4gVmFsdWVzIG9mIHRoaXMgcmVnaXN0ZXIgYXJlIGNhY2hlZAorICogYW5kIHByb3RlY3RlZCBieSBnYy0+bG9jaworICovCit2b2lkIGlycV9nY19tYXNrX3NldF9iaXQoc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXUzMiBtYXNrID0gMSA8PCAoZC0+aXJxIC0gZ2MtPmlycV9iYXNlKTsKKworCWlycV9nY19sb2NrKGdjKTsKKwlnYy0+bWFza19jYWNoZSB8PSBtYXNrOworCWlycV9yZWdfd3JpdGVsKGdjLT5tYXNrX2NhY2hlLCBnYy0+cmVnX2Jhc2UgKyBjdXJfcmVncyhkKS0+bWFzayk7CisJaXJxX2djX3VubG9jayhnYyk7Cit9CisKKy8qKgorICogaXJxX2djX21hc2tfc2V0X21hc2tfYml0IC0gTWFzayBjaGlwIHZpYSBjbGVhcmluZyBiaXQgaW4gbWFzayByZWdpc3RlcgorICogQGQ6IGlycV9kYXRhCisgKgorICogQ2hpcCBoYXMgYSBzaW5nbGUgbWFzayByZWdpc3Rlci4gVmFsdWVzIG9mIHRoaXMgcmVnaXN0ZXIgYXJlIGNhY2hlZAorICogYW5kIHByb3RlY3RlZCBieSBnYy0+bG9jaworICovCit2b2lkIGlycV9nY19tYXNrX2Nscl9iaXQoc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXUzMiBtYXNrID0gMSA8PCAoZC0+aXJxIC0gZ2MtPmlycV9iYXNlKTsKKworCWlycV9nY19sb2NrKGdjKTsKKwlnYy0+bWFza19jYWNoZSAmPSB+bWFzazsKKwlpcnFfcmVnX3dyaXRlbChnYy0+bWFza19jYWNoZSwgZ2MtPnJlZ19iYXNlICsgY3VyX3JlZ3MoZCktPm1hc2spOworCWlycV9nY191bmxvY2soZ2MpOworfQorCisvKioKKyAqIGlycV9nY191bm1hc2tfZW5hYmxlX3JlZyAtIFVubWFzayBjaGlwIHZpYSBlbmFibGUgcmVnaXN0ZXIKKyAqIEBkOiBpcnFfZGF0YQorICoKKyAqIENoaXAgaGFzIHNlcGFyYXRlIGVuYWJsZS9kaXNhYmxlIHJlZ2lzdGVycyBpbnN0ZWFkIG9mIGEgc2luZ2xlIG1hc2sKKyAqIHJlZ2lzdGVyLgorICovCit2b2lkIGlycV9nY191bm1hc2tfZW5hYmxlX3JlZyhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJdTMyIG1hc2sgPSAxIDw8IChkLT5pcnEgLSBnYy0+aXJxX2Jhc2UpOworCisJaXJxX2djX2xvY2soZ2MpOworCWlycV9yZWdfd3JpdGVsKG1hc2ssIGdjLT5yZWdfYmFzZSArIGN1cl9yZWdzKGQpLT5lbmFibGUpOworCWdjLT5tYXNrX2NhY2hlIHw9IG1hc2s7CisJaXJxX2djX3VubG9jayhnYyk7Cit9CisKKy8qKgorICogaXJxX2djX2FjayAtIEFjayBwZW5kaW5nIGludGVycnVwdAorICogQGQ6IGlycV9kYXRhCisgKi8KK3ZvaWQgaXJxX2djX2FjayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJdTMyIG1hc2sgPSAxIDw8IChkLT5pcnEgLSBnYy0+aXJxX2Jhc2UpOworCisJaXJxX2djX2xvY2soZ2MpOworCWlycV9yZWdfd3JpdGVsKG1hc2ssIGdjLT5yZWdfYmFzZSArIGN1cl9yZWdzKGQpLT5hY2spOworCWlycV9nY191bmxvY2soZ2MpOworfQorCisvKioKKyAqIGlycV9nY19tYXNrX2Rpc2FibGVfcmVnX2FuZF9hY2stIE1hc2sgYW5kIGFjayBwZW5kaW5nIGludGVycnVwdAorICogQGQ6IGlycV9kYXRhCisgKi8KK3ZvaWQgaXJxX2djX21hc2tfZGlzYWJsZV9yZWdfYW5kX2FjayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJdTMyIG1hc2sgPSAxIDw8IChkLT5pcnEgLSBnYy0+aXJxX2Jhc2UpOworCisJaXJxX2djX2xvY2soZ2MpOworCWlycV9yZWdfd3JpdGVsKG1hc2ssIGdjLT5yZWdfYmFzZSArIGN1cl9yZWdzKGQpLT5tYXNrKTsKKwlpcnFfcmVnX3dyaXRlbChtYXNrLCBnYy0+cmVnX2Jhc2UgKyBjdXJfcmVncyhkKS0+YWNrKTsKKwlpcnFfZ2NfdW5sb2NrKGdjKTsKK30KKworLyoqCisgKiBpcnFfZ2NfZW9pIC0gRU9JIGludGVycnVwdAorICogQGQ6IGlycV9kYXRhCisgKi8KK3ZvaWQgaXJxX2djX2VvaShzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJdTMyIG1hc2sgPSAxIDw8IChkLT5pcnEgLSBnYy0+aXJxX2Jhc2UpOworCisJaXJxX2djX2xvY2soZ2MpOworCWlycV9yZWdfd3JpdGVsKG1hc2ssIGdjLT5yZWdfYmFzZSArIGN1cl9yZWdzKGQpLT5lb2kpOworCWlycV9nY191bmxvY2soZ2MpOworfQorCisvKioKKyAqIGlycV9nY19zZXRfd2FrZSAtIFNldC9jbHIgd2FrZSBiaXQgZm9yIGFuIGludGVycnVwdAorICogQGQ6IGlycV9kYXRhCisgKgorICogRm9yIGNoaXBzIHdoZXJlIHRoZSB3YWtlIGZyb20gc3VzcGVuZCBmdW5jdGlvbmFsaXR5IGlzIG5vdAorICogY29uZmlndXJlZCBpbiBhIHNlcGFyYXRlIHJlZ2lzdGVyIGFuZCB0aGUgd2FrZXVwIGFjdGl2ZSBzdGF0ZSBpcworICoganVzdCBzdG9yZWQgaW4gYSBiaXRtYXNrLgorICovCitpbnQgaXJxX2djX3NldF93YWtlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IG9uKQoreworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXUzMiBtYXNrID0gMSA8PCAoZC0+aXJxIC0gZ2MtPmlycV9iYXNlKTsKKworCWlmICghKG1hc2sgJiBnYy0+d2FrZV9lbmFibGVkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpcnFfZ2NfbG9jayhnYyk7CisJaWYgKG9uKQorCQlnYy0+d2FrZV9hY3RpdmUgfD0gbWFzazsKKwllbHNlCisJCWdjLT53YWtlX2FjdGl2ZSAmPSB+bWFzazsKKwlpcnFfZ2NfdW5sb2NrKGdjKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpcnFfYWxsb2NfZ2VuZXJpY19jaGlwIC0gQWxsb2NhdGUgYSBnZW5lcmljIGNoaXAgYW5kIGluaXRpYWxpemUgaXQKKyAqIEBuYW1lOglOYW1lIG9mIHRoZSBpcnEgY2hpcAorICogQG51bV9jdDoJTnVtYmVyIG9mIGlycV9jaGlwX3R5cGUgaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgKiBAaXJxX2Jhc2U6CUludGVycnVwdCBiYXNlIG5yIGZvciB0aGlzIGNoaXAKKyAqIEByZWdfYmFzZToJUmVnaXN0ZXIgYmFzZSBhZGRyZXNzICh2aXJ0dWFsKQorICogQGhhbmRsZXI6CURlZmF1bHQgZmxvdyBoYW5kbGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNoaXAKKyAqCisgKiBSZXR1cm5zIGFuIGluaXRpYWxpemVkIGlycV9jaGlwX2dlbmVyaWMgc3RydWN0dXJlLiBUaGUgY2hpcCBkZWZhdWx0cworICogdG8gdGhlIHByaW1hcnkgKGluZGV4IDApIGlycV9jaGlwX3R5cGUgYW5kIEBoYW5kbGVyCisgKi8KK3N0cnVjdCBpcnFfY2hpcF9nZW5lcmljICoKK2lycV9hbGxvY19nZW5lcmljX2NoaXAoY29uc3QgY2hhciAqbmFtZSwgaW50IG51bV9jdCwgdW5zaWduZWQgaW50IGlycV9iYXNlLAorCQkgICAgICAgdm9pZCBfX2lvbWVtICpyZWdfYmFzZSwgaXJxX2Zsb3dfaGFuZGxlcl90IGhhbmRsZXIpCit7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjOworCXVuc2lnbmVkIGxvbmcgc3ogPSBzaXplb2YoKmdjKSArIG51bV9jdCAqIHNpemVvZihzdHJ1Y3QgaXJxX2NoaXBfdHlwZSk7CisKKwlnYyA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOworCWlmIChnYykgeworCQlyYXdfc3Bpbl9sb2NrX2luaXQoJmdjLT5sb2NrKTsKKwkJZ2MtPm51bV9jdCA9IG51bV9jdDsKKwkJZ2MtPmlycV9iYXNlID0gaXJxX2Jhc2U7CisJCWdjLT5yZWdfYmFzZSA9IHJlZ19iYXNlOworCQlnYy0+Y2hpcF90eXBlcy0+Y2hpcC5uYW1lID0gbmFtZTsKKwkJZ2MtPmNoaXBfdHlwZXMtPmhhbmRsZXIgPSBoYW5kbGVyOworCX0KKwlyZXR1cm4gZ2M7Cit9CisKKy8qCisgKiBTZXBhcmF0ZSBsb2NrZGVwIGNsYXNzIGZvciBpbnRlcnJ1cHQgY2hpcCB3aGljaCBjYW4gbmVzdCBpcnFfZGVzYworICogbG9jay4KKyAqLworc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBpcnFfbmVzdGVkX2xvY2tfY2xhc3M7CisKKy8qKgorICogaXJxX3NldHVwX2dlbmVyaWNfY2hpcCAtIFNldHVwIGEgcmFuZ2Ugb2YgaW50ZXJydXB0cyB3aXRoIGEgZ2VuZXJpYyBjaGlwCisgKiBAZ2M6CQlHZW5lcmljIGlycSBjaGlwIGhvbGRpbmcgYWxsIGRhdGEKKyAqIEBtc2s6CUJpdG1hc2sgaG9sZGluZyB0aGUgaXJxcyB0byBpbml0aWFsaXplIHJlbGF0aXZlIHRvIGdjLT5pcnFfYmFzZQorICogQGZsYWdzOglGbGFncyBmb3IgaW5pdGlhbGl6YXRpb24KKyAqIEBjbHI6CUlSUV8qIGJpdHMgdG8gY2xlYXIKKyAqIEBzZXQ6CUlSUV8qIGJpdHMgdG8gc2V0CisgKgorICogU2V0IHVwIG1heC4gMzIgaW50ZXJydXB0cyBzdGFydGluZyBmcm9tIGdjLT5pcnFfYmFzZS4gTm90ZSwgdGhpcworICogaW5pdGlhbGl6ZXMgYWxsIGludGVycnVwdHMgdG8gdGhlIHByaW1hcnkgaXJxX2NoaXBfdHlwZSBhbmQgaXRzCisgKiBhc3NvY2lhdGVkIGhhbmRsZXIuCisgKi8KK3ZvaWQgaXJxX3NldHVwX2dlbmVyaWNfY2hpcChzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2MsIHUzMiBtc2ssCisJCQkgICAgZW51bSBpcnFfZ2NfZmxhZ3MgZmxhZ3MsIHVuc2lnbmVkIGludCBjbHIsCisJCQkgICAgdW5zaWduZWQgaW50IHNldCkKK3sKKwlzdHJ1Y3QgaXJxX2NoaXBfdHlwZSAqY3QgPSBnYy0+Y2hpcF90eXBlczsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXJhd19zcGluX2xvY2soJmdjX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmdjLT5saXN0LCAmZ2NfbGlzdCk7CisJcmF3X3NwaW5fdW5sb2NrKCZnY19sb2NrKTsKKworCS8qIEluaXQgbWFzayBjYWNoZSA/ICovCisJaWYgKGZsYWdzICYgSVJRX0dDX0lOSVRfTUFTS19DQUNIRSkKKwkJZ2MtPm1hc2tfY2FjaGUgPSBpcnFfcmVnX3JlYWRsKGdjLT5yZWdfYmFzZSArIGN0LT5yZWdzLm1hc2spOworCisJZm9yIChpID0gZ2MtPmlycV9iYXNlOyBtc2s7IG1zayA+Pj0gMSwgaSsrKSB7CisJCWlmICghbXNrICYgMHgwMSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChmbGFncyAmIElSUV9HQ19JTklUX05FU1RFRF9MT0NLKQorCQkJaXJxX3NldF9sb2NrZGVwX2NsYXNzKGksICZpcnFfbmVzdGVkX2xvY2tfY2xhc3MpOworCisJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpLCAmY3QtPmNoaXAsIGN0LT5oYW5kbGVyKTsKKwkJaXJxX3NldF9jaGlwX2RhdGEoaSwgZ2MpOworCQlpcnFfbW9kaWZ5X3N0YXR1cyhpLCBjbHIsIHNldCk7CisJfQorCWdjLT5pcnFfY250ID0gaSAtIGdjLT5pcnFfYmFzZTsKK30KKworLyoqCisgKiBpcnFfc2V0dXBfYWx0X2NoaXAgLSBTd2l0Y2ggdG8gYWx0ZXJuYXRpdmUgY2hpcAorICogQGQ6CQlpcnFfZGF0YSBmb3IgdGhpcyBpbnRlcnJ1cHQKKyAqIEB0eXBlCUZsb3cgdHlwZSB0byBiZSBpbml0aWFsaXplZAorICoKKyAqIE9ubHkgdG8gYmUgY2FsbGVkIGZyb20gY2hpcC0+aXJxX3NldF90eXBlKCkgY2FsbGJhY2tzLgorICovCitpbnQgaXJxX3NldHVwX2FsdF9jaGlwKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IHR5cGUpCit7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJc3RydWN0IGlycV9jaGlwX3R5cGUgKmN0ID0gZ2MtPmNoaXBfdHlwZXM7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ2MtPm51bV9jdDsgaSsrLCBjdCsrKSB7CisJCWlmIChjdC0+dHlwZSAmIHR5cGUpIHsKKwkJCWQtPmNoaXAgPSAmY3QtPmNoaXA7CisJCQlpcnFfZGF0YV90b19kZXNjKGQpLT5oYW5kbGVfaXJxID0gY3QtPmhhbmRsZXI7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqCisgKiBpcnFfcmVtb3ZlX2dlbmVyaWNfY2hpcCAtIFJlbW92ZSBhIGNoaXAKKyAqIEBnYzoJCUdlbmVyaWMgaXJxIGNoaXAgaG9sZGluZyBhbGwgZGF0YQorICogQG1zazoJQml0bWFzayBob2xkaW5nIHRoZSBpcnFzIHRvIGluaXRpYWxpemUgcmVsYXRpdmUgdG8gZ2MtPmlycV9iYXNlCisgKiBAY2xyOglJUlFfKiBiaXRzIHRvIGNsZWFyCisgKiBAc2V0OglJUlFfKiBiaXRzIHRvIHNldAorICoKKyAqIFJlbW92ZSB1cCB0byAzMiBpbnRlcnJ1cHRzIHN0YXJ0aW5nIGZyb20gZ2MtPmlycV9iYXNlLgorICovCit2b2lkIGlycV9yZW1vdmVfZ2VuZXJpY19jaGlwKHN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYywgdTMyIG1zaywKKwkJCSAgICAgdW5zaWduZWQgaW50IGNsciwgdW5zaWduZWQgaW50IHNldCkKK3sKKwl1bnNpZ25lZCBpbnQgaSA9IGdjLT5pcnFfYmFzZTsKKworCXJhd19zcGluX2xvY2soJmdjX2xvY2spOworCWxpc3RfZGVsKCZnYy0+bGlzdCk7CisJcmF3X3NwaW5fdW5sb2NrKCZnY19sb2NrKTsKKworCWZvciAoOyBtc2s7IG1zayA+Pj0gMSwgaSsrKSB7CisJCWlmICghbXNrICYgMHgwMSkKKwkJCWNvbnRpbnVlOworCisJCS8qIFJlbW92ZSBoYW5kbGVyIGZpcnN0LiBUaGF0IHdpbGwgbWFzayB0aGUgaXJxIGxpbmUgKi8KKwkJaXJxX3NldF9oYW5kbGVyKGksIE5VTEwpOworCQlpcnFfc2V0X2NoaXAoaSwgJm5vX2lycV9jaGlwKTsKKwkJaXJxX3NldF9jaGlwX2RhdGEoaSwgTlVMTCk7CisJCWlycV9tb2RpZnlfc3RhdHVzKGksIGNsciwgc2V0KTsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgaXJxX2djX3N1c3BlbmQodm9pZCkKK3sKKwlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2M7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGdjLCAmZ2NfbGlzdCwgbGlzdCkgeworCQlzdHJ1Y3QgaXJxX2NoaXBfdHlwZSAqY3QgPSBnYy0+Y2hpcF90eXBlczsKKworCQlpZiAoY3QtPmNoaXAuaXJxX3N1c3BlbmQpCisJCQljdC0+Y2hpcC5pcnFfc3VzcGVuZChpcnFfZ2V0X2lycV9kYXRhKGdjLT5pcnFfYmFzZSkpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXJxX2djX3Jlc3VtZSh2b2lkKQoreworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZ2MsICZnY19saXN0LCBsaXN0KSB7CisJCXN0cnVjdCBpcnFfY2hpcF90eXBlICpjdCA9IGdjLT5jaGlwX3R5cGVzOworCisJCWlmIChjdC0+Y2hpcC5pcnFfcmVzdW1lKQorCQkJY3QtPmNoaXAuaXJxX3Jlc3VtZShpcnFfZ2V0X2lycV9kYXRhKGdjLT5pcnFfYmFzZSkpOworCX0KK30KKyNlbHNlCisjZGVmaW5lIGlycV9nY19zdXNwZW5kIE5VTEwKKyNkZWZpbmUgaXJxX2djX3Jlc3VtZSBOVUxMCisjZW5kaWYKKworc3RhdGljIHZvaWQgaXJxX2djX3NodXRkb3duKHZvaWQpCit7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShnYywgJmdjX2xpc3QsIGxpc3QpIHsKKwkJc3RydWN0IGlycV9jaGlwX3R5cGUgKmN0ID0gZ2MtPmNoaXBfdHlwZXM7CisKKwkJaWYgKGN0LT5jaGlwLmlycV9wbV9zaHV0ZG93bikKKwkJCWN0LT5jaGlwLmlycV9wbV9zaHV0ZG93bihpcnFfZ2V0X2lycV9kYXRhKGdjLT5pcnFfYmFzZSkpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBzeXNjb3JlX29wcyBpcnFfZ2Nfc3lzY29yZV9vcHMgPSB7CisJLnN1c3BlbmQgPSBpcnFfZ2Nfc3VzcGVuZCwKKwkucmVzdW1lID0gaXJxX2djX3Jlc3VtZSwKKwkuc2h1dGRvd24gPSBpcnFfZ2Nfc2h1dGRvd24sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpcnFfZ2NfaW5pdF9vcHModm9pZCkKK3sKKwlyZWdpc3Rlcl9zeXNjb3JlX29wcygmaXJxX2djX3N5c2NvcmVfb3BzKTsKKwlyZXR1cm4gMDsKK30KK2RldmljZV9pbml0Y2FsbChpcnFfZ2NfaW5pdF9vcHMpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9pcnFkZXNjLmMgYi9rZXJuZWwvaXJxL2lycWRlc2MuYwppbmRleCAyYzAzOWM5Li44ODZlODAzIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2lycWRlc2MuYworKysgYi9rZXJuZWwvaXJxL2lycWRlc2MuYwpAQCAtMjIsNyArMjIsNyBAQAogICovCiBzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGlycV9kZXNjX2xvY2tfY2xhc3M7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19TTVApICYmIGRlZmluZWQoQ09ORklHX0dFTkVSSUNfSEFSRElSUVMpCisjaWYgZGVmaW5lZChDT05GSUdfU01QKQogc3RhdGljIHZvaWQgX19pbml0IGluaXRfaXJxX2RlZmF1bHRfYWZmaW5pdHkodm9pZCkKIHsKIAlhbGxvY19jcHVtYXNrX3ZhcigmaXJxX2RlZmF1bHRfYWZmaW5pdHksIEdGUF9OT1dBSVQpOwpAQCAtMjkwLDYgKzI5MCwyMiBAQAogCiAjZW5kaWYgLyogIUNPTkZJR19TUEFSU0VfSVJRICovCiAKKy8qKgorICogZ2VuZXJpY19oYW5kbGVfaXJxIC0gSW52b2tlIHRoZSBoYW5kbGVyIGZvciBhIHBhcnRpY3VsYXIgaXJxCisgKiBAaXJxOglUaGUgaXJxIG51bWJlciB0byBoYW5kbGUKKyAqCisgKi8KK2ludCBnZW5lcmljX2hhbmRsZV9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOworCisJaWYgKCFkZXNjKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlnZW5lcmljX2hhbmRsZV9pcnFfZGVzYyhpcnEsIGRlc2MpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2VuZXJpY19oYW5kbGVfaXJxKTsKKwogLyogRHluYW1pYyBpbnRlcnJ1cHQgaGFuZGxpbmcgKi8KIAogLyoqCkBAIC0zMTEsNiArMzI3LDcgQEAKIAliaXRtYXBfY2xlYXIoYWxsb2NhdGVkX2lycXMsIGZyb20sIGNudCk7CiAJbXV0ZXhfdW5sb2NrKCZzcGFyc2VfaXJxX2xvY2spOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoaXJxX2ZyZWVfZGVzY3MpOwogCiAvKioKICAqIGlycV9hbGxvY19kZXNjcyAtIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgcmFuZ2Ugb2YgaXJxIGRlc2NyaXB0b3JzCkBAIC0zNTEsNiArMzY4LDcgQEAKIAltdXRleF91bmxvY2soJnNwYXJzZV9pcnFfbG9jayk7CiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGlycV9hbGxvY19kZXNjcyk7CiAKIC8qKgogICogaXJxX3Jlc2VydmVfaXJxcyAtIG1hcmsgaXJxcyBhbGxvY2F0ZWQKQEAgLTQzMCw3ICs0NDgsNiBAQAogCQkJKnBlcl9jcHVfcHRyKGRlc2MtPmtzdGF0X2lycXMsIGNwdSkgOiAwOwogfQogCi0jaWZkZWYgQ09ORklHX0dFTkVSSUNfSEFSRElSUVMKIHVuc2lnbmVkIGludCBrc3RhdF9pcnFzKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKQEAgLTQ0Myw0ICs0NjAsMyBAQAogCQlzdW0gKz0gKnBlcl9jcHVfcHRyKGRlc2MtPmtzdGF0X2lycXMsIGNwdSk7CiAJcmV0dXJuIHN1bTsKIH0KLSNlbmRpZiAvKiBDT05GSUdfR0VORVJJQ19IQVJESVJRUyAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9tYW5hZ2UuYyBiL2tlcm5lbC9pcnEvbWFuYWdlLmMKaW5kZXggMDdjMTYxMS4uZjdjZTAwMiAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9tYW5hZ2UuYworKysgYi9rZXJuZWwvaXJxL21hbmFnZS5jCkBAIC05MDAsNyArOTAwLDggQEAKIAkJICovCiAJCW5ldy0+aGFuZGxlciA9IGlycV9uZXN0ZWRfcHJpbWFyeV9oYW5kbGVyOwogCX0gZWxzZSB7Ci0JCWlycV9zZXR1cF9mb3JjZWRfdGhyZWFkaW5nKG5ldyk7CisJCWlmIChpcnFfc2V0dGluZ3NfY2FuX3RocmVhZChkZXNjKSkKKwkJCWlycV9zZXR1cF9mb3JjZWRfdGhyZWFkaW5nKG5ldyk7CiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvc2V0dGluZ3MuaCBiL2tlcm5lbC9pcnEvc2V0dGluZ3MuaAppbmRleCAwZDkxNzMwLi5mMTY2NzgzIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL3NldHRpbmdzLmgKKysrIGIva2VybmVsL2lycS9zZXR0aW5ncy5oCkBAIC04LDYgKzgsNyBAQAogCV9JUlFfTEVWRUwJCT0gSVJRX0xFVkVMLAogCV9JUlFfTk9QUk9CRQkJPSBJUlFfTk9QUk9CRSwKIAlfSVJRX05PUkVRVUVTVAkJPSBJUlFfTk9SRVFVRVNULAorCV9JUlFfTk9USFJFQUQJCT0gSVJRX05PVEhSRUFELAogCV9JUlFfTk9BVVRPRU4JCT0gSVJRX05PQVVUT0VOLAogCV9JUlFfTU9WRV9QQ05UWFQJPSBJUlFfTU9WRV9QQ05UWFQsCiAJX0lSUV9OT19CQUxBTkNJTkcJPSBJUlFfTk9fQkFMQU5DSU5HLApAQCAtMjAsNiArMjEsNyBAQAogI2RlZmluZSBJUlFfTEVWRUwJCUdPVF9ZT1VfTU9ST04KICNkZWZpbmUgSVJRX05PUFJPQkUJCUdPVF9ZT1VfTU9ST04KICNkZWZpbmUgSVJRX05PUkVRVUVTVAkJR09UX1lPVV9NT1JPTgorI2RlZmluZSBJUlFfTk9USFJFQUQJCUdPVF9ZT1VfTU9ST04KICNkZWZpbmUgSVJRX05PQVVUT0VOCQlHT1RfWU9VX01PUk9OCiAjZGVmaW5lIElSUV9ORVNURURfVEhSRUFECUdPVF9ZT1VfTU9ST04KICN1bmRlZiBJUlFGX01PRElGWV9NQVNLCkBAIC05NCw2ICs5NiwyMSBAQAogCWRlc2MtPnN0YXR1c191c2VfYWNjZXNzb3JzIHw9IF9JUlFfTk9SRVFVRVNUOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgaXJxX3NldHRpbmdzX2Nhbl90aHJlYWQoc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXJldHVybiAhKGRlc2MtPnN0YXR1c191c2VfYWNjZXNzb3JzICYgX0lSUV9OT1RIUkVBRCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcnFfc2V0dGluZ3NfY2xyX25vdGhyZWFkKHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlkZXNjLT5zdGF0dXNfdXNlX2FjY2Vzc29ycyAmPSB+X0lSUV9OT1RIUkVBRDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlycV9zZXR0aW5nc19zZXRfbm90aHJlYWQoc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCWRlc2MtPnN0YXR1c191c2VfYWNjZXNzb3JzIHw9IF9JUlFfTk9USFJFQUQ7Cit9CisKIHN0YXRpYyBpbmxpbmUgYm9vbCBpcnFfc2V0dGluZ3NfY2FuX3Byb2JlKHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKIAlyZXR1cm4gIShkZXNjLT5zdGF0dXNfdXNlX2FjY2Vzc29ycyAmIF9JUlFfTk9QUk9CRSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvanVtcF9sYWJlbC5jIGIva2VybmVsL2p1bXBfbGFiZWwuYwppbmRleCAzYjc5YmQ5Li43NGQxYzA5IDEwMDY0NAotLS0gYS9rZXJuZWwvanVtcF9sYWJlbC5jCisrKyBiL2tlcm5lbC9qdW1wX2xhYmVsLmMKQEAgLTIsNDMgKzIsMjMgQEAKICAqIGp1bXAgbGFiZWwgc3VwcG9ydAogICoKICAqIENvcHlyaWdodCAoQykgMjAwOSBKYXNvbiBCYXJvbiA8amJhcm9uQHJlZGhhdC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUGV0ZXIgWmlqbHN0cmEgPHB6aWpsc3RyQHJlZGhhdC5jb20+CiAgKgogICovCi0jaW5jbHVkZSA8bGludXgvanVtcF9sYWJlbC5oPgogI2luY2x1ZGUgPGxpbnV4L21lbW9yeS5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvamhhc2guaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc29ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2p1bXBfbGFiZWwuaD4KIAogI2lmZGVmIEhBVkVfSlVNUF9MQUJFTAogCi0jZGVmaW5lIEpVTVBfTEFCRUxfSEFTSF9CSVRTIDYKLSNkZWZpbmUgSlVNUF9MQUJFTF9UQUJMRV9TSVpFICgxIDw8IEpVTVBfTEFCRUxfSEFTSF9CSVRTKQotc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkIGp1bXBfbGFiZWxfdGFibGVbSlVNUF9MQUJFTF9UQUJMRV9TSVpFXTsKLQogLyogbXV0ZXggdG8gcHJvdGVjdCBjb21pbmcvZ29pbmcgb2YgdGhlIHRoZSBqdW1wX2xhYmVsIHRhYmxlICovCiBzdGF0aWMgREVGSU5FX01VVEVYKGp1bXBfbGFiZWxfbXV0ZXgpOwogCi1zdHJ1Y3QganVtcF9sYWJlbF9lbnRyeSB7Ci0Jc3RydWN0IGhsaXN0X25vZGUgaGxpc3Q7Ci0Jc3RydWN0IGp1bXBfZW50cnkgKnRhYmxlOwotCWludCBucl9lbnRyaWVzOwotCS8qIGhhbmcgbW9kdWxlcyBvZmYgaGVyZSAqLwotCXN0cnVjdCBobGlzdF9oZWFkIG1vZHVsZXM7Ci0JdW5zaWduZWQgbG9uZyBrZXk7Ci19OwotCi1zdHJ1Y3QganVtcF9sYWJlbF9tb2R1bGVfZW50cnkgewotCXN0cnVjdCBobGlzdF9ub2RlIGhsaXN0OwotCXN0cnVjdCBqdW1wX2VudHJ5ICp0YWJsZTsKLQlpbnQgbnJfZW50cmllczsKLQlzdHJ1Y3QgbW9kdWxlICptb2Q7Ci19OwotCiB2b2lkIGp1bXBfbGFiZWxfbG9jayh2b2lkKQogewogCW11dGV4X2xvY2soJmp1bXBfbGFiZWxfbXV0ZXgpOwpAQCAtNDksNiArMjksMTEgQEAKIAltdXRleF91bmxvY2soJmp1bXBfbGFiZWxfbXV0ZXgpOwogfQogCitib29sIGp1bXBfbGFiZWxfZW5hYmxlZChzdHJ1Y3QganVtcF9sYWJlbF9rZXkgKmtleSkKK3sKKwlyZXR1cm4gISFhdG9taWNfcmVhZCgma2V5LT5lbmFibGVkKTsKK30KKwogc3RhdGljIGludCBqdW1wX2xhYmVsX2NtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQogewogCWNvbnN0IHN0cnVjdCBqdW1wX2VudHJ5ICpqZWEgPSBhOwpAQCAtNjQsNyArNDksNyBAQAogfQogCiBzdGF0aWMgdm9pZAotc29ydF9qdW1wX2xhYmVsX2VudHJpZXMoc3RydWN0IGp1bXBfZW50cnkgKnN0YXJ0LCBzdHJ1Y3QganVtcF9lbnRyeSAqc3RvcCkKK2p1bXBfbGFiZWxfc29ydF9lbnRyaWVzKHN0cnVjdCBqdW1wX2VudHJ5ICpzdGFydCwgc3RydWN0IGp1bXBfZW50cnkgKnN0b3ApCiB7CiAJdW5zaWduZWQgbG9uZyBzaXplOwogCkBAIC03MywxMTggKzU4LDI1IEBACiAJc29ydChzdGFydCwgc2l6ZSwgc2l6ZW9mKHN0cnVjdCBqdW1wX2VudHJ5KSwganVtcF9sYWJlbF9jbXAsIE5VTEwpOwogfQogCi1zdGF0aWMgc3RydWN0IGp1bXBfbGFiZWxfZW50cnkgKmdldF9qdW1wX2xhYmVsX2VudHJ5KGp1bXBfbGFiZWxfdCBrZXkpCitzdGF0aWMgdm9pZCBqdW1wX2xhYmVsX3VwZGF0ZShzdHJ1Y3QganVtcF9sYWJlbF9rZXkgKmtleSwgaW50IGVuYWJsZSk7CisKK3ZvaWQganVtcF9sYWJlbF9pbmMoc3RydWN0IGp1bXBfbGFiZWxfa2V5ICprZXkpCiB7Ci0Jc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7Ci0Jc3RydWN0IGp1bXBfbGFiZWxfZW50cnkgKmU7Ci0JdTMyIGhhc2ggPSBqaGFzaCgodm9pZCAqKSZrZXksIHNpemVvZihqdW1wX2xhYmVsX3QpLCAwKTsKLQotCWhlYWQgPSAmanVtcF9sYWJlbF90YWJsZVtoYXNoICYgKEpVTVBfTEFCRUxfVEFCTEVfU0laRSAtIDEpXTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeShlLCBub2RlLCBoZWFkLCBobGlzdCkgewotCQlpZiAoa2V5ID09IGUtPmtleSkKLQkJCXJldHVybiBlOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdCBqdW1wX2xhYmVsX2VudHJ5ICoKLWFkZF9qdW1wX2xhYmVsX2VudHJ5KGp1bXBfbGFiZWxfdCBrZXksIGludCBucl9lbnRyaWVzLCBzdHJ1Y3QganVtcF9lbnRyeSAqdGFibGUpCi17Ci0Jc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7Ci0Jc3RydWN0IGp1bXBfbGFiZWxfZW50cnkgKmU7Ci0JdTMyIGhhc2g7Ci0KLQllID0gZ2V0X2p1bXBfbGFiZWxfZW50cnkoa2V5KTsKLQlpZiAoZSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVFWElTVCk7Ci0KLQllID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGp1bXBfbGFiZWxfZW50cnkpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWUpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCi0JaGFzaCA9IGpoYXNoKCh2b2lkICopJmtleSwgc2l6ZW9mKGp1bXBfbGFiZWxfdCksIDApOwotCWhlYWQgPSAmanVtcF9sYWJlbF90YWJsZVtoYXNoICYgKEpVTVBfTEFCRUxfVEFCTEVfU0laRSAtIDEpXTsKLQllLT5rZXkgPSBrZXk7Ci0JZS0+dGFibGUgPSB0YWJsZTsKLQllLT5ucl9lbnRyaWVzID0gbnJfZW50cmllczsKLQlJTklUX0hMSVNUX0hFQUQoJihlLT5tb2R1bGVzKSk7Ci0JaGxpc3RfYWRkX2hlYWQoJmUtPmhsaXN0LCBoZWFkKTsKLQlyZXR1cm4gZTsKLX0KLQotc3RhdGljIGludAotYnVpbGRfanVtcF9sYWJlbF9oYXNodGFibGUoc3RydWN0IGp1bXBfZW50cnkgKnN0YXJ0LCBzdHJ1Y3QganVtcF9lbnRyeSAqc3RvcCkKLXsKLQlzdHJ1Y3QganVtcF9lbnRyeSAqaXRlciwgKml0ZXJfYmVnaW47Ci0Jc3RydWN0IGp1bXBfbGFiZWxfZW50cnkgKmVudHJ5OwotCWludCBjb3VudDsKLQotCXNvcnRfanVtcF9sYWJlbF9lbnRyaWVzKHN0YXJ0LCBzdG9wKTsKLQlpdGVyID0gc3RhcnQ7Ci0Jd2hpbGUgKGl0ZXIgPCBzdG9wKSB7Ci0JCWVudHJ5ID0gZ2V0X2p1bXBfbGFiZWxfZW50cnkoaXRlci0+a2V5KTsKLQkJaWYgKCFlbnRyeSkgewotCQkJaXRlcl9iZWdpbiA9IGl0ZXI7Ci0JCQljb3VudCA9IDA7Ci0JCQl3aGlsZSAoKGl0ZXIgPCBzdG9wKSAmJgotCQkJCShpdGVyLT5rZXkgPT0gaXRlcl9iZWdpbi0+a2V5KSkgewotCQkJCWl0ZXIrKzsKLQkJCQljb3VudCsrOwotCQkJfQotCQkJZW50cnkgPSBhZGRfanVtcF9sYWJlbF9lbnRyeShpdGVyX2JlZ2luLT5rZXksCi0JCQkJCQkJY291bnQsIGl0ZXJfYmVnaW4pOwotCQkJaWYgKElTX0VSUihlbnRyeSkpCi0JCQkJcmV0dXJuIFBUUl9FUlIoZW50cnkpOwotCQkgfSBlbHNlIHsKLQkJCVdBUk5fT05DRSgxLCBLRVJOX0VSUiAiYnVpbGRfanVtcF9oYXNodGFibGU6IHVuZXhwZWN0ZWQgZW50cnkhXG4iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKgotICoganVtcF9sYWJlbF91cGRhdGUgLSB1cGRhdGUganVtcCBsYWJlbCB0ZXh0Ci0gKiBAa2V5IC0gIGtleSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBhIGp1bXAgbGFiZWwKLSAqIEB0eXBlIC0gZW51bSBzZXQgdG8gSlVNUF9MQUJFTF9FTkFCTEUgb3IgSlVNUF9MQUJFTF9ESVNBQkxFCi0gKgotICogV2lsbCBlbmFibGUvZGlzYWJsZSB0aGUganVtcCBmb3IganVtcCBsYWJlbCBAa2V5LCBkZXBlbmRpbmcgb24gdGhlCi0gKiB2YWx1ZSBvZiBAdHlwZS4KLSAqCi0gKi8KLQotdm9pZCBqdW1wX2xhYmVsX3VwZGF0ZSh1bnNpZ25lZCBsb25nIGtleSwgZW51bSBqdW1wX2xhYmVsX3R5cGUgdHlwZSkKLXsKLQlzdHJ1Y3QganVtcF9lbnRyeSAqaXRlcjsKLQlzdHJ1Y3QganVtcF9sYWJlbF9lbnRyeSAqZW50cnk7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm1vZHVsZV9ub2RlOwotCXN0cnVjdCBqdW1wX2xhYmVsX21vZHVsZV9lbnRyeSAqZV9tb2R1bGU7Ci0JaW50IGNvdW50OworCWlmIChhdG9taWNfaW5jX25vdF96ZXJvKCZrZXktPmVuYWJsZWQpKQorCQlyZXR1cm47CiAKIAlqdW1wX2xhYmVsX2xvY2soKTsKLQllbnRyeSA9IGdldF9qdW1wX2xhYmVsX2VudHJ5KChqdW1wX2xhYmVsX3Qpa2V5KTsKLQlpZiAoZW50cnkpIHsKLQkJY291bnQgPSBlbnRyeS0+bnJfZW50cmllczsKLQkJaXRlciA9IGVudHJ5LT50YWJsZTsKLQkJd2hpbGUgKGNvdW50LS0pIHsKLQkJCWlmIChrZXJuZWxfdGV4dF9hZGRyZXNzKGl0ZXItPmNvZGUpKQotCQkJCWFyY2hfanVtcF9sYWJlbF90cmFuc2Zvcm0oaXRlciwgdHlwZSk7Ci0JCQlpdGVyKys7Ci0JCX0KLQkJLyogZWFuYmxlL2Rpc2FibGUganVtcCBsYWJlbHMgaW4gbW9kdWxlcyAqLwotCQlobGlzdF9mb3JfZWFjaF9lbnRyeShlX21vZHVsZSwgbW9kdWxlX25vZGUsICYoZW50cnktPm1vZHVsZXMpLAotCQkJCQkJCWhsaXN0KSB7Ci0JCQljb3VudCA9IGVfbW9kdWxlLT5ucl9lbnRyaWVzOwotCQkJaXRlciA9IGVfbW9kdWxlLT50YWJsZTsKLQkJCXdoaWxlIChjb3VudC0tKSB7Ci0JCQkJaWYgKGl0ZXItPmtleSAmJgotCQkJCQkJa2VybmVsX3RleHRfYWRkcmVzcyhpdGVyLT5jb2RlKSkKLQkJCQkJYXJjaF9qdW1wX2xhYmVsX3RyYW5zZm9ybShpdGVyLCB0eXBlKTsKLQkJCQlpdGVyKys7Ci0JCQl9Ci0JCX0KLQl9CisJaWYgKGF0b21pY19hZGRfcmV0dXJuKDEsICZrZXktPmVuYWJsZWQpID09IDEpCisJCWp1bXBfbGFiZWxfdXBkYXRlKGtleSwgSlVNUF9MQUJFTF9FTkFCTEUpOworCWp1bXBfbGFiZWxfdW5sb2NrKCk7Cit9CisKK3ZvaWQganVtcF9sYWJlbF9kZWMoc3RydWN0IGp1bXBfbGFiZWxfa2V5ICprZXkpCit7CisJaWYgKCFhdG9taWNfZGVjX2FuZF9tdXRleF9sb2NrKCZrZXktPmVuYWJsZWQsICZqdW1wX2xhYmVsX211dGV4KSkKKwkJcmV0dXJuOworCisJanVtcF9sYWJlbF91cGRhdGUoa2V5LCBKVU1QX0xBQkVMX0RJU0FCTEUpOwogCWp1bXBfbGFiZWxfdW5sb2NrKCk7CiB9CiAKQEAgLTE5Nyw0MSArODksMjU0IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfTU9EVUxFUwotCi1zdGF0aWMgaW50IG1vZHVsZV9jb25mbGljdCh2b2lkICpzdGFydCwgdm9pZCAqZW5kKQorc3RhdGljIGludCBfX2p1bXBfbGFiZWxfdGV4dF9yZXNlcnZlZChzdHJ1Y3QganVtcF9lbnRyeSAqaXRlcl9zdGFydCwKKwkJc3RydWN0IGp1bXBfZW50cnkgKml0ZXJfc3RvcCwgdm9pZCAqc3RhcnQsIHZvaWQgKmVuZCkKIHsKLQlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKm5vZGVfbmV4dCwgKm1vZHVsZV9ub2RlLCAqbW9kdWxlX25vZGVfbmV4dDsKLQlzdHJ1Y3QganVtcF9sYWJlbF9lbnRyeSAqZTsKLQlzdHJ1Y3QganVtcF9sYWJlbF9tb2R1bGVfZW50cnkgKmVfbW9kdWxlOwogCXN0cnVjdCBqdW1wX2VudHJ5ICppdGVyOwotCWludCBpLCBjb3VudDsKLQlpbnQgY29uZmxpY3QgPSAwOwogCi0JZm9yIChpID0gMDsgaSA8IEpVTVBfTEFCRUxfVEFCTEVfU0laRTsgaSsrKSB7Ci0JCWhlYWQgPSAmanVtcF9sYWJlbF90YWJsZVtpXTsKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlLCBub2RlLCBub2RlX25leHQsIGhlYWQsIGhsaXN0KSB7Ci0JCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVfbW9kdWxlLCBtb2R1bGVfbm9kZSwKLQkJCQkJCQltb2R1bGVfbm9kZV9uZXh0LAotCQkJCQkJCSYoZS0+bW9kdWxlcyksIGhsaXN0KSB7Ci0JCQkJY291bnQgPSBlX21vZHVsZS0+bnJfZW50cmllczsKLQkJCQlpdGVyID0gZV9tb2R1bGUtPnRhYmxlOwotCQkJCXdoaWxlIChjb3VudC0tKSB7Ci0JCQkJCWlmIChhZGRyX2NvbmZsaWN0KGl0ZXIsIHN0YXJ0LCBlbmQpKSB7Ci0JCQkJCQljb25mbGljdCA9IDE7Ci0JCQkJCQlnb3RvIG91dDsKLQkJCQkJfQotCQkJCQlpdGVyKys7Ci0JCQkJfQotCQkJfQotCQl9CisJaXRlciA9IGl0ZXJfc3RhcnQ7CisJd2hpbGUgKGl0ZXIgPCBpdGVyX3N0b3ApIHsKKwkJaWYgKGFkZHJfY29uZmxpY3QoaXRlciwgc3RhcnQsIGVuZCkpCisJCQlyZXR1cm4gMTsKKwkJaXRlcisrOwogCX0KLW91dDoKLQlyZXR1cm4gY29uZmxpY3Q7CisKKwlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgX19qdW1wX2xhYmVsX3VwZGF0ZShzdHJ1Y3QganVtcF9sYWJlbF9rZXkgKmtleSwKKwkJc3RydWN0IGp1bXBfZW50cnkgKmVudHJ5LCBpbnQgZW5hYmxlKQoreworCWZvciAoOyBlbnRyeS0+a2V5ID09IChqdW1wX2xhYmVsX3QpKHVuc2lnbmVkIGxvbmcpa2V5OyBlbnRyeSsrKSB7CisJCS8qCisJCSAqIGVudHJ5LT5jb2RlIHNldCB0byAwIGludmFsaWRhdGVzIG1vZHVsZSBpbml0IHRleHQgc2VjdGlvbnMKKwkJICoga2VybmVsX3RleHRfYWRkcmVzcygpIHZlcmlmaWVzIHdlIGFyZSBub3QgaW4gY29yZSBrZXJuZWwKKwkJICogaW5pdCBjb2RlLCBzZWUganVtcF9sYWJlbF9pbnZhbGlkYXRlX21vZHVsZV9pbml0KCkuCisJCSAqLworCQlpZiAoZW50cnktPmNvZGUgJiYga2VybmVsX3RleHRfYWRkcmVzcyhlbnRyeS0+Y29kZSkpCisJCQlhcmNoX2p1bXBfbGFiZWxfdHJhbnNmb3JtKGVudHJ5LCBlbmFibGUpOworCX0KK30KKworLyoKKyAqIE5vdCBhbGwgYXJjaHMgbmVlZCB0aGlzLgorICovCit2b2lkIF9fd2VhayBhcmNoX2p1bXBfbGFiZWxfdGV4dF9wb2tlX2Vhcmx5KGp1bXBfbGFiZWxfdCBhZGRyKQoreworfQorCitzdGF0aWMgX19pbml0IGludCBqdW1wX2xhYmVsX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QganVtcF9lbnRyeSAqaXRlcl9zdGFydCA9IF9fc3RhcnRfX19qdW1wX3RhYmxlOworCXN0cnVjdCBqdW1wX2VudHJ5ICppdGVyX3N0b3AgPSBfX3N0b3BfX19qdW1wX3RhYmxlOworCXN0cnVjdCBqdW1wX2xhYmVsX2tleSAqa2V5ID0gTlVMTDsKKwlzdHJ1Y3QganVtcF9lbnRyeSAqaXRlcjsKKworCWp1bXBfbGFiZWxfbG9jaygpOworCWp1bXBfbGFiZWxfc29ydF9lbnRyaWVzKGl0ZXJfc3RhcnQsIGl0ZXJfc3RvcCk7CisKKwlmb3IgKGl0ZXIgPSBpdGVyX3N0YXJ0OyBpdGVyIDwgaXRlcl9zdG9wOyBpdGVyKyspIHsKKwkJYXJjaF9qdW1wX2xhYmVsX3RleHRfcG9rZV9lYXJseShpdGVyLT5jb2RlKTsKKwkJaWYgKGl0ZXItPmtleSA9PSAoanVtcF9sYWJlbF90KSh1bnNpZ25lZCBsb25nKWtleSkKKwkJCWNvbnRpbnVlOworCisJCWtleSA9IChzdHJ1Y3QganVtcF9sYWJlbF9rZXkgKikodW5zaWduZWQgbG9uZylpdGVyLT5rZXk7CisJCWF0b21pY19zZXQoJmtleS0+ZW5hYmxlZCwgMCk7CisJCWtleS0+ZW50cmllcyA9IGl0ZXI7CisjaWZkZWYgQ09ORklHX01PRFVMRVMKKwkJa2V5LT5uZXh0ID0gTlVMTDsKICNlbmRpZgorCX0KKwlqdW1wX2xhYmVsX3VubG9jaygpOworCisJcmV0dXJuIDA7Cit9CitlYXJseV9pbml0Y2FsbChqdW1wX2xhYmVsX2luaXQpOworCisjaWZkZWYgQ09ORklHX01PRFVMRVMKKworc3RydWN0IGp1bXBfbGFiZWxfbW9kIHsKKwlzdHJ1Y3QganVtcF9sYWJlbF9tb2QgKm5leHQ7CisJc3RydWN0IGp1bXBfZW50cnkgKmVudHJpZXM7CisJc3RydWN0IG1vZHVsZSAqbW9kOworfTsKKworc3RhdGljIGludCBfX2p1bXBfbGFiZWxfbW9kX3RleHRfcmVzZXJ2ZWQodm9pZCAqc3RhcnQsIHZvaWQgKmVuZCkKK3sKKwlzdHJ1Y3QgbW9kdWxlICptb2Q7CisKKwltb2QgPSBfX21vZHVsZV90ZXh0X2FkZHJlc3MoKHVuc2lnbmVkIGxvbmcpc3RhcnQpOworCWlmICghbW9kKQorCQlyZXR1cm4gMDsKKworCVdBUk5fT05fT05DRShfX21vZHVsZV90ZXh0X2FkZHJlc3MoKHVuc2lnbmVkIGxvbmcpZW5kKSAhPSBtb2QpOworCisJcmV0dXJuIF9fanVtcF9sYWJlbF90ZXh0X3Jlc2VydmVkKG1vZC0+anVtcF9lbnRyaWVzLAorCQkJCW1vZC0+anVtcF9lbnRyaWVzICsgbW9kLT5udW1fanVtcF9lbnRyaWVzLAorCQkJCXN0YXJ0LCBlbmQpOworfQorCitzdGF0aWMgdm9pZCBfX2p1bXBfbGFiZWxfbW9kX3VwZGF0ZShzdHJ1Y3QganVtcF9sYWJlbF9rZXkgKmtleSwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QganVtcF9sYWJlbF9tb2QgKm1vZCA9IGtleS0+bmV4dDsKKworCXdoaWxlIChtb2QpIHsKKwkJX19qdW1wX2xhYmVsX3VwZGF0ZShrZXksIG1vZC0+ZW50cmllcywgZW5hYmxlKTsKKwkJbW9kID0gbW9kLT5uZXh0OworCX0KK30KKworLyoqKgorICogYXBwbHlfanVtcF9sYWJlbF9ub3BzIC0gcGF0Y2ggbW9kdWxlIGp1bXAgbGFiZWxzIHdpdGggYXJjaF9nZXRfanVtcF9sYWJlbF9ub3AoKQorICogQG1vZDogbW9kdWxlIHRvIHBhdGNoCisgKgorICogQWxsb3cgZm9yIHJ1bi10aW1lIHNlbGVjdGlvbiBvZiB0aGUgb3B0aW1hbCBub3BzLiBCZWZvcmUgdGhlIG1vZHVsZQorICogbG9hZHMgcGF0Y2ggdGhlc2Ugd2l0aCBhcmNoX2dldF9qdW1wX2xhYmVsX25vcCgpLCB3aGljaCBpcyBzcGVjaWZpZWQgYnkKKyAqIHRoZSBhcmNoIHNwZWNpZmljIGp1bXAgbGFiZWwgY29kZS4KKyAqLwordm9pZCBqdW1wX2xhYmVsX2FwcGx5X25vcHMoc3RydWN0IG1vZHVsZSAqbW9kKQoreworCXN0cnVjdCBqdW1wX2VudHJ5ICppdGVyX3N0YXJ0ID0gbW9kLT5qdW1wX2VudHJpZXM7CisJc3RydWN0IGp1bXBfZW50cnkgKml0ZXJfc3RvcCA9IGl0ZXJfc3RhcnQgKyBtb2QtPm51bV9qdW1wX2VudHJpZXM7CisJc3RydWN0IGp1bXBfZW50cnkgKml0ZXI7CisKKwkvKiBpZiB0aGUgbW9kdWxlIGRvZXNuJ3QgaGF2ZSBqdW1wIGxhYmVsIGVudHJpZXMsIGp1c3QgcmV0dXJuICovCisJaWYgKGl0ZXJfc3RhcnQgPT0gaXRlcl9zdG9wKQorCQlyZXR1cm47CisKKwlmb3IgKGl0ZXIgPSBpdGVyX3N0YXJ0OyBpdGVyIDwgaXRlcl9zdG9wOyBpdGVyKyspCisJCWFyY2hfanVtcF9sYWJlbF90ZXh0X3Bva2VfZWFybHkoaXRlci0+Y29kZSk7Cit9CisKK3N0YXRpYyBpbnQganVtcF9sYWJlbF9hZGRfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZCkKK3sKKwlzdHJ1Y3QganVtcF9lbnRyeSAqaXRlcl9zdGFydCA9IG1vZC0+anVtcF9lbnRyaWVzOworCXN0cnVjdCBqdW1wX2VudHJ5ICppdGVyX3N0b3AgPSBpdGVyX3N0YXJ0ICsgbW9kLT5udW1fanVtcF9lbnRyaWVzOworCXN0cnVjdCBqdW1wX2VudHJ5ICppdGVyOworCXN0cnVjdCBqdW1wX2xhYmVsX2tleSAqa2V5ID0gTlVMTDsKKwlzdHJ1Y3QganVtcF9sYWJlbF9tb2QgKmpsbTsKKworCS8qIGlmIHRoZSBtb2R1bGUgZG9lc24ndCBoYXZlIGp1bXAgbGFiZWwgZW50cmllcywganVzdCByZXR1cm4gKi8KKwlpZiAoaXRlcl9zdGFydCA9PSBpdGVyX3N0b3ApCisJCXJldHVybiAwOworCisJanVtcF9sYWJlbF9zb3J0X2VudHJpZXMoaXRlcl9zdGFydCwgaXRlcl9zdG9wKTsKKworCWZvciAoaXRlciA9IGl0ZXJfc3RhcnQ7IGl0ZXIgPCBpdGVyX3N0b3A7IGl0ZXIrKykgeworCQlpZiAoaXRlci0+a2V5ID09IChqdW1wX2xhYmVsX3QpKHVuc2lnbmVkIGxvbmcpa2V5KQorCQkJY29udGludWU7CisKKwkJa2V5ID0gKHN0cnVjdCBqdW1wX2xhYmVsX2tleSAqKSh1bnNpZ25lZCBsb25nKWl0ZXItPmtleTsKKworCQlpZiAoX19tb2R1bGVfYWRkcmVzcyhpdGVyLT5rZXkpID09IG1vZCkgeworCQkJYXRvbWljX3NldCgma2V5LT5lbmFibGVkLCAwKTsKKwkJCWtleS0+ZW50cmllcyA9IGl0ZXI7CisJCQlrZXktPm5leHQgPSBOVUxMOworCQkJY29udGludWU7CisJCX0KKworCQlqbG0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QganVtcF9sYWJlbF9tb2QpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFqbG0pCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlqbG0tPm1vZCA9IG1vZDsKKwkJamxtLT5lbnRyaWVzID0gaXRlcjsKKwkJamxtLT5uZXh0ID0ga2V5LT5uZXh0OworCQlrZXktPm5leHQgPSBqbG07CisKKwkJaWYgKGp1bXBfbGFiZWxfZW5hYmxlZChrZXkpKQorCQkJX19qdW1wX2xhYmVsX3VwZGF0ZShrZXksIGl0ZXIsIEpVTVBfTEFCRUxfRU5BQkxFKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQganVtcF9sYWJlbF9kZWxfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZCkKK3sKKwlzdHJ1Y3QganVtcF9lbnRyeSAqaXRlcl9zdGFydCA9IG1vZC0+anVtcF9lbnRyaWVzOworCXN0cnVjdCBqdW1wX2VudHJ5ICppdGVyX3N0b3AgPSBpdGVyX3N0YXJ0ICsgbW9kLT5udW1fanVtcF9lbnRyaWVzOworCXN0cnVjdCBqdW1wX2VudHJ5ICppdGVyOworCXN0cnVjdCBqdW1wX2xhYmVsX2tleSAqa2V5ID0gTlVMTDsKKwlzdHJ1Y3QganVtcF9sYWJlbF9tb2QgKmpsbSwgKipwcmV2OworCisJZm9yIChpdGVyID0gaXRlcl9zdGFydDsgaXRlciA8IGl0ZXJfc3RvcDsgaXRlcisrKSB7CisJCWlmIChpdGVyLT5rZXkgPT0gKGp1bXBfbGFiZWxfdCkodW5zaWduZWQgbG9uZylrZXkpCisJCQljb250aW51ZTsKKworCQlrZXkgPSAoc3RydWN0IGp1bXBfbGFiZWxfa2V5ICopKHVuc2lnbmVkIGxvbmcpaXRlci0+a2V5OworCisJCWlmIChfX21vZHVsZV9hZGRyZXNzKGl0ZXItPmtleSkgPT0gbW9kKQorCQkJY29udGludWU7CisKKwkJcHJldiA9ICZrZXktPm5leHQ7CisJCWpsbSA9IGtleS0+bmV4dDsKKworCQl3aGlsZSAoamxtICYmIGpsbS0+bW9kICE9IG1vZCkgeworCQkJcHJldiA9ICZqbG0tPm5leHQ7CisJCQlqbG0gPSBqbG0tPm5leHQ7CisJCX0KKworCQlpZiAoamxtKSB7CisJCQkqcHJldiA9IGpsbS0+bmV4dDsKKwkJCWtmcmVlKGpsbSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGp1bXBfbGFiZWxfaW52YWxpZGF0ZV9tb2R1bGVfaW5pdChzdHJ1Y3QgbW9kdWxlICptb2QpCit7CisJc3RydWN0IGp1bXBfZW50cnkgKml0ZXJfc3RhcnQgPSBtb2QtPmp1bXBfZW50cmllczsKKwlzdHJ1Y3QganVtcF9lbnRyeSAqaXRlcl9zdG9wID0gaXRlcl9zdGFydCArIG1vZC0+bnVtX2p1bXBfZW50cmllczsKKwlzdHJ1Y3QganVtcF9lbnRyeSAqaXRlcjsKKworCWZvciAoaXRlciA9IGl0ZXJfc3RhcnQ7IGl0ZXIgPCBpdGVyX3N0b3A7IGl0ZXIrKykgeworCQlpZiAod2l0aGluX21vZHVsZV9pbml0KGl0ZXItPmNvZGUsIG1vZCkpCisJCQlpdGVyLT5jb2RlID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2p1bXBfbGFiZWxfbW9kdWxlX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgdmFsLAorCQkJIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG1vZHVsZSAqbW9kID0gZGF0YTsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAodmFsKSB7CisJY2FzZSBNT0RVTEVfU1RBVEVfQ09NSU5HOgorCQlqdW1wX2xhYmVsX2xvY2soKTsKKwkJcmV0ID0ganVtcF9sYWJlbF9hZGRfbW9kdWxlKG1vZCk7CisJCWlmIChyZXQpCisJCQlqdW1wX2xhYmVsX2RlbF9tb2R1bGUobW9kKTsKKwkJanVtcF9sYWJlbF91bmxvY2soKTsKKwkJYnJlYWs7CisJY2FzZSBNT0RVTEVfU1RBVEVfR09JTkc6CisJCWp1bXBfbGFiZWxfbG9jaygpOworCQlqdW1wX2xhYmVsX2RlbF9tb2R1bGUobW9kKTsKKwkJanVtcF9sYWJlbF91bmxvY2soKTsKKwkJYnJlYWs7CisJY2FzZSBNT0RVTEVfU1RBVEVfTElWRToKKwkJanVtcF9sYWJlbF9sb2NrKCk7CisJCWp1bXBfbGFiZWxfaW52YWxpZGF0ZV9tb2R1bGVfaW5pdChtb2QpOworCQlqdW1wX2xhYmVsX3VubG9jaygpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gbm90aWZpZXJfZnJvbV9lcnJubyhyZXQpOworfQorCitzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sganVtcF9sYWJlbF9tb2R1bGVfbmIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBqdW1wX2xhYmVsX21vZHVsZV9ub3RpZnksCisJLnByaW9yaXR5ID0gMSwgLyogaGlnaGVyIHRoYW4gdHJhY2Vwb2ludHMgKi8KK307CisKK3N0YXRpYyBfX2luaXQgaW50IGp1bXBfbGFiZWxfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfbW9kdWxlX25vdGlmaWVyKCZqdW1wX2xhYmVsX21vZHVsZV9uYik7Cit9CitlYXJseV9pbml0Y2FsbChqdW1wX2xhYmVsX2luaXRfbW9kdWxlKTsKKworI2VuZGlmIC8qIENPTkZJR19NT0RVTEVTICovCiAKIC8qKioKICAqIGp1bXBfbGFiZWxfdGV4dF9yZXNlcnZlZCAtIGNoZWNrIGlmIGFkZHIgcmFuZ2UgaXMgcmVzZXJ2ZWQKQEAgLTI0OCwyMzcgKzM1MywyOSBAQAogICovCiBpbnQganVtcF9sYWJlbF90ZXh0X3Jlc2VydmVkKHZvaWQgKnN0YXJ0LCB2b2lkICplbmQpCiB7Ci0Jc3RydWN0IGp1bXBfZW50cnkgKml0ZXI7Ci0Jc3RydWN0IGp1bXBfZW50cnkgKml0ZXJfc3RhcnQgPSBfX3N0YXJ0X19fanVtcF90YWJsZTsKLQlzdHJ1Y3QganVtcF9lbnRyeSAqaXRlcl9zdG9wID0gX19zdGFydF9fX2p1bXBfdGFibGU7Ci0JaW50IGNvbmZsaWN0ID0gMDsKKwlpbnQgcmV0ID0gX19qdW1wX2xhYmVsX3RleHRfcmVzZXJ2ZWQoX19zdGFydF9fX2p1bXBfdGFibGUsCisJCQlfX3N0b3BfX19qdW1wX3RhYmxlLCBzdGFydCwgZW5kKTsKIAotCWl0ZXIgPSBpdGVyX3N0YXJ0OwotCXdoaWxlIChpdGVyIDwgaXRlcl9zdG9wKSB7Ci0JCWlmIChhZGRyX2NvbmZsaWN0KGl0ZXIsIHN0YXJ0LCBlbmQpKSB7Ci0JCQljb25mbGljdCA9IDE7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlpdGVyKys7Ci0JfQorCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKLQkvKiBub3cgY2hlY2sgbW9kdWxlcyAqLwogI2lmZGVmIENPTkZJR19NT0RVTEVTCi0JY29uZmxpY3QgPSBtb2R1bGVfY29uZmxpY3Qoc3RhcnQsIGVuZCk7CisJcmV0ID0gX19qdW1wX2xhYmVsX21vZF90ZXh0X3Jlc2VydmVkKHN0YXJ0LCBlbmQpOwogI2VuZGlmCi1vdXQ6Ci0JcmV0dXJuIGNvbmZsaWN0OwotfQotCi0vKgotICogTm90IGFsbCBhcmNocyBuZWVkIHRoaXMuCi0gKi8KLXZvaWQgX193ZWFrIGFyY2hfanVtcF9sYWJlbF90ZXh0X3Bva2VfZWFybHkoanVtcF9sYWJlbF90IGFkZHIpCi17Ci19Ci0KLXN0YXRpYyBfX2luaXQgaW50IGluaXRfanVtcF9sYWJlbCh2b2lkKQotewotCWludCByZXQ7Ci0Jc3RydWN0IGp1bXBfZW50cnkgKml0ZXJfc3RhcnQgPSBfX3N0YXJ0X19fanVtcF90YWJsZTsKLQlzdHJ1Y3QganVtcF9lbnRyeSAqaXRlcl9zdG9wID0gX19zdG9wX19fanVtcF90YWJsZTsKLQlzdHJ1Y3QganVtcF9lbnRyeSAqaXRlcjsKLQotCWp1bXBfbGFiZWxfbG9jaygpOwotCXJldCA9IGJ1aWxkX2p1bXBfbGFiZWxfaGFzaHRhYmxlKF9fc3RhcnRfX19qdW1wX3RhYmxlLAotCQkJCQkgX19zdG9wX19fanVtcF90YWJsZSk7Ci0JaXRlciA9IGl0ZXJfc3RhcnQ7Ci0Jd2hpbGUgKGl0ZXIgPCBpdGVyX3N0b3ApIHsKLQkJYXJjaF9qdW1wX2xhYmVsX3RleHRfcG9rZV9lYXJseShpdGVyLT5jb2RlKTsKLQkJaXRlcisrOwotCX0KLQlqdW1wX2xhYmVsX3VubG9jaygpOwogCXJldHVybiByZXQ7CiB9Ci1lYXJseV9pbml0Y2FsbChpbml0X2p1bXBfbGFiZWwpOworCitzdGF0aWMgdm9pZCBqdW1wX2xhYmVsX3VwZGF0ZShzdHJ1Y3QganVtcF9sYWJlbF9rZXkgKmtleSwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QganVtcF9lbnRyeSAqZW50cnkgPSBrZXktPmVudHJpZXM7CisKKwkvKiBpZiB0aGVyZSBhcmUgbm8gdXNlcnMsIGVudHJ5IGNhbiBiZSBOVUxMICovCisJaWYgKGVudHJ5KQorCQlfX2p1bXBfbGFiZWxfdXBkYXRlKGtleSwgZW50cnksIGVuYWJsZSk7CiAKICNpZmRlZiBDT05GSUdfTU9EVUxFUwotCi1zdGF0aWMgc3RydWN0IGp1bXBfbGFiZWxfbW9kdWxlX2VudHJ5ICoKLWFkZF9qdW1wX2xhYmVsX21vZHVsZV9lbnRyeShzdHJ1Y3QganVtcF9sYWJlbF9lbnRyeSAqZW50cnksCi0JCQkgICAgc3RydWN0IGp1bXBfZW50cnkgKml0ZXJfYmVnaW4sCi0JCQkgICAgaW50IGNvdW50LCBzdHJ1Y3QgbW9kdWxlICptb2QpCi17Ci0Jc3RydWN0IGp1bXBfbGFiZWxfbW9kdWxlX2VudHJ5ICplOwotCi0JZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBqdW1wX2xhYmVsX21vZHVsZV9lbnRyeSksIEdGUF9LRVJORUwpOwotCWlmICghZSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JZS0+bW9kID0gbW9kOwotCWUtPm5yX2VudHJpZXMgPSBjb3VudDsKLQllLT50YWJsZSA9IGl0ZXJfYmVnaW47Ci0JaGxpc3RfYWRkX2hlYWQoJmUtPmhsaXN0LCAmZW50cnktPm1vZHVsZXMpOwotCXJldHVybiBlOworCV9fanVtcF9sYWJlbF9tb2RfdXBkYXRlKGtleSwgZW5hYmxlKTsKKyNlbmRpZgogfQogCi1zdGF0aWMgaW50IGFkZF9qdW1wX2xhYmVsX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QpCi17Ci0Jc3RydWN0IGp1bXBfZW50cnkgKml0ZXIsICppdGVyX2JlZ2luOwotCXN0cnVjdCBqdW1wX2xhYmVsX2VudHJ5ICplbnRyeTsKLQlzdHJ1Y3QganVtcF9sYWJlbF9tb2R1bGVfZW50cnkgKm1vZHVsZV9lbnRyeTsKLQlpbnQgY291bnQ7Ci0KLQkvKiBpZiB0aGUgbW9kdWxlIGRvZXNuJ3QgaGF2ZSBqdW1wIGxhYmVsIGVudHJpZXMsIGp1c3QgcmV0dXJuICovCi0JaWYgKCFtb2QtPm51bV9qdW1wX2VudHJpZXMpCi0JCXJldHVybiAwOwotCi0Jc29ydF9qdW1wX2xhYmVsX2VudHJpZXMobW9kLT5qdW1wX2VudHJpZXMsCi0JCQkJbW9kLT5qdW1wX2VudHJpZXMgKyBtb2QtPm51bV9qdW1wX2VudHJpZXMpOwotCWl0ZXIgPSBtb2QtPmp1bXBfZW50cmllczsKLQl3aGlsZSAoaXRlciA8IG1vZC0+anVtcF9lbnRyaWVzICsgbW9kLT5udW1fanVtcF9lbnRyaWVzKSB7Ci0JCWVudHJ5ID0gZ2V0X2p1bXBfbGFiZWxfZW50cnkoaXRlci0+a2V5KTsKLQkJaXRlcl9iZWdpbiA9IGl0ZXI7Ci0JCWNvdW50ID0gMDsKLQkJd2hpbGUgKChpdGVyIDwgbW9kLT5qdW1wX2VudHJpZXMgKyBtb2QtPm51bV9qdW1wX2VudHJpZXMpICYmCi0JCQkoaXRlci0+a2V5ID09IGl0ZXJfYmVnaW4tPmtleSkpIHsKLQkJCQlpdGVyKys7Ci0JCQkJY291bnQrKzsKLQkJfQotCQlpZiAoIWVudHJ5KSB7Ci0JCQllbnRyeSA9IGFkZF9qdW1wX2xhYmVsX2VudHJ5KGl0ZXJfYmVnaW4tPmtleSwgMCwgTlVMTCk7Ci0JCQlpZiAoSVNfRVJSKGVudHJ5KSkKLQkJCQlyZXR1cm4gUFRSX0VSUihlbnRyeSk7Ci0JCX0KLQkJbW9kdWxlX2VudHJ5ID0gYWRkX2p1bXBfbGFiZWxfbW9kdWxlX2VudHJ5KGVudHJ5LCBpdGVyX2JlZ2luLAotCQkJCQkJCSAgIGNvdW50LCBtb2QpOwotCQlpZiAoSVNfRVJSKG1vZHVsZV9lbnRyeSkpCi0JCQlyZXR1cm4gUFRSX0VSUihtb2R1bGVfZW50cnkpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcmVtb3ZlX2p1bXBfbGFiZWxfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZCkKLXsKLQlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKm5vZGVfbmV4dCwgKm1vZHVsZV9ub2RlLCAqbW9kdWxlX25vZGVfbmV4dDsKLQlzdHJ1Y3QganVtcF9sYWJlbF9lbnRyeSAqZTsKLQlzdHJ1Y3QganVtcF9sYWJlbF9tb2R1bGVfZW50cnkgKmVfbW9kdWxlOwotCWludCBpOwotCi0JLyogaWYgdGhlIG1vZHVsZSBkb2Vzbid0IGhhdmUganVtcCBsYWJlbCBlbnRyaWVzLCBqdXN0IHJldHVybiAqLwotCWlmICghbW9kLT5udW1fanVtcF9lbnRyaWVzKQotCQlyZXR1cm47Ci0KLQlmb3IgKGkgPSAwOyBpIDwgSlVNUF9MQUJFTF9UQUJMRV9TSVpFOyBpKyspIHsKLQkJaGVhZCA9ICZqdW1wX2xhYmVsX3RhYmxlW2ldOwotCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGUsIG5vZGUsIG5vZGVfbmV4dCwgaGVhZCwgaGxpc3QpIHsKLQkJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZV9tb2R1bGUsIG1vZHVsZV9ub2RlLAotCQkJCQkJICBtb2R1bGVfbm9kZV9uZXh0LAotCQkJCQkJICAmKGUtPm1vZHVsZXMpLCBobGlzdCkgewotCQkJCWlmIChlX21vZHVsZS0+bW9kID09IG1vZCkgewotCQkJCQlobGlzdF9kZWwoJmVfbW9kdWxlLT5obGlzdCk7Ci0JCQkJCWtmcmVlKGVfbW9kdWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaGxpc3RfZW1wdHkoJmUtPm1vZHVsZXMpICYmIChlLT5ucl9lbnRyaWVzID09IDApKSB7Ci0JCQkJaGxpc3RfZGVsKCZlLT5obGlzdCk7Ci0JCQkJa2ZyZWUoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHJlbW92ZV9qdW1wX2xhYmVsX21vZHVsZV9pbml0KHN0cnVjdCBtb2R1bGUgKm1vZCkKLXsKLQlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKm5vZGVfbmV4dCwgKm1vZHVsZV9ub2RlLCAqbW9kdWxlX25vZGVfbmV4dDsKLQlzdHJ1Y3QganVtcF9sYWJlbF9lbnRyeSAqZTsKLQlzdHJ1Y3QganVtcF9sYWJlbF9tb2R1bGVfZW50cnkgKmVfbW9kdWxlOwotCXN0cnVjdCBqdW1wX2VudHJ5ICppdGVyOwotCWludCBpLCBjb3VudDsKLQotCS8qIGlmIHRoZSBtb2R1bGUgZG9lc24ndCBoYXZlIGp1bXAgbGFiZWwgZW50cmllcywganVzdCByZXR1cm4gKi8KLQlpZiAoIW1vZC0+bnVtX2p1bXBfZW50cmllcykKLQkJcmV0dXJuOwotCi0JZm9yIChpID0gMDsgaSA8IEpVTVBfTEFCRUxfVEFCTEVfU0laRTsgaSsrKSB7Ci0JCWhlYWQgPSAmanVtcF9sYWJlbF90YWJsZVtpXTsKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlLCBub2RlLCBub2RlX25leHQsIGhlYWQsIGhsaXN0KSB7Ci0JCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVfbW9kdWxlLCBtb2R1bGVfbm9kZSwKLQkJCQkJCSAgbW9kdWxlX25vZGVfbmV4dCwKLQkJCQkJCSAgJihlLT5tb2R1bGVzKSwgaGxpc3QpIHsKLQkJCQlpZiAoZV9tb2R1bGUtPm1vZCAhPSBtb2QpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWNvdW50ID0gZV9tb2R1bGUtPm5yX2VudHJpZXM7Ci0JCQkJaXRlciA9IGVfbW9kdWxlLT50YWJsZTsKLQkJCQl3aGlsZSAoY291bnQtLSkgewotCQkJCQlpZiAod2l0aGluX21vZHVsZV9pbml0KGl0ZXItPmNvZGUsIG1vZCkpCi0JCQkJCQlpdGVyLT5rZXkgPSAwOwotCQkJCQlpdGVyKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQotCi1zdGF0aWMgaW50Ci1qdW1wX2xhYmVsX21vZHVsZV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIHZhbCwKLQkJCSB2b2lkICpkYXRhKQotewotCXN0cnVjdCBtb2R1bGUgKm1vZCA9IGRhdGE7Ci0JaW50IHJldCA9IDA7Ci0KLQlzd2l0Y2ggKHZhbCkgewotCWNhc2UgTU9EVUxFX1NUQVRFX0NPTUlORzoKLQkJanVtcF9sYWJlbF9sb2NrKCk7Ci0JCXJldCA9IGFkZF9qdW1wX2xhYmVsX21vZHVsZShtb2QpOwotCQlpZiAocmV0KQotCQkJcmVtb3ZlX2p1bXBfbGFiZWxfbW9kdWxlKG1vZCk7Ci0JCWp1bXBfbGFiZWxfdW5sb2NrKCk7Ci0JCWJyZWFrOwotCWNhc2UgTU9EVUxFX1NUQVRFX0dPSU5HOgotCQlqdW1wX2xhYmVsX2xvY2soKTsKLQkJcmVtb3ZlX2p1bXBfbGFiZWxfbW9kdWxlKG1vZCk7Ci0JCWp1bXBfbGFiZWxfdW5sb2NrKCk7Ci0JCWJyZWFrOwotCWNhc2UgTU9EVUxFX1NUQVRFX0xJVkU6Ci0JCWp1bXBfbGFiZWxfbG9jaygpOwotCQlyZW1vdmVfanVtcF9sYWJlbF9tb2R1bGVfaW5pdChtb2QpOwotCQlqdW1wX2xhYmVsX3VubG9jaygpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqKgotICogYXBwbHlfanVtcF9sYWJlbF9ub3BzIC0gcGF0Y2ggbW9kdWxlIGp1bXAgbGFiZWxzIHdpdGggYXJjaF9nZXRfanVtcF9sYWJlbF9ub3AoKQotICogQG1vZDogbW9kdWxlIHRvIHBhdGNoCi0gKgotICogQWxsb3cgZm9yIHJ1bi10aW1lIHNlbGVjdGlvbiBvZiB0aGUgb3B0aW1hbCBub3BzLiBCZWZvcmUgdGhlIG1vZHVsZQotICogbG9hZHMgcGF0Y2ggdGhlc2Ugd2l0aCBhcmNoX2dldF9qdW1wX2xhYmVsX25vcCgpLCB3aGljaCBpcyBzcGVjaWZpZWQgYnkKLSAqIHRoZSBhcmNoIHNwZWNpZmljIGp1bXAgbGFiZWwgY29kZS4KLSAqLwotdm9pZCBqdW1wX2xhYmVsX2FwcGx5X25vcHMoc3RydWN0IG1vZHVsZSAqbW9kKQotewotCXN0cnVjdCBqdW1wX2VudHJ5ICppdGVyOwotCi0JLyogaWYgdGhlIG1vZHVsZSBkb2Vzbid0IGhhdmUganVtcCBsYWJlbCBlbnRyaWVzLCBqdXN0IHJldHVybiAqLwotCWlmICghbW9kLT5udW1fanVtcF9lbnRyaWVzKQotCQlyZXR1cm47Ci0KLQlpdGVyID0gbW9kLT5qdW1wX2VudHJpZXM7Ci0Jd2hpbGUgKGl0ZXIgPCBtb2QtPmp1bXBfZW50cmllcyArIG1vZC0+bnVtX2p1bXBfZW50cmllcykgewotCQlhcmNoX2p1bXBfbGFiZWxfdGV4dF9wb2tlX2Vhcmx5KGl0ZXItPmNvZGUpOwotCQlpdGVyKys7Ci0JfQotfQotCi1zdHJ1Y3Qgbm90aWZpZXJfYmxvY2sganVtcF9sYWJlbF9tb2R1bGVfbmIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBqdW1wX2xhYmVsX21vZHVsZV9ub3RpZnksCi0JLnByaW9yaXR5ID0gMCwKLX07Ci0KLXN0YXRpYyBfX2luaXQgaW50IGluaXRfanVtcF9sYWJlbF9tb2R1bGUodm9pZCkKLXsKLQlyZXR1cm4gcmVnaXN0ZXJfbW9kdWxlX25vdGlmaWVyKCZqdW1wX2xhYmVsX21vZHVsZV9uYik7Ci19Ci1lYXJseV9pbml0Y2FsbChpbml0X2p1bXBfbGFiZWxfbW9kdWxlKTsKLQotI2VuZGlmIC8qIENPTkZJR19NT0RVTEVTICovCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEva2VybmVsL2tleGVjLmMgYi9rZXJuZWwva2V4ZWMuYwppbmRleCA4N2I3N2RlLi44ZDgxNGNiIDEwMDY0NAotLS0gYS9rZXJuZWwva2V4ZWMuYworKysgYi9rZXJuZWwva2V4ZWMuYwpAQCAtMTUzMSwxMyArMTUzMSw3IEBACiAJCWlmIChlcnJvcikKIAkJCWdvdG8gRW5hYmxlX2NwdXM7CiAJCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JCS8qIFN1c3BlbmQgc3lzdGVtIGRldmljZXMgKi8KLQkJZXJyb3IgPSBzeXNkZXZfc3VzcGVuZChQTVNHX0ZSRUVaRSk7Ci0JCWlmICghZXJyb3IpIHsKLQkJCWVycm9yID0gc3lzY29yZV9zdXNwZW5kKCk7Ci0JCQlpZiAoZXJyb3IpCi0JCQkJc3lzZGV2X3Jlc3VtZSgpOwotCQl9CisJCWVycm9yID0gc3lzY29yZV9zdXNwZW5kKCk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gRW5hYmxlX2lycXM7CiAJfSBlbHNlCkBAIC0xNTUzLDcgKzE1NDcsNiBAQAogI2lmZGVmIENPTkZJR19LRVhFQ19KVU1QCiAJaWYgKGtleGVjX2ltYWdlLT5wcmVzZXJ2ZV9jb250ZXh0KSB7CiAJCXN5c2NvcmVfcmVzdW1lKCk7Ci0JCXN5c2Rldl9yZXN1bWUoKTsKICBFbmFibGVfaXJxczoKIAkJbG9jYWxfaXJxX2VuYWJsZSgpOwogIEVuYWJsZV9jcHVzOgpkaWZmIC0tZ2l0IGEva2VybmVsL2ttb2QuYyBiL2tlcm5lbC9rbW9kLmMKaW5kZXggOWNkMDU5MS4uNWFlMGZmMyAxMDA2NDQKLS0tIGEva2VybmVsL2ttb2QuYworKysgYi9rZXJuZWwva21vZC5jCkBAIC0yNDUsNyArMjQ1LDYgQEAKIAl9CiB9CiAKLSNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIC8qCiAgKiBJZiBzZXQsIGNhbGxfdXNlcm1vZGVoZWxwZXJfZXhlYygpIHdpbGwgZXhpdCBpbW1lZGlhdGVseSByZXR1cm5pbmcgLUVCVVNZCiAgKiAodXNlZCBmb3IgcHJldmVudGluZyB1c2VyIGxhbmQgcHJvY2Vzc2VzIGZyb20gYmVpbmcgY3JlYXRlZCBhZnRlciB0aGUgdXNlcgpAQCAtMzAxLDYgKzMwMCwxNSBAQAogCXVzZXJtb2RlaGVscGVyX2Rpc2FibGVkID0gMDsKIH0KIAorLyoqCisgKiB1c2VybW9kZWhlbHBlcl9pc19kaXNhYmxlZCAtIGNoZWNrIGlmIG5ldyBoZWxwZXJzIGFyZSBhbGxvd2VkIHRvIGJlIHN0YXJ0ZWQKKyAqLworYm9vbCB1c2VybW9kZWhlbHBlcl9pc19kaXNhYmxlZCh2b2lkKQoreworCXJldHVybiB1c2VybW9kZWhlbHBlcl9kaXNhYmxlZDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVzZXJtb2RlaGVscGVyX2lzX2Rpc2FibGVkKTsKKwogc3RhdGljIHZvaWQgaGVscGVyX2xvY2sodm9pZCkKIHsKIAlhdG9taWNfaW5jKCZydW5uaW5nX2hlbHBlcnMpOwpAQCAtMzEyLDEyICszMjAsNiBAQAogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZydW5uaW5nX2hlbHBlcnMpKQogCQl3YWtlX3VwKCZydW5uaW5nX2hlbHBlcnNfd2FpdHEpOwogfQotI2Vsc2UgLyogQ09ORklHX1BNX1NMRUVQICovCi0jZGVmaW5lIHVzZXJtb2RlaGVscGVyX2Rpc2FibGVkCTAKLQotc3RhdGljIGlubGluZSB2b2lkIGhlbHBlcl9sb2NrKHZvaWQpIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQgaGVscGVyX3VubG9jayh2b2lkKSB7fQotI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLwogCiAvKioKICAqIGNhbGxfdXNlcm1vZGVoZWxwZXJfc2V0dXAgLSBwcmVwYXJlIHRvIGNhbGwgYSB1c2VybW9kZSBoZWxwZXIKZGlmZiAtLWdpdCBhL2tlcm5lbC9rc3lzZnMuYyBiL2tlcm5lbC9rc3lzZnMuYwppbmRleCAwYjYyNGU3Li4zYjA1M2MwIDEwMDY0NAotLS0gYS9rZXJuZWwva3N5c2ZzLmMKKysrIGIva2VybmVsL2tzeXNmcy5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAKICNkZWZpbmUgS0VSTkVMX0FUVFJfUk8oX25hbWUpIFwKIHN0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgX25hbWUjI19hdHRyID0gX19BVFRSX1JPKF9uYW1lKQpAQCAtMTMxLDYgKzEzMiwxNCBAQAogCiAjZW5kaWYgLyogQ09ORklHX0tFWEVDICovCiAKKy8qIHdoZXRoZXIgZmlsZSBjYXBhYmlsaXRpZXMgYXJlIGVuYWJsZWQgKi8KK3N0YXRpYyBzc2l6ZV90IGZzY2Fwc19zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGZpbGVfY2Fwc19lbmFibGVkKTsKK30KK0tFUk5FTF9BVFRSX1JPKGZzY2Fwcyk7CisKIC8qCiAgKiBNYWtlIC9zeXMva2VybmVsL25vdGVzIGdpdmUgdGhlIHJhdyBjb250ZW50cyBvZiBvdXIga2VybmVsIC5ub3RlcyBzZWN0aW9uLgogICovCkBAIC0xNTgsNiArMTY3LDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGtlcm5lbF9rb2JqKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKiBrZXJuZWxfYXR0cnNbXSA9IHsKKwkmZnNjYXBzX2F0dHIuYXR0ciwKICNpZiBkZWZpbmVkKENPTkZJR19IT1RQTFVHKQogCSZ1ZXZlbnRfc2VxbnVtX2F0dHIuYXR0ciwKIAkmdWV2ZW50X2hlbHBlcl9hdHRyLmF0dHIsCmRpZmYgLS1naXQgYS9rZXJuZWwvbG9ja2RlcC5jIGIva2VybmVsL2xvY2tkZXAuYwppbmRleCA1M2E2ODk1Li42MzQzN2QwIDEwMDY0NAotLS0gYS9rZXJuZWwvbG9ja2RlcC5jCisrKyBiL2tlcm5lbC9sb2NrZGVwLmMKQEAgLTQ5MCw2ICs0OTAsMTggQEAKIAl1c2FnZVtpXSA9ICdcMCc7CiB9CiAKK3N0YXRpYyBpbnQgX19wcmludF9sb2NrX25hbWUoc3RydWN0IGxvY2tfY2xhc3MgKmNsYXNzKQoreworCWNoYXIgc3RyW0tTWU1fTkFNRV9MRU5dOworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwluYW1lID0gY2xhc3MtPm5hbWU7CisJaWYgKCFuYW1lKQorCQluYW1lID0gX19nZXRfa2V5X25hbWUoY2xhc3MtPmtleSwgc3RyKTsKKworCXJldHVybiBwcmludGsoIiVzIiwgbmFtZSk7Cit9CisKIHN0YXRpYyB2b2lkIHByaW50X2xvY2tfbmFtZShzdHJ1Y3QgbG9ja19jbGFzcyAqY2xhc3MpCiB7CiAJY2hhciBzdHJbS1NZTV9OQU1FX0xFTl0sIHVzYWdlW0xPQ0tfVVNBR0VfQ0hBUlNdOwpAQCAtMTA1Myw2ICsxMDY1LDU2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkCitwcmludF9jaXJjdWxhcl9sb2NrX3NjZW5hcmlvKHN0cnVjdCBoZWxkX2xvY2sgKnNyYywKKwkJCSAgICAgc3RydWN0IGhlbGRfbG9jayAqdGd0LAorCQkJICAgICBzdHJ1Y3QgbG9ja19saXN0ICpwcnQpCit7CisJc3RydWN0IGxvY2tfY2xhc3MgKnNvdXJjZSA9IGhsb2NrX2NsYXNzKHNyYyk7CisJc3RydWN0IGxvY2tfY2xhc3MgKnRhcmdldCA9IGhsb2NrX2NsYXNzKHRndCk7CisJc3RydWN0IGxvY2tfY2xhc3MgKnBhcmVudCA9IHBydC0+Y2xhc3M7CisKKwkvKgorCSAqIEEgZGlyZWN0IGxvY2tpbmcgcHJvYmxlbSB3aGVyZSB1bnNhZmVfY2xhc3MgbG9jayBpcyB0YWtlbgorCSAqIGRpcmVjdGx5IGJ5IHNhZmVfY2xhc3MgbG9jaywgdGhlbiBhbGwgd2UgbmVlZCB0byBzaG93CisJICogaXMgdGhlIGRlYWRsb2NrIHNjZW5hcmlvLCBhcyBpdCBpcyBvYnZpb3VzIHRoYXQgdGhlCisJICogdW5zYWZlIGxvY2sgaXMgdGFrZW4gdW5kZXIgdGhlIHNhZmUgbG9jay4KKwkgKgorCSAqIEJ1dCBpZiB0aGVyZSBpcyBhIGNoYWluIGluc3RlYWQsIHdoZXJlIHRoZSBzYWZlIGxvY2sgdGFrZXMKKwkgKiBhbiBpbnRlcm1lZGlhdGUgbG9jayAobWlkZGxlX2NsYXNzKSB3aGVyZSB0aGlzIGxvY2sgaXMKKwkgKiBub3QgdGhlIHNhbWUgYXMgdGhlIHNhZmUgbG9jaywgdGhlbiB0aGUgbG9jayBjaGFpbiBpcworCSAqIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHByb2JsZW0uIE90aGVyd2lzZSB3ZSB3b3VsZCBuZWVkCisJICogdG8gc2hvdyBhIGRpZmZlcmVudCBDUFUgY2FzZSBmb3IgZWFjaCBsaW5rIGluIHRoZSBjaGFpbgorCSAqIGZyb20gdGhlIHNhZmVfY2xhc3MgbG9jayB0byB0aGUgdW5zYWZlX2NsYXNzIGxvY2suCisJICovCisJaWYgKHBhcmVudCAhPSBzb3VyY2UpIHsKKwkJcHJpbnRrKCJDaGFpbiBleGlzdHMgb2Y6XG4gICIpOworCQlfX3ByaW50X2xvY2tfbmFtZShzb3VyY2UpOworCQlwcmludGsoIiAtLT4gIik7CisJCV9fcHJpbnRfbG9ja19uYW1lKHBhcmVudCk7CisJCXByaW50aygiIC0tPiAiKTsKKwkJX19wcmludF9sb2NrX25hbWUodGFyZ2V0KTsKKwkJcHJpbnRrKCJcblxuIik7CisJfQorCisJcHJpbnRrKCIgUG9zc2libGUgdW5zYWZlIGxvY2tpbmcgc2NlbmFyaW86XG5cbiIpOworCXByaW50aygiICAgICAgIENQVTAgICAgICAgICAgICAgICAgICAgIENQVTFcbiIpOworCXByaW50aygiICAgICAgIC0tLS0gICAgICAgICAgICAgICAgICAgIC0tLS1cbiIpOworCXByaW50aygiICBsb2NrKCIpOworCV9fcHJpbnRfbG9ja19uYW1lKHRhcmdldCk7CisJcHJpbnRrKCIpO1xuIik7CisJcHJpbnRrKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jaygiKTsKKwlfX3ByaW50X2xvY2tfbmFtZShwYXJlbnQpOworCXByaW50aygiKTtcbiIpOworCXByaW50aygiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2soIik7CisJX19wcmludF9sb2NrX25hbWUodGFyZ2V0KTsKKwlwcmludGsoIik7XG4iKTsKKwlwcmludGsoIiAgbG9jaygiKTsKKwlfX3ByaW50X2xvY2tfbmFtZShzb3VyY2UpOworCXByaW50aygiKTtcbiIpOworCXByaW50aygiXG4gKioqIERFQURMT0NLICoqKlxuXG4iKTsKK30KKwogLyoKICAqIFdoZW4gYSBjaXJjdWxhciBkZXBlbmRlbmN5IGlzIGRldGVjdGVkLCBwcmludCB0aGUKICAqIGhlYWRlciBmaXJzdDoKQEAgLTEwOTYsNiArMTE1OCw3IEBACiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyID0gY3VycmVudDsKIAlzdHJ1Y3QgbG9ja19saXN0ICpwYXJlbnQ7CisJc3RydWN0IGxvY2tfbGlzdCAqZmlyc3RfcGFyZW50OwogCWludCBkZXB0aDsKIAogCWlmICghZGVidWdfbG9ja3Nfb2ZmX2dyYXBoX3VubG9jaygpIHx8IGRlYnVnX2xvY2tzX3NpbGVudCkKQEAgLTExMDksNiArMTE3Miw3IEBACiAJcHJpbnRfY2lyY3VsYXJfYnVnX2hlYWRlcih0YXJnZXQsIGRlcHRoLCBjaGVja19zcmMsIGNoZWNrX3RndCk7CiAKIAlwYXJlbnQgPSBnZXRfbG9ja19wYXJlbnQodGFyZ2V0KTsKKwlmaXJzdF9wYXJlbnQgPSBwYXJlbnQ7CiAKIAl3aGlsZSAocGFyZW50KSB7CiAJCXByaW50X2NpcmN1bGFyX2J1Z19lbnRyeShwYXJlbnQsIC0tZGVwdGgpOwpAQCAtMTExNiw2ICsxMTgwLDkgQEAKIAl9CiAKIAlwcmludGsoIlxub3RoZXIgaW5mbyB0aGF0IG1pZ2h0IGhlbHAgdXMgZGVidWcgdGhpczpcblxuIik7CisJcHJpbnRfY2lyY3VsYXJfbG9ja19zY2VuYXJpbyhjaGVja19zcmMsIGNoZWNrX3RndCwKKwkJCQkgICAgIGZpcnN0X3BhcmVudCk7CisKIAlsb2NrZGVwX3ByaW50X2hlbGRfbG9ja3MoY3Vycik7CiAKIAlwcmludGsoIlxuc3RhY2sgYmFja3RyYWNlOlxuIik7CkBAIC0xMzE0LDcgKzEzODEsNyBAQAogCQlwcmludGsoIlxuIik7CiAKIAkJaWYgKGRlcHRoID09IDAgJiYgKGVudHJ5ICE9IHJvb3QpKSB7Ci0JCQlwcmludGsoImxvY2tkZXA6JXMgYmFkIEJGUyBnZW5lcmF0ZWQgdHJlZVxuIiwgX19mdW5jX18pOworCQkJcHJpbnRrKCJsb2NrZGVwOiVzIGJhZCBwYXRoIGZvdW5kIGluIGNoYWluIGdyYXBoXG4iLCBfX2Z1bmNfXyk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0xMzI1LDYgKzEzOTIsNjIgQEAKIAlyZXR1cm47CiB9CiAKK3N0YXRpYyB2b2lkCitwcmludF9pcnFfbG9ja19zY2VuYXJpbyhzdHJ1Y3QgbG9ja19saXN0ICpzYWZlX2VudHJ5LAorCQkJc3RydWN0IGxvY2tfbGlzdCAqdW5zYWZlX2VudHJ5LAorCQkJc3RydWN0IGxvY2tfY2xhc3MgKnByZXZfY2xhc3MsCisJCQlzdHJ1Y3QgbG9ja19jbGFzcyAqbmV4dF9jbGFzcykKK3sKKwlzdHJ1Y3QgbG9ja19jbGFzcyAqc2FmZV9jbGFzcyA9IHNhZmVfZW50cnktPmNsYXNzOworCXN0cnVjdCBsb2NrX2NsYXNzICp1bnNhZmVfY2xhc3MgPSB1bnNhZmVfZW50cnktPmNsYXNzOworCXN0cnVjdCBsb2NrX2NsYXNzICptaWRkbGVfY2xhc3MgPSBwcmV2X2NsYXNzOworCisJaWYgKG1pZGRsZV9jbGFzcyA9PSBzYWZlX2NsYXNzKQorCQltaWRkbGVfY2xhc3MgPSBuZXh0X2NsYXNzOworCisJLyoKKwkgKiBBIGRpcmVjdCBsb2NraW5nIHByb2JsZW0gd2hlcmUgdW5zYWZlX2NsYXNzIGxvY2sgaXMgdGFrZW4KKwkgKiBkaXJlY3RseSBieSBzYWZlX2NsYXNzIGxvY2ssIHRoZW4gYWxsIHdlIG5lZWQgdG8gc2hvdworCSAqIGlzIHRoZSBkZWFkbG9jayBzY2VuYXJpbywgYXMgaXQgaXMgb2J2aW91cyB0aGF0IHRoZQorCSAqIHVuc2FmZSBsb2NrIGlzIHRha2VuIHVuZGVyIHRoZSBzYWZlIGxvY2suCisJICoKKwkgKiBCdXQgaWYgdGhlcmUgaXMgYSBjaGFpbiBpbnN0ZWFkLCB3aGVyZSB0aGUgc2FmZSBsb2NrIHRha2VzCisJICogYW4gaW50ZXJtZWRpYXRlIGxvY2sgKG1pZGRsZV9jbGFzcykgd2hlcmUgdGhpcyBsb2NrIGlzCisJICogbm90IHRoZSBzYW1lIGFzIHRoZSBzYWZlIGxvY2ssIHRoZW4gdGhlIGxvY2sgY2hhaW4gaXMKKwkgKiB1c2VkIHRvIGRlc2NyaWJlIHRoZSBwcm9ibGVtLiBPdGhlcndpc2Ugd2Ugd291bGQgbmVlZAorCSAqIHRvIHNob3cgYSBkaWZmZXJlbnQgQ1BVIGNhc2UgZm9yIGVhY2ggbGluayBpbiB0aGUgY2hhaW4KKwkgKiBmcm9tIHRoZSBzYWZlX2NsYXNzIGxvY2sgdG8gdGhlIHVuc2FmZV9jbGFzcyBsb2NrLgorCSAqLworCWlmIChtaWRkbGVfY2xhc3MgIT0gdW5zYWZlX2NsYXNzKSB7CisJCXByaW50aygiQ2hhaW4gZXhpc3RzIG9mOlxuICAiKTsKKwkJX19wcmludF9sb2NrX25hbWUoc2FmZV9jbGFzcyk7CisJCXByaW50aygiIC0tPiAiKTsKKwkJX19wcmludF9sb2NrX25hbWUobWlkZGxlX2NsYXNzKTsKKwkJcHJpbnRrKCIgLS0+ICIpOworCQlfX3ByaW50X2xvY2tfbmFtZSh1bnNhZmVfY2xhc3MpOworCQlwcmludGsoIlxuXG4iKTsKKwl9CisKKwlwcmludGsoIiBQb3NzaWJsZSBpbnRlcnJ1cHQgdW5zYWZlIGxvY2tpbmcgc2NlbmFyaW86XG5cbiIpOworCXByaW50aygiICAgICAgIENQVTAgICAgICAgICAgICAgICAgICAgIENQVTFcbiIpOworCXByaW50aygiICAgICAgIC0tLS0gICAgICAgICAgICAgICAgICAgIC0tLS1cbiIpOworCXByaW50aygiICBsb2NrKCIpOworCV9fcHJpbnRfbG9ja19uYW1lKHVuc2FmZV9jbGFzcyk7CisJcHJpbnRrKCIpO1xuIik7CisJcHJpbnRrKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfaXJxX2Rpc2FibGUoKTtcbiIpOworCXByaW50aygiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2soIik7CisJX19wcmludF9sb2NrX25hbWUoc2FmZV9jbGFzcyk7CisJcHJpbnRrKCIpO1xuIik7CisJcHJpbnRrKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jaygiKTsKKwlfX3ByaW50X2xvY2tfbmFtZShtaWRkbGVfY2xhc3MpOworCXByaW50aygiKTtcbiIpOworCXByaW50aygiICA8SW50ZXJydXB0PlxuIik7CisJcHJpbnRrKCIgICAgbG9jaygiKTsKKwlfX3ByaW50X2xvY2tfbmFtZShzYWZlX2NsYXNzKTsKKwlwcmludGsoIik7XG4iKTsKKwlwcmludGsoIlxuICoqKiBERUFETE9DSyAqKipcblxuIik7Cit9CisKIHN0YXRpYyBpbnQKIHByaW50X2JhZF9pcnFfZGVwZW5kZW5jeShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIsCiAJCQkgc3RydWN0IGxvY2tfbGlzdCAqcHJldl9yb290LApAQCAtMTM3Niw2ICsxNDk5LDkgQEAKIAlwcmludF9zdGFja190cmFjZShmb3J3YXJkc19lbnRyeS0+Y2xhc3MtPnVzYWdlX3RyYWNlcyArIGJpdDIsIDEpOwogCiAJcHJpbnRrKCJcbm90aGVyIGluZm8gdGhhdCBtaWdodCBoZWxwIHVzIGRlYnVnIHRoaXM6XG5cbiIpOworCXByaW50X2lycV9sb2NrX3NjZW5hcmlvKGJhY2t3YXJkc19lbnRyeSwgZm9yd2FyZHNfZW50cnksCisJCQkJaGxvY2tfY2xhc3MocHJldiksIGhsb2NrX2NsYXNzKG5leHQpKTsKKwogCWxvY2tkZXBfcHJpbnRfaGVsZF9sb2NrcyhjdXJyKTsKIAogCXByaW50aygiXG50aGUgZGVwZW5kZW5jaWVzIGJldHdlZW4gJXMtaXJxLXNhZmUgbG9jayIsIGlycWNsYXNzKTsKQEAgLTE1MzksNiArMTY2NSwyNiBAQAogCiAjZW5kaWYKIAorc3RhdGljIHZvaWQKK3ByaW50X2RlYWRsb2NrX3NjZW5hcmlvKHN0cnVjdCBoZWxkX2xvY2sgKm54dCwKKwkJCSAgICAgc3RydWN0IGhlbGRfbG9jayAqcHJ2KQoreworCXN0cnVjdCBsb2NrX2NsYXNzICpuZXh0ID0gaGxvY2tfY2xhc3Mobnh0KTsKKwlzdHJ1Y3QgbG9ja19jbGFzcyAqcHJldiA9IGhsb2NrX2NsYXNzKHBydik7CisKKwlwcmludGsoIiBQb3NzaWJsZSB1bnNhZmUgbG9ja2luZyBzY2VuYXJpbzpcblxuIik7CisJcHJpbnRrKCIgICAgICAgQ1BVMFxuIik7CisJcHJpbnRrKCIgICAgICAgLS0tLVxuIik7CisJcHJpbnRrKCIgIGxvY2soIik7CisJX19wcmludF9sb2NrX25hbWUocHJldik7CisJcHJpbnRrKCIpO1xuIik7CisJcHJpbnRrKCIgIGxvY2soIik7CisJX19wcmludF9sb2NrX25hbWUobmV4dCk7CisJcHJpbnRrKCIpO1xuIik7CisJcHJpbnRrKCJcbiAqKiogREVBRExPQ0sgKioqXG5cbiIpOworCXByaW50aygiIE1heSBiZSBkdWUgdG8gbWlzc2luZyBsb2NrIG5lc3Rpbmcgbm90YXRpb25cblxuIik7Cit9CisKIHN0YXRpYyBpbnQKIHByaW50X2RlYWRsb2NrX2J1ZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIsIHN0cnVjdCBoZWxkX2xvY2sgKnByZXYsCiAJCSAgIHN0cnVjdCBoZWxkX2xvY2sgKm5leHQpCkBAIC0xNTU3LDYgKzE3MDMsNyBAQAogCXByaW50X2xvY2socHJldik7CiAKIAlwcmludGsoIlxub3RoZXIgaW5mbyB0aGF0IG1pZ2h0IGhlbHAgdXMgZGVidWcgdGhpczpcbiIpOworCXByaW50X2RlYWRsb2NrX3NjZW5hcmlvKG5leHQsIHByZXYpOwogCWxvY2tkZXBfcHJpbnRfaGVsZF9sb2NrcyhjdXJyKTsKIAogCXByaW50aygiXG5zdGFjayBiYWNrdHJhY2U6XG4iKTsKQEAgLTE4MjYsNyArMTk3Myw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqaGFzaF9oZWFkID0gY2hhaW5oYXNoZW50cnkoY2hhaW5fa2V5KTsKIAlzdHJ1Y3QgbG9ja19jaGFpbiAqY2hhaW47CiAJc3RydWN0IGhlbGRfbG9jayAqaGxvY2tfY3VyciwgKmhsb2NrX25leHQ7Ci0JaW50IGksIGosIG4sIGNuOworCWludCBpLCBqOwogCiAJaWYgKERFQlVHX0xPQ0tTX1dBUk5fT04oIWlycXNfZGlzYWJsZWQoKSkpCiAJCXJldHVybiAwOwpAQCAtMTg4NiwxNSArMjAzMyw5IEBACiAJfQogCWkrKzsKIAljaGFpbi0+ZGVwdGggPSBjdXJyLT5sb2NrZGVwX2RlcHRoICsgMSAtIGk7Ci0JY24gPSBucl9jaGFpbl9obG9ja3M7Ci0Jd2hpbGUgKGNuICsgY2hhaW4tPmRlcHRoIDw9IE1BWF9MT0NLREVQX0NIQUlOX0hMT0NLUykgewotCQluID0gY21weGNoZygmbnJfY2hhaW5faGxvY2tzLCBjbiwgY24gKyBjaGFpbi0+ZGVwdGgpOwotCQlpZiAobiA9PSBjbikKLQkJCWJyZWFrOwotCQljbiA9IG47Ci0JfQotCWlmIChsaWtlbHkoY24gKyBjaGFpbi0+ZGVwdGggPD0gTUFYX0xPQ0tERVBfQ0hBSU5fSExPQ0tTKSkgewotCQljaGFpbi0+YmFzZSA9IGNuOworCWlmIChsaWtlbHkobnJfY2hhaW5faGxvY2tzICsgY2hhaW4tPmRlcHRoIDw9IE1BWF9MT0NLREVQX0NIQUlOX0hMT0NLUykpIHsKKwkJY2hhaW4tPmJhc2UgPSBucl9jaGFpbl9obG9ja3M7CisJCW5yX2NoYWluX2hsb2NrcyArPSBjaGFpbi0+ZGVwdGg7CiAJCWZvciAoaiA9IDA7IGogPCBjaGFpbi0+ZGVwdGggLSAxOyBqKyssIGkrKykgewogCQkJaW50IGxvY2tfaWQgPSBjdXJyLT5oZWxkX2xvY2tzW2ldLmNsYXNzX2lkeCAtIDE7CiAJCQljaGFpbl9obG9ja3NbY2hhaW4tPmJhc2UgKyBqXSA9IGxvY2tfaWQ7CkBAIC0yMDExLDYgKzIxNTIsMjQgQEAKICNlbmRpZgogfQogCitzdGF0aWMgdm9pZAorcHJpbnRfdXNhZ2VfYnVnX3NjZW5hcmlvKHN0cnVjdCBoZWxkX2xvY2sgKmxvY2spCit7CisJc3RydWN0IGxvY2tfY2xhc3MgKmNsYXNzID0gaGxvY2tfY2xhc3MobG9jayk7CisKKwlwcmludGsoIiBQb3NzaWJsZSB1bnNhZmUgbG9ja2luZyBzY2VuYXJpbzpcblxuIik7CisJcHJpbnRrKCIgICAgICAgQ1BVMFxuIik7CisJcHJpbnRrKCIgICAgICAgLS0tLVxuIik7CisJcHJpbnRrKCIgIGxvY2soIik7CisJX19wcmludF9sb2NrX25hbWUoY2xhc3MpOworCXByaW50aygiKTtcbiIpOworCXByaW50aygiICA8SW50ZXJydXB0PlxuIik7CisJcHJpbnRrKCIgICAgbG9jaygiKTsKKwlfX3ByaW50X2xvY2tfbmFtZShjbGFzcyk7CisJcHJpbnRrKCIpO1xuIik7CisJcHJpbnRrKCJcbiAqKiogREVBRExPQ0sgKioqXG5cbiIpOworfQorCiBzdGF0aWMgaW50CiBwcmludF91c2FnZV9idWcoc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyLCBzdHJ1Y3QgaGVsZF9sb2NrICp0aGlzLAogCQllbnVtIGxvY2tfdXNhZ2VfYml0IHByZXZfYml0LCBlbnVtIGxvY2tfdXNhZ2VfYml0IG5ld19iaXQpCkBAIC0yMDM5LDYgKzIxOTgsOCBAQAogCiAJcHJpbnRfaXJxdHJhY2VfZXZlbnRzKGN1cnIpOwogCXByaW50aygiXG5vdGhlciBpbmZvIHRoYXQgbWlnaHQgaGVscCB1cyBkZWJ1ZyB0aGlzOlxuIik7CisJcHJpbnRfdXNhZ2VfYnVnX3NjZW5hcmlvKHRoaXMpOworCiAJbG9ja2RlcF9wcmludF9oZWxkX2xvY2tzKGN1cnIpOwogCiAJcHJpbnRrKCJcbnN0YWNrIGJhY2t0cmFjZTpcbiIpOwpAQCAtMjA3Myw2ICsyMjM0LDEwIEBACiAJCQlzdHJ1Y3QgaGVsZF9sb2NrICp0aGlzLCBpbnQgZm9yd2FyZHMsCiAJCQljb25zdCBjaGFyICppcnFjbGFzcykKIHsKKwlzdHJ1Y3QgbG9ja19saXN0ICplbnRyeSA9IG90aGVyOworCXN0cnVjdCBsb2NrX2xpc3QgKm1pZGRsZSA9IE5VTEw7CisJaW50IGRlcHRoOworCiAJaWYgKCFkZWJ1Z19sb2Nrc19vZmZfZ3JhcGhfdW5sb2NrKCkgfHwgZGVidWdfbG9ja3Nfc2lsZW50KQogCQlyZXR1cm4gMDsKIApAQCAtMjA5MSw2ICsyMjU2LDI1IEBACiAJcHJpbnRrKCJcblxuYW5kIGludGVycnVwdHMgY291bGQgY3JlYXRlIGludmVyc2UgbG9jayBvcmRlcmluZyBiZXR3ZWVuIHRoZW0uXG5cbiIpOwogCiAJcHJpbnRrKCJcbm90aGVyIGluZm8gdGhhdCBtaWdodCBoZWxwIHVzIGRlYnVnIHRoaXM6XG4iKTsKKworCS8qIEZpbmQgYSBtaWRkbGUgbG9jayAoaWYgb25lIGV4aXN0cykgKi8KKwlkZXB0aCA9IGdldF9sb2NrX2RlcHRoKG90aGVyKTsKKwlkbyB7CisJCWlmIChkZXB0aCA9PSAwICYmIChlbnRyeSAhPSByb290KSkgeworCQkJcHJpbnRrKCJsb2NrZGVwOiVzIGJhZCBwYXRoIGZvdW5kIGluIGNoYWluIGdyYXBoXG4iLCBfX2Z1bmNfXyk7CisJCQlicmVhazsKKwkJfQorCQltaWRkbGUgPSBlbnRyeTsKKwkJZW50cnkgPSBnZXRfbG9ja19wYXJlbnQoZW50cnkpOworCQlkZXB0aC0tOworCX0gd2hpbGUgKGVudHJ5ICYmIGVudHJ5ICE9IHJvb3QgJiYgKGRlcHRoID49IDApKTsKKwlpZiAoZm9yd2FyZHMpCisJCXByaW50X2lycV9sb2NrX3NjZW5hcmlvKHJvb3QsIG90aGVyLAorCQkJbWlkZGxlID8gbWlkZGxlLT5jbGFzcyA6IHJvb3QtPmNsYXNzLCBvdGhlci0+Y2xhc3MpOworCWVsc2UKKwkJcHJpbnRfaXJxX2xvY2tfc2NlbmFyaW8ob3RoZXIsIHJvb3QsCisJCQltaWRkbGUgPyBtaWRkbGUtPmNsYXNzIDogb3RoZXItPmNsYXNzLCByb290LT5jbGFzcyk7CisKIAlsb2NrZGVwX3ByaW50X2hlbGRfbG9ja3MoY3Vycik7CiAKIAlwcmludGsoIlxudGhlIHNob3J0ZXN0IGRlcGVuZGVuY2llcyBiZXR3ZWVuIDJuZCBsb2NrIGFuZCAxc3QgbG9jazpcbiIpOwpkaWZmIC0tZ2l0IGEva2VybmVsL21vZHVsZS5jIGIva2VybmVsL21vZHVsZS5jCmluZGV4IGQ1OTM4YTUuLjIyODc5NzIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tb2R1bGUuYworKysgYi9rZXJuZWwvbW9kdWxlLmMKQEAgLTU3LDYgKzU3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rbWVtbGVhay5oPgogI2luY2x1ZGUgPGxpbnV4L2p1bXBfbGFiZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wZm4uaD4KKyNpbmNsdWRlIDxsaW51eC9ic2VhcmNoLmg+CiAKICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9tb2R1bGUuaD4KQEAgLTI0MCwyMyArMjQxLDI0IEBACiAJCQkJICAgc3RydWN0IG1vZHVsZSAqb3duZXIsCiAJCQkJICAgYm9vbCAoKmZuKShjb25zdCBzdHJ1Y3Qgc3ltc2VhcmNoICpzeW1zLAogCQkJCQkgICAgICBzdHJ1Y3QgbW9kdWxlICpvd25lciwKLQkJCQkJICAgICAgdW5zaWduZWQgaW50IHN5bW51bSwgdm9pZCAqZGF0YSksCisJCQkJCSAgICAgIHZvaWQgKmRhdGEpLAogCQkJCSAgIHZvaWQgKmRhdGEpCiB7Ci0JdW5zaWduZWQgaW50IGksIGo7CisJdW5zaWduZWQgaW50IGo7CiAKIAlmb3IgKGogPSAwOyBqIDwgYXJyc2l6ZTsgaisrKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBhcnJbal0uc3RvcCAtIGFycltqXS5zdGFydDsgaSsrKQotCQkJaWYgKGZuKCZhcnJbal0sIG93bmVyLCBpLCBkYXRhKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKGZuKCZhcnJbal0sIG93bmVyLCBkYXRhKSkKKwkJCXJldHVybiB0cnVlOwogCX0KIAogCXJldHVybiBmYWxzZTsKIH0KIAogLyogUmV0dXJucyB0cnVlIGFzIHNvb24gYXMgZm4gcmV0dXJucyB0cnVlLCBvdGhlcndpc2UgZmFsc2UuICovCi1ib29sIGVhY2hfc3ltYm9sKGJvb2wgKCpmbikoY29uc3Qgc3RydWN0IHN5bXNlYXJjaCAqYXJyLCBzdHJ1Y3QgbW9kdWxlICpvd25lciwKLQkJCSAgICB1bnNpZ25lZCBpbnQgc3ltbnVtLCB2b2lkICpkYXRhKSwgdm9pZCAqZGF0YSkKK2Jvb2wgZWFjaF9zeW1ib2xfc2VjdGlvbihib29sICgqZm4pKGNvbnN0IHN0cnVjdCBzeW1zZWFyY2ggKmFyciwKKwkJCQkgICAgc3RydWN0IG1vZHVsZSAqb3duZXIsCisJCQkJICAgIHZvaWQgKmRhdGEpLAorCQkJIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IG1vZHVsZSAqbW9kOwogCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3ltc2VhcmNoIGFycltdID0gewpAQCAtMzA5LDcgKzMxMSw3IEBACiAJfQogCXJldHVybiBmYWxzZTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGVhY2hfc3ltYm9sKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGVhY2hfc3ltYm9sX3NlY3Rpb24pOwogCiBzdHJ1Y3QgZmluZF9zeW1ib2xfYXJnIHsKIAkvKiBJbnB1dCAqLwpAQCAtMzIzLDE1ICszMjUsMTIgQEAKIAljb25zdCBzdHJ1Y3Qga2VybmVsX3N5bWJvbCAqc3ltOwogfTsKIAotc3RhdGljIGJvb2wgZmluZF9zeW1ib2xfaW5fc2VjdGlvbihjb25zdCBzdHJ1Y3Qgc3ltc2VhcmNoICpzeW1zLAotCQkJCSAgIHN0cnVjdCBtb2R1bGUgKm93bmVyLAotCQkJCSAgIHVuc2lnbmVkIGludCBzeW1udW0sIHZvaWQgKmRhdGEpCitzdGF0aWMgYm9vbCBjaGVja19zeW1ib2woY29uc3Qgc3RydWN0IHN5bXNlYXJjaCAqc3ltcywKKwkJCQkgc3RydWN0IG1vZHVsZSAqb3duZXIsCisJCQkJIHVuc2lnbmVkIGludCBzeW1udW0sIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGZpbmRfc3ltYm9sX2FyZyAqZnNhID0gZGF0YTsKIAotCWlmIChzdHJjbXAoc3ltcy0+c3RhcnRbc3ltbnVtXS5uYW1lLCBmc2EtPm5hbWUpICE9IDApCi0JCXJldHVybiBmYWxzZTsKLQogCWlmICghZnNhLT5ncGxvaykgewogCQlpZiAoc3ltcy0+bGljZW5jZSA9PSBHUExfT05MWSkKIAkJCXJldHVybiBmYWxzZTsKQEAgLTM2NSw2ICszNjQsMzAgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIGludCBjbXBfbmFtZShjb25zdCB2b2lkICp2YSwgY29uc3Qgdm9pZCAqdmIpCit7CisJY29uc3QgY2hhciAqYTsKKwljb25zdCBzdHJ1Y3Qga2VybmVsX3N5bWJvbCAqYjsKKwlhID0gdmE7IGIgPSB2YjsKKwlyZXR1cm4gc3RyY21wKGEsIGItPm5hbWUpOworfQorCitzdGF0aWMgYm9vbCBmaW5kX3N5bWJvbF9pbl9zZWN0aW9uKGNvbnN0IHN0cnVjdCBzeW1zZWFyY2ggKnN5bXMsCisJCQkJICAgc3RydWN0IG1vZHVsZSAqb3duZXIsCisJCQkJICAgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZmluZF9zeW1ib2xfYXJnICpmc2EgPSBkYXRhOworCXN0cnVjdCBrZXJuZWxfc3ltYm9sICpzeW07CisKKwlzeW0gPSBic2VhcmNoKGZzYS0+bmFtZSwgc3ltcy0+c3RhcnQsIHN5bXMtPnN0b3AgLSBzeW1zLT5zdGFydCwKKwkJCXNpemVvZihzdHJ1Y3Qga2VybmVsX3N5bWJvbCksIGNtcF9uYW1lKTsKKworCWlmIChzeW0gIT0gTlVMTCAmJiBjaGVja19zeW1ib2woc3ltcywgb3duZXIsIHN5bSAtIHN5bXMtPnN0YXJ0LCBkYXRhKSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKIC8qIEZpbmQgYSBzeW1ib2wgYW5kIHJldHVybiBpdCwgYWxvbmcgd2l0aCwgKG9wdGlvbmFsKSBjcmMgYW5kCiAgKiAob3B0aW9uYWwpIG1vZHVsZSB3aGljaCBvd25zIGl0LiAgTmVlZHMgcHJlZW1wdCBkaXNhYmxlZCBvciBtb2R1bGVfbXV0ZXguICovCiBjb25zdCBzdHJ1Y3Qga2VybmVsX3N5bWJvbCAqZmluZF9zeW1ib2woY29uc3QgY2hhciAqbmFtZSwKQEAgLTM3OSw3ICs0MDIsNyBAQAogCWZzYS5ncGxvayA9IGdwbG9rOwogCWZzYS53YXJuID0gd2FybjsKIAotCWlmIChlYWNoX3N5bWJvbChmaW5kX3N5bWJvbF9pbl9zZWN0aW9uLCAmZnNhKSkgeworCWlmIChlYWNoX3N5bWJvbF9zZWN0aW9uKGZpbmRfc3ltYm9sX2luX3NlY3Rpb24sICZmc2EpKSB7CiAJCWlmIChvd25lcikKIAkJCSpvd25lciA9IGZzYS5vd25lcjsKIAkJaWYgKGNyYykKQEAgLTE2MDcsMjcgKzE2MzAsMjggQEAKIAl9CiB9CiAKLS8qIFNldHRpbmcgbWVtb3J5IGJhY2sgdG8gUlcrTlggYmVmb3JlIHJlbGVhc2luZyBpdCAqLwotdm9pZCB1bnNldF9zZWN0aW9uX3JvX254KHN0cnVjdCBtb2R1bGUgKm1vZCwgdm9pZCAqbW9kdWxlX3JlZ2lvbikKK3N0YXRpYyB2b2lkIHVuc2V0X21vZHVsZV9jb3JlX3JvX254KHN0cnVjdCBtb2R1bGUgKm1vZCkKIHsKLQl1bnNpZ25lZCBsb25nIHRvdGFsX3BhZ2VzOworCXNldF9wYWdlX2F0dHJpYnV0ZXMobW9kLT5tb2R1bGVfY29yZSArIG1vZC0+Y29yZV90ZXh0X3NpemUsCisJCW1vZC0+bW9kdWxlX2NvcmUgKyBtb2QtPmNvcmVfc2l6ZSwKKwkJc2V0X21lbW9yeV94KTsKKwlzZXRfcGFnZV9hdHRyaWJ1dGVzKG1vZC0+bW9kdWxlX2NvcmUsCisJCW1vZC0+bW9kdWxlX2NvcmUgKyBtb2QtPmNvcmVfcm9fc2l6ZSwKKwkJc2V0X21lbW9yeV9ydyk7Cit9CiAKLQlpZiAobW9kLT5tb2R1bGVfY29yZSA9PSBtb2R1bGVfcmVnaW9uKSB7Ci0JCS8qIFNldCBjb3JlIGFzIE5YK1JXICovCi0JCXRvdGFsX3BhZ2VzID0gTU9EX05VTUJFUl9PRl9QQUdFUyhtb2QtPm1vZHVsZV9jb3JlLCBtb2QtPmNvcmVfc2l6ZSk7Ci0JCXNldF9tZW1vcnlfbngoKHVuc2lnbmVkIGxvbmcpbW9kLT5tb2R1bGVfY29yZSwgdG90YWxfcGFnZXMpOwotCQlzZXRfbWVtb3J5X3J3KCh1bnNpZ25lZCBsb25nKW1vZC0+bW9kdWxlX2NvcmUsIHRvdGFsX3BhZ2VzKTsKLQotCX0gZWxzZSBpZiAobW9kLT5tb2R1bGVfaW5pdCA9PSBtb2R1bGVfcmVnaW9uKSB7Ci0JCS8qIFNldCBpbml0IGFzIE5YK1JXICovCi0JCXRvdGFsX3BhZ2VzID0gTU9EX05VTUJFUl9PRl9QQUdFUyhtb2QtPm1vZHVsZV9pbml0LCBtb2QtPmluaXRfc2l6ZSk7Ci0JCXNldF9tZW1vcnlfbngoKHVuc2lnbmVkIGxvbmcpbW9kLT5tb2R1bGVfaW5pdCwgdG90YWxfcGFnZXMpOwotCQlzZXRfbWVtb3J5X3J3KCh1bnNpZ25lZCBsb25nKW1vZC0+bW9kdWxlX2luaXQsIHRvdGFsX3BhZ2VzKTsKLQl9CitzdGF0aWMgdm9pZCB1bnNldF9tb2R1bGVfaW5pdF9yb19ueChzdHJ1Y3QgbW9kdWxlICptb2QpCit7CisJc2V0X3BhZ2VfYXR0cmlidXRlcyhtb2QtPm1vZHVsZV9pbml0ICsgbW9kLT5pbml0X3RleHRfc2l6ZSwKKwkJbW9kLT5tb2R1bGVfaW5pdCArIG1vZC0+aW5pdF9zaXplLAorCQlzZXRfbWVtb3J5X3gpOworCXNldF9wYWdlX2F0dHJpYnV0ZXMobW9kLT5tb2R1bGVfaW5pdCwKKwkJbW9kLT5tb2R1bGVfaW5pdCArIG1vZC0+aW5pdF9yb19zaXplLAorCQlzZXRfbWVtb3J5X3J3KTsKIH0KIAogLyogSXRlcmF0ZSB0aHJvdWdoIGFsbCBtb2R1bGVzIGFuZCBzZXQgZWFjaCBtb2R1bGUncyB0ZXh0IGFzIFJXICovCi12b2lkIHNldF9hbGxfbW9kdWxlc190ZXh0X3J3KCkKK3ZvaWQgc2V0X2FsbF9tb2R1bGVzX3RleHRfcncodm9pZCkKIHsKIAlzdHJ1Y3QgbW9kdWxlICptb2Q7CiAKQEAgLTE2NDgsNyArMTY3Miw3IEBACiB9CiAKIC8qIEl0ZXJhdGUgdGhyb3VnaCBhbGwgbW9kdWxlcyBhbmQgc2V0IGVhY2ggbW9kdWxlJ3MgdGV4dCBhcyBSTyAqLwotdm9pZCBzZXRfYWxsX21vZHVsZXNfdGV4dF9ybygpCit2b2lkIHNldF9hbGxfbW9kdWxlc190ZXh0X3JvKHZvaWQpCiB7CiAJc3RydWN0IG1vZHVsZSAqbW9kOwogCkBAIC0xNjY5LDcgKzE2OTMsOCBAQAogfQogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfc2VjdGlvbl9yb19ueCh2b2lkICpiYXNlLCB1bnNpZ25lZCBsb25nIHRleHRfc2l6ZSwgdW5zaWduZWQgbG9uZyByb19zaXplLCB1bnNpZ25lZCBsb25nIHRvdGFsX3NpemUpIHsgfQotc3RhdGljIGlubGluZSB2b2lkIHVuc2V0X3NlY3Rpb25fcm9fbngoc3RydWN0IG1vZHVsZSAqbW9kLCB2b2lkICptb2R1bGVfcmVnaW9uKSB7IH0KK3N0YXRpYyB2b2lkIHVuc2V0X21vZHVsZV9jb3JlX3JvX254KHN0cnVjdCBtb2R1bGUgKm1vZCkgeyB9CitzdGF0aWMgdm9pZCB1bnNldF9tb2R1bGVfaW5pdF9yb19ueChzdHJ1Y3QgbW9kdWxlICptb2QpIHsgfQogI2VuZGlmCiAKIC8qIEZyZWUgYSBtb2R1bGUsIHJlbW92ZSBmcm9tIGxpc3RzLCBldGMuICovCkBAIC0xNjk2LDcgKzE3MjEsNyBAQAogCWRlc3Ryb3lfcGFyYW1zKG1vZC0+a3AsIG1vZC0+bnVtX2twKTsKIAogCS8qIFRoaXMgbWF5IGJlIE5VTEwsIGJ1dCB0aGF0J3MgT0sgKi8KLQl1bnNldF9zZWN0aW9uX3JvX254KG1vZCwgbW9kLT5tb2R1bGVfaW5pdCk7CisJdW5zZXRfbW9kdWxlX2luaXRfcm9fbngobW9kKTsKIAltb2R1bGVfZnJlZShtb2QsIG1vZC0+bW9kdWxlX2luaXQpOwogCWtmcmVlKG1vZC0+YXJncyk7CiAJcGVyY3B1X21vZGZyZWUobW9kKTsKQEAgLTE3MDUsNyArMTczMCw3IEBACiAJbG9ja2RlcF9mcmVlX2tleV9yYW5nZShtb2QtPm1vZHVsZV9jb3JlLCBtb2QtPmNvcmVfc2l6ZSk7CiAKIAkvKiBGaW5hbGx5LCBmcmVlIHRoZSBjb3JlIChjb250YWluaW5nIHRoZSBtb2R1bGUgc3RydWN0dXJlKSAqLwotCXVuc2V0X3NlY3Rpb25fcm9fbngobW9kLCBtb2QtPm1vZHVsZV9jb3JlKTsKKwl1bnNldF9tb2R1bGVfY29yZV9yb19ueChtb2QpOwogCW1vZHVsZV9mcmVlKG1vZCwgbW9kLT5tb2R1bGVfY29yZSk7CiAKICNpZmRlZiBDT05GSUdfTVBVCkBAIC0yMDMwLDExICsyMDU1LDggQEAKIAljb25zdCBzdHJ1Y3Qga2VybmVsX3N5bWJvbCAqc3RhcnQsCiAJY29uc3Qgc3RydWN0IGtlcm5lbF9zeW1ib2wgKnN0b3ApCiB7Ci0JY29uc3Qgc3RydWN0IGtlcm5lbF9zeW1ib2wgKmtzID0gc3RhcnQ7Ci0JZm9yICg7IGtzIDwgc3RvcDsga3MrKykKLQkJaWYgKHN0cmNtcChrcy0+bmFtZSwgbmFtZSkgPT0gMCkKLQkJCXJldHVybiBrczsKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gYnNlYXJjaChuYW1lLCBzdGFydCwgc3RvcCAtIHN0YXJ0LAorCQkJc2l6ZW9mKHN0cnVjdCBrZXJuZWxfc3ltYm9sKSwgY21wX25hbWUpOwogfQogCiBzdGF0aWMgaW50IGlzX2V4cG9ydGVkKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgdmFsdWUsCkBAIC0yOTMxLDEwICsyOTUzLDExIEBACiAJbW9kLT5zeW10YWIgPSBtb2QtPmNvcmVfc3ltdGFiOwogCW1vZC0+c3RydGFiID0gbW9kLT5jb3JlX3N0cnRhYjsKICNlbmRpZgotCXVuc2V0X3NlY3Rpb25fcm9fbngobW9kLCBtb2QtPm1vZHVsZV9pbml0KTsKKwl1bnNldF9tb2R1bGVfaW5pdF9yb19ueChtb2QpOwogCW1vZHVsZV9mcmVlKG1vZCwgbW9kLT5tb2R1bGVfaW5pdCk7CiAJbW9kLT5tb2R1bGVfaW5pdCA9IE5VTEw7CiAJbW9kLT5pbml0X3NpemUgPSAwOworCW1vZC0+aW5pdF9yb19zaXplID0gMDsKIAltb2QtPmluaXRfdGV4dF9zaXplID0gMDsKIAltdXRleF91bmxvY2soJm1vZHVsZV9tdXRleCk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9tdXRleC1kZWJ1Zy5jIGIva2VybmVsL211dGV4LWRlYnVnLmMKaW5kZXggZWM4MTVhOS4uNzNkYTgzYSAxMDA2NDQKLS0tIGEva2VybmVsL211dGV4LWRlYnVnLmMKKysrIGIva2VybmVsL211dGV4LWRlYnVnLmMKQEAgLTc1LDcgKzc1LDcgQEAKIAkJcmV0dXJuOwogCiAJREVCVUdfTE9DS1NfV0FSTl9PTihsb2NrLT5tYWdpYyAhPSBsb2NrKTsKLQlERUJVR19MT0NLU19XQVJOX09OKGxvY2stPm93bmVyICE9IGN1cnJlbnRfdGhyZWFkX2luZm8oKSk7CisJREVCVUdfTE9DS1NfV0FSTl9PTihsb2NrLT5vd25lciAhPSBjdXJyZW50KTsKIAlERUJVR19MT0NLU19XQVJOX09OKCFsb2NrLT53YWl0X2xpc3QucHJldiAmJiAhbG9jay0+d2FpdF9saXN0Lm5leHQpOwogCW11dGV4X2NsZWFyX293bmVyKGxvY2spOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL211dGV4LWRlYnVnLmggYi9rZXJuZWwvbXV0ZXgtZGVidWcuaAppbmRleCA1N2Q1MjdhLi4wNzk5ZmQzIDEwMDY0NAotLS0gYS9rZXJuZWwvbXV0ZXgtZGVidWcuaAorKysgYi9rZXJuZWwvbXV0ZXgtZGVidWcuaApAQCAtMjksNyArMjksNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgbXV0ZXhfc2V0X293bmVyKHN0cnVjdCBtdXRleCAqbG9jaykKIHsKLQlsb2NrLT5vd25lciA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKTsKKwlsb2NrLT5vd25lciA9IGN1cnJlbnQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtdXRleF9jbGVhcl9vd25lcihzdHJ1Y3QgbXV0ZXggKmxvY2spCmRpZmYgLS1naXQgYS9rZXJuZWwvbXV0ZXguYyBiL2tlcm5lbC9tdXRleC5jCmluZGV4IGM0MTk1ZmEuLjJjOTM4ZTIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tdXRleC5jCisrKyBiL2tlcm5lbC9tdXRleC5jCkBAIC0xNjAsMTQgKzE2MCw3IEBACiAJICovCiAKIAlmb3IgKDs7KSB7Ci0JCXN0cnVjdCB0aHJlYWRfaW5mbyAqb3duZXI7Ci0KLQkJLyoKLQkJICogSWYgd2Ugb3duIHRoZSBCS0wsIHRoZW4gZG9uJ3Qgc3Bpbi4gVGhlIG93bmVyIG9mCi0JCSAqIHRoZSBtdXRleCBtaWdodCBiZSB3YWl0aW5nIG9uIHVzIHRvIHJlbGVhc2UgdGhlIEJLTC4KLQkJICovCi0JCWlmICh1bmxpa2VseShjdXJyZW50LT5sb2NrX2RlcHRoID49IDApKQotCQkJYnJlYWs7CisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqb3duZXI7CiAKIAkJLyoKIAkJICogSWYgdGhlcmUncyBhbiBvd25lciwgd2FpdCBmb3IgaXQgdG8gZWl0aGVyCmRpZmYgLS1naXQgYS9rZXJuZWwvbXV0ZXguaCBiL2tlcm5lbC9tdXRleC5oCmluZGV4IDY3NTc4Y2EuLjQxMTVmYmYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tdXRleC5oCisrKyBiL2tlcm5lbC9tdXRleC5oCkBAIC0xOSw3ICsxOSw3IEBACiAjaWZkZWYgQ09ORklHX1NNUAogc3RhdGljIGlubGluZSB2b2lkIG11dGV4X3NldF9vd25lcihzdHJ1Y3QgbXV0ZXggKmxvY2spCiB7Ci0JbG9jay0+b3duZXIgPSBjdXJyZW50X3RocmVhZF9pbmZvKCk7CisJbG9jay0+b3duZXIgPSBjdXJyZW50OwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbXV0ZXhfY2xlYXJfb3duZXIoc3RydWN0IG11dGV4ICpsb2NrKQpkaWZmIC0tZ2l0IGEva2VybmVsL3BhcmFtcy5jIGIva2VybmVsL3BhcmFtcy5jCmluZGV4IDdhYjM4OGEuLmVkNzJlMTMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wYXJhbXMuYworKysgYi9rZXJuZWwvcGFyYW1zLmMKQEAgLTI5NywyMSArMjk3LDE1IEBACiBpbnQgcGFyYW1fc2V0X2Jvb2woY29uc3QgY2hhciAqdmFsLCBjb25zdCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKIHsKIAlib29sIHY7CisJaW50IHJldDsKIAogCS8qIE5vIGVxdWFscyBtZWFucyAic2V0Ii4uLiAqLwogCWlmICghdmFsKSB2YWwgPSAiMSI7CiAKIAkvKiBPbmUgb2YgPVt5WW5OMDFdICovCi0Jc3dpdGNoICh2YWxbMF0pIHsKLQljYXNlICd5JzogY2FzZSAnWSc6IGNhc2UgJzEnOgotCQl2ID0gdHJ1ZTsKLQkJYnJlYWs7Ci0JY2FzZSAnbic6IGNhc2UgJ04nOiBjYXNlICcwJzoKLQkJdiA9IGZhbHNlOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJcmV0ID0gc3RydG9ib29sKHZhbCwgJnYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlpZiAoa3AtPmZsYWdzICYgS1BBUkFNX0lTQk9PTCkKIAkJKihib29sICopa3AtPmFyZyA9IHY7CkBAIC04MjEsMTUgKzgxNSwxOCBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCB2YXR0ci0+dmVyc2lvbik7CiB9CiAKLWV4dGVybiBzdHJ1Y3QgbW9kdWxlX3ZlcnNpb25fYXR0cmlidXRlIF9fc3RhcnRfX19tb2R2ZXJbXSwgX19zdG9wX19fbW9kdmVyW107CitleHRlcm4gY29uc3Qgc3RydWN0IG1vZHVsZV92ZXJzaW9uX2F0dHJpYnV0ZSAqX19zdGFydF9fX21vZHZlcltdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBtb2R1bGVfdmVyc2lvbl9hdHRyaWJ1dGUgKl9fc3RvcF9fX21vZHZlcltdOwogCiBzdGF0aWMgdm9pZCBfX2luaXQgdmVyc2lvbl9zeXNmc19idWlsdGluKHZvaWQpCiB7Ci0JY29uc3Qgc3RydWN0IG1vZHVsZV92ZXJzaW9uX2F0dHJpYnV0ZSAqdmF0dHI7CisJY29uc3Qgc3RydWN0IG1vZHVsZV92ZXJzaW9uX2F0dHJpYnV0ZSAqKnA7CiAJc3RydWN0IG1vZHVsZV9rb2JqZWN0ICptazsKIAlpbnQgZXJyOwogCi0JZm9yICh2YXR0ciA9IF9fc3RhcnRfX19tb2R2ZXI7IHZhdHRyIDwgX19zdG9wX19fbW9kdmVyOyB2YXR0cisrKSB7CisJZm9yIChwID0gX19zdGFydF9fX21vZHZlcjsgcCA8IF9fc3RvcF9fX21vZHZlcjsgcCsrKSB7CisJCWNvbnN0IHN0cnVjdCBtb2R1bGVfdmVyc2lvbl9hdHRyaWJ1dGUgKnZhdHRyID0gKnA7CisKIAkJbWsgPSBsb2NhdGVfbW9kdWxlX2tvYmplY3QodmF0dHItPm1vZHVsZV9uYW1lKTsKIAkJaWYgKG1rKSB7CiAJCQllcnIgPSBzeXNmc19jcmVhdGVfZmlsZSgmbWstPmtvYmosICZ2YXR0ci0+bWF0dHIuYXR0cik7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvS2NvbmZpZyBiL2tlcm5lbC9wb3dlci9LY29uZmlnCmluZGV4IDZkZTlhOGYuLjg3ZjRkMjQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9LY29uZmlnCisrKyBiL2tlcm5lbC9wb3dlci9LY29uZmlnCkBAIC0xMjUsMTIgKzEyNSw2IEBACiAJY29kZS4gVGhpcyBpcyBoZWxwZnVsIHdoZW4gZGVidWdnaW5nIGFuZCByZXBvcnRpbmcgUE0gYnVncywgbGlrZQogCXN1c3BlbmQgc3VwcG9ydC4KIAotY29uZmlnIFBNX1ZFUkJPU0UKLQlib29sICJWZXJib3NlIFBvd2VyIE1hbmFnZW1lbnQgZGVidWdnaW5nIgotCWRlcGVuZHMgb24gUE1fREVCVUcKLQktLS1oZWxwLS0tCi0JVGhpcyBvcHRpb24gZW5hYmxlcyB2ZXJib3NlIG1lc3NhZ2VzIGZyb20gdGhlIFBvd2VyIE1hbmFnZW1lbnQgY29kZS4KLQogY29uZmlnIFBNX0FEVkFOQ0VEX0RFQlVHCiAJYm9vbCAiRXh0cmEgUE0gYXR0cmlidXRlcyBpbiBzeXNmcyBmb3IgbG93LWxldmVsIGRlYnVnZ2luZy90ZXN0aW5nIgogCWRlcGVuZHMgb24gUE1fREVCVUcKQEAgLTIyOSwzICsyMjMsNyBAQAogCSAgcmVwcmVzZW50aW5nIGluZGl2aWR1YWwgdm9sdGFnZSBkb21haW5zIGFuZCBwcm92aWRlcyBTT0MKIAkgIGltcGxlbWVudGF0aW9ucyBhIHJlYWR5IHRvIHVzZSBmcmFtZXdvcmsgdG8gbWFuYWdlIE9QUHMuCiAJICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL3Bvd2VyL29wcC50eHQ+CisKK2NvbmZpZyBQTV9SVU5USU1FX0NMSworCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIFBNX1JVTlRJTUUgJiYgSEFWRV9DTEsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9oaWJlcm5hdGUuYyBiL2tlcm5lbC9wb3dlci9oaWJlcm5hdGUuYwppbmRleCA1MGFhZTY2Li5mOWJlYzU2IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmMKKysrIGIva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jCkBAIC0yNzIsMTIgKzI3Miw3IEBACiAKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCi0JZXJyb3IgPSBzeXNkZXZfc3VzcGVuZChQTVNHX0ZSRUVaRSk7Ci0JaWYgKCFlcnJvcikgewotCQllcnJvciA9IHN5c2NvcmVfc3VzcGVuZCgpOwotCQlpZiAoZXJyb3IpCi0JCQlzeXNkZXZfcmVzdW1lKCk7Ci0JfQorCWVycm9yID0gc3lzY29yZV9zdXNwZW5kKCk7CiAJaWYgKGVycm9yKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiUE06IFNvbWUgc3lzdGVtIGRldmljZXMgZmFpbGVkIHRvIHBvd2VyIGRvd24sICIKIAkJCSJhYm9ydGluZyBoaWJlcm5hdGlvblxuIik7CkBAIC0zMDIsNyArMjk3LDYgQEAKIAogIFBvd2VyX3VwOgogCXN5c2NvcmVfcmVzdW1lKCk7Ci0Jc3lzZGV2X3Jlc3VtZSgpOwogCS8qIE5PVEU6ICBkcG1fcmVzdW1lX25vaXJxKCkgaXMganVzdCBhIHJlc3VtZSgpIGZvciBkZXZpY2VzCiAJICogdGhhdCBzdXNwZW5kZWQgd2l0aCBpcnFzIG9mZiAuLi4gbm8gb3ZlcmFsbCBwb3dlcnVwLgogCSAqLwpAQCAtMzMzLDIwICszMjcsMjUgQEAKIAogaW50IGhpYmVybmF0aW9uX3NuYXBzaG90KGludCBwbGF0Zm9ybV9tb2RlKQogeworCXBtX21lc3NhZ2VfdCBtc2cgPSBQTVNHX1JFQ09WRVI7CiAJaW50IGVycm9yOwogCiAJZXJyb3IgPSBwbGF0Zm9ybV9iZWdpbihwbGF0Zm9ybV9tb2RlKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gQ2xvc2U7CiAKKwllcnJvciA9IGRwbV9wcmVwYXJlKFBNU0dfRlJFRVpFKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gQ29tcGxldGVfZGV2aWNlczsKKwogCS8qIFByZWFsbG9jYXRlIGltYWdlIG1lbW9yeSBiZWZvcmUgc2h1dHRpbmcgZG93biBkZXZpY2VzLiAqLwogCWVycm9yID0gaGliZXJuYXRlX3ByZWFsbG9jYXRlX21lbW9yeSgpOwogCWlmIChlcnJvcikKLQkJZ290byBDbG9zZTsKKwkJZ290byBDb21wbGV0ZV9kZXZpY2VzOwogCiAJc3VzcGVuZF9jb25zb2xlKCk7CiAJcG1fcmVzdHJpY3RfZ2ZwX21hc2soKTsKLQllcnJvciA9IGRwbV9zdXNwZW5kX3N0YXJ0KFBNU0dfRlJFRVpFKTsKKwllcnJvciA9IGRwbV9zdXNwZW5kKFBNU0dfRlJFRVpFKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gUmVjb3Zlcl9wbGF0Zm9ybTsKIApAQCAtMzY0LDEzICszNjMsMTcgQEAKIAlpZiAoZXJyb3IgfHwgIWluX3N1c3BlbmQpCiAJCXN3c3VzcF9mcmVlKCk7CiAKLQlkcG1fcmVzdW1lX2VuZChpbl9zdXNwZW5kID8KLQkJKGVycm9yID8gUE1TR19SRUNPVkVSIDogUE1TR19USEFXKSA6IFBNU0dfUkVTVE9SRSk7CisJbXNnID0gaW5fc3VzcGVuZCA/IChlcnJvciA/IFBNU0dfUkVDT1ZFUiA6IFBNU0dfVEhBVykgOiBQTVNHX1JFU1RPUkU7CisJZHBtX3Jlc3VtZShtc2cpOwogCiAJaWYgKGVycm9yIHx8ICFpbl9zdXNwZW5kKQogCQlwbV9yZXN0b3JlX2dmcF9tYXNrKCk7CiAKIAlyZXN1bWVfY29uc29sZSgpOworCisgQ29tcGxldGVfZGV2aWNlczoKKwlkcG1fY29tcGxldGUobXNnKTsKKwogIENsb3NlOgogCXBsYXRmb3JtX2VuZChwbGF0Zm9ybV9tb2RlKTsKIAlyZXR1cm4gZXJyb3I7CkBAIC00MDksMTIgKzQxMiw3IEBACiAKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCi0JZXJyb3IgPSBzeXNkZXZfc3VzcGVuZChQTVNHX1FVSUVTQ0UpOwotCWlmICghZXJyb3IpIHsKLQkJZXJyb3IgPSBzeXNjb3JlX3N1c3BlbmQoKTsKLQkJaWYgKGVycm9yKQotCQkJc3lzZGV2X3Jlc3VtZSgpOwotCX0KKwllcnJvciA9IHN5c2NvcmVfc3VzcGVuZCgpOwogCWlmIChlcnJvcikKIAkJZ290byBFbmFibGVfaXJxczsKIApAQCAtNDQyLDcgKzQ0MCw2IEBACiAJdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZygpOwogCiAJc3lzY29yZV9yZXN1bWUoKTsKLQlzeXNkZXZfcmVzdW1lKCk7CiAKICBFbmFibGVfaXJxczoKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CkBAIC01MjgsNyArNTI1LDYgQEAKIAkJZ290byBQbGF0Zm9ybV9maW5pc2g7CiAKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCXN5c2Rldl9zdXNwZW5kKFBNU0dfSElCRVJOQVRFKTsKIAlzeXNjb3JlX3N1c3BlbmQoKTsKIAlpZiAocG1fd2FrZXVwX3BlbmRpbmcoKSkgewogCQllcnJvciA9IC1FQUdBSU47CkBAIC01NDEsNyArNTM3LDYgQEAKIAogIFBvd2VyX3VwOgogCXN5c2NvcmVfcmVzdW1lKCk7Ci0Jc3lzZGV2X3Jlc3VtZSgpOwogCWxvY2FsX2lycV9lbmFibGUoKTsKIAllbmFibGVfbm9uYm9vdF9jcHVzKCk7CiAKQEAgLTk4MiwxMCArOTc3LDMzIEBACiAKIHBvd2VyX2F0dHIoaW1hZ2Vfc2l6ZSk7CiAKK3N0YXRpYyBzc2l6ZV90IHJlc2VydmVkX3NpemVfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwgcmVzZXJ2ZWRfc2l6ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJlc2VydmVkX3NpemVfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IG4pCit7CisJdW5zaWduZWQgbG9uZyBzaXplOworCisJaWYgKHNzY2FuZihidWYsICIlbHUiLCAmc2l6ZSkgPT0gMSkgeworCQlyZXNlcnZlZF9zaXplID0gc2l6ZTsKKwkJcmV0dXJuIG47CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3Bvd2VyX2F0dHIocmVzZXJ2ZWRfc2l6ZSk7CisKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICogZ1tdID0gewogCSZkaXNrX2F0dHIuYXR0ciwKIAkmcmVzdW1lX2F0dHIuYXR0ciwKIAkmaW1hZ2Vfc2l6ZV9hdHRyLmF0dHIsCisJJnJlc2VydmVkX3NpemVfYXR0ci5hdHRyLAogCU5VTEwsCiB9OwogCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvbWFpbi5jIGIva2VybmVsL3Bvd2VyL21haW4uYwppbmRleCBkZTlhZWY4Li4yOTgxYWY0IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvbWFpbi5jCisrKyBiL2tlcm5lbC9wb3dlci9tYWluLmMKQEAgLTMzNyw2ICszMzcsNyBAQAogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCWhpYmVybmF0ZV9pbWFnZV9zaXplX2luaXQoKTsKKwloaWJlcm5hdGVfcmVzZXJ2ZWRfc2l6ZV9pbml0KCk7CiAJcG93ZXJfa29iaiA9IGtvYmplY3RfY3JlYXRlX2FuZF9hZGQoInBvd2VyIiwgTlVMTCk7CiAJaWYgKCFwb3dlcl9rb2JqKQogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9wb3dlci5oIGIva2VybmVsL3Bvd2VyL3Bvd2VyLmgKaW5kZXggMDM2MzRiZS4uOWEwMGEwYSAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3Bvd2VyLmgKKysrIGIva2VybmVsL3Bvd2VyL3Bvd2VyLmgKQEAgLTE1LDYgKzE1LDcgQEAKIAogI2lmZGVmIENPTkZJR19ISUJFUk5BVElPTgogLyoga2VybmVsL3Bvd2VyL3NuYXBzaG90LmMgKi8KK2V4dGVybiB2b2lkIF9faW5pdCBoaWJlcm5hdGVfcmVzZXJ2ZWRfc2l6ZV9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgX19pbml0IGhpYmVybmF0ZV9pbWFnZV9zaXplX2luaXQodm9pZCk7CiAKICNpZmRlZiBDT05GSUdfQVJDSF9ISUJFUk5BVElPTl9IRUFERVIKQEAgLTU1LDYgKzU2LDcgQEAKIAogI2Vsc2UgLyogIUNPTkZJR19ISUJFUk5BVElPTiAqLwogCitzdGF0aWMgaW5saW5lIHZvaWQgaGliZXJuYXRlX3Jlc2VydmVkX3NpemVfaW5pdCh2b2lkKSB7fQogc3RhdGljIGlubGluZSB2b2lkIGhpYmVybmF0ZV9pbWFnZV9zaXplX2luaXQodm9pZCkge30KICNlbmRpZiAvKiAhQ09ORklHX0hJQkVSTkFUSU9OICovCiAKQEAgLTcyLDYgKzc0LDggQEAKIAogLyogUHJlZmVycmVkIGltYWdlIHNpemUgaW4gYnl0ZXMgKGRlZmF1bHQgNTAwIE1CKSAqLwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW1hZ2Vfc2l6ZTsKKy8qIFNpemUgb2YgbWVtb3J5IHJlc2VydmVkIGZvciBkcml2ZXJzIChkZWZhdWx0IFNQQVJFX1BBR0VTIHggUEFHRV9TSVpFKSAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcmVzZXJ2ZWRfc2l6ZTsKIGV4dGVybiBpbnQgaW5fc3VzcGVuZDsKIGV4dGVybiBkZXZfdCBzd3N1c3BfcmVzdW1lX2RldmljZTsKIGV4dGVybiBzZWN0b3JfdCBzd3N1c3BfcmVzdW1lX2Jsb2NrOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3NuYXBzaG90LmMgYi9rZXJuZWwvcG93ZXIvc25hcHNob3QuYwppbmRleCBjYTBhYWNjLi5hY2U1NTg4IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvc25hcHNob3QuYworKysgYi9rZXJuZWwvcG93ZXIvc25hcHNob3QuYwpAQCAtNDEsMTYgKzQxLDI4IEBACiBzdGF0aWMgdm9pZCBzd3N1c3BfdW5zZXRfcGFnZV9mb3JiaWRkZW4oc3RydWN0IHBhZ2UgKik7CiAKIC8qCisgKiBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVzZXJ2ZSBmb3IgbWVtb3J5IGFsbG9jYXRpb25zIG1hZGUgYnkgZGV2aWNlIGRyaXZlcnMKKyAqIGZyb20gdGhlaXIgLT5mcmVlemUoKSBhbmQgLT5mcmVlemVfbm9pcnEoKSBjYWxsYmFja3Mgc28gdGhhdCB0aGV5IGRvbid0CisgKiBjYXVzZSBpbWFnZSBjcmVhdGlvbiB0byBmYWlsICh0dW5hYmxlIHZpYSAvc3lzL3Bvd2VyL3Jlc2VydmVkX3NpemUpLgorICovCit1bnNpZ25lZCBsb25nIHJlc2VydmVkX3NpemU7CisKK3ZvaWQgX19pbml0IGhpYmVybmF0ZV9yZXNlcnZlZF9zaXplX2luaXQodm9pZCkKK3sKKwlyZXNlcnZlZF9zaXplID0gU1BBUkVfUEFHRVMgKiBQQUdFX1NJWkU7Cit9CisKKy8qCiAgKiBQcmVmZXJyZWQgaW1hZ2Ugc2l6ZSBpbiBieXRlcyAodHVuYWJsZSB2aWEgL3N5cy9wb3dlci9pbWFnZV9zaXplKS4KLSAqIFdoZW4gaXQgaXMgc2V0IHRvIE4sIHRoZSBpbWFnZSBjcmVhdGluZyBjb2RlIHdpbGwgZG8gaXRzIGJlc3QgdG8KLSAqIGVuc3VyZSB0aGUgaW1hZ2Ugc2l6ZSB3aWxsIG5vdCBleGNlZWQgTiBieXRlcywgYnV0IGlmIHRoYXQgaXMKLSAqIGltcG9zc2libGUsIGl0IHdpbGwgdHJ5IHRvIGNyZWF0ZSB0aGUgc21hbGxlc3QgaW1hZ2UgcG9zc2libGUuCisgKiBXaGVuIGl0IGlzIHNldCB0byBOLCBzd3N1c3Agd2lsbCBkbyBpdHMgYmVzdCB0byBlbnN1cmUgdGhlIGltYWdlCisgKiBzaXplIHdpbGwgbm90IGV4Y2VlZCBOIGJ5dGVzLCBidXQgaWYgdGhhdCBpcyBpbXBvc3NpYmxlLCBpdCB3aWxsCisgKiB0cnkgdG8gY3JlYXRlIHRoZSBzbWFsbGVzdCBpbWFnZSBwb3NzaWJsZS4KICAqLwogdW5zaWduZWQgbG9uZyBpbWFnZV9zaXplOwogCiB2b2lkIF9faW5pdCBoaWJlcm5hdGVfaW1hZ2Vfc2l6ZV9pbml0KHZvaWQpCiB7Ci0JaW1hZ2Vfc2l6ZSA9ICh0b3RhbHJhbV9wYWdlcyAvIDMpICogUEFHRV9TSVpFOworCWltYWdlX3NpemUgPSAoKHRvdGFscmFtX3BhZ2VzICogMikgLyA1KSAqIFBBR0VfU0laRTsKIH0KIAogLyogTGlzdCBvZiBQQkVzIG5lZWRlZCBmb3IgcmVzdG9yaW5nIHRoZSBwYWdlcyB0aGF0IHdlcmUgYWxsb2NhdGVkIGJlZm9yZQpAQCAtMTI2MywxMSArMTI3NSwxMyBAQAogICogZnJhbWUgaW4gdXNlLiAgV2UgYWxzbyBuZWVkIGEgbnVtYmVyIG9mIHBhZ2UgZnJhbWVzIHRvIGJlIGZyZWUgZHVyaW5nCiAgKiBoaWJlcm5hdGlvbiBmb3IgYWxsb2NhdGlvbnMgbWFkZSB3aGlsZSBzYXZpbmcgdGhlIGltYWdlIGFuZCBmb3IgZGV2aWNlCiAgKiBkcml2ZXJzLCBpbiBjYXNlIHRoZXkgbmVlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZnJvbSB0aGVpciBoaWJlcm5hdGlvbgotICogY2FsbGJhY2tzICh0aGVzZSB0d28gbnVtYmVycyBhcmUgZ2l2ZW4gYnkgUEFHRVNfRk9SX0lPIGFuZCBTUEFSRV9QQUdFUywKLSAqIHJlc3BlY3RpdmVseSwgYm90aCBvZiB3aGljaCBhcmUgcm91Z2ggZXN0aW1hdGVzKS4gIFRvIG1ha2UgdGhpcyBoYXBwZW4sIHdlCi0gKiBjb21wdXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgYXZhaWxhYmxlIHBhZ2UgZnJhbWVzIGFuZCBhbGxvY2F0ZSBhdCBsZWFzdAorICogY2FsbGJhY2tzICh0aGVzZSB0d28gbnVtYmVycyBhcmUgZ2l2ZW4gYnkgUEFHRVNfRk9SX0lPICh3aGljaCBpcyBhIHJvdWdoCisgKiBlc3RpbWF0ZSkgYW5kIHJlc2VydmVyZF9zaXplIGRpdmlkZWQgYnkgUEFHRV9TSVpFICh3aGljaCBpcyB0dW5hYmxlIHRocm91Z2gKKyAqIC9zeXMvcG93ZXIvcmVzZXJ2ZWRfc2l6ZSwgcmVzcGVjdGl2ZWx5KS4gIFRvIG1ha2UgdGhpcyBoYXBwZW4sIHdlIGNvbXB1dGUgdGhlCisgKiB0b3RhbCBudW1iZXIgb2YgYXZhaWxhYmxlIHBhZ2UgZnJhbWVzIGFuZCBhbGxvY2F0ZSBhdCBsZWFzdAogICoKLSAqIChbcGFnZSBmcmFtZXMgdG90YWxdICsgUEFHRVNfRk9SX0lPICsgW21ldGFkYXRhIHBhZ2VzXSkgLyAyICsgMiAqIFNQQVJFX1BBR0VTCisgKiAoW3BhZ2UgZnJhbWVzIHRvdGFsXSArIFBBR0VTX0ZPUl9JTyArIFttZXRhZGF0YSBwYWdlc10pIC8gMgorICogICsgMiAqIERJVl9ST1VORF9VUChyZXNlcnZlZF9zaXplLCBQQUdFX1NJWkUpCiAgKgogICogb2YgdGhlbSwgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIG1heGltdW0gc2l6ZSBvZiBhIGhpYmVybmF0aW9uIGltYWdlLgogICoKQEAgLTEzMjIsNyArMTMzNiw4IEBACiAJY291bnQgLT0gdG90YWxyZXNlcnZlX3BhZ2VzOwogCiAJLyogQ29tcHV0ZSB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2F2ZWFibGUgcGFnZXMgdG8gbGVhdmUgaW4gbWVtb3J5LiAqLwotCW1heF9zaXplID0gKGNvdW50IC0gKHNpemUgKyBQQUdFU19GT1JfSU8pKSAvIDIgLSAyICogU1BBUkVfUEFHRVM7CisJbWF4X3NpemUgPSAoY291bnQgLSAoc2l6ZSArIFBBR0VTX0ZPUl9JTykpIC8gMgorCQkJLSAyICogRElWX1JPVU5EX1VQKHJlc2VydmVkX3NpemUsIFBBR0VfU0laRSk7CiAJLyogQ29tcHV0ZSB0aGUgZGVzaXJlZCBudW1iZXIgb2YgaW1hZ2UgcGFnZXMgc3BlY2lmaWVkIGJ5IGltYWdlX3NpemUuICovCiAJc2l6ZSA9IERJVl9ST1VORF9VUChpbWFnZV9zaXplLCBQQUdFX1NJWkUpOwogCWlmIChzaXplID4gbWF4X3NpemUpCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvc3VzcGVuZC5jIGIva2VybmVsL3Bvd2VyL3N1c3BlbmQuYwppbmRleCA2Mjc1OTcwLi4xYzQxYmEyIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvc3VzcGVuZC5jCisrKyBiL2tlcm5lbC9wb3dlci9zdXNwZW5kLmMKQEAgLTE2MywxOSArMTYzLDEzIEBACiAJYXJjaF9zdXNwZW5kX2Rpc2FibGVfaXJxcygpOwogCUJVR19PTighaXJxc19kaXNhYmxlZCgpKTsKIAotCWVycm9yID0gc3lzZGV2X3N1c3BlbmQoUE1TR19TVVNQRU5EKTsKLQlpZiAoIWVycm9yKSB7Ci0JCWVycm9yID0gc3lzY29yZV9zdXNwZW5kKCk7Ci0JCWlmIChlcnJvcikKLQkJCXN5c2Rldl9yZXN1bWUoKTsKLQl9CisJZXJyb3IgPSBzeXNjb3JlX3N1c3BlbmQoKTsKIAlpZiAoIWVycm9yKSB7CiAJCWlmICghKHN1c3BlbmRfdGVzdChURVNUX0NPUkUpIHx8IHBtX3dha2V1cF9wZW5kaW5nKCkpKSB7CiAJCQllcnJvciA9IHN1c3BlbmRfb3BzLT5lbnRlcihzdGF0ZSk7CiAJCQlldmVudHNfY2hlY2tfZW5hYmxlZCA9IGZhbHNlOwogCQl9CiAJCXN5c2NvcmVfcmVzdW1lKCk7Ci0JCXN5c2Rldl9yZXN1bWUoKTsKIAl9CiAKIAlhcmNoX3N1c3BlbmRfZW5hYmxlX2lycXMoKTsKQEAgLTIyNiw3ICsyMjAsNyBAQAogCWlmIChzdXNwZW5kX3Rlc3QoVEVTVF9ERVZJQ0VTKSkKIAkJZ290byBSZWNvdmVyX3BsYXRmb3JtOwogCi0Jc3VzcGVuZF9lbnRlcihzdGF0ZSk7CisJZXJyb3IgPSBzdXNwZW5kX2VudGVyKHN0YXRlKTsKIAogIFJlc3VtZV9kZXZpY2VzOgogCXN1c3BlbmRfdGVzdF9zdGFydCgpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXBkYXRlLmMgYi9rZXJuZWwvcmN1cGRhdGUuYwppbmRleCBmMzI0MGU5Li43Nzg0YmQyIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1cGRhdGUuYworKysgYi9rZXJuZWwvcmN1cGRhdGUuYwpAQCAtMTQyLDEwICsxNDIsMTcgQEAKIAkJICogRW5zdXJlIHRoYXQgcXVldWVkIGNhbGxiYWNrcyBhcmUgYWxsIGV4ZWN1dGVkLgogCQkgKiBJZiB3ZSBkZXRlY3QgdGhhdCB3ZSBhcmUgbmVzdGVkIGluIGEgUkNVIHJlYWQtc2lkZSBjcml0aWNhbAogCQkgKiBzZWN0aW9uLCB3ZSBzaG91bGQgc2ltcGx5IGZhaWwsIG90aGVyd2lzZSB3ZSB3b3VsZCBkZWFkbG9jay4KKwkJICogSW4gIVBSRUVNUFQgY29uZmlndXJhdGlvbnMsIHRoZXJlIGlzIG5vIHdheSB0byB0ZWxsIGlmIHdlIGFyZQorCQkgKiBpbiBhIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbiBvciBub3QsIHNvIHdlIG5ldmVyCisJCSAqIGF0dGVtcHQgYW55IGZpeHVwIGFuZCBqdXN0IHByaW50IGEgd2FybmluZy4KIAkJICovCisjaWZuZGVmIENPTkZJR19QUkVFTVBUCisJCVdBUk5fT05fT05DRSgxKTsKKwkJcmV0dXJuIDA7CisjZW5kaWYKIAkJaWYgKHJjdV9wcmVlbXB0X2RlcHRoKCkgIT0gMCB8fCBwcmVlbXB0X2NvdW50KCkgIT0gMCB8fAogCQkgICAgaXJxc19kaXNhYmxlZCgpKSB7Ci0JCQlXQVJOX09OKDEpOworCQkJV0FSTl9PTl9PTkNFKDEpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJcmN1X2JhcnJpZXIoKTsKQEAgLTE4NCwxMCArMTkxLDE3IEBACiAJCSAqIEVuc3VyZSB0aGF0IHF1ZXVlZCBjYWxsYmFja3MgYXJlIGFsbCBleGVjdXRlZC4KIAkJICogSWYgd2UgZGV0ZWN0IHRoYXQgd2UgYXJlIG5lc3RlZCBpbiBhIFJDVSByZWFkLXNpZGUgY3JpdGljYWwKIAkJICogc2VjdGlvbiwgd2Ugc2hvdWxkIHNpbXBseSBmYWlsLCBvdGhlcndpc2Ugd2Ugd291bGQgZGVhZGxvY2suCisJCSAqIEluICFQUkVFTVBUIGNvbmZpZ3VyYXRpb25zLCB0aGVyZSBpcyBubyB3YXkgdG8gdGVsbCBpZiB3ZSBhcmUKKwkJICogaW4gYSBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24gb3Igbm90LCBzbyB3ZSBuZXZlcgorCQkgKiBhdHRlbXB0IGFueSBmaXh1cCBhbmQganVzdCBwcmludCBhIHdhcm5pbmcuCiAJCSAqLworI2lmbmRlZiBDT05GSUdfUFJFRU1QVAorCQlXQVJOX09OX09OQ0UoMSk7CisJCXJldHVybiAwOworI2VuZGlmCiAJCWlmIChyY3VfcHJlZW1wdF9kZXB0aCgpICE9IDAgfHwgcHJlZW1wdF9jb3VudCgpICE9IDAgfHwKIAkJICAgIGlycXNfZGlzYWJsZWQoKSkgewotCQkJV0FSTl9PTigxKTsKKwkJCVdBUk5fT05fT05DRSgxKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCXJjdV9iYXJyaWVyKCk7CkBAIC0yMTQsMTUgKzIyOCwxNyBAQAogCQkgKiBFbnN1cmUgdGhhdCBxdWV1ZWQgY2FsbGJhY2tzIGFyZSBhbGwgZXhlY3V0ZWQuCiAJCSAqIElmIHdlIGRldGVjdCB0aGF0IHdlIGFyZSBuZXN0ZWQgaW4gYSBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsCiAJCSAqIHNlY3Rpb24sIHdlIHNob3VsZCBzaW1wbHkgZmFpbCwgb3RoZXJ3aXNlIHdlIHdvdWxkIGRlYWRsb2NrLgotCQkgKiBOb3RlIHRoYXQgdGhlIG1hY2hpbmVyeSB0byByZWxpYWJseSBkZXRlcm1pbmUgd2hldGhlcgotCQkgKiBvciBub3Qgd2UgYXJlIGluIGFuIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbgotCQkgKiBleGlzdHMgb25seSBpbiB0aGUgcHJlZW1wdGlibGUgUkNVIGltcGxlbWVudGF0aW9ucwotCQkgKiAoVElOWV9QUkVFTVBUX1JDVSBhbmQgVFJFRV9QUkVFTVBUX1JDVSksIHdoaWNoIGlzIHdoeQotCQkgKiBERUJVR19PQkpFQ1RTX1JDVV9IRUFEIGlzIGRpc2FsbG93ZWQgaWYgIVBSRUVNUFQuCisJCSAqIEluICFQUkVFTVBUIGNvbmZpZ3VyYXRpb25zLCB0aGVyZSBpcyBubyB3YXkgdG8gdGVsbCBpZiB3ZSBhcmUKKwkJICogaW4gYSBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24gb3Igbm90LCBzbyB3ZSBuZXZlcgorCQkgKiBhdHRlbXB0IGFueSBmaXh1cCBhbmQganVzdCBwcmludCBhIHdhcm5pbmcuCiAJCSAqLworI2lmbmRlZiBDT05GSUdfUFJFRU1QVAorCQlXQVJOX09OX09OQ0UoMSk7CisJCXJldHVybiAwOworI2VuZGlmCiAJCWlmIChyY3VfcHJlZW1wdF9kZXB0aCgpICE9IDAgfHwgcHJlZW1wdF9jb3VudCgpICE9IDAgfHwKIAkJICAgIGlycXNfZGlzYWJsZWQoKSkgewotCQkJV0FSTl9PTigxKTsKKwkJCVdBUk5fT05fT05DRSgxKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCXJjdV9iYXJyaWVyKCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1dGlueS5jIGIva2VybmVsL3JjdXRpbnkuYwppbmRleCAwYzM0M2I5Li40MjFhYmZkIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1dGlueS5jCisrKyBiL2tlcm5lbC9yY3V0aW55LmMKQEAgLTQwLDEwICs0MCwxMCBAQAogc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqcmN1X2t0aHJlYWRfdGFzazsKIHN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChyY3Vfa3RocmVhZF93cSk7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBoYXZlX3JjdV9rdGhyZWFkX3dvcms7Ci1zdGF0aWMgdm9pZCBpbnZva2VfcmN1X2t0aHJlYWQodm9pZCk7CiAKIC8qIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciByY3V0aW55X3BsdWdpbi5oLiAqLwogc3RydWN0IHJjdV9jdHJsYmxrOworc3RhdGljIHZvaWQgaW52b2tlX3JjdV9rdGhyZWFkKHZvaWQpOwogc3RhdGljIHZvaWQgcmN1X3Byb2Nlc3NfY2FsbGJhY2tzKHN0cnVjdCByY3VfY3RybGJsayAqcmNwKTsKIHN0YXRpYyBpbnQgcmN1X2t0aHJlYWQodm9pZCAqYXJnKTsKIHN0YXRpYyB2b2lkIF9fY2FsbF9yY3Uoc3RydWN0IHJjdV9oZWFkICpoZWFkLApAQCAtNzksMzYgKzc5LDQ1IEBACiAjZW5kaWYgLyogI2lmZGVmIENPTkZJR19OT19IWiAqLwogCiAvKgotICogSGVscGVyIGZ1bmN0aW9uIGZvciByY3VfcXNjdHJfaW5jKCkgYW5kIHJjdV9iaF9xc2N0cl9pbmMoKS4KLSAqIEFsc28gZGlzYWJsZSBpcnFzIHRvIGF2b2lkIGNvbmZ1c2lvbiBkdWUgdG8gaW50ZXJydXB0IGhhbmRsZXJzCisgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHJjdV9zY2hlZF9xcygpIGFuZCByY3VfYmhfcXMoKS4KKyAqIEFsc28gaXJxcyBhcmUgZGlzYWJsZWQgdG8gYXZvaWQgY29uZnVzaW9uIGR1ZSB0byBpbnRlcnJ1cHQgaGFuZGxlcnMKICAqIGludm9raW5nIGNhbGxfcmN1KCkuCiAgKi8KIHN0YXRpYyBpbnQgcmN1X3FzY3RyX2hlbHAoc3RydWN0IHJjdV9jdHJsYmxrICpyY3ApCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlpZiAocmNwLT5yY3VjYmxpc3QgIT0gTlVMTCAmJgogCSAgICByY3AtPmRvbmV0YWlsICE9IHJjcC0+Y3VydGFpbCkgewogCQlyY3AtPmRvbmV0YWlsID0gcmNwLT5jdXJ0YWlsOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJCXJldHVybiAxOwogCX0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KIAogLyoKKyAqIFdha2UgdXAgcmN1X2t0aHJlYWQoKSB0byBwcm9jZXNzIGNhbGxiYWNrcyBub3cgZWxpZ2libGUgZm9yIGludm9jYXRpb24KKyAqIG9yIHRvIGJvb3N0IHJlYWRlcnMuCisgKi8KK3N0YXRpYyB2b2lkIGludm9rZV9yY3Vfa3RocmVhZCh2b2lkKQoreworCWhhdmVfcmN1X2t0aHJlYWRfd29yayA9IDE7CisJd2FrZV91cCgmcmN1X2t0aHJlYWRfd3EpOworfQorCisvKgogICogUmVjb3JkIGFuIHJjdSBxdWllc2NlbnQgc3RhdGUuICBBbmQgYW4gcmN1X2JoIHF1aWVzY2VudCBzdGF0ZSB3aGlsZSB3ZQogICogYXJlIGF0IGl0LCBnaXZlbiB0aGF0IGFueSByY3UgcXVpZXNjZW50IHN0YXRlIGlzIGFsc28gYW4gcmN1X2JoCiAgKiBxdWllc2NlbnQgc3RhdGUuICBVc2UgIisiIGluc3RlYWQgb2YgInx8IiB0byBkZWZlYXQgc2hvcnQgY2lyY3VpdGluZy4KICAqLwogdm9pZCByY3Vfc2NoZWRfcXMoaW50IGNwdSkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWlmIChyY3VfcXNjdHJfaGVscCgmcmN1X3NjaGVkX2N0cmxibGspICsKIAkgICAgcmN1X3FzY3RyX2hlbHAoJnJjdV9iaF9jdHJsYmxrKSkKIAkJaW52b2tlX3JjdV9rdGhyZWFkKCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiAvKgpAQCAtMTE2LDggKzEyNSwxMiBAQAogICovCiB2b2lkIHJjdV9iaF9xcyhpbnQgY3B1KQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJaWYgKHJjdV9xc2N0cl9oZWxwKCZyY3VfYmhfY3RybGJsaykpCiAJCWludm9rZV9yY3Vfa3RocmVhZCgpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogLyoKQEAgLTE2Nyw3ICsxODAsNyBAQAogCQlwcmVmZXRjaChuZXh0KTsKIAkJZGVidWdfcmN1X2hlYWRfdW5xdWV1ZShsaXN0KTsKIAkJbG9jYWxfYmhfZGlzYWJsZSgpOwotCQlsaXN0LT5mdW5jKGxpc3QpOworCQlfX3JjdV9yZWNsYWltKGxpc3QpOwogCQlsb2NhbF9iaF9lbmFibGUoKTsKIAkJbGlzdCA9IG5leHQ7CiAJCVJDVV9UUkFDRShjYl9jb3VudCsrKTsKQEAgLTIwOCwyMCArMjIxLDYgQEAKIH0KIAogLyoKLSAqIFdha2UgdXAgcmN1X2t0aHJlYWQoKSB0byBwcm9jZXNzIGNhbGxiYWNrcyBub3cgZWxpZ2libGUgZm9yIGludm9jYXRpb24KLSAqIG9yIHRvIGJvb3N0IHJlYWRlcnMuCi0gKi8KLXN0YXRpYyB2b2lkIGludm9rZV9yY3Vfa3RocmVhZCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JaGF2ZV9yY3Vfa3RocmVhZF93b3JrID0gMTsKLQl3YWtlX3VwKCZyY3Vfa3RocmVhZF93cSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0vKgogICogV2FpdCBmb3IgYSBncmFjZSBwZXJpb2QgdG8gZWxhcHNlLiAgQnV0IGl0IGlzIGlsbGVnYWwgdG8gaW52b2tlCiAgKiBzeW5jaHJvbml6ZV9zY2hlZCgpIGZyb20gd2l0aGluIGFuIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbi4KICAqIFRoZXJlZm9yZSwgYW55IGxlZ2FsIGNhbGwgdG8gc3luY2hyb25pemVfc2NoZWQoKSBpcyBhIHF1aWVzY2VudApkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRpbnlfcGx1Z2luLmggYi9rZXJuZWwvcmN1dGlueV9wbHVnaW4uaAppbmRleCAzY2I4ZTM2Li5mMjU5YzY3IDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1dGlueV9wbHVnaW4uaAorKysgYi9rZXJuZWwvcmN1dGlueV9wbHVnaW4uaApAQCAtMTAwLDIzICsxMDAsMjggQEAKIAl1OCBjb21wbGV0ZWQ7CQkvKiBMYXN0IGdyYWNlIHBlcmlvZCBjb21wbGV0ZWQuICovCiAJCQkJLyogIElmIGFsbCB0aHJlZSBhcmUgZXF1YWwsIFJDVSBpcyBpZGxlLiAqLwogI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QKLQlzOCBib29zdGVkX3RoaXNfZ3A7CS8qIEhhcyBib29zdGluZyBhbHJlYWR5IGhhcHBlbmVkPyAqLwogCXVuc2lnbmVkIGxvbmcgYm9vc3RfdGltZTsgLyogV2hlbiB0byBzdGFydCBib29zdGluZyAoamlmZmllcykgKi8KICNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1JDVV9CT09TVCAqLwogI2lmZGVmIENPTkZJR19SQ1VfVFJBQ0UKIAl1bnNpZ25lZCBsb25nIG5fZ3JhY2VfcGVyaW9kczsKICNpZmRlZiBDT05GSUdfUkNVX0JPT1NUCiAJdW5zaWduZWQgbG9uZyBuX3Rhc2tzX2Jvb3N0ZWQ7CisJCQkJLyogVG90YWwgbnVtYmVyIG9mIHRhc2tzIGJvb3N0ZWQuICovCiAJdW5zaWduZWQgbG9uZyBuX2V4cF9ib29zdHM7CisJCQkJLyogTnVtYmVyIG9mIHRhc2tzIGJvb3N0ZWQgZm9yIGV4cGVkaXRlZCBHUC4gKi8KIAl1bnNpZ25lZCBsb25nIG5fbm9ybWFsX2Jvb3N0czsKLQl1bnNpZ25lZCBsb25nIG5fbm9ybWFsX2JhbGtfYmxrZF90YXNrczsKLQl1bnNpZ25lZCBsb25nIG5fbm9ybWFsX2JhbGtfZ3BfdGFza3M7Ci0JdW5zaWduZWQgbG9uZyBuX25vcm1hbF9iYWxrX2Jvb3N0X3Rhc2tzOwotCXVuc2lnbmVkIGxvbmcgbl9ub3JtYWxfYmFsa19ib29zdGVkOwotCXVuc2lnbmVkIGxvbmcgbl9ub3JtYWxfYmFsa19ub3R5ZXQ7Ci0JdW5zaWduZWQgbG9uZyBuX25vcm1hbF9iYWxrX25vczsKLQl1bnNpZ25lZCBsb25nIG5fZXhwX2JhbGtfYmxrZF90YXNrczsKLQl1bnNpZ25lZCBsb25nIG5fZXhwX2JhbGtfbm9zOworCQkJCS8qIE51bWJlciBvZiB0YXNrcyBib29zdGVkIGZvciBub3JtYWwgR1AuICovCisJdW5zaWduZWQgbG9uZyBuX2JhbGtfYmxrZF90YXNrczsKKwkJCQkvKiBSZWZ1c2VkIHRvIGJvb3N0OiBubyBibG9ja2VkIHRhc2tzLiAqLworCXVuc2lnbmVkIGxvbmcgbl9iYWxrX2V4cF9ncF90YXNrczsKKwkJCQkvKiBSZWZ1c2VkIHRvIGJvb3N0OiBub3RoaW5nIGJsb2NraW5nIEdQLiAqLworCXVuc2lnbmVkIGxvbmcgbl9iYWxrX2Jvb3N0X3Rhc2tzOworCQkJCS8qIFJlZnVzZWQgdG8gYm9vc3Q6IGFscmVhZHkgYm9vc3RpbmcuICovCisJdW5zaWduZWQgbG9uZyBuX2JhbGtfbm90eWV0OworCQkJCS8qIFJlZnVzZWQgdG8gYm9vc3Q6IG5vdCB5ZXQgdGltZS4gKi8KKwl1bnNpZ25lZCBsb25nIG5fYmFsa19ub3M7CisJCQkJLyogUmVmdXNlZCB0byBib29zdDogbm90IHN1cmUgd2h5LCB0aG91Z2guICovCisJCQkJLyogIFRoaXMgY2FuIGhhcHBlbiBkdWUgdG8gcmFjZSBjb25kaXRpb25zLiAqLwogI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUkNVX0JPT1NUICovCiAjZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfVFJBQ0UgKi8KIH07CkBAIC0yMDEsNyArMjA2LDYgQEAKIAogI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QKIHN0YXRpYyB2b2lkIHJjdV9pbml0aWF0ZV9ib29zdF90cmFjZSh2b2lkKTsKLXN0YXRpYyB2b2lkIHJjdV9pbml0aWF0ZV9leHBfYm9vc3RfdHJhY2Uodm9pZCk7CiAjZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QgKi8KIAogLyoKQEAgLTIxOSw0MSArMjIzLDIxIEBACiAJCSAgICJOLiJbIXJjdV9wcmVlbXB0X2N0cmxibGsuZ3BfdGFza3NdLAogCQkgICAiRS4iWyFyY3VfcHJlZW1wdF9jdHJsYmxrLmV4cF90YXNrc10pOwogI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QKLQlzZXFfcHJpbnRmKG0sICIgICAgICAgICAgICAgdHRiPSVjIGJ0Zz0iLAotCQkgICAiQi4iWyFyY3VfcHJlZW1wdF9jdHJsYmxrLmJvb3N0X3Rhc2tzXSk7Ci0Jc3dpdGNoIChyY3VfcHJlZW1wdF9jdHJsYmxrLmJvb3N0ZWRfdGhpc19ncCkgewotCWNhc2UgLTE6Ci0JCXNlcV9wdXRzKG0sICJleHAiKTsKLQkJYnJlYWs7Ci0JY2FzZSAwOgotCQlzZXFfcHV0cyhtLCAibm8iKTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlzZXFfcHV0cyhtLCAiYmVndW4iKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlzZXFfcHV0cyhtLCAiZG9uZSIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlzZXFfcHJpbnRmKG0sICI/JWQ/IiwgcmN1X3ByZWVtcHRfY3RybGJsay5ib29zdGVkX3RoaXNfZ3ApOwotCX0KLQlzZXFfcHJpbnRmKG0sICIgbnRiPSVsdSBuZWI9JWx1IG5uYj0lbHUgaj0lMDR4IGJ0PSUwNHhcbiIsCisJc2VxX3ByaW50ZihtLCAiJXN0dGI9JWMgbnRiPSVsdSBuZWI9JWx1IG5uYj0lbHUgaj0lMDR4IGJ0PSUwNHhcbiIsCisJCSAgICIgICAgICAgICAgICAgIiwKKwkJICAgIkIuIlshcmN1X3ByZWVtcHRfY3RybGJsay5ib29zdF90YXNrc10sCiAJCSAgIHJjdV9wcmVlbXB0X2N0cmxibGsubl90YXNrc19ib29zdGVkLAogCQkgICByY3VfcHJlZW1wdF9jdHJsYmxrLm5fZXhwX2Jvb3N0cywKIAkJICAgcmN1X3ByZWVtcHRfY3RybGJsay5uX25vcm1hbF9ib29zdHMsCiAJCSAgIChpbnQpKGppZmZpZXMgJiAweGZmZmYpLAogCQkgICAoaW50KShyY3VfcHJlZW1wdF9jdHJsYmxrLmJvb3N0X3RpbWUgJiAweGZmZmYpKTsKLQlzZXFfcHJpbnRmKG0sICIgICAgICAgICAgICAgJXM6IG50PSVsdSBndD0lbHUgYnQ9JWx1IGI9JWx1IG55PSVsdSBub3M9JWx1XG4iLAotCQkgICAibm9ybWFsIGJhbGsiLAotCQkgICByY3VfcHJlZW1wdF9jdHJsYmxrLm5fbm9ybWFsX2JhbGtfYmxrZF90YXNrcywKLQkJICAgcmN1X3ByZWVtcHRfY3RybGJsay5uX25vcm1hbF9iYWxrX2dwX3Rhc2tzLAotCQkgICByY3VfcHJlZW1wdF9jdHJsYmxrLm5fbm9ybWFsX2JhbGtfYm9vc3RfdGFza3MsCi0JCSAgIHJjdV9wcmVlbXB0X2N0cmxibGsubl9ub3JtYWxfYmFsa19ib29zdGVkLAotCQkgICByY3VfcHJlZW1wdF9jdHJsYmxrLm5fbm9ybWFsX2JhbGtfbm90eWV0LAotCQkgICByY3VfcHJlZW1wdF9jdHJsYmxrLm5fbm9ybWFsX2JhbGtfbm9zKTsKLQlzZXFfcHJpbnRmKG0sICIgICAgICAgICAgICAgZXhwIGJhbGs6IGJ0PSVsdSBub3M9JWx1XG4iLAotCQkgICByY3VfcHJlZW1wdF9jdHJsYmxrLm5fZXhwX2JhbGtfYmxrZF90YXNrcywKLQkJICAgcmN1X3ByZWVtcHRfY3RybGJsay5uX2V4cF9iYWxrX25vcyk7CisJc2VxX3ByaW50ZihtLCAiJXM6IG50PSVsdSBlZ3Q9JWx1IGJ0PSVsdSBueT0lbHUgbm9zPSVsdVxuIiwKKwkJICAgIiAgICAgICAgICAgICBiYWxrIiwKKwkJICAgcmN1X3ByZWVtcHRfY3RybGJsay5uX2JhbGtfYmxrZF90YXNrcywKKwkJICAgcmN1X3ByZWVtcHRfY3RybGJsay5uX2JhbGtfZXhwX2dwX3Rhc2tzLAorCQkgICByY3VfcHJlZW1wdF9jdHJsYmxrLm5fYmFsa19ib29zdF90YXNrcywKKwkJICAgcmN1X3ByZWVtcHRfY3RybGJsay5uX2JhbGtfbm90eWV0LAorCQkgICByY3VfcHJlZW1wdF9jdHJsYmxrLm5fYmFsa19ub3MpOwogI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUkNVX0JPT1NUICovCiB9CiAKQEAgLTI3MSwyNSArMjU1LDU5IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgcnRfbXV0ZXggbXR4OwotCXN0cnVjdCBsaXN0X2hlYWQgKm5wOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0YjsKIAotCWlmIChyY3VfcHJlZW1wdF9jdHJsYmxrLmJvb3N0X3Rhc2tzID09IE5VTEwpCisJaWYgKHJjdV9wcmVlbXB0X2N0cmxibGsuYm9vc3RfdGFza3MgPT0gTlVMTCAmJgorCSAgICByY3VfcHJlZW1wdF9jdHJsYmxrLmV4cF90YXNrcyA9PSBOVUxMKQogCQlyZXR1cm4gMDsgIC8qIE5vdGhpbmcgdG8gYm9vc3QuICovCisKIAlyYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXJjdV9wcmVlbXB0X2N0cmxibGsuYm9vc3RlZF90aGlzX2dwKys7Ci0JdCA9IGNvbnRhaW5lcl9vZihyY3VfcHJlZW1wdF9jdHJsYmxrLmJvb3N0X3Rhc2tzLCBzdHJ1Y3QgdGFza19zdHJ1Y3QsCi0JCQkgcmN1X25vZGVfZW50cnkpOwotCW5wID0gcmN1X25leHRfbm9kZV9lbnRyeSh0KTsKKworCS8qCisJICogUmVjaGVjayB3aXRoIGlycXMgZGlzYWJsZWQ6IGFsbCB0YXNrcyBpbiBuZWVkIG9mIGJvb3N0aW5nCisJICogbWlnaHQgZXhpdCB0aGVpciBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zIG9uIHRoZWlyIG93bgorCSAqIGlmIHdlIGFyZSBwcmVlbXB0ZWQganVzdCBiZWZvcmUgZGlzYWJsaW5nIGlycXMuCisJICovCisJaWYgKHJjdV9wcmVlbXB0X2N0cmxibGsuYm9vc3RfdGFza3MgPT0gTlVMTCAmJgorCSAgICByY3VfcHJlZW1wdF9jdHJsYmxrLmV4cF90YXNrcyA9PSBOVUxMKSB7CisJCXJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogUHJlZmVyZW50aWFsbHkgYm9vc3QgdGFza3MgYmxvY2tpbmcgZXhwZWRpdGVkIGdyYWNlIHBlcmlvZHMuCisJICogVGhpcyBjYW5ub3Qgc3RhcnZlIHRoZSBub3JtYWwgZ3JhY2UgcGVyaW9kcyBiZWNhdXNlIGEgc2Vjb25kCisJICogZXhwZWRpdGVkIGdyYWNlIHBlcmlvZCBtdXN0IGJvb3N0IGFsbCBibG9ja2VkIHRhc2tzLCBpbmNsdWRpbmcKKwkgKiB0aG9zZSBibG9ja2luZyB0aGUgcHJlLWV4aXN0aW5nIG5vcm1hbCBncmFjZSBwZXJpb2QuCisJICovCisJaWYgKHJjdV9wcmVlbXB0X2N0cmxibGsuZXhwX3Rhc2tzICE9IE5VTEwpIHsKKwkJdGIgPSByY3VfcHJlZW1wdF9jdHJsYmxrLmV4cF90YXNrczsKKwkJUkNVX1RSQUNFKHJjdV9wcmVlbXB0X2N0cmxibGsubl9leHBfYm9vc3RzKyspOworCX0gZWxzZSB7CisJCXRiID0gcmN1X3ByZWVtcHRfY3RybGJsay5ib29zdF90YXNrczsKKwkJUkNVX1RSQUNFKHJjdV9wcmVlbXB0X2N0cmxibGsubl9ub3JtYWxfYm9vc3RzKyspOworCX0KKwlSQ1VfVFJBQ0UocmN1X3ByZWVtcHRfY3RybGJsay5uX3Rhc2tzX2Jvb3N0ZWQrKyk7CisKKwkvKgorCSAqIFdlIGJvb3N0IHRhc2sgdCBieSBtYW51ZmFjdHVyaW5nIGFuIHJ0X211dGV4IHRoYXQgYXBwZWFycyB0bworCSAqIGJlIGhlbGQgYnkgdGFzayB0LiAgV2UgbGVhdmUgYSBwb2ludGVyIHRvIHRoYXQgcnRfbXV0ZXggd2hlcmUKKwkgKiB0YXNrIHQgY2FuIGZpbmQgaXQsIGFuZCB0YXNrIHQgd2lsbCByZWxlYXNlIHRoZSBtdXRleCB3aGVuIGl0CisJICogZXhpdHMgaXRzIG91dGVybW9zdCBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24uICBUaGVuCisJICogc2ltcGx5IGFjcXVpcmluZyB0aGlzIGFydGlmaWNpYWwgcnRfbXV0ZXggd2lsbCBib29zdCB0YXNrCisJICogdCdzIHByaW9yaXR5LiAgKFRoYW5rcyB0byB0Z2x4IGZvciBzdWdnZXN0aW5nIHRoaXMgYXBwcm9hY2ghKQorCSAqLworCXQgPSBjb250YWluZXJfb2YodGIsIHN0cnVjdCB0YXNrX3N0cnVjdCwgcmN1X25vZGVfZW50cnkpOwogCXJ0X211dGV4X2luaXRfcHJveHlfbG9ja2VkKCZtdHgsIHQpOwogCXQtPnJjdV9ib29zdF9tdXRleCA9ICZtdHg7CiAJdC0+cmN1X3JlYWRfdW5sb2NrX3NwZWNpYWwgfD0gUkNVX1JFQURfVU5MT0NLX0JPT1NURUQ7CiAJcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAlydF9tdXRleF9sb2NrKCZtdHgpOwotCVJDVV9UUkFDRShyY3VfcHJlZW1wdF9jdHJsYmxrLm5fdGFza3NfYm9vc3RlZCsrKTsKLQlyY3VfcHJlZW1wdF9jdHJsYmxrLmJvb3N0ZWRfdGhpc19ncCsrOwotCXJ0X211dGV4X3VubG9jaygmbXR4KTsKLQlyZXR1cm4gcmN1X3ByZWVtcHRfY3RybGJsay5ib29zdF90YXNrcyAhPSBOVUxMOworCXJ0X211dGV4X3VubG9jaygmbXR4KTsgIC8qIEtlZXAgbG9ja2RlcCBoYXBweS4gKi8KKworCXJldHVybiByY3VfcHJlZW1wdF9jdHJsYmxrLmJvb3N0X3Rhc2tzICE9IE5VTEwgfHwKKwkgICAgICAgcmN1X3ByZWVtcHRfY3RybGJsay5leHBfdGFza3MgIT0gTlVMTDsKIH0KIAogLyoKQEAgLTMwNCw0MiArMzIyLDI1IEBACiAgKi8KIHN0YXRpYyBpbnQgcmN1X2luaXRpYXRlX2Jvb3N0KHZvaWQpCiB7Ci0JaWYgKCFyY3VfcHJlZW1wdF9ibG9ja2VkX3JlYWRlcnNfY2dwKCkpIHsKLQkJUkNVX1RSQUNFKHJjdV9wcmVlbXB0X2N0cmxibGsubl9ub3JtYWxfYmFsa19ibGtkX3Rhc2tzKyspOworCWlmICghcmN1X3ByZWVtcHRfYmxvY2tlZF9yZWFkZXJzX2NncCgpICYmCisJICAgIHJjdV9wcmVlbXB0X2N0cmxibGsuZXhwX3Rhc2tzID09IE5VTEwpIHsKKwkJUkNVX1RSQUNFKHJjdV9wcmVlbXB0X2N0cmxibGsubl9iYWxrX2V4cF9ncF90YXNrcysrKTsKIAkJcmV0dXJuIDA7CiAJfQotCWlmIChyY3VfcHJlZW1wdF9jdHJsYmxrLmdwX3Rhc2tzICE9IE5VTEwgJiYKLQkgICAgcmN1X3ByZWVtcHRfY3RybGJsay5ib29zdF90YXNrcyA9PSBOVUxMICYmCi0JICAgIHJjdV9wcmVlbXB0X2N0cmxibGsuYm9vc3RlZF90aGlzX2dwID09IDAgJiYKLQkgICAgVUxPTkdfQ01QX0dFKGppZmZpZXMsIHJjdV9wcmVlbXB0X2N0cmxibGsuYm9vc3RfdGltZSkpIHsKLQkJcmN1X3ByZWVtcHRfY3RybGJsay5ib29zdF90YXNrcyA9IHJjdV9wcmVlbXB0X2N0cmxibGsuZ3BfdGFza3M7CisJaWYgKHJjdV9wcmVlbXB0X2N0cmxibGsuZXhwX3Rhc2tzICE9IE5VTEwgfHwKKwkgICAgKHJjdV9wcmVlbXB0X2N0cmxibGsuZ3BfdGFza3MgIT0gTlVMTCAmJgorCSAgICAgcmN1X3ByZWVtcHRfY3RybGJsay5ib29zdF90YXNrcyA9PSBOVUxMICYmCisJICAgICBVTE9OR19DTVBfR0UoamlmZmllcywgcmN1X3ByZWVtcHRfY3RybGJsay5ib29zdF90aW1lKSkpIHsKKwkJaWYgKHJjdV9wcmVlbXB0X2N0cmxibGsuZXhwX3Rhc2tzID09IE5VTEwpCisJCQlyY3VfcHJlZW1wdF9jdHJsYmxrLmJvb3N0X3Rhc2tzID0KKwkJCQlyY3VfcHJlZW1wdF9jdHJsYmxrLmdwX3Rhc2tzOwogCQlpbnZva2VfcmN1X2t0aHJlYWQoKTsKLQkJUkNVX1RSQUNFKHJjdV9wcmVlbXB0X2N0cmxibGsubl9ub3JtYWxfYm9vc3RzKyspOwogCX0gZWxzZQogCQlSQ1VfVFJBQ0UocmN1X2luaXRpYXRlX2Jvb3N0X3RyYWNlKCkpOwogCXJldHVybiAxOwogfQogCi0vKgotICogSW5pdGlhdGUgYm9vc3RpbmcgZm9yIGFuIGV4cGVkaXRlZCBncmFjZSBwZXJpb2QuCi0gKi8KLXN0YXRpYyB2b2lkIHJjdV9pbml0aWF0ZV9leHBlZGl0ZWRfYm9vc3Qodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlpZiAoIWxpc3RfZW1wdHkoJnJjdV9wcmVlbXB0X2N0cmxibGsuYmxrZF90YXNrcykpIHsKLQkJcmN1X3ByZWVtcHRfY3RybGJsay5ib29zdF90YXNrcyA9Ci0JCQlyY3VfcHJlZW1wdF9jdHJsYmxrLmJsa2RfdGFza3MubmV4dDsKLQkJcmN1X3ByZWVtcHRfY3RybGJsay5ib29zdGVkX3RoaXNfZ3AgPSAtMTsKLQkJaW52b2tlX3JjdV9rdGhyZWFkKCk7Ci0JCVJDVV9UUkFDRShyY3VfcHJlZW1wdF9jdHJsYmxrLm5fZXhwX2Jvb3N0cysrKTsKLQl9IGVsc2UKLQkJUkNVX1RSQUNFKHJjdV9pbml0aWF0ZV9leHBfYm9vc3RfdHJhY2UoKSk7Ci0JcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotI2RlZmluZSBSQ1VfQk9PU1RfREVMQVlfSklGRklFUyBESVZfUk9VTkRfVVAoQ09ORklHX1JDVV9CT09TVF9ERUxBWSAqIEhaLCAxMDAwKTsKKyNkZWZpbmUgUkNVX0JPT1NUX0RFTEFZX0pJRkZJRVMgRElWX1JPVU5EX1VQKENPTkZJR19SQ1VfQk9PU1RfREVMQVkgKiBIWiwgMTAwMCkKIAogLyoKICAqIERvIHByaW9yaXR5LWJvb3N0IGFjY291bnRpbmcgZm9yIHRoZSBzdGFydCBvZiBhIG5ldyBncmFjZSBwZXJpb2QuCkBAIC0zNDcsOCArMzQ4LDYgQEAKIHN0YXRpYyB2b2lkIHJjdV9wcmVlbXB0X2Jvb3N0X3N0YXJ0X2dwKHZvaWQpCiB7CiAJcmN1X3ByZWVtcHRfY3RybGJsay5ib29zdF90aW1lID0gamlmZmllcyArIFJDVV9CT09TVF9ERUxBWV9KSUZGSUVTOwotCWlmIChyY3VfcHJlZW1wdF9jdHJsYmxrLmJvb3N0ZWRfdGhpc19ncCA+IDApCi0JCXJjdV9wcmVlbXB0X2N0cmxibGsuYm9vc3RlZF90aGlzX2dwID0gMDsKIH0KIAogI2Vsc2UgLyogI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QgKi8KQEAgLTM3MiwxMyArMzcxLDYgQEAKIH0KIAogLyoKLSAqIElmIHRoZXJlIGlzIG5vIFJDVSBwcmlvcml0eSBib29zdGluZywgd2UgZG9uJ3QgaW5pdGlhdGUgZXhwZWRpdGVkIGJvb3N0aW5nLgotICovCi1zdGF0aWMgdm9pZCByY3VfaW5pdGlhdGVfZXhwZWRpdGVkX2Jvb3N0KHZvaWQpCi17Ci19Ci0KLS8qCiAgKiBJZiB0aGVyZSBpcyBubyBSQ1UgcHJpb3JpdHkgYm9vc3RpbmcsIG5vdGhpbmcgdG8gZG8gYXQgZ3JhY2UtcGVyaW9kIHN0YXJ0LgogICovCiBzdGF0aWMgdm9pZCByY3VfcHJlZW1wdF9ib29zdF9zdGFydF9ncCh2b2lkKQpAQCAtNDE4LDcgKzQxMCw3IEBACiAJaWYgKCFyY3VfcHJlZW1wdF9ncF9pbl9wcm9ncmVzcygpKQogCQlyZXR1cm47CiAJLyoKLQkgKiBDaGVjayB1cCBvbiBib29zdGluZy4gIElmIHRoZXJlIGFyZSBubyByZWFkZXJzIGJsb2NraW5nIHRoZQorCSAqIENoZWNrIHVwIG9uIGJvb3N0aW5nLiAgSWYgdGhlcmUgYXJlIHJlYWRlcnMgYmxvY2tpbmcgdGhlCiAJICogY3VycmVudCBncmFjZSBwZXJpb2QsIGxlYXZlLgogCSAqLwogCWlmIChyY3VfaW5pdGlhdGVfYm9vc3QoKSkKQEAgLTU3OCw3ICs1NzAsNyBAQAogCQllbXB0eSA9ICFyY3VfcHJlZW1wdF9ibG9ja2VkX3JlYWRlcnNfY2dwKCk7CiAJCWVtcHR5X2V4cCA9IHJjdV9wcmVlbXB0X2N0cmxibGsuZXhwX3Rhc2tzID09IE5VTEw7CiAJCW5wID0gcmN1X25leHRfbm9kZV9lbnRyeSh0KTsKLQkJbGlzdF9kZWwoJnQtPnJjdV9ub2RlX2VudHJ5KTsKKwkJbGlzdF9kZWxfaW5pdCgmdC0+cmN1X25vZGVfZW50cnkpOwogCQlpZiAoJnQtPnJjdV9ub2RlX2VudHJ5ID09IHJjdV9wcmVlbXB0X2N0cmxibGsuZ3BfdGFza3MpCiAJCQlyY3VfcHJlZW1wdF9jdHJsYmxrLmdwX3Rhc2tzID0gbnA7CiAJCWlmICgmdC0+cmN1X25vZGVfZW50cnkgPT0gcmN1X3ByZWVtcHRfY3RybGJsay5leHBfdGFza3MpCkBAIC01ODcsNyArNTc5LDYgQEAKIAkJaWYgKCZ0LT5yY3Vfbm9kZV9lbnRyeSA9PSByY3VfcHJlZW1wdF9jdHJsYmxrLmJvb3N0X3Rhc2tzKQogCQkJcmN1X3ByZWVtcHRfY3RybGJsay5ib29zdF90YXNrcyA9IG5wOwogI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUkNVX0JPT1NUICovCi0JCUlOSVRfTElTVF9IRUFEKCZ0LT5yY3Vfbm9kZV9lbnRyeSk7CiAKIAkJLyoKIAkJICogSWYgdGhpcyB3YXMgdGhlIGxhc3QgdGFzayBvbiB0aGUgY3VycmVudCBsaXN0LCBhbmQgaWYKQEAgLTgxMiwxMyArODAzLDE2IEBACiAJcnBjcC0+ZXhwX3Rhc2tzID0gcnBjcC0+YmxrZF90YXNrcy5uZXh0OwogCWlmIChycGNwLT5leHBfdGFza3MgPT0gJnJwY3AtPmJsa2RfdGFza3MpCiAJCXJwY3AtPmV4cF90YXNrcyA9IE5VTEw7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCiAJLyogV2FpdCBmb3IgdGFpbCBvZiAtPmJsa2RfdGFza3MgbGlzdCB0byBkcmFpbi4gKi8KLQlpZiAocmN1X3ByZWVtcHRlZF9yZWFkZXJzX2V4cCgpKQotCQlyY3VfaW5pdGlhdGVfZXhwZWRpdGVkX2Jvb3N0KCk7CisJaWYgKCFyY3VfcHJlZW1wdGVkX3JlYWRlcnNfZXhwKCkpCisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwllbHNlIHsKKwkJcmN1X2luaXRpYXRlX2Jvb3N0KCk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAkJd2FpdF9ldmVudChzeW5jX3JjdV9wcmVlbXB0X2V4cF93cSwKIAkJCSAgICFyY3VfcHJlZW1wdGVkX3JlYWRlcnNfZXhwKCkpOworCX0KIAogCS8qIENsZWFuIHVwIGFuZCBleGl0LiAqLwogCWJhcnJpZXIoKTsgLyogZW5zdXJlIGV4cGVkaXRlZCBHUCBzZWVuIGJlZm9yZSBjb3VudGVyIGluY3JlbWVudC4gKi8KQEAgLTkzMSwyNCArOTI1LDE3IEBACiAKIHN0YXRpYyB2b2lkIHJjdV9pbml0aWF0ZV9ib29zdF90cmFjZSh2b2lkKQogewotCWlmIChyY3VfcHJlZW1wdF9jdHJsYmxrLmdwX3Rhc2tzID09IE5VTEwpCi0JCXJjdV9wcmVlbXB0X2N0cmxibGsubl9ub3JtYWxfYmFsa19ncF90YXNrcysrOwotCWVsc2UgaWYgKHJjdV9wcmVlbXB0X2N0cmxibGsuYm9vc3RfdGFza3MgIT0gTlVMTCkKLQkJcmN1X3ByZWVtcHRfY3RybGJsay5uX25vcm1hbF9iYWxrX2Jvb3N0X3Rhc2tzKys7Ci0JZWxzZSBpZiAocmN1X3ByZWVtcHRfY3RybGJsay5ib29zdGVkX3RoaXNfZ3AgIT0gMCkKLQkJcmN1X3ByZWVtcHRfY3RybGJsay5uX25vcm1hbF9iYWxrX2Jvb3N0ZWQrKzsKLQllbHNlIGlmICghVUxPTkdfQ01QX0dFKGppZmZpZXMsIHJjdV9wcmVlbXB0X2N0cmxibGsuYm9vc3RfdGltZSkpCi0JCXJjdV9wcmVlbXB0X2N0cmxibGsubl9ub3JtYWxfYmFsa19ub3R5ZXQrKzsKLQllbHNlCi0JCXJjdV9wcmVlbXB0X2N0cmxibGsubl9ub3JtYWxfYmFsa19ub3MrKzsKLX0KLQotc3RhdGljIHZvaWQgcmN1X2luaXRpYXRlX2V4cF9ib29zdF90cmFjZSh2b2lkKQotewogCWlmIChsaXN0X2VtcHR5KCZyY3VfcHJlZW1wdF9jdHJsYmxrLmJsa2RfdGFza3MpKQotCQlyY3VfcHJlZW1wdF9jdHJsYmxrLm5fZXhwX2JhbGtfYmxrZF90YXNrcysrOworCQlyY3VfcHJlZW1wdF9jdHJsYmxrLm5fYmFsa19ibGtkX3Rhc2tzKys7CisJZWxzZSBpZiAocmN1X3ByZWVtcHRfY3RybGJsay5ncF90YXNrcyA9PSBOVUxMICYmCisJCSByY3VfcHJlZW1wdF9jdHJsYmxrLmV4cF90YXNrcyA9PSBOVUxMKQorCQlyY3VfcHJlZW1wdF9jdHJsYmxrLm5fYmFsa19leHBfZ3BfdGFza3MrKzsKKwllbHNlIGlmIChyY3VfcHJlZW1wdF9jdHJsYmxrLmJvb3N0X3Rhc2tzICE9IE5VTEwpCisJCXJjdV9wcmVlbXB0X2N0cmxibGsubl9iYWxrX2Jvb3N0X3Rhc2tzKys7CisJZWxzZSBpZiAoIVVMT05HX0NNUF9HRShqaWZmaWVzLCByY3VfcHJlZW1wdF9jdHJsYmxrLmJvb3N0X3RpbWUpKQorCQlyY3VfcHJlZW1wdF9jdHJsYmxrLm5fYmFsa19ub3R5ZXQrKzsKIAllbHNlCi0JCXJjdV9wcmVlbXB0X2N0cmxibGsubl9leHBfYmFsa19ub3MrKzsKKwkJcmN1X3ByZWVtcHRfY3RybGJsay5uX2JhbGtfbm9zKys7CiB9CiAKICNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1JDVV9CT09TVCAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRvcnR1cmUuYyBiL2tlcm5lbC9yY3V0b3J0dXJlLmMKaW5kZXggYzIyNGRhNC4uMmUxMzhkYiAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXRvcnR1cmUuYworKysgYi9rZXJuZWwvcmN1dG9ydHVyZS5jCkBAIC0xMzEsNyArMTMxLDcgQEAKIAogc3RhdGljIExJU1RfSEVBRChyY3VfdG9ydHVyZV9mcmVlbGlzdCk7CiBzdGF0aWMgc3RydWN0IHJjdV90b3J0dXJlIF9fcmN1ICpyY3VfdG9ydHVyZV9jdXJyZW50Owotc3RhdGljIGxvbmcgcmN1X3RvcnR1cmVfY3VycmVudF92ZXJzaW9uOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcmN1X3RvcnR1cmVfY3VycmVudF92ZXJzaW9uOwogc3RhdGljIHN0cnVjdCByY3VfdG9ydHVyZSByY3VfdG9ydHVyZXNbMTAgKiBSQ1VfVE9SVFVSRV9QSVBFX0xFTl07CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJjdV90b3J0dXJlX2xvY2spOwogc3RhdGljIERFRklORV9QRVJfQ1BVKGxvbmcgW1JDVV9UT1JUVVJFX1BJUEVfTEVOICsgMV0sIHJjdV90b3J0dXJlX2NvdW50KSA9CkBAIC0xNDYsOCArMTQ2LDYgQEAKIHN0YXRpYyBhdG9taWNfdCBuX3JjdV90b3J0dXJlX2Vycm9yOwogc3RhdGljIGxvbmcgbl9yY3VfdG9ydHVyZV9ib29zdF9rdHJlcnJvcjsKIHN0YXRpYyBsb25nIG5fcmN1X3RvcnR1cmVfYm9vc3RfcnRlcnJvcjsKLXN0YXRpYyBsb25nIG5fcmN1X3RvcnR1cmVfYm9vc3RfYWxsb2NlcnJvcjsKLXN0YXRpYyBsb25nIG5fcmN1X3RvcnR1cmVfYm9vc3RfYWZmZXJyb3I7CiBzdGF0aWMgbG9uZyBuX3JjdV90b3J0dXJlX2Jvb3N0X2ZhaWx1cmU7CiBzdGF0aWMgbG9uZyBuX3JjdV90b3J0dXJlX2Jvb3N0czsKIHN0YXRpYyBsb25nIG5fcmN1X3RvcnR1cmVfdGltZXJzOwpAQCAtMTYzLDExICsxNjEsMTEgQEAKICNlbmRpZgogaW50IHJjdXRvcnR1cmVfcnVubmFibGUgPSBSQ1VUT1JUVVJFX1JVTk5BQkxFX0lOSVQ7CiAKLSNpZmRlZiBDT05GSUdfUkNVX0JPT1NUCisjaWYgZGVmaW5lZChDT05GSUdfUkNVX0JPT1NUKSAmJiAhZGVmaW5lZChDT05GSUdfSE9UUExVR19DUFUpCiAjZGVmaW5lIHJjdV9jYW5fYm9vc3QoKSAxCi0jZWxzZSAvKiAjaWZkZWYgQ09ORklHX1JDVV9CT09TVCAqLworI2Vsc2UgLyogI2lmIGRlZmluZWQoQ09ORklHX1JDVV9CT09TVCkgJiYgIWRlZmluZWQoQ09ORklHX0hPVFBMVUdfQ1BVKSAqLwogI2RlZmluZSByY3VfY2FuX2Jvb3N0KCkgMAotI2VuZGlmIC8qICNlbHNlICNpZmRlZiBDT05GSUdfUkNVX0JPT1NUICovCisjZW5kaWYgLyogI2Vsc2UgI2lmIGRlZmluZWQoQ09ORklHX1JDVV9CT09TVCkgJiYgIWRlZmluZWQoQ09ORklHX0hPVFBMVUdfQ1BVKSAqLwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBib29zdF9zdGFydHRpbWU7CS8qIGppZmZpZXMgb2YgbmV4dCBib29zdCB0ZXN0IHN0YXJ0LiAqLwogREVGSU5FX01VVEVYKGJvb3N0X211dGV4KTsJCS8qIHByb3RlY3Qgc2V0dGluZyBib29zdF9zdGFydHRpbWUgKi8KQEAgLTc1MSw2ICs3NDksNyBAQAogCQluX3JjdV90b3J0dXJlX2Jvb3N0X3J0ZXJyb3IrKzsKIAl9CiAKKwlpbml0X3JjdV9oZWFkX29uX3N0YWNrKCZyYmkucmN1KTsKIAkvKiBFYWNoIHBhc3MgdGhyb3VnaCB0aGUgZm9sbG93aW5nIGxvb3AgZG9lcyBvbmUgYm9vc3QtdGVzdCBjeWNsZS4gKi8KIAlkbyB7CiAJCS8qIFdhaXQgZm9yIHRoZSBuZXh0IHRlc3QgaW50ZXJ2YWwuICovCkBAIC04MTAsNiArODA5LDcgQEAKIAogCS8qIENsZWFuIHVwIGFuZCBleGl0LiAqLwogCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfYm9vc3QgdGFzayBzdG9wcGluZyIpOworCWRlc3Ryb3lfcmN1X2hlYWRfb25fc3RhY2soJnJiaS5yY3UpOwogCXJjdXRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKCJyY3VfdG9ydHVyZV9ib29zdCIpOwogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpIHx8IHJiaS5pbmZsaWdodCkKIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CkBAIC04ODYsNyArODg2LDcgQEAKIAkJCW9sZF9ycC0+cnRvcnRfcGlwZV9jb3VudCsrOwogCQkJY3VyX29wcy0+ZGVmZXJyZWRfZnJlZShvbGRfcnApOwogCQl9Ci0JCXJjdV90b3J0dXJlX2N1cnJlbnRfdmVyc2lvbisrOworCQlyY3V0b3J0dXJlX3JlY29yZF9wcm9ncmVzcygrK3JjdV90b3J0dXJlX2N1cnJlbnRfdmVyc2lvbik7CiAJCW9sZGJhdGNoID0gY3VyX29wcy0+Y29tcGxldGVkKCk7CiAJCXJjdV9zdHV0dGVyX3dhaXQoInJjdV90b3J0dXJlX3dyaXRlciIpOwogCX0gd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgJiYgZnVsbHN0b3AgPT0gRlVMTFNUT1BfRE9OVFNUT1ApOwpAQCAtMTA2Niw4ICsxMDY2LDggQEAKIAl9CiAJY250ICs9IHNwcmludGYoJnBhZ2VbY250XSwgIiVzJXMgIiwgdG9ydHVyZV90eXBlLCBUT1JUVVJFX0ZMQUcpOwogCWNudCArPSBzcHJpbnRmKCZwYWdlW2NudF0sCi0JCSAgICAgICAicnRjOiAlcCB2ZXI6ICVsZCB0ZmxlOiAlZCBydGE6ICVkIHJ0YWY6ICVkIHJ0ZjogJWQgIgotCQkgICAgICAgInJ0bWJlOiAlZCBydGJrZTogJWxkIHJ0YnJlOiAlbGQgcnRiYWU6ICVsZCBydGJhZmU6ICVsZCAiCisJCSAgICAgICAicnRjOiAlcCB2ZXI6ICVsdSB0ZmxlOiAlZCBydGE6ICVkIHJ0YWY6ICVkIHJ0ZjogJWQgIgorCQkgICAgICAgInJ0bWJlOiAlZCBydGJrZTogJWxkIHJ0YnJlOiAlbGQgIgogCQkgICAgICAgInJ0YmY6ICVsZCBydGI6ICVsZCBudDogJWxkIiwKIAkJICAgICAgIHJjdV90b3J0dXJlX2N1cnJlbnQsCiAJCSAgICAgICByY3VfdG9ydHVyZV9jdXJyZW50X3ZlcnNpb24sCkBAIC0xMDc4LDE2ICsxMDc4LDEyIEBACiAJCSAgICAgICBhdG9taWNfcmVhZCgmbl9yY3VfdG9ydHVyZV9tYmVycm9yKSwKIAkJICAgICAgIG5fcmN1X3RvcnR1cmVfYm9vc3Rfa3RyZXJyb3IsCiAJCSAgICAgICBuX3JjdV90b3J0dXJlX2Jvb3N0X3J0ZXJyb3IsCi0JCSAgICAgICBuX3JjdV90b3J0dXJlX2Jvb3N0X2FsbG9jZXJyb3IsCi0JCSAgICAgICBuX3JjdV90b3J0dXJlX2Jvb3N0X2FmZmVycm9yLAogCQkgICAgICAgbl9yY3VfdG9ydHVyZV9ib29zdF9mYWlsdXJlLAogCQkgICAgICAgbl9yY3VfdG9ydHVyZV9ib29zdHMsCiAJCSAgICAgICBuX3JjdV90b3J0dXJlX3RpbWVycyk7CiAJaWYgKGF0b21pY19yZWFkKCZuX3JjdV90b3J0dXJlX21iZXJyb3IpICE9IDAgfHwKIAkgICAgbl9yY3VfdG9ydHVyZV9ib29zdF9rdHJlcnJvciAhPSAwIHx8CiAJICAgIG5fcmN1X3RvcnR1cmVfYm9vc3RfcnRlcnJvciAhPSAwIHx8Ci0JICAgIG5fcmN1X3RvcnR1cmVfYm9vc3RfYWxsb2NlcnJvciAhPSAwIHx8Ci0JICAgIG5fcmN1X3RvcnR1cmVfYm9vc3RfYWZmZXJyb3IgIT0gMCB8fAogCSAgICBuX3JjdV90b3J0dXJlX2Jvb3N0X2ZhaWx1cmUgIT0gMCkKIAkJY250ICs9IHNwcmludGYoJnBhZ2VbY250XSwgIiAhISEiKTsKIAljbnQgKz0gc3ByaW50ZigmcGFnZVtjbnRdLCAiXG4lcyVzICIsIHRvcnR1cmVfdHlwZSwgVE9SVFVSRV9GTEFHKTsKQEAgLTEzMzEsNiArMTMyNyw3IEBACiAJaW50IGk7CiAKIAltdXRleF9sb2NrKCZmdWxsc3RvcF9tdXRleCk7CisJcmN1dG9ydHVyZV9yZWNvcmRfdGVzdF90cmFuc2l0aW9uKCk7CiAJaWYgKGZ1bGxzdG9wID09IEZVTExTVE9QX1NIVVRET1dOKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgLyogYnV0IGdvaW5nIGRvd24gYW55d2F5LCBzby4uLiAqLwogCQkgICAgICAgIkNvbmN1cnJlbnQgJ3JtbW9kIHJjdXRvcnR1cmUnIGFuZCBzaHV0ZG93biBpbGxlZ2FsIVxuIik7CkBAIC0xNDg2LDggKzE0ODMsNiBAQAogCWF0b21pY19zZXQoJm5fcmN1X3RvcnR1cmVfZXJyb3IsIDApOwogCW5fcmN1X3RvcnR1cmVfYm9vc3Rfa3RyZXJyb3IgPSAwOwogCW5fcmN1X3RvcnR1cmVfYm9vc3RfcnRlcnJvciA9IDA7Ci0Jbl9yY3VfdG9ydHVyZV9ib29zdF9hbGxvY2Vycm9yID0gMDsKLQluX3JjdV90b3J0dXJlX2Jvb3N0X2FmZmVycm9yID0gMDsKIAluX3JjdV90b3J0dXJlX2Jvb3N0X2ZhaWx1cmUgPSAwOwogCW5fcmN1X3RvcnR1cmVfYm9vc3RzID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgUkNVX1RPUlRVUkVfUElQRV9MRU4gKyAxOyBpKyspCkBAIC0xNjI0LDYgKzE2MTksNyBAQAogCQl9CiAJfQogCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmcmN1dG9ydHVyZV9zaHV0ZG93bl9uYik7CisJcmN1dG9ydHVyZV9yZWNvcmRfdGVzdF90cmFuc2l0aW9uKCk7CiAJbXV0ZXhfdW5sb2NrKCZmdWxsc3RvcF9tdXRleCk7CiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3V0cmVlLmMgYi9rZXJuZWwvcmN1dHJlZS5jCmluZGV4IGRkNGFlYTguLmU0ODZmN2MgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3V0cmVlLmMKKysrIGIva2VybmVsL3JjdXRyZWUuYwpAQCAtNDcsNiArNDcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KIAogI2luY2x1ZGUgInJjdXRyZWUuaCIKIApAQCAtNzksMTAgKzgxLDQxIEBACiBzdHJ1Y3QgcmN1X3N0YXRlIHJjdV9iaF9zdGF0ZSA9IFJDVV9TVEFURV9JTklUSUFMSVpFUihyY3VfYmhfc3RhdGUpOwogREVGSU5FX1BFUl9DUFUoc3RydWN0IHJjdV9kYXRhLCByY3VfYmhfZGF0YSk7CiAKK3N0YXRpYyBzdHJ1Y3QgcmN1X3N0YXRlICpyY3Vfc3RhdGU7CisKIGludCByY3Vfc2NoZWR1bGVyX2FjdGl2ZSBfX3JlYWRfbW9zdGx5OwogRVhQT1JUX1NZTUJPTF9HUEwocmN1X3NjaGVkdWxlcl9hY3RpdmUpOwogCiAvKgorICogQ29udHJvbCB2YXJpYWJsZXMgZm9yIHBlci1DUFUgYW5kIHBlci1yY3Vfbm9kZSBrdGhyZWFkcy4gIFRoZXNlCisgKiBoYW5kbGUgYWxsIGZsYXZvcnMgb2YgUkNVLgorICovCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHRhc2tfc3RydWN0ICosIHJjdV9jcHVfa3RocmVhZF90YXNrKTsKK0RFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgcmN1X2NwdV9rdGhyZWFkX3N0YXR1cyk7CitERUZJTkVfUEVSX0NQVShpbnQsIHJjdV9jcHVfa3RocmVhZF9jcHUpOworREVGSU5FX1BFUl9DUFUodW5zaWduZWQgaW50LCByY3VfY3B1X2t0aHJlYWRfbG9vcHMpOworc3RhdGljIERFRklORV9QRVJfQ1BVKHdhaXRfcXVldWVfaGVhZF90LCByY3VfY3B1X3dxKTsKK0RFRklORV9QRVJfQ1BVKGNoYXIsIHJjdV9jcHVfaGFzX3dvcmspOworc3RhdGljIGNoYXIgcmN1X2t0aHJlYWRzX3NwYXduYWJsZTsKKworc3RhdGljIHZvaWQgcmN1X25vZGVfa3RocmVhZF9zZXRhZmZpbml0eShzdHJ1Y3QgcmN1X25vZGUgKnJucCwgaW50IG91dGdvaW5nY3B1KTsKK3N0YXRpYyB2b2lkIGludm9rZV9yY3VfY3B1X2t0aHJlYWQodm9pZCk7CisKKyNkZWZpbmUgUkNVX0tUSFJFQURfUFJJTyAxCS8qIFJUIHByaW9yaXR5IGZvciBwZXItQ1BVIGt0aHJlYWRzLiAqLworCisvKgorICogVHJhY2sgdGhlIHJjdXRvcnR1cmUgdGVzdCBzZXF1ZW5jZSBudW1iZXIgYW5kIHRoZSB1cGRhdGUgdmVyc2lvbgorICogbnVtYmVyIHdpdGhpbiBhIGdpdmVuIHRlc3QuICBUaGUgcmN1dG9ydHVyZV90ZXN0c2VxIGlzIGluY3JlbWVudGVkCisgKiBvbiBldmVyeSByY3V0b3J0dXJlIG1vZHVsZSBsb2FkIGFuZCB1bmxvYWQsIHNvIGhhcyBhbiBvZGQgdmFsdWUKKyAqIHdoZW4gYSB0ZXN0IGlzIHJ1bm5pbmcuICBUaGUgcmN1dG9ydHVyZV92ZXJudW0gaXMgc2V0IHRvIHplcm8KKyAqIHdoZW4gcmN1dG9ydHVyZSBzdGFydHMgYW5kIGlzIGluY3JlbWVudGVkIG9uIGVhY2ggcmN1dG9ydHVyZSB1cGRhdGUuCisgKiBUaGVzZSB2YXJpYWJsZXMgZW5hYmxlIGNvcnJlbGF0aW5nIHJjdXRvcnR1cmUgb3V0cHV0IHdpdGggdGhlCisgKiBSQ1UgdHJhY2luZyBpbmZvcm1hdGlvbi4KKyAqLwordW5zaWduZWQgbG9uZyByY3V0b3J0dXJlX3Rlc3RzZXE7Cit1bnNpZ25lZCBsb25nIHJjdXRvcnR1cmVfdmVybnVtOworCisvKgogICogUmV0dXJuIHRydWUgaWYgYW4gUkNVIGdyYWNlIHBlcmlvZCBpcyBpbiBwcm9ncmVzcy4gIFRoZSBBQ0NFU1NfT05DRSgpcwogICogcGVybWl0IHRoaXMgZnVuY3Rpb24gdG8gYmUgaW52b2tlZCB3aXRob3V0IGhvbGRpbmcgdGhlIHJvb3QgcmN1X25vZGUKICAqIHN0cnVjdHVyZSdzIC0+bG9jaywgYnV0IG9mIGNvdXJzZSByZXN1bHRzIGNhbiBiZSBzdWJqZWN0IHRvIGNoYW5nZS4KQEAgLTEyNCw2ICsxNTcsNyBAQAogCXJjdV9zY2hlZF9xcyhjcHUpOwogCXJjdV9wcmVlbXB0X25vdGVfY29udGV4dF9zd2l0Y2goY3B1KTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJjdV9ub3RlX2NvbnRleHRfc3dpdGNoKTsKIAogI2lmZGVmIENPTkZJR19OT19IWgogREVGSU5FX1BFUl9DUFUoc3RydWN0IHJjdV9keW50aWNrcywgcmN1X2R5bnRpY2tzKSA9IHsKQEAgLTE0MCwxMCArMTc0LDggQEAKIG1vZHVsZV9wYXJhbShxaGltYXJrLCBpbnQsIDApOwogbW9kdWxlX3BhcmFtKHFsb3dtYXJrLCBpbnQsIDApOwogCi0jaWZkZWYgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IKLWludCByY3VfY3B1X3N0YWxsX3N1cHByZXNzIF9fcmVhZF9tb3N0bHkgPSBSQ1VfQ1BVX1NUQUxMX1NVUFBSRVNTX0lOSVQ7CitpbnQgcmN1X2NwdV9zdGFsbF9zdXBwcmVzcyBfX3JlYWRfbW9zdGx5OwogbW9kdWxlX3BhcmFtKHJjdV9jcHVfc3RhbGxfc3VwcHJlc3MsIGludCwgMDY0NCk7Ci0jZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SICovCiAKIHN0YXRpYyB2b2lkIGZvcmNlX3F1aWVzY2VudF9zdGF0ZShzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsIGludCByZWxheGVkKTsKIHN0YXRpYyBpbnQgcmN1X3BlbmRpbmcoaW50IGNwdSk7CkBAIC0xNzYsNiArMjA4LDMxIEBACiBFWFBPUlRfU1lNQk9MX0dQTChyY3VfYmhfZm9yY2VfcXVpZXNjZW50X3N0YXRlKTsKIAogLyoKKyAqIFJlY29yZCB0aGUgbnVtYmVyIG9mIHRpbWVzIHJjdXRvcnR1cmUgdGVzdHMgaGF2ZSBiZWVuIGluaXRpYXRlZCBhbmQKKyAqIHRlcm1pbmF0ZWQuICBUaGlzIGluZm9ybWF0aW9uIGFsbG93cyB0aGUgZGVidWdmcyB0cmFjaW5nIHN0YXRzIHRvIGJlCisgKiBjb3JyZWxhdGVkIHRvIHRoZSByY3V0b3J0dXJlIG1lc3NhZ2VzLCBldmVuIHdoZW4gdGhlIHJjdXRvcnR1cmUgbW9kdWxlCisgKiBpcyBiZWluZyByZXBlYXRlZGx5IGxvYWRlZCBhbmQgdW5sb2FkZWQuICBJbiBvdGhlciB3b3Jkcywgd2UgY2Fubm90CisgKiBzdG9yZSB0aGlzIHN0YXRlIGluIHJjdXRvcnR1cmUgaXRzZWxmLgorICovCit2b2lkIHJjdXRvcnR1cmVfcmVjb3JkX3Rlc3RfdHJhbnNpdGlvbih2b2lkKQoreworCXJjdXRvcnR1cmVfdGVzdHNlcSsrOworCXJjdXRvcnR1cmVfdmVybnVtID0gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJjdXRvcnR1cmVfcmVjb3JkX3Rlc3RfdHJhbnNpdGlvbik7CisKKy8qCisgKiBSZWNvcmQgdGhlIG51bWJlciBvZiB3cml0ZXIgcGFzc2VzIHRocm91Z2ggdGhlIGN1cnJlbnQgcmN1dG9ydHVyZSB0ZXN0LgorICogVGhpcyBpcyBhbHNvIHVzZWQgdG8gY29ycmVsYXRlIGRlYnVnZnMgdHJhY2luZyBzdGF0cyB3aXRoIHRoZSByY3V0b3J0dXJlCisgKiBtZXNzYWdlcy4KKyAqLwordm9pZCByY3V0b3J0dXJlX3JlY29yZF9wcm9ncmVzcyh1bnNpZ25lZCBsb25nIHZlcm51bSkKK3sKKwlyY3V0b3J0dXJlX3Zlcm51bSsrOworfQorRVhQT1JUX1NZTUJPTF9HUEwocmN1dG9ydHVyZV9yZWNvcmRfcHJvZ3Jlc3MpOworCisvKgogICogRm9yY2UgYSBxdWllc2NlbnQgc3RhdGUgZm9yIFJDVS1zY2hlZC4KICAqLwogdm9pZCByY3Vfc2NoZWRfZm9yY2VfcXVpZXNjZW50X3N0YXRlKHZvaWQpCkBAIC0yMzQsOCArMjkxLDggQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0JLyogSWYgcHJlZW1wdGFibGUgUkNVLCBubyBwb2ludCBpbiBzZW5kaW5nIHJlc2NoZWR1bGUgSVBJLiAqLwotCWlmIChyZHAtPnByZWVtcHRhYmxlKQorCS8qIElmIHByZWVtcHRpYmxlIFJDVSwgbm8gcG9pbnQgaW4gc2VuZGluZyByZXNjaGVkdWxlIElQSS4gKi8KKwlpZiAocmRwLT5wcmVlbXB0aWJsZSkKIAkJcmV0dXJuIDA7CiAKIAkvKiBUaGUgQ1BVIGlzIG9ubGluZSwgc28gc2VuZCBpdCBhIHJlc2NoZWR1bGUgSVBJLiAqLwpAQCAtNDUwLDggKzUwNyw2IEBACiAKICNlbmRpZiAvKiAjZWxzZSAjaWZkZWYgQ09ORklHX05PX0haICovCiAKLSNpZmRlZiBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUgotCiBpbnQgcmN1X2NwdV9zdGFsbF9zdXBwcmVzcyBfX3JlYWRfbW9zdGx5OwogCiBzdGF0aWMgdm9pZCByZWNvcmRfZ3Bfc3RhbGxfY2hlY2tfdGltZShzdHJ1Y3QgcmN1X3N0YXRlICpyc3ApCkBAIC01MzcsMjEgKzU5MiwyNCBAQAogCiBzdGF0aWMgdm9pZCBjaGVja19jcHVfc3RhbGwoc3RydWN0IHJjdV9zdGF0ZSAqcnNwLCBzdHJ1Y3QgcmN1X2RhdGEgKnJkcCkKIHsKLQlsb25nIGRlbHRhOworCXVuc2lnbmVkIGxvbmcgajsKKwl1bnNpZ25lZCBsb25nIGpzOwogCXN0cnVjdCByY3Vfbm9kZSAqcm5wOwogCiAJaWYgKHJjdV9jcHVfc3RhbGxfc3VwcHJlc3MpCiAJCXJldHVybjsKLQlkZWx0YSA9IGppZmZpZXMgLSBBQ0NFU1NfT05DRShyc3AtPmppZmZpZXNfc3RhbGwpOworCWogPSBBQ0NFU1NfT05DRShqaWZmaWVzKTsKKwlqcyA9IEFDQ0VTU19PTkNFKHJzcC0+amlmZmllc19zdGFsbCk7CiAJcm5wID0gcmRwLT5teW5vZGU7Ci0JaWYgKChBQ0NFU1NfT05DRShybnAtPnFzbWFzaykgJiByZHAtPmdycG1hc2spICYmIGRlbHRhID49IDApIHsKKwlpZiAoKEFDQ0VTU19PTkNFKHJucC0+cXNtYXNrKSAmIHJkcC0+Z3JwbWFzaykgJiYgVUxPTkdfQ01QX0dFKGosIGpzKSkgewogCiAJCS8qIFdlIGhhdmVuJ3QgY2hlY2tlZCBpbiwgc28gZ28gZHVtcCBzdGFjay4gKi8KIAkJcHJpbnRfY3B1X3N0YWxsKHJzcCk7CiAKLQl9IGVsc2UgaWYgKHJjdV9ncF9pbl9wcm9ncmVzcyhyc3ApICYmIGRlbHRhID49IFJDVV9TVEFMTF9SQVRfREVMQVkpIHsKKwl9IGVsc2UgaWYgKHJjdV9ncF9pbl9wcm9ncmVzcyhyc3ApICYmCisJCSAgIFVMT05HX0NNUF9HRShqLCBqcyArIFJDVV9TVEFMTF9SQVRfREVMQVkpKSB7CiAKLQkJLyogVGhleSBoYWQgdHdvIHRpbWUgdW5pdHMgdG8gZHVtcCBzdGFjaywgc28gY29tcGxhaW4uICovCisJCS8qIFRoZXkgaGFkIGEgZmV3IHRpbWUgdW5pdHMgdG8gZHVtcCBzdGFjaywgc28gY29tcGxhaW4uICovCiAJCXByaW50X290aGVyX2NwdV9zdGFsbChyc3ApOwogCX0KIH0KQEAgLTU4NywyNiArNjQ1LDYgQEAKIAlhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJnBhbmljX25vdGlmaWVyX2xpc3QsICZyY3VfcGFuaWNfYmxvY2spOwogfQogCi0jZWxzZSAvKiAjaWZkZWYgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgKi8KLQotc3RhdGljIHZvaWQgcmVjb3JkX2dwX3N0YWxsX2NoZWNrX3RpbWUoc3RydWN0IHJjdV9zdGF0ZSAqcnNwKQotewotfQotCi1zdGF0aWMgdm9pZCBjaGVja19jcHVfc3RhbGwoc3RydWN0IHJjdV9zdGF0ZSAqcnNwLCBzdHJ1Y3QgcmN1X2RhdGEgKnJkcCkKLXsKLX0KLQotdm9pZCByY3VfY3B1X3N0YWxsX3Jlc2V0KHZvaWQpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBjaGVja19jcHVfc3RhbGxfaW5pdCh2b2lkKQotewotfQotCi0jZW5kaWYgLyogI2Vsc2UgI2lmZGVmIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SICovCi0KIC8qCiAgKiBVcGRhdGUgQ1BVLWxvY2FsIHJjdV9kYXRhIHN0YXRlIHRvIHJlY29yZCB0aGUgbmV3bHkgbm90aWNlZCBncmFjZSBwZXJpb2QuCiAgKiBUaGlzIGlzIHVzZWQgYm90aCB3aGVuIHdlIHN0YXJ0ZWQgdGhlIGdyYWNlIHBlcmlvZCBhbmQgd2hlbiB3ZSBub3RpY2UKQEAgLTgwOSw2ICs4NDcsNyBAQAogCQlybnAtPmNvbXBsZXRlZCA9IHJzcC0+Y29tcGxldGVkOwogCQlyc3AtPnNpZ25hbGVkID0gUkNVX1NJR05BTF9JTklUOyAvKiBmb3JjZV9xdWllc2NlbnRfc3RhdGUgT0suICovCiAJCXJjdV9zdGFydF9ncF9wZXJfY3B1KHJzcCwgcm5wLCByZHApOworCQlyY3VfcHJlZW1wdF9ib29zdF9zdGFydF9ncChybnApOwogCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7CiAJCXJldHVybjsKIAl9CkBAIC04NDQsNiArODgzLDcgQEAKIAkJcm5wLT5jb21wbGV0ZWQgPSByc3AtPmNvbXBsZXRlZDsKIAkJaWYgKHJucCA9PSByZHAtPm15bm9kZSkKIAkJCXJjdV9zdGFydF9ncF9wZXJfY3B1KHJzcCwgcm5wLCByZHApOworCQlyY3VfcHJlZW1wdF9ib29zdF9zdGFydF9ncChybnApOwogCQlyYXdfc3Bpbl91bmxvY2soJnJucC0+bG9jayk7CS8qIGlycXMgcmVtYWluIGRpc2FibGVkLiAqLwogCX0KIApAQCAtODY0LDcgKzkwNCwxMiBAQAogc3RhdGljIHZvaWQgcmN1X3JlcG9ydF9xc19yc3Aoc3RydWN0IHJjdV9zdGF0ZSAqcnNwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogCV9fcmVsZWFzZXMocmN1X2dldF9yb290KHJzcCktPmxvY2spCiB7CisJdW5zaWduZWQgbG9uZyBncF9kdXJhdGlvbjsKKwogCVdBUk5fT05fT05DRSghcmN1X2dwX2luX3Byb2dyZXNzKHJzcCkpOworCWdwX2R1cmF0aW9uID0gamlmZmllcyAtIHJzcC0+Z3Bfc3RhcnQ7CisJaWYgKGdwX2R1cmF0aW9uID4gcnNwLT5ncF9tYXgpCisJCXJzcC0+Z3BfbWF4ID0gZ3BfZHVyYXRpb247CiAJcnNwLT5jb21wbGV0ZWQgPSByc3AtPmdwbnVtOwogCXJzcC0+c2lnbmFsZWQgPSBSQ1VfR1BfSURMRTsKIAlyY3Vfc3RhcnRfZ3AocnNwLCBmbGFncyk7ICAvKiByZWxlYXNlcyByb290IG5vZGUncyBybnAtPmxvY2suICovCkBAIC04OTQsNyArOTM5LDcgQEAKIAkJCXJldHVybjsKIAkJfQogCQlybnAtPnFzbWFzayAmPSB+bWFzazsKLQkJaWYgKHJucC0+cXNtYXNrICE9IDAgfHwgcmN1X3ByZWVtcHRlZF9yZWFkZXJzKHJucCkpIHsKKwkJaWYgKHJucC0+cXNtYXNrICE9IDAgfHwgcmN1X3ByZWVtcHRfYmxvY2tlZF9yZWFkZXJzX2NncChybnApKSB7CiAKIAkJCS8qIE90aGVyIGJpdHMgc3RpbGwgc2V0IGF0IHRoaXMgbGV2ZWwsIHNvIGRvbmUuICovCiAJCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7CkBAIC0xMDM3LDYgKzEwODIsOCBAQAogLyoKICAqIFJlbW92ZSB0aGUgb3V0Z29pbmcgQ1BVIGZyb20gdGhlIGJpdG1hc2tzIGluIHRoZSByY3Vfbm9kZSBoaWVyYXJjaHkKICAqIGFuZCBtb3ZlIGFsbCBjYWxsYmFja3MgZnJvbSB0aGUgb3V0Z29pbmcgQ1BVIHRvIHRoZSBjdXJyZW50IG9uZS4KKyAqIFRoZXJlIGNhbiBvbmx5IGJlIG9uZSBDUFUgaG90cGx1ZyBvcGVyYXRpb24gYXQgYSB0aW1lLCBzbyBubyBvdGhlcgorICogQ1BVIGNhbiBiZSBhdHRlbXB0aW5nIHRvIHVwZGF0ZSByY3VfY3B1X2t0aHJlYWRfdGFzay4KICAqLwogc3RhdGljIHZvaWQgX19yY3Vfb2ZmbGluZV9jcHUoaW50IGNwdSwgc3RydWN0IHJjdV9zdGF0ZSAqcnNwKQogewpAQCAtMTA0NSw2ICsxMDkyLDE0IEBACiAJaW50IG5lZWRfcmVwb3J0ID0gMDsKIAlzdHJ1Y3QgcmN1X2RhdGEgKnJkcCA9IHBlcl9jcHVfcHRyKHJzcC0+cmRhLCBjcHUpOwogCXN0cnVjdCByY3Vfbm9kZSAqcm5wOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKKworCS8qIFN0b3AgdGhlIENQVSdzIGt0aHJlYWQuICovCisJdCA9IHBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX3Rhc2ssIGNwdSk7CisJaWYgKHQgIT0gTlVMTCkgeworCQlwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF90YXNrLCBjcHUpID0gTlVMTDsKKwkJa3RocmVhZF9zdG9wKHQpOworCX0KIAogCS8qIEV4Y2x1ZGUgYW55IGF0dGVtcHRzIHRvIHN0YXJ0IGEgbmV3IGdyYWNlIHBlcmlvZC4gKi8KIAlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnJzcC0+b25vZmZsb2NrLCBmbGFncyk7CkBAIC0xMDgyLDYgKzExMzcsNyBAQAogCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7CiAJaWYgKG5lZWRfcmVwb3J0ICYgUkNVX09GTF9UQVNLU19FWFBfR1ApCiAJCXJjdV9yZXBvcnRfZXhwX3JucChyc3AsIHJucCk7CisJcmN1X25vZGVfa3RocmVhZF9zZXRhZmZpbml0eShybnAsIC0xKTsKIH0KIAogLyoKQEAgLTExNDMsNyArMTE5OSw3IEBACiAJCW5leHQgPSBsaXN0LT5uZXh0OwogCQlwcmVmZXRjaChuZXh0KTsKIAkJZGVidWdfcmN1X2hlYWRfdW5xdWV1ZShsaXN0KTsKLQkJbGlzdC0+ZnVuYyhsaXN0KTsKKwkJX19yY3VfcmVjbGFpbShsaXN0KTsKIAkJbGlzdCA9IG5leHQ7CiAJCWlmICgrK2NvdW50ID49IHJkcC0+YmxpbWl0KQogCQkJYnJlYWs7CkBAIC0xMTc5LDcgKzEyMzUsNyBAQAogCiAJLyogUmUtcmFpc2UgdGhlIFJDVSBzb2Z0aXJxIGlmIHRoZXJlIGFyZSBjYWxsYmFja3MgcmVtYWluaW5nLiAqLwogCWlmIChjcHVfaGFzX2NhbGxiYWNrc19yZWFkeV90b19pbnZva2UocmRwKSkKLQkJcmFpc2Vfc29mdGlycShSQ1VfU09GVElSUSk7CisJCWludm9rZV9yY3VfY3B1X2t0aHJlYWQoKTsKIH0KIAogLyoKQEAgLTEyMjUsNyArMTI4MSw3IEBACiAJfQogCXJjdV9wcmVlbXB0X2NoZWNrX2NhbGxiYWNrcyhjcHUpOwogCWlmIChyY3VfcGVuZGluZyhjcHUpKQotCQlyYWlzZV9zb2Z0aXJxKFJDVV9TT0ZUSVJRKTsKKwkJaW52b2tlX3JjdV9jcHVfa3RocmVhZCgpOwogfQogCiAjaWZkZWYgQ09ORklHX1NNUApAQCAtMTIzMyw2ICsxMjg5LDggQEAKIC8qCiAgKiBTY2FuIHRoZSBsZWFmIHJjdV9ub2RlIHN0cnVjdHVyZXMsIHByb2Nlc3NpbmcgZHludGljayBzdGF0ZSBmb3IgYW55IHRoYXQKICAqIGhhdmUgbm90IHlldCBlbmNvdW50ZXJlZCBhIHF1aWVzY2VudCBzdGF0ZSwgdXNpbmcgdGhlIGZ1bmN0aW9uIHNwZWNpZmllZC4KKyAqIEFsc28gaW5pdGlhdGUgYm9vc3RpbmcgZm9yIGFueSB0aHJlYWRzIGJsb2NrZWQgb24gdGhlIHJvb3QgcmN1X25vZGUuCisgKgogICogVGhlIGNhbGxlciBtdXN0IGhhdmUgc3VwcHJlc3NlZCBzdGFydCBvZiBuZXcgZ3JhY2UgcGVyaW9kcy4KICAqLwogc3RhdGljIHZvaWQgZm9yY2VfcXNfcm5wKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCwgaW50ICgqZikoc3RydWN0IHJjdV9kYXRhICopKQpAQCAtMTI1MSw3ICsxMzA5LDcgQEAKIAkJCXJldHVybjsKIAkJfQogCQlpZiAocm5wLT5xc21hc2sgPT0gMCkgewotCQkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucC0+bG9jaywgZmxhZ3MpOworCQkJcmN1X2luaXRpYXRlX2Jvb3N0KHJucCwgZmxhZ3MpOyAvKiByZWxlYXNlcyBybnAtPmxvY2sgKi8KIAkJCWNvbnRpbnVlOwogCQl9CiAJCWNwdSA9IHJucC0+Z3JwbG87CkBAIC0xMjY5LDYgKzEzMjcsMTEgQEAKIAkJfQogCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7CiAJfQorCXJucCA9IHJjdV9nZXRfcm9vdChyc3ApOworCWlmIChybnAtPnFzbWFzayA9PSAwKSB7CisJCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcm5wLT5sb2NrLCBmbGFncyk7CisJCXJjdV9pbml0aWF0ZV9ib29zdChybnAsIGZsYWdzKTsgLyogcmVsZWFzZXMgcm5wLT5sb2NrLiAqLworCX0KIH0KIAogLyoKQEAgLTEzODksNyArMTQ1Miw3IEBACiAvKgogICogRG8gc29mdGlycSBwcm9jZXNzaW5nIGZvciB0aGUgY3VycmVudCBDUFUuCiAgKi8KLXN0YXRpYyB2b2lkIHJjdV9wcm9jZXNzX2NhbGxiYWNrcyhzdHJ1Y3Qgc29mdGlycV9hY3Rpb24gKnVudXNlZCkKK3N0YXRpYyB2b2lkIHJjdV9wcm9jZXNzX2NhbGxiYWNrcyh2b2lkKQogewogCS8qCiAJICogTWVtb3J5IHJlZmVyZW5jZXMgZnJvbSBhbnkgcHJpb3IgUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9ucwpAQCAtMTQxNCw2ICsxNDc3LDM0NyBAQAogCXJjdV9uZWVkc19jcHVfZmx1c2goKTsKIH0KIAorLyoKKyAqIFdha2UgdXAgdGhlIGN1cnJlbnQgQ1BVJ3Mga3RocmVhZC4gIFRoaXMgcmVwbGFjZXMgcmFpc2Vfc29mdGlycSgpCisgKiBpbiBlYXJsaWVyIHZlcnNpb25zIG9mIFJDVS4gIE5vdGUgdGhhdCBiZWNhdXNlIHdlIGFyZSBydW5uaW5nIG9uCisgKiB0aGUgY3VycmVudCBDUFUgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLCB0aGUgcmN1X2NwdV9rdGhyZWFkX3Rhc2sKKyAqIGNhbm5vdCBkaXNhcHBlYXIgb3V0IGZyb20gdW5kZXIgdXMuCisgKi8KK3N0YXRpYyB2b2lkIGludm9rZV9yY3VfY3B1X2t0aHJlYWQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCV9fdGhpc19jcHVfd3JpdGUocmN1X2NwdV9oYXNfd29yaywgMSk7CisJaWYgKF9fdGhpc19jcHVfcmVhZChyY3VfY3B1X2t0aHJlYWRfdGFzaykgPT0gTlVMTCkgeworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXJldHVybjsKKwl9CisJd2FrZV91cCgmX19nZXRfY3B1X3ZhcihyY3VfY3B1X3dxKSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKgorICogV2FrZSB1cCB0aGUgc3BlY2lmaWVkIHBlci1yY3Vfbm9kZS1zdHJ1Y3R1cmUga3RocmVhZC4KKyAqIEJlY2F1c2UgdGhlIHBlci1yY3Vfbm9kZSBrdGhyZWFkcyBhcmUgaW1tb3J0YWwsIHdlIGRvbid0IG5lZWQKKyAqIHRvIGRvIGFueXRoaW5nIHRvIGtlZXAgdGhlbSBhbGl2ZS4KKyAqLworc3RhdGljIHZvaWQgaW52b2tlX3JjdV9ub2RlX2t0aHJlYWQoc3RydWN0IHJjdV9ub2RlICpybnApCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0OworCisJdCA9IHJucC0+bm9kZV9rdGhyZWFkX3Rhc2s7CisJaWYgKHQgIT0gTlVMTCkKKwkJd2FrZV91cF9wcm9jZXNzKHQpOworfQorCisvKgorICogU2V0IHRoZSBzcGVjaWZpZWQgQ1BVJ3Mga3RocmVhZCB0byBydW4gUlQgb3Igbm90LCBhcyBzcGVjaWZpZWQgYnkKKyAqIHRoZSB0b19ydCBhcmd1bWVudC4gIFRoZSBDUFUtaG90cGx1ZyBsb2NrcyBhcmUgaGVsZCwgc28gdGhlIHRhc2sKKyAqIGlzIG5vdCBnb2luZyBhd2F5LgorICovCitzdGF0aWMgdm9pZCByY3VfY3B1X2t0aHJlYWRfc2V0cnQoaW50IGNwdSwgaW50IHRvX3J0KQoreworCWludCBwb2xpY3k7CisJc3RydWN0IHNjaGVkX3BhcmFtIHNwOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKKworCXQgPSBwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF90YXNrLCBjcHUpOworCWlmICh0ID09IE5VTEwpCisJCXJldHVybjsKKwlpZiAodG9fcnQpIHsKKwkJcG9saWN5ID0gU0NIRURfRklGTzsKKwkJc3Auc2NoZWRfcHJpb3JpdHkgPSBSQ1VfS1RIUkVBRF9QUklPOworCX0gZWxzZSB7CisJCXBvbGljeSA9IFNDSEVEX05PUk1BTDsKKwkJc3Auc2NoZWRfcHJpb3JpdHkgPSAwOworCX0KKwlzY2hlZF9zZXRzY2hlZHVsZXJfbm9jaGVjayh0LCBwb2xpY3ksICZzcCk7Cit9CisKKy8qCisgKiBUaW1lciBoYW5kbGVyIHRvIGluaXRpYXRlIHRoZSB3YWtpbmcgdXAgb2YgcGVyLUNQVSBrdGhyZWFkcyB0aGF0CisgKiBoYXZlIHlpZWxkZWQgdGhlIENQVSBkdWUgdG8gZXhjZXNzIG51bWJlcnMgb2YgUkNVIGNhbGxiYWNrcy4KKyAqIFdlIHdha2UgdXAgdGhlIHBlci1yY3Vfbm9kZSBrdGhyZWFkLCB3aGljaCBpbiB0dXJuIHdpbGwgd2FrZSB1cAorICogdGhlIGJvb3N0ZXIga3RocmVhZC4KKyAqLworc3RhdGljIHZvaWQgcmN1X2NwdV9rdGhyZWFkX3RpbWVyKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHJjdV9kYXRhICpyZHAgPSBwZXJfY3B1X3B0cihyY3Vfc3RhdGUtPnJkYSwgYXJnKTsKKwlzdHJ1Y3QgcmN1X25vZGUgKnJucCA9IHJkcC0+bXlub2RlOworCisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZybnAtPmxvY2ssIGZsYWdzKTsKKwlybnAtPndha2VtYXNrIHw9IHJkcC0+Z3JwbWFzazsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7CisJaW52b2tlX3JjdV9ub2RlX2t0aHJlYWQocm5wKTsKK30KKworLyoKKyAqIERyb3AgdG8gbm9uLXJlYWwtdGltZSBwcmlvcml0eSBhbmQgeWllbGQsIGJ1dCBvbmx5IGFmdGVyIHBvc3RpbmcgYQorICogdGltZXIgdGhhdCB3aWxsIGNhdXNlIHVzIHRvIHJlZ2FpbiBvdXIgcmVhbC10aW1lIHByaW9yaXR5IGlmIHdlCisgKiByZW1haW4gcHJlZW1wdGVkLiAgRWl0aGVyIHdheSwgd2UgcmVzdG9yZSBvdXIgcmVhbC10aW1lIHByaW9yaXR5CisgKiBiZWZvcmUgcmV0dXJuaW5nLgorICovCitzdGF0aWMgdm9pZCByY3VfeWllbGQodm9pZCAoKmYpKHVuc2lnbmVkIGxvbmcpLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc2NoZWRfcGFyYW0gc3A7CisJc3RydWN0IHRpbWVyX2xpc3QgeWllbGRfdGltZXI7CisKKwlzZXR1cF90aW1lcl9vbl9zdGFjaygmeWllbGRfdGltZXIsIGYsIGFyZyk7CisJbW9kX3RpbWVyKCZ5aWVsZF90aW1lciwgamlmZmllcyArIDIpOworCXNwLnNjaGVkX3ByaW9yaXR5ID0gMDsKKwlzY2hlZF9zZXRzY2hlZHVsZXJfbm9jaGVjayhjdXJyZW50LCBTQ0hFRF9OT1JNQUwsICZzcCk7CisJc2V0X3VzZXJfbmljZShjdXJyZW50LCAxOSk7CisJc2NoZWR1bGUoKTsKKwlzcC5zY2hlZF9wcmlvcml0eSA9IFJDVV9LVEhSRUFEX1BSSU87CisJc2NoZWRfc2V0c2NoZWR1bGVyX25vY2hlY2soY3VycmVudCwgU0NIRURfRklGTywgJnNwKTsKKwlkZWxfdGltZXIoJnlpZWxkX3RpbWVyKTsKK30KKworLyoKKyAqIEhhbmRsZSBjYXNlcyB3aGVyZSB0aGUgcmN1X2NwdV9rdGhyZWFkKCkgZW5kcyB1cCBvbiB0aGUgd3JvbmcgQ1BVLgorICogVGhpcyBjYW4gaGFwcGVuIHdoaWxlIHRoZSBjb3JyZXNwb25kaW5nIENQVSBpcyBlaXRoZXIgY29taW5nIG9ubGluZQorICogb3IgZ29pbmcgb2ZmbGluZS4gIFdlIGNhbm5vdCB3YWl0IHVudGlsIHRoZSBDUFUgaXMgZnVsbHkgb25saW5lCisgKiBiZWZvcmUgc3RhcnRpbmcgdGhlIGt0aHJlYWQsIGJlY2F1c2UgdGhlIHZhcmlvdXMgbm90aWZpZXIgZnVuY3Rpb25zCisgKiBjYW4gd2FpdCBmb3IgUkNVIGdyYWNlIHBlcmlvZHMuICBTbyB3ZSBwYXJrIHJjdV9jcHVfa3RocmVhZCgpIHVudGlsCisgKiB0aGUgY29ycmVzcG9uZGluZyBDUFUgaXMgb25saW5lLgorICoKKyAqIFJldHVybiAxIGlmIHRoZSBrdGhyZWFkIG5lZWRzIHRvIHN0b3AsIDAgb3RoZXJ3aXNlLgorICoKKyAqIENhbGxlciBtdXN0IGRpc2FibGUgYmguICBUaGlzIGZ1bmN0aW9uIGNhbiBtb21lbnRhcmlseSBlbmFibGUgaXQuCisgKi8KK3N0YXRpYyBpbnQgcmN1X2NwdV9rdGhyZWFkX3Nob3VsZF9zdG9wKGludCBjcHUpCit7CisJd2hpbGUgKGNwdV9pc19vZmZsaW5lKGNwdSkgfHwKKwkgICAgICAgIWNwdW1hc2tfZXF1YWwoJmN1cnJlbnQtPmNwdXNfYWxsb3dlZCwgY3B1bWFza19vZihjcHUpKSB8fAorCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCkgIT0gY3B1KSB7CisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCisJCQlyZXR1cm4gMTsKKwkJcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfc3RhdHVzLCBjcHUpID0gUkNVX0tUSFJFQURfT0ZGQ1BVOworCQlwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF9jcHUsIGNwdSkgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOworCQlsb2NhbF9iaF9lbmFibGUoKTsKKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CisJCWlmICghY3B1bWFza19lcXVhbCgmY3VycmVudC0+Y3B1c19hbGxvd2VkLCBjcHVtYXNrX29mKGNwdSkpKQorCQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgY3B1bWFza19vZihjcHUpKTsKKwkJbG9jYWxfYmhfZGlzYWJsZSgpOworCX0KKwlwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF9jcHUsIGNwdSkgPSBjcHU7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQZXItQ1BVIGtlcm5lbCB0aHJlYWQgdGhhdCBpbnZva2VzIFJDVSBjYWxsYmFja3MuICBUaGlzIHJlcGxhY2VzIHRoZQorICogZWFybGllciBSQ1Ugc29mdGlycS4KKyAqLworc3RhdGljIGludCByY3VfY3B1X2t0aHJlYWQodm9pZCAqYXJnKQoreworCWludCBjcHUgPSAoaW50KShsb25nKWFyZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzcGluY250ID0gMDsKKwl1bnNpZ25lZCBpbnQgKnN0YXR1c3AgPSAmcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfc3RhdHVzLCBjcHUpOworCXdhaXRfcXVldWVfaGVhZF90ICp3cXAgPSAmcGVyX2NwdShyY3VfY3B1X3dxLCBjcHUpOworCWNoYXIgd29yazsKKwljaGFyICp3b3JrcCA9ICZwZXJfY3B1KHJjdV9jcHVfaGFzX3dvcmssIGNwdSk7CisKKwlmb3IgKDs7KSB7CisJCSpzdGF0dXNwID0gUkNVX0tUSFJFQURfV0FJVElORzsKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKCp3cXAsCisJCQkJCSAqd29ya3AgIT0gMCB8fCBrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOworCQlsb2NhbF9iaF9kaXNhYmxlKCk7CisJCWlmIChyY3VfY3B1X2t0aHJlYWRfc2hvdWxkX3N0b3AoY3B1KSkgeworCQkJbG9jYWxfYmhfZW5hYmxlKCk7CisJCQlicmVhazsKKwkJfQorCQkqc3RhdHVzcCA9IFJDVV9LVEhSRUFEX1JVTk5JTkc7CisJCXBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX2xvb3BzLCBjcHUpKys7CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJd29yayA9ICp3b3JrcDsKKwkJKndvcmtwID0gMDsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlpZiAod29yaykKKwkJCXJjdV9wcm9jZXNzX2NhbGxiYWNrcygpOworCQlsb2NhbF9iaF9lbmFibGUoKTsKKwkJaWYgKCp3b3JrcCAhPSAwKQorCQkJc3BpbmNudCsrOworCQllbHNlCisJCQlzcGluY250ID0gMDsKKwkJaWYgKHNwaW5jbnQgPiAxMCkgeworCQkJKnN0YXR1c3AgPSBSQ1VfS1RIUkVBRF9ZSUVMRElORzsKKwkJCXJjdV95aWVsZChyY3VfY3B1X2t0aHJlYWRfdGltZXIsICh1bnNpZ25lZCBsb25nKWNwdSk7CisJCQlzcGluY250ID0gMDsKKwkJfQorCX0KKwkqc3RhdHVzcCA9IFJDVV9LVEhSRUFEX1NUT1BQRUQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTcGF3biBhIHBlci1DUFUga3RocmVhZCwgc2V0dGluZyB1cCBhZmZpbml0eSBhbmQgcHJpb3JpdHkuCisgKiBCZWNhdXNlIHRoZSBDUFUgaG90cGx1ZyBsb2NrIGlzIGhlbGQsIG5vIG90aGVyIENQVSB3aWxsIGJlIGF0dGVtcHRpbmcKKyAqIHRvIG1hbmlwdWxhdGUgcmN1X2NwdV9rdGhyZWFkX3Rhc2suICBUaGVyZSBtaWdodCBiZSBhbm90aGVyIENQVQorICogYXR0ZW1wdGluZyB0byBhY2Nlc3MgaXQgZHVyaW5nIGJvb3QsIGJ1dCB0aGUgbG9ja2luZyBpbiBrdGhyZWFkX2JpbmQoKQorICogd2lsbCBlbmZvcmNlIHN1ZmZpY2llbnQgb3JkZXJpbmcuCisgKi8KK3N0YXRpYyBpbnQgX19jcHVpbml0IHJjdV9zcGF3bl9vbmVfY3B1X2t0aHJlYWQoaW50IGNwdSkKK3sKKwlzdHJ1Y3Qgc2NoZWRfcGFyYW0gc3A7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0OworCisJaWYgKCFyY3Vfa3RocmVhZHNfc3Bhd25hYmxlIHx8CisJICAgIHBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX3Rhc2ssIGNwdSkgIT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJdCA9IGt0aHJlYWRfY3JlYXRlKHJjdV9jcHVfa3RocmVhZCwgKHZvaWQgKikobG9uZyljcHUsICJyY3VjJWQiLCBjcHUpOworCWlmIChJU19FUlIodCkpCisJCXJldHVybiBQVFJfRVJSKHQpOworCWt0aHJlYWRfYmluZCh0LCBjcHUpOworCXBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX2NwdSwgY3B1KSA9IGNwdTsKKwlXQVJOX09OX09OQ0UocGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfdGFzaywgY3B1KSAhPSBOVUxMKTsKKwlwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF90YXNrLCBjcHUpID0gdDsKKwl3YWtlX3VwX3Byb2Nlc3ModCk7CisJc3Auc2NoZWRfcHJpb3JpdHkgPSBSQ1VfS1RIUkVBRF9QUklPOworCXNjaGVkX3NldHNjaGVkdWxlcl9ub2NoZWNrKHQsIFNDSEVEX0ZJRk8sICZzcCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQZXItcmN1X25vZGUga3RocmVhZCwgd2hpY2ggaXMgaW4gY2hhcmdlIG9mIHdha2luZyB1cCB0aGUgcGVyLUNQVQorICoga3RocmVhZHMgd2hlbiBuZWVkZWQuICBXZSBpZ25vcmUgcmVxdWVzdHMgdG8gd2FrZSB1cCBrdGhyZWFkcworICogZm9yIG9mZmxpbmUgQ1BVcywgd2hpY2ggaXMgT0sgYmVjYXVzZSBmb3JjZV9xdWllc2NlbnRfc3RhdGUoKQorICogdGFrZXMgY2FyZSBvZiB0aGlzIGNhc2UuCisgKi8KK3N0YXRpYyBpbnQgcmN1X25vZGVfa3RocmVhZCh2b2lkICphcmcpCit7CisJaW50IGNwdTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgbWFzazsKKwlzdHJ1Y3QgcmN1X25vZGUgKnJucCA9IChzdHJ1Y3QgcmN1X25vZGUgKilhcmc7CisJc3RydWN0IHNjaGVkX3BhcmFtIHNwOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKKworCWZvciAoOzspIHsKKwkJcm5wLT5ub2RlX2t0aHJlYWRfc3RhdHVzID0gUkNVX0tUSFJFQURfV0FJVElORzsKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHJucC0+bm9kZV93cSwgcm5wLT53YWtlbWFzayAhPSAwKTsKKwkJcm5wLT5ub2RlX2t0aHJlYWRfc3RhdHVzID0gUkNVX0tUSFJFQURfUlVOTklORzsKKwkJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZybnAtPmxvY2ssIGZsYWdzKTsKKwkJbWFzayA9IHJucC0+d2FrZW1hc2s7CisJCXJucC0+d2FrZW1hc2sgPSAwOworCQlyY3VfaW5pdGlhdGVfYm9vc3Qocm5wLCBmbGFncyk7IC8qIHJlbGVhc2VzIHJucC0+bG9jay4gKi8KKwkJZm9yIChjcHUgPSBybnAtPmdycGxvOyBjcHUgPD0gcm5wLT5ncnBoaTsgY3B1KyssIG1hc2sgPj49IDEpIHsKKwkJCWlmICgobWFzayAmIDB4MSkgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCXByZWVtcHRfZGlzYWJsZSgpOworCQkJdCA9IHBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX3Rhc2ssIGNwdSk7CisJCQlpZiAoIWNwdV9vbmxpbmUoY3B1KSB8fCB0ID09IE5VTEwpIHsKKwkJCQlwcmVlbXB0X2VuYWJsZSgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcGVyX2NwdShyY3VfY3B1X2hhc193b3JrLCBjcHUpID0gMTsKKwkJCXNwLnNjaGVkX3ByaW9yaXR5ID0gUkNVX0tUSFJFQURfUFJJTzsKKwkJCXNjaGVkX3NldHNjaGVkdWxlcl9ub2NoZWNrKHQsIFNDSEVEX0ZJRk8sICZzcCk7CisJCQlwcmVlbXB0X2VuYWJsZSgpOworCQl9CisJfQorCS8qIE5PVFJFQUNIRUQgKi8KKwlybnAtPm5vZGVfa3RocmVhZF9zdGF0dXMgPSBSQ1VfS1RIUkVBRF9TVE9QUEVEOworCXJldHVybiAwOworfQorCisvKgorICogU2V0IHRoZSBwZXItcmN1X25vZGUga3RocmVhZCdzIGFmZmluaXR5IHRvIGNvdmVyIGFsbCBDUFVzIHRoYXQgYXJlCisgKiBzZXJ2ZWQgYnkgdGhlIHJjdV9ub2RlIGluIHF1ZXN0aW9uLiAgVGhlIENQVSBob3RwbHVnIGxvY2sgaXMgc3RpbGwKKyAqIGhlbGQsIHNvIHRoZSB2YWx1ZSBvZiBybnAtPnFzbWFza2luaXQgd2lsbCBiZSBzdGFibGUuCisgKgorICogV2UgZG9uJ3QgaW5jbHVkZSBvdXRnb2luZ2NwdSBpbiB0aGUgYWZmaW5pdHkgc2V0LCB1c2UgLTEgaWYgdGhlcmUgaXMKKyAqIG5vIG91dGdvaW5nIENQVS4gIElmIHRoZXJlIGFyZSBubyBDUFVzIGxlZnQgaW4gdGhlIGFmZmluaXR5IHNldCwKKyAqIHRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSBrdGhyZWFkIHRvIGV4ZWN1dGUgb24gYW55IENQVS4KKyAqLworc3RhdGljIHZvaWQgcmN1X25vZGVfa3RocmVhZF9zZXRhZmZpbml0eShzdHJ1Y3QgcmN1X25vZGUgKnJucCwgaW50IG91dGdvaW5nY3B1KQoreworCWNwdW1hc2tfdmFyX3QgY207CisJaW50IGNwdTsKKwl1bnNpZ25lZCBsb25nIG1hc2sgPSBybnAtPnFzbWFza2luaXQ7CisKKwlpZiAocm5wLT5ub2RlX2t0aHJlYWRfdGFzayA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmY20sIEdGUF9LRVJORUwpKQorCQlyZXR1cm47CisJY3B1bWFza19jbGVhcihjbSk7CisJZm9yIChjcHUgPSBybnAtPmdycGxvOyBjcHUgPD0gcm5wLT5ncnBoaTsgY3B1KyssIG1hc2sgPj49IDEpCisJCWlmICgobWFzayAmIDB4MSkgJiYgY3B1ICE9IG91dGdvaW5nY3B1KQorCQkJY3B1bWFza19zZXRfY3B1KGNwdSwgY20pOworCWlmIChjcHVtYXNrX3dlaWdodChjbSkgPT0gMCkgeworCQljcHVtYXNrX3NldGFsbChjbSk7CisJCWZvciAoY3B1ID0gcm5wLT5ncnBsbzsgY3B1IDw9IHJucC0+Z3JwaGk7IGNwdSsrKQorCQkJY3B1bWFza19jbGVhcl9jcHUoY3B1LCBjbSk7CisJCVdBUk5fT05fT05DRShjcHVtYXNrX3dlaWdodChjbSkgPT0gMCk7CisJfQorCXNldF9jcHVzX2FsbG93ZWRfcHRyKHJucC0+bm9kZV9rdGhyZWFkX3Rhc2ssIGNtKTsKKwlyY3VfYm9vc3Rfa3RocmVhZF9zZXRhZmZpbml0eShybnAsIGNtKTsKKwlmcmVlX2NwdW1hc2tfdmFyKGNtKTsKK30KKworLyoKKyAqIFNwYXduIGEgcGVyLXJjdV9ub2RlIGt0aHJlYWQsIHNldHRpbmcgcHJpb3JpdHkgYW5kIGFmZmluaXR5LgorICogQ2FsbGVkIGR1cmluZyBib290IGJlZm9yZSBvbmxpbmUvb2ZmbGluZSBjYW4gaGFwcGVuLCBvciwgaWYKKyAqIGR1cmluZyBydW50aW1lLCB3aXRoIHRoZSBtYWluIENQVS1ob3RwbHVnIGxvY2tzIGhlbGQuICBTbyBvbmx5CisgKiBvbmUgb2YgdGhlc2UgY2FuIGJlIGV4ZWN1dGluZyBhdCBhIHRpbWUuCisgKi8KK3N0YXRpYyBpbnQgX19jcHVpbml0IHJjdV9zcGF3bl9vbmVfbm9kZV9rdGhyZWFkKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCwKKwkJCQkJCXN0cnVjdCByY3Vfbm9kZSAqcm5wKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJucF9pbmRleCA9IHJucCAtICZyc3AtPm5vZGVbMF07CisJc3RydWN0IHNjaGVkX3BhcmFtIHNwOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKKworCWlmICghcmN1X2t0aHJlYWRzX3NwYXduYWJsZSB8fAorCSAgICBybnAtPnFzbWFza2luaXQgPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKHJucC0+bm9kZV9rdGhyZWFkX3Rhc2sgPT0gTlVMTCkgeworCQl0ID0ga3RocmVhZF9jcmVhdGUocmN1X25vZGVfa3RocmVhZCwgKHZvaWQgKilybnAsCisJCQkJICAgInJjdW4lZCIsIHJucF9pbmRleCk7CisJCWlmIChJU19FUlIodCkpCisJCQlyZXR1cm4gUFRSX0VSUih0KTsKKwkJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZybnAtPmxvY2ssIGZsYWdzKTsKKwkJcm5wLT5ub2RlX2t0aHJlYWRfdGFzayA9IHQ7CisJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKKwkJd2FrZV91cF9wcm9jZXNzKHQpOworCQlzcC5zY2hlZF9wcmlvcml0eSA9IDk5OworCQlzY2hlZF9zZXRzY2hlZHVsZXJfbm9jaGVjayh0LCBTQ0hFRF9GSUZPLCAmc3ApOworCX0KKwlyZXR1cm4gcmN1X3NwYXduX29uZV9ib29zdF9rdGhyZWFkKHJzcCwgcm5wLCBybnBfaW5kZXgpOworfQorCisvKgorICogU3Bhd24gYWxsIGt0aHJlYWRzIC0tIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBzY2hlZHVsZXIgaXMgcnVubmluZy4KKyAqLworc3RhdGljIGludCBfX2luaXQgcmN1X3NwYXduX2t0aHJlYWRzKHZvaWQpCit7CisJaW50IGNwdTsKKwlzdHJ1Y3QgcmN1X25vZGUgKnJucDsKKworCXJjdV9rdGhyZWFkc19zcGF3bmFibGUgPSAxOworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcGVyX2NwdShyY3VfY3B1X3dxLCBjcHUpKTsKKwkJcGVyX2NwdShyY3VfY3B1X2hhc193b3JrLCBjcHUpID0gMDsKKwkJaWYgKGNwdV9vbmxpbmUoY3B1KSkKKwkJCSh2b2lkKXJjdV9zcGF3bl9vbmVfY3B1X2t0aHJlYWQoY3B1KTsKKwl9CisJcm5wID0gcmN1X2dldF9yb290KHJjdV9zdGF0ZSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcm5wLT5ub2RlX3dxKTsKKwlyY3VfaW5pdF9ib29zdF93YWl0cXVldWUocm5wKTsKKwkodm9pZClyY3Vfc3Bhd25fb25lX25vZGVfa3RocmVhZChyY3Vfc3RhdGUsIHJucCk7CisJaWYgKE5VTV9SQ1VfTk9ERVMgPiAxKQorCQlyY3VfZm9yX2VhY2hfbGVhZl9ub2RlKHJjdV9zdGF0ZSwgcm5wKSB7CisJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZybnAtPm5vZGVfd3EpOworCQkJcmN1X2luaXRfYm9vc3Rfd2FpdHF1ZXVlKHJucCk7CisJCQkodm9pZClyY3Vfc3Bhd25fb25lX25vZGVfa3RocmVhZChyY3Vfc3RhdGUsIHJucCk7CisJCX0KKwlyZXR1cm4gMDsKK30KK2Vhcmx5X2luaXRjYWxsKHJjdV9zcGF3bl9rdGhyZWFkcyk7CisKIHN0YXRpYyB2b2lkCiBfX2NhbGxfcmN1KHN0cnVjdCByY3VfaGVhZCAqaGVhZCwgdm9pZCAoKmZ1bmMpKHN0cnVjdCByY3VfaGVhZCAqcmN1KSwKIAkgICBzdHJ1Y3QgcmN1X3N0YXRlICpyc3ApCkBAIC0xNDM5LDYgKzE4NDMsMTMgQEAKIAkvKiBBZGQgdGhlIGNhbGxiYWNrIHRvIG91ciBsaXN0LiAqLwogCSpyZHAtPm54dHRhaWxbUkNVX05FWFRfVEFJTF0gPSBoZWFkOwogCXJkcC0+bnh0dGFpbFtSQ1VfTkVYVF9UQUlMXSA9ICZoZWFkLT5uZXh0OworCXJkcC0+cWxlbisrOworCisJLyogSWYgaW50ZXJydXB0cyB3ZXJlIGRpc2FibGVkLCBkb24ndCBkaXZlIGludG8gUkNVIGNvcmUuICovCisJaWYgKGlycXNfZGlzYWJsZWRfZmxhZ3MoZmxhZ3MpKSB7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcmV0dXJuOworCX0KIAogCS8qCiAJICogRm9yY2UgdGhlIGdyYWNlIHBlcmlvZCBpZiB0b28gbWFueSBjYWxsYmFja3Mgb3IgdG9vIGxvbmcgd2FpdGluZy4KQEAgLTE0NDcsNyArMTg1OCw3IEBACiAJICogaW52b2tpbmcgZm9yY2VfcXVpZXNjZW50X3N0YXRlKCkgaWYgdGhlIG5ld2x5IGVucXVldWVkIGNhbGxiYWNrCiAJICogaXMgdGhlIG9ubHkgb25lIHdhaXRpbmcgZm9yIGEgZ3JhY2UgcGVyaW9kIHRvIGNvbXBsZXRlLgogCSAqLwotCWlmICh1bmxpa2VseSgrK3JkcC0+cWxlbiA+IHJkcC0+cWxlbl9sYXN0X2Zxc19jaGVjayArIHFoaW1hcmspKSB7CisJaWYgKHVubGlrZWx5KHJkcC0+cWxlbiA+IHJkcC0+cWxlbl9sYXN0X2Zxc19jaGVjayArIHFoaW1hcmspKSB7CiAKIAkJLyogQXJlIHdlIGlnbm9yaW5nIGEgY29tcGxldGVkIGdyYWNlIHBlcmlvZD8gKi8KIAkJcmN1X3Byb2Nlc3NfZ3BfZW5kKHJzcCwgcmRwKTsKQEAgLTE1ODMsNyArMTk5NCw3IEBACiAJCSAqIG9yIFJDVS1iaCwgZm9yY2UgYSBsb2NhbCByZXNjaGVkdWxlLgogCQkgKi8KIAkJcmRwLT5uX3JwX3FzX3BlbmRpbmcrKzsKLQkJaWYgKCFyZHAtPnByZWVtcHRhYmxlICYmCisJCWlmICghcmRwLT5wcmVlbXB0aWJsZSAmJgogCQkgICAgVUxPTkdfQ01QX0xUKEFDQ0VTU19PTkNFKHJzcC0+amlmZmllc19mb3JjZV9xcykgLSAxLAogCQkJCSBqaWZmaWVzKSkKIAkJCXNldF9uZWVkX3Jlc2NoZWQoKTsKQEAgLTE3NjAsNyArMjE3MSw3IEBACiAgKiB0aGF0IHRoaXMgQ1BVIGNhbm5vdCBwb3NzaWJseSBoYXZlIGFueSBSQ1UgY2FsbGJhY2tzIGluIGZsaWdodCB5ZXQuCiAgKi8KIHN0YXRpYyB2b2lkIF9fY3B1aW5pdAotcmN1X2luaXRfcGVyY3B1X2RhdGEoaW50IGNwdSwgc3RydWN0IHJjdV9zdGF0ZSAqcnNwLCBpbnQgcHJlZW1wdGFibGUpCityY3VfaW5pdF9wZXJjcHVfZGF0YShpbnQgY3B1LCBzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsIGludCBwcmVlbXB0aWJsZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgbWFzazsKQEAgLTE3NzIsNyArMjE4Myw3IEBACiAJcmRwLT5wYXNzZWRfcXVpZXNjID0gMDsgIC8qIFdlIGNvdWxkIGJlIHJhY2luZyB3aXRoIG5ldyBHUCwgKi8KIAlyZHAtPnFzX3BlbmRpbmcgPSAxOwkgLyogIHNvIHNldCB1cCB0byByZXNwb25kIHRvIGN1cnJlbnQgR1AuICovCiAJcmRwLT5iZWVub25saW5lID0gMTsJIC8qIFdlIGhhdmUgbm93IGJlZW4gb25saW5lLiAqLwotCXJkcC0+cHJlZW1wdGFibGUgPSBwcmVlbXB0YWJsZTsKKwlyZHAtPnByZWVtcHRpYmxlID0gcHJlZW1wdGlibGU7CiAJcmRwLT5xbGVuX2xhc3RfZnFzX2NoZWNrID0gMDsKIAlyZHAtPm5fZm9yY2VfcXNfc25hcCA9IHJzcC0+bl9mb3JjZV9xczsKIAlyZHAtPmJsaW1pdCA9IGJsaW1pdDsKQEAgLTE4MTMsNiArMjIyNCwxOSBAQAogCXJjdV9wcmVlbXB0X2luaXRfcGVyY3B1X2RhdGEoY3B1KTsKIH0KIAorc3RhdGljIHZvaWQgX19jcHVpbml0IHJjdV9vbmxpbmVfa3RocmVhZHMoaW50IGNwdSkKK3sKKwlzdHJ1Y3QgcmN1X2RhdGEgKnJkcCA9IHBlcl9jcHVfcHRyKHJjdV9zdGF0ZS0+cmRhLCBjcHUpOworCXN0cnVjdCByY3Vfbm9kZSAqcm5wID0gcmRwLT5teW5vZGU7CisKKwkvKiBGaXJlIHVwIHRoZSBpbmNvbWluZyBDUFUncyBrdGhyZWFkIGFuZCBsZWFmIHJjdV9ub2RlIGt0aHJlYWQuICovCisJaWYgKHJjdV9rdGhyZWFkc19zcGF3bmFibGUpIHsKKwkJKHZvaWQpcmN1X3NwYXduX29uZV9jcHVfa3RocmVhZChjcHUpOworCQlpZiAocm5wLT5ub2RlX2t0aHJlYWRfdGFzayA9PSBOVUxMKQorCQkJKHZvaWQpcmN1X3NwYXduX29uZV9ub2RlX2t0aHJlYWQocmN1X3N0YXRlLCBybnApOworCX0KK30KKwogLyoKICAqIEhhbmRsZSBDUFUgb25saW5lL29mZmxpbmUgbm90aWZpY2F0aW9uIGV2ZW50cy4KICAqLwpAQCAtMTgyMCwxMSArMjI0NCwyMyBAQAogCQkJCSAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKIHsKIAlsb25nIGNwdSA9IChsb25nKWhjcHU7CisJc3RydWN0IHJjdV9kYXRhICpyZHAgPSBwZXJfY3B1X3B0cihyY3Vfc3RhdGUtPnJkYSwgY3B1KTsKKwlzdHJ1Y3QgcmN1X25vZGUgKnJucCA9IHJkcC0+bXlub2RlOwogCiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIENQVV9VUF9QUkVQQVJFOgogCWNhc2UgQ1BVX1VQX1BSRVBBUkVfRlJPWkVOOgogCQlyY3Vfb25saW5lX2NwdShjcHUpOworCQlyY3Vfb25saW5lX2t0aHJlYWRzKGNwdSk7CisJCWJyZWFrOworCWNhc2UgQ1BVX09OTElORToKKwljYXNlIENQVV9ET1dOX0ZBSUxFRDoKKwkJcmN1X25vZGVfa3RocmVhZF9zZXRhZmZpbml0eShybnAsIC0xKTsKKwkJcmN1X2NwdV9rdGhyZWFkX3NldHJ0KGNwdSwgMSk7CisJCWJyZWFrOworCWNhc2UgQ1BVX0RPV05fUFJFUEFSRToKKwkJcmN1X25vZGVfa3RocmVhZF9zZXRhZmZpbml0eShybnAsIGNwdSk7CisJCXJjdV9jcHVfa3RocmVhZF9zZXRydChjcHUsIDApOwogCQlicmVhazsKIAljYXNlIENQVV9EWUlORzoKIAljYXNlIENQVV9EWUlOR19GUk9aRU46CkBAIC0xOTQzLDEwICsyMzc5LDcgQEAKIAkJCQkJICAgICAgaiAvIHJzcC0+bGV2ZWxzcHJlYWRbaSAtIDFdOwogCQkJfQogCQkJcm5wLT5sZXZlbCA9IGk7Ci0JCQlJTklUX0xJU1RfSEVBRCgmcm5wLT5ibG9ja2VkX3Rhc2tzWzBdKTsKLQkJCUlOSVRfTElTVF9IRUFEKCZybnAtPmJsb2NrZWRfdGFza3NbMV0pOwotCQkJSU5JVF9MSVNUX0hFQUQoJnJucC0+YmxvY2tlZF90YXNrc1syXSk7Ci0JCQlJTklUX0xJU1RfSEVBRCgmcm5wLT5ibG9ja2VkX3Rhc2tzWzNdKTsKKwkJCUlOSVRfTElTVF9IRUFEKCZybnAtPmJsa2RfdGFza3MpOwogCQl9CiAJfQogCkBAIC0xOTY4LDcgKzI0MDEsNiBAQAogCXJjdV9pbml0X29uZSgmcmN1X3NjaGVkX3N0YXRlLCAmcmN1X3NjaGVkX2RhdGEpOwogCXJjdV9pbml0X29uZSgmcmN1X2JoX3N0YXRlLCAmcmN1X2JoX2RhdGEpOwogCV9fcmN1X2luaXRfcHJlZW1wdCgpOwotCW9wZW5fc29mdGlycShSQ1VfU09GVElSUSwgcmN1X3Byb2Nlc3NfY2FsbGJhY2tzKTsKIAogCS8qCiAJICogV2UgZG9uJ3QgbmVlZCBwcm90ZWN0aW9uIGFnYWluc3QgQ1BVLWhvdHBsdWcgaGVyZSBiZWNhdXNlCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1dHJlZS5oIGIva2VybmVsL3JjdXRyZWUuaAppbmRleCBlOGYwNTdlLi4yNTc2NjQ4IDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1dHJlZS5oCisrKyBiL2tlcm5lbC9yY3V0cmVlLmgKQEAgLTkxLDYgKzkxLDE0IEBACiAJCQkJLyogIHJlbWFpbnMgZXZlbiBmb3Igbm1pIGZyb20gaXJxIGhhbmRsZXIuICovCiB9OwogCisvKiBSQ1UncyBrdGhyZWFkIHN0YXRlcyBmb3IgdHJhY2luZy4gKi8KKyNkZWZpbmUgUkNVX0tUSFJFQURfU1RPUFBFRCAgMAorI2RlZmluZSBSQ1VfS1RIUkVBRF9SVU5OSU5HICAxCisjZGVmaW5lIFJDVV9LVEhSRUFEX1dBSVRJTkcgIDIKKyNkZWZpbmUgUkNVX0tUSFJFQURfT0ZGQ1BVICAgMworI2RlZmluZSBSQ1VfS1RIUkVBRF9ZSUVMRElORyA0CisjZGVmaW5lIFJDVV9LVEhSRUFEX01BWCAgICAgIDQKKwogLyoKICAqIERlZmluaXRpb24gZm9yIG5vZGUgd2l0aGluIHRoZSBSQ1UgZ3JhY2UtcGVyaW9kLWRldGVjdGlvbiBoaWVyYXJjaHkuCiAgKi8KQEAgLTEwOSwxMCArMTE3LDExIEBACiAJCQkJLyogIGFuIHJjdV9kYXRhIHN0cnVjdHVyZSwgb3RoZXJ3aXNlLCBlYWNoICovCiAJCQkJLyogIGJpdCBjb3JyZXNwb25kcyB0byBhIGNoaWxkIHJjdV9ub2RlICovCiAJCQkJLyogIHN0cnVjdHVyZS4gKi8KLQl1bnNpZ25lZCBsb25nIGV4cG1hc2s7CS8qIEdyb3VwcyB0aGF0IGhhdmUgLT5ibG9ja2VkX3Rhc2tzW10gKi8KKwl1bnNpZ25lZCBsb25nIGV4cG1hc2s7CS8qIEdyb3VwcyB0aGF0IGhhdmUgLT5ibGtkX3Rhc2tzICovCiAJCQkJLyogIGVsZW1lbnRzIHRoYXQgbmVlZCB0byBkcmFpbiB0byBhbGxvdyB0aGUgKi8KIAkJCQkvKiAgY3VycmVudCBleHBlZGl0ZWQgZ3JhY2UgcGVyaW9kIHRvICovCiAJCQkJLyogIGNvbXBsZXRlIChvbmx5IGZvciBUUkVFX1BSRUVNUFRfUkNVKS4gKi8KKwl1bnNpZ25lZCBsb25nIHdha2VtYXNrOyAvKiBDUFVzIHdob3NlIGt0aHJlYWQgbmVlZHMgdG8gYmUgYXdha2VuZWQuICovCiAJdW5zaWduZWQgbG9uZyBxc21hc2tpbml0OwogCQkJCS8qIFBlci1HUCBpbml0aWFsIHZhbHVlIGZvciBxc21hc2sgJiBleHBtYXNrLiAqLwogCXVuc2lnbmVkIGxvbmcgZ3JwbWFzazsJLyogTWFzayB0byBhcHBseSB0byBwYXJlbnQgcXNtYXNrLiAqLwpAQCAtMTIyLDExICsxMzEsNjggQEAKIAl1OAlncnBudW07CQkvKiBDUFUvZ3JvdXAgbnVtYmVyIGZvciBuZXh0IGxldmVsIHVwLiAqLwogCXU4CWxldmVsOwkJLyogcm9vdCBpcyBhdCBsZXZlbCAwLiAqLwogCXN0cnVjdCByY3Vfbm9kZSAqcGFyZW50OwotCXN0cnVjdCBsaXN0X2hlYWQgYmxvY2tlZF90YXNrc1s0XTsKLQkJCQkvKiBUYXNrcyBibG9ja2VkIGluIFJDVSByZWFkLXNpZGUgY3JpdHNlY3QuICovCi0JCQkJLyogIEdyYWNlIHBlcmlvZCBudW1iZXIgKC0+Z3BudW0pIHggYmxvY2tlZCAqLwotCQkJCS8qICBieSB0YXNrcyBvbiB0aGUgKHggJiAweDEpIGVsZW1lbnQgb2YgdGhlICovCi0JCQkJLyogIGJsb2NrZWRfdGFza3NbXSBhcnJheS4gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGJsa2RfdGFza3M7CisJCQkJLyogVGFza3MgYmxvY2tlZCBpbiBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsICovCisJCQkJLyogIHNlY3Rpb24uICBUYXNrcyBhcmUgcGxhY2VkIGF0IHRoZSBoZWFkICovCisJCQkJLyogIG9mIHRoaXMgbGlzdCBhbmQgYWdlIHRvd2FyZHMgdGhlIHRhaWwuICovCisJc3RydWN0IGxpc3RfaGVhZCAqZ3BfdGFza3M7CisJCQkJLyogUG9pbnRlciB0byB0aGUgZmlyc3QgdGFzayBibG9ja2luZyB0aGUgKi8KKwkJCQkvKiAgY3VycmVudCBncmFjZSBwZXJpb2QsIG9yIE5VTEwgaWYgdGhlcmUgKi8KKwkJCQkvKiAgaXMgbm8gc3VjaCB0YXNrLiAqLworCXN0cnVjdCBsaXN0X2hlYWQgKmV4cF90YXNrczsKKwkJCQkvKiBQb2ludGVyIHRvIHRoZSBmaXJzdCB0YXNrIGJsb2NraW5nIHRoZSAqLworCQkJCS8qICBjdXJyZW50IGV4cGVkaXRlZCBncmFjZSBwZXJpb2QsIG9yIE5VTEwgKi8KKwkJCQkvKiAgaWYgdGhlcmUgaXMgbm8gc3VjaCB0YXNrLiAgSWYgdGhlcmUgKi8KKwkJCQkvKiAgaXMgbm8gY3VycmVudCBleHBlZGl0ZWQgZ3JhY2UgcGVyaW9kLCAqLworCQkJCS8qICB0aGVuIHRoZXJlIGNhbiBjYW5ub3QgYmUgYW55IHN1Y2ggdGFzay4gKi8KKyNpZmRlZiBDT05GSUdfUkNVX0JPT1NUCisJc3RydWN0IGxpc3RfaGVhZCAqYm9vc3RfdGFza3M7CisJCQkJLyogUG9pbnRlciB0byBmaXJzdCB0YXNrIHRoYXQgbmVlZHMgdG8gYmUgKi8KKwkJCQkvKiAgcHJpb3JpdHkgYm9vc3RlZCwgb3IgTlVMTCBpZiBubyBwcmlvcml0eSAqLworCQkJCS8qICBib29zdGluZyBpcyBuZWVkZWQgZm9yIHRoaXMgcmN1X25vZGUgKi8KKwkJCQkvKiAgc3RydWN0dXJlLiAgSWYgdGhlcmUgYXJlIG5vIHRhc2tzICovCisJCQkJLyogIHF1ZXVlZCBvbiB0aGlzIHJjdV9ub2RlIHN0cnVjdHVyZSB0aGF0ICovCisJCQkJLyogIGFyZSBibG9ja2luZyB0aGUgY3VycmVudCBncmFjZSBwZXJpb2QsICovCisJCQkJLyogIHRoZXJlIGNhbiBiZSBubyBzdWNoIHRhc2suICovCisJdW5zaWduZWQgbG9uZyBib29zdF90aW1lOworCQkJCS8qIFdoZW4gdG8gc3RhcnQgYm9vc3RpbmcgKGppZmZpZXMpLiAqLworCXN0cnVjdCB0YXNrX3N0cnVjdCAqYm9vc3Rfa3RocmVhZF90YXNrOworCQkJCS8qIGt0aHJlYWQgdGhhdCB0YWtlcyBjYXJlIG9mIHByaW9yaXR5ICovCisJCQkJLyogIGJvb3N0aW5nIGZvciB0aGlzIHJjdV9ub2RlIHN0cnVjdHVyZS4gKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBib29zdF93cTsKKwkJCQkvKiBXYWl0IHF1ZXVlIG9uIHdoaWNoIHRvIHBhcmsgdGhlIGJvb3N0ICovCisJCQkJLyogIGt0aHJlYWQuICovCisJdW5zaWduZWQgaW50IGJvb3N0X2t0aHJlYWRfc3RhdHVzOworCQkJCS8qIFN0YXRlIG9mIGJvb3N0X2t0aHJlYWRfdGFzayBmb3IgdHJhY2luZy4gKi8KKwl1bnNpZ25lZCBsb25nIG5fdGFza3NfYm9vc3RlZDsKKwkJCQkvKiBUb3RhbCBudW1iZXIgb2YgdGFza3MgYm9vc3RlZC4gKi8KKwl1bnNpZ25lZCBsb25nIG5fZXhwX2Jvb3N0czsKKwkJCQkvKiBOdW1iZXIgb2YgdGFza3MgYm9vc3RlZCBmb3IgZXhwZWRpdGVkIEdQLiAqLworCXVuc2lnbmVkIGxvbmcgbl9ub3JtYWxfYm9vc3RzOworCQkJCS8qIE51bWJlciBvZiB0YXNrcyBib29zdGVkIGZvciBub3JtYWwgR1AuICovCisJdW5zaWduZWQgbG9uZyBuX2JhbGtfYmxrZF90YXNrczsKKwkJCQkvKiBSZWZ1c2VkIHRvIGJvb3N0OiBubyBibG9ja2VkIHRhc2tzLiAqLworCXVuc2lnbmVkIGxvbmcgbl9iYWxrX2V4cF9ncF90YXNrczsKKwkJCQkvKiBSZWZ1c2VkIHRvIGJvb3N0OiBub3RoaW5nIGJsb2NraW5nIEdQLiAqLworCXVuc2lnbmVkIGxvbmcgbl9iYWxrX2Jvb3N0X3Rhc2tzOworCQkJCS8qIFJlZnVzZWQgdG8gYm9vc3Q6IGFscmVhZHkgYm9vc3RpbmcuICovCisJdW5zaWduZWQgbG9uZyBuX2JhbGtfbm90YmxvY2tlZDsKKwkJCQkvKiBSZWZ1c2VkIHRvIGJvb3N0OiBSQ1UgUlMgQ1Mgc3RpbGwgcnVubmluZy4gKi8KKwl1bnNpZ25lZCBsb25nIG5fYmFsa19ub3R5ZXQ7CisJCQkJLyogUmVmdXNlZCB0byBib29zdDogbm90IHlldCB0aW1lLiAqLworCXVuc2lnbmVkIGxvbmcgbl9iYWxrX25vczsKKwkJCQkvKiBSZWZ1c2VkIHRvIGJvb3N0OiBub3Qgc3VyZSB3aHksIHRob3VnaC4gKi8KKwkJCQkvKiAgVGhpcyBjYW4gaGFwcGVuIGR1ZSB0byByYWNlIGNvbmRpdGlvbnMuICovCisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QgKi8KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5vZGVfa3RocmVhZF90YXNrOworCQkJCS8qIGt0aHJlYWQgdGhhdCB0YWtlcyBjYXJlIG9mIHRoaXMgcmN1X25vZGUgKi8KKwkJCQkvKiAgc3RydWN0dXJlLCBmb3IgZXhhbXBsZSwgYXdha2VuaW5nIHRoZSAqLworCQkJCS8qICBwZXItQ1BVIGt0aHJlYWRzIGFzIG5lZWRlZC4gKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBub2RlX3dxOworCQkJCS8qIFdhaXQgcXVldWUgb24gd2hpY2ggdG8gcGFyayB0aGUgcGVyLW5vZGUgKi8KKwkJCQkvKiAga3RocmVhZC4gKi8KKwl1bnNpZ25lZCBpbnQgbm9kZV9rdGhyZWFkX3N0YXR1czsKKwkJCQkvKiBTdGF0ZSBvZiBub2RlX2t0aHJlYWRfdGFzayBmb3IgdHJhY2luZy4gKi8KIH0gX19fX2NhY2hlbGluZV9pbnRlcm5vZGVhbGlnbmVkX2luX3NtcDsKIAogLyoKQEAgLTE3NSw3ICsyNDEsNyBAQAogCWJvb2wJCXBhc3NlZF9xdWllc2M7CS8qIFVzZXItbW9kZS9pZGxlIGxvb3AgZXRjLiAqLwogCWJvb2wJCXFzX3BlbmRpbmc7CS8qIENvcmUgd2FpdHMgZm9yIHF1aWVzYyBzdGF0ZS4gKi8KIAlib29sCQliZWVub25saW5lOwkvKiBDUFUgb25saW5lIGF0IGxlYXN0IG9uY2UuICovCi0JYm9vbAkJcHJlZW1wdGFibGU7CS8qIFByZWVtcHRhYmxlIFJDVT8gKi8KKwlib29sCQlwcmVlbXB0aWJsZTsJLyogUHJlZW1wdGlibGUgUkNVPyAqLwogCXN0cnVjdCByY3Vfbm9kZSAqbXlub2RlOwkvKiBUaGlzIENQVSdzIGxlYWYgb2YgaGllcmFyY2h5ICovCiAJdW5zaWduZWQgbG9uZyBncnBtYXNrOwkJLyogTWFzayB0byBhcHBseSB0byBsZWFmIHFzbWFzay4gKi8KIApAQCAtMjU0LDcgKzMyMCw2IEBACiAjZW5kaWYgLyogI2Vsc2UgI2lmZGVmIENPTkZJR19OT19IWiAqLwogCiAjZGVmaW5lIFJDVV9KSUZGSUVTX1RJTExfRk9SQ0VfUVMJIDMJLyogZm9yIHJzcC0+amlmZmllc19mb3JjZV9xcyAqLwotI2lmZGVmIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SCiAKICNpZmRlZiBDT05GSUdfUFJPVkVfUkNVCiAjZGVmaW5lIFJDVV9TVEFMTF9ERUxBWV9ERUxUQQkgICAgICAgKDUgKiBIWikKQEAgLTI3MiwxMyArMzM3LDYgQEAKIAkJCQkJCS8qICBzY2hlZHVsaW5nIGNsb2NrIGlycSAqLwogCQkJCQkJLyogIGJlZm9yZSByYXR0aW5nIG9uIHRoZW0uICovCiAKLSNpZmRlZiBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUl9SVU5OQUJMRQotI2RlZmluZSBSQ1VfQ1BVX1NUQUxMX1NVUFBSRVNTX0lOSVQgMAotI2Vsc2UKLSNkZWZpbmUgUkNVX0NQVV9TVEFMTF9TVVBQUkVTU19JTklUIDEKLSNlbmRpZgotCi0jZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SICovCiAKIC8qCiAgKiBSQ1UgZ2xvYmFsIHN0YXRlLCBpbmNsdWRpbmcgbm9kZSBoaWVyYXJjaHkuICBUaGlzIGhpZXJhcmNoeSBpcwpAQCAtMzI1LDEyICszODMsMTIgQEAKIAkJCQkJCS8qICBkdWUgdG8gbG9jayB1bmF2YWlsYWJsZS4gKi8KIAl1bnNpZ25lZCBsb25nIG5fZm9yY2VfcXNfbmdwOwkJLyogTnVtYmVyIG9mIGNhbGxzIGxlYXZpbmcgKi8KIAkJCQkJCS8qICBkdWUgdG8gbm8gR1AgYWN0aXZlLiAqLwotI2lmZGVmIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SCiAJdW5zaWduZWQgbG9uZyBncF9zdGFydDsJCQkvKiBUaW1lIGF0IHdoaWNoIEdQIHN0YXJ0ZWQsICovCiAJCQkJCQkvKiAgYnV0IGluIGppZmZpZXMuICovCiAJdW5zaWduZWQgbG9uZyBqaWZmaWVzX3N0YWxsOwkJLyogVGltZSBhdCB3aGljaCB0byBjaGVjayAqLwogCQkJCQkJLyogIGZvciBDUFUgc3RhbGxzLiAqLwotI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiAqLworCXVuc2lnbmVkIGxvbmcgZ3BfbWF4OwkJCS8qIE1heGltdW0gR1AgZHVyYXRpb24gaW4gKi8KKwkJCQkJCS8qICBqaWZmaWVzLiAqLwogCWNoYXIgKm5hbWU7CQkJCS8qIE5hbWUgb2Ygc3RydWN0dXJlLiAqLwogfTsKIApAQCAtMzYxLDE2ICs0MTksMTQgQEAKIHN0YXRpYyB2b2lkIHJjdV9ib290dXBfYW5ub3VuY2Uodm9pZCk7CiBsb25nIHJjdV9iYXRjaGVzX2NvbXBsZXRlZCh2b2lkKTsKIHN0YXRpYyB2b2lkIHJjdV9wcmVlbXB0X25vdGVfY29udGV4dF9zd2l0Y2goaW50IGNwdSk7Ci1zdGF0aWMgaW50IHJjdV9wcmVlbXB0ZWRfcmVhZGVycyhzdHJ1Y3QgcmN1X25vZGUgKnJucCk7CitzdGF0aWMgaW50IHJjdV9wcmVlbXB0X2Jsb2NrZWRfcmVhZGVyc19jZ3Aoc3RydWN0IHJjdV9ub2RlICpybnApOwogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogc3RhdGljIHZvaWQgcmN1X3JlcG9ydF91bmJsb2NrX3FzX3JucChzdHJ1Y3QgcmN1X25vZGUgKnJucCwKIAkJCQkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKTsKICNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVICovCi0jaWZkZWYgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IKIHN0YXRpYyB2b2lkIHJjdV9wcmludF9kZXRhaWxfdGFza19zdGFsbChzdHJ1Y3QgcmN1X3N0YXRlICpyc3ApOwogc3RhdGljIHZvaWQgcmN1X3ByaW50X3Rhc2tfc3RhbGwoc3RydWN0IHJjdV9ub2RlICpybnApOwogc3RhdGljIHZvaWQgcmN1X3ByZWVtcHRfc3RhbGxfcmVzZXQodm9pZCk7Ci0jZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SICovCiBzdGF0aWMgdm9pZCByY3VfcHJlZW1wdF9jaGVja19ibG9ja2VkX3Rhc2tzKHN0cnVjdCByY3Vfbm9kZSAqcm5wKTsKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIHN0YXRpYyBpbnQgcmN1X3ByZWVtcHRfb2ZmbGluZV90YXNrcyhzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsCkBAIC0zOTAsNSArNDQ2LDEzIEBACiBzdGF0aWMgdm9pZCByY3VfcHJlZW1wdF9zZW5kX2Nic190b19vbmxpbmUodm9pZCk7CiBzdGF0aWMgdm9pZCBfX2luaXQgX19yY3VfaW5pdF9wcmVlbXB0KHZvaWQpOwogc3RhdGljIHZvaWQgcmN1X25lZWRzX2NwdV9mbHVzaCh2b2lkKTsKK3N0YXRpYyB2b2lkIF9faW5pdCByY3VfaW5pdF9ib29zdF93YWl0cXVldWUoc3RydWN0IHJjdV9ub2RlICpybnApOworc3RhdGljIHZvaWQgcmN1X2luaXRpYXRlX2Jvb3N0KHN0cnVjdCByY3Vfbm9kZSAqcm5wLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK3N0YXRpYyB2b2lkIHJjdV9ib29zdF9rdGhyZWFkX3NldGFmZmluaXR5KHN0cnVjdCByY3Vfbm9kZSAqcm5wLAorCQkJCQkgIGNwdW1hc2tfdmFyX3QgY20pOworc3RhdGljIHZvaWQgcmN1X3ByZWVtcHRfYm9vc3Rfc3RhcnRfZ3Aoc3RydWN0IHJjdV9ub2RlICpybnApOworc3RhdGljIGludCBfX2NwdWluaXQgcmN1X3NwYXduX29uZV9ib29zdF9rdGhyZWFkKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCwKKwkJCQkJCSBzdHJ1Y3QgcmN1X25vZGUgKnJucCwKKwkJCQkJCSBpbnQgcm5wX2luZGV4KTsKIAogI2VuZGlmIC8qICNpZm5kZWYgUkNVX1RSRUVfTk9OQ09SRSAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRyZWVfcGx1Z2luLmggYi9rZXJuZWwvcmN1dHJlZV9wbHVnaW4uaAppbmRleCBhMzYzODcxLi4zZjY1NTlhIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1dHJlZV9wbHVnaW4uaAorKysgYi9rZXJuZWwvcmN1dHJlZV9wbHVnaW4uaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBSZWFkLUNvcHkgVXBkYXRlIG1lY2hhbmlzbSBmb3IgbXV0dWFsIGV4Y2x1c2lvbiAodHJlZS1iYXNlZCB2ZXJzaW9uKQogICogSW50ZXJuYWwgbm9uLXB1YmxpYyBkZWZpbml0aW9ucyB0aGF0IHByb3ZpZGUgZWl0aGVyIGNsYXNzaWMKLSAqIG9yIHByZWVtcHRhYmxlIHNlbWFudGljcy4KKyAqIG9yIHByZWVtcHRpYmxlIHNlbWFudGljcy4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTU0LDEwICs1NCw2IEBACiAjaWZkZWYgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1RfUlVOTkFCTEUKIAlwcmludGsoS0VSTl9JTkZPICJcdFJDVSB0b3J0dXJlIHRlc3Rpbmcgc3RhcnRzIGR1cmluZyBib290LlxuIik7CiAjZW5kaWYKLSNpZm5kZWYgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IKLQlwcmludGsoS0VSTl9JTkZPCi0JICAgICAgICJcdFJDVS1iYXNlZCBkZXRlY3Rpb24gb2Ygc3RhbGxlZCBDUFVzIGlzIGRpc2FibGVkLlxuIik7Ci0jZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19UUkVFX1BSRUVNUFRfUkNVKSAmJiAhZGVmaW5lZChDT05GSUdfUkNVX0NQVV9TVEFMTF9WRVJCT1NFKQogCXByaW50ayhLRVJOX0lORk8gIlx0VmVyYm9zZSBzdGFsbGVkLUNQVXMgZGV0ZWN0aW9uIGlzIGRpc2FibGVkLlxuIik7CiAjZW5kaWYKQEAgLTcwLDYgKzY2LDcgQEAKIAogc3RydWN0IHJjdV9zdGF0ZSByY3VfcHJlZW1wdF9zdGF0ZSA9IFJDVV9TVEFURV9JTklUSUFMSVpFUihyY3VfcHJlZW1wdF9zdGF0ZSk7CiBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcmN1X2RhdGEsIHJjdV9wcmVlbXB0X2RhdGEpOworc3RhdGljIHN0cnVjdCByY3Vfc3RhdGUgKnJjdV9zdGF0ZSA9ICZyY3VfcHJlZW1wdF9zdGF0ZTsKIAogc3RhdGljIGludCByY3VfcHJlZW1wdGVkX3JlYWRlcnNfZXhwKHN0cnVjdCByY3Vfbm9kZSAqcm5wKTsKIApAQCAtNzgsNyArNzUsNyBAQAogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgcmN1X2Jvb3R1cF9hbm5vdW5jZSh2b2lkKQogewotCXByaW50ayhLRVJOX0lORk8gIlByZWVtcHRhYmxlIGhpZXJhcmNoaWNhbCBSQ1UgaW1wbGVtZW50YXRpb24uXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJQcmVlbXB0aWJsZSBoaWVyYXJjaGljYWwgUkNVIGltcGxlbWVudGF0aW9uLlxuIik7CiAJcmN1X2Jvb3R1cF9hbm5vdW5jZV9vZGRuZXNzKCk7CiB9CiAKQEAgLTExMSw3ICsxMDgsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwocmN1X2ZvcmNlX3F1aWVzY2VudF9zdGF0ZSk7CiAKIC8qCi0gKiBSZWNvcmQgYSBwcmVlbXB0YWJsZS1SQ1UgcXVpZXNjZW50IHN0YXRlIGZvciB0aGUgc3BlY2lmaWVkIENQVS4gIE5vdGUKKyAqIFJlY29yZCBhIHByZWVtcHRpYmxlLVJDVSBxdWllc2NlbnQgc3RhdGUgZm9yIHRoZSBzcGVjaWZpZWQgQ1BVLiAgTm90ZQogICogdGhhdCB0aGlzIGp1c3QgbWVhbnMgdGhhdCB0aGUgdGFzayBjdXJyZW50bHkgcnVubmluZyBvbiB0aGUgQ1BVIGlzCiAgKiBub3QgaW4gYSBxdWllc2NlbnQgc3RhdGUuICBUaGVyZSBtaWdodCBiZSBhbnkgbnVtYmVyIG9mIHRhc2tzIGJsb2NrZWQKICAqIHdoaWxlIGluIGFuIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbi4KQEAgLTEzNCwxMiArMTMxLDEyIEBACiAgKiBXZSBoYXZlIGVudGVyZWQgdGhlIHNjaGVkdWxlciwgYW5kIHRoZSBjdXJyZW50IHRhc2sgbWlnaHQgc29vbiBiZQogICogY29udGV4dC1zd2l0Y2hlZCBhd2F5IGZyb20uICBJZiB0aGlzIHRhc2sgaXMgaW4gYW4gUkNVIHJlYWQtc2lkZQogICogY3JpdGljYWwgc2VjdGlvbiwgd2Ugd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byByZWx5IG9uIHRoZSBDUFUgdG8KLSAqIHJlY29yZCB0aGF0IGZhY3QsIHNvIHdlIGVucXVldWUgdGhlIHRhc2sgb24gdGhlIGFwcHJvcHJpYXRlIGVudHJ5Ci0gKiBvZiB0aGUgYmxvY2tlZF90YXNrc1tdIGFycmF5LiAgVGhlIHRhc2sgd2lsbCBkZXF1ZXVlIGl0c2VsZiB3aGVuCi0gKiBpdCBleGl0cyB0aGUgb3V0ZXJtb3N0IGVuY2xvc2luZyBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24uCi0gKiBUaGVyZWZvcmUsIHRoZSBjdXJyZW50IGdyYWNlIHBlcmlvZCBjYW5ub3QgYmUgcGVybWl0dGVkIHRvIGNvbXBsZXRlCi0gKiB1bnRpbCB0aGUgYmxvY2tlZF90YXNrc1tdIGVudHJ5IGluZGV4ZWQgYnkgdGhlIGxvdy1vcmRlciBiaXQgb2YKLSAqIHJucC0+Z3BudW0gZW1wdGllcy4KKyAqIHJlY29yZCB0aGF0IGZhY3QsIHNvIHdlIGVucXVldWUgdGhlIHRhc2sgb24gdGhlIGJsa2RfdGFza3MgbGlzdC4KKyAqIFRoZSB0YXNrIHdpbGwgZGVxdWV1ZSBpdHNlbGYgd2hlbiBpdCBleGl0cyB0aGUgb3V0ZXJtb3N0IGVuY2xvc2luZworICogUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uLiAgVGhlcmVmb3JlLCB0aGUgY3VycmVudCBncmFjZSBwZXJpb2QKKyAqIGNhbm5vdCBiZSBwZXJtaXR0ZWQgdG8gY29tcGxldGUgdW50aWwgdGhlIGJsa2RfdGFza3MgbGlzdCBlbnRyaWVzCisgKiBwcmVkYXRpbmcgdGhlIGN1cnJlbnQgZ3JhY2UgcGVyaW9kIGRyYWluLCBpbiBvdGhlciB3b3JkcywgdW50aWwKKyAqIHJucC0+Z3BfdGFza3MgYmVjb21lcyBOVUxMLgogICoKICAqIENhbGxlciBtdXN0IGRpc2FibGUgcHJlZW1wdGlvbi4KICAqLwpAQCAtMTQ3LDcgKzE0NCw2IEBACiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0ID0gY3VycmVudDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBwaGFzZTsKIAlzdHJ1Y3QgcmN1X2RhdGEgKnJkcDsKIAlzdHJ1Y3QgcmN1X25vZGUgKnJucDsKIApAQCAtMTY5LDE1ICsxNjUsMzAgQEAKIAkJICogKGkuZS4sIHRoaXMgQ1BVIGhhcyBub3QgeWV0IHBhc3NlZCB0aHJvdWdoIGEgcXVpZXNjZW50CiAJCSAqIHN0YXRlIGZvciB0aGUgY3VycmVudCBncmFjZSBwZXJpb2QpLCB0aGVuIGFzIGxvbmcKIAkJICogYXMgdGhhdCB0YXNrIHJlbWFpbnMgcXVldWVkLCB0aGUgY3VycmVudCBncmFjZSBwZXJpb2QKLQkJICogY2Fubm90IGVuZC4KKwkJICogY2Fubm90IGVuZC4gIE5vdGUgdGhhdCB0aGVyZSBpcyBzb21lIHVuY2VydGFpbnR5IGFzCisJCSAqIHRvIGV4YWN0bHkgd2hlbiB0aGUgY3VycmVudCBncmFjZSBwZXJpb2Qgc3RhcnRlZC4KKwkJICogV2UgdGFrZSBhIGNvbnNlcnZhdGl2ZSBhcHByb2FjaCwgd2hpY2ggY2FuIHJlc3VsdAorCQkgKiBpbiB1bm5lY2Vzc2FyaWx5IHdhaXRpbmcgb24gdGFza3MgdGhhdCBzdGFydGVkIHZlcnkKKwkJICogc2xpZ2h0bHkgYWZ0ZXIgdGhlIGN1cnJlbnQgZ3JhY2UgcGVyaW9kIGJlZ2FuLiAgQydlc3QKKwkJICogbGEgdmllISEhCiAJCSAqCiAJCSAqIEJ1dCBmaXJzdCwgbm90ZSB0aGF0IHRoZSBjdXJyZW50IENQVSBtdXN0IHN0aWxsIGJlCiAJCSAqIG9uIGxpbmUhCiAJCSAqLwogCQlXQVJOX09OX09OQ0UoKHJkcC0+Z3JwbWFzayAmIHJucC0+cXNtYXNraW5pdCkgPT0gMCk7CiAJCVdBUk5fT05fT05DRSghbGlzdF9lbXB0eSgmdC0+cmN1X25vZGVfZW50cnkpKTsKLQkJcGhhc2UgPSAocm5wLT5ncG51bSArICEocm5wLT5xc21hc2sgJiByZHAtPmdycG1hc2spKSAmIDB4MTsKLQkJbGlzdF9hZGQoJnQtPnJjdV9ub2RlX2VudHJ5LCAmcm5wLT5ibG9ja2VkX3Rhc2tzW3BoYXNlXSk7CisJCWlmICgocm5wLT5xc21hc2sgJiByZHAtPmdycG1hc2spICYmIHJucC0+Z3BfdGFza3MgIT0gTlVMTCkgeworCQkJbGlzdF9hZGQoJnQtPnJjdV9ub2RlX2VudHJ5LCBybnAtPmdwX3Rhc2tzLT5wcmV2KTsKKwkJCXJucC0+Z3BfdGFza3MgPSAmdC0+cmN1X25vZGVfZW50cnk7CisjaWZkZWYgQ09ORklHX1JDVV9CT09TVAorCQkJaWYgKHJucC0+Ym9vc3RfdGFza3MgIT0gTlVMTCkKKwkJCQlybnAtPmJvb3N0X3Rhc2tzID0gcm5wLT5ncF90YXNrczsKKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1JDVV9CT09TVCAqLworCQl9IGVsc2UgeworCQkJbGlzdF9hZGQoJnQtPnJjdV9ub2RlX2VudHJ5LCAmcm5wLT5ibGtkX3Rhc2tzKTsKKwkJCWlmIChybnAtPnFzbWFzayAmIHJkcC0+Z3JwbWFzaykKKwkJCQlybnAtPmdwX3Rhc2tzID0gJnQtPnJjdV9ub2RlX2VudHJ5OworCQl9CiAJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKIAl9CiAKQEAgLTE5Niw3ICsyMDcsNyBAQAogfQogCiAvKgotICogVHJlZS1wcmVlbXB0YWJsZSBSQ1UgaW1wbGVtZW50YXRpb24gZm9yIHJjdV9yZWFkX2xvY2soKS4KKyAqIFRyZWUtcHJlZW1wdGlibGUgUkNVIGltcGxlbWVudGF0aW9uIGZvciByY3VfcmVhZF9sb2NrKCkuCiAgKiBKdXN0IGluY3JlbWVudCAtPnJjdV9yZWFkX2xvY2tfbmVzdGluZywgc2hhcmVkIHN0YXRlIHdpbGwgYmUgdXBkYXRlZAogICogaWYgd2UgYmxvY2suCiAgKi8KQEAgLTIxMiwxMiArMjIzLDkgQEAKICAqIGZvciB0aGUgc3BlY2lmaWVkIHJjdV9ub2RlIHN0cnVjdHVyZS4gIElmIHRoZSBjYWxsZXIgbmVlZHMgYSByZWxpYWJsZQogICogYW5zd2VyLCBpdCBtdXN0IGhvbGQgdGhlIHJjdV9ub2RlJ3MgLT5sb2NrLgogICovCi1zdGF0aWMgaW50IHJjdV9wcmVlbXB0ZWRfcmVhZGVycyhzdHJ1Y3QgcmN1X25vZGUgKnJucCkKK3N0YXRpYyBpbnQgcmN1X3ByZWVtcHRfYmxvY2tlZF9yZWFkZXJzX2NncChzdHJ1Y3QgcmN1X25vZGUgKnJucCkKIHsKLQlpbnQgcGhhc2UgPSBybnAtPmdwbnVtICYgMHgxOwotCi0JcmV0dXJuICFsaXN0X2VtcHR5KCZybnAtPmJsb2NrZWRfdGFza3NbcGhhc2VdKSB8fAotCSAgICAgICAhbGlzdF9lbXB0eSgmcm5wLT5ibG9ja2VkX3Rhc2tzW3BoYXNlICsgMl0pOworCXJldHVybiBybnAtPmdwX3Rhc2tzICE9IE5VTEw7CiB9CiAKIC8qCkBAIC0yMzMsNyArMjQxLDcgQEAKIAl1bnNpZ25lZCBsb25nIG1hc2s7CiAJc3RydWN0IHJjdV9ub2RlICpybnBfcDsKIAotCWlmIChybnAtPnFzbWFzayAhPSAwIHx8IHJjdV9wcmVlbXB0ZWRfcmVhZGVycyhybnApKSB7CisJaWYgKHJucC0+cXNtYXNrICE9IDAgfHwgcmN1X3ByZWVtcHRfYmxvY2tlZF9yZWFkZXJzX2NncChybnApKSB7CiAJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOyAgLyogU3RpbGwgbmVlZCBtb3JlIHF1aWVzY2VudCBzdGF0ZXMhICovCiAJfQpAQCAtMjU3LDYgKzI2NSwyMSBAQAogfQogCiAvKgorICogQWR2YW5jZSBhIC0+YmxrZF90YXNrcy1saXN0IHBvaW50ZXIgdG8gdGhlIG5leHQgZW50cnksIGluc3RlYWQKKyAqIHJldHVybmluZyBOVUxMIGlmIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICpyY3VfbmV4dF9ub2RlX2VudHJ5KHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwKKwkJCQkJICAgICBzdHJ1Y3QgcmN1X25vZGUgKnJucCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpucDsKKworCW5wID0gdC0+cmN1X25vZGVfZW50cnkubmV4dDsKKwlpZiAobnAgPT0gJnJucC0+YmxrZF90YXNrcykKKwkJbnAgPSBOVUxMOworCXJldHVybiBucDsKK30KKworLyoKICAqIEhhbmRsZSBzcGVjaWFsIGNhc2VzIGR1cmluZyByY3VfcmVhZF91bmxvY2soKSwgc3VjaCBhcyBuZWVkaW5nIHRvCiAgKiBub3RpZnkgUkNVIGNvcmUgcHJvY2Vzc2luZyBvciB0YXNrIGhhdmluZyBibG9ja2VkIGR1cmluZyB0aGUgUkNVCiAgKiByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbi4KQEAgLTI2Niw2ICsyODksNyBAQAogCWludCBlbXB0eTsKIAlpbnQgZW1wdHlfZXhwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqbnA7CiAJc3RydWN0IHJjdV9ub2RlICpybnA7CiAJaW50IHNwZWNpYWw7CiAKQEAgLTMwNiwxMCArMzMwLDE5IEBACiAJCQkJYnJlYWs7CiAJCQlyYXdfc3Bpbl91bmxvY2soJnJucC0+bG9jayk7IC8qIGlycXMgcmVtYWluIGRpc2FibGVkLiAqLwogCQl9Ci0JCWVtcHR5ID0gIXJjdV9wcmVlbXB0ZWRfcmVhZGVycyhybnApOworCQllbXB0eSA9ICFyY3VfcHJlZW1wdF9ibG9ja2VkX3JlYWRlcnNfY2dwKHJucCk7CiAJCWVtcHR5X2V4cCA9ICFyY3VfcHJlZW1wdGVkX3JlYWRlcnNfZXhwKHJucCk7CiAJCXNtcF9tYigpOyAvKiBlbnN1cmUgZXhwZWRpdGVkIGZhc3RwYXRoIHNlZXMgZW5kIG9mIFJDVSBjLXMuICovCisJCW5wID0gcmN1X25leHRfbm9kZV9lbnRyeSh0LCBybnApOwogCQlsaXN0X2RlbF9pbml0KCZ0LT5yY3Vfbm9kZV9lbnRyeSk7CisJCWlmICgmdC0+cmN1X25vZGVfZW50cnkgPT0gcm5wLT5ncF90YXNrcykKKwkJCXJucC0+Z3BfdGFza3MgPSBucDsKKwkJaWYgKCZ0LT5yY3Vfbm9kZV9lbnRyeSA9PSBybnAtPmV4cF90YXNrcykKKwkJCXJucC0+ZXhwX3Rhc2tzID0gbnA7CisjaWZkZWYgQ09ORklHX1JDVV9CT09TVAorCQlpZiAoJnQtPnJjdV9ub2RlX2VudHJ5ID09IHJucC0+Ym9vc3RfdGFza3MpCisJCQlybnAtPmJvb3N0X3Rhc2tzID0gbnA7CisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QgKi8KIAkJdC0+cmN1X2Jsb2NrZWRfbm9kZSA9IE5VTEw7CiAKIAkJLyoKQEAgLTMyMiw2ICszNTUsMTUgQEAKIAkJZWxzZQogCQkJcmN1X3JlcG9ydF91bmJsb2NrX3FzX3JucChybnAsIGZsYWdzKTsKIAorI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QKKwkJLyogVW5ib29zdCBpZiB3ZSB3ZXJlIGJvb3N0ZWQuICovCisJCWlmIChzcGVjaWFsICYgUkNVX1JFQURfVU5MT0NLX0JPT1NURUQpIHsKKwkJCXQtPnJjdV9yZWFkX3VubG9ja19zcGVjaWFsICY9IH5SQ1VfUkVBRF9VTkxPQ0tfQk9PU1RFRDsKKwkJCXJ0X211dGV4X3VubG9jayh0LT5yY3VfYm9vc3RfbXV0ZXgpOworCQkJdC0+cmN1X2Jvb3N0X211dGV4ID0gTlVMTDsKKwkJfQorI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUkNVX0JPT1NUICovCisKIAkJLyoKIAkJICogSWYgdGhpcyB3YXMgdGhlIGxhc3QgdGFzayBvbiB0aGUgZXhwZWRpdGVkIGxpc3RzLAogCQkgKiB0aGVuIHdlIG5lZWQgdG8gcmVwb3J0IHVwIHRoZSByY3Vfbm9kZSBoaWVyYXJjaHkuCkBAIC0zMzQsNyArMzc2LDcgQEAKIH0KIAogLyoKLSAqIFRyZWUtcHJlZW1wdGFibGUgUkNVIGltcGxlbWVudGF0aW9uIGZvciByY3VfcmVhZF91bmxvY2soKS4KKyAqIFRyZWUtcHJlZW1wdGlibGUgUkNVIGltcGxlbWVudGF0aW9uIGZvciByY3VfcmVhZF91bmxvY2soKS4KICAqIERlY3JlbWVudCAtPnJjdV9yZWFkX2xvY2tfbmVzdGluZy4gIElmIHRoZSByZXN1bHQgaXMgemVybyAob3V0ZXJtb3N0CiAgKiByY3VfcmVhZF91bmxvY2soKSkgYW5kIC0+cmN1X3JlYWRfdW5sb2NrX3NwZWNpYWwgaXMgbm9uLXplcm8sIHRoZW4KICAqIGludm9rZSByY3VfcmVhZF91bmxvY2tfc3BlY2lhbCgpIHRvIGNsZWFuIHVwIGFmdGVyIGEgY29udGV4dCBzd2l0Y2gKQEAgLTM1Niw4ICszOTgsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoX19yY3VfcmVhZF91bmxvY2spOwogCi0jaWZkZWYgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IKLQogI2lmZGVmIENPTkZJR19SQ1VfQ1BVX1NUQUxMX1ZFUkJPU0UKIAogLyoKQEAgLTM2NywxOCArNDA3LDE2IEBACiBzdGF0aWMgdm9pZCByY3VfcHJpbnRfZGV0YWlsX3Rhc2tfc3RhbGxfcm5wKHN0cnVjdCByY3Vfbm9kZSAqcm5wKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbHA7Ci0JaW50IHBoYXNlOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKIAotCWlmIChyY3VfcHJlZW1wdGVkX3JlYWRlcnMocm5wKSkgewotCQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnJucC0+bG9jaywgZmxhZ3MpOwotCQlwaGFzZSA9IHJucC0+Z3BudW0gJiAweDE7Ci0JCWxwID0gJnJucC0+YmxvY2tlZF90YXNrc1twaGFzZV07Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgbHAsIHJjdV9ub2RlX2VudHJ5KQotCQkJc2NoZWRfc2hvd190YXNrKHQpOwotCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7Ci0JfQorCWlmICghcmN1X3ByZWVtcHRfYmxvY2tlZF9yZWFkZXJzX2NncChybnApKQorCQlyZXR1cm47CisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZybnAtPmxvY2ssIGZsYWdzKTsKKwl0ID0gbGlzdF9lbnRyeShybnAtPmdwX3Rhc2tzLAorCQkgICAgICAgc3RydWN0IHRhc2tfc3RydWN0LCByY3Vfbm9kZV9lbnRyeSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZSh0LCAmcm5wLT5ibGtkX3Rhc2tzLCByY3Vfbm9kZV9lbnRyeSkKKwkJc2NoZWRfc2hvd190YXNrKHQpOworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKIH0KIAogLyoKQEAgLTQwOCwxNiArNDQ2LDE0IEBACiAgKi8KIHN0YXRpYyB2b2lkIHJjdV9wcmludF90YXNrX3N0YWxsKHN0cnVjdCByY3Vfbm9kZSAqcm5wKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxwOwotCWludCBwaGFzZTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQ7CiAKLQlpZiAocmN1X3ByZWVtcHRlZF9yZWFkZXJzKHJucCkpIHsKLQkJcGhhc2UgPSBybnAtPmdwbnVtICYgMHgxOwotCQlscCA9ICZybnAtPmJsb2NrZWRfdGFza3NbcGhhc2VdOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsIGxwLCByY3Vfbm9kZV9lbnRyeSkKLQkJCXByaW50aygiIFAlZCIsIHQtPnBpZCk7Ci0JfQorCWlmICghcmN1X3ByZWVtcHRfYmxvY2tlZF9yZWFkZXJzX2NncChybnApKQorCQlyZXR1cm47CisJdCA9IGxpc3RfZW50cnkocm5wLT5ncF90YXNrcywKKwkJICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCwgcmN1X25vZGVfZW50cnkpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUodCwgJnJucC0+YmxrZF90YXNrcywgcmN1X25vZGVfZW50cnkpCisJCXByaW50aygiIFAlZCIsIHQtPnBpZCk7CiB9CiAKIC8qCkBAIC00MzAsMTggKzQ2NiwyMSBAQAogCXJjdV9wcmVlbXB0X3N0YXRlLmppZmZpZXNfc3RhbGwgPSBqaWZmaWVzICsgVUxPTkdfTUFYIC8gMjsKIH0KIAotI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiAqLwotCiAvKgogICogQ2hlY2sgdGhhdCB0aGUgbGlzdCBvZiBibG9ja2VkIHRhc2tzIGZvciB0aGUgbmV3bHkgY29tcGxldGVkIGdyYWNlCiAgKiBwZXJpb2QgaXMgaW4gZmFjdCBlbXB0eS4gIEl0IGlzIGEgc2VyaW91cyBidWcgdG8gY29tcGxldGUgYSBncmFjZQogICogcGVyaW9kIHRoYXQgc3RpbGwgaGFzIFJDVSByZWFkZXJzIGJsb2NrZWQhICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUKICAqIGludm9rZWQgLWJlZm9yZS0gdXBkYXRpbmcgdGhpcyBybnAncyAtPmdwbnVtLCBhbmQgdGhlIHJucCdzIC0+bG9jawogICogbXVzdCBiZSBoZWxkIGJ5IHRoZSBjYWxsZXIuCisgKgorICogQWxzbywgaWYgdGhlcmUgYXJlIGJsb2NrZWQgdGFza3Mgb24gdGhlIGxpc3QsIHRoZXkgYXV0b21hdGljYWxseQorICogYmxvY2sgdGhlIG5ld2x5IGNyZWF0ZWQgZ3JhY2UgcGVyaW9kLCBzbyBzZXQgdXAgLT5ncF90YXNrcyBhY2NvcmRpbmdseS4KICAqLwogc3RhdGljIHZvaWQgcmN1X3ByZWVtcHRfY2hlY2tfYmxvY2tlZF90YXNrcyhzdHJ1Y3QgcmN1X25vZGUgKnJucCkKIHsKLQlXQVJOX09OX09OQ0UocmN1X3ByZWVtcHRlZF9yZWFkZXJzKHJucCkpOworCVdBUk5fT05fT05DRShyY3VfcHJlZW1wdF9ibG9ja2VkX3JlYWRlcnNfY2dwKHJucCkpOworCWlmICghbGlzdF9lbXB0eSgmcm5wLT5ibGtkX3Rhc2tzKSkKKwkJcm5wLT5ncF90YXNrcyA9IHJucC0+YmxrZF90YXNrcy5uZXh0OwogCVdBUk5fT05fT05DRShybnAtPnFzbWFzayk7CiB9CiAKQEAgLTQ2NSw1MCArNTA0LDY4IEBACiAJCQkJICAgICBzdHJ1Y3QgcmN1X25vZGUgKnJucCwKIAkJCQkgICAgIHN0cnVjdCByY3VfZGF0YSAqcmRwKQogewotCWludCBpOwogCXN0cnVjdCBsaXN0X2hlYWQgKmxwOwogCXN0cnVjdCBsaXN0X2hlYWQgKmxwX3Jvb3Q7CiAJaW50IHJldHZhbCA9IDA7CiAJc3RydWN0IHJjdV9ub2RlICpybnBfcm9vdCA9IHJjdV9nZXRfcm9vdChyc3ApOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHA7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0OwogCiAJaWYgKHJucCA9PSBybnBfcm9vdCkgewogCQlXQVJOX09OQ0UoMSwgIkxhc3QgQ1BVIHRob3VnaHQgdG8gYmUgb2ZmbGluZWQ/Iik7CiAJCXJldHVybiAwOyAgLyogU2hvdWxkbid0IGhhcHBlbjogYXQgbGVhc3Qgb25lIENQVSBvbmxpbmUuICovCiAJfQotCVdBUk5fT05fT05DRShybnAgIT0gcmRwLT5teW5vZGUgJiYKLQkJICAgICAoIWxpc3RfZW1wdHkoJnJucC0+YmxvY2tlZF90YXNrc1swXSkgfHwKLQkJICAgICAgIWxpc3RfZW1wdHkoJnJucC0+YmxvY2tlZF90YXNrc1sxXSkgfHwKLQkJICAgICAgIWxpc3RfZW1wdHkoJnJucC0+YmxvY2tlZF90YXNrc1syXSkgfHwKLQkJICAgICAgIWxpc3RfZW1wdHkoJnJucC0+YmxvY2tlZF90YXNrc1szXSkpKTsKKworCS8qIElmIHdlIGFyZSBvbiBhbiBpbnRlcm5hbCBub2RlLCBjb21wbGFpbiBiaXR0ZXJseS4gKi8KKwlXQVJOX09OX09OQ0Uocm5wICE9IHJkcC0+bXlub2RlKTsKIAogCS8qCi0JICogTW92ZSB0YXNrcyB1cCB0byByb290IHJjdV9ub2RlLiAgUmVseSBvbiB0aGUgZmFjdCB0aGF0IHRoZQotCSAqIHJvb3QgcmN1X25vZGUgY2FuIGJlIGF0IG1vc3Qgb25lIGFoZWFkIG9mIHRoZSByZXN0IG9mIHRoZQotCSAqIHJjdV9ub2RlcyBpbiB0ZXJtcyBvZiBncF9udW0gdmFsdWUuICBUaGlzIGZhY3QgYWxsb3dzIHVzIHRvCi0JICogbW92ZSB0aGUgYmxvY2tlZF90YXNrc1tdIGFycmF5IGRpcmVjdGx5LCBlbGVtZW50IGJ5IGVsZW1lbnQuCisJICogTW92ZSB0YXNrcyB1cCB0byByb290IHJjdV9ub2RlLiAgRG9uJ3QgdHJ5IHRvIGdldCBmYW5jeSBmb3IKKwkgKiB0aGlzIGNvcm5lci1jYXNlIG9wZXJhdGlvbiAtLSBqdXN0IHB1dCB0aGlzIG5vZGUncyB0YXNrcworCSAqIGF0IHRoZSBoZWFkIG9mIHRoZSByb290IG5vZGUncyBsaXN0LCBhbmQgdXBkYXRlIHRoZSByb290IG5vZGUncworCSAqIC0+Z3BfdGFza3MgYW5kIC0+ZXhwX3Rhc2tzIHBvaW50ZXJzIHRvIHRob3NlIG9mIHRoaXMgbm9kZSdzLAorCSAqIGlmIG5vbi1OVUxMLiAgVGhpcyBtaWdodCByZXN1bHQgaW4gd2FpdGluZyBmb3IgbW9yZSB0YXNrcyB0aGFuCisJICogYWJzb2x1dGVseSBuZWNlc3NhcnksIGJ1dCB0aGlzIGlzIGEgZ29vZCBwZXJmb3JtYW5jZS9jb21wbGV4aXR5CisJICogdHJhZGVvZmYuCiAJICovCi0JaWYgKHJjdV9wcmVlbXB0ZWRfcmVhZGVycyhybnApKQorCWlmIChyY3VfcHJlZW1wdF9ibG9ja2VkX3JlYWRlcnNfY2dwKHJucCkpCiAJCXJldHZhbCB8PSBSQ1VfT0ZMX1RBU0tTX05PUk1fR1A7CiAJaWYgKHJjdV9wcmVlbXB0ZWRfcmVhZGVyc19leHAocm5wKSkKIAkJcmV0dmFsIHw9IFJDVV9PRkxfVEFTS1NfRVhQX0dQOwotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJbHAgPSAmcm5wLT5ibG9ja2VkX3Rhc2tzW2ldOwotCQlscF9yb290ID0gJnJucF9yb290LT5ibG9ja2VkX3Rhc2tzW2ldOwotCQl3aGlsZSAoIWxpc3RfZW1wdHkobHApKSB7Ci0JCQl0cCA9IGxpc3RfZW50cnkobHAtPm5leHQsIHR5cGVvZigqdHApLCByY3Vfbm9kZV9lbnRyeSk7Ci0JCQlyYXdfc3Bpbl9sb2NrKCZybnBfcm9vdC0+bG9jayk7IC8qIGlycXMgYWxyZWFkeSBkaXNhYmxlZCAqLwotCQkJbGlzdF9kZWwoJnRwLT5yY3Vfbm9kZV9lbnRyeSk7Ci0JCQl0cC0+cmN1X2Jsb2NrZWRfbm9kZSA9IHJucF9yb290OwotCQkJbGlzdF9hZGQoJnRwLT5yY3Vfbm9kZV9lbnRyeSwgbHBfcm9vdCk7Ci0JCQlyYXdfc3Bpbl91bmxvY2soJnJucF9yb290LT5sb2NrKTsgLyogaXJxcyByZW1haW4gZGlzYWJsZWQgKi8KLQkJfQorCWxwID0gJnJucC0+YmxrZF90YXNrczsKKwlscF9yb290ID0gJnJucF9yb290LT5ibGtkX3Rhc2tzOworCXdoaWxlICghbGlzdF9lbXB0eShscCkpIHsKKwkJdCA9IGxpc3RfZW50cnkobHAtPm5leHQsIHR5cGVvZigqdCksIHJjdV9ub2RlX2VudHJ5KTsKKwkJcmF3X3NwaW5fbG9jaygmcm5wX3Jvb3QtPmxvY2spOyAvKiBpcnFzIGFscmVhZHkgZGlzYWJsZWQgKi8KKwkJbGlzdF9kZWwoJnQtPnJjdV9ub2RlX2VudHJ5KTsKKwkJdC0+cmN1X2Jsb2NrZWRfbm9kZSA9IHJucF9yb290OworCQlsaXN0X2FkZCgmdC0+cmN1X25vZGVfZW50cnksIGxwX3Jvb3QpOworCQlpZiAoJnQtPnJjdV9ub2RlX2VudHJ5ID09IHJucC0+Z3BfdGFza3MpCisJCQlybnBfcm9vdC0+Z3BfdGFza3MgPSBybnAtPmdwX3Rhc2tzOworCQlpZiAoJnQtPnJjdV9ub2RlX2VudHJ5ID09IHJucC0+ZXhwX3Rhc2tzKQorCQkJcm5wX3Jvb3QtPmV4cF90YXNrcyA9IHJucC0+ZXhwX3Rhc2tzOworI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QKKwkJaWYgKCZ0LT5yY3Vfbm9kZV9lbnRyeSA9PSBybnAtPmJvb3N0X3Rhc2tzKQorCQkJcm5wX3Jvb3QtPmJvb3N0X3Rhc2tzID0gcm5wLT5ib29zdF90YXNrczsKKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1JDVV9CT09TVCAqLworCQlyYXdfc3Bpbl91bmxvY2soJnJucF9yb290LT5sb2NrKTsgLyogaXJxcyBzdGlsbCBkaXNhYmxlZCAqLwogCX0KKworI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QKKwkvKiBJbiBjYXNlIHJvb3QgaXMgYmVpbmcgYm9vc3RlZCBhbmQgbGVhZiBpcyBub3QuICovCisJcmF3X3NwaW5fbG9jaygmcm5wX3Jvb3QtPmxvY2spOyAvKiBpcnFzIGFscmVhZHkgZGlzYWJsZWQgKi8KKwlpZiAocm5wX3Jvb3QtPmJvb3N0X3Rhc2tzICE9IE5VTEwgJiYKKwkgICAgcm5wX3Jvb3QtPmJvb3N0X3Rhc2tzICE9IHJucF9yb290LT5ncF90YXNrcykKKwkJcm5wX3Jvb3QtPmJvb3N0X3Rhc2tzID0gcm5wX3Jvb3QtPmdwX3Rhc2tzOworCXJhd19zcGluX3VubG9jaygmcm5wX3Jvb3QtPmxvY2spOyAvKiBpcnFzIHN0aWxsIGRpc2FibGVkICovCisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QgKi8KKworCXJucC0+Z3BfdGFza3MgPSBOVUxMOworCXJucC0+ZXhwX3Rhc2tzID0gTlVMTDsKIAlyZXR1cm4gcmV0dmFsOwogfQogCiAvKgotICogRG8gQ1BVLW9mZmxpbmUgcHJvY2Vzc2luZyBmb3IgcHJlZW1wdGFibGUgUkNVLgorICogRG8gQ1BVLW9mZmxpbmUgcHJvY2Vzc2luZyBmb3IgcHJlZW1wdGlibGUgUkNVLgogICovCiBzdGF0aWMgdm9pZCByY3VfcHJlZW1wdF9vZmZsaW5lX2NwdShpbnQgY3B1KQogewpAQCAtNTM3LDcgKzU5NCw3IEBACiB9CiAKIC8qCi0gKiBQcm9jZXNzIGNhbGxiYWNrcyBmb3IgcHJlZW1wdGFibGUgUkNVLgorICogUHJvY2VzcyBjYWxsYmFja3MgZm9yIHByZWVtcHRpYmxlIFJDVS4KICAqLwogc3RhdGljIHZvaWQgcmN1X3ByZWVtcHRfcHJvY2Vzc19jYWxsYmFja3Modm9pZCkKIHsKQEAgLTU0Niw3ICs2MDMsNyBAQAogfQogCiAvKgotICogUXVldWUgYSBwcmVlbXB0YWJsZS1SQ1UgY2FsbGJhY2sgZm9yIGludm9jYXRpb24gYWZ0ZXIgYSBncmFjZSBwZXJpb2QuCisgKiBRdWV1ZSBhIHByZWVtcHRpYmxlLVJDVSBjYWxsYmFjayBmb3IgaW52b2NhdGlvbiBhZnRlciBhIGdyYWNlIHBlcmlvZC4KICAqLwogdm9pZCBjYWxsX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQsIHZvaWQgKCpmdW5jKShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkpCiB7CkBAIC01OTQsOCArNjUxLDcgQEAKICAqLwogc3RhdGljIGludCByY3VfcHJlZW1wdGVkX3JlYWRlcnNfZXhwKHN0cnVjdCByY3Vfbm9kZSAqcm5wKQogewotCXJldHVybiAhbGlzdF9lbXB0eSgmcm5wLT5ibG9ja2VkX3Rhc2tzWzJdKSB8fAotCSAgICAgICAhbGlzdF9lbXB0eSgmcm5wLT5ibG9ja2VkX3Rhc2tzWzNdKTsKKwlyZXR1cm4gcm5wLT5leHBfdGFza3MgIT0gTlVMTDsKIH0KIAogLyoKQEAgLTY1NSwxMyArNzExLDE3IEBACiBzdGF0aWMgdm9pZAogc3luY19yY3VfcHJlZW1wdF9leHBfaW5pdChzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsIHN0cnVjdCByY3Vfbm9kZSAqcm5wKQogewotCWludCBtdXN0X3dhaXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbXVzdF93YWl0ID0gMDsKIAotCXJhd19zcGluX2xvY2soJnJucC0+bG9jayk7IC8qIGlycXMgYWxyZWFkeSBkaXNhYmxlZCAqLwotCWxpc3Rfc3BsaWNlX2luaXQoJnJucC0+YmxvY2tlZF90YXNrc1swXSwgJnJucC0+YmxvY2tlZF90YXNrc1syXSk7Ci0JbGlzdF9zcGxpY2VfaW5pdCgmcm5wLT5ibG9ja2VkX3Rhc2tzWzFdLCAmcm5wLT5ibG9ja2VkX3Rhc2tzWzNdKTsKLQltdXN0X3dhaXQgPSByY3VfcHJlZW1wdGVkX3JlYWRlcnNfZXhwKHJucCk7Ci0JcmF3X3NwaW5fdW5sb2NrKCZybnAtPmxvY2spOyAvKiBpcnFzIHJlbWFpbiBkaXNhYmxlZCAqLworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcm5wLT5sb2NrLCBmbGFncyk7CisJaWYgKGxpc3RfZW1wdHkoJnJucC0+YmxrZF90YXNrcykpCisJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKKwllbHNlIHsKKwkJcm5wLT5leHBfdGFza3MgPSBybnAtPmJsa2RfdGFza3MubmV4dDsKKwkJcmN1X2luaXRpYXRlX2Jvb3N0KHJucCwgZmxhZ3MpOyAgLyogcmVsZWFzZXMgcm5wLT5sb2NrICovCisJCW11c3Rfd2FpdCA9IDE7CisJfQogCWlmICghbXVzdF93YWl0KQogCQlyY3VfcmVwb3J0X2V4cF9ybnAocnNwLCBybnApOwogfQpAQCAtNjY5LDkgKzcyOSw3IEBACiAvKgogICogV2FpdCBmb3IgYW4gcmN1LXByZWVtcHQgZ3JhY2UgcGVyaW9kLCBidXQgZXhwZWRpdGUgaXQuICBUaGUgYmFzaWMgaWRlYQogICogaXMgdG8gaW52b2tlIHN5bmNocm9uaXplX3NjaGVkX2V4cGVkaXRlZCgpIHRvIHB1c2ggYWxsIHRoZSB0YXNrcyB0bwotICogdGhlIC0+YmxvY2tlZF90YXNrc1tdIGxpc3RzLCBtb3ZlIGFsbCBlbnRyaWVzIGZyb20gdGhlIGZpcnN0IHNldCBvZgotICogLT5ibG9ja2VkX3Rhc2tzW10gbGlzdHMgdG8gdGhlIHNlY29uZCBzZXQsIGFuZCBmaW5hbGx5IHdhaXQgZm9yIHRoaXMKLSAqIHNlY29uZCBzZXQgdG8gZHJhaW4uCisgKiB0aGUgLT5ibGtkX3Rhc2tzIGxpc3RzIGFuZCB3YWl0IGZvciB0aGlzIGxpc3QgdG8gZHJhaW4uCiAgKi8KIHZvaWQgc3luY2hyb25pemVfcmN1X2V4cGVkaXRlZCh2b2lkKQogewpAQCAtNzAzLDcgKzc2MSw3IEBACiAJaWYgKChBQ0NFU1NfT05DRShzeW5jX3JjdV9wcmVlbXB0X2V4cF9jb3VudCkgLSBzbmFwKSA+IDApCiAJCWdvdG8gdW5sb2NrX21iX3JldDsgLyogT3RoZXJzIGRpZCBvdXIgd29yayBmb3IgdXMuICovCiAKLQkvKiBmb3JjZSBhbGwgUkNVIHJlYWRlcnMgb250byBibG9ja2VkX3Rhc2tzW10uICovCisJLyogZm9yY2UgYWxsIFJDVSByZWFkZXJzIG9udG8gLT5ibGtkX3Rhc2tzIGxpc3RzLiAqLwogCXN5bmNocm9uaXplX3NjaGVkX2V4cGVkaXRlZCgpOwogCiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZyc3AtPm9ub2ZmbG9jaywgZmxhZ3MpOwpAQCAtNzE1LDcgKzc3Myw3IEBACiAJCXJhd19zcGluX3VubG9jaygmcm5wLT5sb2NrKTsgLyogaXJxcyByZW1haW4gZGlzYWJsZWQuICovCiAJfQogCi0JLyogU25hcHNob3QgY3VycmVudCBzdGF0ZSBvZiAtPmJsb2NrZWRfdGFza3NbXSBsaXN0cy4gKi8KKwkvKiBTbmFwc2hvdCBjdXJyZW50IHN0YXRlIG9mIC0+YmxrZF90YXNrcyBsaXN0cy4gKi8KIAlyY3VfZm9yX2VhY2hfbGVhZl9ub2RlKHJzcCwgcm5wKQogCQlzeW5jX3JjdV9wcmVlbXB0X2V4cF9pbml0KHJzcCwgcm5wKTsKIAlpZiAoTlVNX1JDVV9OT0RFUyA+IDEpCkBAIC03MjMsNyArNzgxLDcgQEAKIAogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZyc3AtPm9ub2ZmbG9jaywgZmxhZ3MpOwogCi0JLyogV2FpdCBmb3Igc25hcHNob3R0ZWQgLT5ibG9ja2VkX3Rhc2tzW10gbGlzdHMgdG8gZHJhaW4uICovCisJLyogV2FpdCBmb3Igc25hcHNob3R0ZWQgLT5ibGtkX3Rhc2tzIGxpc3RzIHRvIGRyYWluLiAqLwogCXJucCA9IHJjdV9nZXRfcm9vdChyc3ApOwogCXdhaXRfZXZlbnQoc3luY19yY3VfcHJlZW1wdF9leHBfd3EsCiAJCSAgIHN5bmNfcmN1X3ByZWVtcHRfZXhwX2RvbmUocm5wKSk7CkBAIC03MzksNyArNzk3LDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHN5bmNocm9uaXplX3JjdV9leHBlZGl0ZWQpOwogCiAvKgotICogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGFueSBpbW1lZGlhdGUgcHJlZW1wdGFibGUtUkNVLXJlbGF0ZWQgd29yaworICogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGFueSBpbW1lZGlhdGUgcHJlZW1wdGlibGUtUkNVLXJlbGF0ZWQgd29yawogICogdG8gYmUgZG9uZS4KICAqLwogc3RhdGljIGludCByY3VfcHJlZW1wdF9wZW5kaW5nKGludCBjcHUpCkBAIC03NDksNyArODA3LDcgQEAKIH0KIAogLyoKLSAqIERvZXMgcHJlZW1wdGFibGUgUkNVIG5lZWQgdGhlIENQVSB0byBzdGF5IG91dCBvZiBkeW50aWNrcyBtb2RlPworICogRG9lcyBwcmVlbXB0aWJsZSBSQ1UgbmVlZCB0aGUgQ1BVIHRvIHN0YXkgb3V0IG9mIGR5bnRpY2tzIG1vZGU/CiAgKi8KIHN0YXRpYyBpbnQgcmN1X3ByZWVtcHRfbmVlZHNfY3B1KGludCBjcHUpCiB7CkBAIC03NjYsNyArODI0LDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHJjdV9iYXJyaWVyKTsKIAogLyoKLSAqIEluaXRpYWxpemUgcHJlZW1wdGFibGUgUkNVJ3MgcGVyLUNQVSBkYXRhLgorICogSW5pdGlhbGl6ZSBwcmVlbXB0aWJsZSBSQ1UncyBwZXItQ1BVIGRhdGEuCiAgKi8KIHN0YXRpYyB2b2lkIF9fY3B1aW5pdCByY3VfcHJlZW1wdF9pbml0X3BlcmNwdV9kYXRhKGludCBjcHUpCiB7CkBAIC03NzQsNyArODMyLDcgQEAKIH0KIAogLyoKLSAqIE1vdmUgcHJlZW1wdGFibGUgUkNVJ3MgY2FsbGJhY2tzIGZyb20gZHlpbmcgQ1BVIHRvIG90aGVyIG9ubGluZSBDUFUuCisgKiBNb3ZlIHByZWVtcHRpYmxlIFJDVSdzIGNhbGxiYWNrcyBmcm9tIGR5aW5nIENQVSB0byBvdGhlciBvbmxpbmUgQ1BVLgogICovCiBzdGF0aWMgdm9pZCByY3VfcHJlZW1wdF9zZW5kX2Nic190b19vbmxpbmUodm9pZCkKIHsKQEAgLTc4Miw3ICs4NDAsNyBAQAogfQogCiAvKgotICogSW5pdGlhbGl6ZSBwcmVlbXB0YWJsZSBSQ1UncyBzdGF0ZSBzdHJ1Y3R1cmVzLgorICogSW5pdGlhbGl6ZSBwcmVlbXB0aWJsZSBSQ1UncyBzdGF0ZSBzdHJ1Y3R1cmVzLgogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgX19yY3VfaW5pdF9wcmVlbXB0KHZvaWQpCiB7CkBAIC03OTAsNyArODQ4LDcgQEAKIH0KIAogLyoKLSAqIENoZWNrIGZvciBhIHRhc2sgZXhpdGluZyB3aGlsZSBpbiBhIHByZWVtcHRhYmxlLVJDVSByZWFkLXNpZGUKKyAqIENoZWNrIGZvciBhIHRhc2sgZXhpdGluZyB3aGlsZSBpbiBhIHByZWVtcHRpYmxlLVJDVSByZWFkLXNpZGUKICAqIGNyaXRpY2FsIHNlY3Rpb24sIGNsZWFuIHVwIGlmIHNvLiAgTm8gbmVlZCB0byBpc3N1ZSB3YXJuaW5ncywKICAqIGFzIGRlYnVnX2NoZWNrX25vX2xvY2tzX2hlbGQoKSBhbHJlYWR5IGRvZXMgdGhpcyBpZiBsb2NrZGVwCiAgKiBpcyBlbmFibGVkLgpAQCAtODAyLDExICs4NjAsMTMgQEAKIAlpZiAodC0+cmN1X3JlYWRfbG9ja19uZXN0aW5nID09IDApCiAJCXJldHVybjsKIAl0LT5yY3VfcmVhZF9sb2NrX25lc3RpbmcgPSAxOwotCXJjdV9yZWFkX3VubG9jaygpOworCV9fcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKICNlbHNlIC8qICNpZmRlZiBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSAqLwogCitzdGF0aWMgc3RydWN0IHJjdV9zdGF0ZSAqcmN1X3N0YXRlID0gJnJjdV9zY2hlZF9zdGF0ZTsKKwogLyoKICAqIFRlbGwgdGhlbSB3aGF0IFJDVSB0aGV5IGFyZSBydW5uaW5nLgogICovCkBAIC04MzYsNyArODk2LDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHJjdV9mb3JjZV9xdWllc2NlbnRfc3RhdGUpOwogCiAvKgotICogQmVjYXVzZSBwcmVlbXB0YWJsZSBSQ1UgZG9lcyBub3QgZXhpc3QsIHdlIG5ldmVyIGhhdmUgdG8gY2hlY2sgZm9yCisgKiBCZWNhdXNlIHByZWVtcHRpYmxlIFJDVSBkb2VzIG5vdCBleGlzdCwgd2UgbmV2ZXIgaGF2ZSB0byBjaGVjayBmb3IKICAqIENQVXMgYmVpbmcgaW4gcXVpZXNjZW50IHN0YXRlcy4KICAqLwogc3RhdGljIHZvaWQgcmN1X3ByZWVtcHRfbm90ZV9jb250ZXh0X3N3aXRjaChpbnQgY3B1KQpAQCAtODQ0LDEwICs5MDQsMTAgQEAKIH0KIAogLyoKLSAqIEJlY2F1c2UgcHJlZW1wdGFibGUgUkNVIGRvZXMgbm90IGV4aXN0LCB0aGVyZSBhcmUgbmV2ZXIgYW55IHByZWVtcHRlZAorICogQmVjYXVzZSBwcmVlbXB0aWJsZSBSQ1UgZG9lcyBub3QgZXhpc3QsIHRoZXJlIGFyZSBuZXZlciBhbnkgcHJlZW1wdGVkCiAgKiBSQ1UgcmVhZGVycy4KICAqLwotc3RhdGljIGludCByY3VfcHJlZW1wdGVkX3JlYWRlcnMoc3RydWN0IHJjdV9ub2RlICpybnApCitzdGF0aWMgaW50IHJjdV9wcmVlbXB0X2Jsb2NrZWRfcmVhZGVyc19jZ3Aoc3RydWN0IHJjdV9ub2RlICpybnApCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC04NjIsMTAgKzkyMiw4IEBACiAKICNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVICovCiAKLSNpZmRlZiBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUgotCiAvKgotICogQmVjYXVzZSBwcmVlbXB0YWJsZSBSQ1UgZG9lcyBub3QgZXhpc3QsIHdlIG5ldmVyIGhhdmUgdG8gY2hlY2sgZm9yCisgKiBCZWNhdXNlIHByZWVtcHRpYmxlIFJDVSBkb2VzIG5vdCBleGlzdCwgd2UgbmV2ZXIgaGF2ZSB0byBjaGVjayBmb3IKICAqIHRhc2tzIGJsb2NrZWQgd2l0aGluIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbnMuCiAgKi8KIHN0YXRpYyB2b2lkIHJjdV9wcmludF9kZXRhaWxfdGFza19zdGFsbChzdHJ1Y3QgcmN1X3N0YXRlICpyc3ApCkBAIC04NzMsNyArOTMxLDcgQEAKIH0KIAogLyoKLSAqIEJlY2F1c2UgcHJlZW1wdGFibGUgUkNVIGRvZXMgbm90IGV4aXN0LCB3ZSBuZXZlciBoYXZlIHRvIGNoZWNrIGZvcgorICogQmVjYXVzZSBwcmVlbXB0aWJsZSBSQ1UgZG9lcyBub3QgZXhpc3QsIHdlIG5ldmVyIGhhdmUgdG8gY2hlY2sgZm9yCiAgKiB0YXNrcyBibG9ja2VkIHdpdGhpbiBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zLgogICovCiBzdGF0aWMgdm9pZCByY3VfcHJpbnRfdGFza19zdGFsbChzdHJ1Y3QgcmN1X25vZGUgKnJucCkKQEAgLTg4OCwxMCArOTQ2LDggQEAKIHsKIH0KIAotI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiAqLwotCiAvKgotICogQmVjYXVzZSB0aGVyZSBpcyBubyBwcmVlbXB0YWJsZSBSQ1UsIHRoZXJlIGNhbiBiZSBubyByZWFkZXJzIGJsb2NrZWQsCisgKiBCZWNhdXNlIHRoZXJlIGlzIG5vIHByZWVtcHRpYmxlIFJDVSwgdGhlcmUgY2FuIGJlIG5vIHJlYWRlcnMgYmxvY2tlZCwKICAqIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgZm9yIGJsb2NrZWQgdGFza3MuICBTbyBjaGVjayBvbmx5IGZvcgogICogYm9ndXMgcXNtYXNrIHZhbHVlcy4KICAqLwpAQCAtOTAzLDcgKzk1OSw3IEBACiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiAKIC8qCi0gKiBCZWNhdXNlIHByZWVtcHRhYmxlIFJDVSBkb2VzIG5vdCBleGlzdCwgaXQgbmV2ZXIgbmVlZHMgdG8gbWlncmF0ZQorICogQmVjYXVzZSBwcmVlbXB0aWJsZSBSQ1UgZG9lcyBub3QgZXhpc3QsIGl0IG5ldmVyIG5lZWRzIHRvIG1pZ3JhdGUKICAqIHRhc2tzIHRoYXQgd2VyZSBibG9ja2VkIHdpdGhpbiBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zLCBhbmQKICAqIHN1Y2ggbm9uLWV4aXN0ZW50IHRhc2tzIGNhbm5vdCBwb3NzaWJseSBoYXZlIGJlZW4gYmxvY2tpbmcgdGhlIGN1cnJlbnQKICAqIGdyYWNlIHBlcmlvZC4KQEAgLTkxNiw3ICs5NzIsNyBAQAogfQogCiAvKgotICogQmVjYXVzZSBwcmVlbXB0YWJsZSBSQ1UgZG9lcyBub3QgZXhpc3QsIGl0IG5ldmVyIG5lZWRzIENQVS1vZmZsaW5lCisgKiBCZWNhdXNlIHByZWVtcHRpYmxlIFJDVSBkb2VzIG5vdCBleGlzdCwgaXQgbmV2ZXIgbmVlZHMgQ1BVLW9mZmxpbmUKICAqIHByb2Nlc3NpbmcuCiAgKi8KIHN0YXRpYyB2b2lkIHJjdV9wcmVlbXB0X29mZmxpbmVfY3B1KGludCBjcHUpCkBAIC05MjYsNyArOTgyLDcgQEAKICNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVICovCiAKIC8qCi0gKiBCZWNhdXNlIHByZWVtcHRhYmxlIFJDVSBkb2VzIG5vdCBleGlzdCwgaXQgbmV2ZXIgaGFzIGFueSBjYWxsYmFja3MKKyAqIEJlY2F1c2UgcHJlZW1wdGlibGUgUkNVIGRvZXMgbm90IGV4aXN0LCBpdCBuZXZlciBoYXMgYW55IGNhbGxiYWNrcwogICogdG8gY2hlY2suCiAgKi8KIHN0YXRpYyB2b2lkIHJjdV9wcmVlbXB0X2NoZWNrX2NhbGxiYWNrcyhpbnQgY3B1KQpAQCAtOTM0LDcgKzk5MCw3IEBACiB9CiAKIC8qCi0gKiBCZWNhdXNlIHByZWVtcHRhYmxlIFJDVSBkb2VzIG5vdCBleGlzdCwgaXQgbmV2ZXIgaGFzIGFueSBjYWxsYmFja3MKKyAqIEJlY2F1c2UgcHJlZW1wdGlibGUgUkNVIGRvZXMgbm90IGV4aXN0LCBpdCBuZXZlciBoYXMgYW55IGNhbGxiYWNrcwogICogdG8gcHJvY2Vzcy4KICAqLwogc3RhdGljIHZvaWQgcmN1X3ByZWVtcHRfcHJvY2Vzc19jYWxsYmFja3Modm9pZCkKQEAgLTk0Myw3ICs5OTksNyBAQAogCiAvKgogICogV2FpdCBmb3IgYW4gcmN1LXByZWVtcHQgZ3JhY2UgcGVyaW9kLCBidXQgbWFrZSBpdCBoYXBwZW4gcXVpY2tseS4KLSAqIEJ1dCBiZWNhdXNlIHByZWVtcHRhYmxlIFJDVSBkb2VzIG5vdCBleGlzdCwgbWFwIHRvIHJjdS1zY2hlZC4KKyAqIEJ1dCBiZWNhdXNlIHByZWVtcHRpYmxlIFJDVSBkb2VzIG5vdCBleGlzdCwgbWFwIHRvIHJjdS1zY2hlZC4KICAqLwogdm9pZCBzeW5jaHJvbml6ZV9yY3VfZXhwZWRpdGVkKHZvaWQpCiB7CkBAIC05NTQsNyArMTAxMCw3IEBACiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiAKIC8qCi0gKiBCZWNhdXNlIHByZWVtcHRhYmxlIFJDVSBkb2VzIG5vdCBleGlzdCwgdGhlcmUgaXMgbmV2ZXIgYW55IG5lZWQgdG8KKyAqIEJlY2F1c2UgcHJlZW1wdGlibGUgUkNVIGRvZXMgbm90IGV4aXN0LCB0aGVyZSBpcyBuZXZlciBhbnkgbmVlZCB0bwogICogcmVwb3J0IG9uIHRhc2tzIHByZWVtcHRlZCBpbiBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zIGR1cmluZwogICogZXhwZWRpdGVkIFJDVSBncmFjZSBwZXJpb2RzLgogICovCkBAIC05NjYsNyArMTAyMiw3IEBACiAjZW5kaWYgLyogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVSAqLwogCiAvKgotICogQmVjYXVzZSBwcmVlbXB0YWJsZSBSQ1UgZG9lcyBub3QgZXhpc3QsIGl0IG5ldmVyIGhhcyBhbnkgd29yayB0byBkby4KKyAqIEJlY2F1c2UgcHJlZW1wdGlibGUgUkNVIGRvZXMgbm90IGV4aXN0LCBpdCBuZXZlciBoYXMgYW55IHdvcmsgdG8gZG8uCiAgKi8KIHN0YXRpYyBpbnQgcmN1X3ByZWVtcHRfcGVuZGluZyhpbnQgY3B1KQogewpAQCAtOTc0LDcgKzEwMzAsNyBAQAogfQogCiAvKgotICogQmVjYXVzZSBwcmVlbXB0YWJsZSBSQ1UgZG9lcyBub3QgZXhpc3QsIGl0IG5ldmVyIG5lZWRzIGFueSBDUFUuCisgKiBCZWNhdXNlIHByZWVtcHRpYmxlIFJDVSBkb2VzIG5vdCBleGlzdCwgaXQgbmV2ZXIgbmVlZHMgYW55IENQVS4KICAqLwogc3RhdGljIGludCByY3VfcHJlZW1wdF9uZWVkc19jcHUoaW50IGNwdSkKIHsKQEAgLTk4Miw3ICsxMDM4LDcgQEAKIH0KIAogLyoKLSAqIEJlY2F1c2UgcHJlZW1wdGFibGUgUkNVIGRvZXMgbm90IGV4aXN0LCByY3VfYmFycmllcigpIGlzIGp1c3QKKyAqIEJlY2F1c2UgcHJlZW1wdGlibGUgUkNVIGRvZXMgbm90IGV4aXN0LCByY3VfYmFycmllcigpIGlzIGp1c3QKICAqIGFub3RoZXIgbmFtZSBmb3IgcmN1X2JhcnJpZXJfc2NoZWQoKS4KICAqLwogdm9pZCByY3VfYmFycmllcih2b2lkKQpAQCAtOTkyLDcgKzEwNDgsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwocmN1X2JhcnJpZXIpOwogCiAvKgotICogQmVjYXVzZSBwcmVlbXB0YWJsZSBSQ1UgZG9lcyBub3QgZXhpc3QsIHRoZXJlIGlzIG5vIHBlci1DUFUKKyAqIEJlY2F1c2UgcHJlZW1wdGlibGUgUkNVIGRvZXMgbm90IGV4aXN0LCB0aGVyZSBpcyBubyBwZXItQ1BVCiAgKiBkYXRhIHRvIGluaXRpYWxpemUuCiAgKi8KIHN0YXRpYyB2b2lkIF9fY3B1aW5pdCByY3VfcHJlZW1wdF9pbml0X3BlcmNwdV9kYXRhKGludCBjcHUpCkBAIC0xMDAwLDE0ICsxMDU2LDE0IEBACiB9CiAKIC8qCi0gKiBCZWNhdXNlIHRoZXJlIGlzIG5vIHByZWVtcHRhYmxlIFJDVSwgdGhlcmUgYXJlIG5vIGNhbGxiYWNrcyB0byBtb3ZlLgorICogQmVjYXVzZSB0aGVyZSBpcyBubyBwcmVlbXB0aWJsZSBSQ1UsIHRoZXJlIGFyZSBubyBjYWxsYmFja3MgdG8gbW92ZS4KICAqLwogc3RhdGljIHZvaWQgcmN1X3ByZWVtcHRfc2VuZF9jYnNfdG9fb25saW5lKHZvaWQpCiB7CiB9CiAKIC8qCi0gKiBCZWNhdXNlIHByZWVtcHRhYmxlIFJDVSBkb2VzIG5vdCBleGlzdCwgaXQgbmVlZCBub3QgYmUgaW5pdGlhbGl6ZWQuCisgKiBCZWNhdXNlIHByZWVtcHRpYmxlIFJDVSBkb2VzIG5vdCBleGlzdCwgaXQgbmVlZCBub3QgYmUgaW5pdGlhbGl6ZWQuCiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBfX3JjdV9pbml0X3ByZWVtcHQodm9pZCkKIHsKQEAgLTEwMTUsNiArMTA3MSwyNzYgQEAKIAogI2VuZGlmIC8qICNlbHNlICNpZmRlZiBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSAqLwogCisjaWZkZWYgQ09ORklHX1JDVV9CT09TVAorCisjaW5jbHVkZSAicnRtdXRleF9jb21tb24uaCIKKworI2lmZGVmIENPTkZJR19SQ1VfVFJBQ0UKKworc3RhdGljIHZvaWQgcmN1X2luaXRpYXRlX2Jvb3N0X3RyYWNlKHN0cnVjdCByY3Vfbm9kZSAqcm5wKQoreworCWlmIChsaXN0X2VtcHR5KCZybnAtPmJsa2RfdGFza3MpKQorCQlybnAtPm5fYmFsa19ibGtkX3Rhc2tzKys7CisJZWxzZSBpZiAocm5wLT5leHBfdGFza3MgPT0gTlVMTCAmJiBybnAtPmdwX3Rhc2tzID09IE5VTEwpCisJCXJucC0+bl9iYWxrX2V4cF9ncF90YXNrcysrOworCWVsc2UgaWYgKHJucC0+Z3BfdGFza3MgIT0gTlVMTCAmJiBybnAtPmJvb3N0X3Rhc2tzICE9IE5VTEwpCisJCXJucC0+bl9iYWxrX2Jvb3N0X3Rhc2tzKys7CisJZWxzZSBpZiAocm5wLT5ncF90YXNrcyAhPSBOVUxMICYmIHJucC0+cXNtYXNrICE9IDApCisJCXJucC0+bl9iYWxrX25vdGJsb2NrZWQrKzsKKwllbHNlIGlmIChybnAtPmdwX3Rhc2tzICE9IE5VTEwgJiYKKwkJIFVMT05HX0NNUF9MVChqaWZmaWVzLCBybnAtPmJvb3N0X3RpbWUpKQorCQlybnAtPm5fYmFsa19ub3R5ZXQrKzsKKwllbHNlCisJCXJucC0+bl9iYWxrX25vcysrOworfQorCisjZWxzZSAvKiAjaWZkZWYgQ09ORklHX1JDVV9UUkFDRSAqLworCitzdGF0aWMgdm9pZCByY3VfaW5pdGlhdGVfYm9vc3RfdHJhY2Uoc3RydWN0IHJjdV9ub2RlICpybnApCit7Cit9CisKKyNlbmRpZiAvKiAjZWxzZSAjaWZkZWYgQ09ORklHX1JDVV9UUkFDRSAqLworCisvKgorICogQ2Fycnkgb3V0IFJDVSBwcmlvcml0eSBib29zdGluZyBvbiB0aGUgdGFzayBpbmRpY2F0ZWQgYnkgLT5leHBfdGFza3MKKyAqIG9yIC0+Ym9vc3RfdGFza3MsIGFkdmFuY2luZyB0aGUgcG9pbnRlciB0byB0aGUgbmV4dCB0YXNrIGluIHRoZQorICogLT5ibGtkX3Rhc2tzIGxpc3QuCisgKgorICogTm90ZSB0aGF0IGlycXMgbXVzdCBiZSBlbmFibGVkOiBib29zdGluZyB0aGUgdGFzayBjYW4gYmxvY2suCisgKiBSZXR1cm5zIDEgaWYgdGhlcmUgYXJlIG1vcmUgdGFza3MgbmVlZGluZyB0byBiZSBib29zdGVkLgorICovCitzdGF0aWMgaW50IHJjdV9ib29zdChzdHJ1Y3QgcmN1X25vZGUgKnJucCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBydF9tdXRleCBtdHg7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0OworCXN0cnVjdCBsaXN0X2hlYWQgKnRiOworCisJaWYgKHJucC0+ZXhwX3Rhc2tzID09IE5VTEwgJiYgcm5wLT5ib29zdF90YXNrcyA9PSBOVUxMKQorCQlyZXR1cm4gMDsgIC8qIE5vdGhpbmcgbGVmdCB0byBib29zdC4gKi8KKworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcm5wLT5sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIFJlY2hlY2sgdW5kZXIgdGhlIGxvY2s6IGFsbCB0YXNrcyBpbiBuZWVkIG9mIGJvb3N0aW5nCisJICogbWlnaHQgZXhpdCB0aGVpciBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zIG9uIHRoZWlyIG93bi4KKwkgKi8KKwlpZiAocm5wLT5leHBfdGFza3MgPT0gTlVMTCAmJiBybnAtPmJvb3N0X3Rhc2tzID09IE5VTEwpIHsKKwkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFByZWZlcmVudGlhbGx5IGJvb3N0IHRhc2tzIGJsb2NraW5nIGV4cGVkaXRlZCBncmFjZSBwZXJpb2RzLgorCSAqIFRoaXMgY2Fubm90IHN0YXJ2ZSB0aGUgbm9ybWFsIGdyYWNlIHBlcmlvZHMgYmVjYXVzZSBhIHNlY29uZAorCSAqIGV4cGVkaXRlZCBncmFjZSBwZXJpb2QgbXVzdCBib29zdCBhbGwgYmxvY2tlZCB0YXNrcywgaW5jbHVkaW5nCisJICogdGhvc2UgYmxvY2tpbmcgdGhlIHByZS1leGlzdGluZyBub3JtYWwgZ3JhY2UgcGVyaW9kLgorCSAqLworCWlmIChybnAtPmV4cF90YXNrcyAhPSBOVUxMKSB7CisJCXRiID0gcm5wLT5leHBfdGFza3M7CisJCXJucC0+bl9leHBfYm9vc3RzKys7CisJfSBlbHNlIHsKKwkJdGIgPSBybnAtPmJvb3N0X3Rhc2tzOworCQlybnAtPm5fbm9ybWFsX2Jvb3N0cysrOworCX0KKwlybnAtPm5fdGFza3NfYm9vc3RlZCsrOworCisJLyoKKwkgKiBXZSBib29zdCB0YXNrIHQgYnkgbWFudWZhY3R1cmluZyBhbiBydF9tdXRleCB0aGF0IGFwcGVhcnMgdG8KKwkgKiBiZSBoZWxkIGJ5IHRhc2sgdC4gIFdlIGxlYXZlIGEgcG9pbnRlciB0byB0aGF0IHJ0X211dGV4IHdoZXJlCisJICogdGFzayB0IGNhbiBmaW5kIGl0LCBhbmQgdGFzayB0IHdpbGwgcmVsZWFzZSB0aGUgbXV0ZXggd2hlbiBpdAorCSAqIGV4aXRzIGl0cyBvdXRlcm1vc3QgUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uLiAgVGhlbgorCSAqIHNpbXBseSBhY3F1aXJpbmcgdGhpcyBhcnRpZmljaWFsIHJ0X211dGV4IHdpbGwgYm9vc3QgdGFzaworCSAqIHQncyBwcmlvcml0eS4gIChUaGFua3MgdG8gdGdseCBmb3Igc3VnZ2VzdGluZyB0aGlzIGFwcHJvYWNoISkKKwkgKgorCSAqIE5vdGUgdGhhdCB0YXNrIHQgbXVzdCBhY3F1aXJlIHJucC0+bG9jayB0byByZW1vdmUgaXRzZWxmIGZyb20KKwkgKiB0aGUgLT5ibGtkX3Rhc2tzIGxpc3QsIHdoaWNoIGl0IHdpbGwgZG8gZnJvbSBleGl0KCkgaWYgZnJvbQorCSAqIG5vd2hlcmUgZWxzZS4gIFdlIHRoZXJlZm9yZSBhcmUgZ3VhcmFudGVlZCB0aGF0IHRhc2sgdCB3aWxsCisJICogc3RheSBhcm91bmQgYXQgbGVhc3QgdW50aWwgd2UgZHJvcCBybnAtPmxvY2suICBOb3RlIHRoYXQKKwkgKiBybnAtPmxvY2sgYWxzbyByZXNvbHZlcyByYWNlcyBiZXR3ZWVuIG91ciBwcmlvcml0eSBib29zdGluZworCSAqIGFuZCB0YXNrIHQncyBleGl0aW5nIGl0cyBvdXRlcm1vc3QgUkNVIHJlYWQtc2lkZSBjcml0aWNhbAorCSAqIHNlY3Rpb24uCisJICovCisJdCA9IGNvbnRhaW5lcl9vZih0Yiwgc3RydWN0IHRhc2tfc3RydWN0LCByY3Vfbm9kZV9lbnRyeSk7CisJcnRfbXV0ZXhfaW5pdF9wcm94eV9sb2NrZWQoJm10eCwgdCk7CisJdC0+cmN1X2Jvb3N0X211dGV4ID0gJm10eDsKKwl0LT5yY3VfcmVhZF91bmxvY2tfc3BlY2lhbCB8PSBSQ1VfUkVBRF9VTkxPQ0tfQk9PU1RFRDsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7CisJcnRfbXV0ZXhfbG9jaygmbXR4KTsgIC8qIFNpZGUgZWZmZWN0OiBib29zdHMgdGFzayB0J3MgcHJpb3JpdHkuICovCisJcnRfbXV0ZXhfdW5sb2NrKCZtdHgpOyAgLyogS2VlcCBsb2NrZGVwIGhhcHB5LiAqLworCisJcmV0dXJuIHJucC0+ZXhwX3Rhc2tzICE9IE5VTEwgfHwgcm5wLT5ib29zdF90YXNrcyAhPSBOVUxMOworfQorCisvKgorICogVGltZXIgaGFuZGxlciB0byBpbml0aWF0ZSB3YWtpbmcgdXAgb2YgYm9vc3Qga3RocmVhZHMgdGhhdAorICogaGF2ZSB5aWVsZGVkIHRoZSBDUFUgZHVlIHRvIGV4Y2Vzc2l2ZSBudW1iZXJzIG9mIHRhc2tzIHRvCisgKiBib29zdC4gIFdlIHdha2UgdXAgdGhlIHBlci1yY3Vfbm9kZSBrdGhyZWFkLCB3aGljaCBpbiB0dXJuCisgKiB3aWxsIHdha2UgdXAgdGhlIGJvb3N0ZXIga3RocmVhZC4KKyAqLworc3RhdGljIHZvaWQgcmN1X2Jvb3N0X2t0aHJlYWRfdGltZXIodW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW52b2tlX3JjdV9ub2RlX2t0aHJlYWQoKHN0cnVjdCByY3Vfbm9kZSAqKWFyZyk7Cit9CisKKy8qCisgKiBQcmlvcml0eS1ib29zdGluZyBrdGhyZWFkLiAgT25lIHBlciBsZWFmIHJjdV9ub2RlIGFuZCBvbmUgZm9yIHRoZQorICogcm9vdCByY3Vfbm9kZS4KKyAqLworc3RhdGljIGludCByY3VfYm9vc3Rfa3RocmVhZCh2b2lkICphcmcpCit7CisJc3RydWN0IHJjdV9ub2RlICpybnAgPSAoc3RydWN0IHJjdV9ub2RlICopYXJnOworCWludCBzcGluY250ID0gMDsKKwlpbnQgbW9yZTJib29zdDsKKworCWZvciAoOzspIHsKKwkJcm5wLT5ib29zdF9rdGhyZWFkX3N0YXR1cyA9IFJDVV9LVEhSRUFEX1dBSVRJTkc7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShybnAtPmJvb3N0X3dxLCBybnAtPmJvb3N0X3Rhc2tzIHx8CisJCQkJCQkJcm5wLT5leHBfdGFza3MpOworCQlybnAtPmJvb3N0X2t0aHJlYWRfc3RhdHVzID0gUkNVX0tUSFJFQURfUlVOTklORzsKKwkJbW9yZTJib29zdCA9IHJjdV9ib29zdChybnApOworCQlpZiAobW9yZTJib29zdCkKKwkJCXNwaW5jbnQrKzsKKwkJZWxzZQorCQkJc3BpbmNudCA9IDA7CisJCWlmIChzcGluY250ID4gMTApIHsKKwkJCXJjdV95aWVsZChyY3VfYm9vc3Rfa3RocmVhZF90aW1lciwgKHVuc2lnbmVkIGxvbmcpcm5wKTsKKwkJCXNwaW5jbnQgPSAwOworCQl9CisJfQorCS8qIE5PVFJFQUNIRUQgKi8KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENoZWNrIHRvIHNlZSBpZiBpdCBpcyB0aW1lIHRvIHN0YXJ0IGJvb3N0aW5nIFJDVSByZWFkZXJzIHRoYXQgYXJlCisgKiBibG9ja2luZyB0aGUgY3VycmVudCBncmFjZSBwZXJpb2QsIGFuZCwgaWYgc28sIHRlbGwgdGhlIHBlci1yY3Vfbm9kZQorICoga3RocmVhZCB0byBzdGFydCBib29zdGluZyB0aGVtLiAgSWYgdGhlcmUgaXMgYW4gZXhwZWRpdGVkIGdyYWNlCisgKiBwZXJpb2QgaW4gcHJvZ3Jlc3MsIGl0IGlzIGFsd2F5cyB0aW1lIHRvIGJvb3N0LgorICoKKyAqIFRoZSBjYWxsZXIgbXVzdCBob2xkIHJucC0+bG9jaywgd2hpY2ggdGhpcyBmdW5jdGlvbiByZWxlYXNlcywKKyAqIGJ1dCBpcnFzIHJlbWFpbiBkaXNhYmxlZC4gIFRoZSAtPmJvb3N0X2t0aHJlYWRfdGFzayBpcyBpbW1vcnRhbCwKKyAqIHNvIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgaXQgZ29pbmcgYXdheS4KKyAqLworc3RhdGljIHZvaWQgcmN1X2luaXRpYXRlX2Jvb3N0KHN0cnVjdCByY3Vfbm9kZSAqcm5wLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKKworCWlmICghcmN1X3ByZWVtcHRfYmxvY2tlZF9yZWFkZXJzX2NncChybnApICYmIHJucC0+ZXhwX3Rhc2tzID09IE5VTEwpIHsKKwkJcm5wLT5uX2JhbGtfZXhwX2dwX3Rhc2tzKys7CisJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocm5wLT5leHBfdGFza3MgIT0gTlVMTCB8fAorCSAgICAocm5wLT5ncF90YXNrcyAhPSBOVUxMICYmCisJICAgICBybnAtPmJvb3N0X3Rhc2tzID09IE5VTEwgJiYKKwkgICAgIHJucC0+cXNtYXNrID09IDAgJiYKKwkgICAgIFVMT05HX0NNUF9HRShqaWZmaWVzLCBybnAtPmJvb3N0X3RpbWUpKSkgeworCQlpZiAocm5wLT5leHBfdGFza3MgPT0gTlVMTCkKKwkJCXJucC0+Ym9vc3RfdGFza3MgPSBybnAtPmdwX3Rhc2tzOworCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7CisJCXQgPSBybnAtPmJvb3N0X2t0aHJlYWRfdGFzazsKKwkJaWYgKHQgIT0gTlVMTCkKKwkJCXdha2VfdXBfcHJvY2Vzcyh0KTsKKwl9IGVsc2UgeworCQlyY3VfaW5pdGlhdGVfYm9vc3RfdHJhY2Uocm5wKTsKKwkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucC0+bG9jaywgZmxhZ3MpOworCX0KK30KKworLyoKKyAqIFNldCB0aGUgYWZmaW5pdHkgb2YgdGhlIGJvb3N0IGt0aHJlYWQuICBUaGUgQ1BVLWhvdHBsdWcgbG9ja3MgYXJlCisgKiBoZWxkLCBzbyBubyBvbmUgc2hvdWxkIGJlIG1lc3Npbmcgd2l0aCB0aGUgZXhpc3RlbmNlIG9mIHRoZSBib29zdAorICoga3RocmVhZC4KKyAqLworc3RhdGljIHZvaWQgcmN1X2Jvb3N0X2t0aHJlYWRfc2V0YWZmaW5pdHkoc3RydWN0IHJjdV9ub2RlICpybnAsCisJCQkJCSAgY3B1bWFza192YXJfdCBjbSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQ7CisKKwl0ID0gcm5wLT5ib29zdF9rdGhyZWFkX3Rhc2s7CisJaWYgKHQgIT0gTlVMTCkKKwkJc2V0X2NwdXNfYWxsb3dlZF9wdHIocm5wLT5ib29zdF9rdGhyZWFkX3Rhc2ssIGNtKTsKK30KKworI2RlZmluZSBSQ1VfQk9PU1RfREVMQVlfSklGRklFUyBESVZfUk9VTkRfVVAoQ09ORklHX1JDVV9CT09TVF9ERUxBWSAqIEhaLCAxMDAwKQorCisvKgorICogRG8gcHJpb3JpdHktYm9vc3QgYWNjb3VudGluZyBmb3IgdGhlIHN0YXJ0IG9mIGEgbmV3IGdyYWNlIHBlcmlvZC4KKyAqLworc3RhdGljIHZvaWQgcmN1X3ByZWVtcHRfYm9vc3Rfc3RhcnRfZ3Aoc3RydWN0IHJjdV9ub2RlICpybnApCit7CisJcm5wLT5ib29zdF90aW1lID0gamlmZmllcyArIFJDVV9CT09TVF9ERUxBWV9KSUZGSUVTOworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgUkNVLWJvb3N0IHdhaXRxdWV1ZS4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHJjdV9pbml0X2Jvb3N0X3dhaXRxdWV1ZShzdHJ1Y3QgcmN1X25vZGUgKnJucCkKK3sKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZybnAtPmJvb3N0X3dxKTsKK30KKworLyoKKyAqIENyZWF0ZSBhbiBSQ1UtYm9vc3Qga3RocmVhZCBmb3IgdGhlIHNwZWNpZmllZCBub2RlIGlmIG9uZSBkb2VzIG5vdAorICogYWxyZWFkeSBleGlzdC4gIFdlIG9ubHkgY3JlYXRlIHRoaXMga3RocmVhZCBmb3IgcHJlZW1wdGlibGUgUkNVLgorICogUmV0dXJucyB6ZXJvIGlmIGFsbCBpcyB3ZWxsLCBhIG5lZ2F0ZWQgZXJybm8gb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IF9fY3B1aW5pdCByY3Vfc3Bhd25fb25lX2Jvb3N0X2t0aHJlYWQoc3RydWN0IHJjdV9zdGF0ZSAqcnNwLAorCQkJCQkJIHN0cnVjdCByY3Vfbm9kZSAqcm5wLAorCQkJCQkJIGludCBybnBfaW5kZXgpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2NoZWRfcGFyYW0gc3A7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0OworCisJaWYgKCZyY3VfcHJlZW1wdF9zdGF0ZSAhPSByc3ApCisJCXJldHVybiAwOworCWlmIChybnAtPmJvb3N0X2t0aHJlYWRfdGFzayAhPSBOVUxMKQorCQlyZXR1cm4gMDsKKwl0ID0ga3RocmVhZF9jcmVhdGUocmN1X2Jvb3N0X2t0aHJlYWQsICh2b2lkICopcm5wLAorCQkJICAgInJjdWIlZCIsIHJucF9pbmRleCk7CisJaWYgKElTX0VSUih0KSkKKwkJcmV0dXJuIFBUUl9FUlIodCk7CisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZybnAtPmxvY2ssIGZsYWdzKTsKKwlybnAtPmJvb3N0X2t0aHJlYWRfdGFzayA9IHQ7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucC0+bG9jaywgZmxhZ3MpOworCXdha2VfdXBfcHJvY2Vzcyh0KTsKKwlzcC5zY2hlZF9wcmlvcml0eSA9IFJDVV9LVEhSRUFEX1BSSU87CisJc2NoZWRfc2V0c2NoZWR1bGVyX25vY2hlY2sodCwgU0NIRURfRklGTywgJnNwKTsKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UgLyogI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QgKi8KKworc3RhdGljIHZvaWQgcmN1X2luaXRpYXRlX2Jvb3N0KHN0cnVjdCByY3Vfbm9kZSAqcm5wLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcmN1X2Jvb3N0X2t0aHJlYWRfc2V0YWZmaW5pdHkoc3RydWN0IHJjdV9ub2RlICpybnAsCisJCQkJCSAgY3B1bWFza192YXJfdCBjbSkKK3sKK30KKworc3RhdGljIHZvaWQgcmN1X3ByZWVtcHRfYm9vc3Rfc3RhcnRfZ3Aoc3RydWN0IHJjdV9ub2RlICpybnApCit7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCByY3VfaW5pdF9ib29zdF93YWl0cXVldWUoc3RydWN0IHJjdV9ub2RlICpybnApCit7Cit9CisKK3N0YXRpYyBpbnQgX19jcHVpbml0IHJjdV9zcGF3bl9vbmVfYm9vc3Rfa3RocmVhZChzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsCisJCQkJCQkgc3RydWN0IHJjdV9ub2RlICpybnAsCisJCQkJCQkgaW50IHJucF9pbmRleCkKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qICNlbHNlICNpZmRlZiBDT05GSUdfUkNVX0JPT1NUICovCisKICNpZm5kZWYgQ09ORklHX1NNUAogCiB2b2lkIHN5bmNocm9uaXplX3NjaGVkX2V4cGVkaXRlZCh2b2lkKQpAQCAtMTE4Nyw4ICsxNTEzLDggQEAKICAqCiAgKiBCZWNhdXNlIGl0IGlzIG5vdCBsZWdhbCB0byBpbnZva2UgcmN1X3Byb2Nlc3NfY2FsbGJhY2tzKCkgd2l0aCBpcnFzCiAgKiBkaXNhYmxlZCwgd2UgZG8gb25lIHBhc3Mgb2YgZm9yY2VfcXVpZXNjZW50X3N0YXRlKCksIHRoZW4gZG8gYQotICogcmFpc2Vfc29mdGlycSgpIHRvIGNhdXNlIHJjdV9wcm9jZXNzX2NhbGxiYWNrcygpIHRvIGJlIGludm9rZWQgbGF0ZXIuCi0gKiBUaGUgcGVyLWNwdSByY3VfZHludGlja19kcmFpbiB2YXJpYWJsZSBjb250cm9scyB0aGUgc2VxdWVuY2luZy4KKyAqIGludm9rZV9yY3VfY3B1X2t0aHJlYWQoKSB0byBjYXVzZSByY3VfcHJvY2Vzc19jYWxsYmFja3MoKSB0byBiZSBpbnZva2VkCisgKiBsYXRlci4gIFRoZSBwZXItY3B1IHJjdV9keW50aWNrX2RyYWluIHZhcmlhYmxlIGNvbnRyb2xzIHRoZSBzZXF1ZW5jaW5nLgogICovCiBpbnQgcmN1X25lZWRzX2NwdShpbnQgY3B1KQogewpAQCAtMTIzOSw3ICsxNTY1LDcgQEAKIAogCS8qIElmIFJDVSBjYWxsYmFja3MgYXJlIHN0aWxsIHBlbmRpbmcsIFJDVSBzdGlsbCBuZWVkcyB0aGlzIENQVS4gKi8KIAlpZiAoYykKLQkJcmFpc2Vfc29mdGlycShSQ1VfU09GVElSUSk7CisJCWludm9rZV9yY3VfY3B1X2t0aHJlYWQoKTsKIAlyZXR1cm4gYzsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRyZWVfdHJhY2UuYyBiL2tlcm5lbC9yY3V0cmVlX3RyYWNlLmMKaW5kZXggYzhlOTc4NS4uYWEwZmQ3MiAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXRyZWVfdHJhY2UuYworKysgYi9rZXJuZWwvcmN1dHJlZV90cmFjZS5jCkBAIC00Niw2ICs0NiwxOCBAQAogI2RlZmluZSBSQ1VfVFJFRV9OT05DT1JFCiAjaW5jbHVkZSAicmN1dHJlZS5oIgogCitERUNMQVJFX1BFUl9DUFUodW5zaWduZWQgaW50LCByY3VfY3B1X2t0aHJlYWRfc3RhdHVzKTsKK0RFQ0xBUkVfUEVSX0NQVSh1bnNpZ25lZCBpbnQsIHJjdV9jcHVfa3RocmVhZF9jcHUpOworREVDTEFSRV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgcmN1X2NwdV9rdGhyZWFkX2xvb3BzKTsKK0RFQ0xBUkVfUEVSX0NQVShjaGFyLCByY3VfY3B1X2hhc193b3JrKTsKKworc3RhdGljIGNoYXIgY29udmVydF9rdGhyZWFkX3N0YXR1cyh1bnNpZ25lZCBpbnQga3RocmVhZF9zdGF0dXMpCit7CisJaWYgKGt0aHJlYWRfc3RhdHVzID4gUkNVX0tUSFJFQURfTUFYKQorCQlyZXR1cm4gJz8nOworCXJldHVybiAiU1JXT1kiW2t0aHJlYWRfc3RhdHVzXTsKK30KKwogc3RhdGljIHZvaWQgcHJpbnRfb25lX3JjdV9kYXRhKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHJjdV9kYXRhICpyZHApCiB7CiAJaWYgKCFyZHAtPmJlZW5vbmxpbmUpCkBAIC02NCw3ICs3NiwyMSBAQAogCQkgICByZHAtPmR5bnRpY2tzX2Zxcyk7CiAjZW5kaWYgLyogI2lmZGVmIENPTkZJR19OT19IWiAqLwogCXNlcV9wcmludGYobSwgIiBvZj0lbHUgcmk9JWx1IiwgcmRwLT5vZmZsaW5lX2ZxcywgcmRwLT5yZXNjaGVkX2lwaSk7Ci0Jc2VxX3ByaW50ZihtLCAiIHFsPSVsZCBiPSVsZCIsIHJkcC0+cWxlbiwgcmRwLT5ibGltaXQpOworCXNlcV9wcmludGYobSwgIiBxbD0lbGQgcXM9JWMlYyVjJWMga3Q9JWQvJWMvJWQga3RsPSV4IGI9JWxkIiwKKwkJICAgcmRwLT5xbGVuLAorCQkgICAiLk4iW3JkcC0+bnh0dGFpbFtSQ1VfTkVYVF9SRUFEWV9UQUlMXSAhPQorCQkJcmRwLT5ueHR0YWlsW1JDVV9ORVhUX1RBSUxdXSwKKwkJICAgIi5SIltyZHAtPm54dHRhaWxbUkNVX1dBSVRfVEFJTF0gIT0KKwkJCXJkcC0+bnh0dGFpbFtSQ1VfTkVYVF9SRUFEWV9UQUlMXV0sCisJCSAgICIuVyJbcmRwLT5ueHR0YWlsW1JDVV9ET05FX1RBSUxdICE9CisJCQlyZHAtPm54dHRhaWxbUkNVX1dBSVRfVEFJTF1dLAorCQkgICAiLkQiWyZyZHAtPm54dGxpc3QgIT0gcmRwLT5ueHR0YWlsW1JDVV9ET05FX1RBSUxdXSwKKwkJICAgcGVyX2NwdShyY3VfY3B1X2hhc193b3JrLCByZHAtPmNwdSksCisJCSAgIGNvbnZlcnRfa3RocmVhZF9zdGF0dXMocGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfc3RhdHVzLAorCQkJCQkgIHJkcC0+Y3B1KSksCisJCSAgIHBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX2NwdSwgcmRwLT5jcHUpLAorCQkgICBwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF9sb29wcywgcmRwLT5jcHUpICYgMHhmZmZmLAorCQkgICByZHAtPmJsaW1pdCk7CiAJc2VxX3ByaW50ZihtLCAiIGNpPSVsdSBjbz0lbHUgY2E9JWx1XG4iLAogCQkgICByZHAtPm5fY2JzX2ludm9rZWQsIHJkcC0+bl9jYnNfb3JwaGFuZWQsIHJkcC0+bl9jYnNfYWRvcHRlZCk7CiB9CkBAIC0xMjEsNyArMTQ3LDE4IEBACiAJCSAgIHJkcC0+ZHludGlja3NfZnFzKTsKICNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX05PX0haICovCiAJc2VxX3ByaW50ZihtLCAiLCVsdSwlbHUiLCByZHAtPm9mZmxpbmVfZnFzLCByZHAtPnJlc2NoZWRfaXBpKTsKLQlzZXFfcHJpbnRmKG0sICIsJWxkLCVsZCIsIHJkcC0+cWxlbiwgcmRwLT5ibGltaXQpOworCXNlcV9wcmludGYobSwgIiwlbGQsXCIlYyVjJWMlY1wiLCVkLFwiJWNcIiwlbGQiLCByZHAtPnFsZW4sCisJCSAgICIuTiJbcmRwLT5ueHR0YWlsW1JDVV9ORVhUX1JFQURZX1RBSUxdICE9CisJCQlyZHAtPm54dHRhaWxbUkNVX05FWFRfVEFJTF1dLAorCQkgICAiLlIiW3JkcC0+bnh0dGFpbFtSQ1VfV0FJVF9UQUlMXSAhPQorCQkJcmRwLT5ueHR0YWlsW1JDVV9ORVhUX1JFQURZX1RBSUxdXSwKKwkJICAgIi5XIltyZHAtPm54dHRhaWxbUkNVX0RPTkVfVEFJTF0gIT0KKwkJCXJkcC0+bnh0dGFpbFtSQ1VfV0FJVF9UQUlMXV0sCisJCSAgICIuRCJbJnJkcC0+bnh0bGlzdCAhPSByZHAtPm54dHRhaWxbUkNVX0RPTkVfVEFJTF1dLAorCQkgICBwZXJfY3B1KHJjdV9jcHVfaGFzX3dvcmssIHJkcC0+Y3B1KSwKKwkJICAgY29udmVydF9rdGhyZWFkX3N0YXR1cyhwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF9zdGF0dXMsCisJCQkJCSAgcmRwLT5jcHUpKSwKKwkJICAgcmRwLT5ibGltaXQpOwogCXNlcV9wcmludGYobSwgIiwlbHUsJWx1LCVsdVxuIiwKIAkJICAgcmRwLT5uX2Nic19pbnZva2VkLCByZHAtPm5fY2JzX29ycGhhbmVkLCByZHAtPm5fY2JzX2Fkb3B0ZWQpOwogfQpAQCAtMTU3LDExICsxOTQsNzYgQEAKIAkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAorI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QKKworc3RhdGljIHZvaWQgcHJpbnRfb25lX3JjdV9ub2RlX2Jvb3N0KHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHJjdV9ub2RlICpybnApCit7CisJc2VxX3ByaW50ZihtLCAgIiVkOiVkIHRhc2tzPSVjJWMlYyVjIGt0PSVjIG50Yj0lbHUgbmViPSVsdSBubmI9JWx1ICIKKwkJICAgImo9JTA0eCBidD0lMDR4XG4iLAorCQkgICBybnAtPmdycGxvLCBybnAtPmdycGhpLAorCQkgICAiVC4iW2xpc3RfZW1wdHkoJnJucC0+YmxrZF90YXNrcyldLAorCQkgICAiTi4iWyFybnAtPmdwX3Rhc2tzXSwKKwkJICAgIkUuIlshcm5wLT5leHBfdGFza3NdLAorCQkgICAiQi4iWyFybnAtPmJvb3N0X3Rhc2tzXSwKKwkJICAgY29udmVydF9rdGhyZWFkX3N0YXR1cyhybnAtPmJvb3N0X2t0aHJlYWRfc3RhdHVzKSwKKwkJICAgcm5wLT5uX3Rhc2tzX2Jvb3N0ZWQsIHJucC0+bl9leHBfYm9vc3RzLAorCQkgICBybnAtPm5fbm9ybWFsX2Jvb3N0cywKKwkJICAgKGludCkoamlmZmllcyAmIDB4ZmZmZiksCisJCSAgIChpbnQpKHJucC0+Ym9vc3RfdGltZSAmIDB4ZmZmZikpOworCXNlcV9wcmludGYobSwgIiVzOiBudD0lbHUgZWd0PSVsdSBidD0lbHUgbmI9JWx1IG55PSVsdSBub3M9JWx1XG4iLAorCQkgICAiICAgICBiYWxrIiwKKwkJICAgcm5wLT5uX2JhbGtfYmxrZF90YXNrcywKKwkJICAgcm5wLT5uX2JhbGtfZXhwX2dwX3Rhc2tzLAorCQkgICBybnAtPm5fYmFsa19ib29zdF90YXNrcywKKwkJICAgcm5wLT5uX2JhbGtfbm90YmxvY2tlZCwKKwkJICAgcm5wLT5uX2JhbGtfbm90eWV0LAorCQkgICBybnAtPm5fYmFsa19ub3MpOworfQorCitzdGF0aWMgaW50IHNob3dfcmN1X25vZGVfYm9vc3Qoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp1bnVzZWQpCit7CisJc3RydWN0IHJjdV9ub2RlICpybnA7CisKKwlyY3VfZm9yX2VhY2hfbGVhZl9ub2RlKCZyY3VfcHJlZW1wdF9zdGF0ZSwgcm5wKQorCQlwcmludF9vbmVfcmN1X25vZGVfYm9vc3QobSwgcm5wKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByY3Vfbm9kZV9ib29zdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzaG93X3JjdV9ub2RlX2Jvb3N0LCBOVUxMKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmN1X25vZGVfYm9vc3RfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IHJjdV9ub2RlX2Jvb3N0X29wZW4sCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCisvKgorICogQ3JlYXRlIHRoZSByY3Vib29zdCBkZWJ1Z2ZzIGVudHJ5LiAgU3RhbmRhcmQgZXJyb3IgcmV0dXJuLgorICovCitzdGF0aWMgaW50IHJjdV9ib29zdF90cmFjZV9jcmVhdGVfZmlsZShzdHJ1Y3QgZGVudHJ5ICpyY3VkaXIpCit7CisJcmV0dXJuICFkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyY3Vib29zdCIsIDA0NDQsIHJjdWRpciwgTlVMTCwKKwkJCQkgICAgJnJjdV9ub2RlX2Jvb3N0X2ZvcHMpOworfQorCisjZWxzZSAvKiAjaWZkZWYgQ09ORklHX1JDVV9CT09TVCAqLworCitzdGF0aWMgaW50IHJjdV9ib29zdF90cmFjZV9jcmVhdGVfZmlsZShzdHJ1Y3QgZGVudHJ5ICpyY3VkaXIpCit7CisJcmV0dXJuIDA7ICAvKiBUaGVyZSBjYW5ub3QgYmUgYW4gZXJyb3IgaWYgd2UgZGlkbid0IGNyZWF0ZSBpdCEgKi8KK30KKworI2VuZGlmIC8qICNlbHNlICNpZmRlZiBDT05GSUdfUkNVX0JPT1NUICovCisKIHN0YXRpYyB2b2lkIHByaW50X29uZV9yY3Vfc3RhdGUoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgcmN1X3N0YXRlICpyc3ApCiB7CiAJdW5zaWduZWQgbG9uZyBncG51bTsKIAlpbnQgbGV2ZWwgPSAwOwotCWludCBwaGFzZTsKIAlzdHJ1Y3QgcmN1X25vZGUgKnJucDsKIAogCWdwbnVtID0gcnNwLT5ncG51bTsKQEAgLTE3OCwxMyArMjgwLDExIEBACiAJCQlzZXFfcHV0cyhtLCAiXG4iKTsKIAkJCWxldmVsID0gcm5wLT5sZXZlbDsKIAkJfQotCQlwaGFzZSA9IGdwbnVtICYgMHgxOwotCQlzZXFfcHJpbnRmKG0sICIlbHgvJWx4ICVjJWM+JWMlYyAlZDolZCBeJWQgICAgIiwKKwkJc2VxX3ByaW50ZihtLCAiJWx4LyVseCAlYyVjPiVjICVkOiVkIF4lZCAgICAiLAogCQkJICAgcm5wLT5xc21hc2ssIHJucC0+cXNtYXNraW5pdCwKLQkJCSAgICJULiJbbGlzdF9lbXB0eSgmcm5wLT5ibG9ja2VkX3Rhc2tzW3BoYXNlXSldLAotCQkJICAgIkUuIltsaXN0X2VtcHR5KCZybnAtPmJsb2NrZWRfdGFza3NbcGhhc2UgKyAyXSldLAotCQkJICAgIlQuIltsaXN0X2VtcHR5KCZybnAtPmJsb2NrZWRfdGFza3NbIXBoYXNlXSldLAotCQkJICAgIkUuIltsaXN0X2VtcHR5KCZybnAtPmJsb2NrZWRfdGFza3NbIXBoYXNlICsgMl0pXSwKKwkJCSAgICIuRyJbcm5wLT5ncF90YXNrcyAhPSBOVUxMXSwKKwkJCSAgICIuRSJbcm5wLT5leHBfdGFza3MgIT0gTlVMTF0sCisJCQkgICAiLlQiWyFsaXN0X2VtcHR5KCZybnAtPmJsa2RfdGFza3MpXSwKIAkJCSAgIHJucC0+Z3JwbG8sIHJucC0+Z3JwaGksIHJucC0+Z3JwbnVtKTsKIAl9CiAJc2VxX3B1dHMobSwgIlxuIik7CkBAIC0yMTYsMTYgKzMxNiwzNSBAQAogCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCitzdGF0aWMgdm9pZCBzaG93X29uZV9yY3VncChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCByY3Vfc3RhdGUgKnJzcCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgY29tcGxldGVkOworCXVuc2lnbmVkIGxvbmcgZ3BudW07CisJdW5zaWduZWQgbG9uZyBncGFnZTsKKwl1bnNpZ25lZCBsb25nIGdwbWF4OworCXN0cnVjdCByY3Vfbm9kZSAqcm5wID0gJnJzcC0+bm9kZVswXTsKKworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcm5wLT5sb2NrLCBmbGFncyk7CisJY29tcGxldGVkID0gcnNwLT5jb21wbGV0ZWQ7CisJZ3BudW0gPSByc3AtPmdwbnVtOworCWlmIChyc3AtPmNvbXBsZXRlZCA9PSByc3AtPmdwbnVtKQorCQlncGFnZSA9IDA7CisJZWxzZQorCQlncGFnZSA9IGppZmZpZXMgLSByc3AtPmdwX3N0YXJ0OworCWdwbWF4ID0gcnNwLT5ncF9tYXg7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucC0+bG9jaywgZmxhZ3MpOworCXNlcV9wcmludGYobSwgIiVzOiBjb21wbGV0ZWQ9JWxkICBncG51bT0lbHUgIGFnZT0lbGQgIG1heD0lbGRcbiIsCisJCSAgIHJzcC0+bmFtZSwgY29tcGxldGVkLCBncG51bSwgZ3BhZ2UsIGdwbWF4KTsKK30KKwogc3RhdGljIGludCBzaG93X3JjdWdwKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdW51c2VkKQogewogI2lmZGVmIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVCi0Jc2VxX3ByaW50ZihtLCAicmN1X3ByZWVtcHQ6IGNvbXBsZXRlZD0lbGQgIGdwbnVtPSVsdVxuIiwKLQkJICAgcmN1X3ByZWVtcHRfc3RhdGUuY29tcGxldGVkLCByY3VfcHJlZW1wdF9zdGF0ZS5ncG51bSk7CisJc2hvd19vbmVfcmN1Z3AobSwgJnJjdV9wcmVlbXB0X3N0YXRlKTsKICNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UgKi8KLQlzZXFfcHJpbnRmKG0sICJyY3Vfc2NoZWQ6IGNvbXBsZXRlZD0lbGQgIGdwbnVtPSVsdVxuIiwKLQkJICAgcmN1X3NjaGVkX3N0YXRlLmNvbXBsZXRlZCwgcmN1X3NjaGVkX3N0YXRlLmdwbnVtKTsKLQlzZXFfcHJpbnRmKG0sICJyY3VfYmg6IGNvbXBsZXRlZD0lbGQgIGdwbnVtPSVsdVxuIiwKLQkJICAgcmN1X2JoX3N0YXRlLmNvbXBsZXRlZCwgcmN1X2JoX3N0YXRlLmdwbnVtKTsKKwlzaG93X29uZV9yY3VncChtLCAmcmN1X3NjaGVkX3N0YXRlKTsKKwlzaG93X29uZV9yY3VncChtLCAmcmN1X2JoX3N0YXRlKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjk4LDYgKzQxNywyOSBAQAogCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCitzdGF0aWMgaW50IHNob3dfcmN1dG9ydHVyZShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnVudXNlZCkKK3sKKwlzZXFfcHJpbnRmKG0sICJyY3V0b3J0dXJlIHRlc3Qgc2VxdWVuY2U6ICVsdSAlc1xuIiwKKwkJICAgcmN1dG9ydHVyZV90ZXN0c2VxID4+IDEsCisJCSAgIChyY3V0b3J0dXJlX3Rlc3RzZXEgJiAweDEpID8gIih0ZXN0IGluIHByb2dyZXNzKSIgOiAiIik7CisJc2VxX3ByaW50ZihtLCAicmN1dG9ydHVyZSB1cGRhdGUgdmVyc2lvbiBudW1iZXI6ICVsdVxuIiwKKwkJICAgcmN1dG9ydHVyZV92ZXJudW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJjdXRvcnR1cmVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgc2hvd19yY3V0b3J0dXJlLCBOVUxMKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmN1dG9ydHVyZV9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gcmN1dG9ydHVyZV9vcGVuLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKwogc3RhdGljIHN0cnVjdCBkZW50cnkgKnJjdWRpcjsKIAogc3RhdGljIGludCBfX2luaXQgcmN1dHJlZV90cmFjZV9pbml0KHZvaWQpCkBAIC0zMTgsNiArNDYwLDkgQEAKIAlpZiAoIXJldHZhbCkKIAkJZ290byBmcmVlX291dDsKIAorCWlmIChyY3VfYm9vc3RfdHJhY2VfY3JlYXRlX2ZpbGUocmN1ZGlyKSkKKwkJZ290byBmcmVlX291dDsKKwogCXJldHZhbCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInJjdWdwIiwgMDQ0NCwgcmN1ZGlyLCBOVUxMLCAmcmN1Z3BfZm9wcyk7CiAJaWYgKCFyZXR2YWwpCiAJCWdvdG8gZnJlZV9vdXQ7CkBAIC0zMzEsNiArNDc2LDExIEBACiAJCQkJCQlOVUxMLCAmcmN1X3BlbmRpbmdfZm9wcyk7CiAJaWYgKCFyZXR2YWwpCiAJCWdvdG8gZnJlZV9vdXQ7CisKKwlyZXR2YWwgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyY3V0b3J0dXJlIiwgMDQ0NCwgcmN1ZGlyLAorCQkJCQkJTlVMTCwgJnJjdXRvcnR1cmVfZm9wcyk7CisJaWYgKCFyZXR2YWwpCisJCWdvdG8gZnJlZV9vdXQ7CiAJcmV0dXJuIDA7CiBmcmVlX291dDoKIAlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUocmN1ZGlyKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC5jIGIva2VybmVsL3NjaGVkLmMKaW5kZXggMzEyZjhiOS4uYzYyYWNmNCAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkLmMKKysrIGIva2VybmVsL3NjaGVkLmMKQEAgLTIzMSw3ICsyMzEsNyBAQAogI2VuZGlmCiAKIC8qCi0gKiBzY2hlZF9kb21haW5zX211dGV4IHNlcmlhbGl6ZXMgY2FsbHMgdG8gYXJjaF9pbml0X3NjaGVkX2RvbWFpbnMsCisgKiBzY2hlZF9kb21haW5zX211dGV4IHNlcmlhbGl6ZXMgY2FsbHMgdG8gaW5pdF9zY2hlZF9kb21haW5zLAogICogZGV0YWNoX2Rlc3Ryb3lfZG9tYWlucyBhbmQgcGFydGl0aW9uX3NjaGVkX2RvbWFpbnMuCiAgKi8KIHN0YXRpYyBERUZJTkVfTVVURVgoc2NoZWRfZG9tYWluc19tdXRleCk7CkBAIC0zMTIsNiArMzEyLDkgQEAKIAogCXU2NCBleGVjX2Nsb2NrOwogCXU2NCBtaW5fdnJ1bnRpbWU7CisjaWZuZGVmIENPTkZJR182NEJJVAorCXU2NCBtaW5fdnJ1bnRpbWVfY29weTsKKyNlbmRpZgogCiAJc3RydWN0IHJiX3Jvb3QgdGFza3NfdGltZWxpbmU7CiAJc3RydWN0IHJiX25vZGUgKnJiX2xlZnRtb3N0OwpAQCAtMzI1LDcgKzMyOCw5IEBACiAJICovCiAJc3RydWN0IHNjaGVkX2VudGl0eSAqY3VyciwgKm5leHQsICpsYXN0LCAqc2tpcDsKIAorI2lmZGVmCUNPTkZJR19TQ0hFRF9ERUJVRwogCXVuc2lnbmVkIGludCBucl9zcHJlYWRfb3ZlcjsKKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQKIAlzdHJ1Y3QgcnEgKnJxOwkvKiBjcHUgcnVucXVldWUgdG8gd2hpY2ggdGhpcyBjZnNfcnEgaXMgYXR0YWNoZWQgKi8KQEAgLTQxNyw2ICs0MjIsNyBAQAogICovCiBzdHJ1Y3Qgcm9vdF9kb21haW4gewogCWF0b21pY190IHJlZmNvdW50OworCXN0cnVjdCByY3VfaGVhZCByY3U7CiAJY3B1bWFza192YXJfdCBzcGFuOwogCWNwdW1hc2tfdmFyX3Qgb25saW5lOwogCkBAIC00NjAsNyArNDY2LDcgQEAKIAl1NjQgbm9oel9zdGFtcDsKIAl1bnNpZ25lZCBjaGFyIG5vaHpfYmFsYW5jZV9raWNrOwogI2VuZGlmCi0JdW5zaWduZWQgaW50IHNraXBfY2xvY2tfdXBkYXRlOworCWludCBza2lwX2Nsb2NrX3VwZGF0ZTsKIAogCS8qIGNhcHR1cmUgbG9hZCBmcm9tICphbGwqIHRhc2tzIG9uIHRoaXMgY3B1OiAqLwogCXN0cnVjdCBsb2FkX3dlaWdodCBsb2FkOwpAQCAtNTUzLDYgKzU1OSwxMCBAQAogCXVuc2lnbmVkIGludCB0dHd1X2NvdW50OwogCXVuc2lnbmVkIGludCB0dHd1X2xvY2FsOwogI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU01QCisJc3RydWN0IHRhc2tfc3RydWN0ICp3YWtlX2xpc3Q7CisjZW5kaWYKIH07CiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVV9TSEFSRURfQUxJR05FRChzdHJ1Y3QgcnEsIHJ1bnF1ZXVlcyk7CkBAIC01NzEsNyArNTgxLDcgQEAKIAogI2RlZmluZSByY3VfZGVyZWZlcmVuY2VfY2hlY2tfc2NoZWRfZG9tYWluKHApIFwKIAlyY3VfZGVyZWZlcmVuY2VfY2hlY2soKHApLCBcCi0JCQkgICAgICByY3VfcmVhZF9sb2NrX3NjaGVkX2hlbGQoKSB8fCBcCisJCQkgICAgICByY3VfcmVhZF9sb2NrX2hlbGQoKSB8fCBcCiAJCQkgICAgICBsb2NrZGVwX2lzX2hlbGQoJnNjaGVkX2RvbWFpbnNfbXV0ZXgpKQogCiAvKgpAQCAtNTk2LDcgKzYwNiw3IEBACiAgKiBSZXR1cm4gdGhlIGdyb3VwIHRvIHdoaWNoIHRoaXMgdGFza3MgYmVsb25ncy4KICAqCiAgKiBXZSB1c2UgdGFza19zdWJzeXNfc3RhdGVfY2hlY2soKSBhbmQgZXh0ZW5kIHRoZSBSQ1UgdmVyaWZpY2F0aW9uCi0gKiB3aXRoIGxvY2tkZXBfaXNfaGVsZCgmdGFza19ycShwKS0+bG9jaykgYmVjYXVzZSBjcHVfY2dyb3VwX2F0dGFjaCgpCisgKiB3aXRoIGxvY2tkZXBfaXNfaGVsZCgmcC0+cGlfbG9jaykgYmVjYXVzZSBjcHVfY2dyb3VwX2F0dGFjaCgpCiAgKiBob2xkcyB0aGF0IGxvY2sgZm9yIGVhY2ggdGFzayBpdCBtb3ZlcyBpbnRvIHRoZSBjZ3JvdXAuIFRoZXJlZm9yZQogICogYnkgaG9sZGluZyB0aGF0IGxvY2ssIHdlIHBpbiB0aGUgdGFzayB0byB0aGUgY3VycmVudCBjZ3JvdXAuCiAgKi8KQEAgLTYwNiw3ICs2MTYsNyBAQAogCXN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3M7CiAKIAljc3MgPSB0YXNrX3N1YnN5c19zdGF0ZV9jaGVjayhwLCBjcHVfY2dyb3VwX3N1YnN5c19pZCwKLQkJCWxvY2tkZXBfaXNfaGVsZCgmdGFza19ycShwKS0+bG9jaykpOworCQkJbG9ja2RlcF9pc19oZWxkKCZwLT5waV9sb2NrKSk7CiAJdGcgPSBjb250YWluZXJfb2YoY3NzLCBzdHJ1Y3QgdGFza19ncm91cCwgY3NzKTsKIAogCXJldHVybiBhdXRvZ3JvdXBfdGFza19ncm91cChwLCB0Zyk7CkBAIC02NDIsNyArNjUyLDcgQEAKIHsKIAlzNjQgZGVsdGE7CiAKLQlpZiAocnEtPnNraXBfY2xvY2tfdXBkYXRlKQorCWlmIChycS0+c2tpcF9jbG9ja191cGRhdGUgPiAwKQogCQlyZXR1cm47CiAKIAlkZWx0YSA9IHNjaGVkX2Nsb2NrX2NwdShjcHVfb2YocnEpKSAtIHJxLT5jbG9jazsKQEAgLTgzOCwxOCArODQ4LDM5IEBACiAJcmV0dXJuIHJxLT5jdXJyID09IHA7CiB9CiAKLSNpZm5kZWYgX19BUkNIX1dBTlRfVU5MT0NLRURfQ1RYU1cKIHN0YXRpYyBpbmxpbmUgaW50IHRhc2tfcnVubmluZyhzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CisjaWZkZWYgQ09ORklHX1NNUAorCXJldHVybiBwLT5vbl9jcHU7CisjZWxzZQogCXJldHVybiB0YXNrX2N1cnJlbnQocnEsIHApOworI2VuZGlmCiB9CiAKKyNpZm5kZWYgX19BUkNIX1dBTlRfVU5MT0NLRURfQ1RYU1cKIHN0YXRpYyBpbmxpbmUgdm9pZCBwcmVwYXJlX2xvY2tfc3dpdGNoKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKIHsKKyNpZmRlZiBDT05GSUdfU01QCisJLyoKKwkgKiBXZSBjYW4gb3B0aW1pc2UgdGhpcyBvdXQgY29tcGxldGVseSBmb3IgIVNNUCwgYmVjYXVzZSB0aGUKKwkgKiBTTVAgcmViYWxhbmNpbmcgZnJvbSBpbnRlcnJ1cHQgaXMgdGhlIG9ubHkgdGhpbmcgdGhhdCBjYXJlcworCSAqIGhlcmUuCisJICovCisJbmV4dC0+b25fY3B1ID0gMTsKKyNlbmRpZgogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZmluaXNoX2xvY2tfc3dpdGNoKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldikKIHsKKyNpZmRlZiBDT05GSUdfU01QCisJLyoKKwkgKiBBZnRlciAtPm9uX2NwdSBpcyBjbGVhcmVkLCB0aGUgdGFzayBjYW4gYmUgbW92ZWQgdG8gYSBkaWZmZXJlbnQgQ1BVLgorCSAqIFdlIG11c3QgZW5zdXJlIHRoaXMgZG9lc24ndCBoYXBwZW4gdW50aWwgdGhlIHN3aXRjaCBpcyBjb21wbGV0ZWx5CisJICogZmluaXNoZWQuCisJICovCisJc21wX3dtYigpOworCXByZXYtPm9uX2NwdSA9IDA7CisjZW5kaWYKICNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKIAkvKiB0aGlzIGlzIGEgdmFsaWQgY2FzZSB3aGVuIGFub3RoZXIgdGFzayByZWxlYXNlcyB0aGUgc3BpbmxvY2sgKi8KIAlycS0+bG9jay5vd25lciA9IGN1cnJlbnQ7CkBAIC04NjUsMTUgKzg5Niw2IEBACiB9CiAKICNlbHNlIC8qIF9fQVJDSF9XQU5UX1VOTE9DS0VEX0NUWFNXICovCi1zdGF0aWMgaW5saW5lIGludCB0YXNrX3J1bm5pbmcoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwKQotewotI2lmZGVmIENPTkZJR19TTVAKLQlyZXR1cm4gcC0+b25jcHU7Ci0jZWxzZQotCXJldHVybiB0YXNrX2N1cnJlbnQocnEsIHApOwotI2VuZGlmCi19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBwcmVwYXJlX2xvY2tfc3dpdGNoKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKIHsKICNpZmRlZiBDT05GSUdfU01QCkBAIC04ODIsNyArOTA0LDcgQEAKIAkgKiBTTVAgcmViYWxhbmNpbmcgZnJvbSBpbnRlcnJ1cHQgaXMgdGhlIG9ubHkgdGhpbmcgdGhhdCBjYXJlcwogCSAqIGhlcmUuCiAJICovCi0JbmV4dC0+b25jcHUgPSAxOworCW5leHQtPm9uX2NwdSA9IDE7CiAjZW5kaWYKICNpZmRlZiBfX0FSQ0hfV0FOVF9JTlRFUlJVUFRTX09OX0NUWFNXCiAJcmF3X3NwaW5fdW5sb2NrX2lycSgmcnEtPmxvY2spOwpAQCAtODk1LDEyICs5MTcsMTIgQEAKIHsKICNpZmRlZiBDT05GSUdfU01QCiAJLyoKLQkgKiBBZnRlciAtPm9uY3B1IGlzIGNsZWFyZWQsIHRoZSB0YXNrIGNhbiBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCBDUFUuCisJICogQWZ0ZXIgLT5vbl9jcHUgaXMgY2xlYXJlZCwgdGhlIHRhc2sgY2FuIGJlIG1vdmVkIHRvIGEgZGlmZmVyZW50IENQVS4KIAkgKiBXZSBtdXN0IGVuc3VyZSB0aGlzIGRvZXNuJ3QgaGFwcGVuIHVudGlsIHRoZSBzd2l0Y2ggaXMgY29tcGxldGVseQogCSAqIGZpbmlzaGVkLgogCSAqLwogCXNtcF93bWIoKTsKLQlwcmV2LT5vbmNwdSA9IDA7CisJcHJldi0+b25fY3B1ID0gMDsKICNlbmRpZgogI2lmbmRlZiBfX0FSQ0hfV0FOVF9JTlRFUlJVUFRTX09OX0NUWFNXCiAJbG9jYWxfaXJxX2VuYWJsZSgpOwpAQCAtOTA5LDIzICs5MzEsMTUgQEAKICNlbmRpZiAvKiBfX0FSQ0hfV0FOVF9VTkxPQ0tFRF9DVFhTVyAqLwogCiAvKgotICogQ2hlY2sgd2hldGhlciB0aGUgdGFzayBpcyB3YWtpbmcsIHdlIHVzZSB0aGlzIHRvIHN5bmNocm9uaXplIC0+Y3B1c19hbGxvd2VkCi0gKiBhZ2FpbnN0IHR0d3UoKS4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgdGFza19pc193YWtpbmcoc3RydWN0IHRhc2tfc3RydWN0ICpwKQotewotCXJldHVybiB1bmxpa2VseShwLT5zdGF0ZSA9PSBUQVNLX1dBS0lORyk7Ci19Ci0KLS8qCi0gKiBfX3Rhc2tfcnFfbG9jayAtIGxvY2sgdGhlIHJ1bnF1ZXVlIGEgZ2l2ZW4gdGFzayByZXNpZGVzIG9uLgotICogTXVzdCBiZSBjYWxsZWQgaW50ZXJydXB0cyBkaXNhYmxlZC4KKyAqIF9fdGFza19ycV9sb2NrIC0gbG9jayB0aGUgcnEgQHAgcmVzaWRlcyBvbi4KICAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3QgcnEgKl9fdGFza19ycV9sb2NrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIAlfX2FjcXVpcmVzKHJxLT5sb2NrKQogewogCXN0cnVjdCBycSAqcnE7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwLT5waV9sb2NrKTsKKwogCWZvciAoOzspIHsKIAkJcnEgPSB0YXNrX3JxKHApOwogCQlyYXdfc3Bpbl9sb2NrKCZycS0+bG9jayk7CkBAIC05MzYsMjIgKzk1MCwyMiBAQAogfQogCiAvKgotICogdGFza19ycV9sb2NrIC0gbG9jayB0aGUgcnVucXVldWUgYSBnaXZlbiB0YXNrIHJlc2lkZXMgb24gYW5kIGRpc2FibGUKLSAqIGludGVycnVwdHMuIE5vdGUgdGhlIG9yZGVyaW5nOiB3ZSBjYW4gc2FmZWx5IGxvb2t1cCB0aGUgdGFza19ycSB3aXRob3V0Ci0gKiBleHBsaWNpdGx5IGRpc2FibGluZyBwcmVlbXB0aW9uLgorICogdGFza19ycV9sb2NrIC0gbG9jayBwLT5waV9sb2NrIGFuZCBsb2NrIHRoZSBycSBAcCByZXNpZGVzIG9uLgogICovCiBzdGF0aWMgc3RydWN0IHJxICp0YXNrX3JxX2xvY2soc3RydWN0IHRhc2tfc3RydWN0ICpwLCB1bnNpZ25lZCBsb25nICpmbGFncykKKwlfX2FjcXVpcmVzKHAtPnBpX2xvY2spCiAJX19hY3F1aXJlcyhycS0+bG9jaykKIHsKIAlzdHJ1Y3QgcnEgKnJxOwogCiAJZm9yICg7OykgewotCQlsb2NhbF9pcnFfc2F2ZSgqZmxhZ3MpOworCQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnAtPnBpX2xvY2ssICpmbGFncyk7CiAJCXJxID0gdGFza19ycShwKTsKIAkJcmF3X3NwaW5fbG9jaygmcnEtPmxvY2spOwogCQlpZiAobGlrZWx5KHJxID09IHRhc2tfcnEocCkpKQogCQkJcmV0dXJuIHJxOwotCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnEtPmxvY2ssICpmbGFncyk7CisJCXJhd19zcGluX3VubG9jaygmcnEtPmxvY2spOworCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcC0+cGlfbG9jaywgKmZsYWdzKTsKIAl9CiB9CiAKQEAgLTk2MSwxMCArOTc1LDEzIEBACiAJcmF3X3NwaW5fdW5sb2NrKCZycS0+bG9jayk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB0YXNrX3JxX3VubG9jayhzdHJ1Y3QgcnEgKnJxLCB1bnNpZ25lZCBsb25nICpmbGFncykKK3N0YXRpYyBpbmxpbmUgdm9pZAordGFza19ycV91bmxvY2soc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwLCB1bnNpZ25lZCBsb25nICpmbGFncykKIAlfX3JlbGVhc2VzKHJxLT5sb2NrKQorCV9fcmVsZWFzZXMocC0+cGlfbG9jaykKIHsKLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnEtPmxvY2ssICpmbGFncyk7CisJcmF3X3NwaW5fdW5sb2NrKCZycS0+bG9jayk7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnAtPnBpX2xvY2ssICpmbGFncyk7CiB9CiAKIC8qCkBAIC0xMTkzLDExICsxMjEwLDE3IEBACiAJaW50IGk7CiAJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7CiAKKwlyY3VfcmVhZF9sb2NrKCk7CiAJZm9yX2VhY2hfZG9tYWluKGNwdSwgc2QpIHsKLQkJZm9yX2VhY2hfY3B1KGksIHNjaGVkX2RvbWFpbl9zcGFuKHNkKSkKLQkJCWlmICghaWRsZV9jcHUoaSkpCi0JCQkJcmV0dXJuIGk7CisJCWZvcl9lYWNoX2NwdShpLCBzY2hlZF9kb21haW5fc3BhbihzZCkpIHsKKwkJCWlmICghaWRsZV9jcHUoaSkpIHsKKwkJCQljcHUgPSBpOworCQkJCWdvdG8gdW5sb2NrOworCQkJfQorCQl9CiAJfQordW5sb2NrOgorCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiBjcHU7CiB9CiAvKgpAQCAtMTMwNywxNSArMTMzMCwxNSBAQAogewogCXU2NCB0bXA7CiAKKwl0bXAgPSAodTY0KWRlbHRhX2V4ZWMgKiB3ZWlnaHQ7CisKIAlpZiAoIWx3LT5pbnZfd2VpZ2h0KSB7CiAJCWlmIChCSVRTX1BFUl9MT05HID4gMzIgJiYgdW5saWtlbHkobHctPndlaWdodCA+PSBXTVVMVF9DT05TVCkpCiAJCQlsdy0+aW52X3dlaWdodCA9IDE7CiAJCWVsc2UKLQkJCWx3LT5pbnZfd2VpZ2h0ID0gMSArIChXTVVMVF9DT05TVC1sdy0+d2VpZ2h0LzIpCi0JCQkJLyAobHctPndlaWdodCsxKTsKKwkJCWx3LT5pbnZfd2VpZ2h0ID0gV01VTFRfQ09OU1QgLyBsdy0+d2VpZ2h0OwogCX0KIAotCXRtcCA9ICh1NjQpZGVsdGFfZXhlYyAqIHdlaWdodDsKIAkvKgogCSAqIENoZWNrIHdoZXRoZXIgd2UnZCBvdmVyZmxvdyB0aGUgNjQtYml0IG11bHRpcGxpY2F0aW9uOgogCSAqLwpAQCAtMTc3Myw3ICsxNzk2LDYgQEAKIAl1cGRhdGVfcnFfY2xvY2socnEpOwogCXNjaGVkX2luZm9fcXVldWVkKHApOwogCXAtPnNjaGVkX2NsYXNzLT5lbnF1ZXVlX3Rhc2socnEsIHAsIGZsYWdzKTsKLQlwLT5zZS5vbl9ycSA9IDE7CiB9CiAKIHN0YXRpYyB2b2lkIGRlcXVldWVfdGFzayhzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBmbGFncykKQEAgLTE3ODEsNyArMTgwMyw2IEBACiAJdXBkYXRlX3JxX2Nsb2NrKHJxKTsKIAlzY2hlZF9pbmZvX2RlcXVldWVkKHApOwogCXAtPnNjaGVkX2NsYXNzLT5kZXF1ZXVlX3Rhc2socnEsIHAsIGZsYWdzKTsKLQlwLT5zZS5vbl9ycSA9IDA7CiB9CiAKIC8qCkBAIC0yMTE2LDcgKzIxMzcsNyBAQAogCSAqIEEgcXVldWUgZXZlbnQgaGFzIG9jY3VycmVkLCBhbmQgd2UncmUgZ29pbmcgdG8gc2NoZWR1bGUuICBJbgogCSAqIHRoaXMgY2FzZSwgd2UgY2FuIHNhdmUgYSB1c2VsZXNzIGJhY2sgdG8gYmFjayBjbG9jayB1cGRhdGUuCiAJICovCi0JaWYgKHJxLT5jdXJyLT5zZS5vbl9ycSAmJiB0ZXN0X3Rza19uZWVkX3Jlc2NoZWQocnEtPmN1cnIpKQorCWlmIChycS0+Y3Vyci0+b25fcnEgJiYgdGVzdF90c2tfbmVlZF9yZXNjaGVkKHJxLT5jdXJyKSkKIAkJcnEtPnNraXBfY2xvY2tfdXBkYXRlID0gMTsKIH0KIApAQCAtMjE2Miw2ICsyMTgzLDExIEBACiAJICovCiAJV0FSTl9PTl9PTkNFKHAtPnN0YXRlICE9IFRBU0tfUlVOTklORyAmJiBwLT5zdGF0ZSAhPSBUQVNLX1dBS0lORyAmJgogCQkJISh0YXNrX3RocmVhZF9pbmZvKHApLT5wcmVlbXB0X2NvdW50ICYgUFJFRU1QVF9BQ1RJVkUpKTsKKworI2lmZGVmIENPTkZJR19MT0NLREVQCisJV0FSTl9PTl9PTkNFKGRlYnVnX2xvY2tzICYmICEobG9ja2RlcF9pc19oZWxkKCZwLT5waV9sb2NrKSB8fAorCQkJCSAgICAgIGxvY2tkZXBfaXNfaGVsZCgmdGFza19ycShwKS0+bG9jaykpKTsKKyNlbmRpZgogI2VuZGlmCiAKIAl0cmFjZV9zY2hlZF9taWdyYXRlX3Rhc2socCwgbmV3X2NwdSk7CkBAIC0yMTgyLDE5ICsyMjA4LDYgQEAKIHN0YXRpYyBpbnQgbWlncmF0aW9uX2NwdV9zdG9wKHZvaWQgKmRhdGEpOwogCiAvKgotICogVGhlIHRhc2sncyBydW5xdWV1ZSBsb2NrIG11c3QgYmUgaGVsZC4KLSAqIFJldHVybnMgdHJ1ZSBpZiB5b3UgaGF2ZSB0byB3YWl0IGZvciBtaWdyYXRpb24gdGhyZWFkLgotICovCi1zdGF0aWMgYm9vbCBtaWdyYXRlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3QgcnEgKnJxKQotewotCS8qCi0JICogSWYgdGhlIHRhc2sgaXMgbm90IG9uIGEgcnVucXVldWUgKGFuZCBub3QgcnVubmluZyksIHRoZW4KLQkgKiB0aGUgbmV4dCB3YWtlLXVwIHdpbGwgcHJvcGVybHkgcGxhY2UgdGhlIHRhc2suCi0JICovCi0JcmV0dXJuIHAtPnNlLm9uX3JxIHx8IHRhc2tfcnVubmluZyhycSwgcCk7Ci19Ci0KLS8qCiAgKiB3YWl0X3Rhc2tfaW5hY3RpdmUgLSB3YWl0IGZvciBhIHRocmVhZCB0byB1bnNjaGVkdWxlLgogICoKICAqIElmIEBtYXRjaF9zdGF0ZSBpcyBub256ZXJvLCBpdCdzIHRoZSBAcC0+c3RhdGUgdmFsdWUganVzdCBjaGVja2VkIGFuZApAQCAtMjI1MSwxMSArMjI2NCwxMSBAQAogCQlycSA9IHRhc2tfcnFfbG9jayhwLCAmZmxhZ3MpOwogCQl0cmFjZV9zY2hlZF93YWl0X3Rhc2socCk7CiAJCXJ1bm5pbmcgPSB0YXNrX3J1bm5pbmcocnEsIHApOwotCQlvbl9ycSA9IHAtPnNlLm9uX3JxOworCQlvbl9ycSA9IHAtPm9uX3JxOwogCQluY3N3ID0gMDsKIAkJaWYgKCFtYXRjaF9zdGF0ZSB8fCBwLT5zdGF0ZSA9PSBtYXRjaF9zdGF0ZSkKIAkJCW5jc3cgPSBwLT5udmNzdyB8IExPTkdfTUlOOyAvKiBzZXRzIE1TQiAqLwotCQl0YXNrX3JxX3VubG9jayhycSwgJmZsYWdzKTsKKwkJdGFza19ycV91bmxvY2socnEsIHAsICZmbGFncyk7CiAKIAkJLyoKIAkJICogSWYgaXQgY2hhbmdlZCBmcm9tIHRoZSBleHBlY3RlZCBzdGF0ZSwgYmFpbCBvdXQgbm93LgpAQCAtMjMzMCw3ICsyMzQzLDcgQEAKIAogI2lmZGVmIENPTkZJR19TTVAKIC8qCi0gKiAtPmNwdXNfYWxsb3dlZCBpcyBwcm90ZWN0ZWQgYnkgZWl0aGVyIFRBU0tfV0FLSU5HIG9yIHJxLT5sb2NrIGhlbGQuCisgKiAtPmNwdXNfYWxsb3dlZCBpcyBwcm90ZWN0ZWQgYnkgYm90aCBycS0+bG9jayBhbmQgcC0+cGlfbG9jawogICovCiBzdGF0aWMgaW50IHNlbGVjdF9mYWxsYmFja19ycShpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CkBAIC0yMzYzLDEyICsyMzc2LDEyIEBACiB9CiAKIC8qCi0gKiBUaGUgY2FsbGVyIChmb3JrLCB3YWtldXApIG93bnMgVEFTS19XQUtJTkcsIC0+Y3B1c19hbGxvd2VkIGlzIHN0YWJsZS4KKyAqIFRoZSBjYWxsZXIgKGZvcmssIHdha2V1cCkgb3ducyBwLT5waV9sb2NrLCAtPmNwdXNfYWxsb3dlZCBpcyBzdGFibGUuCiAgKi8KIHN0YXRpYyBpbmxpbmUKLWludCBzZWxlY3RfdGFza19ycShzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBzZF9mbGFncywgaW50IHdha2VfZmxhZ3MpCitpbnQgc2VsZWN0X3Rhc2tfcnEoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgc2RfZmxhZ3MsIGludCB3YWtlX2ZsYWdzKQogewotCWludCBjcHUgPSBwLT5zY2hlZF9jbGFzcy0+c2VsZWN0X3Rhc2tfcnEocnEsIHAsIHNkX2ZsYWdzLCB3YWtlX2ZsYWdzKTsKKwlpbnQgY3B1ID0gcC0+c2NoZWRfY2xhc3MtPnNlbGVjdF90YXNrX3JxKHAsIHNkX2ZsYWdzLCB3YWtlX2ZsYWdzKTsKIAogCS8qCiAJICogSW4gb3JkZXIgbm90IHRvIGNhbGwgc2V0X3Rhc2tfY3B1KCkgb24gYSBibG9ja2luZyB0YXNrIHdlIG5lZWQKQEAgLTIzOTQsMjcgKzI0MDcsNjIgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW5saW5lIHZvaWQgdHR3dV9hY3RpdmF0ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBycSAqcnEsCi0JCQkJIGJvb2wgaXNfc3luYywgYm9vbCBpc19taWdyYXRlLCBib29sIGlzX2xvY2FsLAotCQkJCSB1bnNpZ25lZCBsb25nIGVuX2ZsYWdzKQorc3RhdGljIHZvaWQKK3R0d3Vfc3RhdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBjcHUsIGludCB3YWtlX2ZsYWdzKQogewotCXNjaGVkc3RhdF9pbmMocCwgc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzKTsKLQlpZiAoaXNfc3luYykKLQkJc2NoZWRzdGF0X2luYyhwLCBzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfc3luYyk7Ci0JaWYgKGlzX21pZ3JhdGUpCi0JCXNjaGVkc3RhdF9pbmMocCwgc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX21pZ3JhdGUpOwotCWlmIChpc19sb2NhbCkKLQkJc2NoZWRzdGF0X2luYyhwLCBzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfbG9jYWwpOwotCWVsc2UKLQkJc2NoZWRzdGF0X2luYyhwLCBzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfcmVtb3RlKTsKKyNpZmRlZiBDT05GSUdfU0NIRURTVEFUUworCXN0cnVjdCBycSAqcnEgPSB0aGlzX3JxKCk7CiAKLQlhY3RpdmF0ZV90YXNrKHJxLCBwLCBlbl9mbGFncyk7CisjaWZkZWYgQ09ORklHX1NNUAorCWludCB0aGlzX2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCWlmIChjcHUgPT0gdGhpc19jcHUpIHsKKwkJc2NoZWRzdGF0X2luYyhycSwgdHR3dV9sb2NhbCk7CisJCXNjaGVkc3RhdF9pbmMocCwgc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX2xvY2FsKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKKworCQlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19yZW1vdGUpOworCQlyY3VfcmVhZF9sb2NrKCk7CisJCWZvcl9lYWNoX2RvbWFpbih0aGlzX2NwdSwgc2QpIHsKKwkJCWlmIChjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgc2NoZWRfZG9tYWluX3NwYW4oc2QpKSkgeworCQkJCXNjaGVkc3RhdF9pbmMoc2QsIHR0d3Vfd2FrZV9yZW1vdGUpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJjdV9yZWFkX3VubG9jaygpOworCX0KKyNlbmRpZiAvKiBDT05GSUdfU01QICovCisKKwlzY2hlZHN0YXRfaW5jKHJxLCB0dHd1X2NvdW50KTsKKwlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwcyk7CisKKwlpZiAod2FrZV9mbGFncyAmIFdGX1NZTkMpCisJCXNjaGVkc3RhdF9pbmMocCwgc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX3N5bmMpOworCisJaWYgKGNwdSAhPSB0YXNrX2NwdShwKSkKKwkJc2NoZWRzdGF0X2luYyhwLCBzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfbWlncmF0ZSk7CisKKyNlbmRpZiAvKiBDT05GSUdfU0NIRURTVEFUUyAqLwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdHR3dV9wb3N0X2FjdGl2YXRpb24oc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3QgcnEgKnJxLAotCQkJCQlpbnQgd2FrZV9mbGFncywgYm9vbCBzdWNjZXNzKQorc3RhdGljIHZvaWQgdHR3dV9hY3RpdmF0ZShzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBlbl9mbGFncykKIHsKLQl0cmFjZV9zY2hlZF93YWtldXAocCwgc3VjY2Vzcyk7CisJYWN0aXZhdGVfdGFzayhycSwgcCwgZW5fZmxhZ3MpOworCXAtPm9uX3JxID0gMTsKKworCS8qIGlmIGEgd29ya2VyIGlzIHdha2luZyB1cCwgbm90aWZ5IHdvcmtxdWV1ZSAqLworCWlmIChwLT5mbGFncyAmIFBGX1dRX1dPUktFUikKKwkJd3Ffd29ya2VyX3dha2luZ191cChwLCBjcHVfb2YocnEpKTsKK30KKworLyoKKyAqIE1hcmsgdGhlIHRhc2sgcnVubmFibGUgYW5kIHBlcmZvcm0gd2FrZXVwLXByZWVtcHRpb24uCisgKi8KK3N0YXRpYyB2b2lkCit0dHd1X2RvX3dha2V1cChzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCB3YWtlX2ZsYWdzKQoreworCXRyYWNlX3NjaGVkX3dha2V1cChwLCB0cnVlKTsKIAljaGVja19wcmVlbXB0X2N1cnIocnEsIHAsIHdha2VfZmxhZ3MpOwogCiAJcC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CkBAIC0yNDMzLDkgKzI0ODEsOTkgQEAKIAkJcnEtPmlkbGVfc3RhbXAgPSAwOwogCX0KICNlbmRpZgotCS8qIGlmIGEgd29ya2VyIGlzIHdha2luZyB1cCwgbm90aWZ5IHdvcmtxdWV1ZSAqLwotCWlmICgocC0+ZmxhZ3MgJiBQRl9XUV9XT1JLRVIpICYmIHN1Y2Nlc3MpCi0JCXdxX3dvcmtlcl93YWtpbmdfdXAocCwgY3B1X29mKHJxKSk7Cit9CisKK3N0YXRpYyB2b2lkCit0dHd1X2RvX2FjdGl2YXRlKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IHdha2VfZmxhZ3MpCit7CisjaWZkZWYgQ09ORklHX1NNUAorCWlmIChwLT5zY2hlZF9jb250cmlidXRlc190b19sb2FkKQorCQlycS0+bnJfdW5pbnRlcnJ1cHRpYmxlLS07CisjZW5kaWYKKworCXR0d3VfYWN0aXZhdGUocnEsIHAsIEVOUVVFVUVfV0FLRVVQIHwgRU5RVUVVRV9XQUtJTkcpOworCXR0d3VfZG9fd2FrZXVwKHJxLCBwLCB3YWtlX2ZsYWdzKTsKK30KKworLyoKKyAqIENhbGxlZCBpbiBjYXNlIHRoZSB0YXNrIEBwIGlzbid0IGZ1bGx5IGRlc2NoZWR1bGVkIGZyb20gaXRzIHJ1bnF1ZXVlLAorICogaW4gdGhpcyBjYXNlIHdlIG11c3QgZG8gYSByZW1vdGUgd2FrZXVwLiBJdHMgYSAnbGlnaHQnIHdha2V1cCB0aG91Z2gsCisgKiBzaW5jZSBhbGwgd2UgbmVlZCB0byBkbyBpcyBmbGlwIHAtPnN0YXRlIHRvIFRBU0tfUlVOTklORywgc2luY2UKKyAqIHRoZSB0YXNrIGlzIHN0aWxsIC0+b25fcnEuCisgKi8KK3N0YXRpYyBpbnQgdHR3dV9yZW1vdGUoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgd2FrZV9mbGFncykKK3sKKwlzdHJ1Y3QgcnEgKnJxOworCWludCByZXQgPSAwOworCisJcnEgPSBfX3Rhc2tfcnFfbG9jayhwKTsKKwlpZiAocC0+b25fcnEpIHsKKwkJdHR3dV9kb193YWtldXAocnEsIHAsIHdha2VfZmxhZ3MpOworCQlyZXQgPSAxOworCX0KKwlfX3Rhc2tfcnFfdW5sb2NrKHJxKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfU01QCitzdGF0aWMgdm9pZCBzY2hlZF90dHd1X3BlbmRpbmcodm9pZCkKK3sKKwlzdHJ1Y3QgcnEgKnJxID0gdGhpc19ycSgpOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqbGlzdCA9IHhjaGcoJnJxLT53YWtlX2xpc3QsIE5VTEwpOworCisJaWYgKCFsaXN0KQorCQlyZXR1cm47CisKKwlyYXdfc3Bpbl9sb2NrKCZycS0+bG9jayk7CisKKwl3aGlsZSAobGlzdCkgeworCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAgPSBsaXN0OworCQlsaXN0ID0gbGlzdC0+d2FrZV9lbnRyeTsKKwkJdHR3dV9kb19hY3RpdmF0ZShycSwgcCwgMCk7CisJfQorCisJcmF3X3NwaW5fdW5sb2NrKCZycS0+bG9jayk7Cit9CisKK3ZvaWQgc2NoZWR1bGVyX2lwaSh2b2lkKQoreworCXNjaGVkX3R0d3VfcGVuZGluZygpOworfQorCitzdGF0aWMgdm9pZCB0dHd1X3F1ZXVlX3JlbW90ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBjcHUpCit7CisJc3RydWN0IHJxICpycSA9IGNwdV9ycShjcHUpOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCA9IHJxLT53YWtlX2xpc3Q7CisKKwlmb3IgKDs7KSB7CisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqb2xkID0gbmV4dDsKKworCQlwLT53YWtlX2VudHJ5ID0gbmV4dDsKKwkJbmV4dCA9IGNtcHhjaGcoJnJxLT53YWtlX2xpc3QsIG9sZCwgcCk7CisJCWlmIChuZXh0ID09IG9sZCkKKwkJCWJyZWFrOworCX0KKworCWlmICghbmV4dCkKKwkJc21wX3NlbmRfcmVzY2hlZHVsZShjcHUpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHR0d3VfcXVldWUoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgY3B1KQoreworCXN0cnVjdCBycSAqcnEgPSBjcHVfcnEoY3B1KTsKKworI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgJiYgZGVmaW5lZChDT05GSUdfU0NIRURfVFRXVV9RVUVVRSkKKwlpZiAoc2NoZWRfZmVhdChUVFdVX1FVRVVFKSAmJiBjcHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKSB7CisJCXR0d3VfcXVldWVfcmVtb3RlKHAsIGNwdSk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKworCXJhd19zcGluX2xvY2soJnJxLT5sb2NrKTsKKwl0dHd1X2RvX2FjdGl2YXRlKHJxLCBwLCAwKTsKKwlyYXdfc3Bpbl91bmxvY2soJnJxLT5sb2NrKTsKIH0KIAogLyoqCkBAIC0yNDUzLDkyICsyNTkxLDY0IEBACiAgKiBSZXR1cm5zICV0cnVlIGlmIEBwIHdhcyB3b2tlbiB1cCwgJWZhbHNlIGlmIGl0IHdhcyBhbHJlYWR5IHJ1bm5pbmcKICAqIG9yIEBzdGF0ZSBkaWRuJ3QgbWF0Y2ggQHAncyBzdGF0ZS4KICAqLwotc3RhdGljIGludCB0cnlfdG9fd2FrZV91cChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHVuc2lnbmVkIGludCBzdGF0ZSwKLQkJCSAgaW50IHdha2VfZmxhZ3MpCitzdGF0aWMgaW50Cit0cnlfdG9fd2FrZV91cChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHVuc2lnbmVkIGludCBzdGF0ZSwgaW50IHdha2VfZmxhZ3MpCiB7Ci0JaW50IGNwdSwgb3JpZ19jcHUsIHRoaXNfY3B1LCBzdWNjZXNzID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgZW5fZmxhZ3MgPSBFTlFVRVVFX1dBS0VVUDsKLQlzdHJ1Y3QgcnEgKnJxOwotCi0JdGhpc19jcHUgPSBnZXRfY3B1KCk7CisJaW50IGNwdSwgc3VjY2VzcyA9IDA7CiAKIAlzbXBfd21iKCk7Ci0JcnEgPSB0YXNrX3JxX2xvY2socCwgJmZsYWdzKTsKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnAtPnBpX2xvY2ssIGZsYWdzKTsKIAlpZiAoIShwLT5zdGF0ZSAmIHN0YXRlKSkKIAkJZ290byBvdXQ7CiAKLQlpZiAocC0+c2Uub25fcnEpCi0JCWdvdG8gb3V0X3J1bm5pbmc7Ci0KKwlzdWNjZXNzID0gMTsgLyogd2UncmUgZ29pbmcgdG8gY2hhbmdlIC0+c3RhdGUgKi8KIAljcHUgPSB0YXNrX2NwdShwKTsKLQlvcmlnX2NwdSA9IGNwdTsKKworCWlmIChwLT5vbl9ycSAmJiB0dHd1X3JlbW90ZShwLCB3YWtlX2ZsYWdzKSkKKwkJZ290byBzdGF0OwogCiAjaWZkZWYgQ09ORklHX1NNUAotCWlmICh1bmxpa2VseSh0YXNrX3J1bm5pbmcocnEsIHApKSkKLQkJZ290byBvdXRfYWN0aXZhdGU7Ci0KIAkvKgotCSAqIEluIG9yZGVyIHRvIGhhbmRsZSBjb25jdXJyZW50IHdha2V1cHMgYW5kIHJlbGVhc2UgdGhlIHJxLT5sb2NrCi0JICogd2UgcHV0IHRoZSB0YXNrIGluIFRBU0tfV0FLSU5HIHN0YXRlLgotCSAqCi0JICogRmlyc3QgZml4IHVwIHRoZSBucl91bmludGVycnVwdGlibGUgY291bnQ6CisJICogSWYgdGhlIG93bmluZyAocmVtb3RlKSBjcHUgaXMgc3RpbGwgaW4gdGhlIG1pZGRsZSBvZiBzY2hlZHVsZSgpIHdpdGgKKwkgKiB0aGlzIHRhc2sgYXMgcHJldiwgd2FpdCB1bnRpbCBpdHMgZG9uZSByZWZlcmVuY2luZyB0aGUgdGFzay4KIAkgKi8KLQlpZiAodGFza19jb250cmlidXRlc190b19sb2FkKHApKSB7Ci0JCWlmIChsaWtlbHkoY3B1X29ubGluZShvcmlnX2NwdSkpKQotCQkJcnEtPm5yX3VuaW50ZXJydXB0aWJsZS0tOwotCQllbHNlCi0JCQl0aGlzX3JxKCktPm5yX3VuaW50ZXJydXB0aWJsZS0tOworCXdoaWxlIChwLT5vbl9jcHUpIHsKKyNpZmRlZiBfX0FSQ0hfV0FOVF9JTlRFUlJVUFRTX09OX0NUWFNXCisJCS8qCisJCSAqIElmIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0IHdlIGNvdWxkIGhhdmUgbGFuZGVkIGluIHRoZQorCQkgKiBtaWRkbGUgb2Ygc2NoZWR1bGUoKSwgaW4gdGhpcyBjYXNlIHdlIHNob3VsZCB0YWtlIGNhcmUgbm90CisJCSAqIHRvIHNwaW4gb24gLT5vbl9jcHUgaWYgcCBpcyBjdXJyZW50LCBzaW5jZSB0aGF0IHdvdWxkCisJCSAqIGRlYWRsb2NrLgorCQkgKi8KKwkJaWYgKHAgPT0gY3VycmVudCkgeworCQkJdHR3dV9xdWV1ZShwLCBjcHUpOworCQkJZ290byBzdGF0OworCQl9CisjZW5kaWYKKwkJY3B1X3JlbGF4KCk7CiAJfQorCS8qCisJICogUGFpcnMgd2l0aCB0aGUgc21wX3dtYigpIGluIGZpbmlzaF9sb2NrX3N3aXRjaCgpLgorCSAqLworCXNtcF9ybWIoKTsKKworCXAtPnNjaGVkX2NvbnRyaWJ1dGVzX3RvX2xvYWQgPSAhIXRhc2tfY29udHJpYnV0ZXNfdG9fbG9hZChwKTsKIAlwLT5zdGF0ZSA9IFRBU0tfV0FLSU5HOwogCi0JaWYgKHAtPnNjaGVkX2NsYXNzLT50YXNrX3dha2luZykgewotCQlwLT5zY2hlZF9jbGFzcy0+dGFza193YWtpbmcocnEsIHApOwotCQllbl9mbGFncyB8PSBFTlFVRVVFX1dBS0lORzsKLQl9CisJaWYgKHAtPnNjaGVkX2NsYXNzLT50YXNrX3dha2luZykKKwkJcC0+c2NoZWRfY2xhc3MtPnRhc2tfd2FraW5nKHApOwogCi0JY3B1ID0gc2VsZWN0X3Rhc2tfcnEocnEsIHAsIFNEX0JBTEFOQ0VfV0FLRSwgd2FrZV9mbGFncyk7Ci0JaWYgKGNwdSAhPSBvcmlnX2NwdSkKKwljcHUgPSBzZWxlY3RfdGFza19ycShwLCBTRF9CQUxBTkNFX1dBS0UsIHdha2VfZmxhZ3MpOworCWlmICh0YXNrX2NwdShwKSAhPSBjcHUpCiAJCXNldF90YXNrX2NwdShwLCBjcHUpOwotCV9fdGFza19ycV91bmxvY2socnEpOwotCi0JcnEgPSBjcHVfcnEoY3B1KTsKLQlyYXdfc3Bpbl9sb2NrKCZycS0+bG9jayk7Ci0KLQkvKgotCSAqIFdlIG1pZ3JhdGVkIHRoZSB0YXNrIHdpdGhvdXQgaG9sZGluZyBlaXRoZXIgcnEtPmxvY2ssIGhvd2V2ZXIKLQkgKiBzaW5jZSB0aGUgdGFzayBpcyBub3Qgb24gdGhlIHRhc2sgbGlzdCBpdHNlbGYsIG5vYm9keSBlbHNlCi0JICogd2lsbCB0cnkgYW5kIG1pZ3JhdGUgdGhlIHRhc2ssIGhlbmNlIHRoZSBycSBzaG91bGQgbWF0Y2ggdGhlCi0JICogY3B1IHdlIGp1c3QgbW92ZWQgaXQgdG8uCi0JICovCi0JV0FSTl9PTih0YXNrX2NwdShwKSAhPSBjcHUpOwotCVdBUk5fT04ocC0+c3RhdGUgIT0gVEFTS19XQUtJTkcpOwotCi0jaWZkZWYgQ09ORklHX1NDSEVEU1RBVFMKLQlzY2hlZHN0YXRfaW5jKHJxLCB0dHd1X2NvdW50KTsKLQlpZiAoY3B1ID09IHRoaXNfY3B1KQotCQlzY2hlZHN0YXRfaW5jKHJxLCB0dHd1X2xvY2FsKTsKLQllbHNlIHsKLQkJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7Ci0JCWZvcl9lYWNoX2RvbWFpbih0aGlzX2NwdSwgc2QpIHsKLQkJCWlmIChjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgc2NoZWRfZG9tYWluX3NwYW4oc2QpKSkgewotCQkJCXNjaGVkc3RhdF9pbmMoc2QsIHR0d3Vfd2FrZV9yZW1vdGUpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotI2VuZGlmIC8qIENPTkZJR19TQ0hFRFNUQVRTICovCi0KLW91dF9hY3RpdmF0ZToKICNlbmRpZiAvKiBDT05GSUdfU01QICovCi0JdHR3dV9hY3RpdmF0ZShwLCBycSwgd2FrZV9mbGFncyAmIFdGX1NZTkMsIG9yaWdfY3B1ICE9IGNwdSwKLQkJICAgICAgY3B1ID09IHRoaXNfY3B1LCBlbl9mbGFncyk7Ci0Jc3VjY2VzcyA9IDE7Ci1vdXRfcnVubmluZzoKLQl0dHd1X3Bvc3RfYWN0aXZhdGlvbihwLCBycSwgd2FrZV9mbGFncywgc3VjY2Vzcyk7CisKKwl0dHd1X3F1ZXVlKHAsIGNwdSk7CitzdGF0OgorCXR0d3Vfc3RhdChwLCBjcHUsIHdha2VfZmxhZ3MpOwogb3V0OgotCXRhc2tfcnFfdW5sb2NrKHJxLCAmZmxhZ3MpOwotCXB1dF9jcHUoKTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcC0+cGlfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIHN1Y2Nlc3M7CiB9CkBAIC0yNTQ3LDMxICsyNjU3LDM0IEBACiAgKiB0cnlfdG9fd2FrZV91cF9sb2NhbCAtIHRyeSB0byB3YWtlIHVwIGEgbG9jYWwgdGFzayB3aXRoIHJxIGxvY2sgaGVsZAogICogQHA6IHRoZSB0aHJlYWQgdG8gYmUgYXdha2VuZWQKICAqCi0gKiBQdXQgQHAgb24gdGhlIHJ1bi1xdWV1ZSBpZiBpdCdzIG5vdCBhbHJlYWR5IHRoZXJlLiAgVGhlIGNhbGxlciBtdXN0CisgKiBQdXQgQHAgb24gdGhlIHJ1bi1xdWV1ZSBpZiBpdCdzIG5vdCBhbHJlYWR5IHRoZXJlLiBUaGUgY2FsbGVyIG11c3QKICAqIGVuc3VyZSB0aGF0IHRoaXNfcnEoKSBpcyBsb2NrZWQsIEBwIGlzIGJvdW5kIHRvIHRoaXNfcnEoKSBhbmQgbm90Ci0gKiB0aGUgY3VycmVudCB0YXNrLiAgdGhpc19ycSgpIHN0YXlzIGxvY2tlZCBvdmVyIGludm9jYXRpb24uCisgKiB0aGUgY3VycmVudCB0YXNrLgogICovCiBzdGF0aWMgdm9pZCB0cnlfdG9fd2FrZV91cF9sb2NhbChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJc3RydWN0IHJxICpycSA9IHRhc2tfcnEocCk7Ci0JYm9vbCBzdWNjZXNzID0gZmFsc2U7CiAKIAlCVUdfT04ocnEgIT0gdGhpc19ycSgpKTsKIAlCVUdfT04ocCA9PSBjdXJyZW50KTsKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZycS0+bG9jayk7CiAKLQlpZiAoIShwLT5zdGF0ZSAmIFRBU0tfTk9STUFMKSkKLQkJcmV0dXJuOwotCi0JaWYgKCFwLT5zZS5vbl9ycSkgewotCQlpZiAobGlrZWx5KCF0YXNrX3J1bm5pbmcocnEsIHApKSkgewotCQkJc2NoZWRzdGF0X2luYyhycSwgdHR3dV9jb3VudCk7Ci0JCQlzY2hlZHN0YXRfaW5jKHJxLCB0dHd1X2xvY2FsKTsKLQkJfQotCQl0dHd1X2FjdGl2YXRlKHAsIHJxLCBmYWxzZSwgZmFsc2UsIHRydWUsIEVOUVVFVUVfV0FLRVVQKTsKLQkJc3VjY2VzcyA9IHRydWU7CisJaWYgKCFyYXdfc3Bpbl90cnlsb2NrKCZwLT5waV9sb2NrKSkgeworCQlyYXdfc3Bpbl91bmxvY2soJnJxLT5sb2NrKTsKKwkJcmF3X3NwaW5fbG9jaygmcC0+cGlfbG9jayk7CisJCXJhd19zcGluX2xvY2soJnJxLT5sb2NrKTsKIAl9Ci0JdHR3dV9wb3N0X2FjdGl2YXRpb24ocCwgcnEsIDAsIHN1Y2Nlc3MpOworCisJaWYgKCEocC0+c3RhdGUgJiBUQVNLX05PUk1BTCkpCisJCWdvdG8gb3V0OworCisJaWYgKCFwLT5vbl9ycSkKKwkJdHR3dV9hY3RpdmF0ZShycSwgcCwgRU5RVUVVRV9XQUtFVVApOworCisJdHR3dV9kb193YWtldXAocnEsIHAsIDApOworCXR0d3Vfc3RhdChwLCBzbXBfcHJvY2Vzc29yX2lkKCksIDApOworb3V0OgorCXJhd19zcGluX3VubG9jaygmcC0+cGlfbG9jayk7CiB9CiAKIC8qKgpAQCAtMjYwNCwxOSArMjcxNywyMSBAQAogICovCiBzdGF0aWMgdm9pZCBfX3NjaGVkX2Zvcmsoc3RydWN0IHRhc2tfc3RydWN0ICpwKQogeworCXAtPm9uX3JxCQkJPSAwOworCisJcC0+c2Uub25fcnEJCQk9IDA7CiAJcC0+c2UuZXhlY19zdGFydAkJPSAwOwogCXAtPnNlLnN1bV9leGVjX3J1bnRpbWUJCT0gMDsKIAlwLT5zZS5wcmV2X3N1bV9leGVjX3J1bnRpbWUJPSAwOwogCXAtPnNlLm5yX21pZ3JhdGlvbnMJCT0gMDsKIAlwLT5zZS52cnVudGltZQkJCT0gMDsKKwlJTklUX0xJU1RfSEVBRCgmcC0+c2UuZ3JvdXBfbm9kZSk7CiAKICNpZmRlZiBDT05GSUdfU0NIRURTVEFUUwogCW1lbXNldCgmcC0+c2Uuc3RhdGlzdGljcywgMCwgc2l6ZW9mKHAtPnNlLnN0YXRpc3RpY3MpKTsKICNlbmRpZgogCiAJSU5JVF9MSVNUX0hFQUQoJnAtPnJ0LnJ1bl9saXN0KTsKLQlwLT5zZS5vbl9ycSA9IDA7Ci0JSU5JVF9MSVNUX0hFQUQoJnAtPnNlLmdyb3VwX25vZGUpOwogCiAjaWZkZWYgQ09ORklHX1BSRUVNUFRfTk9USUZJRVJTCiAJSU5JVF9ITElTVF9IRUFEKCZwLT5wcmVlbXB0X25vdGlmaWVycyk7CkBAIC0yNjI2LDggKzI3NDEsOSBAQAogLyoKICAqIGZvcmsoKS9jbG9uZSgpLXRpbWUgc2V0dXA6CiAgKi8KLXZvaWQgc2NoZWRfZm9yayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBjbG9uZV9mbGFncykKK3ZvaWQgc2NoZWRfZm9yayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgY3B1ID0gZ2V0X2NwdSgpOwogCiAJX19zY2hlZF9mb3JrKHApOwpAQCAtMjY3OCwxNiArMjc5NCwxNiBAQAogCSAqCiAJICogU2lsZW5jZSBQUk9WRV9SQ1UuCiAJICovCi0JcmN1X3JlYWRfbG9jaygpOworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcC0+cGlfbG9jaywgZmxhZ3MpOwogCXNldF90YXNrX2NwdShwLCBjcHUpOwotCXJjdV9yZWFkX3VubG9jaygpOworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5waV9sb2NrLCBmbGFncyk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19TQ0hFRFNUQVRTKSB8fCBkZWZpbmVkKENPTkZJR19UQVNLX0RFTEFZX0FDQ1QpCiAJaWYgKGxpa2VseShzY2hlZF9pbmZvX29uKCkpKQogCQltZW1zZXQoJnAtPnNjaGVkX2luZm8sIDAsIHNpemVvZihwLT5zY2hlZF9pbmZvKSk7CiAjZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19TTVApICYmIGRlZmluZWQoX19BUkNIX1dBTlRfVU5MT0NLRURfQ1RYU1cpCi0JcC0+b25jcHUgPSAwOworI2lmIGRlZmluZWQoQ09ORklHX1NNUCkKKwlwLT5vbl9jcHUgPSAwOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1BSRUVNUFQKIAkvKiBXYW50IHRvIHN0YXJ0IHdpdGgga2VybmVsIHByZWVtcHRpb24gZGlzYWJsZWQuICovCkBAIC0yNzA3LDQxICsyODIzLDMxIEBACiAgKiB0aGF0IG11c3QgYmUgZG9uZSBmb3IgZXZlcnkgbmV3bHkgY3JlYXRlZCBjb250ZXh0LCB0aGVuIHB1dHMgdGhlIHRhc2sKICAqIG9uIHRoZSBydW5xdWV1ZSBhbmQgd2FrZXMgaXQuCiAgKi8KLXZvaWQgd2FrZV91cF9uZXdfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3MpCit2b2lkIHdha2VfdXBfbmV3X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IHJxICpycTsKLQlpbnQgY3B1IF9fbWF5YmVfdW51c2VkID0gZ2V0X2NwdSgpOwogCisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZwLT5waV9sb2NrLCBmbGFncyk7CiAjaWZkZWYgQ09ORklHX1NNUAotCXJxID0gdGFza19ycV9sb2NrKHAsICZmbGFncyk7Ci0JcC0+c3RhdGUgPSBUQVNLX1dBS0lORzsKLQogCS8qCiAJICogRm9yayBiYWxhbmNpbmcsIGRvIGl0IGhlcmUgYW5kIG5vdCBlYXJsaWVyIGJlY2F1c2U6CiAJICogIC0gY3B1c19hbGxvd2VkIGNhbiBjaGFuZ2UgaW4gdGhlIGZvcmsgcGF0aAogCSAqICAtIGFueSBwcmV2aW91c2x5IHNlbGVjdGVkIGNwdSBtaWdodCBkaXNhcHBlYXIgdGhyb3VnaCBob3RwbHVnCi0JICoKLQkgKiBXZSBzZXQgVEFTS19XQUtJTkcgc28gdGhhdCBzZWxlY3RfdGFza19ycSgpIGNhbiBkcm9wIHJxLT5sb2NrCi0JICogd2l0aG91dCBwZW9wbGUgcG9raW5nIGF0IC0+Y3B1c19hbGxvd2VkLgogCSAqLwotCWNwdSA9IHNlbGVjdF90YXNrX3JxKHJxLCBwLCBTRF9CQUxBTkNFX0ZPUkssIDApOwotCXNldF90YXNrX2NwdShwLCBjcHUpOwotCi0JcC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JdGFza19ycV91bmxvY2socnEsICZmbGFncyk7CisJc2V0X3Rhc2tfY3B1KHAsIHNlbGVjdF90YXNrX3JxKHAsIFNEX0JBTEFOQ0VfRk9SSywgMCkpOwogI2VuZGlmCiAKLQlycSA9IHRhc2tfcnFfbG9jayhwLCAmZmxhZ3MpOworCXJxID0gX190YXNrX3JxX2xvY2socCk7CiAJYWN0aXZhdGVfdGFzayhycSwgcCwgMCk7Ci0JdHJhY2Vfc2NoZWRfd2FrZXVwX25ldyhwLCAxKTsKKwlwLT5vbl9ycSA9IDE7CisJdHJhY2Vfc2NoZWRfd2FrZXVwX25ldyhwLCB0cnVlKTsKIAljaGVja19wcmVlbXB0X2N1cnIocnEsIHAsIFdGX0ZPUkspOwogI2lmZGVmIENPTkZJR19TTVAKIAlpZiAocC0+c2NoZWRfY2xhc3MtPnRhc2tfd29rZW4pCiAJCXAtPnNjaGVkX2NsYXNzLT50YXNrX3dva2VuKHJxLCBwKTsKICNlbmRpZgotCXRhc2tfcnFfdW5sb2NrKHJxLCAmZmxhZ3MpOwotCXB1dF9jcHUoKTsKKwl0YXNrX3JxX3VubG9jayhycSwgcCwgJmZsYWdzKTsKIH0KIAogI2lmZGVmIENPTkZJR19QUkVFTVBUX05PVElGSUVSUwpAQCAtMzQ1MCwyNyArMzU1NiwyMiBAQAogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCA9IGN1cnJlbnQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgcnEgKnJxOwogCWludCBkZXN0X2NwdTsKIAotCXJxID0gdGFza19ycV9sb2NrKHAsICZmbGFncyk7Ci0JZGVzdF9jcHUgPSBwLT5zY2hlZF9jbGFzcy0+c2VsZWN0X3Rhc2tfcnEocnEsIHAsIFNEX0JBTEFOQ0VfRVhFQywgMCk7CisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZwLT5waV9sb2NrLCBmbGFncyk7CisJZGVzdF9jcHUgPSBwLT5zY2hlZF9jbGFzcy0+c2VsZWN0X3Rhc2tfcnEocCwgU0RfQkFMQU5DRV9FWEVDLCAwKTsKIAlpZiAoZGVzdF9jcHUgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQogCQlnb3RvIHVubG9jazsKIAotCS8qCi0JICogc2VsZWN0X3Rhc2tfcnEoKSBjYW4gcmFjZSBhZ2FpbnN0IC0+Y3B1c19hbGxvd2VkCi0JICovCi0JaWYgKGNwdW1hc2tfdGVzdF9jcHUoZGVzdF9jcHUsICZwLT5jcHVzX2FsbG93ZWQpICYmCi0JICAgIGxpa2VseShjcHVfYWN0aXZlKGRlc3RfY3B1KSkgJiYgbWlncmF0ZV90YXNrKHAsIHJxKSkgeworCWlmIChsaWtlbHkoY3B1X2FjdGl2ZShkZXN0X2NwdSkpKSB7CiAJCXN0cnVjdCBtaWdyYXRpb25fYXJnIGFyZyA9IHsgcCwgZGVzdF9jcHUgfTsKIAotCQl0YXNrX3JxX3VubG9jayhycSwgJmZsYWdzKTsKLQkJc3RvcF9vbmVfY3B1KGNwdV9vZihycSksIG1pZ3JhdGlvbl9jcHVfc3RvcCwgJmFyZyk7CisJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5waV9sb2NrLCBmbGFncyk7CisJCXN0b3Bfb25lX2NwdSh0YXNrX2NwdShwKSwgbWlncmF0aW9uX2NwdV9zdG9wLCAmYXJnKTsKIAkJcmV0dXJuOwogCX0KIHVubG9jazoKLQl0YXNrX3JxX3VubG9jayhycSwgJmZsYWdzKTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcC0+cGlfbG9jaywgZmxhZ3MpOwogfQogCiAjZW5kaWYKQEAgLTM1MDcsNyArMzYwOCw3IEBACiAKIAlycSA9IHRhc2tfcnFfbG9jayhwLCAmZmxhZ3MpOwogCW5zID0gZG9fdGFza19kZWx0YV9leGVjKHAsIHJxKTsKLQl0YXNrX3JxX3VubG9jayhycSwgJmZsYWdzKTsKKwl0YXNrX3JxX3VubG9jayhycSwgcCwgJmZsYWdzKTsKIAogCXJldHVybiBuczsKIH0KQEAgLTM1MjUsNyArMzYyNiw3IEBACiAKIAlycSA9IHRhc2tfcnFfbG9jayhwLCAmZmxhZ3MpOwogCW5zID0gcC0+c2Uuc3VtX2V4ZWNfcnVudGltZSArIGRvX3Rhc2tfZGVsdGFfZXhlYyhwLCBycSk7Ci0JdGFza19ycV91bmxvY2socnEsICZmbGFncyk7CisJdGFza19ycV91bmxvY2socnEsIHAsICZmbGFncyk7CiAKIAlyZXR1cm4gbnM7CiB9CkBAIC0zNTQ5LDcgKzM2NTAsNyBAQAogCXJxID0gdGFza19ycV9sb2NrKHAsICZmbGFncyk7CiAJdGhyZWFkX2dyb3VwX2NwdXRpbWUocCwgJnRvdGFscyk7CiAJbnMgPSB0b3RhbHMuc3VtX2V4ZWNfcnVudGltZSArIGRvX3Rhc2tfZGVsdGFfZXhlYyhwLCBycSk7Ci0JdGFza19ycV91bmxvY2socnEsICZmbGFncyk7CisJdGFza19ycV91bmxvY2socnEsIHAsICZmbGFncyk7CiAKIAlyZXR1cm4gbnM7CiB9CkBAIC0zOTAzLDkgKzQwMDQsNiBAQAogLyoKICAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgYnkgdGhlIHRpbWVyIGNvZGUsIHdpdGggSFogZnJlcXVlbmN5LgogICogV2UgY2FsbCBpdCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCi0gKgotICogSXQgYWxzbyBnZXRzIGNhbGxlZCBieSB0aGUgZm9yayBjb2RlLCB3aGVuIGNoYW5naW5nIHRoZSBwYXJlbnQncwotICogdGltZXNsaWNlcy4KICAqLwogdm9pZCBzY2hlZHVsZXJfdGljayh2b2lkKQogewpAQCAtNDAyNSwxNyArNDEyMywxMSBAQAogCXByb2ZpbGVfaGl0KFNDSEVEX1BST0ZJTElORywgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIAogCXNjaGVkc3RhdF9pbmModGhpc19ycSgpLCBzY2hlZF9jb3VudCk7Ci0jaWZkZWYgQ09ORklHX1NDSEVEU1RBVFMKLQlpZiAodW5saWtlbHkocHJldi0+bG9ja19kZXB0aCA+PSAwKSkgewotCQlzY2hlZHN0YXRfaW5jKHRoaXNfcnEoKSwgcnFfc2NoZWRfaW5mby5ia2xfY291bnQpOwotCQlzY2hlZHN0YXRfaW5jKHByZXYsIHNjaGVkX2luZm8uYmtsX2NvdW50KTsKLQl9Ci0jZW5kaWYKIH0KIAogc3RhdGljIHZvaWQgcHV0X3ByZXZfdGFzayhzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYpCiB7Ci0JaWYgKHByZXYtPnNlLm9uX3JxKQorCWlmIChwcmV2LT5vbl9ycSB8fCBycS0+c2tpcF9jbG9ja191cGRhdGUgPCAwKQogCQl1cGRhdGVfcnFfY2xvY2socnEpOwogCXByZXYtPnNjaGVkX2NsYXNzLT5wdXRfcHJldl90YXNrKHJxLCBwcmV2KTsKIH0KQEAgLTQwOTcsMTEgKzQxODksMTMgQEAKIAkJaWYgKHVubGlrZWx5KHNpZ25hbF9wZW5kaW5nX3N0YXRlKHByZXYtPnN0YXRlLCBwcmV2KSkpIHsKIAkJCXByZXYtPnN0YXRlID0gVEFTS19SVU5OSU5HOwogCQl9IGVsc2UgeworCQkJZGVhY3RpdmF0ZV90YXNrKHJxLCBwcmV2LCBERVFVRVVFX1NMRUVQKTsKKwkJCXByZXYtPm9uX3JxID0gMDsKKwogCQkJLyoKLQkJCSAqIElmIGEgd29ya2VyIGlzIGdvaW5nIHRvIHNsZWVwLCBub3RpZnkgYW5kCi0JCQkgKiBhc2sgd29ya3F1ZXVlIHdoZXRoZXIgaXQgd2FudHMgdG8gd2FrZSB1cCBhCi0JCQkgKiB0YXNrIHRvIG1haW50YWluIGNvbmN1cnJlbmN5LiAgSWYgc28sIHdha2UKLQkJCSAqIHVwIHRoZSB0YXNrLgorCQkJICogSWYgYSB3b3JrZXIgd2VudCB0byBzbGVlcCwgbm90aWZ5IGFuZCBhc2sgd29ya3F1ZXVlCisJCQkgKiB3aGV0aGVyIGl0IHdhbnRzIHRvIHdha2UgdXAgYSB0YXNrIHRvIG1haW50YWluCisJCQkgKiBjb25jdXJyZW5jeS4KIAkJCSAqLwogCQkJaWYgKHByZXYtPmZsYWdzICYgUEZfV1FfV09SS0VSKSB7CiAJCQkJc3RydWN0IHRhc2tfc3RydWN0ICp0b193YWtldXA7CkBAIC00MTEwLDExICs0MjA0LDEwIEBACiAJCQkJaWYgKHRvX3dha2V1cCkKIAkJCQkJdHJ5X3RvX3dha2VfdXBfbG9jYWwodG9fd2FrZXVwKTsKIAkJCX0KLQkJCWRlYWN0aXZhdGVfdGFzayhycSwgcHJldiwgREVRVUVVRV9TTEVFUCk7CiAKIAkJCS8qCi0JCQkgKiBJZiB3ZSBhcmUgZ29pbmcgdG8gc2xlZXAgYW5kIHdlIGhhdmUgcGx1Z2dlZCBJTyBxdWV1ZWQsIG1ha2UKLQkJCSAqIHN1cmUgdG8gc3VibWl0IGl0IHRvIGF2b2lkIGRlYWRsb2Nrcy4KKwkJCSAqIElmIHdlIGFyZSBnb2luZyB0byBzbGVlcCBhbmQgd2UgaGF2ZSBwbHVnZ2VkIElPCisJCQkgKiBxdWV1ZWQsIG1ha2Ugc3VyZSB0byBzdWJtaXQgaXQgdG8gYXZvaWQgZGVhZGxvY2tzLgogCQkJICovCiAJCQlpZiAoYmxrX25lZWRzX2ZsdXNoX3BsdWcocHJldikpIHsKIAkJCQlyYXdfc3Bpbl91bmxvY2soJnJxLT5sb2NrKTsKQEAgLTQxNjEsNzAgKzQyNTQsNTMgQEAKIEVYUE9SVF9TWU1CT0woc2NoZWR1bGUpOwogCiAjaWZkZWYgQ09ORklHX01VVEVYX1NQSU5fT05fT1dORVIKKworc3RhdGljIGlubGluZSBib29sIG93bmVyX3J1bm5pbmcoc3RydWN0IG11dGV4ICpsb2NrLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm93bmVyKQoreworCWJvb2wgcmV0ID0gZmFsc2U7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKGxvY2stPm93bmVyICE9IG93bmVyKQorCQlnb3RvIGZhaWw7CisKKwkvKgorCSAqIEVuc3VyZSB3ZSBlbWl0IHRoZSBvd25lci0+b25fY3B1LCBkZXJlZmVyZW5jZSBfYWZ0ZXJfIGNoZWNraW5nCisJICogbG9jay0+b3duZXIgc3RpbGwgbWF0Y2hlcyBvd25lciwgaWYgdGhhdCBmYWlscywgb3duZXIgbWlnaHQKKwkgKiBwb2ludCB0byBmcmVlKClkIG1lbW9yeSwgaWYgaXQgc3RpbGwgbWF0Y2hlcywgdGhlIHJjdV9yZWFkX2xvY2soKQorCSAqIGVuc3VyZXMgdGhlIG1lbW9yeSBzdGF5cyB2YWxpZC4KKwkgKi8KKwliYXJyaWVyKCk7CisKKwlyZXQgPSBvd25lci0+b25fY3B1OworZmFpbDoKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiByZXQ7Cit9CisKIC8qCiAgKiBMb29rIG91dCEgIm93bmVyIiBpcyBhbiBlbnRpcmVseSBzcGVjdWxhdGl2ZSBwb2ludGVyCiAgKiBhY2Nlc3MgYW5kIG5vdCByZWxpYWJsZS4KICAqLwotaW50IG11dGV4X3NwaW5fb25fb3duZXIoc3RydWN0IG11dGV4ICpsb2NrLCBzdHJ1Y3QgdGhyZWFkX2luZm8gKm93bmVyKQoraW50IG11dGV4X3NwaW5fb25fb3duZXIoc3RydWN0IG11dGV4ICpsb2NrLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm93bmVyKQogewotCXVuc2lnbmVkIGludCBjcHU7Ci0Jc3RydWN0IHJxICpycTsKLQogCWlmICghc2NoZWRfZmVhdChPV05FUl9TUElOKSkKIAkJcmV0dXJuIDA7CiAKLSNpZmRlZiBDT05GSUdfREVCVUdfUEFHRUFMTE9DCi0JLyoKLQkgKiBOZWVkIHRvIGFjY2VzcyB0aGUgY3B1IGZpZWxkIGtub3dpbmcgdGhhdAotCSAqIERFQlVHX1BBR0VBTExPQyBjb3VsZCBoYXZlIHVubWFwcGVkIGl0IGlmCi0JICogdGhlIG11dGV4IG93bmVyIGp1c3QgcmVsZWFzZWQgaXQgYW5kIGV4aXRlZC4KLQkgKi8KLQlpZiAocHJvYmVfa2VybmVsX2FkZHJlc3MoJm93bmVyLT5jcHUsIGNwdSkpCi0JCXJldHVybiAwOwotI2Vsc2UKLQljcHUgPSBvd25lci0+Y3B1OwotI2VuZGlmCi0KLQkvKgotCSAqIEV2ZW4gaWYgdGhlIGFjY2VzcyBzdWNjZWVkZWQgKGxpa2VseSBjYXNlKSwKLQkgKiB0aGUgY3B1IGZpZWxkIG1heSBubyBsb25nZXIgYmUgdmFsaWQuCi0JICovCi0JaWYgKGNwdSA+PSBucl9jcHVtYXNrX2JpdHMpCi0JCXJldHVybiAwOwotCi0JLyoKLQkgKiBXZSBuZWVkIHRvIHZhbGlkYXRlIHRoYXQgd2UgY2FuIGRvIGEKLQkgKiBnZXRfY3B1KCkgYW5kIHRoYXQgd2UgaGF2ZSB0aGUgcGVyY3B1IGFyZWEuCi0JICovCi0JaWYgKCFjcHVfb25saW5lKGNwdSkpCi0JCXJldHVybiAwOwotCi0JcnEgPSBjcHVfcnEoY3B1KTsKLQotCWZvciAoOzspIHsKLQkJLyoKLQkJICogT3duZXIgY2hhbmdlZCwgYnJlYWsgdG8gcmUtYXNzZXNzIHN0YXRlLgotCQkgKi8KLQkJaWYgKGxvY2stPm93bmVyICE9IG93bmVyKSB7Ci0JCQkvKgotCQkJICogSWYgdGhlIGxvY2sgaGFzIHN3aXRjaGVkIHRvIGEgZGlmZmVyZW50IG93bmVyLAotCQkJICogd2UgbGlrZWx5IGhhdmUgaGVhdnkgY29udGVudGlvbi4gUmV0dXJuIDAgdG8gcXVpdAotCQkJICogb3B0aW1pc3RpYyBzcGlubmluZyBhbmQgbm90IGNvbnRlbmQgZnVydGhlcjoKLQkJCSAqLwotCQkJaWYgKGxvY2stPm93bmVyKQotCQkJCXJldHVybiAwOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKgotCQkgKiBJcyB0aGF0IG93bmVyIHJlYWxseSBydW5uaW5nIG9uIHRoYXQgY3B1PwotCQkgKi8KLQkJaWYgKHRhc2tfdGhyZWFkX2luZm8ocnEtPmN1cnIpICE9IG93bmVyIHx8IG5lZWRfcmVzY2hlZCgpKQorCXdoaWxlIChvd25lcl9ydW5uaW5nKGxvY2ssIG93bmVyKSkgeworCQlpZiAobmVlZF9yZXNjaGVkKCkpCiAJCQlyZXR1cm4gMDsKIAogCQlhcmNoX211dGV4X2NwdV9yZWxheCgpOwogCX0KIAorCS8qCisJICogSWYgdGhlIG93bmVyIGNoYW5nZWQgdG8gYW5vdGhlciB0YXNrIHRoZXJlIGlzIGxpa2VseQorCSAqIGhlYXZ5IGNvbnRlbnRpb24sIHN0b3Agc3Bpbm5pbmcuCisJICovCisJaWYgKGxvY2stPm93bmVyKQorCQlyZXR1cm4gMDsKKwogCXJldHVybiAxOwogfQogI2VuZGlmCkBAIC00Njg0LDE5ICs0NzYwLDE4IEBACiAgKi8KIHZvaWQgcnRfbXV0ZXhfc2V0cHJpbyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBwcmlvKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IG9sZHByaW8sIG9uX3JxLCBydW5uaW5nOwogCXN0cnVjdCBycSAqcnE7CiAJY29uc3Qgc3RydWN0IHNjaGVkX2NsYXNzICpwcmV2X2NsYXNzOwogCiAJQlVHX09OKHByaW8gPCAwIHx8IHByaW8gPiBNQVhfUFJJTyk7CiAKLQlycSA9IHRhc2tfcnFfbG9jayhwLCAmZmxhZ3MpOworCXJxID0gX190YXNrX3JxX2xvY2socCk7CiAKIAl0cmFjZV9zY2hlZF9waV9zZXRwcmlvKHAsIHByaW8pOwogCW9sZHByaW8gPSBwLT5wcmlvOwogCXByZXZfY2xhc3MgPSBwLT5zY2hlZF9jbGFzczsKLQlvbl9ycSA9IHAtPnNlLm9uX3JxOworCW9uX3JxID0gcC0+b25fcnE7CiAJcnVubmluZyA9IHRhc2tfY3VycmVudChycSwgcCk7CiAJaWYgKG9uX3JxKQogCQlkZXF1ZXVlX3Rhc2socnEsIHAsIDApOwpAQCAtNDcxNiw3ICs0NzkxLDcgQEAKIAkJZW5xdWV1ZV90YXNrKHJxLCBwLCBvbGRwcmlvIDwgcHJpbyA/IEVOUVVFVUVfSEVBRCA6IDApOwogCiAJY2hlY2tfY2xhc3NfY2hhbmdlZChycSwgcCwgcHJldl9jbGFzcywgb2xkcHJpbyk7Ci0JdGFza19ycV91bmxvY2socnEsICZmbGFncyk7CisJX190YXNrX3JxX3VubG9jayhycSk7CiB9CiAKICNlbmRpZgpAQCAtNDc0NCw3ICs0ODE5LDcgQEAKIAkJcC0+c3RhdGljX3ByaW8gPSBOSUNFX1RPX1BSSU8obmljZSk7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9Ci0Jb25fcnEgPSBwLT5zZS5vbl9ycTsKKwlvbl9ycSA9IHAtPm9uX3JxOwogCWlmIChvbl9ycSkKIAkJZGVxdWV1ZV90YXNrKHJxLCBwLCAwKTsKIApAQCAtNDc2NCw3ICs0ODM5LDcgQEAKIAkJCXJlc2NoZWRfdGFzayhycS0+Y3Vycik7CiAJfQogb3V0X3VubG9jazoKLQl0YXNrX3JxX3VubG9jayhycSwgJmZsYWdzKTsKKwl0YXNrX3JxX3VubG9jayhycSwgcCwgJmZsYWdzKTsKIH0KIEVYUE9SVF9TWU1CT0woc2V0X3VzZXJfbmljZSk7CiAKQEAgLTQ4NzgsOCArNDk1Myw2IEBACiBzdGF0aWMgdm9pZAogX19zZXRzY2hlZHVsZXIoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgcG9saWN5LCBpbnQgcHJpbykKIHsKLQlCVUdfT04ocC0+c2Uub25fcnEpOwotCiAJcC0+cG9saWN5ID0gcG9saWN5OwogCXAtPnJ0X3ByaW9yaXR5ID0gcHJpbzsKIAlwLT5ub3JtYWxfcHJpbyA9IG5vcm1hbF9wcmlvKHApOwpAQCAtNDk5NCwyMCArNTA2NywxNyBAQAogCS8qCiAJICogbWFrZSBzdXJlIG5vIFBJLXdhaXRlcnMgYXJyaXZlIChvciBsZWF2ZSkgd2hpbGUgd2UgYXJlCiAJICogY2hhbmdpbmcgdGhlIHByaW9yaXR5IG9mIHRoZSB0YXNrOgotCSAqLwotCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcC0+cGlfbG9jaywgZmxhZ3MpOwotCS8qCisJICoKIAkgKiBUbyBiZSBhYmxlIHRvIGNoYW5nZSBwLT5wb2xpY3kgc2FmZWx5LCB0aGUgYXBwcm9wcmlhdGUKIAkgKiBydW5xdWV1ZSBsb2NrIG11c3QgYmUgaGVsZC4KIAkgKi8KLQlycSA9IF9fdGFza19ycV9sb2NrKHApOworCXJxID0gdGFza19ycV9sb2NrKHAsICZmbGFncyk7CiAKIAkvKgogCSAqIENoYW5naW5nIHRoZSBwb2xpY3kgb2YgdGhlIHN0b3AgdGhyZWFkcyBpdHMgYSB2ZXJ5IGJhZCBpZGVhCiAJICovCiAJaWYgKHAgPT0gcnEtPnN0b3ApIHsKLQkJX190YXNrX3JxX3VubG9jayhycSk7Ci0JCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5waV9sb2NrLCBmbGFncyk7CisJCXRhc2tfcnFfdW5sb2NrKHJxLCBwLCAmZmxhZ3MpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTUwMzEsOCArNTEwMSw3IEBACiAJCWlmIChydF9iYW5kd2lkdGhfZW5hYmxlZCgpICYmIHJ0X3BvbGljeShwb2xpY3kpICYmCiAJCQkJdGFza19ncm91cChwKS0+cnRfYmFuZHdpZHRoLnJ0X3J1bnRpbWUgPT0gMCAmJgogCQkJCSF0YXNrX2dyb3VwX2lzX2F1dG9ncm91cCh0YXNrX2dyb3VwKHApKSkgewotCQkJX190YXNrX3JxX3VubG9jayhycSk7Ci0JCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcC0+cGlfbG9jaywgZmxhZ3MpOworCQkJdGFza19ycV91bmxvY2socnEsIHAsICZmbGFncyk7CiAJCQlyZXR1cm4gLUVQRVJNOwogCQl9CiAJfQpAQCAtNTA0MSwxMSArNTExMCwxMCBAQAogCS8qIHJlY2hlY2sgcG9saWN5IG5vdyB3aXRoIHJxIGxvY2sgaGVsZCAqLwogCWlmICh1bmxpa2VseShvbGRwb2xpY3kgIT0gLTEgJiYgb2xkcG9saWN5ICE9IHAtPnBvbGljeSkpIHsKIAkJcG9saWN5ID0gb2xkcG9saWN5ID0gLTE7Ci0JCV9fdGFza19ycV91bmxvY2socnEpOwotCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcC0+cGlfbG9jaywgZmxhZ3MpOworCQl0YXNrX3JxX3VubG9jayhycSwgcCwgJmZsYWdzKTsKIAkJZ290byByZWNoZWNrOwogCX0KLQlvbl9ycSA9IHAtPnNlLm9uX3JxOworCW9uX3JxID0gcC0+b25fcnE7CiAJcnVubmluZyA9IHRhc2tfY3VycmVudChycSwgcCk7CiAJaWYgKG9uX3JxKQogCQlkZWFjdGl2YXRlX3Rhc2socnEsIHAsIDApOwpAQCAtNTA2NCw4ICs1MTMyLDcgQEAKIAkJYWN0aXZhdGVfdGFzayhycSwgcCwgMCk7CiAKIAljaGVja19jbGFzc19jaGFuZ2VkKHJxLCBwLCBwcmV2X2NsYXNzLCBvbGRwcmlvKTsKLQlfX3Rhc2tfcnFfdW5sb2NrKHJxKTsKLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcC0+cGlfbG9jaywgZmxhZ3MpOworCXRhc2tfcnFfdW5sb2NrKHJxLCBwLCAmZmxhZ3MpOwogCiAJcnRfbXV0ZXhfYWRqdXN0X3BpKHApOwogCkBAIC01MzE2LDcgKzUzODMsNiBAQAogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBycSAqcnE7CiAJaW50IHJldHZhbDsKIAogCWdldF9vbmxpbmVfY3B1cygpOwpAQCAtNTMzMSw5ICs1Mzk3LDkgQEAKIAlpZiAocmV0dmFsKQogCQlnb3RvIG91dF91bmxvY2s7CiAKLQlycSA9IHRhc2tfcnFfbG9jayhwLCAmZmxhZ3MpOworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcC0+cGlfbG9jaywgZmxhZ3MpOwogCWNwdW1hc2tfYW5kKG1hc2ssICZwLT5jcHVzX2FsbG93ZWQsIGNwdV9vbmxpbmVfbWFzayk7Ci0JdGFza19ycV91bmxvY2socnEsICZmbGFncyk7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnAtPnBpX2xvY2ssIGZsYWdzKTsKIAogb3V0X3VubG9jazoKIAlyY3VfcmVhZF91bmxvY2soKTsKQEAgLTU2NTgsNyArNTcyNCw3IEBACiAKIAlycSA9IHRhc2tfcnFfbG9jayhwLCAmZmxhZ3MpOwogCXRpbWVfc2xpY2UgPSBwLT5zY2hlZF9jbGFzcy0+Z2V0X3JyX2ludGVydmFsKHJxLCBwKTsKLQl0YXNrX3JxX3VubG9jayhycSwgJmZsYWdzKTsKKwl0YXNrX3JxX3VubG9jayhycSwgcCwgJmZsYWdzKTsKIAogCXJjdV9yZWFkX3VubG9jaygpOwogCWppZmZpZXNfdG9fdGltZXNwZWModGltZV9zbGljZSwgJnQpOwpAQCAtNTc3NiwxNyArNTg0MiwxNCBAQAogCXJjdV9yZWFkX3VubG9jaygpOwogCiAJcnEtPmN1cnIgPSBycS0+aWRsZSA9IGlkbGU7Ci0jaWYgZGVmaW5lZChDT05GSUdfU01QKSAmJiBkZWZpbmVkKF9fQVJDSF9XQU5UX1VOTE9DS0VEX0NUWFNXKQotCWlkbGUtPm9uY3B1ID0gMTsKKyNpZiBkZWZpbmVkKENPTkZJR19TTVApCisJaWRsZS0+b25fY3B1ID0gMTsKICNlbmRpZgogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZycS0+bG9jaywgZmxhZ3MpOwogCiAJLyogU2V0IHRoZSBwcmVlbXB0IGNvdW50IF9vdXRzaWRlXyB0aGUgc3BpbmxvY2tzISAqLwotI2lmIGRlZmluZWQoQ09ORklHX1BSRUVNUFQpCi0JdGFza190aHJlYWRfaW5mbyhpZGxlKS0+cHJlZW1wdF9jb3VudCA9IChpZGxlLT5sb2NrX2RlcHRoID49IDApOwotI2Vsc2UKIAl0YXNrX3RocmVhZF9pbmZvKGlkbGUpLT5wcmVlbXB0X2NvdW50ID0gMDsKLSNlbmRpZgorCiAJLyoKIAkgKiBUaGUgaWRsZSB0YXNrcyBoYXZlIHRoZWlyIG93biwgc2ltcGxlIHNjaGVkdWxpbmcgY2xhc3M6CiAJICovCkBAIC01ODgxLDI2ICs1OTQ0LDE3IEBACiAJdW5zaWduZWQgaW50IGRlc3RfY3B1OwogCWludCByZXQgPSAwOwogCi0JLyoKLQkgKiBTZXJpYWxpemUgYWdhaW5zdCBUQVNLX1dBS0lORyBzbyB0aGF0IHR0d3UoKSBhbmQgd3VudCgpIGNhbgotCSAqIGRyb3AgdGhlIHJxLT5sb2NrIGFuZCBzdGlsbCByZWx5IG9uIC0+Y3B1c19hbGxvd2VkLgotCSAqLwotYWdhaW46Ci0Jd2hpbGUgKHRhc2tfaXNfd2FraW5nKHApKQotCQljcHVfcmVsYXgoKTsKIAlycSA9IHRhc2tfcnFfbG9jayhwLCAmZmxhZ3MpOwotCWlmICh0YXNrX2lzX3dha2luZyhwKSkgewotCQl0YXNrX3JxX3VubG9jayhycSwgJmZsYWdzKTsKLQkJZ290byBhZ2FpbjsKLQl9CisKKwlpZiAoY3B1bWFza19lcXVhbCgmcC0+Y3B1c19hbGxvd2VkLCBuZXdfbWFzaykpCisJCWdvdG8gb3V0OwogCiAJaWYgKCFjcHVtYXNrX2ludGVyc2VjdHMobmV3X21hc2ssIGNwdV9hY3RpdmVfbWFzaykpIHsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKHVubGlrZWx5KChwLT5mbGFncyAmIFBGX1RIUkVBRF9CT1VORCkgJiYgcCAhPSBjdXJyZW50ICYmCi0JCSAgICAgIWNwdW1hc2tfZXF1YWwoJnAtPmNwdXNfYWxsb3dlZCwgbmV3X21hc2spKSkgeworCWlmICh1bmxpa2VseSgocC0+ZmxhZ3MgJiBQRl9USFJFQURfQk9VTkQpICYmIHAgIT0gY3VycmVudCkpIHsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNTkxNywxNiArNTk3MSwxNiBAQAogCQlnb3RvIG91dDsKIAogCWRlc3RfY3B1ID0gY3B1bWFza19hbnlfYW5kKGNwdV9hY3RpdmVfbWFzaywgbmV3X21hc2spOwotCWlmIChtaWdyYXRlX3Rhc2socCwgcnEpKSB7CisJaWYgKHAtPm9uX3JxKSB7CiAJCXN0cnVjdCBtaWdyYXRpb25fYXJnIGFyZyA9IHsgcCwgZGVzdF9jcHUgfTsKIAkJLyogTmVlZCBoZWxwIGZyb20gbWlncmF0aW9uIHRocmVhZDogZHJvcCBsb2NrIGFuZCB3YWl0LiAqLwotCQl0YXNrX3JxX3VubG9jayhycSwgJmZsYWdzKTsKKwkJdGFza19ycV91bmxvY2socnEsIHAsICZmbGFncyk7CiAJCXN0b3Bfb25lX2NwdShjcHVfb2YocnEpLCBtaWdyYXRpb25fY3B1X3N0b3AsICZhcmcpOwogCQl0bGJfbWlncmF0ZV9maW5pc2gocC0+bW0pOwogCQlyZXR1cm4gMDsKIAl9CiBvdXQ6Ci0JdGFza19ycV91bmxvY2socnEsICZmbGFncyk7CisJdGFza19ycV91bmxvY2socnEsIHAsICZmbGFncyk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNTk1NCw2ICs2MDA4LDcgQEAKIAlycV9zcmMgPSBjcHVfcnEoc3JjX2NwdSk7CiAJcnFfZGVzdCA9IGNwdV9ycShkZXN0X2NwdSk7CiAKKwlyYXdfc3Bpbl9sb2NrKCZwLT5waV9sb2NrKTsKIAlkb3VibGVfcnFfbG9jayhycV9zcmMsIHJxX2Rlc3QpOwogCS8qIEFscmVhZHkgbW92ZWQuICovCiAJaWYgKHRhc2tfY3B1KHApICE9IHNyY19jcHUpCkBAIC01OTY2LDcgKzYwMjEsNyBAQAogCSAqIElmIHdlJ3JlIG5vdCBvbiBhIHJxLCB0aGUgbmV4dCB3YWtlLXVwIHdpbGwgZW5zdXJlIHdlJ3JlCiAJICogcGxhY2VkIHByb3Blcmx5LgogCSAqLwotCWlmIChwLT5zZS5vbl9ycSkgeworCWlmIChwLT5vbl9ycSkgewogCQlkZWFjdGl2YXRlX3Rhc2socnFfc3JjLCBwLCAwKTsKIAkJc2V0X3Rhc2tfY3B1KHAsIGRlc3RfY3B1KTsKIAkJYWN0aXZhdGVfdGFzayhycV9kZXN0LCBwLCAwKTsKQEAgLTU5NzYsNiArNjAzMSw3IEBACiAJcmV0ID0gMTsKIGZhaWw6CiAJZG91YmxlX3JxX3VubG9jayhycV9zcmMsIHJxX2Rlc3QpOworCXJhd19zcGluX3VubG9jaygmcC0+cGlfbG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNjMxNiw2ICs2MzcyLDcgQEAKIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogCWNhc2UgQ1BVX0RZSU5HOgorCQlzY2hlZF90dHd1X3BlbmRpbmcoKTsKIAkJLyogVXBkYXRlIG91ciByb290LWRvbWFpbiAqLwogCQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnJxLT5sb2NrLCBmbGFncyk7CiAJCWlmIChycS0+cmQpIHsKQEAgLTYzOTQsNiArNjQ1MSw4IEBACiAKICNpZmRlZiBDT05GSUdfU01QCiAKK3N0YXRpYyBjcHVtYXNrX3Zhcl90IHNjaGVkX2RvbWFpbnNfdG1wbWFzazsgLyogc2NoZWRfZG9tYWluc19tdXRleCAqLworCiAjaWZkZWYgQ09ORklHX1NDSEVEX0RFQlVHCiAKIHN0YXRpYyBfX3JlYWRfbW9zdGx5IGludCBzY2hlZF9kb21haW5fZGVidWdfZW5hYmxlZDsKQEAgLTY0ODksNyArNjU0OCw2IEBACiAKIHN0YXRpYyB2b2lkIHNjaGVkX2RvbWFpbl9kZWJ1ZyhzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgaW50IGNwdSkKIHsKLQljcHVtYXNrX3Zhcl90IGdyb3VwbWFzazsKIAlpbnQgbGV2ZWwgPSAwOwogCiAJaWYgKCFzY2hlZF9kb21haW5fZGVidWdfZW5hYmxlZCkKQEAgLTY1MDIsMjAgKzY1NjAsMTQgQEAKIAogCXByaW50ayhLRVJOX0RFQlVHICJDUFUlZCBhdHRhY2hpbmcgc2NoZWQtZG9tYWluOlxuIiwgY3B1KTsKIAotCWlmICghYWxsb2NfY3B1bWFza192YXIoJmdyb3VwbWFzaywgR0ZQX0tFUk5FTCkpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkNhbm5vdCBsb2FkLWJhbGFuY2UgKG91dCBvZiBtZW1vcnkpXG4iKTsKLQkJcmV0dXJuOwotCX0KLQogCWZvciAoOzspIHsKLQkJaWYgKHNjaGVkX2RvbWFpbl9kZWJ1Z19vbmUoc2QsIGNwdSwgbGV2ZWwsIGdyb3VwbWFzaykpCisJCWlmIChzY2hlZF9kb21haW5fZGVidWdfb25lKHNkLCBjcHUsIGxldmVsLCBzY2hlZF9kb21haW5zX3RtcG1hc2spKQogCQkJYnJlYWs7CiAJCWxldmVsKys7CiAJCXNkID0gc2QtPnBhcmVudDsKIAkJaWYgKCFzZCkKIAkJCWJyZWFrOwogCX0KLQlmcmVlX2NwdW1hc2tfdmFyKGdyb3VwbWFzayk7CiB9CiAjZWxzZSAvKiAhQ09ORklHX1NDSEVEX0RFQlVHICovCiAjIGRlZmluZSBzY2hlZF9kb21haW5fZGVidWcoc2QsIGNwdSkgZG8geyB9IHdoaWxlICgwKQpAQCAtNjU3MiwxMiArNjYyNCwxMSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZCBmcmVlX3Jvb3Rkb21haW4oc3RydWN0IHJvb3RfZG9tYWluICpyZCkKK3N0YXRpYyB2b2lkIGZyZWVfcm9vdGRvbWFpbihzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKIHsKLQlzeW5jaHJvbml6ZV9zY2hlZCgpOworCXN0cnVjdCByb290X2RvbWFpbiAqcmQgPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3Qgcm9vdF9kb21haW4sIHJjdSk7CiAKIAljcHVwcmlfY2xlYW51cCgmcmQtPmNwdXByaSk7Ci0KIAlmcmVlX2NwdW1hc2tfdmFyKHJkLT5ydG9fbWFzayk7CiAJZnJlZV9jcHVtYXNrX3ZhcihyZC0+b25saW5lKTsKIAlmcmVlX2NwdW1hc2tfdmFyKHJkLT5zcGFuKTsKQEAgLTY2MTgsNyArNjY2OSw3IEBACiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJxLT5sb2NrLCBmbGFncyk7CiAKIAlpZiAob2xkX3JkKQotCQlmcmVlX3Jvb3Rkb21haW4ob2xkX3JkKTsKKwkJY2FsbF9yY3Vfc2NoZWQoJm9sZF9yZC0+cmN1LCBmcmVlX3Jvb3Rkb21haW4pOwogfQogCiBzdGF0aWMgaW50IGluaXRfcm9vdGRvbWFpbihzdHJ1Y3Qgcm9vdF9kb21haW4gKnJkKQpAQCAtNjY2OSw2ICs2NzIwLDI1IEBACiAJcmV0dXJuIHJkOwogfQogCitzdGF0aWMgdm9pZCBmcmVlX3NjaGVkX2RvbWFpbihzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKK3sKKwlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCA9IGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBzY2hlZF9kb21haW4sIHJjdSk7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnNkLT5ncm91cHMtPnJlZikpCisJCWtmcmVlKHNkLT5ncm91cHMpOworCWtmcmVlKHNkKTsKK30KKworc3RhdGljIHZvaWQgZGVzdHJveV9zY2hlZF9kb21haW4oc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBjcHUpCit7CisJY2FsbF9yY3UoJnNkLT5yY3UsIGZyZWVfc2NoZWRfZG9tYWluKTsKK30KKworc3RhdGljIHZvaWQgZGVzdHJveV9zY2hlZF9kb21haW5zKHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgY3B1KQoreworCWZvciAoOyBzZDsgc2QgPSBzZC0+cGFyZW50KQorCQlkZXN0cm95X3NjaGVkX2RvbWFpbihzZCwgY3B1KTsKK30KKwogLyoKICAqIEF0dGFjaCB0aGUgZG9tYWluICdzZCcgdG8gJ2NwdScgYXMgaXRzIGJhc2UgZG9tYWluLiBDYWxsZXJzIG11c3QKICAqIGhvbGQgdGhlIGhvdHBsdWcgbG9jay4KQEAgLTY2NzksOSArNjc0OSw2IEBACiAJc3RydWN0IHJxICpycSA9IGNwdV9ycShjcHUpOwogCXN0cnVjdCBzY2hlZF9kb21haW4gKnRtcDsKIAotCWZvciAodG1wID0gc2Q7IHRtcDsgdG1wID0gdG1wLT5wYXJlbnQpCi0JCXRtcC0+c3Bhbl93ZWlnaHQgPSBjcHVtYXNrX3dlaWdodChzY2hlZF9kb21haW5fc3Bhbih0bXApKTsKLQogCS8qIFJlbW92ZSB0aGUgc2NoZWQgZG9tYWlucyB3aGljaCBkbyBub3QgY29udHJpYnV0ZSB0byBzY2hlZHVsaW5nLiAqLwogCWZvciAodG1wID0gc2Q7IHRtcDsgKSB7CiAJCXN0cnVjdCBzY2hlZF9kb21haW4gKnBhcmVudCA9IHRtcC0+cGFyZW50OwpAQCAtNjY5MiwxMiArNjc1OSwxNSBAQAogCQkJdG1wLT5wYXJlbnQgPSBwYXJlbnQtPnBhcmVudDsKIAkJCWlmIChwYXJlbnQtPnBhcmVudCkKIAkJCQlwYXJlbnQtPnBhcmVudC0+Y2hpbGQgPSB0bXA7CisJCQlkZXN0cm95X3NjaGVkX2RvbWFpbihwYXJlbnQsIGNwdSk7CiAJCX0gZWxzZQogCQkJdG1wID0gdG1wLT5wYXJlbnQ7CiAJfQogCiAJaWYgKHNkICYmIHNkX2RlZ2VuZXJhdGUoc2QpKSB7CisJCXRtcCA9IHNkOwogCQlzZCA9IHNkLT5wYXJlbnQ7CisJCWRlc3Ryb3lfc2NoZWRfZG9tYWluKHRtcCwgY3B1KTsKIAkJaWYgKHNkKQogCQkJc2QtPmNoaWxkID0gTlVMTDsKIAl9CkBAIC02NzA1LDcgKzY3NzUsOSBAQAogCXNjaGVkX2RvbWFpbl9kZWJ1ZyhzZCwgY3B1KTsKIAogCXJxX2F0dGFjaF9yb290KHJxLCByZCk7CisJdG1wID0gcnEtPnNkOwogCXJjdV9hc3NpZ25fcG9pbnRlcihycS0+c2QsIHNkKTsKKwlkZXN0cm95X3NjaGVkX2RvbWFpbnModG1wLCBjcHUpOwogfQogCiAvKiBjcHVzIHdpdGggaXNvbGF0ZWQgZG9tYWlucyAqLwpAQCAtNjcyMSw1NiArNjc5Myw2IEBACiAKIF9fc2V0dXAoImlzb2xjcHVzPSIsIGlzb2xhdGVkX2NwdV9zZXR1cCk7CiAKLS8qCi0gKiBpbml0X3NjaGVkX2J1aWxkX2dyb3VwcyB0YWtlcyB0aGUgY3B1bWFzayB3ZSB3aXNoIHRvIHNwYW4sIGFuZCBhIHBvaW50ZXIKLSAqIHRvIGEgZnVuY3Rpb24gd2hpY2ggaWRlbnRpZmllcyB3aGF0IGdyb3VwKGFsb25nIHdpdGggc2NoZWQgZ3JvdXApIGEgQ1BVCi0gKiBiZWxvbmdzIHRvLiBUaGUgcmV0dXJuIHZhbHVlIG9mIGdyb3VwX2ZuIG11c3QgYmUgYSA+PSAwIGFuZCA8IG5yX2NwdV9pZHMKLSAqIChkdWUgdG8gdGhlIGZhY3QgdGhhdCB3ZSBrZWVwIHRyYWNrIG9mIGdyb3VwcyBjb3ZlcmVkIHdpdGggYSBzdHJ1Y3QgY3B1bWFzaykuCi0gKgotICogaW5pdF9zY2hlZF9idWlsZF9ncm91cHMgd2lsbCBidWlsZCBhIGNpcmN1bGFyIGxpbmtlZCBsaXN0IG9mIHRoZSBncm91cHMKLSAqIGNvdmVyZWQgYnkgdGhlIGdpdmVuIHNwYW4sIGFuZCB3aWxsIHNldCBlYWNoIGdyb3VwJ3MgLT5jcHVtYXNrIGNvcnJlY3RseSwKLSAqIGFuZCAtPmNwdV9wb3dlciB0byAwLgotICovCi1zdGF0aWMgdm9pZAotaW5pdF9zY2hlZF9idWlsZF9ncm91cHMoY29uc3Qgc3RydWN0IGNwdW1hc2sgKnNwYW4sCi0JCQljb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1X21hcCwKLQkJCWludCAoKmdyb3VwX2ZuKShpbnQgY3B1LCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1X21hcCwKLQkJCQkJc3RydWN0IHNjaGVkX2dyb3VwICoqc2csCi0JCQkJCXN0cnVjdCBjcHVtYXNrICp0bXBtYXNrKSwKLQkJCXN0cnVjdCBjcHVtYXNrICpjb3ZlcmVkLCBzdHJ1Y3QgY3B1bWFzayAqdG1wbWFzaykKLXsKLQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKmZpcnN0ID0gTlVMTCwgKmxhc3QgPSBOVUxMOwotCWludCBpOwotCi0JY3B1bWFza19jbGVhcihjb3ZlcmVkKTsKLQotCWZvcl9lYWNoX2NwdShpLCBzcGFuKSB7Ci0JCXN0cnVjdCBzY2hlZF9ncm91cCAqc2c7Ci0JCWludCBncm91cCA9IGdyb3VwX2ZuKGksIGNwdV9tYXAsICZzZywgdG1wbWFzayk7Ci0JCWludCBqOwotCi0JCWlmIChjcHVtYXNrX3Rlc3RfY3B1KGksIGNvdmVyZWQpKQotCQkJY29udGludWU7Ci0KLQkJY3B1bWFza19jbGVhcihzY2hlZF9ncm91cF9jcHVzKHNnKSk7Ci0JCXNnLT5jcHVfcG93ZXIgPSAwOwotCi0JCWZvcl9lYWNoX2NwdShqLCBzcGFuKSB7Ci0JCQlpZiAoZ3JvdXBfZm4oaiwgY3B1X21hcCwgTlVMTCwgdG1wbWFzaykgIT0gZ3JvdXApCi0JCQkJY29udGludWU7Ci0KLQkJCWNwdW1hc2tfc2V0X2NwdShqLCBjb3ZlcmVkKTsKLQkJCWNwdW1hc2tfc2V0X2NwdShqLCBzY2hlZF9ncm91cF9jcHVzKHNnKSk7Ci0JCX0KLQkJaWYgKCFmaXJzdCkKLQkJCWZpcnN0ID0gc2c7Ci0JCWlmIChsYXN0KQotCQkJbGFzdC0+bmV4dCA9IHNnOwotCQlsYXN0ID0gc2c7Ci0JfQotCWxhc3QtPm5leHQgPSBmaXJzdDsKLX0KLQogI2RlZmluZSBTRF9OT0RFU19QRVJfRE9NQUlOIDE2CiAKICNpZmRlZiBDT05GSUdfTlVNQQpAQCAtNjc4Nyw3ICs2ODA5LDcgQEAKICAqLwogc3RhdGljIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVzKQogewotCWludCBpLCBuLCB2YWwsIG1pbl92YWwsIGJlc3Rfbm9kZSA9IDA7CisJaW50IGksIG4sIHZhbCwgbWluX3ZhbCwgYmVzdF9ub2RlID0gLTE7CiAKIAltaW5fdmFsID0gSU5UX01BWDsKIApAQCAtNjgxMSw3ICs2ODMzLDggQEAKIAkJfQogCX0KIAotCW5vZGVfc2V0KGJlc3Rfbm9kZSwgKnVzZWRfbm9kZXMpOworCWlmIChiZXN0X25vZGUgIT0gLTEpCisJCW5vZGVfc2V0KGJlc3Rfbm9kZSwgKnVzZWRfbm9kZXMpOwogCXJldHVybiBiZXN0X25vZGU7CiB9CiAKQEAgLTY4MzcsMzE1ICs2ODYwLDEzMCBAQAogCiAJZm9yIChpID0gMTsgaSA8IFNEX05PREVTX1BFUl9ET01BSU47IGkrKykgewogCQlpbnQgbmV4dF9ub2RlID0gZmluZF9uZXh0X2Jlc3Rfbm9kZShub2RlLCAmdXNlZF9ub2Rlcyk7Ci0KKwkJaWYgKG5leHRfbm9kZSA8IDApCisJCQlicmVhazsKIAkJY3B1bWFza19vcihzcGFuLCBzcGFuLCBjcHVtYXNrX29mX25vZGUobmV4dF9ub2RlKSk7CiAJfQogfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9ub2RlX21hc2soaW50IGNwdSkKK3sKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZzY2hlZF9kb21haW5zX211dGV4KTsKKworCXNjaGVkX2RvbWFpbl9ub2RlX3NwYW4oY3B1X3RvX25vZGUoY3B1KSwgc2NoZWRfZG9tYWluc190bXBtYXNrKTsKKworCXJldHVybiBzY2hlZF9kb21haW5zX3RtcG1hc2s7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1X2FsbG5vZGVzX21hc2soaW50IGNwdSkKK3sKKwlyZXR1cm4gY3B1X3Bvc3NpYmxlX21hc2s7Cit9CiAjZW5kaWYgLyogQ09ORklHX05VTUEgKi8KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVfY3B1X21hc2soaW50IGNwdSkKK3sKKwlyZXR1cm4gY3B1bWFza19vZl9ub2RlKGNwdV90b19ub2RlKGNwdSkpOworfQorCiBpbnQgc2NoZWRfc210X3Bvd2VyX3NhdmluZ3MgPSAwLCBzY2hlZF9tY19wb3dlcl9zYXZpbmdzID0gMDsKIAotLyoKLSAqIFRoZSBjcHVzIG1hc2sgaW4gc2NoZWRfZ3JvdXAgYW5kIHNjaGVkX2RvbWFpbiBoYW5ncyBvZmYgdGhlIGVuZC4KLSAqCi0gKiAoIFNlZSB0aGUgdGhlIGNvbW1lbnRzIGluIGluY2x1ZGUvbGludXgvc2NoZWQuaDpzdHJ1Y3Qgc2NoZWRfZ3JvdXAKLSAqICAgYW5kIHN0cnVjdCBzY2hlZF9kb21haW4uICkKLSAqLwotc3RydWN0IHN0YXRpY19zY2hlZF9ncm91cCB7Ci0Jc3RydWN0IHNjaGVkX2dyb3VwIHNnOwotCURFQ0xBUkVfQklUTUFQKGNwdXMsIENPTkZJR19OUl9DUFVTKTsKLX07Ci0KLXN0cnVjdCBzdGF0aWNfc2NoZWRfZG9tYWluIHsKLQlzdHJ1Y3Qgc2NoZWRfZG9tYWluIHNkOwotCURFQ0xBUkVfQklUTUFQKHNwYW4sIENPTkZJR19OUl9DUFVTKTsKK3N0cnVjdCBzZF9kYXRhIHsKKwlzdHJ1Y3Qgc2NoZWRfZG9tYWluICoqX19wZXJjcHUgc2Q7CisJc3RydWN0IHNjaGVkX2dyb3VwICoqX19wZXJjcHUgc2c7CiB9OwogCiBzdHJ1Y3Qgc19kYXRhIHsKLSNpZmRlZiBDT05GSUdfTlVNQQotCWludAkJCXNkX2FsbG5vZGVzOwotCWNwdW1hc2tfdmFyX3QJCWRvbWFpbnNwYW47Ci0JY3B1bWFza192YXJfdAkJY292ZXJlZDsKLQljcHVtYXNrX3Zhcl90CQlub3Rjb3ZlcmVkOwotI2VuZGlmCi0JY3B1bWFza192YXJfdAkJbm9kZW1hc2s7Ci0JY3B1bWFza192YXJfdAkJdGhpc19zaWJsaW5nX21hcDsKLQljcHVtYXNrX3Zhcl90CQl0aGlzX2NvcmVfbWFwOwotCWNwdW1hc2tfdmFyX3QJCXRoaXNfYm9va19tYXA7Ci0JY3B1bWFza192YXJfdAkJc2VuZF9jb3ZlcmVkOwotCWNwdW1hc2tfdmFyX3QJCXRtcG1hc2s7Ci0Jc3RydWN0IHNjaGVkX2dyb3VwCSoqc2NoZWRfZ3JvdXBfbm9kZXM7CisJc3RydWN0IHNjaGVkX2RvbWFpbiAqKiBfX3BlcmNwdSBzZDsKIAlzdHJ1Y3Qgcm9vdF9kb21haW4JKnJkOwogfTsKIAogZW51bSBzX2FsbG9jIHsKLQlzYV9zY2hlZF9ncm91cHMgPSAwLAogCXNhX3Jvb3Rkb21haW4sCi0Jc2FfdG1wbWFzaywKLQlzYV9zZW5kX2NvdmVyZWQsCi0Jc2FfdGhpc19ib29rX21hcCwKLQlzYV90aGlzX2NvcmVfbWFwLAotCXNhX3RoaXNfc2libGluZ19tYXAsCi0Jc2Ffbm9kZW1hc2ssCi0Jc2Ffc2NoZWRfZ3JvdXBfbm9kZXMsCi0jaWZkZWYgQ09ORklHX05VTUEKLQlzYV9ub3Rjb3ZlcmVkLAotCXNhX2NvdmVyZWQsCi0Jc2FfZG9tYWluc3BhbiwKLSNlbmRpZgorCXNhX3NkLAorCXNhX3NkX3N0b3JhZ2UsCiAJc2Ffbm9uZSwKIH07CiAKLS8qCi0gKiBTTVQgc2NoZWQtZG9tYWluczoKLSAqLwotI2lmZGVmIENPTkZJR19TQ0hFRF9TTVQKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc3RhdGljX3NjaGVkX2RvbWFpbiwgY3B1X2RvbWFpbnMpOwotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzdGF0aWNfc2NoZWRfZ3JvdXAsIHNjaGVkX2dyb3Vwcyk7CitzdHJ1Y3Qgc2NoZWRfZG9tYWluX3RvcG9sb2d5X2xldmVsOwogCi1zdGF0aWMgaW50Ci1jcHVfdG9fY3B1X2dyb3VwKGludCBjcHUsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVfbWFwLAotCQkgc3RydWN0IHNjaGVkX2dyb3VwICoqc2csIHN0cnVjdCBjcHVtYXNrICp1bnVzZWQpCit0eXBlZGVmIHN0cnVjdCBzY2hlZF9kb21haW4gKigqc2NoZWRfZG9tYWluX2luaXRfZikoc3RydWN0IHNjaGVkX2RvbWFpbl90b3BvbG9neV9sZXZlbCAqdGwsIGludCBjcHUpOwordHlwZWRlZiBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqKCpzY2hlZF9kb21haW5fbWFza19mKShpbnQgY3B1KTsKKworc3RydWN0IHNjaGVkX2RvbWFpbl90b3BvbG9neV9sZXZlbCB7CisJc2NoZWRfZG9tYWluX2luaXRfZiBpbml0OworCXNjaGVkX2RvbWFpbl9tYXNrX2YgbWFzazsKKwlzdHJ1Y3Qgc2RfZGF0YSAgICAgIGRhdGE7Cit9OworCisvKgorICogQXNzdW1lcyB0aGUgc2NoZWRfZG9tYWluIHRyZWUgaXMgZnVsbHkgY29uc3RydWN0ZWQKKyAqLworc3RhdGljIGludCBnZXRfZ3JvdXAoaW50IGNwdSwgc3RydWN0IHNkX2RhdGEgKnNkZCwgc3RydWN0IHNjaGVkX2dyb3VwICoqc2cpCiB7CisJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QgPSAqcGVyX2NwdV9wdHIoc2RkLT5zZCwgY3B1KTsKKwlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpjaGlsZCA9IHNkLT5jaGlsZDsKKworCWlmIChjaGlsZCkKKwkJY3B1ID0gY3B1bWFza19maXJzdChzY2hlZF9kb21haW5fc3BhbihjaGlsZCkpOworCiAJaWYgKHNnKQotCQkqc2cgPSAmcGVyX2NwdShzY2hlZF9ncm91cHMsIGNwdSkuc2c7CisJCSpzZyA9ICpwZXJfY3B1X3B0cihzZGQtPnNnLCBjcHUpOworCiAJcmV0dXJuIGNwdTsKIH0KLSNlbmRpZiAvKiBDT05GSUdfU0NIRURfU01UICovCiAKIC8qCi0gKiBtdWx0aS1jb3JlIHNjaGVkLWRvbWFpbnM6CisgKiBidWlsZF9zY2hlZF9ncm91cHMgdGFrZXMgdGhlIGNwdW1hc2sgd2Ugd2lzaCB0byBzcGFuLCBhbmQgYSBwb2ludGVyCisgKiB0byBhIGZ1bmN0aW9uIHdoaWNoIGlkZW50aWZpZXMgd2hhdCBncm91cChhbG9uZyB3aXRoIHNjaGVkIGdyb3VwKSBhIENQVQorICogYmVsb25ncyB0by4gVGhlIHJldHVybiB2YWx1ZSBvZiBncm91cF9mbiBtdXN0IGJlIGEgPj0gMCBhbmQgPCBucl9jcHVfaWRzCisgKiAoZHVlIHRvIHRoZSBmYWN0IHRoYXQgd2Uga2VlcCB0cmFjayBvZiBncm91cHMgY292ZXJlZCB3aXRoIGEgc3RydWN0IGNwdW1hc2spLgorICoKKyAqIGJ1aWxkX3NjaGVkX2dyb3VwcyB3aWxsIGJ1aWxkIGEgY2lyY3VsYXIgbGlua2VkIGxpc3Qgb2YgdGhlIGdyb3VwcworICogY292ZXJlZCBieSB0aGUgZ2l2ZW4gc3BhbiwgYW5kIHdpbGwgc2V0IGVhY2ggZ3JvdXAncyAtPmNwdW1hc2sgY29ycmVjdGx5LAorICogYW5kIC0+Y3B1X3Bvd2VyIHRvIDAuCiAgKi8KLSNpZmRlZiBDT05GSUdfU0NIRURfTUMKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc3RhdGljX3NjaGVkX2RvbWFpbiwgY29yZV9kb21haW5zKTsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc3RhdGljX3NjaGVkX2dyb3VwLCBzY2hlZF9ncm91cF9jb3JlKTsKLQotc3RhdGljIGludAotY3B1X3RvX2NvcmVfZ3JvdXAoaW50IGNwdSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9tYXAsCi0JCSAgc3RydWN0IHNjaGVkX2dyb3VwICoqc2csIHN0cnVjdCBjcHVtYXNrICptYXNrKQorc3RhdGljIHZvaWQKK2J1aWxkX3NjaGVkX2dyb3VwcyhzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCkKIHsKLQlpbnQgZ3JvdXA7Ci0jaWZkZWYgQ09ORklHX1NDSEVEX1NNVAotCWNwdW1hc2tfYW5kKG1hc2ssIHRvcG9sb2d5X3RocmVhZF9jcHVtYXNrKGNwdSksIGNwdV9tYXApOwotCWdyb3VwID0gY3B1bWFza19maXJzdChtYXNrKTsKLSNlbHNlCi0JZ3JvdXAgPSBjcHU7Ci0jZW5kaWYKLQlpZiAoc2cpCi0JCSpzZyA9ICZwZXJfY3B1KHNjaGVkX2dyb3VwX2NvcmUsIGdyb3VwKS5zZzsKLQlyZXR1cm4gZ3JvdXA7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1NDSEVEX01DICovCisJc3RydWN0IHNjaGVkX2dyb3VwICpmaXJzdCA9IE5VTEwsICpsYXN0ID0gTlVMTDsKKwlzdHJ1Y3Qgc2RfZGF0YSAqc2RkID0gc2QtPnByaXZhdGU7CisJY29uc3Qgc3RydWN0IGNwdW1hc2sgKnNwYW4gPSBzY2hlZF9kb21haW5fc3BhbihzZCk7CisJc3RydWN0IGNwdW1hc2sgKmNvdmVyZWQ7CisJaW50IGk7CiAKLS8qCi0gKiBib29rIHNjaGVkLWRvbWFpbnM6Ci0gKi8KLSNpZmRlZiBDT05GSUdfU0NIRURfQk9PSwotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzdGF0aWNfc2NoZWRfZG9tYWluLCBib29rX2RvbWFpbnMpOwotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzdGF0aWNfc2NoZWRfZ3JvdXAsIHNjaGVkX2dyb3VwX2Jvb2spOworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnNjaGVkX2RvbWFpbnNfbXV0ZXgpOworCWNvdmVyZWQgPSBzY2hlZF9kb21haW5zX3RtcG1hc2s7CiAKLXN0YXRpYyBpbnQKLWNwdV90b19ib29rX2dyb3VwKGludCBjcHUsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVfbWFwLAotCQkgIHN0cnVjdCBzY2hlZF9ncm91cCAqKnNnLCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKLXsKLQlpbnQgZ3JvdXAgPSBjcHU7Ci0jaWZkZWYgQ09ORklHX1NDSEVEX01DCi0JY3B1bWFza19hbmQobWFzaywgY3B1X2NvcmVncm91cF9tYXNrKGNwdSksIGNwdV9tYXApOwotCWdyb3VwID0gY3B1bWFza19maXJzdChtYXNrKTsKLSNlbGlmIGRlZmluZWQoQ09ORklHX1NDSEVEX1NNVCkKLQljcHVtYXNrX2FuZChtYXNrLCB0b3BvbG9neV90aHJlYWRfY3B1bWFzayhjcHUpLCBjcHVfbWFwKTsKLQlncm91cCA9IGNwdW1hc2tfZmlyc3QobWFzayk7Ci0jZW5kaWYKLQlpZiAoc2cpCi0JCSpzZyA9ICZwZXJfY3B1KHNjaGVkX2dyb3VwX2Jvb2ssIGdyb3VwKS5zZzsKLQlyZXR1cm4gZ3JvdXA7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1NDSEVEX0JPT0sgKi8KKwljcHVtYXNrX2NsZWFyKGNvdmVyZWQpOwogCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHN0YXRpY19zY2hlZF9kb21haW4sIHBoeXNfZG9tYWlucyk7Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHN0YXRpY19zY2hlZF9ncm91cCwgc2NoZWRfZ3JvdXBfcGh5cyk7CisJZm9yX2VhY2hfY3B1KGksIHNwYW4pIHsKKwkJc3RydWN0IHNjaGVkX2dyb3VwICpzZzsKKwkJaW50IGdyb3VwID0gZ2V0X2dyb3VwKGksIHNkZCwgJnNnKTsKKwkJaW50IGo7CiAKLXN0YXRpYyBpbnQKLWNwdV90b19waHlzX2dyb3VwKGludCBjcHUsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVfbWFwLAotCQkgIHN0cnVjdCBzY2hlZF9ncm91cCAqKnNnLCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKLXsKLQlpbnQgZ3JvdXA7Ci0jaWZkZWYgQ09ORklHX1NDSEVEX0JPT0sKLQljcHVtYXNrX2FuZChtYXNrLCBjcHVfYm9va19tYXNrKGNwdSksIGNwdV9tYXApOwotCWdyb3VwID0gY3B1bWFza19maXJzdChtYXNrKTsKLSNlbGlmIGRlZmluZWQoQ09ORklHX1NDSEVEX01DKQotCWNwdW1hc2tfYW5kKG1hc2ssIGNwdV9jb3JlZ3JvdXBfbWFzayhjcHUpLCBjcHVfbWFwKTsKLQlncm91cCA9IGNwdW1hc2tfZmlyc3QobWFzayk7Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19TQ0hFRF9TTVQpCi0JY3B1bWFza19hbmQobWFzaywgdG9wb2xvZ3lfdGhyZWFkX2NwdW1hc2soY3B1KSwgY3B1X21hcCk7Ci0JZ3JvdXAgPSBjcHVtYXNrX2ZpcnN0KG1hc2spOwotI2Vsc2UKLQlncm91cCA9IGNwdTsKLSNlbmRpZgotCWlmIChzZykKLQkJKnNnID0gJnBlcl9jcHUoc2NoZWRfZ3JvdXBfcGh5cywgZ3JvdXApLnNnOwotCXJldHVybiBncm91cDsKLX0KLQotI2lmZGVmIENPTkZJR19OVU1BCi0vKgotICogVGhlIGluaXRfc2NoZWRfYnVpbGRfZ3JvdXBzIGNhbid0IGhhbmRsZSB3aGF0IHdlIHdhbnQgdG8gZG8gd2l0aCBub2RlCi0gKiBncm91cHMsIHNvIHJvbGwgb3VyIG93bi4gTm93IGVhY2ggbm9kZSBoYXMgaXRzIG93biBsaXN0IG9mIGdyb3VwcyB3aGljaAotICogZ2V0cyBkeW5hbWljYWxseSBhbGxvY2F0ZWQuCi0gKi8KLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc3RhdGljX3NjaGVkX2RvbWFpbiwgbm9kZV9kb21haW5zKTsKLXN0YXRpYyBzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKioqc2NoZWRfZ3JvdXBfbm9kZXNfYnljcHU7Ci0KLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc3RhdGljX3NjaGVkX2RvbWFpbiwgYWxsbm9kZXNfZG9tYWlucyk7Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHN0YXRpY19zY2hlZF9ncm91cCwgc2NoZWRfZ3JvdXBfYWxsbm9kZXMpOwotCi1zdGF0aWMgaW50IGNwdV90b19hbGxub2Rlc19ncm91cChpbnQgY3B1LCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1X21hcCwKLQkJCQkgc3RydWN0IHNjaGVkX2dyb3VwICoqc2csCi0JCQkJIHN0cnVjdCBjcHVtYXNrICpub2RlbWFzaykKLXsKLQlpbnQgZ3JvdXA7Ci0KLQljcHVtYXNrX2FuZChub2RlbWFzaywgY3B1bWFza19vZl9ub2RlKGNwdV90b19ub2RlKGNwdSkpLCBjcHVfbWFwKTsKLQlncm91cCA9IGNwdW1hc2tfZmlyc3Qobm9kZW1hc2spOwotCi0JaWYgKHNnKQotCQkqc2cgPSAmcGVyX2NwdShzY2hlZF9ncm91cF9hbGxub2RlcywgZ3JvdXApLnNnOwotCXJldHVybiBncm91cDsKLX0KLQotc3RhdGljIHZvaWQgaW5pdF9udW1hX3NjaGVkX2dyb3Vwc19wb3dlcihzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKmdyb3VwX2hlYWQpCi17Ci0Jc3RydWN0IHNjaGVkX2dyb3VwICpzZyA9IGdyb3VwX2hlYWQ7Ci0JaW50IGo7Ci0KLQlpZiAoIXNnKQotCQlyZXR1cm47Ci0JZG8gewotCQlmb3JfZWFjaF9jcHUoaiwgc2NoZWRfZ3JvdXBfY3B1cyhzZykpIHsKLQkJCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOwotCi0JCQlzZCA9ICZwZXJfY3B1KHBoeXNfZG9tYWlucywgaikuc2Q7Ci0JCQlpZiAoaiAhPSBncm91cF9maXJzdF9jcHUoc2QtPmdyb3VwcykpIHsKLQkJCQkvKgotCQkJCSAqIE9ubHkgYWRkICJwb3dlciIgb25jZSBmb3IgZWFjaAotCQkJCSAqIHBoeXNpY2FsIHBhY2thZ2UuCi0JCQkJICovCi0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCXNnLT5jcHVfcG93ZXIgKz0gc2QtPmdyb3Vwcy0+Y3B1X3Bvd2VyOwotCQl9Ci0JCXNnID0gc2ctPm5leHQ7Ci0JfSB3aGlsZSAoc2cgIT0gZ3JvdXBfaGVhZCk7Ci19Ci0KLXN0YXRpYyBpbnQgYnVpbGRfbnVtYV9zY2hlZF9ncm91cHMoc3RydWN0IHNfZGF0YSAqZCwKLQkJCQkgICBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1X21hcCwgaW50IG51bSkKLXsKLQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKLQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnLCAqcHJldjsKLQlpbnQgbiwgajsKLQotCWNwdW1hc2tfY2xlYXIoZC0+Y292ZXJlZCk7Ci0JY3B1bWFza19hbmQoZC0+bm9kZW1hc2ssIGNwdW1hc2tfb2Zfbm9kZShudW0pLCBjcHVfbWFwKTsKLQlpZiAoY3B1bWFza19lbXB0eShkLT5ub2RlbWFzaykpIHsKLQkJZC0+c2NoZWRfZ3JvdXBfbm9kZXNbbnVtXSA9IE5VTEw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXNjaGVkX2RvbWFpbl9ub2RlX3NwYW4obnVtLCBkLT5kb21haW5zcGFuKTsKLQljcHVtYXNrX2FuZChkLT5kb21haW5zcGFuLCBkLT5kb21haW5zcGFuLCBjcHVfbWFwKTsKLQotCXNnID0ga21hbGxvY19ub2RlKHNpemVvZihzdHJ1Y3Qgc2NoZWRfZ3JvdXApICsgY3B1bWFza19zaXplKCksCi0JCQkgIEdGUF9LRVJORUwsIG51bSk7Ci0JaWYgKCFzZykgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4gbm90IGFsbG9jIGRvbWFpbiBncm91cCBmb3Igbm9kZSAlZFxuIiwKLQkJICAgICAgIG51bSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlkLT5zY2hlZF9ncm91cF9ub2Rlc1tudW1dID0gc2c7Ci0KLQlmb3JfZWFjaF9jcHUoaiwgZC0+bm9kZW1hc2spIHsKLQkJc2QgPSAmcGVyX2NwdShub2RlX2RvbWFpbnMsIGopLnNkOwotCQlzZC0+Z3JvdXBzID0gc2c7Ci0JfQotCi0Jc2ctPmNwdV9wb3dlciA9IDA7Ci0JY3B1bWFza19jb3B5KHNjaGVkX2dyb3VwX2NwdXMoc2cpLCBkLT5ub2RlbWFzayk7Ci0Jc2ctPm5leHQgPSBzZzsKLQljcHVtYXNrX29yKGQtPmNvdmVyZWQsIGQtPmNvdmVyZWQsIGQtPm5vZGVtYXNrKTsKLQotCXByZXYgPSBzZzsKLQlmb3IgKGogPSAwOyBqIDwgbnJfbm9kZV9pZHM7IGorKykgewotCQluID0gKG51bSArIGopICUgbnJfbm9kZV9pZHM7Ci0JCWNwdW1hc2tfY29tcGxlbWVudChkLT5ub3Rjb3ZlcmVkLCBkLT5jb3ZlcmVkKTsKLQkJY3B1bWFza19hbmQoZC0+dG1wbWFzaywgZC0+bm90Y292ZXJlZCwgY3B1X21hcCk7Ci0JCWNwdW1hc2tfYW5kKGQtPnRtcG1hc2ssIGQtPnRtcG1hc2ssIGQtPmRvbWFpbnNwYW4pOwotCQlpZiAoY3B1bWFza19lbXB0eShkLT50bXBtYXNrKSkKLQkJCWJyZWFrOwotCQljcHVtYXNrX2FuZChkLT50bXBtYXNrLCBkLT50bXBtYXNrLCBjcHVtYXNrX29mX25vZGUobikpOwotCQlpZiAoY3B1bWFza19lbXB0eShkLT50bXBtYXNrKSkKKwkJaWYgKGNwdW1hc2tfdGVzdF9jcHUoaSwgY292ZXJlZCkpCiAJCQljb250aW51ZTsKLQkJc2cgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBzY2hlZF9ncm91cCkgKyBjcHVtYXNrX3NpemUoKSwKLQkJCQkgIEdGUF9LRVJORUwsIG51bSk7Ci0JCWlmICghc2cpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAiQ2FuIG5vdCBhbGxvYyBkb21haW4gZ3JvdXAgZm9yIG5vZGUgJWRcbiIsIGopOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KKworCQljcHVtYXNrX2NsZWFyKHNjaGVkX2dyb3VwX2NwdXMoc2cpKTsKIAkJc2ctPmNwdV9wb3dlciA9IDA7Ci0JCWNwdW1hc2tfY29weShzY2hlZF9ncm91cF9jcHVzKHNnKSwgZC0+dG1wbWFzayk7Ci0JCXNnLT5uZXh0ID0gcHJldi0+bmV4dDsKLQkJY3B1bWFza19vcihkLT5jb3ZlcmVkLCBkLT5jb3ZlcmVkLCBkLT50bXBtYXNrKTsKLQkJcHJldi0+bmV4dCA9IHNnOwotCQlwcmV2ID0gc2c7Ci0JfQotb3V0OgotCXJldHVybiAwOwotfQotI2VuZGlmIC8qIENPTkZJR19OVU1BICovCiAKLSNpZmRlZiBDT05GSUdfTlVNQQotLyogRnJlZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB2YXJpb3VzIHNjaGVkX2dyb3VwIHN0cnVjdHVyZXMgKi8KLXN0YXRpYyB2b2lkIGZyZWVfc2NoZWRfZ3JvdXBzKGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVfbWFwLAotCQkJICAgICAgc3RydWN0IGNwdW1hc2sgKm5vZGVtYXNrKQotewotCWludCBjcHUsIGk7Ci0KLQlmb3JfZWFjaF9jcHUoY3B1LCBjcHVfbWFwKSB7Ci0JCXN0cnVjdCBzY2hlZF9ncm91cCAqKnNjaGVkX2dyb3VwX25vZGVzCi0JCQk9IHNjaGVkX2dyb3VwX25vZGVzX2J5Y3B1W2NwdV07Ci0KLQkJaWYgKCFzY2hlZF9ncm91cF9ub2RlcykKLQkJCWNvbnRpbnVlOwotCi0JCWZvciAoaSA9IDA7IGkgPCBucl9ub2RlX2lkczsgaSsrKSB7Ci0JCQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKm9sZHNnLCAqc2cgPSBzY2hlZF9ncm91cF9ub2Rlc1tpXTsKLQotCQkJY3B1bWFza19hbmQobm9kZW1hc2ssIGNwdW1hc2tfb2Zfbm9kZShpKSwgY3B1X21hcCk7Ci0JCQlpZiAoY3B1bWFza19lbXB0eShub2RlbWFzaykpCisJCWZvcl9lYWNoX2NwdShqLCBzcGFuKSB7CisJCQlpZiAoZ2V0X2dyb3VwKGosIHNkZCwgTlVMTCkgIT0gZ3JvdXApCiAJCQkJY29udGludWU7CiAKLQkJCWlmIChzZyA9PSBOVUxMKQotCQkJCWNvbnRpbnVlOwotCQkJc2cgPSBzZy0+bmV4dDsKLW5leHRfc2c6Ci0JCQlvbGRzZyA9IHNnOwotCQkJc2cgPSBzZy0+bmV4dDsKLQkJCWtmcmVlKG9sZHNnKTsKLQkJCWlmIChvbGRzZyAhPSBzY2hlZF9ncm91cF9ub2Rlc1tpXSkKLQkJCQlnb3RvIG5leHRfc2c7CisJCQljcHVtYXNrX3NldF9jcHUoaiwgY292ZXJlZCk7CisJCQljcHVtYXNrX3NldF9jcHUoaiwgc2NoZWRfZ3JvdXBfY3B1cyhzZykpOwogCQl9Ci0JCWtmcmVlKHNjaGVkX2dyb3VwX25vZGVzKTsKLQkJc2NoZWRfZ3JvdXBfbm9kZXNfYnljcHVbY3B1XSA9IE5VTEw7CisKKwkJaWYgKCFmaXJzdCkKKwkJCWZpcnN0ID0gc2c7CisJCWlmIChsYXN0KQorCQkJbGFzdC0+bmV4dCA9IHNnOworCQlsYXN0ID0gc2c7CiAJfQorCWxhc3QtPm5leHQgPSBmaXJzdDsKIH0KLSNlbHNlIC8qICFDT05GSUdfTlVNQSAqLwotc3RhdGljIHZvaWQgZnJlZV9zY2hlZF9ncm91cHMoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9tYXAsCi0JCQkgICAgICBzdHJ1Y3QgY3B1bWFzayAqbm9kZW1hc2spCi17Ci19Ci0jZW5kaWYgLyogQ09ORklHX05VTUEgKi8KIAogLyoKICAqIEluaXRpYWxpemUgc2NoZWQgZ3JvdXBzIGNwdV9wb3dlci4KQEAgLTcxNTksMTEgKzY5OTcsNiBAQAogICovCiBzdGF0aWMgdm9pZCBpbml0X3NjaGVkX2dyb3Vwc19wb3dlcihpbnQgY3B1LCBzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCkKIHsKLQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpjaGlsZDsKLQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKmdyb3VwOwotCWxvbmcgcG93ZXI7Ci0JaW50IHdlaWdodDsKLQogCVdBUk5fT04oIXNkIHx8ICFzZC0+Z3JvdXBzKTsKIAogCWlmIChjcHUgIT0gZ3JvdXBfZmlyc3RfY3B1KHNkLT5ncm91cHMpKQpAQCAtNzE3MSwzNiArNzAwNCw3IEBACiAKIAlzZC0+Z3JvdXBzLT5ncm91cF93ZWlnaHQgPSBjcHVtYXNrX3dlaWdodChzY2hlZF9ncm91cF9jcHVzKHNkLT5ncm91cHMpKTsKIAotCWNoaWxkID0gc2QtPmNoaWxkOwotCi0Jc2QtPmdyb3Vwcy0+Y3B1X3Bvd2VyID0gMDsKLQotCWlmICghY2hpbGQpIHsKLQkJcG93ZXIgPSBTQ0hFRF9MT0FEX1NDQUxFOwotCQl3ZWlnaHQgPSBjcHVtYXNrX3dlaWdodChzY2hlZF9kb21haW5fc3BhbihzZCkpOwotCQkvKgotCQkgKiBTTVQgc2libGluZ3Mgc2hhcmUgdGhlIHBvd2VyIG9mIGEgc2luZ2xlIGNvcmUuCi0JCSAqIFVzdWFsbHkgbXVsdGlwbGUgdGhyZWFkcyBnZXQgYSBiZXR0ZXIgeWllbGQgb3V0IG9mCi0JCSAqIHRoYXQgb25lIGNvcmUgdGhhbiBhIHNpbmdsZSB0aHJlYWQgd291bGQgaGF2ZSwKLQkJICogcmVmbGVjdCB0aGF0IGluIHNkLT5zbXRfZ2Fpbi4KLQkJICovCi0JCWlmICgoc2QtPmZsYWdzICYgU0RfU0hBUkVfQ1BVUE9XRVIpICYmIHdlaWdodCA+IDEpIHsKLQkJCXBvd2VyICo9IHNkLT5zbXRfZ2FpbjsKLQkJCXBvd2VyIC89IHdlaWdodDsKLQkJCXBvd2VyID4+PSBTQ0hFRF9MT0FEX1NISUZUOwotCQl9Ci0JCXNkLT5ncm91cHMtPmNwdV9wb3dlciArPSBwb3dlcjsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogQWRkIGNwdV9wb3dlciBvZiBlYWNoIGNoaWxkIGdyb3VwIHRvIHRoaXMgZ3JvdXBzIGNwdV9wb3dlci4KLQkgKi8KLQlncm91cCA9IGNoaWxkLT5ncm91cHM7Ci0JZG8gewotCQlzZC0+Z3JvdXBzLT5jcHVfcG93ZXIgKz0gZ3JvdXAtPmNwdV9wb3dlcjsKLQkJZ3JvdXAgPSBncm91cC0+bmV4dDsKLQl9IHdoaWxlIChncm91cCAhPSBjaGlsZC0+Z3JvdXBzKTsKKwl1cGRhdGVfZ3JvdXBfcG93ZXIoc2QsIGNwdSk7CiB9CiAKIC8qCkBAIC03MjE0LDE1ICs3MDE4LDE1IEBACiAjIGRlZmluZSBTRF9JTklUX05BTUUoc2QsIHR5cGUpCQlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAotI2RlZmluZQlTRF9JTklUKHNkLCB0eXBlKQlzZF9pbml0XyMjdHlwZShzZCkKLQotI2RlZmluZSBTRF9JTklUX0ZVTkModHlwZSkJXAotc3RhdGljIG5vaW5saW5lIHZvaWQgc2RfaW5pdF8jI3R5cGUoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QpCVwKLXsJCQkJCQkJCVwKLQltZW1zZXQoc2QsIDAsIHNpemVvZigqc2QpKTsJCQkJXAotCSpzZCA9IFNEXyMjdHlwZSMjX0lOSVQ7CQkJCQlcCi0Jc2QtPmxldmVsID0gU0RfTFZfIyN0eXBlOwkJCQlcCi0JU0RfSU5JVF9OQU1FKHNkLCB0eXBlKTsJCQkJCVwKKyNkZWZpbmUgU0RfSU5JVF9GVU5DKHR5cGUpCQkJCQkJXAorc3RhdGljIG5vaW5saW5lIHN0cnVjdCBzY2hlZF9kb21haW4gKgkJCQkJXAorc2RfaW5pdF8jI3R5cGUoc3RydWN0IHNjaGVkX2RvbWFpbl90b3BvbG9neV9sZXZlbCAqdGwsIGludCBjcHUpIAlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkID0gKnBlcl9jcHVfcHRyKHRsLT5kYXRhLnNkLCBjcHUpOwlcCisJKnNkID0gU0RfIyN0eXBlIyNfSU5JVDsJCQkJCQlcCisJU0RfSU5JVF9OQU1FKHNkLCB0eXBlKTsJCQkJCQlcCisJc2QtPnByaXZhdGUgPSAmdGwtPmRhdGE7CQkJCQlcCisJcmV0dXJuIHNkOwkJCQkJCQlcCiB9CiAKIFNEX0lOSVRfRlVOQyhDUFUpCkBAIC03MjQxLDEzICs3MDQ1LDE0IEBACiAjZW5kaWYKIAogc3RhdGljIGludCBkZWZhdWx0X3JlbGF4X2RvbWFpbl9sZXZlbCA9IC0xOworaW50IHNjaGVkX2RvbWFpbl9sZXZlbF9tYXg7CiAKIHN0YXRpYyBpbnQgX19pbml0IHNldHVwX3JlbGF4X2RvbWFpbl9sZXZlbChjaGFyICpzdHIpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAKIAl2YWwgPSBzaW1wbGVfc3RydG91bChzdHIsIE5VTEwsIDApOwotCWlmICh2YWwgPCBTRF9MVl9NQVgpCisJaWYgKHZhbCA8IHNjaGVkX2RvbWFpbl9sZXZlbF9tYXgpCiAJCWRlZmF1bHRfcmVsYXhfZG9tYWluX2xldmVsID0gdmFsOwogCiAJcmV0dXJuIDE7CkBAIC03Mjc1LDM3ICs3MDgwLDIwIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBfX3NkdF9mcmVlKGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVfbWFwKTsKK3N0YXRpYyBpbnQgX19zZHRfYWxsb2MoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9tYXApOworCiBzdGF0aWMgdm9pZCBfX2ZyZWVfZG9tYWluX2FsbG9jcyhzdHJ1Y3Qgc19kYXRhICpkLCBlbnVtIHNfYWxsb2Mgd2hhdCwKIAkJCQkgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9tYXApCiB7CiAJc3dpdGNoICh3aGF0KSB7Ci0JY2FzZSBzYV9zY2hlZF9ncm91cHM6Ci0JCWZyZWVfc2NoZWRfZ3JvdXBzKGNwdV9tYXAsIGQtPnRtcG1hc2spOyAvKiBmYWxsIHRocm91Z2ggKi8KLQkJZC0+c2NoZWRfZ3JvdXBfbm9kZXMgPSBOVUxMOwogCWNhc2Ugc2Ffcm9vdGRvbWFpbjoKLQkJZnJlZV9yb290ZG9tYWluKGQtPnJkKTsgLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZSBzYV90bXBtYXNrOgotCQlmcmVlX2NwdW1hc2tfdmFyKGQtPnRtcG1hc2spOyAvKiBmYWxsIHRocm91Z2ggKi8KLQljYXNlIHNhX3NlbmRfY292ZXJlZDoKLQkJZnJlZV9jcHVtYXNrX3ZhcihkLT5zZW5kX2NvdmVyZWQpOyAvKiBmYWxsIHRocm91Z2ggKi8KLQljYXNlIHNhX3RoaXNfYm9va19tYXA6Ci0JCWZyZWVfY3B1bWFza192YXIoZC0+dGhpc19ib29rX21hcCk7IC8qIGZhbGwgdGhyb3VnaCAqLwotCWNhc2Ugc2FfdGhpc19jb3JlX21hcDoKLQkJZnJlZV9jcHVtYXNrX3ZhcihkLT50aGlzX2NvcmVfbWFwKTsgLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZSBzYV90aGlzX3NpYmxpbmdfbWFwOgotCQlmcmVlX2NwdW1hc2tfdmFyKGQtPnRoaXNfc2libGluZ19tYXApOyAvKiBmYWxsIHRocm91Z2ggKi8KLQljYXNlIHNhX25vZGVtYXNrOgotCQlmcmVlX2NwdW1hc2tfdmFyKGQtPm5vZGVtYXNrKTsgLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZSBzYV9zY2hlZF9ncm91cF9ub2RlczoKLSNpZmRlZiBDT05GSUdfTlVNQQotCQlrZnJlZShkLT5zY2hlZF9ncm91cF9ub2Rlcyk7IC8qIGZhbGwgdGhyb3VnaCAqLwotCWNhc2Ugc2Ffbm90Y292ZXJlZDoKLQkJZnJlZV9jcHVtYXNrX3ZhcihkLT5ub3Rjb3ZlcmVkKTsgLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZSBzYV9jb3ZlcmVkOgotCQlmcmVlX2NwdW1hc2tfdmFyKGQtPmNvdmVyZWQpOyAvKiBmYWxsIHRocm91Z2ggKi8KLQljYXNlIHNhX2RvbWFpbnNwYW46Ci0JCWZyZWVfY3B1bWFza192YXIoZC0+ZG9tYWluc3Bhbik7IC8qIGZhbGwgdGhyb3VnaCAqLwotI2VuZGlmCisJCWlmICghYXRvbWljX3JlYWQoJmQtPnJkLT5yZWZjb3VudCkpCisJCQlmcmVlX3Jvb3Rkb21haW4oJmQtPnJkLT5yY3UpOyAvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIHNhX3NkOgorCQlmcmVlX3BlcmNwdShkLT5zZCk7IC8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2Ugc2Ffc2Rfc3RvcmFnZToKKwkJX19zZHRfZnJlZShjcHVfbWFwKTsgLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBzYV9ub25lOgogCQlicmVhazsKIAl9CkBAIC03MzE0LDMwOCArNzEwMiwyMTIgQEAKIHN0YXRpYyBlbnVtIHNfYWxsb2MgX192aXNpdF9kb21haW5fYWxsb2NhdGlvbl9oZWxsKHN0cnVjdCBzX2RhdGEgKmQsCiAJCQkJCQkgICBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1X21hcCkKIHsKLSNpZmRlZiBDT05GSUdfTlVNQQotCWlmICghYWxsb2NfY3B1bWFza192YXIoJmQtPmRvbWFpbnNwYW4sIEdGUF9LRVJORUwpKQotCQlyZXR1cm4gc2Ffbm9uZTsKLQlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZkLT5jb3ZlcmVkLCBHRlBfS0VSTkVMKSkKLQkJcmV0dXJuIHNhX2RvbWFpbnNwYW47Ci0JaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmZC0+bm90Y292ZXJlZCwgR0ZQX0tFUk5FTCkpCi0JCXJldHVybiBzYV9jb3ZlcmVkOwotCS8qIEFsbG9jYXRlIHRoZSBwZXItbm9kZSBsaXN0IG9mIHNjaGVkIGdyb3VwcyAqLwotCWQtPnNjaGVkX2dyb3VwX25vZGVzID0ga2NhbGxvYyhucl9ub2RlX2lkcywKLQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHNjaGVkX2dyb3VwICopLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWQtPnNjaGVkX2dyb3VwX25vZGVzKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbiBub3QgYWxsb2Mgc2NoZWQgZ3JvdXAgbm9kZSBsaXN0XG4iKTsKLQkJcmV0dXJuIHNhX25vdGNvdmVyZWQ7Ci0JfQotCXNjaGVkX2dyb3VwX25vZGVzX2J5Y3B1W2NwdW1hc2tfZmlyc3QoY3B1X21hcCldID0gZC0+c2NoZWRfZ3JvdXBfbm9kZXM7Ci0jZW5kaWYKLQlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZkLT5ub2RlbWFzaywgR0ZQX0tFUk5FTCkpCi0JCXJldHVybiBzYV9zY2hlZF9ncm91cF9ub2RlczsKLQlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZkLT50aGlzX3NpYmxpbmdfbWFwLCBHRlBfS0VSTkVMKSkKLQkJcmV0dXJuIHNhX25vZGVtYXNrOwotCWlmICghYWxsb2NfY3B1bWFza192YXIoJmQtPnRoaXNfY29yZV9tYXAsIEdGUF9LRVJORUwpKQotCQlyZXR1cm4gc2FfdGhpc19zaWJsaW5nX21hcDsKLQlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZkLT50aGlzX2Jvb2tfbWFwLCBHRlBfS0VSTkVMKSkKLQkJcmV0dXJuIHNhX3RoaXNfY29yZV9tYXA7Ci0JaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmZC0+c2VuZF9jb3ZlcmVkLCBHRlBfS0VSTkVMKSkKLQkJcmV0dXJuIHNhX3RoaXNfYm9va19tYXA7Ci0JaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmZC0+dG1wbWFzaywgR0ZQX0tFUk5FTCkpCi0JCXJldHVybiBzYV9zZW5kX2NvdmVyZWQ7CisJbWVtc2V0KGQsIDAsIHNpemVvZigqZCkpOworCisJaWYgKF9fc2R0X2FsbG9jKGNwdV9tYXApKQorCQlyZXR1cm4gc2Ffc2Rfc3RvcmFnZTsKKwlkLT5zZCA9IGFsbG9jX3BlcmNwdShzdHJ1Y3Qgc2NoZWRfZG9tYWluICopOworCWlmICghZC0+c2QpCisJCXJldHVybiBzYV9zZF9zdG9yYWdlOwogCWQtPnJkID0gYWxsb2Nfcm9vdGRvbWFpbigpOwotCWlmICghZC0+cmQpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2Fubm90IGFsbG9jIHJvb3QgZG9tYWluXG4iKTsKLQkJcmV0dXJuIHNhX3RtcG1hc2s7Ci0JfQorCWlmICghZC0+cmQpCisJCXJldHVybiBzYV9zZDsKIAlyZXR1cm4gc2Ffcm9vdGRvbWFpbjsKIH0KIAotc3RhdGljIHN0cnVjdCBzY2hlZF9kb21haW4gKl9fYnVpbGRfbnVtYV9zY2hlZF9kb21haW5zKHN0cnVjdCBzX2RhdGEgKmQsCi0JY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9tYXAsIHN0cnVjdCBzY2hlZF9kb21haW5fYXR0ciAqYXR0ciwgaW50IGkpCisvKgorICogTlVMTCB0aGUgc2RfZGF0YSBlbGVtZW50cyB3ZSd2ZSB1c2VkIHRvIGJ1aWxkIHRoZSBzY2hlZF9kb21haW4gYW5kCisgKiBzY2hlZF9ncm91cCBzdHJ1Y3R1cmUgc28gdGhhdCB0aGUgc3Vic2VxdWVudCBfX2ZyZWVfZG9tYWluX2FsbG9jcygpCisgKiB3aWxsIG5vdCBmcmVlIHRoZSBkYXRhIHdlJ3JlIHVzaW5nLgorICovCitzdGF0aWMgdm9pZCBjbGFpbV9hbGxvY2F0aW9ucyhpbnQgY3B1LCBzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCkKIHsKLQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCA9IE5VTEw7Ci0jaWZkZWYgQ09ORklHX05VTUEKLQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpwYXJlbnQ7CisJc3RydWN0IHNkX2RhdGEgKnNkZCA9IHNkLT5wcml2YXRlOworCXN0cnVjdCBzY2hlZF9ncm91cCAqc2cgPSBzZC0+Z3JvdXBzOwogCi0JZC0+c2RfYWxsbm9kZXMgPSAwOwotCWlmIChjcHVtYXNrX3dlaWdodChjcHVfbWFwKSA+Ci0JICAgIFNEX05PREVTX1BFUl9ET01BSU4gKiBjcHVtYXNrX3dlaWdodChkLT5ub2RlbWFzaykpIHsKLQkJc2QgPSAmcGVyX2NwdShhbGxub2Rlc19kb21haW5zLCBpKS5zZDsKLQkJU0RfSU5JVChzZCwgQUxMTk9ERVMpOwotCQlzZXRfZG9tYWluX2F0dHJpYnV0ZShzZCwgYXR0cik7Ci0JCWNwdW1hc2tfY29weShzY2hlZF9kb21haW5fc3BhbihzZCksIGNwdV9tYXApOwotCQljcHVfdG9fYWxsbm9kZXNfZ3JvdXAoaSwgY3B1X21hcCwgJnNkLT5ncm91cHMsIGQtPnRtcG1hc2spOwotCQlkLT5zZF9hbGxub2RlcyA9IDE7CisJV0FSTl9PTl9PTkNFKCpwZXJfY3B1X3B0cihzZGQtPnNkLCBjcHUpICE9IHNkKTsKKwkqcGVyX2NwdV9wdHIoc2RkLT5zZCwgY3B1KSA9IE5VTEw7CisKKwlpZiAoY3B1ID09IGNwdW1hc2tfZmlyc3Qoc2NoZWRfZ3JvdXBfY3B1cyhzZykpKSB7CisJCVdBUk5fT05fT05DRSgqcGVyX2NwdV9wdHIoc2RkLT5zZywgY3B1KSAhPSBzZyk7CisJCSpwZXJfY3B1X3B0cihzZGQtPnNnLCBjcHUpID0gTlVMTDsKIAl9Ci0JcGFyZW50ID0gc2Q7Ci0KLQlzZCA9ICZwZXJfY3B1KG5vZGVfZG9tYWlucywgaSkuc2Q7Ci0JU0RfSU5JVChzZCwgTk9ERSk7Ci0Jc2V0X2RvbWFpbl9hdHRyaWJ1dGUoc2QsIGF0dHIpOwotCXNjaGVkX2RvbWFpbl9ub2RlX3NwYW4oY3B1X3RvX25vZGUoaSksIHNjaGVkX2RvbWFpbl9zcGFuKHNkKSk7Ci0Jc2QtPnBhcmVudCA9IHBhcmVudDsKLQlpZiAocGFyZW50KQotCQlwYXJlbnQtPmNoaWxkID0gc2Q7Ci0JY3B1bWFza19hbmQoc2NoZWRfZG9tYWluX3NwYW4oc2QpLCBzY2hlZF9kb21haW5fc3BhbihzZCksIGNwdV9tYXApOwotI2VuZGlmCi0JcmV0dXJuIHNkOwogfQogCi1zdGF0aWMgc3RydWN0IHNjaGVkX2RvbWFpbiAqX19idWlsZF9jcHVfc2NoZWRfZG9tYWluKHN0cnVjdCBzX2RhdGEgKmQsCi0JY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9tYXAsIHN0cnVjdCBzY2hlZF9kb21haW5fYXR0ciAqYXR0ciwKLQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpwYXJlbnQsIGludCBpKQotewotCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOwotCXNkID0gJnBlcl9jcHUocGh5c19kb21haW5zLCBpKS5zZDsKLQlTRF9JTklUKHNkLCBDUFUpOwotCXNldF9kb21haW5fYXR0cmlidXRlKHNkLCBhdHRyKTsKLQljcHVtYXNrX2NvcHkoc2NoZWRfZG9tYWluX3NwYW4oc2QpLCBkLT5ub2RlbWFzayk7Ci0Jc2QtPnBhcmVudCA9IHBhcmVudDsKLQlpZiAocGFyZW50KQotCQlwYXJlbnQtPmNoaWxkID0gc2Q7Ci0JY3B1X3RvX3BoeXNfZ3JvdXAoaSwgY3B1X21hcCwgJnNkLT5ncm91cHMsIGQtPnRtcG1hc2spOwotCXJldHVybiBzZDsKLX0KLQotc3RhdGljIHN0cnVjdCBzY2hlZF9kb21haW4gKl9fYnVpbGRfYm9va19zY2hlZF9kb21haW4oc3RydWN0IHNfZGF0YSAqZCwKLQljb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1X21hcCwgc3RydWN0IHNjaGVkX2RvbWFpbl9hdHRyICphdHRyLAotCXN0cnVjdCBzY2hlZF9kb21haW4gKnBhcmVudCwgaW50IGkpCi17Ci0Jc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QgPSBwYXJlbnQ7Ci0jaWZkZWYgQ09ORklHX1NDSEVEX0JPT0sKLQlzZCA9ICZwZXJfY3B1KGJvb2tfZG9tYWlucywgaSkuc2Q7Ci0JU0RfSU5JVChzZCwgQk9PSyk7Ci0Jc2V0X2RvbWFpbl9hdHRyaWJ1dGUoc2QsIGF0dHIpOwotCWNwdW1hc2tfYW5kKHNjaGVkX2RvbWFpbl9zcGFuKHNkKSwgY3B1X21hcCwgY3B1X2Jvb2tfbWFzayhpKSk7Ci0Jc2QtPnBhcmVudCA9IHBhcmVudDsKLQlwYXJlbnQtPmNoaWxkID0gc2Q7Ci0JY3B1X3RvX2Jvb2tfZ3JvdXAoaSwgY3B1X21hcCwgJnNkLT5ncm91cHMsIGQtPnRtcG1hc2spOwotI2VuZGlmCi0JcmV0dXJuIHNkOwotfQotCi1zdGF0aWMgc3RydWN0IHNjaGVkX2RvbWFpbiAqX19idWlsZF9tY19zY2hlZF9kb21haW4oc3RydWN0IHNfZGF0YSAqZCwKLQljb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1X21hcCwgc3RydWN0IHNjaGVkX2RvbWFpbl9hdHRyICphdHRyLAotCXN0cnVjdCBzY2hlZF9kb21haW4gKnBhcmVudCwgaW50IGkpCi17Ci0Jc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QgPSBwYXJlbnQ7Ci0jaWZkZWYgQ09ORklHX1NDSEVEX01DCi0Jc2QgPSAmcGVyX2NwdShjb3JlX2RvbWFpbnMsIGkpLnNkOwotCVNEX0lOSVQoc2QsIE1DKTsKLQlzZXRfZG9tYWluX2F0dHJpYnV0ZShzZCwgYXR0cik7Ci0JY3B1bWFza19hbmQoc2NoZWRfZG9tYWluX3NwYW4oc2QpLCBjcHVfbWFwLCBjcHVfY29yZWdyb3VwX21hc2soaSkpOwotCXNkLT5wYXJlbnQgPSBwYXJlbnQ7Ci0JcGFyZW50LT5jaGlsZCA9IHNkOwotCWNwdV90b19jb3JlX2dyb3VwKGksIGNwdV9tYXAsICZzZC0+Z3JvdXBzLCBkLT50bXBtYXNrKTsKLSNlbmRpZgotCXJldHVybiBzZDsKLX0KLQotc3RhdGljIHN0cnVjdCBzY2hlZF9kb21haW4gKl9fYnVpbGRfc210X3NjaGVkX2RvbWFpbihzdHJ1Y3Qgc19kYXRhICpkLAotCWNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVfbWFwLCBzdHJ1Y3Qgc2NoZWRfZG9tYWluX2F0dHIgKmF0dHIsCi0Jc3RydWN0IHNjaGVkX2RvbWFpbiAqcGFyZW50LCBpbnQgaSkKLXsKLQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCA9IHBhcmVudDsKICNpZmRlZiBDT05GSUdfU0NIRURfU01UCi0Jc2QgPSAmcGVyX2NwdShjcHVfZG9tYWlucywgaSkuc2Q7Ci0JU0RfSU5JVChzZCwgU0lCTElORyk7Ci0Jc2V0X2RvbWFpbl9hdHRyaWJ1dGUoc2QsIGF0dHIpOwotCWNwdW1hc2tfYW5kKHNjaGVkX2RvbWFpbl9zcGFuKHNkKSwgY3B1X21hcCwgdG9wb2xvZ3lfdGhyZWFkX2NwdW1hc2soaSkpOwotCXNkLT5wYXJlbnQgPSBwYXJlbnQ7Ci0JcGFyZW50LT5jaGlsZCA9IHNkOwotCWNwdV90b19jcHVfZ3JvdXAoaSwgY3B1X21hcCwgJnNkLT5ncm91cHMsIGQtPnRtcG1hc2spOwotI2VuZGlmCi0JcmV0dXJuIHNkOwotfQotCi1zdGF0aWMgdm9pZCBidWlsZF9zY2hlZF9ncm91cHMoc3RydWN0IHNfZGF0YSAqZCwgZW51bSBzY2hlZF9kb21haW5fbGV2ZWwgbCwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1X21hcCwgaW50IGNwdSkKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1X3NtdF9tYXNrKGludCBjcHUpCiB7Ci0Jc3dpdGNoIChsKSB7CisJcmV0dXJuIHRvcG9sb2d5X3RocmVhZF9jcHVtYXNrKGNwdSk7Cit9CisjZW5kaWYKKworLyoKKyAqIFRvcG9sb2d5IGxpc3QsIGJvdHRvbS11cC4KKyAqLworc3RhdGljIHN0cnVjdCBzY2hlZF9kb21haW5fdG9wb2xvZ3lfbGV2ZWwgZGVmYXVsdF90b3BvbG9neVtdID0gewogI2lmZGVmIENPTkZJR19TQ0hFRF9TTVQKLQljYXNlIFNEX0xWX1NJQkxJTkc6IC8qIHNldCB1cCBDUFUgKHNpYmxpbmcpIGdyb3VwcyAqLwotCQljcHVtYXNrX2FuZChkLT50aGlzX3NpYmxpbmdfbWFwLCBjcHVfbWFwLAotCQkJICAgIHRvcG9sb2d5X3RocmVhZF9jcHVtYXNrKGNwdSkpOwotCQlpZiAoY3B1ID09IGNwdW1hc2tfZmlyc3QoZC0+dGhpc19zaWJsaW5nX21hcCkpCi0JCQlpbml0X3NjaGVkX2J1aWxkX2dyb3VwcyhkLT50aGlzX3NpYmxpbmdfbWFwLCBjcHVfbWFwLAotCQkJCQkJJmNwdV90b19jcHVfZ3JvdXAsCi0JCQkJCQlkLT5zZW5kX2NvdmVyZWQsIGQtPnRtcG1hc2spOwotCQlicmVhazsKKwl7IHNkX2luaXRfU0lCTElORywgY3B1X3NtdF9tYXNrLCB9LAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NDSEVEX01DCi0JY2FzZSBTRF9MVl9NQzogLyogc2V0IHVwIG11bHRpLWNvcmUgZ3JvdXBzICovCi0JCWNwdW1hc2tfYW5kKGQtPnRoaXNfY29yZV9tYXAsIGNwdV9tYXAsIGNwdV9jb3JlZ3JvdXBfbWFzayhjcHUpKTsKLQkJaWYgKGNwdSA9PSBjcHVtYXNrX2ZpcnN0KGQtPnRoaXNfY29yZV9tYXApKQotCQkJaW5pdF9zY2hlZF9idWlsZF9ncm91cHMoZC0+dGhpc19jb3JlX21hcCwgY3B1X21hcCwKLQkJCQkJCSZjcHVfdG9fY29yZV9ncm91cCwKLQkJCQkJCWQtPnNlbmRfY292ZXJlZCwgZC0+dG1wbWFzayk7Ci0JCWJyZWFrOworCXsgc2RfaW5pdF9NQywgY3B1X2NvcmVncm91cF9tYXNrLCB9LAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NDSEVEX0JPT0sKLQljYXNlIFNEX0xWX0JPT0s6IC8qIHNldCB1cCBib29rIGdyb3VwcyAqLwotCQljcHVtYXNrX2FuZChkLT50aGlzX2Jvb2tfbWFwLCBjcHVfbWFwLCBjcHVfYm9va19tYXNrKGNwdSkpOwotCQlpZiAoY3B1ID09IGNwdW1hc2tfZmlyc3QoZC0+dGhpc19ib29rX21hcCkpCi0JCQlpbml0X3NjaGVkX2J1aWxkX2dyb3VwcyhkLT50aGlzX2Jvb2tfbWFwLCBjcHVfbWFwLAotCQkJCQkJJmNwdV90b19ib29rX2dyb3VwLAotCQkJCQkJZC0+c2VuZF9jb3ZlcmVkLCBkLT50bXBtYXNrKTsKLQkJYnJlYWs7CisJeyBzZF9pbml0X0JPT0ssIGNwdV9ib29rX21hc2ssIH0sCiAjZW5kaWYKLQljYXNlIFNEX0xWX0NQVTogLyogc2V0IHVwIHBoeXNpY2FsIGdyb3VwcyAqLwotCQljcHVtYXNrX2FuZChkLT5ub2RlbWFzaywgY3B1bWFza19vZl9ub2RlKGNwdSksIGNwdV9tYXApOwotCQlpZiAoIWNwdW1hc2tfZW1wdHkoZC0+bm9kZW1hc2spKQotCQkJaW5pdF9zY2hlZF9idWlsZF9ncm91cHMoZC0+bm9kZW1hc2ssIGNwdV9tYXAsCi0JCQkJCQkmY3B1X3RvX3BoeXNfZ3JvdXAsCi0JCQkJCQlkLT5zZW5kX2NvdmVyZWQsIGQtPnRtcG1hc2spOwotCQlicmVhazsKKwl7IHNkX2luaXRfQ1BVLCBjcHVfY3B1X21hc2ssIH0sCiAjaWZkZWYgQ09ORklHX05VTUEKLQljYXNlIFNEX0xWX0FMTE5PREVTOgotCQlpbml0X3NjaGVkX2J1aWxkX2dyb3VwcyhjcHVfbWFwLCBjcHVfbWFwLCAmY3B1X3RvX2FsbG5vZGVzX2dyb3VwLAotCQkJCQlkLT5zZW5kX2NvdmVyZWQsIGQtPnRtcG1hc2spOwotCQlicmVhazsKKwl7IHNkX2luaXRfTk9ERSwgY3B1X25vZGVfbWFzaywgfSwKKwl7IHNkX2luaXRfQUxMTk9ERVMsIGNwdV9hbGxub2Rlc19tYXNrLCB9LAogI2VuZGlmCi0JZGVmYXVsdDoKLQkJYnJlYWs7CisJeyBOVUxMLCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBzY2hlZF9kb21haW5fdG9wb2xvZ3lfbGV2ZWwgKnNjaGVkX2RvbWFpbl90b3BvbG9neSA9IGRlZmF1bHRfdG9wb2xvZ3k7CisKK3N0YXRpYyBpbnQgX19zZHRfYWxsb2MoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9tYXApCit7CisJc3RydWN0IHNjaGVkX2RvbWFpbl90b3BvbG9neV9sZXZlbCAqdGw7CisJaW50IGo7CisKKwlmb3IgKHRsID0gc2NoZWRfZG9tYWluX3RvcG9sb2d5OyB0bC0+aW5pdDsgdGwrKykgeworCQlzdHJ1Y3Qgc2RfZGF0YSAqc2RkID0gJnRsLT5kYXRhOworCisJCXNkZC0+c2QgPSBhbGxvY19wZXJjcHUoc3RydWN0IHNjaGVkX2RvbWFpbiAqKTsKKwkJaWYgKCFzZGQtPnNkKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJc2RkLT5zZyA9IGFsbG9jX3BlcmNwdShzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKik7CisJCWlmICghc2RkLT5zZykKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWZvcl9lYWNoX2NwdShqLCBjcHVfbWFwKSB7CisJCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKKwkJCXN0cnVjdCBzY2hlZF9ncm91cCAqc2c7CisKKwkJICAgICAgIAlzZCA9IGt6YWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IHNjaGVkX2RvbWFpbikgKyBjcHVtYXNrX3NpemUoKSwKKwkJCQkJR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoaikpOworCQkJaWYgKCFzZCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJKnBlcl9jcHVfcHRyKHNkZC0+c2QsIGopID0gc2Q7CisKKwkJCXNnID0ga3phbGxvY19ub2RlKHNpemVvZihzdHJ1Y3Qgc2NoZWRfZ3JvdXApICsgY3B1bWFza19zaXplKCksCisJCQkJCUdGUF9LRVJORUwsIGNwdV90b19ub2RlKGopKTsKKwkJCWlmICghc2cpCisJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCSpwZXJfY3B1X3B0cihzZGQtPnNnLCBqKSA9IHNnOworCQl9CiAJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fc2R0X2ZyZWUoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9tYXApCit7CisJc3RydWN0IHNjaGVkX2RvbWFpbl90b3BvbG9neV9sZXZlbCAqdGw7CisJaW50IGo7CisKKwlmb3IgKHRsID0gc2NoZWRfZG9tYWluX3RvcG9sb2d5OyB0bC0+aW5pdDsgdGwrKykgeworCQlzdHJ1Y3Qgc2RfZGF0YSAqc2RkID0gJnRsLT5kYXRhOworCisJCWZvcl9lYWNoX2NwdShqLCBjcHVfbWFwKSB7CisJCQlrZnJlZSgqcGVyX2NwdV9wdHIoc2RkLT5zZCwgaikpOworCQkJa2ZyZWUoKnBlcl9jcHVfcHRyKHNkZC0+c2csIGopKTsKKwkJfQorCQlmcmVlX3BlcmNwdShzZGQtPnNkKTsKKwkJZnJlZV9wZXJjcHUoc2RkLT5zZyk7CisJfQorfQorCitzdHJ1Y3Qgc2NoZWRfZG9tYWluICpidWlsZF9zY2hlZF9kb21haW4oc3RydWN0IHNjaGVkX2RvbWFpbl90b3BvbG9neV9sZXZlbCAqdGwsCisJCXN0cnVjdCBzX2RhdGEgKmQsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVfbWFwLAorCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluX2F0dHIgKmF0dHIsIHN0cnVjdCBzY2hlZF9kb21haW4gKmNoaWxkLAorCQlpbnQgY3B1KQoreworCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkID0gdGwtPmluaXQodGwsIGNwdSk7CisJaWYgKCFzZCkKKwkJcmV0dXJuIGNoaWxkOworCisJc2V0X2RvbWFpbl9hdHRyaWJ1dGUoc2QsIGF0dHIpOworCWNwdW1hc2tfYW5kKHNjaGVkX2RvbWFpbl9zcGFuKHNkKSwgY3B1X21hcCwgdGwtPm1hc2soY3B1KSk7CisJaWYgKGNoaWxkKSB7CisJCXNkLT5sZXZlbCA9IGNoaWxkLT5sZXZlbCArIDE7CisJCXNjaGVkX2RvbWFpbl9sZXZlbF9tYXggPSBtYXgoc2NoZWRfZG9tYWluX2xldmVsX21heCwgc2QtPmxldmVsKTsKKwkJY2hpbGQtPnBhcmVudCA9IHNkOworCX0KKwlzZC0+Y2hpbGQgPSBjaGlsZDsKKworCXJldHVybiBzZDsKIH0KIAogLyoKICAqIEJ1aWxkIHNjaGVkIGRvbWFpbnMgZm9yIGEgZ2l2ZW4gc2V0IG9mIGNwdXMgYW5kIGF0dGFjaCB0aGUgc2NoZWQgZG9tYWlucwogICogdG8gdGhlIGluZGl2aWR1YWwgY3B1cwogICovCi1zdGF0aWMgaW50IF9fYnVpbGRfc2NoZWRfZG9tYWlucyhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1X21hcCwKLQkJCQkgc3RydWN0IHNjaGVkX2RvbWFpbl9hdHRyICphdHRyKQorc3RhdGljIGludCBidWlsZF9zY2hlZF9kb21haW5zKGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVfbWFwLAorCQkJICAgICAgIHN0cnVjdCBzY2hlZF9kb21haW5fYXR0ciAqYXR0cikKIHsKIAllbnVtIHNfYWxsb2MgYWxsb2Nfc3RhdGUgPSBzYV9ub25lOwotCXN0cnVjdCBzX2RhdGEgZDsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKLQlpbnQgaTsKLSNpZmRlZiBDT05GSUdfTlVNQQotCWQuc2RfYWxsbm9kZXMgPSAwOwotI2VuZGlmCisJc3RydWN0IHNfZGF0YSBkOworCWludCBpLCByZXQgPSAtRU5PTUVNOwogCiAJYWxsb2Nfc3RhdGUgPSBfX3Zpc2l0X2RvbWFpbl9hbGxvY2F0aW9uX2hlbGwoJmQsIGNwdV9tYXApOwogCWlmIChhbGxvY19zdGF0ZSAhPSBzYV9yb290ZG9tYWluKQogCQlnb3RvIGVycm9yOwotCWFsbG9jX3N0YXRlID0gc2Ffc2NoZWRfZ3JvdXBzOwogCi0JLyoKLQkgKiBTZXQgdXAgZG9tYWlucyBmb3IgY3B1cyBzcGVjaWZpZWQgYnkgdGhlIGNwdV9tYXAuCi0JICovCisJLyogU2V0IHVwIGRvbWFpbnMgZm9yIGNwdXMgc3BlY2lmaWVkIGJ5IHRoZSBjcHVfbWFwLiAqLwogCWZvcl9lYWNoX2NwdShpLCBjcHVfbWFwKSB7Ci0JCWNwdW1hc2tfYW5kKGQubm9kZW1hc2ssIGNwdW1hc2tfb2Zfbm9kZShjcHVfdG9fbm9kZShpKSksCi0JCQkgICAgY3B1X21hcCk7CisJCXN0cnVjdCBzY2hlZF9kb21haW5fdG9wb2xvZ3lfbGV2ZWwgKnRsOwogCi0JCXNkID0gX19idWlsZF9udW1hX3NjaGVkX2RvbWFpbnMoJmQsIGNwdV9tYXAsIGF0dHIsIGkpOwotCQlzZCA9IF9fYnVpbGRfY3B1X3NjaGVkX2RvbWFpbigmZCwgY3B1X21hcCwgYXR0ciwgc2QsIGkpOwotCQlzZCA9IF9fYnVpbGRfYm9va19zY2hlZF9kb21haW4oJmQsIGNwdV9tYXAsIGF0dHIsIHNkLCBpKTsKLQkJc2QgPSBfX2J1aWxkX21jX3NjaGVkX2RvbWFpbigmZCwgY3B1X21hcCwgYXR0ciwgc2QsIGkpOwotCQlzZCA9IF9fYnVpbGRfc210X3NjaGVkX2RvbWFpbigmZCwgY3B1X21hcCwgYXR0ciwgc2QsIGkpOworCQlzZCA9IE5VTEw7CisJCWZvciAodGwgPSBzY2hlZF9kb21haW5fdG9wb2xvZ3k7IHRsLT5pbml0OyB0bCsrKQorCQkJc2QgPSBidWlsZF9zY2hlZF9kb21haW4odGwsICZkLCBjcHVfbWFwLCBhdHRyLCBzZCwgaSk7CisKKwkJd2hpbGUgKHNkLT5jaGlsZCkKKwkJCXNkID0gc2QtPmNoaWxkOworCisJCSpwZXJfY3B1X3B0cihkLnNkLCBpKSA9IHNkOwogCX0KIAorCS8qIEJ1aWxkIHRoZSBncm91cHMgZm9yIHRoZSBkb21haW5zICovCiAJZm9yX2VhY2hfY3B1KGksIGNwdV9tYXApIHsKLQkJYnVpbGRfc2NoZWRfZ3JvdXBzKCZkLCBTRF9MVl9TSUJMSU5HLCBjcHVfbWFwLCBpKTsKLQkJYnVpbGRfc2NoZWRfZ3JvdXBzKCZkLCBTRF9MVl9CT09LLCBjcHVfbWFwLCBpKTsKLQkJYnVpbGRfc2NoZWRfZ3JvdXBzKCZkLCBTRF9MVl9NQywgY3B1X21hcCwgaSk7CisJCWZvciAoc2QgPSAqcGVyX2NwdV9wdHIoZC5zZCwgaSk7IHNkOyBzZCA9IHNkLT5wYXJlbnQpIHsKKwkJCXNkLT5zcGFuX3dlaWdodCA9IGNwdW1hc2tfd2VpZ2h0KHNjaGVkX2RvbWFpbl9zcGFuKHNkKSk7CisJCQlnZXRfZ3JvdXAoaSwgc2QtPnByaXZhdGUsICZzZC0+Z3JvdXBzKTsKKwkJCWF0b21pY19pbmMoJnNkLT5ncm91cHMtPnJlZik7CisKKwkJCWlmIChpICE9IGNwdW1hc2tfZmlyc3Qoc2NoZWRfZG9tYWluX3NwYW4oc2QpKSkKKwkJCQljb250aW51ZTsKKworCQkJYnVpbGRfc2NoZWRfZ3JvdXBzKHNkKTsKKwkJfQogCX0KIAotCS8qIFNldCB1cCBwaHlzaWNhbCBncm91cHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbnJfbm9kZV9pZHM7IGkrKykKLQkJYnVpbGRfc2NoZWRfZ3JvdXBzKCZkLCBTRF9MVl9DUFUsIGNwdV9tYXAsIGkpOwotCi0jaWZkZWYgQ09ORklHX05VTUEKLQkvKiBTZXQgdXAgbm9kZSBncm91cHMgKi8KLQlpZiAoZC5zZF9hbGxub2RlcykKLQkJYnVpbGRfc2NoZWRfZ3JvdXBzKCZkLCBTRF9MVl9BTExOT0RFUywgY3B1X21hcCwgMCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnJfbm9kZV9pZHM7IGkrKykKLQkJaWYgKGJ1aWxkX251bWFfc2NoZWRfZ3JvdXBzKCZkLCBjcHVfbWFwLCBpKSkKLQkJCWdvdG8gZXJyb3I7Ci0jZW5kaWYKLQogCS8qIENhbGN1bGF0ZSBDUFUgcG93ZXIgZm9yIHBoeXNpY2FsIHBhY2thZ2VzIGFuZCBub2RlcyAqLwotI2lmZGVmIENPTkZJR19TQ0hFRF9TTVQKLQlmb3JfZWFjaF9jcHUoaSwgY3B1X21hcCkgewotCQlzZCA9ICZwZXJfY3B1KGNwdV9kb21haW5zLCBpKS5zZDsKLQkJaW5pdF9zY2hlZF9ncm91cHNfcG93ZXIoaSwgc2QpOwotCX0KLSNlbmRpZgotI2lmZGVmIENPTkZJR19TQ0hFRF9NQwotCWZvcl9lYWNoX2NwdShpLCBjcHVfbWFwKSB7Ci0JCXNkID0gJnBlcl9jcHUoY29yZV9kb21haW5zLCBpKS5zZDsKLQkJaW5pdF9zY2hlZF9ncm91cHNfcG93ZXIoaSwgc2QpOwotCX0KLSNlbmRpZgotI2lmZGVmIENPTkZJR19TQ0hFRF9CT09LCi0JZm9yX2VhY2hfY3B1KGksIGNwdV9tYXApIHsKLQkJc2QgPSAmcGVyX2NwdShib29rX2RvbWFpbnMsIGkpLnNkOwotCQlpbml0X3NjaGVkX2dyb3Vwc19wb3dlcihpLCBzZCk7Ci0JfQotI2VuZGlmCisJZm9yIChpID0gbnJfY3B1bWFza19iaXRzLTE7IGkgPj0gMDsgaS0tKSB7CisJCWlmICghY3B1bWFza190ZXN0X2NwdShpLCBjcHVfbWFwKSkKKwkJCWNvbnRpbnVlOwogCi0JZm9yX2VhY2hfY3B1KGksIGNwdV9tYXApIHsKLQkJc2QgPSAmcGVyX2NwdShwaHlzX2RvbWFpbnMsIGkpLnNkOwotCQlpbml0X3NjaGVkX2dyb3Vwc19wb3dlcihpLCBzZCk7CisJCWZvciAoc2QgPSAqcGVyX2NwdV9wdHIoZC5zZCwgaSk7IHNkOyBzZCA9IHNkLT5wYXJlbnQpIHsKKwkJCWNsYWltX2FsbG9jYXRpb25zKGksIHNkKTsKKwkJCWluaXRfc2NoZWRfZ3JvdXBzX3Bvd2VyKGksIHNkKTsKKwkJfQogCX0KIAotI2lmZGVmIENPTkZJR19OVU1BCi0JZm9yIChpID0gMDsgaSA8IG5yX25vZGVfaWRzOyBpKyspCi0JCWluaXRfbnVtYV9zY2hlZF9ncm91cHNfcG93ZXIoZC5zY2hlZF9ncm91cF9ub2Rlc1tpXSk7Ci0KLQlpZiAoZC5zZF9hbGxub2RlcykgewotCQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnOwotCi0JCWNwdV90b19hbGxub2Rlc19ncm91cChjcHVtYXNrX2ZpcnN0KGNwdV9tYXApLCBjcHVfbWFwLCAmc2csCi0JCQkJCQkJCWQudG1wbWFzayk7Ci0JCWluaXRfbnVtYV9zY2hlZF9ncm91cHNfcG93ZXIoc2cpOwotCX0KLSNlbmRpZgotCiAJLyogQXR0YWNoIHRoZSBkb21haW5zICovCisJcmN1X3JlYWRfbG9jaygpOwogCWZvcl9lYWNoX2NwdShpLCBjcHVfbWFwKSB7Ci0jaWZkZWYgQ09ORklHX1NDSEVEX1NNVAotCQlzZCA9ICZwZXJfY3B1KGNwdV9kb21haW5zLCBpKS5zZDsKLSNlbGlmIGRlZmluZWQoQ09ORklHX1NDSEVEX01DKQotCQlzZCA9ICZwZXJfY3B1KGNvcmVfZG9tYWlucywgaSkuc2Q7Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19TQ0hFRF9CT09LKQotCQlzZCA9ICZwZXJfY3B1KGJvb2tfZG9tYWlucywgaSkuc2Q7Ci0jZWxzZQotCQlzZCA9ICZwZXJfY3B1KHBoeXNfZG9tYWlucywgaSkuc2Q7Ci0jZW5kaWYKKwkJc2QgPSAqcGVyX2NwdV9wdHIoZC5zZCwgaSk7CiAJCWNwdV9hdHRhY2hfZG9tYWluKHNkLCBkLnJkLCBpKTsKIAl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQlkLnNjaGVkX2dyb3VwX25vZGVzID0gTlVMTDsgLyogZG9uJ3QgZnJlZSB0aGlzIHdlIHN0aWxsIG5lZWQgaXQgKi8KLQlfX2ZyZWVfZG9tYWluX2FsbG9jcygmZCwgc2FfdG1wbWFzaywgY3B1X21hcCk7Ci0JcmV0dXJuIDA7Ci0KKwlyZXQgPSAwOwogZXJyb3I6CiAJX19mcmVlX2RvbWFpbl9hbGxvY3MoJmQsIGFsbG9jX3N0YXRlLCBjcHVfbWFwKTsKLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotc3RhdGljIGludCBidWlsZF9zY2hlZF9kb21haW5zKGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVfbWFwKQotewotCXJldHVybiBfX2J1aWxkX3NjaGVkX2RvbWFpbnMoY3B1X21hcCwgTlVMTCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGNwdW1hc2tfdmFyX3QgKmRvbXNfY3VyOwkvKiBjdXJyZW50IHNjaGVkIGRvbWFpbnMgKi8KQEAgLTc2NzAsNyArNzM2Miw3IEBACiAgKiBGb3Igbm93IHRoaXMganVzdCBleGNsdWRlcyBpc29sYXRlZCBjcHVzLCBidXQgY291bGQgYmUgdXNlZCB0bwogICogZXhjbHVkZSBvdGhlciBzcGVjaWFsIGNhc2VzIGluIHRoZSBmdXR1cmUuCiAgKi8KLXN0YXRpYyBpbnQgYXJjaF9pbml0X3NjaGVkX2RvbWFpbnMoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9tYXApCitzdGF0aWMgaW50IGluaXRfc2NoZWRfZG9tYWlucyhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1X21hcCkKIHsKIAlpbnQgZXJyOwogCkBAIC03NjgxLDMyICs3MzczLDI0IEBACiAJCWRvbXNfY3VyID0gJmZhbGxiYWNrX2RvbXM7CiAJY3B1bWFza19hbmRub3QoZG9tc19jdXJbMF0sIGNwdV9tYXAsIGNwdV9pc29sYXRlZF9tYXApOwogCWRhdHRyX2N1ciA9IE5VTEw7Ci0JZXJyID0gYnVpbGRfc2NoZWRfZG9tYWlucyhkb21zX2N1clswXSk7CisJZXJyID0gYnVpbGRfc2NoZWRfZG9tYWlucyhkb21zX2N1clswXSwgTlVMTCk7CiAJcmVnaXN0ZXJfc2NoZWRfZG9tYWluX3N5c2N0bCgpOwogCiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgYXJjaF9kZXN0cm95X3NjaGVkX2RvbWFpbnMoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9tYXAsCi0JCQkJICAgICAgIHN0cnVjdCBjcHVtYXNrICp0bXBtYXNrKQotewotCWZyZWVfc2NoZWRfZ3JvdXBzKGNwdV9tYXAsIHRtcG1hc2spOwotfQotCiAvKgogICogRGV0YWNoIHNjaGVkIGRvbWFpbnMgZnJvbSBhIGdyb3VwIG9mIGNwdXMgc3BlY2lmaWVkIGluIGNwdV9tYXAKICAqIFRoZXNlIGNwdXMgd2lsbCBub3cgYmUgYXR0YWNoZWQgdG8gdGhlIE5VTEwgZG9tYWluCiAgKi8KIHN0YXRpYyB2b2lkIGRldGFjaF9kZXN0cm95X2RvbWFpbnMoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9tYXApCiB7Ci0JLyogU2F2ZSBiZWNhdXNlIGhvdHBsdWcgbG9jayBoZWxkLiAqLwotCXN0YXRpYyBERUNMQVJFX0JJVE1BUCh0bXBtYXNrLCBDT05GSUdfTlJfQ1BVUyk7CiAJaW50IGk7CiAKKwlyY3VfcmVhZF9sb2NrKCk7CiAJZm9yX2VhY2hfY3B1KGksIGNwdV9tYXApCiAJCWNwdV9hdHRhY2hfZG9tYWluKE5VTEwsICZkZWZfcm9vdF9kb21haW4sIGkpOwotCXN5bmNocm9uaXplX3NjaGVkKCk7Ci0JYXJjaF9kZXN0cm95X3NjaGVkX2RvbWFpbnMoY3B1X21hcCwgdG9fY3B1bWFzayh0bXBtYXNrKSk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKIC8qIGhhbmRsZSBudWxsIGFzICJkZWZhdWx0IiAqLwpAQCAtNzc5NSw4ICs3NDc5LDcgQEAKIAkJCQlnb3RvIG1hdGNoMjsKIAkJfQogCQkvKiBubyBtYXRjaCAtIGFkZCBhIG5ldyBkb21zX25ldyAqLwotCQlfX2J1aWxkX3NjaGVkX2RvbWFpbnMoZG9tc19uZXdbaV0sCi0JCQkJCWRhdHRyX25ldyA/IGRhdHRyX25ldyArIGkgOiBOVUxMKTsKKwkJYnVpbGRfc2NoZWRfZG9tYWlucyhkb21zX25ld1tpXSwgZGF0dHJfbmV3ID8gZGF0dHJfbmV3ICsgaSA6IE5VTEwpOwogbWF0Y2gyOgogCQk7CiAJfQpAQCAtNzgxNSw3ICs3NDk4LDcgQEAKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX1NDSEVEX01DKSB8fCBkZWZpbmVkKENPTkZJR19TQ0hFRF9TTVQpCi1zdGF0aWMgdm9pZCBhcmNoX3JlaW5pdF9zY2hlZF9kb21haW5zKHZvaWQpCitzdGF0aWMgdm9pZCByZWluaXRfc2NoZWRfZG9tYWlucyh2b2lkKQogewogCWdldF9vbmxpbmVfY3B1cygpOwogCkBAIC03ODQ4LDcgKzc1MzEsNyBAQAogCWVsc2UKIAkJc2NoZWRfbWNfcG93ZXJfc2F2aW5ncyA9IGxldmVsOwogCi0JYXJjaF9yZWluaXRfc2NoZWRfZG9tYWlucygpOworCXJlaW5pdF9zY2hlZF9kb21haW5zKCk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC03OTY3LDE0ICs3NjUwLDkgQEAKIAlhbGxvY19jcHVtYXNrX3Zhcigmbm9uX2lzb2xhdGVkX2NwdXMsIEdGUF9LRVJORUwpOwogCWFsbG9jX2NwdW1hc2tfdmFyKCZmYWxsYmFja19kb21zLCBHRlBfS0VSTkVMKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX05VTUEpCi0Jc2NoZWRfZ3JvdXBfbm9kZXNfYnljcHUgPSBremFsbG9jKG5yX2NwdV9pZHMgKiBzaXplb2Yodm9pZCAqKiksCi0JCQkJCQkJCUdGUF9LRVJORUwpOwotCUJVR19PTihzY2hlZF9ncm91cF9ub2Rlc19ieWNwdSA9PSBOVUxMKTsKLSNlbmRpZgogCWdldF9vbmxpbmVfY3B1cygpOwogCW11dGV4X2xvY2soJnNjaGVkX2RvbWFpbnNfbXV0ZXgpOwotCWFyY2hfaW5pdF9zY2hlZF9kb21haW5zKGNwdV9hY3RpdmVfbWFzayk7CisJaW5pdF9zY2hlZF9kb21haW5zKGNwdV9hY3RpdmVfbWFzayk7CiAJY3B1bWFza19hbmRub3Qobm9uX2lzb2xhdGVkX2NwdXMsIGNwdV9wb3NzaWJsZV9tYXNrLCBjcHVfaXNvbGF0ZWRfbWFwKTsKIAlpZiAoY3B1bWFza19lbXB0eShub25faXNvbGF0ZWRfY3B1cykpCiAJCWNwdW1hc2tfc2V0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCksIG5vbl9pc29sYXRlZF9jcHVzKTsKQEAgLTgyODEsNiArNzk1OSw3IEBACiAJLyogQWxsb2NhdGUgdGhlIG5vaHpfY3B1X21hc2sgaWYgQ09ORklHX0NQVU1BU0tfT0ZGU1RBQ0sgKi8KIAl6YWxsb2NfY3B1bWFza192YXIoJm5vaHpfY3B1X21hc2ssIEdGUF9OT1dBSVQpOwogI2lmZGVmIENPTkZJR19TTVAKKwl6YWxsb2NfY3B1bWFza192YXIoJnNjaGVkX2RvbWFpbnNfdG1wbWFzaywgR0ZQX05PV0FJVCk7CiAjaWZkZWYgQ09ORklHX05PX0haCiAJemFsbG9jX2NwdW1hc2tfdmFyKCZub2h6LmlkbGVfY3B1c19tYXNrLCBHRlBfTk9XQUlUKTsKIAlhbGxvY19jcHVtYXNrX3Zhcigmbm9oei5ncnBfaWRsZV9tYXNrLCBHRlBfTk9XQUlUKTsKQEAgLTgzNDAsNyArODAxOSw3IEBACiAJaW50IG9sZF9wcmlvID0gcC0+cHJpbzsKIAlpbnQgb25fcnE7CiAKLQlvbl9ycSA9IHAtPnNlLm9uX3JxOworCW9uX3JxID0gcC0+b25fcnE7CiAJaWYgKG9uX3JxKQogCQlkZWFjdGl2YXRlX3Rhc2socnEsIHAsIDApOwogCV9fc2V0c2NoZWR1bGVyKHJxLCBwLCBTQ0hFRF9OT1JNQUwsIDApOwpAQCAtODU1Myw3ICs4MjMyLDYgQEAKIHsKIAlzdHJ1Y3QgcnRfcnEgKnJ0X3JxOwogCXN0cnVjdCBzY2hlZF9ydF9lbnRpdHkgKnJ0X3NlOwotCXN0cnVjdCBycSAqcnE7CiAJaW50IGk7CiAKIAl0Zy0+cnRfcnEgPSBremFsbG9jKHNpemVvZihydF9ycSkgKiBucl9jcHVfaWRzLCBHRlBfS0VSTkVMKTsKQEAgLTg1NjcsOCArODI0NSw2IEBACiAJCQlrdGltZV90b19ucyhkZWZfcnRfYmFuZHdpZHRoLnJ0X3BlcmlvZCksIDApOwogCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKLQkJcnEgPSBjcHVfcnEoaSk7Ci0KIAkJcnRfcnEgPSBremFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBydF9ycSksCiAJCQkJICAgICBHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShpKSk7CiAJCWlmICghcnRfcnEpCkBAIC04NjgzLDcgKzgzNTksNyBAQAogCXJxID0gdGFza19ycV9sb2NrKHRzaywgJmZsYWdzKTsKIAogCXJ1bm5pbmcgPSB0YXNrX2N1cnJlbnQocnEsIHRzayk7Ci0Jb25fcnEgPSB0c2stPnNlLm9uX3JxOworCW9uX3JxID0gdHNrLT5vbl9ycTsKIAogCWlmIChvbl9ycSkKIAkJZGVxdWV1ZV90YXNrKHJxLCB0c2ssIDApOwpAQCAtODcwMiw3ICs4Mzc4LDcgQEAKIAlpZiAob25fcnEpCiAJCWVucXVldWVfdGFzayhycSwgdHNrLCAwKTsKIAotCXRhc2tfcnFfdW5sb2NrKHJxLCAmZmxhZ3MpOworCXRhc2tfcnFfdW5sb2NrKHJxLCB0c2ssICZmbGFncyk7CiB9CiAjZW5kaWYgLyogQ09ORklHX0NHUk9VUF9TQ0hFRCAqLwogCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWRfZGVidWcuYyBiL2tlcm5lbC9zY2hlZF9kZWJ1Zy5jCmluZGV4IDdiYWNkODMuLmE2NzEwYTEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZF9kZWJ1Zy5jCisrKyBiL2tlcm5lbC9zY2hlZF9kZWJ1Zy5jCkBAIC0xNTIsNyArMTUyLDcgQEAKIAlyZWFkX2xvY2tfaXJxc2F2ZSgmdGFza2xpc3RfbG9jaywgZmxhZ3MpOwogCiAJZG9fZWFjaF90aHJlYWQoZywgcCkgewotCQlpZiAoIXAtPnNlLm9uX3JxIHx8IHRhc2tfY3B1KHApICE9IHJxX2NwdSkKKwkJaWYgKCFwLT5vbl9ycSB8fCB0YXNrX2NwdShwKSAhPSBycV9jcHUpCiAJCQljb250aW51ZTsKIAogCQlwcmludF90YXNrKG0sIHJxLCBwKTsKQEAgLTI5Niw5ICsyOTYsNiBAQAogCVAodHR3dV9jb3VudCk7CiAJUCh0dHd1X2xvY2FsKTsKIAotCVNFUV9wcmludGYobSwgIiAgLiUtMzBzOiAlZFxuIiwgImJrbF9jb3VudCIsCi0JCQkJcnEtPnJxX3NjaGVkX2luZm8uYmtsX2NvdW50KTsKLQogI3VuZGVmIFAKICN1bmRlZiBQNjQKICNlbmRpZgpAQCAtNDQxLDcgKzQzOCw2IEBACiAJUChzZS5zdGF0aXN0aWNzLndhaXRfY291bnQpOwogCVBOKHNlLnN0YXRpc3RpY3MuaW93YWl0X3N1bSk7CiAJUChzZS5zdGF0aXN0aWNzLmlvd2FpdF9jb3VudCk7Ci0JUChzY2hlZF9pbmZvLmJrbF9jb3VudCk7CiAJUChzZS5ucl9taWdyYXRpb25zKTsKIAlQKHNlLnN0YXRpc3RpY3MubnJfbWlncmF0aW9uc19jb2xkKTsKIAlQKHNlLnN0YXRpc3RpY3MubnJfZmFpbGVkX21pZ3JhdGlvbnNfYWZmaW5lKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZF9mYWlyLmMgYi9rZXJuZWwvc2NoZWRfZmFpci5jCmluZGV4IDZmYTgzM2EuLjM3ZjIyNjIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZF9mYWlyLmMKKysrIGIva2VybmVsL3NjaGVkX2ZhaXIuYwpAQCAtMzU4LDYgKzM1OCwxMCBAQAogCX0KIAogCWNmc19ycS0+bWluX3ZydW50aW1lID0gbWF4X3ZydW50aW1lKGNmc19ycS0+bWluX3ZydW50aW1lLCB2cnVudGltZSk7CisjaWZuZGVmIENPTkZJR182NEJJVAorCXNtcF93bWIoKTsKKwljZnNfcnEtPm1pbl92cnVudGltZV9jb3B5ID0gY2ZzX3JxLT5taW5fdnJ1bnRpbWU7CisjZW5kaWYKIH0KIAogLyoKQEAgLTEzNDAsNiArMTM0NCw4IEBACiAJaHJ0aWNrX3VwZGF0ZShycSk7CiB9CiAKK3N0YXRpYyB2b2lkIHNldF9uZXh0X2J1ZGR5KHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlKTsKKwogLyoKICAqIFRoZSBkZXF1ZXVlX3Rhc2sgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgbnJfcnVubmluZyBpcwogICogZGVjcmVhc2VkLiBXZSByZW1vdmUgdGhlIHRhc2sgZnJvbSB0aGUgcmJ0cmVlIGFuZApAQCAtMTM0OSwxNCArMTM1NSwyMiBAQAogewogCXN0cnVjdCBjZnNfcnEgKmNmc19ycTsKIAlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSA9ICZwLT5zZTsKKwlpbnQgdGFza19zbGVlcCA9IGZsYWdzICYgREVRVUVVRV9TTEVFUDsKIAogCWZvcl9lYWNoX3NjaGVkX2VudGl0eShzZSkgewogCQljZnNfcnEgPSBjZnNfcnFfb2Yoc2UpOwogCQlkZXF1ZXVlX2VudGl0eShjZnNfcnEsIHNlLCBmbGFncyk7CiAKIAkJLyogRG9uJ3QgZGVxdWV1ZSBwYXJlbnQgaWYgaXQgaGFzIG90aGVyIGVudGl0aWVzIGJlc2lkZXMgdXMgKi8KLQkJaWYgKGNmc19ycS0+bG9hZC53ZWlnaHQpCisJCWlmIChjZnNfcnEtPmxvYWQud2VpZ2h0KSB7CisJCQkvKgorCQkJICogQmlhcyBwaWNrX25leHQgdG8gcGljayBhIHRhc2sgZnJvbSB0aGlzIGNmc19ycSwgYXMKKwkJCSAqIHAgaXMgc2xlZXBpbmcgd2hlbiBpdCBpcyB3aXRoaW4gaXRzIHNjaGVkX3NsaWNlLgorCQkJICovCisJCQlpZiAodGFza19zbGVlcCAmJiBwYXJlbnRfZW50aXR5KHNlKSkKKwkJCQlzZXRfbmV4dF9idWRkeShwYXJlbnRfZW50aXR5KHNlKSk7CiAJCQlicmVhazsKKwkJfQogCQlmbGFncyB8PSBERVFVRVVFX1NMRUVQOwogCX0KIApAQCAtMTM3MiwxMiArMTM4NiwyNSBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAogCi1zdGF0aWMgdm9pZCB0YXNrX3dha2luZ19mYWlyKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3N0YXRpYyB2b2lkIHRhc2tfd2FraW5nX2ZhaXIoc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewogCXN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlID0gJnAtPnNlOwogCXN0cnVjdCBjZnNfcnEgKmNmc19ycSA9IGNmc19ycV9vZihzZSk7CisJdTY0IG1pbl92cnVudGltZTsKIAotCXNlLT52cnVudGltZSAtPSBjZnNfcnEtPm1pbl92cnVudGltZTsKKyNpZm5kZWYgQ09ORklHXzY0QklUCisJdTY0IG1pbl92cnVudGltZV9jb3B5OworCisJZG8geworCQltaW5fdnJ1bnRpbWVfY29weSA9IGNmc19ycS0+bWluX3ZydW50aW1lX2NvcHk7CisJCXNtcF9ybWIoKTsKKwkJbWluX3ZydW50aW1lID0gY2ZzX3JxLT5taW5fdnJ1bnRpbWU7CisJfSB3aGlsZSAobWluX3ZydW50aW1lICE9IG1pbl92cnVudGltZV9jb3B5KTsKKyNlbHNlCisJbWluX3ZydW50aW1lID0gY2ZzX3JxLT5taW5fdnJ1bnRpbWU7CisjZW5kaWYKKworCXNlLT52cnVudGltZSAtPSBtaW5fdnJ1bnRpbWU7CiB9CiAKICNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRApAQCAtMTYyMiw2ICsxNjQ5LDcgQEAKIAkvKgogCSAqIE90aGVyd2lzZSwgaXRlcmF0ZSB0aGUgZG9tYWlucyBhbmQgZmluZCBhbiBlbGVnaWJsZSBpZGxlIGNwdS4KIAkgKi8KKwlyY3VfcmVhZF9sb2NrKCk7CiAJZm9yX2VhY2hfZG9tYWluKHRhcmdldCwgc2QpIHsKIAkJaWYgKCEoc2QtPmZsYWdzICYgU0RfU0hBUkVfUEtHX1JFU09VUkNFUykpCiAJCQlicmVhazsKQEAgLTE2NDEsNiArMTY2OSw3IEBACiAJCSAgICBjcHVtYXNrX3Rlc3RfY3B1KHByZXZfY3B1LCBzY2hlZF9kb21haW5fc3BhbihzZCkpKQogCQkJYnJlYWs7CiAJfQorCXJjdV9yZWFkX3VubG9jaygpOwogCiAJcmV0dXJuIHRhcmdldDsKIH0KQEAgLTE2NTcsNyArMTY4Niw3IEBACiAgKiBwcmVlbXB0IG11c3QgYmUgZGlzYWJsZWQuCiAgKi8KIHN0YXRpYyBpbnQKLXNlbGVjdF90YXNrX3JxX2ZhaXIoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgc2RfZmxhZywgaW50IHdha2VfZmxhZ3MpCitzZWxlY3RfdGFza19ycV9mYWlyKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IHNkX2ZsYWcsIGludCB3YWtlX2ZsYWdzKQogewogCXN0cnVjdCBzY2hlZF9kb21haW4gKnRtcCwgKmFmZmluZV9zZCA9IE5VTEwsICpzZCA9IE5VTEw7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKQEAgLTE2NzMsNiArMTcwMiw3IEBACiAJCW5ld19jcHUgPSBwcmV2X2NwdTsKIAl9CiAKKwlyY3VfcmVhZF9sb2NrKCk7CiAJZm9yX2VhY2hfZG9tYWluKGNwdSwgdG1wKSB7CiAJCWlmICghKHRtcC0+ZmxhZ3MgJiBTRF9MT0FEX0JBTEFOQ0UpKQogCQkJY29udGludWU7CkBAIC0xNzIzLDkgKzE3NTMsMTAgQEAKIAogCWlmIChhZmZpbmVfc2QpIHsKIAkJaWYgKGNwdSA9PSBwcmV2X2NwdSB8fCB3YWtlX2FmZmluZShhZmZpbmVfc2QsIHAsIHN5bmMpKQotCQkJcmV0dXJuIHNlbGVjdF9pZGxlX3NpYmxpbmcocCwgY3B1KTsKLQkJZWxzZQotCQkJcmV0dXJuIHNlbGVjdF9pZGxlX3NpYmxpbmcocCwgcHJldl9jcHUpOworCQkJcHJldl9jcHUgPSBjcHU7CisKKwkJbmV3X2NwdSA9IHNlbGVjdF9pZGxlX3NpYmxpbmcocCwgcHJldl9jcHUpOworCQlnb3RvIHVubG9jazsKIAl9CiAKIAl3aGlsZSAoc2QpIHsKQEAgLTE3NjYsNiArMTc5Nyw4IEBACiAJCX0KIAkJLyogd2hpbGUgbG9vcCB3aWxsIGJyZWFrIGhlcmUgaWYgc2QgPT0gTlVMTCAqLwogCX0KK3VubG9jazoKKwlyY3VfcmVhZF91bmxvY2soKTsKIAogCXJldHVybiBuZXdfY3B1OwogfQpAQCAtMTc4OSwxMCArMTgyMiw3IEBACiAJICogVGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCBmb3IgYnVkZGllcyB3aGVuIHRoZSBsZWZ0bW9zdAogCSAqIHRhc2sgaXMgaGlnaGVyIHByaW9yaXR5IHRoYW4gdGhlIGJ1ZGR5LgogCSAqLwotCWlmICh1bmxpa2VseShzZS0+bG9hZC53ZWlnaHQgIT0gTklDRV8wX0xPQUQpKQotCQlncmFuID0gY2FsY19kZWx0YV9mYWlyKGdyYW4sIHNlKTsKLQotCXJldHVybiBncmFuOworCXJldHVybiBjYWxjX2RlbHRhX2ZhaXIoZ3Jhbiwgc2UpOwogfQogCiAvKgpAQCAtMTgyNiwyNiArMTg1NiwyNiBAQAogCiBzdGF0aWMgdm9pZCBzZXRfbGFzdF9idWRkeShzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSkKIHsKLQlpZiAobGlrZWx5KHRhc2tfb2Yoc2UpLT5wb2xpY3kgIT0gU0NIRURfSURMRSkpIHsKLQkJZm9yX2VhY2hfc2NoZWRfZW50aXR5KHNlKQotCQkJY2ZzX3JxX29mKHNlKS0+bGFzdCA9IHNlOwotCX0KKwlpZiAoZW50aXR5X2lzX3Rhc2soc2UpICYmIHVubGlrZWx5KHRhc2tfb2Yoc2UpLT5wb2xpY3kgPT0gU0NIRURfSURMRSkpCisJCXJldHVybjsKKworCWZvcl9lYWNoX3NjaGVkX2VudGl0eShzZSkKKwkJY2ZzX3JxX29mKHNlKS0+bGFzdCA9IHNlOwogfQogCiBzdGF0aWMgdm9pZCBzZXRfbmV4dF9idWRkeShzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSkKIHsKLQlpZiAobGlrZWx5KHRhc2tfb2Yoc2UpLT5wb2xpY3kgIT0gU0NIRURfSURMRSkpIHsKLQkJZm9yX2VhY2hfc2NoZWRfZW50aXR5KHNlKQotCQkJY2ZzX3JxX29mKHNlKS0+bmV4dCA9IHNlOwotCX0KKwlpZiAoZW50aXR5X2lzX3Rhc2soc2UpICYmIHVubGlrZWx5KHRhc2tfb2Yoc2UpLT5wb2xpY3kgPT0gU0NIRURfSURMRSkpCisJCXJldHVybjsKKworCWZvcl9lYWNoX3NjaGVkX2VudGl0eShzZSkKKwkJY2ZzX3JxX29mKHNlKS0+bmV4dCA9IHNlOwogfQogCiBzdGF0aWMgdm9pZCBzZXRfc2tpcF9idWRkeShzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSkKIHsKLQlpZiAobGlrZWx5KHRhc2tfb2Yoc2UpLT5wb2xpY3kgIT0gU0NIRURfSURMRSkpIHsKLQkJZm9yX2VhY2hfc2NoZWRfZW50aXR5KHNlKQotCQkJY2ZzX3JxX29mKHNlKS0+c2tpcCA9IHNlOwotCX0KKwlmb3JfZWFjaF9zY2hlZF9lbnRpdHkoc2UpCisJCWNmc19ycV9vZihzZSktPnNraXAgPSBzZTsKIH0KIAogLyoKQEAgLTE4NTcsMTIgKzE4ODcsMTUgQEAKIAlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSA9ICZjdXJyLT5zZSwgKnBzZSA9ICZwLT5zZTsKIAlzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEgPSB0YXNrX2Nmc19ycShjdXJyKTsKIAlpbnQgc2NhbGUgPSBjZnNfcnEtPm5yX3J1bm5pbmcgPj0gc2NoZWRfbnJfbGF0ZW5jeTsKKwlpbnQgbmV4dF9idWRkeV9tYXJrZWQgPSAwOwogCiAJaWYgKHVubGlrZWx5KHNlID09IHBzZSkpCiAJCXJldHVybjsKIAotCWlmIChzY2hlZF9mZWF0KE5FWFRfQlVERFkpICYmIHNjYWxlICYmICEod2FrZV9mbGFncyAmIFdGX0ZPUkspKQorCWlmIChzY2hlZF9mZWF0KE5FWFRfQlVERFkpICYmIHNjYWxlICYmICEod2FrZV9mbGFncyAmIFdGX0ZPUkspKSB7CiAJCXNldF9uZXh0X2J1ZGR5KHBzZSk7CisJCW5leHRfYnVkZHlfbWFya2VkID0gMTsKKwl9CiAKIAkvKgogCSAqIFdlIGNhbiBjb21lIGhlcmUgd2l0aCBUSUZfTkVFRF9SRVNDSEVEIGFscmVhZHkgc2V0IGZyb20gbmV3IHRhc2sKQEAgLTE4OTAsOCArMTkyMywxNSBAQAogCXVwZGF0ZV9jdXJyKGNmc19ycSk7CiAJZmluZF9tYXRjaGluZ19zZSgmc2UsICZwc2UpOwogCUJVR19PTighcHNlKTsKLQlpZiAod2FrZXVwX3ByZWVtcHRfZW50aXR5KHNlLCBwc2UpID09IDEpCisJaWYgKHdha2V1cF9wcmVlbXB0X2VudGl0eShzZSwgcHNlKSA9PSAxKSB7CisJCS8qCisJCSAqIEJpYXMgcGlja19uZXh0IHRvIHBpY2sgdGhlIHNjaGVkIGVudGl0eSB0aGF0IGlzCisJCSAqIHRyaWdnZXJpbmcgdGhpcyBwcmVlbXB0aW9uLgorCQkgKi8KKwkJaWYgKCFuZXh0X2J1ZGR5X21hcmtlZCkKKwkJCXNldF9uZXh0X2J1ZGR5KHBzZSk7CiAJCWdvdG8gcHJlZW1wdDsKKwl9CiAKIAlyZXR1cm47CiAKQEAgLTIxMDIsNyArMjE0Miw3IEBACiBiYWxhbmNlX3Rhc2tzKHN0cnVjdCBycSAqdGhpc19ycSwgaW50IHRoaXNfY3B1LCBzdHJ1Y3QgcnEgKmJ1c2llc3QsCiAJICAgICAgdW5zaWduZWQgbG9uZyBtYXhfbG9hZF9tb3ZlLCBzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwKIAkgICAgICBlbnVtIGNwdV9pZGxlX3R5cGUgaWRsZSwgaW50ICphbGxfcGlubmVkLAotCSAgICAgIGludCAqdGhpc19iZXN0X3ByaW8sIHN0cnVjdCBjZnNfcnEgKmJ1c2llc3RfY2ZzX3JxKQorCSAgICAgIHN0cnVjdCBjZnNfcnEgKmJ1c2llc3RfY2ZzX3JxKQogewogCWludCBsb29wcyA9IDAsIHB1bGxlZCA9IDA7CiAJbG9uZyByZW1fbG9hZF9tb3ZlID0gbWF4X2xvYWRfbW92ZTsKQEAgLTIxNDAsOSArMjE4MCw2IEBACiAJCSAqLwogCQlpZiAocmVtX2xvYWRfbW92ZSA8PSAwKQogCQkJYnJlYWs7Ci0KLQkJaWYgKHAtPnByaW8gPCAqdGhpc19iZXN0X3ByaW8pCi0JCQkqdGhpc19iZXN0X3ByaW8gPSBwLT5wcmlvOwogCX0KIG91dDoKIAkvKgpAQCAtMjIwMiw3ICsyMjM5LDcgQEAKIGxvYWRfYmFsYW5jZV9mYWlyKHN0cnVjdCBycSAqdGhpc19ycSwgaW50IHRoaXNfY3B1LCBzdHJ1Y3QgcnEgKmJ1c2llc3QsCiAJCSAgdW5zaWduZWQgbG9uZyBtYXhfbG9hZF9tb3ZlLAogCQkgIHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBlbnVtIGNwdV9pZGxlX3R5cGUgaWRsZSwKLQkJICBpbnQgKmFsbF9waW5uZWQsIGludCAqdGhpc19iZXN0X3ByaW8pCisJCSAgaW50ICphbGxfcGlubmVkKQogewogCWxvbmcgcmVtX2xvYWRfbW92ZSA9IG1heF9sb2FkX21vdmU7CiAJaW50IGJ1c2llc3RfY3B1ID0gY3B1X29mKGJ1c2llc3QpOwpAQCAtMjIyNyw3ICsyMjY0LDcgQEAKIAkJcmVtX2xvYWQgPSBkaXZfdTY0KHJlbV9sb2FkLCBidXNpZXN0X2hfbG9hZCArIDEpOwogCiAJCW1vdmVkX2xvYWQgPSBiYWxhbmNlX3Rhc2tzKHRoaXNfcnEsIHRoaXNfY3B1LCBidXNpZXN0LAotCQkJCXJlbV9sb2FkLCBzZCwgaWRsZSwgYWxsX3Bpbm5lZCwgdGhpc19iZXN0X3ByaW8sCisJCQkJcmVtX2xvYWQsIHNkLCBpZGxlLCBhbGxfcGlubmVkLAogCQkJCWJ1c2llc3RfY2ZzX3JxKTsKIAogCQlpZiAoIW1vdmVkX2xvYWQpCkBAIC0yMjUzLDExICsyMjkwLDExIEBACiBsb2FkX2JhbGFuY2VfZmFpcihzdHJ1Y3QgcnEgKnRoaXNfcnEsIGludCB0aGlzX2NwdSwgc3RydWN0IHJxICpidXNpZXN0LAogCQkgIHVuc2lnbmVkIGxvbmcgbWF4X2xvYWRfbW92ZSwKIAkJICBzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgZW51bSBjcHVfaWRsZV90eXBlIGlkbGUsCi0JCSAgaW50ICphbGxfcGlubmVkLCBpbnQgKnRoaXNfYmVzdF9wcmlvKQorCQkgIGludCAqYWxsX3Bpbm5lZCkKIHsKIAlyZXR1cm4gYmFsYW5jZV90YXNrcyh0aGlzX3JxLCB0aGlzX2NwdSwgYnVzaWVzdCwKIAkJCW1heF9sb2FkX21vdmUsIHNkLCBpZGxlLCBhbGxfcGlubmVkLAotCQkJdGhpc19iZXN0X3ByaW8sICZidXNpZXN0LT5jZnMpOworCQkJJmJ1c2llc3QtPmNmcyk7CiB9CiAjZW5kaWYKIApAQCAtMjI3NCwxMiArMjMxMSwxMSBAQAogCQkgICAgICBpbnQgKmFsbF9waW5uZWQpCiB7CiAJdW5zaWduZWQgbG9uZyB0b3RhbF9sb2FkX21vdmVkID0gMCwgbG9hZF9tb3ZlZDsKLQlpbnQgdGhpc19iZXN0X3ByaW8gPSB0aGlzX3JxLT5jdXJyLT5wcmlvOwogCiAJZG8gewogCQlsb2FkX21vdmVkID0gbG9hZF9iYWxhbmNlX2ZhaXIodGhpc19ycSwgdGhpc19jcHUsIGJ1c2llc3QsCiAJCQkJbWF4X2xvYWRfbW92ZSAtIHRvdGFsX2xvYWRfbW92ZWQsCi0JCQkJc2QsIGlkbGUsIGFsbF9waW5uZWQsICZ0aGlzX2Jlc3RfcHJpbyk7CisJCQkJc2QsIGlkbGUsIGFsbF9waW5uZWQpOwogCiAJCXRvdGFsX2xvYWRfbW92ZWQgKz0gbG9hZF9tb3ZlZDsKIApAQCAtMjY0OCw3ICsyNjg0LDcgQEAKIAkvKgogCSAqIE9ubHkgc2libGluZ3MgY2FuIGhhdmUgc2lnbmlmaWNhbnRseSBsZXNzIHRoYW4gU0NIRURfTE9BRF9TQ0FMRQogCSAqLwotCWlmIChzZC0+bGV2ZWwgIT0gU0RfTFZfU0lCTElORykKKwlpZiAoIShzZC0+ZmxhZ3MgJiBTRF9TSEFSRV9DUFVQT1dFUikpCiAJCXJldHVybiAwOwogCiAJLyoKQEAgLTM0NjUsNiArMzUwMSw3IEBACiAJcmF3X3NwaW5fdW5sb2NrKCZ0aGlzX3JxLT5sb2NrKTsKIAogCXVwZGF0ZV9zaGFyZXModGhpc19jcHUpOworCXJjdV9yZWFkX2xvY2soKTsKIAlmb3JfZWFjaF9kb21haW4odGhpc19jcHUsIHNkKSB7CiAJCXVuc2lnbmVkIGxvbmcgaW50ZXJ2YWw7CiAJCWludCBiYWxhbmNlID0gMTsKQEAgLTM0ODYsNiArMzUyMyw3IEBACiAJCQlicmVhazsKIAkJfQogCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKIAogCXJhd19zcGluX2xvY2soJnRoaXNfcnEtPmxvY2spOwogCkBAIC0zNTM0LDYgKzM1NzIsNyBAQAogCWRvdWJsZV9sb2NrX2JhbGFuY2UoYnVzaWVzdF9ycSwgdGFyZ2V0X3JxKTsKIAogCS8qIFNlYXJjaCBmb3IgYW4gc2Qgc3Bhbm5pbmcgdXMgYW5kIHRoZSB0YXJnZXQgQ1BVLiAqLworCXJjdV9yZWFkX2xvY2soKTsKIAlmb3JfZWFjaF9kb21haW4odGFyZ2V0X2NwdSwgc2QpIHsKIAkJaWYgKChzZC0+ZmxhZ3MgJiBTRF9MT0FEX0JBTEFOQ0UpICYmCiAJCSAgICBjcHVtYXNrX3Rlc3RfY3B1KGJ1c2llc3RfY3B1LCBzY2hlZF9kb21haW5fc3BhbihzZCkpKQpAQCAtMzU0OSw2ICszNTg4LDcgQEAKIAkJZWxzZQogCQkJc2NoZWRzdGF0X2luYyhzZCwgYWxiX2ZhaWxlZCk7CiAJfQorCXJjdV9yZWFkX3VubG9jaygpOwogCWRvdWJsZV91bmxvY2tfYmFsYW5jZShidXNpZXN0X3JxLCB0YXJnZXRfcnEpOwogb3V0X3VubG9jazoKIAlidXNpZXN0X3JxLT5hY3RpdmVfYmFsYW5jZSA9IDA7CkBAIC0zNjc1LDYgKzM3MTUsNyBAQAogewogCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOwogCXN0cnVjdCBzY2hlZF9ncm91cCAqaWxiX2dyb3VwOworCWludCBpbGIgPSBucl9jcHVfaWRzOwogCiAJLyoKIAkgKiBIYXZlIGlkbGUgbG9hZCBiYWxhbmNlciBzZWxlY3Rpb24gZnJvbSBzZW1pLWlkbGUgcGFja2FnZXMgb25seQpAQCAtMzY5MCwyMCArMzczMSwyNSBAQAogCWlmIChjcHVtYXNrX3dlaWdodChub2h6LmlkbGVfY3B1c19tYXNrKSA8IDIpCiAJCWdvdG8gb3V0X2RvbmU7CiAKKwlyY3VfcmVhZF9sb2NrKCk7CiAJZm9yX2VhY2hfZmxhZ19kb21haW4oY3B1LCBzZCwgU0RfUE9XRVJTQVZJTkdTX0JBTEFOQ0UpIHsKIAkJaWxiX2dyb3VwID0gc2QtPmdyb3VwczsKIAogCQlkbyB7Ci0JCQlpZiAoaXNfc2VtaV9pZGxlX2dyb3VwKGlsYl9ncm91cCkpCi0JCQkJcmV0dXJuIGNwdW1hc2tfZmlyc3Qobm9oei5ncnBfaWRsZV9tYXNrKTsKKwkJCWlmIChpc19zZW1pX2lkbGVfZ3JvdXAoaWxiX2dyb3VwKSkgeworCQkJCWlsYiA9IGNwdW1hc2tfZmlyc3Qobm9oei5ncnBfaWRsZV9tYXNrKTsKKwkJCQlnb3RvIHVubG9jazsKKwkJCX0KIAogCQkJaWxiX2dyb3VwID0gaWxiX2dyb3VwLT5uZXh0OwogCiAJCX0gd2hpbGUgKGlsYl9ncm91cCAhPSBzZC0+Z3JvdXBzKTsKIAl9Cit1bmxvY2s6CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIG91dF9kb25lOgotCXJldHVybiBucl9jcHVfaWRzOworCXJldHVybiBpbGI7CiB9CiAjZWxzZSAvKiAgKENPTkZJR19TQ0hFRF9NQyB8fCBDT05GSUdfU0NIRURfU01UKSAqLwogc3RhdGljIGlubGluZSBpbnQgZmluZF9uZXdfaWxiKGludCBjYWxsX2NwdSkKQEAgLTM4NDgsNiArMzg5NCw3IEBACiAKIAl1cGRhdGVfc2hhcmVzKGNwdSk7CiAKKwlyY3VfcmVhZF9sb2NrKCk7CiAJZm9yX2VhY2hfZG9tYWluKGNwdSwgc2QpIHsKIAkJaWYgKCEoc2QtPmZsYWdzICYgU0RfTE9BRF9CQUxBTkNFKSkKIAkJCWNvbnRpbnVlOwpAQCAtMzg5Myw2ICszOTQwLDcgQEAKIAkJaWYgKCFiYWxhbmNlKQogCQkJYnJlYWs7CiAJfQorCXJjdV9yZWFkX3VubG9jaygpOwogCiAJLyoKIAkgKiBuZXh0X2JhbGFuY2Ugd2lsbCBiZSB1cGRhdGVkIG9ubHkgd2hlbiB0aGVyZSBpcyBhIG5lZWQuCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWRfZmVhdHVyZXMuaCBiL2tlcm5lbC9zY2hlZF9mZWF0dXJlcy5oCmluZGV4IDY4ZTY5YWMuLmJlNDBmNzMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZF9mZWF0dXJlcy5oCisrKyBiL2tlcm5lbC9zY2hlZF9mZWF0dXJlcy5oCkBAIC02NCwzICs2NCw5IEBACiAgKiBEZWNyZW1lbnQgQ1BVIHBvd2VyIGJhc2VkIG9uIGlycSBhY3Rpdml0eQogICovCiBTQ0hFRF9GRUFUKE5PTklSUV9QT1dFUiwgMSkKKworLyoKKyAqIFF1ZXVlIHJlbW90ZSB3YWtldXBzIG9uIHRoZSB0YXJnZXQgQ1BVIGFuZCBwcm9jZXNzIHRoZW0KKyAqIHVzaW5nIHRoZSBzY2hlZHVsZXIgSVBJLiBSZWR1Y2VzIHJxLT5sb2NrIGNvbnRlbnRpb24vYm91bmNlcy4KKyAqLworU0NIRURfRkVBVChUVFdVX1FVRVVFLCAxKQpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX2lkbGV0YXNrLmMgYi9rZXJuZWwvc2NoZWRfaWRsZXRhc2suYwppbmRleCBhNzc2YTYzLi4wYTUxODgyIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWRfaWRsZXRhc2suYworKysgYi9rZXJuZWwvc2NoZWRfaWRsZXRhc2suYwpAQCAtNyw3ICs3LDcgQEAKIAogI2lmZGVmIENPTkZJR19TTVAKIHN0YXRpYyBpbnQKLXNlbGVjdF90YXNrX3JxX2lkbGUoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgc2RfZmxhZywgaW50IGZsYWdzKQorc2VsZWN0X3Rhc2tfcnFfaWRsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBzZF9mbGFnLCBpbnQgZmxhZ3MpCiB7CiAJcmV0dXJuIHRhc2tfY3B1KHApOyAvKiBJRExFIHRhc2tzIGFzIG5ldmVyIG1pZ3JhdGVkICovCiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWRfcnQuYyBiL2tlcm5lbC9zY2hlZF9ydC5jCmluZGV4IGU3Y2ViZGMuLjY0YjJhMzcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZF9ydC5jCisrKyBiL2tlcm5lbC9zY2hlZF9ydC5jCkBAIC0xODMsNiArMTgzLDE0IEBACiAJcmV0dXJuIGt0aW1lX3RvX25zKHJ0X3JxLT50Zy0+cnRfYmFuZHdpZHRoLnJ0X3BlcmlvZCk7CiB9CiAKK3R5cGVkZWYgc3RydWN0IHRhc2tfZ3JvdXAgKnJ0X3JxX2l0ZXJfdDsKKworI2RlZmluZSBmb3JfZWFjaF9ydF9ycShydF9ycSwgaXRlciwgcnEpIFwKKwlmb3IgKGl0ZXIgPSBsaXN0X2VudHJ5X3JjdSh0YXNrX2dyb3Vwcy5uZXh0LCB0eXBlb2YoKml0ZXIpLCBsaXN0KTsgXAorCSAgICAgKCZpdGVyLT5saXN0ICE9ICZ0YXNrX2dyb3VwcykgJiYgXAorCSAgICAgKHJ0X3JxID0gaXRlci0+cnRfcnFbY3B1X29mKHJxKV0pOyBcCisJICAgICBpdGVyID0gbGlzdF9lbnRyeV9yY3UoaXRlci0+bGlzdC5uZXh0LCB0eXBlb2YoKml0ZXIpLCBsaXN0KSkKKwogc3RhdGljIGlubGluZSB2b2lkIGxpc3RfYWRkX2xlYWZfcnRfcnEoc3RydWN0IHJ0X3JxICpydF9ycSkKIHsKIAlsaXN0X2FkZF9yY3UoJnJ0X3JxLT5sZWFmX3J0X3JxX2xpc3QsCkBAIC0yODgsNiArMjk2LDExIEBACiAJcmV0dXJuIGt0aW1lX3RvX25zKGRlZl9ydF9iYW5kd2lkdGgucnRfcGVyaW9kKTsKIH0KIAordHlwZWRlZiBzdHJ1Y3QgcnRfcnEgKnJ0X3JxX2l0ZXJfdDsKKworI2RlZmluZSBmb3JfZWFjaF9ydF9ycShydF9ycSwgaXRlciwgcnEpIFwKKwlmb3IgKCh2b2lkKSBpdGVyLCBydF9ycSA9ICZycS0+cnQ7IHJ0X3JxOyBydF9ycSA9IE5VTEwpCisKIHN0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X2FkZF9sZWFmX3J0X3JxKHN0cnVjdCBydF9ycSAqcnRfcnEpCiB7CiB9CkBAIC00MDIsMTIgKzQxNSwxMyBAQAogc3RhdGljIHZvaWQgX19kaXNhYmxlX3J1bnRpbWUoc3RydWN0IHJxICpycSkKIHsKIAlzdHJ1Y3Qgcm9vdF9kb21haW4gKnJkID0gcnEtPnJkOworCXJ0X3JxX2l0ZXJfdCBpdGVyOwogCXN0cnVjdCBydF9ycSAqcnRfcnE7CiAKIAlpZiAodW5saWtlbHkoIXNjaGVkdWxlcl9ydW5uaW5nKSkKIAkJcmV0dXJuOwogCi0JZm9yX2VhY2hfbGVhZl9ydF9ycShydF9ycSwgcnEpIHsKKwlmb3JfZWFjaF9ydF9ycShydF9ycSwgaXRlciwgcnEpIHsKIAkJc3RydWN0IHJ0X2JhbmR3aWR0aCAqcnRfYiA9IHNjaGVkX3J0X2JhbmR3aWR0aChydF9ycSk7CiAJCXM2NCB3YW50OwogCQlpbnQgaTsKQEAgLTQ4Nyw2ICs1MDEsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2VuYWJsZV9ydW50aW1lKHN0cnVjdCBycSAqcnEpCiB7CisJcnRfcnFfaXRlcl90IGl0ZXI7CiAJc3RydWN0IHJ0X3JxICpydF9ycTsKIAogCWlmICh1bmxpa2VseSghc2NoZWR1bGVyX3J1bm5pbmcpKQpAQCAtNDk1LDcgKzUxMCw3IEBACiAJLyoKIAkgKiBSZXNldCBlYWNoIHJ1bnF1ZXVlJ3MgYmFuZHdpZHRoIHNldHRpbmdzCiAJICovCi0JZm9yX2VhY2hfbGVhZl9ydF9ycShydF9ycSwgcnEpIHsKKwlmb3JfZWFjaF9ydF9ycShydF9ycSwgaXRlciwgcnEpIHsKIAkJc3RydWN0IHJ0X2JhbmR3aWR0aCAqcnRfYiA9IHNjaGVkX3J0X2JhbmR3aWR0aChydF9ycSk7CiAKIAkJcmF3X3NwaW5fbG9jaygmcnRfYi0+cnRfcnVudGltZV9sb2NrKTsKQEAgLTU2Miw2ICs1NzcsMTMgQEAKIAkJCWlmIChydF9ycS0+cnRfdGhyb3R0bGVkICYmIHJ0X3JxLT5ydF90aW1lIDwgcnVudGltZSkgewogCQkJCXJ0X3JxLT5ydF90aHJvdHRsZWQgPSAwOwogCQkJCWVucXVldWUgPSAxOworCisJCQkJLyoKKwkJCQkgKiBGb3JjZSBhIGNsb2NrIHVwZGF0ZSBpZiB0aGUgQ1BVIHdhcyBpZGxlLAorCQkJCSAqIGxlc3Qgd2FrZXVwIC0+IHVudGhyb3R0bGUgdGltZSBhY2N1bXVsYXRlLgorCQkJCSAqLworCQkJCWlmIChydF9ycS0+cnRfbnJfcnVubmluZyAmJiBycS0+Y3VyciA9PSBycS0+aWRsZSkKKwkJCQkJcnEtPnNraXBfY2xvY2tfdXBkYXRlID0gLTE7CiAJCQl9CiAJCQlpZiAocnRfcnEtPnJ0X3RpbWUgfHwgcnRfcnEtPnJ0X25yX3J1bm5pbmcpCiAJCQkJaWRsZSA9IDA7CkBAIC05NzcsMTMgKzk5OSwyMyBAQAogc3RhdGljIGludCBmaW5kX2xvd2VzdF9ycShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOwogCiBzdGF0aWMgaW50Ci1zZWxlY3RfdGFza19ycV9ydChzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBzZF9mbGFnLCBpbnQgZmxhZ3MpCitzZWxlY3RfdGFza19ycV9ydChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBzZF9mbGFnLCBpbnQgZmxhZ3MpCiB7CisJc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyOworCXN0cnVjdCBycSAqcnE7CisJaW50IGNwdTsKKwogCWlmIChzZF9mbGFnICE9IFNEX0JBTEFOQ0VfV0FLRSkKIAkJcmV0dXJuIHNtcF9wcm9jZXNzb3JfaWQoKTsKIAorCWNwdSA9IHRhc2tfY3B1KHApOworCXJxID0gY3B1X3JxKGNwdSk7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJY3VyciA9IEFDQ0VTU19PTkNFKHJxLT5jdXJyKTsgLyogdW5sb2NrZWQgYWNjZXNzICovCisKIAkvKgotCSAqIElmIHRoZSBjdXJyZW50IHRhc2sgaXMgYW4gUlQgdGFzaywgdGhlbgorCSAqIElmIHRoZSBjdXJyZW50IHRhc2sgb24gQHAncyBydW5xdWV1ZSBpcyBhbiBSVCB0YXNrLCB0aGVuCiAJICogdHJ5IHRvIHNlZSBpZiB3ZSBjYW4gd2FrZSB0aGlzIFJUIHRhc2sgdXAgb24gYW5vdGhlcgogCSAqIHJ1bnF1ZXVlLiBPdGhlcndpc2Ugc2ltcGx5IHN0YXJ0IHRoaXMgUlQgdGFzawogCSAqIG9uIGl0cyBjdXJyZW50IHJ1bnF1ZXVlLgpAQCAtOTk3LDIxICsxMDI5LDI1IEBACiAJICogbG9jaz8KIAkgKgogCSAqIEZvciBlcXVhbCBwcmlvIHRhc2tzLCB3ZSBqdXN0IGxldCB0aGUgc2NoZWR1bGVyIHNvcnQgaXQgb3V0LgotCSAqLwotCWlmICh1bmxpa2VseShydF90YXNrKHJxLT5jdXJyKSkgJiYKLQkgICAgKHJxLT5jdXJyLT5ydC5ucl9jcHVzX2FsbG93ZWQgPCAyIHx8Ci0JICAgICBycS0+Y3Vyci0+cHJpbyA8IHAtPnByaW8pICYmCi0JICAgIChwLT5ydC5ucl9jcHVzX2FsbG93ZWQgPiAxKSkgewotCQlpbnQgY3B1ID0gZmluZF9sb3dlc3RfcnEocCk7Ci0KLQkJcmV0dXJuIChjcHUgPT0gLTEpID8gdGFza19jcHUocCkgOiBjcHU7Ci0JfQotCi0JLyoKKwkgKgogCSAqIE90aGVyd2lzZSwganVzdCBsZXQgaXQgcmlkZSBvbiB0aGUgYWZmaW5lZCBSUSBhbmQgdGhlCiAJICogcG9zdC1zY2hlZHVsZSByb3V0ZXIgd2lsbCBwdXNoIHRoZSBwcmVlbXB0ZWQgdGFzayBhd2F5CisJICoKKwkgKiBUaGlzIHRlc3QgaXMgb3B0aW1pc3RpYywgaWYgd2UgZ2V0IGl0IHdyb25nIHRoZSBsb2FkLWJhbGFuY2VyCisJICogd2lsbCBoYXZlIHRvIHNvcnQgaXQgb3V0LgogCSAqLwotCXJldHVybiB0YXNrX2NwdShwKTsKKwlpZiAoY3VyciAmJiB1bmxpa2VseShydF90YXNrKGN1cnIpKSAmJgorCSAgICAoY3Vyci0+cnQubnJfY3B1c19hbGxvd2VkIDwgMiB8fAorCSAgICAgY3Vyci0+cHJpbyA8IHAtPnByaW8pICYmCisJICAgIChwLT5ydC5ucl9jcHVzX2FsbG93ZWQgPiAxKSkgeworCQlpbnQgdGFyZ2V0ID0gZmluZF9sb3dlc3RfcnEocCk7CisKKwkJaWYgKHRhcmdldCAhPSAtMSkKKwkJCWNwdSA9IHRhcmdldDsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4gY3B1OwogfQogCiBzdGF0aWMgdm9pZCBjaGVja19wcmVlbXB0X2VxdWFsX3ByaW8oc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwKQpAQCAtMTEzNiw3ICsxMTcyLDcgQEAKIAkgKiBUaGUgcHJldmlvdXMgdGFzayBuZWVkcyB0byBiZSBtYWRlIGVsaWdpYmxlIGZvciBwdXNoaW5nCiAJICogaWYgaXQgaXMgc3RpbGwgYWN0aXZlCiAJICovCi0JaWYgKHAtPnNlLm9uX3JxICYmIHAtPnJ0Lm5yX2NwdXNfYWxsb3dlZCA+IDEpCisJaWYgKG9uX3J0X3JxKCZwLT5ydCkgJiYgcC0+cnQubnJfY3B1c19hbGxvd2VkID4gMSkKIAkJZW5xdWV1ZV9wdXNoYWJsZV90YXNrKHJxLCBwKTsKIH0KIApAQCAtMTI4Nyw3ICsxMzIzLDcgQEAKIAkJCQkgICAgICFjcHVtYXNrX3Rlc3RfY3B1KGxvd2VzdF9ycS0+Y3B1LAogCQkJCQkJICAgICAgICZ0YXNrLT5jcHVzX2FsbG93ZWQpIHx8CiAJCQkJICAgICB0YXNrX3J1bm5pbmcocnEsIHRhc2spIHx8Ci0JCQkJICAgICAhdGFzay0+c2Uub25fcnEpKSB7CisJCQkJICAgICAhdGFzay0+b25fcnEpKSB7CiAKIAkJCQlyYXdfc3Bpbl91bmxvY2soJmxvd2VzdF9ycS0+bG9jayk7CiAJCQkJbG93ZXN0X3JxID0gTlVMTDsKQEAgLTEzMjEsNyArMTM1Nyw3IEBACiAJQlVHX09OKHRhc2tfY3VycmVudChycSwgcCkpOwogCUJVR19PTihwLT5ydC5ucl9jcHVzX2FsbG93ZWQgPD0gMSk7CiAKLQlCVUdfT04oIXAtPnNlLm9uX3JxKTsKKwlCVUdfT04oIXAtPm9uX3JxKTsKIAlCVUdfT04oIXJ0X3Rhc2socCkpOwogCiAJcmV0dXJuIHA7CkBAIC0xNDY3LDcgKzE1MDMsNyBAQAogCQkgKi8KIAkJaWYgKHAgJiYgKHAtPnByaW8gPCB0aGlzX3JxLT5ydC5oaWdoZXN0X3ByaW8uY3VycikpIHsKIAkJCVdBUk5fT04ocCA9PSBzcmNfcnEtPmN1cnIpOwotCQkJV0FSTl9PTighcC0+c2Uub25fcnEpOworCQkJV0FSTl9PTighcC0+b25fcnEpOwogCiAJCQkvKgogCQkJICogVGhlcmUncyBhIGNoYW5jZSB0aGF0IHAgaXMgaGlnaGVyIGluIHByaW9yaXR5CkBAIC0xNTM4LDcgKzE1NzQsNyBAQAogCSAqIFVwZGF0ZSB0aGUgbWlncmF0aW9uIHN0YXR1cyBvZiB0aGUgUlEgaWYgd2UgaGF2ZSBhbiBSVCB0YXNrCiAJICogd2hpY2ggaXMgcnVubmluZyBBTkQgY2hhbmdpbmcgaXRzIHdlaWdodCB2YWx1ZS4KIAkgKi8KLQlpZiAocC0+c2Uub25fcnEgJiYgKHdlaWdodCAhPSBwLT5ydC5ucl9jcHVzX2FsbG93ZWQpKSB7CisJaWYgKHAtPm9uX3JxICYmICh3ZWlnaHQgIT0gcC0+cnQubnJfY3B1c19hbGxvd2VkKSkgewogCQlzdHJ1Y3QgcnEgKnJxID0gdGFza19ycShwKTsKIAogCQlpZiAoIXRhc2tfY3VycmVudChycSwgcCkpIHsKQEAgLTE2MDgsNyArMTY0NCw3IEBACiAJICogd2UgbWF5IG5lZWQgdG8gaGFuZGxlIHRoZSBwdWxsaW5nIG9mIFJUIHRhc2tzCiAJICogbm93LgogCSAqLwotCWlmIChwLT5zZS5vbl9ycSAmJiAhcnEtPnJ0LnJ0X25yX3J1bm5pbmcpCisJaWYgKHAtPm9uX3JxICYmICFycS0+cnQucnRfbnJfcnVubmluZykKIAkJcHVsbF9ydF90YXNrKHJxKTsKIH0KIApAQCAtMTYzOCw3ICsxNjc0LDcgQEAKIAkgKiBJZiB0aGF0IGN1cnJlbnQgcnVubmluZyB0YXNrIGlzIGFsc28gYW4gUlQgdGFzawogCSAqIHRoZW4gc2VlIGlmIHdlIGNhbiBtb3ZlIHRvIGFub3RoZXIgcnVuIHF1ZXVlLgogCSAqLwotCWlmIChwLT5zZS5vbl9ycSAmJiBycS0+Y3VyciAhPSBwKSB7CisJaWYgKHAtPm9uX3JxICYmIHJxLT5jdXJyICE9IHApIHsKICNpZmRlZiBDT05GSUdfU01QCiAJCWlmIChycS0+cnQub3ZlcmxvYWRlZCAmJiBwdXNoX3J0X3Rhc2socnEpICYmCiAJCSAgICAvKiBEb24ndCByZXNjaGVkIGlmIHdlIGNoYW5nZWQgcnVucXVldWVzICovCkBAIC0xNjU3LDcgKzE2OTMsNyBAQAogc3RhdGljIHZvaWQKIHByaW9fY2hhbmdlZF9ydChzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBvbGRwcmlvKQogewotCWlmICghcC0+c2Uub25fcnEpCisJaWYgKCFwLT5vbl9ycSkKIAkJcmV0dXJuOwogCiAJaWYgKHJxLT5jdXJyID09IHApIHsKQEAgLTE3OTYsMTAgKzE4MzIsMTEgQEAKIAogc3RhdGljIHZvaWQgcHJpbnRfcnRfc3RhdHMoc3RydWN0IHNlcV9maWxlICptLCBpbnQgY3B1KQogeworCXJ0X3JxX2l0ZXJfdCBpdGVyOwogCXN0cnVjdCBydF9ycSAqcnRfcnE7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JZm9yX2VhY2hfbGVhZl9ydF9ycShydF9ycSwgY3B1X3JxKGNwdSkpCisJZm9yX2VhY2hfcnRfcnEocnRfcnEsIGl0ZXIsIGNwdV9ycShjcHUpKQogCQlwcmludF9ydF9ycShtLCBjcHUsIHJ0X3JxKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZF9zdG9wdGFzay5jIGIva2VybmVsL3NjaGVkX3N0b3B0YXNrLmMKaW5kZXggMWJhMmJkNC4uNmY0Mzc2MyAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkX3N0b3B0YXNrLmMKKysrIGIva2VybmVsL3NjaGVkX3N0b3B0YXNrLmMKQEAgLTksOCArOSw3IEBACiAKICNpZmRlZiBDT05GSUdfU01QCiBzdGF0aWMgaW50Ci1zZWxlY3RfdGFza19ycV9zdG9wKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwKLQkJICAgIGludCBzZF9mbGFnLCBpbnQgZmxhZ3MpCitzZWxlY3RfdGFza19ycV9zdG9wKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IHNkX2ZsYWcsIGludCBmbGFncykKIHsKIAlyZXR1cm4gdGFza19jcHUocCk7IC8qIHN0b3AgdGFza3MgYXMgbmV2ZXIgbWlncmF0ZSAqLwogfQpAQCAtMjYsNyArMjUsNyBAQAogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqc3RvcCA9IHJxLT5zdG9wOwogCi0JaWYgKHN0b3AgJiYgc3RvcC0+c2Uub25fcnEpCisJaWYgKHN0b3AgJiYgc3RvcC0+b25fcnEpCiAJCXJldHVybiBzdG9wOwogCiAJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9rZXJuZWwvc29mdGlycS5jIGIva2VybmVsL3NvZnRpcnEuYwppbmRleCAxNzRmOTc2Li4xMzk2MDE3IDEwMDY0NAotLS0gYS9rZXJuZWwvc29mdGlycS5jCisrKyBiL2tlcm5lbC9zb2Z0aXJxLmMKQEAgLTU4LDcgKzU4LDcgQEAKIAogY2hhciAqc29mdGlycV90b19uYW1lW05SX1NPRlRJUlFTXSA9IHsKIAkiSEkiLCAiVElNRVIiLCAiTkVUX1RYIiwgIk5FVF9SWCIsICJCTE9DSyIsICJCTE9DS19JT1BPTEwiLAotCSJUQVNLTEVUIiwgIlNDSEVEIiwgIkhSVElNRVIiLAkiUkNVIgorCSJUQVNLTEVUIiwgIlNDSEVEIiwgIkhSVElNRVIiCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEva2VybmVsL3N5cy5jIGIva2VybmVsL3N5cy5jCmluZGV4IGFmNDY4ZWQuLmU0MTI4YjIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXMuYworKysgYi9rZXJuZWwvc3lzLmMKQEAgLTMxNCw4ICszMTQsOCBAQAogewogCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJnJlYm9vdF9ub3RpZmllcl9saXN0LCBTWVNfUkVTVEFSVCwgY21kKTsKIAlzeXN0ZW1fc3RhdGUgPSBTWVNURU1fUkVTVEFSVDsKKwl1c2VybW9kZWhlbHBlcl9kaXNhYmxlKCk7CiAJZGV2aWNlX3NodXRkb3duKCk7Ci0Jc3lzZGV2X3NodXRkb3duKCk7CiAJc3lzY29yZV9zaHV0ZG93bigpOwogfQogCkBAIC0zNDQsNiArMzQ0LDcgQEAKIAlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZyZWJvb3Rfbm90aWZpZXJfbGlzdCwKIAkJKHN0YXRlID09IFNZU1RFTV9IQUxUKT9TWVNfSEFMVDpTWVNfUE9XRVJfT0ZGLCBOVUxMKTsKIAlzeXN0ZW1fc3RhdGUgPSBzdGF0ZTsKKwl1c2VybW9kZWhlbHBlcl9kaXNhYmxlKCk7CiAJZGV2aWNlX3NodXRkb3duKCk7CiB9CiAvKioKQEAgLTM1NCw3ICszNTUsNiBAQAogdm9pZCBrZXJuZWxfaGFsdCh2b2lkKQogewogCWtlcm5lbF9zaHV0ZG93bl9wcmVwYXJlKFNZU1RFTV9IQUxUKTsKLQlzeXNkZXZfc2h1dGRvd24oKTsKIAlzeXNjb3JlX3NodXRkb3duKCk7CiAJcHJpbnRrKEtFUk5fRU1FUkcgIlN5c3RlbSBoYWx0ZWQuXG4iKTsKIAlrbXNnX2R1bXAoS01TR19EVU1QX0hBTFQpOwpAQCAtMzc0LDcgKzM3NCw2IEBACiAJaWYgKHBtX3Bvd2VyX29mZl9wcmVwYXJlKQogCQlwbV9wb3dlcl9vZmZfcHJlcGFyZSgpOwogCWRpc2FibGVfbm9uYm9vdF9jcHVzKCk7Ci0Jc3lzZGV2X3NodXRkb3duKCk7CiAJc3lzY29yZV9zaHV0ZG93bigpOwogCXByaW50ayhLRVJOX0VNRVJHICJQb3dlciBkb3duLlxuIik7CiAJa21zZ19kdW1wKEtNU0dfRFVNUF9QT1dFUk9GRik7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9NYWtlZmlsZSBiL2tlcm5lbC90aW1lL01ha2VmaWxlCmluZGV4IGIwNDI1OTkuLmUyZmQ3NGIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL01ha2VmaWxlCisrKyBiL2tlcm5lbC90aW1lL01ha2VmaWxlCkBAIC0xLDUgKzEsNSBAQAogb2JqLXkgKz0gdGltZWtlZXBpbmcubyBudHAubyBjbG9ja3NvdXJjZS5vIGppZmZpZXMubyB0aW1lcl9saXN0Lm8gdGltZWNvbXBhcmUubwotb2JqLXkgKz0gdGltZWNvbnYubyBwb3NpeC1jbG9jay5vCitvYmoteSArPSB0aW1lY29udi5vIHBvc2l4LWNsb2NrLm8gYWxhcm10aW1lci5vCiAKIG9iai0kKENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEKQkJKz0gY2xvY2tldmVudHMubwogb2JqLSQoQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFMpCQkrPSB0aWNrLWNvbW1vbi5vCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9hbGFybXRpbWVyLmMgYi9rZXJuZWwvdGltZS9hbGFybXRpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI2NTAxNAotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC90aW1lL2FsYXJtdGltZXIuYwpAQCAtMCwwICsxLDY5NCBAQAorLyoKKyAqIEFsYXJtdGltZXIgaW50ZXJmYWNlCisgKgorICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgYSB0aW1lciB3aGljaCBpcyBzaW1pbGFydG8gaHJ0aW1lcnMsCisgKiBidXQgdHJpZ2dlcnMgYSBSVEMgYWxhcm0gaWYgdGhlIGJveCBpcyBzdXNwZW5kLgorICoKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGluZmx1ZW5jZWQgYnkgdGhlIEFuZHJvaWQgUlRDIEFsYXJtIHRpbWVyCisgKiBpbnRlcmZhY2UuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIElCTSBDb3JwZXJhdGlvbgorICoKKyAqIEF1dGhvcjogSm9obiBTdHVsdHogPGpvaG4uc3R1bHR6QGxpbmFyby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXJxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2FsYXJtdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvc2l4LXRpbWVycy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KKworLyoqCisgKiBzdHJ1Y3QgYWxhcm1fYmFzZSAtIEFsYXJtIHRpbWVyIGJhc2VzCisgKiBAbG9jazoJCUxvY2sgZm9yIHN5bmNyaG9uaXplZCBhY2Nlc3MgdG8gdGhlIGJhc2UKKyAqIEB0aW1lcnF1ZXVlOgkJVGltZXJxdWV1ZSBoZWFkIG1hbmFnaW5nIHRoZSBsaXN0IG9mIGV2ZW50cworICogQHRpbWVyOiAJCWhydGltZXIgdXNlZCB0byBzY2hlZHVsZSBldmVudHMgd2hpbGUgcnVubmluZworICogQGdldHRpbWU6CQlGdW5jdGlvbiB0byByZWFkIHRoZSB0aW1lIGNvcnJlbGF0aW5nIHRvIHRoZSBiYXNlCisgKiBAYmFzZV9jbG9ja2lkOgljbG9ja2lkIGZvciB0aGUgYmFzZQorICovCitzdGF0aWMgc3RydWN0IGFsYXJtX2Jhc2UgeworCXNwaW5sb2NrX3QJCWxvY2s7CisJc3RydWN0IHRpbWVycXVldWVfaGVhZAl0aW1lcnF1ZXVlOworCXN0cnVjdCBocnRpbWVyCQl0aW1lcjsKKwlrdGltZV90CQkJKCpnZXR0aW1lKSh2b2lkKTsKKwljbG9ja2lkX3QJCWJhc2VfY2xvY2tpZDsKK30gYWxhcm1fYmFzZXNbQUxBUk1fTlVNVFlQRV07CisKKyNpZmRlZiBDT05GSUdfUlRDX0NMQVNTCisvKiBydGMgdGltZXIgYW5kIGRldmljZSBmb3Igc2V0dGluZyBhbGFybSB3YWtldXBzIGF0IHN1c3BlbmQgKi8KK3N0YXRpYyBzdHJ1Y3QgcnRjX3RpbWVyCQlydGN0aW1lcjsKK3N0YXRpYyBzdHJ1Y3QgcnRjX2RldmljZQkqcnRjZGV2OworI2VuZGlmCisKKy8qIGZyZWV6ZXIgZGVsdGEgJiBsb2NrIHVzZWQgdG8gaGFuZGxlIGNsb2NrX25hbm9zbGVlcCB0cmlnZ2VyZWQgd2FrZXVwcyAqLworc3RhdGljIGt0aW1lX3QgZnJlZXplcl9kZWx0YTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZnJlZXplcl9kZWx0YV9sb2NrKTsKKworCisvKioKKyAqIGFsYXJtdGltZXJfZW5xdWV1ZSAtIEFkZHMgYW4gYWxhcm0gdGltZXIgdG8gYW4gYWxhcm1fYmFzZSB0aW1lcnF1ZXVlCisgKiBAYmFzZTogcG9pbnRlciB0byB0aGUgYmFzZSB3aGVyZSB0aGUgdGltZXIgaXMgYmVpbmcgcnVuCisgKiBAYWxhcm06IHBvaW50ZXIgdG8gYWxhcm0gYmVpbmcgZW5xdWV1ZWQuCisgKgorICogQWRkcyBhbGFybSB0byBhIGFsYXJtX2Jhc2UgdGltZXJxdWV1ZSBhbmQgaWYgbmVjZXNzYXJ5IHNldHMKKyAqIGFuIGhydGltZXIgdG8gcnVuLgorICoKKyAqIE11c3QgaG9sZCBiYXNlLT5sb2NrIHdoZW4gY2FsbGluZy4KKyAqLworc3RhdGljIHZvaWQgYWxhcm10aW1lcl9lbnF1ZXVlKHN0cnVjdCBhbGFybV9iYXNlICpiYXNlLCBzdHJ1Y3QgYWxhcm0gKmFsYXJtKQoreworCXRpbWVycXVldWVfYWRkKCZiYXNlLT50aW1lcnF1ZXVlLCAmYWxhcm0tPm5vZGUpOworCWlmICgmYWxhcm0tPm5vZGUgPT0gdGltZXJxdWV1ZV9nZXRuZXh0KCZiYXNlLT50aW1lcnF1ZXVlKSkgeworCQlocnRpbWVyX3RyeV90b19jYW5jZWwoJmJhc2UtPnRpbWVyKTsKKwkJaHJ0aW1lcl9zdGFydCgmYmFzZS0+dGltZXIsIGFsYXJtLT5ub2RlLmV4cGlyZXMsCisJCQkJSFJUSU1FUl9NT0RFX0FCUyk7CisJfQorfQorCisvKioKKyAqIGFsYXJtdGltZXJfcmVtb3ZlIC0gUmVtb3ZlcyBhbiBhbGFybSB0aW1lciBmcm9tIGFuIGFsYXJtX2Jhc2UgdGltZXJxdWV1ZQorICogQGJhc2U6IHBvaW50ZXIgdG8gdGhlIGJhc2Ugd2hlcmUgdGhlIHRpbWVyIGlzIHJ1bm5pbmcKKyAqIEBhbGFybTogcG9pbnRlciB0byBhbGFybSBiZWluZyByZW1vdmVkCisgKgorICogUmVtb3ZlcyBhbGFybSB0byBhIGFsYXJtX2Jhc2UgdGltZXJxdWV1ZSBhbmQgaWYgbmVjZXNzYXJ5IHNldHMKKyAqIGEgbmV3IHRpbWVyIHRvIHJ1bi4KKyAqCisgKiBNdXN0IGhvbGQgYmFzZS0+bG9jayB3aGVuIGNhbGxpbmcuCisgKi8KK3N0YXRpYyB2b2lkIGFsYXJtdGltZXJfcmVtb3ZlKHN0cnVjdCBhbGFybV9iYXNlICpiYXNlLCBzdHJ1Y3QgYWxhcm0gKmFsYXJtKQoreworCXN0cnVjdCB0aW1lcnF1ZXVlX25vZGUgKm5leHQgPSB0aW1lcnF1ZXVlX2dldG5leHQoJmJhc2UtPnRpbWVycXVldWUpOworCisJdGltZXJxdWV1ZV9kZWwoJmJhc2UtPnRpbWVycXVldWUsICZhbGFybS0+bm9kZSk7CisJaWYgKG5leHQgPT0gJmFsYXJtLT5ub2RlKSB7CisJCWhydGltZXJfdHJ5X3RvX2NhbmNlbCgmYmFzZS0+dGltZXIpOworCQluZXh0ID0gdGltZXJxdWV1ZV9nZXRuZXh0KCZiYXNlLT50aW1lcnF1ZXVlKTsKKwkJaWYgKCFuZXh0KQorCQkJcmV0dXJuOworCQlocnRpbWVyX3N0YXJ0KCZiYXNlLT50aW1lciwgbmV4dC0+ZXhwaXJlcywgSFJUSU1FUl9NT0RFX0FCUyk7CisJfQorfQorCisKKy8qKgorICogYWxhcm10aW1lcl9maXJlZCAtIEhhbmRsZXMgYWxhcm0gaHJ0aW1lciBiZWluZyBmaXJlZC4KKyAqIEB0aW1lcjogcG9pbnRlciB0byBocnRpbWVyIGJlaW5nIHJ1bgorICoKKyAqIFdoZW4gYSBhbGFybSB0aW1lciBmaXJlcywgdGhpcyBydW5zIHRocm91Z2ggdGhlIHRpbWVycXVldWUgdG8KKyAqIHNlZSB3aGljaCBhbGFybXMgZXhwaXJlZCwgYW5kIHJ1bnMgdGhvc2UuIElmIHRoZXJlIGFyZSBtb3JlIGFsYXJtCisgKiB0aW1lcnMgcXVldWVkIGZvciB0aGUgZnV0dXJlLCB3ZSBzZXQgdGhlIGhydGltZXIgdG8gZmlyZSB3aGVuCisgKiB3aGVuIHRoZSBuZXh0IGZ1dHVyZSBhbGFybSB0aW1lciBleHBpcmVzLgorICovCitzdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgYWxhcm10aW1lcl9maXJlZChzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCit7CisJc3RydWN0IGFsYXJtX2Jhc2UgKmJhc2UgPSBjb250YWluZXJfb2YodGltZXIsIHN0cnVjdCBhbGFybV9iYXNlLCB0aW1lcik7CisJc3RydWN0IHRpbWVycXVldWVfbm9kZSAqbmV4dDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWt0aW1lX3Qgbm93OworCWludCByZXQgPSBIUlRJTUVSX05PUkVTVEFSVDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiYXNlLT5sb2NrLCBmbGFncyk7CisJbm93ID0gYmFzZS0+Z2V0dGltZSgpOworCXdoaWxlICgobmV4dCA9IHRpbWVycXVldWVfZ2V0bmV4dCgmYmFzZS0+dGltZXJxdWV1ZSkpKSB7CisJCXN0cnVjdCBhbGFybSAqYWxhcm07CisJCWt0aW1lX3QgZXhwaXJlZCA9IG5leHQtPmV4cGlyZXM7CisKKwkJaWYgKGV4cGlyZWQudHY2NCA+PSBub3cudHY2NCkKKwkJCWJyZWFrOworCisJCWFsYXJtID0gY29udGFpbmVyX29mKG5leHQsIHN0cnVjdCBhbGFybSwgbm9kZSk7CisKKwkJdGltZXJxdWV1ZV9kZWwoJmJhc2UtPnRpbWVycXVldWUsICZhbGFybS0+bm9kZSk7CisJCWFsYXJtLT5lbmFibGVkID0gMDsKKwkJLyogUmUtYWRkIHBlcmlvZGljIHRpbWVycyAqLworCQlpZiAoYWxhcm0tPnBlcmlvZC50djY0KSB7CisJCQlhbGFybS0+bm9kZS5leHBpcmVzID0ga3RpbWVfYWRkKGV4cGlyZWQsIGFsYXJtLT5wZXJpb2QpOworCQkJdGltZXJxdWV1ZV9hZGQoJmJhc2UtPnRpbWVycXVldWUsICZhbGFybS0+bm9kZSk7CisJCQlhbGFybS0+ZW5hYmxlZCA9IDE7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFzZS0+bG9jaywgZmxhZ3MpOworCQlpZiAoYWxhcm0tPmZ1bmN0aW9uKQorCQkJYWxhcm0tPmZ1bmN0aW9uKGFsYXJtKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJhc2UtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlpZiAobmV4dCkgeworCQlocnRpbWVyX3NldF9leHBpcmVzKCZiYXNlLT50aW1lciwgbmV4dC0+ZXhwaXJlcyk7CisJCXJldCA9IEhSVElNRVJfUkVTVEFSVDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFzZS0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKKworfQorCisjaWZkZWYgQ09ORklHX1JUQ19DTEFTUworLyoqCisgKiBhbGFybXRpbWVyX3N1c3BlbmQgLSBTdXNwZW5kIHRpbWUgY2FsbGJhY2sKKyAqIEBkZXY6IHVudXNlZAorICogQHN0YXRlOiB1bnVzZWQKKyAqCisgKiBXaGVuIHdlIGFyZSBnb2luZyBpbnRvIHN1c3BlbmQsIHdlIGxvb2sgdGhyb3VnaCB0aGUgYmFzZXMKKyAqIHRvIHNlZSB3aGljaCBpcyB0aGUgc29vbmVzdCB0aW1lciB0byBleHBpcmUuIFdlIHRoZW4KKyAqIHNldCBhbiBydGMgdGltZXIgdG8gZmlyZSB0aGF0IGZhciBpbnRvIHRoZSBmdXR1cmUsIHdoaWNoCisgKiB3aWxsIHdha2UgdXMgZnJvbSBzdXNwZW5kLgorICovCitzdGF0aWMgaW50IGFsYXJtdGltZXJfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0Y190aW1lIHRtOworCWt0aW1lX3QgbWluLCBub3c7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmcmVlemVyX2RlbHRhX2xvY2ssIGZsYWdzKTsKKwltaW4gPSBmcmVlemVyX2RlbHRhOworCWZyZWV6ZXJfZGVsdGEgPSBrdGltZV9zZXQoMCwgMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZnJlZXplcl9kZWx0YV9sb2NrLCBmbGFncyk7CisKKwkvKiBJZiB3ZSBoYXZlIG5vIHJ0Y2RldiwganVzdCByZXR1cm4gKi8KKwlpZiAoIXJ0Y2RldikKKwkJcmV0dXJuIDA7CisKKwkvKiBGaW5kIHRoZSBzb29uZXN0IHRpbWVyIHRvIGV4cGlyZSovCisJZm9yIChpID0gMDsgaSA8IEFMQVJNX05VTVRZUEU7IGkrKykgeworCQlzdHJ1Y3QgYWxhcm1fYmFzZSAqYmFzZSA9ICZhbGFybV9iYXNlc1tpXTsKKwkJc3RydWN0IHRpbWVycXVldWVfbm9kZSAqbmV4dDsKKwkJa3RpbWVfdCBkZWx0YTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmFzZS0+bG9jaywgZmxhZ3MpOworCQluZXh0ID0gdGltZXJxdWV1ZV9nZXRuZXh0KCZiYXNlLT50aW1lcnF1ZXVlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFzZS0+bG9jaywgZmxhZ3MpOworCQlpZiAoIW5leHQpCisJCQljb250aW51ZTsKKwkJZGVsdGEgPSBrdGltZV9zdWIobmV4dC0+ZXhwaXJlcywgYmFzZS0+Z2V0dGltZSgpKTsKKwkJaWYgKCFtaW4udHY2NCB8fCAoZGVsdGEudHY2NCA8IG1pbi50djY0KSkKKwkJCW1pbiA9IGRlbHRhOworCX0KKwlpZiAobWluLnR2NjQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBYWFggLSBTaG91bGQgd2UgZW5mb3JjZSBhIG1pbmltdW0gc2xlZXAgdGltZT8gKi8KKwlXQVJOX09OKG1pbi50djY0IDwgTlNFQ19QRVJfU0VDKTsKKworCS8qIFNldHVwIGFuIHJ0YyB0aW1lciB0byBmaXJlIHRoYXQgZmFyIGluIHRoZSBmdXR1cmUgKi8KKwlydGNfdGltZXJfY2FuY2VsKHJ0Y2RldiwgJnJ0Y3RpbWVyKTsKKwlydGNfcmVhZF90aW1lKHJ0Y2RldiwgJnRtKTsKKwlub3cgPSBydGNfdG1fdG9fa3RpbWUodG0pOworCW5vdyA9IGt0aW1lX2FkZChub3csIG1pbik7CisKKwlydGNfdGltZXJfc3RhcnQocnRjZGV2LCAmcnRjdGltZXIsIG5vdywga3RpbWVfc2V0KDAsIDApKTsKKworCXJldHVybiAwOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgYWxhcm10aW1lcl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBhbGFybXRpbWVyX2ZyZWV6ZXJzZXQoa3RpbWVfdCBhYnNleHAsIGVudW0gYWxhcm10aW1lcl90eXBlIHR5cGUpCit7CisJa3RpbWVfdCBkZWx0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBhbGFybV9iYXNlICpiYXNlID0gJmFsYXJtX2Jhc2VzW3R5cGVdOworCisJZGVsdGEgPSBrdGltZV9zdWIoYWJzZXhwLCBiYXNlLT5nZXR0aW1lKCkpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZyZWV6ZXJfZGVsdGFfbG9jaywgZmxhZ3MpOworCWlmICghZnJlZXplcl9kZWx0YS50djY0IHx8IChkZWx0YS50djY0IDwgZnJlZXplcl9kZWx0YS50djY0KSkKKwkJZnJlZXplcl9kZWx0YSA9IGRlbHRhOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZyZWV6ZXJfZGVsdGFfbG9jaywgZmxhZ3MpOworfQorCisKKy8qKgorICogYWxhcm1faW5pdCAtIEluaXRpYWxpemUgYW4gYWxhcm0gc3RydWN0dXJlCisgKiBAYWxhcm06IHB0ciB0byBhbGFybSB0byBiZSBpbml0aWFsaXplZAorICogQHR5cGU6IHRoZSB0eXBlIG9mIHRoZSBhbGFybQorICogQGZ1bmN0aW9uOiBjYWxsYmFjayB0aGF0IGlzIHJ1biB3aGVuIHRoZSBhbGFybSBmaXJlcworICovCit2b2lkIGFsYXJtX2luaXQoc3RydWN0IGFsYXJtICphbGFybSwgZW51bSBhbGFybXRpbWVyX3R5cGUgdHlwZSwKKwkJdm9pZCAoKmZ1bmN0aW9uKShzdHJ1Y3QgYWxhcm0gKikpCit7CisJdGltZXJxdWV1ZV9pbml0KCZhbGFybS0+bm9kZSk7CisJYWxhcm0tPnBlcmlvZCA9IGt0aW1lX3NldCgwLCAwKTsKKwlhbGFybS0+ZnVuY3Rpb24gPSBmdW5jdGlvbjsKKwlhbGFybS0+dHlwZSA9IHR5cGU7CisJYWxhcm0tPmVuYWJsZWQgPSAwOworfQorCisvKioKKyAqIGFsYXJtX3N0YXJ0IC0gU2V0cyBhbiBhbGFybSB0byBmaXJlCisgKiBAYWxhcm06IHB0ciB0byBhbGFybSB0byBzZXQKKyAqIEBzdGFydDogdGltZSB0byBydW4gdGhlIGFsYXJtCisgKiBAcGVyaW9kOiBwZXJpb2QgYXQgd2hpY2ggdGhlIGFsYXJtIHdpbGwgcmVjdXIKKyAqLwordm9pZCBhbGFybV9zdGFydChzdHJ1Y3QgYWxhcm0gKmFsYXJtLCBrdGltZV90IHN0YXJ0LCBrdGltZV90IHBlcmlvZCkKK3sKKwlzdHJ1Y3QgYWxhcm1fYmFzZSAqYmFzZSA9ICZhbGFybV9iYXNlc1thbGFybS0+dHlwZV07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiYXNlLT5sb2NrLCBmbGFncyk7CisJaWYgKGFsYXJtLT5lbmFibGVkKQorCQlhbGFybXRpbWVyX3JlbW92ZShiYXNlLCBhbGFybSk7CisJYWxhcm0tPm5vZGUuZXhwaXJlcyA9IHN0YXJ0OworCWFsYXJtLT5wZXJpb2QgPSBwZXJpb2Q7CisJYWxhcm10aW1lcl9lbnF1ZXVlKGJhc2UsIGFsYXJtKTsKKwlhbGFybS0+ZW5hYmxlZCA9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFzZS0+bG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIGFsYXJtX2NhbmNlbCAtIFRyaWVzIHRvIGNhbmNlbCBhbiBhbGFybSB0aW1lcgorICogQGFsYXJtOiBwdHIgdG8gYWxhcm0gdG8gYmUgY2FuY2VsZWQKKyAqLwordm9pZCBhbGFybV9jYW5jZWwoc3RydWN0IGFsYXJtICphbGFybSkKK3sKKwlzdHJ1Y3QgYWxhcm1fYmFzZSAqYmFzZSA9ICZhbGFybV9iYXNlc1thbGFybS0+dHlwZV07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiYXNlLT5sb2NrLCBmbGFncyk7CisJaWYgKGFsYXJtLT5lbmFibGVkKQorCQlhbGFybXRpbWVyX3JlbW92ZShiYXNlLCBhbGFybSk7CisJYWxhcm0tPmVuYWJsZWQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhc2UtPmxvY2ssIGZsYWdzKTsKK30KKworCisvKioKKyAqIGNsb2NrMmFsYXJtIC0gaGVscGVyIHRoYXQgY29udmVydHMgZnJvbSBjbG9ja2lkIHRvIGFsYXJtdHlwZXMKKyAqIEBjbG9ja2lkOiBjbG9ja2lkLgorICovCitzdGF0aWMgZW51bSBhbGFybXRpbWVyX3R5cGUgY2xvY2syYWxhcm0oY2xvY2tpZF90IGNsb2NraWQpCit7CisJaWYgKGNsb2NraWQgPT0gQ0xPQ0tfUkVBTFRJTUVfQUxBUk0pCisJCXJldHVybiBBTEFSTV9SRUFMVElNRTsKKwlpZiAoY2xvY2tpZCA9PSBDTE9DS19CT09UVElNRV9BTEFSTSkKKwkJcmV0dXJuIEFMQVJNX0JPT1RUSU1FOworCXJldHVybiAtMTsKK30KKworLyoqCisgKiBhbGFybV9oYW5kbGVfdGltZXIgLSBDYWxsYmFjayBmb3IgcG9zaXggdGltZXJzCisgKiBAYWxhcm06IGFsYXJtIHRoYXQgZmlyZWQKKyAqCisgKiBQb3NpeCB0aW1lciBjYWxsYmFjayBmb3IgZXhwaXJlZCBhbGFybSB0aW1lcnMuCisgKi8KK3N0YXRpYyB2b2lkIGFsYXJtX2hhbmRsZV90aW1lcihzdHJ1Y3QgYWxhcm0gKmFsYXJtKQoreworCXN0cnVjdCBrX2l0aW1lciAqcHRyID0gY29udGFpbmVyX29mKGFsYXJtLCBzdHJ1Y3Qga19pdGltZXIsCisJCQkJCQlpdC5hbGFybXRpbWVyKTsKKwlpZiAocG9zaXhfdGltZXJfZXZlbnQocHRyLCAwKSAhPSAwKQorCQlwdHItPml0X292ZXJydW4rKzsKK30KKworLyoqCisgKiBhbGFybV9jbG9ja19nZXRyZXMgLSBwb3NpeCBnZXRyZXMgaW50ZXJmYWNlCisgKiBAd2hpY2hfY2xvY2s6IGNsb2NraWQKKyAqIEB0cDogdGltZXNwZWMgdG8gZmlsbAorICoKKyAqIFJldHVybnMgdGhlIGdyYW51bGFyaXR5IG9mIHVuZGVybHlpbmcgYWxhcm0gYmFzZSBjbG9jaworICovCitzdGF0aWMgaW50IGFsYXJtX2Nsb2NrX2dldHJlcyhjb25zdCBjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssIHN0cnVjdCB0aW1lc3BlYyAqdHApCit7CisJY2xvY2tpZF90IGJhc2VpZCA9IGFsYXJtX2Jhc2VzW2Nsb2NrMmFsYXJtKHdoaWNoX2Nsb2NrKV0uYmFzZV9jbG9ja2lkOworCisJcmV0dXJuIGhydGltZXJfZ2V0X3JlcyhiYXNlaWQsIHRwKTsKK30KKworLyoqCisgKiBhbGFybV9jbG9ja19nZXQgLSBwb3NpeCBjbG9ja19nZXQgaW50ZXJmYWNlCisgKiBAd2hpY2hfY2xvY2s6IGNsb2NraWQKKyAqIEB0cDogdGltZXNwZWMgdG8gZmlsbC4KKyAqCisgKiBQcm92aWRlcyB0aGUgdW5kZXJseWluZyBhbGFybSBiYXNlIHRpbWUuCisgKi8KK3N0YXRpYyBpbnQgYWxhcm1fY2xvY2tfZ2V0KGNsb2NraWRfdCB3aGljaF9jbG9jaywgc3RydWN0IHRpbWVzcGVjICp0cCkKK3sKKwlzdHJ1Y3QgYWxhcm1fYmFzZSAqYmFzZSA9ICZhbGFybV9iYXNlc1tjbG9jazJhbGFybSh3aGljaF9jbG9jayldOworCisJKnRwID0ga3RpbWVfdG9fdGltZXNwZWMoYmFzZS0+Z2V0dGltZSgpKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBhbGFybV90aW1lcl9jcmVhdGUgLSBwb3NpeCB0aW1lcl9jcmVhdGUgaW50ZXJmYWNlCisgKiBAbmV3X3RpbWVyOiBrX2l0aW1lciBwb2ludGVyIHRvIG1hbmFnZQorICoKKyAqIEluaXRpYWxpemVzIHRoZSBrX2l0aW1lciBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyBpbnQgYWxhcm1fdGltZXJfY3JlYXRlKHN0cnVjdCBrX2l0aW1lciAqbmV3X3RpbWVyKQoreworCWVudW0gIGFsYXJtdGltZXJfdHlwZSB0eXBlOworCXN0cnVjdCBhbGFybV9iYXNlICpiYXNlOworCisJaWYgKCFjYXBhYmxlKENBUF9XQUtFX0FMQVJNKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXR5cGUgPSBjbG9jazJhbGFybShuZXdfdGltZXItPml0X2Nsb2NrKTsKKwliYXNlID0gJmFsYXJtX2Jhc2VzW3R5cGVdOworCWFsYXJtX2luaXQoJm5ld190aW1lci0+aXQuYWxhcm10aW1lciwgdHlwZSwgYWxhcm1faGFuZGxlX3RpbWVyKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBhbGFybV90aW1lcl9nZXQgLSBwb3NpeCB0aW1lcl9nZXQgaW50ZXJmYWNlCisgKiBAbmV3X3RpbWVyOiBrX2l0aW1lciBwb2ludGVyCisgKiBAY3VyX3NldHRpbmc6IGl0aW1lcnNwZWMgZGF0YSB0byBmaWxsCisgKgorICogQ29waWVzIHRoZSBpdGltZXJzcGVjIGRhdGEgb3V0IGZyb20gdGhlIGtfaXRpbWVyCisgKi8KK3N0YXRpYyB2b2lkIGFsYXJtX3RpbWVyX2dldChzdHJ1Y3Qga19pdGltZXIgKnRpbXIsCisJCQkJc3RydWN0IGl0aW1lcnNwZWMgKmN1cl9zZXR0aW5nKQoreworCWN1cl9zZXR0aW5nLT5pdF9pbnRlcnZhbCA9CisJCQlrdGltZV90b190aW1lc3BlYyh0aW1yLT5pdC5hbGFybXRpbWVyLnBlcmlvZCk7CisJY3VyX3NldHRpbmctPml0X3ZhbHVlID0KKwkJCWt0aW1lX3RvX3RpbWVzcGVjKHRpbXItPml0LmFsYXJtdGltZXIubm9kZS5leHBpcmVzKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogYWxhcm1fdGltZXJfZGVsIC0gcG9zaXggdGltZXJfZGVsIGludGVyZmFjZQorICogQHRpbXI6IGtfaXRpbWVyIHBvaW50ZXIgdG8gYmUgZGVsZXRlZAorICoKKyAqIENhbmNlbHMgYW55IHByb2dyYW1tZWQgYWxhcm1zIGZvciB0aGUgZ2l2ZW4gdGltZXIuCisgKi8KK3N0YXRpYyBpbnQgYWxhcm1fdGltZXJfZGVsKHN0cnVjdCBrX2l0aW1lciAqdGltcikKK3sKKwlhbGFybV9jYW5jZWwoJnRpbXItPml0LmFsYXJtdGltZXIpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGFsYXJtX3RpbWVyX3NldCAtIHBvc2l4IHRpbWVyX3NldCBpbnRlcmZhY2UKKyAqIEB0aW1yOiBrX2l0aW1lciBwb2ludGVyIHRvIGJlIGRlbGV0ZWQKKyAqIEBmbGFnczogdGltZXIgZmxhZ3MKKyAqIEBuZXdfc2V0dGluZzogaXRpbWVyc3BlYyB0byBiZSB1c2VkCisgKiBAb2xkX3NldHRpbmc6IGl0aW1lcnNwZWMgYmVpbmcgcmVwbGFjZWQKKyAqCisgKiBTZXRzIHRoZSB0aW1lciB0byBuZXdfc2V0dGluZywgYW5kIHN0YXJ0cyB0aGUgdGltZXIuCisgKi8KK3N0YXRpYyBpbnQgYWxhcm1fdGltZXJfc2V0KHN0cnVjdCBrX2l0aW1lciAqdGltciwgaW50IGZsYWdzLAorCQkJCXN0cnVjdCBpdGltZXJzcGVjICpuZXdfc2V0dGluZywKKwkJCQlzdHJ1Y3QgaXRpbWVyc3BlYyAqb2xkX3NldHRpbmcpCit7CisJLyogU2F2ZSBvbGQgdmFsdWVzICovCisJb2xkX3NldHRpbmctPml0X2ludGVydmFsID0KKwkJCWt0aW1lX3RvX3RpbWVzcGVjKHRpbXItPml0LmFsYXJtdGltZXIucGVyaW9kKTsKKwlvbGRfc2V0dGluZy0+aXRfdmFsdWUgPQorCQkJa3RpbWVfdG9fdGltZXNwZWModGltci0+aXQuYWxhcm10aW1lci5ub2RlLmV4cGlyZXMpOworCisJLyogSWYgdGhlIHRpbWVyIHdhcyBhbHJlYWR5IHNldCwgY2FuY2VsIGl0ICovCisJYWxhcm1fY2FuY2VsKCZ0aW1yLT5pdC5hbGFybXRpbWVyKTsKKworCS8qIHN0YXJ0IHRoZSB0aW1lciAqLworCWFsYXJtX3N0YXJ0KCZ0aW1yLT5pdC5hbGFybXRpbWVyLAorCQkJdGltZXNwZWNfdG9fa3RpbWUobmV3X3NldHRpbmctPml0X3ZhbHVlKSwKKwkJCXRpbWVzcGVjX3RvX2t0aW1lKG5ld19zZXR0aW5nLT5pdF9pbnRlcnZhbCkpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGFsYXJtdGltZXJfbnNsZWVwX3dha2V1cCAtIFdha2V1cCBmdW5jdGlvbiBmb3IgYWxhcm1fdGltZXJfbnNsZWVwCisgKiBAYWxhcm06IHB0ciB0byBhbGFybSB0aGF0IGZpcmVkCisgKgorICogV2FrZXMgdXAgdGhlIHRhc2sgdGhhdCBzZXQgdGhlIGFsYXJtdGltZXIKKyAqLworc3RhdGljIHZvaWQgYWxhcm10aW1lcl9uc2xlZXBfd2FrZXVwKHN0cnVjdCBhbGFybSAqYWxhcm0pCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gKHN0cnVjdCB0YXNrX3N0cnVjdCAqKWFsYXJtLT5kYXRhOworCisJYWxhcm0tPmRhdGEgPSBOVUxMOworCWlmICh0YXNrKQorCQl3YWtlX3VwX3Byb2Nlc3ModGFzayk7Cit9CisKKy8qKgorICogYWxhcm10aW1lcl9kb19uc2xlZXAgLSBJbnRlcm5hbCBhbGFybXRpbWVyIG5zbGVlcCBpbXBsZW1lbnRhdGlvbgorICogQGFsYXJtOiBwdHIgdG8gYWxhcm10aW1lcgorICogQGFic2V4cDogYWJzb2x1dGUgZXhwaXJhdGlvbiB0aW1lCisgKgorICogU2V0cyB0aGUgYWxhcm0gdGltZXIgYW5kIHNsZWVwcyB1bnRpbCBpdCBpcyBmaXJlZCBvciBpbnRlcnJ1cHRlZC4KKyAqLworc3RhdGljIGludCBhbGFybXRpbWVyX2RvX25zbGVlcChzdHJ1Y3QgYWxhcm0gKmFsYXJtLCBrdGltZV90IGFic2V4cCkKK3sKKwlhbGFybS0+ZGF0YSA9ICh2b2lkICopY3VycmVudDsKKwlkbyB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWFsYXJtX3N0YXJ0KGFsYXJtLCBhYnNleHAsIGt0aW1lX3NldCgwLCAwKSk7CisJCWlmIChsaWtlbHkoYWxhcm0tPmRhdGEpKQorCQkJc2NoZWR1bGUoKTsKKworCQlhbGFybV9jYW5jZWwoYWxhcm0pOworCX0gd2hpbGUgKGFsYXJtLT5kYXRhICYmICFzaWduYWxfcGVuZGluZyhjdXJyZW50KSk7CisKKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisKKwlyZXR1cm4gKGFsYXJtLT5kYXRhID09IE5VTEwpOworfQorCisKKy8qKgorICogdXBkYXRlX3JtdHAgLSBVcGRhdGUgcmVtYWluaW5nIHRpbWVzcGVjIHZhbHVlCisgKiBAZXhwOiBleHBpcmF0aW9uIHRpbWUKKyAqIEB0eXBlOiB0aW1lciB0eXBlCisgKiBAcm10cDogdXNlciBwb2ludGVyIHRvIHJlbWFpbmluZyB0aW1lcHNlYyB2YWx1ZQorICoKKyAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IGZpbGxzIGluIHJtdHAgdmFsdWUgd2l0aCB0aW1lIGJldHdlZW4KKyAqIG5vdyBhbmQgdGhlIGV4cCB2YWx1ZQorICovCitzdGF0aWMgaW50IHVwZGF0ZV9ybXRwKGt0aW1lX3QgZXhwLCBlbnVtICBhbGFybXRpbWVyX3R5cGUgdHlwZSwKKwkJCXN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnJtdHApCit7CisJc3RydWN0IHRpbWVzcGVjIHJtdDsKKwlrdGltZV90IHJlbTsKKworCXJlbSA9IGt0aW1lX3N1YihleHAsIGFsYXJtX2Jhc2VzW3R5cGVdLmdldHRpbWUoKSk7CisKKwlpZiAocmVtLnR2NjQgPD0gMCkKKwkJcmV0dXJuIDA7CisJcm10ID0ga3RpbWVfdG9fdGltZXNwZWMocmVtKTsKKworCWlmIChjb3B5X3RvX3VzZXIocm10cCwgJnJtdCwgc2l6ZW9mKCpybXRwKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDE7CisKK30KKworLyoqCisgKiBhbGFybV90aW1lcl9uc2xlZXBfcmVzdGFydCAtIHJlc3RhcnRibG9jayBhbGFybXRpbWVyIG5zbGVlcAorICogQHJlc3RhcnQ6IHB0ciB0byByZXN0YXJ0IGJsb2NrCisgKgorICogSGFuZGxlcyByZXN0YXJ0ZWQgY2xvY2tfbmFub3NsZWVwIGNhbGxzCisgKi8KK3N0YXRpYyBsb25nIF9fc2NoZWQgYWxhcm1fdGltZXJfbnNsZWVwX3Jlc3RhcnQoc3RydWN0IHJlc3RhcnRfYmxvY2sgKnJlc3RhcnQpCit7CisJZW51bSAgYWxhcm10aW1lcl90eXBlIHR5cGUgPSByZXN0YXJ0LT5uYW5vc2xlZXAuaW5kZXg7CisJa3RpbWVfdCBleHA7CisJc3RydWN0IHRpbWVzcGVjIF9fdXNlciAgKnJtdHA7CisJc3RydWN0IGFsYXJtIGFsYXJtOworCWludCByZXQgPSAwOworCisJZXhwLnR2NjQgPSByZXN0YXJ0LT5uYW5vc2xlZXAuZXhwaXJlczsKKwlhbGFybV9pbml0KCZhbGFybSwgdHlwZSwgYWxhcm10aW1lcl9uc2xlZXBfd2FrZXVwKTsKKworCWlmIChhbGFybXRpbWVyX2RvX25zbGVlcCgmYWxhcm0sIGV4cCkpCisJCWdvdG8gb3V0OworCisJaWYgKGZyZWV6aW5nKGN1cnJlbnQpKQorCQlhbGFybXRpbWVyX2ZyZWV6ZXJzZXQoZXhwLCB0eXBlKTsKKworCXJtdHAgPSByZXN0YXJ0LT5uYW5vc2xlZXAucm10cDsKKwlpZiAocm10cCkgeworCQlyZXQgPSB1cGRhdGVfcm10cChleHAsIHR5cGUsIHJtdHApOworCQlpZiAocmV0IDw9IDApCisJCQlnb3RvIG91dDsKKwl9CisKKworCS8qIFRoZSBvdGhlciB2YWx1ZXMgaW4gcmVzdGFydCBhcmUgYWxyZWFkeSBmaWxsZWQgaW4gKi8KKwlyZXQgPSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWxhcm1fdGltZXJfbnNsZWVwIC0gYWxhcm10aW1lciBuYW5vc2xlZXAKKyAqIEB3aGljaF9jbG9jazogY2xvY2tpZAorICogQGZsYWdzOiBkZXRlcm1pbnMgYWJzdGltZSBvciByZWxhdGl2ZQorICogQHRzcmVxOiByZXF1ZXN0ZWQgc2xlZXAgdGltZSAoYWJzIG9yIHJlbCkKKyAqIEBybXRwOiByZW1haW5pbmcgc2xlZXAgdGltZSBzYXZlZAorICoKKyAqIEhhbmRsZXMgY2xvY2tfbmFub3NsZWVwIGNhbGxzIGFnYWluc3QgX0FMQVJNIGNsb2NraWRzCisgKi8KK3N0YXRpYyBpbnQgYWxhcm1fdGltZXJfbnNsZWVwKGNvbnN0IGNsb2NraWRfdCB3aGljaF9jbG9jaywgaW50IGZsYWdzLAorCQkgICAgIHN0cnVjdCB0aW1lc3BlYyAqdHNyZXEsIHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnJtdHApCit7CisJZW51bSAgYWxhcm10aW1lcl90eXBlIHR5cGUgPSBjbG9jazJhbGFybSh3aGljaF9jbG9jayk7CisJc3RydWN0IGFsYXJtIGFsYXJtOworCWt0aW1lX3QgZXhwOworCWludCByZXQgPSAwOworCXN0cnVjdCByZXN0YXJ0X2Jsb2NrICpyZXN0YXJ0OworCisJaWYgKCFjYXBhYmxlKENBUF9XQUtFX0FMQVJNKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWFsYXJtX2luaXQoJmFsYXJtLCB0eXBlLCBhbGFybXRpbWVyX25zbGVlcF93YWtldXApOworCisJZXhwID0gdGltZXNwZWNfdG9fa3RpbWUoKnRzcmVxKTsKKwkvKiBDb252ZXJ0IChpZiBuZWNlc3NhcnkpIHRvIGFic29sdXRlIHRpbWUgKi8KKwlpZiAoZmxhZ3MgIT0gVElNRVJfQUJTVElNRSkgeworCQlrdGltZV90IG5vdyA9IGFsYXJtX2Jhc2VzW3R5cGVdLmdldHRpbWUoKTsKKwkJZXhwID0ga3RpbWVfYWRkKG5vdywgZXhwKTsKKwl9CisKKwlpZiAoYWxhcm10aW1lcl9kb19uc2xlZXAoJmFsYXJtLCBleHApKQorCQlnb3RvIG91dDsKKworCWlmIChmcmVlemluZyhjdXJyZW50KSkKKwkJYWxhcm10aW1lcl9mcmVlemVyc2V0KGV4cCwgdHlwZSk7CisKKwkvKiBhYnMgdGltZXJzIGRvbid0IHNldCByZW1haW5pbmcgdGltZSBvciByZXN0YXJ0ICovCisJaWYgKGZsYWdzID09IFRJTUVSX0FCU1RJTUUpIHsKKwkJcmV0ID0gLUVSRVNUQVJUTk9IQU5EOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocm10cCkgeworCQlyZXQgPSB1cGRhdGVfcm10cChleHAsIHR5cGUsIHJtdHApOworCQlpZiAocmV0IDw9IDApCisJCQlnb3RvIG91dDsKKwl9CisKKwlyZXN0YXJ0ID0gJmN1cnJlbnRfdGhyZWFkX2luZm8oKS0+cmVzdGFydF9ibG9jazsKKwlyZXN0YXJ0LT5mbiA9IGFsYXJtX3RpbWVyX25zbGVlcF9yZXN0YXJ0OworCXJlc3RhcnQtPm5hbm9zbGVlcC5pbmRleCA9IHR5cGU7CisJcmVzdGFydC0+bmFub3NsZWVwLmV4cGlyZXMgPSBleHAudHY2NDsKKwlyZXN0YXJ0LT5uYW5vc2xlZXAucm10cCA9IHJtdHA7CisJcmV0ID0gLUVSRVNUQVJUX1JFU1RBUlRCTE9DSzsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKworLyogU3VzcGVuZCBob29rIHN0cnVjdHVyZXMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBhbGFybXRpbWVyX3BtX29wcyA9IHsKKwkuc3VzcGVuZCA9IGFsYXJtdGltZXJfc3VzcGVuZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFsYXJtdGltZXJfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFsYXJtdGltZXIiLAorCQkucG0gPSAmYWxhcm10aW1lcl9wbV9vcHMsCisJfQorfTsKKworLyoqCisgKiBhbGFybXRpbWVyX2luaXQgLSBJbml0aWFsaXplIGFsYXJtIHRpbWVyIGNvZGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBhbGFybSBiYXNlcyBhbmQgcmVnaXN0ZXJzCisgKiB0aGUgcG9zaXggY2xvY2sgaWRzLgorICovCitzdGF0aWMgaW50IF9faW5pdCBhbGFybXRpbWVyX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyb3IgPSAwOworCWludCBpOworCXN0cnVjdCBrX2Nsb2NrIGFsYXJtX2Nsb2NrID0geworCQkuY2xvY2tfZ2V0cmVzCT0gYWxhcm1fY2xvY2tfZ2V0cmVzLAorCQkuY2xvY2tfZ2V0CT0gYWxhcm1fY2xvY2tfZ2V0LAorCQkudGltZXJfY3JlYXRlCT0gYWxhcm1fdGltZXJfY3JlYXRlLAorCQkudGltZXJfc2V0CT0gYWxhcm1fdGltZXJfc2V0LAorCQkudGltZXJfZGVsCT0gYWxhcm1fdGltZXJfZGVsLAorCQkudGltZXJfZ2V0CT0gYWxhcm1fdGltZXJfZ2V0LAorCQkubnNsZWVwCQk9IGFsYXJtX3RpbWVyX25zbGVlcCwKKwl9OworCisJcG9zaXhfdGltZXJzX3JlZ2lzdGVyX2Nsb2NrKENMT0NLX1JFQUxUSU1FX0FMQVJNLCAmYWxhcm1fY2xvY2spOworCXBvc2l4X3RpbWVyc19yZWdpc3Rlcl9jbG9jayhDTE9DS19CT09UVElNRV9BTEFSTSwgJmFsYXJtX2Nsb2NrKTsKKworCS8qIEluaXRpYWxpemUgYWxhcm0gYmFzZXMgKi8KKwlhbGFybV9iYXNlc1tBTEFSTV9SRUFMVElNRV0uYmFzZV9jbG9ja2lkID0gQ0xPQ0tfUkVBTFRJTUU7CisJYWxhcm1fYmFzZXNbQUxBUk1fUkVBTFRJTUVdLmdldHRpbWUgPSAma3RpbWVfZ2V0X3JlYWw7CisJYWxhcm1fYmFzZXNbQUxBUk1fQk9PVFRJTUVdLmJhc2VfY2xvY2tpZCA9IENMT0NLX0JPT1RUSU1FOworCWFsYXJtX2Jhc2VzW0FMQVJNX0JPT1RUSU1FXS5nZXR0aW1lID0gJmt0aW1lX2dldF9ib290dGltZTsKKwlmb3IgKGkgPSAwOyBpIDwgQUxBUk1fTlVNVFlQRTsgaSsrKSB7CisJCXRpbWVycXVldWVfaW5pdF9oZWFkKCZhbGFybV9iYXNlc1tpXS50aW1lcnF1ZXVlKTsKKwkJc3Bpbl9sb2NrX2luaXQoJmFsYXJtX2Jhc2VzW2ldLmxvY2spOworCQlocnRpbWVyX2luaXQoJmFsYXJtX2Jhc2VzW2ldLnRpbWVyLAorCQkJCWFsYXJtX2Jhc2VzW2ldLmJhc2VfY2xvY2tpZCwKKwkJCQlIUlRJTUVSX01PREVfQUJTKTsKKwkJYWxhcm1fYmFzZXNbaV0udGltZXIuZnVuY3Rpb24gPSBhbGFybXRpbWVyX2ZpcmVkOworCX0KKwllcnJvciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYWxhcm10aW1lcl9kcml2ZXIpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoImFsYXJtdGltZXIiLCAtMSwgTlVMTCwgMCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CitkZXZpY2VfaW5pdGNhbGwoYWxhcm10aW1lcl9pbml0KTsKKworI2lmZGVmIENPTkZJR19SVENfQ0xBU1MKKy8qKgorICogaGFzX3dha2VhbGFybSAtIGNoZWNrIHJ0YyBkZXZpY2UgaGFzIHdha2VhbGFybSBhYmlsaXR5CisgKiBAZGV2OiBjdXJyZW50IGRldmljZQorICogQG5hbWVfcHRyOiBuYW1lIHRvIGJlIHJldHVybmVkCisgKgorICogVGhpcyBoZWxwZXIgZnVuY3Rpb24gY2hlY2tzIHRvIHNlZSBpZiB0aGUgcnRjIGRldmljZSBjYW4gd2FrZQorICogZnJvbSBzdXNwZW5kLgorICovCitzdGF0aWMgaW50IF9faW5pdCBoYXNfd2FrZWFsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqbmFtZV9wdHIpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKmNhbmRpZGF0ZSA9IHRvX3J0Y19kZXZpY2UoZGV2KTsKKworCWlmICghY2FuZGlkYXRlLT5vcHMtPnNldF9hbGFybSkKKwkJcmV0dXJuIDA7CisJaWYgKCFkZXZpY2VfbWF5X3dha2V1cChjYW5kaWRhdGUtPmRldi5wYXJlbnQpKQorCQlyZXR1cm4gMDsKKworCSooY29uc3QgY2hhciAqKiluYW1lX3B0ciA9IGRldl9uYW1lKGRldik7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogYWxhcm10aW1lcl9pbml0X2xhdGUgLSBMYXRlIGluaXRpYWxpemluZyBvZiBhbGFybXRpbWVyIGNvZGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGxvY2F0ZXMgYSBydGMgZGV2aWNlIHRvIHVzZSBmb3Igd2FrZWFsYXJtcy4KKyAqIFJ1biBhcyBsYXRlX2luaXRjYWxsIHRvIG1ha2Ugc3VyZSBydGMgZGV2aWNlcyBoYXZlIGJlZW4KKyAqIHJlZ2lzdGVyZWQuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGFsYXJtdGltZXJfaW5pdF9sYXRlKHZvaWQpCit7CisJY2hhciAqc3RyOworCisJLyogRmluZCBhbiBydGMgZGV2aWNlIGFuZCBpbml0IHRoZSBydGNfdGltZXIgKi8KKwljbGFzc19maW5kX2RldmljZShydGNfY2xhc3MsIE5VTEwsICZzdHIsIGhhc193YWtlYWxhcm0pOworCWlmIChzdHIpCisJCXJ0Y2RldiA9IHJ0Y19jbGFzc19vcGVuKHN0cik7CisJaWYgKCFydGNkZXYpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTm8gUlRDIGRldmljZSBmb3VuZCwgQUxBUk0gdGltZXJzIHdpbGwiCisJCQkiIG5vdCB3YWtlIGZyb20gc3VzcGVuZCIpOworCX0KKwlydGNfdGltZXJfaW5pdCgmcnRjdGltZXIsIE5VTEwsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorc3RhdGljIGludCBfX2luaXQgYWxhcm10aW1lcl9pbml0X2xhdGUodm9pZCkKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICJLZXJuZWwgbm90IGJ1aWx0IHdpdGggUlRDIHN1cHBvcnQsIEFMQVJNIHRpbWVycyIKKwkJIiB3aWxsIG5vdCB3YWtlIGZyb20gc3VzcGVuZCIpOworCXJldHVybiAwOworfQorI2VuZGlmCitsYXRlX2luaXRjYWxsKGFsYXJtdGltZXJfaW5pdF9sYXRlKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMgYi9rZXJuZWwvdGltZS9jbG9ja2V2ZW50cy5jCmluZGV4IDBkNzRiOWIuLjIyYTlkYTkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMKKysrIGIva2VybmVsL3RpbWUvY2xvY2tldmVudHMuYwpAQCAtMTk0LDYgKzE5NCw3MCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKTsKIAorc3RhdGljIHZvaWQgY2xvY2tldmVudHNfY29uZmlnKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICB1MzIgZnJlcSkKK3sKKwl1bnNpZ25lZCBsb25nIHNlYzsKKworCWlmICghKGRldi0+ZmVhdHVyZXMgJiBDTE9DS19FVlRfRkVBVF9PTkVTSE9UKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNlY29uZHMgd2UgY2FuIHNsZWVwLiBMaW1pdAorCSAqIHRvIDEwIG1pbnV0ZXMgZm9yIGhhcmR3YXJlIHdoaWNoIGNhbiBwcm9ncmFtIG1vcmUgdGhhbgorCSAqIDMyYml0IHRpY2tzIHNvIHdlIHN0aWxsIGdldCByZWFzb25hYmxlIGNvbnZlcnNpb24gdmFsdWVzLgorCSAqLworCXNlYyA9IGRldi0+bWF4X2RlbHRhX3RpY2tzOworCWRvX2RpdihzZWMsIGZyZXEpOworCWlmICghc2VjKQorCQlzZWMgPSAxOworCWVsc2UgaWYgKHNlYyA+IDYwMCAmJiBkZXYtPm1heF9kZWx0YV90aWNrcyA+IFVJTlRfTUFYKQorCQlzZWMgPSA2MDA7CisKKwljbG9ja2V2ZW50c19jYWxjX211bHRfc2hpZnQoZGV2LCBmcmVxLCBzZWMpOworCWRldi0+bWluX2RlbHRhX25zID0gY2xvY2tldmVudF9kZWx0YTJucyhkZXYtPm1pbl9kZWx0YV90aWNrcywgZGV2KTsKKwlkZXYtPm1heF9kZWx0YV9ucyA9IGNsb2NrZXZlbnRfZGVsdGEybnMoZGV2LT5tYXhfZGVsdGFfdGlja3MsIGRldik7Cit9CisKKy8qKgorICogY2xvY2tldmVudHNfY29uZmlnX2FuZF9yZWdpc3RlciAtIENvbmZpZ3VyZSBhbmQgcmVnaXN0ZXIgYSBjbG9jayBldmVudCBkZXZpY2UKKyAqIEBkZXY6CWRldmljZSB0byByZWdpc3RlcgorICogQGZyZXE6CVRoZSBjbG9jayBmcmVxdWVuY3kKKyAqIEBtaW5fZGVsdGE6CVRoZSBtaW5pbXVtIGNsb2NrIHRpY2tzIHRvIHByb2dyYW0gaW4gb25lc2hvdCBtb2RlCisgKiBAbWF4X2RlbHRhOglUaGUgbWF4aW11bSBjbG9jayB0aWNrcyB0byBwcm9ncmFtIGluIG9uZXNob3QgbW9kZQorICoKKyAqIG1pbi9tYXhfZGVsdGEgY2FuIGJlIDAgZm9yIGRldmljZXMgd2hpY2ggZG8gbm90IHN1cHBvcnQgb25lc2hvdCBtb2RlLgorICovCit2b2lkIGNsb2NrZXZlbnRzX2NvbmZpZ19hbmRfcmVnaXN0ZXIoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LAorCQkJCSAgICAgdTMyIGZyZXEsIHVuc2lnbmVkIGxvbmcgbWluX2RlbHRhLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBtYXhfZGVsdGEpCit7CisJZGV2LT5taW5fZGVsdGFfdGlja3MgPSBtaW5fZGVsdGE7CisJZGV2LT5tYXhfZGVsdGFfdGlja3MgPSBtYXhfZGVsdGE7CisJY2xvY2tldmVudHNfY29uZmlnKGRldiwgZnJlcSk7CisJY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKGRldik7Cit9CisKKy8qKgorICogY2xvY2tldmVudHNfdXBkYXRlX2ZyZXEgLSBVcGRhdGUgZnJlcXVlbmN5IGFuZCByZXByb2dyYW0gYSBjbG9jayBldmVudCBkZXZpY2UuCisgKiBAZGV2OglkZXZpY2UgdG8gbW9kaWZ5CisgKiBAZnJlcToJbmV3IGRldmljZSBmcmVxdWVuY3kKKyAqCisgKiBSZWNvbmZpZ3VyZSBhbmQgcmVwcm9ncmFtIGEgY2xvY2sgZXZlbnQgZGV2aWNlIGluIG9uZXNob3QKKyAqIG1vZGUuIE11c3QgYmUgY2FsbGVkIG9uIHRoZSBjcHUgZm9yIHdoaWNoIHRoZSBkZXZpY2UgZGVsaXZlcnMgcGVyCisgKiBjcHUgdGltZXIgZXZlbnRzIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCEgIFJldHVybnMgMCBvbiBzdWNjZXNzLAorICogLUVUSU1FIHdoZW4gdGhlIGV2ZW50IGlzIGluIHRoZSBwYXN0LgorICovCitpbnQgY2xvY2tldmVudHNfdXBkYXRlX2ZyZXEoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LCB1MzIgZnJlcSkKK3sKKwljbG9ja2V2ZW50c19jb25maWcoZGV2LCBmcmVxKTsKKworCWlmIChkZXYtPm1vZGUgIT0gQ0xPQ0tfRVZUX01PREVfT05FU0hPVCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gY2xvY2tldmVudHNfcHJvZ3JhbV9ldmVudChkZXYsIGRldi0+bmV4dF9ldmVudCwga3RpbWVfZ2V0KCkpOworfQorCiAvKgogICogTm9vcCBoYW5kbGVyIHdoZW4gd2Ugc2h1dCBkb3duIGFuIGV2ZW50IGRldmljZQogICovCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jIGIva2VybmVsL3RpbWUvY2xvY2tzb3VyY2UuYwppbmRleCAwZTE3YzEwLi5kOWQ1ZjhjIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jCisrKyBiL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMKQEAgLTYyNiwxOSArNjI2LDYgQEAKIAlsaXN0X2FkZCgmY3MtPmxpc3QsIGVudHJ5KTsKIH0KIAotCi0vKgotICogTWF4aW11bSB0aW1lIHdlIGV4cGVjdCB0byBnbyBiZXR3ZWVuIHRpY2tzLiBUaGlzIGluY2x1ZGVzIGlkbGUKLSAqIHRpY2tsZXNzIHRpbWUuIEl0IHByb3ZpZGVzIHRoZSB0cmFkZSBvZmYgYmV0d2VlbiBzZWxlY3RpbmcgYQotICogbXVsdC9zaGlmdCBwYWlyIHRoYXQgaXMgdmVyeSBwcmVjaXNlIGJ1dCBjYW4gb25seSBoYW5kbGUgYSBzaG9ydAotICogcGVyaW9kIG9mIHRpbWUsIHZzLiBhIG11bHQvc2hpZnQgcGFpciB0aGF0IGNhbiBoYW5kbGUgbG9uZyBwZXJpb2RzCi0gKiBvZiB0aW1lIGJ1dCBpc24ndCBhcyBwcmVjaXNlLgotICoKLSAqIFRoaXMgaXMgYSBzdWJzeXN0ZW0gY29uc3RhbnQsIGFuZCBhY3R1YWwgaGFyZHdhcmUgbGltaXRhdGlvbnMKLSAqIG1heSBvdmVycmlkZSBpdCAoaWU6IGNsb2Nrc291cmNlcyB0aGF0IHdyYXAgZXZlcnkgMyBzZWNvbmRzKS4KLSAqLwotI2RlZmluZSBNQVhfVVBEQVRFX0xFTkdUSCA1IC8qIFNlY29uZHMgKi8KLQogLyoqCiAgKiBfX2Nsb2Nrc291cmNlX3VwZGF0ZWZyZXFfc2NhbGUgLSBVc2VkIHVwZGF0ZSBjbG9ja3NvdXJjZSB3aXRoIG5ldyBmcmVxCiAgKiBAdDoJCWNsb2Nrc291cmNlIHRvIGJlIHJlZ2lzdGVyZWQKQEAgLTY1MiwxNSArNjM5LDI4IEBACiAgKi8KIHZvaWQgX19jbG9ja3NvdXJjZV91cGRhdGVmcmVxX3NjYWxlKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MsIHUzMiBzY2FsZSwgdTMyIGZyZXEpCiB7CisJdW5zaWduZWQgbG9uZyBzZWM7CisKIAkvKgotCSAqIElkZWFsbHkgd2Ugd2FudCB0byB1c2UgIHNvbWUgb2YgdGhlIGxpbWl0cyB1c2VkIGluCi0JICogY2xvY2tzb3VyY2VfbWF4X2RlZmVybWVudCwgdG8gcHJvdmlkZSBhIG1vcmUgaW5mb3JtZWQKLQkgKiBNQVhfVVBEQVRFX0xFTkdUSC4gQnV0IGZvciBub3cgdGhpcyBqdXN0IGdldHMgdGhlCi0JICogcmVnaXN0ZXIgaW50ZXJmYWNlIHdvcmtpbmcgcHJvcGVybHkuCisJICogQ2FsYyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2Vjb25kcyB3aGljaCB3ZSBjYW4gcnVuIGJlZm9yZQorCSAqIHdyYXBwaW5nIGFyb3VuZC4gRm9yIGNsb2Nrc291cmNlcyB3aGljaCBoYXZlIGEgbWFzayA+IDMyYml0CisJICogd2UgbmVlZCB0byBsaW1pdCB0aGUgbWF4IHNsZWVwIHRpbWUgdG8gaGF2ZSBhIGdvb2QKKwkgKiBjb252ZXJzaW9uIHByZWNpc2lvbi4gMTAgbWludXRlcyBpcyBzdGlsbCBhIHJlYXNvbmFibGUKKwkgKiBhbW91bnQuIFRoYXQgcmVzdWx0cyBpbiBhIHNoaWZ0IHZhbHVlIG9mIDI0IGZvciBhCisJICogY2xvY2tzb3VyY2Ugd2l0aCBtYXNrID49IDQwYml0IGFuZCBmID49IDRHSHouIFRoYXQgbWFwcyB0bworCSAqIH4gMC4wNnBwbSBncmFudWxhcml0eSBmb3IgTlRQLiBXZSBhcHBseSB0aGUgc2FtZSAxMi41JQorCSAqIG1hcmdpbiBhcyB3ZSBkbyBpbiBjbG9ja3NvdXJjZV9tYXhfZGVmZXJtZW50KCkKIAkgKi8KKwlzZWMgPSAoY3MtPm1hc2sgLSAoY3MtPm1hc2sgPj4gNSkpOworCWRvX2RpdihzZWMsIGZyZXEpOworCWRvX2RpdihzZWMsIHNjYWxlKTsKKwlpZiAoIXNlYykKKwkJc2VjID0gMTsKKwllbHNlIGlmIChzZWMgPiA2MDAgJiYgY3MtPm1hc2sgPiBVSU5UX01BWCkKKwkJc2VjID0gNjAwOworCiAJY2xvY2tzX2NhbGNfbXVsdF9zaGlmdCgmY3MtPm11bHQsICZjcy0+c2hpZnQsIGZyZXEsCi0JCQkJICAgICAgTlNFQ19QRVJfU0VDL3NjYWxlLAotCQkJCSAgICAgIE1BWF9VUERBVEVfTEVOR1RIKnNjYWxlKTsKKwkJCSAgICAgICBOU0VDX1BFUl9TRUMgLyBzY2FsZSwgc2VjICogc2NhbGUpOwogCWNzLT5tYXhfaWRsZV9ucyA9IGNsb2Nrc291cmNlX21heF9kZWZlcm1lbnQoY3MpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoX19jbG9ja3NvdXJjZV91cGRhdGVmcmVxX3NjYWxlKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMgYi9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jCmluZGV4IDhhZDVkNTcuLjhlNmEwNWEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKKysrIGIva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYwpAQCAtNTk2LDYgKzU5Niw1OCBAQAogc3RhdGljIHN0cnVjdCB0aW1lc3BlYyB0aW1la2VlcGluZ19zdXNwZW5kX3RpbWU7CiAKIC8qKgorICogX190aW1la2VlcGluZ19pbmplY3Rfc2xlZXB0aW1lIC0gSW50ZXJuYWwgZnVuY3Rpb24gdG8gYWRkIHNsZWVwIGludGVydmFsCisgKiBAZGVsdGE6IHBvaW50ZXIgdG8gYSB0aW1lc3BlYyBkZWx0YSB2YWx1ZQorICoKKyAqIFRha2VzIGEgdGltZXNwZWMgb2Zmc2V0IG1lYXN1cmluZyBhIHN1c3BlbmQgaW50ZXJ2YWwgYW5kIHByb3Blcmx5CisgKiBhZGRzIHRoZSBzbGVlcCBvZmZzZXQgdG8gdGhlIHRpbWVrZWVwaW5nIHZhcmlhYmxlcy4KKyAqLworc3RhdGljIHZvaWQgX190aW1la2VlcGluZ19pbmplY3Rfc2xlZXB0aW1lKHN0cnVjdCB0aW1lc3BlYyAqZGVsdGEpCit7CisJeHRpbWUgPSB0aW1lc3BlY19hZGQoeHRpbWUsICpkZWx0YSk7CisJd2FsbF90b19tb25vdG9uaWMgPSB0aW1lc3BlY19zdWIod2FsbF90b19tb25vdG9uaWMsICpkZWx0YSk7CisJdG90YWxfc2xlZXBfdGltZSA9IHRpbWVzcGVjX2FkZCh0b3RhbF9zbGVlcF90aW1lLCAqZGVsdGEpOworfQorCisKKy8qKgorICogdGltZWtlZXBpbmdfaW5qZWN0X3NsZWVwdGltZSAtIEFkZHMgc3VzcGVuZCBpbnRlcnZhbCB0byB0aW1lZWtlZXBpbmcgdmFsdWVzCisgKiBAZGVsdGE6IHBvaW50ZXIgdG8gYSB0aW1lc3BlYyBkZWx0YSB2YWx1ZQorICoKKyAqIFRoaXMgaG9vayBpcyBmb3IgYXJjaGl0ZWN0dXJlcyB0aGF0IGNhbm5vdCBzdXBwb3J0IHJlYWRfcGVyc2lzdGVudF9jbG9jaworICogYmVjYXVzZSB0aGVpciBSVEMvcGVyc2lzdGVudCBjbG9jayBpcyBvbmx5IGFjY2Vzc2libGUgd2hlbiBpcnFzIGFyZSBlbmFibGVkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHJ0Y19yZXN1bWUoKSwgYW5kIGFsbG93cworICogYSBzdXNwZW5kIG9mZnNldCB0byBiZSBpbmplY3RlZCBpbnRvIHRoZSB0aW1la2VlcGluZyB2YWx1ZXMuCisgKi8KK3ZvaWQgdGltZWtlZXBpbmdfaW5qZWN0X3NsZWVwdGltZShzdHJ1Y3QgdGltZXNwZWMgKmRlbHRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCisJLyogTWFrZSBzdXJlIHdlIGRvbid0IHNldCB0aGUgY2xvY2sgdHdpY2UgKi8KKwlyZWFkX3BlcnNpc3RlbnRfY2xvY2soJnRzKTsKKwlpZiAoISh0cy50dl9zZWMgPT0gMCAmJiB0cy50dl9uc2VjID09IDApKQorCQlyZXR1cm47CisKKwl3cml0ZV9zZXFsb2NrX2lycXNhdmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKKwl0aW1la2VlcGluZ19mb3J3YXJkX25vdygpOworCisJX190aW1la2VlcGluZ19pbmplY3Rfc2xlZXB0aW1lKGRlbHRhKTsKKworCXRpbWVrZWVwZXIubnRwX2Vycm9yID0gMDsKKwludHBfY2xlYXIoKTsKKwl1cGRhdGVfdnN5c2NhbGwoJnh0aW1lLCAmd2FsbF90b19tb25vdG9uaWMsIHRpbWVrZWVwZXIuY2xvY2ssCisJCQkJdGltZWtlZXBlci5tdWx0KTsKKworCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBmbGFncyk7CisKKwkvKiBzaWduYWwgaHJ0aW1lcnMgYWJvdXQgdGltZSBjaGFuZ2UgKi8KKwljbG9ja193YXNfc2V0KCk7Cit9CisKKworLyoqCiAgKiB0aW1la2VlcGluZ19yZXN1bWUgLSBSZXN1bWVzIHRoZSBnZW5lcmljIHRpbWVrZWVwaW5nIHN1YnN5c3RlbS4KICAqCiAgKiBUaGlzIGlzIGZvciB0aGUgZ2VuZXJpYyBjbG9ja3NvdXJjZSB0aW1la2VlcGluZy4KQEAgLTYxNSw5ICs2NjcsNyBAQAogCiAJaWYgKHRpbWVzcGVjX2NvbXBhcmUoJnRzLCAmdGltZWtlZXBpbmdfc3VzcGVuZF90aW1lKSA+IDApIHsKIAkJdHMgPSB0aW1lc3BlY19zdWIodHMsIHRpbWVrZWVwaW5nX3N1c3BlbmRfdGltZSk7Ci0JCXh0aW1lID0gdGltZXNwZWNfYWRkKHh0aW1lLCB0cyk7Ci0JCXdhbGxfdG9fbW9ub3RvbmljID0gdGltZXNwZWNfc3ViKHdhbGxfdG9fbW9ub3RvbmljLCB0cyk7Ci0JCXRvdGFsX3NsZWVwX3RpbWUgPSB0aW1lc3BlY19hZGQodG90YWxfc2xlZXBfdGltZSwgdHMpOworCQlfX3RpbWVrZWVwaW5nX2luamVjdF9zbGVlcHRpbWUoJnRzKTsKIAl9CiAJLyogcmUtYmFzZSB0aGUgbGFzdCBjeWNsZSB2YWx1ZSAqLwogCXRpbWVrZWVwZXIuY2xvY2stPmN5Y2xlX2xhc3QgPSB0aW1la2VlcGVyLmNsb2NrLT5yZWFkKHRpbWVrZWVwZXIuY2xvY2spOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL2Z0cmFjZS5jIGIva2VybmVsL3RyYWNlL2Z0cmFjZS5jCmluZGV4IGVlMjRmYTEuLmQwMTdjMmMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS9mdHJhY2UuYworKysgYi9rZXJuZWwvdHJhY2UvZnRyYWNlLmMKQEAgLTM5LDIwICszOSwyNiBAQAogI2luY2x1ZGUgInRyYWNlX3N0YXQuaCIKIAogI2RlZmluZSBGVFJBQ0VfV0FSTl9PTihjb25kKQkJCVwKLQlkbyB7CQkJCQlcCi0JCWlmIChXQVJOX09OKGNvbmQpKQkJXAorCSh7CQkJCQlcCisJCWludCBfX19yID0gY29uZDsJCVwKKwkJaWYgKFdBUk5fT04oX19fcikpCQlcCiAJCQlmdHJhY2Vfa2lsbCgpOwkJXAotCX0gd2hpbGUgKDApCisJCV9fX3I7CQkJCVwKKwl9KQogCiAjZGVmaW5lIEZUUkFDRV9XQVJOX09OX09OQ0UoY29uZCkJCVwKLQlkbyB7CQkJCQlcCi0JCWlmIChXQVJOX09OX09OQ0UoY29uZCkpCQlcCisJKHsJCQkJCVwKKwkJaW50IF9fX3IgPSBjb25kOwkJXAorCQlpZiAoV0FSTl9PTl9PTkNFKF9fX3IpKQkJXAogCQkJZnRyYWNlX2tpbGwoKTsJCVwKLQl9IHdoaWxlICgwKQorCQlfX19yOwkJCQlcCisJfSkKIAogLyogaGFzaCBiaXRzIGZvciBzcGVjaWZpYyBmdW5jdGlvbiBzZWxlY3Rpb24gKi8KICNkZWZpbmUgRlRSQUNFX0hBU0hfQklUUyA3CiAjZGVmaW5lIEZUUkFDRV9GVU5DX0hBU0hTSVpFICgxIDw8IEZUUkFDRV9IQVNIX0JJVFMpCisjZGVmaW5lIEZUUkFDRV9IQVNIX0RFRkFVTFRfQklUUyAxMAorI2RlZmluZSBGVFJBQ0VfSEFTSF9NQVhfQklUUyAxMgogCiAvKiBmdHJhY2VfZW5hYmxlZCBpcyBhIG1ldGhvZCB0byB0dXJuIGZ0cmFjZSBvbiBvciBvZmYgKi8KIGludCBmdHJhY2VfZW5hYmxlZCBfX3JlYWRfbW9zdGx5OwpAQCAtODEsMjMgKzg3LDI5IEBACiAJLmZ1bmMJCT0gZnRyYWNlX3N0dWIsCiB9OwogCi1zdGF0aWMgc3RydWN0IGZ0cmFjZV9vcHMgKmZ0cmFjZV9saXN0IF9fcmVhZF9tb3N0bHkgPSAmZnRyYWNlX2xpc3RfZW5kOworc3RhdGljIHN0cnVjdCBmdHJhY2Vfb3BzICpmdHJhY2VfZ2xvYmFsX2xpc3QgX19yZWFkX21vc3RseSA9ICZmdHJhY2VfbGlzdF9lbmQ7CitzdGF0aWMgc3RydWN0IGZ0cmFjZV9vcHMgKmZ0cmFjZV9vcHNfbGlzdCBfX3JlYWRfbW9zdGx5ID0gJmZ0cmFjZV9saXN0X2VuZDsKIGZ0cmFjZV9mdW5jX3QgZnRyYWNlX3RyYWNlX2Z1bmN0aW9uIF9fcmVhZF9tb3N0bHkgPSBmdHJhY2Vfc3R1YjsKIGZ0cmFjZV9mdW5jX3QgX19mdHJhY2VfdHJhY2VfZnVuY3Rpb24gX19yZWFkX21vc3RseSA9IGZ0cmFjZV9zdHViOwogZnRyYWNlX2Z1bmNfdCBmdHJhY2VfcGlkX2Z1bmN0aW9uIF9fcmVhZF9tb3N0bHkgPSBmdHJhY2Vfc3R1YjsKK3N0YXRpYyBzdHJ1Y3QgZnRyYWNlX29wcyBnbG9iYWxfb3BzOworCitzdGF0aWMgdm9pZAorZnRyYWNlX29wc19saXN0X2Z1bmModW5zaWduZWQgbG9uZyBpcCwgdW5zaWduZWQgbG9uZyBwYXJlbnRfaXApOwogCiAvKgotICogVHJhdmVyc2UgdGhlIGZ0cmFjZV9saXN0LCBpbnZva2luZyBhbGwgZW50cmllcy4gIFRoZSByZWFzb24gdGhhdCB3ZQorICogVHJhdmVyc2UgdGhlIGZ0cmFjZV9nbG9iYWxfbGlzdCwgaW52b2tpbmcgYWxsIGVudHJpZXMuICBUaGUgcmVhc29uIHRoYXQgd2UKICAqIGNhbiB1c2UgcmN1X2RlcmVmZXJlbmNlX3JhdygpIGlzIHRoYXQgZWxlbWVudHMgcmVtb3ZlZCBmcm9tIHRoaXMgbGlzdAogICogYXJlIHNpbXBseSBsZWFrZWQsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gaW50ZXJhY3Qgd2l0aCBhIGdyYWNlLXBlcmlvZAogICogbWVjaGFuaXNtLiAgVGhlIHJjdV9kZXJlZmVyZW5jZV9yYXcoKSBjYWxscyBhcmUgbmVlZGVkIHRvIGhhbmRsZQotICogY29uY3VycmVudCBpbnNlcnRpb25zIGludG8gdGhlIGZ0cmFjZV9saXN0LgorICogY29uY3VycmVudCBpbnNlcnRpb25zIGludG8gdGhlIGZ0cmFjZV9nbG9iYWxfbGlzdC4KICAqCiAgKiBTaWxseSBBbHBoYSBhbmQgc2lsbHkgcG9pbnRlci1zcGVjdWxhdGlvbiBjb21waWxlciBvcHRpbWl6YXRpb25zIQogICovCi1zdGF0aWMgdm9pZCBmdHJhY2VfbGlzdF9mdW5jKHVuc2lnbmVkIGxvbmcgaXAsIHVuc2lnbmVkIGxvbmcgcGFyZW50X2lwKQorc3RhdGljIHZvaWQgZnRyYWNlX2dsb2JhbF9saXN0X2Z1bmModW5zaWduZWQgbG9uZyBpcCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBwYXJlbnRfaXApCiB7Ci0Jc3RydWN0IGZ0cmFjZV9vcHMgKm9wID0gcmN1X2RlcmVmZXJlbmNlX3JhdyhmdHJhY2VfbGlzdCk7IC8qc2VlIGFib3ZlKi8KKwlzdHJ1Y3QgZnRyYWNlX29wcyAqb3AgPSByY3VfZGVyZWZlcmVuY2VfcmF3KGZ0cmFjZV9nbG9iYWxfbGlzdCk7IC8qc2VlIGFib3ZlKi8KIAogCXdoaWxlIChvcCAhPSAmZnRyYWNlX2xpc3RfZW5kKSB7CiAJCW9wLT5mdW5jKGlwLCBwYXJlbnRfaXApOwpAQCAtMTQ3LDQ2ICsxNTksNjkgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IF9fcmVnaXN0ZXJfZnRyYWNlX2Z1bmN0aW9uKHN0cnVjdCBmdHJhY2Vfb3BzICpvcHMpCitzdGF0aWMgdm9pZCB1cGRhdGVfZ2xvYmFsX29wcyh2b2lkKQogewotCW9wcy0+bmV4dCA9IGZ0cmFjZV9saXN0OworCWZ0cmFjZV9mdW5jX3QgZnVuYzsKKwogCS8qCi0JICogV2UgYXJlIGVudGVyaW5nIG9wcyBpbnRvIHRoZSBmdHJhY2VfbGlzdCBidXQgYW5vdGhlcgotCSAqIENQVSBtaWdodCBiZSB3YWxraW5nIHRoYXQgbGlzdC4gV2UgbmVlZCB0byBtYWtlIHN1cmUKLQkgKiB0aGUgb3BzLT5uZXh0IHBvaW50ZXIgaXMgdmFsaWQgYmVmb3JlIGFub3RoZXIgQ1BVIHNlZXMKLQkgKiB0aGUgb3BzIHBvaW50ZXIgaW5jbHVkZWQgaW50byB0aGUgZnRyYWNlX2xpc3QuCisJICogSWYgdGhlcmUncyBvbmx5IG9uZSBmdW5jdGlvbiByZWdpc3RlcmVkLCB0aGVuIGNhbGwgdGhhdAorCSAqIGZ1bmN0aW9uIGRpcmVjdGx5LiBPdGhlcndpc2UsIHdlIG5lZWQgdG8gaXRlcmF0ZSBvdmVyIHRoZQorCSAqIHJlZ2lzdGVyZWQgY2FsbGVycy4KIAkgKi8KLQlyY3VfYXNzaWduX3BvaW50ZXIoZnRyYWNlX2xpc3QsIG9wcyk7CisJaWYgKGZ0cmFjZV9nbG9iYWxfbGlzdCA9PSAmZnRyYWNlX2xpc3RfZW5kIHx8CisJICAgIGZ0cmFjZV9nbG9iYWxfbGlzdC0+bmV4dCA9PSAmZnRyYWNlX2xpc3RfZW5kKQorCQlmdW5jID0gZnRyYWNlX2dsb2JhbF9saXN0LT5mdW5jOworCWVsc2UKKwkJZnVuYyA9IGZ0cmFjZV9nbG9iYWxfbGlzdF9mdW5jOwogCi0JaWYgKGZ0cmFjZV9lbmFibGVkKSB7Ci0JCWZ0cmFjZV9mdW5jX3QgZnVuYzsKLQotCQlpZiAob3BzLT5uZXh0ID09ICZmdHJhY2VfbGlzdF9lbmQpCi0JCQlmdW5jID0gb3BzLT5mdW5jOwotCQllbHNlCi0JCQlmdW5jID0gZnRyYWNlX2xpc3RfZnVuYzsKLQotCQlpZiAoIWxpc3RfZW1wdHkoJmZ0cmFjZV9waWRzKSkgewotCQkJc2V0X2Z0cmFjZV9waWRfZnVuY3Rpb24oZnVuYyk7Ci0JCQlmdW5jID0gZnRyYWNlX3BpZF9mdW5jOwotCQl9Ci0KLQkJLyoKLQkJICogRm9yIG9uZSBmdW5jLCBzaW1wbHkgY2FsbCBpdCBkaXJlY3RseS4KLQkJICogRm9yIG1vcmUgdGhhbiBvbmUgZnVuYywgY2FsbCB0aGUgY2hhaW4uCi0JCSAqLwotI2lmZGVmIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFX01DT1VOVF9URVNUCi0JCWZ0cmFjZV90cmFjZV9mdW5jdGlvbiA9IGZ1bmM7Ci0jZWxzZQotCQlfX2Z0cmFjZV90cmFjZV9mdW5jdGlvbiA9IGZ1bmM7Ci0JCWZ0cmFjZV90cmFjZV9mdW5jdGlvbiA9IGZ0cmFjZV90ZXN0X3N0b3BfZnVuYzsKLSNlbmRpZgorCS8qIElmIHdlIGZpbHRlciBvbiBwaWRzLCB1cGRhdGUgdG8gdXNlIHRoZSBwaWQgZnVuY3Rpb24gKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmZ0cmFjZV9waWRzKSkgeworCQlzZXRfZnRyYWNlX3BpZF9mdW5jdGlvbihmdW5jKTsKKwkJZnVuYyA9IGZ0cmFjZV9waWRfZnVuYzsKIAl9CiAKLQlyZXR1cm4gMDsKKwlnbG9iYWxfb3BzLmZ1bmMgPSBmdW5jOwogfQogCi1zdGF0aWMgaW50IF9fdW5yZWdpc3Rlcl9mdHJhY2VfZnVuY3Rpb24oc3RydWN0IGZ0cmFjZV9vcHMgKm9wcykKK3N0YXRpYyB2b2lkIHVwZGF0ZV9mdHJhY2VfZnVuY3Rpb24odm9pZCkKK3sKKwlmdHJhY2VfZnVuY190IGZ1bmM7CisKKwl1cGRhdGVfZ2xvYmFsX29wcygpOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCBhbmQgdGhpcyBvcHMgaXMKKwkgKiBub3QgZHluYW1pYywgdGhlbiBoYXZlIHRoZSBtY291bnQgdHJhbXBvbGluZSBjYWxsCisJICogdGhlIGZ1bmN0aW9uIGRpcmVjdGx5CisJICovCisJaWYgKGZ0cmFjZV9vcHNfbGlzdCA9PSAmZnRyYWNlX2xpc3RfZW5kIHx8CisJICAgIChmdHJhY2Vfb3BzX2xpc3QtPm5leHQgPT0gJmZ0cmFjZV9saXN0X2VuZCAmJgorCSAgICAgIShmdHJhY2Vfb3BzX2xpc3QtPmZsYWdzICYgRlRSQUNFX09QU19GTF9EWU5BTUlDKSkpCisJCWZ1bmMgPSBmdHJhY2Vfb3BzX2xpc3QtPmZ1bmM7CisJZWxzZQorCQlmdW5jID0gZnRyYWNlX29wc19saXN0X2Z1bmM7CisKKyNpZmRlZiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVAorCWZ0cmFjZV90cmFjZV9mdW5jdGlvbiA9IGZ1bmM7CisjZWxzZQorCV9fZnRyYWNlX3RyYWNlX2Z1bmN0aW9uID0gZnVuYzsKKwlmdHJhY2VfdHJhY2VfZnVuY3Rpb24gPSBmdHJhY2VfdGVzdF9zdG9wX2Z1bmM7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgYWRkX2Z0cmFjZV9vcHMoc3RydWN0IGZ0cmFjZV9vcHMgKipsaXN0LCBzdHJ1Y3QgZnRyYWNlX29wcyAqb3BzKQoreworCW9wcy0+bmV4dCA9ICpsaXN0OworCS8qCisJICogV2UgYXJlIGVudGVyaW5nIG9wcyBpbnRvIHRoZSBsaXN0IGJ1dCBhbm90aGVyCisJICogQ1BVIG1pZ2h0IGJlIHdhbGtpbmcgdGhhdCBsaXN0LiBXZSBuZWVkIHRvIG1ha2Ugc3VyZQorCSAqIHRoZSBvcHMtPm5leHQgcG9pbnRlciBpcyB2YWxpZCBiZWZvcmUgYW5vdGhlciBDUFUgc2VlcworCSAqIHRoZSBvcHMgcG9pbnRlciBpbmNsdWRlZCBpbnRvIHRoZSBsaXN0LgorCSAqLworCXJjdV9hc3NpZ25fcG9pbnRlcigqbGlzdCwgb3BzKTsKK30KKworc3RhdGljIGludCByZW1vdmVfZnRyYWNlX29wcyhzdHJ1Y3QgZnRyYWNlX29wcyAqKmxpc3QsIHN0cnVjdCBmdHJhY2Vfb3BzICpvcHMpCiB7CiAJc3RydWN0IGZ0cmFjZV9vcHMgKipwOwogCkBAIC0xOTQsMTMgKzIyOSwxMiBAQAogCSAqIElmIHdlIGFyZSByZW1vdmluZyB0aGUgbGFzdCBmdW5jdGlvbiwgdGhlbiBzaW1wbHkgcG9pbnQKIAkgKiB0byB0aGUgZnRyYWNlX3N0dWIuCiAJICovCi0JaWYgKGZ0cmFjZV9saXN0ID09IG9wcyAmJiBvcHMtPm5leHQgPT0gJmZ0cmFjZV9saXN0X2VuZCkgewotCQlmdHJhY2VfdHJhY2VfZnVuY3Rpb24gPSBmdHJhY2Vfc3R1YjsKLQkJZnRyYWNlX2xpc3QgPSAmZnRyYWNlX2xpc3RfZW5kOworCWlmICgqbGlzdCA9PSBvcHMgJiYgb3BzLT5uZXh0ID09ICZmdHJhY2VfbGlzdF9lbmQpIHsKKwkJKmxpc3QgPSAmZnRyYWNlX2xpc3RfZW5kOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlmb3IgKHAgPSAmZnRyYWNlX2xpc3Q7ICpwICE9ICZmdHJhY2VfbGlzdF9lbmQ7IHAgPSAmKCpwKS0+bmV4dCkKKwlmb3IgKHAgPSBsaXN0OyAqcCAhPSAmZnRyYWNlX2xpc3RfZW5kOyBwID0gJigqcCktPm5leHQpCiAJCWlmICgqcCA9PSBvcHMpCiAJCQlicmVhazsKIApAQCAtMjA4LDUzICsyNDIsODMgQEAKIAkJcmV0dXJuIC0xOwogCiAJKnAgPSAoKnApLT5uZXh0OworCXJldHVybiAwOworfQogCi0JaWYgKGZ0cmFjZV9lbmFibGVkKSB7Ci0JCS8qIElmIHdlIG9ubHkgaGF2ZSBvbmUgZnVuYyBsZWZ0LCB0aGVuIGNhbGwgdGhhdCBkaXJlY3RseSAqLwotCQlpZiAoZnRyYWNlX2xpc3QtPm5leHQgPT0gJmZ0cmFjZV9saXN0X2VuZCkgewotCQkJZnRyYWNlX2Z1bmNfdCBmdW5jID0gZnRyYWNlX2xpc3QtPmZ1bmM7CitzdGF0aWMgaW50IF9fcmVnaXN0ZXJfZnRyYWNlX2Z1bmN0aW9uKHN0cnVjdCBmdHJhY2Vfb3BzICpvcHMpCit7CisJaWYgKGZ0cmFjZV9kaXNhYmxlZCkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKLQkJCWlmICghbGlzdF9lbXB0eSgmZnRyYWNlX3BpZHMpKSB7Ci0JCQkJc2V0X2Z0cmFjZV9waWRfZnVuY3Rpb24oZnVuYyk7Ci0JCQkJZnVuYyA9IGZ0cmFjZV9waWRfZnVuYzsKLQkJCX0KLSNpZmRlZiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVAotCQkJZnRyYWNlX3RyYWNlX2Z1bmN0aW9uID0gZnVuYzsKLSNlbHNlCi0JCQlfX2Z0cmFjZV90cmFjZV9mdW5jdGlvbiA9IGZ1bmM7Ci0jZW5kaWYKLQkJfQotCX0KKwlpZiAoRlRSQUNFX1dBUk5fT04ob3BzID09ICZnbG9iYWxfb3BzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoV0FSTl9PTihvcHMtPmZsYWdzICYgRlRSQUNFX09QU19GTF9FTkFCTEVEKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICghY29yZV9rZXJuZWxfZGF0YSgodW5zaWduZWQgbG9uZylvcHMpKQorCQlvcHMtPmZsYWdzIHw9IEZUUkFDRV9PUFNfRkxfRFlOQU1JQzsKKworCWlmIChvcHMtPmZsYWdzICYgRlRSQUNFX09QU19GTF9HTE9CQUwpIHsKKwkJaW50IGZpcnN0ID0gZnRyYWNlX2dsb2JhbF9saXN0ID09ICZmdHJhY2VfbGlzdF9lbmQ7CisJCWFkZF9mdHJhY2Vfb3BzKCZmdHJhY2VfZ2xvYmFsX2xpc3QsIG9wcyk7CisJCW9wcy0+ZmxhZ3MgfD0gRlRSQUNFX09QU19GTF9FTkFCTEVEOworCQlpZiAoZmlyc3QpCisJCQlhZGRfZnRyYWNlX29wcygmZnRyYWNlX29wc19saXN0LCAmZ2xvYmFsX29wcyk7CisJfSBlbHNlCisJCWFkZF9mdHJhY2Vfb3BzKCZmdHJhY2Vfb3BzX2xpc3QsIG9wcyk7CisKKwlpZiAoZnRyYWNlX2VuYWJsZWQpCisJCXVwZGF0ZV9mdHJhY2VfZnVuY3Rpb24oKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fdW5yZWdpc3Rlcl9mdHJhY2VfZnVuY3Rpb24oc3RydWN0IGZ0cmFjZV9vcHMgKm9wcykKK3sKKwlpbnQgcmV0OworCisJaWYgKGZ0cmFjZV9kaXNhYmxlZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoV0FSTl9PTighKG9wcy0+ZmxhZ3MgJiBGVFJBQ0VfT1BTX0ZMX0VOQUJMRUQpKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChGVFJBQ0VfV0FSTl9PTihvcHMgPT0gJmdsb2JhbF9vcHMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChvcHMtPmZsYWdzICYgRlRSQUNFX09QU19GTF9HTE9CQUwpIHsKKwkJcmV0ID0gcmVtb3ZlX2Z0cmFjZV9vcHMoJmZ0cmFjZV9nbG9iYWxfbGlzdCwgb3BzKTsKKwkJaWYgKCFyZXQgJiYgZnRyYWNlX2dsb2JhbF9saXN0ID09ICZmdHJhY2VfbGlzdF9lbmQpCisJCQlyZXQgPSByZW1vdmVfZnRyYWNlX29wcygmZnRyYWNlX29wc19saXN0LCAmZ2xvYmFsX29wcyk7CisJCWlmICghcmV0KQorCQkJb3BzLT5mbGFncyAmPSB+RlRSQUNFX09QU19GTF9FTkFCTEVEOworCX0gZWxzZQorCQlyZXQgPSByZW1vdmVfZnRyYWNlX29wcygmZnRyYWNlX29wc19saXN0LCBvcHMpOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoZnRyYWNlX2VuYWJsZWQpCisJCXVwZGF0ZV9mdHJhY2VfZnVuY3Rpb24oKTsKKworCS8qCisJICogRHluYW1pYyBvcHMgbWF5IGJlIGZyZWVkLCB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IGFsbAorCSAqIGNhbGxlcnMgYXJlIGRvbmUgYmVmb3JlIGxlYXZpbmcgdGhpcyBmdW5jdGlvbi4KKwkgKi8KKwlpZiAob3BzLT5mbGFncyAmIEZUUkFDRV9PUFNfRkxfRFlOQU1JQykKKwkJc3luY2hyb25pemVfc2NoZWQoKTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBmdHJhY2VfdXBkYXRlX3BpZF9mdW5jKHZvaWQpCiB7Ci0JZnRyYWNlX2Z1bmNfdCBmdW5jOwotCisJLyogT25seSBkbyBzb21ldGhpbmcgaWYgd2UgYXJlIHRyYWNpbmcgc29tZXRoaW5nICovCiAJaWYgKGZ0cmFjZV90cmFjZV9mdW5jdGlvbiA9PSBmdHJhY2Vfc3R1YikKIAkJcmV0dXJuOwogCi0jaWZkZWYgQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1QKLQlmdW5jID0gZnRyYWNlX3RyYWNlX2Z1bmN0aW9uOwotI2Vsc2UKLQlmdW5jID0gX19mdHJhY2VfdHJhY2VfZnVuY3Rpb247Ci0jZW5kaWYKLQotCWlmICghbGlzdF9lbXB0eSgmZnRyYWNlX3BpZHMpKSB7Ci0JCXNldF9mdHJhY2VfcGlkX2Z1bmN0aW9uKGZ1bmMpOwotCQlmdW5jID0gZnRyYWNlX3BpZF9mdW5jOwotCX0gZWxzZSB7Ci0JCWlmIChmdW5jID09IGZ0cmFjZV9waWRfZnVuYykKLQkJCWZ1bmMgPSBmdHJhY2VfcGlkX2Z1bmN0aW9uOwotCX0KLQotI2lmZGVmIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFX01DT1VOVF9URVNUCi0JZnRyYWNlX3RyYWNlX2Z1bmN0aW9uID0gZnVuYzsKLSNlbHNlCi0JX19mdHJhY2VfdHJhY2VfZnVuY3Rpb24gPSBmdW5jOwotI2VuZGlmCisJdXBkYXRlX2Z0cmFjZV9mdW5jdGlvbigpOwogfQogCiAjaWZkZWYgQ09ORklHX0ZVTkNUSU9OX1BST0ZJTEVSCkBAIC04ODgsOCArOTUyLDM1IEBACiAJRlRSQUNFX1NUQVJUX0ZVTkNfUkVUCQk9ICgxIDw8IDMpLAogCUZUUkFDRV9TVE9QX0ZVTkNfUkVUCQk9ICgxIDw8IDQpLAogfTsKK3N0cnVjdCBmdHJhY2VfZnVuY19lbnRyeSB7CisJc3RydWN0IGhsaXN0X25vZGUgaGxpc3Q7CisJdW5zaWduZWQgbG9uZyBpcDsKK307CiAKLXN0YXRpYyBpbnQgZnRyYWNlX2ZpbHRlcmVkOworc3RydWN0IGZ0cmFjZV9oYXNoIHsKKwl1bnNpZ25lZCBsb25nCQlzaXplX2JpdHM7CisJc3RydWN0IGhsaXN0X2hlYWQJKmJ1Y2tldHM7CisJdW5zaWduZWQgbG9uZwkJY291bnQ7CisJc3RydWN0IHJjdV9oZWFkCQlyY3U7Cit9OworCisvKgorICogV2UgbWFrZSB0aGVzZSBjb25zdGFudCBiZWNhdXNlIG5vIG9uZSBzaG91bGQgdG91Y2ggdGhlbSwKKyAqIGJ1dCB0aGV5IGFyZSB1c2VkIGFzIHRoZSBkZWZhdWx0ICJlbXB0eSBoYXNoIiwgdG8gYXZvaWQgYWxsb2NhdGluZworICogaXQgYWxsIHRoZSB0aW1lLiBUaGVzZSBhcmUgaW4gYSByZWFkIG9ubHkgc2VjdGlvbiBzdWNoIHRoYXQgaWYKKyAqIGFueW9uZSBkb2VzIHRyeSB0byBtb2RpZnkgaXQsIGl0IHdpbGwgY2F1c2UgYW4gZXhjZXB0aW9uLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhsaXN0X2hlYWQgZW1wdHlfYnVja2V0c1sxXTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZnRyYWNlX2hhc2ggZW1wdHlfaGFzaCA9IHsKKwkuYnVja2V0cyA9IChzdHJ1Y3QgaGxpc3RfaGVhZCAqKWVtcHR5X2J1Y2tldHMsCit9OworI2RlZmluZSBFTVBUWV9IQVNICSgoc3RydWN0IGZ0cmFjZV9oYXNoICopJmVtcHR5X2hhc2gpCisKK3N0YXRpYyBzdHJ1Y3QgZnRyYWNlX29wcyBnbG9iYWxfb3BzID0geworCS5mdW5jCQkJPSBmdHJhY2Vfc3R1YiwKKwkubm90cmFjZV9oYXNoCQk9IEVNUFRZX0hBU0gsCisJLmZpbHRlcl9oYXNoCQk9IEVNUFRZX0hBU0gsCit9OwogCiBzdGF0aWMgc3RydWN0IGR5bl9mdHJhY2UgKmZ0cmFjZV9uZXdfYWRkcnM7CiAKQEAgLTkxMiw2ICsxMDAzLDI2OSBAQAogCiBzdGF0aWMgc3RydWN0IGR5bl9mdHJhY2UgKmZ0cmFjZV9mcmVlX3JlY29yZHM7CiAKK3N0YXRpYyBzdHJ1Y3QgZnRyYWNlX2Z1bmNfZW50cnkgKgorZnRyYWNlX2xvb2t1cF9pcChzdHJ1Y3QgZnRyYWNlX2hhc2ggKmhhc2gsIHVuc2lnbmVkIGxvbmcgaXApCit7CisJdW5zaWduZWQgbG9uZyBrZXk7CisJc3RydWN0IGZ0cmFjZV9mdW5jX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGhkOworCXN0cnVjdCBobGlzdF9ub2RlICpuOworCisJaWYgKCFoYXNoLT5jb3VudCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoaGFzaC0+c2l6ZV9iaXRzID4gMCkKKwkJa2V5ID0gaGFzaF9sb25nKGlwLCBoYXNoLT5zaXplX2JpdHMpOworCWVsc2UKKwkJa2V5ID0gMDsKKworCWhoZCA9ICZoYXNoLT5idWNrZXRzW2tleV07CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZW50cnksIG4sIGhoZCwgaGxpc3QpIHsKKwkJaWYgKGVudHJ5LT5pcCA9PSBpcCkKKwkJCXJldHVybiBlbnRyeTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIF9fYWRkX2hhc2hfZW50cnkoc3RydWN0IGZ0cmFjZV9oYXNoICpoYXNoLAorCQkJICAgICBzdHJ1Y3QgZnRyYWNlX2Z1bmNfZW50cnkgKmVudHJ5KQoreworCXN0cnVjdCBobGlzdF9oZWFkICpoaGQ7CisJdW5zaWduZWQgbG9uZyBrZXk7CisKKwlpZiAoaGFzaC0+c2l6ZV9iaXRzKQorCQlrZXkgPSBoYXNoX2xvbmcoZW50cnktPmlwLCBoYXNoLT5zaXplX2JpdHMpOworCWVsc2UKKwkJa2V5ID0gMDsKKworCWhoZCA9ICZoYXNoLT5idWNrZXRzW2tleV07CisJaGxpc3RfYWRkX2hlYWQoJmVudHJ5LT5obGlzdCwgaGhkKTsKKwloYXNoLT5jb3VudCsrOworfQorCitzdGF0aWMgaW50IGFkZF9oYXNoX2VudHJ5KHN0cnVjdCBmdHJhY2VfaGFzaCAqaGFzaCwgdW5zaWduZWQgbG9uZyBpcCkKK3sKKwlzdHJ1Y3QgZnRyYWNlX2Z1bmNfZW50cnkgKmVudHJ5OworCisJZW50cnkgPSBrbWFsbG9jKHNpemVvZigqZW50cnkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVudHJ5KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVudHJ5LT5pcCA9IGlwOworCV9fYWRkX2hhc2hfZW50cnkoaGFzaCwgZW50cnkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX2hhc2hfZW50cnkoc3RydWN0IGZ0cmFjZV9oYXNoICpoYXNoLAorCQkgIHN0cnVjdCBmdHJhY2VfZnVuY19lbnRyeSAqZW50cnkpCit7CisJaGxpc3RfZGVsKCZlbnRyeS0+aGxpc3QpOworCWtmcmVlKGVudHJ5KTsKKwloYXNoLT5jb3VudC0tOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX2hhc2hfZW50cnkoc3RydWN0IGZ0cmFjZV9oYXNoICpoYXNoLAorCQkgIHN0cnVjdCBmdHJhY2VfZnVuY19lbnRyeSAqZW50cnkpCit7CisJaGxpc3RfZGVsKCZlbnRyeS0+aGxpc3QpOworCWhhc2gtPmNvdW50LS07Cit9CisKK3N0YXRpYyB2b2lkIGZ0cmFjZV9oYXNoX2NsZWFyKHN0cnVjdCBmdHJhY2VfaGFzaCAqaGFzaCkKK3sKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGhkOworCXN0cnVjdCBobGlzdF9ub2RlICp0cCwgKnRuOworCXN0cnVjdCBmdHJhY2VfZnVuY19lbnRyeSAqZW50cnk7CisJaW50IHNpemUgPSAxIDw8IGhhc2gtPnNpemVfYml0czsKKwlpbnQgaTsKKworCWlmICghaGFzaC0+Y291bnQpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJaGhkID0gJmhhc2gtPmJ1Y2tldHNbaV07CisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIHRwLCB0biwgaGhkLCBobGlzdCkKKwkJCWZyZWVfaGFzaF9lbnRyeShoYXNoLCBlbnRyeSk7CisJfQorCUZUUkFDRV9XQVJOX09OKGhhc2gtPmNvdW50KTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9mdHJhY2VfaGFzaChzdHJ1Y3QgZnRyYWNlX2hhc2ggKmhhc2gpCit7CisJaWYgKCFoYXNoIHx8IGhhc2ggPT0gRU1QVFlfSEFTSCkKKwkJcmV0dXJuOworCWZ0cmFjZV9oYXNoX2NsZWFyKGhhc2gpOworCWtmcmVlKGhhc2gtPmJ1Y2tldHMpOworCWtmcmVlKGhhc2gpOworfQorCitzdGF0aWMgdm9pZCBfX2ZyZWVfZnRyYWNlX2hhc2hfcmN1KHN0cnVjdCByY3VfaGVhZCAqcmN1KQoreworCXN0cnVjdCBmdHJhY2VfaGFzaCAqaGFzaDsKKworCWhhc2ggPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3QgZnRyYWNlX2hhc2gsIHJjdSk7CisJZnJlZV9mdHJhY2VfaGFzaChoYXNoKTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9mdHJhY2VfaGFzaF9yY3Uoc3RydWN0IGZ0cmFjZV9oYXNoICpoYXNoKQoreworCWlmICghaGFzaCB8fCBoYXNoID09IEVNUFRZX0hBU0gpCisJCXJldHVybjsKKwljYWxsX3JjdV9zY2hlZCgmaGFzaC0+cmN1LCBfX2ZyZWVfZnRyYWNlX2hhc2hfcmN1KTsKK30KKworc3RhdGljIHN0cnVjdCBmdHJhY2VfaGFzaCAqYWxsb2NfZnRyYWNlX2hhc2goaW50IHNpemVfYml0cykKK3sKKwlzdHJ1Y3QgZnRyYWNlX2hhc2ggKmhhc2g7CisJaW50IHNpemU7CisKKwloYXNoID0ga3phbGxvYyhzaXplb2YoKmhhc2gpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhhc2gpCisJCXJldHVybiBOVUxMOworCisJc2l6ZSA9IDEgPDwgc2l6ZV9iaXRzOworCWhhc2gtPmJ1Y2tldHMgPSBremFsbG9jKHNpemVvZigqaGFzaC0+YnVja2V0cykgKiBzaXplLCBHRlBfS0VSTkVMKTsKKworCWlmICghaGFzaC0+YnVja2V0cykgeworCQlrZnJlZShoYXNoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaGFzaC0+c2l6ZV9iaXRzID0gc2l6ZV9iaXRzOworCisJcmV0dXJuIGhhc2g7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnRyYWNlX2hhc2ggKgorYWxsb2NfYW5kX2NvcHlfZnRyYWNlX2hhc2goaW50IHNpemVfYml0cywgc3RydWN0IGZ0cmFjZV9oYXNoICpoYXNoKQoreworCXN0cnVjdCBmdHJhY2VfZnVuY19lbnRyeSAqZW50cnk7CisJc3RydWN0IGZ0cmFjZV9oYXNoICpuZXdfaGFzaDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqdHA7CisJaW50IHNpemU7CisJaW50IHJldDsKKwlpbnQgaTsKKworCW5ld19oYXNoID0gYWxsb2NfZnRyYWNlX2hhc2goc2l6ZV9iaXRzKTsKKwlpZiAoIW5ld19oYXNoKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIEVtcHR5IGhhc2g/ICovCisJaWYgKCFoYXNoIHx8ICFoYXNoLT5jb3VudCkKKwkJcmV0dXJuIG5ld19oYXNoOworCisJc2l6ZSA9IDEgPDwgaGFzaC0+c2l6ZV9iaXRzOworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksIHRwLCAmaGFzaC0+YnVja2V0c1tpXSwgaGxpc3QpIHsKKwkJCXJldCA9IGFkZF9oYXNoX2VudHJ5KG5ld19oYXNoLCBlbnRyeS0+aXApOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBmcmVlX2hhc2g7CisJCX0KKwl9CisKKwlGVFJBQ0VfV0FSTl9PTihuZXdfaGFzaC0+Y291bnQgIT0gaGFzaC0+Y291bnQpOworCisJcmV0dXJuIG5ld19oYXNoOworCisgZnJlZV9oYXNoOgorCWZyZWVfZnRyYWNlX2hhc2gobmV3X2hhc2gpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50CitmdHJhY2VfaGFzaF9tb3ZlKHN0cnVjdCBmdHJhY2VfaGFzaCAqKmRzdCwgc3RydWN0IGZ0cmFjZV9oYXNoICpzcmMpCit7CisJc3RydWN0IGZ0cmFjZV9mdW5jX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqdHAsICp0bjsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGhkOworCXN0cnVjdCBmdHJhY2VfaGFzaCAqb2xkX2hhc2g7CisJc3RydWN0IGZ0cmFjZV9oYXNoICpuZXdfaGFzaDsKKwl1bnNpZ25lZCBsb25nIGtleTsKKwlpbnQgc2l6ZSA9IHNyYy0+Y291bnQ7CisJaW50IGJpdHMgPSAwOworCWludCBpOworCisJLyoKKwkgKiBJZiB0aGUgbmV3IHNvdXJjZSBpcyBlbXB0eSwganVzdCBmcmVlIGRzdCBhbmQgYXNzaWduIGl0CisJICogdGhlIGVtcHR5X2hhc2guCisJICovCisJaWYgKCFzcmMtPmNvdW50KSB7CisJCWZyZWVfZnRyYWNlX2hhc2hfcmN1KCpkc3QpOworCQlyY3VfYXNzaWduX3BvaW50ZXIoKmRzdCwgRU1QVFlfSEFTSCk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogTWFrZSB0aGUgaGFzaCBzaXplIGFib3V0IDEvMiB0aGUgIyBmb3VuZAorCSAqLworCWZvciAoc2l6ZSAvPSAyOyBzaXplOyBzaXplID4+PSAxKQorCQliaXRzKys7CisKKwkvKiBEb24ndCBhbGxvY2F0ZSB0b28gbXVjaCAqLworCWlmIChiaXRzID4gRlRSQUNFX0hBU0hfTUFYX0JJVFMpCisJCWJpdHMgPSBGVFJBQ0VfSEFTSF9NQVhfQklUUzsKKworCW5ld19oYXNoID0gYWxsb2NfZnRyYWNlX2hhc2goYml0cyk7CisJaWYgKCFuZXdfaGFzaCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzaXplID0gMSA8PCBzcmMtPnNpemVfYml0czsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWhoZCA9ICZzcmMtPmJ1Y2tldHNbaV07CisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIHRwLCB0biwgaGhkLCBobGlzdCkgeworCQkJaWYgKGJpdHMgPiAwKQorCQkJCWtleSA9IGhhc2hfbG9uZyhlbnRyeS0+aXAsIGJpdHMpOworCQkJZWxzZQorCQkJCWtleSA9IDA7CisJCQlyZW1vdmVfaGFzaF9lbnRyeShzcmMsIGVudHJ5KTsKKwkJCV9fYWRkX2hhc2hfZW50cnkobmV3X2hhc2gsIGVudHJ5KTsKKwkJfQorCX0KKworCW9sZF9oYXNoID0gKmRzdDsKKwlyY3VfYXNzaWduX3BvaW50ZXIoKmRzdCwgbmV3X2hhc2gpOworCWZyZWVfZnRyYWNlX2hhc2hfcmN1KG9sZF9oYXNoKTsKKworCXJldHVybiAwOworfQorCisvKgorICogVGVzdCB0aGUgaGFzaGVzIGZvciB0aGlzIG9wcyB0byBzZWUgaWYgd2Ugd2FudCB0byBjYWxsCisgKiB0aGUgb3BzLT5mdW5jIG9yIG5vdC4KKyAqCisgKiBJdCdzIGEgbWF0Y2ggaWYgdGhlIGlwIGlzIGluIHRoZSBvcHMtPmZpbHRlcl9oYXNoIG9yCisgKiB0aGUgZmlsdGVyX2hhc2ggZG9lcyBub3QgZXhpc3Qgb3IgaXMgZW1wdHksCisgKiAgQU5ECisgKiB0aGUgaXAgaXMgbm90IGluIHRoZSBvcHMtPm5vdHJhY2VfaGFzaC4KKyAqCisgKiBUaGlzIG5lZWRzIHRvIGJlIGNhbGxlZCB3aXRoIHByZWVtcHRpb24gZGlzYWJsZWQgYXMKKyAqIHRoZSBoYXNoZXMgYXJlIGZyZWVkIHdpdGggY2FsbF9yY3Vfc2NoZWQoKS4KKyAqLworc3RhdGljIGludAorZnRyYWNlX29wc190ZXN0KHN0cnVjdCBmdHJhY2Vfb3BzICpvcHMsIHVuc2lnbmVkIGxvbmcgaXApCit7CisJc3RydWN0IGZ0cmFjZV9oYXNoICpmaWx0ZXJfaGFzaDsKKwlzdHJ1Y3QgZnRyYWNlX2hhc2ggKm5vdHJhY2VfaGFzaDsKKwlpbnQgcmV0OworCisJZmlsdGVyX2hhc2ggPSByY3VfZGVyZWZlcmVuY2VfcmF3KG9wcy0+ZmlsdGVyX2hhc2gpOworCW5vdHJhY2VfaGFzaCA9IHJjdV9kZXJlZmVyZW5jZV9yYXcob3BzLT5ub3RyYWNlX2hhc2gpOworCisJaWYgKCghZmlsdGVyX2hhc2ggfHwgIWZpbHRlcl9oYXNoLT5jb3VudCB8fAorCSAgICAgZnRyYWNlX2xvb2t1cF9pcChmaWx0ZXJfaGFzaCwgaXApKSAmJgorCSAgICAoIW5vdHJhY2VfaGFzaCB8fCAhbm90cmFjZV9oYXNoLT5jb3VudCB8fAorCSAgICAgIWZ0cmFjZV9sb29rdXBfaXAobm90cmFjZV9oYXNoLCBpcCkpKQorCQlyZXQgPSAxOworCWVsc2UKKwkJcmV0ID0gMDsKKworCXJldHVybiByZXQ7Cit9CisKIC8qCiAgKiBUaGlzIGlzIGEgZG91YmxlIGZvci4gRG8gbm90IHVzZSAnYnJlYWsnIHRvIGJyZWFrIG91dCBvZiB0aGUgbG9vcCwKICAqIHlvdSBtdXN0IHVzZSBhIGdvdG8uCkBAIC05MjYsNiArMTI4MCwxMDUgQEAKIAkJfQkJCQlcCiAJfQogCitzdGF0aWMgdm9pZCBfX2Z0cmFjZV9oYXNoX3JlY191cGRhdGUoc3RydWN0IGZ0cmFjZV9vcHMgKm9wcywKKwkJCQkgICAgIGludCBmaWx0ZXJfaGFzaCwKKwkJCQkgICAgIGJvb2wgaW5jKQoreworCXN0cnVjdCBmdHJhY2VfaGFzaCAqaGFzaDsKKwlzdHJ1Y3QgZnRyYWNlX2hhc2ggKm90aGVyX2hhc2g7CisJc3RydWN0IGZ0cmFjZV9wYWdlICpwZzsKKwlzdHJ1Y3QgZHluX2Z0cmFjZSAqcmVjOworCWludCBjb3VudCA9IDA7CisJaW50IGFsbCA9IDA7CisKKwkvKiBPbmx5IHVwZGF0ZSBpZiB0aGUgb3BzIGhhcyBiZWVuIHJlZ2lzdGVyZWQgKi8KKwlpZiAoIShvcHMtPmZsYWdzICYgRlRSQUNFX09QU19GTF9FTkFCTEVEKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJbiB0aGUgZmlsdGVyX2hhc2ggY2FzZToKKwkgKiAgIElmIHRoZSBjb3VudCBpcyB6ZXJvLCB3ZSB1cGRhdGUgYWxsIHJlY29yZHMuCisJICogICBPdGhlcndpc2Ugd2UganVzdCB1cGRhdGUgdGhlIGl0ZW1zIGluIHRoZSBoYXNoLgorCSAqCisJICogSW4gdGhlIG5vdHJhY2VfaGFzaCBjYXNlOgorCSAqICAgV2UgZW5hYmxlIHRoZSB1cGRhdGUgaW4gdGhlIGhhc2guCisJICogICBBcyBkaXNhYmxpbmcgbm90cmFjZSBtZWFucyBlbmFibGluZyB0aGUgdHJhY2luZywKKwkgKiAgIGFuZCBlbmFibGluZyBub3RyYWNlIG1lYW5zIGRpc2FibGluZywgdGhlIGluYyB2YXJpYWJsZQorCSAqICAgZ2V0cyBpbnZlcnNlZC4KKwkgKi8KKwlpZiAoZmlsdGVyX2hhc2gpIHsKKwkJaGFzaCA9IG9wcy0+ZmlsdGVyX2hhc2g7CisJCW90aGVyX2hhc2ggPSBvcHMtPm5vdHJhY2VfaGFzaDsKKwkJaWYgKCFoYXNoIHx8ICFoYXNoLT5jb3VudCkKKwkJCWFsbCA9IDE7CisJfSBlbHNlIHsKKwkJaW5jID0gIWluYzsKKwkJaGFzaCA9IG9wcy0+bm90cmFjZV9oYXNoOworCQlvdGhlcl9oYXNoID0gb3BzLT5maWx0ZXJfaGFzaDsKKwkJLyoKKwkJICogSWYgdGhlIG5vdHJhY2UgaGFzaCBoYXMgbm8gaXRlbXMsCisJCSAqIHRoZW4gdGhlcmUncyBub3RoaW5nIHRvIGRvLgorCQkgKi8KKwkJaWYgKGhhc2ggJiYgIWhhc2gtPmNvdW50KQorCQkJcmV0dXJuOworCX0KKworCWRvX2Zvcl9lYWNoX2Z0cmFjZV9yZWMocGcsIHJlYykgeworCQlpbnQgaW5fb3RoZXJfaGFzaCA9IDA7CisJCWludCBpbl9oYXNoID0gMDsKKwkJaW50IG1hdGNoID0gMDsKKworCQlpZiAoYWxsKSB7CisJCQkvKgorCQkJICogT25seSB0aGUgZmlsdGVyX2hhc2ggYWZmZWN0cyBhbGwgcmVjb3Jkcy4KKwkJCSAqIFVwZGF0ZSBpZiB0aGUgcmVjb3JkIGlzIG5vdCBpbiB0aGUgbm90cmFjZSBoYXNoLgorCQkJICovCisJCQlpZiAoIW90aGVyX2hhc2ggfHwgIWZ0cmFjZV9sb29rdXBfaXAob3RoZXJfaGFzaCwgcmVjLT5pcCkpCisJCQkJbWF0Y2ggPSAxOworCQl9IGVsc2UgeworCQkJaW5faGFzaCA9IGhhc2ggJiYgISFmdHJhY2VfbG9va3VwX2lwKGhhc2gsIHJlYy0+aXApOworCQkJaW5fb3RoZXJfaGFzaCA9IG90aGVyX2hhc2ggJiYgISFmdHJhY2VfbG9va3VwX2lwKG90aGVyX2hhc2gsIHJlYy0+aXApOworCisJCQkvKgorCQkJICoKKwkJCSAqLworCQkJaWYgKGZpbHRlcl9oYXNoICYmIGluX2hhc2ggJiYgIWluX290aGVyX2hhc2gpCisJCQkJbWF0Y2ggPSAxOworCQkJZWxzZSBpZiAoIWZpbHRlcl9oYXNoICYmIGluX2hhc2ggJiYKKwkJCQkgKGluX290aGVyX2hhc2ggfHwgIW90aGVyX2hhc2gtPmNvdW50KSkKKwkJCQltYXRjaCA9IDE7CisJCX0KKwkJaWYgKCFtYXRjaCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChpbmMpIHsKKwkJCXJlYy0+ZmxhZ3MrKzsKKwkJCWlmIChGVFJBQ0VfV0FSTl9PTigocmVjLT5mbGFncyAmIH5GVFJBQ0VfRkxfTUFTSykgPT0gRlRSQUNFX1JFRl9NQVgpKQorCQkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCWlmIChGVFJBQ0VfV0FSTl9PTigocmVjLT5mbGFncyAmIH5GVFJBQ0VfRkxfTUFTSykgPT0gMCkpCisJCQkJcmV0dXJuOworCQkJcmVjLT5mbGFncy0tOworCQl9CisJCWNvdW50Kys7CisJCS8qIFNob3J0Y3V0LCBpZiB3ZSBoYW5kbGVkIGFsbCByZWNvcmRzLCB3ZSBhcmUgZG9uZS4gKi8KKwkJaWYgKCFhbGwgJiYgY291bnQgPT0gaGFzaC0+Y291bnQpCisJCQlyZXR1cm47CisJfSB3aGlsZV9mb3JfZWFjaF9mdHJhY2VfcmVjKCk7Cit9CisKK3N0YXRpYyB2b2lkIGZ0cmFjZV9oYXNoX3JlY19kaXNhYmxlKHN0cnVjdCBmdHJhY2Vfb3BzICpvcHMsCisJCQkJICAgIGludCBmaWx0ZXJfaGFzaCkKK3sKKwlfX2Z0cmFjZV9oYXNoX3JlY191cGRhdGUob3BzLCBmaWx0ZXJfaGFzaCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGZ0cmFjZV9oYXNoX3JlY19lbmFibGUoc3RydWN0IGZ0cmFjZV9vcHMgKm9wcywKKwkJCQkgICBpbnQgZmlsdGVyX2hhc2gpCit7CisJX19mdHJhY2VfaGFzaF9yZWNfdXBkYXRlKG9wcywgZmlsdGVyX2hhc2gsIDEpOworfQorCiBzdGF0aWMgdm9pZCBmdHJhY2VfZnJlZV9yZWMoc3RydWN0IGR5bl9mdHJhY2UgKnJlYykKIHsKIAlyZWMtPmZyZWVsaXN0ID0gZnRyYWNlX2ZyZWVfcmVjb3JkczsKQEAgLTEwNDcsMTggKzE1MDAsMTggQEAKIAlmdHJhY2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKUZUUkFDRV9BRERSOwogCiAJLyoKLQkgKiBJZiB0aGlzIHJlY29yZCBpcyBub3QgdG8gYmUgdHJhY2VkIG9yIHdlIHdhbnQgdG8gZGlzYWJsZSBpdCwKLQkgKiB0aGVuIGRpc2FibGUgaXQuCisJICogSWYgd2UgYXJlIGVuYWJsaW5nIHRyYWNpbmc6CiAJICoKLQkgKiBJZiB3ZSB3YW50IHRvIGVuYWJsZSBpdCBhbmQgZmlsdGVyaW5nIGlzIG9mZiwgdGhlbiBlbmFibGUgaXQuCisJICogICBJZiB0aGUgcmVjb3JkIGhhcyBhIHJlZiBjb3VudCwgdGhlbiB3ZSBuZWVkIHRvIGVuYWJsZSBpdAorCSAqICAgYmVjYXVzZSBzb21lb25lIGlzIHVzaW5nIGl0LgogCSAqCi0JICogSWYgd2Ugd2FudCB0byBlbmFibGUgaXQgYW5kIGZpbHRlcmluZyBpcyBvbiwgZW5hYmxlIGl0IG9ubHkgaWYKLQkgKiBpdCdzIGZpbHRlcmVkCisJICogICBPdGhlcndpc2Ugd2UgbWFrZSBzdXJlIGl0cyBkaXNhYmxlZC4KKwkgKgorCSAqIElmIHdlIGFyZSBkaXNhYmxpbmcgdHJhY2luZywgdGhlbiBkaXNhYmxlIGFsbCByZWNvcmRzIHRoYXQKKwkgKiBhcmUgZW5hYmxlZC4KIAkgKi8KLQlpZiAoZW5hYmxlICYmICEocmVjLT5mbGFncyAmIEZUUkFDRV9GTF9OT1RSQUNFKSkgewotCQlpZiAoIWZ0cmFjZV9maWx0ZXJlZCB8fCAocmVjLT5mbGFncyAmIEZUUkFDRV9GTF9GSUxURVIpKQotCQkJZmxhZyA9IEZUUkFDRV9GTF9FTkFCTEVEOwotCX0KKwlpZiAoZW5hYmxlICYmIChyZWMtPmZsYWdzICYgfkZUUkFDRV9GTF9NQVNLKSkKKwkJZmxhZyA9IEZUUkFDRV9GTF9FTkFCTEVEOwogCiAJLyogSWYgdGhlIHN0YXRlIG9mIHRoaXMgcmVjb3JkIGhhc24ndCBjaGFuZ2VkLCB0aGVuIGRvIG5vdGhpbmcgKi8KIAlpZiAoKHJlYy0+ZmxhZ3MgJiBGVFJBQ0VfRkxfRU5BQkxFRCkgPT0gZmxhZykKQEAgLTEwNzksMTkgKzE1MzIsMTYgQEAKIAlzdHJ1Y3QgZnRyYWNlX3BhZ2UgKnBnOwogCWludCBmYWlsZWQ7CiAKKwlpZiAodW5saWtlbHkoZnRyYWNlX2Rpc2FibGVkKSkKKwkJcmV0dXJuOworCiAJZG9fZm9yX2VhY2hfZnRyYWNlX3JlYyhwZywgcmVjKSB7Ci0JCS8qCi0JCSAqIFNraXAgb3ZlciBmcmVlIHJlY29yZHMsIHJlY29yZHMgdGhhdCBoYXZlCi0JCSAqIGZhaWxlZCBhbmQgbm90IGNvbnZlcnRlZC4KLQkJICovCi0JCWlmIChyZWMtPmZsYWdzICYgRlRSQUNFX0ZMX0ZSRUUgfHwKLQkJICAgIHJlYy0+ZmxhZ3MgJiBGVFJBQ0VfRkxfRkFJTEVEIHx8Ci0JCSAgICAhKHJlYy0+ZmxhZ3MgJiBGVFJBQ0VfRkxfQ09OVkVSVEVEKSkKKwkJLyogU2tpcCBvdmVyIGZyZWUgcmVjb3JkcyAqLworCQlpZiAocmVjLT5mbGFncyAmIEZUUkFDRV9GTF9GUkVFKQogCQkJY29udGludWU7CiAKIAkJZmFpbGVkID0gX19mdHJhY2VfcmVwbGFjZV9jb2RlKHJlYywgZW5hYmxlKTsKIAkJaWYgKGZhaWxlZCkgewotCQkJcmVjLT5mbGFncyB8PSBGVFJBQ0VfRkxfRkFJTEVEOwogCQkJZnRyYWNlX2J1ZyhmYWlsZWQsIHJlYy0+aXApOwogCQkJLyogU3RvcCBwcm9jZXNzaW5nICovCiAJCQlyZXR1cm47CkBAIC0xMTA3LDEwICsxNTU3LDEyIEBACiAKIAlpcCA9IHJlYy0+aXA7CiAKKwlpZiAodW5saWtlbHkoZnRyYWNlX2Rpc2FibGVkKSkKKwkJcmV0dXJuIDA7CisKIAlyZXQgPSBmdHJhY2VfbWFrZV9ub3AobW9kLCByZWMsIE1DT1VOVF9BRERSKTsKIAlpZiAocmV0KSB7CiAJCWZ0cmFjZV9idWcocmV0LCBpcCk7Ci0JCXJlYy0+ZmxhZ3MgfD0gRlRSQUNFX0ZMX0ZBSUxFRDsKIAkJcmV0dXJuIDA7CiAJfQogCXJldHVybiAxOwpAQCAtMTE3MSw2ICsxNjIzLDcgQEAKIAogc3RhdGljIGZ0cmFjZV9mdW5jX3Qgc2F2ZWRfZnRyYWNlX2Z1bmM7CiBzdGF0aWMgaW50IGZ0cmFjZV9zdGFydF91cDsKK3N0YXRpYyBpbnQgZ2xvYmFsX3N0YXJ0X3VwOwogCiBzdGF0aWMgdm9pZCBmdHJhY2Vfc3RhcnR1cF9lbmFibGUoaW50IGNvbW1hbmQpCiB7CkBAIC0xMTg1LDE5ICsxNjM4LDM2IEBACiAJZnRyYWNlX3J1bl91cGRhdGVfY29kZShjb21tYW5kKTsKIH0KIAotc3RhdGljIHZvaWQgZnRyYWNlX3N0YXJ0dXAoaW50IGNvbW1hbmQpCitzdGF0aWMgdm9pZCBmdHJhY2Vfc3RhcnR1cChzdHJ1Y3QgZnRyYWNlX29wcyAqb3BzLCBpbnQgY29tbWFuZCkKIHsKKwlib29sIGhhc2hfZW5hYmxlID0gdHJ1ZTsKKwogCWlmICh1bmxpa2VseShmdHJhY2VfZGlzYWJsZWQpKQogCQlyZXR1cm47CiAKIAlmdHJhY2Vfc3RhcnRfdXArKzsKIAljb21tYW5kIHw9IEZUUkFDRV9FTkFCTEVfQ0FMTFM7CiAKKwkvKiBvcHMgbWFya2VkIGdsb2JhbCBzaGFyZSB0aGUgZmlsdGVyIGhhc2hlcyAqLworCWlmIChvcHMtPmZsYWdzICYgRlRSQUNFX09QU19GTF9HTE9CQUwpIHsKKwkJb3BzID0gJmdsb2JhbF9vcHM7CisJCS8qIERvbid0IHVwZGF0ZSBoYXNoIGlmIGdsb2JhbCBpcyBhbHJlYWR5IHNldCAqLworCQlpZiAoZ2xvYmFsX3N0YXJ0X3VwKQorCQkJaGFzaF9lbmFibGUgPSBmYWxzZTsKKwkJZ2xvYmFsX3N0YXJ0X3VwKys7CisJfQorCisJb3BzLT5mbGFncyB8PSBGVFJBQ0VfT1BTX0ZMX0VOQUJMRUQ7CisJaWYgKGhhc2hfZW5hYmxlKQorCQlmdHJhY2VfaGFzaF9yZWNfZW5hYmxlKG9wcywgMSk7CisKIAlmdHJhY2Vfc3RhcnR1cF9lbmFibGUoY29tbWFuZCk7CiB9CiAKLXN0YXRpYyB2b2lkIGZ0cmFjZV9zaHV0ZG93bihpbnQgY29tbWFuZCkKK3N0YXRpYyB2b2lkIGZ0cmFjZV9zaHV0ZG93bihzdHJ1Y3QgZnRyYWNlX29wcyAqb3BzLCBpbnQgY29tbWFuZCkKIHsKKwlib29sIGhhc2hfZGlzYWJsZSA9IHRydWU7CisKIAlpZiAodW5saWtlbHkoZnRyYWNlX2Rpc2FibGVkKSkKIAkJcmV0dXJuOwogCkBAIC0xMjA5LDYgKzE2NzksMjMgQEAKIAkgKi8KIAlXQVJOX09OX09OQ0UoZnRyYWNlX3N0YXJ0X3VwIDwgMCk7CiAKKwlpZiAob3BzLT5mbGFncyAmIEZUUkFDRV9PUFNfRkxfR0xPQkFMKSB7CisJCW9wcyA9ICZnbG9iYWxfb3BzOworCQlnbG9iYWxfc3RhcnRfdXAtLTsKKwkJV0FSTl9PTl9PTkNFKGdsb2JhbF9zdGFydF91cCA8IDApOworCQkvKiBEb24ndCB1cGRhdGUgaGFzaCBpZiBnbG9iYWwgc3RpbGwgaGFzIHVzZXJzICovCisJCWlmIChnbG9iYWxfc3RhcnRfdXApIHsKKwkJCVdBUk5fT05fT05DRSghZnRyYWNlX3N0YXJ0X3VwKTsKKwkJCWhhc2hfZGlzYWJsZSA9IGZhbHNlOworCQl9CisJfQorCisJaWYgKGhhc2hfZGlzYWJsZSkKKwkJZnRyYWNlX2hhc2hfcmVjX2Rpc2FibGUob3BzLCAxKTsKKworCWlmIChvcHMgIT0gJmdsb2JhbF9vcHMgfHwgIWdsb2JhbF9zdGFydF91cCkKKwkJb3BzLT5mbGFncyAmPSB+RlRSQUNFX09QU19GTF9FTkFCTEVEOworCiAJaWYgKCFmdHJhY2Vfc3RhcnRfdXApCiAJCWNvbW1hbmQgfD0gRlRSQUNFX0RJU0FCTEVfQ0FMTFM7CiAKQEAgLTEyNzMsMTAgKzE3NjAsMTAgQEAKIAkJICovCiAJCWlmICghZnRyYWNlX2NvZGVfZGlzYWJsZShtb2QsIHApKSB7CiAJCQlmdHJhY2VfZnJlZV9yZWMocCk7Ci0JCQljb250aW51ZTsKKwkJCS8qIEdhbWUgb3ZlciAqLworCQkJYnJlYWs7CiAJCX0KIAotCQlwLT5mbGFncyB8PSBGVFJBQ0VfRkxfQ09OVkVSVEVEOwogCQlmdHJhY2VfdXBkYXRlX2NudCsrOwogCiAJCS8qCkBAIC0xMzUxLDkgKzE4MzgsOSBAQAogZW51bSB7CiAJRlRSQUNFX0lURVJfRklMVEVSCT0gKDEgPDwgMCksCiAJRlRSQUNFX0lURVJfTk9UUkFDRQk9ICgxIDw8IDEpLAotCUZUUkFDRV9JVEVSX0ZBSUxVUkVTCT0gKDEgPDwgMiksCi0JRlRSQUNFX0lURVJfUFJJTlRBTEwJPSAoMSA8PCAzKSwKLQlGVFJBQ0VfSVRFUl9IQVNICT0gKDEgPDwgNCksCisJRlRSQUNFX0lURVJfUFJJTlRBTEwJPSAoMSA8PCAyKSwKKwlGVFJBQ0VfSVRFUl9IQVNICT0gKDEgPDwgMyksCisJRlRSQUNFX0lURVJfRU5BQkxFRAk9ICgxIDw8IDQpLAogfTsKIAogI2RlZmluZSBGVFJBQ0VfQlVGRl9NQVggKEtTWU1fU1lNQk9MX0xFTis0KSAvKiByb29tIGZvciB3aWxkY2FyZHMgKi8KQEAgLTEzNjUsNiArMTg1Miw4IEBACiAJc3RydWN0IGR5bl9mdHJhY2UJCSpmdW5jOwogCXN0cnVjdCBmdHJhY2VfZnVuY19wcm9iZQkqcHJvYmU7CiAJc3RydWN0IHRyYWNlX3BhcnNlcgkJcGFyc2VyOworCXN0cnVjdCBmdHJhY2VfaGFzaAkJKmhhc2g7CisJc3RydWN0IGZ0cmFjZV9vcHMJCSpvcHM7CiAJaW50CQkJCWhpZHg7CiAJaW50CQkJCWlkeDsKIAl1bnNpZ25lZAkJCWZsYWdzOwpAQCAtMTQ2MSw4ICsxOTUwLDEyIEBACiB0X25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKIHsKIAlzdHJ1Y3QgZnRyYWNlX2l0ZXJhdG9yICppdGVyID0gbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZnRyYWNlX29wcyAqb3BzID0gJmdsb2JhbF9vcHM7CiAJc3RydWN0IGR5bl9mdHJhY2UgKnJlYyA9IE5VTEw7CiAKKwlpZiAodW5saWtlbHkoZnRyYWNlX2Rpc2FibGVkKSkKKwkJcmV0dXJuIE5VTEw7CisKIAlpZiAoaXRlci0+ZmxhZ3MgJiBGVFJBQ0VfSVRFUl9IQVNIKQogCQlyZXR1cm4gdF9oYXNoX25leHQobSwgcG9zKTsKIApAQCAtMTQ4MywxNyArMTk3NiwxNSBAQAogCQlyZWMgPSAmaXRlci0+cGctPnJlY29yZHNbaXRlci0+aWR4KytdOwogCQlpZiAoKHJlYy0+ZmxhZ3MgJiBGVFJBQ0VfRkxfRlJFRSkgfHwKIAotCQkgICAgKCEoaXRlci0+ZmxhZ3MgJiBGVFJBQ0VfSVRFUl9GQUlMVVJFUykgJiYKLQkJICAgICAocmVjLT5mbGFncyAmIEZUUkFDRV9GTF9GQUlMRUQpKSB8fAotCi0JCSAgICAoKGl0ZXItPmZsYWdzICYgRlRSQUNFX0lURVJfRkFJTFVSRVMpICYmCi0JCSAgICAgIShyZWMtPmZsYWdzICYgRlRSQUNFX0ZMX0ZBSUxFRCkpIHx8Ci0KIAkJICAgICgoaXRlci0+ZmxhZ3MgJiBGVFJBQ0VfSVRFUl9GSUxURVIpICYmCi0JCSAgICAgIShyZWMtPmZsYWdzICYgRlRSQUNFX0ZMX0ZJTFRFUikpIHx8CisJCSAgICAgIShmdHJhY2VfbG9va3VwX2lwKG9wcy0+ZmlsdGVyX2hhc2gsIHJlYy0+aXApKSkgfHwKIAogCQkgICAgKChpdGVyLT5mbGFncyAmIEZUUkFDRV9JVEVSX05PVFJBQ0UpICYmCi0JCSAgICAgIShyZWMtPmZsYWdzICYgRlRSQUNFX0ZMX05PVFJBQ0UpKSkgeworCQkgICAgICFmdHJhY2VfbG9va3VwX2lwKG9wcy0+bm90cmFjZV9oYXNoLCByZWMtPmlwKSkgfHwKKworCQkgICAgKChpdGVyLT5mbGFncyAmIEZUUkFDRV9JVEVSX0VOQUJMRUQpICYmCisJCSAgICAgIShyZWMtPmZsYWdzICYgfkZUUkFDRV9GTF9NQVNLKSkpIHsKKwogCQkJcmVjID0gTlVMTDsKIAkJCWdvdG8gcmV0cnk7CiAJCX0KQEAgLTE1MTcsMTAgKzIwMDgsMTUgQEAKIHN0YXRpYyB2b2lkICp0X3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCiB7CiAJc3RydWN0IGZ0cmFjZV9pdGVyYXRvciAqaXRlciA9IG0tPnByaXZhdGU7CisJc3RydWN0IGZ0cmFjZV9vcHMgKm9wcyA9ICZnbG9iYWxfb3BzOwogCXZvaWQgKnAgPSBOVUxMOwogCWxvZmZfdCBsOwogCiAJbXV0ZXhfbG9jaygmZnRyYWNlX2xvY2spOworCisJaWYgKHVubGlrZWx5KGZ0cmFjZV9kaXNhYmxlZCkpCisJCXJldHVybiBOVUxMOworCiAJLyoKIAkgKiBJZiBhbiBsc2VlayB3YXMgZG9uZSwgdGhlbiByZXNldCBhbmQgc3RhcnQgZnJvbSBiZWdpbm5pbmcuCiAJICovCkBAIC0xNTMyLDcgKzIwMjgsNyBAQAogCSAqIG9mZiwgd2UgY2FuIHNob3J0IGN1dCBhbmQganVzdCBwcmludCBvdXQgdGhhdCBhbGwKIAkgKiBmdW5jdGlvbnMgYXJlIGVuYWJsZWQuCiAJICovCi0JaWYgKGl0ZXItPmZsYWdzICYgRlRSQUNFX0lURVJfRklMVEVSICYmICFmdHJhY2VfZmlsdGVyZWQpIHsKKwlpZiAoaXRlci0+ZmxhZ3MgJiBGVFJBQ0VfSVRFUl9GSUxURVIgJiYgIW9wcy0+ZmlsdGVyX2hhc2gtPmNvdW50KSB7CiAJCWlmICgqcG9zID4gMCkKIAkJCXJldHVybiB0X2hhc2hfc3RhcnQobSwgcG9zKTsKIAkJaXRlci0+ZmxhZ3MgfD0gRlRSQUNFX0lURVJfUFJJTlRBTEw7CkBAIC0xNTkwLDcgKzIwODYsMTEgQEAKIAlpZiAoIXJlYykKIAkJcmV0dXJuIDA7CiAKLQlzZXFfcHJpbnRmKG0sICIlcHNcbiIsICh2b2lkICopcmVjLT5pcCk7CisJc2VxX3ByaW50ZihtLCAiJXBzIiwgKHZvaWQgKilyZWMtPmlwKTsKKwlpZiAoaXRlci0+ZmxhZ3MgJiBGVFJBQ0VfSVRFUl9FTkFCTEVEKQorCQlzZXFfcHJpbnRmKG0sICIgKCVsZCkiLAorCQkJICAgcmVjLT5mbGFncyAmIH5GVFJBQ0VfRkxfTUFTSyk7CisJc2VxX3ByaW50ZihtLCAiXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTYzMCw0NCArMjEzMCw0NiBAQAogfQogCiBzdGF0aWMgaW50Ci1mdHJhY2VfZmFpbHVyZXNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK2Z0cmFjZV9lbmFibGVkX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JaW50IHJldDsKLQlzdHJ1Y3Qgc2VxX2ZpbGUgKm07CiAJc3RydWN0IGZ0cmFjZV9pdGVyYXRvciAqaXRlcjsKKwlpbnQgcmV0OwogCi0JcmV0ID0gZnRyYWNlX2F2YWlsX29wZW4oaW5vZGUsIGZpbGUpOworCWlmICh1bmxpa2VseShmdHJhY2VfZGlzYWJsZWQpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWl0ZXIgPSBremFsbG9jKHNpemVvZigqaXRlciksIEdGUF9LRVJORUwpOworCWlmICghaXRlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpdGVyLT5wZyA9IGZ0cmFjZV9wYWdlc19zdGFydDsKKwlpdGVyLT5mbGFncyA9IEZUUkFDRV9JVEVSX0VOQUJMRUQ7CisKKwlyZXQgPSBzZXFfb3BlbihmaWxlLCAmc2hvd19mdHJhY2Vfc2VxX29wcyk7CiAJaWYgKCFyZXQpIHsKLQkJbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQkJaXRlciA9IG0tPnByaXZhdGU7Ci0JCWl0ZXItPmZsYWdzID0gRlRSQUNFX0lURVJfRkFJTFVSRVM7CisJCXN0cnVjdCBzZXFfZmlsZSAqbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCQltLT5wcml2YXRlID0gaXRlcjsKKwl9IGVsc2UgeworCQlrZnJlZShpdGVyKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwogfQogCi0KLXN0YXRpYyB2b2lkIGZ0cmFjZV9maWx0ZXJfcmVzZXQoaW50IGVuYWJsZSkKK3N0YXRpYyB2b2lkIGZ0cmFjZV9maWx0ZXJfcmVzZXQoc3RydWN0IGZ0cmFjZV9oYXNoICpoYXNoKQogewotCXN0cnVjdCBmdHJhY2VfcGFnZSAqcGc7Ci0Jc3RydWN0IGR5bl9mdHJhY2UgKnJlYzsKLQl1bnNpZ25lZCBsb25nIHR5cGUgPSBlbmFibGUgPyBGVFJBQ0VfRkxfRklMVEVSIDogRlRSQUNFX0ZMX05PVFJBQ0U7Ci0KIAltdXRleF9sb2NrKCZmdHJhY2VfbG9jayk7Ci0JaWYgKGVuYWJsZSkKLQkJZnRyYWNlX2ZpbHRlcmVkID0gMDsKLQlkb19mb3JfZWFjaF9mdHJhY2VfcmVjKHBnLCByZWMpIHsKLQkJaWYgKHJlYy0+ZmxhZ3MgJiBGVFJBQ0VfRkxfRkFJTEVEKQotCQkJY29udGludWU7Ci0JCXJlYy0+ZmxhZ3MgJj0gfnR5cGU7Ci0JfSB3aGlsZV9mb3JfZWFjaF9mdHJhY2VfcmVjKCk7CisJZnRyYWNlX2hhc2hfY2xlYXIoaGFzaCk7CiAJbXV0ZXhfdW5sb2NrKCZmdHJhY2VfbG9jayk7CiB9CiAKIHN0YXRpYyBpbnQKLWZ0cmFjZV9yZWdleF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgZW5hYmxlKQorZnRyYWNlX3JlZ2V4X29wZW4oc3RydWN0IGZ0cmFjZV9vcHMgKm9wcywgaW50IGZsYWcsCisJCSAgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGZ0cmFjZV9pdGVyYXRvciAqaXRlcjsKKwlzdHJ1Y3QgZnRyYWNlX2hhc2ggKmhhc2g7CiAJaW50IHJldCA9IDA7CiAKIAlpZiAodW5saWtlbHkoZnRyYWNlX2Rpc2FibGVkKSkKQEAgLTE2ODIsMjEgKzIxODQsNDIgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJaWYgKGZsYWcgJiBGVFJBQ0VfSVRFUl9OT1RSQUNFKQorCQloYXNoID0gb3BzLT5ub3RyYWNlX2hhc2g7CisJZWxzZQorCQloYXNoID0gb3BzLT5maWx0ZXJfaGFzaDsKKworCWl0ZXItPm9wcyA9IG9wczsKKwlpdGVyLT5mbGFncyA9IGZsYWc7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJbXV0ZXhfbG9jaygmZnRyYWNlX2xvY2spOworCQlpdGVyLT5oYXNoID0gYWxsb2NfYW5kX2NvcHlfZnRyYWNlX2hhc2goRlRSQUNFX0hBU0hfREVGQVVMVF9CSVRTLCBoYXNoKTsKKwkJbXV0ZXhfdW5sb2NrKCZmdHJhY2VfbG9jayk7CisKKwkJaWYgKCFpdGVyLT5oYXNoKSB7CisJCQl0cmFjZV9wYXJzZXJfcHV0KCZpdGVyLT5wYXJzZXIpOworCQkJa2ZyZWUoaXRlcik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKwogCW11dGV4X2xvY2soJmZ0cmFjZV9yZWdleF9sb2NrKTsKKwogCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCiAJICAgIChmaWxlLT5mX2ZsYWdzICYgT19UUlVOQykpCi0JCWZ0cmFjZV9maWx0ZXJfcmVzZXQoZW5hYmxlKTsKKwkJZnRyYWNlX2ZpbHRlcl9yZXNldChpdGVyLT5oYXNoKTsKIAogCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CiAJCWl0ZXItPnBnID0gZnRyYWNlX3BhZ2VzX3N0YXJ0OwotCQlpdGVyLT5mbGFncyA9IGVuYWJsZSA/IEZUUkFDRV9JVEVSX0ZJTFRFUiA6Ci0JCQlGVFJBQ0VfSVRFUl9OT1RSQUNFOwogCiAJCXJldCA9IHNlcV9vcGVuKGZpbGUsICZzaG93X2Z0cmFjZV9zZXFfb3BzKTsKIAkJaWYgKCFyZXQpIHsKIAkJCXN0cnVjdCBzZXFfZmlsZSAqbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAkJCW0tPnByaXZhdGUgPSBpdGVyOwogCQl9IGVsc2UgeworCQkJLyogRmFpbGVkICovCisJCQlmcmVlX2Z0cmFjZV9oYXNoKGl0ZXItPmhhc2gpOwogCQkJdHJhY2VfcGFyc2VyX3B1dCgmaXRlci0+cGFyc2VyKTsKIAkJCWtmcmVlKGl0ZXIpOwogCQl9CkBAIC0xNzEwLDEzICsyMjMzLDE1IEBACiBzdGF0aWMgaW50CiBmdHJhY2VfZmlsdGVyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JcmV0dXJuIGZ0cmFjZV9yZWdleF9vcGVuKGlub2RlLCBmaWxlLCAxKTsKKwlyZXR1cm4gZnRyYWNlX3JlZ2V4X29wZW4oJmdsb2JhbF9vcHMsIEZUUkFDRV9JVEVSX0ZJTFRFUiwKKwkJCQkgaW5vZGUsIGZpbGUpOwogfQogCiBzdGF0aWMgaW50CiBmdHJhY2Vfbm90cmFjZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXJldHVybiBmdHJhY2VfcmVnZXhfb3Blbihpbm9kZSwgZmlsZSwgMCk7CisJcmV0dXJuIGZ0cmFjZV9yZWdleF9vcGVuKCZnbG9iYWxfb3BzLCBGVFJBQ0VfSVRFUl9OT1RSQUNFLAorCQkJCSBpbm9kZSwgZmlsZSk7CiB9CiAKIHN0YXRpYyBsb2ZmX3QKQEAgLTE3NjEsODYgKzIyODYsOTkgQEAKIH0KIAogc3RhdGljIGludAotZnRyYWNlX21hdGNoX3JlY29yZChzdHJ1Y3QgZHluX2Z0cmFjZSAqcmVjLCBjaGFyICpyZWdleCwgaW50IGxlbiwgaW50IHR5cGUpCitlbnRlcl9yZWNvcmQoc3RydWN0IGZ0cmFjZV9oYXNoICpoYXNoLCBzdHJ1Y3QgZHluX2Z0cmFjZSAqcmVjLCBpbnQgbm90KQogewotCWNoYXIgc3RyW0tTWU1fU1lNQk9MX0xFTl07CisJc3RydWN0IGZ0cmFjZV9mdW5jX2VudHJ5ICplbnRyeTsKKwlpbnQgcmV0ID0gMDsKIAotCWthbGxzeW1zX2xvb2t1cChyZWMtPmlwLCBOVUxMLCBOVUxMLCBOVUxMLCBzdHIpOwotCXJldHVybiBmdHJhY2VfbWF0Y2goc3RyLCByZWdleCwgbGVuLCB0eXBlKTsKLX0KKwllbnRyeSA9IGZ0cmFjZV9sb29rdXBfaXAoaGFzaCwgcmVjLT5pcCk7CisJaWYgKG5vdCkgeworCQkvKiBEbyBub3RoaW5nIGlmIGl0IGRvZXNuJ3QgZXhpc3QgKi8KKwkJaWYgKCFlbnRyeSkKKwkJCXJldHVybiAwOwogCi1zdGF0aWMgaW50IGZ0cmFjZV9tYXRjaF9yZWNvcmRzKGNoYXIgKmJ1ZmYsIGludCBsZW4sIGludCBlbmFibGUpCi17Ci0JdW5zaWduZWQgaW50IHNlYXJjaF9sZW47Ci0Jc3RydWN0IGZ0cmFjZV9wYWdlICpwZzsKLQlzdHJ1Y3QgZHluX2Z0cmFjZSAqcmVjOwotCXVuc2lnbmVkIGxvbmcgZmxhZzsKLQljaGFyICpzZWFyY2g7Ci0JaW50IHR5cGU7Ci0JaW50IG5vdDsKLQlpbnQgZm91bmQgPSAwOworCQlmcmVlX2hhc2hfZW50cnkoaGFzaCwgZW50cnkpOworCX0gZWxzZSB7CisJCS8qIERvIG5vdGhpbmcgaWYgaXQgZXhpc3RzICovCisJCWlmIChlbnRyeSkKKwkJCXJldHVybiAwOwogCi0JZmxhZyA9IGVuYWJsZSA/IEZUUkFDRV9GTF9GSUxURVIgOiBGVFJBQ0VfRkxfTk9UUkFDRTsKLQl0eXBlID0gZmlsdGVyX3BhcnNlX3JlZ2V4KGJ1ZmYsIGxlbiwgJnNlYXJjaCwgJm5vdCk7Ci0KLQlzZWFyY2hfbGVuID0gc3RybGVuKHNlYXJjaCk7Ci0KLQltdXRleF9sb2NrKCZmdHJhY2VfbG9jayk7Ci0JZG9fZm9yX2VhY2hfZnRyYWNlX3JlYyhwZywgcmVjKSB7Ci0KLQkJaWYgKHJlYy0+ZmxhZ3MgJiBGVFJBQ0VfRkxfRkFJTEVEKQotCQkJY29udGludWU7Ci0KLQkJaWYgKGZ0cmFjZV9tYXRjaF9yZWNvcmQocmVjLCBzZWFyY2gsIHNlYXJjaF9sZW4sIHR5cGUpKSB7Ci0JCQlpZiAobm90KQotCQkJCXJlYy0+ZmxhZ3MgJj0gfmZsYWc7Ci0JCQllbHNlCi0JCQkJcmVjLT5mbGFncyB8PSBmbGFnOwotCQkJZm91bmQgPSAxOwotCQl9Ci0JCS8qCi0JCSAqIE9ubHkgZW5hYmxlIGZpbHRlcmluZyBpZiB3ZSBoYXZlIGEgZnVuY3Rpb24gdGhhdAotCQkgKiBpcyBmaWx0ZXJlZCBvbi4KLQkJICovCi0JCWlmIChlbmFibGUgJiYgKHJlYy0+ZmxhZ3MgJiBGVFJBQ0VfRkxfRklMVEVSKSkKLQkJCWZ0cmFjZV9maWx0ZXJlZCA9IDE7Ci0JfSB3aGlsZV9mb3JfZWFjaF9mdHJhY2VfcmVjKCk7Ci0JbXV0ZXhfdW5sb2NrKCZmdHJhY2VfbG9jayk7Ci0KLQlyZXR1cm4gZm91bmQ7CisJCXJldCA9IGFkZF9oYXNoX2VudHJ5KGhhc2gsIHJlYy0+aXApOworCX0KKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50Ci1mdHJhY2VfbWF0Y2hfbW9kdWxlX3JlY29yZChzdHJ1Y3QgZHluX2Z0cmFjZSAqcmVjLCBjaGFyICptb2QsCi0JCQkgICBjaGFyICpyZWdleCwgaW50IGxlbiwgaW50IHR5cGUpCitmdHJhY2VfbWF0Y2hfcmVjb3JkKHN0cnVjdCBkeW5fZnRyYWNlICpyZWMsIGNoYXIgKm1vZCwKKwkJICAgIGNoYXIgKnJlZ2V4LCBpbnQgbGVuLCBpbnQgdHlwZSkKIHsKIAljaGFyIHN0cltLU1lNX1NZTUJPTF9MRU5dOwogCWNoYXIgKm1vZG5hbWU7CiAKIAlrYWxsc3ltc19sb29rdXAocmVjLT5pcCwgTlVMTCwgTlVMTCwgJm1vZG5hbWUsIHN0cik7CiAKLQlpZiAoIW1vZG5hbWUgfHwgc3RyY21wKG1vZG5hbWUsIG1vZCkpCi0JCXJldHVybiAwOworCWlmIChtb2QpIHsKKwkJLyogbW9kdWxlIGxvb2t1cCByZXF1aXJlcyBtYXRjaGluZyB0aGUgbW9kdWxlICovCisJCWlmICghbW9kbmFtZSB8fCBzdHJjbXAobW9kbmFtZSwgbW9kKSkKKwkJCXJldHVybiAwOwogCi0JLyogYmxhbmsgc2VhcmNoIG1lYW5zIHRvIG1hdGNoIGFsbCBmdW5jcyBpbiB0aGUgbW9kICovCi0JaWYgKGxlbikKLQkJcmV0dXJuIGZ0cmFjZV9tYXRjaChzdHIsIHJlZ2V4LCBsZW4sIHR5cGUpOwotCWVsc2UKLQkJcmV0dXJuIDE7CisJCS8qIGJsYW5rIHNlYXJjaCBtZWFucyB0byBtYXRjaCBhbGwgZnVuY3MgaW4gdGhlIG1vZCAqLworCQlpZiAoIWxlbikKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiBmdHJhY2VfbWF0Y2goc3RyLCByZWdleCwgbGVuLCB0eXBlKTsKIH0KIAotc3RhdGljIGludCBmdHJhY2VfbWF0Y2hfbW9kdWxlX3JlY29yZHMoY2hhciAqYnVmZiwgY2hhciAqbW9kLCBpbnQgZW5hYmxlKQorc3RhdGljIGludAorbWF0Y2hfcmVjb3JkcyhzdHJ1Y3QgZnRyYWNlX2hhc2ggKmhhc2gsIGNoYXIgKmJ1ZmYsCisJICAgICAgaW50IGxlbiwgY2hhciAqbW9kLCBpbnQgbm90KQogewogCXVuc2lnbmVkIHNlYXJjaF9sZW4gPSAwOwogCXN0cnVjdCBmdHJhY2VfcGFnZSAqcGc7CiAJc3RydWN0IGR5bl9mdHJhY2UgKnJlYzsKIAlpbnQgdHlwZSA9IE1BVENIX0ZVTEw7CiAJY2hhciAqc2VhcmNoID0gYnVmZjsKLQl1bnNpZ25lZCBsb25nIGZsYWc7Ci0JaW50IG5vdCA9IDA7CiAJaW50IGZvdW5kID0gMDsKKwlpbnQgcmV0OwogCi0JZmxhZyA9IGVuYWJsZSA/IEZUUkFDRV9GTF9GSUxURVIgOiBGVFJBQ0VfRkxfTk9UUkFDRTsKKwlpZiAobGVuKSB7CisJCXR5cGUgPSBmaWx0ZXJfcGFyc2VfcmVnZXgoYnVmZiwgbGVuLCAmc2VhcmNoLCAmbm90KTsKKwkJc2VhcmNoX2xlbiA9IHN0cmxlbihzZWFyY2gpOworCX0KKworCW11dGV4X2xvY2soJmZ0cmFjZV9sb2NrKTsKKworCWlmICh1bmxpa2VseShmdHJhY2VfZGlzYWJsZWQpKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlkb19mb3JfZWFjaF9mdHJhY2VfcmVjKHBnLCByZWMpIHsKKworCQlpZiAoZnRyYWNlX21hdGNoX3JlY29yZChyZWMsIG1vZCwgc2VhcmNoLCBzZWFyY2hfbGVuLCB0eXBlKSkgeworCQkJcmV0ID0gZW50ZXJfcmVjb3JkKGhhc2gsIHJlYywgbm90KTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZm91bmQgPSByZXQ7CisJCQkJZ290byBvdXRfdW5sb2NrOworCQkJfQorCQkJZm91bmQgPSAxOworCQl9CisJfSB3aGlsZV9mb3JfZWFjaF9mdHJhY2VfcmVjKCk7Cisgb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJmZ0cmFjZV9sb2NrKTsKKworCXJldHVybiBmb3VuZDsKK30KKworc3RhdGljIGludAorZnRyYWNlX21hdGNoX3JlY29yZHMoc3RydWN0IGZ0cmFjZV9oYXNoICpoYXNoLCBjaGFyICpidWZmLCBpbnQgbGVuKQoreworCXJldHVybiBtYXRjaF9yZWNvcmRzKGhhc2gsIGJ1ZmYsIGxlbiwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyBpbnQKK2Z0cmFjZV9tYXRjaF9tb2R1bGVfcmVjb3JkcyhzdHJ1Y3QgZnRyYWNlX2hhc2ggKmhhc2gsIGNoYXIgKmJ1ZmYsIGNoYXIgKm1vZCkKK3sKKwlpbnQgbm90ID0gMDsKIAogCS8qIGJsYW5rIG9yICcqJyBtZWFuIHRoZSBzYW1lICovCiAJaWYgKHN0cmNtcChidWZmLCAiKiIpID09IDApCkBAIC0xODUyLDMyICsyMzkwLDcgQEAKIAkJbm90ID0gMTsKIAl9CiAKLQlpZiAoc3RybGVuKGJ1ZmYpKSB7Ci0JCXR5cGUgPSBmaWx0ZXJfcGFyc2VfcmVnZXgoYnVmZiwgc3RybGVuKGJ1ZmYpLCAmc2VhcmNoLCAmbm90KTsKLQkJc2VhcmNoX2xlbiA9IHN0cmxlbihzZWFyY2gpOwotCX0KLQotCW11dGV4X2xvY2soJmZ0cmFjZV9sb2NrKTsKLQlkb19mb3JfZWFjaF9mdHJhY2VfcmVjKHBnLCByZWMpIHsKLQotCQlpZiAocmVjLT5mbGFncyAmIEZUUkFDRV9GTF9GQUlMRUQpCi0JCQljb250aW51ZTsKLQotCQlpZiAoZnRyYWNlX21hdGNoX21vZHVsZV9yZWNvcmQocmVjLCBtb2QsCi0JCQkJCSAgICAgICBzZWFyY2gsIHNlYXJjaF9sZW4sIHR5cGUpKSB7Ci0JCQlpZiAobm90KQotCQkJCXJlYy0+ZmxhZ3MgJj0gfmZsYWc7Ci0JCQllbHNlCi0JCQkJcmVjLT5mbGFncyB8PSBmbGFnOwotCQkJZm91bmQgPSAxOwotCQl9Ci0JCWlmIChlbmFibGUgJiYgKHJlYy0+ZmxhZ3MgJiBGVFJBQ0VfRkxfRklMVEVSKSkKLQkJCWZ0cmFjZV9maWx0ZXJlZCA9IDE7Ci0KLQl9IHdoaWxlX2Zvcl9lYWNoX2Z0cmFjZV9yZWMoKTsKLQltdXRleF91bmxvY2soJmZ0cmFjZV9sb2NrKTsKLQotCXJldHVybiBmb3VuZDsKKwlyZXR1cm4gbWF0Y2hfcmVjb3JkcyhoYXNoLCBidWZmLCBzdHJsZW4oYnVmZiksIG1vZCwgbm90KTsKIH0KIAogLyoKQEAgLTE4ODgsNyArMjQwMSwxMCBAQAogc3RhdGljIGludAogZnRyYWNlX21vZF9jYWxsYmFjayhjaGFyICpmdW5jLCBjaGFyICpjbWQsIGNoYXIgKnBhcmFtLCBpbnQgZW5hYmxlKQogeworCXN0cnVjdCBmdHJhY2Vfb3BzICpvcHMgPSAmZ2xvYmFsX29wczsKKwlzdHJ1Y3QgZnRyYWNlX2hhc2ggKmhhc2g7CiAJY2hhciAqbW9kOworCWludCByZXQgPSAtRUlOVkFMOwogCiAJLyoKIAkgKiBjbWQgPT0gJ21vZCcgYmVjYXVzZSB3ZSBvbmx5IHJlZ2lzdGVyZWQgdGhpcyBmdW5jCkBAIC0xOTAwLDE1ICsyNDE2LDI0IEBACiAKIAkvKiB3ZSBtdXN0IGhhdmUgYSBtb2R1bGUgbmFtZSAqLwogCWlmICghcGFyYW0pCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gcmV0OwogCiAJbW9kID0gc3Ryc2VwKCZwYXJhbSwgIjoiKTsKIAlpZiAoIXN0cmxlbihtb2QpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIHJldDsKIAotCWlmIChmdHJhY2VfbWF0Y2hfbW9kdWxlX3JlY29yZHMoZnVuYywgbW9kLCBlbmFibGUpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZW5hYmxlKQorCQloYXNoID0gb3BzLT5maWx0ZXJfaGFzaDsKKwllbHNlCisJCWhhc2ggPSBvcHMtPm5vdHJhY2VfaGFzaDsKKworCXJldCA9IGZ0cmFjZV9tYXRjaF9tb2R1bGVfcmVjb3JkcyhoYXNoLCBmdW5jLCBtb2QpOworCWlmICghcmV0KQorCQlyZXQgPSAtRUlOVkFMOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZnRyYWNlX2Z1bmNfY29tbWFuZCBmdHJhY2VfbW9kX2NtZCA9IHsKQEAgLTE5NTksNiArMjQ4NCw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZW5hYmxlX2Z0cmFjZV9mdW5jdGlvbl9wcm9iZSh2b2lkKQogeworCWludCByZXQ7CiAJaW50IGk7CiAKIAlpZiAoZnRyYWNlX3Byb2JlX3JlZ2lzdGVyZWQpCkBAIC0xOTczLDEzICsyNDk5LDE2IEBACiAJaWYgKGkgPT0gRlRSQUNFX0ZVTkNfSEFTSFNJWkUpCiAJCXJldHVybjsKIAotCV9fcmVnaXN0ZXJfZnRyYWNlX2Z1bmN0aW9uKCZ0cmFjZV9wcm9iZV9vcHMpOwotCWZ0cmFjZV9zdGFydHVwKDApOworCXJldCA9IF9fcmVnaXN0ZXJfZnRyYWNlX2Z1bmN0aW9uKCZ0cmFjZV9wcm9iZV9vcHMpOworCWlmICghcmV0KQorCQlmdHJhY2Vfc3RhcnR1cCgmdHJhY2VfcHJvYmVfb3BzLCAwKTsKKwogCWZ0cmFjZV9wcm9iZV9yZWdpc3RlcmVkID0gMTsKIH0KIAogc3RhdGljIHZvaWQgX19kaXNhYmxlX2Z0cmFjZV9mdW5jdGlvbl9wcm9iZSh2b2lkKQogeworCWludCByZXQ7CiAJaW50IGk7CiAKIAlpZiAoIWZ0cmFjZV9wcm9iZV9yZWdpc3RlcmVkKQpAQCAtMTk5Miw4ICsyNTIxLDEwIEBACiAJfQogCiAJLyogbm8gbW9yZSBmdW5jcyBsZWZ0ICovCi0JX191bnJlZ2lzdGVyX2Z0cmFjZV9mdW5jdGlvbigmdHJhY2VfcHJvYmVfb3BzKTsKLQlmdHJhY2Vfc2h1dGRvd24oMCk7CisJcmV0ID0gX191bnJlZ2lzdGVyX2Z0cmFjZV9mdW5jdGlvbigmdHJhY2VfcHJvYmVfb3BzKTsKKwlpZiAoIXJldCkKKwkJZnRyYWNlX3NodXRkb3duKCZ0cmFjZV9wcm9iZV9vcHMsIDApOworCiAJZnRyYWNlX3Byb2JlX3JlZ2lzdGVyZWQgPSAwOwogfQogCkBAIC0yMDI5LDEyICsyNTYwLDEzIEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJbXV0ZXhfbG9jaygmZnRyYWNlX2xvY2spOworCisJaWYgKHVubGlrZWx5KGZ0cmFjZV9kaXNhYmxlZCkpCisJCWdvdG8gb3V0X3VubG9jazsKKwogCWRvX2Zvcl9lYWNoX2Z0cmFjZV9yZWMocGcsIHJlYykgewogCi0JCWlmIChyZWMtPmZsYWdzICYgRlRSQUNFX0ZMX0ZBSUxFRCkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICghZnRyYWNlX21hdGNoX3JlY29yZChyZWMsIHNlYXJjaCwgbGVuLCB0eXBlKSkKKwkJaWYgKCFmdHJhY2VfbWF0Y2hfcmVjb3JkKHJlYywgTlVMTCwgc2VhcmNoLCBsZW4sIHR5cGUpKQogCQkJY29udGludWU7CiAKIAkJZW50cnkgPSBrbWFsbG9jKHNpemVvZigqZW50cnkpLCBHRlBfS0VSTkVMKTsKQEAgLTIxOTUsMTggKzI3MjcsMjIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGZ0cmFjZV9wcm9jZXNzX3JlZ2V4KGNoYXIgKmJ1ZmYsIGludCBsZW4sIGludCBlbmFibGUpCitzdGF0aWMgaW50IGZ0cmFjZV9wcm9jZXNzX3JlZ2V4KHN0cnVjdCBmdHJhY2VfaGFzaCAqaGFzaCwKKwkJCQljaGFyICpidWZmLCBpbnQgbGVuLCBpbnQgZW5hYmxlKQogewogCWNoYXIgKmZ1bmMsICpjb21tYW5kLCAqbmV4dCA9IGJ1ZmY7CiAJc3RydWN0IGZ0cmFjZV9mdW5jX2NvbW1hbmQgKnA7Ci0JaW50IHJldCA9IC1FSU5WQUw7CisJaW50IHJldDsKIAogCWZ1bmMgPSBzdHJzZXAoJm5leHQsICI6Iik7CiAKIAlpZiAoIW5leHQpIHsKLQkJaWYgKGZ0cmFjZV9tYXRjaF9yZWNvcmRzKGZ1bmMsIGxlbiwgZW5hYmxlKSkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gcmV0OworCQlyZXQgPSBmdHJhY2VfbWF0Y2hfcmVjb3JkcyhoYXNoLCBmdW5jLCBsZW4pOworCQlpZiAoIXJldCkKKwkJCXJldCA9IC1FSU5WQUw7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIDA7CiAJfQogCiAJLyogY29tbWFuZCBmb3VuZCAqLwpAQCAtMjIzOSw2ICsyNzc1LDEwIEBACiAKIAltdXRleF9sb2NrKCZmdHJhY2VfcmVnZXhfbG9jayk7CiAKKwlyZXQgPSAtRU5PREVWOworCWlmICh1bmxpa2VseShmdHJhY2VfZGlzYWJsZWQpKQorCQlnb3RvIG91dF91bmxvY2s7CisKIAlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewogCQlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJCWl0ZXIgPSBtLT5wcml2YXRlOwpAQCAtMjI1MCw3ICsyNzkwLDcgQEAKIAogCWlmIChyZWFkID49IDAgJiYgdHJhY2VfcGFyc2VyX2xvYWRlZChwYXJzZXIpICYmCiAJICAgICF0cmFjZV9wYXJzZXJfY29udChwYXJzZXIpKSB7Ci0JCXJldCA9IGZ0cmFjZV9wcm9jZXNzX3JlZ2V4KHBhcnNlci0+YnVmZmVyLAorCQlyZXQgPSBmdHJhY2VfcHJvY2Vzc19yZWdleChpdGVyLT5oYXNoLCBwYXJzZXItPmJ1ZmZlciwKIAkJCQkJICAgcGFyc2VyLT5pZHgsIGVuYWJsZSk7CiAJCXRyYWNlX3BhcnNlcl9jbGVhcihwYXJzZXIpOwogCQlpZiAocmV0KQpAQCAtMjI3OCwyMiArMjgxOCw0OSBAQAogCXJldHVybiBmdHJhY2VfcmVnZXhfd3JpdGUoZmlsZSwgdWJ1ZiwgY250LCBwcG9zLCAwKTsKIH0KIAotc3RhdGljIHZvaWQKLWZ0cmFjZV9zZXRfcmVnZXgodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuLCBpbnQgcmVzZXQsIGludCBlbmFibGUpCitzdGF0aWMgaW50CitmdHJhY2Vfc2V0X3JlZ2V4KHN0cnVjdCBmdHJhY2Vfb3BzICpvcHMsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbiwKKwkJIGludCByZXNldCwgaW50IGVuYWJsZSkKIHsKKwlzdHJ1Y3QgZnRyYWNlX2hhc2ggKipvcmlnX2hhc2g7CisJc3RydWN0IGZ0cmFjZV9oYXNoICpoYXNoOworCWludCByZXQ7CisKKwkvKiBBbGwgZ2xvYmFsIG9wcyB1c2VzIHRoZSBnbG9iYWwgb3BzIGZpbHRlcnMgKi8KKwlpZiAob3BzLT5mbGFncyAmIEZUUkFDRV9PUFNfRkxfR0xPQkFMKQorCQlvcHMgPSAmZ2xvYmFsX29wczsKKwogCWlmICh1bmxpa2VseShmdHJhY2VfZGlzYWJsZWQpKQotCQlyZXR1cm47CisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGVuYWJsZSkKKwkJb3JpZ19oYXNoID0gJm9wcy0+ZmlsdGVyX2hhc2g7CisJZWxzZQorCQlvcmlnX2hhc2ggPSAmb3BzLT5ub3RyYWNlX2hhc2g7CisKKwloYXNoID0gYWxsb2NfYW5kX2NvcHlfZnRyYWNlX2hhc2goRlRSQUNFX0hBU0hfREVGQVVMVF9CSVRTLCAqb3JpZ19oYXNoKTsKKwlpZiAoIWhhc2gpCisJCXJldHVybiAtRU5PTUVNOwogCiAJbXV0ZXhfbG9jaygmZnRyYWNlX3JlZ2V4X2xvY2spOwogCWlmIChyZXNldCkKLQkJZnRyYWNlX2ZpbHRlcl9yZXNldChlbmFibGUpOworCQlmdHJhY2VfZmlsdGVyX3Jlc2V0KGhhc2gpOwogCWlmIChidWYpCi0JCWZ0cmFjZV9tYXRjaF9yZWNvcmRzKGJ1ZiwgbGVuLCBlbmFibGUpOworCQlmdHJhY2VfbWF0Y2hfcmVjb3JkcyhoYXNoLCBidWYsIGxlbik7CisKKwltdXRleF9sb2NrKCZmdHJhY2VfbG9jayk7CisJcmV0ID0gZnRyYWNlX2hhc2hfbW92ZShvcmlnX2hhc2gsIGhhc2gpOworCW11dGV4X3VubG9jaygmZnRyYWNlX2xvY2spOworCiAJbXV0ZXhfdW5sb2NrKCZmdHJhY2VfcmVnZXhfbG9jayk7CisKKwlmcmVlX2Z0cmFjZV9oYXNoKGhhc2gpOworCXJldHVybiByZXQ7CiB9CiAKIC8qKgogICogZnRyYWNlX3NldF9maWx0ZXIgLSBzZXQgYSBmdW5jdGlvbiB0byBmaWx0ZXIgb24gaW4gZnRyYWNlCisgKiBAb3BzIC0gdGhlIG9wcyB0byBzZXQgdGhlIGZpbHRlciB3aXRoCiAgKiBAYnVmIC0gdGhlIHN0cmluZyB0aGF0IGhvbGRzIHRoZSBmdW5jdGlvbiBmaWx0ZXIgdGV4dC4KICAqIEBsZW4gLSB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuCiAgKiBAcmVzZXQgLSBub24gemVybyB0byByZXNldCBhbGwgZmlsdGVycyBiZWZvcmUgYXBwbHlpbmcgdGhpcyBmaWx0ZXIuCkBAIC0yMzAxLDEzICsyODY4LDE2IEBACiAgKiBGaWx0ZXJzIGRlbm90ZSB3aGljaCBmdW5jdGlvbnMgc2hvdWxkIGJlIGVuYWJsZWQgd2hlbiB0cmFjaW5nIGlzIGVuYWJsZWQuCiAgKiBJZiBAYnVmIGlzIE5VTEwgYW5kIHJlc2V0IGlzIHNldCwgYWxsIGZ1bmN0aW9ucyB3aWxsIGJlIGVuYWJsZWQgZm9yIHRyYWNpbmcuCiAgKi8KLXZvaWQgZnRyYWNlX3NldF9maWx0ZXIodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuLCBpbnQgcmVzZXQpCit2b2lkIGZ0cmFjZV9zZXRfZmlsdGVyKHN0cnVjdCBmdHJhY2Vfb3BzICpvcHMsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJICAgICAgIGludCBsZW4sIGludCByZXNldCkKIHsKLQlmdHJhY2Vfc2V0X3JlZ2V4KGJ1ZiwgbGVuLCByZXNldCwgMSk7CisJZnRyYWNlX3NldF9yZWdleChvcHMsIGJ1ZiwgbGVuLCByZXNldCwgMSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChmdHJhY2Vfc2V0X2ZpbHRlcik7CiAKIC8qKgogICogZnRyYWNlX3NldF9ub3RyYWNlIC0gc2V0IGEgZnVuY3Rpb24gdG8gbm90IHRyYWNlIGluIGZ0cmFjZQorICogQG9wcyAtIHRoZSBvcHMgdG8gc2V0IHRoZSBub3RyYWNlIGZpbHRlciB3aXRoCiAgKiBAYnVmIC0gdGhlIHN0cmluZyB0aGF0IGhvbGRzIHRoZSBmdW5jdGlvbiBub3RyYWNlIHRleHQuCiAgKiBAbGVuIC0gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLgogICogQHJlc2V0IC0gbm9uIHplcm8gdG8gcmVzZXQgYWxsIGZpbHRlcnMgYmVmb3JlIGFwcGx5aW5nIHRoaXMgZmlsdGVyLgpAQCAtMjMxNiwxMCArMjg4Niw0NCBAQAogICogaXMgZW5hYmxlZC4gSWYgQGJ1ZiBpcyBOVUxMIGFuZCByZXNldCBpcyBzZXQsIGFsbCBmdW5jdGlvbnMgd2lsbCBiZSBlbmFibGVkCiAgKiBmb3IgdHJhY2luZy4KICAqLwotdm9pZCBmdHJhY2Vfc2V0X25vdHJhY2UodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuLCBpbnQgcmVzZXQpCit2b2lkIGZ0cmFjZV9zZXRfbm90cmFjZShzdHJ1Y3QgZnRyYWNlX29wcyAqb3BzLCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQlpbnQgbGVuLCBpbnQgcmVzZXQpCiB7Ci0JZnRyYWNlX3NldF9yZWdleChidWYsIGxlbiwgcmVzZXQsIDApOworCWZ0cmFjZV9zZXRfcmVnZXgob3BzLCBidWYsIGxlbiwgcmVzZXQsIDApOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoZnRyYWNlX3NldF9ub3RyYWNlKTsKKy8qKgorICogZnRyYWNlX3NldF9maWx0ZXIgLSBzZXQgYSBmdW5jdGlvbiB0byBmaWx0ZXIgb24gaW4gZnRyYWNlCisgKiBAb3BzIC0gdGhlIG9wcyB0byBzZXQgdGhlIGZpbHRlciB3aXRoCisgKiBAYnVmIC0gdGhlIHN0cmluZyB0aGF0IGhvbGRzIHRoZSBmdW5jdGlvbiBmaWx0ZXIgdGV4dC4KKyAqIEBsZW4gLSB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuCisgKiBAcmVzZXQgLSBub24gemVybyB0byByZXNldCBhbGwgZmlsdGVycyBiZWZvcmUgYXBwbHlpbmcgdGhpcyBmaWx0ZXIuCisgKgorICogRmlsdGVycyBkZW5vdGUgd2hpY2ggZnVuY3Rpb25zIHNob3VsZCBiZSBlbmFibGVkIHdoZW4gdHJhY2luZyBpcyBlbmFibGVkLgorICogSWYgQGJ1ZiBpcyBOVUxMIGFuZCByZXNldCBpcyBzZXQsIGFsbCBmdW5jdGlvbnMgd2lsbCBiZSBlbmFibGVkIGZvciB0cmFjaW5nLgorICovCit2b2lkIGZ0cmFjZV9zZXRfZ2xvYmFsX2ZpbHRlcih1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4sIGludCByZXNldCkKK3sKKwlmdHJhY2Vfc2V0X3JlZ2V4KCZnbG9iYWxfb3BzLCBidWYsIGxlbiwgcmVzZXQsIDEpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZnRyYWNlX3NldF9nbG9iYWxfZmlsdGVyKTsKKworLyoqCisgKiBmdHJhY2Vfc2V0X25vdHJhY2UgLSBzZXQgYSBmdW5jdGlvbiB0byBub3QgdHJhY2UgaW4gZnRyYWNlCisgKiBAb3BzIC0gdGhlIG9wcyB0byBzZXQgdGhlIG5vdHJhY2UgZmlsdGVyIHdpdGgKKyAqIEBidWYgLSB0aGUgc3RyaW5nIHRoYXQgaG9sZHMgdGhlIGZ1bmN0aW9uIG5vdHJhY2UgdGV4dC4KKyAqIEBsZW4gLSB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuCisgKiBAcmVzZXQgLSBub24gemVybyB0byByZXNldCBhbGwgZmlsdGVycyBiZWZvcmUgYXBwbHlpbmcgdGhpcyBmaWx0ZXIuCisgKgorICogTm90cmFjZSBGaWx0ZXJzIGRlbm90ZSB3aGljaCBmdW5jdGlvbnMgc2hvdWxkIG5vdCBiZSBlbmFibGVkIHdoZW4gdHJhY2luZworICogaXMgZW5hYmxlZC4gSWYgQGJ1ZiBpcyBOVUxMIGFuZCByZXNldCBpcyBzZXQsIGFsbCBmdW5jdGlvbnMgd2lsbCBiZSBlbmFibGVkCisgKiBmb3IgdHJhY2luZy4KKyAqLwordm9pZCBmdHJhY2Vfc2V0X2dsb2JhbF9ub3RyYWNlKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbiwgaW50IHJlc2V0KQoreworCWZ0cmFjZV9zZXRfcmVnZXgoJmdsb2JhbF9vcHMsIGJ1ZiwgbGVuLCByZXNldCwgMCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmdHJhY2Vfc2V0X2dsb2JhbF9ub3RyYWNlKTsKIAogLyoKICAqIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UgdG8gYWxsb3cgdXNlcnMgdG8gc2V0IGZpbHRlcnMgb24gYm9vdCB1cC4KQEAgLTIzNzAsMjIgKzI5NzQsMjMgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSICovCiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzZXRfZnRyYWNlX2Vhcmx5X2ZpbHRlcihjaGFyICpidWYsIGludCBlbmFibGUpCitzdGF0aWMgdm9pZCBfX2luaXQKK3NldF9mdHJhY2VfZWFybHlfZmlsdGVyKHN0cnVjdCBmdHJhY2Vfb3BzICpvcHMsIGNoYXIgKmJ1ZiwgaW50IGVuYWJsZSkKIHsKIAljaGFyICpmdW5jOwogCiAJd2hpbGUgKGJ1ZikgewogCQlmdW5jID0gc3Ryc2VwKCZidWYsICIsIik7Ci0JCWZ0cmFjZV9zZXRfcmVnZXgoZnVuYywgc3RybGVuKGZ1bmMpLCAwLCBlbmFibGUpOworCQlmdHJhY2Vfc2V0X3JlZ2V4KG9wcywgZnVuYywgc3RybGVuKGZ1bmMpLCAwLCBlbmFibGUpOwogCX0KIH0KIAogc3RhdGljIHZvaWQgX19pbml0IHNldF9mdHJhY2VfZWFybHlfZmlsdGVycyh2b2lkKQogewogCWlmIChmdHJhY2VfZmlsdGVyX2J1ZlswXSkKLQkJc2V0X2Z0cmFjZV9lYXJseV9maWx0ZXIoZnRyYWNlX2ZpbHRlcl9idWYsIDEpOworCQlzZXRfZnRyYWNlX2Vhcmx5X2ZpbHRlcigmZ2xvYmFsX29wcywgZnRyYWNlX2ZpbHRlcl9idWYsIDEpOwogCWlmIChmdHJhY2Vfbm90cmFjZV9idWZbMF0pCi0JCXNldF9mdHJhY2VfZWFybHlfZmlsdGVyKGZ0cmFjZV9ub3RyYWNlX2J1ZiwgMCk7CisJCXNldF9mdHJhY2VfZWFybHlfZmlsdGVyKCZnbG9iYWxfb3BzLCBmdHJhY2Vfbm90cmFjZV9idWYsIDApOwogI2lmZGVmIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIKIAlpZiAoZnRyYWNlX2dyYXBoX2J1ZlswXSkKIAkJc2V0X2Z0cmFjZV9lYXJseV9ncmFwaChmdHJhY2VfZ3JhcGhfYnVmKTsKQEAgLTIzOTMsMTEgKzI5OTgsMTQgQEAKIH0KIAogc3RhdGljIGludAotZnRyYWNlX3JlZ2V4X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBlbmFibGUpCitmdHJhY2VfcmVnZXhfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBmdHJhY2VfaXRlcmF0b3IgKml0ZXI7CisJc3RydWN0IGZ0cmFjZV9oYXNoICoqb3JpZ19oYXNoOwogCXN0cnVjdCB0cmFjZV9wYXJzZXIgKnBhcnNlcjsKKwlpbnQgZmlsdGVyX2hhc2g7CisJaW50IHJldDsKIAogCW11dGV4X2xvY2soJmZ0cmFjZV9yZWdleF9sb2NrKTsKIAlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewpAQCAtMjQxMCwzMyArMzAxOCw0MSBAQAogCXBhcnNlciA9ICZpdGVyLT5wYXJzZXI7CiAJaWYgKHRyYWNlX3BhcnNlcl9sb2FkZWQocGFyc2VyKSkgewogCQlwYXJzZXItPmJ1ZmZlcltwYXJzZXItPmlkeF0gPSAwOwotCQlmdHJhY2VfbWF0Y2hfcmVjb3JkcyhwYXJzZXItPmJ1ZmZlciwgcGFyc2VyLT5pZHgsIGVuYWJsZSk7CisJCWZ0cmFjZV9tYXRjaF9yZWNvcmRzKGl0ZXItPmhhc2gsIHBhcnNlci0+YnVmZmVyLCBwYXJzZXItPmlkeCk7CiAJfQogCi0JbXV0ZXhfbG9jaygmZnRyYWNlX2xvY2spOwotCWlmIChmdHJhY2Vfc3RhcnRfdXAgJiYgZnRyYWNlX2VuYWJsZWQpCi0JCWZ0cmFjZV9ydW5fdXBkYXRlX2NvZGUoRlRSQUNFX0VOQUJMRV9DQUxMUyk7Ci0JbXV0ZXhfdW5sb2NrKCZmdHJhY2VfbG9jayk7Ci0KIAl0cmFjZV9wYXJzZXJfcHV0KHBhcnNlcik7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJZmlsdGVyX2hhc2ggPSAhIShpdGVyLT5mbGFncyAmIEZUUkFDRV9JVEVSX0ZJTFRFUik7CisKKwkJaWYgKGZpbHRlcl9oYXNoKQorCQkJb3JpZ19oYXNoID0gJml0ZXItPm9wcy0+ZmlsdGVyX2hhc2g7CisJCWVsc2UKKwkJCW9yaWdfaGFzaCA9ICZpdGVyLT5vcHMtPm5vdHJhY2VfaGFzaDsKKworCQltdXRleF9sb2NrKCZmdHJhY2VfbG9jayk7CisJCS8qCisJCSAqIFJlbW92ZSB0aGUgY3VycmVudCBzZXQsIHVwZGF0ZSB0aGUgaGFzaCBhbmQgYWRkCisJCSAqIHRoZW0gYmFjay4KKwkJICovCisJCWZ0cmFjZV9oYXNoX3JlY19kaXNhYmxlKGl0ZXItPm9wcywgZmlsdGVyX2hhc2gpOworCQlyZXQgPSBmdHJhY2VfaGFzaF9tb3ZlKG9yaWdfaGFzaCwgaXRlci0+aGFzaCk7CisJCWlmICghcmV0KSB7CisJCQlmdHJhY2VfaGFzaF9yZWNfZW5hYmxlKGl0ZXItPm9wcywgZmlsdGVyX2hhc2gpOworCQkJaWYgKGl0ZXItPm9wcy0+ZmxhZ3MgJiBGVFJBQ0VfT1BTX0ZMX0VOQUJMRUQKKwkJCSAgICAmJiBmdHJhY2VfZW5hYmxlZCkKKwkJCQlmdHJhY2VfcnVuX3VwZGF0ZV9jb2RlKEZUUkFDRV9FTkFCTEVfQ0FMTFMpOworCQl9CisJCW11dGV4X3VubG9jaygmZnRyYWNlX2xvY2spOworCX0KKwlmcmVlX2Z0cmFjZV9oYXNoKGl0ZXItPmhhc2gpOwogCWtmcmVlKGl0ZXIpOwogCiAJbXV0ZXhfdW5sb2NrKCZmdHJhY2VfcmVnZXhfbG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLWZ0cmFjZV9maWx0ZXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gZnRyYWNlX3JlZ2V4X3JlbGVhc2UoaW5vZGUsIGZpbGUsIDEpOwotfQotCi1zdGF0aWMgaW50Ci1mdHJhY2Vfbm90cmFjZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBmdHJhY2VfcmVnZXhfcmVsZWFzZShpbm9kZSwgZmlsZSwgMCk7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ0cmFjZV9hdmFpbF9mb3BzID0gewogCS5vcGVuID0gZnRyYWNlX2F2YWlsX29wZW4sCiAJLnJlYWQgPSBzZXFfcmVhZCwKQEAgLTI0NDQsOCArMzA2MCw4IEBACiAJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZV9wcml2YXRlLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZnRyYWNlX2ZhaWx1cmVzX2ZvcHMgPSB7Ci0JLm9wZW4gPSBmdHJhY2VfZmFpbHVyZXNfb3BlbiwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ0cmFjZV9lbmFibGVkX2ZvcHMgPSB7CisJLm9wZW4gPSBmdHJhY2VfZW5hYmxlZF9vcGVuLAogCS5yZWFkID0gc2VxX3JlYWQsCiAJLmxsc2VlayA9IHNlcV9sc2VlaywKIAkucmVsZWFzZSA9IHNlcV9yZWxlYXNlX3ByaXZhdGUsCkBAIC0yNDU2LDcgKzMwNzIsNyBAQAogCS5yZWFkID0gc2VxX3JlYWQsCiAJLndyaXRlID0gZnRyYWNlX2ZpbHRlcl93cml0ZSwKIAkubGxzZWVrID0gZnRyYWNlX3JlZ2V4X2xzZWVrLAotCS5yZWxlYXNlID0gZnRyYWNlX2ZpbHRlcl9yZWxlYXNlLAorCS5yZWxlYXNlID0gZnRyYWNlX3JlZ2V4X3JlbGVhc2UsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmdHJhY2Vfbm90cmFjZV9mb3BzID0gewpAQCAtMjQ2NCw3ICszMDgwLDcgQEAKIAkucmVhZCA9IHNlcV9yZWFkLAogCS53cml0ZSA9IGZ0cmFjZV9ub3RyYWNlX3dyaXRlLAogCS5sbHNlZWsgPSBmdHJhY2VfcmVnZXhfbHNlZWssCi0JLnJlbGVhc2UgPSBmdHJhY2Vfbm90cmFjZV9yZWxlYXNlLAorCS5yZWxlYXNlID0gZnRyYWNlX3JlZ2V4X3JlbGVhc2UsCiB9OwogCiAjaWZkZWYgQ09ORklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUgpAQCAtMjU3Myw5ICszMTg5LDYgQEAKIAlib29sIGV4aXN0czsKIAlpbnQgaTsKIAotCWlmIChmdHJhY2VfZGlzYWJsZWQpCi0JCXJldHVybiAtRU5PREVWOwotCiAJLyogZGVjb2RlIHJlZ2V4ICovCiAJdHlwZSA9IGZpbHRlcl9wYXJzZV9yZWdleChidWZmZXIsIHN0cmxlbihidWZmZXIpLCAmc2VhcmNoLCAmbm90KTsKIAlpZiAoIW5vdCAmJiAqaWR4ID49IEZUUkFDRV9HUkFQSF9NQVhfRlVOQ1MpCkBAIC0yNTg0LDEyICszMTk3LDE4IEBACiAJc2VhcmNoX2xlbiA9IHN0cmxlbihzZWFyY2gpOwogCiAJbXV0ZXhfbG9jaygmZnRyYWNlX2xvY2spOworCisJaWYgKHVubGlrZWx5KGZ0cmFjZV9kaXNhYmxlZCkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZmdHJhY2VfbG9jayk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwogCWRvX2Zvcl9lYWNoX2Z0cmFjZV9yZWMocGcsIHJlYykgewogCi0JCWlmIChyZWMtPmZsYWdzICYgKEZUUkFDRV9GTF9GQUlMRUQgfCBGVFJBQ0VfRkxfRlJFRSkpCisJCWlmIChyZWMtPmZsYWdzICYgRlRSQUNFX0ZMX0ZSRUUpCiAJCQljb250aW51ZTsKIAotCQlpZiAoZnRyYWNlX21hdGNoX3JlY29yZChyZWMsIHNlYXJjaCwgc2VhcmNoX2xlbiwgdHlwZSkpIHsKKwkJaWYgKGZ0cmFjZV9tYXRjaF9yZWNvcmQocmVjLCBOVUxMLCBzZWFyY2gsIHNlYXJjaF9sZW4sIHR5cGUpKSB7CiAJCQkvKiBpZiBpdCBpcyBpbiB0aGUgYXJyYXkgKi8KIAkJCWV4aXN0cyA9IGZhbHNlOwogCQkJZm9yIChpID0gMDsgaSA8ICppZHg7IGkrKykgewpAQCAtMjY3OSw4ICszMjk4LDggQEAKIAl0cmFjZV9jcmVhdGVfZmlsZSgiYXZhaWxhYmxlX2ZpbHRlcl9mdW5jdGlvbnMiLCAwNDQ0LAogCQkJZF90cmFjZXIsIE5VTEwsICZmdHJhY2VfYXZhaWxfZm9wcyk7CiAKLQl0cmFjZV9jcmVhdGVfZmlsZSgiZmFpbHVyZXMiLCAwNDQ0LAotCQkJZF90cmFjZXIsIE5VTEwsICZmdHJhY2VfZmFpbHVyZXNfZm9wcyk7CisJdHJhY2VfY3JlYXRlX2ZpbGUoImVuYWJsZWRfZnVuY3Rpb25zIiwgMDQ0NCwKKwkJCWRfdHJhY2VyLCBOVUxMLCAmZnRyYWNlX2VuYWJsZWRfZm9wcyk7CiAKIAl0cmFjZV9jcmVhdGVfZmlsZSgic2V0X2Z0cmFjZV9maWx0ZXIiLCAwNjQ0LCBkX3RyYWNlciwKIAkJCU5VTEwsICZmdHJhY2VfZmlsdGVyX2ZvcHMpOwpAQCAtMjcwMyw3ICszMzIyLDYgQEAKIHsKIAl1bnNpZ25lZCBsb25nICpwOwogCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJbXV0ZXhfbG9jaygmZnRyYWNlX2xvY2spOwogCXAgPSBzdGFydDsKQEAgLTI3MjAsMTAgKzMzMzgsNyBAQAogCQlmdHJhY2VfcmVjb3JkX2lwKGFkZHIpOwogCX0KIAotCS8qIGRpc2FibGUgaW50ZXJydXB0cyB0byBwcmV2ZW50IGtzdG9wIG1hY2hpbmUgKi8KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJZnRyYWNlX3VwZGF0ZV9jb2RlKG1vZCk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCW11dGV4X3VubG9jaygmZnRyYWNlX2xvY2spOwogCiAJcmV0dXJuIDA7CkBAIC0yNzM1LDEwICszMzUwLDExIEBACiAJc3RydWN0IGR5bl9mdHJhY2UgKnJlYzsKIAlzdHJ1Y3QgZnRyYWNlX3BhZ2UgKnBnOwogCi0JaWYgKGZ0cmFjZV9kaXNhYmxlZCkKLQkJcmV0dXJuOwotCiAJbXV0ZXhfbG9jaygmZnRyYWNlX2xvY2spOworCisJaWYgKGZ0cmFjZV9kaXNhYmxlZCkKKwkJZ290byBvdXRfdW5sb2NrOworCiAJZG9fZm9yX2VhY2hfZnRyYWNlX3JlYyhwZywgcmVjKSB7CiAJCWlmICh3aXRoaW5fbW9kdWxlX2NvcmUocmVjLT5pcCwgbW9kKSkgewogCQkJLyoKQEAgLTI3NDksNiArMzM2NSw3IEBACiAJCQlmdHJhY2VfZnJlZV9yZWMocmVjKTsKIAkJfQogCX0gd2hpbGVfZm9yX2VhY2hfZnRyYWNlX3JlYygpOworIG91dF91bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZmdHJhY2VfbG9jayk7CiB9CiAKQEAgLTI4MzUsNiArMzQ1MiwxMCBAQAogCiAjZWxzZQogCitzdGF0aWMgc3RydWN0IGZ0cmFjZV9vcHMgZ2xvYmFsX29wcyA9IHsKKwkuZnVuYwkJCT0gZnRyYWNlX3N0dWIsCit9OworCiBzdGF0aWMgaW50IF9faW5pdCBmdHJhY2Vfbm9keW5faW5pdCh2b2lkKQogewogCWZ0cmFjZV9lbmFibGVkID0gMTsKQEAgLTI4NDUsMTIgKzM0NjYsMzggQEAKIHN0YXRpYyBpbmxpbmUgaW50IGZ0cmFjZV9pbml0X2R5bl9kZWJ1Z2ZzKHN0cnVjdCBkZW50cnkgKmRfdHJhY2VyKSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgZnRyYWNlX3N0YXJ0dXBfZW5hYmxlKGludCBjb21tYW5kKSB7IH0KIC8qIEtlZXAgYXMgbWFjcm9zIHNvIHdlIGRvIG5vdCBuZWVkIHRvIGRlZmluZSB0aGUgY29tbWFuZHMgKi8KLSMgZGVmaW5lIGZ0cmFjZV9zdGFydHVwKGNvbW1hbmQpCWRvIHsgfSB3aGlsZSAoMCkKLSMgZGVmaW5lIGZ0cmFjZV9zaHV0ZG93bihjb21tYW5kKQlkbyB7IH0gd2hpbGUgKDApCisjIGRlZmluZSBmdHJhY2Vfc3RhcnR1cChvcHMsIGNvbW1hbmQpCWRvIHsgfSB3aGlsZSAoMCkKKyMgZGVmaW5lIGZ0cmFjZV9zaHV0ZG93bihvcHMsIGNvbW1hbmQpCWRvIHsgfSB3aGlsZSAoMCkKICMgZGVmaW5lIGZ0cmFjZV9zdGFydHVwX3N5c2N0bCgpCWRvIHsgfSB3aGlsZSAoMCkKICMgZGVmaW5lIGZ0cmFjZV9zaHV0ZG93bl9zeXNjdGwoKQlkbyB7IH0gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50CitmdHJhY2Vfb3BzX3Rlc3Qoc3RydWN0IGZ0cmFjZV9vcHMgKm9wcywgdW5zaWduZWQgbG9uZyBpcCkKK3sKKwlyZXR1cm4gMTsKK30KKwogI2VuZGlmIC8qIENPTkZJR19EWU5BTUlDX0ZUUkFDRSAqLwogCitzdGF0aWMgdm9pZAorZnRyYWNlX29wc19saXN0X2Z1bmModW5zaWduZWQgbG9uZyBpcCwgdW5zaWduZWQgbG9uZyBwYXJlbnRfaXApCit7CisJc3RydWN0IGZ0cmFjZV9vcHMgKm9wOworCisJLyoKKwkgKiBTb21lIG9mIHRoZSBvcHMgbWF5IGJlIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCwKKwkgKiB0aGV5IG11c3QgYmUgZnJlZWQgYWZ0ZXIgYSBzeW5jaHJvbml6ZV9zY2hlZCgpLgorCSAqLworCXByZWVtcHRfZGlzYWJsZV9ub3RyYWNlKCk7CisJb3AgPSByY3VfZGVyZWZlcmVuY2VfcmF3KGZ0cmFjZV9vcHNfbGlzdCk7CisJd2hpbGUgKG9wICE9ICZmdHJhY2VfbGlzdF9lbmQpIHsKKwkJaWYgKGZ0cmFjZV9vcHNfdGVzdChvcCwgaXApKQorCQkJb3AtPmZ1bmMoaXAsIHBhcmVudF9pcCk7CisJCW9wID0gcmN1X2RlcmVmZXJlbmNlX3JhdyhvcC0+bmV4dCk7CisJfTsKKwlwcmVlbXB0X2VuYWJsZV9ub3RyYWNlKCk7Cit9CisKIHN0YXRpYyB2b2lkIGNsZWFyX2Z0cmFjZV9zd2FwcGVyKHZvaWQpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwOwpAQCAtMzE0MywxOSArMzc5MCwyMyBAQAogICovCiBpbnQgcmVnaXN0ZXJfZnRyYWNlX2Z1bmN0aW9uKHN0cnVjdCBmdHJhY2Vfb3BzICpvcHMpCiB7Ci0JaW50IHJldDsKLQotCWlmICh1bmxpa2VseShmdHJhY2VfZGlzYWJsZWQpKQotCQlyZXR1cm4gLTE7CisJaW50IHJldCA9IC0xOwogCiAJbXV0ZXhfbG9jaygmZnRyYWNlX2xvY2spOwogCi0JcmV0ID0gX19yZWdpc3Rlcl9mdHJhY2VfZnVuY3Rpb24ob3BzKTsKLQlmdHJhY2Vfc3RhcnR1cCgwKTsKKwlpZiAodW5saWtlbHkoZnRyYWNlX2Rpc2FibGVkKSkKKwkJZ290byBvdXRfdW5sb2NrOwogCisJcmV0ID0gX19yZWdpc3Rlcl9mdHJhY2VfZnVuY3Rpb24ob3BzKTsKKwlpZiAoIXJldCkKKwkJZnRyYWNlX3N0YXJ0dXAob3BzLCAwKTsKKworCisgb3V0X3VubG9jazoKIAltdXRleF91bmxvY2soJmZ0cmFjZV9sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQorRVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfZnRyYWNlX2Z1bmN0aW9uKTsKIAogLyoqCiAgKiB1bnJlZ2lzdGVyX2Z0cmFjZV9mdW5jdGlvbiAtIHVucmVnaXN0ZXIgYSBmdW5jdGlvbiBmb3IgcHJvZmlsaW5nLgpAQCAtMzE2OSwyNSArMzgyMCwyNyBAQAogCiAJbXV0ZXhfbG9jaygmZnRyYWNlX2xvY2spOwogCXJldCA9IF9fdW5yZWdpc3Rlcl9mdHJhY2VfZnVuY3Rpb24ob3BzKTsKLQlmdHJhY2Vfc2h1dGRvd24oMCk7CisJaWYgKCFyZXQpCisJCWZ0cmFjZV9zaHV0ZG93bihvcHMsIDApOwogCW11dGV4X3VubG9jaygmZnRyYWNlX2xvY2spOwogCiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHVucmVnaXN0ZXJfZnRyYWNlX2Z1bmN0aW9uKTsKIAogaW50CiBmdHJhY2VfZW5hYmxlX3N5c2N0bChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCQkgICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKIAkJICAgICBsb2ZmX3QgKnBwb3MpCiB7Ci0JaW50IHJldDsKLQotCWlmICh1bmxpa2VseShmdHJhY2VfZGlzYWJsZWQpKQotCQlyZXR1cm4gLUVOT0RFVjsKKwlpbnQgcmV0ID0gLUVOT0RFVjsKIAogCW11dGV4X2xvY2soJmZ0cmFjZV9sb2NrKTsKIAotCXJldCAgPSBwcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlpZiAodW5saWtlbHkoZnRyYWNlX2Rpc2FibGVkKSkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBwcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKIAogCWlmIChyZXQgfHwgIXdyaXRlIHx8IChsYXN0X2Z0cmFjZV9lbmFibGVkID09ICEhZnRyYWNlX2VuYWJsZWQpKQogCQlnb3RvIG91dDsKQEAgLTMxOTksMTEgKzM4NTIsMTEgQEAKIAkJZnRyYWNlX3N0YXJ0dXBfc3lzY3RsKCk7CiAKIAkJLyogd2UgYXJlIHN0YXJ0aW5nIGZ0cmFjZSBhZ2FpbiAqLwotCQlpZiAoZnRyYWNlX2xpc3QgIT0gJmZ0cmFjZV9saXN0X2VuZCkgewotCQkJaWYgKGZ0cmFjZV9saXN0LT5uZXh0ID09ICZmdHJhY2VfbGlzdF9lbmQpCi0JCQkJZnRyYWNlX3RyYWNlX2Z1bmN0aW9uID0gZnRyYWNlX2xpc3QtPmZ1bmM7CisJCWlmIChmdHJhY2Vfb3BzX2xpc3QgIT0gJmZ0cmFjZV9saXN0X2VuZCkgeworCQkJaWYgKGZ0cmFjZV9vcHNfbGlzdC0+bmV4dCA9PSAmZnRyYWNlX2xpc3RfZW5kKQorCQkJCWZ0cmFjZV90cmFjZV9mdW5jdGlvbiA9IGZ0cmFjZV9vcHNfbGlzdC0+ZnVuYzsKIAkJCWVsc2UKLQkJCQlmdHJhY2VfdHJhY2VfZnVuY3Rpb24gPSBmdHJhY2VfbGlzdF9mdW5jOworCQkJCWZ0cmFjZV90cmFjZV9mdW5jdGlvbiA9IGZ0cmFjZV9vcHNfbGlzdF9mdW5jOwogCQl9CiAKIAl9IGVsc2UgewpAQCAtMzM5Miw3ICs0MDQ1LDcgQEAKIAlmdHJhY2VfZ3JhcGhfcmV0dXJuID0gcmV0ZnVuYzsKIAlmdHJhY2VfZ3JhcGhfZW50cnkgPSBlbnRyeWZ1bmM7CiAKLQlmdHJhY2Vfc3RhcnR1cChGVFJBQ0VfU1RBUlRfRlVOQ19SRVQpOworCWZ0cmFjZV9zdGFydHVwKCZnbG9iYWxfb3BzLCBGVFJBQ0VfU1RBUlRfRlVOQ19SRVQpOwogCiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZmdHJhY2VfbG9jayk7CkBAIC0zNDA5LDcgKzQwNjIsNyBAQAogCWZ0cmFjZV9ncmFwaF9hY3RpdmUtLTsKIAlmdHJhY2VfZ3JhcGhfcmV0dXJuID0gKHRyYWNlX2Z1bmNfZ3JhcGhfcmV0X3QpZnRyYWNlX3N0dWI7CiAJZnRyYWNlX2dyYXBoX2VudHJ5ID0gZnRyYWNlX2dyYXBoX2VudHJ5X3N0dWI7Ci0JZnRyYWNlX3NodXRkb3duKEZUUkFDRV9TVE9QX0ZVTkNfUkVUKTsKKwlmdHJhY2Vfc2h1dGRvd24oJmdsb2JhbF9vcHMsIEZUUkFDRV9TVE9QX0ZVTkNfUkVUKTsKIAl1bnJlZ2lzdGVyX3BtX25vdGlmaWVyKCZmdHJhY2Vfc3VzcGVuZF9ub3RpZmllcik7CiAJdW5yZWdpc3Rlcl90cmFjZV9zY2hlZF9zd2l0Y2goZnRyYWNlX2dyYXBoX3Byb2JlX3NjaGVkX3N3aXRjaCwgTlVMTCk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZS5jIGIva2VybmVsL3RyYWNlL3RyYWNlLmMKaW5kZXggMWNiNDliZS4uZWU5YzkyMSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlLmMKQEAgLTIwMTQsOSArMjAxNCwxMCBAQAogewogCWVudW0gcHJpbnRfbGluZV90IHJldDsKIAotCWlmIChpdGVyLT5sb3N0X2V2ZW50cykKLQkJdHJhY2Vfc2VxX3ByaW50ZigmaXRlci0+c2VxLCAiQ1BVOiVkIFtMT1NUICVsdSBFVkVOVFNdXG4iLAotCQkJCSBpdGVyLT5jcHUsIGl0ZXItPmxvc3RfZXZlbnRzKTsKKwlpZiAoaXRlci0+bG9zdF9ldmVudHMgJiYKKwkgICAgIXRyYWNlX3NlcV9wcmludGYoJml0ZXItPnNlcSwgIkNQVTolZCBbTE9TVCAlbHUgRVZFTlRTXVxuIiwKKwkJCQkgaXRlci0+Y3B1LCBpdGVyLT5sb3N0X2V2ZW50cykpCisJCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsKIAogCWlmIChpdGVyLT50cmFjZSAmJiBpdGVyLT50cmFjZS0+cHJpbnRfbGluZSkgewogCQlyZXQgPSBpdGVyLT50cmFjZS0+cHJpbnRfbGluZShpdGVyKTsKQEAgLTMyMzAsNiArMzIzMSwxNCBAQAogCiAJCWlmIChpdGVyLT5zZXEubGVuID49IGNudCkKIAkJCWJyZWFrOworCisJCS8qCisJCSAqIFNldHRpbmcgdGhlIGZ1bGwgZmxhZyBtZWFucyB3ZSByZWFjaGVkIHRoZSB0cmFjZV9zZXEgYnVmZmVyCisJCSAqIHNpemUgYW5kIHdlIHNob3VsZCBsZWF2ZSBieSBwYXJ0aWFsIG91dHB1dCBjb25kaXRpb24gYWJvdmUuCisJCSAqIE9uZSBvZiB0aGUgdHJhY2Vfc2VxXyogZnVuY3Rpb25zIGlzIG5vdCB1c2VkIHByb3Blcmx5LgorCQkgKi8KKwkJV0FSTl9PTkNFKGl0ZXItPnNlcS5mdWxsLCAiZnVsbCBmbGFnIHNldCBmb3IgdHJhY2UgdHlwZSAlZCIsCisJCQkgIGl0ZXItPmVudC0+dHlwZSk7CiAJfQogCXRyYWNlX2FjY2Vzc191bmxvY2soaXRlci0+Y3B1X2ZpbGUpOwogCXRyYWNlX2V2ZW50X3JlYWRfdW5sb2NrKCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2UuaCBiL2tlcm5lbC90cmFjZS90cmFjZS5oCmluZGV4IDVlOWRmYzYuLjZiNjljNGIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZS5oCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZS5oCkBAIC00MTksNiArNDE5LDggQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGZ0cmFjZV91cGRhdGVfdG90X2NudDsKICNkZWZpbmUgRFlOX0ZUUkFDRV9URVNUX05BTUUgdHJhY2Vfc2VsZnRlc3RfZHluYW1pY190ZXN0X2Z1bmMKIGV4dGVybiBpbnQgRFlOX0ZUUkFDRV9URVNUX05BTUUodm9pZCk7CisjZGVmaW5lIERZTl9GVFJBQ0VfVEVTVF9OQU1FMiB0cmFjZV9zZWxmdGVzdF9keW5hbWljX3Rlc3RfZnVuYzIKK2V4dGVybiBpbnQgRFlOX0ZUUkFDRV9URVNUX05BTUUyKHZvaWQpOwogI2VuZGlmCiAKIGV4dGVybiBpbnQgcmluZ19idWZmZXJfZXhwYW5kZWQ7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfZnVuY3Rpb25zLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZnVuY3Rpb25zLmMKaW5kZXggMTZhZWU0ZC4uOGQwZTFjYyAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2Z1bmN0aW9ucy5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9mdW5jdGlvbnMuYwpAQCAtMTQ5LDExICsxNDksMTMgQEAKIHN0YXRpYyBzdHJ1Y3QgZnRyYWNlX29wcyB0cmFjZV9vcHMgX19yZWFkX21vc3RseSA9CiB7CiAJLmZ1bmMgPSBmdW5jdGlvbl90cmFjZV9jYWxsLAorCS5mbGFncyA9IEZUUkFDRV9PUFNfRkxfR0xPQkFMLAogfTsKIAogc3RhdGljIHN0cnVjdCBmdHJhY2Vfb3BzIHRyYWNlX3N0YWNrX29wcyBfX3JlYWRfbW9zdGx5ID0KIHsKIAkuZnVuYyA9IGZ1bmN0aW9uX3N0YWNrX3RyYWNlX2NhbGwsCisJLmZsYWdzID0gRlRSQUNFX09QU19GTF9HTE9CQUwsCiB9OwogCiAvKiBPdXIgdHdvIG9wdGlvbnMgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9pcnFzb2ZmLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfaXJxc29mZi5jCmluZGV4IGE0OTY5YjQuLmM3NzQyNGIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9pcnFzb2ZmLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2lycXNvZmYuYwpAQCAtMTUzLDYgKzE1Myw3IEBACiBzdGF0aWMgc3RydWN0IGZ0cmFjZV9vcHMgdHJhY2Vfb3BzIF9fcmVhZF9tb3N0bHkgPQogewogCS5mdW5jID0gaXJxc29mZl90cmFjZXJfY2FsbCwKKwkuZmxhZ3MgPSBGVFJBQ0VfT1BTX0ZMX0dMT0JBTCwKIH07CiAjZW5kaWYgLyogQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiAqLwogCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2Vfa3Byb2JlLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfa3Byb2JlLmMKaW5kZXggMzVkNTVhMy4uZjkyNWM0NSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2twcm9iZS5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9rcHJvYmUuYwpAQCAtNTMsNyArNTMsNiBAQAogCSJjb21tb25fcHJlZW1wdF9jb3VudCIsCiAJImNvbW1vbl9waWQiLAogCSJjb21tb25fdGdpZCIsCi0JImNvbW1vbl9sb2NrX2RlcHRoIiwKIAlGSUVMRF9TVFJJTkdfSVAsCiAJRklFTERfU1RSSU5HX1JFVElQLAogCUZJRUxEX1NUUklOR19GVU5DLApkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX291dHB1dC5jIGIva2VybmVsL3RyYWNlL3RyYWNlX291dHB1dC5jCmluZGV4IDQ1NmJlOTAuLmNmNTM1Y2MgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9vdXRwdXQuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfb3V0cHV0LmMKQEAgLTgzMCw2ICs4MzAsOSBAQAogZW51bSBwcmludF9saW5lX3QgdHJhY2Vfbm9wX3ByaW50KHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlciwgaW50IGZsYWdzLAogCQkJCSAgc3RydWN0IHRyYWNlX2V2ZW50ICpldmVudCkKIHsKKwlpZiAoIXRyYWNlX3NlcV9wcmludGYoJml0ZXItPnNlcSwgInR5cGU6ICVkXG4iLCBpdGVyLT5lbnQtPnR5cGUpKQorCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7CisKIAlyZXR1cm4gVFJBQ0VfVFlQRV9IQU5ETEVEOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfcHJpbnRrLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfcHJpbnRrLmMKaW5kZXggMjU0N2Q4OC4uZGZmNzYzYiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3ByaW50ay5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9wcmludGsuYwpAQCAtMzIsNyArMzIsNyBAQAogCiBzdHJ1Y3QgdHJhY2VfYnByaW50a19mbXQgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQljaGFyIGZtdFswXTsKKwljb25zdCBjaGFyICpmbXQ7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB0cmFjZV9icHJpbnRrX2ZtdCAqbG9va3VwX2Zvcm1hdChjb25zdCBjaGFyICpmbXQpCkBAIC00OSw2ICs0OSw3IEBACiB2b2lkIGhvbGRfbW9kdWxlX3RyYWNlX2JwcmludGtfZm9ybWF0KGNvbnN0IGNoYXIgKipzdGFydCwgY29uc3QgY2hhciAqKmVuZCkKIHsKIAljb25zdCBjaGFyICoqaXRlcjsKKwljaGFyICpmbXQ7CiAKIAltdXRleF9sb2NrKCZidHJhY2VfbXV0ZXgpOwogCWZvciAoaXRlciA9IHN0YXJ0OyBpdGVyIDwgZW5kOyBpdGVyKyspIHsKQEAgLTU4LDE0ICs1OSwxOCBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQl0Yl9mbXQgPSBrbWFsbG9jKG9mZnNldG9mKHN0cnVjdCB0cmFjZV9icHJpbnRrX2ZtdCwgZm10KQotCQkJCSsgc3RybGVuKCppdGVyKSArIDEsIEdGUF9LRVJORUwpOwotCQlpZiAodGJfZm10KSB7CisJCXRiX2ZtdCA9IGttYWxsb2Moc2l6ZW9mKCp0Yl9mbXQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHRiX2ZtdCkKKwkJCWZtdCA9IGttYWxsb2Moc3RybGVuKCppdGVyKSArIDEsIEdGUF9LRVJORUwpOworCQlpZiAodGJfZm10ICYmIGZtdCkgewogCQkJbGlzdF9hZGRfdGFpbCgmdGJfZm10LT5saXN0LCAmdHJhY2VfYnByaW50a19mbXRfbGlzdCk7Ci0JCQlzdHJjcHkodGJfZm10LT5mbXQsICppdGVyKTsKKwkJCXN0cmNweShmbXQsICppdGVyKTsKKwkJCXRiX2ZtdC0+Zm10ID0gZm10OwogCQkJKml0ZXIgPSB0Yl9mbXQtPmZtdDsKLQkJfSBlbHNlCisJCX0gZWxzZSB7CisJCQlrZnJlZSh0Yl9mbXQpOwogCQkJKml0ZXIgPSBOVUxMOworCQl9CiAJfQogCW11dGV4X3VubG9jaygmYnRyYWNlX211dGV4KTsKIH0KQEAgLTg0LDYgKzg5LDc2IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBUaGUgZGVidWdmcy90cmFjaW5nL3ByaW50a19mb3JtYXRzIGZpbGUgbWFwcyB0aGUgYWRkcmVzc2VzIHdpdGgKKyAqIHRoZSBBU0NJSSBmb3JtYXRzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIGJwcmludGsgZXZlbnRzIGluIHRoZQorICogYnVmZmVyLiBGb3IgdXNlcnNwYWNlIHRvb2xzIHRvIGJlIGFibGUgdG8gZGVjb2RlIHRoZSBldmVudHMgZnJvbQorICogdGhlIGJ1ZmZlciwgdGhleSBuZWVkIHRvIGJlIGFibGUgdG8gbWFwIHRoZSBhZGRyZXNzIHdpdGggdGhlIGZvcm1hdC4KKyAqCisgKiBUaGUgYWRkcmVzc2VzIG9mIHRoZSBicHJpbnRrIGZvcm1hdHMgYXJlIGluIHRoZWlyIG93biBzZWN0aW9uCisgKiBfX3RyYWNlX3ByaW50a19mbXQuIEJ1dCBmb3IgbW9kdWxlcyB3ZSBjb3B5IHRoZW0gaW50byBhIGxpbmsgbGlzdC4KKyAqIFRoZSBjb2RlIHRvIHByaW50IHRoZSBmb3JtYXRzIGFuZCB0aGVpciBhZGRyZXNzZXMgcGFzc2VzIGFyb3VuZCB0aGUKKyAqIGFkZHJlc3Mgb2YgdGhlIGZtdCBzdHJpbmcuIElmIHRoZSBmbXQgYWRkcmVzcyBwYXNzZWQgaW50byB0aGUgc2VxCisgKiBmdW5jdGlvbnMgaXMgd2l0aGluIHRoZSBrZXJuZWwgY29yZSBfX3RyYWNlX3ByaW50a19mbXQgc2VjdGlvbiwgdGhlbgorICogaXQgc2ltcGx5IHVzZXMgdGhlIG5leHQgcG9pbnRlciBpbiB0aGUgbGlzdC4KKyAqCisgKiBXaGVuIHRoZSBmbXQgcG9pbnRlciBpcyBvdXRzaWRlIHRoZSBrZXJuZWwgY29yZSBfX3RyYWNlX3ByaW50a19mbXQKKyAqIHNlY3Rpb24sIHRoZW4gd2UgbmVlZCB0byByZWFkIHRoZSBsaW5rIGxpc3QgcG9pbnRlcnMuIFRoZSB0cmljayBpcworICogd2UgcGFzcyB0aGUgYWRkcmVzcyBvZiB0aGUgc3RyaW5nIHRvIHRoZSBzZXEgZnVuY3Rpb24ganVzdCBsaWtlCisgKiB3ZSBkbyBmb3IgdGhlIGtlcm5lbCBjb3JlIGZvcm1hdHMuIFRvIGdldCBiYWNrIHRoZSBzdHJ1Y3R1cmUgdGhhdAorICogaG9sZHMgdGhlIGZvcm1hdCwgd2Ugc2ltcGx5IHVzZSBjb250YWluZXJvZigpIGFuZCB0aGVuIGdvIHRvIHRoZQorICogbmV4dCBmb3JtYXQgaW4gdGhlIGxpc3QuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoqCitmaW5kX25leHRfbW9kX2Zvcm1hdChpbnQgc3RhcnRfaW5kZXgsIHZvaWQgKnYsIGNvbnN0IGNoYXIgKipmbXQsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCB0cmFjZV9icHJpbnRrX2ZtdCAqbW9kX2ZtdDsKKworCWlmIChsaXN0X2VtcHR5KCZ0cmFjZV9icHJpbnRrX2ZtdF9saXN0KSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqIHYgd2lsbCBwb2ludCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgZm10IHJlY29yZCBmcm9tIHRfbmV4dAorCSAqIHYgd2lsbCBiZSBOVUxMIGZyb20gdF9zdGFydC4KKwkgKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBwb2ludGVyIG9yIGNhbGxlZCBmcm9tIHN0YXJ0CisJICogdGhlbiB3ZSBuZWVkIHRvIHdhbGsgdGhlIGxpc3QuCisJICovCisJaWYgKCF2IHx8IHN0YXJ0X2luZGV4ID09ICpwb3MpIHsKKwkJc3RydWN0IHRyYWNlX2JwcmludGtfZm10ICpwOworCisJCS8qIHNlYXJjaCB0aGUgbW9kdWxlIGxpc3QgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmdHJhY2VfYnByaW50a19mbXRfbGlzdCwgbGlzdCkgeworCQkJaWYgKHN0YXJ0X2luZGV4ID09ICpwb3MpCisJCQkJcmV0dXJuICZwLT5mbXQ7CisJCQlzdGFydF9pbmRleCsrOworCQl9CisJCS8qIHBvcyA+IGluZGV4ICovCisJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogdiBwb2ludHMgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGZtdCBmaWVsZCBpbiB0aGUgbW9kIGxpc3QKKwkgKiBzdHJ1Y3R1cmUgdGhhdCBob2xkcyB0aGUgbW9kdWxlIHByaW50IGZvcm1hdC4KKwkgKi8KKwltb2RfZm10ID0gY29udGFpbmVyX29mKHYsIHR5cGVvZigqbW9kX2ZtdCksIGZtdCk7CisJaWYgKG1vZF9mbXQtPmxpc3QubmV4dCA9PSAmdHJhY2VfYnByaW50a19mbXRfbGlzdCkKKwkJcmV0dXJuIE5VTEw7CisKKwltb2RfZm10ID0gY29udGFpbmVyX29mKG1vZF9mbXQtPmxpc3QubmV4dCwgdHlwZW9mKCptb2RfZm10KSwgbGlzdCk7CisKKwlyZXR1cm4gJm1vZF9mbXQtPmZtdDsKK30KKworc3RhdGljIHZvaWQgZm9ybWF0X21vZF9zdGFydCh2b2lkKQoreworCW11dGV4X2xvY2soJmJ0cmFjZV9tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIGZvcm1hdF9tb2Rfc3RvcCh2b2lkKQoreworCW11dGV4X3VubG9jaygmYnRyYWNlX211dGV4KTsKK30KKwogI2Vsc2UgLyogIUNPTkZJR19NT0RVTEVTICovCiBfX2luaXQgc3RhdGljIGludAogbW9kdWxlX3RyYWNlX2JwcmludGtfZm9ybWF0X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCkBAIC05MSw2ICsxNjYsMTMgQEAKIHsKIAlyZXR1cm4gMDsKIH0KK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqKgorZmluZF9uZXh0X21vZF9mb3JtYXQoaW50IHN0YXJ0X2luZGV4LCB2b2lkICp2LCBjb25zdCBjaGFyICoqZm10LCBsb2ZmX3QgKnBvcykKK3sKKwlyZXR1cm4gTlVMTDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBmb3JtYXRfbW9kX3N0YXJ0KHZvaWQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIGZvcm1hdF9tb2Rfc3RvcCh2b2lkKSB7IH0KICNlbmRpZiAvKiBDT05GSUdfTU9EVUxFUyAqLwogCiAKQEAgLTE1MywyMCArMjM1LDMzIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChfX2Z0cmFjZV92cHJpbnRrKTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKipmaW5kX25leHQodm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJY29uc3QgY2hhciAqKmZtdCA9IHY7CisJaW50IHN0YXJ0X2luZGV4OworCisJaWYgKCFmbXQpCisJCWZtdCA9IF9fc3RhcnRfX190cmFjZV9icHJpbnRrX2ZtdCArICpwb3M7CisKKwlzdGFydF9pbmRleCA9IF9fc3RvcF9fX3RyYWNlX2JwcmludGtfZm10IC0gX19zdGFydF9fX3RyYWNlX2JwcmludGtfZm10OworCisJaWYgKCpwb3MgPCBzdGFydF9pbmRleCkKKwkJcmV0dXJuIGZtdDsKKworCXJldHVybiBmaW5kX25leHRfbW9kX2Zvcm1hdChzdGFydF9pbmRleCwgdiwgZm10LCBwb3MpOworfQorCiBzdGF0aWMgdm9pZCAqCiB0X3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCiB7Ci0JY29uc3QgY2hhciAqKmZtdCA9IF9fc3RhcnRfX190cmFjZV9icHJpbnRrX2ZtdCArICpwb3M7Ci0KLQlpZiAoKHVuc2lnbmVkIGxvbmcpZm10ID49ICh1bnNpZ25lZCBsb25nKV9fc3RvcF9fX3RyYWNlX2JwcmludGtfZm10KQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gZm10OworCWZvcm1hdF9tb2Rfc3RhcnQoKTsKKwlyZXR1cm4gZmluZF9uZXh0KE5VTEwsIHBvcyk7CiB9CiAKIHN0YXRpYyB2b2lkICp0X25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICogdiwgbG9mZl90ICpwb3MpCiB7CiAJKCpwb3MpKys7Ci0JcmV0dXJuIHRfc3RhcnQobSwgcG9zKTsKKwlyZXR1cm4gZmluZF9uZXh0KHYsIHBvcyk7CiB9CiAKIHN0YXRpYyBpbnQgdF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKQEAgLTIwNSw2ICszMDAsNyBAQAogCiBzdGF0aWMgdm9pZCB0X3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQogeworCWZvcm1hdF9tb2Rfc3RvcCgpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIHNob3dfZm9ybWF0X3NlcV9vcHMgPSB7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc2NoZWRfd2FrZXVwLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc2NoZWRfd2FrZXVwLmMKaW5kZXggNzMxOTU1OS4uZjAyOWRkNCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3NjaGVkX3dha2V1cC5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9zY2hlZF93YWtldXAuYwpAQCAtMTI5LDYgKzEyOSw3IEBACiBzdGF0aWMgc3RydWN0IGZ0cmFjZV9vcHMgdHJhY2Vfb3BzIF9fcmVhZF9tb3N0bHkgPQogewogCS5mdW5jID0gd2FrZXVwX3RyYWNlcl9jYWxsLAorCS5mbGFncyA9IEZUUkFDRV9PUFNfRkxfR0xPQkFMLAogfTsKICNlbmRpZiAvKiBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSICovCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9zZWxmdGVzdC5jIGIva2VybmVsL3RyYWNlL3RyYWNlX3NlbGZ0ZXN0LmMKaW5kZXggNjU5NzMyZS4uMjg4NTQxZiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3NlbGZ0ZXN0LmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX3NlbGZ0ZXN0LmMKQEAgLTEwMSw2ICsxMDEsMjA2IEBACiAKICNpZmRlZiBDT05GSUdfRFlOQU1JQ19GVFJBQ0UKIAorc3RhdGljIGludCB0cmFjZV9zZWxmdGVzdF90ZXN0X3Byb2JlMV9jbnQ7CitzdGF0aWMgdm9pZCB0cmFjZV9zZWxmdGVzdF90ZXN0X3Byb2JlMV9mdW5jKHVuc2lnbmVkIGxvbmcgaXAsCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIHBpcCkKK3sKKwl0cmFjZV9zZWxmdGVzdF90ZXN0X3Byb2JlMV9jbnQrKzsKK30KKworc3RhdGljIGludCB0cmFjZV9zZWxmdGVzdF90ZXN0X3Byb2JlMl9jbnQ7CitzdGF0aWMgdm9pZCB0cmFjZV9zZWxmdGVzdF90ZXN0X3Byb2JlMl9mdW5jKHVuc2lnbmVkIGxvbmcgaXAsCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIHBpcCkKK3sKKwl0cmFjZV9zZWxmdGVzdF90ZXN0X3Byb2JlMl9jbnQrKzsKK30KKworc3RhdGljIGludCB0cmFjZV9zZWxmdGVzdF90ZXN0X3Byb2JlM19jbnQ7CitzdGF0aWMgdm9pZCB0cmFjZV9zZWxmdGVzdF90ZXN0X3Byb2JlM19mdW5jKHVuc2lnbmVkIGxvbmcgaXAsCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIHBpcCkKK3sKKwl0cmFjZV9zZWxmdGVzdF90ZXN0X3Byb2JlM19jbnQrKzsKK30KKworc3RhdGljIGludCB0cmFjZV9zZWxmdGVzdF90ZXN0X2dsb2JhbF9jbnQ7CitzdGF0aWMgdm9pZCB0cmFjZV9zZWxmdGVzdF90ZXN0X2dsb2JhbF9mdW5jKHVuc2lnbmVkIGxvbmcgaXAsCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIHBpcCkKK3sKKwl0cmFjZV9zZWxmdGVzdF90ZXN0X2dsb2JhbF9jbnQrKzsKK30KKworc3RhdGljIGludCB0cmFjZV9zZWxmdGVzdF90ZXN0X2R5bl9jbnQ7CitzdGF0aWMgdm9pZCB0cmFjZV9zZWxmdGVzdF90ZXN0X2R5bl9mdW5jKHVuc2lnbmVkIGxvbmcgaXAsCisJCQkJCSB1bnNpZ25lZCBsb25nIHBpcCkKK3sKKwl0cmFjZV9zZWxmdGVzdF90ZXN0X2R5bl9jbnQrKzsKK30KKworc3RhdGljIHN0cnVjdCBmdHJhY2Vfb3BzIHRlc3RfcHJvYmUxID0geworCS5mdW5jCQkJPSB0cmFjZV9zZWxmdGVzdF90ZXN0X3Byb2JlMV9mdW5jLAorfTsKKworc3RhdGljIHN0cnVjdCBmdHJhY2Vfb3BzIHRlc3RfcHJvYmUyID0geworCS5mdW5jCQkJPSB0cmFjZV9zZWxmdGVzdF90ZXN0X3Byb2JlMl9mdW5jLAorfTsKKworc3RhdGljIHN0cnVjdCBmdHJhY2Vfb3BzIHRlc3RfcHJvYmUzID0geworCS5mdW5jCQkJPSB0cmFjZV9zZWxmdGVzdF90ZXN0X3Byb2JlM19mdW5jLAorfTsKKworc3RhdGljIHN0cnVjdCBmdHJhY2Vfb3BzIHRlc3RfZ2xvYmFsID0geworCS5mdW5jCQkJPSB0cmFjZV9zZWxmdGVzdF90ZXN0X2dsb2JhbF9mdW5jLAorCS5mbGFncwkJCT0gRlRSQUNFX09QU19GTF9HTE9CQUwsCit9OworCitzdGF0aWMgdm9pZCBwcmludF9jb3VudHModm9pZCkKK3sKKwlwcmludGsoIiglZCAlZCAlZCAlZCAlZCkgIiwKKwkgICAgICAgdHJhY2Vfc2VsZnRlc3RfdGVzdF9wcm9iZTFfY250LAorCSAgICAgICB0cmFjZV9zZWxmdGVzdF90ZXN0X3Byb2JlMl9jbnQsCisJICAgICAgIHRyYWNlX3NlbGZ0ZXN0X3Rlc3RfcHJvYmUzX2NudCwKKwkgICAgICAgdHJhY2Vfc2VsZnRlc3RfdGVzdF9nbG9iYWxfY250LAorCSAgICAgICB0cmFjZV9zZWxmdGVzdF90ZXN0X2R5bl9jbnQpOworfQorCitzdGF0aWMgdm9pZCByZXNldF9jb3VudHModm9pZCkKK3sKKwl0cmFjZV9zZWxmdGVzdF90ZXN0X3Byb2JlMV9jbnQgPSAwOworCXRyYWNlX3NlbGZ0ZXN0X3Rlc3RfcHJvYmUyX2NudCA9IDA7CisJdHJhY2Vfc2VsZnRlc3RfdGVzdF9wcm9iZTNfY250ID0gMDsKKwl0cmFjZV9zZWxmdGVzdF90ZXN0X2dsb2JhbF9jbnQgPSAwOworCXRyYWNlX3NlbGZ0ZXN0X3Rlc3RfZHluX2NudCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgdHJhY2Vfc2VsZnRlc3Rfb3BzKGludCBjbnQpCit7CisJaW50IHNhdmVfZnRyYWNlX2VuYWJsZWQgPSBmdHJhY2VfZW5hYmxlZDsKKwlzdHJ1Y3QgZnRyYWNlX29wcyAqZHluX29wczsKKwljaGFyICpmdW5jMV9uYW1lOworCWNoYXIgKmZ1bmMyX25hbWU7CisJaW50IGxlbjE7CisJaW50IGxlbjI7CisJaW50IHJldCA9IC0xOworCisJcHJpbnRrKEtFUk5fQ09OVCAiUEFTU0VEXG4iKTsKKwlwcl9pbmZvKCJUZXN0aW5nIGR5bmFtaWMgZnRyYWNlIG9wcyAjJWQ6ICIsIGNudCk7CisKKwlmdHJhY2VfZW5hYmxlZCA9IDE7CisJcmVzZXRfY291bnRzKCk7CisKKwkvKiBIYW5kbGUgUFBDNjQgJy4nIG5hbWUgKi8KKwlmdW5jMV9uYW1lID0gIioiIF9fc3RyaW5naWZ5KERZTl9GVFJBQ0VfVEVTVF9OQU1FKTsKKwlmdW5jMl9uYW1lID0gIioiIF9fc3RyaW5naWZ5KERZTl9GVFJBQ0VfVEVTVF9OQU1FMik7CisJbGVuMSA9IHN0cmxlbihmdW5jMV9uYW1lKTsKKwlsZW4yID0gc3RybGVuKGZ1bmMyX25hbWUpOworCisJLyoKKwkgKiBQcm9iZSAxIHdpbGwgdHJhY2UgZnVuY3Rpb24gMS4KKwkgKiBQcm9iZSAyIHdpbGwgdHJhY2UgZnVuY3Rpb24gMi4KKwkgKiBQcm9iZSAzIHdpbGwgdHJhY2UgZnVuY3Rpb25zIDEgYW5kIDIuCisJICovCisJZnRyYWNlX3NldF9maWx0ZXIoJnRlc3RfcHJvYmUxLCBmdW5jMV9uYW1lLCBsZW4xLCAxKTsKKwlmdHJhY2Vfc2V0X2ZpbHRlcigmdGVzdF9wcm9iZTIsIGZ1bmMyX25hbWUsIGxlbjIsIDEpOworCWZ0cmFjZV9zZXRfZmlsdGVyKCZ0ZXN0X3Byb2JlMywgZnVuYzFfbmFtZSwgbGVuMSwgMSk7CisJZnRyYWNlX3NldF9maWx0ZXIoJnRlc3RfcHJvYmUzLCBmdW5jMl9uYW1lLCBsZW4yLCAwKTsKKworCXJlZ2lzdGVyX2Z0cmFjZV9mdW5jdGlvbigmdGVzdF9wcm9iZTEpOworCXJlZ2lzdGVyX2Z0cmFjZV9mdW5jdGlvbigmdGVzdF9wcm9iZTIpOworCXJlZ2lzdGVyX2Z0cmFjZV9mdW5jdGlvbigmdGVzdF9wcm9iZTMpOworCXJlZ2lzdGVyX2Z0cmFjZV9mdW5jdGlvbigmdGVzdF9nbG9iYWwpOworCisJRFlOX0ZUUkFDRV9URVNUX05BTUUoKTsKKworCXByaW50X2NvdW50cygpOworCisJaWYgKHRyYWNlX3NlbGZ0ZXN0X3Rlc3RfcHJvYmUxX2NudCAhPSAxKQorCQlnb3RvIG91dDsKKwlpZiAodHJhY2Vfc2VsZnRlc3RfdGVzdF9wcm9iZTJfY250ICE9IDApCisJCWdvdG8gb3V0OworCWlmICh0cmFjZV9zZWxmdGVzdF90ZXN0X3Byb2JlM19jbnQgIT0gMSkKKwkJZ290byBvdXQ7CisJaWYgKHRyYWNlX3NlbGZ0ZXN0X3Rlc3RfZ2xvYmFsX2NudCA9PSAwKQorCQlnb3RvIG91dDsKKworCURZTl9GVFJBQ0VfVEVTVF9OQU1FMigpOworCisJcHJpbnRfY291bnRzKCk7CisKKwlpZiAodHJhY2Vfc2VsZnRlc3RfdGVzdF9wcm9iZTFfY250ICE9IDEpCisJCWdvdG8gb3V0OworCWlmICh0cmFjZV9zZWxmdGVzdF90ZXN0X3Byb2JlMl9jbnQgIT0gMSkKKwkJZ290byBvdXQ7CisJaWYgKHRyYWNlX3NlbGZ0ZXN0X3Rlc3RfcHJvYmUzX2NudCAhPSAyKQorCQlnb3RvIG91dDsKKworCS8qIEFkZCBhIGR5bmFtaWMgcHJvYmUgKi8KKwlkeW5fb3BzID0ga3phbGxvYyhzaXplb2YoKmR5bl9vcHMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWR5bl9vcHMpIHsKKwkJcHJpbnRrKCJNRU1PUlkgRVJST1IgIik7CisJCWdvdG8gb3V0OworCX0KKworCWR5bl9vcHMtPmZ1bmMgPSB0cmFjZV9zZWxmdGVzdF90ZXN0X2R5bl9mdW5jOworCisJcmVnaXN0ZXJfZnRyYWNlX2Z1bmN0aW9uKGR5bl9vcHMpOworCisJdHJhY2Vfc2VsZnRlc3RfdGVzdF9nbG9iYWxfY250ID0gMDsKKworCURZTl9GVFJBQ0VfVEVTVF9OQU1FKCk7CisKKwlwcmludF9jb3VudHMoKTsKKworCWlmICh0cmFjZV9zZWxmdGVzdF90ZXN0X3Byb2JlMV9jbnQgIT0gMikKKwkJZ290byBvdXRfZnJlZTsKKwlpZiAodHJhY2Vfc2VsZnRlc3RfdGVzdF9wcm9iZTJfY250ICE9IDEpCisJCWdvdG8gb3V0X2ZyZWU7CisJaWYgKHRyYWNlX3NlbGZ0ZXN0X3Rlc3RfcHJvYmUzX2NudCAhPSAzKQorCQlnb3RvIG91dF9mcmVlOworCWlmICh0cmFjZV9zZWxmdGVzdF90ZXN0X2dsb2JhbF9jbnQgPT0gMCkKKwkJZ290byBvdXQ7CisJaWYgKHRyYWNlX3NlbGZ0ZXN0X3Rlc3RfZHluX2NudCA9PSAwKQorCQlnb3RvIG91dF9mcmVlOworCisJRFlOX0ZUUkFDRV9URVNUX05BTUUyKCk7CisKKwlwcmludF9jb3VudHMoKTsKKworCWlmICh0cmFjZV9zZWxmdGVzdF90ZXN0X3Byb2JlMV9jbnQgIT0gMikKKwkJZ290byBvdXRfZnJlZTsKKwlpZiAodHJhY2Vfc2VsZnRlc3RfdGVzdF9wcm9iZTJfY250ICE9IDIpCisJCWdvdG8gb3V0X2ZyZWU7CisJaWYgKHRyYWNlX3NlbGZ0ZXN0X3Rlc3RfcHJvYmUzX2NudCAhPSA0KQorCQlnb3RvIG91dF9mcmVlOworCisJcmV0ID0gMDsKKyBvdXRfZnJlZToKKwl1bnJlZ2lzdGVyX2Z0cmFjZV9mdW5jdGlvbihkeW5fb3BzKTsKKwlrZnJlZShkeW5fb3BzKTsKKworIG91dDoKKwkvKiBQdXJwb3NlbHkgdW5yZWdpc3RlciBpbiB0aGUgc2FtZSBvcmRlciAqLworCXVucmVnaXN0ZXJfZnRyYWNlX2Z1bmN0aW9uKCZ0ZXN0X3Byb2JlMSk7CisJdW5yZWdpc3Rlcl9mdHJhY2VfZnVuY3Rpb24oJnRlc3RfcHJvYmUyKTsKKwl1bnJlZ2lzdGVyX2Z0cmFjZV9mdW5jdGlvbigmdGVzdF9wcm9iZTMpOworCXVucmVnaXN0ZXJfZnRyYWNlX2Z1bmN0aW9uKCZ0ZXN0X2dsb2JhbCk7CisKKwkvKiBNYWtlIHN1cmUgZXZlcnl0aGluZyBpcyBvZmYgKi8KKwlyZXNldF9jb3VudHMoKTsKKwlEWU5fRlRSQUNFX1RFU1RfTkFNRSgpOworCURZTl9GVFJBQ0VfVEVTVF9OQU1FKCk7CisKKwlpZiAodHJhY2Vfc2VsZnRlc3RfdGVzdF9wcm9iZTFfY250IHx8CisJICAgIHRyYWNlX3NlbGZ0ZXN0X3Rlc3RfcHJvYmUyX2NudCB8fAorCSAgICB0cmFjZV9zZWxmdGVzdF90ZXN0X3Byb2JlM19jbnQgfHwKKwkgICAgdHJhY2Vfc2VsZnRlc3RfdGVzdF9nbG9iYWxfY250IHx8CisJICAgIHRyYWNlX3NlbGZ0ZXN0X3Rlc3RfZHluX2NudCkKKwkJcmV0ID0gLTE7CisKKwlmdHJhY2VfZW5hYmxlZCA9IHNhdmVfZnRyYWNlX2VuYWJsZWQ7CisKKwlyZXR1cm4gcmV0OworfQorCiAvKiBUZXN0IGR5bmFtaWMgY29kZSBtb2RpZmljYXRpb24gYW5kIGZ0cmFjZSBmaWx0ZXJzICovCiBpbnQgdHJhY2Vfc2VsZnRlc3Rfc3RhcnR1cF9keW5hbWljX3RyYWNpbmcoc3RydWN0IHRyYWNlciAqdHJhY2UsCiAJCQkJCSAgIHN0cnVjdCB0cmFjZV9hcnJheSAqdHIsCkBAIC0xMzEsNyArMzMxLDcgQEAKIAlmdW5jX25hbWUgPSAiKiIgX19zdHJpbmdpZnkoRFlOX0ZUUkFDRV9URVNUX05BTUUpOwogCiAJLyogZmlsdGVyIG9ubHkgb24gb3VyIGZ1bmN0aW9uICovCi0JZnRyYWNlX3NldF9maWx0ZXIoZnVuY19uYW1lLCBzdHJsZW4oZnVuY19uYW1lKSwgMSk7CisJZnRyYWNlX3NldF9nbG9iYWxfZmlsdGVyKGZ1bmNfbmFtZSwgc3RybGVuKGZ1bmNfbmFtZSksIDEpOwogCiAJLyogZW5hYmxlIHRyYWNpbmcgKi8KIAlyZXQgPSB0cmFjZXJfaW5pdCh0cmFjZSwgdHIpOwpAQCAtMTY2LDIyICszNjYsMzAgQEAKIAogCS8qIGNoZWNrIHRoZSB0cmFjZSBidWZmZXIgKi8KIAlyZXQgPSB0cmFjZV90ZXN0X2J1ZmZlcih0ciwgJmNvdW50KTsKLQl0cmFjZS0+cmVzZXQodHIpOwogCXRyYWNpbmdfc3RhcnQoKTsKIAogCS8qIHdlIHNob3VsZCBvbmx5IGhhdmUgb25lIGl0ZW0gKi8KIAlpZiAoIXJldCAmJiBjb3VudCAhPSAxKSB7CisJCXRyYWNlLT5yZXNldCh0cik7CiAJCXByaW50ayhLRVJOX0NPTlQgIi4uIGZpbHRlciBmYWlsZWQgY291bnQ9JWxkIC4uIiwgY291bnQpOwogCQlyZXQgPSAtMTsKIAkJZ290byBvdXQ7CiAJfQogCisJLyogVGVzdCB0aGUgb3BzIHdpdGggZ2xvYmFsIHRyYWNpbmcgcnVubmluZyAqLworCXJldCA9IHRyYWNlX3NlbGZ0ZXN0X29wcygxKTsKKwl0cmFjZS0+cmVzZXQodHIpOworCiAgb3V0OgogCWZ0cmFjZV9lbmFibGVkID0gc2F2ZV9mdHJhY2VfZW5hYmxlZDsKIAl0cmFjZXJfZW5hYmxlZCA9IHNhdmVfdHJhY2VyX2VuYWJsZWQ7CiAKIAkvKiBFbmFibGUgdHJhY2luZyBvbiBhbGwgZnVuY3Rpb25zIGFnYWluICovCi0JZnRyYWNlX3NldF9maWx0ZXIoTlVMTCwgMCwgMSk7CisJZnRyYWNlX3NldF9nbG9iYWxfZmlsdGVyKE5VTEwsIDAsIDEpOworCisJLyogVGVzdCB0aGUgb3BzIHdpdGggZ2xvYmFsIHRyYWNpbmcgb2ZmICovCisJaWYgKCFyZXQpCisJCXJldCA9IHRyYWNlX3NlbGZ0ZXN0X29wcygyKTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc2VsZnRlc3RfZHluYW1pYy5jIGIva2VybmVsL3RyYWNlL3RyYWNlX3NlbGZ0ZXN0X2R5bmFtaWMuYwppbmRleCA1NGRkNzdjLi5iNGM0NzVhIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc2VsZnRlc3RfZHluYW1pYy5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9zZWxmdGVzdF9keW5hbWljLmMKQEAgLTUsMyArNSw5IEBACiAJLyogdXNlZCB0byBjYWxsIG1jb3VudCAqLwogCXJldHVybiAwOwogfQorCitpbnQgRFlOX0ZUUkFDRV9URVNUX05BTUUyKHZvaWQpCit7CisJLyogdXNlZCB0byBjYWxsIG1jb3VudCAqLworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX3N0YWNrLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc3RhY2suYwppbmRleCA0YzVkZWFkLi5iMGI1M2I4IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc3RhY2suYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc3RhY2suYwpAQCAtMTMzLDYgKzEzMyw3IEBACiBzdGF0aWMgc3RydWN0IGZ0cmFjZV9vcHMgdHJhY2Vfb3BzIF9fcmVhZF9tb3N0bHkgPQogewogCS5mdW5jID0gc3RhY2tfdHJhY2VfY2FsbCwKKwkuZmxhZ3MgPSBGVFJBQ0VfT1BTX0ZMX0dMT0JBTCwKIH07CiAKIHN0YXRpYyBzc2l6ZV90CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2Vwb2ludC5jIGIva2VybmVsL3RyYWNlcG9pbnQuYwppbmRleCA2ODE4N2FmLi5iMjE5ZjE0IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2Vwb2ludC5jCisrKyBiL2tlcm5lbC90cmFjZXBvaW50LmMKQEAgLTI1MSw5ICsyNTEsOSBAQAogewogCVdBUk5fT04oc3RyY21wKCgqZW50cnkpLT5uYW1lLCBlbGVtLT5uYW1lKSAhPSAwKTsKIAotCWlmIChlbGVtLT5yZWdmdW5jICYmICFlbGVtLT5zdGF0ZSAmJiBhY3RpdmUpCisJaWYgKGVsZW0tPnJlZ2Z1bmMgJiYgIWp1bXBfbGFiZWxfZW5hYmxlZCgmZWxlbS0+a2V5KSAmJiBhY3RpdmUpCiAJCWVsZW0tPnJlZ2Z1bmMoKTsKLQllbHNlIGlmIChlbGVtLT51bnJlZ2Z1bmMgJiYgZWxlbS0+c3RhdGUgJiYgIWFjdGl2ZSkKKwllbHNlIGlmIChlbGVtLT51bnJlZ2Z1bmMgJiYganVtcF9sYWJlbF9lbmFibGVkKCZlbGVtLT5rZXkpICYmICFhY3RpdmUpCiAJCWVsZW0tPnVucmVnZnVuYygpOwogCiAJLyoKQEAgLTI2NCwxMyArMjY0LDEwIEBACiAJICogaXMgdXNlZC4KIAkgKi8KIAlyY3VfYXNzaWduX3BvaW50ZXIoZWxlbS0+ZnVuY3MsICgqZW50cnkpLT5mdW5jcyk7Ci0JaWYgKCFlbGVtLT5zdGF0ZSAmJiBhY3RpdmUpIHsKLQkJanVtcF9sYWJlbF9lbmFibGUoJmVsZW0tPnN0YXRlKTsKLQkJZWxlbS0+c3RhdGUgPSBhY3RpdmU7Ci0JfSBlbHNlIGlmIChlbGVtLT5zdGF0ZSAmJiAhYWN0aXZlKSB7Ci0JCWp1bXBfbGFiZWxfZGlzYWJsZSgmZWxlbS0+c3RhdGUpOwotCQllbGVtLT5zdGF0ZSA9IGFjdGl2ZTsKLQl9CisJaWYgKGFjdGl2ZSAmJiAhanVtcF9sYWJlbF9lbmFibGVkKCZlbGVtLT5rZXkpKQorCQlqdW1wX2xhYmVsX2luYygmZWxlbS0+a2V5KTsKKwllbHNlIGlmICghYWN0aXZlICYmIGp1bXBfbGFiZWxfZW5hYmxlZCgmZWxlbS0+a2V5KSkKKwkJanVtcF9sYWJlbF9kZWMoJmVsZW0tPmtleSk7CiB9CiAKIC8qCkBAIC0yODEsMTMgKzI3OCwxMSBAQAogICovCiBzdGF0aWMgdm9pZCBkaXNhYmxlX3RyYWNlcG9pbnQoc3RydWN0IHRyYWNlcG9pbnQgKmVsZW0pCiB7Ci0JaWYgKGVsZW0tPnVucmVnZnVuYyAmJiBlbGVtLT5zdGF0ZSkKKwlpZiAoZWxlbS0+dW5yZWdmdW5jICYmIGp1bXBfbGFiZWxfZW5hYmxlZCgmZWxlbS0+a2V5KSkKIAkJZWxlbS0+dW5yZWdmdW5jKCk7CiAKLQlpZiAoZWxlbS0+c3RhdGUpIHsKLQkJanVtcF9sYWJlbF9kaXNhYmxlKCZlbGVtLT5zdGF0ZSk7Ci0JCWVsZW0tPnN0YXRlID0gMDsKLQl9CisJaWYgKGp1bXBfbGFiZWxfZW5hYmxlZCgmZWxlbS0+a2V5KSkKKwkJanVtcF9sYWJlbF9kZWMoJmVsZW0tPmtleSk7CiAJcmN1X2Fzc2lnbl9wb2ludGVyKGVsZW0tPmZ1bmNzLCBOVUxMKTsKIH0KIApkaWZmIC0tZ2l0IGEvbGliL0tjb25maWcuZGVidWcgYi9saWIvS2NvbmZpZy5kZWJ1ZwppbmRleCBjNzY4YmNkLi4xMGVmNjE5IDEwMDY0NAotLS0gYS9saWIvS2NvbmZpZy5kZWJ1ZworKysgYi9saWIvS2NvbmZpZy5kZWJ1ZwpAQCAtMjM4LDYgKzIzOCwyMSBAQAogCSAgZW5hYmxlZCB0aGVuIGFsbCBoZWxkIGxvY2tzIHdpbGwgYWxzbyBiZSByZXBvcnRlZC4gVGhpcwogCSAgZmVhdHVyZSBoYXMgbmVnbGlnaWJsZSBvdmVyaGVhZC4KIAorY29uZmlnIERFRkFVTFRfSFVOR19UQVNLX1RJTUVPVVQKKwlpbnQgIkRlZmF1bHQgdGltZW91dCBmb3IgaHVuZyB0YXNrIGRldGVjdGlvbiAoaW4gc2Vjb25kcykiCisJZGVwZW5kcyBvbiBERVRFQ1RfSFVOR19UQVNLCisJZGVmYXVsdCAxMjAKKwloZWxwCisJICBUaGlzIG9wdGlvbiBjb250cm9scyB0aGUgZGVmYXVsdCB0aW1lb3V0IChpbiBzZWNvbmRzKSB1c2VkCisJICB0byBkZXRlcm1pbmUgd2hlbiBhIHRhc2sgaGFzIGJlY29tZSBub24tcmVzcG9uc2l2ZSBhbmQgc2hvdWxkCisJICBiZSBjb25zaWRlcmVkIGh1bmcuCisKKwkgIEl0IGNhbiBiZSBhZGp1c3RlZCBhdCBydW50aW1lIHZpYSB0aGUga2VybmVsLmh1bmdfdGFza190aW1lb3V0CisJICBzeXNjdGwgb3IgYnkgd3JpdGluZyBhIHZhbHVlIHRvIC9wcm9jL3N5cy9rZXJuZWwvaHVuZ190YXNrX3RpbWVvdXQuCisKKwkgIEEgdGltZW91dCBvZiAwIGRpc2FibGVzIHRoZSBjaGVjay4gIFRoZSBkZWZhdWx0IGlzIHR3byBtaW51dGVzLgorCSAgS2VlcGluZyB0aGUgZGVmYXVsdCBzaG91bGQgYmUgZmluZSBpbiBtb3N0IGNhc2VzLgorCiBjb25maWcgQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5JQwogCWJvb2wgIlBhbmljIChSZWJvb3QpIE9uIEh1bmcgVGFza3MiCiAJZGVwZW5kcyBvbiBERVRFQ1RfSFVOR19UQVNLCkBAIC0zMzcsNyArMzUyLDcgQEAKIAogY29uZmlnIERFQlVHX09CSkVDVFNfUkNVX0hFQUQKIAlib29sICJEZWJ1ZyBSQ1UgY2FsbGJhY2tzIG9iamVjdHMiCi0JZGVwZW5kcyBvbiBERUJVR19PQkpFQ1RTICYmIFBSRUVNUFQKKwlkZXBlbmRzIG9uIERFQlVHX09CSkVDVFMKIAloZWxwCiAJICBFbmFibGUgdGhpcyB0byB0dXJuIG9uIGRlYnVnZ2luZyBvZiBSQ1UgbGlzdCBoZWFkcyAoY2FsbF9yY3UoKSB1c2FnZSkuCiAKQEAgLTM5OCw5ICs0MTMsOSBAQAogY29uZmlnIERFQlVHX0tNRU1MRUFLCiAJYm9vbCAiS2VybmVsIG1lbW9yeSBsZWFrIGRldGVjdG9yIgogCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmIEVYUEVSSU1FTlRBTCAmJiAhTUVNT1JZX0hPVFBMVUcgJiYgXAotCQkoWDg2IHx8IEFSTSB8fCBQUEMgfHwgUzM5MCB8fCBTUEFSQzY0IHx8IFNVUEVSSCB8fCBNSUNST0JMQVpFIHx8IFRJTEUpCisJCShYODYgfHwgQVJNIHx8IFBQQyB8fCBNSVBTIHx8IFMzOTAgfHwgU1BBUkM2NCB8fCBTVVBFUkggfHwgTUlDUk9CTEFaRSB8fCBUSUxFKQogCi0Jc2VsZWN0IERFQlVHX0ZTIGlmIFNZU0ZTCisJc2VsZWN0IERFQlVHX0ZTCiAJc2VsZWN0IFNUQUNLVFJBQ0UgaWYgU1RBQ0tUUkFDRV9TVVBQT1JUCiAJc2VsZWN0IEtBTExTWU1TCiAJc2VsZWN0IENSQzMyCkBAIC04NzUsMjIgKzg5MCw5IEBACiAJICBTYXkgTiBoZXJlIGlmIHlvdSB3YW50IHRoZSBSQ1UgdG9ydHVyZSB0ZXN0cyB0byBzdGFydCBvbmx5CiAJICBhZnRlciBiZWluZyBtYW51YWxseSBlbmFibGVkIHZpYSAvcHJvYy4KIAotY29uZmlnIFJDVV9DUFVfU1RBTExfREVURUNUT1IKLQlib29sICJDaGVjayBmb3Igc3RhbGxlZCBDUFVzIGRlbGF5aW5nIFJDVSBncmFjZSBwZXJpb2RzIgotCWRlcGVuZHMgb24gVFJFRV9SQ1UgfHwgVFJFRV9QUkVFTVBUX1JDVQotCWRlZmF1bHQgeQotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGNhdXNlcyBSQ1UgdG8gcHJpbnRrIGluZm9ybWF0aW9uIG9uIHdoaWNoCi0JICBDUFVzIGFyZSBkZWxheWluZyB0aGUgY3VycmVudCBncmFjZSBwZXJpb2QsIGJ1dCBvbmx5IHdoZW4KLQkgIHRoZSBncmFjZSBwZXJpb2QgZXh0ZW5kcyBmb3IgZXhjZXNzaXZlIHRpbWUgcGVyaW9kcy4KLQotCSAgU2F5IE4gaWYgeW91IHdhbnQgdG8gZGlzYWJsZSBzdWNoIGNoZWNrcy4KLQotCSAgU2F5IFkgaWYgeW91IGFyZSB1bnN1cmUuCi0KIGNvbmZpZyBSQ1VfQ1BVX1NUQUxMX1RJTUVPVVQKIAlpbnQgIlJDVSBDUFUgc3RhbGwgdGltZW91dCBpbiBzZWNvbmRzIgotCWRlcGVuZHMgb24gUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUgorCWRlcGVuZHMgb24gVFJFRV9SQ1UgfHwgVFJFRV9QUkVFTVBUX1JDVQogCXJhbmdlIDMgMzAwCiAJZGVmYXVsdCA2MAogCWhlbHAKQEAgLTg5OSwyMiArOTAxLDkgQEAKIAkgIFJDVSBncmFjZSBwZXJpb2QgcGVyc2lzdHMsIGFkZGl0aW9uYWwgQ1BVIHN0YWxsIHdhcm5pbmdzIGFyZQogCSAgcHJpbnRlZCBhdCBtb3JlIHdpZGVseSBzcGFjZWQgaW50ZXJ2YWxzLgogCi1jb25maWcgUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUl9SVU5OQUJMRQotCWJvb2wgIlJDVSBDUFUgc3RhbGwgY2hlY2tpbmcgc3RhcnRzIGF1dG9tYXRpY2FsbHkgYXQgYm9vdCIKLQlkZXBlbmRzIG9uIFJDVV9DUFVfU1RBTExfREVURUNUT1IKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBJZiBzZXQsIHN0YXJ0IGNoZWNraW5nIGZvciBSQ1UgQ1BVIHN0YWxscyBpbW1lZGlhdGVseSBvbgotCSAgYm9vdC4gIE90aGVyd2lzZSwgUkNVIENQVSBzdGFsbCBjaGVja2luZyBtdXN0IGJlIG1hbnVhbGx5Ci0JICBlbmFibGVkLgotCi0JICBTYXkgWSBpZiB5b3UgYXJlIHVuc3VyZS4KLQotCSAgU2F5IE4gaWYgeW91IHdpc2ggdG8gc3VwcHJlc3MgUkNVIENQVSBzdGFsbCBjaGVja2luZyBkdXJpbmcgYm9vdC4KLQogY29uZmlnIFJDVV9DUFVfU1RBTExfVkVSQk9TRQogCWJvb2wgIlByaW50IGFkZGl0aW9uYWwgcGVyLXRhc2sgaW5mb3JtYXRpb24gZm9yIFJDVV9DUFVfU1RBTExfREVURUNUT1IiCi0JZGVwZW5kcyBvbiBSQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SICYmIFRSRUVfUFJFRU1QVF9SQ1UKKwlkZXBlbmRzIG9uIFRSRUVfUFJFRU1QVF9SQ1UKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBjYXVzZXMgUkNVIHRvIHByaW50ayBkZXRhaWxlZCBwZXItdGFzayBpbmZvcm1hdGlvbgpkaWZmIC0tZ2l0IGEvbGliL01ha2VmaWxlIGIvbGliL01ha2VmaWxlCmluZGV4IGVmMGYyODUuLjRiNDlhMjQgMTAwNjQ0Ci0tLSBhL2xpYi9NYWtlZmlsZQorKysgYi9saWIvTWFrZWZpbGUKQEAgLTIxLDcgKzIxLDggQEAKIAogb2JqLXkgKz0gYmNkLm8gZGl2NjQubyBzb3J0Lm8gcGFyc2VyLm8gaGFsZm1kNC5vIGRlYnVnX2xvY2tzLm8gcmFuZG9tMzIubyBcCiAJIGJ1c3Rfc3BpbmxvY2tzLm8gaGV4ZHVtcC5vIGthc3ByaW50Zi5vIGJpdG1hcC5vIHNjYXR0ZXJsaXN0Lm8gXAotCSBzdHJpbmdfaGVscGVycy5vIGdjZC5vIGxjbS5vIGxpc3Rfc29ydC5vIHV1aWQubyBmbGV4X2FycmF5Lm8KKwkgc3RyaW5nX2hlbHBlcnMubyBnY2QubyBsY20ubyBsaXN0X3NvcnQubyB1dWlkLm8gZmxleF9hcnJheS5vIFwKKwkgYnNlYXJjaC5vCiBvYmoteSArPSBrc3RydG94Lm8KIG9iai0kKENPTkZJR19URVNUX0tTVFJUT1gpICs9IHRlc3Qta3N0cnRveC5vCiAKZGlmZiAtLWdpdCBhL2xpYi9ic2VhcmNoLmMgYi9saWIvYnNlYXJjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNTQ3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvYnNlYXJjaC5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBBIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IHNlYXJjaCBmb3IgdGhlIExpbnV4IGtlcm5lbAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEtzcGxpY2UsIEluYy4KKyAqIEF1dGhvcjogVGltIEFiYm90dCA8dGFiYm90dEBrc3BsaWNlLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYnNlYXJjaC5oPgorCisvKgorICogYnNlYXJjaCAtIGJpbmFyeSBzZWFyY2ggYW4gYXJyYXkgb2YgZWxlbWVudHMKKyAqIEBrZXk6IHBvaW50ZXIgdG8gaXRlbSBiZWluZyBzZWFyY2hlZCBmb3IKKyAqIEBiYXNlOiBwb2ludGVyIHRvIGZpcnN0IGVsZW1lbnQgdG8gc2VhcmNoCisgKiBAbnVtOiBudW1iZXIgb2YgZWxlbWVudHMKKyAqIEBzaXplOiBzaXplIG9mIGVhY2ggZWxlbWVudAorICogQGNtcDogcG9pbnRlciB0byBjb21wYXJpc29uIGZ1bmN0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIGEgYmluYXJ5IHNlYXJjaCBvbiB0aGUgZ2l2ZW4gYXJyYXkuICBUaGUKKyAqIGNvbnRlbnRzIG9mIHRoZSBhcnJheSBzaG91bGQgYWxyZWFkeSBiZSBpbiBhc2NlbmRpbmcgc29ydGVkIG9yZGVyCisgKiB1bmRlciB0aGUgcHJvdmlkZWQgY29tcGFyaXNvbiBmdW5jdGlvbi4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIGtleSBuZWVkIG5vdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGVsZW1lbnRzIGluCisgKiB0aGUgYXJyYXksIGUuZy4ga2V5IGNvdWxkIGJlIGEgc3RyaW5nIGFuZCB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbgorICogY291bGQgY29tcGFyZSB0aGUgc3RyaW5nIHdpdGggdGhlIHN0cnVjdCdzIG5hbWUgZmllbGQuICBIb3dldmVyLCBpZgorICogdGhlIGtleSBhbmQgZWxlbWVudHMgaW4gdGhlIGFycmF5IGFyZSBvZiB0aGUgc2FtZSB0eXBlLCB5b3UgY2FuIHVzZQorICogdGhlIHNhbWUgY29tcGFyaXNvbiBmdW5jdGlvbiBmb3IgYm90aCBzb3J0KCkgYW5kIGJzZWFyY2goKS4KKyAqLwordm9pZCAqYnNlYXJjaChjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKmJhc2UsIHNpemVfdCBudW0sIHNpemVfdCBzaXplLAorCSAgICAgIGludCAoKmNtcCkoY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB2b2lkICplbHQpKQoreworCXNpemVfdCBzdGFydCA9IDAsIGVuZCA9IG51bTsKKwlpbnQgcmVzdWx0OworCisJd2hpbGUgKHN0YXJ0IDwgZW5kKSB7CisJCXNpemVfdCBtaWQgPSBzdGFydCArIChlbmQgLSBzdGFydCkgLyAyOworCisJCXJlc3VsdCA9IGNtcChrZXksIGJhc2UgKyBtaWQgKiBzaXplKTsKKwkJaWYgKHJlc3VsdCA8IDApCisJCQllbmQgPSBtaWQ7CisJCWVsc2UgaWYgKHJlc3VsdCA+IDApCisJCQlzdGFydCA9IG1pZCArIDE7CisJCWVsc2UKKwkJCXJldHVybiAodm9pZCAqKWJhc2UgKyBtaWQgKiBzaXplOworCX0KKworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChic2VhcmNoKTsKZGlmZiAtLWdpdCBhL2xpYi9kbWEtZGVidWcuYyBiL2xpYi9kbWEtZGVidWcuYwppbmRleCA0YmZiMDQ3Li5kYjA3YmZkIDEwMDY0NAotLS0gYS9saWIvZG1hLWRlYnVnLmMKKysrIGIvbGliL2RtYS1kZWJ1Zy5jCkBAIC02NDksNyArNjQ5LDcgQEAKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAotc3RhdGljIGludCBkZXZpY2VfZG1hX2FsbG9jYXRpb25zKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgZGV2aWNlX2RtYV9hbGxvY2F0aW9ucyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkbWFfZGVidWdfZW50cnkgKipvdXRfZW50cnkpCiB7CiAJc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqZW50cnk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTY2MCw4ICs2NjAsMTAgQEAKIAlmb3IgKGkgPSAwOyBpIDwgSEFTSF9TSVpFOyArK2kpIHsKIAkJc3Bpbl9sb2NrKCZkbWFfZW50cnlfaGFzaFtpXS5sb2NrKTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRtYV9lbnRyeV9oYXNoW2ldLmxpc3QsIGxpc3QpIHsKLQkJCWlmIChlbnRyeS0+ZGV2ID09IGRldikKKwkJCWlmIChlbnRyeS0+ZGV2ID09IGRldikgewogCQkJCWNvdW50ICs9IDE7CisJCQkJKm91dF9lbnRyeSA9IGVudHJ5OworCQkJfQogCQl9CiAJCXNwaW5fdW5sb2NrKCZkbWFfZW50cnlfaGFzaFtpXS5sb2NrKTsKIAl9CkBAIC02NzQsNiArNjc2LDcgQEAKIHN0YXRpYyBpbnQgZG1hX2RlYnVnX2RldmljZV9jaGFuZ2Uoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICp1bmluaXRpYWxpemVkX3ZhcihlbnRyeSk7CiAJaW50IGNvdW50OwogCiAJaWYgKGdsb2JhbF9kaXNhYmxlKQpAQCAtNjgxLDEyICs2ODQsMTcgQEAKIAogCXN3aXRjaCAoYWN0aW9uKSB7CiAJY2FzZSBCVVNfTk9USUZZX1VOQk9VTkRfRFJJVkVSOgotCQljb3VudCA9IGRldmljZV9kbWFfYWxsb2NhdGlvbnMoZGV2KTsKKwkJY291bnQgPSBkZXZpY2VfZG1hX2FsbG9jYXRpb25zKGRldiwgJmVudHJ5KTsKIAkJaWYgKGNvdW50ID09IDApCiAJCQlicmVhazsKLQkJZXJyX3ByaW50ayhkZXYsIE5VTEwsICJETUEtQVBJOiBkZXZpY2UgZHJpdmVyIGhhcyBwZW5kaW5nICIKKwkJZXJyX3ByaW50ayhkZXYsIGVudHJ5LCAiRE1BLUFQSTogZGV2aWNlIGRyaXZlciBoYXMgcGVuZGluZyAiCiAJCQkJIkRNQSBhbGxvY2F0aW9ucyB3aGlsZSByZWxlYXNlZCBmcm9tIGRldmljZSAiCi0JCQkJIltjb3VudD0lZF1cbiIsIGNvdW50KTsKKwkJCQkiW2NvdW50PSVkXVxuIgorCQkJCSJPbmUgb2YgbGVha2VkIGVudHJpZXMgZGV0YWlsczogIgorCQkJCSJbZGV2aWNlIGFkZHJlc3M9MHglMDE2bGx4XSBbc2l6ZT0lbGx1IGJ5dGVzXSAiCisJCQkJIlttYXBwZWQgd2l0aCAlc10gW21hcHBlZCBhcyAlc11cbiIsCisJCQljb3VudCwgZW50cnktPmRldl9hZGRyLCBlbnRyeS0+c2l6ZSwKKwkJCWRpcjJuYW1lW2VudHJ5LT5kaXJlY3Rpb25dLCB0eXBlMm5hbWVbZW50cnktPnR5cGVdKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9saWIvc3RyaW5nLmMgYi9saWIvc3RyaW5nLmMKaW5kZXggZjcxYmVhZC4uMDFmYWQ5YiAxMDA2NDQKLS0tIGEvbGliL3N0cmluZy5jCisrKyBiL2xpYi9zdHJpbmcuYwpAQCAtNTM1LDYgKzUzNSwzNSBAQAogfQogRVhQT1JUX1NZTUJPTChzeXNmc19zdHJlcSk7CiAKKy8qKgorICogc3RydG9ib29sIC0gY29udmVydCBjb21tb24gdXNlciBpbnB1dHMgaW50byBib29sZWFuIHZhbHVlcworICogQHM6IGlucHV0IHN0cmluZworICogQHJlczogcmVzdWx0CisgKgorICogVGhpcyByb3V0aW5lIHJldHVybnMgMCBpZmYgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBvbmUgb2YgJ1l5MU5uMCcuCisgKiBPdGhlcndpc2UgaXQgd2lsbCByZXR1cm4gLUVJTlZBTC4gIFZhbHVlIHBvaW50ZWQgdG8gYnkgcmVzIGlzCisgKiB1cGRhdGVkIHVwb24gZmluZGluZyBhIG1hdGNoLgorICovCitpbnQgc3RydG9ib29sKGNvbnN0IGNoYXIgKnMsIGJvb2wgKnJlcykKK3sKKwlzd2l0Y2ggKHNbMF0pIHsKKwljYXNlICd5JzoKKwljYXNlICdZJzoKKwljYXNlICcxJzoKKwkJKnJlcyA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgJ24nOgorCWNhc2UgJ04nOgorCWNhc2UgJzAnOgorCQkqcmVzID0gZmFsc2U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woc3RydG9ib29sKTsKKwogI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1TRVQKIC8qKgogICogbWVtc2V0IC0gRmlsbCBhIHJlZ2lvbiBvZiBtZW1vcnkgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUKZGlmZiAtLWdpdCBhL21tL2ttZW1sZWFrLmMgYi9tbS9rbWVtbGVhay5jCmluZGV4IGMxZDU4NjcuLmFhY2VlNDUgMTAwNjQ0Ci0tLSBhL21tL2ttZW1sZWFrLmMKKysrIGIvbW0va21lbWxlYWsuYwpAQCAtMTQxNCw5ICsxNDE0LDEyIEBACiAJKysoKnBvcyk7CiAKIAlsaXN0X2Zvcl9lYWNoX2NvbnRpbnVlX3JjdShuLCAmb2JqZWN0X2xpc3QpIHsKLQkJbmV4dF9vYmogPSBsaXN0X2VudHJ5KG4sIHN0cnVjdCBrbWVtbGVha19vYmplY3QsIG9iamVjdF9saXN0KTsKLQkJaWYgKGdldF9vYmplY3QobmV4dF9vYmopKQorCQlzdHJ1Y3Qga21lbWxlYWtfb2JqZWN0ICpvYmogPQorCQkJbGlzdF9lbnRyeShuLCBzdHJ1Y3Qga21lbWxlYWtfb2JqZWN0LCBvYmplY3RfbGlzdCk7CisJCWlmIChnZXRfb2JqZWN0KG9iaikpIHsKKwkJCW5leHRfb2JqID0gb2JqOwogCQkJYnJlYWs7CisJCX0KIAl9CiAKIAlwdXRfb2JqZWN0KHByZXZfb2JqKTsKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY2xpZW50LmMgYi9uZXQvYmF0bWFuLWFkdi9nYXRld2F5X2NsaWVudC5jCmluZGV4IDNjYzQzNTUuLjE1MGI2Y2UgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY2xpZW50LmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvZ2F0ZXdheV9jbGllbnQuYwpAQCAtMjgsMTggKzI4LDEwIEBACiAjaW5jbHVkZSA8bGludXgvdWRwLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgogCi1zdGF0aWMgdm9pZCBnd19ub2RlX2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqcmN1KQotewotCXN0cnVjdCBnd19ub2RlICpnd19ub2RlOwotCi0JZ3dfbm9kZSA9IGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBnd19ub2RlLCByY3UpOwotCWtmcmVlKGd3X25vZGUpOwotfQotCiBzdGF0aWMgdm9pZCBnd19ub2RlX2ZyZWVfcmVmKHN0cnVjdCBnd19ub2RlICpnd19ub2RlKQogewogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZnd19ub2RlLT5yZWZjb3VudCkpCi0JCWNhbGxfcmN1KCZnd19ub2RlLT5yY3UsIGd3X25vZGVfZnJlZV9yY3UpOworCQlrZnJlZV9yY3UoZ3dfbm9kZSwgcmN1KTsKIH0KIAogdm9pZCAqZ3dfZ2V0X3NlbGVjdGVkKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmMgYi9uZXQvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmMKaW5kZXggMGI5MTMzMC4uZWQyM2E1ODkgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L29yaWdpbmF0b3IuYworKysgYi9uZXQvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmMKQEAgLTU2LDE4ICs1NiwxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBuZWlnaF9ub2RlX2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqcmN1KQotewotCXN0cnVjdCBuZWlnaF9ub2RlICpuZWlnaF9ub2RlOwotCi0JbmVpZ2hfbm9kZSA9IGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBuZWlnaF9ub2RlLCByY3UpOwotCWtmcmVlKG5laWdoX25vZGUpOwotfQotCiB2b2lkIG5laWdoX25vZGVfZnJlZV9yZWYoc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGUpCiB7CiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJm5laWdoX25vZGUtPnJlZmNvdW50KSkKLQkJY2FsbF9yY3UoJm5laWdoX25vZGUtPnJjdSwgbmVpZ2hfbm9kZV9mcmVlX3JjdSk7CisJCWtmcmVlX3JjdShuZWlnaF9ub2RlLCByY3UpOwogfQogCiBzdHJ1Y3QgbmVpZ2hfbm9kZSAqY3JlYXRlX25laWdoYm9yKHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmMgYi9uZXQvYmF0bWFuLWFkdi9zb2Z0LWludGVyZmFjZS5jCmluZGV4IDgyNGUxZjYuLjA0ZWZlMDIgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvc29mdC1pbnRlcmZhY2UuYwpAQCAtNzYsMTggKzc2LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNvZnRpZl9uZWlnaF9mcmVlX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKLXsKLQlzdHJ1Y3Qgc29mdGlmX25laWdoICpzb2Z0aWZfbmVpZ2g7Ci0KLQlzb2Z0aWZfbmVpZ2ggPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3Qgc29mdGlmX25laWdoLCByY3UpOwotCWtmcmVlKHNvZnRpZl9uZWlnaCk7Ci19Ci0KIHN0YXRpYyB2b2lkIHNvZnRpZl9uZWlnaF9mcmVlX3JlZihzdHJ1Y3Qgc29mdGlmX25laWdoICpzb2Z0aWZfbmVpZ2gpCiB7CiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnNvZnRpZl9uZWlnaC0+cmVmY291bnQpKQotCQljYWxsX3JjdSgmc29mdGlmX25laWdoLT5yY3UsIHNvZnRpZl9uZWlnaF9mcmVlX3JjdSk7CisJCWtmcmVlX3JjdShzb2Z0aWZfbmVpZ2gsIHJjdSk7CiB9CiAKIHZvaWQgc29mdGlmX25laWdoX3B1cmdlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCmRpZmYgLS1naXQgYS9uZXQvY29yZS9kZXZfYWRkcl9saXN0cy5jIGIvbmV0L2NvcmUvZGV2X2FkZHJfbGlzdHMuYwppbmRleCA3YjM5ZjNlLi5lMmU2NjkzIDEwMDY0NAotLS0gYS9uZXQvY29yZS9kZXZfYWRkcl9saXN0cy5jCisrKyBiL25ldC9jb3JlL2Rldl9hZGRyX2xpc3RzLmMKQEAgLTY4LDE0ICs2OCw2IEBACiAJcmV0dXJuIF9faHdfYWRkcl9hZGRfZXgobGlzdCwgYWRkciwgYWRkcl9sZW4sIGFkZHJfdHlwZSwgZmFsc2UpOwogfQogCi1zdGF0aWMgdm9pZCBoYV9yY3VfZnJlZShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCi17Ci0Jc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKLQotCWhhID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBuZXRkZXZfaHdfYWRkciwgcmN1X2hlYWQpOwotCWtmcmVlKGhhKTsKLX0KLQogc3RhdGljIGludCBfX2h3X2FkZHJfZGVsX2V4KHN0cnVjdCBuZXRkZXZfaHdfYWRkcl9saXN0ICpsaXN0LAogCQkJICAgIHVuc2lnbmVkIGNoYXIgKmFkZHIsIGludCBhZGRyX2xlbiwKIAkJCSAgICB1bnNpZ25lZCBjaGFyIGFkZHJfdHlwZSwgYm9vbCBnbG9iYWwpCkBAIC05NCw3ICs4Niw3IEBACiAJCQlpZiAoLS1oYS0+cmVmY291bnQpCiAJCQkJcmV0dXJuIDA7CiAJCQlsaXN0X2RlbF9yY3UoJmhhLT5saXN0KTsKLQkJCWNhbGxfcmN1KCZoYS0+cmN1X2hlYWQsIGhhX3JjdV9mcmVlKTsKKwkJCWtmcmVlX3JjdShoYSwgcmN1X2hlYWQpOwogCQkJbGlzdC0+Y291bnQtLTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC0xOTcsNyArMTg5LDcgQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShoYSwgdG1wLCAmbGlzdC0+bGlzdCwgbGlzdCkgewogCQlsaXN0X2RlbF9yY3UoJmhhLT5saXN0KTsKLQkJY2FsbF9yY3UoJmhhLT5yY3VfaGVhZCwgaGFfcmN1X2ZyZWUpOworCQlrZnJlZV9yY3UoaGEsIHJjdV9oZWFkKTsKIAl9CiAJbGlzdC0+Y291bnQgPSAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZHJvcF9tb25pdG9yLmMgYi9uZXQvY29yZS9kcm9wX21vbml0b3IuYwppbmRleCA3MDY1MDJmLi43ZjM2YjM4IDEwMDY0NAotLS0gYS9uZXQvY29yZS9kcm9wX21vbml0b3IuYworKysgYi9uZXQvY29yZS9kcm9wX21vbml0b3IuYwpAQCAtMjA3LDE0ICsyMDcsNiBAQAogCXJjdV9yZWFkX3VubG9jaygpOwogfQogCi0KLXN0YXRpYyB2b2lkIGZyZWVfZG1faHdfc3RhdChzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCi17Ci0Jc3RydWN0IGRtX2h3X3N0YXRfZGVsdGEgKm47Ci0JbiA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgZG1faHdfc3RhdF9kZWx0YSwgcmN1KTsKLQlrZnJlZShuKTsKLX0KLQogc3RhdGljIGludCBzZXRfYWxsX21vbml0b3JfdHJhY2VzKGludCBzdGF0ZSkKIHsKIAlpbnQgcmMgPSAwOwpAQCAtMjQ1LDcgKzIzNyw3IEBACiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShuZXdfc3RhdCwgdGVtcCwgJmh3X3N0YXRzX2xpc3QsIGxpc3QpIHsKIAkJCWlmIChuZXdfc3RhdC0+ZGV2ID09IE5VTEwpIHsKIAkJCQlsaXN0X2RlbF9yY3UoJm5ld19zdGF0LT5saXN0KTsKLQkJCQljYWxsX3JjdSgmbmV3X3N0YXQtPnJjdSwgZnJlZV9kbV9od19zdGF0KTsKKwkJCQlrZnJlZV9yY3UobmV3X3N0YXQsIHJjdSk7CiAJCQl9CiAJCX0KIAkJYnJlYWs7CkBAIC0zMTQsNyArMzA2LDcgQEAKIAkJCQluZXdfc3RhdC0+ZGV2ID0gTlVMTDsKIAkJCQlpZiAodHJhY2Vfc3RhdGUgPT0gVFJBQ0VfT0ZGKSB7CiAJCQkJCWxpc3RfZGVsX3JjdSgmbmV3X3N0YXQtPmxpc3QpOwotCQkJCQljYWxsX3JjdSgmbmV3X3N0YXQtPnJjdSwgZnJlZV9kbV9od19zdGF0KTsKKwkJCQkJa2ZyZWVfcmN1KG5ld19zdGF0LCByY3UpOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CmRpZmYgLS1naXQgYS9uZXQvY29yZS9nZW5fZXN0aW1hdG9yLmMgYi9uZXQvY29yZS9nZW5fZXN0aW1hdG9yLmMKaW5kZXggN2MyMzczMy4uNDNiMDNkZCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZ2VuX2VzdGltYXRvci5jCisrKyBiL25ldC9jb3JlL2dlbl9lc3RpbWF0b3IuYwpAQCAtMjQ5LDEzICsyNDksNiBAQAogfQogRVhQT1JUX1NZTUJPTChnZW5fbmV3X2VzdGltYXRvcik7CiAKLXN0YXRpYyB2b2lkIF9fZ2VuX2tpbGxfZXN0aW1hdG9yKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKLXsKLQlzdHJ1Y3QgZ2VuX2VzdGltYXRvciAqZSA9IGNvbnRhaW5lcl9vZihoZWFkLAotCQkJCQlzdHJ1Y3QgZ2VuX2VzdGltYXRvciwgZV9yY3UpOwotCWtmcmVlKGUpOwotfQotCiAvKioKICAqIGdlbl9raWxsX2VzdGltYXRvciAtIHJlbW92ZSBhIHJhdGUgZXN0aW1hdG9yCiAgKiBAYnN0YXRzOiBiYXNpYyBzdGF0aXN0aWNzCkBAIC0yNzksNyArMjcyLDcgQEAKIAkJd3JpdGVfdW5sb2NrKCZlc3RfbG9jayk7CiAKIAkJbGlzdF9kZWxfcmN1KCZlLT5saXN0KTsKLQkJY2FsbF9yY3UoJmUtPmVfcmN1LCBfX2dlbl9raWxsX2VzdGltYXRvcik7CisJCWtmcmVlX3JjdShlLCBlX3JjdSk7CiAJfQogCXNwaW5fdW5sb2NrX2JoKCZlc3RfdHJlZV9sb2NrKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldC1zeXNmcy5jIGIvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKaW5kZXggNWNlYjI1Ny4uODBiMmFhZCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKKysrIGIvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKQEAgLTU2NSwxMyArNTY1LDYgQEAKIAlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgdm9pZCBycHNfbWFwX3JlbGVhc2Uoc3RydWN0IHJjdV9oZWFkICpyY3UpCi17Ci0Jc3RydWN0IHJwc19tYXAgKm1hcCA9IGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBycHNfbWFwLCByY3UpOwotCi0Ja2ZyZWUobWFwKTsKLX0KLQogc3RhdGljIHNzaXplX3Qgc3RvcmVfcnBzX21hcChzdHJ1Y3QgbmV0ZGV2X3J4X3F1ZXVlICpxdWV1ZSwKIAkJICAgICAgc3RydWN0IHJ4X3F1ZXVlX2F0dHJpYnV0ZSAqYXR0cmlidXRlLAogCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCkBAIC02MTksNyArNjEyLDcgQEAKIAlzcGluX3VubG9jaygmcnBzX21hcF9sb2NrKTsKIAogCWlmIChvbGRfbWFwKQotCQljYWxsX3JjdSgmb2xkX21hcC0+cmN1LCBycHNfbWFwX3JlbGVhc2UpOworCQlrZnJlZV9yY3Uob2xkX21hcCwgcmN1KTsKIAogCWZyZWVfY3B1bWFza192YXIobWFzayk7CiAJcmV0dXJuIGxlbjsKQEAgLTcyOCw3ICs3MjEsNyBAQAogCW1hcCA9IHJjdV9kZXJlZmVyZW5jZV9yYXcocXVldWUtPnJwc19tYXApOwogCWlmIChtYXApIHsKIAkJUkNVX0lOSVRfUE9JTlRFUihxdWV1ZS0+cnBzX21hcCwgTlVMTCk7Ci0JCWNhbGxfcmN1KCZtYXAtPnJjdSwgcnBzX21hcF9yZWxlYXNlKTsKKwkJa2ZyZWVfcmN1KG1hcCwgcmN1KTsKIAl9CiAKIAlmbG93X3RhYmxlID0gcmN1X2RlcmVmZXJlbmNlX3JhdyhxdWV1ZS0+cnBzX2Zsb3dfdGFibGUpOwpAQCAtODk4LDIxICs4OTEsNiBAQAogCXJldHVybiBsZW47CiB9CiAKLXN0YXRpYyB2b2lkIHhwc19tYXBfcmVsZWFzZShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKLXsKLQlzdHJ1Y3QgeHBzX21hcCAqbWFwID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IHhwc19tYXAsIHJjdSk7Ci0KLQlrZnJlZShtYXApOwotfQotCi1zdGF0aWMgdm9pZCB4cHNfZGV2X21hcHNfcmVsZWFzZShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKLXsKLQlzdHJ1Y3QgeHBzX2Rldl9tYXBzICpkZXZfbWFwcyA9Ci0JICAgIGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCB4cHNfZGV2X21hcHMsIHJjdSk7Ci0KLQlrZnJlZShkZXZfbWFwcyk7Ci19Ci0KIHN0YXRpYyBERUZJTkVfTVVURVgoeHBzX21hcF9tdXRleCk7CiAjZGVmaW5lIHhtYXBfZGVyZWZlcmVuY2UoUCkJCVwKIAlyY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKChQKSwgbG9ja2RlcF9pc19oZWxkKCZ4cHNfbWFwX211dGV4KSkKQEAgLTEwMDksNyArOTg3LDcgQEAKIAkJbWFwID0gZGV2X21hcHMgPwogCQkJeG1hcF9kZXJlZmVyZW5jZShkZXZfbWFwcy0+Y3B1X21hcFtjcHVdKSA6IE5VTEw7CiAJCWlmIChtYXAgJiYgeG1hcF9kZXJlZmVyZW5jZShuZXdfZGV2X21hcHMtPmNwdV9tYXBbY3B1XSkgIT0gbWFwKQotCQkJY2FsbF9yY3UoJm1hcC0+cmN1LCB4cHNfbWFwX3JlbGVhc2UpOworCQkJa2ZyZWVfcmN1KG1hcCwgcmN1KTsKIAkJaWYgKG5ld19kZXZfbWFwcy0+Y3B1X21hcFtjcHVdKQogCQkJbm9uZW1wdHkgPSAxOwogCX0KQEAgLTEwMjIsNyArMTAwMCw3IEBACiAJfQogCiAJaWYgKGRldl9tYXBzKQotCQljYWxsX3JjdSgmZGV2X21hcHMtPnJjdSwgeHBzX2Rldl9tYXBzX3JlbGVhc2UpOworCQlrZnJlZV9yY3UoZGV2X21hcHMsIHJjdSk7CiAKIAluZXRkZXZfcXVldWVfbnVtYV9ub2RlX3dyaXRlKHF1ZXVlLCAobnVtYV9ub2RlID49IDApID8gbnVtYV9ub2RlIDoKIAkJCQkJICAgIE5VTUFfTk9fTk9ERSk7CkBAIC0xMDg0LDcgKzEwNjIsNyBAQAogCQkJCWVsc2UgewogCQkJCQlSQ1VfSU5JVF9QT0lOVEVSKGRldl9tYXBzLT5jcHVfbWFwW2ldLAogCQkJCQkgICAgTlVMTCk7Ci0JCQkJCWNhbGxfcmN1KCZtYXAtPnJjdSwgeHBzX21hcF9yZWxlYXNlKTsKKwkJCQkJa2ZyZWVfcmN1KG1hcCwgcmN1KTsKIAkJCQkJbWFwID0gTlVMTDsKIAkJCQl9CiAJCQl9CkBAIC0xMDk0LDcgKzEwNzIsNyBAQAogCiAJCWlmICghbm9uZW1wdHkpIHsKIAkJCVJDVV9JTklUX1BPSU5URVIoZGV2LT54cHNfbWFwcywgTlVMTCk7Ci0JCQljYWxsX3JjdSgmZGV2X21hcHMtPnJjdSwgeHBzX2Rldl9tYXBzX3JlbGVhc2UpOworCQkJa2ZyZWVfcmN1KGRldl9tYXBzLCByY3UpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvY29yZS9uZXRfbmFtZXNwYWNlLmMgYi9uZXQvY29yZS9uZXRfbmFtZXNwYWNlLmMKaW5kZXggM2Y4NjAyNi4uMjk3YmI5MiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmV0X25hbWVzcGFjZS5jCisrKyBiL25ldC9jb3JlL25ldF9uYW1lc3BhY2UuYwpAQCAtMjcsMTQgKzI3LDYgQEAKIAogI2RlZmluZSBJTklUSUFMX05FVF9HRU5fUFRSUwkxMyAvKiArMSBmb3IgbGVuICsyIGZvciByY3VfaGVhZCAqLwogCi1zdGF0aWMgdm9pZCBuZXRfZ2VuZXJpY19yZWxlYXNlKHN0cnVjdCByY3VfaGVhZCAqcmN1KQotewotCXN0cnVjdCBuZXRfZ2VuZXJpYyAqbmc7Ci0KLQluZyA9IGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBuZXRfZ2VuZXJpYywgcmN1KTsKLQlrZnJlZShuZyk7Ci19Ci0KIHN0YXRpYyBpbnQgbmV0X2Fzc2lnbl9nZW5lcmljKHN0cnVjdCBuZXQgKm5ldCwgaW50IGlkLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBuZXRfZ2VuZXJpYyAqbmcsICpvbGRfbmc7CkBAIC02OCw3ICs2MCw3IEBACiAJbWVtY3B5KCZuZy0+cHRyLCAmb2xkX25nLT5wdHIsIG9sZF9uZy0+bGVuICogc2l6ZW9mKHZvaWQqKSk7CiAKIAlyY3VfYXNzaWduX3BvaW50ZXIobmV0LT5nZW4sIG5nKTsKLQljYWxsX3JjdSgmb2xkX25nLT5yY3UsIG5ldF9nZW5lcmljX3JlbGVhc2UpOworCWtmcmVlX3JjdShvbGRfbmcsIHJjdSk7CiBhc3NpZ246CiAJbmctPnB0cltpZCAtIDFdID0gZGF0YTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvZG5fZGV2LmMgYi9uZXQvZGVjbmV0L2RuX2Rldi5jCmluZGV4IDBkY2FhOTAuLjRjMjc2MTUgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvZG5fZGV2LmMKKysrIGIvbmV0L2RlY25ldC9kbl9kZXYuYwpAQCAtMzMyLDE0ICszMzIsOSBAQAogCXJldHVybiBpZmE7CiB9CiAKLXN0YXRpYyB2b2lkIGRuX2Rldl9mcmVlX2lmYV9yY3Uoc3RydWN0IHJjdV9oZWFkICpoZWFkKQotewotCWtmcmVlKGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgZG5faWZhZGRyLCByY3UpKTsKLX0KLQogc3RhdGljIHZvaWQgZG5fZGV2X2ZyZWVfaWZhKHN0cnVjdCBkbl9pZmFkZHIgKmlmYSkKIHsKLQljYWxsX3JjdSgmaWZhLT5yY3UsIGRuX2Rldl9mcmVlX2lmYV9yY3UpOworCWtmcmVlX3JjdShpZmEsIHJjdSk7CiB9CiAKIHN0YXRpYyB2b2lkIGRuX2Rldl9kZWxfaWZhKHN0cnVjdCBkbl9kZXYgKmRuX2RiLCBzdHJ1Y3QgZG5faWZhZGRyIF9fcmN1ICoqaWZhcCwgaW50IGRlc3Ryb3kpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9maWJfc2VtYW50aWNzLmMgYi9uZXQvaXB2NC9maWJfc2VtYW50aWNzLmMKaW5kZXggNjQxYTVhMi4uMzNlMmMzNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX3NlbWFudGljcy5jCisrKyBiL25ldC9pcHY0L2ZpYl9zZW1hbnRpY3MuYwpAQCAtMTQxLDE4ICsxNDEsOCBAQAogCX0sCiB9OwogCi0KIC8qIFJlbGVhc2UgYSBuZXh0aG9wIGluZm8gcmVjb3JkICovCiAKLXN0YXRpYyB2b2lkIGZyZWVfZmliX2luZm9fcmN1KHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKLXsKLQlzdHJ1Y3QgZmliX2luZm8gKmZpID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBmaWJfaW5mbywgcmN1KTsKLQotCWlmIChmaS0+ZmliX21ldHJpY3MgIT0gKHUzMiAqKSBkc3RfZGVmYXVsdF9tZXRyaWNzKQotCQlrZnJlZShmaS0+ZmliX21ldHJpY3MpOwotCWtmcmVlKGZpKTsKLX0KLQogdm9pZCBmcmVlX2ZpYl9pbmZvKHN0cnVjdCBmaWJfaW5mbyAqZmkpCiB7CiAJaWYgKGZpLT5maWJfZGVhZCA9PSAwKSB7CkBAIC0xNjYsNyArMTU2LDcgQEAKIAl9IGVuZGZvcl9uZXh0aG9wcyhmaSk7CiAJZmliX2luZm9fY250LS07CiAJcmVsZWFzZV9uZXQoZmktPmZpYl9uZXQpOwotCWNhbGxfcmN1KCZmaS0+cmN1LCBmcmVlX2ZpYl9pbmZvX3JjdSk7CisJa2ZyZWVfcmN1KGZpLCByY3UpOwogfQogCiB2b2lkIGZpYl9yZWxlYXNlX2luZm8oc3RydWN0IGZpYl9pbmZvICpmaSkKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2ZpYl90cmllLmMgYi9uZXQvaXB2NC9maWJfdHJpZS5jCmluZGV4IDVmZTliOGIuLjExZDRkMjggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ZpYl90cmllLmMKKysrIGIvbmV0L2lwdjQvZmliX3RyaWUuYwpAQCAtMzUwLDE0ICszNTAsOSBAQAogCWNhbGxfcmN1X2JoKCZsLT5yY3UsIF9fbGVhZl9mcmVlX3JjdSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fbGVhZl9pbmZvX2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKLXsKLQlrZnJlZShjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IGxlYWZfaW5mbywgcmN1KSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2xlYWZfaW5mbyhzdHJ1Y3QgbGVhZl9pbmZvICpsZWFmKQogewotCWNhbGxfcmN1KCZsZWFmLT5yY3UsIF9fbGVhZl9pbmZvX2ZyZWVfcmN1KTsKKwlrZnJlZV9yY3UobGVhZiwgcmN1KTsKIH0KIAogc3RhdGljIHN0cnVjdCB0bm9kZSAqdG5vZGVfYWxsb2Moc2l6ZV90IHNpemUpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pZ21wLmMgYi9uZXQvaXB2NC9pZ21wLmMKaW5kZXggMWZkM2Q5Yy4uOGY2MmQ2NiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaWdtcC5jCisrKyBiL25ldC9pcHY0L2lnbXAuYwpAQCAtMTQ5LDE3ICsxNDksMTEgQEAKIHN0YXRpYyBpbnQgaXBfbWNfYWRkX3NyYyhzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYsIF9fYmUzMiAqcG1jYSwgaW50IHNmbW9kZSwKIAkJCSBpbnQgc2Zjb3VudCwgX19iZTMyICpwc2ZzcmMsIGludCBkZWx0YSk7CiAKLQotc3RhdGljIHZvaWQgaXBfbWNfbGlzdF9yZWNsYWltKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKLXsKLQlrZnJlZShjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IGlwX21jX2xpc3QsIHJjdSkpOwotfQotCiBzdGF0aWMgdm9pZCBpcF9tYV9wdXQoc3RydWN0IGlwX21jX2xpc3QgKmltKQogewogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZpbS0+cmVmY250KSkgewogCQlpbl9kZXZfcHV0KGltLT5pbnRlcmZhY2UpOwotCQljYWxsX3JjdSgmaW0tPnJjdSwgaXBfbWNfbGlzdF9yZWNsYWltKTsKKwkJa2ZyZWVfcmN1KGltLCByY3UpOwogCX0KIH0KIApAQCAtMTgzNiwxMiArMTgzMCw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGlwX21jX2pvaW5fZ3JvdXApOwogCi1zdGF0aWMgdm9pZCBpcF9zZl9zb2NrbGlzdF9yZWNsYWltKHN0cnVjdCByY3VfaGVhZCAqcnApCi17Ci0Ja2ZyZWUoY29udGFpbmVyX29mKHJwLCBzdHJ1Y3QgaXBfc2Zfc29ja2xpc3QsIHJjdSkpOwotCS8qIHNrX29tZW1fYWxsb2Mgc2hvdWxkIGhhdmUgYmVlbiBkZWNyZWFzZWQgYnkgdGhlIGNhbGxlciovCi19Ci0KIHN0YXRpYyBpbnQgaXBfbWNfbGVhdmVfc3JjKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGlwX21jX3NvY2tsaXN0ICppbWwsCiAJCQkgICBzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYpCiB7CkBAIC0xODU4LDE4ICsxODQ2LDEwIEBACiAJcmN1X2Fzc2lnbl9wb2ludGVyKGltbC0+c2ZsaXN0LCBOVUxMKTsKIAkvKiBkZWNyZWFzZSBtZW0gbm93IHRvIGF2b2lkIHRoZSBtZW1sZWFrIHdhcm5pbmcgKi8KIAlhdG9taWNfc3ViKElQX1NGTFNJWkUocHNmLT5zbF9tYXgpLCAmc2stPnNrX29tZW1fYWxsb2MpOwotCWNhbGxfcmN1KCZwc2YtPnJjdSwgaXBfc2Zfc29ja2xpc3RfcmVjbGFpbSk7CisJa2ZyZWVfcmN1KHBzZiwgcmN1KTsKIAlyZXR1cm4gZXJyOwogfQogCi0KLXN0YXRpYyB2b2lkIGlwX21jX3NvY2tsaXN0X3JlY2xhaW0oc3RydWN0IHJjdV9oZWFkICpycCkKLXsKLQlrZnJlZShjb250YWluZXJfb2YocnAsIHN0cnVjdCBpcF9tY19zb2NrbGlzdCwgcmN1KSk7Ci0JLyogc2tfb21lbV9hbGxvYyBzaG91bGQgaGF2ZSBiZWVuIGRlY3JlYXNlZCBieSB0aGUgY2FsbGVyKi8KLX0KLQotCiAvKgogICoJQXNrIGEgc29ja2V0IHRvIGxlYXZlIGEgZ3JvdXAuCiAgKi8KQEAgLTE5MDksNyArMTg4OSw3IEBACiAJCXJ0bmxfdW5sb2NrKCk7CiAJCS8qIGRlY3JlYXNlIG1lbSBub3cgdG8gYXZvaWQgdGhlIG1lbWxlYWsgd2FybmluZyAqLwogCQlhdG9taWNfc3ViKHNpemVvZigqaW1sKSwgJnNrLT5za19vbWVtX2FsbG9jKTsKLQkJY2FsbF9yY3UoJmltbC0+cmN1LCBpcF9tY19zb2NrbGlzdF9yZWNsYWltKTsKKwkJa2ZyZWVfcmN1KGltbCwgcmN1KTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmICghaW5fZGV2KQpAQCAtMjAyNiw3ICsyMDA2LDcgQEAKIAkJCQluZXdwc2wtPnNsX2FkZHJbaV0gPSBwc2wtPnNsX2FkZHJbaV07CiAJCQkvKiBkZWNyZWFzZSBtZW0gbm93IHRvIGF2b2lkIHRoZSBtZW1sZWFrIHdhcm5pbmcgKi8KIAkJCWF0b21pY19zdWIoSVBfU0ZMU0laRShwc2wtPnNsX21heCksICZzay0+c2tfb21lbV9hbGxvYyk7Ci0JCQljYWxsX3JjdSgmcHNsLT5yY3UsIGlwX3NmX3NvY2tsaXN0X3JlY2xhaW0pOworCQkJa2ZyZWVfcmN1KHBzbCwgcmN1KTsKIAkJfQogCQlyY3VfYXNzaWduX3BvaW50ZXIocG1jLT5zZmxpc3QsIG5ld3BzbCk7CiAJCXBzbCA9IG5ld3BzbDsKQEAgLTIxMjcsNyArMjEwNyw3IEBACiAJCQlwc2wtPnNsX2NvdW50LCBwc2wtPnNsX2FkZHIsIDApOwogCQkvKiBkZWNyZWFzZSBtZW0gbm93IHRvIGF2b2lkIHRoZSBtZW1sZWFrIHdhcm5pbmcgKi8KIAkJYXRvbWljX3N1YihJUF9TRkxTSVpFKHBzbC0+c2xfbWF4KSwgJnNrLT5za19vbWVtX2FsbG9jKTsKLQkJY2FsbF9yY3UoJnBzbC0+cmN1LCBpcF9zZl9zb2NrbGlzdF9yZWNsYWltKTsKKwkJa2ZyZWVfcmN1KHBzbCwgcmN1KTsKIAl9IGVsc2UKIAkJKHZvaWQpIGlwX21jX2RlbF9zcmMoaW5fZGV2LCAmbXNmLT5pbXNmX211bHRpYWRkciwgcG1jLT5zZm1vZGUsCiAJCQkwLCBOVUxMLCAwKTsKQEAgLTIzMjQsNyArMjMwNCw3IEBACiAJCQlpcF9tY19kZWNfZ3JvdXAoaW5fZGV2LCBpbWwtPm11bHRpLmltcl9tdWx0aWFkZHIuc19hZGRyKTsKIAkJLyogZGVjcmVhc2UgbWVtIG5vdyB0byBhdm9pZCB0aGUgbWVtbGVhayB3YXJuaW5nICovCiAJCWF0b21pY19zdWIoc2l6ZW9mKCppbWwpLCAmc2stPnNrX29tZW1fYWxsb2MpOwotCQljYWxsX3JjdSgmaW1sLT5yY3UsIGlwX21jX3NvY2tsaXN0X3JlY2xhaW0pOworCQlrZnJlZV9yY3UoaW1sLCByY3UpOwogCX0KIAlydG5sX3VubG9jaygpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWRkcmNvbmYuYyBiL25ldC9pcHY2L2FkZHJjb25mLmMKaW5kZXggYTdiZGEwNy4uOGYxM2Q4OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWRkcmNvbmYuYworKysgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCkBAIC0zMTcsMTIgKzMxNyw2IEBACiAKIC8qIE5vYm9keSByZWZlcnMgdG8gdGhpcyBkZXZpY2UsIHdlIG1heSBkZXN0cm95IGl0LiAqLwogCi1zdGF0aWMgdm9pZCBpbjZfZGV2X2ZpbmlzaF9kZXN0cm95X3JjdShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCi17Ci0Jc3RydWN0IGluZXQ2X2RldiAqaWRldiA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgaW5ldDZfZGV2LCByY3UpOwotCWtmcmVlKGlkZXYpOwotfQotCiB2b2lkIGluNl9kZXZfZmluaXNoX2Rlc3Ryb3koc3RydWN0IGluZXQ2X2RldiAqaWRldikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWRldi0+ZGV2OwpAQCAtMzM5LDcgKzMzMyw3IEBACiAJCXJldHVybjsKIAl9CiAJc25tcDZfZnJlZV9kZXYoaWRldik7Ci0JY2FsbF9yY3UoJmlkZXYtPnJjdSwgaW42X2Rldl9maW5pc2hfZGVzdHJveV9yY3UpOworCWtmcmVlX3JjdShpZGV2LCByY3UpOwogfQogCiBFWFBPUlRfU1lNQk9MKGluNl9kZXZfZmluaXNoX2Rlc3Ryb3kpOwpAQCAtNTM1LDEyICs1MjksNiBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIGluZXQ2X2lmYV9maW5pc2hfZGVzdHJveV9yY3Uoc3RydWN0IHJjdV9oZWFkICpoZWFkKQotewotCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgaW5ldDZfaWZhZGRyLCByY3UpOwotCWtmcmVlKGlmcCk7Ci19Ci0KIC8qIE5vYm9keSByZWZlcnMgdG8gdGhpcyBpZmFkZHIsIGRlc3Ryb3kgaXQgKi8KIHZvaWQgaW5ldDZfaWZhX2ZpbmlzaF9kZXN0cm95KHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCkKIHsKQEAgLTU2MSw3ICs1NDksNyBAQAogCX0KIAlkc3RfcmVsZWFzZSgmaWZwLT5ydC0+ZHN0KTsKIAotCWNhbGxfcmN1KCZpZnAtPnJjdSwgaW5ldDZfaWZhX2ZpbmlzaF9kZXN0cm95X3JjdSk7CisJa2ZyZWVfcmN1KGlmcCwgcmN1KTsKIH0KIAogc3RhdGljIHZvaWQKZGlmZiAtLWdpdCBhL25ldC9pcHY2L21jYXN0LmMgYi9uZXQvaXB2Ni9tY2FzdC5jCmluZGV4IDc2Yjg5MzcuLmYyZDk4Y2EgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L21jYXN0LmMKKysrIGIvbmV0L2lwdjYvbWNhc3QuYwpAQCAtMjAxLDEwICsyMDEsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBpcHY2X21jX3NvY2tsaXN0X3JlY2xhaW0oc3RydWN0IHJjdV9oZWFkICpoZWFkKQotewotCWtmcmVlKGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgaXB2Nl9tY19zb2NrbGlzdCwgcmN1KSk7Ci19CiAvKgogICoJc29ja2V0IGxlYXZlIG9uIG11bHRpY2FzdCBncm91cAogICovCkBAIC0yMzksNyArMjM1LDcgQEAKIAkJCQkodm9pZCkgaXA2X21jX2xlYXZlX3NyYyhzaywgbWNfbHN0LCBOVUxMKTsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJYXRvbWljX3N1YihzaXplb2YoKm1jX2xzdCksICZzay0+c2tfb21lbV9hbGxvYyk7Ci0JCQljYWxsX3JjdSgmbWNfbHN0LT5yY3UsIGlwdjZfbWNfc29ja2xpc3RfcmVjbGFpbSk7CisJCQlrZnJlZV9yY3UobWNfbHN0LCByY3UpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CkBAIC0zMDcsNyArMzAzLDcgQEAKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkJYXRvbWljX3N1YihzaXplb2YoKm1jX2xzdCksICZzay0+c2tfb21lbV9hbGxvYyk7Ci0JCWNhbGxfcmN1KCZtY19sc3QtPnJjdSwgaXB2Nl9tY19zb2NrbGlzdF9yZWNsYWltKTsKKwkJa2ZyZWVfcmN1KG1jX2xzdCwgcmN1KTsKIAogCQlzcGluX2xvY2soJmlwdjZfc2tfbWNfbG9jayk7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvc2l0LmMgYi9uZXQvaXB2Ni9zaXQuYwppbmRleCA0M2IzMzM3Li41ZjM1ZDU5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9zaXQuYworKysgYi9uZXQvaXB2Ni9zaXQuYwpAQCAtNDAxLDExICs0MDEsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIHBybF9lbnRyeV9kZXN0cm95X3JjdShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCi17Ci0Ja2ZyZWUoY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBpcF90dW5uZWxfcHJsX2VudHJ5LCByY3VfaGVhZCkpOwotfQotCiBzdGF0aWMgdm9pZCBwcmxfbGlzdF9kZXN0cm95X3JjdShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCiB7CiAJc3RydWN0IGlwX3R1bm5lbF9wcmxfZW50cnkgKnAsICpuOwpAQCAtNDMzLDcgKzQyOCw3IEBACiAJCSAgICAgcCA9ICZ4LT5uZXh0KSB7CiAJCQlpZiAoeC0+YWRkciA9PSBhLT5hZGRyKSB7CiAJCQkJKnAgPSB4LT5uZXh0OwotCQkJCWNhbGxfcmN1KCZ4LT5yY3VfaGVhZCwgcHJsX2VudHJ5X2Rlc3Ryb3lfcmN1KTsKKwkJCQlrZnJlZV9yY3UoeCwgcmN1X2hlYWQpOwogCQkJCXQtPnBybF9jb3VudC0tOwogCQkJCWdvdG8gb3V0OwogCQkJfQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2FnZy10eC5jIGIvbmV0L21hYzgwMjExL2FnZy10eC5jCmluZGV4IDYzZDg1MmMuLjUzZGVmYWYgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9hZ2ctdHguYworKysgYi9uZXQvbWFjODAyMTEvYWdnLXR4LmMKQEAgLTEzNiwxNCArMTM2LDYgQEAKIAlpZWVlODAyMTFfdHhfc2tiKHNkYXRhLCBza2IpOwogfQogCi1zdGF0aWMgdm9pZCBrZnJlZV90aWRfdHgoc3RydWN0IHJjdV9oZWFkICpyY3VfaGVhZCkKLXsKLQlzdHJ1Y3QgdGlkX2FtcGR1X3R4ICp0aWRfdHggPQotCSAgICBjb250YWluZXJfb2YocmN1X2hlYWQsIHN0cnVjdCB0aWRfYW1wZHVfdHgsIHJjdV9oZWFkKTsKLQotCWtmcmVlKHRpZF90eCk7Ci19Ci0KIGludCBfX19pZWVlODAyMTFfc3RvcF90eF9iYV9zZXNzaW9uKHN0cnVjdCBzdGFfaW5mbyAqc3RhLCB1MTYgdGlkLAogCQkJCSAgICBlbnVtIGllZWU4MDIxMV9iYWNrX3BhcnRpZXMgaW5pdGlhdG9yLAogCQkJCSAgICBib29sIHR4KQpAQCAtMTYzLDcgKzE1NSw3IEBACiAJCS8qIG5vdCBldmVuIHN0YXJ0ZWQgeWV0ISAqLwogCQlyY3VfYXNzaWduX3BvaW50ZXIoc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdLCBOVUxMKTsKIAkJc3Bpbl91bmxvY2tfYmgoJnN0YS0+bG9jayk7Ci0JCWNhbGxfcmN1KCZ0aWRfdHgtPnJjdV9oZWFkLCBrZnJlZV90aWRfdHgpOworCQlrZnJlZV9yY3UodGlkX3R4LCByY3VfaGVhZCk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMzIyLDcgKzMxNCw3IEBACiAJCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOwogCiAJCWllZWU4MDIxMV93YWtlX3F1ZXVlX2FnZyhsb2NhbCwgdGlkKTsKLQkJY2FsbF9yY3UoJnRpZF90eC0+cmN1X2hlYWQsIGtmcmVlX3RpZF90eCk7CisJCWtmcmVlX3JjdSh0aWRfdHgsIHJjdV9oZWFkKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNzAxLDcgKzY5Myw3IEBACiAKIAlpZWVlODAyMTFfYWdnX3NwbGljZV9maW5pc2gobG9jYWwsIHRpZCk7CiAKLQljYWxsX3JjdSgmdGlkX3R4LT5yY3VfaGVhZCwga2ZyZWVfdGlkX3R4KTsKKwlrZnJlZV9yY3UodGlkX3R4LCByY3VfaGVhZCk7CiAKICB1bmxvY2tfc3RhOgogCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3dvcmsuYyBiL25ldC9tYWM4MDIxMS93b3JrLmMKaW5kZXggZTczYzhjYS4uYWMzNTQ5NiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3dvcmsuYworKysgYi9uZXQvbWFjODAyMTEvd29yay5jCkBAIC02NSwxNyArNjUsOSBAQAogCQltb2RfdGltZXIoJmxvY2FsLT53b3JrX3RpbWVyLCB0aW1lb3V0KTsKIH0KIAotc3RhdGljIHZvaWQgd29ya19mcmVlX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV93b3JrICp3ayA9Ci0JCWNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgaWVlZTgwMjExX3dvcmssIHJjdV9oZWFkKTsKLQotCWtmcmVlKHdrKTsKLX0KLQogdm9pZCBmcmVlX3dvcmsoc3RydWN0IGllZWU4MDIxMV93b3JrICp3aykKIHsKLQljYWxsX3JjdSgmd2stPnJjdV9oZWFkLCB3b3JrX2ZyZWVfcmN1KTsKKwlrZnJlZV9yY3Uod2ssIHJjdV9oZWFkKTsKIH0KIAogc3RhdGljIGludCBpZWVlODAyMTFfY29tcGF0aWJsZV9yYXRlcyhjb25zdCB1OCAqc3VwcF9yYXRlcywgaW50IHN1cHBfcmF0ZXNfbGVuLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuYwppbmRleCA4MGEyM2VkLi4wNWVjZGMyIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuYwpAQCAtNjgsMTIgKzY4LDYgQEAKIAlyZXR1cm4gKHZvaWQgKikoKmV4dCkgKyBvZmY7CiB9CiAKLXN0YXRpYyB2b2lkIF9fbmZfY3RfZXh0X2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKLXsKLQlzdHJ1Y3QgbmZfY3RfZXh0ICpleHQgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IG5mX2N0X2V4dCwgcmN1KTsKLQlrZnJlZShleHQpOwotfQotCiB2b2lkICpfX25mX2N0X2V4dF9hZGQoc3RydWN0IG5mX2Nvbm4gKmN0LCBlbnVtIG5mX2N0X2V4dF9pZCBpZCwgZ2ZwX3QgZ2ZwKQogewogCXN0cnVjdCBuZl9jdF9leHQgKm9sZCwgKm5ldzsKQEAgLTExNCw3ICsxMDgsNyBAQAogCQkJCQkodm9pZCAqKW9sZCArIG9sZC0+b2Zmc2V0W2ldKTsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwogCQl9Ci0JCWNhbGxfcmN1KCZvbGQtPnJjdSwgX19uZl9jdF9leHRfZnJlZV9yY3UpOworCQlrZnJlZV9yY3Uob2xkLCByY3UpOwogCQljdC0+ZXh0ID0gbmV3OwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9vc2YuYyBiL25ldC9uZXRmaWx0ZXIveHRfb3NmLmMKaW5kZXggNDMyN2UxMC4uODQ2Zjg5NSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9vc2YuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X29zZi5jCkBAIC02MiwxMyArNjIsNiBAQAogCVtPU0ZfQVRUUl9GSU5HRVJdCT0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCB4dF9vc2ZfdXNlcl9maW5nZXIpIH0sCiB9OwogCi1zdGF0aWMgdm9pZCB4dF9vc2ZfZmluZ2VyX2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqcmN1X2hlYWQpCi17Ci0Jc3RydWN0IHh0X29zZl9maW5nZXIgKmYgPSBjb250YWluZXJfb2YocmN1X2hlYWQsIHN0cnVjdCB4dF9vc2ZfZmluZ2VyLCByY3VfaGVhZCk7Ci0KLQlrZnJlZShmKTsKLX0KLQogc3RhdGljIGludCB4dF9vc2ZfYWRkX2NhbGxiYWNrKHN0cnVjdCBzb2NrICpjdG5sLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCBvc2ZfYXR0cnNbXSkKQEAgLTEzMyw3ICsxMjYsNyBAQAogCQkgKiBXZSBhcmUgcHJvdGVjdGVkIGJ5IG5mbmwgbXV0ZXguCiAJCSAqLwogCQlsaXN0X2RlbF9yY3UoJnNmLT5maW5nZXJfZW50cnkpOwotCQljYWxsX3JjdSgmc2YtPnJjdV9oZWFkLCB4dF9vc2ZfZmluZ2VyX2ZyZWVfcmN1KTsKKwkJa2ZyZWVfcmN1KHNmLCByY3VfaGVhZCk7CiAKIAkJZXJyID0gMDsKIAkJYnJlYWs7CkBAIC00MTQsNyArNDA3LDcgQEAKIAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShmLCAmeHRfb3NmX2ZpbmdlcnNbaV0sIGZpbmdlcl9lbnRyeSkgewogCQkJbGlzdF9kZWxfcmN1KCZmLT5maW5nZXJfZW50cnkpOwotCQkJY2FsbF9yY3UoJmYtPnJjdV9oZWFkLCB4dF9vc2ZfZmluZ2VyX2ZyZWVfcmN1KTsKKwkJCWtmcmVlX3JjdShmLCByY3VfaGVhZCk7CiAJCX0KIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdW5sYWJlbGVkLmMgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdW5sYWJlbGVkLmMKaW5kZXggZTJiMGE2OC4uOWMzODY1OCAxMDA2NDQKLS0tIGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VubGFiZWxlZC5jCisrKyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91bmxhYmVsZWQuYwpAQCAtMTU0LDQ0ICsxNTQsNiBAQAogICovCiAKIC8qKgotICogbmV0bGJsX3VubGhzaF9mcmVlX2FkZHI0IC0gRnJlZXMgYW4gSVB2NCBhZGRyZXNzIGVudHJ5IGZyb20gdGhlIGhhc2ggdGFibGUKLSAqIEBlbnRyeTogdGhlIGVudHJ5J3MgUkNVIGZpZWxkCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgYXMgYSBjYWxsYmFjayB0byB0aGUgY2FsbF9yY3UoKQotICogZnVuY3Rpb24gc28gdGhhdCBtZW1vcnkgYWxsb2NhdGVkIHRvIGEgaGFzaCB0YWJsZSBhZGRyZXNzIGVudHJ5IGNhbiBiZQotICogcmVsZWFzZWQgc2FmZWx5LgotICoKLSAqLwotc3RhdGljIHZvaWQgbmV0bGJsX3VubGhzaF9mcmVlX2FkZHI0KHN0cnVjdCByY3VfaGVhZCAqZW50cnkpCi17Ci0Jc3RydWN0IG5ldGxibF91bmxoc2hfYWRkcjQgKnB0cjsKLQotCXB0ciA9IGNvbnRhaW5lcl9vZihlbnRyeSwgc3RydWN0IG5ldGxibF91bmxoc2hfYWRkcjQsIHJjdSk7Ci0Ja2ZyZWUocHRyKTsKLX0KLQotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQotLyoqCi0gKiBuZXRsYmxfdW5saHNoX2ZyZWVfYWRkcjYgLSBGcmVlcyBhbiBJUHY2IGFkZHJlc3MgZW50cnkgZnJvbSB0aGUgaGFzaCB0YWJsZQotICogQGVudHJ5OiB0aGUgZW50cnkncyBSQ1UgZmllbGQKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgdXNlZCBhcyBhIGNhbGxiYWNrIHRvIHRoZSBjYWxsX3JjdSgpCi0gKiBmdW5jdGlvbiBzbyB0aGF0IG1lbW9yeSBhbGxvY2F0ZWQgdG8gYSBoYXNoIHRhYmxlIGFkZHJlc3MgZW50cnkgY2FuIGJlCi0gKiByZWxlYXNlZCBzYWZlbHkuCi0gKgotICovCi1zdGF0aWMgdm9pZCBuZXRsYmxfdW5saHNoX2ZyZWVfYWRkcjYoc3RydWN0IHJjdV9oZWFkICplbnRyeSkKLXsKLQlzdHJ1Y3QgbmV0bGJsX3VubGhzaF9hZGRyNiAqcHRyOwotCi0JcHRyID0gY29udGFpbmVyX29mKGVudHJ5LCBzdHJ1Y3QgbmV0bGJsX3VubGhzaF9hZGRyNiwgcmN1KTsKLQlrZnJlZShwdHIpOwotfQotI2VuZGlmIC8qIElQdjYgKi8KLQotLyoqCiAgKiBuZXRsYmxfdW5saHNoX2ZyZWVfaWZhY2UgLSBGcmVlcyBhbiBpbnRlcmZhY2UgZW50cnkgZnJvbSB0aGUgaGFzaCB0YWJsZQogICogQGVudHJ5OiB0aGUgZW50cnkncyBSQ1UgZmllbGQKICAqCkBAIC01NjgsNyArNTMwLDcgQEAKIAlpZiAoZW50cnkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKLQljYWxsX3JjdSgmZW50cnktPnJjdSwgbmV0bGJsX3VubGhzaF9mcmVlX2FkZHI0KTsKKwlrZnJlZV9yY3UoZW50cnksIHJjdSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYyOSw3ICs1OTEsNyBAQAogCWlmIChlbnRyeSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0VOVDsKIAotCWNhbGxfcmN1KCZlbnRyeS0+cmN1LCBuZXRsYmxfdW5saHNoX2ZyZWVfYWRkcjYpOworCWtmcmVlX3JjdShlbnRyeSwgcmN1KTsKIAlyZXR1cm4gMDsKIH0KICNlbmRpZiAvKiBJUHY2ICovCmRpZmYgLS1naXQgYS9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMgYi9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKaW5kZXggYzhmMzViNS4uNWZlNGYzYiAxMDA2NDQKLS0tIGEvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCisrKyBiL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYwpAQCAtMTU2NiwxMiArMTU2Niw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKG5ldGxpbmtfa2VybmVsX3JlbGVhc2UpOwogCi0KLXN0YXRpYyB2b2lkIGxpc3RlbmVyc19mcmVlX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCi17Ci0Ja2ZyZWUoY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBsaXN0ZW5lcnMsIHJjdSkpOwotfQotCiBpbnQgX19uZXRsaW5rX2NoYW5nZV9uZ3JvdXBzKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGdyb3VwcykKIHsKIAlzdHJ1Y3QgbGlzdGVuZXJzICpuZXcsICpvbGQ7CkBAIC0xNTg4LDcgKzE1ODIsNyBAQAogCQltZW1jcHkobmV3LT5tYXNrcywgb2xkLT5tYXNrcywgTkxHUlBTWih0YmwtPmdyb3VwcykpOwogCQlyY3VfYXNzaWduX3BvaW50ZXIodGJsLT5saXN0ZW5lcnMsIG5ldyk7CiAKLQkJY2FsbF9yY3UoJm9sZC0+cmN1LCBsaXN0ZW5lcnNfZnJlZV9yY3UpOworCQlrZnJlZV9yY3Uob2xkLCByY3UpOwogCX0KIAl0YmwtPmdyb3VwcyA9IGdyb3VwczsKIApkaWZmIC0tZ2l0IGEvbmV0L3Bob25ldC9wbl9kZXYuYyBiL25ldC9waG9uZXQvcG5fZGV2LmMKaW5kZXggOTQ3MDM4ZC4uMTU2NjY3MiAxMDA2NDQKLS0tIGEvbmV0L3Bob25ldC9wbl9kZXYuYworKysgYi9uZXQvcGhvbmV0L3BuX2Rldi5jCkBAIC0xNjIsMTQgKzE2Miw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgcGhvbmV0X2RldmljZV9yY3VfZnJlZShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCi17Ci0Jc3RydWN0IHBob25ldF9kZXZpY2UgKnBuZDsKLQotCXBuZCA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgcGhvbmV0X2RldmljZSwgcmN1KTsKLQlrZnJlZShwbmQpOwotfQotCiBpbnQgcGhvbmV0X2FkZHJlc3NfZGVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkZHIpCiB7CiAJc3RydWN0IHBob25ldF9kZXZpY2VfbGlzdCAqcG5kZXZzID0gcGhvbmV0X2RldmljZV9saXN0KGRldl9uZXQoZGV2KSk7CkBAIC0xODgsNyArMTgwLDcgQEAKIAltdXRleF91bmxvY2soJnBuZGV2cy0+bG9jayk7CiAKIAlpZiAocG5kKQotCQljYWxsX3JjdSgmcG5kLT5yY3UsIHBob25ldF9kZXZpY2VfcmN1X2ZyZWUpOworCQlrZnJlZV9yY3UocG5kLCByY3UpOwogCiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfYXBpLmMgYi9uZXQvc2NoZWQvYWN0X2FwaS5jCmluZGV4IDE0YjQyZjQuLmE2MDYwMjUgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfYXBpLmMKKysrIGIvbmV0L3NjaGVkL2FjdF9hcGkuYwpAQCAtMjYsMTEgKzI2LDYgQEAKICNpbmNsdWRlIDxuZXQvYWN0X2FwaS5oPgogI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAKLXN0YXRpYyB2b2lkIHRjZl9jb21tb25fZnJlZV9yY3Uoc3RydWN0IHJjdV9oZWFkICpoZWFkKQotewotCWtmcmVlKGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgdGNmX2NvbW1vbiwgdGNmY19yY3UpKTsKLX0KLQogdm9pZCB0Y2ZfaGFzaF9kZXN0cm95KHN0cnVjdCB0Y2ZfY29tbW9uICpwLCBzdHJ1Y3QgdGNmX2hhc2hpbmZvICpoaW5mbykKIHsKIAl1bnNpZ25lZCBpbnQgaCA9IHRjZl9oYXNoKHAtPnRjZmNfaW5kZXgsIGhpbmZvLT5obWFzayk7CkBAIC00Nyw3ICs0Miw3IEBACiAJCQkgKiBnZW5fZXN0aW1hdG9yIGVzdF90aW1lcigpIG1pZ2h0IGFjY2VzcyBwLT50Y2ZjX2xvY2sKIAkJCSAqIG9yIGJzdGF0cywgd2FpdCBhIFJDVSBncmFjZSBwZXJpb2QgYmVmb3JlIGZyZWVpbmcgcAogCQkJICovCi0JCQljYWxsX3JjdSgmcC0+dGNmY19yY3UsIHRjZl9jb21tb25fZnJlZV9yY3UpOworCQkJa2ZyZWVfcmN1KHAsIHRjZmNfcmN1KTsKIAkJCXJldHVybjsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfcG9saWNlLmMgYi9uZXQvc2NoZWQvYWN0X3BvbGljZS5jCmluZGV4IDhhMTYzMDcuLmIzYjliMzIgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfcG9saWNlLmMKKysrIGIvbmV0L3NjaGVkL2FjdF9wb2xpY2UuYwpAQCAtOTYsMTEgKzk2LDYgQEAKIAlnb3RvIGRvbmU7CiB9CiAKLXN0YXRpYyB2b2lkIHRjZl9wb2xpY2VfZnJlZV9yY3Uoc3RydWN0IHJjdV9oZWFkICpoZWFkKQotewotCWtmcmVlKGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgdGNmX3BvbGljZSwgdGNmX3JjdSkpOwotfQotCiBzdGF0aWMgdm9pZCB0Y2ZfcG9saWNlX2Rlc3Ryb3koc3RydWN0IHRjZl9wb2xpY2UgKnApCiB7CiAJdW5zaWduZWQgaW50IGggPSB0Y2ZfaGFzaChwLT50Y2ZfaW5kZXgsIFBPTF9UQUJfTUFTSyk7CkBAIC0xMjEsNyArMTE2LDcgQEAKIAkJCSAqIGdlbl9lc3RpbWF0b3IgZXN0X3RpbWVyKCkgbWlnaHQgYWNjZXNzIHAtPnRjZl9sb2NrCiAJCQkgKiBvciBic3RhdHMsIHdhaXQgYSBSQ1UgZ3JhY2UgcGVyaW9kIGJlZm9yZSBmcmVlaW5nIHAKIAkJCSAqLwotCQkJY2FsbF9yY3UoJnAtPnRjZl9yY3UsIHRjZl9wb2xpY2VfZnJlZV9yY3UpOworCQkJa2ZyZWVfcmN1KHAsIHRjZl9yY3UpOwogCQkJcmV0dXJuOwogCQl9CiAJfQpAQCAtNDAxLDcgKzM5Niw2IEBACiBwb2xpY2VfY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKIAl0Y2ZfdW5yZWdpc3Rlcl9hY3Rpb24oJmFjdF9wb2xpY2Vfb3BzKTsKLQlyY3VfYmFycmllcigpOyAvKiBXYWl0IGZvciBjb21wbGV0aW9uIG9mIGNhbGxfcmN1KCkncyAodGNmX3BvbGljZV9mcmVlX3JjdSkgKi8KIH0KIAogbW9kdWxlX2luaXQocG9saWNlX2luaXRfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2JpbmRfYWRkci5jIGIvbmV0L3NjdHAvYmluZF9hZGRyLmMKaW5kZXggZmFmNzFkMS4uM2MwNmM4NyAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvYmluZF9hZGRyLmMKKysrIGIvbmV0L3NjdHAvYmluZF9hZGRyLmMKQEAgLTIxOSw3ICsyMTksNyBAQAogCX0KIAogCWlmIChmb3VuZCkgewotCQljYWxsX3JjdSgmYWRkci0+cmN1LCBzY3RwX2xvY2FsX2FkZHJfZnJlZSk7CisJCWtmcmVlX3JjdShhZGRyLCByY3UpOwogCQlTQ1RQX0RCR19PQkpDTlRfREVDKGFkZHIpOwogCQlyZXR1cm4gMDsKIAl9CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9pcHY2LmMgYi9uZXQvc2N0cC9pcHY2LmMKaW5kZXggODY1Y2U3Yi4uMTg1ZmUwNSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvaXB2Ni5jCisrKyBiL25ldC9zY3RwL2lwdjYuYwpAQCAtMTIzLDcgKzEyMyw3IEBACiAJCX0KIAkJc3Bpbl91bmxvY2tfYmgoJnNjdHBfbG9jYWxfYWRkcl9sb2NrKTsKIAkJaWYgKGZvdW5kKQotCQkJY2FsbF9yY3UoJmFkZHItPnJjdSwgc2N0cF9sb2NhbF9hZGRyX2ZyZWUpOworCQkJa2ZyZWVfcmN1KGFkZHIsIHJjdSk7CiAJCWJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvcHJvdG9jb2wuYyBiL25ldC9zY3RwL3Byb3RvY29sLmMKaW5kZXggZDViZjkxZC4uMDY1ZDk5OSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvcHJvdG9jb2wuYworKysgYi9uZXQvc2N0cC9wcm90b2NvbC5jCkBAIC0yMzAsMTMgKzIzMCw2IEBACiAJfQogfQogCi12b2lkIHNjdHBfbG9jYWxfYWRkcl9mcmVlKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKLXsKLQlzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSAqZSA9IGNvbnRhaW5lcl9vZihoZWFkLAotCQkJCXN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5LCByY3UpOwotCWtmcmVlKGUpOwotfQotCiAvKiBDb3B5IHRoZSBsb2NhbCBhZGRyZXNzZXMgd2hpY2ggYXJlIHZhbGlkIGZvciAnc2NvcGUnIGludG8gJ2JwJy4gICovCiBpbnQgc2N0cF9jb3B5X2xvY2FsX2FkZHJfbGlzdChzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKmJwLCBzY3RwX3Njb3BlX3Qgc2NvcGUsCiAJCQkgICAgICBnZnBfdCBnZnAsIGludCBjb3B5X2ZsYWdzKQpAQCAtNjgxLDcgKzY3NCw3IEBACiAJCX0KIAkJc3Bpbl91bmxvY2tfYmgoJnNjdHBfbG9jYWxfYWRkcl9sb2NrKTsKIAkJaWYgKGZvdW5kKQotCQkJY2FsbF9yY3UoJmFkZHItPnJjdSwgc2N0cF9sb2NhbF9hZGRyX2ZyZWUpOworCQkJa2ZyZWVfcmN1KGFkZHIsIHJjdSk7CiAJCWJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L3NvY2tldC5jIGIvbmV0L3NvY2tldC5jCmluZGV4IDMxMGQxNmIuLmMyZWQ3YzkgMTAwNjQ0Ci0tLSBhL25ldC9zb2NrZXQuYworKysgYi9uZXQvc29ja2V0LmMKQEAgLTI2MywxNSArMjYzLDYgQEAKIAlyZXR1cm4gJmVpLT52ZnNfaW5vZGU7CiB9CiAKLQotCi1zdGF0aWMgdm9pZCB3cV9mcmVlX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCi17Ci0Jc3RydWN0IHNvY2tldF93cSAqd3EgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHNvY2tldF93cSwgcmN1KTsKLQotCWtmcmVlKHdxKTsKLX0KLQogc3RhdGljIHZvaWQgc29ja19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IHNvY2tldF9hbGxvYyAqZWk7CkBAIC0yNzksNyArMjcwLDcgQEAKIAogCWVpID0gY29udGFpbmVyX29mKGlub2RlLCBzdHJ1Y3Qgc29ja2V0X2FsbG9jLCB2ZnNfaW5vZGUpOwogCXdxID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChlaS0+c29ja2V0LndxLCAxKTsKLQljYWxsX3JjdSgmd3EtPnJjdSwgd3FfZnJlZV9yY3UpOworCWtmcmVlX3JjdSh3cSwgcmN1KTsKIAlrbWVtX2NhY2hlX2ZyZWUoc29ja19pbm9kZV9jYWNoZXAsIGVpKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9NYWtlZmlsZS5idWlsZCBiL3NjcmlwdHMvTWFrZWZpbGUuYnVpbGQKaW5kZXggZDVmOTI1YS4uNjE2NTYyMiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9NYWtlZmlsZS5idWlsZAorKysgYi9zY3JpcHRzL01ha2VmaWxlLmJ1aWxkCkBAIC0yNDQsMTQgKzI0NCwxOSBAQAogCiBpZmRlZiBDT05GSUdfRlRSQUNFX01DT1VOVF9SRUNPUkQKIGlmZGVmIEJVSUxEX0NfUkVDT1JETUNPVU5UCitpZmVxICgiJChvcmlnaW4gUkVDT1JETUNPVU5UX1dBUk4pIiwgImNvbW1hbmQgbGluZSIpCisgIFJFQ09SRE1DT1VOVF9GTEFHUyA9IC13CitlbmRpZgogIyBEdWUgdG8gcmVjdXJzaW9uLCB3ZSBtdXN0IHNraXAgZW1wdHkuby4KICMgVGhlIGVtcHR5Lm8gZmlsZSBpcyBjcmVhdGVkIGluIHRoZSBtYWtlIHByb2Nlc3MgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lCiAjICB0aGUgdGFyZ2V0IGVuZGlhbm5lc3MgYW5kIHdvcmQgc2l6ZS4gSXQgaXMgbWFkZSBiZWZvcmUgYWxsIG90aGVyIEMKICMgIGZpbGVzLCBpbmNsdWRpbmcgcmVjb3JkbWNvdW50Lgogc3ViX2NtZF9yZWNvcmRfbWNvdW50ID0JCQkJCVwKIAlpZiBbICQoQCkgIT0gInNjcmlwdHMvbW9kL2VtcHR5Lm8iIF07IHRoZW4JXAotCQkkKG9ianRyZWUpL3NjcmlwdHMvcmVjb3JkbWNvdW50ICIkKEApIjsJXAorCQkkKG9ianRyZWUpL3NjcmlwdHMvcmVjb3JkbWNvdW50ICQoUkVDT1JETUNPVU5UX0ZMQUdTKSAiJChAKSI7CVwKIAlmaTsKK3JlY29yZG1jb3VudF9zb3VyY2UgOj0gJChzcmN0cmVlKS9zY3JpcHRzL3JlY29yZG1jb3VudC5jIFwKKwkJICAgICQoc3JjdHJlZSkvc2NyaXB0cy9yZWNvcmRtY291bnQuaAogZWxzZQogc3ViX2NtZF9yZWNvcmRfbWNvdW50ID0gc2V0IC1lIDsgcGVybCAkKHNyY3RyZWUpL3NjcmlwdHMvcmVjb3JkbWNvdW50LnBsICIkKEFSQ0gpIiBcCiAJIiQoaWYgJChDT05GSUdfQ1BVX0JJR19FTkRJQU4pLGJpZyxsaXR0bGUpIiBcCkBAIC0yNTksNiArMjY0LDcgQEAKIAkiJChPQkpEVU1QKSIgIiQoT0JKQ09QWSkiICIkKENDKSAkKEtCVUlMRF9DRkxBR1MpIiBcCiAJIiQoTEQpIiAiJChOTSkiICIkKFJNKSIgIiQoTVYpIiBcCiAJIiQoaWYgJChwYXJ0LW9mLW1vZHVsZSksMSwwKSIgIiQoQCkiOworcmVjb3JkbWNvdW50X3NvdXJjZSA6PSAkKHNyY3RyZWUpL3NjcmlwdHMvcmVjb3JkbWNvdW50LnBsCiBlbmRpZgogY21kX3JlY29yZF9tY291bnQgPSAJCQkJCQlcCiAJaWYgWyAiJChmaW5kc3RyaW5nIC1wZywkKF9jX2ZsYWdzKSkiID0gIi1wZyIgXTsgdGhlbglcCkBAIC0yNzksMTMgKzI4NSwxMyBAQAogZW5kZWYKIAogIyBCdWlsdC1pbiBhbmQgY29tcG9zaXRlIG1vZHVsZSBwYXJ0cwotJChvYmopLyUubzogJChzcmMpLyUuYyBGT1JDRQorJChvYmopLyUubzogJChzcmMpLyUuYyAkKHJlY29yZG1jb3VudF9zb3VyY2UpIEZPUkNFCiAJJChjYWxsIGNtZCxmb3JjZV9jaGVja3NyYykKIAkkKGNhbGwgaWZfY2hhbmdlZF9ydWxlLGNjX29fYykKIAogIyBTaW5nbGUtcGFydCBtb2R1bGVzIGFyZSBzcGVjaWFsIHNpbmNlIHdlIG5lZWQgdG8gbWFyayB0aGVtIGluICQoTU9EVkVSRElSKQogCi0kKHNpbmdsZS11c2VkLW0pOiAkKG9iaikvJS5vOiAkKHNyYykvJS5jIEZPUkNFCiskKHNpbmdsZS11c2VkLW0pOiAkKG9iaikvJS5vOiAkKHNyYykvJS5jICQocmVjb3JkbWNvdW50X3NvdXJjZSkgRk9SQ0UKIAkkKGNhbGwgY21kLGZvcmNlX2NoZWNrc3JjKQogCSQoY2FsbCBpZl9jaGFuZ2VkX3J1bGUsY2Nfb19jKQogCUB7IGVjaG8gJChAOi5vPS5rbyk7IGVjaG8gJEA7IH0gPiAkKE1PRFZFUkRJUikvJChARjoubz0ubW9kKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tb2QvbW9kcG9zdC5jIGIvc2NyaXB0cy9tb2QvbW9kcG9zdC5jCmluZGV4IGNkMTA0YWYuLjQxM2M1MzYgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvbW9kL21vZHBvc3QuYworKysgYi9zY3JpcHRzL21vZC9tb2Rwb3N0LmMKQEAgLTQyMCwxMSArNDIwLDEwIEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmIChoZHItPmVfc2hudW0gPT0gMCkgeworCWlmIChoZHItPmVfc2hudW0gPT0gU0hOX1VOREVGKSB7CiAJCS8qCiAJCSAqIFRoZXJlIGFyZSBtb3JlIHRoYW4gNjRrIHNlY3Rpb25zLAogCQkgKiByZWFkIGNvdW50IGZyb20gLnNoX3NpemUuCi0JCSAqIG5vdGU6IGl0IGRvZXNuJ3QgbmVlZCBzaG5keDJzZWNpbmRleCgpCiAJCSAqLwogCQlpbmZvLT5udW1fc2VjdGlvbnMgPSBUT19OQVRJVkUoc2VjaGRyc1swXS5zaF9zaXplKTsKIAl9CkBAIC00MzIsOCArNDMxLDcgQEAKIAkJaW5mby0+bnVtX3NlY3Rpb25zID0gaGRyLT5lX3NobnVtOwogCX0KIAlpZiAoaGRyLT5lX3Noc3RybmR4ID09IFNITl9YSU5ERVgpIHsKLQkJaW5mby0+c2VjaW5kZXhfc3RyaW5ncyA9Ci0JCSAgICBzaG5keDJzZWNpbmRleChUT19OQVRJVkUoc2VjaGRyc1swXS5zaF9saW5rKSk7CisJCWluZm8tPnNlY2luZGV4X3N0cmluZ3MgPSBUT19OQVRJVkUoc2VjaGRyc1swXS5zaF9saW5rKTsKIAl9CiAJZWxzZSB7CiAJCWluZm8tPnNlY2luZGV4X3N0cmluZ3MgPSBoZHItPmVfc2hzdHJuZHg7CkBAIC00ODksNyArNDg3LDcgQEAKIAkJCSAgICBzZWNoZHJzW2ldLnNoX29mZnNldDsKIAkJCWluZm8tPnN5bXRhYl9zdG9wICA9ICh2b2lkICopaGRyICsKIAkJCSAgICBzZWNoZHJzW2ldLnNoX29mZnNldCArIHNlY2hkcnNbaV0uc2hfc2l6ZTsKLQkJCXNoX2xpbmtfaWR4ID0gc2huZHgyc2VjaW5kZXgoc2VjaGRyc1tpXS5zaF9saW5rKTsKKwkJCXNoX2xpbmtfaWR4ID0gc2VjaGRyc1tpXS5zaF9saW5rOwogCQkJaW5mby0+c3RydGFiICAgICAgID0gKHZvaWQgKiloZHIgKwogCQkJICAgIHNlY2hkcnNbc2hfbGlua19pZHhdLnNoX29mZnNldDsKIAkJfQpAQCAtNTE2LDExICs1MTQsOSBAQAogCiAJaWYgKHN5bXRhYl9zaG5keF9pZHggIT0gfjBVKSB7CiAJCUVsZjMyX1dvcmQgKnA7Ci0JCWlmIChzeW10YWJfaWR4ICE9Ci0JCSAgICBzaG5keDJzZWNpbmRleChzZWNoZHJzW3N5bXRhYl9zaG5keF9pZHhdLnNoX2xpbmspKQorCQlpZiAoc3ltdGFiX2lkeCAhPSBzZWNoZHJzW3N5bXRhYl9zaG5keF9pZHhdLnNoX2xpbmspCiAJCQlmYXRhbCgiJXM6IFNZTVRBQl9TSE5EWCBoYXMgYmFkIHNoX2xpbms6ICV1IT0ldVxuIiwKLQkJCSAgICAgIGZpbGVuYW1lLAotCQkJICAgICAgc2huZHgyc2VjaW5kZXgoc2VjaGRyc1tzeW10YWJfc2huZHhfaWR4XS5zaF9saW5rKSwKKwkJCSAgICAgIGZpbGVuYW1lLCBzZWNoZHJzW3N5bXRhYl9zaG5keF9pZHhdLnNoX2xpbmssCiAJCQkgICAgICBzeW10YWJfaWR4KTsKIAkJLyogRml4IGVuZGlhbm5lc3MgKi8KIAkJZm9yIChwID0gaW5mby0+c3ltdGFiX3NobmR4X3N0YXJ0OyBwIDwgaW5mby0+c3ltdGFiX3NobmR4X3N0b3A7CkBAIC0xNDQ2LDcgKzE0NDIsNyBAQAogCQkJCSAgICBFbGZfU2hkciAqc2VjaGRyLCBFbGZfUmVsYSAqcikKIHsKIAlFbGZfU2hkciAqc2VjaGRycyA9IGVsZi0+c2VjaGRyczsKLQlpbnQgc2VjdGlvbiA9IHNobmR4MnNlY2luZGV4KHNlY2hkci0+c2hfaW5mbyk7CisJaW50IHNlY3Rpb24gPSBzZWNoZHItPnNoX2luZm87CiAKIAlyZXR1cm4gKHZvaWQgKillbGYtPmhkciArIHNlY2hkcnNbc2VjdGlvbl0uc2hfb2Zmc2V0ICsKIAkJci0+cl9vZmZzZXQ7CmRpZmYgLS1naXQgYS9zY3JpcHRzL21vZC9tb2Rwb3N0LmggYi9zY3JpcHRzL21vZC9tb2Rwb3N0LmgKaW5kZXggMDM4OGNmY2MuLjIwMzExMTkgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvbW9kL21vZHBvc3QuaAorKysgYi9zY3JpcHRzL21vZC9tb2Rwb3N0LmgKQEAgLTE0NSwzMyArMTQ1LDIyIEBACiAJcmV0dXJuIGkgIT0gU0hOX1hJTkRFWCAmJiBpID49IFNITl9MT1JFU0VSVkUgJiYgaSA8PSBTSE5fSElSRVNFUlZFOwogfQogCi0vKiBzaG5keCBpcyBpbiBbMC4uU0hOX0xPUkVTRVJWRSkgVSAoU0hOX0hJUkVTRVJWRSwgMHhmZmZmZmZmXSwgdGh1czoKLSAqIHNobmR4ID09IDAgICAgICAgICAgICAgICA8PT4gc2VjaGRyc1swXQotICogLi4uLi4uCi0gKiBzaG5keCA9PSBTSE5fTE9SRVNFUlZFLTEgPD0+IHNlY2hkcnNbU0hOX0xPUkVTRVJWRS0xXQotICogc2huZHggPT0gU0hOX0hJUkVTRVJWRSsxIDw9PiBzZWNoZHJzW1NITl9MT1JFU0VSVkVdCi0gKiBzaG5keCA9PSBTSE5fSElSRVNFUlZFKzIgPD0+IHNlY2hkcnNbU0hOX0xPUkVTRVJWRSsxXQotICogLi4uLi4uCi0gKiBmeWk6IHN5bS0+c3Rfc2huZHggaXMgdWludDE2LCBTSE5fTE9SRVNFUlZFID0gZmYwMCwgU0hOX0hJUkVTRVJWRSA9IGZmZmYsCi0gKiBzbyBiYXNpY2FsbHkgd2UgbWFwICAwMDAwLi5mZWZmIC0+IDAwMDAuLmZlZmYKLSAqICAgICAgICAgICAgICAgICAgICAgIGZmMDAuLmZmZmYgLT4gKHlvdSBhcmUgYSBiYWQgYm95LCBkb250IGRvIGl0KQotICogICAgICAgICAgICAgICAgICAgICAxMDAwMC4ueHh4eCAtPiBmZjAwLi4oeHh4eC0weDEwMCkKKy8qCisgKiBNb3ZlIHJlc2VydmVkIHNlY3Rpb24gaW5kaWNlcyBTSE5fTE9SRVNFUlZFLi5TSE5fSElSRVNFUlZFIG91dCBvZgorICogdGhlIHdheSB0byAtMjU2Li4tMSwgdG8gYXZvaWQgY29uZmxpY3Rpbmcgd2l0aCByZWFsIHNlY3Rpb24KKyAqIGluZGljZXMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNobmR4MnNlY2luZGV4KHVuc2lnbmVkIGludCBpKQotewotCWlmIChpIDw9IFNITl9ISVJFU0VSVkUpCi0JCXJldHVybiBpOwotCXJldHVybiBpIC0gKFNITl9ISVJFU0VSVkUgKyAxIC0gU0hOX0xPUkVTRVJWRSk7Ci19CisjZGVmaW5lIFNQRUNJQUwoaSkgKChpKSAtIChTSE5fSElSRVNFUlZFICsgMSkpCiAKIC8qIEFjY2Vzc29yIGZvciBzeW0tPnN0X3NobmR4LCBoaWRlcyB1Z2xpbmVzcyBvZiAiNjRrIHNlY3Rpb25zIiAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X3NlY2luZGV4KGNvbnN0IHN0cnVjdCBlbGZfaW5mbyAqaW5mbywKIAkJCQkJY29uc3QgRWxmX1N5bSAqc3ltKQogeworCWlmIChpc19zaG5keF9zcGVjaWFsKHN5bS0+c3Rfc2huZHgpKQorCQlyZXR1cm4gU1BFQ0lBTChzeW0tPnN0X3NobmR4KTsKIAlpZiAoc3ltLT5zdF9zaG5keCAhPSBTSE5fWElOREVYKQogCQlyZXR1cm4gc3ltLT5zdF9zaG5keDsKLQlyZXR1cm4gc2huZHgyc2VjaW5kZXgoaW5mby0+c3ltdGFiX3NobmR4X3N0YXJ0W3N5bSAtCi0JCQkJCQkgICAgICAgaW5mby0+c3ltdGFiX3N0YXJ0XSk7CisJcmV0dXJuIGluZm8tPnN5bXRhYl9zaG5keF9zdGFydFtzeW0gLSBpbmZvLT5zeW10YWJfc3RhcnRdOwogfQogCiAvKiBmaWxlMmFsaWFzLmMgKi8KZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kdWxlLWNvbW1vbi5sZHMgYi9zY3JpcHRzL21vZHVsZS1jb21tb24ubGRzCmluZGV4IDQ3YTFmOWEuLjA4NjViM2UgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvbW9kdWxlLWNvbW1vbi5sZHMKKysrIGIvc2NyaXB0cy9tb2R1bGUtY29tbW9uLmxkcwpAQCAtNSw0ICs1LDE1IEBACiAgKi8KIFNFQ1RJT05TIHsKIAkvRElTQ0FSRC8gOiB7ICooLmRpc2NhcmQpIH0KKworCV9fa3N5bXRhYgkJOiB7ICooU09SVChfX19rc3ltdGFiKyopKSB9CisJX19rc3ltdGFiX2dwbAkJOiB7ICooU09SVChfX19rc3ltdGFiX2dwbCsqKSkgfQorCV9fa3N5bXRhYl91bnVzZWQJOiB7ICooU09SVChfX19rc3ltdGFiX3VudXNlZCsqKSkgfQorCV9fa3N5bXRhYl91bnVzZWRfZ3BsCTogeyAqKFNPUlQoX19fa3N5bXRhYl91bnVzZWRfZ3BsKyopKSB9CisJX19rc3ltdGFiX2dwbF9mdXR1cmUJOiB7ICooU09SVChfX19rc3ltdGFiX2dwbF9mdXR1cmUrKikpIH0KKwlfX2tjcmN0YWIJCTogeyAqKFNPUlQoX19fa2NyY3RhYisqKSkgfQorCV9fa2NyY3RhYl9ncGwJCTogeyAqKFNPUlQoX19fa2NyY3RhYl9ncGwrKikpIH0KKwlfX2tjcmN0YWJfdW51c2VkCTogeyAqKFNPUlQoX19fa2NyY3RhYl91bnVzZWQrKikpIH0KKwlfX2tjcmN0YWJfdW51c2VkX2dwbAk6IHsgKihTT1JUKF9fX2tjcmN0YWJfdW51c2VkX2dwbCsqKSkgfQorCV9fa2NyY3RhYl9ncGxfZnV0dXJlCTogeyAqKFNPUlQoX19fa2NyY3RhYl9ncGxfZnV0dXJlKyopKSB9CiB9CmRpZmYgLS1naXQgYS9zY3JpcHRzL3JlY29yZG1jb3VudC5jIGIvc2NyaXB0cy9yZWNvcmRtY291bnQuYwppbmRleCBmOWY2ZjUyLi5lZTUyY2I4IDEwMDY0NAotLS0gYS9zY3JpcHRzL3JlY29yZG1jb3VudC5jCisrKyBiL3NjcmlwdHMvcmVjb3JkbWNvdW50LmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvbW1hbi5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CiAjaW5jbHVkZSA8ZWxmLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzZXRqbXAuaD4KQEAgLTM5LDYgKzQwLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgc3RhdCBzYjsJLyogUmVtZW1iZXIgLnN0X3NpemUsIGV0Yy4gKi8KIHN0YXRpYyBqbXBfYnVmIGptcGVudjsJLyogc2V0am1wL2xvbmdqbXAgcGVyLWZpbGUgZXJyb3IgZXNjYXBlICovCiBzdGF0aWMgY29uc3QgY2hhciAqYWx0bWNvdW50OwkvKiBhbHRlcm5hdGUgbWNvdW50IHN5bWJvbCBuYW1lICovCitzdGF0aWMgaW50IHdhcm5fb25fbm90cmFjZV9zZWN0OyAvKiB3YXJuIHdoZW4gc2VjdGlvbiBoYXMgbWNvdW50IG5vdCBiZWluZyByZWNvcmRlZCAqLwogCiAvKiBzZXRqbXAoKSByZXR1cm4gdmFsdWVzICovCiBlbnVtIHsKQEAgLTc4LDcgKzgwLDcgQEAKIHVsc2VlayhpbnQgY29uc3QgZmQsIG9mZl90IGNvbnN0IG9mZnNldCwgaW50IGNvbnN0IHdoZW5jZSkKIHsKIAlvZmZfdCBjb25zdCB3ID0gbHNlZWsoZmQsIG9mZnNldCwgd2hlbmNlKTsKLQlpZiAoKG9mZl90KS0xID09IHcpIHsKKwlpZiAodyA9PSAob2ZmX3QpLTEpIHsKIAkJcGVycm9yKCJsc2VlayIpOwogCQlmYWlsX2ZpbGUoKTsKIAl9CkBAIC0xMTEsMTMgKzExMyw0MSBAQAogdW1hbGxvYyhzaXplX3Qgc2l6ZSkKIHsKIAl2b2lkICpjb25zdCBhZGRyID0gbWFsbG9jKHNpemUpOwotCWlmICgwID09IGFkZHIpIHsKKwlpZiAoYWRkciA9PSAwKSB7CiAJCWZwcmludGYoc3RkZXJyLCAibWFsbG9jIGZhaWxlZDogJXp1IGJ5dGVzXG4iLCBzaXplKTsKIAkJZmFpbF9maWxlKCk7CiAJfQogCXJldHVybiBhZGRyOwogfQogCitzdGF0aWMgdW5zaWduZWQgY2hhciBpZGVhbF9ub3A1X3g4Nl82NFs1XSA9IHsgMHgwZiwgMHgxZiwgMHg0NCwgMHgwMCwgMHgwMCB9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgaWRlYWxfbm9wNV94ODZfMzJbNV0gPSB7IDB4M2UsIDB4OGQsIDB4NzQsIDB4MjYsIDB4MDAgfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICppZGVhbF9ub3A7CisKK3N0YXRpYyBjaGFyIHJlbF90eXBlX25vcDsKKworc3RhdGljIGludCAoKm1ha2Vfbm9wKSh2b2lkICptYXAsIHNpemVfdCBjb25zdCBvZmZzZXQpOworCitzdGF0aWMgaW50IG1ha2Vfbm9wX3g4Nih2b2lkICptYXAsIHNpemVfdCBjb25zdCBvZmZzZXQpCit7CisJdWludDMyX3QgKnB0cjsKKwl1bnNpZ25lZCBjaGFyICpvcDsKKworCS8qIENvbmZpcm0gd2UgaGF2ZSAweGU4IDB4MCAweDAgMHgwIDB4MCAqLworCXB0ciA9IG1hcCArIG9mZnNldDsKKwlpZiAoKnB0ciAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwlvcCA9IG1hcCArIG9mZnNldCAtIDE7CisJaWYgKCpvcCAhPSAweGU4KQorCQlyZXR1cm4gLTE7CisKKwkvKiBjb252ZXJ0IHRvIG5vcCAqLworCXVsc2VlayhmZF9tYXAsIG9mZnNldCAtIDEsIFNFRUtfU0VUKTsKKwl1d3JpdGUoZmRfbWFwLCBpZGVhbF9ub3AsIDUpOworCXJldHVybiAwOworfQorCiAvKgogICogR2V0IHRoZSB3aG9sZSBmaWxlIGFzIGEgcHJvZ3JhbW1pbmcgY29udmVuaWVuY2UgaW4gb3JkZXIgdG8gYXZvaWQKICAqIG1hbGxvYytsc2VlaytyZWFkK2ZyZWUgb2YgbWFueSBwaWVjZXMuICBJZiBzdWNjZXNzZnVsLCB0aGVuIG1tYXAKQEAgLTEzNiw3ICsxNjYsNyBAQAogCXZvaWQgKmFkZHI7CiAKIAlmZF9tYXAgPSBvcGVuKGZuYW1lLCBPX1JEV1IpOwotCWlmICgwID4gZmRfbWFwIHx8IDAgPiBmc3RhdChmZF9tYXAsICZzYikpIHsKKwlpZiAoZmRfbWFwIDwgMCB8fCBmc3RhdChmZF9tYXAsICZzYikgPCAwKSB7CiAJCXBlcnJvcihmbmFtZSk7CiAJCWZhaWxfZmlsZSgpOwogCX0KQEAgLTE0Nyw3ICsxNzcsNyBAQAogCWFkZHIgPSBtbWFwKDAsIHNiLnN0X3NpemUsIFBST1RfUkVBRHxQUk9UX1dSSVRFLCBNQVBfUFJJVkFURSwKIAkJICAgIGZkX21hcCwgMCk7CiAJbW1hcF9mYWlsZWQgPSAwOwotCWlmIChNQVBfRkFJTEVEID09IGFkZHIpIHsKKwlpZiAoYWRkciA9PSBNQVBfRkFJTEVEKSB7CiAJCW1tYXBfZmFpbGVkID0gMTsKIAkJYWRkciA9IHVtYWxsb2Moc2Iuc3Rfc2l6ZSk7CiAJCXVyZWFkKGZkX21hcCwgYWRkciwgc2Iuc3Rfc2l6ZSk7CkBAIC0yMDYsMTIgKzIzNiwxMyBAQAogc3RhdGljIGludAogaXNfbWNvdW50ZWRfc2VjdGlvbl9uYW1lKGNoYXIgY29uc3QgKmNvbnN0IHR4dG5hbWUpCiB7Ci0JcmV0dXJuIDAgPT0gc3RyY21wKCIudGV4dCIsICAgICAgICAgICB0eHRuYW1lKSB8fAotCQkwID09IHN0cmNtcCgiLnJlZi50ZXh0IiwgICAgICB0eHRuYW1lKSB8fAotCQkwID09IHN0cmNtcCgiLnNjaGVkLnRleHQiLCAgICB0eHRuYW1lKSB8fAotCQkwID09IHN0cmNtcCgiLnNwaW5sb2NrLnRleHQiLCB0eHRuYW1lKSB8fAotCQkwID09IHN0cmNtcCgiLmlycWVudHJ5LnRleHQiLCB0eHRuYW1lKSB8fAotCQkwID09IHN0cmNtcCgiLnRleHQudW5saWtlbHkiLCB0eHRuYW1lKTsKKwlyZXR1cm4gc3RyY21wKCIudGV4dCIsICAgICAgICAgICB0eHRuYW1lKSA9PSAwIHx8CisJCXN0cmNtcCgiLnJlZi50ZXh0IiwgICAgICB0eHRuYW1lKSA9PSAwIHx8CisJCXN0cmNtcCgiLnNjaGVkLnRleHQiLCAgICB0eHRuYW1lKSA9PSAwIHx8CisJCXN0cmNtcCgiLnNwaW5sb2NrLnRleHQiLCB0eHRuYW1lKSA9PSAwIHx8CisJCXN0cmNtcCgiLmlycWVudHJ5LnRleHQiLCB0eHRuYW1lKSA9PSAwIHx8CisJCXN0cmNtcCgiLmtwcm9iZXMudGV4dCIsIHR4dG5hbWUpID09IDAgfHwKKwkJc3RyY21wKCIudGV4dC51bmxpa2VseSIsIHR4dG5hbWUpID09IDA7CiB9CiAKIC8qIDMyIGJpdCBhbmQgNjQgYml0IGFyZSB2ZXJ5IHNpbWlsYXIgKi8KQEAgLTI2NCw0MyArMjk1LDQ4IEBACiAJdzggPSB3OG5hdDsKIAlzd2l0Y2ggKGVoZHItPmVfaWRlbnRbRUlfREFUQV0pIHsKIAkJc3RhdGljIHVuc2lnbmVkIGludCBjb25zdCBlbmRpYW4gPSAxOwotCWRlZmF1bHQ6IHsKKwlkZWZhdWx0OgogCQlmcHJpbnRmKHN0ZGVyciwgInVucmVjb2duaXplZCBFTEYgZGF0YSBlbmNvZGluZyAlZDogJXNcbiIsCiAJCQllaGRyLT5lX2lkZW50W0VJX0RBVEFdLCBmbmFtZSk7CiAJCWZhaWxfZmlsZSgpOwotCX0gYnJlYWs7Ci0JY2FzZSBFTEZEQVRBMkxTQjogewotCQlpZiAoMSAhPSAqKHVuc2lnbmVkIGNoYXIgY29uc3QgKikmZW5kaWFuKSB7CisJCWJyZWFrOworCWNhc2UgRUxGREFUQTJMU0I6CisJCWlmICgqKHVuc2lnbmVkIGNoYXIgY29uc3QgKikmZW5kaWFuICE9IDEpIHsKIAkJCS8qIG1haW4oKSBpcyBiaWcgZW5kaWFuLCBmaWxlLm8gaXMgbGl0dGxlIGVuZGlhbi4gKi8KIAkJCXcgPSB3NHJldjsKIAkJCXcyID0gdzJyZXY7CiAJCQl3OCA9IHc4cmV2OwogCQl9Ci0JfSBicmVhazsKLQljYXNlIEVMRkRBVEEyTVNCOiB7Ci0JCWlmICgwICE9ICoodW5zaWduZWQgY2hhciBjb25zdCAqKSZlbmRpYW4pIHsKKwkJYnJlYWs7CisJY2FzZSBFTEZEQVRBMk1TQjoKKwkJaWYgKCoodW5zaWduZWQgY2hhciBjb25zdCAqKSZlbmRpYW4gIT0gMCkgewogCQkJLyogbWFpbigpIGlzIGxpdHRsZSBlbmRpYW4sIGZpbGUubyBpcyBiaWcgZW5kaWFuLiAqLwogCQkJdyA9IHc0cmV2OwogCQkJdzIgPSB3MnJldjsKIAkJCXc4ID0gdzhyZXY7CiAJCX0KLQl9IGJyZWFrOworCQlicmVhazsKIAl9ICAvKiBlbmQgc3dpdGNoICovCi0JaWYgKDAgIT0gbWVtY21wKEVMRk1BRywgZWhkci0+ZV9pZGVudCwgU0VMRk1BRykKLQl8fCAgRVRfUkVMICE9IHcyKGVoZHItPmVfdHlwZSkKLQl8fCAgRVZfQ1VSUkVOVCAhPSBlaGRyLT5lX2lkZW50W0VJX1ZFUlNJT05dKSB7CisJaWYgKG1lbWNtcChFTEZNQUcsIGVoZHItPmVfaWRlbnQsIFNFTEZNQUcpICE9IDAKKwl8fCAgdzIoZWhkci0+ZV90eXBlKSAhPSBFVF9SRUwKKwl8fCAgZWhkci0+ZV9pZGVudFtFSV9WRVJTSU9OXSAhPSBFVl9DVVJSRU5UKSB7CiAJCWZwcmludGYoc3RkZXJyLCAidW5yZWNvZ25pemVkIEVUX1JFTCBmaWxlICVzXG4iLCBmbmFtZSk7CiAJCWZhaWxfZmlsZSgpOwogCX0KIAogCWdwZnggPSAwOwogCXN3aXRjaCAodzIoZWhkci0+ZV9tYWNoaW5lKSkgewotCWRlZmF1bHQ6IHsKKwlkZWZhdWx0OgogCQlmcHJpbnRmKHN0ZGVyciwgInVucmVjb2duaXplZCBlX21hY2hpbmUgJWQgJXNcbiIsCiAJCQl3MihlaGRyLT5lX21hY2hpbmUpLCBmbmFtZSk7CiAJCWZhaWxfZmlsZSgpOwotCX0gYnJlYWs7Ci0JY2FzZSBFTV8zODY6CSByZWx0eXBlID0gUl8zODZfMzI7ICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQlicmVhazsKKwljYXNlIEVNXzM4NjoKKwkJcmVsdHlwZSA9IFJfMzg2XzMyOworCQltYWtlX25vcCA9IG1ha2Vfbm9wX3g4NjsKKwkJaWRlYWxfbm9wID0gaWRlYWxfbm9wNV94ODZfMzI7CisJCW1jb3VudF9hZGp1c3RfMzIgPSAtMTsKKwkJYnJlYWs7CiAJY2FzZSBFTV9BUk06CSByZWx0eXBlID0gUl9BUk1fQUJTMzI7CiAJCQkgYWx0bWNvdW50ID0gIl9fZ251X21jb3VudF9uYyI7CiAJCQkgYnJlYWs7CkBAIC0zMTEsNjcgKzM0Nyw5MSBAQAogCWNhc2UgRU1fUzM5MDogICAgLyogcmVsdHlwZTogZV9jbGFzcyAgICAqLyBncGZ4ID0gJ18nOyBicmVhazsKIAljYXNlIEVNX1NIOgkgcmVsdHlwZSA9IFJfU0hfRElSMzI7ICAgICAgICAgICAgICAgICBicmVhazsKIAljYXNlIEVNX1NQQVJDVjk6IHJlbHR5cGUgPSBSX1NQQVJDXzY0OyAgICAgZ3BmeCA9ICdfJzsgYnJlYWs7Ci0JY2FzZSBFTV9YODZfNjQ6CSByZWx0eXBlID0gUl9YODZfNjRfNjQ7ICAgICAgICAgICAgICAgIGJyZWFrOworCWNhc2UgRU1fWDg2XzY0OgorCQltYWtlX25vcCA9IG1ha2Vfbm9wX3g4NjsKKwkJaWRlYWxfbm9wID0gaWRlYWxfbm9wNV94ODZfNjQ7CisJCXJlbHR5cGUgPSBSX1g4Nl82NF82NDsKKwkJbWNvdW50X2FkanVzdF82NCA9IC0xOworCQlicmVhazsKIAl9ICAvKiBlbmQgc3dpdGNoICovCiAKIAlzd2l0Y2ggKGVoZHItPmVfaWRlbnRbRUlfQ0xBU1NdKSB7Ci0JZGVmYXVsdDogeworCWRlZmF1bHQ6CiAJCWZwcmludGYoc3RkZXJyLCAidW5yZWNvZ25pemVkIEVMRiBjbGFzcyAlZCAlc1xuIiwKIAkJCWVoZHItPmVfaWRlbnRbRUlfQ0xBU1NdLCBmbmFtZSk7CiAJCWZhaWxfZmlsZSgpOwotCX0gYnJlYWs7Ci0JY2FzZSBFTEZDTEFTUzMyOiB7Ci0JCWlmIChzaXplb2YoRWxmMzJfRWhkcikgIT0gdzIoZWhkci0+ZV9laHNpemUpCi0JCXx8ICBzaXplb2YoRWxmMzJfU2hkcikgIT0gdzIoZWhkci0+ZV9zaGVudHNpemUpKSB7CisJCWJyZWFrOworCWNhc2UgRUxGQ0xBU1MzMjoKKwkJaWYgKHcyKGVoZHItPmVfZWhzaXplKSAhPSBzaXplb2YoRWxmMzJfRWhkcikKKwkJfHwgIHcyKGVoZHItPmVfc2hlbnRzaXplKSAhPSBzaXplb2YoRWxmMzJfU2hkcikpIHsKIAkJCWZwcmludGYoc3RkZXJyLAogCQkJCSJ1bnJlY29nbml6ZWQgRVRfUkVMIGZpbGU6ICVzXG4iLCBmbmFtZSk7CiAJCQlmYWlsX2ZpbGUoKTsKIAkJfQotCQlpZiAoRU1fUzM5MCA9PSB3MihlaGRyLT5lX21hY2hpbmUpKQorCQlpZiAodzIoZWhkci0+ZV9tYWNoaW5lKSA9PSBFTV9TMzkwKSB7CiAJCQlyZWx0eXBlID0gUl8zOTBfMzI7Ci0JCWlmIChFTV9NSVBTID09IHcyKGVoZHItPmVfbWFjaGluZSkpIHsKKwkJCW1jb3VudF9hZGp1c3RfMzIgPSAtNDsKKwkJfQorCQlpZiAodzIoZWhkci0+ZV9tYWNoaW5lKSA9PSBFTV9NSVBTKSB7CiAJCQlyZWx0eXBlID0gUl9NSVBTXzMyOwogCQkJaXNfZmFrZV9tY291bnQzMiA9IE1JUFMzMl9pc19mYWtlX21jb3VudDsKIAkJfQogCQlkbzMyKGVoZHIsIGZuYW1lLCByZWx0eXBlKTsKLQl9IGJyZWFrOworCQlicmVhazsKIAljYXNlIEVMRkNMQVNTNjQ6IHsKIAkJRWxmNjRfRWhkciAqY29uc3QgZ2hkciA9IChFbGY2NF9FaGRyICopZWhkcjsKLQkJaWYgKHNpemVvZihFbGY2NF9FaGRyKSAhPSB3MihnaGRyLT5lX2Voc2l6ZSkKLQkJfHwgIHNpemVvZihFbGY2NF9TaGRyKSAhPSB3MihnaGRyLT5lX3NoZW50c2l6ZSkpIHsKKwkJaWYgKHcyKGdoZHItPmVfZWhzaXplKSAhPSBzaXplb2YoRWxmNjRfRWhkcikKKwkJfHwgIHcyKGdoZHItPmVfc2hlbnRzaXplKSAhPSBzaXplb2YoRWxmNjRfU2hkcikpIHsKIAkJCWZwcmludGYoc3RkZXJyLAogCQkJCSJ1bnJlY29nbml6ZWQgRVRfUkVMIGZpbGU6ICVzXG4iLCBmbmFtZSk7CiAJCQlmYWlsX2ZpbGUoKTsKIAkJfQotCQlpZiAoRU1fUzM5MCA9PSB3MihnaGRyLT5lX21hY2hpbmUpKQorCQlpZiAodzIoZ2hkci0+ZV9tYWNoaW5lKSA9PSBFTV9TMzkwKSB7CiAJCQlyZWx0eXBlID0gUl8zOTBfNjQ7Ci0JCWlmIChFTV9NSVBTID09IHcyKGdoZHItPmVfbWFjaGluZSkpIHsKKwkJCW1jb3VudF9hZGp1c3RfNjQgPSAtODsKKwkJfQorCQlpZiAodzIoZ2hkci0+ZV9tYWNoaW5lKSA9PSBFTV9NSVBTKSB7CiAJCQlyZWx0eXBlID0gUl9NSVBTXzY0OwogCQkJRWxmNjRfcl9zeW0gPSBNSVBTNjRfcl9zeW07CiAJCQlFbGY2NF9yX2luZm8gPSBNSVBTNjRfcl9pbmZvOwogCQkJaXNfZmFrZV9tY291bnQ2NCA9IE1JUFM2NF9pc19mYWtlX21jb3VudDsKIAkJfQogCQlkbzY0KGdoZHIsIGZuYW1lLCByZWx0eXBlKTsKLQl9IGJyZWFrOworCQlicmVhazsKKwl9CiAJfSAgLyogZW5kIHN3aXRjaCAqLwogCiAJY2xlYW51cCgpOwogfQogCiBpbnQKLW1haW4oaW50IGFyZ2MsIGNoYXIgY29uc3QgKmFyZ3ZbXSkKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKIAljb25zdCBjaGFyIGZ0cmFjZVtdID0gIi9mdHJhY2UubyI7CiAJaW50IGZ0cmFjZV9zaXplID0gc2l6ZW9mKGZ0cmFjZSkgLSAxOwogCWludCBuX2Vycm9yID0gMDsgIC8qIGdjYy00LjMuMCBmYWxzZSBwb3NpdGl2ZSBjb21wbGFpbnQgKi8KKwlpbnQgYzsKKwlpbnQgaTsKIAotCWlmIChhcmdjIDw9IDEpIHsKLQkJZnByaW50ZihzdGRlcnIsICJ1c2FnZTogcmVjb3JkbWNvdW50IGZpbGUuby4uLlxuIik7CisJd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJ3IikpID49IDApIHsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ3cnOgorCQkJd2Fybl9vbl9ub3RyYWNlX3NlY3QgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiByZWNvcmRtY291bnQgWy13XSBmaWxlLm8uLi5cbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoKGFyZ2MgLSBvcHRpbmQpIDwgMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiByZWNvcmRtY291bnQgWy13XSBmaWxlLm8uLi5cbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAkvKiBQcm9jZXNzIGVhY2ggZmlsZSBpbiB0dXJuLCBhbGxvd2luZyBkZWVwIGZhaWx1cmUuICovCi0JZm9yICgtLWFyZ2MsICsrYXJndjsgMCA8IGFyZ2M7IC0tYXJnYywgKythcmd2KSB7CisJZm9yIChpID0gb3B0aW5kOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNoYXIgKmZpbGUgPSBhcmd2W2ldOwogCQlpbnQgY29uc3Qgc2p2YWwgPSBzZXRqbXAoam1wZW52KTsKIAkJaW50IGxlbjsKIApAQCAtMzgwLDI5ICs0NDAsMjkgQEAKIAkJICogZnVuY3Rpb24gYnV0IGRvZXMgbm90IGNhbGwgaXQuIFNpbmNlIGZ0cmFjZS5vIHNob3VsZAogCQkgKiBub3QgYmUgdHJhY2VkIGFueXdheSwgd2UganVzdCBza2lwIGl0LgogCQkgKi8KLQkJbGVuID0gc3RybGVuKGFyZ3ZbMF0pOworCQlsZW4gPSBzdHJsZW4oZmlsZSk7CiAJCWlmIChsZW4gPj0gZnRyYWNlX3NpemUgJiYKLQkJICAgIHN0cmNtcChhcmd2WzBdICsgKGxlbiAtIGZ0cmFjZV9zaXplKSwgZnRyYWNlKSA9PSAwKQorCQkgICAgc3RyY21wKGZpbGUgKyAobGVuIC0gZnRyYWNlX3NpemUpLCBmdHJhY2UpID09IDApCiAJCQljb250aW51ZTsKIAogCQlzd2l0Y2ggKHNqdmFsKSB7Ci0JCWRlZmF1bHQ6IHsKLQkJCWZwcmludGYoc3RkZXJyLCAiaW50ZXJuYWwgZXJyb3I6ICVzXG4iLCBhcmd2WzBdKTsKKwkJZGVmYXVsdDoKKwkJCWZwcmludGYoc3RkZXJyLCAiaW50ZXJuYWwgZXJyb3I6ICVzXG4iLCBmaWxlKTsKIAkJCWV4aXQoMSk7Ci0JCX0gYnJlYWs7Ci0JCWNhc2UgU0pfU0VUSk1QOiB7ICAvKiBub3JtYWwgc2VxdWVuY2UgKi8KKwkJCWJyZWFrOworCQljYXNlIFNKX1NFVEpNUDogICAgLyogbm9ybWFsIHNlcXVlbmNlICovCiAJCQkvKiBBdm9pZCBwcm9ibGVtcyBpZiBlYXJseSBjbGVhbnVwKCkgKi8KIAkJCWZkX21hcCA9IC0xOwogCQkJZWhkcl9jdXJyID0gTlVMTDsKIAkJCW1tYXBfZmFpbGVkID0gMTsKLQkJCWRvX2ZpbGUoYXJndlswXSk7Ci0JCX0gYnJlYWs7Ci0JCWNhc2UgU0pfRkFJTDogeyAgLyogZXJyb3IgaW4gZG9fZmlsZSBvciBiZWxvdyAqLworCQkJZG9fZmlsZShmaWxlKTsKKwkJCWJyZWFrOworCQljYXNlIFNKX0ZBSUw6ICAgIC8qIGVycm9yIGluIGRvX2ZpbGUgb3IgYmVsb3cgKi8KIAkJCSsrbl9lcnJvcjsKLQkJfSBicmVhazsKLQkJY2FzZSBTSl9TVUNDRUVEOiB7ICAvKiBwcmVtYXR1cmUgc3VjY2VzcyAqLworCQkJYnJlYWs7CisJCWNhc2UgU0pfU1VDQ0VFRDogICAgLyogcHJlbWF0dXJlIHN1Y2Nlc3MgKi8KIAkJCS8qIGRvIG5vdGhpbmcgKi8KLQkJfSBicmVhazsKKwkJCWJyZWFrOwogCQl9ICAvKiBlbmQgc3dpdGNoICovCiAJfQogCXJldHVybiAhIW5fZXJyb3I7CmRpZmYgLS1naXQgYS9zY3JpcHRzL3JlY29yZG1jb3VudC5oIGIvc2NyaXB0cy9yZWNvcmRtY291bnQuaAppbmRleCBiYWYxODdiLi40YmU2MDM2IDEwMDY0NAotLS0gYS9zY3JpcHRzL3JlY29yZG1jb3VudC5oCisrKyBiL3NjcmlwdHMvcmVjb3JkbWNvdW50LmgKQEAgLTIyLDExICsyMiwxNSBAQAogI3VuZGVmIGlzX2Zha2VfbWNvdW50CiAjdW5kZWYgZm5faXNfZmFrZV9tY291bnQKICN1bmRlZiBNSVBTX2lzX2Zha2VfbWNvdW50CisjdW5kZWYgbWNvdW50X2FkanVzdAogI3VuZGVmIHNpZnRfcmVsX21jb3VudAorI3VuZGVmIG5vcF9tY291bnQKICN1bmRlZiBmaW5kX3NlY3N5bV9uZHgKICN1bmRlZiBfX2hhc19yZWxfbWNvdW50CiAjdW5kZWYgaGFzX3JlbF9tY291bnQKICN1bmRlZiB0b3RfcmVsc2l6ZQorI3VuZGVmIGdldF9tY291bnRzeW0KKyN1bmRlZiBnZXRfc3ltX3N0cl9hbmRfcmVscAogI3VuZGVmIGRvX2Z1bmMKICN1bmRlZiBFbGZfQWRkcgogI3VuZGVmIEVsZl9FaGRyCkBAIC00OSwxNCArNTMsMTggQEAKICNpZmRlZiBSRUNPUkRfTUNPVU5UXzY0CiAjIGRlZmluZSBhcHBlbmRfZnVuYwkJYXBwZW5kNjQKICMgZGVmaW5lIHNpZnRfcmVsX21jb3VudAlzaWZ0NjRfcmVsX21jb3VudAorIyBkZWZpbmUgbm9wX21jb3VudAkJbm9wX21jb3VudF82NAogIyBkZWZpbmUgZmluZF9zZWNzeW1fbmR4CWZpbmQ2NF9zZWNzeW1fbmR4CiAjIGRlZmluZSBfX2hhc19yZWxfbWNvdW50CV9faGFzNjRfcmVsX21jb3VudAogIyBkZWZpbmUgaGFzX3JlbF9tY291bnQJCWhhczY0X3JlbF9tY291bnQKICMgZGVmaW5lIHRvdF9yZWxzaXplCQl0b3Q2NF9yZWxzaXplCisjIGRlZmluZSBnZXRfc3ltX3N0cl9hbmRfcmVscAlnZXRfc3ltX3N0cl9hbmRfcmVscF82NAogIyBkZWZpbmUgZG9fZnVuYwkJZG82NAorIyBkZWZpbmUgZ2V0X21jb3VudHN5bQkJZ2V0X21jb3VudHN5bV82NAogIyBkZWZpbmUgaXNfZmFrZV9tY291bnQJCWlzX2Zha2VfbWNvdW50NjQKICMgZGVmaW5lIGZuX2lzX2Zha2VfbWNvdW50CWZuX2lzX2Zha2VfbWNvdW50NjQKICMgZGVmaW5lIE1JUFNfaXNfZmFrZV9tY291bnQJTUlQUzY0X2lzX2Zha2VfbWNvdW50CisjIGRlZmluZSBtY291bnRfYWRqdXN0CQltY291bnRfYWRqdXN0XzY0CiAjIGRlZmluZSBFbGZfQWRkcgkJRWxmNjRfQWRkcgogIyBkZWZpbmUgRWxmX0VoZHIJCUVsZjY0X0VoZHIKICMgZGVmaW5lIEVsZl9TaGRyCQlFbGY2NF9TaGRyCkBAIC03NywxNCArODUsMTggQEAKICNlbHNlCiAjIGRlZmluZSBhcHBlbmRfZnVuYwkJYXBwZW5kMzIKICMgZGVmaW5lIHNpZnRfcmVsX21jb3VudAlzaWZ0MzJfcmVsX21jb3VudAorIyBkZWZpbmUgbm9wX21jb3VudAkJbm9wX21jb3VudF8zMgogIyBkZWZpbmUgZmluZF9zZWNzeW1fbmR4CWZpbmQzMl9zZWNzeW1fbmR4CiAjIGRlZmluZSBfX2hhc19yZWxfbWNvdW50CV9faGFzMzJfcmVsX21jb3VudAogIyBkZWZpbmUgaGFzX3JlbF9tY291bnQJCWhhczMyX3JlbF9tY291bnQKICMgZGVmaW5lIHRvdF9yZWxzaXplCQl0b3QzMl9yZWxzaXplCisjIGRlZmluZSBnZXRfc3ltX3N0cl9hbmRfcmVscAlnZXRfc3ltX3N0cl9hbmRfcmVscF8zMgogIyBkZWZpbmUgZG9fZnVuYwkJZG8zMgorIyBkZWZpbmUgZ2V0X21jb3VudHN5bQkJZ2V0X21jb3VudHN5bV8zMgogIyBkZWZpbmUgaXNfZmFrZV9tY291bnQJCWlzX2Zha2VfbWNvdW50MzIKICMgZGVmaW5lIGZuX2lzX2Zha2VfbWNvdW50CWZuX2lzX2Zha2VfbWNvdW50MzIKICMgZGVmaW5lIE1JUFNfaXNfZmFrZV9tY291bnQJTUlQUzMyX2lzX2Zha2VfbWNvdW50CisjIGRlZmluZSBtY291bnRfYWRqdXN0CQltY291bnRfYWRqdXN0XzMyCiAjIGRlZmluZSBFbGZfQWRkcgkJRWxmMzJfQWRkcgogIyBkZWZpbmUgRWxmX0VoZHIJCUVsZjMyX0VoZHIKICMgZGVmaW5lIEVsZl9TaGRyCQlFbGYzMl9TaGRyCkBAIC0xMjMsNiArMTM1LDggQEAKIH0KIHN0YXRpYyB2b2lkICgqRWxmX3JfaW5mbykoRWxmX1JlbCAqY29uc3QgcnAsIHVuc2lnbmVkIHN5bSwgdW5zaWduZWQgdHlwZSkgPSBmbl9FTEZfUl9JTkZPOwogCitzdGF0aWMgaW50IG1jb3VudF9hZGp1c3QgPSAwOworCiAvKgogICogTUlQUyBtY291bnQgbG9uZyBjYWxsIGhhcyAyIF9tY291bnQgc3ltYm9scywgb25seSB0aGUgcG9zaXRpb24gb2YgdGhlIDFzdAogICogX21jb3VudCBzeW1ib2wgaXMgbmVlZGVkIGZvciBkeW5hbWljIGZ1bmN0aW9uIHRyYWNlciwgd2l0aCBpdCwgdG8gZGlzYWJsZQpAQCAtMjM0LDYgKzI0OCw0OSBAQAogCXV3cml0ZShmZF9tYXAsIGVoZHIsIHNpemVvZigqZWhkcikpOwogfQogCitzdGF0aWMgdW5zaWduZWQgZ2V0X21jb3VudHN5bShFbGZfU3ltIGNvbnN0ICpjb25zdCBzeW0wLAorCQkJICAgICAgRWxmX1JlbCBjb25zdCAqcmVscCwKKwkJCSAgICAgIGNoYXIgY29uc3QgKmNvbnN0IHN0cjApCit7CisJdW5zaWduZWQgbWNvdW50c3ltID0gMDsKKworCUVsZl9TeW0gY29uc3QgKmNvbnN0IHN5bXAgPQorCQkmc3ltMFtFbGZfcl9zeW0ocmVscCldOworCWNoYXIgY29uc3QgKnN5bW5hbWUgPSAmc3RyMFt3KHN5bXAtPnN0X25hbWUpXTsKKwljaGFyIGNvbnN0ICptY291bnQgPSBncGZ4ID09ICdfJyA/ICJfbWNvdW50IiA6ICJtY291bnQiOworCisJaWYgKHN5bW5hbWVbMF0gPT0gJy4nKQorCQkrK3N5bW5hbWU7ICAvKiBwcGM2NCBoYWNrICovCisJaWYgKHN0cmNtcChtY291bnQsIHN5bW5hbWUpID09IDAgfHwKKwkgICAgKGFsdG1jb3VudCAmJiBzdHJjbXAoYWx0bWNvdW50LCBzeW1uYW1lKSA9PSAwKSkKKwkJbWNvdW50c3ltID0gRWxmX3Jfc3ltKHJlbHApOworCisJcmV0dXJuIG1jb3VudHN5bTsKK30KKworc3RhdGljIHZvaWQgZ2V0X3N5bV9zdHJfYW5kX3JlbHAoRWxmX1NoZHIgY29uc3QgKmNvbnN0IHJlbGhkciwKKwkJCQkgRWxmX0VoZHIgY29uc3QgKmNvbnN0IGVoZHIsCisJCQkJIEVsZl9TeW0gY29uc3QgKipzeW0wLAorCQkJCSBjaGFyIGNvbnN0ICoqc3RyMCwKKwkJCQkgRWxmX1JlbCBjb25zdCAqKnJlbHApCit7CisJRWxmX1NoZHIgKmNvbnN0IHNoZHIwID0gKEVsZl9TaGRyICopKF93KGVoZHItPmVfc2hvZmYpCisJCSsgKHZvaWQgKillaGRyKTsKKwl1bnNpZ25lZCBjb25zdCBzeW1zZWNfc2hfbGluayA9IHcocmVsaGRyLT5zaF9saW5rKTsKKwlFbGZfU2hkciBjb25zdCAqY29uc3Qgc3ltc2VjID0gJnNoZHIwW3N5bXNlY19zaF9saW5rXTsKKwlFbGZfU2hkciBjb25zdCAqY29uc3Qgc3Ryc2VjID0gJnNoZHIwW3coc3ltc2VjLT5zaF9saW5rKV07CisJRWxmX1JlbCBjb25zdCAqY29uc3QgcmVsMCA9IChFbGZfUmVsIGNvbnN0ICopKF93KHJlbGhkci0+c2hfb2Zmc2V0KQorCQkrICh2b2lkICopZWhkcik7CisKKwkqc3ltMCA9IChFbGZfU3ltIGNvbnN0ICopKF93KHN5bXNlYy0+c2hfb2Zmc2V0KQorCQkJCSAgKyAodm9pZCAqKWVoZHIpOworCisJKnN0cjAgPSAoY2hhciBjb25zdCAqKShfdyhzdHJzZWMtPnNoX29mZnNldCkKKwkJCSAgICAgICArICh2b2lkICopZWhkcik7CisKKwkqcmVscCA9IHJlbDA7Cit9CisKIC8qCiAgKiBMb29rIGF0IHRoZSByZWxvY2F0aW9ucyBpbiBvcmRlciB0byBmaW5kIHRoZSBjYWxscyB0byBtY291bnQuCiAgKiBBY2N1bXVsYXRlIHRoZSBzZWN0aW9uIG9mZnNldHMgdGhhdCBhcmUgZm91bmQsIGFuZCB0aGVpciByZWxvY2F0aW9uIGluZm8sCkBAIC0yNTAsNDcgKzMwNywyNyBAQAogewogCXVpbnRfdCAqY29uc3QgbWxvYzAgPSBtbG9jcDsKIAlFbGZfUmVsICptcmVscCA9ICptcmVscHA7Ci0JRWxmX1NoZHIgKmNvbnN0IHNoZHIwID0gKEVsZl9TaGRyICopKF93KGVoZHItPmVfc2hvZmYpCi0JCSsgKHZvaWQgKillaGRyKTsKLQl1bnNpZ25lZCBjb25zdCBzeW1zZWNfc2hfbGluayA9IHcocmVsaGRyLT5zaF9saW5rKTsKLQlFbGZfU2hkciBjb25zdCAqY29uc3Qgc3ltc2VjID0gJnNoZHIwW3N5bXNlY19zaF9saW5rXTsKLQlFbGZfU3ltIGNvbnN0ICpjb25zdCBzeW0wID0gKEVsZl9TeW0gY29uc3QgKikoX3coc3ltc2VjLT5zaF9vZmZzZXQpCi0JCSsgKHZvaWQgKillaGRyKTsKLQotCUVsZl9TaGRyIGNvbnN0ICpjb25zdCBzdHJzZWMgPSAmc2hkcjBbdyhzeW1zZWMtPnNoX2xpbmspXTsKLQljaGFyIGNvbnN0ICpjb25zdCBzdHIwID0gKGNoYXIgY29uc3QgKikoX3coc3Ryc2VjLT5zaF9vZmZzZXQpCi0JCSsgKHZvaWQgKillaGRyKTsKLQotCUVsZl9SZWwgY29uc3QgKmNvbnN0IHJlbDAgPSAoRWxmX1JlbCBjb25zdCAqKShfdyhyZWxoZHItPnNoX29mZnNldCkKLQkJKyAodm9pZCAqKWVoZHIpOworCUVsZl9TeW0gY29uc3QgKnN5bTA7CisJY2hhciBjb25zdCAqc3RyMDsKKwlFbGZfUmVsIGNvbnN0ICpyZWxwOwogCXVuc2lnbmVkIHJlbF9lbnRzaXplID0gX3cocmVsaGRyLT5zaF9lbnRzaXplKTsKIAl1bnNpZ25lZCBjb25zdCBucmVsID0gX3cocmVsaGRyLT5zaF9zaXplKSAvIHJlbF9lbnRzaXplOwotCUVsZl9SZWwgY29uc3QgKnJlbHAgPSByZWwwOwotCiAJdW5zaWduZWQgbWNvdW50c3ltID0gMDsKIAl1bnNpZ25lZCB0OwogCi0JZm9yICh0ID0gbnJlbDsgdDsgLS10KSB7Ci0JCWlmICghbWNvdW50c3ltKSB7Ci0JCQlFbGZfU3ltIGNvbnN0ICpjb25zdCBzeW1wID0KLQkJCQkmc3ltMFtFbGZfcl9zeW0ocmVscCldOwotCQkJY2hhciBjb25zdCAqc3ltbmFtZSA9ICZzdHIwW3coc3ltcC0+c3RfbmFtZSldOwotCQkJY2hhciBjb25zdCAqbWNvdW50ID0gJ18nID09IGdwZnggPyAiX21jb3VudCIgOiAibWNvdW50IjsKKwlnZXRfc3ltX3N0cl9hbmRfcmVscChyZWxoZHIsIGVoZHIsICZzeW0wLCAmc3RyMCwgJnJlbHApOwogCi0JCQlpZiAoJy4nID09IHN5bW5hbWVbMF0pCi0JCQkJKytzeW1uYW1lOyAgLyogcHBjNjQgaGFjayAqLwotCQkJaWYgKDAgPT0gc3RyY21wKG1jb3VudCwgc3ltbmFtZSkgfHwKLQkJCSAgICAoYWx0bWNvdW50ICYmIDAgPT0gc3RyY21wKGFsdG1jb3VudCwgc3ltbmFtZSkpKQotCQkJCW1jb3VudHN5bSA9IEVsZl9yX3N5bShyZWxwKTsKLQkJfQorCWZvciAodCA9IG5yZWw7IHQ7IC0tdCkgeworCQlpZiAoIW1jb3VudHN5bSkKKwkJCW1jb3VudHN5bSA9IGdldF9tY291bnRzeW0oc3ltMCwgcmVscCwgc3RyMCk7CiAKIAkJaWYgKG1jb3VudHN5bSA9PSBFbGZfcl9zeW0ocmVscCkgJiYgIWlzX2Zha2VfbWNvdW50KHJlbHApKSB7Ci0JCQl1aW50X3QgY29uc3QgYWRkZW5kID0gX3coX3cocmVscC0+cl9vZmZzZXQpIC0gcmVjdmFsKTsKLQorCQkJdWludF90IGNvbnN0IGFkZGVuZCA9CisJCQkJX3coX3cocmVscC0+cl9vZmZzZXQpIC0gcmVjdmFsICsgbWNvdW50X2FkanVzdCk7CiAJCQltcmVscC0+cl9vZmZzZXQgPSBfdyhvZmZiYXNlCiAJCQkJKyAoKHZvaWQgKiltbG9jcCAtICh2b2lkICopbWxvYzApKTsKIAkJCUVsZl9yX2luZm8obXJlbHAsIHJlY3N5bSwgcmVsdHlwZSk7Ci0JCQlpZiAoc2l6ZW9mKEVsZl9SZWxhKSA9PSByZWxfZW50c2l6ZSkgeworCQkJaWYgKHJlbF9lbnRzaXplID09IHNpemVvZihFbGZfUmVsYSkpIHsKIAkJCQkoKEVsZl9SZWxhICopbXJlbHApLT5yX2FkZGVuZCA9IGFkZGVuZDsKIAkJCQkqbWxvY3ArKyA9IDA7CiAJCQl9IGVsc2UKQEAgLTMwNCw2ICszNDEsNjMgQEAKIAlyZXR1cm4gbWxvY3A7CiB9CiAKKy8qCisgKiBSZWFkIHRoZSByZWxvY2F0aW9uIHRhYmxlIGFnYWluLCBidXQgdGhpcyB0aW1lIGl0cyBjYWxsZWQgb24gc2VjdGlvbnMKKyAqIHRoYXQgYXJlIG5vdCBnb2luZyB0byBiZSB0cmFjZWQuIFRoZSBtY291bnQgY2FsbHMgaGVyZSB3aWxsIGJlIGNvbnZlcnRlZAorICogaW50byBub3BzLgorICovCitzdGF0aWMgdm9pZCBub3BfbWNvdW50KEVsZl9TaGRyIGNvbnN0ICpjb25zdCByZWxoZHIsCisJCSAgICAgICBFbGZfRWhkciBjb25zdCAqY29uc3QgZWhkciwKKwkJICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IHR4dG5hbWUpCit7CisJRWxmX1NoZHIgKmNvbnN0IHNoZHIwID0gKEVsZl9TaGRyICopKF93KGVoZHItPmVfc2hvZmYpCisJCSsgKHZvaWQgKillaGRyKTsKKwlFbGZfU3ltIGNvbnN0ICpzeW0wOworCWNoYXIgY29uc3QgKnN0cjA7CisJRWxmX1JlbCBjb25zdCAqcmVscDsKKwlFbGZfU2hkciBjb25zdCAqY29uc3Qgc2hkciA9ICZzaGRyMFt3KHJlbGhkci0+c2hfaW5mbyldOworCXVuc2lnbmVkIHJlbF9lbnRzaXplID0gX3cocmVsaGRyLT5zaF9lbnRzaXplKTsKKwl1bnNpZ25lZCBjb25zdCBucmVsID0gX3cocmVsaGRyLT5zaF9zaXplKSAvIHJlbF9lbnRzaXplOworCXVuc2lnbmVkIG1jb3VudHN5bSA9IDA7CisJdW5zaWduZWQgdDsKKwlpbnQgb25jZSA9IDA7CisKKwlnZXRfc3ltX3N0cl9hbmRfcmVscChyZWxoZHIsIGVoZHIsICZzeW0wLCAmc3RyMCwgJnJlbHApOworCisJZm9yICh0ID0gbnJlbDsgdDsgLS10KSB7CisJCWludCByZXQgPSAtMTsKKworCQlpZiAoIW1jb3VudHN5bSkKKwkJCW1jb3VudHN5bSA9IGdldF9tY291bnRzeW0oc3ltMCwgcmVscCwgc3RyMCk7CisKKwkJaWYgKG1jb3VudHN5bSA9PSBFbGZfcl9zeW0ocmVscCkgJiYgIWlzX2Zha2VfbWNvdW50KHJlbHApKSB7CisJCQlpZiAobWFrZV9ub3ApCisJCQkJcmV0ID0gbWFrZV9ub3AoKHZvaWQgKillaGRyLCBzaGRyLT5zaF9vZmZzZXQgKyByZWxwLT5yX29mZnNldCk7CisJCQlpZiAod2Fybl9vbl9ub3RyYWNlX3NlY3QgJiYgIW9uY2UpIHsKKwkJCQlwcmludGYoIlNlY3Rpb24gJXMgaGFzIG1jb3VudCBjYWxsZXJzIGJlaW5nIGlnbm9yZWRcbiIsCisJCQkJICAgICAgIHR4dG5hbWUpOworCQkJCW9uY2UgPSAxOworCQkJCS8qIGp1c3Qgd2Fybj8gKi8KKwkJCQlpZiAoIW1ha2Vfbm9wKQorCQkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBJZiB3ZSBzdWNjZXNzZnVsbHkgcmVtb3ZlZCB0aGUgbWNvdW50LCBtYXJrIHRoZSByZWxvY2F0aW9uCisJCSAqIGFzIGEgbm9wIChkb24ndCBkbyBhbnl0aGluZyB3aXRoIGl0KS4KKwkJICovCisJCWlmICghcmV0KSB7CisJCQlFbGZfUmVsIHJlbDsKKwkJCXJlbCA9ICooRWxmX1JlbCAqKXJlbHA7CisJCQlFbGZfcl9pbmZvKCZyZWwsIEVsZl9yX3N5bShyZWxwKSwgcmVsX3R5cGVfbm9wKTsKKwkJCXVsc2VlayhmZF9tYXAsICh2b2lkICopcmVscCAtICh2b2lkICopZWhkciwgU0VFS19TRVQpOworCQkJdXdyaXRlKGZkX21hcCwgJnJlbCwgc2l6ZW9mKHJlbCkpOworCQl9CisJCXJlbHAgPSAoRWxmX1JlbCBjb25zdCAqKShyZWxfZW50c2l6ZSArICh2b2lkICopcmVscCk7CisJfQorfQorCiAKIC8qCiAgKiBGaW5kIGEgc3ltYm9sIGluIHRoZSBnaXZlbiBzZWN0aW9uLCB0byBiZSB1c2VkIGFzIHRoZSBiYXNlIGZvciByZWxvY2F0aW5nCkBAIC0zNTQsMTMgKzQ0OCwxMyBAQAogCUVsZl9TaGRyIGNvbnN0ICpjb25zdCB0eHRoZHIgPSAmc2hkcjBbdyhyZWxoZHItPnNoX2luZm8pXTsKIAljaGFyIGNvbnN0ICpjb25zdCB0eHRuYW1lID0gJnNoc3RydGFiW3codHh0aGRyLT5zaF9uYW1lKV07CiAKLQlpZiAoMCA9PSBzdHJjbXAoIl9fbWNvdW50X2xvYyIsIHR4dG5hbWUpKSB7CisJaWYgKHN0cmNtcCgiX19tY291bnRfbG9jIiwgdHh0bmFtZSkgPT0gMCkgewogCQlmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6IF9fbWNvdW50X2xvYyBhbHJlYWR5IGV4aXN0czogJXNcbiIsCiAJCQlmbmFtZSk7CiAJCXN1Y2NlZWRfZmlsZSgpOwogCX0KLQlpZiAoU0hUX1BST0dCSVRTICE9IHcodHh0aGRyLT5zaF90eXBlKSB8fAotCSAgICAhaXNfbWNvdW50ZWRfc2VjdGlvbl9uYW1lKHR4dG5hbWUpKQorCWlmICh3KHR4dGhkci0+c2hfdHlwZSkgIT0gU0hUX1BST0dCSVRTIHx8CisJICAgICEodyh0eHRoZHItPnNoX2ZsYWdzKSAmIFNIRl9FWEVDSU5TVFIpKQogCQlyZXR1cm4gTlVMTDsKIAlyZXR1cm4gdHh0bmFtZTsKIH0KQEAgLTM3MCw3ICs0NjQsNyBAQAogCQkJCSAgY2hhciBjb25zdCAqY29uc3Qgc2hzdHJ0YWIsCiAJCQkJICBjaGFyIGNvbnN0ICpjb25zdCBmbmFtZSkKIHsKLQlpZiAoU0hUX1JFTCAgIT0gdyhyZWxoZHItPnNoX3R5cGUpICYmIFNIVF9SRUxBICE9IHcocmVsaGRyLT5zaF90eXBlKSkKKwlpZiAodyhyZWxoZHItPnNoX3R5cGUpICE9IFNIVF9SRUwgJiYgdyhyZWxoZHItPnNoX3R5cGUpICE9IFNIVF9SRUxBKQogCQlyZXR1cm4gTlVMTDsKIAlyZXR1cm4gX19oYXNfcmVsX21jb3VudChyZWxoZHIsIHNoZHIwLCBzaHN0cnRhYiwgZm5hbWUpOwogfQpAQCAtMzgzLDkgKzQ3NywxMSBAQAogewogCXVuc2lnbmVkIHRvdHJlbHN6ID0gMDsKIAlFbGZfU2hkciBjb25zdCAqc2hkcnAgPSBzaGRyMDsKKwljaGFyIGNvbnN0ICp0eHRuYW1lOwogCiAJZm9yICg7IG5oZHI7IC0tbmhkciwgKytzaGRycCkgewotCQlpZiAoaGFzX3JlbF9tY291bnQoc2hkcnAsIHNoZHIwLCBzaHN0cnRhYiwgZm5hbWUpKQorCQl0eHRuYW1lID0gaGFzX3JlbF9tY291bnQoc2hkcnAsIHNoZHIwLCBzaHN0cnRhYiwgZm5hbWUpOworCQlpZiAodHh0bmFtZSAmJiBpc19tY291bnRlZF9zZWN0aW9uX25hbWUodHh0bmFtZSkpCiAJCQl0b3RyZWxzeiArPSBfdyhzaGRycC0+c2hfc2l6ZSk7CiAJfQogCXJldHVybiB0b3RyZWxzejsKQEAgLTQyMSw3ICs1MTcsNyBAQAogCWZvciAocmVsaGRyID0gc2hkcjAsIGsgPSBuaGRyOyBrOyAtLWssICsrcmVsaGRyKSB7CiAJCWNoYXIgY29uc3QgKmNvbnN0IHR4dG5hbWUgPSBoYXNfcmVsX21jb3VudChyZWxoZHIsIHNoZHIwLAogCQkJc2hzdHJ0YWIsIGZuYW1lKTsKLQkJaWYgKHR4dG5hbWUpIHsKKwkJaWYgKHR4dG5hbWUgJiYgaXNfbWNvdW50ZWRfc2VjdGlvbl9uYW1lKHR4dG5hbWUpKSB7CiAJCQl1aW50X3QgcmVjdmFsID0gMDsKIAkJCXVuc2lnbmVkIGNvbnN0IHJlY3N5bSA9IGZpbmRfc2Vjc3ltX25keCgKIAkJCQl3KHJlbGhkci0+c2hfaW5mbyksIHR4dG5hbWUsICZyZWN2YWwsCkBAIC00MzIsNiArNTI4LDEyIEBACiAJCQltbG9jcCA9IHNpZnRfcmVsX21jb3VudChtbG9jcCwKIAkJCQkodm9pZCAqKW1sb2NwIC0gKHZvaWQgKiltbG9jMCwgJm1yZWxwLAogCQkJCXJlbGhkciwgZWhkciwgcmVjc3ltLCByZWN2YWwsIHJlbHR5cGUpOworCQl9IGVsc2UgaWYgKHR4dG5hbWUgJiYgKHdhcm5fb25fbm90cmFjZV9zZWN0IHx8IG1ha2Vfbm9wKSkgeworCQkJLyoKKwkJCSAqIFRoaXMgc2VjdGlvbiBpcyBpZ25vcmVkIGJ5IGZ0cmFjZSwgYnV0IHN0aWxsCisJCQkgKiBoYXMgbWNvdW50IGNhbGxzLiBDb252ZXJ0IHRoZW0gdG8gbm9wcyBub3cuCisJCQkgKi8KKwkJCW5vcF9tY291bnQocmVsaGRyLCBlaGRyLCB0eHRuYW1lKTsKIAkJfQogCX0KIAlpZiAobWxvYzAgIT0gbWxvY3ApIHsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcmVjb3JkbWNvdW50LnBsIGIvc2NyaXB0cy9yZWNvcmRtY291bnQucGwKaW5kZXggNGJlMGRlZS4uODU4OTY2YSAxMDA3NTUKLS0tIGEvc2NyaXB0cy9yZWNvcmRtY291bnQucGwKKysrIGIvc2NyaXB0cy9yZWNvcmRtY291bnQucGwKQEAgLTEzNCw2ICsxMzQsNyBAQAogICAgICAiLnNjaGVkLnRleHQiID0+IDEsCiAgICAgICIuc3BpbmxvY2sudGV4dCIgPT4gMSwKICAgICAgIi5pcnFlbnRyeS50ZXh0IiA9PiAxLAorICAgICAiLmtwcm9iZXMudGV4dCIgPT4gMSwKICAgICAgIi50ZXh0LnVubGlrZWx5IiA9PiAxLAogKTsKIApAQCAtMjIyLDYgKzIyMyw3IEBACiAgICAgJG1jb3VudF9yZWdleCA9ICJeXFxzKihbMC05YS1mQS1GXSspOi4qXFxzbWNvdW50KFsrLV0weFswLTlhLXpBLVpdKyk/XCQiOwogICAgICR0eXBlID0gIi5xdWFkIjsKICAgICAkYWxpZ25tZW50ID0gODsKKyAgICAkbWNvdW50X2FkanVzdCA9IC0xOwogCiAgICAgIyBmb3JjZSBmbGFncyBmb3IgdGhpcyBhcmNoCiAgICAgJGxkIC49ICIgLW0gZWxmX3g4Nl82NCI7CkBAIC0yMzEsNiArMjMzLDcgQEAKIAogfSBlbHNpZiAoJGFyY2ggZXEgImkzODYiKSB7CiAgICAgJGFsaWdubWVudCA9IDQ7CisgICAgJG1jb3VudF9hZGp1c3QgPSAtMTsKIAogICAgICMgZm9yY2UgZmxhZ3MgZm9yIHRoaXMgYXJjaAogICAgICRsZCAuPSAiIC1tIGVsZl9pMzg2IjsKQEAgLTI0MCwxMiArMjQzLDE0IEBACiAKIH0gZWxzaWYgKCRhcmNoIGVxICJzMzkwIiAmJiAkYml0cyA9PSAzMikgewogICAgICRtY291bnRfcmVnZXggPSAiXlxccyooWzAtOWEtZkEtRl0rKTpcXHMqUl8zOTBfMzJcXHMrX21jb3VudFwkIjsKKyAgICAkbWNvdW50X2FkanVzdCA9IC00OwogICAgICRhbGlnbm1lbnQgPSA0OwogICAgICRsZCAuPSAiIC1tIGVsZl9zMzkwIjsKICAgICAkY2MgLj0gIiAtbTMxIjsKIAogfSBlbHNpZiAoJGFyY2ggZXEgInMzOTAiICYmICRiaXRzID09IDY0KSB7CiAgICAgJG1jb3VudF9yZWdleCA9ICJeXFxzKihbMC05YS1mQS1GXSspOlxccypSXzM5MF8oUEN8UExUKTMyREJMXFxzK19tY291bnRcXCsweDJcJCI7CisgICAgJG1jb3VudF9hZGp1c3QgPSAtODsKICAgICAkYWxpZ25tZW50ID0gODsKICAgICAkdHlwZSA9ICIucXVhZCI7CiAgICAgJGxkIC49ICIgLW0gZWxmNjRfczM5MCI7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL3VzZXJfZGVmaW5lZC5jIGIvc2VjdXJpdHkva2V5cy91c2VyX2RlZmluZWQuYwppbmRleCBjNmNhODY2Li5mNjZiYWY0IDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL3VzZXJfZGVmaW5lZC5jCisrKyBiL3NlY3VyaXR5L2tleXMvdXNlcl9kZWZpbmVkLmMKQEAgLTY5LDE4ICs2OSw2IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh1c2VyX2luc3RhbnRpYXRlKTsKIAogLyoKLSAqIGRpc3Bvc2Ugb2YgdGhlIG9sZCBkYXRhIGZyb20gYW4gdXBkYXRlZCB1c2VyIGRlZmluZWQga2V5Ci0gKi8KLXN0YXRpYyB2b2lkIHVzZXJfdXBkYXRlX3JjdV9kaXNwb3NhbChzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKLXsKLQlzdHJ1Y3QgdXNlcl9rZXlfcGF5bG9hZCAqdXBheWxvYWQ7Ci0KLQl1cGF5bG9hZCA9IGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCB1c2VyX2tleV9wYXlsb2FkLCByY3UpOwotCi0Ja2ZyZWUodXBheWxvYWQpOwotfQotCi0vKgogICogdXBkYXRlIGEgdXNlciBkZWZpbmVkIGtleQogICogLSB0aGUga2V5J3Mgc2VtYXBob3JlIGlzIHdyaXRlLWxvY2tlZAogICovCkBAIC0xMTQsNyArMTAyLDcgQEAKIAkJa2V5LT5leHBpcnkgPSAwOwogCX0KIAotCWNhbGxfcmN1KCZ6YXAtPnJjdSwgdXNlcl91cGRhdGVfcmN1X2Rpc3Bvc2FsKTsKKwlrZnJlZV9yY3UoemFwLCByY3UpOwogCiBlcnJvcjoKIAlyZXR1cm4gcmV0OwpAQCAtMTQ1LDcgKzEzMyw3IEBACiAKIAlpZiAodXBheWxvYWQpIHsKIAkJcmN1X2Fzc2lnbl9wb2ludGVyKGtleS0+cGF5bG9hZC5kYXRhLCBOVUxMKTsKLQkJY2FsbF9yY3UoJnVwYXlsb2FkLT5yY3UsIHVzZXJfdXBkYXRlX3JjdV9kaXNwb3NhbCk7CisJCWtmcmVlX3JjdSh1cGF5bG9hZCwgcmN1KTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvbmV0aWYuYyBiL3NlY3VyaXR5L3NlbGludXgvbmV0aWYuYwppbmRleCBkNjA5NWQ2Li41OGNjNDgxIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L25ldGlmLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9uZXRpZi5jCkBAIC0xMDQsMjIgKzEwNCw2IEBACiB9CiAKIC8qKgotICogc2VsX25ldGlmX2ZyZWUgLSBGcmVlcyBhbiBpbnRlcmZhY2UgZW50cnkKLSAqIEBwOiB0aGUgZW50cnkncyBSQ1UgZmllbGQKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgdXNlZCBhcyBhIGNhbGxiYWNrIHRvIHRoZSBjYWxsX3JjdSgpCi0gKiBmdW5jdGlvbiBzbyB0aGF0IG1lbW9yeSBhbGxvY2F0ZWQgdG8gYSBoYXNoIHRhYmxlIGludGVyZmFjZSBlbnRyeSBjYW4gYmUKLSAqIHJlbGVhc2VkIHNhZmVseS4KLSAqCi0gKi8KLXN0YXRpYyB2b2lkIHNlbF9uZXRpZl9mcmVlKHN0cnVjdCByY3VfaGVhZCAqcCkKLXsKLQlzdHJ1Y3Qgc2VsX25ldGlmICpuZXRpZiA9IGNvbnRhaW5lcl9vZihwLCBzdHJ1Y3Qgc2VsX25ldGlmLCByY3VfaGVhZCk7Ci0Ja2ZyZWUobmV0aWYpOwotfQotCi0vKioKICAqIHNlbF9uZXRpZl9kZXN0cm95IC0gUmVtb3ZlIGFuIGludGVyZmFjZSByZWNvcmQgZnJvbSB0aGUgdGFibGUKICAqIEBuZXRpZjogdGhlIGV4aXN0aW5nIGludGVyZmFjZSByZWNvcmQKICAqCkBAIC0xMzEsNyArMTE1LDcgQEAKIHsKIAlsaXN0X2RlbF9yY3UoJm5ldGlmLT5saXN0KTsKIAlzZWxfbmV0aWZfdG90YWwtLTsKLQljYWxsX3JjdSgmbmV0aWYtPnJjdV9oZWFkLCBzZWxfbmV0aWZfZnJlZSk7CisJa2ZyZWVfcmN1KG5ldGlmLCByY3VfaGVhZCk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtc2NyaXB0LXBlcmwudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtc2NyaXB0LXBlcmwudHh0CmluZGV4IDViYjQxZTUuLjMxNTJjY2EgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXNjcmlwdC1wZXJsLnR4dAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1zY3JpcHQtcGVybC50eHQKQEAgLTYzLDcgKzYzLDYgQEAKICAgICAgICAgZmllbGQ6dW5zaWduZWQgY2hhciBjb21tb25fZmxhZ3M7CiAgICAgICAgIGZpZWxkOnVuc2lnbmVkIGNoYXIgY29tbW9uX3ByZWVtcHRfY291bnQ7CiAgICAgICAgIGZpZWxkOmludCBjb21tb25fcGlkOwotICAgICAgICBmaWVsZDppbnQgY29tbW9uX2xvY2tfZGVwdGg7CiAKICAgICAgICAgZmllbGQ6Y2hhciBjb21tW1RBU0tfQ09NTV9MRU5dOwogICAgICAgICBmaWVsZDpwaWRfdCBwaWQ7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1zY3JpcHQtcHl0aG9uLnR4dCBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXNjcmlwdC1weXRob24udHh0CmluZGV4IDM2YjM4MjcuLjQ3MTAyMjAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXNjcmlwdC1weXRob24udHh0CisrKyBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXNjcmlwdC1weXRob24udHh0CkBAIC00NjMsNyArNDYzLDYgQEAKICAgICAgICAgZmllbGQ6dW5zaWduZWQgY2hhciBjb21tb25fZmxhZ3M7CiAgICAgICAgIGZpZWxkOnVuc2lnbmVkIGNoYXIgY29tbW9uX3ByZWVtcHRfY291bnQ7CiAgICAgICAgIGZpZWxkOmludCBjb21tb25fcGlkOwotICAgICAgICBmaWVsZDppbnQgY29tbW9uX2xvY2tfZGVwdGg7CiAKICAgICAgICAgZmllbGQ6Y2hhciBjb21tW1RBU0tfQ09NTV9MRU5dOwogICAgICAgICBmaWVsZDpwaWRfdCBwaWQ7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1zY3JpcHQudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtc2NyaXB0LnR4dAppbmRleCA2NmYwNDBiLi44NmM4N2UyIDEwMDY0NAotLS0gYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1zY3JpcHQudHh0CisrKyBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXNjcmlwdC50eHQKQEAgLTExMywxMyArMTEzLDYxIEBACiAgICAgICAgIERvIHZhcmlvdXMgY2hlY2tzIGxpa2Ugc2FtcGxlcyBvcmRlcmluZyBhbmQgbG9zdCBldmVudHMuCiAKIC1mOjoKLS0tZmllbGRzCistLWZpZWxkczo6CiAgICAgICAgIENvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGZpZWxkcyB0byBwcmludC4gT3B0aW9ucyBhcmU6CiAgICAgICAgIGNvbW0sIHRpZCwgcGlkLCB0aW1lLCBjcHUsIGV2ZW50LCB0cmFjZSwgc3ltLiBGaWVsZAotICAgICAgICBsaXN0IG11c3QgYmUgcHJlcGVuZGVkIHdpdGggdGhlIHR5cGUsIHRyYWNlLCBzdyBvciBodywKKyAgICAgICAgbGlzdCBjYW4gYmUgcHJlcGVuZGVkIHdpdGggdGhlIHR5cGUsIHRyYWNlLCBzdyBvciBodywKICAgICAgICAgdG8gaW5kaWNhdGUgdG8gd2hpY2ggZXZlbnQgdHlwZSB0aGUgZmllbGQgbGlzdCBhcHBsaWVzLgogICAgICAgICBlLmcuLCAtZiBzdzpjb21tLHRpZCx0aW1lLHN5bSAgYW5kIC1mIHRyYWNlOnRpbWUsY3B1LHRyYWNlCiAKKwkJcGVyZiBzY3JpcHQgLWYgPGZpZWxkcz4KKworCWlzIGVxdWl2YWxlbnQgdG86CisKKwkJcGVyZiBzY3JpcHQgLWYgdHJhY2U6PGZpZWxkcz4gLWYgc3c6PGZpZWxkcz4gLWYgaHc6PGZpZWxkcz4KKyAgICAKKwlpLmUuLCB0aGUgc3BlY2lmaWVkIGZpZWxkcyBhcHBseSB0byBhbGwgZXZlbnQgdHlwZXMgaWYgdGhlIHR5cGUgc3RyaW5nCisJaXMgbm90IGdpdmVuLgorICAgIAorCVRoZSBhcmd1bWVudHMgYXJlIHByb2Nlc3NlZCBpbiB0aGUgb3JkZXIgcmVjZWl2ZWQuIEEgbGF0ZXIgdXNhZ2UgY2FuCisJcmVzZXQgYSBwcmlvciByZXF1ZXN0LiBlLmcuOgorICAgIAorCQktZiB0cmFjZTogLWYgY29tbSx0aWQsdGltZSxzeW0KKyAgICAKKwlUaGUgZmlyc3QgLWYgc3VwcHJlc3NlcyB0cmFjZSBldmVudHMgKGZpZWxkIGxpc3QgaXMgIiIpLCBidXQgdGhlbiB0aGUKKwlzZWNvbmQgaW52b2NhdGlvbiBzZXRzIHRoZSBmaWVsZHMgdG8gY29tbSx0aWQsdGltZSxzeW0uIEluIHRoaXMgY2FzZSBhCisJd2FybmluZyBpcyBnaXZlbiB0byB0aGUgdXNlcjoKKyAgICAKKwkJIk92ZXJyaWRpbmcgcHJldmlvdXMgZmllbGQgcmVxdWVzdCBmb3IgYWxsIGV2ZW50cy4iCisgICAgCisJQWx0ZXJuYXRpdmV5LCBjb25zaWRlciB0aGUgb3JkZXI6CisgICAgCisJCS1mIGNvbW0sdGlkLHRpbWUsc3ltIC1mIHRyYWNlOgorICAgIAorCVRoZSBmaXJzdCAtZiBzZXRzIHRoZSBmaWVsZHMgZm9yIGFsbCBldmVudHMgYW5kIHRoZSBzZWNvbmQgLWYKKwlzdXBwcmVzc2VzIHRyYWNlIGV2ZW50cy4gVGhlIHVzZXIgaXMgZ2l2ZW4gYSB3YXJuaW5nIG1lc3NhZ2UgYWJvdXQKKwl0aGUgb3ZlcnJpZGUsIGFuZCB0aGUgcmVzdWx0IG9mIHRoZSBhYm92ZSBpcyB0aGF0IG9ubHkgUy9XIGFuZCBIL1cKKwlldmVudHMgYXJlIGRpc3BsYXllZCB3aXRoIHRoZSBnaXZlbiBmaWVsZHMuCisgICAgCisJRm9yIHRoZSAnd2lsZGNhcmQnIG9wdGlvbiBpZiBhIHVzZXIgc2VsZWN0ZWQgZmllbGQgaXMgaW52YWxpZCBmb3IgYW4KKwlldmVudCB0eXBlLCBhIG1lc3NhZ2UgaXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyIHRoYXQgdGhlIG9wdGlvbiBpcworCWlnbm9yZWQgZm9yIHRoYXQgdHlwZS4gRm9yIGV4YW1wbGU6CisgICAgCisJCSQgcGVyZiBzY3JpcHQgLWYgY29tbSx0aWQsdHJhY2UKKwkJJ3RyYWNlJyBub3QgdmFsaWQgZm9yIGhhcmR3YXJlIGV2ZW50cy4gSWdub3JpbmcuCisJCSd0cmFjZScgbm90IHZhbGlkIGZvciBzb2Z0d2FyZSBldmVudHMuIElnbm9yaW5nLgorICAgIAorCUFsdGVybmF0aXZlbHksIGlmIHRoZSB0eXBlIGlzIGdpdmVuIGFuIGludmFsaWQgZmllbGQgaXMgc3BlY2lmaWVkIGl0CisJaXMgYW4gZXJyb3IuIEZvciBleGFtcGxlOgorICAgIAorICAgICAgICBwZXJmIHNjcmlwdCAtdiAtZiBzdzpjb21tLHRpZCx0cmFjZQorICAgICAgICAndHJhY2UnIG5vdCB2YWxpZCBmb3Igc29mdHdhcmUgZXZlbnRzLgorICAgIAorCUF0IHRoaXMgcG9pbnQgdXNhZ2UgaXMgZGlzcGxheWVkLCBhbmQgcGVyZi1zY3JpcHQgZXhpdHMuCisgICAgCisJRmluYWxseSwgYSB1c2VyIG1heSBub3Qgc2V0IGZpZWxkcyB0byBub25lIGZvciBhbGwgZXZlbnQgdHlwZXMuCisJaS5lLiwgLWYgIiIgaXMgbm90IGFsbG93ZWQuCisKIC1rOjoKIC0tdm1saW51eD08ZmlsZT46OgogICAgICAgICB2bWxpbnV4IHBhdGhuYW1lCmRpZmYgLS1naXQgYS90b29scy9wZXJmL01ha2VmaWxlIGIvdG9vbHMvcGVyZi9NYWtlZmlsZQppbmRleCAwYzU0MjU2Li4xNDU1NDEzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL01ha2VmaWxlCisrKyBiL3Rvb2xzL3BlcmYvTWFrZWZpbGUKQEAgLTUsNiArNSw4IEBACiAjIFRoZSBkZWZhdWx0IHRhcmdldCBvZiB0aGlzIE1ha2VmaWxlIGlzLi4uCiBhbGw6CiAKK2luY2x1ZGUgY29uZmlnL3V0aWxpdGllcy5tYWsKKwogaWZuZXEgKCQoT1VUUFVUKSwpCiAjIGNoZWNrIHRoYXQgdGhlIG91dHB1dCBkaXJlY3RvcnkgYWN0dWFsbHkgZXhpc3RzCiBPVVRESVIgOj0gJChzaGVsbCBjZCAkKE9VVFBVVCkgJiYgL2Jpbi9wd2QpCkBAIC0xMyw2ICsxNSwxMiBAQAogCiAjIERlZmluZSBWIHRvIGhhdmUgYSBtb3JlIHZlcmJvc2UgY29tcGlsZS4KICMKKyMgRGVmaW5lIFBZVEhPTiB0byBwb2ludCB0byB0aGUgcHl0aG9uIGJpbmFyeSBpZiB0aGUgZGVmYXVsdAorIyBgcHl0aG9uJyBpcyBub3QgY29ycmVjdDsgZm9yIGV4YW1wbGU6IFBZVEhPTj1weXRob24yCisjCisjIERlZmluZSBQWVRIT05fQ09ORklHIHRvIHBvaW50IHRvIHRoZSBweXRob24tY29uZmlnIGJpbmFyeSBpZgorIyB0aGUgZGVmYXVsdCBgJChQWVRIT04pLWNvbmZpZycgaXMgbm90IGNvcnJlY3QuCisjCiAjIERlZmluZSBBU0NJSURPQzggaWYgeW91IHdhbnQgdG8gZm9ybWF0IGRvY3VtZW50YXRpb24gd2l0aCBBc2NpaURvYyA4CiAjCiAjIERlZmluZSBET0NCT09LX1hTTF8xNzIgaWYgeW91IHdhbnQgdG8gZm9ybWF0IG1hbiBwYWdlcyB3aXRoIERvY0Jvb2sgWFNMIHYxLjcyLgpAQCAtMTM0LDcgKzE0Miw3IEBACiAjIGV4cGxpY2l0bHkgd2hhdCBhcmNoaXRlY3R1cmUgdG8gY2hlY2sgZm9yLiBGaXggdGhpcyB1cCBmb3IgeW91cnMuLgogU1BBUlNFX0ZMQUdTID0gLURfX0JJR19FTkRJQU5fXyAtRF9fcG93ZXJwY19fCiAKLS1pbmNsdWRlIGZlYXR1cmUtdGVzdHMubWFrCistaW5jbHVkZSBjb25maWcvZmVhdHVyZS10ZXN0cy5tYWsKIAogaWZlcSAoJChjYWxsIHRyeS1jYywkKFNPVVJDRV9IRUxMTyksLVdlcnJvciAtZnN0YWNrLXByb3RlY3Rvci1hbGwpLHkpCiAJQ0ZMQUdTIDo9ICQoQ0ZMQUdTKSAtZnN0YWNrLXByb3RlY3Rvci1hbGwKQEAgLTE2OSwxMiArMTc3LDEwIEBACiBzdHJpcC1saWJzID0gJChmaWx0ZXItb3V0IC1sJSwkKDEpKQogCiAkKE9VVFBVVClweXRob24vcGVyZi5zbzogJChQWVJGX09CSlMpCi0JJChRVUlFVF9HRU4pKCBcCi0JCWV4cG9ydCBDRkxBR1M9IiQoQkFTSUNfQ0ZMQUdTKSI7IFwKLQkJcHl0aG9uIHV0aWwvc2V0dXAucHkgLS1xdWlldCAgYnVpbGRfZXh0IC0tYnVpbGQtbGliPSckKE9VVFBVVClweXRob24nIFwKLQkJCS0tYnVpbGQtdGVtcD0nJChPVVRQVVQpcHl0aG9uL3RlbXAnIFwKLQkpCi0KKwkkKFFVSUVUX0dFTilDRkxBR1M9JyQoQkFTSUNfQ0ZMQUdTKScgJChQWVRIT05fV09SRCkgdXRpbC9zZXR1cC5weSBcCisJICAtLXF1aWV0IGJ1aWxkX2V4dCBcCisJICAtLWJ1aWxkLWxpYj0nJChPVVRQVVQpcHl0aG9uJyBcCisJICAtLWJ1aWxkLXRlbXA9JyQoT1VUUFVUKXB5dGhvbi90ZW1wJwogIwogIyBObyBQZXJsIHNjcmlwdHMgcmlnaHQgbm93OgogIwpAQCAtNDc5LDI0ICs0ODUsNzQgQEAKIAllbmRpZgogZW5kaWYKIAotaWZkZWYgTk9fTElCUFlUSE9OCi0JQkFTSUNfQ0ZMQUdTICs9IC1ETk9fTElCUFlUSE9OCitkaXNhYmxlLXB5dGhvbiA9ICQoZXZhbCAkKGRpc2FibGUtcHl0aG9uX2NvZGUpKQorZGVmaW5lIGRpc2FibGUtcHl0aG9uX2NvZGUKKyAgQkFTSUNfQ0ZMQUdTICs9IC1ETk9fTElCUFlUSE9OCisgICQoaWYgJCgxKSwkKHdhcm5pbmcgTm8gJCgxKSB3YXMgZm91bmQpKQorICAkKHdhcm5pbmcgUHl0aG9uIHN1cHBvcnQgd29uJ3QgYmUgYnVpbHQpCitlbmRlZgorCitvdmVycmlkZSBQWVRIT04gOj0gXAorICAkKGNhbGwgZ2V0LWV4ZWN1dGFibGUtb3ItZGVmYXVsdCxQWVRIT04scHl0aG9uKQorCitpZm5kZWYgUFlUSE9OCisgICQoY2FsbCBkaXNhYmxlLXB5dGhvbixweXRob24gaW50ZXJwcmV0ZXIpCisgIHB5dGhvbi1jbGVhbiA6PQogZWxzZQotICAgICAgIFBZVEhPTl9FTUJFRF9MRE9QVFMgPSAkKHNoZWxsIHB5dGhvbi1jb25maWcgLS1sZGZsYWdzIDI+L2Rldi9udWxsKQotICAgICAgIFBZVEhPTl9FTUJFRF9MREZMQUdTID0gJChjYWxsIHN0cmlwLWxpYnMsJChQWVRIT05fRU1CRURfTERPUFRTKSkKLSAgICAgICBQWVRIT05fRU1CRURfTElCQUREID0gJChjYWxsIGdyZXAtbGlicywkKFBZVEhPTl9FTUJFRF9MRE9QVFMpKQotCVBZVEhPTl9FTUJFRF9DQ09QVFMgPSBgcHl0aG9uLWNvbmZpZyAtLWNmbGFncyAyPi9kZXYvbnVsbGAKLQlGTEFHU19QWVRIT05fRU1CRUQ9JChQWVRIT05fRU1CRURfQ0NPUFRTKSAkKFBZVEhPTl9FTUJFRF9MRE9QVFMpCi0JaWZuZXEgKCQoY2FsbCB0cnktY2MsJChTT1VSQ0VfUFlUSE9OX0VNQkVEKSwkKEZMQUdTX1BZVEhPTl9FTUJFRCkpLHkpCi0JCW1zZyA6PSAkKHdhcm5pbmcgTm8gUHl0aG9uLmggZm91bmQsIGluc3RhbGwgcHl0aG9uLWRldltlbF0gdG8gaGF2ZSBweXRob24gc3VwcG9ydCBpbiAncGVyZiBzY3JpcHQnIGFuZCB0byBidWlsZCB0aGUgcHl0aG9uIGJpbmRpbmdzKQotCQlCQVNJQ19DRkxBR1MgKz0gLUROT19MSUJQWVRIT04KLQllbHNlCi0gICAgICAgICAgICAgICBBTExfTERGTEFHUyArPSAkKFBZVEhPTl9FTUJFRF9MREZMQUdTKQotICAgICAgICAgICAgICAgRVhUTElCUyArPSAkKFBZVEhPTl9FTUJFRF9MSUJBREQpCi0JCUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvc2NyaXB0aW5nLWVuZ2luZXMvdHJhY2UtZXZlbnQtcHl0aG9uLm8KLQkJTElCX09CSlMgKz0gJChPVVRQVVQpc2NyaXB0cy9weXRob24vUGVyZi1UcmFjZS1VdGlsL0NvbnRleHQubwotCQlMQU5HX0JJTkRJTkdTICs9ICQoT1VUUFVUKXB5dGhvbi9wZXJmLnNvCi0JZW5kaWYKKworICBQWVRIT05fV09SRCA6PSAkKGNhbGwgc2hlbGwtd29yZGlmeSwkKFBZVEhPTikpCisKKyAgcHl0aG9uLWNsZWFuIDo9ICQoUFlUSE9OX1dPUkQpIHV0aWwvc2V0dXAucHkgY2xlYW4gXAorICAgIC0tYnVpbGQtbGliPSckKE9VVFBVVClweXRob24nIFwKKyAgICAtLWJ1aWxkLXRlbXA9JyQoT1VUUFVUKXB5dGhvbi90ZW1wJworCisgIGlmZGVmIE5PX0xJQlBZVEhPTgorICAgICQoY2FsbCBkaXNhYmxlLXB5dGhvbikKKyAgZWxzZQorCisgICAgb3ZlcnJpZGUgUFlUSE9OX0NPTkZJRyA6PSBcCisgICAgICAkKGNhbGwgZ2V0LWV4ZWN1dGFibGUtb3ItZGVmYXVsdCxQWVRIT05fQ09ORklHLCQoUFlUSE9OKS1jb25maWcpCisKKyAgICBpZm5kZWYgUFlUSE9OX0NPTkZJRworICAgICAgJChjYWxsIGRpc2FibGUtcHl0aG9uLHB5dGhvbi1jb25maWcgdG9vbCkKKyAgICBlbHNlCisKKyAgICAgIFBZVEhPTl9DT05GSUdfU1EgOj0gJChjYWxsIHNoZWxsLXNxLCQoUFlUSE9OX0NPTkZJRykpCisKKyAgICAgIFBZVEhPTl9FTUJFRF9MRE9QVFMgOj0gJChzaGVsbCAkKFBZVEhPTl9DT05GSUdfU1EpIC0tbGRmbGFncyAyPi9kZXYvbnVsbCkKKyAgICAgIFBZVEhPTl9FTUJFRF9MREZMQUdTIDo9ICQoY2FsbCBzdHJpcC1saWJzLCQoUFlUSE9OX0VNQkVEX0xET1BUUykpCisgICAgICBQWVRIT05fRU1CRURfTElCQUREIDo9ICQoY2FsbCBncmVwLWxpYnMsJChQWVRIT05fRU1CRURfTERPUFRTKSkKKyAgICAgIFBZVEhPTl9FTUJFRF9DQ09QVFMgOj0gJChzaGVsbCAkKFBZVEhPTl9DT05GSUdfU1EpIC0tY2ZsYWdzIDI+L2Rldi9udWxsKQorICAgICAgRkxBR1NfUFlUSE9OX0VNQkVEIDo9ICQoUFlUSE9OX0VNQkVEX0NDT1BUUykgJChQWVRIT05fRU1CRURfTERPUFRTKQorCisgICAgICBpZm5lcSAoJChjYWxsIHRyeS1jYywkKFNPVVJDRV9QWVRIT05fRU1CRUQpLCQoRkxBR1NfUFlUSE9OX0VNQkVEKSkseSkKKyAgICAgICAgJChjYWxsIGRpc2FibGUtcHl0aG9uLFB5dGhvbi5oIChmb3IgUHl0aG9uIDIueCkpCisgICAgICBlbHNlCisKKyAgICAgICAgaWZuZXEgKCQoY2FsbCB0cnktY2MsJChTT1VSQ0VfUFlUSE9OX1ZFUlNJT04pLCQoRkxBR1NfUFlUSE9OX0VNQkVEKSkseSkKKyAgICAgICAgICAkKHdhcm5pbmcgUHl0aG9uIDMgaXMgbm90IHlldCBzdXBwb3J0ZWQ7IHBsZWFzZSBzZXQpCisgICAgICAgICAgJCh3YXJuaW5nIFBZVEhPTiBhbmQvb3IgUFlUSE9OX0NPTkZJRyBhcHByb3ByaWF0ZWx5LikKKyAgICAgICAgICAkKHdhcm5pbmcgSWYgeW91IGFsc28gaGF2ZSBQeXRob24gMiBpbnN0YWxsZWQsIHRoZW4pCisgICAgICAgICAgJCh3YXJuaW5nIHRyeSBzb21ldGhpbmcgbGlrZTopCisgICAgICAgICAgJCh3YXJuaW5nICQoYW5kICwpKQorICAgICAgICAgICQod2FybmluZyAkKGFuZCAsKSAgbWFrZSBQWVRIT049cHl0aG9uMikKKyAgICAgICAgICAkKHdhcm5pbmcgJChhbmQgLCkpCisgICAgICAgICAgJCh3YXJuaW5nIE90aGVyd2lzZSwgZGlzYWJsZSBQeXRob24gc3VwcG9ydCBlbnRpcmVseTopCisgICAgICAgICAgJCh3YXJuaW5nICQoYW5kICwpKQorICAgICAgICAgICQod2FybmluZyAkKGFuZCAsKSAgbWFrZSBOT19MSUJQWVRIT049MSkKKyAgICAgICAgICAkKHdhcm5pbmcgJChhbmQgLCkpCisgICAgICAgICAgJChlcnJvciAgICQoYW5kICwpKQorICAgICAgICBlbHNlCisgICAgICAgICAgQUxMX0xERkxBR1MgKz0gJChQWVRIT05fRU1CRURfTERGTEFHUykKKyAgICAgICAgICBFWFRMSUJTICs9ICQoUFlUSE9OX0VNQkVEX0xJQkFERCkKKyAgICAgICAgICBMSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL3NjcmlwdGluZy1lbmdpbmVzL3RyYWNlLWV2ZW50LXB5dGhvbi5vCisgICAgICAgICAgTElCX09CSlMgKz0gJChPVVRQVVQpc2NyaXB0cy9weXRob24vUGVyZi1UcmFjZS1VdGlsL0NvbnRleHQubworICAgICAgICAgIExBTkdfQklORElOR1MgKz0gJChPVVRQVVQpcHl0aG9uL3BlcmYuc28KKyAgICAgICAgZW5kaWYKKworICAgICAgZW5kaWYKKyAgICBlbmRpZgorICBlbmRpZgogZW5kaWYKIAogaWZkZWYgTk9fREVNQU5HTEUKQEAgLTgzNyw4ICs4OTMsNyBAQAogCSQoUk0pICouc3BlYyAqLnB5YyAqLnB5byAqLyoucHljICovKi5weW8gJChPVVRQVVQpY29tbW9uLWNtZHMuaCBUQUdTIHRhZ3MgY3Njb3BlKgogCSQoTUFLRSkgLUMgRG9jdW1lbnRhdGlvbi8gY2xlYW4KIAkkKFJNKSAkKE9VVFBVVClQRVJGLVZFUlNJT04tRklMRSAkKE9VVFBVVClQRVJGLUNGTEFHUwotCUBweXRob24gdXRpbC9zZXR1cC5weSBjbGVhbiAtLWJ1aWxkLWxpYj0nJChPVVRQVVQpcHl0aG9uJyBcCi0JCQkJICAgLS1idWlsZC10ZW1wPSckKE9VVFBVVClweXRob24vdGVtcCcKKwkkKHB5dGhvbi1jbGVhbikKIAogLlBIT05ZOiBhbGwgaW5zdGFsbCBjbGVhbiBzdHJpcAogLlBIT05ZOiBzaGVsbF9jb21wYXRpYmlsaXR5X3Rlc3QgcGxlYXNlX3NldF9TSEVMTF9QQVRIX3RvX2FfbW9yZV9tb2Rlcm5fc2hlbGwKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY3JpcHQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY3JpcHQuYwppbmRleCBhYzU3NGVhLi45NzRmNmQzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tc2NyaXB0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXNjcmlwdC5jCkBAIC00OSw1NyArNDksMTY5IEBACiB9OwogCiAvKiBkZWZhdWx0IHNldCB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggY3VycmVudCBmb3JtYXQgKi8KLXN0YXRpYyB1NjQgb3V0cHV0X2ZpZWxkc1tQRVJGX1RZUEVfTUFYXSA9IHsKLQlbUEVSRl9UWVBFX0hBUkRXQVJFXSA9IFBFUkZfT1VUUFVUX0NPTU0gfCBQRVJGX09VVFBVVF9USUQgfCBcCi0JCQkgICAgICAgUEVSRl9PVVRQVVRfQ1BVIHwgUEVSRl9PVVRQVVRfVElNRSB8IFwKLQkJCSAgICAgICBQRVJGX09VVFBVVF9FVk5BTUUgfCBQRVJGX09VVFBVVF9TWU0sCitzdGF0aWMgc3RydWN0IHsKKwlib29sIHVzZXJfc2V0OworCWJvb2wgd2lsZGNhcmRfc2V0OworCXU2NCBmaWVsZHM7CisJdTY0IGludmFsaWRfZmllbGRzOworfSBvdXRwdXRbUEVSRl9UWVBFX01BWF0gPSB7CiAKLQlbUEVSRl9UWVBFX1NPRlRXQVJFXSA9IFBFUkZfT1VUUFVUX0NPTU0gfCBQRVJGX09VVFBVVF9USUQgfCBcCi0JCQkgICAgICAgUEVSRl9PVVRQVVRfQ1BVIHwgUEVSRl9PVVRQVVRfVElNRSB8IFwKLQkJCSAgICAgICBQRVJGX09VVFBVVF9FVk5BTUUgfCBQRVJGX09VVFBVVF9TWU0sCisJW1BFUkZfVFlQRV9IQVJEV0FSRV0gPSB7CisJCS51c2VyX3NldCA9IGZhbHNlLAogCi0JW1BFUkZfVFlQRV9UUkFDRVBPSU5UXSA9IFBFUkZfT1VUUFVUX0NPTU0gfCBQRVJGX09VVFBVVF9USUQgfCBcCi0JCQkJIFBFUkZfT1VUUFVUX0NQVSB8IFBFUkZfT1VUUFVUX1RJTUUgfCBcCi0JCQkJIFBFUkZfT1VUUFVUX0VWTkFNRSB8IFBFUkZfT1VUUFVUX1RSQUNFLAorCQkuZmllbGRzID0gUEVSRl9PVVRQVVRfQ09NTSB8IFBFUkZfT1VUUFVUX1RJRCB8CisJCQkgICAgICBQRVJGX09VVFBVVF9DUFUgfCBQRVJGX09VVFBVVF9USU1FIHwKKwkJCSAgICAgIFBFUkZfT1VUUFVUX0VWTkFNRSB8IFBFUkZfT1VUUFVUX1NZTSwKKworCQkuaW52YWxpZF9maWVsZHMgPSBQRVJGX09VVFBVVF9UUkFDRSwKKwl9LAorCisJW1BFUkZfVFlQRV9TT0ZUV0FSRV0gPSB7CisJCS51c2VyX3NldCA9IGZhbHNlLAorCisJCS5maWVsZHMgPSBQRVJGX09VVFBVVF9DT01NIHwgUEVSRl9PVVRQVVRfVElEIHwKKwkJCSAgICAgIFBFUkZfT1VUUFVUX0NQVSB8IFBFUkZfT1VUUFVUX1RJTUUgfAorCQkJICAgICAgUEVSRl9PVVRQVVRfRVZOQU1FIHwgUEVSRl9PVVRQVVRfU1lNLAorCisJCS5pbnZhbGlkX2ZpZWxkcyA9IFBFUkZfT1VUUFVUX1RSQUNFLAorCX0sCisKKwlbUEVSRl9UWVBFX1RSQUNFUE9JTlRdID0geworCQkudXNlcl9zZXQgPSBmYWxzZSwKKworCQkuZmllbGRzID0gUEVSRl9PVVRQVVRfQ09NTSB8IFBFUkZfT1VUUFVUX1RJRCB8CisJCQkJICBQRVJGX09VVFBVVF9DUFUgfCBQRVJGX09VVFBVVF9USU1FIHwKKwkJCQkgIFBFUkZfT1VUUFVUX0VWTkFNRSB8IFBFUkZfT1VUUFVUX1RSQUNFLAorCX0sCisKKwlbUEVSRl9UWVBFX1JBV10gPSB7CisJCS51c2VyX3NldCA9IGZhbHNlLAorCisJCS5maWVsZHMgPSBQRVJGX09VVFBVVF9DT01NIHwgUEVSRl9PVVRQVVRfVElEIHwKKwkJCSAgICAgIFBFUkZfT1VUUFVUX0NQVSB8IFBFUkZfT1VUUFVUX1RJTUUgfAorCQkJICAgICAgUEVSRl9PVVRQVVRfRVZOQU1FIHwgUEVSRl9PVVRQVVRfU1lNLAorCisJCS5pbnZhbGlkX2ZpZWxkcyA9IFBFUkZfT1VUUFVUX1RSQUNFLAorCX0sCiB9OwogCi1zdGF0aWMgYm9vbCBvdXRwdXRfc2V0X2J5X3VzZXI7Ci0KLSNkZWZpbmUgUFJJTlRfRklFTEQoeCkgIChvdXRwdXRfZmllbGRzW2F0dHItPnR5cGVdICYgUEVSRl9PVVRQVVRfIyN4KQotCi1zdGF0aWMgaW50IHBlcmZfc2Vzc2lvbl9fY2hlY2tfYXR0cihzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAotCQkJCSAgICBzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyKQorc3RhdGljIGJvb2wgb3V0cHV0X3NldF9ieV91c2VyKHZvaWQpCiB7CisJaW50IGo7CisJZm9yIChqID0gMDsgaiA8IFBFUkZfVFlQRV9NQVg7ICsraikgeworCQlpZiAob3V0cHV0W2pdLnVzZXJfc2V0KQorCQkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKm91dHB1dF9maWVsZDJzdHIoZW51bSBwZXJmX291dHB1dF9maWVsZCBmaWVsZCkKK3sKKwlpbnQgaSwgaW1heCA9IEFSUkFZX1NJWkUoYWxsX291dHB1dF9vcHRpb25zKTsKKwljb25zdCBjaGFyICpzdHIgPSAiIjsKKworCWZvciAoaSA9IDA7IGkgPCBpbWF4OyArK2kpIHsKKwkJaWYgKGFsbF9vdXRwdXRfb3B0aW9uc1tpXS5maWVsZCA9PSBmaWVsZCkgeworCQkJc3RyID0gYWxsX291dHB1dF9vcHRpb25zW2ldLnN0cjsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBzdHI7Cit9CisKKyNkZWZpbmUgUFJJTlRfRklFTEQoeCkgIChvdXRwdXRbYXR0ci0+dHlwZV0uZmllbGRzICYgUEVSRl9PVVRQVVRfIyN4KQorCitzdGF0aWMgaW50IHBlcmZfZXZlbnRfYXR0cl9fY2hlY2tfc3R5cGUoc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwKKwkJCQkgIHU2NCBzYW1wbGVfdHlwZSwgY29uc3QgY2hhciAqc2FtcGxlX21zZywKKwkJCQkgIGVudW0gcGVyZl9vdXRwdXRfZmllbGQgZmllbGQpCit7CisJaW50IHR5cGUgPSBhdHRyLT50eXBlOworCWNvbnN0IGNoYXIgKmV2bmFtZTsKKworCWlmIChhdHRyLT5zYW1wbGVfdHlwZSAmIHNhbXBsZV90eXBlKQorCQlyZXR1cm4gMDsKKworCWlmIChvdXRwdXRbdHlwZV0udXNlcl9zZXQpIHsKKwkJZXZuYW1lID0gX19ldmVudF9uYW1lKGF0dHItPnR5cGUsIGF0dHItPmNvbmZpZyk7CisJCXByX2VycigiU2FtcGxlcyBmb3IgJyVzJyBldmVudCBkbyBub3QgaGF2ZSAlcyBhdHRyaWJ1dGUgc2V0LiAiCisJCSAgICAgICAiQ2Fubm90IHByaW50ICclcycgZmllbGQuXG4iLAorCQkgICAgICAgZXZuYW1lLCBzYW1wbGVfbXNnLCBvdXRwdXRfZmllbGQyc3RyKGZpZWxkKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiB1c2VyIGRpZCBub3QgYXNrIGZvciBpdCBleHBsaWNpdGx5IHNvIHJlbW92ZSBmcm9tIHRoZSBkZWZhdWx0IGxpc3QgKi8KKwlvdXRwdXRbdHlwZV0uZmllbGRzICY9IH5maWVsZDsKKwlldm5hbWUgPSBfX2V2ZW50X25hbWUoYXR0ci0+dHlwZSwgYXR0ci0+Y29uZmlnKTsKKwlwcl9kZWJ1ZygiU2FtcGxlcyBmb3IgJyVzJyBldmVudCBkbyBub3QgaGF2ZSAlcyBhdHRyaWJ1dGUgc2V0LiAiCisJCSAiU2tpcHBpbmcgJyVzJyBmaWVsZC5cbiIsCisJCSBldm5hbWUsIHNhbXBsZV9tc2csIG91dHB1dF9maWVsZDJzdHIoZmllbGQpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBlcmZfZXZzZWxfX2NoZWNrX2F0dHIoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAorCQkJCSAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyID0gJmV2c2VsLT5hdHRyOworCiAJaWYgKFBSSU5UX0ZJRUxEKFRSQUNFKSAmJgogCQkhcGVyZl9zZXNzaW9uX19oYXNfdHJhY2VzKHNlc3Npb24sICJyZWNvcmQgLVIiKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoUFJJTlRfRklFTEQoU1lNKSkgewotCQlpZiAoIShzZXNzaW9uLT5zYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0lQKSkgewotCQkJcHJfZXJyKCJTYW1wbGVzIGRvIG5vdCBjb250YWluIElQIGRhdGEuXG4iKTsKKwkJaWYgKHBlcmZfZXZlbnRfYXR0cl9fY2hlY2tfc3R5cGUoYXR0ciwgUEVSRl9TQU1QTEVfSVAsICJJUCIsCisJCQkJCSAgIFBFUkZfT1VUUFVUX1NZTSkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQorCiAJCWlmICghbm9fY2FsbGNoYWluICYmCi0JCSAgICAhKHNlc3Npb24tPnNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfQ0FMTENIQUlOKSkKKwkJICAgICEoYXR0ci0+c2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9DQUxMQ0hBSU4pKQogCQkJc3ltYm9sX2NvbmYudXNlX2NhbGxjaGFpbiA9IGZhbHNlOwogCX0KIAogCWlmICgoUFJJTlRfRklFTEQoUElEKSB8fCBQUklOVF9GSUVMRChUSUQpKSAmJgotCQkhKHNlc3Npb24tPnNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfVElEKSkgewotCQlwcl9lcnIoIlNhbXBsZXMgZG8gbm90IGNvbnRhaW4gVElEL1BJRCBkYXRhLlxuIik7CisJCXBlcmZfZXZlbnRfYXR0cl9fY2hlY2tfc3R5cGUoYXR0ciwgUEVSRl9TQU1QTEVfVElELCAiVElEIiwKKwkJCQkgICAgICAgUEVSRl9PVVRQVVRfVElEfFBFUkZfT1VUUFVUX1BJRCkpCiAJCXJldHVybiAtRUlOVkFMOwotCX0KIAogCWlmIChQUklOVF9GSUVMRChUSU1FKSAmJgotCQkhKHNlc3Npb24tPnNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfVElNRSkpIHsKLQkJcHJfZXJyKCJTYW1wbGVzIGRvIG5vdCBjb250YWluIHRpbWVzdGFtcHMuXG4iKTsKKwkJcGVyZl9ldmVudF9hdHRyX19jaGVja19zdHlwZShhdHRyLCBQRVJGX1NBTVBMRV9USU1FLCAiVElNRSIsCisJCQkJICAgICAgIFBFUkZfT1VUUFVUX1RJTUUpKQogCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAKIAlpZiAoUFJJTlRfRklFTEQoQ1BVKSAmJgotCQkhKHNlc3Npb24tPnNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfQ1BVKSkgewotCQlwcl9lcnIoIlNhbXBsZXMgZG8gbm90IGNvbnRhaW4gY3B1LlxuIik7CisJCXBlcmZfZXZlbnRfYXR0cl9fY2hlY2tfc3R5cGUoYXR0ciwgUEVSRl9TQU1QTEVfQ1BVLCAiQ1BVIiwKKwkJCQkgICAgICAgUEVSRl9PVVRQVVRfQ1BVKSkKIAkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHZlcmlmeSBhbGwgdXNlciByZXF1ZXN0ZWQgZXZlbnRzIGV4aXN0IGFuZCB0aGUgc2FtcGxlcworICogaGF2ZSB0aGUgZXhwZWN0ZWQgZGF0YQorICovCitzdGF0aWMgaW50IHBlcmZfc2Vzc2lvbl9fY2hlY2tfb3V0cHV0X29wdChzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKQoreworCWludCBqOworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbDsKKworCWZvciAoaiA9IDA7IGogPCBQRVJGX1RZUEVfTUFYOyArK2opIHsKKwkJZXZzZWwgPSBwZXJmX3Nlc3Npb25fX2ZpbmRfZmlyc3RfZXZ0eXBlKHNlc3Npb24sIGopOworCisJCS8qCisJCSAqIGV2ZW4gaWYgZmllbGRzIGlzIHNldCB0byAwIChpZS4sIHNob3cgbm90aGluZykgZXZlbnQgbXVzdAorCQkgKiBleGlzdCBpZiB1c2VyIGV4cGxpY2l0bHkgaW5jbHVkZXMgaXQgb24gdGhlIGNvbW1hbmQgbGluZQorCQkgKi8KKwkJaWYgKCFldnNlbCAmJiBvdXRwdXRbal0udXNlcl9zZXQgJiYgIW91dHB1dFtqXS53aWxkY2FyZF9zZXQpIHsKKwkJCXByX2VycigiJXMgZXZlbnRzIGRvIG5vdCBleGlzdC4gIgorCQkJICAgICAgICJSZW1vdmUgY29ycmVzcG9uZGluZyAtZiBvcHRpb24gdG8gcHJvY2VlZC5cbiIsCisJCQkgICAgICAgZXZlbnRfdHlwZShqKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAoZXZzZWwgJiYgb3V0cHV0W2pdLmZpZWxkcyAmJgorCQkJcGVyZl9ldnNlbF9fY2hlY2tfYXR0cihldnNlbCwgc2Vzc2lvbikpCisJCQlyZXR1cm4gLTE7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xNjgsMTAgKzI4MCw3IEBACiB7CiAJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciA9ICZldnNlbC0+YXR0cjsKIAotCWlmIChvdXRwdXRfZmllbGRzW2F0dHItPnR5cGVdID09IDApCi0JCXJldHVybjsKLQotCWlmIChwZXJmX3Nlc3Npb25fX2NoZWNrX2F0dHIoc2Vzc2lvbiwgYXR0cikgPCAwKQorCWlmIChvdXRwdXRbYXR0ci0+dHlwZV0uZmllbGRzID09IDApCiAJCXJldHVybjsKIAogCXByaW50X3NhbXBsZV9zdGFydChzYW1wbGUsIHRocmVhZCwgYXR0cik7CkBAIC00NTEsNiArNTYwLDcgQEAKIHsKIAljaGFyICp0b2s7CiAJaW50IGksIGltYXggPSBzaXplb2YoYWxsX291dHB1dF9vcHRpb25zKSAvIHNpemVvZihzdHJ1Y3Qgb3V0cHV0X29wdGlvbik7CisJaW50IGo7CiAJaW50IHJjID0gMDsKIAljaGFyICpzdHIgPSBzdHJkdXAoYXJnKTsKIAlpbnQgdHlwZSA9IC0xOwpAQCAtNDU4LDUyICs1NjgsOTkgQEAKIAlpZiAoIXN0cikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQl0b2sgPSBzdHJ0b2soc3RyLCAiOiIpOwotCWlmICghdG9rKSB7Ci0JCWZwcmludGYoc3RkZXJyLAotCQkJIkludmFsaWQgZmllbGQgc3RyaW5nIC0gbm90IHByZXBlbmRlZCB3aXRoIHR5cGUuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIGZpcnN0IHdvcmQgc2hvdWxkIHN0YXRlIHdoaWNoIGV2ZW50IHR5cGUgdXNlcgotCSAqIGlzIHNwZWNpZnlpbmcgdGhlIGZpZWxkcworCS8qIGZpcnN0IHdvcmQgY2FuIHN0YXRlIGZvciB3aGljaCBldmVudCB0eXBlIHRoZSB1c2VyIGlzIHNwZWNpZnlpbmcKKwkgKiB0aGUgZmllbGRzLiBJZiBubyB0eXBlIGV4aXN0cywgdGhlIHNwZWNpZmllZCBmaWVsZHMgYXBwbHkgdG8gYWxsCisJICogZXZlbnQgdHlwZXMgZm91bmQgaW4gdGhlIGZpbGUgbWludXMgdGhlIGludmFsaWQgZmllbGRzIGZvciBhIHR5cGUuCiAJICovCi0JaWYgKCFzdHJjbXAodG9rLCAiaHciKSkKLQkJdHlwZSA9IFBFUkZfVFlQRV9IQVJEV0FSRTsKLQllbHNlIGlmICghc3RyY21wKHRvaywgInN3IikpCi0JCXR5cGUgPSBQRVJGX1RZUEVfU09GVFdBUkU7Ci0JZWxzZSBpZiAoIXN0cmNtcCh0b2ssICJ0cmFjZSIpKQotCQl0eXBlID0gUEVSRl9UWVBFX1RSQUNFUE9JTlQ7Ci0JZWxzZSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBldmVudCB0eXBlIGluIGZpZWxkIHN0cmluZy4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJdG9rID0gc3RyY2hyKHN0ciwgJzonKTsKKwlpZiAodG9rKSB7CisJCSp0b2sgPSAnXDAnOworCQl0b2srKzsKKwkJaWYgKCFzdHJjbXAoc3RyLCAiaHciKSkKKwkJCXR5cGUgPSBQRVJGX1RZUEVfSEFSRFdBUkU7CisJCWVsc2UgaWYgKCFzdHJjbXAoc3RyLCAic3ciKSkKKwkJCXR5cGUgPSBQRVJGX1RZUEVfU09GVFdBUkU7CisJCWVsc2UgaWYgKCFzdHJjbXAoc3RyLCAidHJhY2UiKSkKKwkJCXR5cGUgPSBQRVJGX1RZUEVfVFJBQ0VQT0lOVDsKKwkJZWxzZSBpZiAoIXN0cmNtcChzdHIsICJyYXciKSkKKwkJCXR5cGUgPSBQRVJGX1RZUEVfUkFXOworCQllbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBldmVudCB0eXBlIGluIGZpZWxkIHN0cmluZy5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAob3V0cHV0W3R5cGVdLnVzZXJfc2V0KQorCQkJcHJfd2FybmluZygiT3ZlcnJpZGluZyBwcmV2aW91cyBmaWVsZCByZXF1ZXN0IGZvciAlcyBldmVudHMuXG4iLAorCQkJCSAgIGV2ZW50X3R5cGUodHlwZSkpOworCisJCW91dHB1dFt0eXBlXS5maWVsZHMgPSAwOworCQlvdXRwdXRbdHlwZV0udXNlcl9zZXQgPSB0cnVlOworCQlvdXRwdXRbdHlwZV0ud2lsZGNhcmRfc2V0ID0gZmFsc2U7CisKKwl9IGVsc2UgeworCQl0b2sgPSBzdHI7CisJCWlmIChzdHJsZW4oc3RyKSA9PSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiQ2Fubm90IHNldCBmaWVsZHMgdG8gJ25vbmUnIGZvciBhbGwgZXZlbnQgdHlwZXMuXG4iKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKG91dHB1dF9zZXRfYnlfdXNlcigpKQorCQkJcHJfd2FybmluZygiT3ZlcnJpZGluZyBwcmV2aW91cyBmaWVsZCByZXF1ZXN0IGZvciBhbGwgZXZlbnRzLlxuIik7CisKKwkJZm9yIChqID0gMDsgaiA8IFBFUkZfVFlQRV9NQVg7ICsraikgeworCQkJb3V0cHV0W2pdLmZpZWxkcyA9IDA7CisJCQlvdXRwdXRbal0udXNlcl9zZXQgPSB0cnVlOworCQkJb3V0cHV0W2pdLndpbGRjYXJkX3NldCA9IHRydWU7CisJCX0KIAl9CiAKLQlvdXRwdXRfZmllbGRzW3R5cGVdID0gMDsKLQl3aGlsZSAoMSkgewotCQl0b2sgPSBzdHJ0b2soTlVMTCwgIiwiKTsKLQkJaWYgKCF0b2spCi0JCQlicmVhazsKKwl0b2sgPSBzdHJ0b2sodG9rLCAiLCIpOworCXdoaWxlICh0b2spIHsKIAkJZm9yIChpID0gMDsgaSA8IGltYXg7ICsraSkgewotCQkJaWYgKHN0cmNtcCh0b2ssIGFsbF9vdXRwdXRfb3B0aW9uc1tpXS5zdHIpID09IDApIHsKLQkJCQlvdXRwdXRfZmllbGRzW3R5cGVdIHw9IGFsbF9vdXRwdXRfb3B0aW9uc1tpXS5maWVsZDsKKwkJCWlmIChzdHJjbXAodG9rLCBhbGxfb3V0cHV0X29wdGlvbnNbaV0uc3RyKSA9PSAwKQogCQkJCWJyZWFrOwotCQkJfQogCQl9CiAJCWlmIChpID09IGltYXgpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBmaWVsZCByZXF1ZXN0ZWQuIik7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgZmllbGQgcmVxdWVzdGVkLlxuIik7CiAJCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHR5cGUgPT0gLTEpIHsKKwkJCS8qIGFkZCB1c2VyIG9wdGlvbiB0byBhbGwgZXZlbnRzIHR5cGVzIGZvcgorCQkJICogd2hpY2ggaXQgaXMgdmFsaWQKKwkJCSAqLworCQkJZm9yIChqID0gMDsgaiA8IFBFUkZfVFlQRV9NQVg7ICsraikgeworCQkJCWlmIChvdXRwdXRbal0uaW52YWxpZF9maWVsZHMgJiBhbGxfb3V0cHV0X29wdGlvbnNbaV0uZmllbGQpIHsKKwkJCQkJcHJfd2FybmluZygiXCclc1wnIG5vdCB2YWxpZCBmb3IgJXMgZXZlbnRzLiBJZ25vcmluZy5cbiIsCisJCQkJCQkgICBhbGxfb3V0cHV0X29wdGlvbnNbaV0uc3RyLCBldmVudF90eXBlKGopKTsKKwkJCQl9IGVsc2UKKwkJCQkJb3V0cHV0W2pdLmZpZWxkcyB8PSBhbGxfb3V0cHV0X29wdGlvbnNbaV0uZmllbGQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAob3V0cHV0W3R5cGVdLmludmFsaWRfZmllbGRzICYgYWxsX291dHB1dF9vcHRpb25zW2ldLmZpZWxkKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJcJyVzXCcgbm90IHZhbGlkIGZvciAlcyBldmVudHMuXG4iLAorCQkJCQkgYWxsX291dHB1dF9vcHRpb25zW2ldLnN0ciwgZXZlbnRfdHlwZSh0eXBlKSk7CisKKwkJCQlyYyA9IC1FSU5WQUw7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlvdXRwdXRbdHlwZV0uZmllbGRzIHw9IGFsbF9vdXRwdXRfb3B0aW9uc1tpXS5maWVsZDsKKwkJfQorCisJCXRvayA9IHN0cnRvayhOVUxMLCAiLCIpOworCX0KKworCWlmICh0eXBlID49IDApIHsKKwkJaWYgKG91dHB1dFt0eXBlXS5maWVsZHMgPT0gMCkgeworCQkJcHJfZGVidWcoIk5vIGZpZWxkcyByZXF1ZXN0ZWQgZm9yICVzIHR5cGUuICIKKwkJCQkgIkV2ZW50cyB3aWxsIG5vdCBiZSBkaXNwbGF5ZWQuXG4iLCBldmVudF90eXBlKHR5cGUpKTsKIAkJfQogCX0KIAotCWlmIChvdXRwdXRfZmllbGRzW3R5cGVdID09IDApIHsKLQkJcHJfZGVidWcoIk5vIGZpZWxkcyByZXF1ZXN0ZWQgZm9yICVzIHR5cGUuICIKLQkJCSAiRXZlbnRzIHdpbGwgbm90IGJlIGRpc3BsYXllZFxuIiwgZXZlbnRfdHlwZSh0eXBlKSk7Ci0JfQotCi0Jb3V0cHV0X3NldF9ieV91c2VyID0gdHJ1ZTsKLQorb3V0OgogCWZyZWUoc3RyKTsKIAlyZXR1cm4gcmM7CiB9CkBAIC04MjksNyArOTg2LDcgQEAKIAlPUFRfU1RSSU5HKDAsICJzeW1mcyIsICZzeW1ib2xfY29uZi5zeW1mcywgImRpcmVjdG9yeSIsCiAJCSAgICAiTG9vayBmb3IgZmlsZXMgd2l0aCBzeW1ib2xzIHJlbGF0aXZlIHRvIHRoaXMgZGlyZWN0b3J5IiksCiAJT1BUX0NBTExCQUNLKCdmJywgImZpZWxkcyIsIE5VTEwsICJzdHIiLAotCQkgICAgICJjb21tYSBzZXBhcmF0ZWQgb3V0cHV0IGZpZWxkcyBwcmVwZW5kIHdpdGggJ3R5cGU6Jy4gVmFsaWQgdHlwZXM6IGh3LHN3LHRyYWNlLiBGaWVsZHM6IGNvbW0sdGlkLHBpZCx0aW1lLGNwdSxldmVudCx0cmFjZSxzeW0iLAorCQkgICAgICJjb21tYSBzZXBhcmF0ZWQgb3V0cHV0IGZpZWxkcyBwcmVwZW5kIHdpdGggJ3R5cGU6Jy4gVmFsaWQgdHlwZXM6IGh3LHN3LHRyYWNlLHJhdy4gRmllbGRzOiBjb21tLHRpZCxwaWQsdGltZSxjcHUsZXZlbnQsdHJhY2Usc3ltIiwKIAkJICAgICBwYXJzZV9vdXRwdXRfZmllbGRzKSwKIAogCU9QVF9FTkQoKQpAQCAtMTAyMCw3ICsxMTc3LDcgQEAKIAkJc3RydWN0IHN0YXQgcGVyZl9zdGF0OwogCQlpbnQgaW5wdXQ7CiAKLQkJaWYgKG91dHB1dF9zZXRfYnlfdXNlcikgeworCQlpZiAob3V0cHV0X3NldF9ieV91c2VyKCkpIHsKIAkJCWZwcmludGYoc3RkZXJyLAogCQkJCSJjdXN0b20gZmllbGRzIG5vdCBzdXBwb3J0ZWQgZm9yIGdlbmVyYXRlZCBzY3JpcHRzIik7CiAJCQlyZXR1cm4gLTE7CkBAIC0xMDYwLDYgKzEyMTcsMTEgQEAKIAkJcHJfZGVidWcoInBlcmYgc2NyaXB0IHN0YXJ0ZWQgd2l0aCBzY3JpcHQgJXNcblxuIiwgc2NyaXB0X25hbWUpOwogCX0KIAorCisJZXJyID0gcGVyZl9zZXNzaW9uX19jaGVja19vdXRwdXRfb3B0KHNlc3Npb24pOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKwogCWVyciA9IF9fY21kX3NjcmlwdChzZXNzaW9uKTsKIAogCXBlcmZfc2Vzc2lvbl9fZGVsZXRlKHNlc3Npb24pOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXN0YXQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zdGF0LmMKaW5kZXggMDNmMGU0NS4uYTlmMDY3MSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXN0YXQuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tc3RhdC5jCkBAIC02LDI0ICs2LDI4IEBACiAgKgogICogU2FtcGxlIG91dHB1dDoKIAotICAgJCBwZXJmIHN0YXQgfi9oYWNrYmVuY2ggMTAKLSAgIFRpbWU6IDAuMTA0CisgICAkIHBlcmYgc3RhdCAuL2hhY2tiZW5jaCAxMAogCi0gICAgUGVyZm9ybWFuY2UgY291bnRlciBzdGF0cyBmb3IgJy9ob21lL21pbmdvL2hhY2tiZW5jaCc6CisgIFRpbWU6IDAuMTE4CiAKLSAgICAgICAxMjU1LjUzODYxMSAgdGFzayBjbG9jayB0aWNrcyAgICAgIyAgICAgIDEwLjE0MyBDUFUgdXRpbGl6YXRpb24gZmFjdG9yCi0gICAgICAgICAgICAgNTQwMTEgIGNvbnRleHQgc3dpdGNoZXMgICAgICMgICAgICAgMC4wNDMgTS9zZWMKLSAgICAgICAgICAgICAgIDM4NSAgQ1BVIG1pZ3JhdGlvbnMgICAgICAgIyAgICAgICAwLjAwMCBNL3NlYwotICAgICAgICAgICAgIDE3NzU1ICBwYWdlZmF1bHRzICAgICAgICAgICAjICAgICAgIDAuMDE0IE0vc2VjCi0gICAgICAgIDM4MDgzMjMxODUgIENQVSBjeWNsZXMgICAgICAgICAgICMgICAgMzAzMy4yMTkgTS9zZWMKLSAgICAgICAgMTU3NTExMTE5MCAgaW5zdHJ1Y3Rpb25zICAgICAgICAgIyAgICAxMjU0LjUzMCBNL3NlYwotICAgICAgICAgIDE3MzY3ODk1ICBjYWNoZSByZWZlcmVuY2VzICAgICAjICAgICAgMTMuODMzIE0vc2VjCi0gICAgICAgICAgIDc2NzQ0MjEgIGNhY2hlIG1pc3NlcyAgICAgICAgICMgICAgICAgNi4xMTIgTS9zZWMKKyAgUGVyZm9ybWFuY2UgY291bnRlciBzdGF0cyBmb3IgJy4vaGFja2JlbmNoIDEwJzoKIAotICAgIFdhbGwtY2xvY2sgdGltZSBlbGFwc2VkOiAgIDEyMy43ODY2MjAgbXNlY3MKKyAgICAgICAxNzA4Ljc2MTMyMSB0YXNrLWNsb2NrICAgICAgICAgICAgICAgICMgICAxMS4wMzcgQ1BVcyB1dGlsaXplZAorICAgICAgICAgICAgNDEsMTkwIGNvbnRleHQtc3dpdGNoZXMgICAgICAgICAgIyAgICAwLjAyNCBNL3NlYworICAgICAgICAgICAgIDYsNzM1IENQVS1taWdyYXRpb25zICAgICAgICAgICAgIyAgICAwLjAwNCBNL3NlYworICAgICAgICAgICAgMTcsMzE4IHBhZ2UtZmF1bHRzICAgICAgICAgICAgICAgIyAgICAwLjAxMCBNL3NlYworICAgICA1LDIwNSwyMDIsMjQzIGN5Y2xlcyAgICAgICAgICAgICAgICAgICAgIyAgICAzLjA0NiBHSHoKKyAgICAgMyw4NTYsNDM2LDkyMCBzdGFsbGVkLWN5Y2xlcy1mcm9udGVuZCAgICMgICA3NC4wOSUgZnJvbnRlbmQgY3ljbGVzIGlkbGUKKyAgICAgMSw2MDAsNzkwLDg3MSBzdGFsbGVkLWN5Y2xlcy1iYWNrZW5kICAgICMgICAzMC43NSUgYmFja2VuZCAgY3ljbGVzIGlkbGUKKyAgICAgMiw2MDMsNTAxLDI0NyBpbnN0cnVjdGlvbnMgICAgICAgICAgICAgICMgICAgMC41MCAgaW5zbnMgcGVyIGN5Y2xlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgIDEuNDggIHN0YWxsZWQgY3ljbGVzIHBlciBpbnNuCisgICAgICAgNDg0LDM1Nyw0OTggYnJhbmNoZXMgICAgICAgICAgICAgICAgICAjICAyODMuNDU1IE0vc2VjCisgICAgICAgICA2LDM4OCw5MzQgYnJhbmNoLW1pc3NlcyAgICAgICAgICAgICAjICAgIDEuMzIlIG9mIGFsbCBicmFuY2hlcworCisgICAgICAgIDAuMTU0ODIyOTc4ICBzZWNvbmRzIHRpbWUgZWxhcHNlZAogCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA4LCBSZWQgSGF0IEluYywgSW5nbyBNb2xuYXIgPG1pbmdvQHJlZGhhdC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSwgUmVkIEhhdCBJbmMsIEluZ28gTW9sbmFyIDxtaW5nb0ByZWRoYXQuY29tPgogICoKICAqIEltcHJvdmVtZW50cyBhbmQgZml4ZXMgYnk6CiAgKgpAQCAtNDYsNiArNTAsNyBAQAogI2luY2x1ZGUgInV0aWwvZXZsaXN0LmgiCiAjaW5jbHVkZSAidXRpbC9ldnNlbC5oIgogI2luY2x1ZGUgInV0aWwvZGVidWcuaCIKKyNpbmNsdWRlICJ1dGlsL2NvbG9yLmgiCiAjaW5jbHVkZSAidXRpbC9oZWFkZXIuaCIKICNpbmNsdWRlICJ1dGlsL2NwdW1hcC5oIgogI2luY2x1ZGUgInV0aWwvdGhyZWFkLmgiCkBAIC02NSwxNCArNzAsMTA3IEBACiAgIHsgLnR5cGUgPSBQRVJGX1RZUEVfU09GVFdBUkUsIC5jb25maWcgPSBQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTCQl9LAogCiAgIHsgLnR5cGUgPSBQRVJGX1RZUEVfSEFSRFdBUkUsIC5jb25maWcgPSBQRVJGX0NPVU5UX0hXX0NQVV9DWUNMRVMJCX0sCisgIHsgLnR5cGUgPSBQRVJGX1RZUEVfSEFSRFdBUkUsIC5jb25maWcgPSBQRVJGX0NPVU5UX0hXX1NUQUxMRURfQ1lDTEVTX0ZST05URU5ECX0sCisgIHsgLnR5cGUgPSBQRVJGX1RZUEVfSEFSRFdBUkUsIC5jb25maWcgPSBQRVJGX0NPVU5UX0hXX1NUQUxMRURfQ1lDTEVTX0JBQ0tFTkQJfSwKICAgeyAudHlwZSA9IFBFUkZfVFlQRV9IQVJEV0FSRSwgLmNvbmZpZyA9IFBFUkZfQ09VTlRfSFdfSU5TVFJVQ1RJT05TCQl9LAogICB7IC50eXBlID0gUEVSRl9UWVBFX0hBUkRXQVJFLCAuY29uZmlnID0gUEVSRl9DT1VOVF9IV19CUkFOQ0hfSU5TVFJVQ1RJT05TCX0sCiAgIHsgLnR5cGUgPSBQRVJGX1RZUEVfSEFSRFdBUkUsIC5jb25maWcgPSBQRVJGX0NPVU5UX0hXX0JSQU5DSF9NSVNTRVMJCX0sCi0gIHsgLnR5cGUgPSBQRVJGX1RZUEVfSEFSRFdBUkUsIC5jb25maWcgPSBQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFRkVSRU5DRVMJfSwKLSAgeyAudHlwZSA9IFBFUkZfVFlQRV9IQVJEV0FSRSwgLmNvbmZpZyA9IFBFUkZfQ09VTlRfSFdfQ0FDSEVfTUlTU0VTCQl9LAogCiB9OwogCisvKgorICogRGV0YWlsZWQgc3RhdHMgKC1kKSwgY292ZXJpbmcgdGhlIEwxIGFuZCBsYXN0IGxldmVsIGRhdGEgY2FjaGVzOgorICovCitzdGF0aWMgc3RydWN0IHBlcmZfZXZlbnRfYXR0ciBkZXRhaWxlZF9hdHRyc1tdID0geworCisgIHsgLnR5cGUgPSBQRVJGX1RZUEVfSFdfQ0FDSEUsCisgICAgLmNvbmZpZyA9CisJIFBFUkZfQ09VTlRfSFdfQ0FDSEVfTDFECQk8PCAgMCAgfAorCShQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX1JFQUQJCTw8ICA4KSB8CisJKFBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX0FDQ0VTUwk8PCAxNikJCQkJfSwKKworICB7IC50eXBlID0gUEVSRl9UWVBFX0hXX0NBQ0hFLAorICAgIC5jb25maWcgPQorCSBQRVJGX0NPVU5UX0hXX0NBQ0hFX0wxRAkJPDwgIDAgIHwKKwkoUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9SRUFECQk8PCAgOCkgfAorCShQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NSVNTCTw8IDE2KQkJCQl9LAorCisgIHsgLnR5cGUgPSBQRVJGX1RZUEVfSFdfQ0FDSEUsCisgICAgLmNvbmZpZyA9CisJIFBFUkZfQ09VTlRfSFdfQ0FDSEVfTEwJCQk8PCAgMCAgfAorCShQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX1JFQUQJCTw8ICA4KSB8CisJKFBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX0FDQ0VTUwk8PCAxNikJCQkJfSwKKworICB7IC50eXBlID0gUEVSRl9UWVBFX0hXX0NBQ0hFLAorICAgIC5jb25maWcgPQorCSBQRVJGX0NPVU5UX0hXX0NBQ0hFX0xMCQkJPDwgIDAgIHwKKwkoUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9SRUFECQk8PCAgOCkgfAorCShQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NSVNTCTw8IDE2KQkJCQl9LAorfTsKKworLyoKKyAqIFZlcnkgZGV0YWlsZWQgc3RhdHMgKC1kIC1kKSwgY292ZXJpbmcgdGhlIGluc3RydWN0aW9uIGNhY2hlIGFuZCB0aGUgVExCIGNhY2hlczoKKyAqLworc3RhdGljIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgdmVyeV9kZXRhaWxlZF9hdHRyc1tdID0geworCisgIHsgLnR5cGUgPSBQRVJGX1RZUEVfSFdfQ0FDSEUsCisgICAgLmNvbmZpZyA9CisJIFBFUkZfQ09VTlRfSFdfQ0FDSEVfTDFJCQk8PCAgMCAgfAorCShQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX1JFQUQJCTw8ICA4KSB8CisJKFBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX0FDQ0VTUwk8PCAxNikJCQkJfSwKKworICB7IC50eXBlID0gUEVSRl9UWVBFX0hXX0NBQ0hFLAorICAgIC5jb25maWcgPQorCSBQRVJGX0NPVU5UX0hXX0NBQ0hFX0wxSQkJPDwgIDAgIHwKKwkoUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9SRUFECQk8PCAgOCkgfAorCShQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NSVNTCTw8IDE2KQkJCQl9LAorCisgIHsgLnR5cGUgPSBQRVJGX1RZUEVfSFdfQ0FDSEUsCisgICAgLmNvbmZpZyA9CisJIFBFUkZfQ09VTlRfSFdfQ0FDSEVfRFRMQgkJPDwgIDAgIHwKKwkoUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9SRUFECQk8PCAgOCkgfAorCShQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9BQ0NFU1MJPDwgMTYpCQkJCX0sCisKKyAgeyAudHlwZSA9IFBFUkZfVFlQRV9IV19DQUNIRSwKKyAgICAuY29uZmlnID0KKwkgUEVSRl9DT1VOVF9IV19DQUNIRV9EVExCCQk8PCAgMCAgfAorCShQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX1JFQUQJCTw8ICA4KSB8CisJKFBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01JU1MJPDwgMTYpCQkJCX0sCisKKyAgeyAudHlwZSA9IFBFUkZfVFlQRV9IV19DQUNIRSwKKyAgICAuY29uZmlnID0KKwkgUEVSRl9DT1VOVF9IV19DQUNIRV9JVExCCQk8PCAgMCAgfAorCShQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX1JFQUQJCTw8ICA4KSB8CisJKFBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX0FDQ0VTUwk8PCAxNikJCQkJfSwKKworICB7IC50eXBlID0gUEVSRl9UWVBFX0hXX0NBQ0hFLAorICAgIC5jb25maWcgPQorCSBQRVJGX0NPVU5UX0hXX0NBQ0hFX0lUTEIJCTw8ICAwICB8CisJKFBFUkZfQ09VTlRfSFdfQ0FDSEVfT1BfUkVBRAkJPDwgIDgpIHwKKwkoUEVSRl9DT1VOVF9IV19DQUNIRV9SRVNVTFRfTUlTUwk8PCAxNikJCQkJfSwKKworfTsKKworLyoKKyAqIFZlcnksIHZlcnkgZGV0YWlsZWQgc3RhdHMgKC1kIC1kIC1kKSwgYWRkaW5nIHByZWZldGNoIGV2ZW50czoKKyAqLworc3RhdGljIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgdmVyeV92ZXJ5X2RldGFpbGVkX2F0dHJzW10gPSB7CisKKyAgeyAudHlwZSA9IFBFUkZfVFlQRV9IV19DQUNIRSwKKyAgICAuY29uZmlnID0KKwkgUEVSRl9DT1VOVF9IV19DQUNIRV9MMUQJCTw8ICAwICB8CisJKFBFUkZfQ09VTlRfSFdfQ0FDSEVfT1BfUFJFRkVUQ0gJPDwgIDgpIHwKKwkoUEVSRl9DT1VOVF9IV19DQUNIRV9SRVNVTFRfQUNDRVNTCTw8IDE2KQkJCQl9LAorCisgIHsgLnR5cGUgPSBQRVJGX1RZUEVfSFdfQ0FDSEUsCisgICAgLmNvbmZpZyA9CisJIFBFUkZfQ09VTlRfSFdfQ0FDSEVfTDFECQk8PCAgMCAgfAorCShQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX1BSRUZFVENICTw8ICA4KSB8CisJKFBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01JU1MJPDwgMTYpCQkJCX0sCit9OworCisKKwogc3RydWN0IHBlcmZfZXZsaXN0CQkqZXZzZWxfbGlzdDsKIAogc3RhdGljIGJvb2wJCQlzeXN0ZW1fd2lkZQkJCT0gIGZhbHNlOwpAQCAtODYsNiArMTg0LDggQEAKIHN0YXRpYyBwaWRfdAkJCXRhcmdldF90aWQJCQk9IC0xOwogc3RhdGljIHBpZF90CQkJY2hpbGRfcGlkCQkJPSAtMTsKIHN0YXRpYyBib29sCQkJbnVsbF9ydW4JCQk9ICBmYWxzZTsKK3N0YXRpYyBpbnQJCQlkZXRhaWxlZF9ydW4JCQk9ICAwOworc3RhdGljIGJvb2wJCQlzeW5jX3J1bgkJCT0gIGZhbHNlOwogc3RhdGljIGJvb2wJCQliaWdfbnVtCQkJCT0gIHRydWU7CiBzdGF0aWMgaW50CQkJYmlnX251bV9vcHQJCQk9ICAtMTsKIHN0YXRpYyBjb25zdCBjaGFyCQkqY3B1X2xpc3Q7CkBAIC0xNTYsNyArMjU2LDE1IEBACiAKIHN0cnVjdCBzdGF0cwkJCXJ1bnRpbWVfbnNlY3Nfc3RhdHNbTUFYX05SX0NQVVNdOwogc3RydWN0IHN0YXRzCQkJcnVudGltZV9jeWNsZXNfc3RhdHNbTUFYX05SX0NQVVNdOworc3RydWN0IHN0YXRzCQkJcnVudGltZV9zdGFsbGVkX2N5Y2xlc19mcm9udF9zdGF0c1tNQVhfTlJfQ1BVU107CitzdHJ1Y3Qgc3RhdHMJCQlydW50aW1lX3N0YWxsZWRfY3ljbGVzX2JhY2tfc3RhdHNbTUFYX05SX0NQVVNdOwogc3RydWN0IHN0YXRzCQkJcnVudGltZV9icmFuY2hlc19zdGF0c1tNQVhfTlJfQ1BVU107CitzdHJ1Y3Qgc3RhdHMJCQlydW50aW1lX2NhY2hlcmVmc19zdGF0c1tNQVhfTlJfQ1BVU107CitzdHJ1Y3Qgc3RhdHMJCQlydW50aW1lX2wxX2RjYWNoZV9zdGF0c1tNQVhfTlJfQ1BVU107CitzdHJ1Y3Qgc3RhdHMJCQlydW50aW1lX2wxX2ljYWNoZV9zdGF0c1tNQVhfTlJfQ1BVU107CitzdHJ1Y3Qgc3RhdHMJCQlydW50aW1lX2xsX2NhY2hlX3N0YXRzW01BWF9OUl9DUFVTXTsKK3N0cnVjdCBzdGF0cwkJCXJ1bnRpbWVfaXRsYl9jYWNoZV9zdGF0c1tNQVhfTlJfQ1BVU107CitzdHJ1Y3Qgc3RhdHMJCQlydW50aW1lX2R0bGJfY2FjaGVfc3RhdHNbTUFYX05SX0NQVVNdOwogc3RydWN0IHN0YXRzCQkJd2FsbHRpbWVfbnNlY3Nfc3RhdHM7CiAKIHN0YXRpYyBpbnQgY3JlYXRlX3BlcmZfc3RhdF9jb3VudGVyKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCkKQEAgLTE5Myw2ICszMDEsMzcgQEAKIH0KIAogLyoKKyAqIFVwZGF0ZSB2YXJpb3VzIHRyYWNraW5nIHZhbHVlcyB3ZSBtYWludGFpbiB0byBwcmludAorICogbW9yZSBzZW1hbnRpYyBpbmZvcm1hdGlvbiBzdWNoIGFzIG1pc3MvaGl0IHJhdGlvcywKKyAqIGluc3RydWN0aW9uIHJhdGVzLCBldGM6CisgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9zaGFkb3dfc3RhdHMoc3RydWN0IHBlcmZfZXZzZWwgKmNvdW50ZXIsIHU2NCAqY291bnQpCit7CisJaWYgKHBlcmZfZXZzZWxfX21hdGNoKGNvdW50ZXIsIFNPRlRXQVJFLCBTV19UQVNLX0NMT0NLKSkKKwkJdXBkYXRlX3N0YXRzKCZydW50aW1lX25zZWNzX3N0YXRzWzBdLCBjb3VudFswXSk7CisJZWxzZSBpZiAocGVyZl9ldnNlbF9fbWF0Y2goY291bnRlciwgSEFSRFdBUkUsIEhXX0NQVV9DWUNMRVMpKQorCQl1cGRhdGVfc3RhdHMoJnJ1bnRpbWVfY3ljbGVzX3N0YXRzWzBdLCBjb3VudFswXSk7CisJZWxzZSBpZiAocGVyZl9ldnNlbF9fbWF0Y2goY291bnRlciwgSEFSRFdBUkUsIEhXX1NUQUxMRURfQ1lDTEVTX0ZST05URU5EKSkKKwkJdXBkYXRlX3N0YXRzKCZydW50aW1lX3N0YWxsZWRfY3ljbGVzX2Zyb250X3N0YXRzWzBdLCBjb3VudFswXSk7CisJZWxzZSBpZiAocGVyZl9ldnNlbF9fbWF0Y2goY291bnRlciwgSEFSRFdBUkUsIEhXX1NUQUxMRURfQ1lDTEVTX0JBQ0tFTkQpKQorCQl1cGRhdGVfc3RhdHMoJnJ1bnRpbWVfc3RhbGxlZF9jeWNsZXNfYmFja19zdGF0c1swXSwgY291bnRbMF0pOworCWVsc2UgaWYgKHBlcmZfZXZzZWxfX21hdGNoKGNvdW50ZXIsIEhBUkRXQVJFLCBIV19CUkFOQ0hfSU5TVFJVQ1RJT05TKSkKKwkJdXBkYXRlX3N0YXRzKCZydW50aW1lX2JyYW5jaGVzX3N0YXRzWzBdLCBjb3VudFswXSk7CisJZWxzZSBpZiAocGVyZl9ldnNlbF9fbWF0Y2goY291bnRlciwgSEFSRFdBUkUsIEhXX0NBQ0hFX1JFRkVSRU5DRVMpKQorCQl1cGRhdGVfc3RhdHMoJnJ1bnRpbWVfY2FjaGVyZWZzX3N0YXRzWzBdLCBjb3VudFswXSk7CisJZWxzZSBpZiAocGVyZl9ldnNlbF9fbWF0Y2goY291bnRlciwgSFdfQ0FDSEUsIEhXX0NBQ0hFX0wxRCkpCisJCXVwZGF0ZV9zdGF0cygmcnVudGltZV9sMV9kY2FjaGVfc3RhdHNbMF0sIGNvdW50WzBdKTsKKwllbHNlIGlmIChwZXJmX2V2c2VsX19tYXRjaChjb3VudGVyLCBIV19DQUNIRSwgSFdfQ0FDSEVfTDFJKSkKKwkJdXBkYXRlX3N0YXRzKCZydW50aW1lX2wxX2ljYWNoZV9zdGF0c1swXSwgY291bnRbMF0pOworCWVsc2UgaWYgKHBlcmZfZXZzZWxfX21hdGNoKGNvdW50ZXIsIEhXX0NBQ0hFLCBIV19DQUNIRV9MTCkpCisJCXVwZGF0ZV9zdGF0cygmcnVudGltZV9sbF9jYWNoZV9zdGF0c1swXSwgY291bnRbMF0pOworCWVsc2UgaWYgKHBlcmZfZXZzZWxfX21hdGNoKGNvdW50ZXIsIEhXX0NBQ0hFLCBIV19DQUNIRV9EVExCKSkKKwkJdXBkYXRlX3N0YXRzKCZydW50aW1lX2R0bGJfY2FjaGVfc3RhdHNbMF0sIGNvdW50WzBdKTsKKwllbHNlIGlmIChwZXJmX2V2c2VsX19tYXRjaChjb3VudGVyLCBIV19DQUNIRSwgSFdfQ0FDSEVfSVRMQikpCisJCXVwZGF0ZV9zdGF0cygmcnVudGltZV9pdGxiX2NhY2hlX3N0YXRzWzBdLCBjb3VudFswXSk7Cit9CisKKy8qCiAgKiBSZWFkIG91dCB0aGUgcmVzdWx0cyBvZiBhIHNpbmdsZSBjb3VudGVyOgogICogYWdncmVnYXRlIGNvdW50cyBhY3Jvc3MgQ1BVcyBpbiBzeXN0ZW0td2lkZSBtb2RlCiAgKi8KQEAgLTIxNywxMiArMzU2LDcgQEAKIAkvKgogCSAqIFNhdmUgdGhlIGZ1bGwgcnVudGltZSAtIHRvIGFsbG93IG5vcm1hbGl6YXRpb24gZHVyaW5nIHByaW50b3V0OgogCSAqLwotCWlmIChwZXJmX2V2c2VsX19tYXRjaChjb3VudGVyLCBTT0ZUV0FSRSwgU1dfVEFTS19DTE9DSykpCi0JCXVwZGF0ZV9zdGF0cygmcnVudGltZV9uc2Vjc19zdGF0c1swXSwgY291bnRbMF0pOwotCWlmIChwZXJmX2V2c2VsX19tYXRjaChjb3VudGVyLCBIQVJEV0FSRSwgSFdfQ1BVX0NZQ0xFUykpCi0JCXVwZGF0ZV9zdGF0cygmcnVudGltZV9jeWNsZXNfc3RhdHNbMF0sIGNvdW50WzBdKTsKLQlpZiAocGVyZl9ldnNlbF9fbWF0Y2goY291bnRlciwgSEFSRFdBUkUsIEhXX0JSQU5DSF9JTlNUUlVDVElPTlMpKQotCQl1cGRhdGVfc3RhdHMoJnJ1bnRpbWVfYnJhbmNoZXNfc3RhdHNbMF0sIGNvdW50WzBdKTsKKwl1cGRhdGVfc2hhZG93X3N0YXRzKGNvdW50ZXIsIGNvdW50KTsKIAogCXJldHVybiAwOwogfQpAQCAtMjQyLDEyICszNzYsNyBAQAogCiAJCWNvdW50ID0gY291bnRlci0+Y291bnRzLT5jcHVbY3B1XS52YWx1ZXM7CiAKLQkJaWYgKHBlcmZfZXZzZWxfX21hdGNoKGNvdW50ZXIsIFNPRlRXQVJFLCBTV19UQVNLX0NMT0NLKSkKLQkJCXVwZGF0ZV9zdGF0cygmcnVudGltZV9uc2Vjc19zdGF0c1tjcHVdLCBjb3VudFswXSk7Ci0JCWlmIChwZXJmX2V2c2VsX19tYXRjaChjb3VudGVyLCBIQVJEV0FSRSwgSFdfQ1BVX0NZQ0xFUykpCi0JCQl1cGRhdGVfc3RhdHMoJnJ1bnRpbWVfY3ljbGVzX3N0YXRzW2NwdV0sIGNvdW50WzBdKTsKLQkJaWYgKHBlcmZfZXZzZWxfX21hdGNoKGNvdW50ZXIsIEhBUkRXQVJFLCBIV19CUkFOQ0hfSU5TVFJVQ1RJT05TKSkKLQkJCXVwZGF0ZV9zdGF0cygmcnVudGltZV9icmFuY2hlc19zdGF0c1tjcHVdLCBjb3VudFswXSk7CisJCXVwZGF0ZV9zaGFkb3dfc3RhdHMoY291bnRlciwgY291bnQpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMzE1LDEzICs0NDQsMTggQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoY291bnRlciwgJmV2c2VsX2xpc3QtPmVudHJpZXMsIG5vZGUpIHsKIAkJaWYgKGNyZWF0ZV9wZXJmX3N0YXRfY291bnRlcihjb3VudGVyKSA8IDApIHsKLQkJCWlmIChlcnJubyA9PSAtRVBFUk0gfHwgZXJybm8gPT0gLUVBQ0NFUykgeworCQkJaWYgKGVycm5vID09IEVJTlZBTCB8fCBlcnJubyA9PSBFTk9TWVMgfHwgZXJybm8gPT0gRU5PRU5UKSB7CisJCQkJaWYgKHZlcmJvc2UpCisJCQkJCXVpX193YXJuaW5nKCIlcyBldmVudCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBrZXJuZWwuXG4iLAorCQkJCQkJICAgIGV2ZW50X25hbWUoY291bnRlcikpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoZXJybm8gPT0gRVBFUk0gfHwgZXJybm8gPT0gRUFDQ0VTKSB7CiAJCQkJZXJyb3IoIllvdSBtYXkgbm90IGhhdmUgcGVybWlzc2lvbiB0byBjb2xsZWN0ICVzc3RhdHMuXG4iCiAJCQkJICAgICAgIlx0IENvbnNpZGVyIHR3ZWFraW5nIgogCQkJCSAgICAgICIgL3Byb2Mvc3lzL2tlcm5lbC9wZXJmX2V2ZW50X3BhcmFub2lkIG9yIHJ1bm5pbmcgYXMgcm9vdC4iLAogCQkJCSAgICAgIHN5c3RlbV93aWRlID8gInN5c3RlbS13aWRlICIgOiAiIik7Ci0JCQl9IGVsc2UgaWYgKGVycm5vID09IEVOT0VOVCkgewotCQkJCWVycm9yKCIlcyBldmVudCBpcyBub3Qgc3VwcG9ydGVkLiAiLCBldmVudF9uYW1lKGNvdW50ZXIpKTsKIAkJCX0gZWxzZSB7CiAJCQkJZXJyb3IoIm9wZW5fY291bnRlciByZXR1cm5lZCB3aXRoICVkICglcykuICIKIAkJCQkgICAgICAiL2Jpbi9kbWVzZyBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLlxuIiwKQEAgLTM3Miw2ICs1MDYsMTYgQEAKIAlyZXR1cm4gV0VYSVRTVEFUVVMoc3RhdHVzKTsKIH0KIAorc3RhdGljIHZvaWQgcHJpbnRfbm9pc2VfcGN0KGRvdWJsZSB0b3RhbCwgZG91YmxlIGF2ZykKK3sKKwlkb3VibGUgcGN0ID0gMC4wOworCisJaWYgKGF2ZykKKwkJcGN0ID0gMTAwLjAqdG90YWwvYXZnOworCisJZnByaW50ZihzdGRlcnIsICIgICggKy0lNi4yZiUlICkiLCBwY3QpOworfQorCiBzdGF0aWMgdm9pZCBwcmludF9ub2lzZShzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIGRvdWJsZSBhdmcpCiB7CiAJc3RydWN0IHBlcmZfc3RhdCAqcHM7CkBAIC0zODAsMTUgKzUyNCwxNCBAQAogCQlyZXR1cm47CiAKIAlwcyA9IGV2c2VsLT5wcml2OwotCWZwcmludGYoc3RkZXJyLCAiICAgKCArLSAlNy4zZiUlICkiLAotCQkJMTAwICogc3RkZGV2X3N0YXRzKCZwcy0+cmVzX3N0YXRzWzBdKSAvIGF2Zyk7CisJcHJpbnRfbm9pc2VfcGN0KHN0ZGRldl9zdGF0cygmcHMtPnJlc19zdGF0c1swXSksIGF2Zyk7CiB9CiAKIHN0YXRpYyB2b2lkIG5zZWNfcHJpbnRvdXQoaW50IGNwdSwgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLCBkb3VibGUgYXZnKQogewogCWRvdWJsZSBtc2VjcyA9IGF2ZyAvIDFlNjsKIAljaGFyIGNwdXN0clsxNl0gPSB7ICdcMCcsIH07Ci0JY29uc3QgY2hhciAqZm10ID0gY3N2X291dHB1dCA/ICIlcyUuNmYlcyVzIiA6ICIlcyUxOC42ZiVzJS0yNHMiOworCWNvbnN0IGNoYXIgKmZtdCA9IGNzdl9vdXRwdXQgPyAiJXMlLjZmJXMlcyIgOiAiJXMlMTguNmYlcyUtMjVzIjsKIAogCWlmIChub19hZ2dyKQogCQlzcHJpbnRmKGNwdXN0ciwgIkNQVSUqZCVzIiwKQEAgLTQwNCw4ICs1NDcsMTkxIEBACiAJCXJldHVybjsKIAogCWlmIChwZXJmX2V2c2VsX19tYXRjaChldnNlbCwgU09GVFdBUkUsIFNXX1RBU0tfQ0xPQ0spKQotCQlmcHJpbnRmKHN0ZGVyciwgIiAjICUxMC4zZiBDUFVzICIsCi0JCQkJYXZnIC8gYXZnX3N0YXRzKCZ3YWxsdGltZV9uc2Vjc19zdGF0cykpOworCQlmcHJpbnRmKHN0ZGVyciwgIiAjICU4LjNmIENQVXMgdXRpbGl6ZWQgICAgICAgICAgIiwgYXZnIC8gYXZnX3N0YXRzKCZ3YWxsdGltZV9uc2Vjc19zdGF0cykpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9zdGFsbGVkX2N5Y2xlc19mcm9udGVuZChpbnQgY3B1LCBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgX191c2VkLCBkb3VibGUgYXZnKQoreworCWRvdWJsZSB0b3RhbCwgcmF0aW8gPSAwLjA7CisJY29uc3QgY2hhciAqY29sb3I7CisKKwl0b3RhbCA9IGF2Z19zdGF0cygmcnVudGltZV9jeWNsZXNfc3RhdHNbY3B1XSk7CisKKwlpZiAodG90YWwpCisJCXJhdGlvID0gYXZnIC8gdG90YWwgKiAxMDAuMDsKKworCWNvbG9yID0gUEVSRl9DT0xPUl9OT1JNQUw7CisJaWYgKHJhdGlvID4gNTAuMCkKKwkJY29sb3IgPSBQRVJGX0NPTE9SX1JFRDsKKwllbHNlIGlmIChyYXRpbyA+IDMwLjApCisJCWNvbG9yID0gUEVSRl9DT0xPUl9NQUdFTlRBOworCWVsc2UgaWYgKHJhdGlvID4gMTAuMCkKKwkJY29sb3IgPSBQRVJGX0NPTE9SX1lFTExPVzsKKworCWZwcmludGYoc3RkZXJyLCAiICMgICIpOworCWNvbG9yX2ZwcmludGYoc3RkZXJyLCBjb2xvciwgIiU2LjJmJSUiLCByYXRpbyk7CisJZnByaW50ZihzdGRlcnIsICIgZnJvbnRlbmQgY3ljbGVzIGlkbGUgICAiKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfc3RhbGxlZF9jeWNsZXNfYmFja2VuZChpbnQgY3B1LCBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgX191c2VkLCBkb3VibGUgYXZnKQoreworCWRvdWJsZSB0b3RhbCwgcmF0aW8gPSAwLjA7CisJY29uc3QgY2hhciAqY29sb3I7CisKKwl0b3RhbCA9IGF2Z19zdGF0cygmcnVudGltZV9jeWNsZXNfc3RhdHNbY3B1XSk7CisKKwlpZiAodG90YWwpCisJCXJhdGlvID0gYXZnIC8gdG90YWwgKiAxMDAuMDsKKworCWNvbG9yID0gUEVSRl9DT0xPUl9OT1JNQUw7CisJaWYgKHJhdGlvID4gNzUuMCkKKwkJY29sb3IgPSBQRVJGX0NPTE9SX1JFRDsKKwllbHNlIGlmIChyYXRpbyA+IDUwLjApCisJCWNvbG9yID0gUEVSRl9DT0xPUl9NQUdFTlRBOworCWVsc2UgaWYgKHJhdGlvID4gMjAuMCkKKwkJY29sb3IgPSBQRVJGX0NPTE9SX1lFTExPVzsKKworCWZwcmludGYoc3RkZXJyLCAiICMgICIpOworCWNvbG9yX2ZwcmludGYoc3RkZXJyLCBjb2xvciwgIiU2LjJmJSUiLCByYXRpbyk7CisJZnByaW50ZihzdGRlcnIsICIgYmFja2VuZCAgY3ljbGVzIGlkbGUgICAiKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfYnJhbmNoX21pc3NlcyhpbnQgY3B1LCBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgX191c2VkLCBkb3VibGUgYXZnKQoreworCWRvdWJsZSB0b3RhbCwgcmF0aW8gPSAwLjA7CisJY29uc3QgY2hhciAqY29sb3I7CisKKwl0b3RhbCA9IGF2Z19zdGF0cygmcnVudGltZV9icmFuY2hlc19zdGF0c1tjcHVdKTsKKworCWlmICh0b3RhbCkKKwkJcmF0aW8gPSBhdmcgLyB0b3RhbCAqIDEwMC4wOworCisJY29sb3IgPSBQRVJGX0NPTE9SX05PUk1BTDsKKwlpZiAocmF0aW8gPiAyMC4wKQorCQljb2xvciA9IFBFUkZfQ09MT1JfUkVEOworCWVsc2UgaWYgKHJhdGlvID4gMTAuMCkKKwkJY29sb3IgPSBQRVJGX0NPTE9SX01BR0VOVEE7CisJZWxzZSBpZiAocmF0aW8gPiA1LjApCisJCWNvbG9yID0gUEVSRl9DT0xPUl9ZRUxMT1c7CisKKwlmcHJpbnRmKHN0ZGVyciwgIiAjICAiKTsKKwljb2xvcl9mcHJpbnRmKHN0ZGVyciwgY29sb3IsICIlNi4yZiUlIiwgcmF0aW8pOworCWZwcmludGYoc3RkZXJyLCAiIG9mIGFsbCBicmFuY2hlcyAgICAgICAgIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2wxX2RjYWNoZV9taXNzZXMoaW50IGNwdSwgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsIF9fdXNlZCwgZG91YmxlIGF2ZykKK3sKKwlkb3VibGUgdG90YWwsIHJhdGlvID0gMC4wOworCWNvbnN0IGNoYXIgKmNvbG9yOworCisJdG90YWwgPSBhdmdfc3RhdHMoJnJ1bnRpbWVfbDFfZGNhY2hlX3N0YXRzW2NwdV0pOworCisJaWYgKHRvdGFsKQorCQlyYXRpbyA9IGF2ZyAvIHRvdGFsICogMTAwLjA7CisKKwljb2xvciA9IFBFUkZfQ09MT1JfTk9STUFMOworCWlmIChyYXRpbyA+IDIwLjApCisJCWNvbG9yID0gUEVSRl9DT0xPUl9SRUQ7CisJZWxzZSBpZiAocmF0aW8gPiAxMC4wKQorCQljb2xvciA9IFBFUkZfQ09MT1JfTUFHRU5UQTsKKwllbHNlIGlmIChyYXRpbyA+IDUuMCkKKwkJY29sb3IgPSBQRVJGX0NPTE9SX1lFTExPVzsKKworCWZwcmludGYoc3RkZXJyLCAiICMgICIpOworCWNvbG9yX2ZwcmludGYoc3RkZXJyLCBjb2xvciwgIiU2LjJmJSUiLCByYXRpbyk7CisJZnByaW50ZihzdGRlcnIsICIgb2YgYWxsIEwxLWRjYWNoZSBoaXRzICAiKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfbDFfaWNhY2hlX21pc3NlcyhpbnQgY3B1LCBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgX191c2VkLCBkb3VibGUgYXZnKQoreworCWRvdWJsZSB0b3RhbCwgcmF0aW8gPSAwLjA7CisJY29uc3QgY2hhciAqY29sb3I7CisKKwl0b3RhbCA9IGF2Z19zdGF0cygmcnVudGltZV9sMV9pY2FjaGVfc3RhdHNbY3B1XSk7CisKKwlpZiAodG90YWwpCisJCXJhdGlvID0gYXZnIC8gdG90YWwgKiAxMDAuMDsKKworCWNvbG9yID0gUEVSRl9DT0xPUl9OT1JNQUw7CisJaWYgKHJhdGlvID4gMjAuMCkKKwkJY29sb3IgPSBQRVJGX0NPTE9SX1JFRDsKKwllbHNlIGlmIChyYXRpbyA+IDEwLjApCisJCWNvbG9yID0gUEVSRl9DT0xPUl9NQUdFTlRBOworCWVsc2UgaWYgKHJhdGlvID4gNS4wKQorCQljb2xvciA9IFBFUkZfQ09MT1JfWUVMTE9XOworCisJZnByaW50ZihzdGRlcnIsICIgIyAgIik7CisJY29sb3JfZnByaW50ZihzdGRlcnIsIGNvbG9yLCAiJTYuMmYlJSIsIHJhdGlvKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiBvZiBhbGwgTDEtaWNhY2hlIGhpdHMgICIpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9kdGxiX2NhY2hlX21pc3NlcyhpbnQgY3B1LCBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgX191c2VkLCBkb3VibGUgYXZnKQoreworCWRvdWJsZSB0b3RhbCwgcmF0aW8gPSAwLjA7CisJY29uc3QgY2hhciAqY29sb3I7CisKKwl0b3RhbCA9IGF2Z19zdGF0cygmcnVudGltZV9kdGxiX2NhY2hlX3N0YXRzW2NwdV0pOworCisJaWYgKHRvdGFsKQorCQlyYXRpbyA9IGF2ZyAvIHRvdGFsICogMTAwLjA7CisKKwljb2xvciA9IFBFUkZfQ09MT1JfTk9STUFMOworCWlmIChyYXRpbyA+IDIwLjApCisJCWNvbG9yID0gUEVSRl9DT0xPUl9SRUQ7CisJZWxzZSBpZiAocmF0aW8gPiAxMC4wKQorCQljb2xvciA9IFBFUkZfQ09MT1JfTUFHRU5UQTsKKwllbHNlIGlmIChyYXRpbyA+IDUuMCkKKwkJY29sb3IgPSBQRVJGX0NPTE9SX1lFTExPVzsKKworCWZwcmludGYoc3RkZXJyLCAiICMgICIpOworCWNvbG9yX2ZwcmludGYoc3RkZXJyLCBjb2xvciwgIiU2LjJmJSUiLCByYXRpbyk7CisJZnByaW50ZihzdGRlcnIsICIgb2YgYWxsIGRUTEIgY2FjaGUgaGl0cyAiKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfaXRsYl9jYWNoZV9taXNzZXMoaW50IGNwdSwgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsIF9fdXNlZCwgZG91YmxlIGF2ZykKK3sKKwlkb3VibGUgdG90YWwsIHJhdGlvID0gMC4wOworCWNvbnN0IGNoYXIgKmNvbG9yOworCisJdG90YWwgPSBhdmdfc3RhdHMoJnJ1bnRpbWVfaXRsYl9jYWNoZV9zdGF0c1tjcHVdKTsKKworCWlmICh0b3RhbCkKKwkJcmF0aW8gPSBhdmcgLyB0b3RhbCAqIDEwMC4wOworCisJY29sb3IgPSBQRVJGX0NPTE9SX05PUk1BTDsKKwlpZiAocmF0aW8gPiAyMC4wKQorCQljb2xvciA9IFBFUkZfQ09MT1JfUkVEOworCWVsc2UgaWYgKHJhdGlvID4gMTAuMCkKKwkJY29sb3IgPSBQRVJGX0NPTE9SX01BR0VOVEE7CisJZWxzZSBpZiAocmF0aW8gPiA1LjApCisJCWNvbG9yID0gUEVSRl9DT0xPUl9ZRUxMT1c7CisKKwlmcHJpbnRmKHN0ZGVyciwgIiAjICAiKTsKKwljb2xvcl9mcHJpbnRmKHN0ZGVyciwgY29sb3IsICIlNi4yZiUlIiwgcmF0aW8pOworCWZwcmludGYoc3RkZXJyLCAiIG9mIGFsbCBpVExCIGNhY2hlIGhpdHMgIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2xsX2NhY2hlX21pc3NlcyhpbnQgY3B1LCBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgX191c2VkLCBkb3VibGUgYXZnKQoreworCWRvdWJsZSB0b3RhbCwgcmF0aW8gPSAwLjA7CisJY29uc3QgY2hhciAqY29sb3I7CisKKwl0b3RhbCA9IGF2Z19zdGF0cygmcnVudGltZV9sbF9jYWNoZV9zdGF0c1tjcHVdKTsKKworCWlmICh0b3RhbCkKKwkJcmF0aW8gPSBhdmcgLyB0b3RhbCAqIDEwMC4wOworCisJY29sb3IgPSBQRVJGX0NPTE9SX05PUk1BTDsKKwlpZiAocmF0aW8gPiAyMC4wKQorCQljb2xvciA9IFBFUkZfQ09MT1JfUkVEOworCWVsc2UgaWYgKHJhdGlvID4gMTAuMCkKKwkJY29sb3IgPSBQRVJGX0NPTE9SX01BR0VOVEE7CisJZWxzZSBpZiAocmF0aW8gPiA1LjApCisJCWNvbG9yID0gUEVSRl9DT0xPUl9ZRUxMT1c7CisKKwlmcHJpbnRmKHN0ZGVyciwgIiAjICAiKTsKKwljb2xvcl9mcHJpbnRmKHN0ZGVyciwgY29sb3IsICIlNi4yZiUlIiwgcmF0aW8pOworCWZwcmludGYoc3RkZXJyLCAiIG9mIGFsbCBMTC1jYWNoZSBoaXRzICAgIik7CiB9CiAKIHN0YXRpYyB2b2lkIGFic19wcmludG91dChpbnQgY3B1LCBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIGRvdWJsZSBhdmcpCkBAIC00MTcsOSArNzQzLDkgQEAKIAlpZiAoY3N2X291dHB1dCkKIAkJZm10ID0gIiVzJS4wZiVzJXMiOwogCWVsc2UgaWYgKGJpZ19udW0pCi0JCWZtdCA9ICIlcyUnMTguMGYlcyUtMjRzIjsKKwkJZm10ID0gIiVzJScxOC4wZiVzJS0yNXMiOwogCWVsc2UKLQkJZm10ID0gIiVzJTE4LjBmJXMlLTI0cyI7CisJCWZtdCA9ICIlcyUxOC4wZiVzJS0yNXMiOwogCiAJaWYgKG5vX2FnZ3IpCiAJCXNwcmludGYoY3B1c3RyLCAiQ1BVJSpkJXMiLApAQCAtNDQyLDIzICs3NjgsODMgQEAKIAkJaWYgKHRvdGFsKQogCQkJcmF0aW8gPSBhdmcgLyB0b3RhbDsKIAotCQlmcHJpbnRmKHN0ZGVyciwgIiAjICUxMC4zZiBJUEMgICIsIHJhdGlvKTsKKwkJZnByaW50ZihzdGRlcnIsICIgIyAgICU1LjJmICBpbnNucyBwZXIgY3ljbGUgICAgICAgICIsIHJhdGlvKTsKKworCQl0b3RhbCA9IGF2Z19zdGF0cygmcnVudGltZV9zdGFsbGVkX2N5Y2xlc19mcm9udF9zdGF0c1tjcHVdKTsKKwkJdG90YWwgPSBtYXgodG90YWwsIGF2Z19zdGF0cygmcnVudGltZV9zdGFsbGVkX2N5Y2xlc19iYWNrX3N0YXRzW2NwdV0pKTsKKworCQlpZiAodG90YWwgJiYgYXZnKSB7CisJCQlyYXRpbyA9IHRvdGFsIC8gYXZnOworCQkJZnByaW50ZihzdGRlcnIsICJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAlNS4yZiAgc3RhbGxlZCBjeWNsZXMgcGVyIGluc24iLCByYXRpbyk7CisJCX0KKwogCX0gZWxzZSBpZiAocGVyZl9ldnNlbF9fbWF0Y2goZXZzZWwsIEhBUkRXQVJFLCBIV19CUkFOQ0hfTUlTU0VTKSAmJgogCQkJcnVudGltZV9icmFuY2hlc19zdGF0c1tjcHVdLm4gIT0gMCkgewotCQl0b3RhbCA9IGF2Z19zdGF0cygmcnVudGltZV9icmFuY2hlc19zdGF0c1tjcHVdKTsKKwkJcHJpbnRfYnJhbmNoX21pc3NlcyhjcHUsIGV2c2VsLCBhdmcpOworCX0gZWxzZSBpZiAoCisJCWV2c2VsLT5hdHRyLnR5cGUgPT0gUEVSRl9UWVBFX0hXX0NBQ0hFICYmCisJCWV2c2VsLT5hdHRyLmNvbmZpZyA9PSAgKCBQRVJGX0NPVU5UX0hXX0NBQ0hFX0wxRCB8CisJCQkJCSgoUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9SRUFEKSA8PCA4KSB8CisJCQkJCSgoUEVSRl9DT1VOVF9IV19DQUNIRV9SRVNVTFRfTUlTUykgPDwgMTYpKSAmJgorCQkJcnVudGltZV9sMV9kY2FjaGVfc3RhdHNbY3B1XS5uICE9IDApIHsKKwkJcHJpbnRfbDFfZGNhY2hlX21pc3NlcyhjcHUsIGV2c2VsLCBhdmcpOworCX0gZWxzZSBpZiAoCisJCWV2c2VsLT5hdHRyLnR5cGUgPT0gUEVSRl9UWVBFX0hXX0NBQ0hFICYmCisJCWV2c2VsLT5hdHRyLmNvbmZpZyA9PSAgKCBQRVJGX0NPVU5UX0hXX0NBQ0hFX0wxSSB8CisJCQkJCSgoUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9SRUFEKSA8PCA4KSB8CisJCQkJCSgoUEVSRl9DT1VOVF9IV19DQUNIRV9SRVNVTFRfTUlTUykgPDwgMTYpKSAmJgorCQkJcnVudGltZV9sMV9pY2FjaGVfc3RhdHNbY3B1XS5uICE9IDApIHsKKwkJcHJpbnRfbDFfaWNhY2hlX21pc3NlcyhjcHUsIGV2c2VsLCBhdmcpOworCX0gZWxzZSBpZiAoCisJCWV2c2VsLT5hdHRyLnR5cGUgPT0gUEVSRl9UWVBFX0hXX0NBQ0hFICYmCisJCWV2c2VsLT5hdHRyLmNvbmZpZyA9PSAgKCBQRVJGX0NPVU5UX0hXX0NBQ0hFX0RUTEIgfAorCQkJCQkoKFBFUkZfQ09VTlRfSFdfQ0FDSEVfT1BfUkVBRCkgPDwgOCkgfAorCQkJCQkoKFBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01JU1MpIDw8IDE2KSkgJiYKKwkJCXJ1bnRpbWVfZHRsYl9jYWNoZV9zdGF0c1tjcHVdLm4gIT0gMCkgeworCQlwcmludF9kdGxiX2NhY2hlX21pc3NlcyhjcHUsIGV2c2VsLCBhdmcpOworCX0gZWxzZSBpZiAoCisJCWV2c2VsLT5hdHRyLnR5cGUgPT0gUEVSRl9UWVBFX0hXX0NBQ0hFICYmCisJCWV2c2VsLT5hdHRyLmNvbmZpZyA9PSAgKCBQRVJGX0NPVU5UX0hXX0NBQ0hFX0lUTEIgfAorCQkJCQkoKFBFUkZfQ09VTlRfSFdfQ0FDSEVfT1BfUkVBRCkgPDwgOCkgfAorCQkJCQkoKFBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01JU1MpIDw8IDE2KSkgJiYKKwkJCXJ1bnRpbWVfaXRsYl9jYWNoZV9zdGF0c1tjcHVdLm4gIT0gMCkgeworCQlwcmludF9pdGxiX2NhY2hlX21pc3NlcyhjcHUsIGV2c2VsLCBhdmcpOworCX0gZWxzZSBpZiAoCisJCWV2c2VsLT5hdHRyLnR5cGUgPT0gUEVSRl9UWVBFX0hXX0NBQ0hFICYmCisJCWV2c2VsLT5hdHRyLmNvbmZpZyA9PSAgKCBQRVJGX0NPVU5UX0hXX0NBQ0hFX0xMIHwKKwkJCQkJKChQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX1JFQUQpIDw8IDgpIHwKKwkJCQkJKChQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NSVNTKSA8PCAxNikpICYmCisJCQlydW50aW1lX2xsX2NhY2hlX3N0YXRzW2NwdV0ubiAhPSAwKSB7CisJCXByaW50X2xsX2NhY2hlX21pc3NlcyhjcHUsIGV2c2VsLCBhdmcpOworCX0gZWxzZSBpZiAocGVyZl9ldnNlbF9fbWF0Y2goZXZzZWwsIEhBUkRXQVJFLCBIV19DQUNIRV9NSVNTRVMpICYmCisJCQlydW50aW1lX2NhY2hlcmVmc19zdGF0c1tjcHVdLm4gIT0gMCkgeworCQl0b3RhbCA9IGF2Z19zdGF0cygmcnVudGltZV9jYWNoZXJlZnNfc3RhdHNbY3B1XSk7CiAKIAkJaWYgKHRvdGFsKQogCQkJcmF0aW8gPSBhdmcgKiAxMDAgLyB0b3RhbDsKIAotCQlmcHJpbnRmKHN0ZGVyciwgIiAjICUxMC4zZiAlJSAgICAiLCByYXRpbyk7CisJCWZwcmludGYoc3RkZXJyLCAiICMgJTguM2YgJSUgb2YgYWxsIGNhY2hlIHJlZnMgICAgIiwgcmF0aW8pOwogCisJfSBlbHNlIGlmIChwZXJmX2V2c2VsX19tYXRjaChldnNlbCwgSEFSRFdBUkUsIEhXX1NUQUxMRURfQ1lDTEVTX0ZST05URU5EKSkgeworCQlwcmludF9zdGFsbGVkX2N5Y2xlc19mcm9udGVuZChjcHUsIGV2c2VsLCBhdmcpOworCX0gZWxzZSBpZiAocGVyZl9ldnNlbF9fbWF0Y2goZXZzZWwsIEhBUkRXQVJFLCBIV19TVEFMTEVEX0NZQ0xFU19CQUNLRU5EKSkgeworCQlwcmludF9zdGFsbGVkX2N5Y2xlc19iYWNrZW5kKGNwdSwgZXZzZWwsIGF2Zyk7CisJfSBlbHNlIGlmIChwZXJmX2V2c2VsX19tYXRjaChldnNlbCwgSEFSRFdBUkUsIEhXX0NQVV9DWUNMRVMpKSB7CisJCXRvdGFsID0gYXZnX3N0YXRzKCZydW50aW1lX25zZWNzX3N0YXRzW2NwdV0pOworCisJCWlmICh0b3RhbCkKKwkJCXJhdGlvID0gMS4wICogYXZnIC8gdG90YWw7CisKKwkJZnByaW50ZihzdGRlcnIsICIgIyAlOC4zZiBHSHogICAgICAgICAgICAgICAgICAgICIsIHJhdGlvKTsKIAl9IGVsc2UgaWYgKHJ1bnRpbWVfbnNlY3Nfc3RhdHNbY3B1XS5uICE9IDApIHsKIAkJdG90YWwgPSBhdmdfc3RhdHMoJnJ1bnRpbWVfbnNlY3Nfc3RhdHNbY3B1XSk7CiAKIAkJaWYgKHRvdGFsKQogCQkJcmF0aW8gPSAxMDAwLjAgKiBhdmcgLyB0b3RhbDsKIAotCQlmcHJpbnRmKHN0ZGVyciwgIiAjICUxMC4zZiBNL3NlYyIsIHJhdGlvKTsKKwkJZnByaW50ZihzdGRlcnIsICIgIyAlOC4zZiBNL3NlYyAgICAgICAgICAgICAgICAgICIsIHJhdGlvKTsKKwl9IGVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CiAJfQogfQogCkBAIC01MDUsOCArODkxLDcgQEAKIAkJYXZnX2VuYWJsZWQgPSBhdmdfc3RhdHMoJnBzLT5yZXNfc3RhdHNbMV0pOwogCQlhdmdfcnVubmluZyA9IGF2Z19zdGF0cygmcHMtPnJlc19zdGF0c1syXSk7CiAKLQkJZnByaW50ZihzdGRlcnIsICIgIChzY2FsZWQgZnJvbSAlLjJmJSUpIiwKLQkJCQkxMDAgKiBhdmdfcnVubmluZyAvIGF2Z19lbmFibGVkKTsKKwkJZnByaW50ZihzdGRlcnIsICIgWyU1LjJmJSVdIiwgMTAwICogYXZnX3J1bm5pbmcgLyBhdmdfZW5hYmxlZCk7CiAJfQogCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKIH0KQEAgLTU0OCwxMCArOTMzLDggQEAKIAkJaWYgKCFjc3Zfb3V0cHV0KSB7CiAJCQlwcmludF9ub2lzZShjb3VudGVyLCAxLjApOwogCi0JCQlpZiAocnVuICE9IGVuYSkgewotCQkJCWZwcmludGYoc3RkZXJyLCAiICAoc2NhbGVkIGZyb20gJS4yZiUlKSIsCi0JCQkJCTEwMC4wICogcnVuIC8gZW5hKTsKLQkJCX0KKwkJCWlmIChydW4gIT0gZW5hKQorCQkJCWZwcmludGYoc3RkZXJyLCAiICAoJS4yZiUlKSIsIDEwMC4wICogcnVuIC8gZW5hKTsKIAkJfQogCQlmcHV0YygnXG4nLCBzdGRlcnIpOwogCX0KQEAgLTU5MSwxMyArOTc0LDE0IEBACiAJfQogCiAJaWYgKCFjc3Zfb3V0cHV0KSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQkJZnByaW50ZihzdGRlcnIsICIgJTE4LjlmICBzZWNvbmRzIHRpbWUgZWxhcHNlZCIsCisJCWlmICghbnVsbF9ydW4pCisJCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiICUxNy45ZiBzZWNvbmRzIHRpbWUgZWxhcHNlZCIsCiAJCQkJYXZnX3N0YXRzKCZ3YWxsdGltZV9uc2Vjc19zdGF0cykvMWU5KTsKIAkJaWYgKHJ1bl9jb3VudCA+IDEpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiICAgKCArLSAlNy4zZiUlICkiLAotCQkJCTEwMCpzdGRkZXZfc3RhdHMoJndhbGx0aW1lX25zZWNzX3N0YXRzKSAvCi0JCQkJYXZnX3N0YXRzKCZ3YWxsdGltZV9uc2Vjc19zdGF0cykpOworCQkJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CisJCQlwcmludF9ub2lzZV9wY3Qoc3RkZGV2X3N0YXRzKCZ3YWxsdGltZV9uc2Vjc19zdGF0cyksCisJCQkJCWF2Z19zdGF0cygmd2FsbHRpbWVfbnNlY3Nfc3RhdHMpKTsKIAkJfQogCQlmcHJpbnRmKHN0ZGVyciwgIlxuXG4iKTsKIAl9CkBAIC02NTksNiArMTA0MywxMCBAQAogCQkgICAgInJlcGVhdCBjb21tYW5kIGFuZCBwcmludCBhdmVyYWdlICsgc3RkZGV2IChtYXg6IDEwMCkiKSwKIAlPUFRfQk9PTEVBTignbicsICJudWxsIiwgJm51bGxfcnVuLAogCQkgICAgIm51bGwgcnVuIC0gZG9udCBzdGFydCBhbnkgY291bnRlcnMiKSwKKwlPUFRfSU5DUignZCcsICJkZXRhaWxlZCIsICZkZXRhaWxlZF9ydW4sCisJCSAgICAiZGV0YWlsZWQgcnVuIC0gc3RhcnQgYSBsb3Qgb2YgZXZlbnRzIiksCisJT1BUX0JPT0xFQU4oJ1MnLCAic3luYyIsICZzeW5jX3J1biwKKwkJICAgICJjYWxsIHN5bmMoKSBiZWZvcmUgc3RhcnRpbmcgYSBydW4iKSwKIAlPUFRfQ0FMTEJBQ0tfTk9PUFQoJ0InLCAiYmlnLW51bSIsIE5VTEwsIE5VTEwsIAogCQkJICAgInByaW50IGxhcmdlIG51bWJlcnMgd2l0aCB0aG91c2FuZHNcJyBzZXBhcmF0b3JzIiwKIAkJCSAgIHN0YXRfX3NldF9iaWdfbnVtKSwKQEAgLTY3NCw2ICsxMDYyLDcwIEBACiAJT1BUX0VORCgpCiB9OwogCisvKgorICogQWRkIGRlZmF1bHQgYXR0cmlidXRlcywgaWYgdGhlcmUgd2VyZSBubyBhdHRyaWJ1dGVzIHNwZWNpZmllZCBvcgorICogaWYgLWQvLS1kZXRhaWxlZCwgLWQgLWQgb3IgLWQgLWQgLWQgaXMgdXNlZDoKKyAqLworc3RhdGljIGludCBhZGRfZGVmYXVsdF9hdHRyaWJ1dGVzKHZvaWQpCit7CisJc3RydWN0IHBlcmZfZXZzZWwgKnBvczsKKwlzaXplX3QgYXR0cl9uciA9IDA7CisJc2l6ZV90IGM7CisKKwkvKiBTZXQgYXR0cnMgaWYgbm8gZXZlbnQgaXMgc2VsZWN0ZWQgYW5kICFudWxsX3J1bjogKi8KKwlpZiAobnVsbF9ydW4pCisJCXJldHVybiAwOworCisJaWYgKCFldnNlbF9saXN0LT5ucl9lbnRyaWVzKSB7CisJCWZvciAoYyA9IDA7IGMgPCBBUlJBWV9TSVpFKGRlZmF1bHRfYXR0cnMpOyBjKyspIHsKKwkJCXBvcyA9IHBlcmZfZXZzZWxfX25ldyhkZWZhdWx0X2F0dHJzICsgYywgYyArIGF0dHJfbnIpOworCQkJaWYgKHBvcyA9PSBOVUxMKQorCQkJCXJldHVybiAtMTsKKwkJCXBlcmZfZXZsaXN0X19hZGQoZXZzZWxfbGlzdCwgcG9zKTsKKwkJfQorCQlhdHRyX25yICs9IGM7CisJfQorCisJLyogRGV0YWlsZWQgZXZlbnRzIGdldCBhcHBlbmRlZCB0byB0aGUgZXZlbnQgbGlzdDogKi8KKworCWlmIChkZXRhaWxlZF9ydW4gPCAgMSkKKwkJcmV0dXJuIDA7CisKKwkvKiBBcHBlbmQgZGV0YWlsZWQgcnVuIGV4dHJhIGF0dHJpYnV0ZXM6ICovCisJZm9yIChjID0gMDsgYyA8IEFSUkFZX1NJWkUoZGV0YWlsZWRfYXR0cnMpOyBjKyspIHsKKwkJcG9zID0gcGVyZl9ldnNlbF9fbmV3KGRldGFpbGVkX2F0dHJzICsgYywgYyArIGF0dHJfbnIpOworCQlpZiAocG9zID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisJCXBlcmZfZXZsaXN0X19hZGQoZXZzZWxfbGlzdCwgcG9zKTsKKwl9CisJYXR0cl9uciArPSBjOworCisJaWYgKGRldGFpbGVkX3J1biA8IDIpCisJCXJldHVybiAwOworCisJLyogQXBwZW5kIHZlcnkgZGV0YWlsZWQgcnVuIGV4dHJhIGF0dHJpYnV0ZXM6ICovCisJZm9yIChjID0gMDsgYyA8IEFSUkFZX1NJWkUodmVyeV9kZXRhaWxlZF9hdHRycyk7IGMrKykgeworCQlwb3MgPSBwZXJmX2V2c2VsX19uZXcodmVyeV9kZXRhaWxlZF9hdHRycyArIGMsIGMgKyBhdHRyX25yKTsKKwkJaWYgKHBvcyA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCQlwZXJmX2V2bGlzdF9fYWRkKGV2c2VsX2xpc3QsIHBvcyk7CisJfQorCisJaWYgKGRldGFpbGVkX3J1biA8IDMpCisJCXJldHVybiAwOworCisJLyogQXBwZW5kIHZlcnksIHZlcnkgZGV0YWlsZWQgcnVuIGV4dHJhIGF0dHJpYnV0ZXM6ICovCisJZm9yIChjID0gMDsgYyA8IEFSUkFZX1NJWkUodmVyeV92ZXJ5X2RldGFpbGVkX2F0dHJzKTsgYysrKSB7CisJCXBvcyA9IHBlcmZfZXZzZWxfX25ldyh2ZXJ5X3ZlcnlfZGV0YWlsZWRfYXR0cnMgKyBjLCBjICsgYXR0cl9ucik7CisJCWlmIChwb3MgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKwkJcGVyZl9ldmxpc3RfX2FkZChldnNlbF9saXN0LCBwb3MpOworCX0KKworCisJcmV0dXJuIDA7Cit9CisKIGludCBjbWRfc3RhdChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCBfX3VzZWQpCiB7CiAJc3RydWN0IHBlcmZfZXZzZWwgKnBvczsKQEAgLTcxOSwxNyArMTE3MSw4IEBACiAJCXVzYWdlX3dpdGhfb3B0aW9ucyhzdGF0X3VzYWdlLCBvcHRpb25zKTsKIAl9CiAKLQkvKiBTZXQgYXR0cnMgYW5kIG5yX2NvdW50ZXJzIGlmIG5vIGV2ZW50IGlzIHNlbGVjdGVkIGFuZCAhbnVsbF9ydW4gKi8KLQlpZiAoIW51bGxfcnVuICYmICFldnNlbF9saXN0LT5ucl9lbnRyaWVzKSB7Ci0JCXNpemVfdCBjOwotCi0JCWZvciAoYyA9IDA7IGMgPCBBUlJBWV9TSVpFKGRlZmF1bHRfYXR0cnMpOyArK2MpIHsKLQkJCXBvcyA9IHBlcmZfZXZzZWxfX25ldygmZGVmYXVsdF9hdHRyc1tjXSwgYyk7Ci0JCQlpZiAocG9zID09IE5VTEwpCi0JCQkJZ290byBvdXQ7Ci0JCQlwZXJmX2V2bGlzdF9fYWRkKGV2c2VsX2xpc3QsIHBvcyk7Ci0JCX0KLQl9CisJaWYgKGFkZF9kZWZhdWx0X2F0dHJpYnV0ZXMoKSkKKwkJZ290byBvdXQ7CiAKIAlpZiAodGFyZ2V0X3BpZCAhPSAtMSkKIAkJdGFyZ2V0X3RpZCA9IHRhcmdldF9waWQ7CkBAIC03NzMsNiArMTIxNiwxMCBAQAogCWZvciAocnVuX2lkeCA9IDA7IHJ1bl9pZHggPCBydW5fY291bnQ7IHJ1bl9pZHgrKykgewogCQlpZiAocnVuX2NvdW50ICE9IDEgJiYgdmVyYm9zZSkKIAkJCWZwcmludGYoc3RkZXJyLCAiWyBwZXJmIHN0YXQ6IGV4ZWN1dGluZyBydW4gIyVkIC4uLiBdXG4iLCBydW5faWR4ICsgMSk7CisKKwkJaWYgKHN5bmNfcnVuKQorCQkJc3luYygpOworCiAJCXN0YXR1cyA9IHJ1bl9wZXJmX3N0YXQoYXJnYywgYXJndik7CiAJfQogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2ZlYXR1cmUtdGVzdHMubWFrIGIvdG9vbHMvcGVyZi9jb25maWcvZmVhdHVyZS10ZXN0cy5tYWsKc2ltaWxhcml0eSBpbmRleCA4NSUKcmVuYW1lIGZyb20gdG9vbHMvcGVyZi9mZWF0dXJlLXRlc3RzLm1hawpyZW5hbWUgdG8gdG9vbHMvcGVyZi9jb25maWcvZmVhdHVyZS10ZXN0cy5tYWsKaW5kZXggYjA0MWNhNi4uNjE3MGZkMiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9mZWF0dXJlLXRlc3RzLm1haworKysgYi90b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLXRlc3RzLm1hawpAQCAtNzksOSArNzksMTUgQEAKIGVuZGlmCiAKIGlmbmRlZiBOT19MSUJQWVRIT04KK2RlZmluZSBTT1VSQ0VfUFlUSE9OX1ZFUlNJT04KKyNpbmNsdWRlIDxQeXRob24uaD4KKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisJI2Vycm9yCisjZW5kaWYKK2ludCBtYWluKHZvaWQpe30KK2VuZGVmCiBkZWZpbmUgU09VUkNFX1BZVEhPTl9FTUJFRAogI2luY2x1ZGUgPFB5dGhvbi5oPgotCiBpbnQgbWFpbih2b2lkKQogewogCVB5X0luaXRpYWxpemUoKTsKQEAgLTEyMCwxMSArMTI2LDMgQEAKIAlyZXR1cm4gMDsKIH0KIGVuZGVmCi0KLSMgdHJ5LWNjCi0jIFVzYWdlOiBvcHRpb24gPSAkKGNhbGwgdHJ5LWNjLCBzb3VyY2UtdG8tYnVpbGQsIGNjLW9wdGlvbnMpCi10cnktY2MgPSAkKHNoZWxsIHNoIC1jCQkJCQkJICBcCi0JJ1RNUD0iJChPVVRQVVQpJChUTVBPVVQpLiQkJCQiOwkJCQkgIFwKLQkgZWNobyAiJCgxKSIgfAkJCQkJCSAgXAotCSAkKENDKSAteCBjIC0gJCgyKSAtbyAiJCRUTVAiID4gL2Rldi9udWxsIDI+JjEgJiYgZWNobyB5OyBcCi0JIHJtIC1mICIkJFRNUCInKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9jb25maWcvdXRpbGl0aWVzLm1hayBiL3Rvb2xzL3BlcmYvY29uZmlnL3V0aWxpdGllcy5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA0NjE4MgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvY29uZmlnL3V0aWxpdGllcy5tYWsKQEAgLTAsMCArMSwxODggQEAKKyMgVGhpcyBhbGxvd3MgdXMgdG8gd29yayB3aXRoIHRoZSBuZXdsaW5lIGNoYXJhY3RlcjoKK2RlZmluZSBuZXdsaW5lCisKKworZW5kZWYKK25ld2xpbmUgOj0gJChuZXdsaW5lKQorCisjIG5sLWVzY2FwZQorIworIyBVc2FnZTogZXNjYXBlID0gJChjYWxsIG5sLWVzY2FwZVssZXNjYXBlXSkKKyMKKyMgVGhpcyBpcyB1c2VkIGFzIHRoZSBjb21tb24gd2F5IHRvIHNwZWNpZnkKKyMgd2hhdCBzaG91bGQgcmVwbGFjZSBhIG5ld2xpbmUgd2hlbiBlc2NhcGluZworIyBuZXdsaW5lczsgdGhlIGRlZmF1bHQgaXMgYSBiaXphcnJlIHN0cmluZy4KKyMKK25sLWVzY2FwZSA9ICQob3IgJCgxKSxtODIyZGYzMDIwdzZhNDRpZDM0YnQ1NzRjdGFjNDRlYjlmNG4pCisKKyMgZXNjYXBlLW5sCisjCisjIFVzYWdlOiBlc2NhcGVkLXRleHQgPSAkKGNhbGwgZXNjYXBlLW5sLHRleHRbLGVzY2FwZV0pCisjCisjIEdOVSBtYWtlJ3MgJChzaGVsbCAuLi4pIGZ1bmN0aW9uIGNvbnZlcnRzIHRvIGEKKyMgc2luZ2xlIHNwYWNlIGVhY2ggbmV3bGluZSBjaGFyYWN0ZXIgaW4gdGhlIG91dHB1dAorIyBwcm9kdWNlZCBkdXJpbmcgdGhlIGV4cGFuc2lvbjsgdGhpcyBtYXkgbm90IGJlCisjIGRlc2lyYWJsZS4KKyMKKyMgVGhlIG9ubHkgc29sdXRpb24gaXMgdG8gY2hhbmdlIGVhY2ggbmV3bGluZSBpbnRvCisjIHNvbWV0aGluZyB0aGF0IHdvbid0IGJlIGNvbnZlcnRlZCwgc28gdGhhdCB0aGUKKyMgaW5mb3JtYXRpb24gY2FuIGJlIHJlY292ZXJlZCBsYXRlciB3aXRoCisjICQoY2FsbCB1bmVzY2FwZS1ubC4uLikKKyMKK2VzY2FwZS1ubCA9ICQoc3Vic3QgJChuZXdsaW5lKSwkKGNhbGwgbmwtZXNjYXBlLCQoMikpLCQoMSkpCisKKyMgdW5lc2NhcGUtbmwKKyMKKyMgVXNhZ2U6IHRleHQgPSAkKGNhbGwgdW5lc2NhcGUtbmwsZXNjYXBlZC10ZXh0Wyxlc2NhcGVdKQorIworIyBTZWUgZXNjYXBlLW5sLgorIwordW5lc2NhcGUtbmwgPSAkKHN1YnN0ICQoY2FsbCBubC1lc2NhcGUsJCgyKSksJChuZXdsaW5lKSwkKDEpKQorCisjIHNoZWxsLWVzY2FwZS1ubAorIworIyBVc2FnZTogJChzaGVsbCBzb21lLWNvbW1hbmQgfCAkKGNhbGwgc2hlbGwtZXNjYXBlLW5sWyxlc2NhcGVdKSkKKyMKKyMgVXNlIHRoaXMgdG8gZXNjYXBlIG5ld2xpbmVzIGZyb20gd2l0aGluIGEgc2hlbGwgY2FsbDsKKyMgdGhlIGRlZmF1bHQgZXNjYXBlIGlzIGEgYml6YXJyZSBzdHJpbmcuCisjCisjIE5PVEU6IFRoZSBlc2NhcGUgaXMgdXNlZCBkaXJlY3RseSBhcyBhIHN0cmluZyBjb25zdGFudAorIyAgICAgICBpbiBhbiBgYXdrJyBwcm9ncmFtIHRoYXQgaXMgZGVsaW1pdGVkIGJ5IHNoZWxsCisjICAgICAgIHNpbmdsZS1xdW90ZXMsIHNvIGJlIHdhcnkgb2YgdGhlIGNoYXJhY3RlcnMKKyMgICAgICAgdGhhdCBhcmUgY2hvc2VuLgorIworZGVmaW5lIHNoZWxsLWVzY2FwZS1ubAorYXdrICdOUj09MSB7dD0kJDB9IE5SPjEge3Q9dCAiJChubC1lc2NhcGUpIiAkJDB9IEVORCB7cHJpbnRmIHR9JworZW5kZWYKKworIyBzaGVsbC11bmVzY2FwZS1ubAorIworIyBVc2FnZTogJChzaGVsbCBzb21lLWNvbW1hbmQgfCAkKGNhbGwgc2hlbGwtdW5lc2NhcGUtbmxbLGVzY2FwZV0pKQorIworIyBVc2UgdGhpcyB0byB1bmVzY2FwZSBuZXdsaW5lcyBmcm9tIHdpdGhpbiBhIHNoZWxsIGNhbGw7CisjIHRoZSBkZWZhdWx0IGVzY2FwZSBpcyBhIGJpemFycmUgc3RyaW5nLgorIworIyBOT1RFOiBUaGUgZXNjYXBlIGlzIHVzZWQgZGlyZWN0bHkgYXMgYW4gZXh0ZW5kZWQgcmVndWxhcgorIyAgICAgICBleHByZXNzaW9uIGNvbnN0YW50IGluIGFuIGBhd2snIHByb2dyYW0gdGhhdCBpcworIyAgICAgICBkZWxpbWl0ZWQgYnkgc2hlbGwgc2luZ2xlLXF1b3Rlcywgc28gYmUgd2FyeQorIyAgICAgICBvZiB0aGUgY2hhcmFjdGVycyB0aGF0IGFyZSBjaG9zZW4uCisjCisjIChUaGUgYmFzaCBzaGVsbCBoYXMgYSBidWcgd2hlcmUgYHtnc3ViKC4uLiksLi4ufScgaXMKKyMgIG1pc2ludGVycHJldGVkIGFzIGEgYnJhY2UgZXhwYW5zaW9uOyB0aGlzIGNhbiBiZQorIyAgb3ZlcmNvbWUgYnkgcHV0dGluZyBhIHNwYWNlIGJldHdlZW4gYHsnIGFuZCBgZ3N1YicpLgorIworZGVmaW5lIHNoZWxsLXVuZXNjYXBlLW5sCithd2sgJ05SPT0xIHt0PSQkMH0gTlI+MSB7dD10ICJcbiIgJCQwfSBFTkQgeyBnc3ViKC8kKG5sLWVzY2FwZSkvLCJcbiIsdCk7IHByaW50ZiB0IH0nCitlbmRlZgorCisjIGVzY2FwZS1mb3Itc2hlbGwtc3EKKyMKKyMgVXNhZ2U6IGVtYmVkZGFibGUtdGV4dCA9ICQoY2FsbCBlc2NhcGUtZm9yLXNoZWxsLXNxLHRleHQpCisjCisjIFRoaXMgZnVuY3Rpb24gcHJvZHVjZXMgdGV4dCB0aGF0IGlzIHN1aXRhYmxlIGZvcgorIyBlbWJlZGRpbmcgaW4gYSBzaGVsbCBzdHJpbmcgdGhhdCBpcyBkZWxpbWl0ZWQgYnkKKyMgc2luZ2xlLXF1b3Rlcy4KKyMKK2VzY2FwZS1mb3Itc2hlbGwtc3EgPSAgJChzdWJzdCAnLCdcJycsJCgxKSkKKworIyBzaGVsbC1zcQorIworIyBVc2FnZTogc2luZ2xlLXF1b3RlZC1hbmQtZXNjYXBlZC10ZXh0ID0gJChjYWxsIHNoZWxsLXNxLHRleHQpCisjCitzaGVsbC1zcSA9ICckKGVzY2FwZS1mb3Itc2hlbGwtc3EpJworCisjIHNoZWxsLXdvcmRpZnkKKyMKKyMgVXNhZ2U6IHdvcmRpZmllZC10ZXh0ID0gJChjYWxsIHNoZWxsLXdvcmRpZnksdGV4dCkKKyMKKyMgRm9yIGluc3RhbmNlOgorIworIyAgfGRlZmluZSB0ZXh0CisjICB8aGVsbG8KKyMgIHx3b3JsZAorIyAgfGVuZGVmCisjICB8CisjICB8dGFyZ2V0OgorIyAgfAllY2hvICQoY2FsbCBzaGVsbC13b3JkaWZ5LCQodGV4dCkpCisjCisjIEF0IGxlYXN0IEdOVSBtYWtlIGdldHMgY29uZnVzZWQgYnkgZXhwYW5kaW5nIGEgbmV3bGluZQorIyB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYSBjb21tYW5kIGxpbmUgb2YgYSBtYWtlZmlsZSBydWxlCisjICh0aGlzIGlzIGluIGNvbnN0cmFzdCB0byBhIGAkKHNoZWxsIC4uLiknIGZ1bmN0aW9uIGNhbGwsCisjIHdoaWNoIGNhbiBoYW5kbGUgaXQganVzdCBmaW5lKS4KKyMKKyMgVGhpcyBmdW5jdGlvbiBhdm9pZHMgdGhlIHByb2JsZW0gYnkgcHJvZHVjaW5nIGEgc3RyaW5nCisjIHRoYXQgd29ya3MgYXMgYSBzaGVsbCB3b3JkLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3IKKyMgbm90IGl0IGNvbnRhaW5zIGEgbmV3bGluZS4KKyMKKyMgSWYgdGhlIHRleHQgdG8gYmUgd29yZGlmaWVkIGNvbnRhaW5zIGEgbmV3bGluZSwgdGhlbgorIyBhbiBpbnRyaWN0YXRlIHNoZWxsIGNvbW1hbmQgc3Vic3RpdHV0aW9uIGlzIGNvbnN0cnVjdGVkCisjIHRvIHJlbmRlciB0aGUgdGV4dCBhcyBhIHNpbmdsZSBsaW5lOyB3aGVuIHRoZSBzaGVsbAorIyBwcm9jZXNzZXMgdGhlIHJlc3VsdGluZyBlc2NhcGVkIHRleHQsIGl0IHRyYW5zZm9ybXMKKyMgaXQgaW50byB0aGUgb3JpZ2luYWwgdW5lc2NhcGVkIHRleHQuCisjCisjIElmIHRoZSB0ZXh0IGRvZXMgbm90IGNvbnRhaW4gYSBuZXdsaW5lLCB0aGVuIHRoaXMgZnVuY3Rpb24KKyMgcHJvZHVjZXMgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgYCQoc2hlbGwtc3EpJyBmdW5jdGlvbi4KKyMKK3NoZWxsLXdvcmRpZnkgPSAkKGlmICQoZmluZHN0cmluZyAkKG5ld2xpbmUpLCQoMSkpLCQoX3N3LWVzYy1ubCksJChzaGVsbC1zcSkpCitkZWZpbmUgX3N3LWVzYy1ubAorIiQkKGVjaG8gJChjYWxsIGVzY2FwZS1ubCwkKHNoZWxsLXNxKSwkKDIpKSB8ICQoY2FsbCBzaGVsbC11bmVzY2FwZS1ubCwkKDIpKSkiCitlbmRlZgorCisjIGlzLWFic29sdXRlCisjCisjIFVzYWdlOiBib29sLXZhbHVlID0gJChjYWxsIGlzLWFic29sdXRlLHBhdGgpCisjCitpcy1hYnNvbHV0ZSA9ICQoc2hlbGwgZWNobyAkKHNoZWxsLXNxKSB8IGdyZXAgXi8gLXEgJiYgZWNobyB5KQorCisjIGxvb2t1cAorIworIyBVc2FnZTogYWJzb2x1dGUtZXhlY3V0YWJsZS1wYXRoLW9yLWVtcHR5ID0gJChjYWxsIGxvb2t1cCxwYXRoKQorIworIyAoSXQncyBuZWNlc3NhcnkgdG8gdXNlIGBzaCAtYycgYmVjYXVzZSBHTlUgbWFrZSBtZXNzZXMgdXAgYnkKKyMgIHRyeWluZyB0b28gaGFyZCBhbmQgZ2V0dGluZyB0aGluZ3Mgd3JvbmcpLgorIworbG9va3VwID0gJChjYWxsIHVuZXNjYXBlLW5sLCQoc2hlbGwgc2ggLWMgJChfbC1zaCkpKQorX2wtc2ggPSAkKGNhbGwgc2hlbGwtc3EsY29tbWFuZCAtdiAkKHNoZWxsLXNxKSB8ICQoY2FsbCBzaGVsbC1lc2NhcGUtbmwsKSkKKworIyBpcy1leGVjdXRhYmxlCisjCisjIFVzYWdlOiBib29sLXZhbHVlID0gJChjYWxsIGlzLWV4ZWN1dGFibGUscGF0aCkKKyMKKyMgKEl0J3MgbmVjZXNzYXJ5IHRvIHVzZSBgc2ggLWMnIGJlY2F1c2UgR05VIG1ha2UgbWVzc2VzIHVwIGJ5CisjICB0cnlpbmcgdG9vIGhhcmQgYW5kIGdldHRpbmcgdGhpbmdzIHdyb25nKS4KKyMKK2lzLWV4ZWN1dGFibGUgPSAkKGNhbGwgX2lzLWV4ZWN1dGFibGUtaGVscGVyLCQoc2hlbGwtc3EpKQorX2lzLWV4ZWN1dGFibGUtaGVscGVyID0gJChzaGVsbCBzaCAtYyAkKF9pcy1leGVjdXRhYmxlLXNoKSkKK19pcy1leGVjdXRhYmxlLXNoID0gJChjYWxsIHNoZWxsLXNxLHRlc3QgLWYgJCgxKSAtYSAteCAkKDEpICYmIGVjaG8geSkKKworIyBnZXQtZXhlY3V0YWJsZQorIworIyBVc2FnZTogYWJzb2x1dGUtZXhlY3V0YWJsZS1wYXRoLW9yLWVtcHR5ID0gJChjYWxsIGdldC1leGVjdXRhYmxlLHBhdGgpCisjCisjIFRoZSBnb2FsIGlzIHRvIGdldCBhbiBhYnNvbHV0ZSBwYXRoIGZvciBhbiBleGVjdXRhYmxlOworIyB0aGUgYGNvbW1hbmQgLXYnIGlzIGRlZmluZWQgYnkgUE9TSVgsIGJ1dCBpdCdzIG5vdAorIyBuZWNlc3NhcmlseSB2ZXJ5IHBvcnRhYmxlLCBzbyBpdCdzIG9ubHkgdXNlZCBpZgorIyByZWxhdGl2ZSBwYXRoIHJlc29sdXRpb24gaXMgcmVxdWVzdGVkLCBhcyBkZXRlcm1pbmVkCisjIGJ5IHRoZSBwcmVzZW5jZSBvZiBhIGxlYWRpbmcgYC8nLgorIworZ2V0LWV4ZWN1dGFibGUgPSAkKGlmICQoMSksJChpZiAkKGlzLWFic29sdXRlKSwkKF9nZS1hYnNwYXRoKSwkKGxvb2t1cCkpKQorX2dlLWFic3BhdGggPSAkKGlmICQoaXMtZXhlY3V0YWJsZSksJCgxKSkKKworIyBnZXQtc3VwcGxpZWQtb3ItZGVmYXVsdC1leGVjdXRhYmxlCisjCisjIFVzYWdlOiBhYnNvbHV0ZS1leGVjdXRhYmxlLXBhdGgtb3ItZW1wdHkgPSAkKGNhbGwgZ2V0LWV4ZWN1dGFibGUtb3ItZGVmYXVsdCx2YXJpYWJsZSxkZWZhdWx0KQorIworZGVmaW5lIGdldC1leGVjdXRhYmxlLW9yLWRlZmF1bHQKKyQoaWYgJCgkKDEpKSwkKGNhbGwgX2dlX2F0dGVtcHQsJCgkKDEpKSwkKDEpKSwkKGNhbGwgX2dlX2F0dGVtcHQsJCgyKSkpCitlbmRlZgorX2dlX2F0dGVtcHQgPSAkKG9yICQoZ2V0LWV4ZWN1dGFibGUpLCQoX2dlYV93YXJuKSwkKGNhbGwgX2dlYV9lcnIsJCgyKSkpCitfZ2VhX3dhcm4gPSAkKHdhcm5pbmcgVGhlIHBhdGggJyQoMSknIGlzIG5vdCBleGVjdXRhYmxlLikKK19nZWFfZXJyICA9ICQoaWYgJCgxKSwkKGVycm9yIFBsZWFzZSBzZXQgJyQoMSknIGFwcHJvcHJpYXRlbHkpKQorCisjIHRyeS1jYworIyBVc2FnZTogb3B0aW9uID0gJChjYWxsIHRyeS1jYywgc291cmNlLXRvLWJ1aWxkLCBjYy1vcHRpb25zKQordHJ5LWNjID0gJChzaGVsbCBzaCAtYwkJCQkJCSAgXAorCSdUTVA9IiQoT1VUUFVUKSQoVE1QT1VUKS4kJCQkIjsJCQkJICBcCisJIGVjaG8gIiQoMSkiIHwJCQkJCQkgIFwKKwkgJChDQykgLXggYyAtICQoMikgLW8gIiQkVE1QIiA+IC9kZXYvbnVsbCAyPiYxICYmIGVjaG8geTsgXAorCSBybSAtZiAiJCRUTVAiJykKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS1hc20uaCBiL3Rvb2xzL3BlcmYvdXRpbC9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS1hc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Nzg5ZDc4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS1hc20uaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgX1BFUkZfQVNNX0FMVEVSTkFUSVZFX0FTTV9ICisjZGVmaW5lIF9QRVJGX0FTTV9BTFRFUk5BVElWRV9BU01fSAorCisvKiBKdXN0IGRpc2FibGUgaXQgc28gd2UgY2FuIGJ1aWxkIGFyY2gveDg2L2xpYi9tZW1jcHlfNjQuUyBmb3IgcGVyZiBiZW5jaDogKi8KKworI2RlZmluZSBhbHRpbnN0cnVjdGlvbl9lbnRyeSAjCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5jIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5jCmluZGV4IDk1MmI0YWUuLjQxOTgyYzMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuYworKysgYi90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmMKQEAgLTMxLDM0ICszMSwzNiBAQAogI2RlZmluZSBDU1coeCkgLnR5cGUgPSBQRVJGX1RZUEVfU09GVFdBUkUsIC5jb25maWcgPSBQRVJGX0NPVU5UX1NXXyMjeAogCiBzdGF0aWMgc3RydWN0IGV2ZW50X3N5bWJvbCBldmVudF9zeW1ib2xzW10gPSB7Ci0gIHsgQ0hXKENQVV9DWUNMRVMpLAkJImNwdS1jeWNsZXMiLAkJImN5Y2xlcyIJfSwKLSAgeyBDSFcoSU5TVFJVQ1RJT05TKSwJCSJpbnN0cnVjdGlvbnMiLAkJIiIJCX0sCi0gIHsgQ0hXKENBQ0hFX1JFRkVSRU5DRVMpLAkiY2FjaGUtcmVmZXJlbmNlcyIsCSIiCQl9LAotICB7IENIVyhDQUNIRV9NSVNTRVMpLAkJImNhY2hlLW1pc3NlcyIsCQkiIgkJfSwKLSAgeyBDSFcoQlJBTkNIX0lOU1RSVUNUSU9OUyksCSJicmFuY2gtaW5zdHJ1Y3Rpb25zIiwJImJyYW5jaGVzIgl9LAotICB7IENIVyhCUkFOQ0hfTUlTU0VTKSwJCSJicmFuY2gtbWlzc2VzIiwJIiIJCX0sCi0gIHsgQ0hXKEJVU19DWUNMRVMpLAkJImJ1cy1jeWNsZXMiLAkJIiIJCX0sCisgIHsgQ0hXKENQVV9DWUNMRVMpLAkJCSJjcHUtY3ljbGVzIiwJCQkiY3ljbGVzIgkJfSwKKyAgeyBDSFcoU1RBTExFRF9DWUNMRVNfRlJPTlRFTkQpLAkic3RhbGxlZC1jeWNsZXMtZnJvbnRlbmQiLAkiaWRsZS1jeWNsZXMtZnJvbnRlbmQiCX0sCisgIHsgQ0hXKFNUQUxMRURfQ1lDTEVTX0JBQ0tFTkQpLAkic3RhbGxlZC1jeWNsZXMtYmFja2VuZCIsCSJpZGxlLWN5Y2xlcy1iYWNrZW5kIgl9LAorICB7IENIVyhJTlNUUlVDVElPTlMpLAkJCSJpbnN0cnVjdGlvbnMiLAkJCSIiCQkJfSwKKyAgeyBDSFcoQ0FDSEVfUkVGRVJFTkNFUyksCQkiY2FjaGUtcmVmZXJlbmNlcyIsCQkiIgkJCX0sCisgIHsgQ0hXKENBQ0hFX01JU1NFUyksCQkJImNhY2hlLW1pc3NlcyIsCQkJIiIJCQl9LAorICB7IENIVyhCUkFOQ0hfSU5TVFJVQ1RJT05TKSwJCSJicmFuY2gtaW5zdHJ1Y3Rpb25zIiwJCSJicmFuY2hlcyIJCX0sCisgIHsgQ0hXKEJSQU5DSF9NSVNTRVMpLAkJCSJicmFuY2gtbWlzc2VzIiwJCSIiCQkJfSwKKyAgeyBDSFcoQlVTX0NZQ0xFUyksCQkJImJ1cy1jeWNsZXMiLAkJCSIiCQkJfSwKIAotICB7IENTVyhDUFVfQ0xPQ0spLAkJImNwdS1jbG9jayIsCQkiIgkJfSwKLSAgeyBDU1coVEFTS19DTE9DSyksCQkidGFzay1jbG9jayIsCQkiIgkJfSwKLSAgeyBDU1coUEFHRV9GQVVMVFMpLAkJInBhZ2UtZmF1bHRzIiwJCSJmYXVsdHMiCX0sCi0gIHsgQ1NXKFBBR0VfRkFVTFRTX01JTiksCSJtaW5vci1mYXVsdHMiLAkJIiIJCX0sCi0gIHsgQ1NXKFBBR0VfRkFVTFRTX01BSiksCSJtYWpvci1mYXVsdHMiLAkJIiIJCX0sCi0gIHsgQ1NXKENPTlRFWFRfU1dJVENIRVMpLAkiY29udGV4dC1zd2l0Y2hlcyIsCSJjcyIJCX0sCi0gIHsgQ1NXKENQVV9NSUdSQVRJT05TKSwJImNwdS1taWdyYXRpb25zIiwJIm1pZ3JhdGlvbnMiCX0sCi0gIHsgQ1NXKEFMSUdOTUVOVF9GQVVMVFMpLAkiYWxpZ25tZW50LWZhdWx0cyIsCSIiCQl9LAotICB7IENTVyhFTVVMQVRJT05fRkFVTFRTKSwJImVtdWxhdGlvbi1mYXVsdHMiLAkiIgkJfSwKKyAgeyBDU1coQ1BVX0NMT0NLKSwJCQkiY3B1LWNsb2NrIiwJCQkiIgkJCX0sCisgIHsgQ1NXKFRBU0tfQ0xPQ0spLAkJCSJ0YXNrLWNsb2NrIiwJCQkiIgkJCX0sCisgIHsgQ1NXKFBBR0VfRkFVTFRTKSwJCQkicGFnZS1mYXVsdHMiLAkJCSJmYXVsdHMiCQl9LAorICB7IENTVyhQQUdFX0ZBVUxUU19NSU4pLAkJIm1pbm9yLWZhdWx0cyIsCQkJIiIJCQl9LAorICB7IENTVyhQQUdFX0ZBVUxUU19NQUopLAkJIm1ham9yLWZhdWx0cyIsCQkJIiIJCQl9LAorICB7IENTVyhDT05URVhUX1NXSVRDSEVTKSwJCSJjb250ZXh0LXN3aXRjaGVzIiwJCSJjcyIJCQl9LAorICB7IENTVyhDUFVfTUlHUkFUSU9OUyksCQkiY3B1LW1pZ3JhdGlvbnMiLAkJIm1pZ3JhdGlvbnMiCQl9LAorICB7IENTVyhBTElHTk1FTlRfRkFVTFRTKSwJCSJhbGlnbm1lbnQtZmF1bHRzIiwJCSIiCQkJfSwKKyAgeyBDU1coRU1VTEFUSU9OX0ZBVUxUUyksCQkiZW11bGF0aW9uLWZhdWx0cyIsCQkiIgkJCX0sCiB9OwogCiAjZGVmaW5lIF9fUEVSRl9FVkVOVF9GSUVMRChjb25maWcsIG5hbWUpIFwKIAkoKGNvbmZpZyAmIFBFUkZfRVZFTlRfIyNuYW1lIyNfTUFTSykgPj4gUEVSRl9FVkVOVF8jI25hbWUjI19TSElGVCkKIAotI2RlZmluZSBQRVJGX0VWRU5UX1JBVyhjb25maWcpCV9fUEVSRl9FVkVOVF9GSUVMRChjb25maWcsIFJBVykKKyNkZWZpbmUgUEVSRl9FVkVOVF9SQVcoY29uZmlnKQkJX19QRVJGX0VWRU5UX0ZJRUxEKGNvbmZpZywgUkFXKQogI2RlZmluZSBQRVJGX0VWRU5UX0NPTkZJRyhjb25maWcpCV9fUEVSRl9FVkVOVF9GSUVMRChjb25maWcsIENPTkZJRykKLSNkZWZpbmUgUEVSRl9FVkVOVF9UWVBFKGNvbmZpZykJX19QRVJGX0VWRU5UX0ZJRUxEKGNvbmZpZywgVFlQRSkKKyNkZWZpbmUgUEVSRl9FVkVOVF9UWVBFKGNvbmZpZykJCV9fUEVSRl9FVkVOVF9GSUVMRChjb25maWcsIFRZUEUpCiAjZGVmaW5lIFBFUkZfRVZFTlRfSUQoY29uZmlnKQkJX19QRVJGX0VWRU5UX0ZJRUxEKGNvbmZpZywgRVZFTlQpCiAKLXN0YXRpYyBjb25zdCBjaGFyICpod19ldmVudF9uYW1lc1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKmh3X2V2ZW50X25hbWVzW1BFUkZfQ09VTlRfSFdfTUFYXSA9IHsKIAkiY3ljbGVzIiwKIAkiaW5zdHJ1Y3Rpb25zIiwKIAkiY2FjaGUtcmVmZXJlbmNlcyIsCkBAIC02NiwxMSArNjgsMTMgQEAKIAkiYnJhbmNoZXMiLAogCSJicmFuY2gtbWlzc2VzIiwKIAkiYnVzLWN5Y2xlcyIsCisJInN0YWxsZWQtY3ljbGVzLWZyb250ZW5kIiwKKwkic3RhbGxlZC1jeWNsZXMtYmFja2VuZCIsCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqc3dfZXZlbnRfbmFtZXNbXSA9IHsKLQkiY3B1LWNsb2NrLW1zZWNzIiwKLQkidGFzay1jbG9jay1tc2VjcyIsCitzdGF0aWMgY29uc3QgY2hhciAqc3dfZXZlbnRfbmFtZXNbUEVSRl9DT1VOVF9TV19NQVhdID0geworCSJjcHUtY2xvY2siLAorCSJ0YXNrLWNsb2NrIiwKIAkicGFnZS1mYXVsdHMiLAogCSJjb250ZXh0LXN3aXRjaGVzIiwKIAkiQ1BVLW1pZ3JhdGlvbnMiLApAQCAtMzA3LDcgKzMxMSw3IEBACiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIFBFUkZfVFlQRV9IQVJEV0FSRToKLQkJaWYgKGNvbmZpZyA8IFBFUkZfQ09VTlRfSFdfTUFYKQorCQlpZiAoY29uZmlnIDwgUEVSRl9DT1VOVF9IV19NQVggJiYgaHdfZXZlbnRfbmFtZXNbY29uZmlnXSkKIAkJCXJldHVybiBod19ldmVudF9uYW1lc1tjb25maWddOwogCQlyZXR1cm4gInVua25vd24taGFyZHdhcmUiOwogCkBAIC0zMzMsNyArMzM3LDcgQEAKIAl9CiAKIAljYXNlIFBFUkZfVFlQRV9TT0ZUV0FSRToKLQkJaWYgKGNvbmZpZyA8IFBFUkZfQ09VTlRfU1dfTUFYKQorCQlpZiAoY29uZmlnIDwgUEVSRl9DT1VOVF9TV19NQVggJiYgc3dfZXZlbnRfbmFtZXNbY29uZmlnXSkKIAkJCXJldHVybiBzd19ldmVudF9uYW1lc1tjb25maWddOwogCQlyZXR1cm4gInVua25vd24tc29mdHdhcmUiOwogCkBAIC02NDgsMTMgKzY1MiwxNSBAQAogCWludCBuOwogCiAJbiA9IHN0cmxlbihldmVudF9zeW1ib2xzW2ldLnN5bWJvbCk7Ci0JaWYgKCFzdHJuY21wKHN0ciwgZXZlbnRfc3ltYm9sc1tpXS5zeW1ib2wsIG4pKQorCWlmICghc3RybmNhc2VjbXAoc3RyLCBldmVudF9zeW1ib2xzW2ldLnN5bWJvbCwgbikpCiAJCXJldHVybiBuOwogCiAJbiA9IHN0cmxlbihldmVudF9zeW1ib2xzW2ldLmFsaWFzKTsKLQlpZiAobikKLQkJaWYgKCFzdHJuY21wKHN0ciwgZXZlbnRfc3ltYm9sc1tpXS5hbGlhcywgbikpCisJaWYgKG4pIHsKKwkJaWYgKCFzdHJuY2FzZWNtcChzdHIsIGV2ZW50X3N5bWJvbHNbaV0uYWxpYXMsIG4pKQogCQkJcmV0dXJuIG47CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTcxOCwxNSArNzI0LDIyIEBACiAJcmV0dXJuIEVWVF9GQUlMRUQ7CiB9CiAKLXN0YXRpYyBlbnVtIGV2ZW50X3Jlc3VsdAorc3RhdGljIGludAogcGFyc2VfZXZlbnRfbW9kaWZpZXIoY29uc3QgY2hhciAqKnN0cnAsIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIpCiB7CiAJY29uc3QgY2hhciAqc3RyID0gKnN0cnA7CiAJaW50IGV4Y2x1ZGUgPSAwOwogCWludCBldSA9IDAsIGVrID0gMCwgZWggPSAwLCBwcmVjaXNlID0gMDsKIAotCWlmICgqc3RyKysgIT0gJzonKQorCWlmICghKnN0cikKIAkJcmV0dXJuIDA7CisKKwlpZiAoKnN0ciA9PSAnLCcpCisJCXJldHVybiAwOworCisJaWYgKCpzdHIrKyAhPSAnOicpCisJCXJldHVybiAtMTsKKwogCXdoaWxlICgqc3RyKSB7CiAJCWlmICgqc3RyID09ICd1JykgewogCQkJaWYgKCFleGNsdWRlKQpAQCAtNzQ3LDE0ICs3NjAsMTYgQEAKIAogCQkrK3N0cjsKIAl9Ci0JaWYgKHN0ciA+PSAqc3RycCArIDIpIHsKLQkJKnN0cnAgPSBzdHI7Ci0JCWF0dHItPmV4Y2x1ZGVfdXNlciAgID0gZXU7Ci0JCWF0dHItPmV4Y2x1ZGVfa2VybmVsID0gZWs7Ci0JCWF0dHItPmV4Y2x1ZGVfaHYgICAgID0gZWg7Ci0JCWF0dHItPnByZWNpc2VfaXAgICAgID0gcHJlY2lzZTsKLQkJcmV0dXJuIDE7Ci0JfQorCWlmIChzdHIgPCAqc3RycCArIDIpCisJCXJldHVybiAtMTsKKworCSpzdHJwID0gc3RyOworCisJYXR0ci0+ZXhjbHVkZV91c2VyICAgPSBldTsKKwlhdHRyLT5leGNsdWRlX2tlcm5lbCA9IGVrOworCWF0dHItPmV4Y2x1ZGVfaHYgICAgID0gZWg7CisJYXR0ci0+cHJlY2lzZV9pcCAgICAgPSBwcmVjaXNlOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc5Nyw3ICs4MTIsMTIgQEAKIAlyZXR1cm4gRVZUX0ZBSUxFRDsKIAogbW9kaWZpZXI6Ci0JcGFyc2VfZXZlbnRfbW9kaWZpZXIoc3RyLCBhdHRyKTsKKwlpZiAocGFyc2VfZXZlbnRfbW9kaWZpZXIoc3RyLCBhdHRyKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIGV2ZW50IG1vZGlmaWVyOiAnJXMnXG4iLCAqc3RyKTsKKwkJZnByaW50ZihzdGRlcnIsICJSdW4gJ3BlcmYgbGlzdCcgZm9yIGEgbGlzdCBvZiB2YWxpZCBldmVudHMgYW5kIG1vZGlmaWVyc1xuIik7CisKKwkJcmV0dXJuIEVWVF9GQUlMRUQ7CisJfQogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTkxMiw3ICs5MzIsNyBAQAogCiAJCQlzbnByaW50ZihldnRfcGF0aCwgTUFYUEFUSExFTiwgIiVzOiVzIiwKIAkJCQkgc3lzX2RpcmVudC5kX25hbWUsIGV2dF9kaXJlbnQuZF9uYW1lKTsKLQkJCXByaW50ZigiICAlLTQycyBbJXNdXG4iLCBldnRfcGF0aCwKKwkJCXByaW50ZigiICAlLTUwcyBbJXNdXG4iLCBldnRfcGF0aCwKIAkJCQlldmVudF90eXBlX2Rlc2NyaXB0b3JzW1BFUkZfVFlQRV9UUkFDRVBPSU5UXSk7CiAJCX0KIAkJY2xvc2VkaXIoZXZ0X2Rpcik7CkBAIC05NzcsNyArOTk3LDcgQEAKIAkJZWxzZQogCQkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMiLCBzeW1zLT5zeW1ib2wpOwogCi0JCXByaW50ZigiICAlLTQycyBbJXNdXG4iLCBuYW1lLAorCQlwcmludGYoIiAgJS01MHMgWyVzXVxuIiwgbmFtZSwKIAkJCWV2ZW50X3R5cGVfZGVzY3JpcHRvcnNbdHlwZV0pOwogCX0KIH0KQEAgLTk5NSwxMSArMTAxNSwxMCBAQAogCQkJZm9yIChpID0gMDsgaSA8IFBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01BWDsgaSsrKSB7CiAJCQkJY2hhciAqbmFtZSA9IGV2ZW50X2NhY2hlX25hbWUodHlwZSwgb3AsIGkpOwogCi0JCQkJaWYgKGV2ZW50X2dsb2IgIT0gTlVMTCAmJiAKLQkJCQkgICAgIXN0cmdsb2JtYXRjaChuYW1lLCBldmVudF9nbG9iKSkKKwkJCQlpZiAoZXZlbnRfZ2xvYiAhPSBOVUxMICYmICFzdHJnbG9ibWF0Y2gobmFtZSwgZXZlbnRfZ2xvYikpCiAJCQkJCWNvbnRpbnVlOwogCi0JCQkJcHJpbnRmKCIgICUtNDJzIFslc11cbiIsIG5hbWUsCisJCQkJcHJpbnRmKCIgICUtNTBzIFslc11cbiIsIG5hbWUsCiAJCQkJCWV2ZW50X3R5cGVfZGVzY3JpcHRvcnNbUEVSRl9UWVBFX0hXX0NBQ0hFXSk7CiAJCQkJKytwcmludGVkOwogCQkJfQpAQCAtMTAwOSwxNCArMTAyOCwxNiBAQAogCXJldHVybiBwcmludGVkOwogfQogCisjZGVmaW5lIE1BWF9OQU1FX0xFTiAxMDAKKwogLyoKICAqIFByaW50IHRoZSBoZWxwIHRleHQgZm9yIHRoZSBldmVudCBzeW1ib2xzOgogICovCiB2b2lkIHByaW50X2V2ZW50cyhjb25zdCBjaGFyICpldmVudF9nbG9iKQogewotCXN0cnVjdCBldmVudF9zeW1ib2wgKnN5bXMgPSBldmVudF9zeW1ib2xzOwogCXVuc2lnbmVkIGludCBpLCB0eXBlLCBwcmV2X3R5cGUgPSAtMSwgcHJpbnRlZCA9IDAsIG50eXBlc19wcmludGVkID0gMDsKLQljaGFyIG5hbWVbNDBdOworCXN0cnVjdCBldmVudF9zeW1ib2wgKnN5bXMgPSBldmVudF9zeW1ib2xzOworCWNoYXIgbmFtZVtNQVhfTkFNRV9MRU5dOwogCiAJcHJpbnRmKCJcbiIpOwogCXByaW50ZigiTGlzdCBvZiBwcmUtZGVmaW5lZCBldmVudHMgKHRvIGJlIHVzZWQgaW4gLWUpOlxuIik7CkBAIC0xMDM2LDEwICsxMDU3LDEwIEBACiAJCQljb250aW51ZTsKIAogCQlpZiAoc3RybGVuKHN5bXMtPmFsaWFzKSkKLQkJCXNwcmludGYobmFtZSwgIiVzIE9SICVzIiwgc3ltcy0+c3ltYm9sLCBzeW1zLT5hbGlhcyk7CisJCQlzbnByaW50ZihuYW1lLCBNQVhfTkFNRV9MRU4sICIlcyBPUiAlcyIsIHN5bXMtPnN5bWJvbCwgc3ltcy0+YWxpYXMpOwogCQllbHNlCi0JCQlzdHJjcHkobmFtZSwgc3ltcy0+c3ltYm9sKTsKLQkJcHJpbnRmKCIgICUtNDJzIFslc11cbiIsIG5hbWUsCisJCQlzdHJuY3B5KG5hbWUsIHN5bXMtPnN5bWJvbCwgTUFYX05BTUVfTEVOKTsKKwkJcHJpbnRmKCIgICUtNTBzIFslc11cbiIsIG5hbWUsCiAJCQlldmVudF90eXBlX2Rlc2NyaXB0b3JzW3R5cGVdKTsKIAogCQlwcmV2X3R5cGUgPSB0eXBlOwpAQCAtMTA1NiwxMiArMTA3NywxMiBAQAogCQlyZXR1cm47CiAKIAlwcmludGYoIlxuIik7Ci0JcHJpbnRmKCIgICUtNDJzIFslc11cbiIsCisJcHJpbnRmKCIgICUtNTBzIFslc11cbiIsCiAJCSJyTk5OIChzZWUgJ3BlcmYgbGlzdCAtLWhlbHAnIG9uIGhvdyB0byBlbmNvZGUgaXQpIiwKIAkgICAgICAgZXZlbnRfdHlwZV9kZXNjcmlwdG9yc1tQRVJGX1RZUEVfUkFXXSk7CiAJcHJpbnRmKCJcbiIpOwogCi0JcHJpbnRmKCIgICUtNDJzIFslc11cbiIsCisJcHJpbnRmKCIgICUtNTBzIFslc11cbiIsCiAJCQkibWVtOjxhZGRyPls6YWNjZXNzXSIsCiAJCQlldmVudF90eXBlX2Rlc2NyaXB0b3JzW1BFUkZfVFlQRV9CUkVBS1BPSU5UXSk7CiAJcHJpbnRmKCJcbiIpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbmRlci5jIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbmRlci5jCmluZGV4IGI3Yzg1Y2UuLjNiOWQwYjggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuYworKysgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmMKQEAgLTE0NzEsNiArMTQ3MSwzOCBAQAogCXJldHVybiBfcGFyYW0ucmV0dmFsOwogfQogCitzdHJ1Y3QgcHVibmFtZV9jYWxsYmFja19wYXJhbSB7CisJY2hhciAqZnVuY3Rpb247CisJY2hhciAqZmlsZTsKKwlEd2FyZl9EaWUgKmN1X2RpZTsKKwlEd2FyZl9EaWUgKnNwX2RpZTsKKwlpbnQgZm91bmQ7Cit9OworCitzdGF0aWMgaW50IHB1Ym5hbWVfc2VhcmNoX2NiKER3YXJmICpkYmcsIER3YXJmX0dsb2JhbCAqZ2wsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHB1Ym5hbWVfY2FsbGJhY2tfcGFyYW0gKnBhcmFtID0gZGF0YTsKKworCWlmIChkd2FyZl9vZmZkaWUoZGJnLCBnbC0+ZGllX29mZnNldCwgcGFyYW0tPnNwX2RpZSkpIHsKKwkJaWYgKGR3YXJmX3RhZyhwYXJhbS0+c3BfZGllKSAhPSBEV19UQUdfc3VicHJvZ3JhbSkKKwkJCXJldHVybiBEV0FSRl9DQl9PSzsKKworCQlpZiAoZGllX2NvbXBhcmVfbmFtZShwYXJhbS0+c3BfZGllLCBwYXJhbS0+ZnVuY3Rpb24pKSB7CisJCQlpZiAoIWR3YXJmX29mZmRpZShkYmcsIGdsLT5jdV9vZmZzZXQsIHBhcmFtLT5jdV9kaWUpKQorCQkJCXJldHVybiBEV0FSRl9DQl9PSzsKKworCQkJaWYgKHBhcmFtLT5maWxlICYmCisJCQkgICAgc3RydGFpbGNtcChwYXJhbS0+ZmlsZSwgZHdhcmZfZGVjbF9maWxlKHBhcmFtLT5zcF9kaWUpKSkKKwkJCQlyZXR1cm4gRFdBUkZfQ0JfT0s7CisKKwkJCXBhcmFtLT5mb3VuZCA9IDE7CisJCQlyZXR1cm4gRFdBUkZfQ0JfQUJPUlQ7CisJCX0KKwl9CisKKwlyZXR1cm4gRFdBUkZfQ0JfT0s7Cit9CisKIC8qIEZpbmQgcHJvYmUgcG9pbnRzIGZyb20gZGVidWdpbmZvICovCiBzdGF0aWMgaW50IGZpbmRfcHJvYmVzKGludCBmZCwgc3RydWN0IHByb2JlX2ZpbmRlciAqcGYpCiB7CkBAIC0xNDk4LDYgKzE1MzAsMjggQEAKIAogCW9mZiA9IDA7CiAJbGluZV9saXN0X19pbml0KCZwZi0+bGNhY2hlKTsKKworCS8qIEZhc3RwYXRoOiBsb29rdXAgYnkgZnVuY3Rpb24gbmFtZSBmcm9tIC5kZWJ1Z19wdWJuYW1lcyBzZWN0aW9uICovCisJaWYgKHBwLT5mdW5jdGlvbikgeworCQlzdHJ1Y3QgcHVibmFtZV9jYWxsYmFja19wYXJhbSBwdWJuYW1lX3BhcmFtID0geworCQkJLmZ1bmN0aW9uID0gcHAtPmZ1bmN0aW9uLAorCQkJLmZpbGUJICA9IHBwLT5maWxlLAorCQkJLmN1X2RpZQkgID0gJnBmLT5jdV9kaWUsCisJCQkuc3BfZGllCSAgPSAmcGYtPnNwX2RpZSwKKwkJCS5mb3VuZAkgID0gMCwKKwkJfTsKKwkJc3RydWN0IGR3YXJmX2NhbGxiYWNrX3BhcmFtIHByb2JlX3BhcmFtID0geworCQkJLmRhdGEgPSBwZiwKKwkJfTsKKworCQlkd2FyZl9nZXRwdWJuYW1lcyhkYmcsIHB1Ym5hbWVfc2VhcmNoX2NiLCAmcHVibmFtZV9wYXJhbSwgMCk7CisJCWlmIChwdWJuYW1lX3BhcmFtLmZvdW5kKSB7CisJCQlyZXQgPSBwcm9iZV9wb2ludF9zZWFyY2hfY2IoJnBmLT5zcF9kaWUsICZwcm9iZV9wYXJhbSk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZm91bmQ7CisJCX0KKwl9CisKIAkvKiBMb29wIG9uIENVcyAoQ29tcGlsYXRpb24gVW5pdCkgKi8KIAl3aGlsZSAoIWR3YXJmX25leHRjdShkYmcsIG9mZiwgJm5vZmYsICZjdWhsLCBOVUxMLCBOVUxMLCBOVUxMKSkgewogCQkvKiBHZXQgdGhlIERJRShEZWJ1Z2dpbmcgSW5mb3JtYXRpb24gRW50cnkpIG9mIHRoaXMgQ1UgKi8KQEAgLTE1MjUsNiArMTU3OSw4IEBACiAJCX0KIAkJb2ZmID0gbm9mZjsKIAl9CisKK2ZvdW5kOgogCWxpbmVfbGlzdF9fZnJlZSgmcGYtPmxjYWNoZSk7CiAJaWYgKGR3ZmwpCiAJCWR3ZmxfZW5kKGR3ZmwpOwpAQCAtMTk0Niw2ICsyMDAyLDIyIEBACiAJCXJldHVybiAtRUJBREY7CiAJfQogCisJLyogRmFzdHBhdGg6IGxvb2t1cCBieSBmdW5jdGlvbiBuYW1lIGZyb20gLmRlYnVnX3B1Ym5hbWVzIHNlY3Rpb24gKi8KKwlpZiAobHItPmZ1bmN0aW9uKSB7CisJCXN0cnVjdCBwdWJuYW1lX2NhbGxiYWNrX3BhcmFtIHB1Ym5hbWVfcGFyYW0gPSB7CisJCQkuZnVuY3Rpb24gPSBsci0+ZnVuY3Rpb24sIC5maWxlID0gbHItPmZpbGUsCisJCQkuY3VfZGllID0gJmxmLmN1X2RpZSwgLnNwX2RpZSA9ICZsZi5zcF9kaWUsIC5mb3VuZCA9IDB9OworCQlzdHJ1Y3QgZHdhcmZfY2FsbGJhY2tfcGFyYW0gbGluZV9yYW5nZV9wYXJhbSA9IHsKKwkJCS5kYXRhID0gKHZvaWQgKikmbGYsIC5yZXR2YWwgPSAwfTsKKworCQlkd2FyZl9nZXRwdWJuYW1lcyhkYmcsIHB1Ym5hbWVfc2VhcmNoX2NiLCAmcHVibmFtZV9wYXJhbSwgMCk7CisJCWlmIChwdWJuYW1lX3BhcmFtLmZvdW5kKSB7CisJCQlsaW5lX3JhbmdlX3NlYXJjaF9jYigmbGYuc3BfZGllLCAmbGluZV9yYW5nZV9wYXJhbSk7CisJCQlpZiAobGYuZm91bmQpCisJCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKwogCS8qIExvb3Agb24gQ1VzIChDb21waWxhdGlvbiBVbml0KSAqLwogCXdoaWxlICghbGYuZm91bmQgJiYgcmV0ID49IDApIHsKIAkJaWYgKGR3YXJmX25leHRjdShkYmcsIG9mZiwgJm5vZmYsICZjdWhsLCBOVUxMLCBOVUxMLCBOVUxMKSAhPSAwKQpAQCAtMTk3NCw2ICsyMDQ2LDcgQEAKIAkJb2ZmID0gbm9mZjsKIAl9CiAKK2ZvdW5kOgogCS8qIFN0b3JlIGNvbXBfZGlyICovCiAJaWYgKGxmLmZvdW5kKSB7CiAJCWNvbXBfZGlyID0gY3VfZ2V0X2NvbXBfZGlyKCZsZi5jdV9kaWUpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbmRlci5oIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbmRlci5oCmluZGV4IGJlYWVmYzMuLjYwNTczMGEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuaAorKysgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmgKQEAgLTQ5LDYgKzQ5LDcgQEAKIAlEd2FyZl9BZGRyCQlhZGRyOwkJLyogQWRkcmVzcyAqLwogCWNvbnN0IGNoYXIJCSpmbmFtZTsJCS8qIFJlYWwgZmlsZSBuYW1lICovCiAJRHdhcmZfRGllCQljdV9kaWU7CQkvKiBDdXJyZW50IENVICovCisJRHdhcmZfRGllCQlzcF9kaWU7CiAJc3RydWN0IGxpc3RfaGVhZAlsY2FjaGU7CQkvKiBMaW5lIGNhY2hlIGZvciBsYXp5IG1hdGNoICovCiAKIAkvKiBGb3IgdmFyaWFibGUgc2VhcmNoaW5nICovCkBAIC04Myw2ICs4NCw3IEBACiAJaW50CQkJbG5vX3M7CQkvKiBTdGFydCBsaW5lIG51bWJlciAqLwogCWludAkJCWxub19lOwkJLyogRW5kIGxpbmUgbnVtYmVyICovCiAJRHdhcmZfRGllCQljdV9kaWU7CQkvKiBDdXJyZW50IENVICovCisJRHdhcmZfRGllCQlzcF9kaWU7CiAJaW50CQkJZm91bmQ7CiB9OwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcHl0aG9uLmMgYi90b29scy9wZXJmL3V0aWwvcHl0aG9uLmMKaW5kZXggOTljNzIyNi4uYjVjN2Q4MSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3B5dGhvbi5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9weXRob24uYwpAQCAtODEwLDYgKzgxMCw5IEBACiAJeyAiQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX0FDQ0VTUyIsIFBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX0FDQ0VTUyB9LAogCXsgIkNPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NSVNTIiwgICBQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NSVNTIH0sCiAKKwl7ICJDT1VOVF9IV19TVEFMTEVEX0NZQ0xFU19GUk9OVEVORCIsCSAgUEVSRl9DT1VOVF9IV19TVEFMTEVEX0NZQ0xFU19GUk9OVEVORCB9LAorCXsgIkNPVU5UX0hXX1NUQUxMRURfQ1lDTEVTX0JBQ0tFTkQiLAkgIFBFUkZfQ09VTlRfSFdfU1RBTExFRF9DWUNMRVNfQkFDS0VORCB9LAorCiAJeyAiQ09VTlRfU1dfQ1BVX0NMT0NLIiwJICAgICAgIFBFUkZfQ09VTlRfU1dfQ1BVX0NMT0NLIH0sCiAJeyAiQ09VTlRfU1dfVEFTS19DTE9DSyIsICAgICAgIFBFUkZfQ09VTlRfU1dfVEFTS19DTE9DSyB9LAogCXsgIkNPVU5UX1NXX1BBR0VfRkFVTFRTIiwgICAgICBQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTIH0sCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5jIGIvdG9vbHMvcGVyZi91dGlsL3Nlc3Npb24uYwppbmRleCBjYWEyMjQ1Li5mZmY2Njc0IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmMKQEAgLTExNTYsNiArMTE1NiwxOCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0cnVjdCBwZXJmX2V2c2VsICpwZXJmX3Nlc3Npb25fX2ZpbmRfZmlyc3RfZXZ0eXBlKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24sCisJCQkJCSAgICAgIHVuc2lnbmVkIGludCB0eXBlKQoreworCXN0cnVjdCBwZXJmX2V2c2VsICpwb3M7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJnNlc3Npb24tPmV2bGlzdC0+ZW50cmllcywgbm9kZSkgeworCQlpZiAocG9zLT5hdHRyLnR5cGUgPT0gdHlwZSkKKwkJCXJldHVybiBwb3M7CisJfQorCXJldHVybiBOVUxMOworfQorCiB2b2lkIHBlcmZfc2Vzc2lvbl9fcHJpbnRfc3ltYm9scyh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKIAkJCQlzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKIAkJCQlzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Nlc3Npb24uaCBiL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmgKaW5kZXggMWFjNDgxZi4uOGRhYWEyZCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Nlc3Npb24uaAorKysgYi90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5oCkBAIC0xNjIsNiArMTYyLDkgQEAKIAkJCQkJc2Vzc2lvbi0+c2FtcGxlX2lkX2FsbCwgc2FtcGxlKTsKIH0KIAorc3RydWN0IHBlcmZfZXZzZWwgKnBlcmZfc2Vzc2lvbl9fZmluZF9maXJzdF9ldnR5cGUoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwKKwkJCQkJICAgIHVuc2lnbmVkIGludCB0eXBlKTsKKwogdm9pZCBwZXJmX3Nlc3Npb25fX3ByaW50X3N5bWJvbHModW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkJIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAogCQkJCSBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuYyBiL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuYwppbmRleCBmMDZjMTBmLi41MTY4NzZkIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc3ltYm9sLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5jCkBAIC0zMSwxMyArMzEsMTMgQEAKICNkZWZpbmUgTlRfR05VX0JVSUxEX0lEIDMKICNlbmRpZgogCi1zdGF0aWMgYm9vbCBkc29fX2J1aWxkX2lkX2VxdWFsKGNvbnN0IHN0cnVjdCBkc28gKnNlbGYsIHU4ICpidWlsZF9pZCk7CitzdGF0aWMgYm9vbCBkc29fX2J1aWxkX2lkX2VxdWFsKGNvbnN0IHN0cnVjdCBkc28gKmRzbywgdTggKmJ1aWxkX2lkKTsKIHN0YXRpYyBpbnQgZWxmX3JlYWRfYnVpbGRfaWQoRWxmICplbGYsIHZvaWQgKmJmLCBzaXplX3Qgc2l6ZSk7CiBzdGF0aWMgdm9pZCBkc29zX19hZGQoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgc3RydWN0IGRzbyAqZHNvKTsKIHN0YXRpYyBzdHJ1Y3QgbWFwICptYXBfX25ldzIodTY0IHN0YXJ0LCBzdHJ1Y3QgZHNvICpkc28sIGVudW0gbWFwX3R5cGUgdHlwZSk7Ci1zdGF0aWMgaW50IGRzb19fbG9hZF9rZXJuZWxfc3ltKHN0cnVjdCBkc28gKnNlbGYsIHN0cnVjdCBtYXAgKm1hcCwKK3N0YXRpYyBpbnQgZHNvX19sb2FkX2tlcm5lbF9zeW0oc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsCiAJCQkJc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7Ci1zdGF0aWMgaW50IGRzb19fbG9hZF9ndWVzdF9rZXJuZWxfc3ltKHN0cnVjdCBkc28gKnNlbGYsIHN0cnVjdCBtYXAgKm1hcCwKK3N0YXRpYyBpbnQgZHNvX19sb2FkX2d1ZXN0X2tlcm5lbF9zeW0oc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsCiAJCQlzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKTsKIHN0YXRpYyBpbnQgdm1saW51eF9wYXRoX19ucl9lbnRyaWVzOwogc3RhdGljIGNoYXIgKip2bWxpbnV4X3BhdGg7CkBAIC00OSwyNyArNDksMjcgQEAKIAkuc3ltZnMgICAgICAgICAgICA9ICIiLAogfTsKIAotaW50IGRzb19fbmFtZV9sZW4oY29uc3Qgc3RydWN0IGRzbyAqc2VsZikKK2ludCBkc29fX25hbWVfbGVuKGNvbnN0IHN0cnVjdCBkc28gKmRzbykKIHsKIAlpZiAodmVyYm9zZSkKLQkJcmV0dXJuIHNlbGYtPmxvbmdfbmFtZV9sZW47CisJCXJldHVybiBkc28tPmxvbmdfbmFtZV9sZW47CiAKLQlyZXR1cm4gc2VsZi0+c2hvcnRfbmFtZV9sZW47CisJcmV0dXJuIGRzby0+c2hvcnRfbmFtZV9sZW47CiB9CiAKLWJvb2wgZHNvX19sb2FkZWQoY29uc3Qgc3RydWN0IGRzbyAqc2VsZiwgZW51bSBtYXBfdHlwZSB0eXBlKQorYm9vbCBkc29fX2xvYWRlZChjb25zdCBzdHJ1Y3QgZHNvICpkc28sIGVudW0gbWFwX3R5cGUgdHlwZSkKIHsKLQlyZXR1cm4gc2VsZi0+bG9hZGVkICYgKDEgPDwgdHlwZSk7CisJcmV0dXJuIGRzby0+bG9hZGVkICYgKDEgPDwgdHlwZSk7CiB9CiAKLWJvb2wgZHNvX19zb3J0ZWRfYnlfbmFtZShjb25zdCBzdHJ1Y3QgZHNvICpzZWxmLCBlbnVtIG1hcF90eXBlIHR5cGUpCitib29sIGRzb19fc29ydGVkX2J5X25hbWUoY29uc3Qgc3RydWN0IGRzbyAqZHNvLCBlbnVtIG1hcF90eXBlIHR5cGUpCiB7Ci0JcmV0dXJuIHNlbGYtPnNvcnRlZF9ieV9uYW1lICYgKDEgPDwgdHlwZSk7CisJcmV0dXJuIGRzby0+c29ydGVkX2J5X25hbWUgJiAoMSA8PCB0eXBlKTsKIH0KIAotc3RhdGljIHZvaWQgZHNvX19zZXRfc29ydGVkX2J5X25hbWUoc3RydWN0IGRzbyAqc2VsZiwgZW51bSBtYXBfdHlwZSB0eXBlKQorc3RhdGljIHZvaWQgZHNvX19zZXRfc29ydGVkX2J5X25hbWUoc3RydWN0IGRzbyAqZHNvLCBlbnVtIG1hcF90eXBlIHR5cGUpCiB7Ci0Jc2VsZi0+c29ydGVkX2J5X25hbWUgfD0gKDEgPDwgdHlwZSk7CisJZHNvLT5zb3J0ZWRfYnlfbmFtZSB8PSAoMSA8PCB0eXBlKTsKIH0KIAogYm9vbCBzeW1ib2xfdHlwZV9faXNfYShjaGFyIHN5bWJvbF90eXBlLCBlbnVtIG1hcF90eXBlIG1hcF90eXBlKQpAQCAtODQsOSArODQsOSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgc3ltYm9sc19fZml4dXBfZW5kKHN0cnVjdCByYl9yb290ICpzZWxmKQorc3RhdGljIHZvaWQgc3ltYm9sc19fZml4dXBfZW5kKHN0cnVjdCByYl9yb290ICpzeW1ib2xzKQogewotCXN0cnVjdCByYl9ub2RlICpuZCwgKnByZXZuZCA9IHJiX2ZpcnN0KHNlbGYpOworCXN0cnVjdCByYl9ub2RlICpuZCwgKnByZXZuZCA9IHJiX2ZpcnN0KHN5bWJvbHMpOwogCXN0cnVjdCBzeW1ib2wgKmN1cnIsICpwcmV2OwogCiAJaWYgKHByZXZuZCA9PSBOVUxMKQpAQCAtMTA3LDEwICsxMDcsMTAgQEAKIAkJY3Vyci0+ZW5kID0gcm91bmR1cChjdXJyLT5zdGFydCwgNDA5Nik7CiB9CiAKLXN0YXRpYyB2b2lkIF9fbWFwX2dyb3Vwc19fZml4dXBfZW5kKHN0cnVjdCBtYXBfZ3JvdXBzICpzZWxmLCBlbnVtIG1hcF90eXBlIHR5cGUpCitzdGF0aWMgdm9pZCBfX21hcF9ncm91cHNfX2ZpeHVwX2VuZChzdHJ1Y3QgbWFwX2dyb3VwcyAqbWcsIGVudW0gbWFwX3R5cGUgdHlwZSkKIHsKIAlzdHJ1Y3QgbWFwICpwcmV2LCAqY3VycjsKLQlzdHJ1Y3QgcmJfbm9kZSAqbmQsICpwcmV2bmQgPSByYl9maXJzdCgmc2VsZi0+bWFwc1t0eXBlXSk7CisJc3RydWN0IHJiX25vZGUgKm5kLCAqcHJldm5kID0gcmJfZmlyc3QoJm1nLT5tYXBzW3R5cGVdKTsKIAogCWlmIChwcmV2bmQgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtMTMwLDEyOCArMTMwLDEyOCBAQAogCWN1cnItPmVuZCA9IH4wVUxMOwogfQogCi1zdGF0aWMgdm9pZCBtYXBfZ3JvdXBzX19maXh1cF9lbmQoc3RydWN0IG1hcF9ncm91cHMgKnNlbGYpCitzdGF0aWMgdm9pZCBtYXBfZ3JvdXBzX19maXh1cF9lbmQoc3RydWN0IG1hcF9ncm91cHMgKm1nKQogewogCWludCBpOwogCWZvciAoaSA9IDA7IGkgPCBNQVBfX05SX1RZUEVTOyArK2kpCi0JCV9fbWFwX2dyb3Vwc19fZml4dXBfZW5kKHNlbGYsIGkpOworCQlfX21hcF9ncm91cHNfX2ZpeHVwX2VuZChtZywgaSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc3ltYm9sICpzeW1ib2xfX25ldyh1NjQgc3RhcnQsIHU2NCBsZW4sIHU4IGJpbmRpbmcsCiAJCQkJICBjb25zdCBjaGFyICpuYW1lKQogewogCXNpemVfdCBuYW1lbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLQlzdHJ1Y3Qgc3ltYm9sICpzZWxmID0gY2FsbG9jKDEsIChzeW1ib2xfY29uZi5wcml2X3NpemUgKwotCQkJCQkgc2l6ZW9mKCpzZWxmKSArIG5hbWVsZW4pKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQorCXN0cnVjdCBzeW1ib2wgKnN5bSA9IGNhbGxvYygxLCAoc3ltYm9sX2NvbmYucHJpdl9zaXplICsKKwkJCQkJc2l6ZW9mKCpzeW0pICsgbmFtZWxlbikpOworCWlmIChzeW0gPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKIAlpZiAoc3ltYm9sX2NvbmYucHJpdl9zaXplKQotCQlzZWxmID0gKCh2b2lkICopc2VsZikgKyBzeW1ib2xfY29uZi5wcml2X3NpemU7CisJCXN5bSA9ICgodm9pZCAqKXN5bSkgKyBzeW1ib2xfY29uZi5wcml2X3NpemU7CiAKLQlzZWxmLT5zdGFydCAgID0gc3RhcnQ7Ci0Jc2VsZi0+ZW5kICAgICA9IGxlbiA/IHN0YXJ0ICsgbGVuIC0gMSA6IHN0YXJ0OwotCXNlbGYtPmJpbmRpbmcgPSBiaW5kaW5nOwotCXNlbGYtPm5hbWVsZW4gPSBuYW1lbGVuIC0gMTsKKwlzeW0tPnN0YXJ0ICAgPSBzdGFydDsKKwlzeW0tPmVuZCAgICAgPSBsZW4gPyBzdGFydCArIGxlbiAtIDEgOiBzdGFydDsKKwlzeW0tPmJpbmRpbmcgPSBiaW5kaW5nOworCXN5bS0+bmFtZWxlbiA9IG5hbWVsZW4gLSAxOwogCi0JcHJfZGVidWc0KCIlczogJXMgJSMiIFBSSXg2NCAiLSUjIiBQUkl4NjQgIlxuIiwgX19mdW5jX18sIG5hbWUsIHN0YXJ0LCBzZWxmLT5lbmQpOworCXByX2RlYnVnNCgiJXM6ICVzICUjIiBQUkl4NjQgIi0lIyIgUFJJeDY0ICJcbiIsCisJCSAgX19mdW5jX18sIG5hbWUsIHN0YXJ0LCBzeW0tPmVuZCk7CisJbWVtY3B5KHN5bS0+bmFtZSwgbmFtZSwgbmFtZWxlbik7CiAKLQltZW1jcHkoc2VsZi0+bmFtZSwgbmFtZSwgbmFtZWxlbik7Ci0KLQlyZXR1cm4gc2VsZjsKKwlyZXR1cm4gc3ltOwogfQogCi12b2lkIHN5bWJvbF9fZGVsZXRlKHN0cnVjdCBzeW1ib2wgKnNlbGYpCit2b2lkIHN5bWJvbF9fZGVsZXRlKHN0cnVjdCBzeW1ib2wgKnN5bSkKIHsKLQlmcmVlKCgodm9pZCAqKXNlbGYpIC0gc3ltYm9sX2NvbmYucHJpdl9zaXplKTsKKwlmcmVlKCgodm9pZCAqKXN5bSkgLSBzeW1ib2xfY29uZi5wcml2X3NpemUpOwogfQogCi1zdGF0aWMgc2l6ZV90IHN5bWJvbF9fZnByaW50ZihzdHJ1Y3Qgc3ltYm9sICpzZWxmLCBGSUxFICpmcCkKK3N0YXRpYyBzaXplX3Qgc3ltYm9sX19mcHJpbnRmKHN0cnVjdCBzeW1ib2wgKnN5bSwgRklMRSAqZnApCiB7CiAJcmV0dXJuIGZwcmludGYoZnAsICIgJSIgUFJJeDY0ICItJSIgUFJJeDY0ICIgJWMgJXNcbiIsCi0JCSAgICAgICBzZWxmLT5zdGFydCwgc2VsZi0+ZW5kLAotCQkgICAgICAgc2VsZi0+YmluZGluZyA9PSBTVEJfR0xPQkFMID8gJ2cnIDoKLQkJICAgICAgIHNlbGYtPmJpbmRpbmcgPT0gU1RCX0xPQ0FMICA/ICdsJyA6ICd3JywKLQkJICAgICAgIHNlbGYtPm5hbWUpOworCQkgICAgICAgc3ltLT5zdGFydCwgc3ltLT5lbmQsCisJCSAgICAgICBzeW0tPmJpbmRpbmcgPT0gU1RCX0dMT0JBTCA/ICdnJyA6CisJCSAgICAgICBzeW0tPmJpbmRpbmcgPT0gU1RCX0xPQ0FMICA/ICdsJyA6ICd3JywKKwkJICAgICAgIHN5bS0+bmFtZSk7CiB9CiAKLXZvaWQgZHNvX19zZXRfbG9uZ19uYW1lKHN0cnVjdCBkc28gKnNlbGYsIGNoYXIgKm5hbWUpCit2b2lkIGRzb19fc2V0X2xvbmdfbmFtZShzdHJ1Y3QgZHNvICpkc28sIGNoYXIgKm5hbWUpCiB7CiAJaWYgKG5hbWUgPT0gTlVMTCkKIAkJcmV0dXJuOwotCXNlbGYtPmxvbmdfbmFtZSA9IG5hbWU7Ci0Jc2VsZi0+bG9uZ19uYW1lX2xlbiA9IHN0cmxlbihuYW1lKTsKKwlkc28tPmxvbmdfbmFtZSA9IG5hbWU7CisJZHNvLT5sb25nX25hbWVfbGVuID0gc3RybGVuKG5hbWUpOwogfQogCi1zdGF0aWMgdm9pZCBkc29fX3NldF9zaG9ydF9uYW1lKHN0cnVjdCBkc28gKnNlbGYsIGNvbnN0IGNoYXIgKm5hbWUpCitzdGF0aWMgdm9pZCBkc29fX3NldF9zaG9ydF9uYW1lKHN0cnVjdCBkc28gKmRzbywgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlpZiAobmFtZSA9PSBOVUxMKQogCQlyZXR1cm47Ci0Jc2VsZi0+c2hvcnRfbmFtZSA9IG5hbWU7Ci0Jc2VsZi0+c2hvcnRfbmFtZV9sZW4gPSBzdHJsZW4obmFtZSk7CisJZHNvLT5zaG9ydF9uYW1lID0gbmFtZTsKKwlkc28tPnNob3J0X25hbWVfbGVuID0gc3RybGVuKG5hbWUpOwogfQogCi1zdGF0aWMgdm9pZCBkc29fX3NldF9iYXNlbmFtZShzdHJ1Y3QgZHNvICpzZWxmKQorc3RhdGljIHZvaWQgZHNvX19zZXRfYmFzZW5hbWUoc3RydWN0IGRzbyAqZHNvKQogewotCWRzb19fc2V0X3Nob3J0X25hbWUoc2VsZiwgYmFzZW5hbWUoc2VsZi0+bG9uZ19uYW1lKSk7CisJZHNvX19zZXRfc2hvcnRfbmFtZShkc28sIGJhc2VuYW1lKGRzby0+bG9uZ19uYW1lKSk7CiB9CiAKIHN0cnVjdCBkc28gKmRzb19fbmV3KGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0Jc3RydWN0IGRzbyAqc2VsZiA9IGNhbGxvYygxLCBzaXplb2YoKnNlbGYpICsgc3RybGVuKG5hbWUpICsgMSk7CisJc3RydWN0IGRzbyAqZHNvID0gY2FsbG9jKDEsIHNpemVvZigqZHNvKSArIHN0cmxlbihuYW1lKSArIDEpOwogCi0JaWYgKHNlbGYgIT0gTlVMTCkgeworCWlmIChkc28gIT0gTlVMTCkgewogCQlpbnQgaTsKLQkJc3RyY3B5KHNlbGYtPm5hbWUsIG5hbWUpOwotCQlkc29fX3NldF9sb25nX25hbWUoc2VsZiwgc2VsZi0+bmFtZSk7Ci0JCWRzb19fc2V0X3Nob3J0X25hbWUoc2VsZiwgc2VsZi0+bmFtZSk7CisJCXN0cmNweShkc28tPm5hbWUsIG5hbWUpOworCQlkc29fX3NldF9sb25nX25hbWUoZHNvLCBkc28tPm5hbWUpOworCQlkc29fX3NldF9zaG9ydF9uYW1lKGRzbywgZHNvLT5uYW1lKTsKIAkJZm9yIChpID0gMDsgaSA8IE1BUF9fTlJfVFlQRVM7ICsraSkKLQkJCXNlbGYtPnN5bWJvbHNbaV0gPSBzZWxmLT5zeW1ib2xfbmFtZXNbaV0gPSBSQl9ST09UOwotCQlzZWxmLT5zeW10YWJfdHlwZSA9IFNZTVRBQl9fTk9UX0ZPVU5EOwotCQlzZWxmLT5sb2FkZWQgPSAwOwotCQlzZWxmLT5zb3J0ZWRfYnlfbmFtZSA9IDA7Ci0JCXNlbGYtPmhhc19idWlsZF9pZCA9IDA7Ci0JCXNlbGYtPmtlcm5lbCA9IERTT19UWVBFX1VTRVI7Ci0JCUlOSVRfTElTVF9IRUFEKCZzZWxmLT5ub2RlKTsKKwkJCWRzby0+c3ltYm9sc1tpXSA9IGRzby0+c3ltYm9sX25hbWVzW2ldID0gUkJfUk9PVDsKKwkJZHNvLT5zeW10YWJfdHlwZSA9IFNZTVRBQl9fTk9UX0ZPVU5EOworCQlkc28tPmxvYWRlZCA9IDA7CisJCWRzby0+c29ydGVkX2J5X25hbWUgPSAwOworCQlkc28tPmhhc19idWlsZF9pZCA9IDA7CisJCWRzby0+a2VybmVsID0gRFNPX1RZUEVfVVNFUjsKKwkJSU5JVF9MSVNUX0hFQUQoJmRzby0+bm9kZSk7CiAJfQogCi0JcmV0dXJuIHNlbGY7CisJcmV0dXJuIGRzbzsKIH0KIAotc3RhdGljIHZvaWQgc3ltYm9sc19fZGVsZXRlKHN0cnVjdCByYl9yb290ICpzZWxmKQorc3RhdGljIHZvaWQgc3ltYm9sc19fZGVsZXRlKHN0cnVjdCByYl9yb290ICpzeW1ib2xzKQogewogCXN0cnVjdCBzeW1ib2wgKnBvczsKLQlzdHJ1Y3QgcmJfbm9kZSAqbmV4dCA9IHJiX2ZpcnN0KHNlbGYpOworCXN0cnVjdCByYl9ub2RlICpuZXh0ID0gcmJfZmlyc3Qoc3ltYm9scyk7CiAKIAl3aGlsZSAobmV4dCkgewogCQlwb3MgPSByYl9lbnRyeShuZXh0LCBzdHJ1Y3Qgc3ltYm9sLCByYl9ub2RlKTsKIAkJbmV4dCA9IHJiX25leHQoJnBvcy0+cmJfbm9kZSk7Ci0JCXJiX2VyYXNlKCZwb3MtPnJiX25vZGUsIHNlbGYpOworCQlyYl9lcmFzZSgmcG9zLT5yYl9ub2RlLCBzeW1ib2xzKTsKIAkJc3ltYm9sX19kZWxldGUocG9zKTsKIAl9CiB9CiAKLXZvaWQgZHNvX19kZWxldGUoc3RydWN0IGRzbyAqc2VsZikKK3ZvaWQgZHNvX19kZWxldGUoc3RydWN0IGRzbyAqZHNvKQogewogCWludCBpOwogCWZvciAoaSA9IDA7IGkgPCBNQVBfX05SX1RZUEVTOyArK2kpCi0JCXN5bWJvbHNfX2RlbGV0ZSgmc2VsZi0+c3ltYm9sc1tpXSk7Ci0JaWYgKHNlbGYtPnNuYW1lX2FsbG9jKQotCQlmcmVlKChjaGFyICopc2VsZi0+c2hvcnRfbmFtZSk7Ci0JaWYgKHNlbGYtPmxuYW1lX2FsbG9jKQotCQlmcmVlKHNlbGYtPmxvbmdfbmFtZSk7Ci0JZnJlZShzZWxmKTsKKwkJc3ltYm9sc19fZGVsZXRlKCZkc28tPnN5bWJvbHNbaV0pOworCWlmIChkc28tPnNuYW1lX2FsbG9jKQorCQlmcmVlKChjaGFyICopZHNvLT5zaG9ydF9uYW1lKTsKKwlpZiAoZHNvLT5sbmFtZV9hbGxvYykKKwkJZnJlZShkc28tPmxvbmdfbmFtZSk7CisJZnJlZShkc28pOwogfQogCi12b2lkIGRzb19fc2V0X2J1aWxkX2lkKHN0cnVjdCBkc28gKnNlbGYsIHZvaWQgKmJ1aWxkX2lkKQordm9pZCBkc29fX3NldF9idWlsZF9pZChzdHJ1Y3QgZHNvICpkc28sIHZvaWQgKmJ1aWxkX2lkKQogewotCW1lbWNweShzZWxmLT5idWlsZF9pZCwgYnVpbGRfaWQsIHNpemVvZihzZWxmLT5idWlsZF9pZCkpOwotCXNlbGYtPmhhc19idWlsZF9pZCA9IDE7CisJbWVtY3B5KGRzby0+YnVpbGRfaWQsIGJ1aWxkX2lkLCBzaXplb2YoZHNvLT5idWlsZF9pZCkpOworCWRzby0+aGFzX2J1aWxkX2lkID0gMTsKIH0KIAotc3RhdGljIHZvaWQgc3ltYm9sc19faW5zZXJ0KHN0cnVjdCByYl9yb290ICpzZWxmLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pCitzdGF0aWMgdm9pZCBzeW1ib2xzX19pbnNlcnQoc3RydWN0IHJiX3Jvb3QgKnN5bWJvbHMsIHN0cnVjdCBzeW1ib2wgKnN5bSkKIHsKLQlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmc2VsZi0+cmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmc3ltYm9scy0+cmJfbm9kZTsKIAlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKIAljb25zdCB1NjQgaXAgPSBzeW0tPnN0YXJ0OwogCXN0cnVjdCBzeW1ib2wgKnM7CkBAIC0yNjUsMTcgKzI2NSwxNyBAQAogCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKIAl9CiAJcmJfbGlua19ub2RlKCZzeW0tPnJiX25vZGUsIHBhcmVudCwgcCk7Ci0JcmJfaW5zZXJ0X2NvbG9yKCZzeW0tPnJiX25vZGUsIHNlbGYpOworCXJiX2luc2VydF9jb2xvcigmc3ltLT5yYl9ub2RlLCBzeW1ib2xzKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzeW1ib2wgKnN5bWJvbHNfX2ZpbmQoc3RydWN0IHJiX3Jvb3QgKnNlbGYsIHU2NCBpcCkKK3N0YXRpYyBzdHJ1Y3Qgc3ltYm9sICpzeW1ib2xzX19maW5kKHN0cnVjdCByYl9yb290ICpzeW1ib2xzLCB1NjQgaXApCiB7CiAJc3RydWN0IHJiX25vZGUgKm47CiAKLQlpZiAoc2VsZiA9PSBOVUxMKQorCWlmIChzeW1ib2xzID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCi0JbiA9IHNlbGYtPnJiX25vZGU7CisJbiA9IHN5bWJvbHMtPnJiX25vZGU7CiAKIAl3aGlsZSAobikgewogCQlzdHJ1Y3Qgc3ltYm9sICpzID0gcmJfZW50cnkobiwgc3RydWN0IHN5bWJvbCwgcmJfbm9kZSk7CkBAIC0yOTYsOSArMjk2LDkgQEAKIAlzdHJ1Y3Qgc3ltYm9sCXN5bTsKIH07CiAKLXN0YXRpYyB2b2lkIHN5bWJvbHNfX2luc2VydF9ieV9uYW1lKHN0cnVjdCByYl9yb290ICpzZWxmLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pCitzdGF0aWMgdm9pZCBzeW1ib2xzX19pbnNlcnRfYnlfbmFtZShzdHJ1Y3QgcmJfcm9vdCAqc3ltYm9scywgc3RydWN0IHN5bWJvbCAqc3ltKQogewotCXN0cnVjdCByYl9ub2RlICoqcCA9ICZzZWxmLT5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZzeW1ib2xzLT5yYl9ub2RlOwogCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOwogCXN0cnVjdCBzeW1ib2xfbmFtZV9yYl9ub2RlICpzeW1uLCAqczsKIApAQCAtMzEzLDI3ICszMTMsMjkgQEAKIAkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CiAJfQogCXJiX2xpbmtfbm9kZSgmc3ltbi0+cmJfbm9kZSwgcGFyZW50LCBwKTsKLQlyYl9pbnNlcnRfY29sb3IoJnN5bW4tPnJiX25vZGUsIHNlbGYpOworCXJiX2luc2VydF9jb2xvcigmc3ltbi0+cmJfbm9kZSwgc3ltYm9scyk7CiB9CiAKLXN0YXRpYyB2b2lkIHN5bWJvbHNfX3NvcnRfYnlfbmFtZShzdHJ1Y3QgcmJfcm9vdCAqc2VsZiwgc3RydWN0IHJiX3Jvb3QgKnNvdXJjZSkKK3N0YXRpYyB2b2lkIHN5bWJvbHNfX3NvcnRfYnlfbmFtZShzdHJ1Y3QgcmJfcm9vdCAqc3ltYm9scywKKwkJCQkgIHN0cnVjdCByYl9yb290ICpzb3VyY2UpCiB7CiAJc3RydWN0IHJiX25vZGUgKm5kOwogCiAJZm9yIChuZCA9IHJiX2ZpcnN0KHNvdXJjZSk7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7CiAJCXN0cnVjdCBzeW1ib2wgKnBvcyA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3Qgc3ltYm9sLCByYl9ub2RlKTsKLQkJc3ltYm9sc19faW5zZXJ0X2J5X25hbWUoc2VsZiwgcG9zKTsKKwkJc3ltYm9sc19faW5zZXJ0X2J5X25hbWUoc3ltYm9scywgcG9zKTsKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3ltYm9sICpzeW1ib2xzX19maW5kX2J5X25hbWUoc3RydWN0IHJiX3Jvb3QgKnNlbGYsIGNvbnN0IGNoYXIgKm5hbWUpCitzdGF0aWMgc3RydWN0IHN5bWJvbCAqc3ltYm9sc19fZmluZF9ieV9uYW1lKHN0cnVjdCByYl9yb290ICpzeW1ib2xzLAorCQkJCQkgICAgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqbjsKIAotCWlmIChzZWxmID09IE5VTEwpCisJaWYgKHN5bWJvbHMgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQluID0gc2VsZi0+cmJfbm9kZTsKKwluID0gc3ltYm9scy0+cmJfbm9kZTsKIAogCXdoaWxlIChuKSB7CiAJCXN0cnVjdCBzeW1ib2xfbmFtZV9yYl9ub2RlICpzOwpAQCAtMzUzLDI5ICszNTUsMjkgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RydWN0IHN5bWJvbCAqZHNvX19maW5kX3N5bWJvbChzdHJ1Y3QgZHNvICpzZWxmLAorc3RydWN0IHN5bWJvbCAqZHNvX19maW5kX3N5bWJvbChzdHJ1Y3QgZHNvICpkc28sCiAJCQkJZW51bSBtYXBfdHlwZSB0eXBlLCB1NjQgYWRkcikKIHsKLQlyZXR1cm4gc3ltYm9sc19fZmluZCgmc2VsZi0+c3ltYm9sc1t0eXBlXSwgYWRkcik7CisJcmV0dXJuIHN5bWJvbHNfX2ZpbmQoJmRzby0+c3ltYm9sc1t0eXBlXSwgYWRkcik7CiB9CiAKLXN0cnVjdCBzeW1ib2wgKmRzb19fZmluZF9zeW1ib2xfYnlfbmFtZShzdHJ1Y3QgZHNvICpzZWxmLCBlbnVtIG1hcF90eXBlIHR5cGUsCitzdHJ1Y3Qgc3ltYm9sICpkc29fX2ZpbmRfc3ltYm9sX2J5X25hbWUoc3RydWN0IGRzbyAqZHNvLCBlbnVtIG1hcF90eXBlIHR5cGUsCiAJCQkJCWNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0JcmV0dXJuIHN5bWJvbHNfX2ZpbmRfYnlfbmFtZSgmc2VsZi0+c3ltYm9sX25hbWVzW3R5cGVdLCBuYW1lKTsKKwlyZXR1cm4gc3ltYm9sc19fZmluZF9ieV9uYW1lKCZkc28tPnN5bWJvbF9uYW1lc1t0eXBlXSwgbmFtZSk7CiB9CiAKLXZvaWQgZHNvX19zb3J0X2J5X25hbWUoc3RydWN0IGRzbyAqc2VsZiwgZW51bSBtYXBfdHlwZSB0eXBlKQordm9pZCBkc29fX3NvcnRfYnlfbmFtZShzdHJ1Y3QgZHNvICpkc28sIGVudW0gbWFwX3R5cGUgdHlwZSkKIHsKLQlkc29fX3NldF9zb3J0ZWRfYnlfbmFtZShzZWxmLCB0eXBlKTsKLQlyZXR1cm4gc3ltYm9sc19fc29ydF9ieV9uYW1lKCZzZWxmLT5zeW1ib2xfbmFtZXNbdHlwZV0sCi0JCQkJICAgICAmc2VsZi0+c3ltYm9sc1t0eXBlXSk7CisJZHNvX19zZXRfc29ydGVkX2J5X25hbWUoZHNvLCB0eXBlKTsKKwlyZXR1cm4gc3ltYm9sc19fc29ydF9ieV9uYW1lKCZkc28tPnN5bWJvbF9uYW1lc1t0eXBlXSwKKwkJCQkgICAgICZkc28tPnN5bWJvbHNbdHlwZV0pOwogfQogCi1pbnQgYnVpbGRfaWRfX3NwcmludGYoY29uc3QgdTggKnNlbGYsIGludCBsZW4sIGNoYXIgKmJmKQoraW50IGJ1aWxkX2lkX19zcHJpbnRmKGNvbnN0IHU4ICpidWlsZF9pZCwgaW50IGxlbiwgY2hhciAqYmYpCiB7CiAJY2hhciAqYmlkID0gYmY7Ci0JY29uc3QgdTggKnJhdyA9IHNlbGY7CisJY29uc3QgdTggKnJhdyA9IGJ1aWxkX2lkOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CkBAIC0zODQsMjQgKzM4NiwyNSBAQAogCQliaWQgKz0gMjsKIAl9CiAKLQlyZXR1cm4gcmF3IC0gc2VsZjsKKwlyZXR1cm4gcmF3IC0gYnVpbGRfaWQ7CiB9CiAKLXNpemVfdCBkc29fX2ZwcmludGZfYnVpbGRpZChzdHJ1Y3QgZHNvICpzZWxmLCBGSUxFICpmcCkKK3NpemVfdCBkc29fX2ZwcmludGZfYnVpbGRpZChzdHJ1Y3QgZHNvICpkc28sIEZJTEUgKmZwKQogewogCWNoYXIgc2J1aWxkX2lkW0JVSUxEX0lEX1NJWkUgKiAyICsgMV07CiAKLQlidWlsZF9pZF9fc3ByaW50ZihzZWxmLT5idWlsZF9pZCwgc2l6ZW9mKHNlbGYtPmJ1aWxkX2lkKSwgc2J1aWxkX2lkKTsKKwlidWlsZF9pZF9fc3ByaW50Zihkc28tPmJ1aWxkX2lkLCBzaXplb2YoZHNvLT5idWlsZF9pZCksIHNidWlsZF9pZCk7CiAJcmV0dXJuIGZwcmludGYoZnAsICIlcyIsIHNidWlsZF9pZCk7CiB9CiAKLXNpemVfdCBkc29fX2ZwcmludGZfc3ltYm9sc19ieV9uYW1lKHN0cnVjdCBkc28gKnNlbGYsIGVudW0gbWFwX3R5cGUgdHlwZSwgRklMRSAqZnApCitzaXplX3QgZHNvX19mcHJpbnRmX3N5bWJvbHNfYnlfbmFtZShzdHJ1Y3QgZHNvICpkc28sCisJCQkJICAgIGVudW0gbWFwX3R5cGUgdHlwZSwgRklMRSAqZnApCiB7CiAJc2l6ZV90IHJldCA9IDA7CiAJc3RydWN0IHJiX25vZGUgKm5kOwogCXN0cnVjdCBzeW1ib2xfbmFtZV9yYl9ub2RlICpwb3M7CiAKLQlmb3IgKG5kID0gcmJfZmlyc3QoJnNlbGYtPnN5bWJvbF9uYW1lc1t0eXBlXSk7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7CisJZm9yIChuZCA9IHJiX2ZpcnN0KCZkc28tPnN5bWJvbF9uYW1lc1t0eXBlXSk7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7CiAJCXBvcyA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3Qgc3ltYm9sX25hbWVfcmJfbm9kZSwgcmJfbm9kZSk7CiAJCWZwcmludGYoZnAsICIlc1xuIiwgcG9zLT5zeW0ubmFtZSk7CiAJfQpAQCAtNDA5LDE4ICs0MTIsMTggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zaXplX3QgZHNvX19mcHJpbnRmKHN0cnVjdCBkc28gKnNlbGYsIGVudW0gbWFwX3R5cGUgdHlwZSwgRklMRSAqZnApCitzaXplX3QgZHNvX19mcHJpbnRmKHN0cnVjdCBkc28gKmRzbywgZW51bSBtYXBfdHlwZSB0eXBlLCBGSUxFICpmcCkKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqbmQ7Ci0Jc2l6ZV90IHJldCA9IGZwcmludGYoZnAsICJkc286ICVzICgiLCBzZWxmLT5zaG9ydF9uYW1lKTsKKwlzaXplX3QgcmV0ID0gZnByaW50ZihmcCwgImRzbzogJXMgKCIsIGRzby0+c2hvcnRfbmFtZSk7CiAKLQlpZiAoc2VsZi0+c2hvcnRfbmFtZSAhPSBzZWxmLT5sb25nX25hbWUpCi0JCXJldCArPSBmcHJpbnRmKGZwLCAiJXMsICIsIHNlbGYtPmxvbmdfbmFtZSk7CisJaWYgKGRzby0+c2hvcnRfbmFtZSAhPSBkc28tPmxvbmdfbmFtZSkKKwkJcmV0ICs9IGZwcmludGYoZnAsICIlcywgIiwgZHNvLT5sb25nX25hbWUpOwogCXJldCArPSBmcHJpbnRmKGZwLCAiJXMsICVzbG9hZGVkLCAiLCBtYXBfdHlwZV9fbmFtZVt0eXBlXSwKLQkJICAgICAgIHNlbGYtPmxvYWRlZCA/ICIiIDogIk5PVCAiKTsKLQlyZXQgKz0gZHNvX19mcHJpbnRmX2J1aWxkaWQoc2VsZiwgZnApOworCQkgICAgICAgZHNvLT5sb2FkZWQgPyAiIiA6ICJOT1QgIik7CisJcmV0ICs9IGRzb19fZnByaW50Zl9idWlsZGlkKGRzbywgZnApOwogCXJldCArPSBmcHJpbnRmKGZwLCAiKVxuIik7Ci0JZm9yIChuZCA9IHJiX2ZpcnN0KCZzZWxmLT5zeW1ib2xzW3R5cGVdKTsgbmQ7IG5kID0gcmJfbmV4dChuZCkpIHsKKwlmb3IgKG5kID0gcmJfZmlyc3QoJmRzby0+c3ltYm9sc1t0eXBlXSk7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7CiAJCXN0cnVjdCBzeW1ib2wgKnBvcyA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3Qgc3ltYm9sLCByYl9ub2RlKTsKIAkJcmV0ICs9IHN5bWJvbF9fZnByaW50Zihwb3MsIGZwKTsKIAl9CkBAIC01NDMsMTAgKzU0NiwxMCBAQAogICogc28gdGhhdCB3ZSBjYW4gaW4gdGhlIG5leHQgc3RlcCBzZXQgdGhlIHN5bWJvbCAtPmVuZCBhZGRyZXNzIGFuZCB0aGVuCiAgKiBjYWxsIGtlcm5lbF9tYXBzX19zcGxpdF9rYWxsc3ltcy4KICAqLwotc3RhdGljIGludCBkc29fX2xvYWRfYWxsX2thbGxzeW1zKHN0cnVjdCBkc28gKnNlbGYsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorc3RhdGljIGludCBkc29fX2xvYWRfYWxsX2thbGxzeW1zKHN0cnVjdCBkc28gKmRzbywgY29uc3QgY2hhciAqZmlsZW5hbWUsCiAJCQkJICBzdHJ1Y3QgbWFwICptYXApCiB7Ci0Jc3RydWN0IHByb2Nlc3Nfa2FsbHN5bXNfYXJncyBhcmdzID0geyAubWFwID0gbWFwLCAuZHNvID0gc2VsZiwgfTsKKwlzdHJ1Y3QgcHJvY2Vzc19rYWxsc3ltc19hcmdzIGFyZ3MgPSB7IC5tYXAgPSBtYXAsIC5kc28gPSBkc28sIH07CiAJcmV0dXJuIGthbGxzeW1zX19wYXJzZShmaWxlbmFtZSwgJmFyZ3MsIG1hcF9fcHJvY2Vzc19rYWxsc3ltX3N5bWJvbCk7CiB9CiAKQEAgLTU1NSw3ICs1NTgsNyBAQAogICoga2VybmVsIHJhbmdlIGlzIGJyb2tlbiBpbiBzZXZlcmFsIG1hcHMsIG5hbWVkIFtrZXJuZWxdLk4sIGFzIHdlIGRvbid0IGhhdmUKICAqIHRoZSBvcmlnaW5hbCBFTEYgc2VjdGlvbiBuYW1lcyB2bWxpbnV4IGhhdmUuCiAgKi8KLXN0YXRpYyBpbnQgZHNvX19zcGxpdF9rYWxsc3ltcyhzdHJ1Y3QgZHNvICpzZWxmLCBzdHJ1Y3QgbWFwICptYXAsCitzdGF0aWMgaW50IGRzb19fc3BsaXRfa2FsbHN5bXMoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsCiAJCQkgICAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKIHsKIAlzdHJ1Y3QgbWFwX2dyb3VwcyAqa21hcHMgPSBtYXBfX2ttYXAobWFwKS0+a21hcHM7CkBAIC01NjMsNyArNTY2LDcgQEAKIAlzdHJ1Y3QgbWFwICpjdXJyX21hcCA9IG1hcDsKIAlzdHJ1Y3Qgc3ltYm9sICpwb3M7CiAJaW50IGNvdW50ID0gMCwgbW92ZWQgPSAwOwkKLQlzdHJ1Y3QgcmJfcm9vdCAqcm9vdCA9ICZzZWxmLT5zeW1ib2xzW21hcC0+dHlwZV07CisJc3RydWN0IHJiX3Jvb3QgKnJvb3QgPSAmZHNvLT5zeW1ib2xzW21hcC0+dHlwZV07CiAJc3RydWN0IHJiX25vZGUgKm5leHQgPSByYl9maXJzdChyb290KTsKIAlpbnQga2VybmVsX3JhbmdlID0gMDsKIApAQCAtNTgyLDcgKzU4NSw3IEBACiAKIAkJCWlmIChzdHJjbXAoY3Vycl9tYXAtPmRzby0+c2hvcnRfbmFtZSwgbW9kdWxlKSkgewogCQkJCWlmIChjdXJyX21hcCAhPSBtYXAgJiYKLQkJCQkgICAgc2VsZi0+a2VybmVsID09IERTT19UWVBFX0dVRVNUX0tFUk5FTCAmJgorCQkJCSAgICBkc28tPmtlcm5lbCA9PSBEU09fVFlQRV9HVUVTVF9LRVJORUwgJiYKIAkJCQkgICAgbWFjaGluZV9faXNfZGVmYXVsdF9ndWVzdChtYWNoaW5lKSkgewogCQkJCQkvKgogCQkJCQkgKiBXZSBhc3N1bWUgYWxsIHN5bWJvbHMgb2YgYSBtb2R1bGUgYXJlCkBAIC02MTgsMTQgKzYyMSwxNCBAQAogCQkJcG9zLT5lbmQgICA9IGN1cnJfbWFwLT5tYXBfaXAoY3Vycl9tYXAsIHBvcy0+ZW5kKTsKIAkJfSBlbHNlIGlmIChjdXJyX21hcCAhPSBtYXApIHsKIAkJCWNoYXIgZHNvX25hbWVbUEFUSF9NQVhdOwotCQkJc3RydWN0IGRzbyAqZHNvOworCQkJc3RydWN0IGRzbyAqbmRzbzsKIAogCQkJaWYgKGNvdW50ID09IDApIHsKIAkJCQljdXJyX21hcCA9IG1hcDsKIAkJCQlnb3RvIGZpbHRlcl9zeW1ib2w7CiAJCQl9CiAKLQkJCWlmIChzZWxmLT5rZXJuZWwgPT0gRFNPX1RZUEVfR1VFU1RfS0VSTkVMKQorCQkJaWYgKGRzby0+a2VybmVsID09IERTT19UWVBFX0dVRVNUX0tFUk5FTCkKIAkJCQlzbnByaW50Zihkc29fbmFtZSwgc2l6ZW9mKGRzb19uYW1lKSwKIAkJCQkJIltndWVzdC5rZXJuZWxdLiVkIiwKIAkJCQkJa2VybmVsX3JhbmdlKyspOwpAQCAtNjM0LDE1ICs2MzcsMTUgQEAKIAkJCQkJIltrZXJuZWxdLiVkIiwKIAkJCQkJa2VybmVsX3JhbmdlKyspOwogCi0JCQlkc28gPSBkc29fX25ldyhkc29fbmFtZSk7Ci0JCQlpZiAoZHNvID09IE5VTEwpCisJCQluZHNvID0gZHNvX19uZXcoZHNvX25hbWUpOworCQkJaWYgKG5kc28gPT0gTlVMTCkKIAkJCQlyZXR1cm4gLTE7CiAKLQkJCWRzby0+a2VybmVsID0gc2VsZi0+a2VybmVsOworCQkJbmRzby0+a2VybmVsID0gZHNvLT5rZXJuZWw7CiAKLQkJCWN1cnJfbWFwID0gbWFwX19uZXcyKHBvcy0+c3RhcnQsIGRzbywgbWFwLT50eXBlKTsKKwkJCWN1cnJfbWFwID0gbWFwX19uZXcyKHBvcy0+c3RhcnQsIG5kc28sIG1hcC0+dHlwZSk7CiAJCQlpZiAoY3Vycl9tYXAgPT0gTlVMTCkgewotCQkJCWRzb19fZGVsZXRlKGRzbyk7CisJCQkJZHNvX19kZWxldGUobmRzbyk7CiAJCQkJcmV0dXJuIC0xOwogCQkJfQogCkBAIC02NjUsNyArNjY4LDcgQEAKIAl9CiAKIAlpZiAoY3Vycl9tYXAgIT0gbWFwICYmCi0JICAgIHNlbGYtPmtlcm5lbCA9PSBEU09fVFlQRV9HVUVTVF9LRVJORUwgJiYKKwkgICAgZHNvLT5rZXJuZWwgPT0gRFNPX1RZUEVfR1VFU1RfS0VSTkVMICYmCiAJICAgIG1hY2hpbmVfX2lzX2RlZmF1bHRfZ3Vlc3Qoa21hcHMtPm1hY2hpbmUpKSB7CiAJCWRzb19fc2V0X2xvYWRlZChjdXJyX21hcC0+ZHNvLCBjdXJyX21hcC0+dHlwZSk7CiAJfQpAQCAtNjczLDIxICs2NzYsMjEgQEAKIAlyZXR1cm4gY291bnQgKyBtb3ZlZDsKIH0KIAotaW50IGRzb19fbG9hZF9rYWxsc3ltcyhzdHJ1Y3QgZHNvICpzZWxmLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKK2ludCBkc29fX2xvYWRfa2FsbHN5bXMoc3RydWN0IGRzbyAqZHNvLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKIAkJICAgICAgIHN0cnVjdCBtYXAgKm1hcCwgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKIHsKLQlpZiAoZHNvX19sb2FkX2FsbF9rYWxsc3ltcyhzZWxmLCBmaWxlbmFtZSwgbWFwKSA8IDApCisJaWYgKGRzb19fbG9hZF9hbGxfa2FsbHN5bXMoZHNvLCBmaWxlbmFtZSwgbWFwKSA8IDApCiAJCXJldHVybiAtMTsKIAotCWlmIChzZWxmLT5rZXJuZWwgPT0gRFNPX1RZUEVfR1VFU1RfS0VSTkVMKQotCQlzZWxmLT5zeW10YWJfdHlwZSA9IFNZTVRBQl9fR1VFU1RfS0FMTFNZTVM7CisJaWYgKGRzby0+a2VybmVsID09IERTT19UWVBFX0dVRVNUX0tFUk5FTCkKKwkJZHNvLT5zeW10YWJfdHlwZSA9IFNZTVRBQl9fR1VFU1RfS0FMTFNZTVM7CiAJZWxzZQotCQlzZWxmLT5zeW10YWJfdHlwZSA9IFNZTVRBQl9fS0FMTFNZTVM7CisJCWRzby0+c3ltdGFiX3R5cGUgPSBTWU1UQUJfX0tBTExTWU1TOwogCi0JcmV0dXJuIGRzb19fc3BsaXRfa2FsbHN5bXMoc2VsZiwgbWFwLCBmaWx0ZXIpOworCXJldHVybiBkc29fX3NwbGl0X2thbGxzeW1zKGRzbywgbWFwLCBmaWx0ZXIpOwogfQogCi1zdGF0aWMgaW50IGRzb19fbG9hZF9wZXJmX21hcChzdHJ1Y3QgZHNvICpzZWxmLCBzdHJ1Y3QgbWFwICptYXAsCitzdGF0aWMgaW50IGRzb19fbG9hZF9wZXJmX21hcChzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBtYXAgKm1hcCwKIAkJCSAgICAgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCiB7CiAJY2hhciAqbGluZSA9IE5VTEw7CkBAIC02OTUsNyArNjk4LDcgQEAKIAlGSUxFICpmaWxlOwogCWludCBucl9zeW1zID0gMDsKIAotCWZpbGUgPSBmb3BlbihzZWxmLT5sb25nX25hbWUsICJyIik7CisJZmlsZSA9IGZvcGVuKGRzby0+bG9uZ19uYW1lLCAiciIpOwogCWlmIChmaWxlID09IE5VTEwpCiAJCWdvdG8gb3V0X2ZhaWx1cmU7CiAKQEAgLTczMyw3ICs3MzYsNyBAQAogCQlpZiAoZmlsdGVyICYmIGZpbHRlcihtYXAsIHN5bSkpCiAJCQlzeW1ib2xfX2RlbGV0ZShzeW0pOwogCQllbHNlIHsKLQkJCXN5bWJvbHNfX2luc2VydCgmc2VsZi0+c3ltYm9sc1ttYXAtPnR5cGVdLCBzeW0pOworCQkJc3ltYm9sc19faW5zZXJ0KCZkc28tPnN5bWJvbHNbbWFwLT50eXBlXSwgc3ltKTsKIAkJCW5yX3N5bXMrKzsKIAkJfQogCX0KQEAgLTc1Miw3ICs3NTUsNyBAQAogLyoqCiAgKiBlbGZfc3ltdGFiX19mb3JfZWFjaF9zeW1ib2wgLSBpdGVyYXRlIHRocnUgYWxsIHRoZSBzeW1ib2xzCiAgKgotICogQHNlbGY6IHN0cnVjdCBlbGZfc3ltdGFiIGluc3RhbmNlIHRvIGl0ZXJhdGUKKyAqIEBzeW1zOiBzdHJ1Y3QgZWxmX3N5bXRhYiBpbnN0YW5jZSB0byBpdGVyYXRlCiAgKiBAaWR4OiB1aW50MzJfdCBpZHgKICAqIEBzeW06IEdFbGZfU3ltIGl0ZXJhdG9yCiAgKi8KQEAgLTg1Miw3ICs4NTUsNyBAQAogICogQW5kIGFsd2F5cyBsb29rIGF0IHRoZSBvcmlnaW5hbCBkc28sIG5vdCBhdCBkZWJ1Z2luZm8gcGFja2FnZXMsIHRoYXQKICAqIGhhdmUgdGhlIFBMVCBkYXRhIHN0cmlwcGVkIG91dCAoc2hkcl9yZWxfcGx0LnNoX3R5cGUgPT0gU0hUX05PQklUUykuCiAgKi8KLXN0YXRpYyBpbnQgZHNvX19zeW50aGVzaXplX3BsdF9zeW1ib2xzKHN0cnVjdCAgZHNvICpzZWxmLCBzdHJ1Y3QgbWFwICptYXAsCitzdGF0aWMgaW50IGRzb19fc3ludGhlc2l6ZV9wbHRfc3ltYm9scyhzdHJ1Y3QgIGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsCiAJCQkJICAgICAgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCiB7CiAJdWludDMyX3QgbnJfcmVsX2VudHJpZXMsIGlkeDsKQEAgLTg3MSw3ICs4NzQsNyBAQAogCWNoYXIgbmFtZVtQQVRIX01BWF07CiAKIAlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcyVzIiwKLQkJIHN5bWJvbF9jb25mLnN5bWZzLCBzZWxmLT5sb25nX25hbWUpOworCQkgc3ltYm9sX2NvbmYuc3ltZnMsIGRzby0+bG9uZ19uYW1lKTsKIAlmZCA9IG9wZW4obmFtZSwgT19SRE9OTFkpOwogCWlmIChmZCA8IDApCiAJCWdvdG8gb3V0OwpAQCAtOTQ3LDcgKzk1MCw3IEBACiAJCQlpZiAoZmlsdGVyICYmIGZpbHRlcihtYXAsIGYpKQogCQkJCXN5bWJvbF9fZGVsZXRlKGYpOwogCQkJZWxzZSB7Ci0JCQkJc3ltYm9sc19faW5zZXJ0KCZzZWxmLT5zeW1ib2xzW21hcC0+dHlwZV0sIGYpOworCQkJCXN5bWJvbHNfX2luc2VydCgmZHNvLT5zeW1ib2xzW21hcC0+dHlwZV0sIGYpOwogCQkJCSsrbnI7CiAJCQl9CiAJCX0KQEAgLTk2OSw3ICs5NzIsNyBAQAogCQkJaWYgKGZpbHRlciAmJiBmaWx0ZXIobWFwLCBmKSkKIAkJCQlzeW1ib2xfX2RlbGV0ZShmKTsKIAkJCWVsc2UgewotCQkJCXN5bWJvbHNfX2luc2VydCgmc2VsZi0+c3ltYm9sc1ttYXAtPnR5cGVdLCBmKTsKKwkJCQlzeW1ib2xzX19pbnNlcnQoJmRzby0+c3ltYm9sc1ttYXAtPnR5cGVdLCBmKTsKIAkJCQkrK25yOwogCQkJfQogCQl9CkBAIC05ODUsMjkgKzk4OCwzMCBAQAogCQlyZXR1cm4gbnI7CiBvdXQ6CiAJcHJfZGVidWcoIiVzOiBwcm9ibGVtcyByZWFkaW5nICVzIFBMVCBpbmZvLlxuIiwKLQkJIF9fZnVuY19fLCBzZWxmLT5sb25nX25hbWUpOworCQkgX19mdW5jX18sIGRzby0+bG9uZ19uYW1lKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGJvb2wgZWxmX3N5bV9faXNfYShHRWxmX1N5bSAqc2VsZiwgZW51bSBtYXBfdHlwZSB0eXBlKQorc3RhdGljIGJvb2wgZWxmX3N5bV9faXNfYShHRWxmX1N5bSAqc3ltLCBlbnVtIG1hcF90eXBlIHR5cGUpCiB7CiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBNQVBfX0ZVTkNUSU9OOgotCQlyZXR1cm4gZWxmX3N5bV9faXNfZnVuY3Rpb24oc2VsZik7CisJCXJldHVybiBlbGZfc3ltX19pc19mdW5jdGlvbihzeW0pOwogCWNhc2UgTUFQX19WQVJJQUJMRToKLQkJcmV0dXJuIGVsZl9zeW1fX2lzX29iamVjdChzZWxmKTsKKwkJcmV0dXJuIGVsZl9zeW1fX2lzX29iamVjdChzeW0pOwogCWRlZmF1bHQ6CiAJCXJldHVybiBmYWxzZTsKIAl9CiB9CiAKLXN0YXRpYyBib29sIGVsZl9zZWNfX2lzX2EoR0VsZl9TaGRyICpzZWxmLCBFbGZfRGF0YSAqc2Vjc3RycywgZW51bSBtYXBfdHlwZSB0eXBlKQorc3RhdGljIGJvb2wgZWxmX3NlY19faXNfYShHRWxmX1NoZHIgKnNoZHIsIEVsZl9EYXRhICpzZWNzdHJzLAorCQkJICBlbnVtIG1hcF90eXBlIHR5cGUpCiB7CiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBNQVBfX0ZVTkNUSU9OOgotCQlyZXR1cm4gZWxmX3NlY19faXNfdGV4dChzZWxmLCBzZWNzdHJzKTsKKwkJcmV0dXJuIGVsZl9zZWNfX2lzX3RleHQoc2hkciwgc2Vjc3Rycyk7CiAJY2FzZSBNQVBfX1ZBUklBQkxFOgotCQlyZXR1cm4gZWxmX3NlY19faXNfZGF0YShzZWxmLCBzZWNzdHJzKTsKKwkJcmV0dXJuIGVsZl9zZWNfX2lzX2RhdGEoc2hkciwgc2Vjc3Rycyk7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIGZhbHNlOwogCX0KQEAgLTEwMzIsMTMgKzEwMzYsMTMgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyBpbnQgZHNvX19sb2FkX3N5bShzdHJ1Y3QgZHNvICpzZWxmLCBzdHJ1Y3QgbWFwICptYXAsIGNvbnN0IGNoYXIgKm5hbWUsCitzdGF0aWMgaW50IGRzb19fbG9hZF9zeW0oc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgaW50IGZkLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyLCBpbnQga21vZHVsZSwKIAkJCSBpbnQgd2FudF9zeW10YWIpCiB7Ci0Jc3RydWN0IGttYXAgKmttYXAgPSBzZWxmLT5rZXJuZWwgPyBtYXBfX2ttYXAobWFwKSA6IE5VTEw7CisJc3RydWN0IGttYXAgKmttYXAgPSBkc28tPmtlcm5lbCA/IG1hcF9fa21hcChtYXApIDogTlVMTDsKIAlzdHJ1Y3QgbWFwICpjdXJyX21hcCA9IG1hcDsKLQlzdHJ1Y3QgZHNvICpjdXJyX2RzbyA9IHNlbGY7CisJc3RydWN0IGRzbyAqY3Vycl9kc28gPSBkc287CiAJRWxmX0RhdGEgKnN5bXN0cnMsICpzZWNzdHJzOwogCXVpbnQzMl90IG5yX3N5bXM7CiAJaW50IGVyciA9IC0xOwpAQCAtMTA2NCwxNCArMTA2OCwxNCBAQAogCX0KIAogCS8qIEFsd2F5cyByZWplY3QgaW1hZ2VzIHdpdGggYSBtaXNtYXRjaGVkIGJ1aWxkLWlkOiAqLwotCWlmIChzZWxmLT5oYXNfYnVpbGRfaWQpIHsKKwlpZiAoZHNvLT5oYXNfYnVpbGRfaWQpIHsKIAkJdTggYnVpbGRfaWRbQlVJTERfSURfU0laRV07CiAKIAkJaWYgKGVsZl9yZWFkX2J1aWxkX2lkKGVsZiwgYnVpbGRfaWQsCiAJCQkJICAgICAgQlVJTERfSURfU0laRSkgIT0gQlVJTERfSURfU0laRSkKIAkJCWdvdG8gb3V0X2VsZl9lbmQ7CiAKLQkJaWYgKCFkc29fX2J1aWxkX2lkX2VxdWFsKHNlbGYsIGJ1aWxkX2lkKSkKKwkJaWYgKCFkc29fX2J1aWxkX2lkX2VxdWFsKGRzbywgYnVpbGRfaWQpKQogCQkJZ290byBvdXRfZWxmX2VuZDsKIAl9CiAKQEAgLTExMTIsMTMgKzExMTYsMTQgQEAKIAlucl9zeW1zID0gc2hkci5zaF9zaXplIC8gc2hkci5zaF9lbnRzaXplOwogCiAJbWVtc2V0KCZzeW0sIDAsIHNpemVvZihzeW0pKTsKLQlpZiAoc2VsZi0+a2VybmVsID09IERTT19UWVBFX1VTRVIpIHsKLQkJc2VsZi0+YWRqdXN0X3N5bWJvbHMgPSAoZWhkci5lX3R5cGUgPT0gRVRfRVhFQyB8fAorCWlmIChkc28tPmtlcm5lbCA9PSBEU09fVFlQRV9VU0VSKSB7CisJCWRzby0+YWRqdXN0X3N5bWJvbHMgPSAoZWhkci5lX3R5cGUgPT0gRVRfRVhFQyB8fAogCQkJCWVsZl9zZWN0aW9uX2J5X25hbWUoZWxmLCAmZWhkciwgJnNoZHIsCiAJCQkJCQkgICAgICIuZ251LnByZWxpbmtfdW5kbyIsCiAJCQkJCQkgICAgIE5VTEwpICE9IE5VTEwpOwotCX0gZWxzZSBzZWxmLT5hZGp1c3Rfc3ltYm9scyA9IDA7Ci0KKwl9IGVsc2UgeworCQlkc28tPmFkanVzdF9zeW1ib2xzID0gMDsKKwl9CiAJZWxmX3N5bXRhYl9fZm9yX2VhY2hfc3ltYm9sKHN5bXMsIG5yX3N5bXMsIGlkeCwgc3ltKSB7CiAJCXN0cnVjdCBzeW1ib2wgKmY7CiAJCWNvbnN0IGNoYXIgKmVsZl9uYW1lID0gZWxmX3N5bV9fbmFtZSgmc3ltLCBzeW1zdHJzKTsKQEAgLTExNjgsMjIgKzExNzMsMjIgQEAKIAkJICAgIChzeW0uc3RfdmFsdWUgJiAxKSkKIAkJCS0tc3ltLnN0X3ZhbHVlOwogCi0JCWlmIChzZWxmLT5rZXJuZWwgIT0gRFNPX1RZUEVfVVNFUiB8fCBrbW9kdWxlKSB7CisJCWlmIChkc28tPmtlcm5lbCAhPSBEU09fVFlQRV9VU0VSIHx8IGttb2R1bGUpIHsKIAkJCWNoYXIgZHNvX25hbWVbUEFUSF9NQVhdOwogCiAJCQlpZiAoc3RyY21wKHNlY3Rpb25fbmFtZSwKIAkJCQkgICAoY3Vycl9kc28tPnNob3J0X25hbWUgKwotCQkJCSAgICBzZWxmLT5zaG9ydF9uYW1lX2xlbikpID09IDApCisJCQkJICAgIGRzby0+c2hvcnRfbmFtZV9sZW4pKSA9PSAwKQogCQkJCWdvdG8gbmV3X3N5bWJvbDsKIAogCQkJaWYgKHN0cmNtcChzZWN0aW9uX25hbWUsICIudGV4dCIpID09IDApIHsKIAkJCQljdXJyX21hcCA9IG1hcDsKLQkJCQljdXJyX2RzbyA9IHNlbGY7CisJCQkJY3Vycl9kc28gPSBkc287CiAJCQkJZ290byBuZXdfc3ltYm9sOwogCQkJfQogCiAJCQlzbnByaW50Zihkc29fbmFtZSwgc2l6ZW9mKGRzb19uYW1lKSwKLQkJCQkgIiVzJXMiLCBzZWxmLT5zaG9ydF9uYW1lLCBzZWN0aW9uX25hbWUpOworCQkJCSAiJXMlcyIsIGRzby0+c2hvcnRfbmFtZSwgc2VjdGlvbl9uYW1lKTsKIAogCQkJY3Vycl9tYXAgPSBtYXBfZ3JvdXBzX19maW5kX2J5X25hbWUoa21hcC0+a21hcHMsIG1hcC0+dHlwZSwgZHNvX25hbWUpOwogCQkJaWYgKGN1cnJfbWFwID09IE5VTEwpIHsKQEAgLTExOTUsOSArMTIwMCw5IEBACiAJCQkJY3Vycl9kc28gPSBkc29fX25ldyhkc29fbmFtZSk7CiAJCQkJaWYgKGN1cnJfZHNvID09IE5VTEwpCiAJCQkJCWdvdG8gb3V0X2VsZl9lbmQ7Ci0JCQkJY3Vycl9kc28tPmtlcm5lbCA9IHNlbGYtPmtlcm5lbDsKLQkJCQljdXJyX2Rzby0+bG9uZ19uYW1lID0gc2VsZi0+bG9uZ19uYW1lOwotCQkJCWN1cnJfZHNvLT5sb25nX25hbWVfbGVuID0gc2VsZi0+bG9uZ19uYW1lX2xlbjsKKwkJCQljdXJyX2Rzby0+a2VybmVsID0gZHNvLT5rZXJuZWw7CisJCQkJY3Vycl9kc28tPmxvbmdfbmFtZSA9IGRzby0+bG9uZ19uYW1lOworCQkJCWN1cnJfZHNvLT5sb25nX25hbWVfbGVuID0gZHNvLT5sb25nX25hbWVfbGVuOwogCQkJCWN1cnJfbWFwID0gbWFwX19uZXcyKHN0YXJ0LCBjdXJyX2RzbywKIAkJCQkJCSAgICAgbWFwLT50eXBlKTsKIAkJCQlpZiAoY3Vycl9tYXAgPT0gTlVMTCkgewpAQCAtMTIwNiw5ICsxMjExLDkgQEAKIAkJCQl9CiAJCQkJY3Vycl9tYXAtPm1hcF9pcCA9IGlkZW50aXR5X19tYXBfaXA7CiAJCQkJY3Vycl9tYXAtPnVubWFwX2lwID0gaWRlbnRpdHlfX21hcF9pcDsKLQkJCQljdXJyX2Rzby0+c3ltdGFiX3R5cGUgPSBzZWxmLT5zeW10YWJfdHlwZTsKKwkJCQljdXJyX2Rzby0+c3ltdGFiX3R5cGUgPSBkc28tPnN5bXRhYl90eXBlOwogCQkJCW1hcF9ncm91cHNfX2luc2VydChrbWFwLT5rbWFwcywgY3Vycl9tYXApOwotCQkJCWRzb3NfX2FkZCgmc2VsZi0+bm9kZSwgY3Vycl9kc28pOworCQkJCWRzb3NfX2FkZCgmZHNvLT5ub2RlLCBjdXJyX2Rzbyk7CiAJCQkJZHNvX19zZXRfbG9hZGVkKGN1cnJfZHNvLCBtYXAtPnR5cGUpOwogCQkJfSBlbHNlCiAJCQkJY3Vycl9kc28gPSBjdXJyX21hcC0+ZHNvOwpAQCAtMTI1MCw3ICsxMjU1LDcgQEAKIAkgKiBGb3IgbWlzYW5ub3RhdGVkLCB6ZXJvZWQsIEFTTSBmdW5jdGlvbiBzaXplcy4KIAkgKi8KIAlpZiAobnIgPiAwKSB7Ci0JCXN5bWJvbHNfX2ZpeHVwX2VuZCgmc2VsZi0+c3ltYm9sc1ttYXAtPnR5cGVdKTsKKwkJc3ltYm9sc19fZml4dXBfZW5kKCZkc28tPnN5bWJvbHNbbWFwLT50eXBlXSk7CiAJCWlmIChrbWFwKSB7CiAJCQkvKgogCQkJICogV2UgbmVlZCB0byBmaXh1cCB0aGlzIGhlcmUgdG9vIGJlY2F1c2Ugd2UgY3JlYXRlIG5ldwpAQCAtMTI2Niw5ICsxMjcxLDkgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgYm9vbCBkc29fX2J1aWxkX2lkX2VxdWFsKGNvbnN0IHN0cnVjdCBkc28gKnNlbGYsIHU4ICpidWlsZF9pZCkKK3N0YXRpYyBib29sIGRzb19fYnVpbGRfaWRfZXF1YWwoY29uc3Qgc3RydWN0IGRzbyAqZHNvLCB1OCAqYnVpbGRfaWQpCiB7Ci0JcmV0dXJuIG1lbWNtcChzZWxmLT5idWlsZF9pZCwgYnVpbGRfaWQsIHNpemVvZihzZWxmLT5idWlsZF9pZCkpID09IDA7CisJcmV0dXJuIG1lbWNtcChkc28tPmJ1aWxkX2lkLCBidWlsZF9pZCwgc2l6ZW9mKGRzby0+YnVpbGRfaWQpKSA9PSAwOwogfQogCiBib29sIF9fZHNvc19fcmVhZF9idWlsZF9pZHMoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgYm9vbCB3aXRoX2hpdHMpCkBAIC0xNDI5LDcgKzE0MzQsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWNoYXIgZHNvX19zeW10YWJfb3JpZ2luKGNvbnN0IHN0cnVjdCBkc28gKnNlbGYpCitjaGFyIGRzb19fc3ltdGFiX29yaWdpbihjb25zdCBzdHJ1Y3QgZHNvICpkc28pCiB7CiAJc3RhdGljIGNvbnN0IGNoYXIgb3JpZ2luW10gPSB7CiAJCVtTWU1UQUJfX0tBTExTWU1TXQkgICAgICA9ICdrJywKQEAgLTE0NDQsMTIgKzE0NDksMTIgQEAKIAkJW1NZTVRBQl9fR1VFU1RfS01PRFVMRV0JICAgICAgPSAgJ0cnLAogCX07CiAKLQlpZiAoc2VsZiA9PSBOVUxMIHx8IHNlbGYtPnN5bXRhYl90eXBlID09IFNZTVRBQl9fTk9UX0ZPVU5EKQorCWlmIChkc28gPT0gTlVMTCB8fCBkc28tPnN5bXRhYl90eXBlID09IFNZTVRBQl9fTk9UX0ZPVU5EKQogCQlyZXR1cm4gJyEnOwotCXJldHVybiBvcmlnaW5bc2VsZi0+c3ltdGFiX3R5cGVdOworCXJldHVybiBvcmlnaW5bZHNvLT5zeW10YWJfdHlwZV07CiB9CiAKLWludCBkc29fX2xvYWQoc3RydWN0IGRzbyAqc2VsZiwgc3RydWN0IG1hcCAqbWFwLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQoraW50IGRzb19fbG9hZChzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBtYXAgKm1hcCwgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKIHsKIAlpbnQgc2l6ZSA9IFBBVEhfTUFYOwogCWNoYXIgKm5hbWU7CkBAIC0xNDU5LDEyICsxNDY0LDEyIEBACiAJY29uc3QgY2hhciAqcm9vdF9kaXI7CiAJaW50IHdhbnRfc3ltdGFiOwogCi0JZHNvX19zZXRfbG9hZGVkKHNlbGYsIG1hcC0+dHlwZSk7CisJZHNvX19zZXRfbG9hZGVkKGRzbywgbWFwLT50eXBlKTsKIAotCWlmIChzZWxmLT5rZXJuZWwgPT0gRFNPX1RZUEVfS0VSTkVMKQotCQlyZXR1cm4gZHNvX19sb2FkX2tlcm5lbF9zeW0oc2VsZiwgbWFwLCBmaWx0ZXIpOwotCWVsc2UgaWYgKHNlbGYtPmtlcm5lbCA9PSBEU09fVFlQRV9HVUVTVF9LRVJORUwpCi0JCXJldHVybiBkc29fX2xvYWRfZ3Vlc3Rfa2VybmVsX3N5bShzZWxmLCBtYXAsIGZpbHRlcik7CisJaWYgKGRzby0+a2VybmVsID09IERTT19UWVBFX0tFUk5FTCkKKwkJcmV0dXJuIGRzb19fbG9hZF9rZXJuZWxfc3ltKGRzbywgbWFwLCBmaWx0ZXIpOworCWVsc2UgaWYgKGRzby0+a2VybmVsID09IERTT19UWVBFX0dVRVNUX0tFUk5FTCkKKwkJcmV0dXJuIGRzb19fbG9hZF9ndWVzdF9rZXJuZWxfc3ltKGRzbywgbWFwLCBmaWx0ZXIpOwogCiAJaWYgKG1hcC0+Z3JvdXBzICYmIG1hcC0+Z3JvdXBzLT5tYWNoaW5lKQogCQltYWNoaW5lID0gbWFwLT5ncm91cHMtPm1hY2hpbmU7CkBAIC0xNDc1LDExICsxNDgwLDExIEBACiAJaWYgKCFuYW1lKQogCQlyZXR1cm4gLTE7CiAKLQlzZWxmLT5hZGp1c3Rfc3ltYm9scyA9IDA7CisJZHNvLT5hZGp1c3Rfc3ltYm9scyA9IDA7CiAKLQlpZiAoc3RybmNtcChzZWxmLT5uYW1lLCAiL3RtcC9wZXJmLSIsIDEwKSA9PSAwKSB7Ci0JCXJldCA9IGRzb19fbG9hZF9wZXJmX21hcChzZWxmLCBtYXAsIGZpbHRlcik7Ci0JCXNlbGYtPnN5bXRhYl90eXBlID0gcmV0ID4gMCA/IFNZTVRBQl9fSkFWQV9KSVQgOgorCWlmIChzdHJuY21wKGRzby0+bmFtZSwgIi90bXAvcGVyZi0iLCAxMCkgPT0gMCkgeworCQlyZXQgPSBkc29fX2xvYWRfcGVyZl9tYXAoZHNvLCBtYXAsIGZpbHRlcik7CisJCWRzby0+c3ltdGFiX3R5cGUgPSByZXQgPiAwID8gU1lNVEFCX19KQVZBX0pJVCA6CiAJCQkJCSAgICAgIFNZTVRBQl9fTk9UX0ZPVU5EOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTE0OTAsMzMgKzE0OTUsMzMgQEAKIAkgKi8KIAl3YW50X3N5bXRhYiA9IDE7CiByZXN0YXJ0OgotCWZvciAoc2VsZi0+c3ltdGFiX3R5cGUgPSBTWU1UQUJfX0JVSUxEX0lEX0NBQ0hFOwotCSAgICAgc2VsZi0+c3ltdGFiX3R5cGUgIT0gU1lNVEFCX19OT1RfRk9VTkQ7Ci0JICAgICBzZWxmLT5zeW10YWJfdHlwZSsrKSB7Ci0JCXN3aXRjaCAoc2VsZi0+c3ltdGFiX3R5cGUpIHsKKwlmb3IgKGRzby0+c3ltdGFiX3R5cGUgPSBTWU1UQUJfX0JVSUxEX0lEX0NBQ0hFOworCSAgICAgZHNvLT5zeW10YWJfdHlwZSAhPSBTWU1UQUJfX05PVF9GT1VORDsKKwkgICAgIGRzby0+c3ltdGFiX3R5cGUrKykgeworCQlzd2l0Y2ggKGRzby0+c3ltdGFiX3R5cGUpIHsKIAkJY2FzZSBTWU1UQUJfX0JVSUxEX0lEX0NBQ0hFOgogCQkJLyogc2tpcCB0aGUgbG9jYWxseSBjb25maWd1cmVkIGNhY2hlIGlmIGEgc3ltZnMgaXMgZ2l2ZW4gKi8KIAkJCWlmIChzeW1ib2xfY29uZi5zeW1mc1swXSB8fAotCQkJICAgIChkc29fX2J1aWxkX2lkX2ZpbGVuYW1lKHNlbGYsIG5hbWUsIHNpemUpID09IE5VTEwpKSB7CisJCQkgICAgKGRzb19fYnVpbGRfaWRfZmlsZW5hbWUoZHNvLCBuYW1lLCBzaXplKSA9PSBOVUxMKSkgewogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgU1lNVEFCX19GRURPUkFfREVCVUdJTkZPOgogCQkJc25wcmludGYobmFtZSwgc2l6ZSwgIiVzL3Vzci9saWIvZGVidWclcy5kZWJ1ZyIsCi0JCQkJIHN5bWJvbF9jb25mLnN5bWZzLCBzZWxmLT5sb25nX25hbWUpOworCQkJCSBzeW1ib2xfY29uZi5zeW1mcywgZHNvLT5sb25nX25hbWUpOwogCQkJYnJlYWs7CiAJCWNhc2UgU1lNVEFCX19VQlVOVFVfREVCVUdJTkZPOgogCQkJc25wcmludGYobmFtZSwgc2l6ZSwgIiVzL3Vzci9saWIvZGVidWclcyIsCi0JCQkJIHN5bWJvbF9jb25mLnN5bWZzLCBzZWxmLT5sb25nX25hbWUpOworCQkJCSBzeW1ib2xfY29uZi5zeW1mcywgZHNvLT5sb25nX25hbWUpOwogCQkJYnJlYWs7CiAJCWNhc2UgU1lNVEFCX19CVUlMRElEX0RFQlVHSU5GTzogewogCQkJY2hhciBidWlsZF9pZF9oZXhbQlVJTERfSURfU0laRSAqIDIgKyAxXTsKIAotCQkJaWYgKCFzZWxmLT5oYXNfYnVpbGRfaWQpCisJCQlpZiAoIWRzby0+aGFzX2J1aWxkX2lkKQogCQkJCWNvbnRpbnVlOwogCi0JCQlidWlsZF9pZF9fc3ByaW50ZihzZWxmLT5idWlsZF9pZCwKLQkJCQkJICBzaXplb2Yoc2VsZi0+YnVpbGRfaWQpLAorCQkJYnVpbGRfaWRfX3NwcmludGYoZHNvLT5idWlsZF9pZCwKKwkJCQkJICBzaXplb2YoZHNvLT5idWlsZF9pZCksCiAJCQkJCSAgYnVpbGRfaWRfaGV4KTsKIAkJCXNucHJpbnRmKG5hbWUsIHNpemUsCiAJCQkJICIlcy91c3IvbGliL2RlYnVnLy5idWlsZC1pZC8lLjJzLyVzLmRlYnVnIiwKQEAgLTE1MjUsNyArMTUzMCw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBTWU1UQUJfX1NZU1RFTV9QQVRIX0RTTzoKIAkJCXNucHJpbnRmKG5hbWUsIHNpemUsICIlcyVzIiwKLQkJCSAgICAgc3ltYm9sX2NvbmYuc3ltZnMsIHNlbGYtPmxvbmdfbmFtZSk7CisJCQkgICAgIHN5bWJvbF9jb25mLnN5bWZzLCBkc28tPmxvbmdfbmFtZSk7CiAJCQlicmVhazsKIAkJY2FzZSBTWU1UQUJfX0dVRVNUX0tNT0RVTEU6CiAJCQlpZiAobWFwLT5ncm91cHMgJiYgbWFjaGluZSkKQEAgLTE1MzMsMTIgKzE1MzgsMTIgQEAKIAkJCWVsc2UKIAkJCQlyb290X2RpciA9ICIiOwogCQkJc25wcmludGYobmFtZSwgc2l6ZSwgIiVzJXMlcyIsIHN5bWJvbF9jb25mLnN5bWZzLAotCQkJCSByb290X2Rpciwgc2VsZi0+bG9uZ19uYW1lKTsKKwkJCQkgcm9vdF9kaXIsIGRzby0+bG9uZ19uYW1lKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgU1lNVEFCX19TWVNURU1fUEFUSF9LTU9EVUxFOgogCQkJc25wcmludGYobmFtZSwgc2l6ZSwgIiVzJXMiLCBzeW1ib2xfY29uZi5zeW1mcywKLQkJCQkgc2VsZi0+bG9uZ19uYW1lKTsKKwkJCQkgZHNvLT5sb25nX25hbWUpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6OwogCQl9CkBAIC0xNTQ4LDcgKzE1NTMsNyBAQAogCQlpZiAoZmQgPCAwKQogCQkJY29udGludWU7CiAKLQkJcmV0ID0gZHNvX19sb2FkX3N5bShzZWxmLCBtYXAsIG5hbWUsIGZkLCBmaWx0ZXIsIDAsCisJCXJldCA9IGRzb19fbG9hZF9zeW0oZHNvLCBtYXAsIG5hbWUsIGZkLCBmaWx0ZXIsIDAsCiAJCQkJICAgIHdhbnRfc3ltdGFiKTsKIAkJY2xvc2UoZmQpOwogCkBAIC0xNTYwLDcgKzE1NjUsOCBAQAogCQkJY29udGludWU7CiAKIAkJaWYgKHJldCA+IDApIHsKLQkJCWludCBucl9wbHQgPSBkc29fX3N5bnRoZXNpemVfcGx0X3N5bWJvbHMoc2VsZiwgbWFwLCBmaWx0ZXIpOworCQkJaW50IG5yX3BsdCA9IGRzb19fc3ludGhlc2l6ZV9wbHRfc3ltYm9scyhkc28sIG1hcCwKKwkJCQkJCQkJIGZpbHRlcik7CiAJCQlpZiAobnJfcGx0ID4gMCkKIAkJCQlyZXQgKz0gbnJfcGx0OwogCQkJYnJlYWs7CkBAIC0xNTc3LDE3ICsxNTgzLDE3IEBACiAJfQogCiAJZnJlZShuYW1lKTsKLQlpZiAocmV0IDwgMCAmJiBzdHJzdHIoc2VsZi0+bmFtZSwgIiAoZGVsZXRlZCkiKSAhPSBOVUxMKQorCWlmIChyZXQgPCAwICYmIHN0cnN0cihkc28tPm5hbWUsICIgKGRlbGV0ZWQpIikgIT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RydWN0IG1hcCAqbWFwX2dyb3Vwc19fZmluZF9ieV9uYW1lKHN0cnVjdCBtYXBfZ3JvdXBzICpzZWxmLAorc3RydWN0IG1hcCAqbWFwX2dyb3Vwc19fZmluZF9ieV9uYW1lKHN0cnVjdCBtYXBfZ3JvdXBzICptZywKIAkJCQkgICAgIGVudW0gbWFwX3R5cGUgdHlwZSwgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqbmQ7CiAKLQlmb3IgKG5kID0gcmJfZmlyc3QoJnNlbGYtPm1hcHNbdHlwZV0pOyBuZDsgbmQgPSByYl9uZXh0KG5kKSkgeworCWZvciAobmQgPSByYl9maXJzdCgmbWctPm1hcHNbdHlwZV0pOyBuZDsgbmQgPSByYl9uZXh0KG5kKSkgewogCQlzdHJ1Y3QgbWFwICptYXAgPSByYl9lbnRyeShuZCwgc3RydWN0IG1hcCwgcmJfbm9kZSk7CiAKIAkJaWYgKG1hcC0+ZHNvICYmIHN0cmNtcChtYXAtPmRzby0+c2hvcnRfbmFtZSwgbmFtZSkgPT0gMCkKQEAgLTE1OTcsMjggKzE2MDMsMjggQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGludCBkc29fX2tlcm5lbF9tb2R1bGVfZ2V0X2J1aWxkX2lkKHN0cnVjdCBkc28gKnNlbGYsCi0JCQkJY29uc3QgY2hhciAqcm9vdF9kaXIpCitzdGF0aWMgaW50IGRzb19fa2VybmVsX21vZHVsZV9nZXRfYnVpbGRfaWQoc3RydWN0IGRzbyAqZHNvLAorCQkJCQkgICBjb25zdCBjaGFyICpyb290X2RpcikKIHsKIAljaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKIAkvKgogCSAqIGtlcm5lbCBtb2R1bGUgc2hvcnQgbmFtZXMgYXJlIG9mIHRoZSBmb3JtICJbbW9kdWxlXSIgYW5kCiAJICogd2UgbmVlZCBqdXN0ICJtb2R1bGUiIGhlcmUuCiAJICovCi0JY29uc3QgY2hhciAqbmFtZSA9IHNlbGYtPnNob3J0X25hbWUgKyAxOworCWNvbnN0IGNoYXIgKm5hbWUgPSBkc28tPnNob3J0X25hbWUgKyAxOwogCiAJc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksCiAJCSAiJXMvc3lzL21vZHVsZS8lLipzL25vdGVzLy5ub3RlLmdudS5idWlsZC1pZCIsCiAJCSByb290X2RpciwgKGludClzdHJsZW4obmFtZSkgLSAxLCBuYW1lKTsKIAotCWlmIChzeXNmc19fcmVhZF9idWlsZF9pZChmaWxlbmFtZSwgc2VsZi0+YnVpbGRfaWQsCi0JCQkJIHNpemVvZihzZWxmLT5idWlsZF9pZCkpID09IDApCi0JCXNlbGYtPmhhc19idWlsZF9pZCA9IHRydWU7CisJaWYgKHN5c2ZzX19yZWFkX2J1aWxkX2lkKGZpbGVuYW1lLCBkc28tPmJ1aWxkX2lkLAorCQkJCSBzaXplb2YoZHNvLT5idWlsZF9pZCkpID09IDApCisJCWRzby0+aGFzX2J1aWxkX2lkID0gdHJ1ZTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1hcF9ncm91cHNfX3NldF9tb2R1bGVzX3BhdGhfZGlyKHN0cnVjdCBtYXBfZ3JvdXBzICpzZWxmLAorc3RhdGljIGludCBtYXBfZ3JvdXBzX19zZXRfbW9kdWxlc19wYXRoX2RpcihzdHJ1Y3QgbWFwX2dyb3VwcyAqbWcsCiAJCQkJY29uc3QgY2hhciAqZGlyX25hbWUpCiB7CiAJc3RydWN0IGRpcmVudCAqZGVudDsKQEAgLTE2NDYsNyArMTY1Miw3IEBACiAKIAkJCXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIiVzLyVzIiwKIAkJCQkgZGlyX25hbWUsIGRlbnQtPmRfbmFtZSk7Ci0JCQlyZXQgPSBtYXBfZ3JvdXBzX19zZXRfbW9kdWxlc19wYXRoX2RpcihzZWxmLCBwYXRoKTsKKwkJCXJldCA9IG1hcF9ncm91cHNfX3NldF9tb2R1bGVzX3BhdGhfZGlyKG1nLCBwYXRoKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCWdvdG8gb3V0OwogCQl9IGVsc2UgewpAQCAtMTY2MSw3ICsxNjY3LDggQEAKIAkJCQkgKGludCkoZG90IC0gZGVudC0+ZF9uYW1lKSwgZGVudC0+ZF9uYW1lKTsKIAogCQkJc3RyeGZyY2hhcihkc29fbmFtZSwgJy0nLCAnXycpOwotCQkJbWFwID0gbWFwX2dyb3Vwc19fZmluZF9ieV9uYW1lKHNlbGYsIE1BUF9fRlVOQ1RJT04sIGRzb19uYW1lKTsKKwkJCW1hcCA9IG1hcF9ncm91cHNfX2ZpbmRfYnlfbmFtZShtZywgTUFQX19GVU5DVElPTiwKKwkJCQkJCSAgICAgICBkc29fbmFtZSk7CiAJCQlpZiAobWFwID09IE5VTEwpCiAJCQkJY29udGludWU7CiAKQEAgLTE3MTEsMjAgKzE3MTgsMjAgQEAKIAlyZXR1cm4gc3RyZHVwKG5hbWUpOwogfQogCi1zdGF0aWMgaW50IG1hY2hpbmVfX3NldF9tb2R1bGVzX3BhdGgoc3RydWN0IG1hY2hpbmUgKnNlbGYpCitzdGF0aWMgaW50IG1hY2hpbmVfX3NldF9tb2R1bGVzX3BhdGgoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCiB7CiAJY2hhciAqdmVyc2lvbjsKIAljaGFyIG1vZHVsZXNfcGF0aFtQQVRIX01BWF07CiAKLQl2ZXJzaW9uID0gZ2V0X2tlcm5lbF92ZXJzaW9uKHNlbGYtPnJvb3RfZGlyKTsKKwl2ZXJzaW9uID0gZ2V0X2tlcm5lbF92ZXJzaW9uKG1hY2hpbmUtPnJvb3RfZGlyKTsKIAlpZiAoIXZlcnNpb24pCiAJCXJldHVybiAtMTsKIAogCXNucHJpbnRmKG1vZHVsZXNfcGF0aCwgc2l6ZW9mKG1vZHVsZXNfcGF0aCksICIlcy9saWIvbW9kdWxlcy8lcy9rZXJuZWwiLAotCQkgc2VsZi0+cm9vdF9kaXIsIHZlcnNpb24pOworCQkgbWFjaGluZS0+cm9vdF9kaXIsIHZlcnNpb24pOwogCWZyZWUodmVyc2lvbik7CiAKLQlyZXR1cm4gbWFwX2dyb3Vwc19fc2V0X21vZHVsZXNfcGF0aF9kaXIoJnNlbGYtPmttYXBzLCBtb2R1bGVzX3BhdGgpOworCXJldHVybiBtYXBfZ3JvdXBzX19zZXRfbW9kdWxlc19wYXRoX2RpcigmbWFjaGluZS0+a21hcHMsIG1vZHVsZXNfcGF0aCk7CiB9CiAKIC8qCkBAIC0xNzM0LDIzICsxNzQxLDIzIEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3QgbWFwICptYXBfX25ldzIodTY0IHN0YXJ0LCBzdHJ1Y3QgZHNvICpkc28sIGVudW0gbWFwX3R5cGUgdHlwZSkKIHsKLQlzdHJ1Y3QgbWFwICpzZWxmID0gY2FsbG9jKDEsIChzaXplb2YoKnNlbGYpICsKLQkJCQkgICAgICAoZHNvLT5rZXJuZWwgPyBzaXplb2Yoc3RydWN0IGttYXApIDogMCkpKTsKLQlpZiAoc2VsZiAhPSBOVUxMKSB7CisJc3RydWN0IG1hcCAqbWFwID0gY2FsbG9jKDEsIChzaXplb2YoKm1hcCkgKworCQkJCSAgICAgKGRzby0+a2VybmVsID8gc2l6ZW9mKHN0cnVjdCBrbWFwKSA6IDApKSk7CisJaWYgKG1hcCAhPSBOVUxMKSB7CiAJCS8qCiAJCSAqIC0+ZW5kIHdpbGwgYmUgZmlsbGVkIGFmdGVyIHdlIGxvYWQgYWxsIHRoZSBzeW1ib2xzCiAJCSAqLwotCQltYXBfX2luaXQoc2VsZiwgdHlwZSwgc3RhcnQsIDAsIDAsIGRzbyk7CisJCW1hcF9faW5pdChtYXAsIHR5cGUsIHN0YXJ0LCAwLCAwLCBkc28pOwogCX0KIAotCXJldHVybiBzZWxmOworCXJldHVybiBtYXA7CiB9CiAKLXN0cnVjdCBtYXAgKm1hY2hpbmVfX25ld19tb2R1bGUoc3RydWN0IG1hY2hpbmUgKnNlbGYsIHU2NCBzdGFydCwKK3N0cnVjdCBtYXAgKm1hY2hpbmVfX25ld19tb2R1bGUoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIHU2NCBzdGFydCwKIAkJCQljb25zdCBjaGFyICpmaWxlbmFtZSkKIHsKIAlzdHJ1Y3QgbWFwICptYXA7Ci0Jc3RydWN0IGRzbyAqZHNvID0gX19kc29zX19maW5kbmV3KCZzZWxmLT5rZXJuZWxfZHNvcywgZmlsZW5hbWUpOworCXN0cnVjdCBkc28gKmRzbyA9IF9fZHNvc19fZmluZG5ldygmbWFjaGluZS0+a2VybmVsX2Rzb3MsIGZpbGVuYW1lKTsKIAogCWlmIChkc28gPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CkBAIC0xNzU5LDE1ICsxNzY2LDE1IEBACiAJaWYgKG1hcCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmIChtYWNoaW5lX19pc19ob3N0KHNlbGYpKQorCWlmIChtYWNoaW5lX19pc19ob3N0KG1hY2hpbmUpKQogCQlkc28tPnN5bXRhYl90eXBlID0gU1lNVEFCX19TWVNURU1fUEFUSF9LTU9EVUxFOwogCWVsc2UKIAkJZHNvLT5zeW10YWJfdHlwZSA9IFNZTVRBQl9fR1VFU1RfS01PRFVMRTsKLQltYXBfZ3JvdXBzX19pbnNlcnQoJnNlbGYtPmttYXBzLCBtYXApOworCW1hcF9ncm91cHNfX2luc2VydCgmbWFjaGluZS0+a21hcHMsIG1hcCk7CiAJcmV0dXJuIG1hcDsKIH0KIAotc3RhdGljIGludCBtYWNoaW5lX19jcmVhdGVfbW9kdWxlcyhzdHJ1Y3QgbWFjaGluZSAqc2VsZikKK3N0YXRpYyBpbnQgbWFjaGluZV9fY3JlYXRlX21vZHVsZXMoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCiB7CiAJY2hhciAqbGluZSA9IE5VTEw7CiAJc2l6ZV90IG47CkBAIC0xNzc2LDEwICsxNzgzLDEwIEBACiAJY29uc3QgY2hhciAqbW9kdWxlczsKIAljaGFyIHBhdGhbUEFUSF9NQVhdOwogCi0JaWYgKG1hY2hpbmVfX2lzX2RlZmF1bHRfZ3Vlc3Qoc2VsZikpCisJaWYgKG1hY2hpbmVfX2lzX2RlZmF1bHRfZ3Vlc3QobWFjaGluZSkpCiAJCW1vZHVsZXMgPSBzeW1ib2xfY29uZi5kZWZhdWx0X2d1ZXN0X21vZHVsZXM7CiAJZWxzZSB7Ci0JCXNwcmludGYocGF0aCwgIiVzL3Byb2MvbW9kdWxlcyIsIHNlbGYtPnJvb3RfZGlyKTsKKwkJc3ByaW50ZihwYXRoLCAiJXMvcHJvYy9tb2R1bGVzIiwgbWFjaGluZS0+cm9vdF9kaXIpOwogCQltb2R1bGVzID0gcGF0aDsKIAl9CiAKQEAgLTE4MTUsMTYgKzE4MjIsMTYgQEAKIAkJKnNlcCA9ICdcMCc7CiAKIAkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiWyVzXSIsIGxpbmUpOwotCQltYXAgPSBtYWNoaW5lX19uZXdfbW9kdWxlKHNlbGYsIHN0YXJ0LCBuYW1lKTsKKwkJbWFwID0gbWFjaGluZV9fbmV3X21vZHVsZShtYWNoaW5lLCBzdGFydCwgbmFtZSk7CiAJCWlmIChtYXAgPT0gTlVMTCkKIAkJCWdvdG8gb3V0X2RlbGV0ZV9saW5lOwotCQlkc29fX2tlcm5lbF9tb2R1bGVfZ2V0X2J1aWxkX2lkKG1hcC0+ZHNvLCBzZWxmLT5yb290X2Rpcik7CisJCWRzb19fa2VybmVsX21vZHVsZV9nZXRfYnVpbGRfaWQobWFwLT5kc28sIG1hY2hpbmUtPnJvb3RfZGlyKTsKIAl9CiAKIAlmcmVlKGxpbmUpOwogCWZjbG9zZShmaWxlKTsKIAotCXJldHVybiBtYWNoaW5lX19zZXRfbW9kdWxlc19wYXRoKHNlbGYpOworCXJldHVybiBtYWNoaW5lX19zZXRfbW9kdWxlc19wYXRoKG1hY2hpbmUpOwogCiBvdXRfZGVsZXRlX2xpbmU6CiAJZnJlZShsaW5lKTsKQEAgLTE4MzIsNyArMTgzOSw3IEBACiAJcmV0dXJuIC0xOwogfQogCi1pbnQgZHNvX19sb2FkX3ZtbGludXgoc3RydWN0IGRzbyAqc2VsZiwgc3RydWN0IG1hcCAqbWFwLAoraW50IGRzb19fbG9hZF92bWxpbnV4KHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLAogCQkgICAgICBjb25zdCBjaGFyICp2bWxpbnV4LCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQogewogCWludCBlcnIgPSAtMSwgZmQ7CkBAIC0xODQ0LDkgKzE4NTEsOSBAQAogCWlmIChmZCA8IDApCiAJCXJldHVybiAtMTsKIAotCWRzb19fc2V0X2xvbmdfbmFtZShzZWxmLCAoY2hhciAqKXZtbGludXgpOwotCWRzb19fc2V0X2xvYWRlZChzZWxmLCBtYXAtPnR5cGUpOwotCWVyciA9IGRzb19fbG9hZF9zeW0oc2VsZiwgbWFwLCBzeW1mc192bWxpbnV4LCBmZCwgZmlsdGVyLCAwLCAwKTsKKwlkc29fX3NldF9sb25nX25hbWUoZHNvLCAoY2hhciAqKXZtbGludXgpOworCWRzb19fc2V0X2xvYWRlZChkc28sIG1hcC0+dHlwZSk7CisJZXJyID0gZHNvX19sb2FkX3N5bShkc28sIG1hcCwgc3ltZnNfdm1saW51eCwgZmQsIGZpbHRlciwgMCwgMCk7CiAJY2xvc2UoZmQpOwogCiAJaWYgKGVyciA+IDApCkBAIC0xODU1LDcgKzE4NjIsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBkc29fX2xvYWRfdm1saW51eF9wYXRoKHN0cnVjdCBkc28gKnNlbGYsIHN0cnVjdCBtYXAgKm1hcCwKK2ludCBkc29fX2xvYWRfdm1saW51eF9wYXRoKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLAogCQkJICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKIHsKIAlpbnQgaSwgZXJyID0gMDsKQEAgLTE4NjQsMjAgKzE4NzEsMjAgQEAKIAlwcl9kZWJ1ZygiTG9va2luZyBhdCB0aGUgdm1saW51eF9wYXRoICglZCBlbnRyaWVzIGxvbmcpXG4iLAogCQkgdm1saW51eF9wYXRoX19ucl9lbnRyaWVzICsgMSk7CiAKLQlmaWxlbmFtZSA9IGRzb19fYnVpbGRfaWRfZmlsZW5hbWUoc2VsZiwgTlVMTCwgMCk7CisJZmlsZW5hbWUgPSBkc29fX2J1aWxkX2lkX2ZpbGVuYW1lKGRzbywgTlVMTCwgMCk7CiAJaWYgKGZpbGVuYW1lICE9IE5VTEwpIHsKLQkJZXJyID0gZHNvX19sb2FkX3ZtbGludXgoc2VsZiwgbWFwLCBmaWxlbmFtZSwgZmlsdGVyKTsKKwkJZXJyID0gZHNvX19sb2FkX3ZtbGludXgoZHNvLCBtYXAsIGZpbGVuYW1lLCBmaWx0ZXIpOwogCQlpZiAoZXJyID4gMCkgewotCQkJZHNvX19zZXRfbG9uZ19uYW1lKHNlbGYsIGZpbGVuYW1lKTsKKwkJCWRzb19fc2V0X2xvbmdfbmFtZShkc28sIGZpbGVuYW1lKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJCWZyZWUoZmlsZW5hbWUpOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCB2bWxpbnV4X3BhdGhfX25yX2VudHJpZXM7ICsraSkgewotCQllcnIgPSBkc29fX2xvYWRfdm1saW51eChzZWxmLCBtYXAsIHZtbGludXhfcGF0aFtpXSwgZmlsdGVyKTsKKwkJZXJyID0gZHNvX19sb2FkX3ZtbGludXgoZHNvLCBtYXAsIHZtbGludXhfcGF0aFtpXSwgZmlsdGVyKTsKIAkJaWYgKGVyciA+IDApIHsKLQkJCWRzb19fc2V0X2xvbmdfbmFtZShzZWxmLCBzdHJkdXAodm1saW51eF9wYXRoW2ldKSk7CisJCQlkc29fX3NldF9sb25nX25hbWUoZHNvLCBzdHJkdXAodm1saW51eF9wYXRoW2ldKSk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTE4ODUsNyArMTg5Miw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBkc29fX2xvYWRfa2VybmVsX3N5bShzdHJ1Y3QgZHNvICpzZWxmLCBzdHJ1Y3QgbWFwICptYXAsCitzdGF0aWMgaW50IGRzb19fbG9hZF9rZXJuZWxfc3ltKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLAogCQkJCXN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCiB7CiAJaW50IGVycjsKQEAgLTE5MTIsMTAgKzE5MTksMTAgQEAKIAl9CiAKIAlpZiAoc3ltYm9sX2NvbmYudm1saW51eF9uYW1lICE9IE5VTEwpIHsKLQkJZXJyID0gZHNvX19sb2FkX3ZtbGludXgoc2VsZiwgbWFwLAorCQllcnIgPSBkc29fX2xvYWRfdm1saW51eChkc28sIG1hcCwKIAkJCQkJc3ltYm9sX2NvbmYudm1saW51eF9uYW1lLCBmaWx0ZXIpOwogCQlpZiAoZXJyID4gMCkgewotCQkJZHNvX19zZXRfbG9uZ19uYW1lKHNlbGYsCisJCQlkc29fX3NldF9sb25nX25hbWUoZHNvLAogCQkJCQkgICBzdHJkdXAoc3ltYm9sX2NvbmYudm1saW51eF9uYW1lKSk7CiAJCQlnb3RvIG91dF9maXh1cDsKIAkJfQpAQCAtMTkyMyw3ICsxOTMwLDcgQEAKIAl9CiAKIAlpZiAodm1saW51eF9wYXRoICE9IE5VTEwpIHsKLQkJZXJyID0gZHNvX19sb2FkX3ZtbGludXhfcGF0aChzZWxmLCBtYXAsIGZpbHRlcik7CisJCWVyciA9IGRzb19fbG9hZF92bWxpbnV4X3BhdGgoZHNvLCBtYXAsIGZpbHRlcik7CiAJCWlmIChlcnIgPiAwKQogCQkJZ290byBvdXRfZml4dXA7CiAJfQpAQCAtMTkzNywxMyArMTk0NCwxMyBAQAogCSAqIHdlIGhhdmUgYSBidWlsZC1pZCwgc28gY2hlY2sgaWYgaXQgaXMgdGhlIHNhbWUgYXMgdGhlIHJ1bm5pbmcga2VybmVsLAogCSAqIHVzaW5nIGl0IGlmIGl0IGlzLgogCSAqLwotCWlmIChzZWxmLT5oYXNfYnVpbGRfaWQpIHsKKwlpZiAoZHNvLT5oYXNfYnVpbGRfaWQpIHsKIAkJdTgga2FsbHN5bXNfYnVpbGRfaWRbQlVJTERfSURfU0laRV07CiAJCWNoYXIgc2J1aWxkX2lkW0JVSUxEX0lEX1NJWkUgKiAyICsgMV07CiAKIAkJaWYgKHN5c2ZzX19yZWFkX2J1aWxkX2lkKCIvc3lzL2tlcm5lbC9ub3RlcyIsIGthbGxzeW1zX2J1aWxkX2lkLAogCQkJCQkgc2l6ZW9mKGthbGxzeW1zX2J1aWxkX2lkKSkgPT0gMCkgewotCQkJaWYgKGRzb19fYnVpbGRfaWRfZXF1YWwoc2VsZiwga2FsbHN5bXNfYnVpbGRfaWQpKSB7CisJCQlpZiAoZHNvX19idWlsZF9pZF9lcXVhbChkc28sIGthbGxzeW1zX2J1aWxkX2lkKSkgewogCQkJCWthbGxzeW1zX2ZpbGVuYW1lID0gIi9wcm9jL2thbGxzeW1zIjsKIAkJCQlnb3RvIGRvX2thbGxzeW1zOwogCQkJfQpAQCAtMTk1Miw3ICsxOTU5LDcgQEAKIAkJICogTm93IGxvb2sgaWYgd2UgaGF2ZSBpdCBvbiB0aGUgYnVpbGQtaWQgY2FjaGUgaW4KIAkJICogJEhPTUUvLmRlYnVnL1trZXJuZWwua2FsbHN5bXNdLgogCQkgKi8KLQkJYnVpbGRfaWRfX3NwcmludGYoc2VsZi0+YnVpbGRfaWQsIHNpemVvZihzZWxmLT5idWlsZF9pZCksCisJCWJ1aWxkX2lkX19zcHJpbnRmKGRzby0+YnVpbGRfaWQsIHNpemVvZihkc28tPmJ1aWxkX2lkKSwKIAkJCQkgIHNidWlsZF9pZCk7CiAKIAkJaWYgKGFzcHJpbnRmKCZrYWxsc3ltc19hbGxvY2F0ZWRfZmlsZW5hbWUsCkBAIC0xOTc5LDcgKzE5ODYsNyBAQAogCX0KIAogZG9fa2FsbHN5bXM6Ci0JZXJyID0gZHNvX19sb2FkX2thbGxzeW1zKHNlbGYsIGthbGxzeW1zX2ZpbGVuYW1lLCBtYXAsIGZpbHRlcik7CisJZXJyID0gZHNvX19sb2FkX2thbGxzeW1zKGRzbywga2FsbHN5bXNfZmlsZW5hbWUsIG1hcCwgZmlsdGVyKTsKIAlpZiAoZXJyID4gMCkKIAkJcHJfZGVidWcoIlVzaW5nICVzIGZvciBzeW1ib2xzXG4iLCBrYWxsc3ltc19maWxlbmFtZSk7CiAJZnJlZShrYWxsc3ltc19hbGxvY2F0ZWRfZmlsZW5hbWUpOwpAQCAtMTk4Nyw3ICsxOTk0LDcgQEAKIAlpZiAoZXJyID4gMCkgewogb3V0X2ZpeHVwOgogCQlpZiAoa2FsbHN5bXNfZmlsZW5hbWUgIT0gTlVMTCkKLQkJCWRzb19fc2V0X2xvbmdfbmFtZShzZWxmLCBzdHJkdXAoIltrZXJuZWwua2FsbHN5bXNdIikpOworCQkJZHNvX19zZXRfbG9uZ19uYW1lKGRzbywgc3RyZHVwKCJba2VybmVsLmthbGxzeW1zXSIpKTsKIAkJbWFwX19maXh1cF9zdGFydChtYXApOwogCQltYXBfX2ZpeHVwX2VuZChtYXApOwogCX0KQEAgLTE5OTUsOCArMjAwMiw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBkc29fX2xvYWRfZ3Vlc3Rfa2VybmVsX3N5bShzdHJ1Y3QgZHNvICpzZWxmLCBzdHJ1Y3QgbWFwICptYXAsCi0JCQkJc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKK3N0YXRpYyBpbnQgZHNvX19sb2FkX2d1ZXN0X2tlcm5lbF9zeW0oc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsCisJCQkJICAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKIHsKIAlpbnQgZXJyOwogCWNvbnN0IGNoYXIgKmthbGxzeW1zX2ZpbGVuYW1lID0gTlVMTDsKQEAgLTIwMTYsNyArMjAyMyw3IEBACiAJCSAqIE9yIHVzZSBmaWxlIGd1ZXN0X2thbGxzeW1zIGlucHV0dGVkIGJ5IHVzZXIgb24gY29tbWFuZGxpbmUKIAkJICovCiAJCWlmIChzeW1ib2xfY29uZi5kZWZhdWx0X2d1ZXN0X3ZtbGludXhfbmFtZSAhPSBOVUxMKSB7Ci0JCQllcnIgPSBkc29fX2xvYWRfdm1saW51eChzZWxmLCBtYXAsCisJCQllcnIgPSBkc29fX2xvYWRfdm1saW51eChkc28sIG1hcCwKIAkJCQlzeW1ib2xfY29uZi5kZWZhdWx0X2d1ZXN0X3ZtbGludXhfbmFtZSwgZmlsdGVyKTsKIAkJCWdvdG8gb3V0X3RyeV9maXh1cDsKIAkJfQpAQCAtMjAyOSw3ICsyMDM2LDcgQEAKIAkJa2FsbHN5bXNfZmlsZW5hbWUgPSBwYXRoOwogCX0KIAotCWVyciA9IGRzb19fbG9hZF9rYWxsc3ltcyhzZWxmLCBrYWxsc3ltc19maWxlbmFtZSwgbWFwLCBmaWx0ZXIpOworCWVyciA9IGRzb19fbG9hZF9rYWxsc3ltcyhkc28sIGthbGxzeW1zX2ZpbGVuYW1lLCBtYXAsIGZpbHRlcik7CiAJaWYgKGVyciA+IDApCiAJCXByX2RlYnVnKCJVc2luZyAlcyBmb3Igc3ltYm9sc1xuIiwga2FsbHN5bXNfZmlsZW5hbWUpOwogCkBAIC0yMDM3LDcgKzIwNDQsNyBAQAogCWlmIChlcnIgPiAwKSB7CiAJCWlmIChrYWxsc3ltc19maWxlbmFtZSAhPSBOVUxMKSB7CiAJCQltYWNoaW5lX19tbWFwX25hbWUobWFjaGluZSwgcGF0aCwgc2l6ZW9mKHBhdGgpKTsKLQkJCWRzb19fc2V0X2xvbmdfbmFtZShzZWxmLCBzdHJkdXAocGF0aCkpOworCQkJZHNvX19zZXRfbG9uZ19uYW1lKGRzbywgc3RyZHVwKHBhdGgpKTsKIAkJfQogCQltYXBfX2ZpeHVwX3N0YXJ0KG1hcCk7CiAJCW1hcF9fZml4dXBfZW5kKG1hcCk7CkBAIC0yMDkwLDEyICsyMDk3LDEyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc2l6ZV90IG1hY2hpbmVzX19mcHJpbnRmX2Rzb3Moc3RydWN0IHJiX3Jvb3QgKnNlbGYsIEZJTEUgKmZwKQorc2l6ZV90IG1hY2hpbmVzX19mcHJpbnRmX2Rzb3Moc3RydWN0IHJiX3Jvb3QgKm1hY2hpbmVzLCBGSUxFICpmcCkKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqbmQ7CiAJc2l6ZV90IHJldCA9IDA7CiAKLQlmb3IgKG5kID0gcmJfZmlyc3Qoc2VsZik7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7CisJZm9yIChuZCA9IHJiX2ZpcnN0KG1hY2hpbmVzKTsgbmQ7IG5kID0gcmJfbmV4dChuZCkpIHsKIAkJc3RydWN0IG1hY2hpbmUgKnBvcyA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3QgbWFjaGluZSwgcmJfbm9kZSk7CiAJCXJldCArPSBfX2Rzb3NfX2ZwcmludGYoJnBvcy0+a2VybmVsX2Rzb3MsIGZwKTsKIAkJcmV0ICs9IF9fZHNvc19fZnByaW50ZigmcG9zLT51c2VyX2Rzb3MsIGZwKTsKQEAgLTIxMTksMTggKzIxMjYsMjAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zaXplX3QgbWFjaGluZV9fZnByaW50Zl9kc29zX2J1aWxkaWQoc3RydWN0IG1hY2hpbmUgKnNlbGYsIEZJTEUgKmZwLCBib29sIHdpdGhfaGl0cykKK3NpemVfdCBtYWNoaW5lX19mcHJpbnRmX2Rzb3NfYnVpbGRpZChzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgRklMRSAqZnAsCisJCQkJICAgICBib29sIHdpdGhfaGl0cykKIHsKLQlyZXR1cm4gX19kc29zX19mcHJpbnRmX2J1aWxkaWQoJnNlbGYtPmtlcm5lbF9kc29zLCBmcCwgd2l0aF9oaXRzKSArCi0JICAgICAgIF9fZHNvc19fZnByaW50Zl9idWlsZGlkKCZzZWxmLT51c2VyX2Rzb3MsIGZwLCB3aXRoX2hpdHMpOworCXJldHVybiBfX2Rzb3NfX2ZwcmludGZfYnVpbGRpZCgmbWFjaGluZS0+a2VybmVsX2Rzb3MsIGZwLCB3aXRoX2hpdHMpICsKKwkgICAgICAgX19kc29zX19mcHJpbnRmX2J1aWxkaWQoJm1hY2hpbmUtPnVzZXJfZHNvcywgZnAsIHdpdGhfaGl0cyk7CiB9CiAKLXNpemVfdCBtYWNoaW5lc19fZnByaW50Zl9kc29zX2J1aWxkaWQoc3RydWN0IHJiX3Jvb3QgKnNlbGYsIEZJTEUgKmZwLCBib29sIHdpdGhfaGl0cykKK3NpemVfdCBtYWNoaW5lc19fZnByaW50Zl9kc29zX2J1aWxkaWQoc3RydWN0IHJiX3Jvb3QgKm1hY2hpbmVzLAorCQkJCSAgICAgIEZJTEUgKmZwLCBib29sIHdpdGhfaGl0cykKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqbmQ7CiAJc2l6ZV90IHJldCA9IDA7CiAKLQlmb3IgKG5kID0gcmJfZmlyc3Qoc2VsZik7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7CisJZm9yIChuZCA9IHJiX2ZpcnN0KG1hY2hpbmVzKTsgbmQ7IG5kID0gcmJfbmV4dChuZCkpIHsKIAkJc3RydWN0IG1hY2hpbmUgKnBvcyA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3QgbWFjaGluZSwgcmJfbm9kZSk7CiAJCXJldCArPSBtYWNoaW5lX19mcHJpbnRmX2Rzb3NfYnVpbGRpZChwb3MsIGZwLCB3aXRoX2hpdHMpOwogCX0KQEAgLTIxMzksNTkgKzIxNDgsNTkgQEAKIAogc3RydWN0IGRzbyAqZHNvX19uZXdfa2VybmVsKGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0Jc3RydWN0IGRzbyAqc2VsZiA9IGRzb19fbmV3KG5hbWUgPzogIltrZXJuZWwua2FsbHN5bXNdIik7CisJc3RydWN0IGRzbyAqZHNvID0gZHNvX19uZXcobmFtZSA/OiAiW2tlcm5lbC5rYWxsc3ltc10iKTsKIAotCWlmIChzZWxmICE9IE5VTEwpIHsKLQkJZHNvX19zZXRfc2hvcnRfbmFtZShzZWxmLCAiW2tlcm5lbF0iKTsKLQkJc2VsZi0+a2VybmVsID0gRFNPX1RZUEVfS0VSTkVMOworCWlmIChkc28gIT0gTlVMTCkgeworCQlkc29fX3NldF9zaG9ydF9uYW1lKGRzbywgIltrZXJuZWxdIik7CisJCWRzby0+a2VybmVsID0gRFNPX1RZUEVfS0VSTkVMOwogCX0KIAotCXJldHVybiBzZWxmOworCXJldHVybiBkc287CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZHNvICpkc29fX25ld19ndWVzdF9rZXJuZWwoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsCiAJCQkJCWNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJY2hhciBiZltQQVRIX01BWF07Ci0Jc3RydWN0IGRzbyAqc2VsZiA9IGRzb19fbmV3KG5hbWUgPzogbWFjaGluZV9fbW1hcF9uYW1lKG1hY2hpbmUsIGJmLCBzaXplb2YoYmYpKSk7Ci0KLQlpZiAoc2VsZiAhPSBOVUxMKSB7Ci0JCWRzb19fc2V0X3Nob3J0X25hbWUoc2VsZiwgIltndWVzdC5rZXJuZWxdIik7Ci0JCXNlbGYtPmtlcm5lbCA9IERTT19UWVBFX0dVRVNUX0tFUk5FTDsKKwlzdHJ1Y3QgZHNvICpkc28gPSBkc29fX25ldyhuYW1lID86IG1hY2hpbmVfX21tYXBfbmFtZShtYWNoaW5lLCBiZiwKKwkJCQkJCQkgICAgICBzaXplb2YoYmYpKSk7CisJaWYgKGRzbyAhPSBOVUxMKSB7CisJCWRzb19fc2V0X3Nob3J0X25hbWUoZHNvLCAiW2d1ZXN0Lmtlcm5lbF0iKTsKKwkJZHNvLT5rZXJuZWwgPSBEU09fVFlQRV9HVUVTVF9LRVJORUw7CiAJfQogCi0JcmV0dXJuIHNlbGY7CisJcmV0dXJuIGRzbzsKIH0KIAotdm9pZCBkc29fX3JlYWRfcnVubmluZ19rZXJuZWxfYnVpbGRfaWQoc3RydWN0IGRzbyAqc2VsZiwgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCit2b2lkIGRzb19fcmVhZF9ydW5uaW5nX2tlcm5lbF9idWlsZF9pZChzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lKQogewogCWNoYXIgcGF0aFtQQVRIX01BWF07CiAKIAlpZiAobWFjaGluZV9faXNfZGVmYXVsdF9ndWVzdChtYWNoaW5lKSkKIAkJcmV0dXJuOwogCXNwcmludGYocGF0aCwgIiVzL3N5cy9rZXJuZWwvbm90ZXMiLCBtYWNoaW5lLT5yb290X2Rpcik7Ci0JaWYgKHN5c2ZzX19yZWFkX2J1aWxkX2lkKHBhdGgsIHNlbGYtPmJ1aWxkX2lkLAotCQkJCSBzaXplb2Yoc2VsZi0+YnVpbGRfaWQpKSA9PSAwKQotCQlzZWxmLT5oYXNfYnVpbGRfaWQgPSB0cnVlOworCWlmIChzeXNmc19fcmVhZF9idWlsZF9pZChwYXRoLCBkc28tPmJ1aWxkX2lkLAorCQkJCSBzaXplb2YoZHNvLT5idWlsZF9pZCkpID09IDApCisJCWRzby0+aGFzX2J1aWxkX2lkID0gdHJ1ZTsKIH0KIAotc3RhdGljIHN0cnVjdCBkc28gKm1hY2hpbmVfX2NyZWF0ZV9rZXJuZWwoc3RydWN0IG1hY2hpbmUgKnNlbGYpCitzdGF0aWMgc3RydWN0IGRzbyAqbWFjaGluZV9fY3JlYXRlX2tlcm5lbChzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKIHsKIAljb25zdCBjaGFyICp2bWxpbnV4X25hbWUgPSBOVUxMOwogCXN0cnVjdCBkc28gKmtlcm5lbDsKIAotCWlmIChtYWNoaW5lX19pc19ob3N0KHNlbGYpKSB7CisJaWYgKG1hY2hpbmVfX2lzX2hvc3QobWFjaGluZSkpIHsKIAkJdm1saW51eF9uYW1lID0gc3ltYm9sX2NvbmYudm1saW51eF9uYW1lOwogCQlrZXJuZWwgPSBkc29fX25ld19rZXJuZWwodm1saW51eF9uYW1lKTsKIAl9IGVsc2UgewotCQlpZiAobWFjaGluZV9faXNfZGVmYXVsdF9ndWVzdChzZWxmKSkKKwkJaWYgKG1hY2hpbmVfX2lzX2RlZmF1bHRfZ3Vlc3QobWFjaGluZSkpCiAJCQl2bWxpbnV4X25hbWUgPSBzeW1ib2xfY29uZi5kZWZhdWx0X2d1ZXN0X3ZtbGludXhfbmFtZTsKLQkJa2VybmVsID0gZHNvX19uZXdfZ3Vlc3Rfa2VybmVsKHNlbGYsIHZtbGludXhfbmFtZSk7CisJCWtlcm5lbCA9IGRzb19fbmV3X2d1ZXN0X2tlcm5lbChtYWNoaW5lLCB2bWxpbnV4X25hbWUpOwogCX0KIAogCWlmIChrZXJuZWwgIT0gTlVMTCkgewotCQlkc29fX3JlYWRfcnVubmluZ19rZXJuZWxfYnVpbGRfaWQoa2VybmVsLCBzZWxmKTsKLQkJZHNvc19fYWRkKCZzZWxmLT5rZXJuZWxfZHNvcywga2VybmVsKTsKKwkJZHNvX19yZWFkX3J1bm5pbmdfa2VybmVsX2J1aWxkX2lkKGtlcm5lbCwgbWFjaGluZSk7CisJCWRzb3NfX2FkZCgmbWFjaGluZS0+a2VybmVsX2Rzb3MsIGtlcm5lbCk7CiAJfQogCXJldHVybiBrZXJuZWw7CiB9CkBAIC0yMjM2LDQxICsyMjQ1LDQzIEBACiAJcmV0dXJuIGFyZ3Muc3RhcnQ7CiB9CiAKLWludCBfX21hY2hpbmVfX2NyZWF0ZV9rZXJuZWxfbWFwcyhzdHJ1Y3QgbWFjaGluZSAqc2VsZiwgc3RydWN0IGRzbyAqa2VybmVsKQoraW50IF9fbWFjaGluZV9fY3JlYXRlX2tlcm5lbF9tYXBzKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCBzdHJ1Y3QgZHNvICprZXJuZWwpCiB7CiAJZW51bSBtYXBfdHlwZSB0eXBlOwotCXU2NCBzdGFydCA9IG1hY2hpbmVfX2dldF9rZXJuZWxfc3RhcnRfYWRkcihzZWxmKTsKKwl1NjQgc3RhcnQgPSBtYWNoaW5lX19nZXRfa2VybmVsX3N0YXJ0X2FkZHIobWFjaGluZSk7CiAKIAlmb3IgKHR5cGUgPSAwOyB0eXBlIDwgTUFQX19OUl9UWVBFUzsgKyt0eXBlKSB7CiAJCXN0cnVjdCBrbWFwICprbWFwOwogCi0JCXNlbGYtPnZtbGludXhfbWFwc1t0eXBlXSA9IG1hcF9fbmV3MihzdGFydCwga2VybmVsLCB0eXBlKTsKLQkJaWYgKHNlbGYtPnZtbGludXhfbWFwc1t0eXBlXSA9PSBOVUxMKQorCQltYWNoaW5lLT52bWxpbnV4X21hcHNbdHlwZV0gPSBtYXBfX25ldzIoc3RhcnQsIGtlcm5lbCwgdHlwZSk7CisJCWlmIChtYWNoaW5lLT52bWxpbnV4X21hcHNbdHlwZV0gPT0gTlVMTCkKIAkJCXJldHVybiAtMTsKIAotCQlzZWxmLT52bWxpbnV4X21hcHNbdHlwZV0tPm1hcF9pcCA9Ci0JCQlzZWxmLT52bWxpbnV4X21hcHNbdHlwZV0tPnVubWFwX2lwID0gaWRlbnRpdHlfX21hcF9pcDsKLQotCQlrbWFwID0gbWFwX19rbWFwKHNlbGYtPnZtbGludXhfbWFwc1t0eXBlXSk7Ci0JCWttYXAtPmttYXBzID0gJnNlbGYtPmttYXBzOwotCQltYXBfZ3JvdXBzX19pbnNlcnQoJnNlbGYtPmttYXBzLCBzZWxmLT52bWxpbnV4X21hcHNbdHlwZV0pOworCQltYWNoaW5lLT52bWxpbnV4X21hcHNbdHlwZV0tPm1hcF9pcCA9CisJCQltYWNoaW5lLT52bWxpbnV4X21hcHNbdHlwZV0tPnVubWFwX2lwID0KKwkJCQlpZGVudGl0eV9fbWFwX2lwOworCQlrbWFwID0gbWFwX19rbWFwKG1hY2hpbmUtPnZtbGludXhfbWFwc1t0eXBlXSk7CisJCWttYXAtPmttYXBzID0gJm1hY2hpbmUtPmttYXBzOworCQltYXBfZ3JvdXBzX19pbnNlcnQoJm1hY2hpbmUtPmttYXBzLAorCQkJCSAgIG1hY2hpbmUtPnZtbGludXhfbWFwc1t0eXBlXSk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgbWFjaGluZV9fZGVzdHJveV9rZXJuZWxfbWFwcyhzdHJ1Y3QgbWFjaGluZSAqc2VsZikKK3ZvaWQgbWFjaGluZV9fZGVzdHJveV9rZXJuZWxfbWFwcyhzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKIHsKIAllbnVtIG1hcF90eXBlIHR5cGU7CiAKIAlmb3IgKHR5cGUgPSAwOyB0eXBlIDwgTUFQX19OUl9UWVBFUzsgKyt0eXBlKSB7CiAJCXN0cnVjdCBrbWFwICprbWFwOwogCi0JCWlmIChzZWxmLT52bWxpbnV4X21hcHNbdHlwZV0gPT0gTlVMTCkKKwkJaWYgKG1hY2hpbmUtPnZtbGludXhfbWFwc1t0eXBlXSA9PSBOVUxMKQogCQkJY29udGludWU7CiAKLQkJa21hcCA9IG1hcF9fa21hcChzZWxmLT52bWxpbnV4X21hcHNbdHlwZV0pOwotCQltYXBfZ3JvdXBzX19yZW1vdmUoJnNlbGYtPmttYXBzLCBzZWxmLT52bWxpbnV4X21hcHNbdHlwZV0pOworCQlrbWFwID0gbWFwX19rbWFwKG1hY2hpbmUtPnZtbGludXhfbWFwc1t0eXBlXSk7CisJCW1hcF9ncm91cHNfX3JlbW92ZSgmbWFjaGluZS0+a21hcHMsCisJCQkJICAgbWFjaGluZS0+dm1saW51eF9tYXBzW3R5cGVdKTsKIAkJaWYgKGttYXAtPnJlZl9yZWxvY19zeW0pIHsKIAkJCS8qCiAJCQkgKiByZWZfcmVsb2Nfc3ltIGlzIHNoYXJlZCBhbW9uZyBhbGwgbWFwcywgc28gZnJlZSBqdXN0CkBAIC0yMjg0LDI1ICsyMjk1LDI1IEBACiAJCQlrbWFwLT5yZWZfcmVsb2Nfc3ltID0gTlVMTDsKIAkJfQogCi0JCW1hcF9fZGVsZXRlKHNlbGYtPnZtbGludXhfbWFwc1t0eXBlXSk7Ci0JCXNlbGYtPnZtbGludXhfbWFwc1t0eXBlXSA9IE5VTEw7CisJCW1hcF9fZGVsZXRlKG1hY2hpbmUtPnZtbGludXhfbWFwc1t0eXBlXSk7CisJCW1hY2hpbmUtPnZtbGludXhfbWFwc1t0eXBlXSA9IE5VTEw7CiAJfQogfQogCi1pbnQgbWFjaGluZV9fY3JlYXRlX2tlcm5lbF9tYXBzKHN0cnVjdCBtYWNoaW5lICpzZWxmKQoraW50IG1hY2hpbmVfX2NyZWF0ZV9rZXJuZWxfbWFwcyhzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKIHsKLQlzdHJ1Y3QgZHNvICprZXJuZWwgPSBtYWNoaW5lX19jcmVhdGVfa2VybmVsKHNlbGYpOworCXN0cnVjdCBkc28gKmtlcm5lbCA9IG1hY2hpbmVfX2NyZWF0ZV9rZXJuZWwobWFjaGluZSk7CiAKIAlpZiAoa2VybmVsID09IE5VTEwgfHwKLQkgICAgX19tYWNoaW5lX19jcmVhdGVfa2VybmVsX21hcHMoc2VsZiwga2VybmVsKSA8IDApCisJICAgIF9fbWFjaGluZV9fY3JlYXRlX2tlcm5lbF9tYXBzKG1hY2hpbmUsIGtlcm5lbCkgPCAwKQogCQlyZXR1cm4gLTE7CiAKLQlpZiAoc3ltYm9sX2NvbmYudXNlX21vZHVsZXMgJiYgbWFjaGluZV9fY3JlYXRlX21vZHVsZXMoc2VsZikgPCAwKQorCWlmIChzeW1ib2xfY29uZi51c2VfbW9kdWxlcyAmJiBtYWNoaW5lX19jcmVhdGVfbW9kdWxlcyhtYWNoaW5lKSA8IDApCiAJCXByX2RlYnVnKCJQcm9ibGVtcyBjcmVhdGluZyBtb2R1bGUgbWFwcywgY29udGludWluZyBhbnl3YXkuLi5cbiIpOwogCS8qCiAJICogTm93IHRoYXQgd2UgaGF2ZSBhbGwgdGhlIG1hcHMgY3JlYXRlZCwganVzdCBzZXQgdGhlIC0+ZW5kIG9mIHRoZW06CiAJICovCi0JbWFwX2dyb3Vwc19fZml4dXBfZW5kKCZzZWxmLT5rbWFwcyk7CisJbWFwX2dyb3Vwc19fZml4dXBfZW5kKCZtYWNoaW5lLT5rbWFwcyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIzNjYsMTEgKzIzNzcsMTEgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXNpemVfdCBtYWNoaW5lX19mcHJpbnRmX3ZtbGludXhfcGF0aChzdHJ1Y3QgbWFjaGluZSAqc2VsZiwgRklMRSAqZnApCitzaXplX3QgbWFjaGluZV9fZnByaW50Zl92bWxpbnV4X3BhdGgoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIEZJTEUgKmZwKQogewogCWludCBpOwogCXNpemVfdCBwcmludGVkID0gMDsKLQlzdHJ1Y3QgZHNvICprZHNvID0gc2VsZi0+dm1saW51eF9tYXBzW01BUF9fRlVOQ1RJT05dLT5kc287CisJc3RydWN0IGRzbyAqa2RzbyA9IG1hY2hpbmUtPnZtbGludXhfbWFwc1tNQVBfX0ZVTkNUSU9OXS0+ZHNvOwogCiAJaWYgKGtkc28tPmhhc19idWlsZF9pZCkgewogCQljaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKQEAgLTI0NjcsOSArMjQ3OCw5IEBACiAJc3ltYm9sX2NvbmYuaW5pdGlhbGl6ZWQgPSBmYWxzZTsKIH0KIAotaW50IG1hY2hpbmVzX19jcmVhdGVfa2VybmVsX21hcHMoc3RydWN0IHJiX3Jvb3QgKnNlbGYsIHBpZF90IHBpZCkKK2ludCBtYWNoaW5lc19fY3JlYXRlX2tlcm5lbF9tYXBzKHN0cnVjdCByYl9yb290ICptYWNoaW5lcywgcGlkX3QgcGlkKQogewotCXN0cnVjdCBtYWNoaW5lICptYWNoaW5lID0gbWFjaGluZXNfX2ZpbmRuZXcoc2VsZiwgcGlkKTsKKwlzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSA9IG1hY2hpbmVzX19maW5kbmV3KG1hY2hpbmVzLCBwaWQpOwogCiAJaWYgKG1hY2hpbmUgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwpAQCAtMjUyMCw3ICsyNTMxLDcgQEAKIAlyZXR1cm4gczsKIH0KIAotaW50IG1hY2hpbmVzX19jcmVhdGVfZ3Vlc3Rfa2VybmVsX21hcHMoc3RydWN0IHJiX3Jvb3QgKnNlbGYpCitpbnQgbWFjaGluZXNfX2NyZWF0ZV9ndWVzdF9rZXJuZWxfbWFwcyhzdHJ1Y3QgcmJfcm9vdCAqbWFjaGluZXMpCiB7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGRpcmVudCAqKm5hbWVsaXN0ID0gTlVMTDsKQEAgLTI1MzEsNyArMjU0Miw3IEBACiAJaWYgKHN5bWJvbF9jb25mLmRlZmF1bHRfZ3Vlc3Rfdm1saW51eF9uYW1lIHx8CiAJICAgIHN5bWJvbF9jb25mLmRlZmF1bHRfZ3Vlc3RfbW9kdWxlcyB8fAogCSAgICBzeW1ib2xfY29uZi5kZWZhdWx0X2d1ZXN0X2thbGxzeW1zKSB7Ci0JCW1hY2hpbmVzX19jcmVhdGVfa2VybmVsX21hcHMoc2VsZiwgREVGQVVMVF9HVUVTVF9LRVJORUxfSUQpOworCQltYWNoaW5lc19fY3JlYXRlX2tlcm5lbF9tYXBzKG1hY2hpbmVzLCBERUZBVUxUX0dVRVNUX0tFUk5FTF9JRCk7CiAJfQogCiAJaWYgKHN5bWJvbF9jb25mLmd1ZXN0bW91bnQpIHsKQEAgLTI1NTIsNyArMjU2Myw3IEBACiAJCQkJcHJfZGVidWcoIkNhbid0IGFjY2VzcyBmaWxlICVzXG4iLCBwYXRoKTsKIAkJCQlnb3RvIGZhaWx1cmU7CiAJCQl9Ci0JCQltYWNoaW5lc19fY3JlYXRlX2tlcm5lbF9tYXBzKHNlbGYsIHBpZCk7CisJCQltYWNoaW5lc19fY3JlYXRlX2tlcm5lbF9tYXBzKG1hY2hpbmVzLCBwaWQpOwogCQl9CiBmYWlsdXJlOgogCQlmcmVlKG5hbWVsaXN0KTsKQEAgLTI1NjEsMjMgKzI1NzIsMjMgQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIG1hY2hpbmVzX19kZXN0cm95X2d1ZXN0X2tlcm5lbF9tYXBzKHN0cnVjdCByYl9yb290ICpzZWxmKQordm9pZCBtYWNoaW5lc19fZGVzdHJveV9ndWVzdF9rZXJuZWxfbWFwcyhzdHJ1Y3QgcmJfcm9vdCAqbWFjaGluZXMpCiB7Ci0Jc3RydWN0IHJiX25vZGUgKm5leHQgPSByYl9maXJzdChzZWxmKTsKKwlzdHJ1Y3QgcmJfbm9kZSAqbmV4dCA9IHJiX2ZpcnN0KG1hY2hpbmVzKTsKIAogCXdoaWxlIChuZXh0KSB7CiAJCXN0cnVjdCBtYWNoaW5lICpwb3MgPSByYl9lbnRyeShuZXh0LCBzdHJ1Y3QgbWFjaGluZSwgcmJfbm9kZSk7CiAKIAkJbmV4dCA9IHJiX25leHQoJnBvcy0+cmJfbm9kZSk7Ci0JCXJiX2VyYXNlKCZwb3MtPnJiX25vZGUsIHNlbGYpOworCQlyYl9lcmFzZSgmcG9zLT5yYl9ub2RlLCBtYWNoaW5lcyk7CiAJCW1hY2hpbmVfX2RlbGV0ZShwb3MpOwogCX0KIH0KIAotaW50IG1hY2hpbmVfX2xvYWRfa2FsbHN5bXMoc3RydWN0IG1hY2hpbmUgKnNlbGYsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAoraW50IG1hY2hpbmVfX2xvYWRfa2FsbHN5bXMoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogCQkJICAgZW51bSBtYXBfdHlwZSB0eXBlLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQogewotCXN0cnVjdCBtYXAgKm1hcCA9IHNlbGYtPnZtbGludXhfbWFwc1t0eXBlXTsKKwlzdHJ1Y3QgbWFwICptYXAgPSBtYWNoaW5lLT52bWxpbnV4X21hcHNbdHlwZV07CiAJaW50IHJldCA9IGRzb19fbG9hZF9rYWxsc3ltcyhtYXAtPmRzbywgZmlsZW5hbWUsIG1hcCwgZmlsdGVyKTsKIAogCWlmIChyZXQgPiAwKSB7CkBAIC0yNTg3LDE2ICsyNTk4LDE2IEBACiAJCSAqIGtlcm5lbCwgd2l0aCBtb2R1bGVzIGJldHdlZW4gdGhlbSwgZml4dXAgdGhlIGVuZCBvZiBhbGwKIAkJICogc2VjdGlvbnMuCiAJCSAqLwotCQlfX21hcF9ncm91cHNfX2ZpeHVwX2VuZCgmc2VsZi0+a21hcHMsIHR5cGUpOworCQlfX21hcF9ncm91cHNfX2ZpeHVwX2VuZCgmbWFjaGluZS0+a21hcHMsIHR5cGUpOwogCX0KIAogCXJldHVybiByZXQ7CiB9CiAKLWludCBtYWNoaW5lX19sb2FkX3ZtbGludXhfcGF0aChzdHJ1Y3QgbWFjaGluZSAqc2VsZiwgZW51bSBtYXBfdHlwZSB0eXBlLAoraW50IG1hY2hpbmVfX2xvYWRfdm1saW51eF9wYXRoKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCBlbnVtIG1hcF90eXBlIHR5cGUsCiAJCQkgICAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKIHsKLQlzdHJ1Y3QgbWFwICptYXAgPSBzZWxmLT52bWxpbnV4X21hcHNbdHlwZV07CisJc3RydWN0IG1hcCAqbWFwID0gbWFjaGluZS0+dm1saW51eF9tYXBzW3R5cGVdOwogCWludCByZXQgPSBkc29fX2xvYWRfdm1saW51eF9wYXRoKG1hcC0+ZHNvLCBtYXAsIGZpbHRlcik7CiAKIAlpZiAocmV0ID4gMCkgewpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5oIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5oCmluZGV4IDcxM2IwYjQuLjI0MmRlMDEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuaAorKysgYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLmgKQEAgLTYyLDcgKzYyLDcgQEAKIAljaGFyCQluYW1lWzBdOwogfTsKIAotdm9pZCBzeW1ib2xfX2RlbGV0ZShzdHJ1Y3Qgc3ltYm9sICpzZWxmKTsKK3ZvaWQgc3ltYm9sX19kZWxldGUoc3RydWN0IHN5bWJvbCAqc3ltKTsKIAogc3RydWN0IHN0cmxpc3Q7CiAKQEAgLTk2LDkgKzk2LDkgQEAKIAogZXh0ZXJuIHN0cnVjdCBzeW1ib2xfY29uZiBzeW1ib2xfY29uZjsKIAotc3RhdGljIGlubGluZSB2b2lkICpzeW1ib2xfX3ByaXYoc3RydWN0IHN5bWJvbCAqc2VsZikKK3N0YXRpYyBpbmxpbmUgdm9pZCAqc3ltYm9sX19wcml2KHN0cnVjdCBzeW1ib2wgKnN5bSkKIHsKLQlyZXR1cm4gKCh2b2lkICopc2VsZikgLSBzeW1ib2xfY29uZi5wcml2X3NpemU7CisJcmV0dXJuICgodm9pZCAqKXN5bSkgLSBzeW1ib2xfY29uZi5wcml2X3NpemU7CiB9CiAKIHN0cnVjdCByZWZfcmVsb2Nfc3ltIHsKQEAgLTE1NSw0MyArMTU1LDQ1IEBACiAKIHN0cnVjdCBkc28gKmRzb19fbmV3KGNvbnN0IGNoYXIgKm5hbWUpOwogc3RydWN0IGRzbyAqZHNvX19uZXdfa2VybmVsKGNvbnN0IGNoYXIgKm5hbWUpOwotdm9pZCBkc29fX2RlbGV0ZShzdHJ1Y3QgZHNvICpzZWxmKTsKK3ZvaWQgZHNvX19kZWxldGUoc3RydWN0IGRzbyAqZHNvKTsKIAotaW50IGRzb19fbmFtZV9sZW4oY29uc3Qgc3RydWN0IGRzbyAqc2VsZik7CitpbnQgZHNvX19uYW1lX2xlbihjb25zdCBzdHJ1Y3QgZHNvICpkc28pOwogCi1ib29sIGRzb19fbG9hZGVkKGNvbnN0IHN0cnVjdCBkc28gKnNlbGYsIGVudW0gbWFwX3R5cGUgdHlwZSk7Ci1ib29sIGRzb19fc29ydGVkX2J5X25hbWUoY29uc3Qgc3RydWN0IGRzbyAqc2VsZiwgZW51bSBtYXBfdHlwZSB0eXBlKTsKK2Jvb2wgZHNvX19sb2FkZWQoY29uc3Qgc3RydWN0IGRzbyAqZHNvLCBlbnVtIG1hcF90eXBlIHR5cGUpOworYm9vbCBkc29fX3NvcnRlZF9ieV9uYW1lKGNvbnN0IHN0cnVjdCBkc28gKmRzbywgZW51bSBtYXBfdHlwZSB0eXBlKTsKIAotc3RhdGljIGlubGluZSB2b2lkIGRzb19fc2V0X2xvYWRlZChzdHJ1Y3QgZHNvICpzZWxmLCBlbnVtIG1hcF90eXBlIHR5cGUpCitzdGF0aWMgaW5saW5lIHZvaWQgZHNvX19zZXRfbG9hZGVkKHN0cnVjdCBkc28gKmRzbywgZW51bSBtYXBfdHlwZSB0eXBlKQogewotCXNlbGYtPmxvYWRlZCB8PSAoMSA8PCB0eXBlKTsKKwlkc28tPmxvYWRlZCB8PSAoMSA8PCB0eXBlKTsKIH0KIAotdm9pZCBkc29fX3NvcnRfYnlfbmFtZShzdHJ1Y3QgZHNvICpzZWxmLCBlbnVtIG1hcF90eXBlIHR5cGUpOwordm9pZCBkc29fX3NvcnRfYnlfbmFtZShzdHJ1Y3QgZHNvICpkc28sIGVudW0gbWFwX3R5cGUgdHlwZSk7CiAKIHN0cnVjdCBkc28gKl9fZHNvc19fZmluZG5ldyhzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBjb25zdCBjaGFyICpuYW1lKTsKIAotaW50IGRzb19fbG9hZChzdHJ1Y3QgZHNvICpzZWxmLCBzdHJ1Y3QgbWFwICptYXAsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpOwotaW50IGRzb19fbG9hZF92bWxpbnV4KHN0cnVjdCBkc28gKnNlbGYsIHN0cnVjdCBtYXAgKm1hcCwKK2ludCBkc29fX2xvYWQoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpOworaW50IGRzb19fbG9hZF92bWxpbnV4KHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLAogCQkgICAgICBjb25zdCBjaGFyICp2bWxpbnV4LCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKTsKLWludCBkc29fX2xvYWRfdm1saW51eF9wYXRoKHN0cnVjdCBkc28gKnNlbGYsIHN0cnVjdCBtYXAgKm1hcCwKK2ludCBkc29fX2xvYWRfdm1saW51eF9wYXRoKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLAogCQkJICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7Ci1pbnQgZHNvX19sb2FkX2thbGxzeW1zKHN0cnVjdCBkc28gKnNlbGYsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBzdHJ1Y3QgbWFwICptYXAsCitpbnQgZHNvX19sb2FkX2thbGxzeW1zKHN0cnVjdCBkc28gKmRzbywgY29uc3QgY2hhciAqZmlsZW5hbWUsIHN0cnVjdCBtYXAgKm1hcCwKIAkJICAgICAgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpOwotaW50IG1hY2hpbmVfX2xvYWRfa2FsbHN5bXMoc3RydWN0IG1hY2hpbmUgKnNlbGYsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAoraW50IG1hY2hpbmVfX2xvYWRfa2FsbHN5bXMoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogCQkJICAgZW51bSBtYXBfdHlwZSB0eXBlLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKTsKLWludCBtYWNoaW5lX19sb2FkX3ZtbGludXhfcGF0aChzdHJ1Y3QgbWFjaGluZSAqc2VsZiwgZW51bSBtYXBfdHlwZSB0eXBlLAoraW50IG1hY2hpbmVfX2xvYWRfdm1saW51eF9wYXRoKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCBlbnVtIG1hcF90eXBlIHR5cGUsCiAJCQkgICAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7CiAKIHNpemVfdCBfX2Rzb3NfX2ZwcmludGYoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgRklMRSAqZnApOwogCi1zaXplX3QgbWFjaGluZV9fZnByaW50Zl9kc29zX2J1aWxkaWQoc3RydWN0IG1hY2hpbmUgKnNlbGYsIEZJTEUgKmZwLCBib29sIHdpdGhfaGl0cyk7Ci1zaXplX3QgbWFjaGluZXNfX2ZwcmludGZfZHNvcyhzdHJ1Y3QgcmJfcm9vdCAqc2VsZiwgRklMRSAqZnApOwotc2l6ZV90IG1hY2hpbmVzX19mcHJpbnRmX2Rzb3NfYnVpbGRpZChzdHJ1Y3QgcmJfcm9vdCAqc2VsZiwgRklMRSAqZnAsIGJvb2wgd2l0aF9oaXRzKTsKLQotc2l6ZV90IGRzb19fZnByaW50Zl9idWlsZGlkKHN0cnVjdCBkc28gKnNlbGYsIEZJTEUgKmZwKTsKLXNpemVfdCBkc29fX2ZwcmludGZfc3ltYm9sc19ieV9uYW1lKHN0cnVjdCBkc28gKnNlbGYsIGVudW0gbWFwX3R5cGUgdHlwZSwgRklMRSAqZnApOwotc2l6ZV90IGRzb19fZnByaW50ZihzdHJ1Y3QgZHNvICpzZWxmLCBlbnVtIG1hcF90eXBlIHR5cGUsIEZJTEUgKmZwKTsKK3NpemVfdCBtYWNoaW5lX19mcHJpbnRmX2Rzb3NfYnVpbGRpZChzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKKwkJCQkgICAgIEZJTEUgKmZwLCBib29sIHdpdGhfaGl0cyk7CitzaXplX3QgbWFjaGluZXNfX2ZwcmludGZfZHNvcyhzdHJ1Y3QgcmJfcm9vdCAqbWFjaGluZXMsIEZJTEUgKmZwKTsKK3NpemVfdCBtYWNoaW5lc19fZnByaW50Zl9kc29zX2J1aWxkaWQoc3RydWN0IHJiX3Jvb3QgKm1hY2hpbmVzLAorCQkJCSAgICAgIEZJTEUgKmZwLCBib29sIHdpdGhfaGl0cyk7CitzaXplX3QgZHNvX19mcHJpbnRmX2J1aWxkaWQoc3RydWN0IGRzbyAqZHNvLCBGSUxFICpmcCk7CitzaXplX3QgZHNvX19mcHJpbnRmX3N5bWJvbHNfYnlfbmFtZShzdHJ1Y3QgZHNvICpkc28sCisJCQkJICAgIGVudW0gbWFwX3R5cGUgdHlwZSwgRklMRSAqZnApOworc2l6ZV90IGRzb19fZnByaW50ZihzdHJ1Y3QgZHNvICpkc28sIGVudW0gbWFwX3R5cGUgdHlwZSwgRklMRSAqZnApOwogCiBlbnVtIHN5bXRhYl90eXBlIHsKIAlTWU1UQUJfX0tBTExTWU1TID0gMCwKQEAgLTIwNywzNCArMjA5LDM2IEBACiAJU1lNVEFCX19OT1RfRk9VTkQsCiB9OwogCi1jaGFyIGRzb19fc3ltdGFiX29yaWdpbihjb25zdCBzdHJ1Y3QgZHNvICpzZWxmKTsKLXZvaWQgZHNvX19zZXRfbG9uZ19uYW1lKHN0cnVjdCBkc28gKnNlbGYsIGNoYXIgKm5hbWUpOwotdm9pZCBkc29fX3NldF9idWlsZF9pZChzdHJ1Y3QgZHNvICpzZWxmLCB2b2lkICpidWlsZF9pZCk7Ci12b2lkIGRzb19fcmVhZF9ydW5uaW5nX2tlcm5lbF9idWlsZF9pZChzdHJ1Y3QgZHNvICpzZWxmLCBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSk7Ci1zdHJ1Y3Qgc3ltYm9sICpkc29fX2ZpbmRfc3ltYm9sKHN0cnVjdCBkc28gKnNlbGYsIGVudW0gbWFwX3R5cGUgdHlwZSwgdTY0IGFkZHIpOwotc3RydWN0IHN5bWJvbCAqZHNvX19maW5kX3N5bWJvbF9ieV9uYW1lKHN0cnVjdCBkc28gKnNlbGYsIGVudW0gbWFwX3R5cGUgdHlwZSwKK2NoYXIgZHNvX19zeW10YWJfb3JpZ2luKGNvbnN0IHN0cnVjdCBkc28gKmRzbyk7Cit2b2lkIGRzb19fc2V0X2xvbmdfbmFtZShzdHJ1Y3QgZHNvICpkc28sIGNoYXIgKm5hbWUpOwordm9pZCBkc29fX3NldF9idWlsZF9pZChzdHJ1Y3QgZHNvICpkc28sIHZvaWQgKmJ1aWxkX2lkKTsKK3ZvaWQgZHNvX19yZWFkX3J1bm5pbmdfa2VybmVsX2J1aWxkX2lkKHN0cnVjdCBkc28gKmRzbywKKwkJCQkgICAgICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpOworc3RydWN0IHN5bWJvbCAqZHNvX19maW5kX3N5bWJvbChzdHJ1Y3QgZHNvICpkc28sIGVudW0gbWFwX3R5cGUgdHlwZSwKKwkJCQl1NjQgYWRkcik7CitzdHJ1Y3Qgc3ltYm9sICpkc29fX2ZpbmRfc3ltYm9sX2J5X25hbWUoc3RydWN0IGRzbyAqZHNvLCBlbnVtIG1hcF90eXBlIHR5cGUsCiAJCQkJCWNvbnN0IGNoYXIgKm5hbWUpOwogCiBpbnQgZmlsZW5hbWVfX3JlYWRfYnVpbGRfaWQoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJmLCBzaXplX3Qgc2l6ZSk7CiBpbnQgc3lzZnNfX3JlYWRfYnVpbGRfaWQoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJmLCBzaXplX3Qgc2l6ZSk7CiBib29sIF9fZHNvc19fcmVhZF9idWlsZF9pZHMoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgYm9vbCB3aXRoX2hpdHMpOwotaW50IGJ1aWxkX2lkX19zcHJpbnRmKGNvbnN0IHU4ICpzZWxmLCBpbnQgbGVuLCBjaGFyICpiZik7CitpbnQgYnVpbGRfaWRfX3NwcmludGYoY29uc3QgdTggKmJ1aWxkX2lkLCBpbnQgbGVuLCBjaGFyICpiZik7CiBpbnQga2FsbHN5bXNfX3BhcnNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB2b2lkICphcmcsCiAJCSAgICBpbnQgKCpwcm9jZXNzX3N5bWJvbCkodm9pZCAqYXJnLCBjb25zdCBjaGFyICpuYW1lLAogCQkJCQkgIGNoYXIgdHlwZSwgdTY0IHN0YXJ0LCB1NjQgZW5kKSk7CiAKLXZvaWQgbWFjaGluZV9fZGVzdHJveV9rZXJuZWxfbWFwcyhzdHJ1Y3QgbWFjaGluZSAqc2VsZik7Ci1pbnQgX19tYWNoaW5lX19jcmVhdGVfa2VybmVsX21hcHMoc3RydWN0IG1hY2hpbmUgKnNlbGYsIHN0cnVjdCBkc28gKmtlcm5lbCk7Ci1pbnQgbWFjaGluZV9fY3JlYXRlX2tlcm5lbF9tYXBzKHN0cnVjdCBtYWNoaW5lICpzZWxmKTsKK3ZvaWQgbWFjaGluZV9fZGVzdHJveV9rZXJuZWxfbWFwcyhzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSk7CitpbnQgX19tYWNoaW5lX19jcmVhdGVfa2VybmVsX21hcHMoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIHN0cnVjdCBkc28gKmtlcm5lbCk7CitpbnQgbWFjaGluZV9fY3JlYXRlX2tlcm5lbF9tYXBzKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lKTsKIAotaW50IG1hY2hpbmVzX19jcmVhdGVfa2VybmVsX21hcHMoc3RydWN0IHJiX3Jvb3QgKnNlbGYsIHBpZF90IHBpZCk7Ci1pbnQgbWFjaGluZXNfX2NyZWF0ZV9ndWVzdF9rZXJuZWxfbWFwcyhzdHJ1Y3QgcmJfcm9vdCAqc2VsZik7Ci12b2lkIG1hY2hpbmVzX19kZXN0cm95X2d1ZXN0X2tlcm5lbF9tYXBzKHN0cnVjdCByYl9yb290ICpzZWxmKTsKK2ludCBtYWNoaW5lc19fY3JlYXRlX2tlcm5lbF9tYXBzKHN0cnVjdCByYl9yb290ICptYWNoaW5lcywgcGlkX3QgcGlkKTsKK2ludCBtYWNoaW5lc19fY3JlYXRlX2d1ZXN0X2tlcm5lbF9tYXBzKHN0cnVjdCByYl9yb290ICptYWNoaW5lcyk7Cit2b2lkIG1hY2hpbmVzX19kZXN0cm95X2d1ZXN0X2tlcm5lbF9tYXBzKHN0cnVjdCByYl9yb290ICptYWNoaW5lcyk7CiAKIGludCBzeW1ib2xfX2luaXQodm9pZCk7CiB2b2lkIHN5bWJvbF9fZXhpdCh2b2lkKTsKIGJvb2wgc3ltYm9sX3R5cGVfX2lzX2EoY2hhciBzeW1ib2xfdHlwZSwgZW51bSBtYXBfdHlwZSBtYXBfdHlwZSk7CiAKLXNpemVfdCBtYWNoaW5lX19mcHJpbnRmX3ZtbGludXhfcGF0aChzdHJ1Y3QgbWFjaGluZSAqc2VsZiwgRklMRSAqZnApOworc2l6ZV90IG1hY2hpbmVfX2ZwcmludGZfdm1saW51eF9wYXRoKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCBGSUxFICpmcCk7CiAKICNlbmRpZiAvKiBfX1BFUkZfU1lNQk9MICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQtcGFyc2UuYyBiL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1wYXJzZS5jCmluZGV4IDBhN2VkNWIuLjFlODg0ODUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1wYXJzZS5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1wYXJzZS5jCkBAIC0yMTg3LDcgKzIxODcsNiBAQAogCXsgIlRBU0tMRVRfU09GVElSUSIsIDYgfSwKIAl7ICJTQ0hFRF9TT0ZUSVJRIiwgNyB9LAogCXsgIkhSVElNRVJfU09GVElSUSIsIDggfSwKLQl7ICJSQ1VfU09GVElSUSIsIDkgfSwKIAogCXsgIkhSVElNRVJfTk9SRVNUQVJUIiwgMCB9LAogCXsgIkhSVElNRVJfUkVTVEFSVCIsIDEgfSwK