ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IGZkY2NlNDAuLjMwMTZlZDMgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMjcsNiArMjcsNyBAQAogdm1saW51eCoKICF2bWxpbnV4Lmxkcy5TCiBTeXN0ZW0ubWFwCitNb2R1bGUubWFya2VycwogTW9kdWxlLnN5bXZlcnMKICEuZ2l0aWdub3JlCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3N0YWJsZS9zeXNmcy1jbGFzcy11YmkgYi9Eb2N1bWVudGF0aW9uL0FCSS9zdGFibGUvc3lzZnMtY2xhc3MtdWJpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZDQ3MWQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS9zdGFibGUvc3lzZnMtY2xhc3MtdWJpCkBAIC0wLDAgKzEsMjEyIEBACitXaGF0OgkJL3N5cy9jbGFzcy91YmkvCitEYXRlOgkJSnVseSAyMDA2CitLZXJuZWxWZXJzaW9uOgkyLjYuMjIKK0NvbnRhY3Q6CUFydGVtIEJpdHl1dHNraXkgPGRlZGVraW5kQGluZnJhZGVhZC5vcmc+CitEZXNjcmlwdGlvbjoKKwkJVGhlIHViaS8gY2xhc3Mgc3ViLWRpcmVjdG9yeSBiZWxvbmdzIHRvIHRoZSBVQkkgc3Vic3lzdGVtIGFuZAorCQlwcm92aWRlcyBnZW5lcmFsIFVCSSBpbmZvcm1hdGlvbiwgcGVyLVVCSSBkZXZpY2UgaW5mb3JtYXRpb24KKwkJYW5kIHBlci1VQkkgdm9sdW1lIGluZm9ybWF0aW9uLgorCitXaGF0OgkJL3N5cy9jbGFzcy91YmkvdmVyc2lvbgorRGF0ZToJCUp1bHkgMjAwNgorS2VybmVsVmVyc2lvbjoJMi42LjIyCitDb250YWN0OglBcnRlbSBCaXR5dXRza2l5IDxkZWRla2luZEBpbmZyYWRlYWQub3JnPgorRGVzY3JpcHRpb246CisJCVRoaXMgZmlsZSBjb250YWlucyB2ZXJzaW9uIG9mIHRoZSBsYXRlc3Qgc3VwcG9ydGVkIFVCSSBvbi1tZWRpYQorCQlmb3JtYXQuIEN1cnJlbnRseSBpdCBpcyAxLCBhbmQgdGhlcmUgaXMgbm8gcGxhbiB0byBjaGFuZ2UgdGhpcy4KKwkJSG93ZXZlciwgaWYgaW4gdGhlIGZ1dHVyZSBVQkkgbmVlZHMgb24tZmxhc2ggZm9ybWF0IGNoYW5nZXMKKwkJd2hpY2ggY2Fubm90IGJlIGRvbmUgaW4gYSBjb21wYXRpYmxlIG1hbm5lciwgYSBuZXcgZm9ybWF0CisJCXZlcnNpb24gd2lsbCBiZSBhZGRlZC4gU28gdGhpcyBpcyBhIG1lY2hhbmlzbSBmb3IgcG9zc2libGUKKwkJZnV0dXJlIGJhY2t3YXJkLWNvbXBhdGlibGUgKGJ1dCBmb3J3YXJkLWluY29tcGF0aWJsZSkKKwkJaW1wcm92ZW1lbnRzLgorCitXaGF0OgkJL3N5cy9jbGFzcy91YmlYLworRGF0ZToJCUp1bHkgMjAwNgorS2VybmVsVmVyc2lvbjoJMi42LjIyCitDb250YWN0OglBcnRlbSBCaXR5dXRza2l5IDxkZWRla2luZEBpbmZyYWRlYWQub3JnPgorRGVzY3JpcHRpb246CisJCVRoZSAvc3lzL2NsYXNzL3ViaTAsIC9zeXMvY2xhc3MvdWJpMSwgZXRjIGRpcmVjdG9yaWVzIGRlc2NyaWJlCisJCVVCSSBkZXZpY2VzIChVQkkgZGV2aWNlIDAsIDEsIGV0YykuIFRoZXkgY29udGFpbiBnZW5lcmFsIFVCSQorCQlkZXZpY2UgaW5mb3JtYXRpb24gYW5kIHBlciBVQkkgdm9sdW1lIGluZm9ybWF0aW9uIChlYWNoIFVCSQorCQlkZXZpY2UgbWF5IGhhdmUgbWFueSBVQkkgdm9sdW1lcykKKworV2hhdDoJCS9zeXMvY2xhc3MvdWJpL3ViaVgvYXZhaWxfZXJhc2VibG9ja3MKK0RhdGU6CQlKdWx5IDIwMDYKK0tlcm5lbFZlcnNpb246CTIuNi4yMgorQ29udGFjdDoJQXJ0ZW0gQml0eXV0c2tpeSA8ZGVkZWtpbmRAaW5mcmFkZWFkLm9yZz4KK0Rlc2NyaXB0aW9uOgorCQlBbW91bnQgb2YgYXZhaWxhYmxlIGxvZ2ljYWwgZXJhc2VibG9jay4gRm9yIGV4YW1wbGUsIG9uZSBtYXkKKwkJY3JlYXRlIGEgbmV3IFVCSSB2b2x1bWUgd2hpY2ggaGFzIHRoaXMgYW1vdW50IG9mIGxvZ2ljYWwKKwkJZXJhc2VibG9ja3MuCisKK1doYXQ6CQkvc3lzL2NsYXNzL3ViaS91YmlYL2JhZF9wZWJfY291bnQKK0RhdGU6CQlKdWx5IDIwMDYKK0tlcm5lbFZlcnNpb246CTIuNi4yMgorQ29udGFjdDoJQXJ0ZW0gQml0eXV0c2tpeSA8ZGVkZWtpbmRAaW5mcmFkZWFkLm9yZz4KK0Rlc2NyaXB0aW9uOgorCQlDb3VudCBvZiBiYWQgcGh5c2ljYWwgZXJhc2VibG9ja3Mgb24gdGhlIHVuZGVybHlpbmcgTVREIGRldmljZS4KKworV2hhdDoJCS9zeXMvY2xhc3MvdWJpL3ViaVgvYmd0X2VuYWJsZWQKK0RhdGU6CQlKdWx5IDIwMDYKK0tlcm5lbFZlcnNpb246CTIuNi4yMgorQ29udGFjdDoJQXJ0ZW0gQml0eXV0c2tpeSA8ZGVkZWtpbmRAaW5mcmFkZWFkLm9yZz4KK0Rlc2NyaXB0aW9uOgorCQlDb250YWlucyBBU0NJSSAiMFxuIiBpZiB0aGUgVUJJIGJhY2tncm91bmQgdGhyZWFkIGlzIGRpc2FibGVkLAorCQlhbmQgQVNDSUkgIjFcbiIgaWYgaXQgaXMgZW5hYmxlZC4KKworV2hhdDoJCS9zeXMvY2xhc3MvdWJpL3ViaVgvZGV2CitEYXRlOgkJSnVseSAyMDA2CitLZXJuZWxWZXJzaW9uOgkyLjYuMjIKK0NvbnRhY3Q6CUFydGVtIEJpdHl1dHNraXkgPGRlZGVraW5kQGluZnJhZGVhZC5vcmc+CitEZXNjcmlwdGlvbjoKKwkJTWFqb3IgYW5kIG1pbm9yIG51bWJlcnMgb2YgdGhlIGNoYXJhY3RlciBkZXZpY2UgY29ycmVzcG9uZGluZworCQl0byB0aGlzIFVCSSBkZXZpY2UgKGluIDxtYWpvcj46PG1pbm9yPiBmb3JtYXQpLgorCitXaGF0OgkJL3N5cy9jbGFzcy91YmkvdWJpWC9lcmFzZWJsb2NrX3NpemUKK0RhdGU6CQlKdWx5IDIwMDYKK0tlcm5lbFZlcnNpb246CTIuNi4yMgorQ29udGFjdDoJQXJ0ZW0gQml0eXV0c2tpeSA8ZGVkZWtpbmRAaW5mcmFkZWFkLm9yZz4KK0Rlc2NyaXB0aW9uOgorCQlNYXhpbXVtIGxvZ2ljYWwgZXJhc2VibG9jayBzaXplIHRoaXMgVUJJIGRldmljZSBtYXkgcHJvdmlkZS4gVUJJCisJCXZvbHVtZXMgbWF5IGhhdmUgc21hbGxlciBsb2dpY2FsIGVyYXNlYmxvY2sgc2l6ZSBiZWNhdXNlIG9mIHRoZWlyCisJCWFsaWdubWVudC4KKworV2hhdDoJCS9zeXMvY2xhc3MvdWJpL3ViaVgvbWF4X2VjCitEYXRlOgkJSnVseSAyMDA2CitLZXJuZWxWZXJzaW9uOgkyLjYuMjIKK0NvbnRhY3Q6CUFydGVtIEJpdHl1dHNraXkgPGRlZGVraW5kQGluZnJhZGVhZC5vcmc+CitEZXNjcmlwdGlvbjoKKwkJTWF4aW11bSBwaHlzaWNhbCBlcmFzZWJsb2NrIGVyYXNlIGNvdW50ZXIgdmFsdWUuCisKK1doYXQ6CQkvc3lzL2NsYXNzL3ViaS91YmlYL21heF92b2xfY291bnQKK0RhdGU6CQlKdWx5IDIwMDYKK0tlcm5lbFZlcnNpb246CTIuNi4yMgorQ29udGFjdDoJQXJ0ZW0gQml0eXV0c2tpeSA8ZGVkZWtpbmRAaW5mcmFkZWFkLm9yZz4KK0Rlc2NyaXB0aW9uOgorCQlNYXhpbXVtIG51bWJlciBvZiB2b2x1bWVzIHdoaWNoIHRoaXMgVUJJIGRldmljZSBtYXkgaGF2ZS4KKworV2hhdDoJCS9zeXMvY2xhc3MvdWJpL3ViaVgvbWluX2lvX3NpemUKK0RhdGU6CQlKdWx5IDIwMDYKK0tlcm5lbFZlcnNpb246CTIuNi4yMgorQ29udGFjdDoJQXJ0ZW0gQml0eXV0c2tpeSA8ZGVkZWtpbmRAaW5mcmFkZWFkLm9yZz4KK0Rlc2NyaXB0aW9uOgorCQlNaW5pbXVtIGlucHV0L291dHB1dCB1bml0IHNpemUuIEFsbCB0aGUgSS9PIG1heSBvbmx5IGJlIGRvbmUKKwkJaW4gZnJhY3Rpb25zIG9mIHRoZSBjb250YWluZWQgbnVtYmVyLgorCitXaGF0OgkJL3N5cy9jbGFzcy91YmkvdWJpWC9tdGRfbnVtCitEYXRlOgkJSmFudWFyeSAyMDA4CitLZXJuZWxWZXJzaW9uOgkyLjYuMjUKK0NvbnRhY3Q6CUFydGVtIEJpdHl1dHNraXkgPGRlZGVraW5kQGluZnJhZGVhZC5vcmc+CitEZXNjcmlwdGlvbjoKKwkJTnVtYmVyIG9mIHRoZSB1bmRlcmx5aW5nIE1URCBkZXZpY2UuCisKK1doYXQ6CQkvc3lzL2NsYXNzL3ViaS91YmlYL3Jlc2VydmVkX2Zvcl9iYWQKK0RhdGU6CQlKdWx5IDIwMDYKK0tlcm5lbFZlcnNpb246CTIuNi4yMgorQ29udGFjdDoJQXJ0ZW0gQml0eXV0c2tpeSA8ZGVkZWtpbmRAaW5mcmFkZWFkLm9yZz4KK0Rlc2NyaXB0aW9uOgorCQlOdW1iZXIgb2YgcGh5c2ljYWwgZXJhc2VibG9ja3MgcmVzZXJ2ZWQgZm9yIGJhZCBibG9jayBoYW5kbGluZy4KKworV2hhdDoJCS9zeXMvY2xhc3MvdWJpL3ViaVgvdG90YWxfZXJhc2VibG9ja3MKK0RhdGU6CQlKdWx5IDIwMDYKK0tlcm5lbFZlcnNpb246CTIuNi4yMgorQ29udGFjdDoJQXJ0ZW0gQml0eXV0c2tpeSA8ZGVkZWtpbmRAaW5mcmFkZWFkLm9yZz4KK0Rlc2NyaXB0aW9uOgorCQlUb3RhbCBudW1iZXIgb2YgZ29vZCAobm90IG1hcmtlZCBhcyBiYWQpIHBoeXNpY2FsIGVyYXNlYmxvY2tzIG9uCisJCXRoZSB1bmRlcmx5aW5nIE1URCBkZXZpY2UuCisKK1doYXQ6CQkvc3lzL2NsYXNzL3ViaS91YmlYL3ZvbHVtZXNfY291bnQKK0RhdGU6CQlKdWx5IDIwMDYKK0tlcm5lbFZlcnNpb246CTIuNi4yMgorQ29udGFjdDoJQXJ0ZW0gQml0eXV0c2tpeSA8ZGVkZWtpbmRAaW5mcmFkZWFkLm9yZz4KK0Rlc2NyaXB0aW9uOgorCQlDb3VudCBvZiB2b2x1bWVzIG9uIHRoaXMgVUJJIGRldmljZS4KKworV2hhdDoJCS9zeXMvY2xhc3MvdWJpL3ViaVgvdWJpWF9ZLworRGF0ZToJCUp1bHkgMjAwNgorS2VybmVsVmVyc2lvbjoJMi42LjIyCitDb250YWN0OglBcnRlbSBCaXR5dXRza2l5IDxkZWRla2luZEBpbmZyYWRlYWQub3JnPgorRGVzY3JpcHRpb246CisJCVRoZSAvc3lzL2NsYXNzL3ViaS91YmlYL3ViaVhfMC8sIC9zeXMvY2xhc3MvdWJpL3ViaVgvdWJpWF8xLywKKwkJZXRjIGRpcmVjdG9yaWVzIGRlc2NyaWJlIFVCSSB2b2x1bWVzIG9uIFVCSSBkZXZpY2UgWCAodm9sdW1lcworCQkwLCAxLCBldGMpLgorCitXaGF0OgkJL3N5cy9jbGFzcy91YmkvdWJpWC91YmlYX1kvYWxpZ25tZW50CitEYXRlOgkJSnVseSAyMDA2CitLZXJuZWxWZXJzaW9uOgkyLjYuMjIKK0NvbnRhY3Q6CUFydGVtIEJpdHl1dHNraXkgPGRlZGVraW5kQGluZnJhZGVhZC5vcmc+CitEZXNjcmlwdGlvbjoKKwkJVm9sdW1lIGFsaWdubWVudCAtIHRoZSB2YWx1ZSB0aGUgbG9naWNhbCBlcmFzZWJsb2NrIHNpemUgb2YKKwkJdGhpcyB2b2x1bWUgaGFzIHRvIGJlIGFsaWduZWQgb24uIEZvciBleGFtcGxlLCAyMDQ4IG1lYW5zIHRoYXQKKwkJbG9naWNhbCBlcmFzZWJsb2NrIHNpemUgaXMgbXVsdGlwbGUgb2YgMjA0OC4gSW4gb3RoZXIgd29yZHMsCisJCXZvbHVtZSBsb2dpY2FsIGVyYXNlYmxvY2sgc2l6ZSBpcyBVQkkgZGV2aWNlIGxvZ2ljYWwgZXJhc2VibG9jaworCQlzaXplIGFsaWduZWQgdG8gdGhlIGFsaWdubWVudCB2YWx1ZS4KKworV2hhdDoJCS9zeXMvY2xhc3MvdWJpL3ViaVgvdWJpWF9ZL2NvcnJ1cHRlZAorRGF0ZToJCUp1bHkgMjAwNgorS2VybmVsVmVyc2lvbjoJMi42LjIyCitDb250YWN0OglBcnRlbSBCaXR5dXRza2l5IDxkZWRla2luZEBpbmZyYWRlYWQub3JnPgorRGVzY3JpcHRpb246CisJCUNvbnRhaW5zIEFTQ0lJICIwXG4iIGlmIHRoZSBVQkkgdm9sdW1lIGlzIE9LLCBhbmQgQVNDSUkgIjFcbiIKKwkJaWYgaXQgaXMgY29ycnVwdGVkIChlLmcuLCBkdWUgdG8gYW4gaW50ZXJydXB0ZWQgdm9sdW1lIHVwZGF0ZSkuCisKK1doYXQ6CQkvc3lzL2NsYXNzL3ViaS91YmlYL3ViaVhfWS9kYXRhX2J5dGVzCitEYXRlOgkJSnVseSAyMDA2CitLZXJuZWxWZXJzaW9uOgkyLjYuMjIKK0NvbnRhY3Q6CUFydGVtIEJpdHl1dHNraXkgPGRlZGVraW5kQGluZnJhZGVhZC5vcmc+CitEZXNjcmlwdGlvbjoKKwkJVGhlIGFtb3VudCBvZiBkYXRhIHRoaXMgdm9sdW1lIGNvbnRhaW5zLiBUaGlzIHZhbHVlIG1ha2VzIHNlbnNlCisJCW9ubHkgZm9yIHN0YXRpYyB2b2x1bWVzLCBhbmQgZm9yIGR5bmFtaWMgdm9sdW1lIGl0IGVxdWl2YWxlbnQKKwkJdG8gdGhlIHRvdGFsIHZvbHVtZSBzaXplIGluIGJ5dGVzLgorCitXaGF0OgkJL3N5cy9jbGFzcy91YmkvdWJpWC91YmlYX1kvZGV2CitEYXRlOgkJSnVseSAyMDA2CitLZXJuZWxWZXJzaW9uOgkyLjYuMjIKK0NvbnRhY3Q6CUFydGVtIEJpdHl1dHNraXkgPGRlZGVraW5kQGluZnJhZGVhZC5vcmc+CitEZXNjcmlwdGlvbjoKKwkJTWFqb3IgYW5kIG1pbm9yIG51bWJlcnMgb2YgdGhlIGNoYXJhY3RlciBkZXZpY2UgY29ycmVzcG9uZGluZworCQl0byB0aGlzIFVCSSB2b2x1bWUgKGluIDxtYWpvcj46PG1pbm9yPiBmb3JtYXQpLgorCitXaGF0OgkJL3N5cy9jbGFzcy91YmkvdWJpWC91YmlYX1kvbmFtZQorRGF0ZToJCUp1bHkgMjAwNgorS2VybmVsVmVyc2lvbjoJMi42LjIyCitDb250YWN0OglBcnRlbSBCaXR5dXRza2l5IDxkZWRla2luZEBpbmZyYWRlYWQub3JnPgorRGVzY3JpcHRpb246CisJCVZvbHVtZSBuYW1lLgorCitXaGF0OgkJL3N5cy9jbGFzcy91YmkvdWJpWC91YmlYX1kvcmVzZXJ2ZWRfZWJzCitEYXRlOgkJSnVseSAyMDA2CitLZXJuZWxWZXJzaW9uOgkyLjYuMjIKK0NvbnRhY3Q6CUFydGVtIEJpdHl1dHNraXkgPGRlZGVraW5kQGluZnJhZGVhZC5vcmc+CitEZXNjcmlwdGlvbjoKKwkJQ291bnQgb2YgcGh5c2ljYWwgZXJhc2VibG9jayByZXNlcnZlZCBmb3IgdGhpcyB2b2x1bWUuCisJCUVxdWl2YWxlbnQgdG8gdGhlIHZvbHVtZSBzaXplIGluIGxvZ2ljYWwgZXJhc2VibG9ja3MuCisKK1doYXQ6CQkvc3lzL2NsYXNzL3ViaS91YmlYL3ViaVhfWS90eXBlCitEYXRlOgkJSnVseSAyMDA2CitLZXJuZWxWZXJzaW9uOgkyLjYuMjIKK0NvbnRhY3Q6CUFydGVtIEJpdHl1dHNraXkgPGRlZGVraW5kQGluZnJhZGVhZC5vcmc+CitEZXNjcmlwdGlvbjoKKwkJVm9sdW1lIHR5cGUuIENvbnRhaW5zIEFTQ0lJICJkeW5hbWljXG4iIGZvciBkeW5hbWljIHZvbHVtZXMgYW5kCisJCSJzdGF0aWNcbiIgZm9yIHN0YXRpYyB2b2x1bWVzLgorCitXaGF0OgkJL3N5cy9jbGFzcy91YmkvdWJpWC91YmlYX1kvdXBkX21hcmtlcgorRGF0ZToJCUp1bHkgMjAwNgorS2VybmVsVmVyc2lvbjoJMi42LjIyCitDb250YWN0OglBcnRlbSBCaXR5dXRza2l5IDxkZWRla2luZEBpbmZyYWRlYWQub3JnPgorRGVzY3JpcHRpb246CisJCUNvbnRhaW5zIEFTQ0lJICIwXG4iIGlmIHRoZSB1cGRhdGUgbWFya2VyIGlzIG5vdCBzZXQgZm9yIHRoaXMKKwkJdm9sdW1lLCBhbmQgIjFcbiIgaWYgaXQgaXMgc2V0LiBUaGUgdXBkYXRlIG1hcmtlciBpcyBzZXQgd2hlbgorCQl2b2x1bWUgdXBkYXRlIHN0YXJ0cywgYW5kIGNsZWFuZWQgd2hlbiBpdCBlbmRzLiBTbyB0aGUgcHJlc2VuY2UKKwkJb2YgdGhlIHVwZGF0ZSBtYXJrZXIgaW5kaWNhdGVzIHRoYXQgdGhlIHZvbHVtZSBpcyBiZWluZyB1cGRhdGVkCisJCWF0IHRoZSBtb21lbnQgb2YgdGhlIHVwZGF0ZSB3YXMgaW50ZXJydXB0ZWQuIFRoZSBsYXRlciBtYXkgYmUKKwkJY2hlY2tlZCB1c2luZyB0aGUgImNvcnJ1cHRlZCIgc3lzZnMgZmlsZS4KKworV2hhdDoJCS9zeXMvY2xhc3MvdWJpL3ViaVgvdWJpWF9ZL3VzYWJsZV9lYl9zaXplCitEYXRlOgkJSnVseSAyMDA2CitLZXJuZWxWZXJzaW9uOgkyLjYuMjIKK0NvbnRhY3Q6CUFydGVtIEJpdHl1dHNraXkgPGRlZGVraW5kQGluZnJhZGVhZC5vcmc+CitEZXNjcmlwdGlvbjoKKwkJTG9naWNhbCBlcmFzZWJsb2NrIHNpemUgb2YgdGhpcyB2b2x1bWUuIEVxdWl2YWxlbnQgdG8gbG9naWNhbAorCQllcmFzZWJsb2NrIHNpemUgb2YgdGhlIGRldmljZSBhbGlnbmVkIG9uIHRoZSB2b2x1bWUgYWxpZ25tZW50CisJCXZhbHVlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlCmluZGV4IGIyYjYzNjYuLjgzOTY2ZTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZQorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svTWFrZWZpbGUKQEAgLTE4Nyw4ICsxODcsMTEgQEAKIAogIyMjCiAjIFJ1bGUgdG8gY29udmVydCBhIC5jIGZpbGUgdG8gaW5saW5lIFhNTCBkb2N1bWVudGF0aW9uCisgICAgICAgZ2VuX3htbCA9IDoKKyBxdWlldF9nZW5feG1sID0gZWNobyAnICBHRU4gICAgICRAJworc2lsZW50X2dlbl94bWwgPSA6CiAlLnhtbDogJS5jCi0JQGVjaG8gJyAgR0VOICAgICAkQCcKKwlAJCgkKHF1aWV0KWdlbl94bWwpCiAJQCggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCSAgIGVjaG8gIjxwcm9ncmFtbGlzdGluZz4iOyAgIFwKIAkgICBleHBhbmQgLS10YWJzPTggPCAkPCB8ICAgICBcCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0hPV1RPIGIvRG9jdW1lbnRhdGlvbi9IT1dUTwppbmRleCA1NDgzNTYxLi4wMjkxYWRlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0hPV1RPCisrKyBiL0RvY3VtZW50YXRpb24vSE9XVE8KQEAgLTI0OSw5ICsyNDksMTEgQEAKICAgICByZWxlYXNlIGEgbmV3IC1yYyBrZXJuZWwgZXZlcnkgd2Vlay4KICAgLSBQcm9jZXNzIGNvbnRpbnVlcyB1bnRpbCB0aGUga2VybmVsIGlzIGNvbnNpZGVyZWQgInJlYWR5IiwgdGhlCiAgICAgcHJvY2VzcyBzaG91bGQgbGFzdCBhcm91bmQgNiB3ZWVrcy4KLSAgLSBBIGxpc3Qgb2Yga25vd24gcmVncmVzc2lvbnMgcHJlc2VudCBpbiBlYWNoIC1yYyByZWxlYXNlIGlzCi0gICAgdHJhY2tlZCBhdCB0aGUgZm9sbG93aW5nIFVSSToKLSAgICBodHRwOi8va2VybmVsbmV3Ymllcy5vcmcva25vd25fcmVncmVzc2lvbnMKKyAgLSBLbm93biByZWdyZXNzaW9ucyBpbiBlYWNoIHJlbGVhc2UgYXJlIHBlcmlvZGljYWxseSBwb3N0ZWQgdG8gdGhlIAorICAgIGxpbnV4LWtlcm5lbCBtYWlsaW5nIGxpc3QuICBUaGUgZ29hbCBpcyB0byByZWR1Y2UgdGhlIGxlbmd0aCBvZiAKKyAgICB0aGF0IGxpc3QgdG8gemVybyBiZWZvcmUgZGVjbGFyaW5nIHRoZSBrZXJuZWwgdG8gYmUgInJlYWR5LCIgYnV0LCBpbgorICAgIHRoZSByZWFsIHdvcmxkLCBhIHNtYWxsIG51bWJlciBvZiByZWdyZXNzaW9ucyBvZnRlbiByZW1haW4gYXQgCisgICAgcmVsZWFzZSB0aW1lLgogCiBJdCBpcyB3b3J0aCBtZW50aW9uaW5nIHdoYXQgQW5kcmV3IE1vcnRvbiB3cm90ZSBvbiB0aGUgbGludXgta2VybmVsCiBtYWlsaW5nIGxpc3QgYWJvdXQga2VybmVsIHJlbGVhc2VzOgpAQCAtMjYxLDcgKzI2Myw3IEBACiAKIDIuNi54LnkgLXN0YWJsZSBrZXJuZWwgdHJlZQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1LZXJuZWxzIHdpdGggNCBkaWdpdCB2ZXJzaW9ucyBhcmUgLXN0YWJsZSBrZXJuZWxzLiBUaGV5IGNvbnRhaW4KK0tlcm5lbHMgd2l0aCA0LXBhcnQgdmVyc2lvbnMgYXJlIC1zdGFibGUga2VybmVscy4gVGhleSBjb250YWluCiByZWxhdGl2ZWx5IHNtYWxsIGFuZCBjcml0aWNhbCBmaXhlcyBmb3Igc2VjdXJpdHkgcHJvYmxlbXMgb3Igc2lnbmlmaWNhbnQKIHJlZ3Jlc3Npb25zIGRpc2NvdmVyZWQgaW4gYSBnaXZlbiAyLjYueCBrZXJuZWwuCiAKQEAgLTI3Myw3ICsyNzUsMTAgQEAKIGtlcm5lbCBpcyB0aGUgY3VycmVudCBzdGFibGUga2VybmVsLgogCiAyLjYueC55IGFyZSBtYWludGFpbmVkIGJ5IHRoZSAic3RhYmxlIiB0ZWFtIDxzdGFibGVAa2VybmVsLm9yZz4sIGFuZCBhcmUKLXJlbGVhc2VkIGFsbW9zdCBldmVyeSBvdGhlciB3ZWVrLgorcmVsZWFzZWQgYXMgbmVlZHMgZGljdGF0ZS4gIFRoZSBub3JtYWwgcmVsZWFzZSBwZXJpb2QgaXMgYXBwcm94aW1hdGVseSAKK3R3byB3ZWVrcywgYnV0IGl0IGNhbiBiZSBsb25nZXIgaWYgdGhlcmUgYXJlIG5vIHByZXNzaW5nIHByb2JsZW1zLiAgQQorc2VjdXJpdHktcmVsYXRlZCBwcm9ibGVtLCBpbnN0ZWFkLCBjYW4gY2F1c2UgYSByZWxlYXNlIHRvIGhhcHBlbiBhbG1vc3QKK2luc3RhbnRseS4KIAogVGhlIGZpbGUgRG9jdW1lbnRhdGlvbi9zdGFibGVfa2VybmVsX3J1bGVzLnR4dCBpbiB0aGUga2VybmVsIHRyZWUKIGRvY3VtZW50cyB3aGF0IGtpbmRzIG9mIGNoYW5nZXMgYXJlIGFjY2VwdGFibGUgZm9yIHRoZSAtc3RhYmxlIHRyZWUsIGFuZApAQCAtMjk4LDcgKzMwMyw5IEBACiBpbmNsdXNpb24gaW4gbWFpbmxpbmUuCiAKIEl0IGlzIGhlYXZpbHkgZW5jb3VyYWdlZCB0aGF0IGFsbCBuZXcgcGF0Y2hlcyBnZXQgdGVzdGVkIGluIHRoZSAtbW0gdHJlZQotYmVmb3JlIHRoZXkgYXJlIHNlbnQgdG8gTGludXMgZm9yIGluY2x1c2lvbiBpbiB0aGUgbWFpbiBrZXJuZWwgdHJlZS4KK2JlZm9yZSB0aGV5IGFyZSBzZW50IHRvIExpbnVzIGZvciBpbmNsdXNpb24gaW4gdGhlIG1haW4ga2VybmVsIHRyZWUuICBDb2RlCit3aGljaCBkb2VzIG5vdCBtYWtlIGFuIGFwcGVhcmFuY2UgaW4gLW1tIGJlZm9yZSB0aGUgb3BlbmluZyBvZiB0aGUgbWVyZ2UKK3dpbmRvdyB3aWxsIHByb3ZlIGhhcmQgdG8gbWVyZ2UgaW50byB0aGUgbWFpbmxpbmUuCiAKIFRoZXNlIGtlcm5lbHMgYXJlIG5vdCBhcHByb3ByaWF0ZSBmb3IgdXNlIG9uIHN5c3RlbXMgdGhhdCBhcmUgc3VwcG9zZWQKIHRvIGJlIHN0YWJsZSBhbmQgdGhleSBhcmUgbW9yZSByaXNreSB0byBydW4gdGhhbiBhbnkgb2YgdGhlIG90aGVyCkBAIC0zNTQsMTEgKzM2MSwxMiBAQAogICAgIC0gU0NTSSwgSmFtZXMgQm90dG9tbGV5IDxKYW1lcy5Cb3R0b21sZXlAU3RlZWxFeWUuY29tPgogCWdpdC5rZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvamVqYi9zY3NpLW1pc2MtMi42LmdpdAogCisgICAgLSB4ODYsIEluZ28gTW9sbmFyIDxtaW5nb0BlbHRlLmh1PgorCWdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC94ODYvbGludXgtMi42LXg4Ni5naXQKKwogICBxdWlsdCB0cmVlczoKLSAgICAtIFVTQiwgUENJLCBEcml2ZXIgQ29yZSwgYW5kIEkyQywgR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAc3VzZS5kZT4KKyAgICAtIFVTQiwgRHJpdmVyIENvcmUsIGFuZCBJMkMsIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQHN1c2UuZGU+CiAJa2VybmVsLm9yZy9wdWIvbGludXgva2VybmVsL3Blb3BsZS9ncmVna2gvZ3JlZ2toLTIuNi8KLSAgICAtIHg4Ni02NCwgcGFydGx5IGkzODYsIEFuZGkgS2xlZW4gPGFrQHN1c2UuZGU+Ci0gICAgICAgIGZ0cC5maXJzdGZsb29yLm9yZzovcHViL2FrL3g4Nl82NC9xdWlsdC8KIAogICBPdGhlciBrZXJuZWwgdHJlZXMgY2FuIGJlIGZvdW5kIGxpc3RlZCBhdCBodHRwOi8vZ2l0Lmtlcm5lbC5vcmcvIGFuZCBpbgogICB0aGUgTUFJTlRBSU5FUlMgZmlsZS4KQEAgLTM5Miw4ICs0MDAsOCBAQAogYnVnbWUtbmV3IG1haWxpbmcgbGlzdCAob25seSBuZXcgYnVnIHJlcG9ydHMgYXJlIG1haWxlZCBoZXJlKSBvciB0byB0aGUKIGJ1Z21lLWphbml0b3IgbWFpbGluZyBsaXN0IChldmVyeSBjaGFuZ2UgaW4gdGhlIGJ1Z3ppbGxhIGlzIG1haWxlZCBoZXJlKQogCi0JaHR0cDovL2xpc3RzLm9zZGwub3JnL21haWxtYW4vbGlzdGluZm8vYnVnbWUtbmV3Ci0JaHR0cDovL2xpc3RzLm9zZGwub3JnL21haWxtYW4vbGlzdGluZm8vYnVnbWUtamFuaXRvcnMKKwlodHRwOi8vbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9idWdtZS1uZXcKKwlodHRwOi8vbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9idWdtZS1qYW5pdG9ycwogCiAKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hcm0vU2Ftc3VuZy1TM0MyNFhYL05BTkQudHh0IGIvRG9jdW1lbnRhdGlvbi9hcm0vU2Ftc3VuZy1TM0MyNFhYL05BTkQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNDc4YTMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2FybS9TYW1zdW5nLVMzQzI0WFgvTkFORC50eHQKQEAgLTAsMCArMSwzMCBAQAorCQkJUzNDMjRYWCBOQU5EIFN1cHBvcnQKKwkJCT09PT09PT09PT09PT09PT09PT09CisKK0ludHJvZHVjdGlvbgorLS0tLS0tLS0tLS0tCisKK1NtYWxsIFBhZ2UgTkFORAorLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBkcml2ZXIgdXNlcyBhIDUxMiBieXRlICgxIHBhZ2UpIEVDQyBjb2RlIGZvciB0aGlzIHNldHVwLiBUaGUKK0VDQyBjb2RlIGlzIG5vdCBkaXJlY3RseSBjb21wYXRpYmxlIHdpdGggdGhlIGRlZmF1bHQga2VybmVsIEVDQworY29kZSwgc28gdGhlIGRyaXZlciBlbmZvcmNlcyBpdHMgb3duIE9PQiBsYXlvdXQgYW5kIEVDQyBwYXJhbWV0ZXJzCisKK0xhcmdlIFBhZ2UgTkFORAorLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBkcml2ZXIgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyBOQU5EIGZsYXNoIHdpdGggYSAyS2lCIHBhZ2UKK3NpemUsIHdpdGggc3VwcG9ydCBmb3IgaGFyZHdhcmUgRUNDIGdlbmVyYXRpb24gYW5kIGNvcnJlY3Rpb24uCisKK1VubGlrZSB0aGUgNTEyYnl0ZSBwYWdlIG1vZGUsIHRoZSBkcml2ZXIgZ2VuZXJhdGVzIEVDQyBkYXRhIGZvcgorZWFjaCAyNTYgYnl0ZSBibG9jayBpbiBhbiAyS2lCIHBhZ2UuIFRoaXMgbWVhbnMgdGhhdCBtb3JlIHRoYW4KK29uZSBlcnJvciBpbiBhIHBhZ2UgY2FuIGJlIHJlY3RpZmllZC4gSXQgYWxzbyBtZWFucyB0aGF0IHRoZQorT09CIGxheW91dCByZW1haW5zIHRoZSBkZWZhdWx0IGtlcm5lbCBsYXlvdXQgZm9yIHRoZXNlIGZsYXNoZXMuCisKKworRG9jdW1lbnQgQXV0aG9yCistLS0tLS0tLS0tLS0tLS0KKworQmVuIERvb2tzLCBDb3B5cmlnaHQgMjAwNyBTaW10ZWMgRWxlY3Ryb25pY3MKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hcm0vU2Ftc3VuZy1TM0MyNFhYL092ZXJ2aWV3LnR4dCBiL0RvY3VtZW50YXRpb24vYXJtL1NhbXN1bmctUzNDMjRYWC9PdmVydmlldy50eHQKaW5kZXggYzMxYjc2Zi4uZDA0ZTFlMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hcm0vU2Ftc3VuZy1TM0MyNFhYL092ZXJ2aWV3LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2FybS9TYW1zdW5nLVMzQzI0WFgvT3ZlcnZpZXcudHh0CkBAIC0xNTYsNiArMTU2LDggQEAKICAgY29udHJvbGxlci4gSWYgdGhlcmUgYXJlIGFueSBwcm9ibGVtcyB0aGUgbGF0ZXN0IGxpbnV4LW10ZAogICBjb2RlIGNhbiBiZSBmb3VuZCBmcm9tIGh0dHA6Ly93d3cubGludXgtbXRkLmluZnJhZGVhZC5vcmcvCiAKKyAgRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIERvY3VtZW50YXRpb24vYXJtL1NhbXN1bmctUzNDMjRYWC9OQU5ELnR4dAorCiAKIFNlcmlhbAogLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZS1tYXBwZXIvZG0tY3J5cHQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL2RtLWNyeXB0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjgwY2FiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL2RtLWNyeXB0LnR4dApAQCAtMCwwICsxLDUyIEBACitkbS1jcnlwdAorPT09PT09PT09CisKK0RldmljZS1NYXBwZXIncyAiY3J5cHQiIHRhcmdldCBwcm92aWRlcyB0cmFuc3BhcmVudCBlbmNyeXB0aW9uIG9mIGJsb2NrIGRldmljZXMKK3VzaW5nIHRoZSBrZXJuZWwgY3J5cHRvIEFQSS4KKworUGFyYW1ldGVyczogPGNpcGhlcj4gPGtleT4gPGl2X29mZnNldD4gPGRldmljZSBwYXRoPiA8b2Zmc2V0PgorCis8Y2lwaGVyPgorICAgIEVuY3J5cHRpb24gY2lwaGVyIGFuZCBhbiBvcHRpb25hbCBJViBnZW5lcmF0aW9uIG1vZGUuCisgICAgKEluIGZvcm1hdCBjaXBoZXItY2hhaW5tb2RlLWl2b3B0czppdm1vZGUpLgorICAgIEV4YW1wbGVzOgorICAgICAgIGRlcworICAgICAgIGFlcy1jYmMtZXNzaXY6c2hhMjU2CisgICAgICAgdHdvZmlzaC1lY2IKKworICAgIC9wcm9jL2NyeXB0byBjb250YWlucyBzdXBwb3J0ZWQgY3J5cHRvIG1vZGVzCisKKzxrZXk+CisgICAgS2V5IHVzZWQgZm9yIGVuY3J5cHRpb24uIEl0IGlzIGVuY29kZWQgYXMgYSBoZXhhZGVjaW1hbCBudW1iZXIuCisgICAgWW91IGNhbiBvbmx5IHVzZSBrZXkgc2l6ZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoZSBzZWxlY3RlZCBjaXBoZXIuCisKKzxpdl9vZmZzZXQ+CisgICAgVGhlIElWIG9mZnNldCBpcyBhIHNlY3RvciBjb3VudCB0aGF0IGlzIGFkZGVkIHRvIHRoZSBzZWN0b3IgbnVtYmVyCisgICAgYmVmb3JlIGNyZWF0aW5nIHRoZSBJVi4KKworPGRldmljZSBwYXRoPgorICAgIFRoaXMgaXMgdGhlIGRldmljZSB0aGF0IGlzIGdvaW5nIHRvIGJlIHVzZWQgYXMgYmFja2VuZCBhbmQgY29udGFpbnMgdGhlCisgICAgZW5jcnlwdGVkIGRhdGEuICBZb3UgY2FuIHNwZWNpZnkgaXQgYXMgYSBwYXRoIGxpa2UgL2Rldi94eHggb3IgYSBkZXZpY2UKKyAgICBudW1iZXIgPG1ham9yPjo8bWlub3I+LgorCis8b2Zmc2V0PgorICAgIFN0YXJ0aW5nIHNlY3RvciB3aXRoaW4gdGhlIGRldmljZSB3aGVyZSB0aGUgZW5jcnlwdGVkIGRhdGEgYmVnaW5zLgorCitFeGFtcGxlIHNjcmlwdHMKKz09PT09PT09PT09PT09PQorTFVLUyAoTGludXggVW5pZmllZCBLZXkgU2V0dXApIGlzIG5vdyB0aGUgcHJlZmVycmVkIHdheSB0byBzZXQgdXAgZGlzaworZW5jcnlwdGlvbiB3aXRoIGRtLWNyeXB0IHVzaW5nIHRoZSAnY3J5cHRzZXR1cCcgdXRpbGl0eSwgc2VlCitodHRwOi8vbHVrcy5lbmRvcnBoaW4ub3JnLworCitbWworIyEvYmluL3NoCisjIENyZWF0ZSBhIGNyeXB0IGRldmljZSB1c2luZyBkbXNldHVwCitkbXNldHVwIGNyZWF0ZSBjcnlwdDEgLS10YWJsZSAiMCBgYmxvY2tkZXYgLS1nZXRzaXplICQxYCBjcnlwdCBhZXMtY2JjLWVzc2l2OnNoYTI1NiBiYWJlYmFiZWJhYmViYWJlYmFiZWJhYmViYWJlYmFiZSAwICQxIDAiCitdXQorCitbWworIyEvYmluL3NoCisjIENyZWF0ZSBhIGNyeXB0IGRldmljZSB1c2luZyBjcnlwdHNldHVwIGFuZCBMVUtTIGhlYWRlciB3aXRoIGRlZmF1bHQgY2lwaGVyCitjcnlwdHNldHVwIGx1a3NGb3JtYXQgJDEKK2NyeXB0c2V0dXAgbHVrc09wZW4gJDEgY3J5cHQxCitdXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9uZnMtcmRtYS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL25mcy1yZG1hLnR4dAppbmRleCAxYWUzNDg3Li5kMGVjNDVhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL25mcy1yZG1hLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL25mcy1yZG1hLnR4dApAQCAtNSw3ICs1LDcgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKICBBdXRob3I6IE5ldEFwcCBhbmQgT3BlbiBHcmlkIENvbXB1dGluZwotIERhdGU6IEZlYnJ1YXJ5IDI1LCAyMDA4CisgRGF0ZTogQXByaWwgMTUsIDIwMDgKIAogVGFibGUgb2YgQ29udGVudHMKIH5+fn5+fn5+fn5+fn5+fn5+CkBAIC0xOTcsMTIgKzE5NywxNiBAQAogICAtIE9uIHRoZSBzZXJ2ZXIgc3lzdGVtLCBjb25maWd1cmUgdGhlIC9ldGMvZXhwb3J0cyBmaWxlIGFuZAogICAgIHN0YXJ0IHRoZSBORlMvUkRNQSBzZXJ2ZXIuCiAKLSAgICBFeHBvcnRzIGVudHJpZXMgd2l0aCB0aGUgZm9sbG93aW5nIGZvcm1hdCBoYXZlIGJlZW4gdGVzdGVkOgorICAgIEV4cG9ydHMgZW50cmllcyB3aXRoIHRoZSBmb2xsb3dpbmcgZm9ybWF0cyBoYXZlIGJlZW4gdGVzdGVkOgogCi0gICAgL3ZvbDAgICAxMC45Ny4xMDMuNDcocncsYXN5bmMpIDE5Mi4xNjguMC40Nyhydyxhc3luYyxpbnNlY3VyZSxub19yb290X3NxdWFzaCkKKyAgICAvdm9sMCAgIDE5Mi4xNjguMC40Nyhmc2lkPTAscncsYXN5bmMsaW5zZWN1cmUsbm9fcm9vdF9zcXVhc2gpCisgICAgL3ZvbDAgICAxOTIuMTY4LjAuMC8yNTUuMjU1LjI1NS4wKGZzaWQ9MCxydyxhc3luYyxpbnNlY3VyZSxub19yb290X3NxdWFzaCkKIAotICAgIEhlcmUgdGhlIGZpcnN0IElQIGFkZHJlc3MgaXMgdGhlIGNsaWVudCdzIEV0aGVybmV0IGFkZHJlc3MgYW5kIHRoZSBzZWNvbmQKLSAgICBJUCBhZGRyZXNzIGlzIHRoZSBjbGllbnRzIElQb0lCIGFkZHJlc3MuCisgICAgVGhlIElQIGFkZHJlc3MoZXMpIGlzKGFyZSkgdGhlIGNsaWVudCdzIElQb0lCIGFkZHJlc3MgZm9yIGFuIEluZmluaUJhbmQgSENBIG9yIHRoZQorICAgIGNsZWludCdzIGlXQVJQIGFkZHJlc3MoZXMpIGZvciBhbiBSTklDLgorCisgICAgTk9URTogVGhlICJpbnNlY3VyZSIgb3B0aW9uIG11c3QgYmUgdXNlZCBiZWNhdXNlIHRoZSBORlMvUkRNQSBjbGllbnQgZG9lcyBub3QKKyAgICB1c2UgYSByZXNlcnZlZCBwb3J0LgogCiAgRWFjaCB0aW1lIGEgbWFjaGluZSBib290czoKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zZXFfZmlsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3NlcV9maWxlLnR4dAppbmRleCA3ZmI4ZTZkLi5iODQzNzQzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3NlcV9maWxlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3NlcV9maWxlLnR4dApAQCAtMTIyLDggKzEyMiw3IEBACiAJfQogCiBGaW5hbGx5LCB0aGUgc2hvdygpIGZ1bmN0aW9uIHNob3VsZCBmb3JtYXQgdGhlIG9iamVjdCBjdXJyZW50bHkgcG9pbnRlZCB0bwotYnkgdGhlIGl0ZXJhdG9yIGZvciBvdXRwdXQuIEl0IHNob3VsZCByZXR1cm4gemVybywgb3IgYW4gZXJyb3IgY29kZSBpZgotc29tZXRoaW5nIGdvZXMgd3JvbmcuIFRoZSBleGFtcGxlIG1vZHVsZSdzIHNob3coKSBmdW5jdGlvbiBpczoKK2J5IHRoZSBpdGVyYXRvciBmb3Igb3V0cHV0LiAgVGhlIGV4YW1wbGUgbW9kdWxlJ3Mgc2hvdygpIGZ1bmN0aW9uIGlzOgogCiAJc3RhdGljIGludCBjdF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCiAJewpAQCAtMTMyLDYgKzEzMSwxMiBAQAogCSAgICAgICAgcmV0dXJuIDA7CiAJfQogCitJZiBhbGwgaXMgd2VsbCwgdGhlIHNob3coKSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHplcm8uICBBIG5lZ2F0aXZlIGVycm9yCitjb2RlIGluIHRoZSB1c3VhbCBtYW5uZXIgaW5kaWNhdGVzIHRoYXQgc29tZXRoaW5nIHdlbnQgd3Jvbmc7IGl0IHdpbGwgYmUKK3Bhc3NlZCBiYWNrIHRvIHVzZXIgc3BhY2UuICBUaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIHJldHVybiBTRVFfU0tJUCwgd2hpY2gKK2NhdXNlcyB0aGUgY3VycmVudCBpdGVtIHRvIGJlIHNraXBwZWQ7IGlmIHRoZSBzaG93KCkgZnVuY3Rpb24gaGFzIGFscmVhZHkKK2dlbmVyYXRlZCBvdXRwdXQgYmVmb3JlIHJldHVybmluZyBTRVFfU0tJUCwgdGhhdCBvdXRwdXQgd2lsbCBiZSBkcm9wcGVkLgorCiBXZSB3aWxsIGxvb2sgYXQgc2VxX3ByaW50ZigpIGluIGEgbW9tZW50LiBCdXQgZmlyc3QsIHRoZSBkZWZpbml0aW9uIG9mIHRoZQogc2VxX2ZpbGUgaXRlcmF0b3IgaXMgZmluaXNoZWQgYnkgY3JlYXRpbmcgYSBzZXFfb3BlcmF0aW9ucyBzdHJ1Y3R1cmUgd2l0aAogdGhlIGZvdXIgZnVuY3Rpb25zIHdlIGhhdmUganVzdCBkZWZpbmVkOgpAQCAtMTgyLDEyICsxODcsMTggQEAKIGV4cGVjdC4gc2VxX2VzY2FwZSgpIGlzIGxpa2Ugc2VxX3B1dHMoKSwgZXhjZXB0IHRoYXQgYW55IGNoYXJhY3RlciBpbiBzCiB3aGljaCBpcyBpbiB0aGUgc3RyaW5nIGVzYyB3aWxsIGJlIHJlcHJlc2VudGVkIGluIG9jdGFsIGZvcm0gaW4gdGhlIG91dHB1dC4KIAotVGhlcmUgaXMgYWxzbyBhIGZ1bmN0aW9uIGZvciBwcmludGluZyBmaWxlbmFtZXM6CitUaGVyZSBpcyBhbHNvIGEgcGFpciBvZiBmdW5jdGlvbnMgZm9yIHByaW50aW5nIGZpbGVuYW1lczoKIAogCWludCBzZXFfcGF0aChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBwYXRoICpwYXRoLCBjaGFyICplc2MpOworCWludCBzZXFfcGF0aF9yb290KHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHBhdGggKnBhdGgsCisJCQkgIHN0cnVjdCBwYXRoICpyb290LCBjaGFyICplc2MpCiAKIEhlcmUsIHBhdGggaW5kaWNhdGVzIHRoZSBmaWxlIG9mIGludGVyZXN0LCBhbmQgZXNjIGlzIGEgc2V0IG9mIGNoYXJhY3RlcnMKLXdoaWNoIHNob3VsZCBiZSBlc2NhcGVkIGluIHRoZSBvdXRwdXQuCit3aGljaCBzaG91bGQgYmUgZXNjYXBlZCBpbiB0aGUgb3V0cHV0LiAgQSBjYWxsIHRvIHNlcV9wYXRoKCkgd2lsbCBvdXRwdXQKK3RoZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHByb2Nlc3MncyBmaWxlc3lzdGVtIHJvb3QuICBJZiBhIGRpZmZlcmVudAorcm9vdCBpcyBkZXNpcmVkLCBpdCBjYW4gYmUgdXNlZCB3aXRoIHNlcV9wYXRoX3Jvb3QoKS4gIE5vdGUgdGhhdCwgaWYgaXQKK3R1cm5zIG91dCB0aGF0IHBhdGggY2Fubm90IGJlIHJlYWNoZWQgZnJvbSByb290LCB0aGUgdmFsdWUgb2Ygcm9vdCB3aWxsIGJlCitjaGFuZ2VkIGluIHNlcV9maWxlX3Jvb3QoKSB0byBhIHJvb3Qgd2hpY2ggKmRvZXMqIHdvcmsuCiAKIAogTWFraW5nIGl0IGFsbCB3b3JrCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9tb2R1bGVzLnR4dCBiL0RvY3VtZW50YXRpb24va2J1aWxkL21vZHVsZXMudHh0CmluZGV4IDFkMjQ3ZDUuLjE4MjFjMDcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2J1aWxkL21vZHVsZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2J1aWxkL21vZHVsZXMudHh0CkBAIC00ODYsNyArNDg2LDcgQEAKIAlTb21ldGltZXMsIGFuIGV4dGVybmFsIG1vZHVsZSB1c2VzIGV4cG9ydGVkIHN5bWJvbHMgZnJvbSBhbm90aGVyCiAJZXh0ZXJuYWwgbW9kdWxlLiBLYnVpbGQgbmVlZHMgdG8gaGF2ZSBmdWxsIGtub3dsZWRnZSBvbiBhbGwgc3ltYm9scwogCXRvIGF2b2lkIHNwaXR0aW5nIG91dCB3YXJuaW5ncyBhYm91dCB1bmRlZmluZWQgc3ltYm9scy4KLQlUd28gc29sdXRpb25zIGV4aXN0IHRvIGxldCBrYnVpbGQga25vdyBhbGwgc3ltYm9scyBvZiBtb3JlIHRoYW4KKwlUaHJlZSBzb2x1dGlvbnMgZXhpc3QgdG8gbGV0IGtidWlsZCBrbm93IGFsbCBzeW1ib2xzIG9mIG1vcmUgdGhhbgogCW9uZSBleHRlcm5hbCBtb2R1bGUuCiAJVGhlIG1ldGhvZCB3aXRoIGEgdG9wLWxldmVsIGtidWlsZCBmaWxlIGlzIHJlY29tbWVuZGVkIGJ1dCBtYXkgYmUKIAlpbXByYWN0aWNhbCBpbiBjZXJ0YWluIHNpdHVhdGlvbnMuCkBAIC01MjMsNiArNTIzLDEzIEBACiAJCWNvbnRhaW5pbmcgdGhlIHN1bSBvZiBhbGwgc3ltYm9scyBkZWZpbmVkIGFuZCBub3QgcGFydCBvZiB0aGUKIAkJa2VybmVsLgogCisJVXNlIG1ha2UgdmFyaWFibGUgS0JVSUxEX0VYVFJBX1NZTUJPTFMgaW4gdGhlIE1ha2VmaWxlCisJCUlmIGl0IGlzIGltcHJhY3RpY2FsIHRvIGNvcHkgTW9kdWxlLnN5bXZlcnMgZnJvbSBhbm90aGVyCisJCW1vZHVsZSwgeW91IGNhbiBhc3NpZ24gYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBmaWxlcyB0bworCQlLQlVJTERfRVhUUkFfU1lNQk9MUyBpbiB5b3VyIE1ha2ZpbGUuIFRoZXNlIGZpbGVzIHdpbGwgYmUKKwkJbG9hZGVkIGJ5IG1vZHBvc3QgZHVyaW5nIHRoZSBpbml0aWFsaXNhdGlvbiBvZiBpdHMgc3ltYm9sCisJCXRhYmxlcy4KKwogPT09IDguIFRpcHMgJiBUcmlja3MKIAogLS0tIDguMSBUZXN0aW5nIGZvciBDT05GSUdfRk9PX0JBUgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3BoeS50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcGh5LnR4dAppbmRleCAwYmM5NWVhLi44ZGY2YTdiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcGh5LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcGh5LnR4dApAQCAtMSw3ICsxLDcgQEAKIAogLS0tLS0tLQogUEhZIEFic3RyYWN0aW9uIExheWVyCi0oVXBkYXRlZCAyMDA2LTExLTMwKQorKFVwZGF0ZWQgMjAwOC0wNC0wOCkKIAogUHVycG9zZQogCkBAIC0yOTEsMyArMjkxLDM5IEBACiAgRmVlbCBmcmVlIHRvIGxvb2sgYXQgdGhlIE1hcnZlbGwsIENpY2FkYSwgYW5kIERhdmljb20gZHJpdmVycyBpbgogIGRyaXZlcnMvbmV0L3BoeS8gZm9yIGV4YW1wbGVzICh0aGUgbHh0IGFuZCBxc2VtaSBkcml2ZXJzIGhhdmUKICBub3QgYmVlbiB0ZXN0ZWQgYXMgb2YgdGhpcyB3cml0aW5nKQorCitCb2FyZCBGaXh1cHMKKworIFNvbWV0aW1lcyB0aGUgc3BlY2lmaWMgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgcGxhdGZvcm0gYW5kIHRoZSBQSFkgcmVxdWlyZXMKKyBzcGVjaWFsIGhhbmRsaW5nLiAgRm9yIGluc3RhbmNlLCB0byBjaGFuZ2Ugd2hlcmUgdGhlIFBIWSdzIGNsb2NrIGlucHV0IGlzLAorIG9yIHRvIGFkZCBhIGRlbGF5IHRvIGFjY291bnQgZm9yIGxhdGVuY3kgaXNzdWVzIGluIHRoZSBkYXRhIHBhdGguICBJbiBvcmRlcgorIHRvIHN1cHBvcnQgc3VjaCBjb250aW5nZW5jaWVzLCB0aGUgUEhZIExheWVyIGFsbG93cyBwbGF0Zm9ybSBjb2RlIHRvIHJlZ2lzdGVyCisgZml4dXBzIHRvIGJlIHJ1biB3aGVuIHRoZSBQSFkgaXMgYnJvdWdodCB1cCAob3Igc3Vic2VxdWVudGx5IHJlc2V0KS4KKworIFdoZW4gdGhlIFBIWSBMYXllciBicmluZ3MgdXAgYSBQSFkgaXQgY2hlY2tzIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IGZpeHVwcworIHJlZ2lzdGVyZWQgZm9yIGl0LCBtYXRjaGluZyBiYXNlZCBvbiBVSUQgKGNvbnRhaW5lZCBpbiB0aGUgUEhZIGRldmljZSdzIHBoeV9pZAorIGZpZWxkKSBhbmQgdGhlIGJ1cyBpZGVudGlmaWVyIChjb250YWluZWQgaW4gcGh5ZGV2LT5kZXYuYnVzX2lkKS4gIEJvdGggbXVzdAorIG1hdGNoLCBob3dldmVyIHR3byBjb25zdGFudHMsIFBIWV9BTllfSUQgYW5kIFBIWV9BTllfVUlELCBhcmUgcHJvdmlkZWQgYXMKKyB3aWxkY2FyZHMgZm9yIHRoZSBidXMgSUQgYW5kIFVJRCwgcmVzcGVjdGl2ZWx5LgorCisgV2hlbiBhIG1hdGNoIGlzIGZvdW5kLCB0aGUgUEhZIGxheWVyIHdpbGwgaW52b2tlIHRoZSBydW4gZnVuY3Rpb24gYXNzb2NpYXRlZAorIHdpdGggdGhlIGZpeHVwLiAgVGhpcyBmdW5jdGlvbiBpcyBwYXNzZWQgYSBwb2ludGVyIHRvIHRoZSBwaHlfZGV2aWNlIG9mCisgaW50ZXJlc3QuICBJdCBzaG91bGQgdGhlcmVmb3JlIG9ubHkgb3BlcmF0ZSBvbiB0aGF0IFBIWS4KKworIFRoZSBwbGF0Zm9ybSBjb2RlIGNhbiBlaXRoZXIgcmVnaXN0ZXIgdGhlIGZpeHVwIHVzaW5nIHBoeV9yZWdpc3Rlcl9maXh1cCgpOgorCisJaW50IHBoeV9yZWdpc3Rlcl9maXh1cChjb25zdCBjaGFyICpwaHlfaWQsCisJCXUzMiBwaHlfdWlkLCB1MzIgcGh5X3VpZF9tYXNrLAorCQlpbnQgKCpydW4pKHN0cnVjdCBwaHlfZGV2aWNlICopKTsKKworIE9yIHVzaW5nIG9uZSBvZiB0aGUgdHdvIHN0dWJzLCBwaHlfcmVnaXN0ZXJfZml4dXBfZm9yX3VpZCgpIGFuZAorIHBoeV9yZWdpc3Rlcl9maXh1cF9mb3JfaWQoKToKKworIGludCBwaHlfcmVnaXN0ZXJfZml4dXBfZm9yX3VpZCh1MzIgcGh5X3VpZCwgdTMyIHBoeV91aWRfbWFzaywKKwkJaW50ICgqcnVuKShzdHJ1Y3QgcGh5X2RldmljZSAqKSk7CisgaW50IHBoeV9yZWdpc3Rlcl9maXh1cF9mb3JfaWQoY29uc3QgY2hhciAqcGh5X2lkLAorCQlpbnQgKCpydW4pKHN0cnVjdCBwaHlfZGV2aWNlICopKTsKKworIFRoZSBzdHVicyBzZXQgb25lIG9mIHRoZSB0d28gbWF0Y2hpbmcgY3JpdGVyaWEsIGFuZCBzZXQgdGhlIG90aGVyIG9uZSB0bworIG1hdGNoIGFueXRoaW5nLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3VzYi9hbmNob3JzLnR4dCBiL0RvY3VtZW50YXRpb24vdXNiL2FuY2hvcnMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMDRiY2YKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3VzYi9hbmNob3JzLnR4dApAQCAtMCwwICsxLDUwIEBACitXaGF0IGlzIGFuY2hvcj8KKz09PT09PT09PT09PT09PQorCitBIFVTQiBkcml2ZXIgbmVlZHMgdG8gc3VwcG9ydCBzb21lIGNhbGxiYWNrcyByZXF1aXJpbmcKK2EgZHJpdmVyIHRvIGNlYXNlIGFsbCBJTyB0byBhbiBpbnRlcmZhY2UuIFRvIGRvIHNvLCBhCitkcml2ZXIgaGFzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIFVSQnMgaXQgaGFzIHN1Ym1pdHRlZAordG8ga25vdyB0aGV5J3ZlIGFsbCBjb21wbGV0ZWQgb3IgdG8gY2FsbCB1c2Jfa2lsbF91cmIKK2ZvciB0aGVtLiBUaGUgYW5jaG9yIGlzIGEgZGF0YSBzdHJ1Y3R1cmUgdGFrZXMgY2FyZSBvZgora2VlcGluZyB0cmFjayBvZiBVUkJzIGFuZCBwcm92aWRlcyBtZXRob2RzIHRvIGRlYWwgd2l0aAorbXVsdGlwbGUgVVJCcy4KKworQWxsb2NhdGlvbiBhbmQgSW5pdGlhbGlzYXRpb24KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZXJlJ3Mgbm8gQVBJIHRvIGFsbG9jYXRlIGFuIGFuY2hvci4gSXQgaXMgc2ltcGx5IGRlY2xhcmVkCithcyBzdHJ1Y3QgdXNiX2FuY2hvci4gaW5pdF91c2JfYW5jaG9yKCkgbXVzdCBiZSBjYWxsZWQgdG8KK2luaXRpYWxpc2UgdGhlIGRhdGEgc3RydWN0dXJlLgorCitEZWFsbG9jYXRpb24KKz09PT09PT09PT09PQorCitPbmNlIGl0IGhhcyBubyBtb3JlIFVSQnMgYXNzb2NpYXRlZCB3aXRoIGl0LCB0aGUgYW5jaG9yIGNhbiBiZQorZnJlZWQgd2l0aCBub3JtYWwgbWVtb3J5IG1hbmFnZW1lbnQgb3BlcmF0aW9ucy4KKworQXNzb2NpYXRpb24gYW5kIGRpc2Fzc29jaWF0aW9uIG9mIFVSQnMgd2l0aCBhbmNob3JzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQW4gYXNzb2NpYXRpb24gb2YgVVJCcyB0byBhbiBhbmNob3IgaXMgbWFkZSBieSBhbiBleHBsaWNpdAorY2FsbCB0byB1c2JfYW5jaG9yX3VyYigpLiBUaGUgYXNzb2NpYXRpb24gaXMgbWFpbnRhaW5lZCB1bnRpbAorYW4gVVJCIGlzIGZpbmlzaGVkIGJ5IChzdWNjZXNzZnVsbCkgY29tcGxldGlvbi4gVGh1cyBkaXNhc3NvY2lhdGlvbgoraXMgYXV0b21hdGljLiBBIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHRvIGZvcmNpYmx5IGZpbmlzaCAoa2lsbCkKK2FsbCBVUkJzIGFzc29jaWF0ZWQgd2l0aCBhbiBhbmNob3IuCitGdXJ0aGVybW9yZSwgZGlzYXNzb2NpYXRpb24gY2FuIGJlIG1hZGUgd2l0aCB1c2JfdW5hbmNob3JfdXJiKCkKKworT3BlcmF0aW9ucyBvbiBtdWx0aXR1ZGVzIG9mIFVSQnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3VzYl9raWxsX2FuY2hvcmVkX3VyYnMoKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgZnVuY3Rpb24ga2lsbHMgYWxsIFVSQnMgYXNzb2NpYXRlZCB3aXRoIGFuIGFuY2hvci4gVGhlIFVSQnMKK2FyZSBjYWxsZWQgaW4gdGhlIHJldmVyc2UgdGVtcG9yYWwgb3JkZXIgdGhleSB3ZXJlIHN1Ym1pdHRlZC4KK1RoaXMgd2F5IG5vIGRhdGEgY2FuIGJlIHJlb3JkZXJlZC4KKwordXNiX3dhaXRfYW5jaG9yX2VtcHR5X3RpbWVvdXQoKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGZ1bmN0aW9uIHdhaXRzIGZvciBhbGwgVVJCcyBhc3NvY2lhdGVkIHdpdGggYW4gYW5jaG9yIHRvIGZpbmlzaAorb3IgYSB0aW1lb3V0LCB3aGljaGV2ZXIgY29tZXMgZmlyc3QuIEl0cyByZXR1cm4gdmFsdWUgd2lsbCB0ZWxsIHlvdQord2hldGhlciB0aGUgdGltZW91dCB3YXMgcmVhY2hlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNiL2NhbGxiYWNrcy50eHQgYi9Eb2N1bWVudGF0aW9uL3VzYi9jYWxsYmFja3MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjODEyNDEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3VzYi9jYWxsYmFja3MudHh0CkBAIC0wLDAgKzEsMTMyIEBACitXaGF0IGNhbGxiYWNrcyB3aWxsIHVzYmNvcmUgZG8/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1VzYmNvcmUgd2lsbCBjYWxsIGludG8gYSBkcml2ZXIgdGhyb3VnaCBjYWxsYmFja3MgZGVmaW5lZCBpbiB0aGUgZHJpdmVyCitzdHJ1Y3R1cmUgYW5kIHRocm91Z2ggdGhlIGNvbXBsZXRpb24gaGFuZGxlciBvZiBVUkJzIGEgZHJpdmVyIHN1Ym1pdHMuCitPbmx5IHRoZSBmb3JtZXIgYXJlIGluIHRoZSBzY29wZSBvZiB0aGlzIGRvY3VtZW50LiBUaGVzZSB0d28ga2luZHMgb2YKK2NhbGxiYWNrcyBhcmUgY29tcGxldGVseSBpbmRlcGVuZGVudCBvZiBlYWNoIG90aGVyLiBJbmZvcm1hdGlvbiBvbiB0aGUKK2NvbXBsZXRpb24gY2FsbGJhY2sgY2FuIGJlIGZvdW5kIGluIERvY3VtZW50YXRpb24vdXNiL1VSQi50eHQuCisKK1RoZSBjYWxsYmFja3MgZGVmaW5lZCBpbiB0aGUgZHJpdmVyIHN0cnVjdHVyZSBhcmU6CisKKzEuIEhvdHBsdWdnaW5nIGNhbGxiYWNrczoKKworICogQHByb2JlOiBDYWxsZWQgdG8gc2VlIGlmIHRoZSBkcml2ZXIgaXMgd2lsbGluZyB0byBtYW5hZ2UgYSBwYXJ0aWN1bGFyCisgKglpbnRlcmZhY2Ugb24gYSBkZXZpY2UuCisgKiBAZGlzY29ubmVjdDogQ2FsbGVkIHdoZW4gdGhlIGludGVyZmFjZSBpcyBubyBsb25nZXIgYWNjZXNzaWJsZSwgdXN1YWxseQorICoJYmVjYXVzZSBpdHMgZGV2aWNlIGhhcyBiZWVuIChvciBpcyBiZWluZykgZGlzY29ubmVjdGVkIG9yIHRoZQorICoJZHJpdmVyIG1vZHVsZSBpcyBiZWluZyB1bmxvYWRlZC4KKworMi4gT2RkIGJhY2tkb29yIHRocm91Z2ggdXNiZnM6CisKKyAqIEBpb2N0bDogVXNlZCBmb3IgZHJpdmVycyB0aGF0IHdhbnQgdG8gdGFsayB0byB1c2Vyc3BhY2UgdGhyb3VnaAorICoJdGhlICJ1c2JmcyIgZmlsZXN5c3RlbS4gIFRoaXMgbGV0cyBkZXZpY2VzIHByb3ZpZGUgd2F5cyB0bworICoJZXhwb3NlIGluZm9ybWF0aW9uIHRvIHVzZXIgc3BhY2UgcmVnYXJkbGVzcyBvZiB3aGVyZSB0aGV5CisgKglkbyAob3IgZG9uJ3QpIHNob3cgdXAgb3RoZXJ3aXNlIGluIHRoZSBmaWxlc3lzdGVtLgorCiszLiBQb3dlciBtYW5hZ2VtZW50IChQTSkgY2FsbGJhY2tzOgorCisgKiBAc3VzcGVuZDogQ2FsbGVkIHdoZW4gdGhlIGRldmljZSBpcyBnb2luZyB0byBiZSBzdXNwZW5kZWQuCisgKiBAcmVzdW1lOiBDYWxsZWQgd2hlbiB0aGUgZGV2aWNlIGlzIGJlaW5nIHJlc3VtZWQuCisgKiBAcmVzZXRfcmVzdW1lOiBDYWxsZWQgd2hlbiB0aGUgc3VzcGVuZGVkIGRldmljZSBoYXMgYmVlbiByZXNldCBpbnN0ZWFkCisgKglvZiBiZWluZyByZXN1bWVkLgorCis0LiBEZXZpY2UgbGV2ZWwgb3BlcmF0aW9uczoKKworICogQHByZV9yZXNldDogQ2FsbGVkIHdoZW4gdGhlIGRldmljZSBpcyBhYm91dCB0byBiZSByZXNldC4KKyAqIEBwb3N0X3Jlc2V0OiBDYWxsZWQgYWZ0ZXIgdGhlIGRldmljZSBoYXMgYmVlbiByZXNldAorCitUaGUgaW9jdGwgaW50ZXJmYWNlICgyKSBzaG91bGQgYmUgdXNlZCBvbmx5IGlmIHlvdSBoYXZlIGEgdmVyeSBnb29kCityZWFzb24uIFN5c2ZzIGlzIHByZWZlcnJlZCB0aGVzZSBkYXlzLiBUaGUgUE0gY2FsbGJhY2tzIGFyZSBjb3ZlcmVkCitzZXBhcmF0ZWx5IGluIERvY3VtZW50YXRpb24vdXNiL3Bvd2VyLW1hbmFnZW1lbnQudHh0LgorCitDYWxsaW5nIGNvbnZlbnRpb25zCis9PT09PT09PT09PT09PT09PT09CisKK0FsbCBjYWxsYmFja3MgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gVGhlcmUncyBubyBuZWVkIGZvciBsb2NraW5nCithZ2FpbnN0IG90aGVyIFVTQiBjYWxsYmFja3MuIEFsbCBjYWxsYmFja3MgYXJlIGNhbGxlZCBmcm9tIGEgdGFzaworY29udGV4dC4gWW91IG1heSBzbGVlcC4gSG93ZXZlciwgaXQgaXMgaW1wb3J0YW50IHRoYXQgYWxsIHNsZWVwcyBoYXZlIGEKK3NtYWxsIGZpeGVkIHVwcGVyIGxpbWl0IGluIHRpbWUuIEluIHBhcnRpY3VsYXIgeW91IG11c3Qgbm90IGNhbGwgb3V0IHRvCit1c2VyIHNwYWNlIGFuZCBhd2FpdCByZXN1bHRzLgorCitIb3RwbHVnZ2luZyBjYWxsYmFja3MKKz09PT09PT09PT09PT09PT09PT09PQorCitUaGVzZSBjYWxsYmFja3MgYXJlIGludGVuZGVkIHRvIGFzc29jaWF0ZSBhbmQgZGlzYXNzb2NpYXRlIGEgZHJpdmVyIHdpdGgKK2FuIGludGVyZmFjZS4gQSBkcml2ZXIncyBib25kIHRvIGFuIGludGVyZmFjZSBpcyBleGNsdXNpdmUuCisKK1RoZSBwcm9iZSgpIGNhbGxiYWNrCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgKCpwcm9iZSkgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOworCitBY2NlcHQgb3IgZGVjbGluZSBhbiBpbnRlcmZhY2UuIElmIHlvdSBhY2NlcHQgdGhlIGRldmljZSByZXR1cm4gMCwKK290aGVyd2lzZSAtRU5PREVWIG9yIC1FTlhJTy4gT3RoZXIgZXJyb3IgY29kZXMgc2hvdWxkIGJlIHVzZWQgb25seSBpZiBhCitnZW51aW5lIGVycm9yIG9jY3VycmVkIGR1cmluZyBpbml0aWFsaXNhdGlvbiB3aGljaCBwcmV2ZW50ZWQgYSBkcml2ZXIKK2Zyb20gYWNjZXB0aW5nIGEgZGV2aWNlIHRoYXQgd291bGQgZWxzZSBoYXZlIGJlZW4gYWNjZXB0ZWQuCitZb3UgYXJlIHN0cm9uZ2x5IGVuY291cmFnZWQgdG8gdXNlIHVzYmNvcmUnc2ZhY2lsaXR5LAordXNiX3NldF9pbnRmZGF0YSgpLCB0byBhc3NvY2lhdGUgYSBkYXRhIHN0cnVjdHVyZSB3aXRoIGFuIGludGVyZmFjZSwgc28KK3RoYXQgeW91IGtub3cgd2hpY2ggaW50ZXJuYWwgc3RhdGUgYW5kIGlkZW50aXR5IHlvdSBhc3NvY2lhdGUgd2l0aCBhCitwYXJ0aWN1bGFyIGludGVyZmFjZS4gVGhlIGRldmljZSB3aWxsIG5vdCBiZSBzdXNwZW5kZWQgYW5kIHlvdSBtYXkgZG8gSU8KK3RvIHRoZSBpbnRlcmZhY2UgeW91IGFyZSBjYWxsZWQgZm9yIGFuZCBlbmRwb2ludCAwIG9mIHRoZSBkZXZpY2UuIERldmljZQoraW5pdGlhbGlzYXRpb24gdGhhdCBkb2Vzbid0IHRha2UgdG9vIGxvbmcgaXMgYSBnb29kIGlkZWEgaGVyZS4KKworVGhlIGRpc2Nvbm5lY3QoKSBjYWxsYmFjaworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkICgqZGlzY29ubmVjdCkgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKKworVGhpcyBjYWxsYmFjayBpcyBhIHNpZ25hbCB0byBicmVhayBhbnkgY29ubmVjdGlvbiB3aXRoIGFuIGludGVyZmFjZS4KK1lvdSBhcmUgbm90IGFsbG93ZWQgYW55IElPIHRvIGEgZGV2aWNlIGFmdGVyIHJldHVybmluZyBmcm9tIHRoaXMKK2NhbGxiYWNrLiBZb3UgYWxzbyBtYXkgbm90IGRvIGFueSBvdGhlciBvcGVyYXRpb24gdGhhdCBtYXkgaW50ZXJmZXJlCit3aXRoIGFub3RoZXIgZHJpdmVyIGJvdW5kIHRoZSBpbnRlcmZhY2UsIGVnLiBhIHBvd2VyIG1hbmFnZW1lbnQKK29wZXJhdGlvbi4KK0lmIHlvdSBhcmUgY2FsbGVkIGR1ZSB0byBhIHBoeXNpY2FsIGRpc2Nvbm5lY3Rpb24sIGFsbCB5b3VyIFVSQnMgd2lsbCBiZQora2lsbGVkIGJ5IHVzYmNvcmUuIE5vdGUgdGhhdCBpbiB0aGlzIGNhc2UgZGlzY29ubmVjdCB3aWxsIGJlIGNhbGxlZCBzb21lCit0aW1lIGFmdGVyIHRoZSBwaHlzaWNhbCBkaXNjb25uZWN0aW9uLiBUaHVzIHlvdXIgZHJpdmVyIG11c3QgYmUgcHJlcGFyZWQKK3RvIGRlYWwgd2l0aCBmYWlsaW5nIElPIGV2ZW4gcHJpb3IgdG8gdGhlIGNhbGxiYWNrLgorCitEZXZpY2UgbGV2ZWwgY2FsbGJhY2tzCis9PT09PT09PT09PT09PT09PT09PT09CisKK3ByZV9yZXNldAorLS0tLS0tLS0tCisKK2ludCAoKnByZV9yZXNldCkoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOworCitBbm90aGVyIGRyaXZlciBvciB1c2VyIHNwYWNlIGlzIHRyaWdnZXJpbmcgYSByZXNldCBvbiB0aGUgZGV2aWNlIHdoaWNoCitjb250YWlucyB0aGUgaW50ZXJmYWNlIHBhc3NlZCBhcyBhbiBhcmd1bWVudC4gQ2Vhc2UgSU8gYW5kIHNhdmUgYW55CitkZXZpY2Ugc3RhdGUgeW91IG5lZWQgdG8gcmVzdG9yZS4KKworSWYgeW91IG5lZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGhlcmUsIHVzZSBHRlBfTk9JTyBvciBHRlBfQVRPTUlDLCBpZiB5b3UKK2FyZSBpbiBhdG9taWMgY29udGV4dC4KKworcG9zdF9yZXNldAorLS0tLS0tLS0tLQorCitpbnQgKCpwb3N0X3Jlc2V0KShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CisKK1RoZSByZXNldCBoYXMgY29tcGxldGVkLiAgUmVzdG9yZSBhbnkgc2F2ZWQgZGV2aWNlIHN0YXRlIGFuZCBiZWdpbgordXNpbmcgdGhlIGRldmljZSBhZ2Fpbi4KKworSWYgeW91IG5lZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGhlcmUsIHVzZSBHRlBfTk9JTyBvciBHRlBfQVRPTUlDLCBpZiB5b3UKK2FyZSBpbiBhdG9taWMgY29udGV4dC4KKworQ2FsbCBzZXF1ZW5jZXMKKz09PT09PT09PT09PT09CisKK05vIGNhbGxiYWNrcyBvdGhlciB0aGFuIHByb2JlIHdpbGwgYmUgaW52b2tlZCBmb3IgYW4gaW50ZXJmYWNlCit0aGF0IGlzbid0IGJvdW5kIHRvIHlvdXIgZHJpdmVyLgorCitQcm9iZSB3aWxsIG5ldmVyIGJlIGNhbGxlZCBmb3IgYW4gaW50ZXJmYWNlIGJvdW5kIHRvIGEgZHJpdmVyLgorSGVuY2UgZm9sbG93aW5nIGEgc3VjY2Vzc2Z1bCBwcm9iZSwgZGlzY29ubmVjdCB3aWxsIGJlIGNhbGxlZAorYmVmb3JlIHRoZXJlIGlzIGFub3RoZXIgcHJvYmUgZm9yIHRoZSBzYW1lIGludGVyZmFjZS4KKworT25jZSB5b3VyIGRyaXZlciBpcyBib3VuZCB0byBhbiBpbnRlcmZhY2UsIGRpc2Nvbm5lY3QgY2FuIGJlCitjYWxsZWQgYXQgYW55IHRpbWUgZXhjZXB0IGluIGJldHdlZW4gcHJlX3Jlc2V0IGFuZCBwb3N0X3Jlc2V0LgorcHJlX3Jlc2V0IGlzIGFsd2F5cyBmb2xsb3dlZCBieSBwb3N0X3Jlc2V0LCBldmVuIGlmIHRoZSByZXNldAorZmFpbGVkIG9yIHRoZSBkZXZpY2UgaGFzIGJlZW4gdW5wbHVnZ2VkLgorCitzdXNwZW5kIGlzIGFsd2F5cyBmb2xsb3dlZCBieSBvbmUgb2Y6IHJlc3VtZSwgcmVzZXRfcmVzdW1lLCBvcgorZGlzY29ubmVjdC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNiL3BlcnNpc3QudHh0IGIvRG9jdW1lbnRhdGlvbi91c2IvcGVyc2lzdC50eHQKaW5kZXggZGY1NGQ2NC4uZDU2Y2IxYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi91c2IvcGVyc2lzdC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi91c2IvcGVyc2lzdC50eHQKQEAgLTIsNyArMiw3IEBACiAKIAkJICAgQWxhbiBTdGVybiA8c3Rlcm5Acm93bGFuZC5oYXJ2YXJkLmVkdT4KIAotCQkgU2VwdGVtYmVyIDIsIDIwMDYgKFVwZGF0ZWQgTWF5IDI5LCAyMDA3KQorCQlTZXB0ZW1iZXIgMiwgMjAwNiAoVXBkYXRlZCBGZWJydWFyeSAyNSwgMjAwOCkKIAogCiAJV2hhdCBpcyB0aGUgcHJvYmxlbT8KQEAgLTY1LDkgKzY1LDEwIEBACiAKIAlXaGF0IGlzIHRoZSBzb2x1dGlvbj8KIAotU2V0dGluZyBDT05GSUdfVVNCX1BFUlNJU1Qgd2lsbCBjYXVzZSB0aGUga2VybmVsIHRvIHdvcmsgYXJvdW5kIHRoZXNlCi1pc3N1ZXMuICBJdCBlbmFibGVzIGEgbW9kZSBpbiB3aGljaCB0aGUgY29yZSBVU0IgZGV2aWNlIGRhdGEKLXN0cnVjdHVyZXMgYXJlIGFsbG93ZWQgdG8gcGVyc2lzdCBhY3Jvc3MgYSBwb3dlci1zZXNzaW9uIGRpc3J1cHRpb24uCitUaGUga2VybmVsIGluY2x1ZGVzIGEgZmVhdHVyZSBjYWxsZWQgVVNCLXBlcnNpc3QuICBJdCB0cmllcyB0byB3b3JrCithcm91bmQgdGhlc2UgaXNzdWVzIGJ5IGFsbG93aW5nIHRoZSBjb3JlIFVTQiBkZXZpY2UgZGF0YSBzdHJ1Y3R1cmVzIHRvCitwZXJzaXN0IGFjcm9zcyBhIHBvd2VyLXNlc3Npb24gZGlzcnVwdGlvbi4KKwogSXQgd29ya3MgbGlrZSB0aGlzLiAgSWYgdGhlIGtlcm5lbCBzZWVzIHRoYXQgYSBVU0IgaG9zdCBjb250cm9sbGVyIGlzCiBub3QgaW4gdGhlIGV4cGVjdGVkIHN0YXRlIGR1cmluZyByZXN1bWUgKGkuZS4sIGlmIHRoZSBjb250cm9sbGVyIHdhcwogcmVzZXQgb3Igb3RoZXJ3aXNlIGhhZCBsb3N0IHBvd2VyKSB0aGVuIGl0IGFwcGxpZXMgYSBwZXJzaXN0ZW5jZSBjaGVjawpAQCAtODAsMjggKzgxLDMwIEBACiBzYW1lIGRlc2NyaXB0b3JzIGFzIGJlZm9yZSwgaW5jbHVkaW5nIHRoZSBWZW5kb3IgYW5kIFByb2R1Y3QgSURzLCB0aGVuCiB0aGUga2VybmVsIGNvbnRpbnVlcyB0byB1c2UgdGhlIHNhbWUgZGV2aWNlIHN0cnVjdHVyZS4gIEluIGVmZmVjdCwgdGhlCiBrZXJuZWwgdHJlYXRzIHRoZSBkZXZpY2UgYXMgdGhvdWdoIGl0IGhhZCBtZXJlbHkgYmVlbiByZXNldCBpbnN0ZWFkIG9mCi11bnBsdWdnZWQuCit1bnBsdWdnZWQuICBUaGUgc2FtZSB0aGluZyBoYXBwZW5zIGlmIHRoZSBob3N0IGNvbnRyb2xsZXIgaXMgaW4gdGhlCitleHBlY3RlZCBzdGF0ZSBidXQgYSBVU0IgZGV2aWNlIHdhcyB1bnBsdWdnZWQgYW5kIHRoZW4gcmVwbHVnZ2VkLgogCiBJZiBubyBkZXZpY2UgaXMgbm93IGF0dGFjaGVkIHRvIHRoZSBwb3J0LCBvciBpZiB0aGUgZGVzY3JpcHRvcnMgYXJlCiBkaWZmZXJlbnQgZnJvbSB3aGF0IHRoZSBrZXJuZWwgcmVtZW1iZXJzLCB0aGVuIHRoZSB0cmVhdG1lbnQgaXMgd2hhdAogeW91IHdvdWxkIGV4cGVjdC4gIFRoZSBrZXJuZWwgZGVzdHJveXMgdGhlIG9sZCBkZXZpY2Ugc3RydWN0dXJlIGFuZAogYmVoYXZlcyBhcyB0aG91Z2ggdGhlIG9sZCBkZXZpY2UgaGFkIGJlZW4gdW5wbHVnZ2VkIGFuZCBhIG5ldyBkZXZpY2UKLXBsdWdnZWQgaW4sIGp1c3QgYXMgaXQgd291bGQgd2l0aG91dCB0aGUgQ09ORklHX1VTQl9QRVJTSVNUIG9wdGlvbi4KK3BsdWdnZWQgaW4uCiAKIFRoZSBlbmQgcmVzdWx0IGlzIHRoYXQgdGhlIFVTQiBkZXZpY2UgcmVtYWlucyBhdmFpbGFibGUgYW5kIHVzYWJsZS4KIEZpbGVzeXN0ZW0gbW91bnRzIGFuZCBtZW1vcnkgbWFwcGluZ3MgYXJlIHVuYWZmZWN0ZWQsIGFuZCB0aGUgd29ybGQgaXMKIG5vdyBhIGdvb2QgYW5kIGhhcHB5IHBsYWNlLgogCi1Ob3RlIHRoYXQgZXZlbiB3aGVuIENPTkZJR19VU0JfUEVSU0lTVCBpcyBzZXQsIHRoZSAicGVyc2lzdCIgZmVhdHVyZQotd2lsbCBiZSBhcHBsaWVkIG9ubHkgdG8gdGhvc2UgZGV2aWNlcyBmb3Igd2hpY2ggaXQgaXMgZW5hYmxlZC4gIFlvdQotY2FuIGVuYWJsZSB0aGUgZmVhdHVyZSBieSBkb2luZyAoYXMgcm9vdCk6CitOb3RlIHRoYXQgdGhlICJVU0ItcGVyc2lzdCIgZmVhdHVyZSB3aWxsIGJlIGFwcGxpZWQgb25seSB0byB0aG9zZQorZGV2aWNlcyBmb3Igd2hpY2ggaXQgaXMgZW5hYmxlZC4gIFlvdSBjYW4gZW5hYmxlIHRoZSBmZWF0dXJlIGJ5IGRvaW5nCisoYXMgcm9vdCk6CiAKIAllY2hvIDEgPi9zeXMvYnVzL3VzYi9kZXZpY2VzLy4uLi9wb3dlci9wZXJzaXN0CiAKIHdoZXJlIHRoZSAiLi4uIiBzaG91bGQgYmUgZmlsbGVkIGluIHRoZSB3aXRoIHRoZSBkZXZpY2UncyBJRC4gIERpc2FibGUKIHRoZSBmZWF0dXJlIGJ5IHdyaXRpbmcgMCBpbnN0ZWFkIG9mIDEuICBGb3IgaHVicyB0aGUgZmVhdHVyZSBpcwotYXV0b21hdGljYWxseSBhbmQgcGVybWFuZW50bHkgZW5hYmxlZCwgc28geW91IG9ubHkgaGF2ZSB0byB3b3JyeSBhYm91dAotc2V0dGluZyBpdCBmb3IgZGV2aWNlcyB3aGVyZSBpdCByZWFsbHkgbWF0dGVycy4KK2F1dG9tYXRpY2FsbHkgYW5kIHBlcm1hbmVudGx5IGVuYWJsZWQgYW5kIHRoZSBwb3dlci9wZXJzaXN0IGZpbGUKK2RvZXNuJ3QgZXZlbiBleGlzdCwgc28geW91IG9ubHkgaGF2ZSB0byB3b3JyeSBhYm91dCBzZXR0aW5nIGl0IGZvcgorZGV2aWNlcyB3aGVyZSBpdCByZWFsbHkgbWF0dGVycy4KIAogCiAJSXMgdGhpcyB0aGUgYmVzdCBzb2x1dGlvbj8KQEAgLTExMiwxOSArMTE1LDE5IEBACiB0byBwbHVnIGluIGEgVVNCIGZsYXNoIGRldmljZSwgY3JlYXRlIGEgcGVyc2lzdGVudCB2b2x1bWUgYXNzb2NpYXRlZAogd2l0aCBpdCwgdW5wbHVnIHRoZSBmbGFzaCBkZXZpY2UsIHBsdWcgaXQgYmFjayBpbiBsYXRlciwgYW5kIHN0aWxsCiBoYXZlIHRoZSBzYW1lIHBlcnNpc3RlbnQgdm9sdW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlLiAgQXMgc3VjaAotaXQgd291bGQgYmUgbW9yZSBmYXItcmVhY2hpbmcgdGhhbiBDT05GSUdfVVNCX1BFUlNJU1QuCitpdCB3b3VsZCBiZSBtb3JlIGZhci1yZWFjaGluZyB0aGFuIFVTQi1wZXJzaXN0LgogCiBPbiB0aGUgb3RoZXIgaGFuZCwgd3JpdGluZyBhIHBlcnNpc3RlbnQgdm9sdW1lIG1hbmFnZXIgd291bGQgYmUgYSBiaWcKIGpvYiBhbmQgdXNpbmcgaXQgd291bGQgcmVxdWlyZSBzaWduaWZpY2FudCBpbnB1dCBmcm9tIHRoZSB1c2VyLiAgVGhpcwogc29sdXRpb24gaXMgbXVjaCBxdWlja2VyIGFuZCBlYXNpZXIgLS0gYW5kIGl0IGV4aXN0cyBub3csIGEgZ2lhbnQKIHBvaW50IGluIGl0cyBmYXZvciEKIAotRnVydGhlcm1vcmUsIHRoZSBVU0JfUEVSU0lTVCBvcHRpb24gYXBwbGllcyB0byBfYWxsXyBVU0IgZGV2aWNlcywgbm90CitGdXJ0aGVybW9yZSwgdGhlIFVTQi1wZXJzaXN0IGZlYXR1cmUgYXBwbGllcyB0byBfYWxsXyBVU0IgZGV2aWNlcywgbm90CiBqdXN0IG1hc3Mtc3RvcmFnZSBkZXZpY2VzLiAgSXQgbWlnaHQgdHVybiBvdXQgdG8gYmUgZXF1YWxseSB1c2VmdWwgZm9yCiBvdGhlciBkZXZpY2UgdHlwZXMsIHN1Y2ggYXMgbmV0d29yayBpbnRlcmZhY2VzLgogCiAKLQlXQVJOSU5HOiBVc2luZyBDT05GSUdfVVNCX1BFUlNJU1QgY2FuIGJlIGRhbmdlcm91cyEhCisJV0FSTklORzogVVNCLXBlcnNpc3QgY2FuIGJlIGRhbmdlcm91cyEhCiAKIFdoZW4gcmVjb3ZlcmluZyBhbiBpbnRlcnJ1cHRlZCBwb3dlciBzZXNzaW9uIHRoZSBrZXJuZWwgZG9lcyBpdHMgYmVzdAogdG8gbWFrZSBzdXJlIHRoZSBVU0IgZGV2aWNlIGhhc24ndCBiZWVuIGNoYW5nZWQ7IHRoYXQgaXMsIHRoZSBzYW1lCkBAIC0xMzMsMTAgKzEzNiwxMCBAQAogCiBJZiB5b3UgcmVwbGFjZSBvbmUgVVNCIGRldmljZSB3aXRoIGFub3RoZXIgb2YgdGhlIHNhbWUgdHlwZSAoc2FtZQogbWFudWZhY3R1cmVyLCBzYW1lIElEcywgYW5kIHNvIG9uKSB0aGVyZSdzIGFuIGV4Y2VsbGVudCBjaGFuY2UgdGhlCi1rZXJuZWwgd29uJ3QgZGV0ZWN0IHRoZSBjaGFuZ2UuICBTZXJpYWwgbnVtYmVycyBhbmQgb3RoZXIgc3RyaW5ncyBhcmUKLW5vdCBjb21wYXJlZC4gIEluIG1hbnkgY2FzZXMgaXQgd291bGRuJ3QgaGVscCBpZiB0aGV5IHdlcmUsIGJlY2F1c2UKLW1hbnVmYWN0dXJlcnMgZnJlcXVlbnRseSBvbWl0IHNlcmlhbCBudW1iZXJzIGVudGlyZWx5IGluIHRoZWlyCi1kZXZpY2VzLgora2VybmVsIHdvbid0IGRldGVjdCB0aGUgY2hhbmdlLiAgVGhlIHNlcmlhbCBudW1iZXIgc3RyaW5nIGFuZCBvdGhlcgorZGVzY3JpcHRvcnMgYXJlIGNvbXBhcmVkIHdpdGggdGhlIGtlcm5lbCdzIHN0b3JlZCB2YWx1ZXMsIGJ1dCB0aGlzCittaWdodCBub3QgaGVscCBzaW5jZSBtYW51ZmFjdHVyZXJzIGZyZXF1ZW50bHkgb21pdCBzZXJpYWwgbnVtYmVycworZW50aXJlbHkgaW4gdGhlaXIgZGV2aWNlcy4KIAogRnVydGhlcm1vcmUgaXQncyBxdWl0ZSBwb3NzaWJsZSB0byBsZWF2ZSBhIFVTQiBkZXZpY2UgZXhhY3RseSB0aGUgc2FtZQogd2hpbGUgY2hhbmdpbmcgaXRzIG1lZGlhLiAgSWYgeW91IHJlcGxhY2UgdGhlIGZsYXNoIG1lbW9yeSBjYXJkIGluIGEKQEAgLTE1Miw1ICsxNTUsNSBAQAogWU9VIEhBVkUgQkVFTiBXQVJORUQhICBVU0UgQVQgWU9VUiBPV04gUklTSyEKIAogVGhhdCBoYXZpbmcgYmVlbiBzYWlkLCBtb3N0IG9mIHRoZSB0aW1lIHRoZXJlIHNob3VsZG4ndCBiZSBhbnkgdHJvdWJsZQotYXQgYWxsLiAgVGhlICJwZXJzaXN0IiBmZWF0dXJlIGNhbiBiZSBleHRyZW1lbHkgdXNlZnVsLiAgTWFrZSB0aGUgbW9zdAotb2YgaXQuCithdCBhbGwuICBUaGUgVVNCLXBlcnNpc3QgZmVhdHVyZSBjYW4gYmUgZXh0cmVtZWx5IHVzZWZ1bC4gIE1ha2UgdGhlCittb3N0IG9mIGl0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2IvdXNiLXNlcmlhbC50eHQgYi9Eb2N1bWVudGF0aW9uL3VzYi91c2Itc2VyaWFsLnR4dAppbmRleCA4YjA3N2U0Li5mZjJjMWZmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3VzYi91c2Itc2VyaWFsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3VzYi91c2Itc2VyaWFsLnR4dApAQCAtMTkyLDEyICsxOTIsOSBAQAogCiBGVERJIFNpbmdsZSBQb3J0IFNlcmlhbCBEcml2ZXIKIAotICBUaGlzIGlzIGEgc2luZ2xlIHBvcnQgREItMjUgc2VyaWFsIGFkYXB0ZXIuIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcwotICBkZXZpY2UgYW5kIHRoZSBMaW51eCBkcml2ZXIgY2FuIGJlIGZvdW5kIGF0OgotCWh0dHA6Ly9yZWFsaXR5LnNnaS5jb20vYnJ5ZGVyX3dlbGxpbmd0b24vZnRkaV9zaW8vCisgIFRoaXMgaXMgYSBzaW5nbGUgcG9ydCBEQi0yNSBzZXJpYWwgYWRhcHRlci4KIAotICBGb3IgYW55IHF1ZXN0aW9ucyBvciBwcm9ibGVtcyB3aXRoIHRoaXMgZHJpdmVyLCBwbGVhc2UgY29udGFjdCBCaWxsIFJ5ZGVyCi0gIGF0IGJyeWRlckBzZ2kuY29tCisgIEZvciBhbnkgcXVlc3Rpb25zIG9yIHByb2JsZW1zIHdpdGggdGhpcyBkcml2ZXIsIHBsZWFzZSBjb250YWN0IEJpbGwgUnlkZXIuCiAKIAogWnlYRUwgb21uaS5uZXQgbGNkIHBsdXMgSVNETiBUQQpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCBmNTBlOTI3Li4yZWRlYzAwIDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtNDM1Niw2ICs0MzU2LDE2IEBACiBXOglodHRwOi8vb29wcy5naG9zdHByb3RvY29scy5uZXQ6ODEvYmxvZwogUzoJTWFpbnRhaW5lZAogCitXTTk3WFggVE9VQ0hTQ1JFRU4gRFJJVkVSUworUDoJTWFyayBCcm93bgorTToJYnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20KK1A6CUxpYW0gR2lyZHdvb2QKK006CWxpYW0uZ2lyZHdvb2RAd29sZnNvbm1pY3JvLmNvbQorTDoJbGludXgtaW5wdXRAdmdlci5rZXJuZWwub3JnCitUOglnaXQgZ2l0Oi8vb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tL2xpbnV4LTIuNi10b3VjaAorVzoJaHR0cDovL29wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbS9ub2RlLzcKK1M6CVN1cHBvcnRlZAorCiBYLjI1IE5FVFdPUksgTEFZRVIKIFA6CUhlbm5lciBFaXNlbgogTToJZWlzQGJhdHkuaGFuc2UuZGUKZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggM2RiYzgyNi4uZmMzNDExZSAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTUwNyw2ICs1MDcsMTAgQEAKIEtCVUlMRF9DRkxBR1MJKz0gLU8yCiBlbmRpZgogCitpZm5lcSAoQ09ORklHX0ZSQU1FX1dBUk4sMCkKK0tCVUlMRF9DRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtV2ZyYW1lLWxhcmdlci10aGFuPSR7Q09ORklHX0ZSQU1FX1dBUk59KQorZW5kaWYKKwogIyBGb3JjZSBnY2MgdG8gYmVoYXZlIGNvcnJlY3QgZXZlbiBmb3IgYnVnZ3kgZGlzdHJpYnV0aW9ucwogIyBBcmNoIE1ha2VmaWxlcyBtYXkgb3ZlcnJpZGUgdGhpcyBzZXR0aW5nCiBLQlVJTERfQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sIC1mbm8tc3RhY2stcHJvdGVjdG9yKQpAQCAtMTM5Niw3ICsxNDAwLDcgQEAKIAkgICAgJChhbGwta2NvbmZpZ3MpIHwgeGFyZ3MgJDEgLWEgXAogCQktLWxhbmdkZWY9a2NvbmZpZyBcCiAJCS0tbGFuZ3VhZ2UtZm9yY2U9a2NvbmZpZyBcCi0JCS0tcmVnZXgta2NvbmZpZz0nL15bWzpibGFuazpdXSpjb25maWdbWzpibGFuazpdXSsoW1s6YWxudW06XV9dKykvXDEvJzsgXAorCQktLXJlZ2V4LWtjb25maWc9Jy9eW1s6Ymxhbms6XV0qKG1lbnV8KWNvbmZpZ1tbOmJsYW5rOl1dKyhbWzphbG51bTpdX10rKS9cMi8nOyBcCiAJICAgICQoYWxsLWRlZmNvbmZpZ3MpIHwgeGFyZ3MgLXIgJDEgLWEgXAogCQktLWxhbmdkZWY9ZG90Y29uZmlnIFwKIAkJLS1sYW5ndWFnZS1mb3JjZT1kb3Rjb25maWcgXApAQCAtMTQwNCw3ICsxNDA4LDcgQEAKIAllbGlmICQxIC0tdmVyc2lvbiAyPiYxIHwgZ3JlcCAtaXEgZW1hY3M7IHRoZW4gXAogCSAgICAkKGFsbC1zb3VyY2VzKSB8IHhhcmdzICQxIC1hOyBcCiAJICAgICQoYWxsLWtjb25maWdzKSB8IHhhcmdzICQxIC1hIFwKLQkJLS1yZWdleD0nL15bIFx0XSpjb25maWdbIFx0XStcKFthLXpBLVowLTlfXStcKS9cMS8nOyBcCisJCS0tcmVnZXg9Jy9eWyBcdF0qKG1lbnV8KWNvbmZpZ1sgXHRdK1woW2EtekEtWjAtOV9dK1wpL1wyLyc7IFwKIAkgICAgJChhbGwtZGVmY29uZmlncykgfCB4YXJncyAtciAkMSAtYSBcCiAJCS0tcmVnZXg9Jy9eIz9bIFx0XT9cKENPTkZJR19bYS16QS1aMC05X10rXCkvXDEvJzsgXAogCWVsc2UgXApAQCAtMTUzOSw3ICsxNTQzLDYgQEAKICAgICAgIGNtZF9ybWZpbGVzID0gcm0gLWYgJChybS1maWxlcykKIAogIyBSdW4gZGVwbW9kIG9ubHkgaWYgd2UgaGF2ZSBTeXN0ZW0ubWFwIGFuZCBkZXBtb2QgaXMgZXhlY3V0YWJsZQotIyBhbmQgd2UgYnVpbGQgZm9yIHRoZSBob3N0IGFyY2gKIHF1aWV0X2NtZF9kZXBtb2QgPSBERVBNT0QgICQoS0VSTkVMUkVMRUFTRSkKICAgICAgIGNtZF9kZXBtb2QgPSBcCiAJaWYgWyAtciBTeXN0ZW0ubWFwIC1hIC14ICQoREVQTU9EKSBdOyB0aGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zbXAuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc21wLmMKaW5kZXggNTI0Yjg4OS4uNDA5ZGQ3MSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3NtcC5jCkBAIC04NjYsMTQgKzg2NiwyMSBAQAogCXZvaWQgKmluZm8gPSBjYWxsX2RhdGEtPmluZm87CiAKIAljbGVhcl9zb2Z0aW50KDEgPDwgaXJxKTsKLQlpZiAoY2FsbF9kYXRhLT53YWl0KSB7Ci0JCS8qIGxldCBpbml0aWF0b3IgcHJvY2VlZCBvbmx5IGFmdGVyIGNvbXBsZXRpb24gKi8KLQkJZnVuYyhpbmZvKTsKLQkJYXRvbWljX2luYygmY2FsbF9kYXRhLT5maW5pc2hlZCk7Ci0JfSBlbHNlIHsKKworCWlycV9lbnRlcigpOworCisJaWYgKCFjYWxsX2RhdGEtPndhaXQpIHsKIAkJLyogbGV0IGluaXRpYXRvciBwcm9jZWVkIGFmdGVyIGdldHRpbmcgZGF0YSAqLwogCQlhdG9taWNfaW5jKCZjYWxsX2RhdGEtPmZpbmlzaGVkKTsKLQkJZnVuYyhpbmZvKTsKKwl9CisKKwlmdW5jKGluZm8pOworCisJaXJxX2V4aXQoKTsKKworCWlmIChjYWxsX2RhdGEtPndhaXQpIHsKKwkJLyogbGV0IGluaXRpYXRvciBwcm9jZWVkIG9ubHkgYWZ0ZXIgY29tcGxldGlvbiAqLworCQlhdG9taWNfaW5jKCZjYWxsX2RhdGEtPmZpbmlzaGVkKTsKIAl9CiB9CiAKQEAgLTEwMzIsNyArMTAzOSw5IEBACiAKIHZvaWQgc21wX3JlY2VpdmVfc2lnbmFsX2NsaWVudChpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKKwlpcnFfZW50ZXIoKTsKIAljbGVhcl9zb2Z0aW50KDEgPDwgaXJxKTsKKwlpcnFfZXhpdCgpOwogfQogCiB2b2lkIHNtcF9uZXdfbW11X2NvbnRleHRfdmVyc2lvbl9jbGllbnQoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCkBAIC0xMDQwLDYgKzEwNDksOCBAQAogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlpcnFfZW50ZXIoKTsKKwogCWNsZWFyX3NvZnRpbnQoMSA8PCBpcnEpOwogCiAJLyogU2VlIGlmIHdlIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgVExCIGNvbnRleHQgYmVjYXVzZQpAQCAtMTA1OSw2ICsxMDcwLDggQEAKIAlsb2FkX3NlY29uZGFyeV9jb250ZXh0KG1tKTsKIAlfX2ZsdXNoX3RsYl9tbShDVFhfSFdCSVRTKG1tLT5jb250ZXh0KSwKIAkJICAgICAgIFNFQ09OREFSWV9DT05URVhUKTsKKworCWlycV9leGl0KCk7CiB9CiAKIHZvaWQgc21wX25ld19tbXVfY29udGV4dF92ZXJzaW9uKHZvaWQpCkBAIC0xMjE3LDYgKzEyMzAsOCBAQAogewogCWNsZWFyX3NvZnRpbnQoMSA8PCBpcnEpOwogCisJaXJxX2VudGVyKCk7CisKIAlwcmVlbXB0X2Rpc2FibGUoKTsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKCJmbHVzaHciKTsKQEAgLTEyMjksNiArMTI0NCw4IEBACiAJcHJvbV93b3JsZCgwKTsKIAogCXByZWVtcHRfZW5hYmxlKCk7CisKKwlpcnFfZXhpdCgpOwogfQogCiAvKiAvcHJvYy9wcm9maWxlIHdyaXRlcyBjYW4gY2FsbCB0aGlzLCBkb24ndCBfX2luaXQgaXQgcGxlYXNlLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXNfc3BhcmMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzX3NwYXJjLmMKaW5kZXggNzNlZDAxYi4uOGQ0NzYxZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXNfc3BhcmMuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3N5c19zcGFyYy5jCkBAIC00NTQsOCArNDU0LDggQEAKIAkJCWVyciA9IHN5c19zZW1nZXQoZmlyc3QsIChpbnQpc2Vjb25kLCAoaW50KXRoaXJkKTsKIAkJCWdvdG8gb3V0OwogCQljYXNlIFNFTUNUTDogewotCQkJZXJyID0gc3lzX3NlbWN0bChmaXJzdCwgdGhpcmQsCi0JCQkJCSAoaW50KXNlY29uZCB8IElQQ182NCwKKwkJCWVyciA9IHN5c19zZW1jdGwoZmlyc3QsIHNlY29uZCwKKwkJCQkJIChpbnQpdGhpcmQgfCBJUENfNjQsCiAJCQkJCSAodW5pb24gc2VtdW4pIHB0cik7CiAJCQlnb3RvIG91dDsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC8uZ2l0aWdub3JlIGIvYXJjaC94ODYvYm9vdC8uZ2l0aWdub3JlCmluZGV4IGIxYmRjNGMuLjE3MmNmOGEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvLmdpdGlnbm9yZQorKysgYi9hcmNoL3g4Ni9ib290Ly5naXRpZ25vcmUKQEAgLTEsNyArMSw4IEBACiBib290c2VjdAogYnpJbWFnZQorY3B1c3RyLmgKK21rY3B1c3RyCitvZmZzZXRzLmgKIHNldHVwCiBzZXR1cC5iaW4KIHNldHVwLmVsZgotY3B1c3RyLmgKLW1rY3B1c3RyCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9yZWFsbW9kZS8uZ2l0aWdub3JlIGIvYXJjaC94ODYva2VybmVsL2FjcGkvcmVhbG1vZGUvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGYxZjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYva2VybmVsL2FjcGkvcmVhbG1vZGUvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDMgQEAKK3dha2V1cC5iaW4KK3dha2V1cC5lbGYKK3dha2V1cC5sZHMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hbHRlcm5hdGl2ZS5jIGIvYXJjaC94ODYva2VybmVsL2FsdGVybmF0aXZlLmMKaW5kZXggZGY0MDk5ZC4uNjVjNzg1NyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FsdGVybmF0aXZlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FsdGVybmF0aXZlLmMKQEAgLTUxMSwzMSArNTExLDMwIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAljaGFyICp2YWRkcjsKIAlpbnQgbnJfcGFnZXMgPSAyOworCXN0cnVjdCBwYWdlICpwYWdlc1syXTsKKwlpbnQgaTsKIAotCUJVR19PTihsZW4gPiBzaXplb2YobG9uZykpOwotCUJVR19PTigoKChsb25nKWFkZHIgKyBsZW4gLSAxKSAmIH4oc2l6ZW9mKGxvbmcpIC0gMSkpCi0JCS0gKChsb25nKWFkZHIgJiB+KHNpemVvZihsb25nKSAtIDEpKSk7Ci0JaWYgKGtlcm5lbF90ZXh0X2FkZHJlc3MoKHVuc2lnbmVkIGxvbmcpYWRkcikpIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2VzWzJdID0geyB2aXJ0X3RvX3BhZ2UoYWRkciksCi0JCQl2aXJ0X3RvX3BhZ2UoYWRkciArIFBBR0VfU0laRSkgfTsKLQkJaWYgKCFwYWdlc1sxXSkKLQkJCW5yX3BhZ2VzID0gMTsKLQkJdmFkZHIgPSB2bWFwKHBhZ2VzLCBucl9wYWdlcywgVk1fTUFQLCBQQUdFX0tFUk5FTCk7Ci0JCUJVR19PTighdmFkZHIpOwotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCW1lbWNweSgmdmFkZHJbKHVuc2lnbmVkIGxvbmcpYWRkciAmIH5QQUdFX01BU0tdLCBvcGNvZGUsIGxlbik7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJdnVubWFwKHZhZGRyKTsKKwlpZiAoIWNvcmVfa2VybmVsX3RleHQoKHVuc2lnbmVkIGxvbmcpYWRkcikpIHsKKwkJcGFnZXNbMF0gPSB2bWFsbG9jX3RvX3BhZ2UoYWRkcik7CisJCXBhZ2VzWzFdID0gdm1hbGxvY190b19wYWdlKGFkZHIgKyBQQUdFX1NJWkUpOwogCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIG1vZHVsZXMgYXJlIGluIHZtYWxsb2MnZWQgbWVtb3J5LCBhbHdheXMgd3JpdGFibGUuCi0JCSAqLwotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCW1lbWNweShhZGRyLCBvcGNvZGUsIGxlbik7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcGFnZXNbMF0gPSB2aXJ0X3RvX3BhZ2UoYWRkcik7CisJCVdBUk5fT04oIVBhZ2VSZXNlcnZlZChwYWdlc1swXSkpOworCQlwYWdlc1sxXSA9IHZpcnRfdG9fcGFnZShhZGRyICsgUEFHRV9TSVpFKTsKIAl9CisJQlVHX09OKCFwYWdlc1swXSk7CisJaWYgKCFwYWdlc1sxXSkKKwkJbnJfcGFnZXMgPSAxOworCXZhZGRyID0gdm1hcChwYWdlcywgbnJfcGFnZXMsIFZNX01BUCwgUEFHRV9LRVJORUwpOworCUJVR19PTighdmFkZHIpOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwltZW1jcHkoJnZhZGRyWyh1bnNpZ25lZCBsb25nKWFkZHIgJiB+UEFHRV9NQVNLXSwgb3Bjb2RlLCBsZW4pOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwl2dW5tYXAodmFkZHIpOwogCXN5bmNfY29yZSgpOwogCS8qIENvdWxkIGFsc28gZG8gYSBDTEZMVVNIIGhlcmUgdG8gc3BlZWQgdXAgQ1BVIHJlY292ZXJ5OyBidXQKIAkgICB0aGF0IGNhdXNlcyBoYW5ncyBvbiBzb21lIFZJQSBDUFVzLiAqLworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJQlVHX09OKCgoY2hhciAqKWFkZHIpW2ldICE9ICgoY2hhciAqKW9wY29kZSlbaV0pOwogCXJldHVybiBhZGRyOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2VudHJ5XzMyLlMgYi9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfMzIuUwppbmRleCBmMGY4OTM0Li4yYTYwOWRjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfMzIuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfMzIuUwpAQCAtNDA5LDcgKzQwOSw3IEBACiBpcnFfcmV0dXJuOgogCUlOVEVSUlVQVF9SRVRVUk4KIC5zZWN0aW9uIC5maXh1cCwiYXgiCi1pcmV0X2V4YzoKK0VOVFJZKGlyZXRfZXhjKQogCXB1c2hsICQwCQkJIyBubyBlcnJvciBjb2RlCiAJcHVzaGwgJGRvX2lyZXRfZXJyb3IKIAlqbXAgZXJyb3JfY29kZQpAQCAtMTAxNyw2ICsxMDE3LDEzIEBACiBFTkRQUk9DKGtlcm5lbF90aHJlYWRfaGVscGVyKQogCiAjaWZkZWYgQ09ORklHX1hFTgorLyogWGVuIGRvZXNuJ3Qgc2V0ICVlc3AgdG8gYmUgcHJlY2lzZWx5IHdoYXQgdGhlIG5vcm1hbCBzeXNlbnRlcgorICAgZW50cnlwb2ludCBleHBlY3RzLCBzbyBmaXggaXQgdXAgYmVmb3JlIHVzaW5nIHRoZSBub3JtYWwgcGF0aC4gKi8KK0VOVFJZKHhlbl9zeXNlbnRlcl90YXJnZXQpCisJUklORzBfSU5UX0ZSQU1FCisJYWRkbCAkNSo0LCAlZXNwCQkvKiByZW1vdmUgeGVuLXByb3ZpZGVkIGZyYW1lICovCisJam1wIHN5c2VudGVyX3Bhc3RfZXNwCisKIEVOVFJZKHhlbl9oeXBlcnZpc29yX2NhbGxiYWNrKQogCUNGSV9TVEFSVFBST0MKIAlwdXNobCAkMApAQCAtMTAzNSw4ICsxMDQyLDkgQEAKIAljbXBsICR4ZW5faXJldF9lbmRfY3JpdCwlZWF4CiAJamFlICAxZgogCi0JY2FsbCB4ZW5faXJldF9jcml0X2ZpeHVwCisJam1wICB4ZW5faXJldF9jcml0X2ZpeHVwCiAKK0VOVFJZKHhlbl9kb191cGNhbGwpCiAxOgltb3YgJWVzcCwgJWVheAogCWNhbGwgeGVuX2V2dGNobl9kb191cGNhbGwKIAlqbXAgIHJldF9mcm9tX2ludHIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydC5jIGIvYXJjaC94ODYva2VybmVsL3BhcmF2aXJ0LmMKaW5kZXggMzczMzQxMi4uNzRmMGM1ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3BhcmF2aXJ0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3BhcmF2aXJ0LmMKQEAgLTM2NiwxMSArMzY2LDEzIEBACiAJLmZsdXNoX3RsYl9zaW5nbGUgPSBuYXRpdmVfZmx1c2hfdGxiX3NpbmdsZSwKIAkuZmx1c2hfdGxiX290aGVycyA9IG5hdGl2ZV9mbHVzaF90bGJfb3RoZXJzLAogCi0JLmFsbG9jX3B0ID0gcGFyYXZpcnRfbm9wLAotCS5hbGxvY19wZCA9IHBhcmF2aXJ0X25vcCwKLQkuYWxsb2NfcGRfY2xvbmUgPSBwYXJhdmlydF9ub3AsCi0JLnJlbGVhc2VfcHQgPSBwYXJhdmlydF9ub3AsCi0JLnJlbGVhc2VfcGQgPSBwYXJhdmlydF9ub3AsCisJLmFsbG9jX3B0ZSA9IHBhcmF2aXJ0X25vcCwKKwkuYWxsb2NfcG1kID0gcGFyYXZpcnRfbm9wLAorCS5hbGxvY19wbWRfY2xvbmUgPSBwYXJhdmlydF9ub3AsCisJLmFsbG9jX3B1ZCA9IHBhcmF2aXJ0X25vcCwKKwkucmVsZWFzZV9wdGUgPSBwYXJhdmlydF9ub3AsCisJLnJlbGVhc2VfcG1kID0gcGFyYXZpcnRfbm9wLAorCS5yZWxlYXNlX3B1ZCA9IHBhcmF2aXJ0X25vcCwKIAogCS5zZXRfcHRlID0gbmF0aXZlX3NldF9wdGUsCiAJLnNldF9wdGVfYXQgPSBuYXRpdmVfc2V0X3B0ZV9hdCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYyBiL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYwppbmRleCAxOWM5Mzg2Li4xNzkxYTc1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3JlYm9vdC5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPGFzbS9hcGljLmg+CiAjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KICNpbmNsdWRlIDxhc20vaHBldC5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3JlYm9vdF9maXh1cHMuaD4KICNpbmNsdWRlIDxhc20vcmVib290Lmg+CiAKQEAgLTE1LDcgKzE2LDYgQEAKICMgaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjIGluY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjIGluY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+Ci0jIGluY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjZWxzZQogIyBpbmNsdWRlIDxhc20vaW9tbXUuaD4KICNlbmRpZgpAQCAtMjc1LDcgKzI3NSw3IEBACiAJLyogUmVtYXAgdGhlIGtlcm5lbCBhdCB2aXJ0dWFsIGFkZHJlc3MgemVybywgYXMgd2VsbCBhcyBvZmZzZXQgemVybwogCSAgIGZyb20gdGhlIGtlcm5lbCBzZWdtZW50LiAgVGhpcyBhc3N1bWVzIHRoZSBrZXJuZWwgc2VnbWVudCBzdGFydHMgYXQKIAkgICB2aXJ0dWFsIGFkZHJlc3MgUEFHRV9PRkZTRVQuICovCi0JbWVtY3B5KHN3YXBwZXJfcGdfZGlyLCBzd2FwcGVyX3BnX2RpciArIFVTRVJfUEdEX1BUUlMsCisJbWVtY3B5KHN3YXBwZXJfcGdfZGlyLCBzd2FwcGVyX3BnX2RpciArIEtFUk5FTF9QR0RfQk9VTkRBUlksCiAJCXNpemVvZihzd2FwcGVyX3BnX2RpciBbMF0pICogS0VSTkVMX1BHRF9QVFJTKTsKIAogCS8qCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC94ODYva2VybmVsL3NtcGJvb3QuYwppbmRleCBhZGUzNzFmLi5lZWY3OWU4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMKQEAgLTEwMzksOCArMTAzOSw4IEBACiAKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAJLyogaW5pdCBsb3cgbWVtIG1hcHBpbmcgKi8KLQljbG9uZV9wZ2RfcmFuZ2Uoc3dhcHBlcl9wZ19kaXIsIHN3YXBwZXJfcGdfZGlyICsgVVNFUl9QR0RfUFRSUywKLQkJCW1pbl90KHVuc2lnbmVkIGxvbmcsIEtFUk5FTF9QR0RfUFRSUywgVVNFUl9QR0RfUFRSUykpOworCWNsb25lX3BnZF9yYW5nZShzd2FwcGVyX3BnX2Rpciwgc3dhcHBlcl9wZ19kaXIgKyBLRVJORUxfUEdEX0JPVU5EQVJZLAorCQkJbWluX3QodW5zaWduZWQgbG9uZywgS0VSTkVMX1BHRF9QVFJTLCBLRVJORUxfUEdEX0JPVU5EQVJZKSk7CiAJZmx1c2hfdGxiX2FsbCgpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC92bWlfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC92bWlfMzIuYwppbmRleCAxMmFmZmUxLi45NTZmMzg5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdm1pXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3ZtaV8zMi5jCkBAIC0zMjAsNyArMzIwLDcgQEAKIAkgKiBwZGVzIG5lZWQgdG8gYmUgemVyb2VkLgogCSAqLwogCWlmICh0eXBlICYgVk1JX1BBR0VfQ0xPTkUpCi0JCWxpbWl0ID0gVVNFUl9QVFJTX1BFUl9QR0Q7CisJCWxpbWl0ID0gS0VSTkVMX1BHRF9CT1VOREFSWTsKIAlmb3IgKGkgPSAwOyBpIDwgbGltaXQ7IGkrKykKIAkJQlVHX09OKHB0cltpXSk7CiB9CkBAIC0zOTIsMTMgKzM5MiwxMyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIHZtaV9hbGxvY2F0ZV9wdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdTMyIHBmbikKK3N0YXRpYyB2b2lkIHZtaV9hbGxvY2F0ZV9wdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHUzMiBwZm4pCiB7CiAJdm1pX3NldF9wYWdlX3R5cGUocGZuLCBWTUlfUEFHRV9MMSk7CiAJdm1pX29wcy5hbGxvY2F0ZV9wYWdlKHBmbiwgVk1JX1BBR0VfTDEsIDAsIDAsIDApOwogfQogCi1zdGF0aWMgdm9pZCB2bWlfYWxsb2NhdGVfcGQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHUzMiBwZm4pCitzdGF0aWMgdm9pZCB2bWlfYWxsb2NhdGVfcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1MzIgcGZuKQogewogIAkvKgogCSAqIFRoaXMgY2FsbCBjb21lcyBpbiB2ZXJ5IGVhcmx5LCBiZWZvcmUgbWVtX21hcCBpcyBzZXR1cC4KQEAgLTQwOSwyMCArNDA5LDIwIEBACiAJdm1pX29wcy5hbGxvY2F0ZV9wYWdlKHBmbiwgVk1JX1BBR0VfTDIsIDAsIDAsIDApOwogfQogCi1zdGF0aWMgdm9pZCB2bWlfYWxsb2NhdGVfcGRfY2xvbmUodTMyIHBmbiwgdTMyIGNsb25lcGZuLCB1MzIgc3RhcnQsIHUzMiBjb3VudCkKK3N0YXRpYyB2b2lkIHZtaV9hbGxvY2F0ZV9wbWRfY2xvbmUodTMyIHBmbiwgdTMyIGNsb25lcGZuLCB1MzIgc3RhcnQsIHUzMiBjb3VudCkKIHsKICAJdm1pX3NldF9wYWdlX3R5cGUocGZuLCBWTUlfUEFHRV9MMiB8IFZNSV9QQUdFX0NMT05FKTsKIAl2bWlfY2hlY2tfcGFnZV90eXBlKGNsb25lcGZuLCBWTUlfUEFHRV9MMik7CiAJdm1pX29wcy5hbGxvY2F0ZV9wYWdlKHBmbiwgVk1JX1BBR0VfTDIgfCBWTUlfUEFHRV9DTE9ORSwgY2xvbmVwZm4sIHN0YXJ0LCBjb3VudCk7CiB9CiAKLXN0YXRpYyB2b2lkIHZtaV9yZWxlYXNlX3B0KHUzMiBwZm4pCitzdGF0aWMgdm9pZCB2bWlfcmVsZWFzZV9wdGUodTMyIHBmbikKIHsKIAl2bWlfb3BzLnJlbGVhc2VfcGFnZShwZm4sIFZNSV9QQUdFX0wxKTsKIAl2bWlfc2V0X3BhZ2VfdHlwZShwZm4sIFZNSV9QQUdFX05PUk1BTCk7CiB9CiAKLXN0YXRpYyB2b2lkIHZtaV9yZWxlYXNlX3BkKHUzMiBwZm4pCitzdGF0aWMgdm9pZCB2bWlfcmVsZWFzZV9wbWQodTMyIHBmbikKIHsKIAl2bWlfb3BzLnJlbGVhc2VfcGFnZShwZm4sIFZNSV9QQUdFX0wyKTsKIAl2bWlfc2V0X3BhZ2VfdHlwZShwZm4sIFZNSV9QQUdFX05PUk1BTCk7CkBAIC04NzEsMTUgKzg3MSwxNSBAQAogCiAJdm1pX29wcy5hbGxvY2F0ZV9wYWdlID0gdm1pX2dldF9mdW5jdGlvbihWTUlfQ0FMTF9BbGxvY2F0ZVBhZ2UpOwogCWlmICh2bWlfb3BzLmFsbG9jYXRlX3BhZ2UpIHsKLQkJcHZfbW11X29wcy5hbGxvY19wdCA9IHZtaV9hbGxvY2F0ZV9wdDsKLQkJcHZfbW11X29wcy5hbGxvY19wZCA9IHZtaV9hbGxvY2F0ZV9wZDsKLQkJcHZfbW11X29wcy5hbGxvY19wZF9jbG9uZSA9IHZtaV9hbGxvY2F0ZV9wZF9jbG9uZTsKKwkJcHZfbW11X29wcy5hbGxvY19wdGUgPSB2bWlfYWxsb2NhdGVfcHRlOworCQlwdl9tbXVfb3BzLmFsbG9jX3BtZCA9IHZtaV9hbGxvY2F0ZV9wbWQ7CisJCXB2X21tdV9vcHMuYWxsb2NfcG1kX2Nsb25lID0gdm1pX2FsbG9jYXRlX3BtZF9jbG9uZTsKIAl9CiAKIAl2bWlfb3BzLnJlbGVhc2VfcGFnZSA9IHZtaV9nZXRfZnVuY3Rpb24oVk1JX0NBTExfUmVsZWFzZVBhZ2UpOwogCWlmICh2bWlfb3BzLnJlbGVhc2VfcGFnZSkgewotCQlwdl9tbXVfb3BzLnJlbGVhc2VfcHQgPSB2bWlfcmVsZWFzZV9wdDsKLQkJcHZfbW11X29wcy5yZWxlYXNlX3BkID0gdm1pX3JlbGVhc2VfcGQ7CisJCXB2X21tdV9vcHMucmVsZWFzZV9wdGUgPSB2bWlfcmVsZWFzZV9wdGU7CisJCXB2X21tdV9vcHMucmVsZWFzZV9wbWQgPSB2bWlfcmVsZWFzZV9wbWQ7CiAJfQogCiAJLyogU2V0IGxpbmVhciBpcyBuZWVkZWQgaW4gYWxsIGNhc2VzICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tYWNoLXZveWFnZXIvdm95YWdlcl9zbXAuYyBiL2FyY2gveDg2L21hY2gtdm95YWdlci92b3lhZ2VyX3NtcC5jCmluZGV4IGQwNTcyMjEuLjZlMmM0ZWYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21hY2gtdm95YWdlci92b3lhZ2VyX3NtcC5jCisrKyBiL2FyY2gveDg2L21hY2gtdm95YWdlci92b3lhZ2VyX3NtcC5jCkBAIC01NDMsOCArNTQzLDggQEAKIAkJaGlqYWNrX3NvdXJjZS5pZHQuT2Zmc2V0LCBzdGFja19zdGFydC5zcCkpOwogCiAJLyogaW5pdCBsb3dtZW0gaWRlbnRpdHkgbWFwcGluZyAqLwotCWNsb25lX3BnZF9yYW5nZShzd2FwcGVyX3BnX2Rpciwgc3dhcHBlcl9wZ19kaXIgKyBVU0VSX1BHRF9QVFJTLAotCQkJbWluX3QodW5zaWduZWQgbG9uZywgS0VSTkVMX1BHRF9QVFJTLCBVU0VSX1BHRF9QVFJTKSk7CisJY2xvbmVfcGdkX3JhbmdlKHN3YXBwZXJfcGdfZGlyLCBzd2FwcGVyX3BnX2RpciArIEtFUk5FTF9QR0RfQk9VTkRBUlksCisJCQltaW5fdCh1bnNpZ25lZCBsb25nLCBLRVJORUxfUEdEX1BUUlMsIEtFUk5FTF9QR0RfQk9VTkRBUlkpKTsKIAlmbHVzaF90bGJfYWxsKCk7CiAKIAlpZiAocXVhZF9ib290KSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9NYWtlZmlsZSBiL2FyY2gveDg2L21tL01ha2VmaWxlCmluZGV4IDIwOTQxZDIuLmI3YjNlNGMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L21tL01ha2VmaWxlCkBAIC0xLDUgKzEsNSBAQAogb2JqLXkJOj0gIGluaXRfJChCSVRTKS5vIGZhdWx0Lm8gaW9yZW1hcC5vIGV4dGFibGUubyBwYWdlYXR0ci5vIG1tYXAubyBcCi0JICAgIHBhdC5vCisJICAgIHBhdC5vIHBndGFibGUubwogCiBvYmotJChDT05GSUdfWDg2XzMyKQkJKz0gcGd0YWJsZV8zMi5vCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2luaXRfMzIuYyBiL2FyY2gveDg2L21tL2luaXRfMzIuYwppbmRleCA5ZWM2MmRhLi4wOGFhMTg3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9pbml0XzMyLmMKKysrIGIvYXJjaC94ODYvbW0vaW5pdF8zMi5jCkBAIC03MSw3ICs3MSw3IEBACiAJaWYgKCEocGdkX3ZhbCgqcGdkKSAmIF9QQUdFX1BSRVNFTlQpKSB7CiAJCXBtZF90YWJsZSA9IChwbWRfdCAqKSBhbGxvY19ib290bWVtX2xvd19wYWdlcyhQQUdFX1NJWkUpOwogCi0JCXBhcmF2aXJ0X2FsbG9jX3BkKCZpbml0X21tLCBfX3BhKHBtZF90YWJsZSkgPj4gUEFHRV9TSElGVCk7CisJCXBhcmF2aXJ0X2FsbG9jX3BtZCgmaW5pdF9tbSwgX19wYShwbWRfdGFibGUpID4+IFBBR0VfU0hJRlQpOwogCQlzZXRfcGdkKHBnZCwgX19wZ2QoX19wYShwbWRfdGFibGUpIHwgX1BBR0VfUFJFU0VOVCkpOwogCQlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgMCk7CiAJCUJVR19PTihwbWRfdGFibGUgIT0gcG1kX29mZnNldChwdWQsIDApKTsKQEAgLTEwMCw3ICsxMDAsNyBAQAogCQkJCShwdGVfdCAqKWFsbG9jX2Jvb3RtZW1fbG93X3BhZ2VzKFBBR0VfU0laRSk7CiAJCX0KIAotCQlwYXJhdmlydF9hbGxvY19wdCgmaW5pdF9tbSwgX19wYShwYWdlX3RhYmxlKSA+PiBQQUdFX1NISUZUKTsKKwkJcGFyYXZpcnRfYWxsb2NfcHRlKCZpbml0X21tLCBfX3BhKHBhZ2VfdGFibGUpID4+IFBBR0VfU0hJRlQpOwogCQlzZXRfcG1kKHBtZCwgX19wbWQoX19wYShwYWdlX3RhYmxlKSB8IF9QQUdFX1RBQkxFKSk7CiAJCUJVR19PTihwYWdlX3RhYmxlICE9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgMCkpOwogCX0KQEAgLTM2NSw3ICszNjUsNyBAQAogCiAJCXB0ZV9jbGVhcihOVUxMLCB2YSwgcHRlKTsKIAl9Ci0JcGFyYXZpcnRfYWxsb2NfcGQoJmluaXRfbW0sIF9fcGEoYmFzZSkgPj4gUEFHRV9TSElGVCk7CisJcGFyYXZpcnRfYWxsb2NfcG1kKCZpbml0X21tLCBfX3BhKGJhc2UpID4+IFBBR0VfU0hJRlQpOwogfQogCiB2b2lkIF9faW5pdCBuYXRpdmVfcGFnZXRhYmxlX3NldHVwX2RvbmUocGdkX3QgKmJhc2UpCkBAIC00NTcsNyArNDU3LDcgQEAKIAkgKiBOb3RlIHRoYXQgInBnZF9jbGVhcigpIiBkb2Vzbid0IGRvIGl0IGZvcgogCSAqIHVzLCBiZWNhdXNlIHBnZF9jbGVhcigpIGlzIGEgbm8tb3Agb24gaTM4Ni4KIAkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgVVNFUl9QVFJTX1BFUl9QR0Q7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBLRVJORUxfUEdEX0JPVU5EQVJZOyBpKyspIHsKICNpZmRlZiBDT05GSUdfWDg2X1BBRQogCQlzZXRfcGdkKHN3YXBwZXJfcGdfZGlyK2ksIF9fcGdkKDEgKyBfX3BhKGVtcHR5X3plcm9fcGFnZSkpKTsKICNlbHNlCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9pbml0XzY0LmMgYi9hcmNoL3g4Ni9tbS9pbml0XzY0LmMKaW5kZXggMWZmNzkwNi4uYjc5OGU3YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vaW5pdF82NC5jCisrKyBiL2FyY2gveDg2L21tL2luaXRfNjQuYwpAQCAtMTM1LDcgKzEzNSw3IEBACiAJcmV0dXJuIHB0cjsKIH0KIAotc3RhdGljIF9faW5pdCB2b2lkCitzdGF0aWMgdm9pZAogc2V0X3B0ZV9waHlzKHVuc2lnbmVkIGxvbmcgdmFkZHIsIHVuc2lnbmVkIGxvbmcgcGh5cywgcGdwcm90X3QgcHJvdCkKIHsKIAlwZ2RfdCAqcGdkOwpAQCAtMTczLDcgKzE3Myw3IEBACiAJbmV3X3B0ZSA9IHBmbl9wdGUocGh5cyA+PiBQQUdFX1NISUZULCBwcm90KTsKIAogCXB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgdmFkZHIpOwotCWlmICghcHRlX25vbmUoKnB0ZSkgJiYKKwlpZiAoIXB0ZV9ub25lKCpwdGUpICYmIHB0ZV92YWwobmV3X3B0ZSkgJiYKIAkgICAgcHRlX3ZhbCgqcHRlKSAhPSAocHRlX3ZhbChuZXdfcHRlKSAmIF9fc3VwcG9ydGVkX3B0ZV9tYXNrKSkKIAkJcHRlX0VSUk9SKCpwdGUpOwogCXNldF9wdGUocHRlLCBuZXdfcHRlKTsKQEAgLTIxNCw4ICsyMTQsNyBAQAogfQogCiAvKiBOT1RFOiB0aGlzIGlzIG1lYW50IHRvIGJlIHJ1biBvbmx5IGF0IGJvb3QgKi8KLXZvaWQgX19pbml0Ci1fX3NldF9maXhtYXAoZW51bSBmaXhlZF9hZGRyZXNzZXMgaWR4LCB1bnNpZ25lZCBsb25nIHBoeXMsIHBncHJvdF90IHByb3QpCit2b2lkIF9fc2V0X2ZpeG1hcChlbnVtIGZpeGVkX2FkZHJlc3NlcyBpZHgsIHVuc2lnbmVkIGxvbmcgcGh5cywgcGdwcm90X3QgcHJvdCkKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSBfX2ZpeF90b192aXJ0KGlkeCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2lvcmVtYXAuYyBiL2FyY2gveDg2L21tL2lvcmVtYXAuYwppbmRleCAzYTRiYWY5Li4zNmEzZjdkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9pb3JlbWFwLmMKKysrIGIvYXJjaC94ODYvbW0vaW9yZW1hcC5jCkBAIC00MDcsNyArNDA3LDcgQEAKIAogCXBtZCA9IGVhcmx5X2lvcmVtYXBfcG1kKGZpeF90b192aXJ0KEZJWF9CVE1BUF9CRUdJTikpOwogCXBtZF9jbGVhcihwbWQpOwotCXBhcmF2aXJ0X3JlbGVhc2VfcHQoX19wYShibV9wdGUpID4+IFBBR0VfU0hJRlQpOworCXBhcmF2aXJ0X3JlbGVhc2VfcHRlKF9fcGEoYm1fcHRlKSA+PiBQQUdFX1NISUZUKTsKIAlfX2ZsdXNoX3RsYl9hbGwoKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vcGFnZWF0dHIuYyBiL2FyY2gveDg2L21tL3BhZ2VhdHRyLmMKaW5kZXggYzI5ZWJkMC4uYmQ1ZTA1YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vcGFnZWF0dHIuYworKysgYi9hcmNoL3g4Ni9tbS9wYWdlYXR0ci5jCkBAIC00ODMsOSArNDgzLDcgQEAKIAkJZ290byBvdXRfdW5sb2NrOwogCiAJcGJhc2UgPSAocHRlX3QgKilwYWdlX2FkZHJlc3MoYmFzZSk7Ci0jaWZkZWYgQ09ORklHX1g4Nl8zMgotCXBhcmF2aXJ0X2FsbG9jX3B0KCZpbml0X21tLCBwYWdlX3RvX3BmbihiYXNlKSk7Ci0jZW5kaWYKKwlwYXJhdmlydF9hbGxvY19wdGUoJmluaXRfbW0sIHBhZ2VfdG9fcGZuKGJhc2UpKTsKIAlyZWZfcHJvdCA9IHB0ZV9wZ3Byb3QocHRlX2Nscmh1Z2UoKmtwdGUpKTsKIAogI2lmZGVmIENPTkZJR19YODZfNjQKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL3BndGFibGUuYyBiL2FyY2gveDg2L21tL3BndGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDE1OTc2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvbW0vcGd0YWJsZS5jCkBAIC0wLDAgKzEsMjc2IEBACisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3RsYi5oPgorCitwdGVfdCAqcHRlX2FsbG9jX29uZV9rZXJuZWwoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlyZXR1cm4gKHB0ZV90ICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUx8X19HRlBfUkVQRUFUfF9fR0ZQX1pFUk8pOworfQorCitwZ3RhYmxlX3QgcHRlX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXN0cnVjdCBwYWdlICpwdGU7CisKKyNpZmRlZiBDT05GSUdfSElHSFBURQorCXB0ZSA9IGFsbG9jX3BhZ2VzKEdGUF9LRVJORUx8X19HRlBfSElHSE1FTXxfX0dGUF9SRVBFQVR8X19HRlBfWkVSTywgMCk7CisjZWxzZQorCXB0ZSA9IGFsbG9jX3BhZ2VzKEdGUF9LRVJORUx8X19HRlBfUkVQRUFUfF9fR0ZQX1pFUk8sIDApOworI2VuZGlmCisJaWYgKHB0ZSkKKwkJcGd0YWJsZV9wYWdlX2N0b3IocHRlKTsKKwlyZXR1cm4gcHRlOworfQorCit2b2lkIF9fcHRlX2ZyZWVfdGxiKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIHN0cnVjdCBwYWdlICpwdGUpCit7CisJcGd0YWJsZV9wYWdlX2R0b3IocHRlKTsKKwlwYXJhdmlydF9yZWxlYXNlX3B0ZShwYWdlX3RvX3BmbihwdGUpKTsKKwl0bGJfcmVtb3ZlX3BhZ2UodGxiLCBwdGUpOworfQorCisjaWYgUEFHRVRBQkxFX0xFVkVMUyA+IDIKK3ZvaWQgX19wbWRfZnJlZV90bGIoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgcG1kX3QgKnBtZCkKK3sKKwlwYXJhdmlydF9yZWxlYXNlX3BtZChfX3BhKHBtZCkgPj4gUEFHRV9TSElGVCk7CisJdGxiX3JlbW92ZV9wYWdlKHRsYiwgdmlydF90b19wYWdlKHBtZCkpOworfQorCisjaWYgUEFHRVRBQkxFX0xFVkVMUyA+IDMKK3ZvaWQgX19wdWRfZnJlZV90bGIoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgcHVkX3QgKnB1ZCkKK3sKKwlwYXJhdmlydF9yZWxlYXNlX3B1ZChfX3BhKHB1ZCkgPj4gUEFHRV9TSElGVCk7CisJdGxiX3JlbW92ZV9wYWdlKHRsYiwgdmlydF90b19wYWdlKHB1ZCkpOworfQorI2VuZGlmCS8qIFBBR0VUQUJMRV9MRVZFTFMgPiAzICovCisjZW5kaWYJLyogUEFHRVRBQkxFX0xFVkVMUyA+IDIgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHBnZF9saXN0X2FkZChwZ2RfdCAqcGdkKQoreworCXN0cnVjdCBwYWdlICpwYWdlID0gdmlydF90b19wYWdlKHBnZCk7CisKKwlsaXN0X2FkZCgmcGFnZS0+bHJ1LCAmcGdkX2xpc3QpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGdkX2xpc3RfZGVsKHBnZF90ICpwZ2QpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocGdkKTsKKworCWxpc3RfZGVsKCZwYWdlLT5scnUpOworfQorCisjZGVmaW5lIFVOU0hBUkVEX1BUUlNfUEVSX1BHRAkJCQlcCisJKFNIQVJFRF9LRVJORUxfUE1EID8gS0VSTkVMX1BHRF9CT1VOREFSWSA6IFBUUlNfUEVSX1BHRCkKKworc3RhdGljIHZvaWQgcGdkX2N0b3Iodm9pZCAqcCkKK3sKKwlwZ2RfdCAqcGdkID0gcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogQ2xlYXIgdXNlcm1vZGUgcGFydHMgb2YgUEdEICovCisJbWVtc2V0KHBnZCwgMCwgS0VSTkVMX1BHRF9CT1VOREFSWSpzaXplb2YocGdkX3QpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZ2RfbG9jaywgZmxhZ3MpOworCisJLyogSWYgdGhlIHBnZCBwb2ludHMgdG8gYSBzaGFyZWQgcGFnZXRhYmxlIGxldmVsIChlaXRoZXIgdGhlCisJICAgcHRlcyBpbiBub24tUEFFLCBvciBzaGFyZWQgUE1EIGluIFBBRSksIHRoZW4ganVzdCBjb3B5IHRoZQorCSAgIHJlZmVyZW5jZXMgZnJvbSBzd2FwcGVyX3BnX2Rpci4gKi8KKwlpZiAoUEFHRVRBQkxFX0xFVkVMUyA9PSAyIHx8CisJICAgIChQQUdFVEFCTEVfTEVWRUxTID09IDMgJiYgU0hBUkVEX0tFUk5FTF9QTUQpIHx8CisJICAgIFBBR0VUQUJMRV9MRVZFTFMgPT0gNCkgeworCQljbG9uZV9wZ2RfcmFuZ2UocGdkICsgS0VSTkVMX1BHRF9CT1VOREFSWSwKKwkJCQlzd2FwcGVyX3BnX2RpciArIEtFUk5FTF9QR0RfQk9VTkRBUlksCisJCQkJS0VSTkVMX1BHRF9QVFJTKTsKKwkJcGFyYXZpcnRfYWxsb2NfcG1kX2Nsb25lKF9fcGEocGdkKSA+PiBQQUdFX1NISUZULAorCQkJCQkgX19wYShzd2FwcGVyX3BnX2RpcikgPj4gUEFHRV9TSElGVCwKKwkJCQkJIEtFUk5FTF9QR0RfQk9VTkRBUlksCisJCQkJCSBLRVJORUxfUEdEX1BUUlMpOworCX0KKworCS8qIGxpc3QgcmVxdWlyZWQgdG8gc3luYyBrZXJuZWwgbWFwcGluZyB1cGRhdGVzICovCisJaWYgKCFTSEFSRURfS0VSTkVMX1BNRCkKKwkJcGdkX2xpc3RfYWRkKHBnZCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZ2RfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBwZ2RfZHRvcih2b2lkICpwZ2QpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsgLyogY2FuIGJlIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0ICovCisKKwlpZiAoU0hBUkVEX0tFUk5FTF9QTUQpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZ2RfbG9jaywgZmxhZ3MpOworCXBnZF9saXN0X2RlbChwZ2QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBnZF9sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBMaXN0IG9mIGFsbCBwZ2QncyBuZWVkZWQgZm9yIG5vbi1QQUUgc28gaXQgY2FuIGludmFsaWRhdGUgZW50cmllcworICogaW4gYm90aCBjYWNoZWQgYW5kIHVuY2FjaGVkIHBnZCdzOyBub3QgbmVlZGVkIGZvciBQQUUgc2luY2UgdGhlCisgKiBrZXJuZWwgcG1kIGlzIHNoYXJlZC4gSWYgUEFFIHdlcmUgbm90IHRvIHNoYXJlIHRoZSBwbWQgYSBzaW1pbGFyCisgKiB0YWN0aWMgd291bGQgYmUgbmVlZGVkLiBUaGlzIGlzIGVzc2VudGlhbGx5IGNvZGVwYXRoLWJhc2VkIGxvY2tpbmcKKyAqIGFnYWluc3QgcGFnZWF0dHIuYzsgaXQgaXMgdGhlIHVuaXF1ZSBjYXNlIGluIHdoaWNoIGEgdmFsaWQgY2hhbmdlCisgKiBvZiBrZXJuZWwgcGFnZXRhYmxlcyBjYW4ndCBiZSBsYXppbHkgc3luY2hyb25pemVkIGJ5IHZtYWxsb2MgZmF1bHRzLgorICogdm1hbGxvYyBmYXVsdHMgd29yayBiZWNhdXNlIGF0dGFjaGVkIHBhZ2V0YWJsZXMgYXJlIG5ldmVyIGZyZWVkLgorICogLS0gd2xpCisgKi8KKworI2lmZGVmIENPTkZJR19YODZfUEFFCisvKgorICogTW9wIHVwIGFueSBwbWQgcGFnZXMgd2hpY2ggbWF5IHN0aWxsIGJlIGF0dGFjaGVkIHRvIHRoZSBwZ2QuCisgKiBOb3JtYWxseSB0aGV5IHdpbGwgYmUgZnJlZWQgYnkgbXVubWFwL2V4aXRfbW1hcCwgYnV0IGFueSBwbWQgd2UKKyAqIHByZWFsbG9jYXRlIHdoaWNoIG5ldmVyIGdvdCBhIGNvcnJlc3BvbmRpbmcgdm1hIHdpbGwgbmVlZCB0byBiZQorICogZnJlZWQgbWFudWFsbHkuCisgKi8KK3N0YXRpYyB2b2lkIHBnZF9tb3BfdXBfcG1kcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcGdkX3QgKnBnZHApCit7CisJaW50IGk7CisKKwlmb3IoaSA9IDA7IGkgPCBVTlNIQVJFRF9QVFJTX1BFUl9QR0Q7IGkrKykgeworCQlwZ2RfdCBwZ2QgPSBwZ2RwW2ldOworCisJCWlmIChwZ2RfdmFsKHBnZCkgIT0gMCkgeworCQkJcG1kX3QgKnBtZCA9IChwbWRfdCAqKXBnZF9wYWdlX3ZhZGRyKHBnZCk7CisKKwkJCXBnZHBbaV0gPSBuYXRpdmVfbWFrZV9wZ2QoMCk7CisKKwkJCXBhcmF2aXJ0X3JlbGVhc2VfcG1kKHBnZF92YWwocGdkKSA+PiBQQUdFX1NISUZUKTsKKwkJCXBtZF9mcmVlKG1tLCBwbWQpOworCQl9CisJfQorfQorCisvKgorICogSW4gUEFFIG1vZGUsIHdlIG5lZWQgdG8gZG8gYSBjcjMgcmVsb2FkICg9dGxiIGZsdXNoKSB3aGVuCisgKiB1cGRhdGluZyB0aGUgdG9wLWxldmVsIHBhZ2V0YWJsZSBlbnRyaWVzIHRvIGd1YXJhbnRlZSB0aGUKKyAqIHByb2Nlc3NvciBub3RpY2VzIHRoZSB1cGRhdGUuICBTaW5jZSB0aGlzIGlzIGV4cGVuc2l2ZSwgYW5kCisgKiBhbGwgNCB0b3AtbGV2ZWwgZW50cmllcyBhcmUgdXNlZCBhbG1vc3QgaW1tZWRpYXRlbHkgaW4gYQorICogbmV3IHByb2Nlc3MncyBsaWZlLCB3ZSBqdXN0IHByZS1wb3B1bGF0ZSB0aGVtIGhlcmUuCisgKgorICogQWxzbywgaWYgd2UncmUgaW4gYSBwYXJhdmlydCBlbnZpcm9ubWVudCB3aGVyZSB0aGUga2VybmVsIHBtZCBpcworICogbm90IHNoYXJlZCBiZXR3ZWVuIHBhZ2V0YWJsZXMgKCFTSEFSRURfS0VSTkVMX1BNRFMpLCB3ZSBhbGxvY2F0ZQorICogYW5kIGluaXRpYWxpemUgdGhlIGtlcm5lbCBwbWRzIGhlcmUuCisgKi8KK3N0YXRpYyBpbnQgcGdkX3ByZXBvcHVsYXRlX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcGdkX3QgKnBnZCkKK3sKKwlwdWRfdCAqcHVkOworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwlpbnQgaTsKKworCXB1ZCA9IHB1ZF9vZmZzZXQocGdkLCAwKTsKKyAJZm9yIChhZGRyID0gaSA9IDA7IGkgPCBVTlNIQVJFRF9QVFJTX1BFUl9QR0Q7CisJICAgICBpKyssIHB1ZCsrLCBhZGRyICs9IFBVRF9TSVpFKSB7CisJCXBtZF90ICpwbWQgPSBwbWRfYWxsb2Nfb25lKG1tLCBhZGRyKTsKKworCQlpZiAoIXBtZCkgeworCQkJcGdkX21vcF91cF9wbWRzKG1tLCBwZ2QpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoaSA+PSBLRVJORUxfUEdEX0JPVU5EQVJZKQorCQkJbWVtY3B5KHBtZCwgKHBtZF90ICopcGdkX3BhZ2VfdmFkZHIoc3dhcHBlcl9wZ19kaXJbaV0pLAorCQkJICAgICAgIHNpemVvZihwbWRfdCkgKiBQVFJTX1BFUl9QTUQpOworCisJCXB1ZF9wb3B1bGF0ZShtbSwgcHVkLCBwbWQpOworCX0KKworCXJldHVybiAxOworfQorCit2b2lkIHB1ZF9wb3B1bGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcHVkX3QgKnB1ZHAsIHBtZF90ICpwbWQpCit7CisJcGFyYXZpcnRfYWxsb2NfcG1kKG1tLCBfX3BhKHBtZCkgPj4gUEFHRV9TSElGVCk7CisKKwkvKiBOb3RlOiBhbG1vc3QgZXZlcnl0aGluZyBhcGFydCBmcm9tIF9QQUdFX1BSRVNFTlQgaXMKKwkgICByZXNlcnZlZCBhdCB0aGUgcG1kIChQRFBUKSBsZXZlbC4gKi8KKwlzZXRfcHVkKHB1ZHAsIF9fcHVkKF9fcGEocG1kKSB8IF9QQUdFX1BSRVNFTlQpKTsKKworCS8qCisJICogQWNjb3JkaW5nIHRvIEludGVsIEFwcCBub3RlICJUTEJzLCBQYWdpbmctU3RydWN0dXJlIENhY2hlcywKKwkgKiBhbmQgVGhlaXIgSW52YWxpZGF0aW9uIiwgQXByaWwgMjAwNywgZG9jdW1lbnQgMzE3MDgwLTAwMSwKKwkgKiBzZWN0aW9uIDguMTogaW4gUEFFIG1vZGUgd2UgZXhwbGljaXRseSBoYXZlIHRvIGZsdXNoIHRoZQorCSAqIFRMQiB2aWEgY3IzIGlmIHRoZSB0b3AtbGV2ZWwgcGdkIGlzIGNoYW5nZWQuLi4KKwkgKi8KKwlpZiAobW0gPT0gY3VycmVudC0+YWN0aXZlX21tKQorCQl3cml0ZV9jcjMocmVhZF9jcjMoKSk7Cit9CisjZWxzZSAgLyogIUNPTkZJR19YODZfUEFFICovCisvKiBObyBuZWVkIHRvIHByZXBvcHVsYXRlIGFueSBwYWdldGFibGUgZW50cmllcyBpbiBub24tUEFFIG1vZGVzLiAqLworc3RhdGljIGludCBwZ2RfcHJlcG9wdWxhdGVfcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ2RfdCAqcGdkKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBwZ2RfbW9wX3VwX3BtZHMoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBnZF90ICpwZ2QpCit7Cit9CisjZW5kaWYJLyogQ09ORklHX1g4Nl9QQUUgKi8KKworcGdkX3QgKnBnZF9hbGxvYyhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlwZ2RfdCAqcGdkID0gKHBnZF90ICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKKworCS8qIHNvIHRoYXQgYWxsb2NfcG1kIGNhbiB1c2UgaXQgKi8KKwltbS0+cGdkID0gcGdkOworCWlmIChwZ2QpCisJCXBnZF9jdG9yKHBnZCk7CisKKwlpZiAocGdkICYmICFwZ2RfcHJlcG9wdWxhdGVfcG1kKG1tLCBwZ2QpKSB7CisJCXBnZF9kdG9yKHBnZCk7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwZ2QpOworCQlwZ2QgPSBOVUxMOworCX0KKworCXJldHVybiBwZ2Q7Cit9CisKK3ZvaWQgcGdkX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBnZF90ICpwZ2QpCit7CisJcGdkX21vcF91cF9wbWRzKG1tLCBwZ2QpOworCXBnZF9kdG9yKHBnZCk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBnZCk7Cit9CisKK2ludCBwdGVwX3NldF9hY2Nlc3NfZmxhZ3Moc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHRlX3QgKnB0ZXAsCisJCQkgIHB0ZV90IGVudHJ5LCBpbnQgZGlydHkpCit7CisJaW50IGNoYW5nZWQgPSAhcHRlX3NhbWUoKnB0ZXAsIGVudHJ5KTsKKworCWlmIChjaGFuZ2VkICYmIGRpcnR5KSB7CisJCSpwdGVwID0gZW50cnk7CisJCXB0ZV91cGRhdGVfZGVmZXIodm1hLT52bV9tbSwgYWRkcmVzcywgcHRlcCk7CisJCWZsdXNoX3RsYl9wYWdlKHZtYSwgYWRkcmVzcyk7CisJfQorCisJcmV0dXJuIGNoYW5nZWQ7Cit9CisKK2ludCBwdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChwdGVfeW91bmcoKnB0ZXApKQorCQlyZXQgPSB0ZXN0X2FuZF9jbGVhcl9iaXQoX1BBR0VfQklUX0FDQ0VTU0VELAorCQkJCQkgJnB0ZXAtPnB0ZSk7CisKKwlpZiAocmV0KQorCQlwdGVfdXBkYXRlKHZtYS0+dm1fbW0sIGFkZHIsIHB0ZXApOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHB0ZXBfY2xlYXJfZmx1c2hfeW91bmcoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90ICpwdGVwKQoreworCWludCB5b3VuZzsKKworCXlvdW5nID0gcHRlcF90ZXN0X2FuZF9jbGVhcl95b3VuZyh2bWEsIGFkZHJlc3MsIHB0ZXApOworCWlmICh5b3VuZykKKwkJZmx1c2hfdGxiX3BhZ2Uodm1hLCBhZGRyZXNzKTsKKworCXJldHVybiB5b3VuZzsKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL3BndGFibGVfMzIuYyBiL2FyY2gveDg2L21tL3BndGFibGVfMzIuYwppbmRleCA2ZmI5ZTdjLi45ZWUwMDdiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9wZ3RhYmxlXzMyLmMKKysrIGIvYXJjaC94ODYvbW0vcGd0YWJsZV8zMi5jCkBAIC0xNzMsMjEwICsxNzMsNiBAQAogCV9fVk1BTExPQ19SRVNFUlZFICs9IHJlc2VydmU7CiB9CiAKLXB0ZV90ICpwdGVfYWxsb2Nfb25lX2tlcm5lbChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQotewotCXJldHVybiAocHRlX3QgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTHxfX0dGUF9SRVBFQVR8X19HRlBfWkVSTyk7Ci19Ci0KLXBndGFibGVfdCBwdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCi17Ci0Jc3RydWN0IHBhZ2UgKnB0ZTsKLQotI2lmZGVmIENPTkZJR19ISUdIUFRFCi0JcHRlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTHxfX0dGUF9ISUdITUVNfF9fR0ZQX1JFUEVBVHxfX0dGUF9aRVJPLCAwKTsKLSNlbHNlCi0JcHRlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTHxfX0dGUF9SRVBFQVR8X19HRlBfWkVSTywgMCk7Ci0jZW5kaWYKLQlpZiAocHRlKQotCQlwZ3RhYmxlX3BhZ2VfY3RvcihwdGUpOwotCXJldHVybiBwdGU7Ci19Ci0KLS8qCi0gKiBMaXN0IG9mIGFsbCBwZ2QncyBuZWVkZWQgZm9yIG5vbi1QQUUgc28gaXQgY2FuIGludmFsaWRhdGUgZW50cmllcwotICogaW4gYm90aCBjYWNoZWQgYW5kIHVuY2FjaGVkIHBnZCdzOyBub3QgbmVlZGVkIGZvciBQQUUgc2luY2UgdGhlCi0gKiBrZXJuZWwgcG1kIGlzIHNoYXJlZC4gSWYgUEFFIHdlcmUgbm90IHRvIHNoYXJlIHRoZSBwbWQgYSBzaW1pbGFyCi0gKiB0YWN0aWMgd291bGQgYmUgbmVlZGVkLiBUaGlzIGlzIGVzc2VudGlhbGx5IGNvZGVwYXRoLWJhc2VkIGxvY2tpbmcKLSAqIGFnYWluc3QgcGFnZWF0dHIuYzsgaXQgaXMgdGhlIHVuaXF1ZSBjYXNlIGluIHdoaWNoIGEgdmFsaWQgY2hhbmdlCi0gKiBvZiBrZXJuZWwgcGFnZXRhYmxlcyBjYW4ndCBiZSBsYXppbHkgc3luY2hyb25pemVkIGJ5IHZtYWxsb2MgZmF1bHRzLgotICogdm1hbGxvYyBmYXVsdHMgd29yayBiZWNhdXNlIGF0dGFjaGVkIHBhZ2V0YWJsZXMgYXJlIG5ldmVyIGZyZWVkLgotICogLS0gd2xpCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBwZ2RfbGlzdF9hZGQocGdkX3QgKnBnZCkKLXsKLQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHZpcnRfdG9fcGFnZShwZ2QpOwotCi0JbGlzdF9hZGQoJnBhZ2UtPmxydSwgJnBnZF9saXN0KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHBnZF9saXN0X2RlbChwZ2RfdCAqcGdkKQotewotCXN0cnVjdCBwYWdlICpwYWdlID0gdmlydF90b19wYWdlKHBnZCk7Ci0KLQlsaXN0X2RlbCgmcGFnZS0+bHJ1KTsKLX0KLQotI2RlZmluZSBVTlNIQVJFRF9QVFJTX1BFUl9QR0QJCQkJXAotCShTSEFSRURfS0VSTkVMX1BNRCA/IFVTRVJfUFRSU19QRVJfUEdEIDogUFRSU19QRVJfUEdEKQotCi1zdGF0aWMgdm9pZCBwZ2RfY3Rvcih2b2lkICpwKQotewotCXBnZF90ICpwZ2QgPSBwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBDbGVhciB1c2VybW9kZSBwYXJ0cyBvZiBQR0QgKi8KLQltZW1zZXQocGdkLCAwLCBVU0VSX1BUUlNfUEVSX1BHRCpzaXplb2YocGdkX3QpKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwZ2RfbG9jaywgZmxhZ3MpOwotCi0JLyogSWYgdGhlIHBnZCBwb2ludHMgdG8gYSBzaGFyZWQgcGFnZXRhYmxlIGxldmVsIChlaXRoZXIgdGhlCi0JICAgcHRlcyBpbiBub24tUEFFLCBvciBzaGFyZWQgUE1EIGluIFBBRSksIHRoZW4ganVzdCBjb3B5IHRoZQotCSAgIHJlZmVyZW5jZXMgZnJvbSBzd2FwcGVyX3BnX2Rpci4gKi8KLQlpZiAoUEFHRVRBQkxFX0xFVkVMUyA9PSAyIHx8Ci0JICAgIChQQUdFVEFCTEVfTEVWRUxTID09IDMgJiYgU0hBUkVEX0tFUk5FTF9QTUQpKSB7Ci0JCWNsb25lX3BnZF9yYW5nZShwZ2QgKyBVU0VSX1BUUlNfUEVSX1BHRCwKLQkJCQlzd2FwcGVyX3BnX2RpciArIFVTRVJfUFRSU19QRVJfUEdELAotCQkJCUtFUk5FTF9QR0RfUFRSUyk7Ci0JCXBhcmF2aXJ0X2FsbG9jX3BkX2Nsb25lKF9fcGEocGdkKSA+PiBQQUdFX1NISUZULAotCQkJCQlfX3BhKHN3YXBwZXJfcGdfZGlyKSA+PiBQQUdFX1NISUZULAotCQkJCQlVU0VSX1BUUlNfUEVSX1BHRCwKLQkJCQkJS0VSTkVMX1BHRF9QVFJTKTsKLQl9Ci0KLQkvKiBsaXN0IHJlcXVpcmVkIHRvIHN5bmMga2VybmVsIG1hcHBpbmcgdXBkYXRlcyAqLwotCWlmICghU0hBUkVEX0tFUk5FTF9QTUQpCi0JCXBnZF9saXN0X2FkZChwZ2QpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGdkX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgcGdkX2R0b3Iodm9pZCAqcGdkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7IC8qIGNhbiBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCAqLwotCi0JaWYgKFNIQVJFRF9LRVJORUxfUE1EKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGdkX2xvY2ssIGZsYWdzKTsKLQlwZ2RfbGlzdF9kZWwocGdkKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZ2RfbG9jaywgZmxhZ3MpOwotfQotCi0jaWZkZWYgQ09ORklHX1g4Nl9QQUUKLS8qCi0gKiBNb3AgdXAgYW55IHBtZCBwYWdlcyB3aGljaCBtYXkgc3RpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIHBnZC4KLSAqIE5vcm1hbGx5IHRoZXkgd2lsbCBiZSBmcmVlZCBieSBtdW5tYXAvZXhpdF9tbWFwLCBidXQgYW55IHBtZCB3ZQotICogcHJlYWxsb2NhdGUgd2hpY2ggbmV2ZXIgZ290IGEgY29ycmVzcG9uZGluZyB2bWEgd2lsbCBuZWVkIHRvIGJlCi0gKiBmcmVlZCBtYW51YWxseS4KLSAqLwotc3RhdGljIHZvaWQgcGdkX21vcF91cF9wbWRzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ2RfdCAqcGdkcCkKLXsKLQlpbnQgaTsKLQotCWZvcihpID0gMDsgaSA8IFVOU0hBUkVEX1BUUlNfUEVSX1BHRDsgaSsrKSB7Ci0JCXBnZF90IHBnZCA9IHBnZHBbaV07Ci0KLQkJaWYgKHBnZF92YWwocGdkKSAhPSAwKSB7Ci0JCQlwbWRfdCAqcG1kID0gKHBtZF90ICopcGdkX3BhZ2VfdmFkZHIocGdkKTsKLQotCQkJcGdkcFtpXSA9IG5hdGl2ZV9tYWtlX3BnZCgwKTsKLQotCQkJcGFyYXZpcnRfcmVsZWFzZV9wZChwZ2RfdmFsKHBnZCkgPj4gUEFHRV9TSElGVCk7Ci0JCQlwbWRfZnJlZShtbSwgcG1kKTsKLQkJfQotCX0KLX0KLQotLyoKLSAqIEluIFBBRSBtb2RlLCB3ZSBuZWVkIHRvIGRvIGEgY3IzIHJlbG9hZCAoPXRsYiBmbHVzaCkgd2hlbgotICogdXBkYXRpbmcgdGhlIHRvcC1sZXZlbCBwYWdldGFibGUgZW50cmllcyB0byBndWFyYW50ZWUgdGhlCi0gKiBwcm9jZXNzb3Igbm90aWNlcyB0aGUgdXBkYXRlLiAgU2luY2UgdGhpcyBpcyBleHBlbnNpdmUsIGFuZAotICogYWxsIDQgdG9wLWxldmVsIGVudHJpZXMgYXJlIHVzZWQgYWxtb3N0IGltbWVkaWF0ZWx5IGluIGEKLSAqIG5ldyBwcm9jZXNzJ3MgbGlmZSwgd2UganVzdCBwcmUtcG9wdWxhdGUgdGhlbSBoZXJlLgotICoKLSAqIEFsc28sIGlmIHdlJ3JlIGluIGEgcGFyYXZpcnQgZW52aXJvbm1lbnQgd2hlcmUgdGhlIGtlcm5lbCBwbWQgaXMKLSAqIG5vdCBzaGFyZWQgYmV0d2VlbiBwYWdldGFibGVzICghU0hBUkVEX0tFUk5FTF9QTURTKSwgd2UgYWxsb2NhdGUKLSAqIGFuZCBpbml0aWFsaXplIHRoZSBrZXJuZWwgcG1kcyBoZXJlLgotICovCi1zdGF0aWMgaW50IHBnZF9wcmVwb3B1bGF0ZV9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBnZF90ICpwZ2QpCi17Ci0JcHVkX3QgKnB1ZDsKLQl1bnNpZ25lZCBsb25nIGFkZHI7Ci0JaW50IGk7Ci0KLQlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgMCk7Ci0gCWZvciAoYWRkciA9IGkgPSAwOyBpIDwgVU5TSEFSRURfUFRSU19QRVJfUEdEOwotCSAgICAgaSsrLCBwdWQrKywgYWRkciArPSBQVURfU0laRSkgewotCQlwbWRfdCAqcG1kID0gcG1kX2FsbG9jX29uZShtbSwgYWRkcik7Ci0KLQkJaWYgKCFwbWQpIHsKLQkJCXBnZF9tb3BfdXBfcG1kcyhtbSwgcGdkKTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJaWYgKGkgPj0gVVNFUl9QVFJTX1BFUl9QR0QpCi0JCQltZW1jcHkocG1kLCAocG1kX3QgKilwZ2RfcGFnZV92YWRkcihzd2FwcGVyX3BnX2RpcltpXSksCi0JCQkgICAgICAgc2l6ZW9mKHBtZF90KSAqIFBUUlNfUEVSX1BNRCk7Ci0KLQkJcHVkX3BvcHVsYXRlKG1tLCBwdWQsIHBtZCk7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0jZWxzZSAgLyogIUNPTkZJR19YODZfUEFFICovCi0vKiBObyBuZWVkIHRvIHByZXBvcHVsYXRlIGFueSBwYWdldGFibGUgZW50cmllcyBpbiBub24tUEFFIG1vZGVzLiAqLwotc3RhdGljIGludCBwZ2RfcHJlcG9wdWxhdGVfcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ2RfdCAqcGdkKQotewotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBwZ2RfbW9wX3VwX3BtZHMoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBnZF90ICpwZ2RwKQotewotfQotI2VuZGlmCS8qIENPTkZJR19YODZfUEFFICovCi0KLXBnZF90ICpwZ2RfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0pCi17Ci0JcGdkX3QgKnBnZCA9IChwZ2RfdCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7Ci0KLQkvKiBzbyB0aGF0IGFsbG9jX3BkIGNhbiB1c2UgaXQgKi8KLQltbS0+cGdkID0gcGdkOwotCWlmIChwZ2QpCi0JCXBnZF9jdG9yKHBnZCk7Ci0KLQlpZiAocGdkICYmICFwZ2RfcHJlcG9wdWxhdGVfcG1kKG1tLCBwZ2QpKSB7Ci0JCXBnZF9kdG9yKHBnZCk7Ci0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwZ2QpOwotCQlwZ2QgPSBOVUxMOwotCX0KLQotCXJldHVybiBwZ2Q7Ci19Ci0KLXZvaWQgcGdkX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBnZF90ICpwZ2QpCi17Ci0JcGdkX21vcF91cF9wbWRzKG1tLCBwZ2QpOwotCXBnZF9kdG9yKHBnZCk7Ci0JZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBnZCk7Ci19Ci0KLXZvaWQgX19wdGVfZnJlZV90bGIoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgc3RydWN0IHBhZ2UgKnB0ZSkKLXsKLQlwZ3RhYmxlX3BhZ2VfZHRvcihwdGUpOwotCXBhcmF2aXJ0X3JlbGVhc2VfcHQocGFnZV90b19wZm4ocHRlKSk7Ci0JdGxiX3JlbW92ZV9wYWdlKHRsYiwgcHRlKTsKLX0KLQotI2lmZGVmIENPTkZJR19YODZfUEFFCi0KLXZvaWQgX19wbWRfZnJlZV90bGIoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgcG1kX3QgKnBtZCkKLXsKLQlwYXJhdmlydF9yZWxlYXNlX3BkKF9fcGEocG1kKSA+PiBQQUdFX1NISUZUKTsKLQl0bGJfcmVtb3ZlX3BhZ2UodGxiLCB2aXJ0X3RvX3BhZ2UocG1kKSk7Ci19Ci0KLSNlbmRpZgotCiBpbnQgcG1kX2JhZChwbWRfdCBwbWQpCiB7CiAJV0FSTl9PTl9PTkNFKHBtZF9iYWRfdjEocG1kKSAhPSBwbWRfYmFkX3YyKHBtZCkpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL0tjb25maWcgYi9hcmNoL3g4Ni94ZW4vS2NvbmZpZwppbmRleCA0ZDVmMjY0Li4yZTY0MWJlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vS2NvbmZpZworKysgYi9hcmNoL3g4Ni94ZW4vS2NvbmZpZwpAQCAtNiw3ICs2LDcgQEAKIAlib29sICJYZW4gZ3Vlc3Qgc3VwcG9ydCIKIAlzZWxlY3QgUEFSQVZJUlQKIAlkZXBlbmRzIG9uIFg4Nl8zMgotCWRlcGVuZHMgb24gWDg2X0NNUFhDSEcgJiYgWDg2X1RTQyAmJiAhTkVFRF9NVUxUSVBMRV9OT0RFUyAmJiAhKFg4Nl9WSVNXUyB8fCBYODZfVk9ZQUdFUikKKwlkZXBlbmRzIG9uIFg4Nl9DTVBYQ0hHICYmIFg4Nl9UU0MgJiYgIShYODZfVklTV1MgfHwgWDg2X1ZPWUFHRVIpCiAJaGVscAogCSAgVGhpcyBpcyB0aGUgTGludXggWGVuIHBvcnQuICBFbmFibGluZyB0aGlzIHdpbGwgYWxsb3cgdGhlCiAJICBrZXJuZWwgdG8gYm9vdCBpbiBhIHBhcmF2aXJ0dWFsaXplZCBlbnZpcm9ubWVudCB1bmRlciB0aGUKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9NYWtlZmlsZSBiL2FyY2gveDg2L3hlbi9NYWtlZmlsZQppbmRleCAzNDNkZjI0Li4zZDhkZjk4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vTWFrZWZpbGUKKysrIGIvYXJjaC94ODYveGVuL01ha2VmaWxlCkBAIC0xLDQgKzEsNCBAQAotb2JqLXkJCTo9IGVubGlnaHRlbi5vIHNldHVwLm8gZmVhdHVyZXMubyBtdWx0aWNhbGxzLm8gbW11Lm8gXAotCQkJZXZlbnRzLm8gdGltZS5vIG1hbmFnZS5vIHhlbi1hc20ubworb2JqLXkJCTo9IGVubGlnaHRlbi5vIHNldHVwLm8gbXVsdGljYWxscy5vIG1tdS5vIFwKKwkJCXRpbWUubyBtYW5hZ2UubyB4ZW4tYXNtLm8gZ3JhbnQtdGFibGUubwogCiBvYmotJChDT05GSUdfU01QKQkrPSBzbXAubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jIGIvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jCmluZGV4IGMwMzg4MjIuLmM4YTU2ZTQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYworKysgYi9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMKQEAgLTE1NSw3ICsxNTUsOCBAQAogCWlmICgqYXggPT0gMSkKIAkJbWFza2VkeCA9IH4oKDEgPDwgWDg2X0ZFQVRVUkVfQVBJQykgfCAgLyogZGlzYWJsZSBBUElDICovCiAJCQkgICAgKDEgPDwgWDg2X0ZFQVRVUkVfQUNQSSkgfCAgLyogZGlzYWJsZSBBQ1BJICovCi0JCQkgICAgKDEgPDwgWDg2X0ZFQVRVUkVfU0VQKSAgfCAgLyogZGlzYWJsZSBTRVAgKi8KKwkJCSAgICAoMSA8PCBYODZfRkVBVFVSRV9NQ0UpICB8ICAvKiBkaXNhYmxlIE1DRSAqLworCQkJICAgICgxIDw8IFg4Nl9GRUFUVVJFX01DQSkgIHwgIC8qIGRpc2FibGUgTUNBICovCiAJCQkgICAgKDEgPDwgWDg2X0ZFQVRVUkVfQUNDKSk7ICAgLyogdGhlcm1hbCBtb25pdG9yaW5nICovCiAKIAlhc20oWEVOX0VNVUxBVEVfUFJFRklYICJjcHVpZCIKQEAgLTUzMSwyNiArNTMyLDM3IEBACiBzdGF0aWMgdm9pZCB4ZW5fZmx1c2hfdGxiKHZvaWQpCiB7CiAJc3RydWN0IG1tdWV4dF9vcCAqb3A7Ci0Jc3RydWN0IG11bHRpY2FsbF9zcGFjZSBtY3MgPSB4ZW5fbWNfZW50cnkoc2l6ZW9mKCpvcCkpOworCXN0cnVjdCBtdWx0aWNhbGxfc3BhY2UgbWNzOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisKKwltY3MgPSB4ZW5fbWNfZW50cnkoc2l6ZW9mKCpvcCkpOwogCiAJb3AgPSBtY3MuYXJnczsKIAlvcC0+Y21kID0gTU1VRVhUX1RMQl9GTFVTSF9MT0NBTDsKIAlNVUxUSV9tbXVleHRfb3AobWNzLm1jLCBvcCwgMSwgTlVMTCwgRE9NSURfU0VMRik7CiAKIAl4ZW5fbWNfaXNzdWUoUEFSQVZJUlRfTEFaWV9NTVUpOworCisJcHJlZW1wdF9lbmFibGUoKTsKIH0KIAogc3RhdGljIHZvaWQgeGVuX2ZsdXNoX3RsYl9zaW5nbGUodW5zaWduZWQgbG9uZyBhZGRyKQogewogCXN0cnVjdCBtbXVleHRfb3AgKm9wOwotCXN0cnVjdCBtdWx0aWNhbGxfc3BhY2UgbWNzID0geGVuX21jX2VudHJ5KHNpemVvZigqb3ApKTsKKwlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNlIG1jczsKIAorCXByZWVtcHRfZGlzYWJsZSgpOworCisJbWNzID0geGVuX21jX2VudHJ5KHNpemVvZigqb3ApKTsKIAlvcCA9IG1jcy5hcmdzOwogCW9wLT5jbWQgPSBNTVVFWFRfSU5WTFBHX0xPQ0FMOwogCW9wLT5hcmcxLmxpbmVhcl9hZGRyID0gYWRkciAmIFBBR0VfTUFTSzsKIAlNVUxUSV9tbXVleHRfb3AobWNzLm1jLCBvcCwgMSwgTlVMTCwgRE9NSURfU0VMRik7CiAKIAl4ZW5fbWNfaXNzdWUoUEFSQVZJUlRfTEFaWV9NTVUpOworCisJcHJlZW1wdF9lbmFibGUoKTsKIH0KIAogc3RhdGljIHZvaWQgeGVuX2ZsdXNoX3RsYl9vdGhlcnMoY29uc3QgY3B1bWFza190ICpjcHVzLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKQEAgLTY1NSwxNSArNjY3LDE3IEBACiAKIC8qIEVhcmx5IGluIGJvb3QsIHdoaWxlIHNldHRpbmcgdXAgdGhlIGluaXRpYWwgcGFnZXRhYmxlLCBhc3N1bWUKICAgIGV2ZXJ5dGhpbmcgaXMgcGlubmVkLiAqLwotc3RhdGljIF9faW5pdCB2b2lkIHhlbl9hbGxvY19wdF9pbml0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1MzIgcGZuKQorc3RhdGljIF9faW5pdCB2b2lkIHhlbl9hbGxvY19wdGVfaW5pdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdTMyIHBmbikKIHsKKyNpZmRlZiBDT05GSUdfRkxBVE1FTQogCUJVR19PTihtZW1fbWFwKTsJLyogc2hvdWxkIG9ubHkgYmUgdXNlZCBlYXJseSAqLworI2VuZGlmCiAJbWFrZV9sb3dtZW1fcGFnZV9yZWFkb25seShfX3ZhKFBGTl9QSFlTKHBmbikpKTsKIH0KIAotLyogRWFybHkgcmVsZWFzZV9wdCBhc3N1bWVzIHRoYXQgYWxsIHB0cyBhcmUgcGlubmVkLCBzaW5jZSB0aGVyZSdzCisvKiBFYXJseSByZWxlYXNlX3B0ZSBhc3N1bWVzIHRoYXQgYWxsIHB0cyBhcmUgcGlubmVkLCBzaW5jZSB0aGVyZSdzCiAgICBvbmx5IGluaXRfbW0gYW5kIGFueXRoaW5nIGF0dGFjaGVkIHRvIHRoYXQgaXMgcGlubmVkLiAqLwotc3RhdGljIHZvaWQgeGVuX3JlbGVhc2VfcHRfaW5pdCh1MzIgcGZuKQorc3RhdGljIHZvaWQgeGVuX3JlbGVhc2VfcHRlX2luaXQodTMyIHBmbikKIHsKIAltYWtlX2xvd21lbV9wYWdlX3JlYWR3cml0ZShfX3ZhKFBGTl9QSFlTKHBmbikpKTsKIH0KQEAgLTY5NywxMiArNzExLDEyIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCB4ZW5fYWxsb2NfcHQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHUzMiBwZm4pCitzdGF0aWMgdm9pZCB4ZW5fYWxsb2NfcHRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1MzIgcGZuKQogewogCXhlbl9hbGxvY19wdHBhZ2UobW0sIHBmbiwgUFRfUFRFKTsKIH0KIAotc3RhdGljIHZvaWQgeGVuX2FsbG9jX3BkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1MzIgcGZuKQorc3RhdGljIHZvaWQgeGVuX2FsbG9jX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdTMyIHBmbikKIHsKIAl4ZW5fYWxsb2NfcHRwYWdlKG1tLCBwZm4sIFBUX1BNRCk7CiB9CkBAIC03MjIsMTIgKzczNiwxMiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgeGVuX3JlbGVhc2VfcHQodTMyIHBmbikKK3N0YXRpYyB2b2lkIHhlbl9yZWxlYXNlX3B0ZSh1MzIgcGZuKQogewogCXhlbl9yZWxlYXNlX3B0cGFnZShwZm4sIFBUX1BURSk7CiB9CiAKLXN0YXRpYyB2b2lkIHhlbl9yZWxlYXNlX3BkKHUzMiBwZm4pCitzdGF0aWMgdm9pZCB4ZW5fcmVsZWFzZV9wbWQodTMyIHBmbikKIHsKIAl4ZW5fcmVsZWFzZV9wdHBhZ2UocGZuLCBQVF9QTUQpOwogfQpAQCAtODQ5LDEwICs4NjMsMTAgQEAKIHsKIAkvKiBUaGlzIHdpbGwgd29yayBhcyBsb25nIGFzIHBhdGNoaW5nIGhhc24ndCBoYXBwZW5lZCB5ZXQKIAkgICAod2hpY2ggaXQgaGFzbid0KSAqLwotCXB2X21tdV9vcHMuYWxsb2NfcHQgPSB4ZW5fYWxsb2NfcHQ7Ci0JcHZfbW11X29wcy5hbGxvY19wZCA9IHhlbl9hbGxvY19wZDsKLQlwdl9tbXVfb3BzLnJlbGVhc2VfcHQgPSB4ZW5fcmVsZWFzZV9wdDsKLQlwdl9tbXVfb3BzLnJlbGVhc2VfcGQgPSB4ZW5fcmVsZWFzZV9wZDsKKwlwdl9tbXVfb3BzLmFsbG9jX3B0ZSA9IHhlbl9hbGxvY19wdGU7CisJcHZfbW11X29wcy5hbGxvY19wbWQgPSB4ZW5fYWxsb2NfcG1kOworCXB2X21tdV9vcHMucmVsZWFzZV9wdGUgPSB4ZW5fcmVsZWFzZV9wdGU7CisJcHZfbW11X29wcy5yZWxlYXNlX3BtZCA9IHhlbl9yZWxlYXNlX3BtZDsKIAlwdl9tbXVfb3BzLnNldF9wdGUgPSB4ZW5fc2V0X3B0ZTsKIAogCXNldHVwX3NoYXJlZF9pbmZvKCk7CkBAIC05OTQsNyArMTAwOCw3IEBACiAJLnJlYWRfcG1jID0gbmF0aXZlX3JlYWRfcG1jLAogCiAJLmlyZXQgPSB4ZW5faXJldCwKLQkuaXJxX2VuYWJsZV9zeXNjYWxsX3JldCA9IE5VTEwsICAvKiBuZXZlciBjYWxsZWQgKi8KKwkuaXJxX2VuYWJsZV9zeXNjYWxsX3JldCA9IHhlbl9zeXNleGl0LAogCiAJLmxvYWRfdHJfZGVzYyA9IHBhcmF2aXJ0X25vcCwKIAkuc2V0X2xkdCA9IHhlbl9zZXRfbGR0LApAQCAtMTA1OSwxMSArMTA3MywxMSBAQAogCS5wdGVfdXBkYXRlID0gcGFyYXZpcnRfbm9wLAogCS5wdGVfdXBkYXRlX2RlZmVyID0gcGFyYXZpcnRfbm9wLAogCi0JLmFsbG9jX3B0ID0geGVuX2FsbG9jX3B0X2luaXQsCi0JLnJlbGVhc2VfcHQgPSB4ZW5fcmVsZWFzZV9wdF9pbml0LAotCS5hbGxvY19wZCA9IHhlbl9hbGxvY19wdF9pbml0LAotCS5hbGxvY19wZF9jbG9uZSA9IHBhcmF2aXJ0X25vcCwKLQkucmVsZWFzZV9wZCA9IHhlbl9yZWxlYXNlX3B0X2luaXQsCisJLmFsbG9jX3B0ZSA9IHhlbl9hbGxvY19wdGVfaW5pdCwKKwkucmVsZWFzZV9wdGUgPSB4ZW5fcmVsZWFzZV9wdGVfaW5pdCwKKwkuYWxsb2NfcG1kID0geGVuX2FsbG9jX3B0ZV9pbml0LAorCS5hbGxvY19wbWRfY2xvbmUgPSBwYXJhdmlydF9ub3AsCisJLnJlbGVhc2VfcG1kID0geGVuX3JlbGVhc2VfcHRlX2luaXQsCiAKICNpZmRlZiBDT05GSUdfSElHSFBURQogCS5rbWFwX2F0b21pY19wdGUgPSB4ZW5fa21hcF9hdG9taWNfcHRlLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL2dyYW50LXRhYmxlLmMgYi9hcmNoL3g4Ni94ZW4vZ3JhbnQtdGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWJhOWI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYveGVuL2dyYW50LXRhYmxlLmMKQEAgLTAsMCArMSw5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ3JhbnRfdGFibGUuYworICogeDg2IHNwZWNpZmljIHBhcnQKKyAqCisgKiBHcmFudGluZyBmb3JlaWduIGFjY2VzcyB0byBvdXIgbWVtb3J5IHJlc2VydmF0aW9uLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA2LCBDaHJpc3RvcGhlciBDbGFyaworICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUsIEsgQSBGcmFzZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJc2FrdSBZYW1haGF0YSA8eWFtYWhhdGEgYXQgdmFsaW51eCBjbyBqcD4KKyAqICAgICAgICAgICAgICAgICAgICBWQSBMaW51eCBTeXN0ZW1zIEphcGFuLiBTcGxpdCBvdXQgeDg2IHNwZWNpZmljIHBhcnQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgb3IsIHdoZW4gZGlzdHJpYnV0ZWQKKyAqIHNlcGFyYXRlbHkgZnJvbSB0aGUgTGludXgga2VybmVsIG9yIGluY29ycG9yYXRlZCBpbnRvIG90aGVyCisgKiBzb2Z0d2FyZSBwYWNrYWdlcywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGxpY2Vuc2U6CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb3VyY2UgZmlsZSAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LAorICogbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UveGVuLmg+CisjaW5jbHVkZSA8eGVuL3BhZ2UuaD4KKyNpbmNsdWRlIDx4ZW4vZ3JhbnRfdGFibGUuaD4KKworI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisKK3N0YXRpYyBpbnQgbWFwX3B0ZV9mbihwdGVfdCAqcHRlLCBzdHJ1Y3QgcGFnZSAqcG1kX3BhZ2UsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nICoqZnJhbWVzID0gKHVuc2lnbmVkIGxvbmcgKiopZGF0YTsKKworCXNldF9wdGVfYXQoJmluaXRfbW0sIGFkZHIsIHB0ZSwgbWZuX3B0ZSgoKmZyYW1lcylbMF0sIFBBR0VfS0VSTkVMKSk7CisJKCpmcmFtZXMpKys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdW5tYXBfcHRlX2ZuKHB0ZV90ICpwdGUsIHN0cnVjdCBwYWdlICpwbWRfcGFnZSwKKwkJCXVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZGF0YSkKK3sKKworCXNldF9wdGVfYXQoJmluaXRfbW0sIGFkZHIsIHB0ZSwgX19wdGUoMCkpOworCXJldHVybiAwOworfQorCitpbnQgYXJjaF9nbnR0YWJfbWFwX3NoYXJlZCh1bnNpZ25lZCBsb25nICpmcmFtZXMsIHVuc2lnbmVkIGxvbmcgbnJfZ2ZyYW1lcywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgbWF4X25yX2dmcmFtZXMsCisJCQkgICBzdHJ1Y3QgZ3JhbnRfZW50cnkgKipfX3NoYXJlZCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IGdyYW50X2VudHJ5ICpzaGFyZWQgPSAqX19zaGFyZWQ7CisKKwlpZiAoc2hhcmVkID09IE5VTEwpIHsKKwkJc3RydWN0IHZtX3N0cnVjdCAqYXJlYSA9CisJCQl4ZW5fYWxsb2Nfdm1fYXJlYShQQUdFX1NJWkUgKiBtYXhfbnJfZ2ZyYW1lcyk7CisJCUJVR19PTihhcmVhID09IE5VTEwpOworCQlzaGFyZWQgPSBhcmVhLT5hZGRyOworCQkqX19zaGFyZWQgPSBzaGFyZWQ7CisJfQorCisJcmMgPSBhcHBseV90b19wYWdlX3JhbmdlKCZpbml0X21tLCAodW5zaWduZWQgbG9uZylzaGFyZWQsCisJCQkJIFBBR0VfU0laRSAqIG5yX2dmcmFtZXMsCisJCQkJIG1hcF9wdGVfZm4sICZmcmFtZXMpOworCXJldHVybiByYzsKK30KKwordm9pZCBhcmNoX2dudHRhYl91bm1hcF9zaGFyZWQoc3RydWN0IGdyYW50X2VudHJ5ICpzaGFyZWQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIG5yX2dmcmFtZXMpCit7CisJYXBwbHlfdG9fcGFnZV9yYW5nZSgmaW5pdF9tbSwgKHVuc2lnbmVkIGxvbmcpc2hhcmVkLAorCQkJICAgIFBBR0VfU0laRSAqIG5yX2dmcmFtZXMsIHVubWFwX3B0ZV9mbiwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vbW11LmMgYi9hcmNoL3g4Ni94ZW4vbW11LmMKaW5kZXggMmEwNTRlZi4uNmNiY2Y2NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL21tdS5jCisrKyBiL2FyY2gveDg2L3hlbi9tbXUuYwpAQCAtMTU2LDYgKzE1NiwxMCBAQAogdm9pZCB4ZW5fc2V0X3B0ZV9hdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkgICAgcHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZXZhbCkKIHsKKwkvKiB1cGRhdGVzIHRvIGluaXRfbW0gbWF5IGJlIGRvbmUgd2l0aG91dCBsb2NrICovCisJaWYgKG1tID09ICZpbml0X21tKQorCQlwcmVlbXB0X2Rpc2FibGUoKTsKKwogCWlmIChtbSA9PSBjdXJyZW50LT5tbSB8fCBtbSA9PSAmaW5pdF9tbSkgewogCQlpZiAocGFyYXZpcnRfZ2V0X2xhenlfbW9kZSgpID09IFBBUkFWSVJUX0xBWllfTU1VKSB7CiAJCQlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNlIG1jczsKQEAgLTE2MywxNCArMTY3LDYxIEBACiAKIAkJCU1VTFRJX3VwZGF0ZV92YV9tYXBwaW5nKG1jcy5tYywgYWRkciwgcHRldmFsLCAwKTsKIAkJCXhlbl9tY19pc3N1ZShQQVJBVklSVF9MQVpZX01NVSk7Ci0JCQlyZXR1cm47CisJCQlnb3RvIG91dDsKIAkJfSBlbHNlCiAJCQlpZiAoSFlQRVJWSVNPUl91cGRhdGVfdmFfbWFwcGluZyhhZGRyLCBwdGV2YWwsIDApID09IDApCi0JCQkJcmV0dXJuOworCQkJCWdvdG8gb3V0OwogCX0KIAl4ZW5fc2V0X3B0ZShwdGVwLCBwdGV2YWwpOworCitvdXQ6CisJaWYgKG1tID09ICZpbml0X21tKQorCQlwcmVlbXB0X2VuYWJsZSgpOwogfQogCitwdGV2YWxfdCB4ZW5fcHRlX3ZhbChwdGVfdCBwdGUpCit7CisJcHRldmFsX3QgcmV0ID0gcHRlLnB0ZTsKKworCWlmIChyZXQgJiBfUEFHRV9QUkVTRU5UKQorCQlyZXQgPSBtYWNoaW5lX3RvX3BoeXMoWE1BRERSKHJldCkpLnBhZGRyIHwgX1BBR0VfUFJFU0VOVDsKKworCXJldHVybiByZXQ7Cit9CisKK3BnZHZhbF90IHhlbl9wZ2RfdmFsKHBnZF90IHBnZCkKK3sKKwlwZ2R2YWxfdCByZXQgPSBwZ2QucGdkOworCWlmIChyZXQgJiBfUEFHRV9QUkVTRU5UKQorCQlyZXQgPSBtYWNoaW5lX3RvX3BoeXMoWE1BRERSKHJldCkpLnBhZGRyIHwgX1BBR0VfUFJFU0VOVDsKKwlyZXR1cm4gcmV0OworfQorCitwdGVfdCB4ZW5fbWFrZV9wdGUocHRldmFsX3QgcHRlKQoreworCWlmIChwdGUgJiBfUEFHRV9QUkVTRU5UKSB7CisJCXB0ZSA9IHBoeXNfdG9fbWFjaGluZShYUEFERFIocHRlKSkubWFkZHI7CisJCXB0ZSAmPSB+KF9QQUdFX1BDRCB8IF9QQUdFX1BXVCk7CisJfQorCisJcmV0dXJuIChwdGVfdCl7IC5wdGUgPSBwdGUgfTsKK30KKworcGdkX3QgeGVuX21ha2VfcGdkKHBnZHZhbF90IHBnZCkKK3sKKwlpZiAocGdkICYgX1BBR0VfUFJFU0VOVCkKKwkJcGdkID0gcGh5c190b19tYWNoaW5lKFhQQUREUihwZ2QpKS5tYWRkcjsKKworCXJldHVybiAocGdkX3QpeyBwZ2QgfTsKK30KKworcG1kdmFsX3QgeGVuX3BtZF92YWwocG1kX3QgcG1kKQoreworCXBtZHZhbF90IHJldCA9IG5hdGl2ZV9wbWRfdmFsKHBtZCk7CisJaWYgKHJldCAmIF9QQUdFX1BSRVNFTlQpCisJCXJldCA9IG1hY2hpbmVfdG9fcGh5cyhYTUFERFIocmV0KSkucGFkZHIgfCBfUEFHRV9QUkVTRU5UOworCXJldHVybiByZXQ7Cit9CiAjaWZkZWYgQ09ORklHX1g4Nl9QQUUKIHZvaWQgeGVuX3NldF9wdWQocHVkX3QgKnB0ciwgcHVkX3QgdmFsKQogewpAQCAtMjE0LDEwMCArMjY1LDE4IEBACiAJeGVuX3NldF9wbWQocG1kcCwgX19wbWQoMCkpOwogfQogCi11bnNpZ25lZCBsb25nIGxvbmcgeGVuX3B0ZV92YWwocHRlX3QgcHRlKQorcG1kX3QgeGVuX21ha2VfcG1kKHBtZHZhbF90IHBtZCkKIHsKLQl1bnNpZ25lZCBsb25nIGxvbmcgcmV0ID0gMDsKLQotCWlmIChwdGUucHRlX2xvdykgewotCQlyZXQgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZylwdGUucHRlX2hpZ2ggPDwgMzIpIHwgcHRlLnB0ZV9sb3c7Ci0JCXJldCA9IG1hY2hpbmVfdG9fcGh5cyhYTUFERFIocmV0KSkucGFkZHIgfCAxOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgbG9uZyB4ZW5fcG1kX3ZhbChwbWRfdCBwbWQpCi17Ci0JdW5zaWduZWQgbG9uZyBsb25nIHJldCA9IHBtZC5wbWQ7Ci0JaWYgKHJldCkKLQkJcmV0ID0gbWFjaGluZV90b19waHlzKFhNQUREUihyZXQpKS5wYWRkciB8IDE7Ci0JcmV0dXJuIHJldDsKLX0KLQotdW5zaWduZWQgbG9uZyBsb25nIHhlbl9wZ2RfdmFsKHBnZF90IHBnZCkKLXsKLQl1bnNpZ25lZCBsb25nIGxvbmcgcmV0ID0gcGdkLnBnZDsKLQlpZiAocmV0KQotCQlyZXQgPSBtYWNoaW5lX3RvX3BoeXMoWE1BRERSKHJldCkpLnBhZGRyIHwgMTsKLQlyZXR1cm4gcmV0OwotfQotCi1wdGVfdCB4ZW5fbWFrZV9wdGUodW5zaWduZWQgbG9uZyBsb25nIHB0ZSkKLXsKLQlpZiAocHRlICYgX1BBR0VfUFJFU0VOVCkgewotCQlwdGUgPSBwaHlzX3RvX21hY2hpbmUoWFBBRERSKHB0ZSkpLm1hZGRyOwotCQlwdGUgJj0gfihfUEFHRV9QQ0QgfCBfUEFHRV9QV1QpOwotCX0KLQotCXJldHVybiAocHRlX3QpeyAucHRlID0gcHRlIH07Ci19Ci0KLXBtZF90IHhlbl9tYWtlX3BtZCh1bnNpZ25lZCBsb25nIGxvbmcgcG1kKQotewotCWlmIChwbWQgJiAxKQorCWlmIChwbWQgJiBfUEFHRV9QUkVTRU5UKQogCQlwbWQgPSBwaHlzX3RvX21hY2hpbmUoWFBBRERSKHBtZCkpLm1hZGRyOwogCi0JcmV0dXJuIChwbWRfdCl7IHBtZCB9OwotfQotCi1wZ2RfdCB4ZW5fbWFrZV9wZ2QodW5zaWduZWQgbG9uZyBsb25nIHBnZCkKLXsKLQlpZiAocGdkICYgX1BBR0VfUFJFU0VOVCkKLQkJcGdkID0gcGh5c190b19tYWNoaW5lKFhQQUREUihwZ2QpKS5tYWRkcjsKLQotCXJldHVybiAocGdkX3QpeyBwZ2QgfTsKKwlyZXR1cm4gbmF0aXZlX21ha2VfcG1kKHBtZCk7CiB9CiAjZWxzZSAgLyogIVBBRSAqLwogdm9pZCB4ZW5fc2V0X3B0ZShwdGVfdCAqcHRlcCwgcHRlX3QgcHRlKQogewogCSpwdGVwID0gcHRlOwogfQotCi11bnNpZ25lZCBsb25nIHhlbl9wdGVfdmFsKHB0ZV90IHB0ZSkKLXsKLQl1bnNpZ25lZCBsb25nIHJldCA9IHB0ZS5wdGVfbG93OwotCi0JaWYgKHJldCAmIF9QQUdFX1BSRVNFTlQpCi0JCXJldCA9IG1hY2hpbmVfdG9fcGh5cyhYTUFERFIocmV0KSkucGFkZHI7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi11bnNpZ25lZCBsb25nIHhlbl9wZ2RfdmFsKHBnZF90IHBnZCkKLXsKLQl1bnNpZ25lZCBsb25nIHJldCA9IHBnZC5wZ2Q7Ci0JaWYgKHJldCkKLQkJcmV0ID0gbWFjaGluZV90b19waHlzKFhNQUREUihyZXQpKS5wYWRkciB8IDE7Ci0JcmV0dXJuIHJldDsKLX0KLQotcHRlX3QgeGVuX21ha2VfcHRlKHVuc2lnbmVkIGxvbmcgcHRlKQotewotCWlmIChwdGUgJiBfUEFHRV9QUkVTRU5UKSB7Ci0JCXB0ZSA9IHBoeXNfdG9fbWFjaGluZShYUEFERFIocHRlKSkubWFkZHI7Ci0JCXB0ZSAmPSB+KF9QQUdFX1BDRCB8IF9QQUdFX1BXVCk7Ci0JfQotCi0JcmV0dXJuIChwdGVfdCl7IHB0ZSB9OwotfQotCi1wZ2RfdCB4ZW5fbWFrZV9wZ2QodW5zaWduZWQgbG9uZyBwZ2QpCi17Ci0JaWYgKHBnZCAmIF9QQUdFX1BSRVNFTlQpCi0JCXBnZCA9IHBoeXNfdG9fbWFjaGluZShYUEFERFIocGdkKSkubWFkZHI7Ci0KLQlyZXR1cm4gKHBnZF90KXsgcGdkIH07Ci19CiAjZW5kaWYJLyogQ09ORklHX1g4Nl9QQUUgKi8KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9zZXR1cC5jIGIvYXJjaC94ODYveGVuL3NldHVwLmMKaW5kZXggMjM0MTQ5Mi4uODI1MTdlNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL3NldHVwLmMKKysrIGIvYXJjaC94ODYveGVuL3NldHVwLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KICNpbmNsdWRlIDxhc20veGVuL2h5cGVyY2FsbC5oPgogCisjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS9jYWxsYmFjay5oPgogI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvcGh5c2Rldi5oPgogI2luY2x1ZGUgPHhlbi9mZWF0dXJlcy5oPgogCkBAIC02OCw2ICs2OSwyNCBAQAogCSptYXNrIHw9IDEgPDwgVkRTT19OT1RFX05PTkVHU0VHX0JJVDsKIH0KIAordm9pZCB4ZW5fZW5hYmxlX3N5c2VudGVyKHZvaWQpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlleHRlcm4gdm9pZCB4ZW5fc3lzZW50ZXJfdGFyZ2V0KHZvaWQpOworCS8qIE1hc2sgZXZlbnRzIG9uIGVudHJ5LCBldmVuIHRob3VnaCB0aGV5IGdldCBlbmFibGVkIGltbWVkaWF0ZWx5ICovCisJc3RhdGljIHN0cnVjdCBjYWxsYmFja19yZWdpc3RlciBzeXNlbnRlciA9IHsKKwkJLnR5cGUgPSBDQUxMQkFDS1RZUEVfc3lzZW50ZXIsCisJCS5hZGRyZXNzID0geyBfX0tFUk5FTF9DUywgKHVuc2lnbmVkIGxvbmcpeGVuX3N5c2VudGVyX3RhcmdldCB9LAorCQkuZmxhZ3MgPSBDQUxMQkFDS0ZfbWFza19ldmVudHMsCisJfTsKKworCWlmICghYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1NFUCkgfHwKKwkgICAgSFlQRVJWSVNPUl9jYWxsYmFja19vcChDQUxMQkFDS09QX3JlZ2lzdGVyLCAmc3lzZW50ZXIpICE9IDApIHsKKwkJY2xlYXJfY3B1X2NhcCgmY3B1X2RhdGEoY3B1KSwgWDg2X0ZFQVRVUkVfU0VQKTsKKwkJY2xlYXJfY3B1X2NhcCgmYm9vdF9jcHVfZGF0YSwgWDg2X0ZFQVRVUkVfU0VQKTsKKwl9Cit9CisKIHZvaWQgX19pbml0IHhlbl9hcmNoX3NldHVwKHZvaWQpCiB7CiAJc3RydWN0IHBoeXNkZXZfc2V0X2lvcGwgc2V0X2lvcGw7CkBAIC04Miw2ICsxMDEsOCBAQAogCUhZUEVSVklTT1Jfc2V0X2NhbGxiYWNrcyhfX0tFUk5FTF9DUywgKHVuc2lnbmVkIGxvbmcpeGVuX2h5cGVydmlzb3JfY2FsbGJhY2ssCiAJCQkJIF9fS0VSTkVMX0NTLCAodW5zaWduZWQgbG9uZyl4ZW5fZmFpbHNhZmVfY2FsbGJhY2spOwogCisJeGVuX2VuYWJsZV9zeXNlbnRlcigpOworCiAJc2V0X2lvcGwuaW9wbCA9IDE7CiAJcmMgPSBIWVBFUlZJU09SX3BoeXNkZXZfb3AoUEhZU0RFVk9QX3NldF9pb3BsLCAmc2V0X2lvcGwpOwogCWlmIChyYyAhPSAwKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3NtcC5jIGIvYXJjaC94ODYveGVuL3NtcC5jCmluZGV4IGUzNDBmZjkuLjkyZGQzZGIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9zbXAuYworKysgYi9hcmNoL3g4Ni94ZW4vc21wLmMKQEAgLTM2LDggKzM2LDkgQEAKICNpbmNsdWRlICJtbXUuaCIKIAogc3RhdGljIGNwdW1hc2tfdCB4ZW5fY3B1X2luaXRpYWxpemVkX21hcDsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIHJlc2NoZWRfaXJxKTsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIGNhbGxmdW5jX2lycSk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCByZXNjaGVkX2lycSkgPSAtMTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIGNhbGxmdW5jX2lycSkgPSAtMTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIGRlYnVnX2lycSkgPSAtMTsKIAogLyoKICAqIFN0cnVjdHVyZSBhbmQgZGF0YSBmb3Igc21wX2NhbGxfZnVuY3Rpb24oKS4gVGhpcyBpcyBkZXNpZ25lZCB0byBtaW5pbWlzZQpAQCAtNzIsNiArNzMsNyBAQAogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAljcHVfaW5pdCgpOworCXhlbl9lbmFibGVfc3lzZW50ZXIoKTsKIAogCXByZWVtcHRfZGlzYWJsZSgpOwogCXBlcl9jcHUoY3B1X3N0YXRlLCBjcHUpID0gQ1BVX09OTElORTsKQEAgLTg4LDkgKzkwLDcgQEAKIHN0YXRpYyBpbnQgeGVuX3NtcF9pbnRyX2luaXQodW5zaWduZWQgaW50IGNwdSkKIHsKIAlpbnQgcmM7Ci0JY29uc3QgY2hhciAqcmVzY2hlZF9uYW1lLCAqY2FsbGZ1bmNfbmFtZTsKLQotCXBlcl9jcHUocmVzY2hlZF9pcnEsIGNwdSkgPSBwZXJfY3B1KGNhbGxmdW5jX2lycSwgY3B1KSA9IC0xOworCWNvbnN0IGNoYXIgKnJlc2NoZWRfbmFtZSwgKmNhbGxmdW5jX25hbWUsICpkZWJ1Z19uYW1lOwogCiAJcmVzY2hlZF9uYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICJyZXNjaGVkJWQiLCBjcHUpOwogCXJjID0gYmluZF9pcGlfdG9faXJxaGFuZGxlcihYRU5fUkVTQ0hFRFVMRV9WRUNUT1IsCkBAIC0xMTQsNiArMTE0LDE0IEBACiAJCWdvdG8gZmFpbDsKIAlwZXJfY3B1KGNhbGxmdW5jX2lycSwgY3B1KSA9IHJjOwogCisJZGVidWdfbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiZGVidWclZCIsIGNwdSk7CisJcmMgPSBiaW5kX3ZpcnFfdG9faXJxaGFuZGxlcihWSVJRX0RFQlVHLCBjcHUsIHhlbl9kZWJ1Z19pbnRlcnJ1cHQsCisJCQkJICAgICBJUlFGX0RJU0FCTEVEIHwgSVJRRl9QRVJDUFUgfCBJUlFGX05PQkFMQU5DSU5HLAorCQkJCSAgICAgZGVidWdfbmFtZSwgTlVMTCk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBmYWlsOworCXBlcl9jcHUoZGVidWdfaXJxLCBjcHUpID0gcmM7CisKIAlyZXR1cm4gMDsKIAogIGZhaWw6CkBAIC0xMjEsNiArMTI5LDggQEAKIAkJdW5iaW5kX2Zyb21faXJxaGFuZGxlcihwZXJfY3B1KHJlc2NoZWRfaXJxLCBjcHUpLCBOVUxMKTsKIAlpZiAocGVyX2NwdShjYWxsZnVuY19pcnEsIGNwdSkgPj0gMCkKIAkJdW5iaW5kX2Zyb21faXJxaGFuZGxlcihwZXJfY3B1KGNhbGxmdW5jX2lycSwgY3B1KSwgTlVMTCk7CisJaWYgKHBlcl9jcHUoZGVidWdfaXJxLCBjcHUpID49IDApCisJCXVuYmluZF9mcm9tX2lycWhhbmRsZXIocGVyX2NwdShkZWJ1Z19pcnEsIGNwdSksIE5VTEwpOwogCXJldHVybiByYzsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3hlbi1hc20uUyBiL2FyY2gveDg2L3hlbi94ZW4tYXNtLlMKaW5kZXggZmUxNjFlZC4uMjQ5N2EzMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL3hlbi1hc20uUworKysgYi9hcmNoL3g4Ni94ZW4veGVuLWFzbS5TCkBAIC0xMDgsNiArMTA4LDIwIEBACiAJUkVMT0MoeGVuX3Jlc3RvcmVfZmxfZGlyZWN0LCAyYisxKQogCiAvKgorCVdlIGNhbid0IHVzZSBzeXNleGl0IGRpcmVjdGx5LCBiZWNhdXNlIHdlJ3JlIG5vdCBydW5uaW5nIGluIHJpbmcwLgorCUJ1dCB3ZSBjYW4gZWFzaWx5IGZha2UgaXQgdXAgdXNpbmcgaXJldC4gIEFzc3VtaW5nIHhlbl9zeXNleGl0CisJaXMganVtcGVkIHRvIHdpdGggYSBzdGFuZGFyZCBzdGFjayBmcmFtZSwgd2UgY2FuIGp1c3Qgc3RyaXAgaXQKKwliYWNrIHRvIGEgc3RhbmRhcmQgaXJldCBmcmFtZSBhbmQgdXNlIGlyZXQuCisgKi8KK0VOVFJZKHhlbl9zeXNleGl0KQorCW1vdmwgUFRfRUFYKCVlc3ApLCAlZWF4CQkJLyogU2hvdWxkbid0IGJlIG5lY2Vzc2FyeT8gKi8KKwlvcmwgJFg4Nl9FRkxBR1NfSUYsIFBUX0VGTEFHUyglZXNwKQorCWxlYSBQVF9FSVAoJWVzcCksICVlc3AKKworCWptcCB4ZW5faXJldAorRU5EUFJPQyh4ZW5fc3lzZXhpdCkKKworLyoKIAlUaGlzIGlzIHJ1biB3aGVyZSBhIG5vcm1hbCBpcmV0IHdvdWxkIGJlIHJ1biwgd2l0aCB0aGUgc2FtZSBzdGFjayBzZXR1cDoKIAkgICAgICA4OiBlZmxhZ3MKIAkgICAgICA0OiBjcwpAQCAtMTg0LDggKzE5OCwxMiBAQAogCSAgIHJlZ2lvbiBpcyBPSy4gKi8KIAlqZSB4ZW5faHlwZXJ2aXNvcl9jYWxsYmFjawogCi0JaXJldAorMToJaXJldAogeGVuX2lyZXRfZW5kX2NyaXQ6Cisuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIgorCS5hbGlnbiA0CisJLmxvbmcgMWIsaXJldF9leGMKKy5wcmV2aW91cwogCiBoeXBlcl9pcmV0OgogCS8qIHB1dCB0aGlzIG91dCBvZiBsaW5lIHNpbmNlIGl0cyB2ZXJ5IHJhcmVseSB1c2VkICovCkBAIC0yMTksOSArMjM3LDcgQEAKIAkgZHMJCX0gIFNBVkVfQUxMIHN0YXRlCiAJIGVheAkJfQogCSAgOgkJOgotCSBlYngJCX0KLQktLS0tLS0tLS0tLS0tLS0tCi0JIHJldHVybiBhZGRyCSA8LSBlc3AKKwkgZWJ4CQl9PC0gZXNwCiAJLS0tLS0tLS0tLS0tLS0tLQogCiAgICBJbiBvcmRlciB0byBkZWxpdmVyIHRoZSBuZXN0ZWQgZXhjZXB0aW9uIHByb3Blcmx5LCB3ZSBuZWVkIHRvIHNoaWZ0CkBAIC0yMzYsMTAgKzI1Miw4IEBACiAgICBpdCdzIHVzZXJtb2RlIHN0YXRlIHdoaWNoIHdlIGV2ZW50dWFsbHkgbmVlZCB0byByZXN0b3JlLgogICovCiBFTlRSWSh4ZW5faXJldF9jcml0X2ZpeHVwKQotCS8qIG9mZnNldHMgKzQgZm9yIHJldHVybiBhZGRyZXNzICovCi0KIAkvKgotCSAgIFBhcmFub2lhOiBNYWtlIHN1cmUgd2UncmUgcmVhbGx5IGNvbWluZyBmcm9tIHVzZXJzcGFjZS4KKwkgICBQYXJhbm9pYTogTWFrZSBzdXJlIHdlJ3JlIHJlYWxseSBjb21pbmcgZnJvbSBrZXJuZWwgc3BhY2UuCiAJICAgT25lIGNvdWxkIGltYWdpbmUgYSBjYXNlIHdoZXJlIHVzZXJzcGFjZSBqdW1wcyBpbnRvIHRoZQogCSAgIGNyaXRpY2FsIHJhbmdlIGFkZHJlc3MsIGJ1dCBqdXN0IGJlZm9yZSB0aGUgQ1BVIGRlbGl2ZXJzIGEgR1AsCiAJICAgaXQgZGVjaWRlcyB0byBkZWxpdmVyIGFuIGludGVycnVwdCBpbnN0ZWFkLiAgVW5saWtlbHk/CkBAIC0yNDgsMzIgKzI2MiwzMiBAQAogCSAgIGp1bXAgaW5zdHJ1Y3Rpb24gaXRzZWxmLCBub3QgdGhlIGRlc3RpbmF0aW9uLCBidXQgc29tZSB2aXJ0dWFsCiAJICAgZW52aXJvbm1lbnRzIGdldCB0aGlzIHdyb25nLgogCSAqLwotCW1vdmwgUFRfQ1MrNCglZXNwKSwgJWVjeAorCW1vdmwgUFRfQ1MoJWVzcCksICVlY3gKIAlhbmRsICRTRUdNRU5UX1JQTF9NQVNLLCAlZWN4CiAJY21wbCAkVVNFUl9SUEwsICVlY3gKIAlqZSAyZgogCi0JbGVhIFBUX09SSUdfRUFYKzQoJWVzcCksICVlc2kKLQlsZWEgUFRfRUZMQUdTKzQoJWVzcCksICVlZGkKKwlsZWEgUFRfT1JJR19FQVgoJWVzcCksICVlc2kKKwlsZWEgUFRfRUZMQUdTKCVlc3ApLCAlZWRpCiAKIAkvKiBJZiBlaXAgaXMgYmVmb3JlIGlyZXRfcmVzdG9yZV9lbmQgdGhlbiBzdGFjawogCSAgIGhhc24ndCBiZWVuIHJlc3RvcmVkIHlldC4gKi8KIAljbXAgJGlyZXRfcmVzdG9yZV9lbmQsICVlYXgKIAlqYWUgMWYKIAotCW1vdmwgMCs0KCVlZGkpLCVlYXgJCS8qIGNvcHkgRUFYICovCi0JbW92bCAlZWF4LCBQVF9FQVgrNCglZXNwKQorCW1vdmwgMCs0KCVlZGkpLCVlYXgJCS8qIGNvcHkgRUFYIChqdXN0IGFib3ZlIHRvcCBvZiBmcmFtZSkgKi8KKwltb3ZsICVlYXgsIFBUX0VBWCglZXNwKQogCiAJbGVhIEVTUF9PRkZTRVQoJWVkaSksJWVkaQkvKiBtb3ZlIGRlc3QgdXAgb3ZlciBzYXZlZCByZWdzICovCiAKIAkvKiBzZXQgdXAgdGhlIGNvcHkgKi8KIDE6CXN0ZAotCW1vdiAkKFBUX0VJUCs0KSAvIDQsICVlY3gJLyogY29weSByZXQrc2F2ZWQgcmVncyB1cCB0byBvcmlnX2VheCAqLworCW1vdiAkUFRfRUlQIC8gNCwgJWVjeAkJLyogc2F2ZWQgcmVncyB1cCB0byBvcmlnX2VheCAqLwogCXJlcCBtb3ZzbAogCWNsZAogCiAJbGVhIDQoJWVkaSksJWVzcAkJLyogcG9pbnQgZXNwIHRvIG5ldyBmcmFtZSAqLwotMjoJcmV0CisyOglqbXAgeGVuX2RvX3VwY2FsbAogCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4veGVuLW9wcy5oIGIvYXJjaC94ODYveGVuL3hlbi1vcHMuaAppbmRleCA5NTZhNDkxLi5mMTA2M2FlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4veGVuLW9wcy5oCisrKyBiL2FyY2gveDg2L3hlbi94ZW4tb3BzLmgKQEAgLTIsNiArMiw4IEBACiAjZGVmaW5lIFhFTl9PUFNfSAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgorI2luY2x1ZGUgPHhlbi94ZW4tb3BzLmg+CiAKIC8qIFRoZXNlIGFyZSBjb2RlLCBidXQgbm90IGZ1bmN0aW9ucy4gIERlZmluZWQgaW4gZW50cnkuUyAqLwogZXh0ZXJuIGNvbnN0IGNoYXIgeGVuX2h5cGVydmlzb3JfY2FsbGJhY2tbXTsKQEAgLTksNyArMTEsNiBAQAogCiB2b2lkIHhlbl9jb3B5X3RyYXBfaW5mbyhzdHJ1Y3QgdHJhcF9pbmZvICp0cmFwcyk7CiAKLURFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgdmNwdV9pbmZvICosIHhlbl92Y3B1KTsKIERFQ0xBUkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCB4ZW5fY3IzKTsKIERFQ0xBUkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCB4ZW5fY3VycmVudF9jcjMpOwogCkBAIC0xOSw2ICsyMCw3IEBACiBjaGFyICogX19pbml0IHhlbl9tZW1vcnlfc2V0dXAodm9pZCk7CiB2b2lkIF9faW5pdCB4ZW5fYXJjaF9zZXR1cCh2b2lkKTsKIHZvaWQgX19pbml0IHhlbl9pbml0X0lSUSh2b2lkKTsKK3ZvaWQgeGVuX2VuYWJsZV9zeXNlbnRlcih2b2lkKTsKIAogdm9pZCB4ZW5fc2V0dXBfdGltZXIoaW50IGNwdSk7CiB2b2lkIHhlbl9zZXR1cF9jcHVfY2xvY2tldmVudHModm9pZCk7CkBAIC0yOCw2ICszMCw4IEBACiBpbnQgeGVuX3NldF93YWxsY2xvY2sodW5zaWduZWQgbG9uZyB0aW1lKTsKIHVuc2lnbmVkIGxvbmcgbG9uZyB4ZW5fc2NoZWRfY2xvY2sodm9pZCk7CiAKK2lycXJldHVybl90IHhlbl9kZWJ1Z19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKKwogYm9vbCB4ZW5fdmNwdV9zdG9sZW4oaW50IHZjcHUpOwogCiB2b2lkIHhlbl9tYXJrX2luaXRfbW1fcGlubmVkKHZvaWQpOwpAQCAtNjQsNCArNjgsNiBAQAogREVDTF9BU00odm9pZCwgeGVuX3Jlc3RvcmVfZmxfZGlyZWN0LCB1bnNpZ25lZCBsb25nKTsKIAogdm9pZCB4ZW5faXJldCh2b2lkKTsKK3ZvaWQgeGVuX3N5c2V4aXQodm9pZCk7CisKICNlbmRpZiAvKiBYRU5fT1BTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvS2NvbmZpZyBiL2RyaXZlcnMvS2NvbmZpZwppbmRleCAzYTBlMzU0Li44MGYwZWM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL0tjb25maWcKKysrIGIvZHJpdmVycy9LY29uZmlnCkBAIC05Nyw0ICs5Nyw2IEBACiBzb3VyY2UgImRyaXZlcnMvYXV4ZGlzcGxheS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvdWlvL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy94ZW4vS2NvbmZpZyIKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Zyb250LmMgYi9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtmcm9udC5jCmluZGV4IDljNmYzZjkuLmQ3NzFkYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Zyb250LmMKKysrIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYwpAQCAtNDcsNiArNDcsNyBAQAogCiAjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS9ncmFudF90YWJsZS5oPgogI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvaW8vYmxraWYuaD4KKyNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL2lvL3Byb3RvY29scy5oPgogCiAjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcnZpc29yLmg+CiAKQEAgLTc0LDcgKzc1LDYgQEAKIHN0cnVjdCBibGtmcm9udF9pbmZvCiB7CiAJc3RydWN0IHhlbmJ1c19kZXZpY2UgKnhiZGV2OwotCWRldl90IGRldjsKIAlzdHJ1Y3QgZ2VuZGlzayAqZ2Q7CiAJaW50IHZkZXZpY2U7CiAJYmxraWZfdmRldl90IGhhbmRsZTsKQEAgLTg4LDYgKzg4LDcgQEAKIAlzdHJ1Y3QgYmxrX3NoYWRvdyBzaGFkb3dbQkxLX1JJTkdfU0laRV07CiAJdW5zaWduZWQgbG9uZyBzaGFkb3dfZnJlZTsKIAlpbnQgZmVhdHVyZV9iYXJyaWVyOworCWludCBpc19yZWFkeTsKIAogCS8qKgogCSAqIFRoZSBudW1iZXIgb2YgcGVvcGxlIGhvbGRpbmcgdGhpcyBkZXZpY2Ugb3Blbi4gIFdlIHdvbid0IGFsbG93IGEKQEAgLTYxNCw2ICs2MTUsMTIgQEAKIAkJbWVzc2FnZSA9ICJ3cml0aW5nIGV2ZW50LWNoYW5uZWwiOwogCQlnb3RvIGFib3J0X3RyYW5zYWN0aW9uOwogCX0KKwllcnIgPSB4ZW5idXNfcHJpbnRmKHhidCwgZGV2LT5ub2RlbmFtZSwgInByb3RvY29sIiwgIiVzIiwKKwkJCSAgICBYRU5fSU9fUFJPVE9fQUJJX05BVElWRSk7CisJaWYgKGVycikgeworCQltZXNzYWdlID0gIndyaXRpbmcgcHJvdG9jb2wiOworCQlnb3RvIGFib3J0X3RyYW5zYWN0aW9uOworCX0KIAogCWVyciA9IHhlbmJ1c190cmFuc2FjdGlvbl9lbmQoeGJ0LCAwKTsKIAlpZiAoZXJyKSB7CkBAIC04MzMsNiArODQwLDggQEAKIAlzcGluX3VubG9ja19pcnEoJmJsa2lmX2lvX2xvY2spOwogCiAJYWRkX2Rpc2soaW5mby0+Z2QpOworCisJaW5mby0+aXNfcmVhZHkgPSAxOwogfQogCiAvKioKQEAgLTg5Niw3ICs5MDUsNyBAQAogCQlicmVhazsKIAogCWNhc2UgWGVuYnVzU3RhdGVDbG9zaW5nOgotCQliZCA9IGJkZ2V0KGluZm8tPmRldik7CisJCWJkID0gYmRnZXRfZGlzayhpbmZvLT5nZCwgMCk7CiAJCWlmIChiZCA9PSBOVUxMKQogCQkJeGVuYnVzX2Rldl9mYXRhbChkZXYsIC1FTk9ERVYsICJiZGdldCBmYWlsZWQiKTsKIApAQCAtOTI1LDYgKzkzNCwxMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGJsa2Zyb250X2lzX3JlYWR5KHN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJsa2Zyb250X2luZm8gKmluZm8gPSBkZXYtPmRldi5kcml2ZXJfZGF0YTsKKworCXJldHVybiBpbmZvLT5pc19yZWFkeTsKK30KKwogc3RhdGljIGludCBibGtpZl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlcCkKIHsKIAlzdHJ1Y3QgYmxrZnJvbnRfaW5mbyAqaW5mbyA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKQEAgLTk3MSw2ICs5ODcsNyBAQAogCS5yZW1vdmUgPSBibGtmcm9udF9yZW1vdmUsCiAJLnJlc3VtZSA9IGJsa2Zyb250X3Jlc3VtZSwKIAkub3RoZXJlbmRfY2hhbmdlZCA9IGJhY2tlbmRfY2hhbmdlZCwKKwkuaXNfcmVhZHkgPSBibGtmcm9udF9pc19yZWFkeSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHhsYmxrX2luaXQodm9pZCkKQEAgLTk5OCwzICsxMDE1LDUgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiWGVuIHZpcnR1YWwgYmxvY2sgZGV2aWNlIGZyb250ZW5kIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQUxJQVNfQkxPQ0tERVZfTUFKT1IoWEVOVkJEX01BSk9SKTsKK01PRFVMRV9BTElBUygieGVuOnZiZCIpOworTU9EVUxFX0FMSUFTKCJ4ZW5ibGsiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9rZXlib2FyZC5jIGIvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMKaW5kZXggOTc2OWJmOC4uNjBiOTM0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMKKysrIGIvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogCiBleHRlcm4gdm9pZCBjdHJsX2FsdF9kZWwodm9pZCk7CiAKQEAgLTkyOCw3ICs5MjksOCBAQAogCWlmICh1cF9mbGFnKSB7CiAJCWlmIChicmxfdGltZW91dCkgewogCQkJaWYgKCFjb21taXR0aW5nIHx8Ci0JCQkgICAgamlmZmllcyAtIHJlbGVhc2VzdGFydCA+IChicmxfdGltZW91dCAqIEhaKSAvIDEwMDApIHsKKwkJCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsCisJCQkJICAgICAgIHJlbGVhc2VzdGFydCArIG1zZWNzX3RvX2ppZmZpZXMoYnJsX3RpbWVvdXQpKSkgewogCQkJCWNvbW1pdHRpbmcgPSBwcmVzc2VkOwogCQkJCXJlbGVhc2VzdGFydCA9IGppZmZpZXM7CiAJCQl9CkBAIC0xMjM4LDYgKzEyNDAsNyBAQAogCX0KIAogCXBhcmFtLnNoaWZ0ID0gc2hpZnRfZmluYWwgPSAoc2hpZnRfc3RhdGUgfCBrYmQtPnNsb2Nrc3RhdGUpIF4ga2JkLT5sb2Nrc3RhdGU7CisJcGFyYW0ubGVkc3RhdGUgPSBrYmQtPmxlZGZsYWdzdGF0ZTsKIAlrZXlfbWFwID0ga2V5X21hcHNbc2hpZnRfZmluYWxdOwogCiAJaWYgKGF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZrZXlib2FyZF9ub3RpZmllcl9saXN0LCBLQkRfS0VZQ09ERSwgJnBhcmFtKSA9PSBOT1RJRllfU1RPUCB8fCAha2V5X21hcCkgewpAQCAtMTI4Niw2ICsxMjg5LDcgQEAKIAogCSgqa19oYW5kbGVyW3R5cGVdKSh2Yywga2V5c3ltICYgMHhmZiwgIWRvd24pOwogCisJcGFyYW0ubGVkc3RhdGUgPSBrYmQtPmxlZGZsYWdzdGF0ZTsKIAlhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbigma2V5Ym9hcmRfbm90aWZpZXJfbGlzdCwgS0JEX1BPU1RfS0VZU1lNLCAmcGFyYW0pOwogCiAJaWYgKHR5cGUgIT0gS1RfU0xPQ0spCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1xdWlya3MuYwppbmRleCAyOGRkYzNmLi5kM2Y4ZDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcXVpcmtzLmMKQEAgLTQwNSw2ICs0MDUsOSBAQAogI2RlZmluZSBVU0JfVkVORE9SX0lEX1lFQUxJTksJCTB4Njk5MwogI2RlZmluZSBVU0JfREVWSUNFX0lEX1lFQUxJTktfUDFLX1A0S19CMksJMHhiMDAxCiAKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9LWUUJCTB4MDQ1OAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0tZRV9HUEVOXzU2MAkweDUwMDMKKwogLyoKICAqIEFscGhhYmV0aWNhbGx5IHNvcnRlZCBibGFja2xpc3QgYnkgcXVpcmsgdHlwZS4KICAqLwpAQCAtNjk4LDYgKzcwMSw3IEBACiAJeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNjMsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV82NCwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9OQVRJT05BTF9TRU1JQ09ORFVDVE9SLCBVU0JfREVWSUNFX0lEX05fU19IQVJNT05ZLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0tZRSwgVVNCX0RFVklDRV9JRF9LWUVfR1BFTl81NjAsIEhJRF9RVUlSS19JR05PUkUgfSwKIAogCXsgMCwgMCB9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9kdjEzOTQuYyBiL2RyaXZlcnMvaWVlZTEzOTQvZHYxMzk0LmMKaW5kZXggNjIyOGZhZC4uOWQxOWFlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9kdjEzOTQuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L2R2MTM5NC5jCkBAIC0yMTY3LDYgKzIxNjcsNyBAQAogLyoKICAqIEV4cG9ydCBpbmZvcm1hdGlvbiBhYm91dCBwcm90b2NvbHMvZGV2aWNlcyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuCiAgKi8KKyNpZmRlZiBNT0RVTEUKIHN0YXRpYyBzdHJ1Y3QgaWVlZTEzOTRfZGV2aWNlX2lkIGR2MTM5NF9pZF90YWJsZVtdID0gewogCXsKIAkJLm1hdGNoX2ZsYWdzCT0gSUVFRTEzOTRfTUFUQ0hfU1BFQ0lGSUVSX0lEIHwgSUVFRTEzOTRfTUFUQ0hfVkVSU0lPTiwKQEAgLTIxNzcsNiArMjE3OCw3IEBACiB9OwogCiBNT0RVTEVfREVWSUNFX1RBQkxFKGllZWUxMzk0LCBkdjEzOTRfaWRfdGFibGUpOworI2VuZGlmIC8qIE1PRFVMRSAqLwogCiBzdGF0aWMgc3RydWN0IGhwc2JfcHJvdG9jb2xfZHJpdmVyIGR2MTM5NF9kcml2ZXIgPSB7CiAJLm5hbWUgPSAiZHYxMzk0IiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaXNvLmggYi9kcml2ZXJzL2llZWUxMzk0L2lzby5oCmluZGV4IGI5NGU1NWUuLmI1ZGU1ZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvaXNvLmgKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9pc28uaApAQCAtMTIzLDYgKzEyMyw4IEBACiAKIAkvKiBob3cgbWFueSB0aW1lcyB0aGUgYnVmZmVyIGhhcyBvdmVyZmxvd2VkIG9yIHVuZGVyZmxvd2VkICovCiAJYXRvbWljX3Qgb3ZlcmZsb3dzOworCS8qIGhvdyBtYW55IGN5Y2xlcyB3ZXJlIHNraXBwZWQgZm9yIGEgZ2l2ZW4gY29udGV4dCAqLworCWF0b21pY190IHNraXBzOwogCiAJLyogQ3VycmVudCBudW1iZXIgb2YgYnl0ZXMgbG9zdCBpbiBkaXNjYXJkZWQgcGFja2V0cyAqLwogCWludCBieXRlc19kaXNjYXJkZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L29oY2kxMzk0LmMgYi9kcml2ZXJzL2llZWUxMzk0L29oY2kxMzk0LmMKaW5kZXggMDY5MDQ2OS4uZTUwOWUxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9vaGNpMTM5NC5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvb2hjaTEzOTQuYwpAQCAtMTcyMyw2ICsxNzIzLDggQEAKIAlzdHJ1Y3QgZG1hX3Byb2dfcmVnaW9uIHByb2c7CiAJc3RydWN0IG9oY2kxMzk0X2lzb190YXNrbGV0IHRhc2s7CiAJaW50IHRhc2tfYWN0aXZlOworCWludCBsYXN0X2N5Y2xlOworCWF0b21pY190IHNraXBzOwogCiAJdTMyIENvbnRleHRDb250cm9sU2V0OwogCXUzMiBDb250ZXh0Q29udHJvbENsZWFyOwpAQCAtMTc1OSw2ICsxNzYxLDggQEAKIAlpc28tPmhvc3RkYXRhID0geG1pdDsKIAl4bWl0LT5vaGNpID0gaXNvLT5ob3N0LT5ob3N0ZGF0YTsKIAl4bWl0LT50YXNrX2FjdGl2ZSA9IDA7CisJeG1pdC0+bGFzdF9jeWNsZSA9IC0xOworCWF0b21pY19zZXQoJmlzby0+c2tpcHMsIDApOwogCiAJZG1hX3Byb2dfcmVnaW9uX2luaXQoJnhtaXQtPnByb2cpOwogCkBAIC0xODU2LDYgKzE4NjAsMjYgQEAKIAkJLyogcGFyc2UgY3ljbGUgKi8KIAkJY3ljbGUgPSBsZTMyX3RvX2NwdShjbWQtPm91dHB1dF9sYXN0LnN0YXR1cykgJiAweDFGRkY7CiAKKwkJaWYgKHhtaXQtPmxhc3RfY3ljbGUgPiAtMSkgeworCQkJaW50IGN5Y2xlX2RpZmYgPSBjeWNsZSAtIHhtaXQtPmxhc3RfY3ljbGU7CisJCQlpbnQgc2tpcDsKKworCQkJLyogdW53cmFwICovCisJCQlpZiAoY3ljbGVfZGlmZiA8IDApIHsKKwkJCQljeWNsZV9kaWZmICs9IDgwMDA7CisJCQkJaWYgKGN5Y2xlX2RpZmYgPCAwKQorCQkJCQlQUklOVChLRVJOX0VSUiwgImJvZ3VzIGN5Y2xlIGRpZmYgJWRcbiIsCisJCQkJCSAgICAgIGN5Y2xlX2RpZmYpOworCQkJfQorCisJCQlza2lwID0gY3ljbGVfZGlmZiAtIDE7CisJCQlpZiAoc2tpcCA+IDApIHsKKwkJCQlEQkdNU0coInNraXBwZWQgJWQgY3ljbGVzIHdpdGhvdXQgcGFja2V0IGxvc3MiLCBza2lwKTsKKwkJCQlhdG9taWNfYWRkKHNraXAsICZpc28tPnNraXBzKTsKKwkJCX0KKwkJfQorCQl4bWl0LT5sYXN0X2N5Y2xlID0gY3ljbGU7CisKIAkJLyogdGVsbCB0aGUgc3Vic3lzdGVtIHRoZSBwYWNrZXQgaGFzIGdvbmUgb3V0ICovCiAJCWhwc2JfaXNvX3BhY2tldF9zZW50KGlzbywgY3ljbGUsIGV2ZW50ICE9IDB4MTEpOwogCkBAIC0xOTQzLDYgKzE5NjcsMTYgQEAKIAlwcmV2LT5vdXRwdXRfbGFzdC5icmFuY2hBZGRyZXNzID0gY3B1X3RvX2xlMzIoCiAJCWRtYV9wcm9nX3JlZ2lvbl9vZmZzZXRfdG9fYnVzKCZ4bWl0LT5wcm9nLCBzaXplb2Yoc3RydWN0IGlzb194bWl0X2NtZCkgKiBuZXh0X2kpIHwgMyk7CiAKKwkvKgorCSAqIExpbmsgdGhlIHNraXAgYWRkcmVzcyB0byB0aGlzIGRlc2NyaXB0b3IgaXRzZWxmLiBUaGlzIGNhdXNlcyBhCisJICogY29udGV4dCB0byBza2lwIGEgY3ljbGUgd2hlbmV2ZXIgbG9zdCBjeWNsZXMgb3IgRklGTyBvdmVycnVucyBvY2N1ciwKKwkgKiB3aXRob3V0IGRyb3BwaW5nIHRoZSBkYXRhIGF0IHRoYXQgcG9pbnQgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCB0aGVuCisJICogZGVjaWRlIHdoZXRoZXIgdGhpcyBpcyBhbiBlcnJvciBjb25kaXRpb24gb3Igbm90LiBTb21lIHByb3RvY29scworCSAqIGNhbiBkZWFsIHdpdGggdGhpcyBieSBkcm9wcGluZyBzb21lIHJhdGUtbWF0Y2hpbmcgcGFkZGluZyBwYWNrZXRzLgorCSAqLworCW5leHQtPm91dHB1dF9tb3JlX2ltbWVkaWF0ZS5icmFuY2hBZGRyZXNzID0KKwkJCXByZXYtPm91dHB1dF9sYXN0LmJyYW5jaEFkZHJlc3M7CisKIAkvKiBkaXNhYmxlIGludGVycnVwdCwgdW5sZXNzIHJlcXVpcmVkIGJ5IHRoZSBJUlEgaW50ZXJ2YWwgKi8KIAlpZiAocHJldl9pICUgaXNvLT5pcnFfaW50ZXJ2YWwpIHsKIAkJcHJldi0+b3V0cHV0X2xhc3QuY29udHJvbCAmPSBjcHVfdG9fbGUzMih+KDMgPDwgMjApKTsgLyogbm8gaW50ZXJydXB0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L3JhdzEzOTQuYyBiL2RyaXZlcnMvaWVlZTEzOTQvcmF3MTM5NC5jCmluZGV4IDA0ZTk2YmEuLmVjMmEwYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvcmF3MTM5NC5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvcmF3MTM5NC5jCkBAIC0yMzU2LDEzICsyMzU2LDE2IEBACiBzdGF0aWMgdm9pZCByYXcxMzk0X2lzb19maWxsX3N0YXR1cyhzdHJ1Y3QgaHBzYl9pc28gKmlzbywKIAkJCQkgICAgc3RydWN0IHJhdzEzOTRfaXNvX3N0YXR1cyAqc3RhdCkKIHsKKwlpbnQgb3ZlcmZsb3dzID0gYXRvbWljX3JlYWQoJmlzby0+b3ZlcmZsb3dzKTsKKwlpbnQgc2tpcHMgPSBhdG9taWNfcmVhZCgmaXNvLT5za2lwcyk7CisKIAlzdGF0LT5jb25maWcuZGF0YV9idWZfc2l6ZSA9IGlzby0+YnVmX3NpemU7CiAJc3RhdC0+Y29uZmlnLmJ1Zl9wYWNrZXRzID0gaXNvLT5idWZfcGFja2V0czsKIAlzdGF0LT5jb25maWcuY2hhbm5lbCA9IGlzby0+Y2hhbm5lbDsKIAlzdGF0LT5jb25maWcuc3BlZWQgPSBpc28tPnNwZWVkOwogCXN0YXQtPmNvbmZpZy5pcnFfaW50ZXJ2YWwgPSBpc28tPmlycV9pbnRlcnZhbDsKIAlzdGF0LT5uX3BhY2tldHMgPSBocHNiX2lzb19uX3JlYWR5KGlzbyk7Ci0Jc3RhdC0+b3ZlcmZsb3dzID0gYXRvbWljX3JlYWQoJmlzby0+b3ZlcmZsb3dzKTsKKwlzdGF0LT5vdmVyZmxvd3MgPSAoKHNraXBzICYgMHhGRkZGKSA8PCAxNikgfCAoKG92ZXJmbG93cyAmIDB4RkZGRikpOwogCXN0YXQtPnhtaXRfY3ljbGUgPSBpc28tPnhtaXRfY3ljbGU7CiB9CiAKQEAgLTI0MzcsNiArMjQ0MCw4IEBACiAKIAkvKiByZXNldCBvdmVyZmxvdyBjb3VudGVyICovCiAJYXRvbWljX3NldCgmaXNvLT5vdmVyZmxvd3MsIDApOworCS8qIHJlc2V0IHNraXAgY291bnRlciAqLworCWF0b21pY19zZXQoJmlzby0+c2tpcHMsIDApOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yOTM1LDYgKzI5NDAsNyBAQAogLyoKICAqIEV4cG9ydCBpbmZvcm1hdGlvbiBhYm91dCBwcm90b2NvbHMvZGV2aWNlcyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuCiAgKi8KKyNpZmRlZiBNT0RVTEUKIHN0YXRpYyBzdHJ1Y3QgaWVlZTEzOTRfZGV2aWNlX2lkIHJhdzEzOTRfaWRfdGFibGVbXSA9IHsKIAl7CiAJIC5tYXRjaF9mbGFncyA9IElFRUUxMzk0X01BVENIX1NQRUNJRklFUl9JRCB8IElFRUUxMzk0X01BVENIX1ZFUlNJT04sCkBAIC0yOTU2LDYgKzI5NjIsNyBAQAogfTsKIAogTU9EVUxFX0RFVklDRV9UQUJMRShpZWVlMTM5NCwgcmF3MTM5NF9pZF90YWJsZSk7CisjZW5kaWYgLyogTU9EVUxFICovCiAKIHN0YXRpYyBzdHJ1Y3QgaHBzYl9wcm90b2NvbF9kcml2ZXIgcmF3MTM5NF9kcml2ZXIgPSB7CiAJLm5hbWUgPSAicmF3MTM5NCIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L3ZpZGVvMTM5NC5jIGIvZHJpdmVycy9pZWVlMTM5NC92aWRlbzEzOTQuYwppbmRleCBlMDMwMjRlLi5lMjQ3NzJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L3ZpZGVvMTM5NC5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvdmlkZW8xMzk0LmMKQEAgLTEyOTMsNiArMTI5Myw3IEBACiAvKgogICogRXhwb3J0IGluZm9ybWF0aW9uIGFib3V0IHByb3RvY29scy9kZXZpY2VzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4KICAqLworI2lmZGVmIE1PRFVMRQogc3RhdGljIHN0cnVjdCBpZWVlMTM5NF9kZXZpY2VfaWQgdmlkZW8xMzk0X2lkX3RhYmxlW10gPSB7CiAJewogCQkubWF0Y2hfZmxhZ3MJPSBJRUVFMTM5NF9NQVRDSF9TUEVDSUZJRVJfSUQgfCBJRUVFMTM5NF9NQVRDSF9WRVJTSU9OLApAQCAtMTMxMyw2ICsxMzE0LDcgQEAKIH07CiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaWVlZTEzOTQsIHZpZGVvMTM5NF9pZF90YWJsZSk7CisjZW5kaWYgLyogTU9EVUxFICovCiAKIHN0YXRpYyBzdHJ1Y3QgaHBzYl9wcm90b2NvbF9kcml2ZXIgdmlkZW8xMzk0X2RyaXZlciA9IHsKIAkubmFtZSA9IFZJREVPMTM5NF9EUklWRVJfTkFNRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQvS2NvbmZpZwppbmRleCA5ZGVhMTRkLi41ZjlkODYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC9LY29uZmlnCkBAIC0xNDksNiArMTQ5LDE1IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhcG0tcG93ZXIuCiAKK2NvbmZpZyBYRU5fS0JEREVWX0ZST05URU5ECisJdHJpc3RhdGUgIlhlbiB2aXJ0dWFsIGtleWJvYXJkIGFuZCBtb3VzZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gWEVOX0ZCREVWX0ZST05URU5ECisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBkcml2ZXIgaW1wbGVtZW50cyB0aGUgZnJvbnQtZW5kIG9mIHRoZSBYZW4gdmlydHVhbAorCSAga2V5Ym9hcmQgYW5kIG1vdXNlIGRldmljZSBkcml2ZXIuICBJdCBjb21tdW5pY2F0ZXMgd2l0aCBhIGJhY2stZW5kCisJICBpbiBhbm90aGVyIGRvbWFpbi4KKwogY29tbWVudCAiSW5wdXQgRGV2aWNlIERyaXZlcnMiCiAKIHNvdXJjZSAiZHJpdmVycy9pbnB1dC9rZXlib2FyZC9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9NYWtlZmlsZSBiL2RyaXZlcnMvaW5wdXQvTWFrZWZpbGUKaW5kZXggMmFlODdiMS4uOThjNGY5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lucHV0L01ha2VmaWxlCkBAIC0yMywzICsyMyw1IEBACiBvYmotJChDT05GSUdfSU5QVVRfTUlTQykJKz0gbWlzYy8KIAogb2JqLSQoQ09ORklHX0lOUFVUX0FQTVBPV0VSKQkrPSBhcG0tcG93ZXIubworCitvYmotJChDT05GSUdfWEVOX0tCRERFVl9GUk9OVEVORCkJKz0geGVuLWtiZGZyb250Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvaW5wdXQtcG9sbGRldi5jIGIvZHJpdmVycy9pbnB1dC9pbnB1dC1wb2xsZGV2LmMKaW5kZXggNDkwOTE4YS4uMGQzY2U3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9pbnB1dC1wb2xsZGV2LmMKKysrIGIvZHJpdmVycy9pbnB1dC9pbnB1dC1wb2xsZGV2LmMKQEAgLTczLDcgKzczLDcgQEAKIAogc3RhdGljIGludCBpbnB1dF9vcGVuX3BvbGxlZF9kZXZpY2Uoc3RydWN0IGlucHV0X2RldiAqaW5wdXQpCiB7Ci0Jc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKmRldiA9IGlucHV0LT5wcml2YXRlOworCXN0cnVjdCBpbnB1dF9wb2xsZWRfZGV2ICpkZXYgPSBpbnB1dF9nZXRfZHJ2ZGF0YShpbnB1dCk7CiAJaW50IGVycm9yOwogCiAJZXJyb3IgPSBpbnB1dF9wb2xsZGV2X3N0YXJ0X3dvcmtxdWV1ZSgpOwpAQCAtOTEsNyArOTEsNyBAQAogCiBzdGF0aWMgdm9pZCBpbnB1dF9jbG9zZV9wb2xsZWRfZGV2aWNlKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0KQogewotCXN0cnVjdCBpbnB1dF9wb2xsZWRfZGV2ICpkZXYgPSBpbnB1dC0+cHJpdmF0ZTsKKwlzdHJ1Y3QgaW5wdXRfcG9sbGVkX2RldiAqZGV2ID0gaW5wdXRfZ2V0X2RydmRhdGEoaW5wdXQpOwogCiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkZXYtPndvcmspOwogCWlucHV0X3BvbGxkZXZfc3RvcF93b3JrcXVldWUoKTsKQEAgLTE1MSwxMCArMTUxLDEwIEBACiB7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXQgPSBkZXYtPmlucHV0OwogCisJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXQsIGRldik7CiAJSU5JVF9ERUxBWUVEX1dPUksoJmRldi0+d29yaywgaW5wdXRfcG9sbGVkX2RldmljZV93b3JrKTsKIAlpZiAoIWRldi0+cG9sbF9pbnRlcnZhbCkKIAkJZGV2LT5wb2xsX2ludGVydmFsID0gNTAwOwotCWlucHV0LT5wcml2YXRlID0gZGV2OwogCWlucHV0LT5vcGVuID0gaW5wdXRfb3Blbl9wb2xsZWRfZGV2aWNlOwogCWlucHV0LT5jbG9zZSA9IGlucHV0X2Nsb3NlX3BvbGxlZF9kZXZpY2U7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svS2NvbmZpZwppbmRleCA3YzY2MmVlLi5iZTVjMTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9LY29uZmlnCkBAIC0xOTMsNiArMTkzLDE4IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB0d2lkam95LgogCitjb25maWcgSk9ZU1RJQ0tfWkhFTkhVQQorCXRyaXN0YXRlICI1LWJ5dGUgWmhlbmh1YSBSQyB0cmFuc21pdHRlciIKKwlzZWxlY3QgU0VSSU8KKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgWmhlbiBIdWEgUFBNLTRDSCB0cmFuc21pdHRlciB3aGljaCBpcworCSAgc3VwcGxpZWQgd2l0aCBhIHJlYWR5IHRvIGZseSBtaWNybyBlbGVjdHJpYyBpbmRvb3IgaGVsaWNvcHRlcnMKKwkgIHN1Y2ggYXMgRWFzeUNvcHRlciwgTGFtYSwgTWluaUNvcHRlciwgRHJhZ29uRmx5IG9yIEphYm8gYW5kIHdhbnQKKwkgIHRvIHVzZSBpdCB2aWEgc2VyaWFsIGNhYmxlIGFzIGEgam95c3RpY2suCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHpoZW5odWEuCisKIGNvbmZpZyBKT1lTVElDS19EQjkKIAl0cmlzdGF0ZSAiTXVsdGlzeXN0ZW0sIFNlZ2EgR2VuZXNpcywgU2F0dXJuIGpveXN0aWNrcyBhbmQgZ2FtZXBhZHMiCiAJZGVwZW5kcyBvbiBQQVJQT1JUCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9NYWtlZmlsZQppbmRleCBlODU1YWJiLi5mZGJmOGM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svTWFrZWZpbGUKQEAgLTE1LDYgKzE1LDcgQEAKIG9iai0kKENPTkZJR19KT1lTVElDS19HUklQKQkJKz0gZ3JpcC5vCiBvYmotJChDT05GSUdfSk9ZU1RJQ0tfR1JJUF9NUCkJCSs9IGdyaXBfbXAubwogb2JqLSQoQ09ORklHX0pPWVNUSUNLX0dVSUxMRU1PVCkJKz0gZ3VpbGxlbW90Lm8KK29iai0kKENPTkZJR19KT1lTVElDS19JRk9SQ0UpCQkrPSBpZm9yY2UvCiBvYmotJChDT05GSUdfSk9ZU1RJQ0tfSU5URVJBQ1QpCQkrPSBpbnRlcmFjdC5vCiBvYmotJChDT05GSUdfSk9ZU1RJQ0tfSk9ZRFVNUCkJCSs9IGpveWR1bXAubwogb2JqLSQoQ09ORklHX0pPWVNUSUNLX01BR0VMTEFOKQkJKz0gbWFnZWxsYW4ubwpAQCAtMjcsNSArMjgsNSBAQAogb2JqLSQoQ09ORklHX0pPWVNUSUNLX1RXSURKT1kpCQkrPSB0d2lkam95Lm8KIG9iai0kKENPTkZJR19KT1lTVElDS19XQVJSSU9SKQkJKz0gd2Fycmlvci5vCiBvYmotJChDT05GSUdfSk9ZU1RJQ0tfWFBBRCkJCSs9IHhwYWQubworb2JqLSQoQ09ORklHX0pPWVNUSUNLX1pIRU5IVUEpCQkrPSB6aGVuaHVhLm8KIAotb2JqLSQoQ09ORklHX0pPWVNUSUNLX0lGT1JDRSkJCSs9IGlmb3JjZS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2sveHBhZC5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay94cGFkLmMKaW5kZXggMDM4MDU5Ny4uNGIwN2JkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay94cGFkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay94cGFkLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogWC1Cb3ggZ2FtZXBhZCAtIHYwLjAuNgorICogWC1Cb3ggZ2FtZXBhZCBkcml2ZXIKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDIgTWFya28gRnJpZWRlbWFubiA8bWZyQGJteC1jaGVtbml0ei5kZT4KICAqICAgICAgICAgICAgICAgMjAwNCBPbGl2ZXIgU2Nod2FydHogPE9saXZlci5TY2h3YXJ0ekBnbXguZGU+LApAQCAtNjgsNiArNjgsOCBAQAogICogIC0gZGFuY2UgcGFkcyB3aWxsIG1hcCBELVBBRCB0byBidXR0b25zLCBub3QgYXhlcwogICogIC0gcGFzcyB0aGUgbW9kdWxlIHBhcmFtYXRlciAnZHBhZF90b19idXR0b25zJyB0byBmb3JjZQogICogICAgdGhlIEQtUEFEIHRvIG1hcCB0byBidXR0b25zIGlmIHlvdXIgcGFkIGlzIG5vdCBkZXRlY3RlZAorICoKKyAqIExhdGVyIGNoYW5nZXMgY2FuIGJlIHRyYWNrZWQgaW4gU0NNLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTc3LDcgKzc5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvaW5wdXQuaD4KIAotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjAuMC42IgogI2RlZmluZSBEUklWRVJfQVVUSE9SICJNYXJrbyBGcmllZGVtYW5uIDxtZnJAYm14LWNoZW1uaXR6LmRlPiIKICNkZWZpbmUgRFJJVkVSX0RFU0MgIlgtQm94IHBhZCBkcml2ZXIiCiAKQEAgLTg3LDEwICs4OCwxMiBAQAogICAgYnV0IHdlIG1hcCB0aGVtIHRvIGF4ZXMgd2hlbiBwb3NzaWJsZSB0byBzaW1wbGlmeSB0aGluZ3MgKi8KICNkZWZpbmUgTUFQX0RQQURfVE9fQlVUVE9OUyAgICAwCiAjZGVmaW5lIE1BUF9EUEFEX1RPX0FYRVMgICAgICAgMQotI2RlZmluZSBNQVBfRFBBRF9VTktOT1dOICAgICAgIC0xCisjZGVmaW5lIE1BUF9EUEFEX1VOS05PV04gICAgICAgMgogCiAjZGVmaW5lIFhUWVBFX1hCT1ggICAgICAgIDAKICNkZWZpbmUgWFRZUEVfWEJPWDM2MCAgICAgMQorI2RlZmluZSBYVFlQRV9YQk9YMzYwVyAgICAyCisjZGVmaW5lIFhUWVBFX1VOS05PV04gICAgIDMKIAogc3RhdGljIGludCBkcGFkX3RvX2J1dHRvbnM7CiBtb2R1bGVfcGFyYW0oZHBhZF90b19idXR0b25zLCBib29sLCBTX0lSVUdPKTsKQEAgLTEwNyw4ICsxMTAsMTAgQEAKIAl7IDB4MDQ1ZSwgMHgwMjg5LCAiTWljcm9zb2Z0IFgtQm94IHBhZCB2MiAoVVMpIiwgTUFQX0RQQURfVE9fQVhFUywgWFRZUEVfWEJPWCB9LAogCXsgMHgwNDVlLCAweDAyODUsICJNaWNyb3NvZnQgWC1Cb3ggcGFkIChKYXBhbikiLCBNQVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YIH0sCiAJeyAweDA0NWUsIDB4MDI4NywgIk1pY3Jvc29mdCBYYm94IENvbnRyb2xsZXIgUyIsIE1BUF9EUEFEX1RPX0FYRVMsIFhUWVBFX1hCT1ggfSwKKwl7IDB4MDQ1ZSwgMHgwNzE5LCAiWGJveCAzNjAgV2lyZWxlc3MgUmVjZWl2ZXIiLCBNQVBfRFBBRF9UT19CVVRUT05TLCBYVFlQRV9YQk9YMzYwVyB9LAogCXsgMHgwYzEyLCAweDg4MDksICJSZWRPY3RhbmUgWGJveCBEYW5jZSBQYWQiLCBNQVBfRFBBRF9UT19CVVRUT05TLCBYVFlQRV9YQk9YIH0sCiAJeyAweDA0NGYsIDB4MGYwNywgIlRocnVzdG1hc3RlciwgSW5jLiBDb250cm9sbGVyIiwgTUFQX0RQQURfVE9fQVhFUywgWFRZUEVfWEJPWCB9LAorCXsgMHgwNDZkLCAweGMyNDIsICJMb2dpdGVjaCBDaGlsbHN0cmVhbSBDb250cm9sbGVyIiwgTUFQX0RQQURfVE9fQVhFUywgWFRZUEVfWEJPWDM2MCB9LAogCXsgMHgwNDZkLCAweGNhODQsICJMb2dpdGVjaCBYYm94IENvcmRsZXNzIENvbnRyb2xsZXIiLCBNQVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YIH0sCiAJeyAweDA0NmQsIDB4Y2E4OCwgIkxvZ2l0ZWNoIENvbXBhY3QgQ29udHJvbGxlciBmb3IgWGJveCIsIE1BUF9EUEFEX1RPX0FYRVMsIFhUWVBFX1hCT1ggfSwKIAl7IDB4MDVmZCwgMHgxMDA3LCAiTWFkIENhdHogQ29udHJvbGxlciAodW52ZXJpZmllZCkiLCBNQVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YIH0sCkBAIC0xMzUsMTggKzE0MCwyNiBAQAogCXsgMHgwZjMwLCAweDg4ODgsICJCaWdCZW4gWEJNaW5pUGFkIENvbnRyb2xsZXIiLCBNQVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YIH0sCiAJeyAweDEwMmMsIDB4ZmYwYywgIkpveXRlY2ggV2lyZWxlc3MgQWR2YW5jZWQgQ29udHJvbGxlciIsIE1BUF9EUEFEX1RPX0FYRVMsIFhUWVBFX1hCT1ggfSwKIAl7IDB4MTJhYiwgMHg4ODA5LCAiWGJveCBERFIgZGFuY2VwYWQiLCBNQVBfRFBBRF9UT19CVVRUT05TLCBYVFlQRV9YQk9YIH0sCisJeyAweDE0MzAsIDB4NDc0OCwgIlJlZE9jdGFuZSBHdWl0YXIgSGVybyBYLXBsb3JlciIsIE1BUF9EUEFEX1RPX0FYRVMsIFhUWVBFX1hCT1gzNjAgfSwKIAl7IDB4MTQzMCwgMHg4ODg4LCAiVFg2NTAwKyBEYW5jZSBQYWQgKGZpcnN0IGdlbmVyYXRpb24pIiwgTUFQX0RQQURfVE9fQlVUVE9OUywgWFRZUEVfWEJPWCB9LAogCXsgMHgwNDVlLCAweDAyOGUsICJNaWNyb3NvZnQgWC1Cb3ggMzYwIHBhZCIsIE1BUF9EUEFEX1RPX0FYRVMsIFhUWVBFX1hCT1gzNjAgfSwKIAl7IDB4ZmZmZiwgMHhmZmZmLCAiQ2hpbmVzZS1tYWRlIFhib3ggQ29udHJvbGxlciIsIE1BUF9EUEFEX1RPX0FYRVMsIFhUWVBFX1hCT1ggfSwKLQl7IDB4MDAwMCwgMHgwMDAwLCAiR2VuZXJpYyBYLUJveCBwYWQiLCBNQVBfRFBBRF9VTktOT1dOLCBYVFlQRV9YQk9YIH0KKwl7IDB4MDAwMCwgMHgwMDAwLCAiR2VuZXJpYyBYLUJveCBwYWQiLCBNQVBfRFBBRF9VTktOT1dOLCBYVFlQRV9VTktOT1dOIH0KIH07CiAKLXN0YXRpYyBjb25zdCBzaWduZWQgc2hvcnQgeHBhZF9idG5bXSA9IHsKLQlCVE5fQSwgQlROX0IsIEJUTl9DLCBCVE5fWCwgQlROX1ksIEJUTl9aLAkvKiAiYW5hbG9nIiBidXR0b25zICovCisvKiBidXR0b25zIHNoYXJlZCB3aXRoIHhib3ggYW5kIHhib3gzNjAgKi8KK3N0YXRpYyBjb25zdCBzaWduZWQgc2hvcnQgeHBhZF9jb21tb25fYnRuW10gPSB7CisJQlROX0EsIEJUTl9CLCBCVE5fWCwgQlROX1ksCQkJLyogImFuYWxvZyIgYnV0dG9ucyAqLwogCUJUTl9TVEFSVCwgQlROX0JBQ0ssIEJUTl9USFVNQkwsIEJUTl9USFVNQlIsCS8qIHN0YXJ0L2JhY2svc3RpY2tzICovCiAJLTEJCQkJCQkvKiB0ZXJtaW5hdGluZyBlbnRyeSAqLwogfTsKIAorLyogb3JpZ2luYWwgeGJveCBjb250cm9sbGVycyBvbmx5ICovCitzdGF0aWMgY29uc3Qgc2lnbmVkIHNob3J0IHhwYWRfYnRuW10gPSB7CisJQlROX0MsIEJUTl9aLAkJLyogImFuYWxvZyIgYnV0dG9ucyAqLworCS0xCQkJLyogdGVybWluYXRpbmcgZW50cnkgKi8KK307CisKIC8qIG9ubHkgdXNlZCBpZiBNQVBfRFBBRF9UT19CVVRUT05TICovCiBzdGF0aWMgY29uc3Qgc2lnbmVkIHNob3J0IHhwYWRfYnRuX3BhZFtdID0gewogCUJUTl9MRUZULCBCVE5fUklHSFQsCQkvKiBkLXBhZCBsZWZ0LCByaWdodCAqLwpAQCAtMTczLDEyICsxODYsMjcgQEAKIAktMQkJCS8qIHRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogCi0vKiBYYm94IDM2MCBoYXMgYSB2ZW5kb3Itc3BlY2lmaWMgKHN1YiljbGFzcywgc28gd2UgY2Fubm90IG1hdGNoIGl0IHdpdGggb25seQotICogVVNCX0lOVEVSRkFDRV9JTkZPLCBtb3JlIHRvIHRoYXQgdGhpcyBkZXZpY2UgaGFzIDQgSW50ZXJmYWNlUHJvdG9jb2xzLAotICogYnV0IHdlIG5lZWQgb25seSBvbmUgb2YgdGhlbS4gKi8KKy8qIFhib3ggMzYwIGhhcyBhIHZlbmRvci1zcGVjaWZpYyBjbGFzcywgc28gd2UgY2Fubm90IG1hdGNoIGl0IHdpdGggb25seQorICogVVNCX0lOVEVSRkFDRV9JTkZPIChhbHNvIHNwZWNpZmljYWxseSByZWZ1c2VkIGJ5IFVTQiBzdWJzeXN0ZW0pLCBzbyB3ZQorICogbWF0Y2ggYWdhaW5zdCB2ZW5kb3IgaWQgYXMgd2VsbC4gV2lyZWQgWGJveCAzNjAgZGV2aWNlcyBoYXZlIHByb3RvY29sIDEsCisgKiB3aXJlbGVzcyBjb250cm9sbGVycyBoYXZlIHByb3RvY29sIDEyOS4gKi8KKyNkZWZpbmUgWFBBRF9YQk9YMzYwX1ZFTkRPUl9QUk9UT0NPTCh2ZW5kLHByKSBcCisJLm1hdGNoX2ZsYWdzID0gVVNCX0RFVklDRV9JRF9NQVRDSF9WRU5ET1IgfCBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPLCBcCisJLmlkVmVuZG9yID0gKHZlbmQpLCBcCisJLmJJbnRlcmZhY2VDbGFzcyA9IFVTQl9DTEFTU19WRU5ET1JfU1BFQywgXAorCS5iSW50ZXJmYWNlU3ViQ2xhc3MgPSA5MywgXAorCS5iSW50ZXJmYWNlUHJvdG9jb2wgPSAocHIpCisjZGVmaW5lIFhQQURfWEJPWDM2MF9WRU5ET1IodmVuZCkgXAorCXsgWFBBRF9YQk9YMzYwX1ZFTkRPUl9QUk9UT0NPTCh2ZW5kLDEpIH0sIFwKKwl7IFhQQURfWEJPWDM2MF9WRU5ET1JfUFJPVE9DT0wodmVuZCwxMjkpIH0KKwogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHhwYWRfdGFibGUgW10gPSB7CiAJeyBVU0JfSU5URVJGQUNFX0lORk8oJ1gnLCAnQicsIDApIH0sCS8qIFgtQm94IFVTQi1JRiBub3QgYXBwcm92ZWQgY2xhc3MgKi8KLQl7IFVTQl9ERVZJQ0VfSU5URVJGQUNFX1BST1RPQ09MKDB4MDQ1ZSwgMHgwMjhlLCAxKSB9LAkvKiBYLUJveCAzNjAgY29udHJvbGxlciAqLworCVhQQURfWEJPWDM2MF9WRU5ET1IoMHgwNDVlKSwJCS8qIE1pY3Jvc29mdCBYLUJveCAzNjAgY29udHJvbGxlcnMgKi8KKwlYUEFEX1hCT1gzNjBfVkVORE9SKDB4MDQ2ZCksCQkvKiBMb2dpdGVjaCBYLUJveCAzNjAgc3R5bGUgY29udHJvbGxlcnMgKi8KKwlYUEFEX1hCT1gzNjBfVkVORE9SKDB4MDczOCksCQkvKiBNYWQgQ2F0eiBYLUJveCAzNjAgY29udHJvbGxlcnMgKi8KKwlYUEFEX1hCT1gzNjBfVkVORE9SKDB4MGU2ZiksCQkvKiAweDBlNmYgWC1Cb3ggMzYwIGNvbnRyb2xsZXJzICovCisJWFBBRF9YQk9YMzYwX1ZFTkRPUigweDE0MzApLAkJLyogUmVkT2N0YW5lIFgtQm94IDM2MCBjb250cm9sbGVycyAqLwogCXsgfQogfTsKIApAQCAtMTg4LDEwICsyMTYsMTUgQEAKIAlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXY7CQkvKiBpbnB1dCBkZXZpY2UgaW50ZXJmYWNlICovCiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CS8qIHVzYiBkZXZpY2UgKi8KIAorCWludCBwYWRfcHJlc2VudDsKKwogCXN0cnVjdCB1cmIgKmlycV9pbjsJCS8qIHVyYiBmb3IgaW50ZXJydXB0IGluIHJlcG9ydCAqLwogCXVuc2lnbmVkIGNoYXIgKmlkYXRhOwkJLyogaW5wdXQgZGF0YSAqLwogCWRtYV9hZGRyX3QgaWRhdGFfZG1hOwogCisJc3RydWN0IHVyYiAqYnVsa19vdXQ7CisJdW5zaWduZWQgY2hhciAqYmRhdGE7CisKICNpZiBkZWZpbmVkKENPTkZJR19KT1lTVElDS19YUEFEX0ZGKSB8fCBkZWZpbmVkKENPTkZJR19KT1lTVElDS19YUEFEX0xFRFMpCiAJc3RydWN0IHVyYiAqaXJxX291dDsJCS8qIHVyYiBmb3IgaW50ZXJydXB0IG91dCByZXBvcnQgKi8KIAl1bnNpZ25lZCBjaGFyICpvZGF0YTsJCS8qIG91dHB1dCBkYXRhICovCkBAIC0yMjcsMTMgKzI2MCwxMyBAQAogCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwKIAkJCSAoX19zMTYpIGxlMTZfdG9fY3B1cCgoX19sZTE2ICopKGRhdGEgKyAxMikpKTsKIAlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksCi0JCQkgKF9fczE2KSBsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKShkYXRhICsgMTQpKSk7CisJCQkgfihfX3MxNikgbGUxNl90b19jcHVwKChfX2xlMTYgKikoZGF0YSArIDE0KSkpOwogCiAJLyogcmlnaHQgc3RpY2sgKi8KIAlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1JYLAogCQkJIChfX3MxNikgbGUxNl90b19jcHVwKChfX2xlMTYgKikoZGF0YSArIDE2KSkpOwogCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfUlksCi0JCQkgKF9fczE2KSBsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKShkYXRhICsgMTgpKSk7CisJCQkgfihfX3MxNikgbGUxNl90b19jcHVwKChfX2xlMTYgKikoZGF0YSArIDE4KSkpOwogCiAJLyogdHJpZ2dlcnMgbGVmdC9yaWdodCAqLwogCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWiwgZGF0YVsxMF0pOwpAQCAtMzIxLDEzICszNTQsMTMgQEAKIAlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1gsCiAJCQkgKF9fczE2KSBsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKShkYXRhICsgNikpKTsKIAlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksCi0JCQkgKF9fczE2KSBsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKShkYXRhICsgOCkpKTsKKwkJCSB+KF9fczE2KSBsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKShkYXRhICsgOCkpKTsKIAogCS8qIHJpZ2h0IHN0aWNrICovCiAJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19SWCwKIAkJCSAoX19zMTYpIGxlMTZfdG9fY3B1cCgoX19sZTE2ICopKGRhdGEgKyAxMCkpKTsKIAlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1JZLAotCQkJIChfX3MxNikgbGUxNl90b19jcHVwKChfX2xlMTYgKikoZGF0YSArIDEyKSkpOworCQkJIH4oX19zMTYpIGxlMTZfdG9fY3B1cCgoX19sZTE2ICopKGRhdGEgKyAxMikpKTsKIAogCS8qIHRyaWdnZXJzIGxlZnQvcmlnaHQgKi8KIAlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1osIGRhdGFbNF0pOwpAQCAtMzM2LDEyICszNjksNDcgQEAKIAlpbnB1dF9zeW5jKGRldik7CiB9CiAKKy8qCisgKiB4cGFkMzYwd19wcm9jZXNzX3BhY2tldAorICoKKyAqIENvbXBsZXRlcyBhIHJlcXVlc3QgYnkgY29udmVydGluZyB0aGUgZGF0YSBpbnRvIGV2ZW50cyBmb3IgdGhlCisgKiBpbnB1dCBzdWJzeXN0ZW0uIEl0IGlzIHZlcnNpb24gZm9yIHhib3ggMzYwIHdpcmVsZXNzIGNvbnRyb2xsZXIuCisgKgorICogQnl0ZS5CaXQKKyAqIDAwLjEgLSBTdGF0dXMgY2hhbmdlOiBUaGUgY29udHJvbGxlciBvciBoZWFkc2V0IGhhcyBjb25uZWN0ZWQvZGlzY29ubmVjdGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgQml0cyAwMS43IGFuZCAwMS42IGFyZSB2YWxpZAorICogMDEuNyAtIENvbnRyb2xsZXIgcHJlc2VudAorICogMDEuNiAtIEhlYWRzZXQgcHJlc2VudAorICogMDEuMSAtIFBhZCBzdGF0ZSAoQnl0ZXMgNCspIHZhbGlkCisgKgorICovCisKK3N0YXRpYyB2b2lkIHhwYWQzNjB3X3Byb2Nlc3NfcGFja2V0KHN0cnVjdCB1c2JfeHBhZCAqeHBhZCwgdTE2IGNtZCwgdW5zaWduZWQgY2hhciAqZGF0YSkKK3sKKwkvKiBQcmVzZW5jZSBjaGFuZ2UgKi8KKwlpZiAoZGF0YVswXSAmIDB4MDgpIHsKKwkJaWYgKGRhdGFbMV0gJiAweDgwKSB7CisJCQl4cGFkLT5wYWRfcHJlc2VudCA9IDE7CisJCQl1c2Jfc3VibWl0X3VyYih4cGFkLT5idWxrX291dCwgR0ZQX0FUT01JQyk7CisJCX0gZWxzZQorCQkJeHBhZC0+cGFkX3ByZXNlbnQgPSAwOworCX0KKworCS8qIFZhbGlkIHBhZCBkYXRhICovCisJaWYgKCEoZGF0YVsxXSAmIDB4MSkpCisJCXJldHVybjsKKworCXhwYWQzNjBfcHJvY2Vzc19wYWNrZXQoeHBhZCwgY21kLCAmZGF0YVs0XSk7Cit9CisKIHN0YXRpYyB2b2lkIHhwYWRfaXJxX2luKHN0cnVjdCB1cmIgKnVyYikKIHsKIAlzdHJ1Y3QgdXNiX3hwYWQgKnhwYWQgPSB1cmItPmNvbnRleHQ7Ci0JaW50IHJldHZhbDsKKwlpbnQgcmV0dmFsLCBzdGF0dXM7CiAKLQlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJc3RhdHVzID0gdXJiLT5zdGF0dXM7CisKKwlzd2l0Y2ggKHN0YXR1cykgewogCWNhc2UgMDoKIAkJLyogc3VjY2VzcyAqLwogCQlicmVhazsKQEAgLTM1MCwxOCArNDE4LDI0IEBACiAJY2FzZSAtRVNIVVRET1dOOgogCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLwogCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwKLQkJCV9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOworCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkJX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKLQlpZiAoeHBhZC0+eHR5cGUgPT0gWFRZUEVfWEJPWDM2MCkKKwlzd2l0Y2ggKHhwYWQtPnh0eXBlKSB7CisJY2FzZSBYVFlQRV9YQk9YMzYwOgogCQl4cGFkMzYwX3Byb2Nlc3NfcGFja2V0KHhwYWQsIDAsIHhwYWQtPmlkYXRhKTsKLQllbHNlCisJCWJyZWFrOworCWNhc2UgWFRZUEVfWEJPWDM2MFc6CisJCXhwYWQzNjB3X3Byb2Nlc3NfcGFja2V0KHhwYWQsIDAsIHhwYWQtPmlkYXRhKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJeHBhZF9wcm9jZXNzX3BhY2tldCh4cGFkLCAwLCB4cGFkLT5pZGF0YSk7CisJfQogCiBleGl0OgogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9BVE9NSUMpOwpAQCAtMzczLDkgKzQ0NywxMSBAQAogI2lmIGRlZmluZWQoQ09ORklHX0pPWVNUSUNLX1hQQURfRkYpIHx8IGRlZmluZWQoQ09ORklHX0pPWVNUSUNLX1hQQURfTEVEUykKIHN0YXRpYyB2b2lkIHhwYWRfaXJxX291dChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0JaW50IHJldHZhbDsKKwlpbnQgcmV0dmFsLCBzdGF0dXM7CiAKLQlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJc3RhdHVzID0gdXJiLT5zdGF0dXM7CisKKwlzd2l0Y2ggKHN0YXR1cykgewogCQljYXNlIDA6CiAJCS8qIHN1Y2Nlc3MgKi8KIAkJYnJlYWs7CkBAIC0zODQsMTEgKzQ2MCwxMSBAQAogCQljYXNlIC1FU0hVVERPV046CiAJCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLwogCQkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsCi0JCQkJX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOwogCQkJcmV0dXJuOwogCQlkZWZhdWx0OgogCQkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkJCV9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOworCQkJCV9fRlVOQ1RJT05fXywgc3RhdHVzKTsKIAkJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTM5OSw2ICs0NzUsMjMgQEAKIAkJICAgIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKIH0KIAorc3RhdGljIHZvaWQgeHBhZF9idWxrX291dChzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCWNhc2UgMDoKKwkJLyogc3VjY2VzcyAqLworCQlicmVhazsKKwljYXNlIC1FQ09OTlJFU0VUOgorCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CisJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCisJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgeHBhZF9pbml0X291dHB1dChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Ziwgc3RydWN0IHVzYl94cGFkICp4cGFkKQogewogCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfaXJxX291dDsKQEAgLTQwOCw3ICs1MDEsNyBAQAogCQlyZXR1cm4gMDsKIAogCXhwYWQtPm9kYXRhID0gdXNiX2J1ZmZlcl9hbGxvYyh4cGFkLT51ZGV2LCBYUEFEX1BLVF9MRU4sCi0JCQkJICAgICAgIEdGUF9BVE9NSUMsICZ4cGFkLT5vZGF0YV9kbWEgKTsKKwkJCQkgICAgICAgR0ZQX0tFUk5FTCwgJnhwYWQtPm9kYXRhX2RtYSk7CiAJaWYgKCF4cGFkLT5vZGF0YSkKIAkJZ290byBmYWlsMTsKIApAQCAtNDY5LDYgKzU2Miw3IEBACiAJCXhwYWQtPm9kYXRhWzVdID0gMHgwMDsKIAkJeHBhZC0+b2RhdGFbNl0gPSAweDAwOwogCQl4cGFkLT5vZGF0YVs3XSA9IDB4MDA7CisJCXhwYWQtPmlycV9vdXQtPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSA4OwogCQl1c2Jfc3VibWl0X3VyYih4cGFkLT5pcnFfb3V0LCBHRlBfS0VSTkVMKTsKIAl9CiAKQEAgLTQ3Nyw2ICs1NzEsOSBAQAogCiBzdGF0aWMgaW50IHhwYWRfaW5pdF9mZihzdHJ1Y3QgdXNiX3hwYWQgKnhwYWQpCiB7CisJaWYgKHhwYWQtPnh0eXBlICE9IFhUWVBFX1hCT1gzNjApCisJCXJldHVybiAwOworCiAJaW5wdXRfc2V0X2NhcGFiaWxpdHkoeHBhZC0+ZGV2LCBFVl9GRiwgRkZfUlVNQkxFKTsKIAogCXJldHVybiBpbnB1dF9mZl9jcmVhdGVfbWVtbGVzcyh4cGFkLT5kZXYsIE5VTEwsIHhwYWRfcGxheV9lZmZlY3QpOwpAQCAtNTAyLDYgKzU5OSw3IEBACiAJCXhwYWQtPm9kYXRhWzBdID0gMHgwMTsKIAkJeHBhZC0+b2RhdGFbMV0gPSAweDAzOwogCQl4cGFkLT5vZGF0YVsyXSA9IGNvbW1hbmQ7CisJCXhwYWQtPmlycV9vdXQtPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSAzOwogCQl1c2Jfc3VibWl0X3VyYih4cGFkLT5pcnFfb3V0LCBHRlBfS0VSTkVMKTsKIAkJbXV0ZXhfdW5sb2NrKCZ4cGFkLT5vZGF0YV9tdXRleCk7CiAJfQpAQCAtNTc0LDYgKzY3MiwxMCBAQAogewogCXN0cnVjdCB1c2JfeHBhZCAqeHBhZCA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CiAKKwkvKiBVUkIgd2FzIHN1Ym1pdHRlZCBpbiBwcm9iZSAqLworCWlmKHhwYWQtPnh0eXBlID09IFhUWVBFX1hCT1gzNjBXKQorCQlyZXR1cm4gMDsKKwogCXhwYWQtPmlycV9pbi0+ZGV2ID0geHBhZC0+dWRldjsKIAlpZiAodXNiX3N1Ym1pdF91cmIoeHBhZC0+aXJxX2luLCBHRlBfS0VSTkVMKSkKIAkJcmV0dXJuIC1FSU87CkBAIC01ODUsNyArNjg3LDggQEAKIHsKIAlzdHJ1Y3QgdXNiX3hwYWQgKnhwYWQgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOwogCi0JdXNiX2tpbGxfdXJiKHhwYWQtPmlycV9pbik7CisJaWYoeHBhZC0+eHR5cGUgIT0gWFRZUEVfWEJPWDM2MFcpCisJCXVzYl9raWxsX3VyYih4cGFkLT5pcnFfaW4pOwogCXhwYWRfc3RvcF9vdXRwdXQoeHBhZCk7CiB9CiAKQEAgLTYzMiw3ICs3MzUsNyBAQAogCQlnb3RvIGZhaWwxOwogCiAJeHBhZC0+aWRhdGEgPSB1c2JfYnVmZmVyX2FsbG9jKHVkZXYsIFhQQURfUEtUX0xFTiwKLQkJCQkgICAgICAgR0ZQX0FUT01JQywgJnhwYWQtPmlkYXRhX2RtYSk7CisJCQkJICAgICAgIEdGUF9LRVJORUwsICZ4cGFkLT5pZGF0YV9kbWEpOwogCWlmICgheHBhZC0+aWRhdGEpCiAJCWdvdG8gZmFpbDE7CiAKQEAgLTY0NCw3ICs3NDcsMTYgQEAKIAl4cGFkLT5kcGFkX21hcHBpbmcgPSB4cGFkX2RldmljZVtpXS5kcGFkX21hcHBpbmc7CiAJeHBhZC0+eHR5cGUgPSB4cGFkX2RldmljZVtpXS54dHlwZTsKIAlpZiAoeHBhZC0+ZHBhZF9tYXBwaW5nID09IE1BUF9EUEFEX1VOS05PV04pCi0JCXhwYWQtPmRwYWRfbWFwcGluZyA9IGRwYWRfdG9fYnV0dG9uczsKKwkJeHBhZC0+ZHBhZF9tYXBwaW5nID0gIWRwYWRfdG9fYnV0dG9uczsKKwlpZiAoeHBhZC0+eHR5cGUgPT0gWFRZUEVfVU5LTk9XTikgeworCQlpZiAoaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZUNsYXNzID09IFVTQl9DTEFTU19WRU5ET1JfU1BFQykgeworCQkJaWYgKGludGYtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VQcm90b2NvbCA9PSAxMjkpCisJCQkJeHBhZC0+eHR5cGUgPSBYVFlQRV9YQk9YMzYwVzsKKwkJCWVsc2UKKwkJCQl4cGFkLT54dHlwZSA9IFhUWVBFX1hCT1gzNjA7CisJCX0gZWxzZQorCQkJeHBhZC0+eHR5cGUgPSBYVFlQRV9YQk9YOworCX0KIAl4cGFkLT5kZXYgPSBpbnB1dF9kZXY7CiAJdXNiX21ha2VfcGF0aCh1ZGV2LCB4cGFkLT5waHlzLCBzaXplb2YoeHBhZC0+cGh5cykpOwogCXN0cmxjYXQoeHBhZC0+cGh5cywgIi9pbnB1dDAiLCBzaXplb2YoeHBhZC0+cGh5cykpOwpAQCAtNjYyLDExICs3NzQsMTQgQEAKIAlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKSB8IEJJVF9NQVNLKEVWX0FCUyk7CiAKIAkvKiBzZXQgdXAgYnV0dG9ucyAqLwotCWZvciAoaSA9IDA7IHhwYWRfYnRuW2ldID49IDA7IGkrKykKLQkJc2V0X2JpdCh4cGFkX2J0bltpXSwgaW5wdXRfZGV2LT5rZXliaXQpOwotCWlmICh4cGFkLT54dHlwZSA9PSBYVFlQRV9YQk9YMzYwKQorCWZvciAoaSA9IDA7IHhwYWRfY29tbW9uX2J0bltpXSA+PSAwOyBpKyspCisJCXNldF9iaXQoeHBhZF9jb21tb25fYnRuW2ldLCBpbnB1dF9kZXYtPmtleWJpdCk7CisJaWYgKCh4cGFkLT54dHlwZSA9PSBYVFlQRV9YQk9YMzYwKSB8fCAoeHBhZC0+eHR5cGUgPT0gWFRZUEVfWEJPWDM2MFcpKQogCQlmb3IgKGkgPSAwOyB4cGFkMzYwX2J0bltpXSA+PSAwOyBpKyspCiAJCQlzZXRfYml0KHhwYWQzNjBfYnRuW2ldLCBpbnB1dF9kZXYtPmtleWJpdCk7CisJZWxzZQorCQlmb3IgKGkgPSAwOyB4cGFkX2J0bltpXSA+PSAwOyBpKyspCisJCQlzZXRfYml0KHhwYWRfYnRuW2ldLCBpbnB1dF9kZXYtPmtleWJpdCk7CiAJaWYgKHhwYWQtPmRwYWRfbWFwcGluZyA9PSBNQVBfRFBBRF9UT19CVVRUT05TKQogCQlmb3IgKGkgPSAwOyB4cGFkX2J0bl9wYWRbaV0gPj0gMDsgaSsrKQogCQkJc2V0X2JpdCh4cGFkX2J0bl9wYWRbaV0sIGlucHV0X2Rldi0+a2V5Yml0KTsKQEAgLTcwMyw4ICs4MTgsNTcgQEAKIAkJZ290byBmYWlsNDsKIAogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgeHBhZCk7CisKKwkvKgorCSAqIFN1Ym1pdCB0aGUgaW50IFVSQiBpbW1lZGlhdGx5IHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIG9wZW4KKwkgKiBiZWNhdXNlIHdlIGdldCBzdGF0dXMgbWVzc2FnZXMgZnJvbSB0aGUgZGV2aWNlIHdoZXRoZXIKKwkgKiBvciBub3QgYW55IGNvbnRyb2xsZXJzIGFyZSBhdHRhY2hlZC4gIEluIGZhY3QsIGl0J3MKKwkgKiBleGFjdGx5IHRoZSBtZXNzYWdlIHRoYXQgYSBjb250cm9sbGVyIGhhcyBhcnJpdmVkIHRoYXQKKwkgKiB3ZSdyZSB3YWl0aW5nIGZvci4KKwkgKi8KKwlpZiAoeHBhZC0+eHR5cGUgPT0gWFRZUEVfWEJPWDM2MFcpIHsKKwkJeHBhZC0+aXJxX2luLT5kZXYgPSB4cGFkLT51ZGV2OworCQllcnJvciA9IHVzYl9zdWJtaXRfdXJiKHhwYWQtPmlycV9pbiwgR0ZQX0tFUk5FTCk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZmFpbDQ7CisKKwkJLyoKKwkJICogU2V0dXAgdGhlIG1lc3NhZ2UgdG8gc2V0IHRoZSBMRURzIG9uIHRoZQorCQkgKiBjb250cm9sbGVyIHdoZW4gaXQgc2hvd3MgdXAKKwkJICovCisJCXhwYWQtPmJ1bGtfb3V0ID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwkJaWYoIXhwYWQtPmJ1bGtfb3V0KQorCQkJZ290byBmYWlsNTsKKworCQl4cGFkLT5iZGF0YSA9IGt6YWxsb2MoWFBBRF9QS1RfTEVOLCBHRlBfS0VSTkVMKTsKKwkJaWYoIXhwYWQtPmJkYXRhKQorCQkJZ290byBmYWlsNjsKKworCQl4cGFkLT5iZGF0YVsyXSA9IDB4MDg7CisJCXN3aXRjaCAoaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcikgeworCQljYXNlIDA6CisJCQl4cGFkLT5iZGF0YVszXSA9IDB4NDI7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJeHBhZC0+YmRhdGFbM10gPSAweDQzOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCXhwYWQtPmJkYXRhWzNdID0gMHg0NDsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQl4cGFkLT5iZGF0YVszXSA9IDB4NDU7CisJCX0KKworCQllcF9pcnFfaW4gPSAmaW50Zi0+Y3VyX2FsdHNldHRpbmctPmVuZHBvaW50WzFdLmRlc2M7CisJCXVzYl9maWxsX2J1bGtfdXJiKHhwYWQtPmJ1bGtfb3V0LCB1ZGV2LAorCQkJCXVzYl9zbmRidWxrcGlwZSh1ZGV2LCBlcF9pcnFfaW4tPmJFbmRwb2ludEFkZHJlc3MpLAorCQkJCXhwYWQtPmJkYXRhLCBYUEFEX1BLVF9MRU4sIHhwYWRfYnVsa19vdXQsIHhwYWQpOworCX0KKwogCXJldHVybiAwOwogCisgZmFpbDY6CXVzYl9mcmVlX3VyYih4cGFkLT5idWxrX291dCk7CisgZmFpbDU6CXVzYl9raWxsX3VyYih4cGFkLT5pcnFfaW4pOwogIGZhaWw0Ogl1c2JfZnJlZV91cmIoeHBhZC0+aXJxX2luKTsKICBmYWlsMzoJeHBhZF9kZWluaXRfb3V0cHV0KHhwYWQpOwogIGZhaWwyOgl1c2JfYnVmZmVyX2ZyZWUodWRldiwgWFBBRF9QS1RfTEVOLCB4cGFkLT5pZGF0YSwgeHBhZC0+aWRhdGFfZG1hKTsKQEAgLTcyMyw2ICs4ODcsMTEgQEAKIAkJeHBhZF9sZWRfZGlzY29ubmVjdCh4cGFkKTsKIAkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoeHBhZC0+ZGV2KTsKIAkJeHBhZF9kZWluaXRfb3V0cHV0KHhwYWQpOworCQlpZiAoeHBhZC0+eHR5cGUgPT0gWFRZUEVfWEJPWDM2MFcpIHsKKwkJCXVzYl9raWxsX3VyYih4cGFkLT5idWxrX291dCk7CisJCQl1c2JfZnJlZV91cmIoeHBhZC0+YnVsa19vdXQpOworCQkJdXNiX2tpbGxfdXJiKHhwYWQtPmlycV9pbik7CisJCX0KIAkJdXNiX2ZyZWVfdXJiKHhwYWQtPmlycV9pbik7CiAJCXVzYl9idWZmZXJfZnJlZSh4cGFkLT51ZGV2LCBYUEFEX1BLVF9MRU4sCiAJCQkJeHBhZC0+aWRhdGEsIHhwYWQtPmlkYXRhX2RtYSk7CkBAIC03NDEsNyArOTEwLDcgQEAKIHsKIAlpbnQgcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZ4cGFkX2RyaXZlcik7CiAJaWYgKHJlc3VsdCA9PSAwKQotCQlpbmZvKERSSVZFUl9ERVNDICI6IiBEUklWRVJfVkVSU0lPTik7CisJCWluZm8oRFJJVkVSX0RFU0MpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svemhlbmh1YS5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay96aGVuaHVhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU4NTMxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svemhlbmh1YS5jCkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogIGRlcml2ZWQgZnJvbSAidHdpZGpveS5jIgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDggTWFydGluIEtlYmVydAorICogIENvcHlyaWdodCAoYykgMjAwMSBBcm5kdCBTY2hvZW5ld2FsZAorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFZvanRlY2ggUGF2bGlrCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwIE1hcmsgRmxldGNoZXIKKyAqCisgKi8KKworLyoKKyAqIERyaXZlciB0byB1c2UgNENIIFJDIHRyYW5zbWl0dGVyIHVzaW5nIFpoZW4gSHVhIDUtYnl0ZSBwcm90b2NvbCAoV2Fsa2VyYSBMYW1hLAorICogRWFzeUNvcHRlciBldGMuKSBhcyBhIGpveXN0aWNrIHVuZGVyIExpbnV4LgorICoKKyAqIFJDIHRyYW5zbWl0dGVycyB1c2luZyBaaGVuIEh1YSA1LWJ5dGUgcHJvdG9jb2wgYXJlIGNoZWFwIGZvdXIgY2hhbm5lbHMKKyAqIHRyYW5zbWl0dGVycyBmb3IgY29udHJvbCBhIFJDIHBsYW5lcyBvciBSQyBoZWxpY29wdGVycyB3aXRoIHBvc3NpYmlsaXR5IHRvCisgKiBjb25uZWN0IG9uIGEgc2VyaWFsIHBvcnQuCisgKiBEYXRhIGNvbWluZyBmcm9tIHRyYW5zbWl0dGVyIGlzIGluIHRoaXMgb3JkZXI6CisgKiAxLiBieXRlID0gc3luY2hyb25pc2F0aW9uIGJ5dGUKKyAqIDIuIGJ5dGUgPSBYIGF4aXMKKyAqIDMuIGJ5dGUgPSBZIGF4aXMKKyAqIDQuIGJ5dGUgPSBSWiBheGlzCisgKiA1LiBieXRlID0gWiBheGlzCisgKiAoYW5kIHRoaXMgaXMgcmVwZWF0ZWQpCisgKgorICogRm9yIHF1ZXN0aW9ucyBvciBmZWVkYmFjayByZWdhcmRpbmcgdGhpcyBkcml2ZXIgbW9kdWxlIHBsZWFzZSBjb250YWN0OgorICogTWFydGluIEtlYmVydCA8Z2ttYXJ0eUBnbWFpbC5jb20+IC0gYnV0IEkgYW0gbm90IGEgQy1wcm9ncmFtbWVyIG5vciBrZXJuZWwKKyAqIGNvZGVyIDotKAorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2RlZmluZSBEUklWRVJfREVTQwkiUkMgdHJhbnNtaXR0ZXIgd2l0aCA1LWJ5dGUgWmhlbiBIdWEgcHJvdG9jb2wgam95c3RpY2sgZHJpdmVyIgorCitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorICogQ29uc3RhbnRzLgorICovCisKKyNkZWZpbmUgWkhFTkhVQV9NQVhfTEVOR1RIIDUKKworLyoKKyAqIFpoZW4gSHVhIGRhdGEuCisgKi8KKworc3RydWN0IHpoZW5odWEgeworCXN0cnVjdCBpbnB1dF9kZXYgKmRldjsKKwlpbnQgaWR4OworCXVuc2lnbmVkIGNoYXIgZGF0YVtaSEVOSFVBX01BWF9MRU5HVEhdOworCWNoYXIgcGh5c1szMl07Cit9OworCisKKy8qIGJpdHMgaW4gYWxsIGluY29taW5nIGJ5dGVzIG5lZWRzIHRvIGJlICJyZXZlcnNlZCIgKi8KK3N0YXRpYyBpbnQgemhlbmh1YV9iaXRyZXZlcnNlKGludCB4KQoreworCXggPSAoKHggJiAweGFhKSA+PiAxKSB8ICgoeCAmIDB4NTUpIDw8IDEpOworCXggPSAoKHggJiAweGNjKSA+PiAyKSB8ICgoeCAmIDB4MzMpIDw8IDIpOworCXggPSAoKHggJiAweGYwKSA+PiA0KSB8ICgoeCAmIDB4MGYpIDw8IDQpOworCXJldHVybiB4OworfQorCisvKgorICogemhlbmh1YV9wcm9jZXNzX3BhY2tldCgpIGRlY29kZXMgcGFja2V0cyB0aGUgZHJpdmVyIHJlY2VpdmVzIGZyb20gdGhlCisgKiBSQyB0cmFuc21pdHRlci4gSXQgdXBkYXRlcyB0aGUgZGF0YSBhY2NvcmRpbmdseS4KKyAqLworCitzdGF0aWMgdm9pZCB6aGVuaHVhX3Byb2Nlc3NfcGFja2V0KHN0cnVjdCB6aGVuaHVhICp6aGVuaHVhKQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IHpoZW5odWEtPmRldjsKKwl1bnNpZ25lZCBjaGFyICpkYXRhID0gemhlbmh1YS0+ZGF0YTsKKworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWSwgZGF0YVsxXSk7CisJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19YLCBkYXRhWzJdKTsKKwlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1JaLCBkYXRhWzNdKTsKKwlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1osIGRhdGFbNF0pOworCisJaW5wdXRfc3luYyhkZXYpOworfQorCisvKgorICogemhlbmh1YV9pbnRlcnJ1cHQoKSBpcyBjYWxsZWQgYnkgdGhlIGxvdyBsZXZlbCBkcml2ZXIgd2hlbiBjaGFyYWN0ZXJzCisgKiBhcmUgcmVhZHkgZm9yIHVzLiBXZSB0aGVuIGJ1ZmZlciB0aGVtIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcsIG9yIGNhbGwgdGhlCisgKiBwYWNrZXQgcHJvY2Vzc2luZyByb3V0aW5lLgorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCB6aGVuaHVhX2ludGVycnVwdChzdHJ1Y3Qgc2VyaW8gKnNlcmlvLCB1bnNpZ25lZCBjaGFyIGRhdGEsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgemhlbmh1YSAqemhlbmh1YSA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvKTsKKworCS8qIEFsbCBaaGVuIEh1YSBwYWNrZXRzIGFyZSA1IGJ5dGVzLiBUaGUgZmFjdCB0aGF0IHRoZSBmaXJzdCBieXRlCisJICogaXMgYWxsd2F5cyAweGY3IGFuZCBhbGwgb3RoZXJzIGFyZSBpbiByYW5nZSAweDMyIC0gMHhjOCAoNTAtMjAwKQorCSAqIGNhbiBiZSB1c2VkIHRvIGNoZWNrIGFuZCByZWdhaW4gc3luYy4gKi8KKworCWlmIChkYXRhID09IDB4ZWYpCisJCXpoZW5odWEtPmlkeCA9IDA7CS8qIHRoaXMgYnl0ZSBzdGFydHMgYSBuZXcgcGFja2V0ICovCisJZWxzZSBpZiAoemhlbmh1YS0+aWR4ID09IDApCisJCXJldHVybiBJUlFfSEFORExFRDsJLyogd3JvbmcgTVNCIC0tIGlnbm9yZSB0aGlzIGJ5dGUgKi8KKworCWlmICh6aGVuaHVhLT5pZHggPCBaSEVOSFVBX01BWF9MRU5HVEgpCisJCXpoZW5odWEtPmRhdGFbemhlbmh1YS0+aWR4KytdID0gemhlbmh1YV9iaXRyZXZlcnNlKGRhdGEpOworCisJaWYgKHpoZW5odWEtPmlkeCA9PSBaSEVOSFVBX01BWF9MRU5HVEgpIHsKKwkJemhlbmh1YV9wcm9jZXNzX3BhY2tldCh6aGVuaHVhKTsKKwkJemhlbmh1YS0+aWR4ID0gMDsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiB6aGVuaHVhX2Rpc2Nvbm5lY3QoKSBpcyB0aGUgb3Bwb3NpdGUgb2Ygemhlbmh1YV9jb25uZWN0KCkKKyAqLworCitzdGF0aWMgdm9pZCB6aGVuaHVhX2Rpc2Nvbm5lY3Qoc3RydWN0IHNlcmlvICpzZXJpbykKK3sKKwlzdHJ1Y3Qgemhlbmh1YSAqemhlbmh1YSA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvKTsKKworCXNlcmlvX2Nsb3NlKHNlcmlvKTsKKwlzZXJpb19zZXRfZHJ2ZGF0YShzZXJpbywgTlVMTCk7CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uoemhlbmh1YS0+ZGV2KTsKKwlrZnJlZSh6aGVuaHVhKTsKK30KKworLyoKKyAqIHpoZW5odWFfY29ubmVjdCgpIGlzIHRoZSByb3V0aW5lIHRoYXQgaXMgY2FsbGVkIHdoZW4gc29tZW9uZSBhZGRzIGEKKyAqIG5ldyBzZXJpbyBkZXZpY2UuIEl0IGxvb2tzIGZvciB0aGUgVHdpZGRsZXIsIGFuZCBpZiBmb3VuZCwgcmVnaXN0ZXJzCisgKiBpdCBhcyBhbiBpbnB1dCBkZXZpY2UuCisgKi8KKworc3RhdGljIGludCB6aGVuaHVhX2Nvbm5lY3Qoc3RydWN0IHNlcmlvICpzZXJpbywgc3RydWN0IHNlcmlvX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCB6aGVuaHVhICp6aGVuaHVhOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKwlpbnQgZXJyID0gLUVOT01FTTsKKworCXpoZW5odWEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgemhlbmh1YSksIEdGUF9LRVJORUwpOworCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghemhlbmh1YSB8fCAhaW5wdXRfZGV2KQorCQlnb3RvIGZhaWwxOworCisJemhlbmh1YS0+ZGV2ID0gaW5wdXRfZGV2OworCXNucHJpbnRmKHpoZW5odWEtPnBoeXMsIHNpemVvZih6aGVuaHVhLT5waHlzKSwgIiVzL2lucHV0MCIsIHNlcmlvLT5waHlzKTsKKworCWlucHV0X2Rldi0+bmFtZSA9ICJaaGVuIEh1YSA1LWJ5dGUgZGV2aWNlIjsKKwlpbnB1dF9kZXYtPnBoeXMgPSB6aGVuaHVhLT5waHlzOworCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19SUzIzMjsKKwlpbnB1dF9kZXYtPmlkLnZlbmRvciA9IFNFUklPX1pIRU5IVUE7CisJaW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gMHgwMDAxOworCWlucHV0X2Rldi0+aWQudmVyc2lvbiA9IDB4MDEwMDsKKwlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmc2VyaW8tPmRldjsKKworCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVQoRVZfQUJTKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19YLCA1MCwgMjAwLCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19ZLCA1MCwgMjAwLCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19aLCA1MCwgMjAwLCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19SWiwgNTAsIDIwMCwgMCwgMCk7CisKKwlzZXJpb19zZXRfZHJ2ZGF0YShzZXJpbywgemhlbmh1YSk7CisKKwllcnIgPSBzZXJpb19vcGVuKHNlcmlvLCBkcnYpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDI7CisKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uoemhlbmh1YS0+ZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWwzOworCisJcmV0dXJuIDA7CisKKyBmYWlsMzoJc2VyaW9fY2xvc2Uoc2VyaW8pOworIGZhaWwyOglzZXJpb19zZXRfZHJ2ZGF0YShzZXJpbywgTlVMTCk7CisgZmFpbDE6CWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CisJa2ZyZWUoemhlbmh1YSk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFRoZSBzZXJpbyBkcml2ZXIgc3RydWN0dXJlLgorICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2VyaW9fZGV2aWNlX2lkIHpoZW5odWFfc2VyaW9faWRzW10gPSB7CisJeworCQkudHlwZQk9IFNFUklPX1JTMjMyLAorCQkucHJvdG8JPSBTRVJJT19aSEVOSFVBLAorCQkuaWQJPSBTRVJJT19BTlksCisJCS5leHRyYQk9IFNFUklPX0FOWSwKKwl9LAorCXsgMCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHNlcmlvLCB6aGVuaHVhX3NlcmlvX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3Qgc2VyaW9fZHJpdmVyIHpoZW5odWFfZHJ2ID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJ6aGVuaHVhIiwKKwl9LAorCS5kZXNjcmlwdGlvbgk9IERSSVZFUl9ERVNDLAorCS5pZF90YWJsZQk9IHpoZW5odWFfc2VyaW9faWRzLAorCS5pbnRlcnJ1cHQJPSB6aGVuaHVhX2ludGVycnVwdCwKKwkuY29ubmVjdAk9IHpoZW5odWFfY29ubmVjdCwKKwkuZGlzY29ubmVjdAk9IHpoZW5odWFfZGlzY29ubmVjdCwKK307CisKKy8qCisgKiBUaGUgZnVuY3Rpb25zIGZvciBpbnNlcnRpbmcvcmVtb3ZpbmcgdXMgYXMgYSBtb2R1bGUuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgemhlbmh1YV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNlcmlvX3JlZ2lzdGVyX2RyaXZlcigmemhlbmh1YV9kcnYpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgemhlbmh1YV9leGl0KHZvaWQpCit7CisJc2VyaW9fdW5yZWdpc3Rlcl9kcml2ZXIoJnpoZW5odWFfZHJ2KTsKK30KKworbW9kdWxlX2luaXQoemhlbmh1YV9pbml0KTsKK21vZHVsZV9leGl0KHpoZW5odWFfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2FhZWQyMDAwX2tiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hYWVkMjAwMF9rYmQuYwppbmRleCA3MmFiYzE5Li5hMjkzZThiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2FhZWQyMDAwX2tiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYWFlZDIwMDBfa2JkLmMKQEAgLTE1NiwxMSArMTU2LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIHdvcmsgd2l0aCBob3RwbHVnIGFuZCBjb2xkcGx1ZyAqLworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTphYWVkMjAwMC1rZXlib2FyZCIpOworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhYWVka2JkX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gYWFlZGtiZF9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFhZWRrYmRfcmVtb3ZlKSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAiYWFlZDIwMDAta2V5Ym9hcmQiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9iZjU0eC1rZXlzLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2JmNTR4LWtleXMuYwppbmRleCAwNWUzNDk0Li41NGVkOGUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2JmNTR4LWtleXMuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2JmNTR4LWtleXMuYwpAQCAtMzEyLDYgKzMxMiw4IEBACiAKIAliZmluX3dyaXRlX0tQQURfQ1RMKGJmaW5fcmVhZF9LUEFEX0NUTCgpIHwgS1BBRF9FTik7CiAKKwlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMSk7CisKIAlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUKIAkJIjogQmxhY2tmaW4gQkY1NHggS2V5cGFkIHJlZ2lzdGVyZWQgSVJRICVkXG4iLCBiZjU0eF9rcGFkLT5pcnEpOwogCkBAIC0zNTQsMTIgKzM1Niw0MCBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGJmaW5fa3BhZF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgYmY1NHhfa3BhZCAqYmY1NHhfa3BhZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpKQorCQllbmFibGVfaXJxX3dha2UoYmY1NHhfa3BhZC0+aXJxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJmaW5fa3BhZF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYmY1NHhfa3BhZCAqYmY1NHhfa3BhZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpKQorCQlkaXNhYmxlX2lycV93YWtlKGJmNTR4X2twYWQtPmlycSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjIGRlZmluZSBiZmluX2twYWRfc3VzcGVuZCBOVUxMCisjIGRlZmluZSBiZmluX2twYWRfcmVzdW1lICBOVUxMCisjZW5kaWYKKwogc3RydWN0IHBsYXRmb3JtX2RyaXZlciBiZmluX2twYWRfZGV2aWNlX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gYmZpbl9rcGFkX3Byb2JlLAotCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYmZpbl9rcGFkX3JlbW92ZSksCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gRFJWX05BTUUsCi0JfQorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBiZmluX2twYWRfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChiZmluX2twYWRfcmVtb3ZlKSwKKwkuc3VzcGVuZAk9IGJmaW5fa3BhZF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYmZpbl9rcGFkX3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGJmaW5fa3BhZF9pbml0KHZvaWQpCkBAIC0zNzgsMyArNDA4LDQgQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIk1pY2hhZWwgSGVubmVyaWNoIDxoZW5uZXJpY2hAYmxhY2tmaW4udWNsaW51eC5vcmc+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIktleXBhZCBkcml2ZXIgZm9yIEJGNTR4IFByb2Nlc3NvcnMiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06YmY1NHgta2V5cyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9jb3JnaWtiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9jb3JnaWtiZC5jCmluZGV4IDVkNmNjN2YuLjI5ZmJlYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvY29yZ2lrYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2Nvcmdpa2JkLmMKQEAgLTM5Myw2ICszOTMsNyBAQAogCS5yZXN1bWUJCT0gY29yZ2lrYmRfcmVzdW1lLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJjb3JnaS1rZXlib2FyZCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCiB9OwogCkBAIC00MTIsMyArNDEzLDQgQEAKIE1PRFVMRV9BVVRIT1IoIlJpY2hhcmQgUHVyZGllIDxycHVyZGllQHJwc3lzLm5ldD4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQ29yZ2kgS2V5Ym9hcmQgRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06Y29yZ2kta2V5Ym9hcmQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvZ3Bpb19rZXlzLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2dwaW9fa2V5cy5jCmluZGV4IDZhOWNhNGIuLmJiZDAwYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvZ3Bpb19rZXlzLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9ncGlvX2tleXMuYwpAQCAtNDMsMTAgKzQzLDExIEBACiAKIAkJCWlucHV0X2V2ZW50KGlucHV0LCB0eXBlLCBidXR0b24tPmNvZGUsICEhc3RhdGUpOwogCQkJaW5wdXRfc3luYyhpbnB1dCk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJCX0KIAl9CiAKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJcmV0dXJuIElSUV9OT05FOwogfQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBncGlvX2tleXNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTIxMyw2ICsyMTQsNyBAQAogCS5yZXN1bWUJCT0gZ3Bpb19rZXlzX3Jlc3VtZSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAiZ3Bpby1rZXlzIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfQogfTsKIApAQCAtMjMyLDMgKzIzNCw0IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJQaGlsIEJsdW5kZWxsIDxwYkBoYW5kaGVsZHMub3JnPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJLZXlib2FyZCBkcml2ZXIgZm9yIENQVSBHUElPcyIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpncGlvLWtleXMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvam9ybmFkYTY4MF9rYmQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvam9ybmFkYTY4MF9rYmQuYwppbmRleCBhMjM2MzNhLi45Mzg3ZGEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2pvcm5hZGE2ODBfa2JkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9qb3JuYWRhNjgwX2tiZC5jCkBAIC0yNTQsNiArMjU0LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGpvcm5hZGE2ODBrYmRfZHJpdmVyID0gewogCS5kcml2ZXIJPSB7CiAJCS5uYW1lCT0gImpvcm5hZGE2ODBfa2JkIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKIAkucHJvYmUJPSBqb3JuYWRhNjgwa2JkX3Byb2JlLAogCS5yZW1vdmUJPSBfX2RldmV4aXRfcChqb3JuYWRhNjgwa2JkX3JlbW92ZSksCkBAIC0yNzUsMyArMjc2LDQgQEAKIE1PRFVMRV9BVVRIT1IoIktyaXN0b2ZmZXIgRXJpY3NvbiA8a3Jpc3RvZmZlci5lcmljc29uQGdtYWlsLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiSFAgSm9ybmFkYSA2MjAvNjYwLzY4MC82OTAgS2V5Ym9hcmQgRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06am9ybmFkYTY4MF9rYmQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvam9ybmFkYTcyMF9rYmQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvam9ybmFkYTcyMF9rYmQuYwppbmRleCA5ODZmOTNjLi5hMTE2NGEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2pvcm5hZGE3MjBfa2JkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9qb3JuYWRhNzIwX2tiZC5jCkBAIC0xNjIsOSArMTYyLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIHdvcmsgd2l0aCBob3RwbHVnIGFuZCBjb2xkcGx1ZyAqLworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpqb3JuYWRhNzIwX2tiZCIpOworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBqb3JuYWRhNzIwX2tiZF9kcml2ZXIgPSB7CiAJLmRyaXZlciAgPSB7CiAJCS5uYW1lICAgID0gImpvcm5hZGE3MjBfa2JkIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJIH0sCiAJLnByb2JlICAgPSBqb3JuYWRhNzIwX2tiZF9wcm9iZSwKIAkucmVtb3ZlICA9IF9fZGV2ZXhpdF9wKGpvcm5hZGE3MjBfa2JkX3JlbW92ZSksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xvY29tb2tiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9sb2NvbW9rYmQuYwppbmRleCA1YTBjYTE4Li45Y2FlZDMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xvY29tb2tiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbG9jb21va2JkLmMKQEAgLTEsMTQgKzEsMTIgQEAKIC8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA1IEpvaG4gTGVuegorICogTG9Db01vIGtleWJvYXJkIGRyaXZlciBmb3IgTGludXgtYmFzZWQgQVJNIFBEQXM6CisgKiAJLSBTSEFSUCBaYXVydXMgQ29sbGllIChTTC01NTAwKQorICogCS0gU0hBUlAgWmF1cnVzIFBvb2RsZSAoU0wtNTYwMCkKICAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSm9obiBMZW56CiAgKiBCYXNlZCBvbiBmcm9tIHh0a2JkLmMKLSAqLwotCi0vKgotICogTG9Db01vIGtleWJvYXJkIGRyaXZlciBmb3IgTGludXgvQVJNCi0gKi8KLQotLyoKKyAqCisgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgpAQCAtNDcsNyArNDUsOCBAQAogI2RlZmluZSBLRVlfQ09OVEFDVAkJS0VZX0YxOAogI2RlZmluZSBLRVlfQ0VOVEVSCQlLRVlfRjE1CiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGxvY29tb2tiZF9rZXljb2RlW0xPQ09NT0tCRF9OVU1LRVlTXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyCitsb2NvbW9rYmRfa2V5Y29kZVtMT0NPTU9LQkRfTlVNS0VZU10gX19kZXZpbml0Y29uc3QgPSB7CiAJMCwgS0VZX0VTQywgS0VZX0FDVElWSVRZLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkJCQkvKiAwIC0gOSAqLwogCTAsIDAsIDAsIDAsIDAsIDAsIDAsIEtFWV9NRU5VLCBLRVlfSE9NRSwgS0VZX0NPTlRBQ1QsCQkJLyogMTAgLSAxOSAqLwogCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCQkJCQkJLyogMjAgLSAyOSAqLwpAQCAtNjcsMjIgKzY2LDIxIEBACiAjZGVmaW5lIEtCX0NPTFMJCQk4CiAjZGVmaW5lIEtCX1JPV01BU0socikJCSgxIDw8IChyKSkKICNkZWZpbmUgU0NBTkNPREUoYyxyKQkJKCAoKGMpPDw0KSArIChyKSArIDEgKQotI2RlZmluZQlOUl9TQ0FOQ09ERVMJCTEyOAogCiAjZGVmaW5lIEtCX0RFTEFZCQk4CiAjZGVmaW5lIFNDQU5fSU5URVJWQUwJCShIWi8xMCkKLSNkZWZpbmUgTE9DT01PS0JEX1BSRVNTRUQJMQogCiBzdHJ1Y3QgbG9jb21va2JkIHsKIAl1bnNpZ25lZCBjaGFyIGtleWNvZGVbTE9DT01PS0JEX05VTUtFWVNdOwogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OwogCWNoYXIgcGh5c1szMl07CiAKLQlzdHJ1Y3QgbG9jb21vX2RldiAqbGRldjsKIAl1bnNpZ25lZCBsb25nIGJhc2U7CiAJc3BpbmxvY2tfdCBsb2NrOwogCiAJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJdW5zaWduZWQgbG9uZyBzdXNwZW5kX2ppZmZpZXM7CisJdW5zaWduZWQgaW50IGNvdW50X2NhbmNlbDsKIH07CiAKIC8qIGhlbHBlciBmdW5jdGlvbnMgZm9yIHJlYWRpbmcgdGhlIGtleWJvYXJkIG1hdHJpeCAqLwpAQCAtMTI4LDcgKzEyNiw3IEBACiAvKiBTY2FuIHRoZSBoYXJkd2FyZSBrZXlib2FyZCBhbmQgcHVzaCBhbnkgY2hhbmdlcyB1cCB0aHJvdWdoIHRoZSBpbnB1dCBsYXllciAqLwogc3RhdGljIHZvaWQgbG9jb21va2JkX3NjYW5rZXlib2FyZChzdHJ1Y3QgbG9jb21va2JkICpsb2NvbW9rYmQpCiB7Ci0JdW5zaWduZWQgaW50IHJvdywgY29sLCByb3dkLCBzY2FuY29kZTsKKwl1bnNpZ25lZCBpbnQgcm93LCBjb2wsIHJvd2Q7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgbnVtX3ByZXNzZWQ7CiAJdW5zaWduZWQgbG9uZyBtZW1iYXNlID0gbG9jb21va2JkLT5iYXNlOwpAQCAtMTQ1LDEzICsxNDMsMzMgQEAKIAogCQlyb3dkID0gfmxvY29tb19yZWFkbChtZW1iYXNlICsgTE9DT01PX0tJQik7CiAJCWZvciAocm93ID0gMDsgcm93IDwgS0JfUk9XUzsgcm93KyspIHsKKwkJCXVuc2lnbmVkIGludCBzY2FuY29kZSwgcHJlc3NlZCwga2V5OworCiAJCQlzY2FuY29kZSA9IFNDQU5DT0RFKGNvbCwgcm93KTsKLQkJCWlmIChyb3dkICYgS0JfUk9XTUFTSyhyb3cpKSB7Ci0JCQkJbnVtX3ByZXNzZWQgKz0gMTsKLQkJCQlpbnB1dF9yZXBvcnRfa2V5KGxvY29tb2tiZC0+aW5wdXQsIGxvY29tb2tiZC0+a2V5Y29kZVtzY2FuY29kZV0sIDEpOwotCQkJfSBlbHNlIHsKLQkJCQlpbnB1dF9yZXBvcnRfa2V5KGxvY29tb2tiZC0+aW5wdXQsIGxvY29tb2tiZC0+a2V5Y29kZVtzY2FuY29kZV0sIDApOwotCQkJfQorCQkJcHJlc3NlZCA9IHJvd2QgJiBLQl9ST1dNQVNLKHJvdyk7CisJCQlrZXkgPSBsb2NvbW9rYmQtPmtleWNvZGVbc2NhbmNvZGVdOworCisJCQlpbnB1dF9yZXBvcnRfa2V5KGxvY29tb2tiZC0+aW5wdXQsIGtleSwgcHJlc3NlZCk7CisJCQlpZiAobGlrZWx5KCFwcmVzc2VkKSkKKwkJCQljb250aW51ZTsKKworCQkJbnVtX3ByZXNzZWQrKzsKKworCQkJLyogVGhlICJDYW5jZWwvRVNDIiBrZXkgaXMgbGFiZWxlZCAiT24vT2ZmIiBvbgorCQkJICogQ29sbGllIGFuZCBQb29kbGUgYW5kIHNob3VsZCBzdXNwZW5kIHRoZSBkZXZpY2UKKwkJCSAqIGlmIGl0IHdhcyBwcmVzc2VkIGZvciBtb3JlIHRoYW4gYSBzZWNvbmQuICovCisJCQlpZiAodW5saWtlbHkoa2V5ID09IEtFWV9FU0MpKSB7CisJCQkJaWYgKCF0aW1lX2FmdGVyKGppZmZpZXMsCisJCQkJCWxvY29tb2tiZC0+c3VzcGVuZF9qaWZmaWVzICsgSFopKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAobG9jb21va2JkLT5jb3VudF9jYW5jZWwrKworCQkJCQkhPSAoSFovU0NBTl9JTlRFUlZBTCArIDEpKQorCQkJCQljb250aW51ZTsKKwkJCQlpbnB1dF9ldmVudChsb2NvbW9rYmQtPmlucHV0LCBFVl9QV1IsCisJCQkJCUtFWV9TVVNQRU5ELCAxKTsKKwkJCQlsb2NvbW9rYmQtPnN1c3BlbmRfamlmZmllcyA9IGppZmZpZXM7CisJCQl9IGVsc2UKKwkJCQlsb2NvbW9rYmQtPmNvdW50X2NhbmNlbCA9IDA7CiAJCX0KIAkJbG9jb21va2JkX3Jlc2V0X2NvbChtZW1iYXNlLCBjb2wpOwogCX0KQEAgLTE2Miw2ICsxODAsOCBAQAogCS8qIGlmIGFueSBrZXlzIGFyZSBwcmVzc2VkLCBlbmFibGUgdGhlIHRpbWVyICovCiAJaWYgKG51bV9wcmVzc2VkKQogCQltb2RfdGltZXIoJmxvY29tb2tiZC0+dGltZXIsIGppZmZpZXMgKyBTQ0FOX0lOVEVSVkFMKTsKKwllbHNlCisJCWxvY29tb2tiZC0+Y291bnRfY2FuY2VsID0gMDsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY29tb2tiZC0+bG9jaywgZmxhZ3MpOwogfQpAQCAtMTg2LDEwICsyMDYsMTEgQEAKIHN0YXRpYyB2b2lkIGxvY29tb2tiZF90aW1lcl9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IGxvY29tb2tiZCAqbG9jb21va2JkID0gKHN0cnVjdCBsb2NvbW9rYmQgKikgZGF0YTsKKwogCWxvY29tb2tiZF9zY2Fua2V5Ym9hcmQobG9jb21va2JkKTsKIH0KIAotc3RhdGljIGludCBsb2NvbW9rYmRfcHJvYmUoc3RydWN0IGxvY29tb19kZXYgKmRldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IGxvY29tb2tiZF9wcm9iZShzdHJ1Y3QgbG9jb21vX2RldiAqZGV2KQogewogCXN0cnVjdCBsb2NvbW9rYmQgKmxvY29tb2tiZDsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CkBAIC0yMTEsNyArMjMyLDYgQEAKIAkJZ290byBlcnJfZnJlZV9tZW07CiAJfQogCi0JbG9jb21va2JkLT5sZGV2ID0gZGV2OwogCWxvY29tb19zZXRfZHJ2ZGF0YShkZXYsIGxvY29tb2tiZCk7CiAKIAlsb2NvbW9rYmQtPmJhc2UgPSAodW5zaWduZWQgbG9uZykgZGV2LT5tYXBiYXNlOwpAQCAtMjIyLDYgKzI0Miw4IEBACiAJbG9jb21va2JkLT50aW1lci5mdW5jdGlvbiA9IGxvY29tb2tiZF90aW1lcl9jYWxsYmFjazsKIAlsb2NvbW9rYmQtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgbG9jb21va2JkOwogCisJbG9jb21va2JkLT5zdXNwZW5kX2ppZmZpZXMgPSBqaWZmaWVzOworCiAJbG9jb21va2JkLT5pbnB1dCA9IGlucHV0X2RldjsKIAlzdHJjcHkobG9jb21va2JkLT5waHlzLCAibG9jb21va2JkL2lucHV0MCIpOwogCkBAIC0yMzMsOSArMjU1LDEwIEBACiAJaW5wdXRfZGV2LT5pZC52ZXJzaW9uID0gMHgwMTAwOwogCWlucHV0X2Rldi0+ZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKIAotCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVRfTUFTSyhFVl9LRVkpIHwgQklUX01BU0soRVZfUkVQKTsKKwlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKSB8IEJJVF9NQVNLKEVWX1JFUCkgfAorCQkJCUJJVF9NQVNLKEVWX1BXUik7CiAJaW5wdXRfZGV2LT5rZXljb2RlID0gbG9jb21va2JkLT5rZXljb2RlOwotCWlucHV0X2Rldi0+a2V5Y29kZXNpemUgPSBzaXplb2YodW5zaWduZWQgY2hhcik7CisJaW5wdXRfZGV2LT5rZXljb2Rlc2l6ZSA9IHNpemVvZihsb2NvbW9rYmRfa2V5Y29kZVswXSk7CiAJaW5wdXRfZGV2LT5rZXljb2RlbWF4ID0gQVJSQVlfU0laRShsb2NvbW9rYmRfa2V5Y29kZSk7CiAKIAltZW1jcHkobG9jb21va2JkLT5rZXljb2RlLCBsb2NvbW9rYmRfa2V5Y29kZSwgc2l6ZW9mKGxvY29tb2tiZC0+a2V5Y29kZSkpOwpAQCAtMjY4LDcgKzI5MSw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBsb2NvbW9rYmRfcmVtb3ZlKHN0cnVjdCBsb2NvbW9fZGV2ICpkZXYpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBsb2NvbW9rYmRfcmVtb3ZlKHN0cnVjdCBsb2NvbW9fZGV2ICpkZXYpCiB7CiAJc3RydWN0IGxvY29tb2tiZCAqbG9jb21va2JkID0gbG9jb21vX2dldF9kcnZkYXRhKGRldik7CiAKQEAgLTI5Miw3ICszMTUsNyBAQAogCX0sCiAJLmRldmlkCT0gTE9DT01PX0RFVklEX0tFWUJPQVJELAogCS5wcm9iZQk9IGxvY29tb2tiZF9wcm9iZSwKLQkucmVtb3ZlCT0gbG9jb21va2JkX3JlbW92ZSwKKwkucmVtb3ZlCT0gX19kZXZleGl0X3AobG9jb21va2JkX3JlbW92ZSksCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBsb2NvbW9rYmRfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9vbWFwLWtleXBhZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9vbWFwLWtleXBhZC5jCmluZGV4IGJhYmM5MTMuLjEwYWZkMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvb21hcC1rZXlwYWQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL29tYXAta2V5cGFkLmMKQEAgLTM1Miw2ICszNTIsOSBAQAogCQkJfQogCQkJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24ocm93X2dwaW9zW3Jvd19pZHhdLCAxKTsKIAkJfQorCX0gZWxzZSB7CisJCWNvbF9pZHggPSAwOworCQlyb3dfaWR4ID0gMDsKIAl9CiAKIAlzZXR1cF90aW1lcigmb21hcF9rcC0+dGltZXIsIG9tYXBfa3BfdGltZXIsICh1bnNpZ25lZCBsb25nKW9tYXBfa3ApOwpAQCAtNDE1LDEwICs0MTgsMTAgQEAKIGVycjM6CiAJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9lbmFibGUpOwogZXJyMjoKLQlmb3IgKGkgPSByb3dfaWR4LTE7IGkgPj0wOyBpLS0pCisJZm9yIChpID0gcm93X2lkeCAtIDE7IGkgPj0wOyBpLS0pCiAJCW9tYXBfZnJlZV9ncGlvKHJvd19ncGlvc1tpXSk7CiBlcnIxOgotCWZvciAoaSA9IGNvbF9pZHgtMTsgaSA+PTA7IGktLSkKKwlmb3IgKGkgPSBjb2xfaWR4IC0gMTsgaSA+PTA7IGktLSkKIAkJb21hcF9mcmVlX2dwaW8oY29sX2dwaW9zW2ldKTsKIAogCWtmcmVlKG9tYXBfa3ApOwpAQCAtNDY0LDYgKzQ2Nyw3IEBACiAJLnJlc3VtZQkJPSBvbWFwX2twX3Jlc3VtZSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAib21hcC1rZXlwYWQiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAogfTsKIApAQCAtNDg0LDMgKzQ4OCw0IEBACiBNT0RVTEVfQVVUSE9SKCJUaW1vIFRlcsOkcyIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJPTUFQIEtleXBhZCBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06b21hcC1rZXlwYWQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvcHhhMjd4X2tleXBhZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9weGEyN3hfa2V5cGFkLmMKaW5kZXggNGU2NTFjMS4uM2RlYTBjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9weGEyN3hfa2V5cGFkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9weGEyN3hfa2V5cGFkLmMKQEAgLTU0NSw2ICs1NDUsOSBAQAogCXJldHVybiAwOwogfQogCisvKiB3b3JrIHdpdGggaG90cGx1ZyBhbmQgY29sZHBsdWcgKi8KK01PRFVMRV9BTElBUygicGxhdGZvcm06cHhhMjd4LWtleXBhZCIpOworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBweGEyN3hfa2V5cGFkX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gcHhhMjd4X2tleXBhZF9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHB4YTI3eF9rZXlwYWRfcmVtb3ZlKSwKQEAgLTU1Miw2ICs1NTUsNyBAQAogCS5yZXN1bWUJCT0gcHhhMjd4X2tleXBhZF9yZXN1bWUsCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gInB4YTI3eC1rZXlwYWQiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9zcGl0emtiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9zcGl0emtiZC5jCmluZGV4IDBiZTc0YmYuLjYxZTQwMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvc3BpdHprYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3NwaXR6a2JkLmMKQEAgLTQ5NSwzICs0OTUsNCBAQAogTU9EVUxFX0FVVEhPUigiUmljaGFyZCBQdXJkaWUgPHJwdXJkaWVAcnBzeXMubmV0PiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTcGl0eiBLZXlib2FyZCBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEx2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzcGl0ei1rZXlib2FyZCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC90b3Nha2JkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3Rvc2FrYmQuYwppbmRleCAzODg0ZDFlLi45NGU0NDRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3Rvc2FrYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3Rvc2FrYmQuYwpAQCAtNTIsNyArNTIsNyBAQAogc3RydWN0IHRvc2FrYmQgewogCXVuc2lnbmVkIGludCBrZXljb2RlW0FSUkFZX1NJWkUodG9zYWtiZF9rZXljb2RlKV07CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7Ci0KKwlpbnQgc3VzcGVuZGVkOwogCXNwaW5sb2NrX3QgbG9jazsgLyogcHJvdGVjdCBrYmQgc2Nhbm5pbmcgKi8KIAlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKIH07CkBAIC0xMzMsNiArMTMzLDkgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ0b3Nha2JkLT5sb2NrLCBmbGFncyk7CiAKKwlpZiAodG9zYWtiZC0+c3VzcGVuZGVkKQorCQlnb3RvIG91dDsKKwogCWZvciAoY29sID0gMDsgY29sIDwgVE9TQV9LRVlfU1RST0JFX05VTTsgY29sKyspIHsKIAkJLyoKIAkJICogRGlzY2hhcmdlIHRoZSBvdXRwdXQgZHJpdmVyIGNhcGFjaXRhdGFuY2UKQEAgLTE3NCw2ICsxNzcsNyBAQAogCWlmIChudW1fcHJlc3NlZCkKIAkJbW9kX3RpbWVyKCZ0b3Nha2JkLT50aW1lciwgamlmZmllcyArIFNDQU5fSU5URVJWQUwpOwogCisgb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRvc2FrYmQtPmxvY2ssIGZsYWdzKTsKIH0KIApAQCAtMjAwLDYgKzIwNCw3IEBACiBzdGF0aWMgdm9pZCB0b3Nha2JkX3RpbWVyX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgX19kZXYpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKilfX2RldjsKKwogCXRvc2FrYmRfc2NhbmtleWJvYXJkKGRldik7CiB9CiAKQEAgLTIwNyw2ICsyMTIsMTMgQEAKIHN0YXRpYyBpbnQgdG9zYWtiZF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXN0cnVjdCB0b3Nha2JkICp0b3Nha2JkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRvc2FrYmQtPmxvY2ssIGZsYWdzKTsKKwlQR1NSMSA9IChQR1NSMSAmIH5UT1NBX0dQSU9fTE9XX1NUUk9CRV9CSVQpOworCVBHU1IyID0gKFBHU1IyICYgflRPU0FfR1BJT19ISUdIX1NUUk9CRV9CSVQpOworCXRvc2FrYmQtPnN1c3BlbmRlZCA9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdG9zYWtiZC0+bG9jaywgZmxhZ3MpOwogCiAJZGVsX3RpbWVyX3N5bmMoJnRvc2FrYmQtPnRpbWVyKTsKIApAQCAtMjE1LDYgKzIyNyw5IEBACiAKIHN0YXRpYyBpbnQgdG9zYWtiZF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogeworCXN0cnVjdCB0b3Nha2JkICp0b3Nha2JkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKworCXRvc2FrYmQtPnN1c3BlbmRlZCA9IDA7CiAJdG9zYWtiZF9zY2Fua2V5Ym9hcmQoZGV2KTsKIAogCXJldHVybiAwOwpAQCAtMzY1LDggKzM4MCw4IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCB0b3Nha2JkX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpIHsKLQorc3RhdGljIGludCBfX2RldmV4aXQgdG9zYWtiZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQorewogCWludCBpOwogCXN0cnVjdCB0b3Nha2JkICp0b3Nha2JkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKIApAQCAtMzk0LDYgKzQwOSw3IEBACiAJLnJlc3VtZQkJPSB0b3Nha2JkX3Jlc3VtZSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAidG9zYS1rZXlib2FyZCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCiB9OwogCkBAIC00MTMsMyArNDI5LDQgQEAKIE1PRFVMRV9BVVRIT1IoIkRpcmsgT3BmZXIgPERpcmtAT3BmZXItT25saW5lLmRlPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJUb3NhIEtleWJvYXJkIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp0b3NhLWtleWJvYXJkIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvY29iYWx0X2J0bnMuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9jb2JhbHRfYnRucy5jCmluZGV4IDU1MTFlZjAuLjZhMWY0OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9jb2JhbHRfYnRucy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9jb2JhbHRfYnRucy5jCkBAIC0xNDgsNiArMTQ4LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogd29yayB3aXRoIGhvdHBsdWcgYW5kIGNvbGRwbHVnICovCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOkNvYmFsdCBidXR0b25zIik7CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNvYmFsdF9idXR0b25zX2RyaXZlciA9IHsKIAkucHJvYmUJPSBjb2JhbHRfYnV0dG9uc19wcm9iZSwKIAkucmVtb3ZlCT0gX19kZXZleGl0X3AoY29iYWx0X2J1dHRvbnNfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvZ3Bpb19tb3VzZS5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9ncGlvX21vdXNlLmMKaW5kZXggMDkzNmQ2Yi4uMzM5MjkwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9ncGlvX21vdXNlLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9ncGlvX21vdXNlLmMKQEAgLTE3MSwxMCArMTcxLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIHdvcmsgd2l0aCBob3RwbHVnIGFuZCBjb2xkcGx1ZyAqLworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpncGlvX21vdXNlIik7CisKIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZ3Bpb19tb3VzZV9kZXZpY2VfZHJpdmVyID0gewogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZ3Bpb19tb3VzZV9yZW1vdmUpLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJncGlvX21vdXNlIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9LY29uZmlnIGIvZHJpdmVycy9pbnB1dC9zZXJpby9LY29uZmlnCmluZGV4IGI4ODU2OWUuLmVjNGI2NjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vS2NvbmZpZworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL0tjb25maWcKQEAgLTg4LDYgKzg4LDE2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBycGNrYmQuCiAKK2NvbmZpZyBTRVJJT19BVDMyUFNJRgorCXRyaXN0YXRlICJBVlIzMiBQU0lGIFBTLzIga2V5Ym9hcmQgYW5kIG1vdXNlIGNvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBBVlIzMgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBQU0lGIHBlcmlwaGVyYWwgb24gQVZSMzIgZGV2aWNlcworCSAgYW5kIGNvbm5lY3QgYSBQUy8yIGtleWJvYXJkIGFuZC9vciBtb3VzZSB0byBpdC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgYXQzMnBzaWYuCisKIGNvbmZpZyBTRVJJT19BTUJBS01JCiAJdHJpc3RhdGUgIkFNQkEgS01JIGtleWJvYXJkIGNvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBBUk1fQU1CQQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9NYWtlZmlsZSBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vTWFrZWZpbGUKaW5kZXggNDE1NTE5Ny4uMzhiODg2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL01ha2VmaWxlCkBAIC0xMiw2ICsxMiw3IEBACiBvYmotJChDT05GSUdfU0VSSU9fUlBDS0JEKQkrPSBycGNrYmQubwogb2JqLSQoQ09ORklHX1NFUklPX1NBMTExMSkJKz0gc2ExMTExcHMyLm8KIG9iai0kKENPTkZJR19TRVJJT19BTUJBS01JKQkrPSBhbWJha21pLm8KK29iai0kKENPTkZJR19TRVJJT19BVDMyUFNJRikJKz0gYXQzMnBzaWYubwogb2JqLSQoQ09ORklHX1NFUklPX1E0MEtCRCkJKz0gcTQwa2JkLm8KIG9iai0kKENPTkZJR19TRVJJT19HU0NQUzIpCSs9IGdzY3BzMi5vCiBvYmotJChDT05GSUdfSFBfU0RDKQkJKz0gaHBfc2RjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vYXQzMnBzaWYuYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vYXQzMnBzaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWZkYThjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9hdDMycHNpZi5jCkBAIC0wLDAgKzEsMzc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEF0bWVsIENvcnBvcmF0aW9uCisgKgorICogRHJpdmVyIGZvciB0aGUgQVQzMkFQNzAwWCBQUy8yIGNvbnRyb2xsZXIgKFBTSUYpLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKy8qIFBTSUYgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBQU0lGX0NSCQkJCTB4MDAKKyNkZWZpbmUgUFNJRl9SSFIJCQkweDA0CisjZGVmaW5lIFBTSUZfVEhSCQkJMHgwOAorI2RlZmluZSBQU0lGX1NSCQkJCTB4MTAKKyNkZWZpbmUgUFNJRl9JRVIJCQkweDE0CisjZGVmaW5lIFBTSUZfSURSCQkJMHgxOAorI2RlZmluZSBQU0lGX0lNUgkJCTB4MWMKKyNkZWZpbmUgUFNJRl9QU1IJCQkweDI0CisKKy8qIEJpdGZpZWxkcyBpbiBjb250cm9sIHJlZ2lzdGVyLiAqLworI2RlZmluZSBQU0lGX0NSX1JYRElTX09GRlNFVAkJMQorI2RlZmluZSBQU0lGX0NSX1JYRElTX1NJWkUJCTEKKyNkZWZpbmUgUFNJRl9DUl9SWEVOX09GRlNFVAkJMAorI2RlZmluZSBQU0lGX0NSX1JYRU5fU0laRQkJMQorI2RlZmluZSBQU0lGX0NSX1NXUlNUX09GRlNFVAkJMTUKKyNkZWZpbmUgUFNJRl9DUl9TV1JTVF9TSVpFCQkxCisjZGVmaW5lIFBTSUZfQ1JfVFhESVNfT0ZGU0VUCQk5CisjZGVmaW5lIFBTSUZfQ1JfVFhESVNfU0laRQkJMQorI2RlZmluZSBQU0lGX0NSX1RYRU5fT0ZGU0VUCQk4CisjZGVmaW5lIFBTSUZfQ1JfVFhFTl9TSVpFCQkxCisKKy8qIEJpdGZpZWxkcyBpbiBpbnRlcnJ1cHQgZGlzYWJsZSwgZW5hYmxlLCBtYXNrIGFuZCBzdGF0dXMgcmVnaXN0ZXIuICovCisjZGVmaW5lIFBTSUZfTkFDS19PRkZTRVQJCTgKKyNkZWZpbmUgUFNJRl9OQUNLX1NJWkUJCQkxCisjZGVmaW5lIFBTSUZfT1ZSVU5fT0ZGU0VUCQk1CisjZGVmaW5lIFBTSUZfT1ZSVU5fU0laRQkJCTEKKyNkZWZpbmUgUFNJRl9QQVJJVFlfT0ZGU0VUCQk5CisjZGVmaW5lIFBTSUZfUEFSSVRZX1NJWkUJCTEKKyNkZWZpbmUgUFNJRl9SWFJEWV9PRkZTRVQJCTQKKyNkZWZpbmUgUFNJRl9SWFJEWV9TSVpFCQkJMQorI2RlZmluZSBQU0lGX1RYRU1QVFlfT0ZGU0VUCQkxCisjZGVmaW5lIFBTSUZfVFhFTVBUWV9TSVpFCQkxCisjZGVmaW5lIFBTSUZfVFhSRFlfT0ZGU0VUCQkwCisjZGVmaW5lIFBTSUZfVFhSRFlfU0laRQkJCTEKKworLyogQml0ZmllbGRzIGluIHByZXNjYWxlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBQU0lGX1BTUl9QUlNDVl9PRkZTRVQJCTAKKyNkZWZpbmUgUFNJRl9QU1JfUFJTQ1ZfU0laRQkJMTIKKworLyogQml0ZmllbGRzIGluIHJlY2VpdmUgaG9sZCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgUFNJRl9SSFJfUlhEQVRBX09GRlNFVAkJMAorI2RlZmluZSBQU0lGX1JIUl9SWERBVEFfU0laRQkJOAorCisvKiBCaXRmaWVsZHMgaW4gdHJhbnNtaXQgaG9sZCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgUFNJRl9USFJfVFhEQVRBX09GRlNFVAkJMAorI2RlZmluZSBQU0lGX1RIUl9UWERBVEFfU0laRQkJOAorCisvKiBCaXQgbWFuaXB1bGF0aW9uIG1hY3JvcyAqLworI2RlZmluZSBQU0lGX0JJVChuYW1lKQkJCQkJXAorCSgxIDw8IFBTSUZfIyNuYW1lIyNfT0ZGU0VUKQorCisjZGVmaW5lIFBTSUZfQkYobmFtZSwgdmFsdWUpCQkJCVwKKwkoKCh2YWx1ZSkgJiAoKDEgPDwgUFNJRl8jI25hbWUjI19TSVpFKSAtIDEpKQlcCisJIDw8IFBTSUZfIyNuYW1lIyNfT0ZGU0VUKQorCisjZGVmaW5lIFBTSUZfQkZFWFQobmFtZSwgdmFsdWUpCQkJCVwKKwkoKCh2YWx1ZSkgPj4gUFNJRl8jI25hbWUjI19PRkZTRVQpCQlcCisJICYgKCgxIDw8IFBTSUZfIyNuYW1lIyNfU0laRSkgLSAxKSkKKworI2RlZmluZSBQU0lGX0JGSU5TKG5hbWUsIHZhbHVlLCBvbGQpCQkJXAorCSgoKG9sZCkgJiB+KCgoMSA8PCBQU0lGXyMjbmFtZSMjX1NJWkUpIC0gMSkJXAorCQkgICAgPDwgUFNJRl8jI25hbWUjI19PRkZTRVQpKQkJXAorCSB8IFBTSUZfQkYobmFtZSwgdmFsdWUpKQorCisvKiBSZWdpc3RlciBhY2Nlc3MgbWFjcm9zICovCisjZGVmaW5lIHBzaWZfcmVhZGwocG9ydCwgcmVnKQkJCQlcCisJX19yYXdfcmVhZGwoKHBvcnQpLT5yZWdzICsgUFNJRl8jI3JlZykKKworI2RlZmluZSBwc2lmX3dyaXRlbChwb3J0LCByZWcsIHZhbHVlKQkJCVwKKwlfX3Jhd193cml0ZWwoKHZhbHVlKSwgKHBvcnQpLT5yZWdzICsgUFNJRl8jI3JlZykKKworc3RydWN0IHBzaWYgeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXY7CisJc3RydWN0IGNsawkJKnBjbGs7CisJc3RydWN0IHNlcmlvCQkqaW87CisJdm9pZCBfX2lvbWVtCQkqcmVnczsKKwl1bnNpZ25lZCBpbnQJCWlycTsKKwl1bnNpZ25lZCBpbnQJCW9wZW47CisJLyogUHJldmVudCBjb25jdXJyZW50IHdyaXRlcyB0byBQU0lGIFRIUi4gKi8KKwlzcGlubG9ja190CQlsb2NrOworfTsKKworc3RhdGljIGlycXJldHVybl90IHBzaWZfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKl9wdHIpCit7CisJc3RydWN0IHBzaWYgKnBzaWYgPSBfcHRyOworCWludCByZXR2YWwgPSBJUlFfTk9ORTsKKwl1bnNpZ25lZCBpbnQgaW9fZmxhZ3MgPSAwOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCisJc3RhdHVzID0gcHNpZl9yZWFkbChwc2lmLCBTUik7CisKKwlpZiAoc3RhdHVzICYgUFNJRl9CSVQoUlhSRFkpKSB7CisJCXVuc2lnbmVkIGNoYXIgdmFsID0gKHVuc2lnbmVkIGNoYXIpIHBzaWZfcmVhZGwocHNpZiwgUkhSKTsKKworCQlpZiAoc3RhdHVzICYgUFNJRl9CSVQoUEFSSVRZKSkKKwkJCWlvX2ZsYWdzIHw9IFNFUklPX1BBUklUWTsKKwkJaWYgKHN0YXR1cyAmIFBTSUZfQklUKE9WUlVOKSkKKwkJCWRldl9lcnIoJnBzaWYtPnBkZXYtPmRldiwgIm92ZXJydW4gcmVhZCBlcnJvclxuIik7CisKKwkJc2VyaW9faW50ZXJydXB0KHBzaWYtPmlvLCB2YWwsIGlvX2ZsYWdzKTsKKworCQlyZXR2YWwgPSBJUlFfSEFORExFRDsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHBzaWZfd3JpdGUoc3RydWN0IHNlcmlvICppbywgdW5zaWduZWQgY2hhciB2YWwpCit7CisJc3RydWN0IHBzaWYgKnBzaWYgPSBpby0+cG9ydF9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHRpbWVvdXQgPSAxMDsKKwlpbnQgcmV0dmFsID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwc2lmLT5sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoIShwc2lmX3JlYWRsKHBzaWYsIFNSKSAmIFBTSUZfQklUKFRYRU1QVFkpKSAmJiB0aW1lb3V0LS0pCisJCW1zbGVlcCgxMCk7CisKKwlpZiAodGltZW91dCA+PSAwKSB7CisJCXBzaWZfd3JpdGVsKHBzaWYsIFRIUiwgdmFsKTsKKwl9IGVsc2UgeworCQlkZXZfZGJnKCZwc2lmLT5wZGV2LT5kZXYsICJ0aW1lb3V0IHdyaXRpbmcgdG8gVEhSXG4iKTsKKwkJcmV0dmFsID0gLUVCVVNZOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBzaWYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgcHNpZl9vcGVuKHN0cnVjdCBzZXJpbyAqaW8pCit7CisJc3RydWN0IHBzaWYgKnBzaWYgPSBpby0+cG9ydF9kYXRhOworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBjbGtfZW5hYmxlKHBzaWYtPnBjbGspOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0OworCisJcHNpZl93cml0ZWwocHNpZiwgQ1IsIFBTSUZfQklUKENSX1RYRU4pIHwgUFNJRl9CSVQoQ1JfUlhFTikpOworCXBzaWZfd3JpdGVsKHBzaWYsIElFUiwgUFNJRl9CSVQoUlhSRFkpKTsKKworCXBzaWYtPm9wZW4gPSAxOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHBzaWZfY2xvc2Uoc3RydWN0IHNlcmlvICppbykKK3sKKwlzdHJ1Y3QgcHNpZiAqcHNpZiA9IGlvLT5wb3J0X2RhdGE7CisKKwlwc2lmLT5vcGVuID0gMDsKKworCXBzaWZfd3JpdGVsKHBzaWYsIElEUiwgfjBVTCk7CisJcHNpZl93cml0ZWwocHNpZiwgQ1IsIFBTSUZfQklUKENSX1RYRElTKSB8IFBTSUZfQklUKENSX1JYRElTKSk7CisKKwljbGtfZGlzYWJsZShwc2lmLT5wY2xrKTsKK30KKworc3RhdGljIHZvaWQgcHNpZl9zZXRfcHJlc2NhbGVyKHN0cnVjdCBwc2lmICpwc2lmKQoreworCXVuc2lnbmVkIGxvbmcgcHJzY3Y7CisJdW5zaWduZWQgbG9uZyByYXRlID0gY2xrX2dldF9yYXRlKHBzaWYtPnBjbGspOworCisJLyogUFJTQ1YgPSBQdWxzZSBsZW5ndGggKDEwMCB1cykgKiBQU0lGIG1vZHVsZSBmcmVxdWVuY3kuICovCisJcHJzY3YgPSAxMDAgKiAocmF0ZSAvIDEwMDAwMDBVTCk7CisKKwlpZiAocHJzY3YgPiAoKDE8PFBTSUZfUFNSX1BSU0NWX1NJWkUpIC0gMSkpIHsKKwkJcHJzY3YgPSAoMTw8UFNJRl9QU1JfUFJTQ1ZfU0laRSkgLSAxOworCQlkZXZfZGJnKCZwc2lmLT5wZGV2LT5kZXYsICJwY2xrIHRvbyBmYXN0LCAiCisJCQkJInByZXNjYWxlciBzZXQgdG8gbWF4XG4iKTsKKwl9CisKKwljbGtfZW5hYmxlKHBzaWYtPnBjbGspOworCXBzaWZfd3JpdGVsKHBzaWYsIFBTUiwgcHJzY3YpOworCWNsa19kaXNhYmxlKHBzaWYtPnBjbGspOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwc2lmX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZWdzOworCXN0cnVjdCBwc2lmICpwc2lmOworCXN0cnVjdCBzZXJpbyAqaW87CisJc3RydWN0IGNsayAqcGNsazsKKwlpbnQgaXJxOworCWludCByZXQ7CisKKwlwc2lmID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBzaWYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBzaWYpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlwc2lmLT5wZGV2ID0gcGRldjsKKworCWlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNlcmlvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbykgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV9wc2lmOworCX0KKwlwc2lmLT5pbyA9IGlvOworCisJcmVncyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZWdzKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIm5vIG1taW8gcmVzb3VyY2VzIGRlZmluZWRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX2lvOworCX0KKworCXBzaWYtPnJlZ3MgPSBpb3JlbWFwKHJlZ3MtPnN0YXJ0LCByZWdzLT5lbmQgLSByZWdzLT5zdGFydCArIDEpOworCWlmICghcHNpZi0+cmVncykgeworCQlyZXQgPSAtRU5PTUVNOworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgbWFwIEkvTyBtZW1vcnlcbiIpOworCQlnb3RvIG91dF9mcmVlX2lvOworCX0KKworCXBjbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJwY2xrIik7CisJaWYgKElTX0VSUihwY2xrKSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgZ2V0IHBlcmlwaGVyYWwgY2xvY2tcbiIpOworCQlyZXQgPSBQVFJfRVJSKHBjbGspOworCQlnb3RvIG91dF9pb3VubWFwOworCX0KKwlwc2lmLT5wY2xrID0gcGNsazsKKworCS8qIFJlc2V0IHRoZSBQU0lGIHRvIGVudGVyIGF0IGEga25vd24gc3RhdGUuICovCisJcmV0ID0gY2xrX2VuYWJsZShwY2xrKTsKKwlpZiAocmV0KSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBlbmFibGUgcGNsa1xuIik7CisJCWdvdG8gb3V0X3B1dF9jbGs7CisJfQorCXBzaWZfd3JpdGVsKHBzaWYsIENSLCBQU0lGX0JJVChDUl9TV1JTVCkpOworCWNsa19kaXNhYmxlKHBjbGspOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgZ2V0IGlycVxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBvdXRfcHV0X2NsazsKKwl9CisJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBwc2lmX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsICJhdDMycHNpZiIsIHBzaWYpOworCWlmIChyZXQpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY291bGQgbm90IHJlcXVlc3QgaXJxICVkXG4iLCBpcnEpOworCQlnb3RvIG91dF9wdXRfY2xrOworCX0KKwlwc2lmLT5pcnEgPSBpcnE7CisKKwlpby0+aWQudHlwZQk9IFNFUklPXzgwNDI7CisJaW8tPndyaXRlCT0gcHNpZl93cml0ZTsKKwlpby0+b3Blbgk9IHBzaWZfb3BlbjsKKwlpby0+Y2xvc2UJPSBwc2lmX2Nsb3NlOworCXNucHJpbnRmKGlvLT5uYW1lLCBzaXplb2YoaW8tPm5hbWUpLCAiQVZSMzIgUFMvMiBwb3J0JWQiLCBwZGV2LT5pZCk7CisJc25wcmludGYoaW8tPnBoeXMsIHNpemVvZihpby0+cGh5cyksICJhdDMycHNpZi9zZXJpbyVkIiwgcGRldi0+aWQpOworCWlvLT5wb3J0X2RhdGEJPSBwc2lmOworCWlvLT5kZXYucGFyZW50CT0gJnBkZXYtPmRldjsKKworCXBzaWZfc2V0X3ByZXNjYWxlcihwc2lmKTsKKworCXNwaW5fbG9ja19pbml0KCZwc2lmLT5sb2NrKTsKKwlzZXJpb19yZWdpc3Rlcl9wb3J0KHBzaWYtPmlvKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwc2lmKTsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJBdG1lbCBBVlIzMiBQU0lGIFBTLzIgZHJpdmVyIG9uIDB4JTA4eCBpcnEgJWRcbiIsCisJCQkoaW50KXBzaWYtPnJlZ3MsIHBzaWYtPmlycSk7CisKKwlyZXR1cm4gMDsKKworb3V0X3B1dF9jbGs6CisJY2xrX3B1dChwc2lmLT5wY2xrKTsKK291dF9pb3VubWFwOgorCWlvdW5tYXAocHNpZi0+cmVncyk7CitvdXRfZnJlZV9pbzoKKwlrZnJlZShpbyk7CitvdXRfZnJlZV9wc2lmOgorCWtmcmVlKHBzaWYpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IHBzaWZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHBzaWYgKnBzaWYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXBzaWZfd3JpdGVsKHBzaWYsIElEUiwgfjBVTCk7CisJcHNpZl93cml0ZWwocHNpZiwgQ1IsIFBTSUZfQklUKENSX1RYRElTKSB8IFBTSUZfQklUKENSX1JYRElTKSk7CisKKwlzZXJpb191bnJlZ2lzdGVyX3BvcnQocHNpZi0+aW8pOworCWlvdW5tYXAocHNpZi0+cmVncyk7CisJZnJlZV9pcnEocHNpZi0+aXJxLCBwc2lmKTsKKwljbGtfcHV0KHBzaWYtPnBjbGspOworCWtmcmVlKHBzaWYpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBwc2lmX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBwc2lmICpwc2lmID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAocHNpZi0+b3BlbikgeworCQlwc2lmX3dyaXRlbChwc2lmLCBDUiwgUFNJRl9CSVQoQ1JfUlhESVMpIHwgUFNJRl9CSVQoQ1JfVFhESVMpKTsKKwkJY2xrX2Rpc2FibGUocHNpZi0+cGNsayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHNpZl9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcHNpZiAqcHNpZiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKHBzaWYtPm9wZW4pIHsKKwkJY2xrX2VuYWJsZShwc2lmLT5wY2xrKTsKKwkJcHNpZl9zZXRfcHJlc2NhbGVyKHBzaWYpOworCQlwc2lmX3dyaXRlbChwc2lmLCBDUiwgUFNJRl9CSVQoQ1JfUlhFTikgfCBQU0lGX0JJVChDUl9UWEVOKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBwc2lmX3N1c3BlbmQJTlVMTAorI2RlZmluZSBwc2lmX3Jlc3VtZQlOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcHNpZl9kcml2ZXIgPSB7CisJLnJlbW92ZQkJPSBfX2V4aXRfcChwc2lmX3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImF0bWVsX3BzaWYiLAorCX0sCisJLnN1c3BlbmQJPSBwc2lmX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBwc2lmX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBzaWZfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnBzaWZfZHJpdmVyLCBwc2lmX3Byb2JlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBzaWZfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZwc2lmX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBzaWZfaW5pdCk7Cittb2R1bGVfZXhpdChwc2lmX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJIYW5zLUNocmlzdGlhbiBFZ3R2ZWR0IDxoYW5zLWNocmlzdGlhbi5lZ3R2ZWR0QGF0bWVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQXRtZWwgQVZSMzIgUFNJRiBQUy8yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi14ODZpYTY0aW8uaCBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIteDg2aWE2NGlvLmgKaW5kZXggNjA5MzFhYy4uNWVjZTlmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi14ODZpYTY0aW8uaAorKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXg4NmlhNjRpby5oCkBAIC0zNzAsMTAgKzM3MCwxMCBAQAogCWlmIChwbnBfaXJxX3ZhbGlkKGRldiwwKSkKIAkJaTgwNDJfcG5wX2tiZF9pcnEgPSBwbnBfaXJxKGRldiwgMCk7CiAKLQlzdHJuY3B5KGk4MDQyX3BucF9rYmRfbmFtZSwgZGlkLT5pZCwgc2l6ZW9mKGk4MDQyX3BucF9rYmRfbmFtZSkpOworCXN0cmxjcHkoaTgwNDJfcG5wX2tiZF9uYW1lLCBkaWQtPmlkLCBzaXplb2YoaTgwNDJfcG5wX2tiZF9uYW1lKSk7CiAJaWYgKHN0cmxlbihwbnBfZGV2X25hbWUoZGV2KSkpIHsKLQkJc3RybmNhdChpODA0Ml9wbnBfa2JkX25hbWUsICI6Iiwgc2l6ZW9mKGk4MDQyX3BucF9rYmRfbmFtZSkpOwotCQlzdHJuY2F0KGk4MDQyX3BucF9rYmRfbmFtZSwgcG5wX2Rldl9uYW1lKGRldiksIHNpemVvZihpODA0Ml9wbnBfa2JkX25hbWUpKTsKKwkJc3RybGNhdChpODA0Ml9wbnBfa2JkX25hbWUsICI6Iiwgc2l6ZW9mKGk4MDQyX3BucF9rYmRfbmFtZSkpOworCQlzdHJsY2F0KGk4MDQyX3BucF9rYmRfbmFtZSwgcG5wX2Rldl9uYW1lKGRldiksIHNpemVvZihpODA0Ml9wbnBfa2JkX25hbWUpKTsKIAl9CiAKIAlpODA0Ml9wbnBfa2JkX2RldmljZXMrKzsKQEAgLTM5MSwxMCArMzkxLDEwIEBACiAJaWYgKHBucF9pcnFfdmFsaWQoZGV2LCAwKSkKIAkJaTgwNDJfcG5wX2F1eF9pcnEgPSBwbnBfaXJxKGRldiwgMCk7CiAKLQlzdHJuY3B5KGk4MDQyX3BucF9hdXhfbmFtZSwgZGlkLT5pZCwgc2l6ZW9mKGk4MDQyX3BucF9hdXhfbmFtZSkpOworCXN0cmxjcHkoaTgwNDJfcG5wX2F1eF9uYW1lLCBkaWQtPmlkLCBzaXplb2YoaTgwNDJfcG5wX2F1eF9uYW1lKSk7CiAJaWYgKHN0cmxlbihwbnBfZGV2X25hbWUoZGV2KSkpIHsKLQkJc3RybmNhdChpODA0Ml9wbnBfYXV4X25hbWUsICI6Iiwgc2l6ZW9mKGk4MDQyX3BucF9hdXhfbmFtZSkpOwotCQlzdHJuY2F0KGk4MDQyX3BucF9hdXhfbmFtZSwgcG5wX2Rldl9uYW1lKGRldiksIHNpemVvZihpODA0Ml9wbnBfYXV4X25hbWUpKTsKKwkJc3RybGNhdChpODA0Ml9wbnBfYXV4X25hbWUsICI6Iiwgc2l6ZW9mKGk4MDQyX3BucF9hdXhfbmFtZSkpOworCQlzdHJsY2F0KGk4MDQyX3BucF9hdXhfbmFtZSwgcG5wX2Rldl9uYW1lKGRldiksIHNpemVvZihpODA0Ml9wbnBfYXV4X25hbWUpKTsKIAl9CiAKIAlpODA0Ml9wbnBfYXV4X2RldmljZXMrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vcnBja2JkLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3JwY2tiZC5jCmluZGV4IDQ5Zjg0MzEuLjM0YzU5ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vcnBja2JkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9ycGNrYmQuYwpAQCAtNDUsNiArNDUsNyBAQAogTU9EVUxFX0FVVEhPUigiVm9qdGVjaCBQYXZsaWssIFJ1c3NlbGwgS2luZyIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBY29ybiBSaXNjUEMgUFMvMiBrZXlib2FyZCBjb250cm9sbGVyIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTprYXJ0Iik7CiAKIHN0YXRpYyBpbnQgcnBja2JkX3dyaXRlKHN0cnVjdCBzZXJpbyAqcG9ydCwgdW5zaWduZWQgY2hhciB2YWwpCiB7CkBAIC0xNDAsNiArMTQxLDcgQEAKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHJwY2tiZF9yZW1vdmUpLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJrYXJ0IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdGFibGV0L0tjb25maWcgYi9kcml2ZXJzL2lucHV0L3RhYmxldC9LY29uZmlnCmluZGV4IGQzNzFjMGIuLmVmZmI0OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdGFibGV0L0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC90YWJsZXQvS2NvbmZpZwpAQCAtMjUsMTQgKzI1LDE0IEBACiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWNlY2FkLgogCiBjb25maWcgVEFCTEVUX1VTQl9BSVBURUsKLQl0cmlzdGF0ZSAiQWlwdGVrIDYwMDBVLzgwMDBVIHRhYmxldCBzdXBwb3J0IChVU0IpIgorCXRyaXN0YXRlICJBaXB0ZWsgNjAwMFUvODAwMFUgYW5kIEdlbml1cyBHX1BFTiB0YWJsZXQgc3VwcG9ydCAoVVNCKSIKIAlkZXBlbmRzIG9uIFVTQl9BUkNIX0hBU19IQ0QKIAlzZWxlY3QgVVNCCiAJaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIFVTQiB2ZXJzaW9uIG9mIHRoZSBBaXB0ZWsgNjAwMFUKLQkgIG9yIEFpcHRlayA4MDAwVSB0YWJsZXQuICBNYWtlIHN1cmUgdG8gc2F5IFkgdG8gIk1vdXNlIHN1cHBvcnQiCi0JICAoQ09ORklHX0lOUFVUX01PVVNFREVWKSBhbmQvb3IgIkV2ZW50IGludGVyZmFjZSBzdXBwb3J0IgotCSAgKENPTkZJR19JTlBVVF9FVkRFVikgYXMgd2VsbC4KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBVU0IgdmVyc2lvbiBvZiB0aGUgQWlwdGVrIDYwMDBVLAorCSAgQWlwdGVrIDgwMDBVIG9yIEdlbml1cyBHLVBFTiA1NjAgdGFibGV0LiAgTWFrZSBzdXJlIHRvIHNheSBZIHRvCisJICAiTW91c2Ugc3VwcG9ydCIgKENPTkZJR19JTlBVVF9NT1VTRURFVikgYW5kL29yICJFdmVudCBpbnRlcmZhY2UKKwkgIHN1cHBvcnQiIChDT05GSUdfSU5QVVRfRVZERVYpIGFzIHdlbGwuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFpcHRlay4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdGFibGV0L2FpcHRlay5jIGIvZHJpdmVycy9pbnB1dC90YWJsZXQvYWlwdGVrLmMKaW5kZXggOTQ2ODNmNS4uMWQ3NTlmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90YWJsZXQvYWlwdGVrLmMKKysrIGIvZHJpdmVycy9pbnB1dC90YWJsZXQvYWlwdGVrLmMKQEAgLTE4NCw2ICsxODQsNyBAQAogICovCiAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BSVBURUsJCQkJMHgwOGNhCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfS1lFCQkJCTB4MDQ1OAogI2RlZmluZSBVU0JfUkVRX0dFVF9SRVBPUlQJCQkJMHgwMQogI2RlZmluZSBVU0JfUkVRX1NFVF9SRVBPUlQJCQkJMHgwOQogCkBAIC04MzIsNiArODMzLDcgQEAKIAl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FJUFRFSywgMHgyMil9LAogCXtVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQUlQVEVLLCAweDIzKX0sCiAJe1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BSVBURUssIDB4MjQpfSwKKwl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0tZRSwgMHg1MDAzKX0sCiAJe30KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdGFibGV0L3dhY29tLmggYi9kcml2ZXJzL2lucHV0L3RhYmxldC93YWNvbS5oCmluZGV4IGFjZjk4MzAuLjcwNjYxOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdGFibGV0L3dhY29tLmgKKysrIGIvZHJpdmVycy9pbnB1dC90YWJsZXQvd2Fjb20uaApAQCAtMTAxLDggKzEwMSwxMSBAQAogCWRtYV9hZGRyX3QgZGF0YV9kbWE7CiAJc3RydWN0IGlucHV0X2RldiAqZGV2OwogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7CiAJc3RydWN0IHVyYiAqaXJxOwogCXN0cnVjdCB3YWNvbV93YWMgKiB3YWNvbV93YWM7CisJc3RydWN0IG11dGV4IGxvY2s7CisJaW50IG9wZW46MTsKIAljaGFyIHBoeXNbMzJdOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90YWJsZXQvd2Fjb21fc3lzLmMgYi9kcml2ZXJzL2lucHV0L3RhYmxldC93YWNvbV9zeXMuYwppbmRleCA0MWNhYWVmLi43MWNjMGMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RhYmxldC93YWNvbV9zeXMuYworKysgYi9kcml2ZXJzL2lucHV0L3RhYmxldC93YWNvbV9zeXMuYwpAQCAtNzAsNiArNzAsNyBAQAogCQlpbnB1dF9zeW5jKGdldF9pbnB1dF9kZXYoJndjb21ibykpOwogCiAgZXhpdDoKKwl1c2JfbWFya19sYXN0X2J1c3kod2Fjb20tPnVzYmRldik7CiAJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJldHZhbCkKIAkJZXJyICgiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQgJWQiLApAQCAtMTI0LDEwICsxMjUsMjUgQEAKIHsKIAlzdHJ1Y3Qgd2Fjb20gKndhY29tID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKIAotCXdhY29tLT5pcnEtPmRldiA9IHdhY29tLT51c2JkZXY7Ci0JaWYgKHVzYl9zdWJtaXRfdXJiKHdhY29tLT5pcnEsIEdGUF9LRVJORUwpKQotCQlyZXR1cm4gLUVJTzsKKwltdXRleF9sb2NrKCZ3YWNvbS0+bG9jayk7CiAKKwl3YWNvbS0+aXJxLT5kZXYgPSB3YWNvbS0+dXNiZGV2OworCisJaWYgKHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZSh3YWNvbS0+aW50ZikgPCAwKSB7CisJCW11dGV4X3VubG9jaygmd2Fjb20tPmxvY2spOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAodXNiX3N1Ym1pdF91cmIod2Fjb20tPmlycSwgR0ZQX0tFUk5FTCkpIHsKKwkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKHdhY29tLT5pbnRmKTsKKwkJbXV0ZXhfdW5sb2NrKCZ3YWNvbS0+bG9jayk7CisJCXJldHVybiAtRUlPOworCX0KKworCXdhY29tLT5vcGVuID0gMTsKKwl3YWNvbS0+aW50Zi0+bmVlZHNfcmVtb3RlX3dha2V1cCA9IDE7CisKKwltdXRleF91bmxvY2soJndhY29tLT5sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTM1LDcgKzE1MSwxMSBAQAogewogCXN0cnVjdCB3YWNvbSAqd2Fjb20gPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOwogCisJbXV0ZXhfbG9jaygmd2Fjb20tPmxvY2spOwogCXVzYl9raWxsX3VyYih3YWNvbS0+aXJxKTsKKwl3YWNvbS0+b3BlbiA9IDA7CisJd2Fjb20tPmludGYtPm5lZWRzX3JlbW90ZV93YWtldXAgPSAwOworCW11dGV4X3VubG9jaygmd2Fjb20tPmxvY2spOwogfQogCiB2b2lkIGlucHV0X2Rldl9tbyhzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYsIHN0cnVjdCB3YWNvbV93YWMgKndhY29tX3dhYykKQEAgLTI0Myw2ICsyNjMsOCBAQAogCiAJd2Fjb20tPnVzYmRldiA9IGRldjsKIAl3YWNvbS0+ZGV2ID0gaW5wdXRfZGV2OworCXdhY29tLT5pbnRmID0gaW50ZjsKKwltdXRleF9pbml0KCZ3YWNvbS0+bG9jayk7CiAJdXNiX21ha2VfcGF0aChkZXYsIHdhY29tLT5waHlzLCBzaXplb2Yod2Fjb20tPnBoeXMpKTsKIAlzdHJsY2F0KHdhY29tLT5waHlzLCAiL2lucHV0MCIsIHNpemVvZih3YWNvbS0+cGh5cykpOwogCkBAIC0zMDQsMjMgKzMyNiw1NyBAQAogCiBzdGF0aWMgdm9pZCB3YWNvbV9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewotCXN0cnVjdCB3YWNvbSAqd2Fjb20gPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKKwlzdHJ1Y3Qgd2Fjb20gKndhY29tID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7Ci0JaWYgKHdhY29tKSB7Ci0JCXVzYl9raWxsX3VyYih3YWNvbS0+aXJxKTsKLQkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uod2Fjb20tPmRldik7Ci0JCXVzYl9mcmVlX3VyYih3YWNvbS0+aXJxKTsKLQkJdXNiX2J1ZmZlcl9mcmVlKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksIDEwLCB3YWNvbS0+d2Fjb21fd2FjLT5kYXRhLCB3YWNvbS0+ZGF0YV9kbWEpOwotCQlrZnJlZSh3YWNvbS0+d2Fjb21fd2FjKTsKLQkJa2ZyZWUod2Fjb20pOwotCX0KKworCXVzYl9raWxsX3VyYih3YWNvbS0+aXJxKTsKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSh3YWNvbS0+ZGV2KTsKKwl1c2JfZnJlZV91cmIod2Fjb20tPmlycSk7CisJdXNiX2J1ZmZlcl9mcmVlKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksIDEwLCB3YWNvbS0+d2Fjb21fd2FjLT5kYXRhLCB3YWNvbS0+ZGF0YV9kbWEpOworCWtmcmVlKHdhY29tLT53YWNvbV93YWMpOworCWtmcmVlKHdhY29tKTsKK30KKworc3RhdGljIGludCB3YWNvbV9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlzdHJ1Y3Qgd2Fjb20gKndhY29tID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCW11dGV4X2xvY2soJndhY29tLT5sb2NrKTsKKwl1c2Jfa2lsbF91cmIod2Fjb20tPmlycSk7CisJbXV0ZXhfdW5sb2NrKCZ3YWNvbS0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3YWNvbV9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHdhY29tICp3YWNvbSA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJaW50IHJ2OworCisJbXV0ZXhfbG9jaygmd2Fjb20tPmxvY2spOworCWlmICh3YWNvbS0+b3BlbikKKwkJcnYgPSB1c2Jfc3VibWl0X3VyYih3YWNvbS0+aXJxLCBHRlBfTk9JTyk7CisJZWxzZQorCQlydiA9IDA7CisJbXV0ZXhfdW5sb2NrKCZ3YWNvbS0+bG9jayk7CisKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQgd2Fjb21fcmVzZXRfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXJldHVybiB3YWNvbV9yZXN1bWUoaW50Zik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB3YWNvbV9kcml2ZXIgPSB7CiAJLm5hbWUgPQkJIndhY29tIiwKIAkucHJvYmUgPQl3YWNvbV9wcm9iZSwKIAkuZGlzY29ubmVjdCA9CXdhY29tX2Rpc2Nvbm5lY3QsCisJLnN1c3BlbmQgPQl3YWNvbV9zdXNwZW5kLAorCS5yZXN1bWUgPQl3YWNvbV9yZXN1bWUsCisJLnJlc2V0X3Jlc3VtZSA9CXdhY29tX3Jlc2V0X3Jlc3VtZSwKKwkuc3VwcG9ydHNfYXV0b3N1c3BlbmQgPSAxLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgd2Fjb21faW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90YWJsZXQvd2Fjb21fd2FjLmMgYi9kcml2ZXJzL2lucHV0L3RhYmxldC93YWNvbV93YWMuYwppbmRleCBmZmUzMzg0Li4xOTI1MTNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RhYmxldC93YWNvbV93YWMuYworKysgYi9kcml2ZXJzL2lucHV0L3RhYmxldC93YWNvbV93YWMuYwpAQCAtNjQ5LDYgKzY0OSw3IEBACiAJeyAiV2Fjb20gSW50dW9zMyA2eDExIiwgIDEwLCA1NDIwNCwgMzE3NTAsIDEwMjMsIDYzLCBJTlRVT1MzIH0sCiAJeyAiV2Fjb20gSW50dW9zMyA0eDYiLCAgIDEwLCAzMTQ5NiwgMTk2ODUsIDEwMjMsIDYzLCBJTlRVT1MzUyB9LAogCXsgIldhY29tIENpbnRpcSAyMVVYIiwgICAxMCwgODcyMDAsIDY1NjAwLCAxMDIzLCA2MywgQ0lOVElRIH0sCisJeyAiV2Fjb20gQ2ludGlxIDIwV1NYIiwgIDEwLCA4NjY4MCwgNTQxODAsIDEwMjMsIDYzLCBXQUNPTV9CRUUgfSwKIAl7ICJXYWNvbSBDaW50aXEgMTJXWCIsICAgMTAsIDUzMDIwLCAzMzQ0MCwgMTAyMywgNjMsIFdBQ09NX0JFRSB9LAogCXsgIldhY29tIEludHVvczIgNng4IiwgICAxMCwgMjAzMjAsIDE2MjQwLCAxMDIzLCAzMSwgSU5UVU9TIH0sCiAJeyB9CkBAIC03MDIsNiArNzAzLDcgQEAKIAl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9XQUNPTSwgMHhCNSkgfSwKIAl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9XQUNPTSwgMHhCNykgfSwKIAl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9XQUNPTSwgMHgzRikgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9XQUNPTSwgMHhDNSkgfSwKIAl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9XQUNPTSwgMHhDNikgfSwKIAl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9XQUNPTSwgMHg0NykgfSwKIAl7IH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vS2NvbmZpZwppbmRleCA5MGU4ZTkyLi41NjVlYzcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9LY29uZmlnCkBAIC0xODUsNiArMTg1LDU5IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB1Y2IxNDAwX3RzLgogCitjb25maWcgVE9VQ0hTQ1JFRU5fV005N1hYCisJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIFdNOTd4eCBBQzk3IHRvdWNoc2NyZWVuIGNvbnRyb2xsZXJzIgorCWRlcGVuZHMgb24gQUM5N19CVVMKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNOTd4eAorCSAgdG91Y2hzY3JlZW4gY29ubmVjdGVkIHRvIHlvdXIgc3lzdGVtLiBOb3RlIHRoYXQgdGhpcyBvcHRpb24KKwkgIG9ubHkgZW5hYmxlcyBjb3JlIGRyaXZlciwgeW91IHdpbGwgYWxzbyBuZWVkIHRvIHNlbGVjdAorCSAgc3VwcG9ydCBmb3IgYXBwcm9wcmlhdGUgY2hpcCBiZWxvdy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgd205N3h4LXRzLgorCitjb25maWcgVE9VQ0hTQ1JFRU5fV005NzA1CisJYm9vbCAiV005NzA1IFRvdWNoc2NyZWVuIGludGVyZmFjZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVE9VQ0hTQ1JFRU5fV005N1hYCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTk3MDUKKwkgIHRvdWNoc2NyZWVuIGNvbnRyb2xsZXIgY29ubmVjdGVkIHRvIHlvdXIgc3lzdGVtLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgVE9VQ0hTQ1JFRU5fV005NzEyCisJYm9vbCAiV005NzEyIFRvdWNoc2NyZWVuIGludGVyZmFjZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVE9VQ0hTQ1JFRU5fV005N1hYCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTk3MTIKKwkgIHRvdWNoc2NyZWVuIGNvbnRyb2xsZXIgY29ubmVjdGVkIHRvIHlvdXIgc3lzdGVtLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgVE9VQ0hTQ1JFRU5fV005NzEzCisJYm9vbCAiV005NzEzIFRvdWNoc2NyZWVuIGludGVyZmFjZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVE9VQ0hTQ1JFRU5fV005N1hYCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTk3MTMgdG91Y2hzY3JlZW4KKwkgIGNvbnRyb2xsZXIgY29ubmVjdGVkIHRvIHlvdXIgc3lzdGVtLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgVE9VQ0hTQ1JFRU5fV005N1hYX01BSU5TVE9ORQorCXRyaXN0YXRlICJXTTk3eHggTWFpbnN0b25lIGFjY2VsZXJhdGVkIHRvdWNoIgorCWRlcGVuZHMgb24gVE9VQ0hTQ1JFRU5fV005N1hYICYmIEFSQ0hfUFhBCisJaGVscAorCSAgU2F5IFkgaGVyZSBmb3Igc3VwcG9ydCBmb3Igc3RyZWFtaW5nIG1vZGUgd2l0aCBXTTk3eHggdG91Y2hzY3JlZW5zCisJICBvbiBNYWluc3RvbmUgc3lzdGVtcy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbWFpbnN0b25lLXdtOTd4eC4KKwogY29uZmlnIFRPVUNIU0NSRUVOX1VTQl9DT01QT1NJVEUKIAl0cmlzdGF0ZSAiVVNCIFRvdWNoc2NyZWVuIERyaXZlciIKIAlkZXBlbmRzIG9uIFVTQl9BUkNIX0hBU19IQ0QKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vTWFrZWZpbGUgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL01ha2VmaWxlCmluZGV4IDM1ZDQwOTcuLjNjMDk2ZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9NYWtlZmlsZQpAQCAtNCw2ICs0LDggQEAKIAogIyBFYWNoIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGVuYWJsZXMgYSBsaXN0IG9mIGZpbGVzLgogCit3bTk3eHgtdHMteSA6PSB3bTk3eHgtY29yZS5vCisKIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9BRFM3ODQ2KQkrPSBhZHM3ODQ2Lm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9CSVRTWSkJCSs9IGgzNjAwX3RzX2lucHV0Lm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9DT1JHSSkJCSs9IGNvcmdpX3RzLm8KQEAgLTE5LDMgKzIxLDggQEAKIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFJJR0hUKQkrPSB0b3VjaHJpZ2h0Lm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFdJTikJKz0gdG91Y2h3aW4ubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1VDQjE0MDApCSs9IHVjYjE0MDBfdHMubworb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1dNOTdYWCkJKz0gd205N3h4LXRzLm8KK3dtOTd4eC10cy0kKENPTkZJR19UT1VDSFNDUkVFTl9XTTk3MDUpCSs9IHdtOTcwNS5vCit3bTk3eHgtdHMtJChDT05GSUdfVE9VQ0hTQ1JFRU5fV005NzEyKQkrPSB3bTk3MTIubword205N3h4LXRzLSQoQ09ORklHX1RPVUNIU0NSRUVOX1dNOTcxMykJKz0gd205NzEzLm8KK29iai0kKENPTkZJR19UT1VDSFNDUkVFTl9XTTk3WFhfTUFJTlNUT05FKQkrPSBtYWluc3RvbmUtd205N3h4Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMKaW5kZXggMzk1NzNiOS4uOTA3YTQ1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMKQEAgLTgwLDYgKzgwLDcgQEAKICNlbmRpZgogCiAJdTE2CQkJbW9kZWw7CisJdTE2CQkJdnJlZl9tdjsKIAl1MTYJCQl2cmVmX2RlbGF5X3VzZWNzOwogCXUxNgkJCXhfcGxhdGVfb2htczsKIAl1MTYJCQlwcmVzc3VyZV9tYXg7CkBAIC0xNzcsOSArMTc4LDYgQEAKICAqIFRoZSByYW5nZSBpcyBHTkQuLnZSRUYuIFRoZSBhZHM3ODQzIGFuZCBhZHM3ODM1IG11c3QgdXNlIGV4dGVybmFsIHZSRUY7CiAgKiBhZHM3ODQ2IGxldHMgdGhhdCBwaW4gYmUgdW5jb25uZWN0ZWQsIHRvIHVzZSBpbnRlcm5hbCB2UkVGLgogICovCi1zdGF0aWMgdW5zaWduZWQgdlJFRl9tVjsKLW1vZHVsZV9wYXJhbSh2UkVGX21WLCB1aW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0ModlJFRl9tViwgImV4dGVybmFsIHZSRUYgdm9sdGFnZSwgaW4gbWlsbGlWb2x0cyIpOwogCiBzdHJ1Y3Qgc2VyX3JlcSB7CiAJdTgJCQlyZWZfb247CkBAIC0yMDYsNyArMjA0LDYgQEAKIAlzdHJ1Y3QgYWRzNzg0NgkJKnRzID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IHNlcl9yZXEJCSpyZXEgPSBremFsbG9jKHNpemVvZiAqcmVxLCBHRlBfS0VSTkVMKTsKIAlpbnQJCQlzdGF0dXM7Ci0JaW50CQkJdW5pbml0aWFsaXplZF92YXIoc2FtcGxlKTsKIAlpbnQJCQl1c2VfaW50ZXJuYWw7CiAKIAlpZiAoIXJlcSkKQEAgLTI2MywxMyArMjYwLDEzIEBACiAKIAlpZiAoc3RhdHVzID09IDApIHsKIAkJLyogb24td2lyZSBpcyBhIG11c3QtaWdub3JlIGJpdCwgYSBCRTEyIHZhbHVlLCB0aGVuIHBhZGRpbmcgKi8KLQkJc2FtcGxlID0gYmUxNl90b19jcHUocmVxLT5zYW1wbGUpOwotCQlzYW1wbGUgPSBzYW1wbGUgPj4gMzsKLQkJc2FtcGxlICY9IDB4MGZmZjsKKwkJc3RhdHVzID0gYmUxNl90b19jcHUocmVxLT5zYW1wbGUpOworCQlzdGF0dXMgPSBzdGF0dXMgPj4gMzsKKwkJc3RhdHVzICY9IDB4MGZmZjsKIAl9CiAKIAlrZnJlZShyZXEpOwotCXJldHVybiBzdGF0dXMgPyBzdGF0dXMgOiBzYW1wbGU7CisJcmV0dXJuIHN0YXR1czsKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX0hXTU9OKSB8fCBkZWZpbmVkKENPTkZJR19IV01PTl9NT0RVTEUpCkBAIC0zMTAsNyArMzA3LDcgQEAKIAl1bnNpZ25lZCByZXR2YWwgPSB2OwogCiAJLyogZXh0ZXJuYWwgcmVzaXN0b3JzIG1heSBzY2FsZSB2QVVYIGludG8gMC4udlJFRiAqLwotCXJldHZhbCAqPSB2UkVGX21WOworCXJldHZhbCAqPSB0cy0+dnJlZl9tdjsKIAlyZXR2YWwgPSByZXR2YWwgPj4gMTI7CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTM2OCwxNCArMzY1LDE0IEBACiAJLyogaHdtb24gc2Vuc29ycyBuZWVkIGEgcmVmZXJlbmNlIHZvbHRhZ2UgKi8KIAlzd2l0Y2ggKHRzLT5tb2RlbCkgewogCWNhc2UgNzg0NjoKLQkJaWYgKCF2UkVGX21WKSB7CisJCWlmICghdHMtPnZyZWZfbXYpIHsKIAkJCWRldl9kYmcoJnNwaS0+ZGV2LCAiYXNzdW1pbmcgMi41ViBpbnRlcm5hbCB2UkVGXG4iKTsKLQkJCXZSRUZfbVYgPSAyNTAwOworCQkJdHMtPnZyZWZfbXYgPSAyNTAwOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgNzg0NToKIAljYXNlIDc4NDM6Ci0JCWlmICghdlJFRl9tVikgeworCQlpZiAoIXRzLT52cmVmX212KSB7CiAJCQlkZXZfd2Fybigmc3BpLT5kZXYsCiAJCQkJImV4dGVybmFsIHZSRUYgZm9yIEFEUyVkIG5vdCBzcGVjaWZpZWRcbiIsCiAJCQkJdHMtPm1vZGVsKTsKQEAgLTg2OCw2ICs4NjUsNyBAQAogCiAJdHMtPnNwaSA9IHNwaTsKIAl0cy0+aW5wdXQgPSBpbnB1dF9kZXY7CisJdHMtPnZyZWZfbXYgPSBwZGF0YS0+dnJlZl9tdjsKIAogCWhydGltZXJfaW5pdCgmdHMtPnRpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9SRUwpOwogCXRzLT50aW1lci5mdW5jdGlvbiA9IGFkczc4NDZfdGltZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2NvcmdpX3RzLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2NvcmdpX3RzLmMKaW5kZXggYTIyNTc2Ny4uNGU5ZDhlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9jb3JnaV90cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vY29yZ2lfdHMuYwpAQCAtMzYyLDYgKzM2Miw3IEBACiAJLnJlc3VtZQkJPSBjb3JnaXRzX3Jlc3VtZSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAiY29yZ2ktdHMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAogfTsKIApAQCAtMzgxLDMgKzM4Miw0IEBACiBNT0RVTEVfQVVUSE9SKCJSaWNoYXJkIFB1cmRpZSA8cnB1cmRpZUBycHN5cy5uZXQ+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkNvcmdpIFRvdWNoU2NyZWVuIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpjb3JnaS10cyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9qb3JuYWRhNzIwX3RzLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2pvcm5hZGE3MjBfdHMuYwppbmRleCA0MmExYzlhLi43NDIyNDIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2pvcm5hZGE3MjBfdHMuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2pvcm5hZGE3MjBfdHMuYwpAQCAtMTYwLDExICsxNjAsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogd29yayB3aXRoIGhvdHBsdWcgYW5kIGNvbGRwbHVnICovCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmpvcm5hZGFfdHMiKTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgam9ybmFkYTcyMF90c19kcml2ZXIgPSB7CiAJLnByb2JlCQk9IGpvcm5hZGE3MjBfdHNfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChqb3JuYWRhNzIwX3RzX3JlbW92ZSksCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gImpvcm5hZGFfdHMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9tYWluc3RvbmUtd205N3h4LmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL21haW5zdG9uZS13bTk3eHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzlmMDI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9tYWluc3RvbmUtd205N3h4LmMKQEAgLTAsMCArMSwzMDIgQEAKKy8qCisgKiBtYWluc3RvbmUtd205N3h4LmMgIC0tICBNYWluc3RvbmUgQ29udGludW91cyBUb3VjaCBzY3JlZW4gZHJpdmVyIGZvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgV29sZnNvbiBXTTk3eHggQUM5NyBDb2RlY3MuCisgKgorICogQ29weXJpZ2h0IDIwMDQsIDIwMDcgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqIEF1dGhvcjogTGlhbSBHaXJkd29vZAorICogICAgICAgICBsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20gb3IgbGludXhAd29sZnNvbm1pY3JvLmNvbQorICogUGFydHMgQ29weXJpZ2h0IDogSWFuIE1vbHRvbiA8c3B5cm9AZjJzLmNvbT4KKyAqICAgICAgICAgICAgICAgICAgIEFuZHJldyBaYWJvbG90bnkgPHphcEBob21lbGluay5ydT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBOb3RlczoKKyAqICAgICBUaGlzIGlzIGEgd205N3h4IGV4dGVuZGVkIHRvdWNoIGRyaXZlciB0byBjYXB0dXJlIHRvdWNoCisgKiAgICAgZGF0YSBpbiBhIGNvbnRpbnVvdXMgbWFubmVyIG9uIHRoZSBJbnRlbCBYU2NhbGUgYXJjaGljdGVjdHVyZQorICoKKyAqICBGZWF0dXJlczoKKyAqICAgICAgIC0gY29kZWNzIHN1cHBvcnRlZDotIFdNOTcwNSwgV005NzEyLCBXTTk3MTMKKyAqICAgICAgIC0gcHJvY2Vzc29ycyBzdXBwb3J0ZWQ6LSBJbnRlbCBYU2NhbGUgUFhBMjV4LCBQWEEyNngsIFBYQTI3eAorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvd205N3h4Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9weGEtcmVncy5oPgorCisjZGVmaW5lIFZFUlNJT04JCSIwLjEzIgorCitzdHJ1Y3QgY29udGludW91cyB7CisJdTE2IGlkOyAgICAvKiBjb2RlYyBpZCAqLworCXU4IGNvZGU7ICAgLyogY29udGludW91cyBjb2RlICovCisJdTggcmVhZHM7ICAvKiBudW1iZXIgb2YgY29vcmQgcmVhZHMgcGVyIHJlYWQgY3ljbGUgKi8KKwl1MzIgc3BlZWQ7IC8qIG51bWJlciBvZiBjb29yZHMgcGVyIHNlY29uZCAqLworfTsKKworI2RlZmluZSBXTV9SRUFEUyhzcCkgKChzcCAvIEhaKSArIDEpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29udGludW91cyBjaW5mb1tdID0geworCXtXTTk3MDVfSUQyLCAwLCBXTV9SRUFEUyg5NCksIDk0fSwKKwl7V005NzA1X0lEMiwgMSwgV01fUkVBRFMoMTg4KSwgMTg4fSwKKwl7V005NzA1X0lEMiwgMiwgV01fUkVBRFMoMzc1KSwgMzc1fSwKKwl7V005NzA1X0lEMiwgMywgV01fUkVBRFMoNzUwKSwgNzUwfSwKKwl7V005NzEyX0lEMiwgMCwgV01fUkVBRFMoOTQpLCA5NH0sCisJe1dNOTcxMl9JRDIsIDEsIFdNX1JFQURTKDE4OCksIDE4OH0sCisJe1dNOTcxMl9JRDIsIDIsIFdNX1JFQURTKDM3NSksIDM3NX0sCisJe1dNOTcxMl9JRDIsIDMsIFdNX1JFQURTKDc1MCksIDc1MH0sCisJe1dNOTcxM19JRDIsIDAsIFdNX1JFQURTKDk0KSwgOTR9LAorCXtXTTk3MTNfSUQyLCAxLCBXTV9SRUFEUygxMjApLCAxMjB9LAorCXtXTTk3MTNfSUQyLCAyLCBXTV9SRUFEUygxNTQpLCAxNTR9LAorCXtXTTk3MTNfSUQyLCAzLCBXTV9SRUFEUygxODgpLCAxODh9LAorfTsKKworLyogY29udGludW91cyBzcGVlZCBpbmRleCAqLworc3RhdGljIGludCBzcF9pZHg7CitzdGF0aWMgdTE2IGxhc3QsIHRyaWVzOworCisvKgorICogUGVuIHNhbXBsaW5nIGZyZXF1ZW5jeSAoSHopIGluIGNvbnRpbnVvdXMgbW9kZS4KKyAqLworc3RhdGljIGludCBjb250X3JhdGUgPSAyMDA7Cittb2R1bGVfcGFyYW0oY29udF9yYXRlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhjb250X3JhdGUsICJTYW1wbGluZyByYXRlIGluIGNvbnRpbnVvdXMgbW9kZSAoSHopIik7CisKKy8qCisgKiBQZW4gZG93biBkZXRlY3Rpb24uCisgKgorICogVGhpcyBkcml2ZXIgY2FuIGVpdGhlciBwb2xsIG9yIHVzZSBhbiBpbnRlcnJ1cHQgdG8gaW5kaWNhdGUgYSBwZW4gZG93bgorICogZXZlbnQuIElmIHRoZSBpcnEgcmVxdWVzdCBmYWlscyB0aGVuIGl0IHdpbGwgZmFsbCBiYWNrIHRvIHBvbGxpbmcgbW9kZS4KKyAqLworc3RhdGljIGludCBwZW5faW50OworbW9kdWxlX3BhcmFtKHBlbl9pbnQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBlbl9pbnQsICJQZW4gZG93biBkZXRlY3Rpb24gKDEgPSBpbnRlcnJ1cHQsIDAgPSBwb2xsaW5nKSIpOworCisvKgorICogUHJlc3N1cmUgcmVhZGJhY2suCisgKgorICogU2V0IHRvIDEgdG8gcmVhZCBiYWNrIHBlbiBkb3duIHByZXNzdXJlCisgKi8KK3N0YXRpYyBpbnQgcHJlc3N1cmU7Cittb2R1bGVfcGFyYW0ocHJlc3N1cmUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHByZXNzdXJlLCAiUHJlc3N1cmUgcmVhZGJhY2sgKDEgPSBwcmVzc3VyZSwgMCA9IG5vIHByZXNzdXJlKSIpOworCisvKgorICogQUM5NyB0b3VjaCBkYXRhIHNsb3QuCisgKgorICogVG91Y2ggc2NyZWVuIHJlYWRiYWNrIGRhdGEgYWM5NyBzbG90CisgKi8KK3N0YXRpYyBpbnQgYWM5N190b3VjaF9zbG90ID0gNTsKK21vZHVsZV9wYXJhbShhYzk3X3RvdWNoX3Nsb3QsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGFjOTdfdG91Y2hfc2xvdCwgIlRvdWNoIHNjcmVlbiBkYXRhIHNsb3QgQUM5NyBudW1iZXIiKTsKKworCisvKiBmbHVzaCBBQzk3IHNsb3QgNSBGSUZPIG9uIHB4YSBtYWNoaW5lcyAqLworI2lmZGVmIENPTkZJR19QWEEyN3gKK3N0YXRpYyB2b2lkIHdtOTd4eF9hY2NfcGVuX3VwKHN0cnVjdCB3bTk3eHggKndtKQoreworCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOworCisJd2hpbGUgKE1JU1IgJiAoMSA8PCAyKSkKKwkJTU9EUjsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCB3bTk3eHhfYWNjX3Blbl91cChzdHJ1Y3Qgd205N3h4ICp3bSkKK3sKKwlpbnQgY291bnQgPSAxNjsKKwlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKKworCXdoaWxlIChjb3VudCA8IDE2KSB7CisJCU1PRFI7CisJCWNvdW50LS07CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgd205N3h4X2FjY19wZW5fZG93bihzdHJ1Y3Qgd205N3h4ICp3bSkKK3sKKwl1MTYgeCwgeSwgcCA9IDB4MTAwIHwgV005N1hYX0FEQ1NFTF9QUkVTOworCWludCByZWFkcyA9IDA7CisKKwkvKiBXaGVuIHRoZSBBQzk3IHF1ZXVlIGhhcyBiZWVuIGRyYWluZWQgd2UgbmVlZCB0byBhbGxvdyB0aW1lCisJICogdG8gYnVmZmVyIHVwIHNhbXBsZXMgb3RoZXJ3aXNlIHdlIGVuZCB1cCBzcGlubmluZyBwb2xsaW5nCisJICogZm9yIHNhbXBsZXMuICBUaGUgY29udHJvbGxlciBjYW4ndCBoYXZlIGEgc3VpdGFibHkgbG93CisJICogdGhyZWFzaG9sZCBzZXQgdG8gdXNlIHRoZSBub3RpZmljYXRpb25zIGl0IGdpdmVzLgorCSAqLworCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOworCisJaWYgKHRyaWVzID4gNSkgeworCQl0cmllcyA9IDA7CisJCXJldHVybiBSQ19QRU5VUDsKKwl9CisKKwl4ID0gTU9EUjsKKwlpZiAoeCA9PSBsYXN0KSB7CisJCXRyaWVzKys7CisJCXJldHVybiBSQ19BR0FJTjsKKwl9CisJbGFzdCA9IHg7CisJZG8geworCQlpZiAocmVhZHMpCisJCQl4ID0gTU9EUjsKKwkJeSA9IE1PRFI7CisJCWlmIChwcmVzc3VyZSkKKwkJCXAgPSBNT0RSOworCisJCS8qIGFyZSBzYW1wbGVzIHZhbGlkICovCisJCWlmICgoeCAmIFdNOTdYWF9BRENTUkNfTUFTSykgIT0gV005N1hYX0FEQ1NFTF9YIHx8CisJCSAgICAoeSAmIFdNOTdYWF9BRENTUkNfTUFTSykgIT0gV005N1hYX0FEQ1NFTF9ZIHx8CisJCSAgICAocCAmIFdNOTdYWF9BRENTUkNfTUFTSykgIT0gV005N1hYX0FEQ1NFTF9QUkVTKQorCQkJZ290byB1cDsKKworCQkvKiBjb29yZGluYXRlIGlzIGdvb2QgKi8KKwkJdHJpZXMgPSAwOworCQlpbnB1dF9yZXBvcnRfYWJzKHdtLT5pbnB1dF9kZXYsIEFCU19YLCB4ICYgMHhmZmYpOworCQlpbnB1dF9yZXBvcnRfYWJzKHdtLT5pbnB1dF9kZXYsIEFCU19ZLCB5ICYgMHhmZmYpOworCQlpbnB1dF9yZXBvcnRfYWJzKHdtLT5pbnB1dF9kZXYsIEFCU19QUkVTU1VSRSwgcCAmIDB4ZmZmKTsKKwkJaW5wdXRfc3luYyh3bS0+aW5wdXRfZGV2KTsKKwkJcmVhZHMrKzsKKwl9IHdoaWxlIChyZWFkcyA8IGNpbmZvW3NwX2lkeF0ucmVhZHMpOwordXA6CisJcmV0dXJuIFJDX1BFTkRPV04gfCBSQ19BR0FJTjsKK30KKworc3RhdGljIGludCB3bTk3eHhfYWNjX3N0YXJ0dXAoc3RydWN0IHdtOTd4eCAqd20pCit7CisJaW50IGlkeCA9IDA7CisKKwkvKiBjaGVjayB3ZSBoYXZlIGEgY29kZWMgKi8KKwlpZiAod20tPmFjOTcgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBHbyB5b3UgYmlnIHJlZCBmaXJlIGVuZ2luZSAqLworCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShjaW5mbyk7IGlkeCsrKSB7CisJCWlmICh3bS0+aWQgIT0gY2luZm9baWR4XS5pZCkKKwkJCWNvbnRpbnVlOworCQlzcF9pZHggPSBpZHg7CisJCWlmIChjb250X3JhdGUgPD0gY2luZm9baWR4XS5zcGVlZCkKKwkJCWJyZWFrOworCX0KKwl3bS0+YWNjX3JhdGUgPSBjaW5mb1tzcF9pZHhdLmNvZGU7CisJd20tPmFjY19zbG90ID0gYWM5N190b3VjaF9zbG90OworCWRldl9pbmZvKHdtLT5kZXYsCisJCSAibWFpbnN0b25lIGFjY2VsZXJhdGVkIHRvdWNoc2NyZWVuIGRyaXZlciwgJWQgc2FtcGxlcy9zZWNcbiIsCisJCSBjaW5mb1tzcF9pZHhdLnNwZWVkKTsKKworCS8qIGNvZGVjIHNwZWNpZmljIGlycSBjb25maWcgKi8KKwlpZiAocGVuX2ludCkgeworCQlzd2l0Y2ggKHdtLT5pZCkgeworCQljYXNlIFdNOTcwNV9JRDI6CisJCQl3bS0+cGVuX2lycSA9IElSUV9HUElPKDQpOworCQkJc2V0X2lycV90eXBlKElSUV9HUElPKDQpLCBJUlFUX0JPVEhFREdFKTsKKwkJCWJyZWFrOworCQljYXNlIFdNOTcxMl9JRDI6CisJCWNhc2UgV005NzEzX0lEMjoKKwkJCS8qIGVuYWJsZSBwZW4gZG93biBpbnRlcnJ1cHQgKi8KKwkJCS8qIHVzZSBQRU5fRE9XTiBHUElPIDEzIHRvIGFzc2VydCBJUlEgb24gR1BJTyBsaW5lIDIgKi8KKwkJCXdtLT5wZW5faXJxID0gTUFJTlNUT05FX0FDOTdfSVJROworCQkJd205N3h4X2NvbmZpZ19ncGlvKHdtLCBXTTk3WFhfR1BJT18xMywgV005N1hYX0dQSU9fSU4sCisJCQkJCSAgIFdNOTdYWF9HUElPX1BPTF9ISUdILAorCQkJCQkgICBXTTk3WFhfR1BJT19TVElDS1ksCisJCQkJCSAgIFdNOTdYWF9HUElPX1dBS0UpOworCQkJd205N3h4X2NvbmZpZ19ncGlvKHdtLCBXTTk3WFhfR1BJT18yLCBXTTk3WFhfR1BJT19PVVQsCisJCQkJCSAgIFdNOTdYWF9HUElPX1BPTF9ISUdILAorCQkJCQkgICBXTTk3WFhfR1BJT19OT1RTVElDS1ksCisJCQkJCSAgIFdNOTdYWF9HUElPX05PV0FLRSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIod20tPmRldiwKKwkJCQkicGVuIGRvd24gaXJxIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2VcbiIpOworCQkJcGVuX2ludCA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3bTk3eHhfYWNjX3NodXRkb3duKHN0cnVjdCB3bTk3eHggKndtKQoreworCS8qIGNvZGVjIHNwZWNpZmljIGRlY29uZmlnICovCisJaWYgKHBlbl9pbnQpIHsKKwkJc3dpdGNoICh3bS0+aWQgJiAweGZmZmYpIHsKKwkJY2FzZSBXTTk3MDVfSUQyOgorCQkJd20tPnBlbl9pcnEgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgV005NzEyX0lEMjoKKwkJY2FzZSBXTTk3MTNfSUQyOgorCQkJLyogZGlzYWJsZSBpbnRlcnJ1cHQgKi8KKwkJCXdtLT5wZW5faXJxID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCB3bTk3eHhfaXJxX2VuYWJsZShzdHJ1Y3Qgd205N3h4ICp3bSwgaW50IGVuYWJsZSkKK3sKKwlpZiAoZW5hYmxlKQorCQllbmFibGVfaXJxKHdtLT5wZW5faXJxKTsKKwllbHNlCisJCWRpc2FibGVfaXJxKHdtLT5wZW5faXJxKTsKK30KKworc3RhdGljIHN0cnVjdCB3bTk3eHhfbWFjaF9vcHMgbWFpbnN0b25lX21hY2hfb3BzID0geworCS5hY2NfZW5hYmxlZCA9IDEsCisJLmFjY19wZW5fdXAgPSB3bTk3eHhfYWNjX3Blbl91cCwKKwkuYWNjX3Blbl9kb3duID0gd205N3h4X2FjY19wZW5fZG93biwKKwkuYWNjX3N0YXJ0dXAgPSB3bTk3eHhfYWNjX3N0YXJ0dXAsCisJLmFjY19zaHV0ZG93biA9IHdtOTd4eF9hY2Nfc2h1dGRvd24sCisJLmlycV9lbmFibGUgPSB3bTk3eHhfaXJxX2VuYWJsZSwKKwkuaXJxX2dwaW8gPSBXTTk3WFhfR1BJT18yLAorfTsKKworc3RhdGljIGludCBtYWluc3RvbmVfd205N3h4X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHdtOTd4eCAqd20gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJldHVybiB3bTk3eHhfcmVnaXN0ZXJfbWFjaF9vcHMod20sICZtYWluc3RvbmVfbWFjaF9vcHMpOworfQorCitzdGF0aWMgaW50IG1haW5zdG9uZV93bTk3eHhfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHdtOTd4eCAqd20gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXdtOTd4eF91bnJlZ2lzdGVyX21hY2hfb3BzKHdtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWFpbnN0b25lX3dtOTd4eF9kcml2ZXIgPSB7CisJLnByb2JlID0gbWFpbnN0b25lX3dtOTd4eF9wcm9iZSwKKwkucmVtb3ZlID0gbWFpbnN0b25lX3dtOTd4eF9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAid205N3h4LXRvdWNoIiwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgbWFpbnN0b25lX3dtOTd4eF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbWFpbnN0b25lX3dtOTd4eF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWFpbnN0b25lX3dtOTd4eF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1haW5zdG9uZV93bTk3eHhfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobWFpbnN0b25lX3dtOTd4eF9pbml0KTsKK21vZHVsZV9leGl0KG1haW5zdG9uZV93bTk3eHhfZXhpdCk7CisKKy8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLworTU9EVUxFX0FVVEhPUigiTGlhbSBHaXJkd29vZCA8bGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJ3bTk3eHggY29udGludW91cyB0b3VjaCBkcml2ZXIgZm9yIG1haW5zdG9uZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi91Y2IxNDAwX3RzLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3VjYjE0MDBfdHMuYwppbmRleCA2MDdmOTkzLi5iY2UwMThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3VjYjE0MDBfdHMuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3VjYjE0MDBfdHMuYwpAQCAtNDI3LDEwICs0MjcsNiBAQAogCXVuc2lnbmVkIGxvbmcgbWFzaywgdGltZW91dDsKIAogCW1hc2sgPSBwcm9iZV9pcnFfb24oKTsKLQlpZiAoIW1hc2spIHsKLQkJcHJvYmVfaXJxX29mZihtYXNrKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9CiAKIAkvKiBFbmFibGUgdGhlIEFEQyBpbnRlcnJ1cHQuICovCiAJdWNiMTQwMF9yZWdfd3JpdGUodWNiLCBVQ0JfSUVfUklTLCBVQ0JfSUVfQURDKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdXNidG91Y2hzY3JlZW4uYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdXNidG91Y2hzY3JlZW4uYwppbmRleCA2M2Y5NjY0Li4zYTBhOGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3VzYnRvdWNoc2NyZWVuLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi91c2J0b3VjaHNjcmVlbi5jCkBAIC0zOTYsOSArMzk2LDEyIEBACiBzdGF0aWMgaW50IGRtY190c2MxMF9pbml0KHN0cnVjdCB1c2J0b3VjaF91c2IgKnVzYnRvdWNoKQogewogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSB1c2J0b3VjaC0+dWRldjsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGNoYXIgYnVmWzJdOworCWludCByZXQgPSAtRU5PTUVNOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKIAorCWJ1ZiA9IGttYWxsb2MoMiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCWdvdG8gZXJyX25vYnVmOwogCS8qIHJlc2V0ICovCiAJYnVmWzBdID0gYnVmWzFdID0gMHhGRjsKIAlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2JfcmN2Y3RybHBpcGUgKGRldiwgMCksCkBAIC00MDYsOSArNDA5LDExIEBACiAJICAgICAgICAgICAgICAgICAgICAgIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAogCSAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBidWYsIDIsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKIAlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQlpZiAoYnVmWzBdICE9IDB4MDYgfHwgYnVmWzFdICE9IDB4MDApCi0JCXJldHVybiAtRU5PREVWOworCQlnb3RvIGVycl9vdXQ7CisJaWYgKGJ1ZlswXSAhPSAweDA2IHx8IGJ1ZlsxXSAhPSAweDAwKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CiAKIAkvKiBzZXQgY29vcmRpbmF0ZSBvdXRwdXQgcmF0ZSAqLwogCWJ1ZlswXSA9IGJ1ZlsxXSA9IDB4RkY7CkBAIC00MTcsMjAgKzQyMiwyMiBAQAogCSAgICAgICAgICAgICAgICAgICAgICBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKIAkgICAgICAgICAgICAgICAgICAgICAgVFNDMTBfUkFURV8xNTAsIDAsIGJ1ZiwgMiwgVVNCX0NUUkxfU0VUX1RJTUVPVVQpOwogCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCQlnb3RvIGVycl9vdXQ7CiAJaWYgKChidWZbMF0gIT0gMHgwNiB8fCBidWZbMV0gIT0gMHgwMCkgJiYKLQkgICAgKGJ1ZlswXSAhPSAweDE1IHx8IGJ1ZlsxXSAhPSAweDAxKSkKLQkJcmV0dXJuIC1FTk9ERVY7CisJICAgIChidWZbMF0gIT0gMHgxNSB8fCBidWZbMV0gIT0gMHgwMSkpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0OworCX0KIAogCS8qIHN0YXJ0IHNlbmRpbmcgZGF0YSAqLwogCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9yY3ZjdHJscGlwZSAoZGV2LCAwKSwKIAkgICAgICAgICAgICAgICAgICAgICAgVFNDMTBfQ01EX0RBVEExLAogCSAgICAgICAgICAgICAgICAgICAgICBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCiAJICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIE5VTEwsIDAsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiAwOworZXJyX291dDoKKwlrZnJlZShidWYpOworZXJyX25vYnVmOgorCXJldHVybiByZXQ7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi93bTk3MDUuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vd205NzA1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc4ZTFhMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vd205NzA1LmMKQEAgLTAsMCArMSwzNTMgQEAKKy8qCisgKiB3bTk3MDUuYyAgLS0gIENvZGVjIGRyaXZlciBmb3IgV29sZnNvbiBXTTk3MDUgQUM5NyBDb2RlYy4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgorICogQXV0aG9yOiBMaWFtIEdpcmR3b29kCisgKiAgICAgICAgIGxpYW0uZ2lyZHdvb2RAd29sZnNvbm1pY3JvLmNvbSBvciBsaW51eEB3b2xmc29ubWljcm8uY29tCisgKiBQYXJ0cyBDb3B5cmlnaHQgOiBJYW4gTW9sdG9uIDxzcHlyb0BmMnMuY29tPgorICogICAgICAgICAgICAgICAgICAgQW5kcmV3IFphYm9sb3RueSA8emFwQGhvbWVsaW5rLnJ1PgorICogICAgICAgICAgICAgICAgICAgUnVzc2VsbCBLaW5nIDxybWtAYXJtLmxpbnV4Lm9yZy51az4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC93bTk3eHguaD4KKworI2RlZmluZSBUU19OQU1FCQkJIndtOTd4eCIKKyNkZWZpbmUgV005NzA1X1ZFUlNJT04JCSIxLjAwIgorI2RlZmluZSBERUZBVUxUX1BSRVNTVVJFCTB4YjBjMAorCisvKgorICogTW9kdWxlIHBhcmFtZXRlcnMKKyAqLworCisvKgorICogU2V0IGN1cnJlbnQgdXNlZCBmb3IgcHJlc3N1cmUgbWVhc3VyZW1lbnQuCisgKgorICogU2V0IHBpbCA9IDIgdG8gdXNlIDQwMHVBCisgKiAgICAgcGlsID0gMSB0byB1c2UgMjAwdUEgYW5kCisgKiAgICAgcGlsID0gMCB0byBkaXNhYmxlIHByZXNzdXJlIG1lYXN1cmVtZW50LgorICoKKyAqIFRoaXMgaXMgdXNlZCB0byBpbmNyZWFzZSB0aGUgcmFuZ2Ugb2YgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBhZGMKKyAqIHdoZW4gbWVhc3VyZWluZyB0b3VjaHBhbmVsIHByZXNzdXJlLgorICovCitzdGF0aWMgaW50IHBpbDsKK21vZHVsZV9wYXJhbShwaWwsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBpbCwgIlNldCBjdXJyZW50IHVzZWQgZm9yIHByZXNzdXJlIG1lYXN1cmVtZW50LiIpOworCisvKgorICogU2V0IHRocmVzaG9sZCBmb3IgcHJlc3N1cmUgbWVhc3VyZW1lbnQuCisgKgorICogUGVuIGRvd24gcHJlc3N1cmUgYmVsb3cgdGhyZXNob2xkIGlzIGlnbm9yZWQuCisgKi8KK3N0YXRpYyBpbnQgcHJlc3N1cmUgPSBERUZBVUxUX1BSRVNTVVJFICYgMHhmZmY7Cittb2R1bGVfcGFyYW0ocHJlc3N1cmUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHByZXNzdXJlLCAiU2V0IHRocmVzaG9sZCBmb3IgcHJlc3N1cmUgbWVhc3VyZW1lbnQuIik7CisKKy8qCisgKiBTZXQgYWRjIHNhbXBsZSBkZWxheS4KKyAqCisgKiBGb3IgYWNjdXJhdGUgdG91Y2hwYW5lbCBtZWFzdXJlbWVudHMsIHNvbWUgc2V0dGxpbmcgdGltZSBtYXkgYmUKKyAqIHJlcXVpcmVkIGJldHdlZW4gdGhlIHN3aXRjaCBtYXRyaXggYXBwbHlpbmcgYSB2b2x0YWdlIGFjcm9zcyB0aGUKKyAqIHRvdWNocGFuZWwgcGxhdGUgYW5kIHRoZSBBREMgc2FtcGxpbmcgdGhlIHNpZ25hbC4KKyAqCisgKiBUaGlzIGRlbGF5IGNhbiBiZSBzZXQgYnkgc2V0dGluZyBkZWxheSA9IG4sIHdoZXJlIG4gaXMgdGhlIGFycmF5CisgKiBwb3NpdGlvbiBvZiB0aGUgZGVsYXkgaW4gdGhlIGFycmF5IGRlbGF5X3RhYmxlIGJlbG93LgorICogTG9uZyBkZWxheXMgPiAxbXMgYXJlIHN1cHBvcnRlZCBmb3IgY29tcGxldGVuZXNzLCBidXQgYXJlIG5vdAorICogcmVjb21tZW5kZWQuCisgKi8KK3N0YXRpYyBpbnQgZGVsYXkgPSA0OworbW9kdWxlX3BhcmFtKGRlbGF5LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWxheSwgIlNldCBhZGMgc2FtcGxlIGRlbGF5LiIpOworCisvKgorICogUGVuIGRldGVjdCBjb21wYXJhdG9yIHRocmVzaG9sZC4KKyAqCisgKiAwIHRvIFZtaWQgaW4gMTUgc3RlcHMsIDAgPSB1c2UgemVybyBwb3dlciBjb21wYXJhdG9yIHdpdGggVm1pZCB0aHJlc2hvbGQKKyAqIGkuZS4gMSA9ICBWbWlkLzE1IHRocmVzaG9sZAorICogICAgICAxNSA9ICBWbWlkLzEgdGhyZXNob2xkCisgKgorICogQWRqdXN0IHRoaXMgdmFsdWUgaWYgeW91IGFyZSBoYXZpbmcgcHJvYmxlbXMgd2l0aCBwZW4gZGV0ZWN0IG5vdAorICogZGV0ZWN0aW5nIGFueSBkb3duIGV2ZW50cy4KKyAqLworc3RhdGljIGludCBwZGQgPSA4OworbW9kdWxlX3BhcmFtKHBkZCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocGRkLCAiU2V0IHBlbiBkZXRlY3QgY29tcGFyYXRvciB0aHJlc2hvbGQiKTsKKworLyoKKyAqIFNldCBhZGMgbWFzayBmdW5jdGlvbi4KKyAqCisgKiBTb3VyY2VzIG9mIGdsaXRjaCBub2lzZSwgc3VjaCBhcyBzaWduYWxzIGRyaXZpbmcgYW4gTENEIGRpc3BsYXksIG1heSBmZWVkCisgKiB0aHJvdWdoIHRvIHRoZSB0b3VjaCBzY3JlZW4gcGxhdGVzIGFuZCBhZmZlY3QgbWVhc3VyZW1lbnQgYWNjdXJhY3kuIEluCisgKiBvcmRlciB0byBtaW5pbWlzZSB0aGlzLCBhIHNpZ25hbCBtYXkgYmUgYXBwbGllZCB0byB0aGUgTUFTSyBwaW4gdG8gZGVsYXkgb3IKKyAqIHN5bmNocm9uaXNlIHRoZSBzYW1wbGluZy4KKyAqCisgKiAwID0gTm8gZGVsYXkgb3Igc3luYworICogMSA9IEhpZ2ggb24gcGluIHN0b3BzIGNvbnZlcnNpb25zCisgKiAyID0gRWRnZSB0cmlnZ2VyZWQsIGVkZ2Ugb24gcGluIGRlbGF5cyBjb252ZXJzaW9uIGJ5IGRlbGF5IHBhcmFtIChhYm92ZSkKKyAqIDMgPSBFZGdlIHRyaWdnZXJlZCwgZWRnZSBvbiBwaW4gc3RhcnRzIGNvbnZlcnNpb24gYWZ0ZXIgZGVsYXkgcGFyYW0KKyAqLworc3RhdGljIGludCBtYXNrOworbW9kdWxlX3BhcmFtKG1hc2ssIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1hc2ssICJTZXQgYWRjIG1hc2sgZnVuY3Rpb24uIik7CisKKy8qCisgKiBBREMgc2FtcGxlIGRlbGF5IHRpbWVzIGluIHVTCisgKi8KK3N0YXRpYyBjb25zdCBpbnQgZGVsYXlfdGFibGVbXSA9IHsKKwkyMSwgICAgLyogMSBBQzk3IExpbmsgZnJhbWVzICovCisJNDIsICAgIC8qIDIgICAgICAgICAgICAgICAgICAqLworCTg0LCAgICAvKiA0ICAgICAgICAgICAgICAgICAgKi8KKwkxNjcsICAgLyogOCAgICAgICAgICAgICAgICAgICovCisJMzMzLCAgIC8qIDE2ICAgICAgICAgICAgICAgICAqLworCTY2NywgICAvKiAzMiAgICAgICAgICAgICAgICAgKi8KKwkxMDAwLCAgLyogNDggICAgICAgICAgICAgICAgICovCisJMTMzMywgIC8qIDY0ICAgICAgICAgICAgICAgICAqLworCTIwMDAsICAvKiA5NiAgICAgICAgICAgICAgICAgKi8KKwkyNjY3LCAgLyogMTI4ICAgICAgICAgICAgICAgICovCisJMzMzMywgIC8qIDE2MCAgICAgICAgICAgICAgICAqLworCTQwMDAsICAvKiAxOTIgICAgICAgICAgICAgICAgKi8KKwk0NjY3LCAgLyogMjI0ICAgICAgICAgICAgICAgICovCisJNTMzMywgIC8qIDI1NiAgICAgICAgICAgICAgICAqLworCTYwMDAsICAvKiAyODggICAgICAgICAgICAgICAgKi8KKwkwICAgICAgLyogTm8gZGVsYXksIHN3aXRjaCBtYXRyaXggYWx3YXlzIG9uICovCit9OworCisvKgorICogRGVsYXkgYWZ0ZXIgaXNzdWluZyBhIFBPTEwgY29tbWFuZC4KKyAqCisgKiBUaGUgZGVsYXkgaXMgMyBBQzk3IGxpbmsgZnJhbWVzICsgdGhlIHRvdWNocGFuZWwgc2V0dGxpbmcgZGVsYXkKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHBvbGxfZGVsYXkoaW50IGQpCit7CisJdWRlbGF5KDMgKiBBQzk3X0xJTktfRlJBTUUgKyBkZWxheV90YWJsZVtkXSk7Cit9CisKKy8qCisgKiBzZXQgdXAgdGhlIHBoeXNpY2FsIHNldHRpbmdzIG9mIHRoZSBXTTk3MDUKKyAqLworc3RhdGljIHZvaWQgd205NzA1X3BoeV9pbml0KHN0cnVjdCB3bTk3eHggKndtKQoreworCXUxNiBkaWcxID0gMCwgZGlnMiA9IFdNOTdYWF9SUFI7CisKKwkvKgorCSogbXV0ZSBWSURFTyBhbmQgQVVYIGFzIHRoZXkgc2hhcmUgWCBhbmQgWSB0b3VjaHNjcmVlbgorCSogaW5wdXRzIG9uIHRoZSBXTTk3MDUKKwkqLworCXdtOTd4eF9yZWdfd3JpdGUod20sIEFDOTdfQVVYLCAweDgwMDApOworCXdtOTd4eF9yZWdfd3JpdGUod20sIEFDOTdfVklERU8sIDB4ODAwMCk7CisKKwkvKiB0b3VjaHBhbmVsIHByZXNzdXJlIGN1cnJlbnQqLworCWlmIChwaWwgPT0gMikgeworCQlkaWcyIHw9IFdNOTcwNV9QSUw7CisJCWRldl9kYmcod20tPmRldiwKKwkJCSJzZXR0aW5nIHByZXNzdXJlIG1lYXN1cmVtZW50IGN1cnJlbnQgdG8gNDAwdUEuIik7CisJfSBlbHNlIGlmIChwaWwpCisJCWRldl9kYmcod20tPmRldiwKKwkJCSJzZXR0aW5nIHByZXNzdXJlIG1lYXN1cmVtZW50IGN1cnJlbnQgdG8gMjAwdUEuIik7CisJaWYgKCFwaWwpCisJCXByZXNzdXJlID0gMDsKKworCS8qIHBvbGxpbmcgbW9kZSBzYW1wbGUgc2V0dGxpbmcgZGVsYXkgKi8KKwlpZiAoZGVsYXkgIT0gNCkgeworCQlpZiAoZGVsYXkgPCAwIHx8IGRlbGF5ID4gMTUpIHsKKwkJCWRldl9kYmcod20tPmRldiwgInN1cHBsaWVkIGRlbGF5IG91dCBvZiByYW5nZS4iKTsKKwkJCWRlbGF5ID0gNDsKKwkJfQorCX0KKwlkaWcxICY9IDB4ZmYwZjsKKwlkaWcxIHw9IFdNOTdYWF9ERUxBWShkZWxheSk7CisJZGV2X2RiZyh3bS0+ZGV2LCAic2V0dGluZyBhZGMgc2FtcGxlIGRlbGF5IHRvICVkIHUgU2Vjcy4iLAorCQlkZWxheV90YWJsZVtkZWxheV0pOworCisJLyogV005NzA1IHBkZCAqLworCWRpZzIgfD0gKHBkZCAmIDB4MDAwZik7CisJZGV2X2RiZyh3bS0+ZGV2LCAic2V0dGluZyBwZGQgdG8gVm1pZC8lZCIsIDEgLSAocGRkICYgMHgwMDBmKSk7CisKKwkvKiBtYXNrICovCisJZGlnMiB8PSAoKG1hc2sgJiAweDMpIDw8IDQpOworCisJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19XTTk3WFhfRElHSVRJU0VSMSwgZGlnMSk7CisJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19XTTk3WFhfRElHSVRJU0VSMiwgZGlnMik7Cit9CisKK3N0YXRpYyB2b2lkIHdtOTcwNV9kaWdfZW5hYmxlKHN0cnVjdCB3bTk3eHggKndtLCBpbnQgZW5hYmxlKQoreworCWlmIChlbmFibGUpIHsKKwkJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19XTTk3WFhfRElHSVRJU0VSMiwKKwkJCQkgd20tPmRpZ1syXSB8IFdNOTdYWF9QUlBfREVUX0RJRyk7CisJCXdtOTd4eF9yZWdfcmVhZCh3bSwgQUM5N19XTTk3WFhfRElHSVRJU0VSX1JEKTsgLyogZHVtbXkgcmVhZCAqLworCX0gZWxzZQorCQl3bTk3eHhfcmVnX3dyaXRlKHdtLCBBQzk3X1dNOTdYWF9ESUdJVElTRVIyLAorCQkJCSB3bS0+ZGlnWzJdICYgfldNOTdYWF9QUlBfREVUX0RJRyk7Cit9CisKK3N0YXRpYyB2b2lkIHdtOTcwNV9hdXhfcHJlcGFyZShzdHJ1Y3Qgd205N3h4ICp3bSkKK3sKKwltZW1jcHkod20tPmRpZ19zYXZlLCB3bS0+ZGlnLCBzaXplb2Yod20tPmRpZykpOworCXdtOTd4eF9yZWdfd3JpdGUod20sIEFDOTdfV005N1hYX0RJR0lUSVNFUjEsIDApOworCXdtOTd4eF9yZWdfd3JpdGUod20sIEFDOTdfV005N1hYX0RJR0lUSVNFUjIsIFdNOTdYWF9QUlBfREVUX0RJRyk7Cit9CisKK3N0YXRpYyB2b2lkIHdtOTcwNV9kaWdfcmVzdG9yZShzdHJ1Y3Qgd205N3h4ICp3bSkKK3sKKwl3bTk3eHhfcmVnX3dyaXRlKHdtLCBBQzk3X1dNOTdYWF9ESUdJVElTRVIxLCB3bS0+ZGlnX3NhdmVbMV0pOworCXdtOTd4eF9yZWdfd3JpdGUod20sIEFDOTdfV005N1hYX0RJR0lUSVNFUjIsIHdtLT5kaWdfc2F2ZVsyXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3BkZW4oc3RydWN0IHdtOTd4eCAqd20pCit7CisJcmV0dXJuIHdtLT5kaWdbMl0gJiBXTTk3MDVfUERFTjsKK30KKworLyoKKyAqIFJlYWQgYSBzYW1wbGUgZnJvbSB0aGUgV005NzA1IGFkYyBpbiBwb2xsaW5nIG1vZGUuCisgKi8KK3N0YXRpYyBpbnQgd205NzA1X3BvbGxfc2FtcGxlKHN0cnVjdCB3bTk3eHggKndtLCBpbnQgYWRjc2VsLCBpbnQgKnNhbXBsZSkKK3sKKwlpbnQgdGltZW91dCA9IDUgKiBkZWxheTsKKworCWlmICghd20tPnBlbl9wcm9iYWJseV9kb3duKSB7CisJCXUxNiBkYXRhID0gd205N3h4X3JlZ19yZWFkKHdtLCBBQzk3X1dNOTdYWF9ESUdJVElTRVJfUkQpOworCQlpZiAoIShkYXRhICYgV005N1hYX1BFTl9ET1dOKSkKKwkJCXJldHVybiBSQ19QRU5VUDsKKwkJd20tPnBlbl9wcm9iYWJseV9kb3duID0gMTsKKwl9CisKKwkvKiBzZXQgdXAgZGlnaXRpc2VyICovCisJaWYgKGFkY3NlbCAmIDB4ODAwMCkKKwkJYWRjc2VsID0gKChhZGNzZWwgJiAweDdmZmYpICsgMykgPDwgMTI7CisKKwlpZiAod20tPm1hY2hfb3BzICYmIHdtLT5tYWNoX29wcy0+cHJlX3NhbXBsZSkKKwkJd20tPm1hY2hfb3BzLT5wcmVfc2FtcGxlKGFkY3NlbCk7CisJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19XTTk3WFhfRElHSVRJU0VSMSwKKwkJCSBhZGNzZWwgfCBXTTk3WFhfUE9MTCB8IFdNOTdYWF9ERUxBWShkZWxheSkpOworCisJLyogd2FpdCAzIEFDOTcgdGltZSBzbG90cyArIGRlbGF5IGZvciBjb252ZXJzaW9uICovCisJcG9sbF9kZWxheShkZWxheSk7CisKKwkvKiB3YWl0IGZvciBQT0xMIHRvIGdvIGxvdyAqLworCXdoaWxlICgod205N3h4X3JlZ19yZWFkKHdtLCBBQzk3X1dNOTdYWF9ESUdJVElTRVIxKSAmIFdNOTdYWF9QT0xMKQorCSAgICAgICAmJiB0aW1lb3V0KSB7CisJCXVkZWxheShBQzk3X0xJTktfRlJBTUUpOworCQl0aW1lb3V0LS07CisJfQorCisJaWYgKHRpbWVvdXQgPT0gMCkgeworCQkvKiBJZiBQREVOIGlzIHNldCwgd2UgY2FuIGdldCBhIHRpbWVvdXQgd2hlbiBwZW4gZ29lcyB1cCAqLworCQlpZiAoaXNfcGRlbih3bSkpCisJCQl3bS0+cGVuX3Byb2JhYmx5X2Rvd24gPSAwOworCQllbHNlCisJCQlkZXZfZGJnKHdtLT5kZXYsICJhZGMgc2FtcGxlIHRpbWVvdXQiKTsKKwkJcmV0dXJuIFJDX1BFTlVQOworCX0KKworCSpzYW1wbGUgPSB3bTk3eHhfcmVnX3JlYWQod20sIEFDOTdfV005N1hYX0RJR0lUSVNFUl9SRCk7CisJaWYgKHdtLT5tYWNoX29wcyAmJiB3bS0+bWFjaF9vcHMtPnBvc3Rfc2FtcGxlKQorCQl3bS0+bWFjaF9vcHMtPnBvc3Rfc2FtcGxlKGFkY3NlbCk7CisKKwkvKiBjaGVjayB3ZSBoYXZlIGNvcnJlY3Qgc2FtcGxlICovCisJaWYgKCgqc2FtcGxlICYgV005N1hYX0FEQ1NFTF9NQVNLKSAhPSBhZGNzZWwpIHsKKwkJZGV2X2RiZyh3bS0+ZGV2LCAiYWRjIHdyb25nIHNhbXBsZSwgcmVhZCAleCBnb3QgJXgiLCBhZGNzZWwsCisJCSpzYW1wbGUgJiBXTTk3WFhfQURDU0VMX01BU0spOworCQlyZXR1cm4gUkNfUEVOVVA7CisJfQorCisJaWYgKCEoKnNhbXBsZSAmIFdNOTdYWF9QRU5fRE9XTikpIHsKKwkJd20tPnBlbl9wcm9iYWJseV9kb3duID0gMDsKKwkJcmV0dXJuIFJDX1BFTlVQOworCX0KKworCXJldHVybiBSQ19WQUxJRDsKK30KKworLyoKKyAqIFNhbXBsZSB0aGUgV005NzA1IHRvdWNoc2NyZWVuIGluIHBvbGxpbmcgbW9kZQorICovCitzdGF0aWMgaW50IHdtOTcwNV9wb2xsX3RvdWNoKHN0cnVjdCB3bTk3eHggKndtLCBzdHJ1Y3Qgd205N3h4X2RhdGEgKmRhdGEpCit7CisJaW50IHJjOworCisJcmMgPSB3bTk3MDVfcG9sbF9zYW1wbGUod20sIFdNOTdYWF9BRENTRUxfWCwgJmRhdGEtPngpOworCWlmIChyYyAhPSBSQ19WQUxJRCkKKwkJcmV0dXJuIHJjOworCXJjID0gd205NzA1X3BvbGxfc2FtcGxlKHdtLCBXTTk3WFhfQURDU0VMX1ksICZkYXRhLT55KTsKKwlpZiAocmMgIT0gUkNfVkFMSUQpCisJCXJldHVybiByYzsKKwlpZiAocGlsKSB7CisJCXJjID0gd205NzA1X3BvbGxfc2FtcGxlKHdtLCBXTTk3WFhfQURDU0VMX1BSRVMsICZkYXRhLT5wKTsKKwkJaWYgKHJjICE9IFJDX1ZBTElEKQorCQkJcmV0dXJuIHJjOworCX0gZWxzZQorCQlkYXRhLT5wID0gREVGQVVMVF9QUkVTU1VSRTsKKworCXJldHVybiBSQ19WQUxJRDsKK30KKworLyoKKyAqIEVuYWJsZSBXTTk3MDUgY29udGludW91cyBtb2RlLCBpLmUuIHRvdWNoIGRhdGEgaXMgc3RyZWFtZWQgYWNyb3NzCisgKiBhbiBBQzk3IHNsb3QKKyAqLworc3RhdGljIGludCB3bTk3MDVfYWNjX2VuYWJsZShzdHJ1Y3Qgd205N3h4ICp3bSwgaW50IGVuYWJsZSkKK3sKKwl1MTYgZGlnMSwgZGlnMjsKKwlpbnQgcmV0ID0gMDsKKworCWRpZzEgPSB3bS0+ZGlnWzFdOworCWRpZzIgPSB3bS0+ZGlnWzJdOworCisJaWYgKGVuYWJsZSkgeworCQkvKiBjb250aW5vdXMgbW9kZSAqLworCQlpZiAod20tPm1hY2hfb3BzLT5hY2Nfc3RhcnR1cCAmJgorCQkgICAgKHJldCA9IHdtLT5tYWNoX29wcy0+YWNjX3N0YXJ0dXAod20pKSA8IDApCisJCQlyZXR1cm4gcmV0OworCQlkaWcxICY9IH4oV005N1hYX0NNX1JBVEVfTUFTSyB8IFdNOTdYWF9BRENTRUxfTUFTSyB8CisJCQkgIFdNOTdYWF9ERUxBWV9NQVNLIHwgV005N1hYX1NMVF9NQVNLKTsKKwkJZGlnMSB8PSBXTTk3WFhfQ1RDIHwgV005N1hYX0NPTyB8IFdNOTdYWF9TTEVOIHwKKwkJCVdNOTdYWF9ERUxBWShkZWxheSkgfAorCQkJV005N1hYX1NMVCh3bS0+YWNjX3Nsb3QpIHwKKwkJCVdNOTdYWF9SQVRFKHdtLT5hY2NfcmF0ZSk7CisJCWlmIChwaWwpCisJCQlkaWcxIHw9IFdNOTdYWF9BRENTRUxfUFJFUzsKKwkJZGlnMiB8PSBXTTk3MDVfUERFTjsKKwl9IGVsc2UgeworCQlkaWcxICY9IH4oV005N1hYX0NUQyB8IFdNOTdYWF9DT08gfCBXTTk3WFhfU0xFTik7CisJCWRpZzIgJj0gfldNOTcwNV9QREVOOworCQlpZiAod20tPm1hY2hfb3BzLT5hY2Nfc2h1dGRvd24pCisJCQl3bS0+bWFjaF9vcHMtPmFjY19zaHV0ZG93bih3bSk7CisJfQorCisJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19XTTk3WFhfRElHSVRJU0VSMSwgZGlnMSk7CisJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19XTTk3WFhfRElHSVRJU0VSMiwgZGlnMik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3Qgd205N3h4X2NvZGVjX2RydiB3bTk3MDVfY29kZWMgPSB7CisJLmlkID0gV005NzA1X0lEMiwKKwkubmFtZSA9ICJ3bTk3MDUiLAorCS5wb2xsX3NhbXBsZSA9IHdtOTcwNV9wb2xsX3NhbXBsZSwKKwkucG9sbF90b3VjaCA9IHdtOTcwNV9wb2xsX3RvdWNoLAorCS5hY2NfZW5hYmxlID0gd205NzA1X2FjY19lbmFibGUsCisJLnBoeV9pbml0ID0gd205NzA1X3BoeV9pbml0LAorCS5kaWdfZW5hYmxlID0gd205NzA1X2RpZ19lbmFibGUsCisJLmRpZ19yZXN0b3JlID0gd205NzA1X2RpZ19yZXN0b3JlLAorCS5hdXhfcHJlcGFyZSA9IHdtOTcwNV9hdXhfcHJlcGFyZSwKK307CitFWFBPUlRfU1lNQk9MX0dQTCh3bTk3MDVfY29kZWMpOworCisvKiBNb2R1bGUgaW5mb3JtYXRpb24gKi8KK01PRFVMRV9BVVRIT1IoIkxpYW0gR2lyZHdvb2QgPGxpYW0uZ2lyZHdvb2RAd29sZnNvbm1pY3JvLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiV005NzA1IFRvdWNoIFNjcmVlbiBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vd205NzEyLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3dtOTcxMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNmU0Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3dtOTcxMi5jCkBAIC0wLDAgKzEsNDYyIEBACisvKgorICogd205NzEyLmMgIC0tICBDb2RlYyBkcml2ZXIgZm9yIFdvbGZzb24gV005NzEyIEFDOTcgQ29kZWNzLgorICoKKyAqIENvcHlyaWdodCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCisgKiBBdXRob3I6IExpYW0gR2lyZHdvb2QKKyAqICAgICAgICAgbGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tIG9yIGxpbnV4QHdvbGZzb25taWNyby5jb20KKyAqIFBhcnRzIENvcHlyaWdodCA6IElhbiBNb2x0b24gPHNweXJvQGYycy5jb20+CisgKiAgICAgICAgICAgICAgICAgICBBbmRyZXcgWmFib2xvdG55IDx6YXBAaG9tZWxpbmsucnU+CisgKiAgICAgICAgICAgICAgICAgICBSdXNzZWxsIEtpbmcgPHJta0Bhcm0ubGludXgub3JnLnVrPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dtOTd4eC5oPgorCisjZGVmaW5lIFRTX05BTUUJCQkid205N3h4IgorI2RlZmluZSBXTTk3MTJfVkVSU0lPTgkJIjEuMDAiCisjZGVmaW5lIERFRkFVTFRfUFJFU1NVUkUJMHhiMGMwCisKKy8qCisgKiBNb2R1bGUgcGFyYW1ldGVycworICovCisKKy8qCisgKiBTZXQgaW50ZXJuYWwgcHVsbCB1cCBmb3IgcGVuIGRldGVjdC4KKyAqCisgKiBQdWxsIHVwIGlzIGluIHRoZSByYW5nZSAxLjAyayAobGVhc3Qgc2Vuc2l0aXZlKSB0byA2NGsgKG1vc3Qgc2Vuc2l0aXZlKQorICogaS5lLiBwdWxsIHVwIHJlc2lzdGFuY2UgPSA2NGsgT2htcyAvIHJwdS4KKyAqCisgKiBBZGp1c3QgdGhpcyB2YWx1ZSBpZiB5b3UgYXJlIGhhdmluZyBwcm9ibGVtcyB3aXRoIHBlbiBkZXRlY3Qgbm90CisgKiBkZXRlY3RpbmcgYW55IGRvd24gZXZlbnQuCisgKi8KK3N0YXRpYyBpbnQgcnB1ID0gODsKK21vZHVsZV9wYXJhbShycHUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHJwdSwgIlNldCBpbnRlcm5hbCBwdWxsIHVwIHJlc2l0b3IgZm9yIHBlbiBkZXRlY3QuIik7CisKKy8qCisgKiBTZXQgY3VycmVudCB1c2VkIGZvciBwcmVzc3VyZSBtZWFzdXJlbWVudC4KKyAqCisgKiBTZXQgcGlsID0gMiB0byB1c2UgNDAwdUEKKyAqICAgICBwaWwgPSAxIHRvIHVzZSAyMDB1QSBhbmQKKyAqICAgICBwaWwgPSAwIHRvIGRpc2FibGUgcHJlc3N1cmUgbWVhc3VyZW1lbnQuCisgKgorICogVGhpcyBpcyB1c2VkIHRvIGluY3JlYXNlIHRoZSByYW5nZSBvZiB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlIGFkYworICogd2hlbiBtZWFzdXJlaW5nIHRvdWNocGFuZWwgcHJlc3N1cmUuCisgKi8KK3N0YXRpYyBpbnQgcGlsOworbW9kdWxlX3BhcmFtKHBpbCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocGlsLCAiU2V0IGN1cnJlbnQgdXNlZCBmb3IgcHJlc3N1cmUgbWVhc3VyZW1lbnQuIik7CisKKy8qCisgKiBTZXQgdGhyZXNob2xkIGZvciBwcmVzc3VyZSBtZWFzdXJlbWVudC4KKyAqCisgKiBQZW4gZG93biBwcmVzc3VyZSBiZWxvdyB0aHJlc2hvbGQgaXMgaWdub3JlZC4KKyAqLworc3RhdGljIGludCBwcmVzc3VyZSA9IERFRkFVTFRfUFJFU1NVUkUgJiAweGZmZjsKK21vZHVsZV9wYXJhbShwcmVzc3VyZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocHJlc3N1cmUsICJTZXQgdGhyZXNob2xkIGZvciBwcmVzc3VyZSBtZWFzdXJlbWVudC4iKTsKKworLyoKKyAqIFNldCBhZGMgc2FtcGxlIGRlbGF5LgorICoKKyAqIEZvciBhY2N1cmF0ZSB0b3VjaHBhbmVsIG1lYXN1cmVtZW50cywgc29tZSBzZXR0bGluZyB0aW1lIG1heSBiZQorICogcmVxdWlyZWQgYmV0d2VlbiB0aGUgc3dpdGNoIG1hdHJpeCBhcHBseWluZyBhIHZvbHRhZ2UgYWNyb3NzIHRoZQorICogdG91Y2hwYW5lbCBwbGF0ZSBhbmQgdGhlIEFEQyBzYW1wbGluZyB0aGUgc2lnbmFsLgorICoKKyAqIFRoaXMgZGVsYXkgY2FuIGJlIHNldCBieSBzZXR0aW5nIGRlbGF5ID0gbiwgd2hlcmUgbiBpcyB0aGUgYXJyYXkKKyAqIHBvc2l0aW9uIG9mIHRoZSBkZWxheSBpbiB0aGUgYXJyYXkgZGVsYXlfdGFibGUgYmVsb3cuCisgKiBMb25nIGRlbGF5cyA+IDFtcyBhcmUgc3VwcG9ydGVkIGZvciBjb21wbGV0ZW5lc3MsIGJ1dCBhcmUgbm90CisgKiByZWNvbW1lbmRlZC4KKyAqLworc3RhdGljIGludCBkZWxheSA9IDM7Cittb2R1bGVfcGFyYW0oZGVsYXksIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlbGF5LCAiU2V0IGFkYyBzYW1wbGUgZGVsYXkuIik7CisKKy8qCisgKiBTZXQgZml2ZV93aXJlID0gMSB0byB1c2UgYSA1IHdpcmUgdG91Y2hzY3JlZW4uCisgKgorICogTk9URTogRml2ZSB3aXJlIG1vZGUgZG9lcyBub3QgYWxsb3cgZm9yIHJlYWRiYWNrIG9mIHByZXNzdXJlLgorICovCitzdGF0aWMgaW50IGZpdmVfd2lyZTsKK21vZHVsZV9wYXJhbShmaXZlX3dpcmUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZpdmVfd2lyZSwgIlNldCB0byAnMScgdG8gdXNlIDUtd2lyZSB0b3VjaHNjcmVlbi4iKTsKKworLyoKKyAqIFNldCBhZGMgbWFzayBmdW5jdGlvbi4KKyAqCisgKiBTb3VyY2VzIG9mIGdsaXRjaCBub2lzZSwgc3VjaCBhcyBzaWduYWxzIGRyaXZpbmcgYW4gTENEIGRpc3BsYXksIG1heSBmZWVkCisgKiB0aHJvdWdoIHRvIHRoZSB0b3VjaCBzY3JlZW4gcGxhdGVzIGFuZCBhZmZlY3QgbWVhc3VyZW1lbnQgYWNjdXJhY3kuIEluCisgKiBvcmRlciB0byBtaW5pbWlzZSB0aGlzLCBhIHNpZ25hbCBtYXkgYmUgYXBwbGllZCB0byB0aGUgTUFTSyBwaW4gdG8gZGVsYXkgb3IKKyAqIHN5bmNocm9uaXNlIHRoZSBzYW1wbGluZy4KKyAqCisgKiAwID0gTm8gZGVsYXkgb3Igc3luYworICogMSA9IEhpZ2ggb24gcGluIHN0b3BzIGNvbnZlcnNpb25zCisgKiAyID0gRWRnZSB0cmlnZ2VyZWQsIGVkZ2Ugb24gcGluIGRlbGF5cyBjb252ZXJzaW9uIGJ5IGRlbGF5IHBhcmFtIChhYm92ZSkKKyAqIDMgPSBFZGdlIHRyaWdnZXJlZCwgZWRnZSBvbiBwaW4gc3RhcnRzIGNvbnZlcnNpb24gYWZ0ZXIgZGVsYXkgcGFyYW0KKyAqLworc3RhdGljIGludCBtYXNrOworbW9kdWxlX3BhcmFtKG1hc2ssIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1hc2ssICJTZXQgYWRjIG1hc2sgZnVuY3Rpb24uIik7CisKKy8qCisgKiBDb29yZGluYXRlIFBvbGxpbmcgRW5hYmxlLgorICoKKyAqIFNldCB0byAxIHRvIGVuYWJsZSBjb29yZGluYXRlIHBvbGxpbmcuIGUuZy4geCx5WyxwXSBpcyBzYW1wbGVkIHRvZ2V0aGVyCisgKiBmb3IgZXZlcnkgcG9sbC4KKyAqLworc3RhdGljIGludCBjb29yZDsKK21vZHVsZV9wYXJhbShjb29yZCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoY29vcmQsICJQb2xsaW5nIGNvb3JkaW5hdGUgbW9kZSIpOworCisvKgorICogQURDIHNhbXBsZSBkZWxheSB0aW1lcyBpbiB1UworICovCitzdGF0aWMgY29uc3QgaW50IGRlbGF5X3RhYmxlW10gPSB7CisJMjEsICAgIC8qIDEgQUM5NyBMaW5rIGZyYW1lcyAqLworCTQyLCAgICAvKiAyICovCisJODQsICAgIC8qIDQgKi8KKwkxNjcsICAgLyogOCAqLworCTMzMywgICAvKiAxNiAqLworCTY2NywgICAvKiAzMiAqLworCTEwMDAsICAvKiA0OCAqLworCTEzMzMsICAvKiA2NCAqLworCTIwMDAsICAvKiA5NiAqLworCTI2NjcsICAvKiAxMjggKi8KKwkzMzMzLCAgLyogMTYwICovCisJNDAwMCwgIC8qIDE5MiAqLworCTQ2NjcsICAvKiAyMjQgKi8KKwk1MzMzLCAgLyogMjU2ICovCisJNjAwMCwgIC8qIDI4OCAqLworCTAgICAgICAvKiBObyBkZWxheSwgc3dpdGNoIG1hdHJpeCBhbHdheXMgb24gKi8KK307CisKKy8qCisgKiBEZWxheSBhZnRlciBpc3N1aW5nIGEgUE9MTCBjb21tYW5kLgorICoKKyAqIFRoZSBkZWxheSBpcyAzIEFDOTcgbGluayBmcmFtZXMgKyB0aGUgdG91Y2hwYW5lbCBzZXR0bGluZyBkZWxheQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcG9sbF9kZWxheShpbnQgZCkKK3sKKwl1ZGVsYXkoMyAqIEFDOTdfTElOS19GUkFNRSArIGRlbGF5X3RhYmxlW2RdKTsKK30KKworLyoKKyAqIHNldCB1cCB0aGUgcGh5c2ljYWwgc2V0dGluZ3Mgb2YgdGhlIFdNOTcxMgorICovCitzdGF0aWMgdm9pZCB3bTk3MTJfcGh5X2luaXQoc3RydWN0IHdtOTd4eCAqd20pCit7CisJdTE2IGRpZzEgPSAwOworCXUxNiBkaWcyID0gV005N1hYX1JQUiB8IFdNOTcxMl9SUFUoMSk7CisKKwkvKiBXTTk3MTIgcnB1ICovCisJaWYgKHJwdSkgeworCQlkaWcyICY9IDB4ZmZjMDsKKwkJZGlnMiB8PSBXTTk3MTJfUlBVKHJwdSk7CisJCWRldl9kYmcod20tPmRldiwgInNldHRpbmcgcGVuIGRldGVjdCBwdWxsLXVwIHRvICVkIE9obXMiLAorCQkJNjQwMDAgLyBycHUpOworCX0KKworCS8qIHRvdWNocGFuZWwgcHJlc3N1cmUgY3VycmVudCovCisJaWYgKHBpbCA9PSAyKSB7CisJCWRpZzIgfD0gV005NzEyX1BJTDsKKwkJZGV2X2RiZyh3bS0+ZGV2LAorCQkJInNldHRpbmcgcHJlc3N1cmUgbWVhc3VyZW1lbnQgY3VycmVudCB0byA0MDB1QS4iKTsKKwl9IGVsc2UgaWYgKHBpbCkKKwkJZGV2X2RiZyh3bS0+ZGV2LAorCQkJInNldHRpbmcgcHJlc3N1cmUgbWVhc3VyZW1lbnQgY3VycmVudCB0byAyMDB1QS4iKTsKKwlpZiAoIXBpbCkKKwkJcHJlc3N1cmUgPSAwOworCisJLyogV005NzEyIGZpdmUgd2lyZSAqLworCWlmIChmaXZlX3dpcmUpIHsKKwkJZGlnMiB8PSBXTTk3MTJfNDVXOworCQlkZXZfZGJnKHdtLT5kZXYsICJzZXR0aW5nIDUtd2lyZSB0b3VjaHNjcmVlbiBtb2RlLiIpOworCX0KKworCS8qIHBvbGxpbmcgbW9kZSBzYW1wbGUgc2V0dGxpbmcgZGVsYXkgKi8KKwlpZiAoZGVsYXkgPCAwIHx8IGRlbGF5ID4gMTUpIHsKKwkJZGV2X2RiZyh3bS0+ZGV2LCAic3VwcGxpZWQgZGVsYXkgb3V0IG9mIHJhbmdlLiIpOworCQlkZWxheSA9IDQ7CisJfQorCWRpZzEgJj0gMHhmZjBmOworCWRpZzEgfD0gV005N1hYX0RFTEFZKGRlbGF5KTsKKwlkZXZfZGJnKHdtLT5kZXYsICJzZXR0aW5nIGFkYyBzYW1wbGUgZGVsYXkgdG8gJWQgdSBTZWNzLiIsCisJCWRlbGF5X3RhYmxlW2RlbGF5XSk7CisKKwkvKiBtYXNrICovCisJZGlnMiB8PSAoKG1hc2sgJiAweDMpIDw8IDYpOworCWlmIChtYXNrKSB7CisJCXUxNiByZWc7CisJCS8qIFNldCBHUElPNCBhcyBNYXNrIFBpbiovCisJCXJlZyA9IHdtOTd4eF9yZWdfcmVhZCh3bSwgQUM5N19NSVNDX0FGRSk7CisJCXdtOTd4eF9yZWdfd3JpdGUod20sIEFDOTdfTUlTQ19BRkUsIHJlZyB8IFdNOTdYWF9HUElPXzQpOworCQlyZWcgPSB3bTk3eHhfcmVnX3JlYWQod20sIEFDOTdfR1BJT19DRkcpOworCQl3bTk3eHhfcmVnX3dyaXRlKHdtLCBBQzk3X0dQSU9fQ0ZHLCByZWcgfCBXTTk3WFhfR1BJT180KTsKKwl9CisKKwkvKiB3YWl0IC0gY29vcmQgbW9kZSAqLworCWlmIChjb29yZCkKKwkJZGlnMiB8PSBXTTk3MTJfV0FJVDsKKworCXdtOTd4eF9yZWdfd3JpdGUod20sIEFDOTdfV005N1hYX0RJR0lUSVNFUjEsIGRpZzEpOworCXdtOTd4eF9yZWdfd3JpdGUod20sIEFDOTdfV005N1hYX0RJR0lUSVNFUjIsIGRpZzIpOworfQorCitzdGF0aWMgdm9pZCB3bTk3MTJfZGlnX2VuYWJsZShzdHJ1Y3Qgd205N3h4ICp3bSwgaW50IGVuYWJsZSkKK3sKKwl1MTYgZGlnMiA9IHdtLT5kaWdbMl07CisKKwlpZiAoZW5hYmxlKSB7CisJCXdtOTd4eF9yZWdfd3JpdGUod20sIEFDOTdfV005N1hYX0RJR0lUSVNFUjIsCisJCQkJIGRpZzIgfCBXTTk3WFhfUFJQX0RFVF9ESUcpOworCQl3bTk3eHhfcmVnX3JlYWQod20sIEFDOTdfV005N1hYX0RJR0lUSVNFUl9SRCk7IC8qIGR1bW15IHJlYWQgKi8KKwl9IGVsc2UKKwkJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19XTTk3WFhfRElHSVRJU0VSMiwKKwkJCQkgZGlnMiAmIH5XTTk3WFhfUFJQX0RFVF9ESUcpOworfQorCitzdGF0aWMgdm9pZCB3bTk3MTJfYXV4X3ByZXBhcmUoc3RydWN0IHdtOTd4eCAqd20pCit7CisJbWVtY3B5KHdtLT5kaWdfc2F2ZSwgd20tPmRpZywgc2l6ZW9mKHdtLT5kaWcpKTsKKwl3bTk3eHhfcmVnX3dyaXRlKHdtLCBBQzk3X1dNOTdYWF9ESUdJVElTRVIxLCAwKTsKKwl3bTk3eHhfcmVnX3dyaXRlKHdtLCBBQzk3X1dNOTdYWF9ESUdJVElTRVIyLCBXTTk3WFhfUFJQX0RFVF9ESUcpOworfQorCitzdGF0aWMgdm9pZCB3bTk3MTJfZGlnX3Jlc3RvcmUoc3RydWN0IHdtOTd4eCAqd20pCit7CisJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19XTTk3WFhfRElHSVRJU0VSMSwgd20tPmRpZ19zYXZlWzFdKTsKKwl3bTk3eHhfcmVnX3dyaXRlKHdtLCBBQzk3X1dNOTdYWF9ESUdJVElTRVIyLCB3bS0+ZGlnX3NhdmVbMl0pOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19wZGVuKHN0cnVjdCB3bTk3eHggKndtKQoreworCXJldHVybiB3bS0+ZGlnWzJdICYgV005NzEyX1BERU47Cit9CisKKy8qCisgKiBSZWFkIGEgc2FtcGxlIGZyb20gdGhlIFdNOTcxMiBhZGMgaW4gcG9sbGluZyBtb2RlLgorICovCitzdGF0aWMgaW50IHdtOTcxMl9wb2xsX3NhbXBsZShzdHJ1Y3Qgd205N3h4ICp3bSwgaW50IGFkY3NlbCwgaW50ICpzYW1wbGUpCit7CisJaW50IHRpbWVvdXQgPSA1ICogZGVsYXk7CisKKwlpZiAoIXdtLT5wZW5fcHJvYmFibHlfZG93bikgeworCQl1MTYgZGF0YSA9IHdtOTd4eF9yZWdfcmVhZCh3bSwgQUM5N19XTTk3WFhfRElHSVRJU0VSX1JEKTsKKwkJaWYgKCEoZGF0YSAmIFdNOTdYWF9QRU5fRE9XTikpCisJCQlyZXR1cm4gUkNfUEVOVVA7CisJCXdtLT5wZW5fcHJvYmFibHlfZG93biA9IDE7CisJfQorCisJLyogc2V0IHVwIGRpZ2l0aXNlciAqLworCWlmIChhZGNzZWwgJiAweDgwMDApCisJCWFkY3NlbCA9ICgoYWRjc2VsICYgMHg3ZmZmKSArIDMpIDw8IDEyOworCisJaWYgKHdtLT5tYWNoX29wcyAmJiB3bS0+bWFjaF9vcHMtPnByZV9zYW1wbGUpCisJCXdtLT5tYWNoX29wcy0+cHJlX3NhbXBsZShhZGNzZWwpOworCXdtOTd4eF9yZWdfd3JpdGUod20sIEFDOTdfV005N1hYX0RJR0lUSVNFUjEsCisJCQkgYWRjc2VsIHwgV005N1hYX1BPTEwgfCBXTTk3WFhfREVMQVkoZGVsYXkpKTsKKworCS8qIHdhaXQgMyBBQzk3IHRpbWUgc2xvdHMgKyBkZWxheSBmb3IgY29udmVyc2lvbiAqLworCXBvbGxfZGVsYXkoZGVsYXkpOworCisJLyogd2FpdCBmb3IgUE9MTCB0byBnbyBsb3cgKi8KKwl3aGlsZSAoKHdtOTd4eF9yZWdfcmVhZCh3bSwgQUM5N19XTTk3WFhfRElHSVRJU0VSMSkgJiBXTTk3WFhfUE9MTCkKKwkgICAgICAgJiYgdGltZW91dCkgeworCQl1ZGVsYXkoQUM5N19MSU5LX0ZSQU1FKTsKKwkJdGltZW91dC0tOworCX0KKworCWlmICh0aW1lb3V0IDw9IDApIHsKKwkJLyogSWYgUERFTiBpcyBzZXQsIHdlIGNhbiBnZXQgYSB0aW1lb3V0IHdoZW4gcGVuIGdvZXMgdXAgKi8KKwkJaWYgKGlzX3BkZW4od20pKQorCQkJd20tPnBlbl9wcm9iYWJseV9kb3duID0gMDsKKwkJZWxzZQorCQkJZGV2X2RiZyh3bS0+ZGV2LCAiYWRjIHNhbXBsZSB0aW1lb3V0Iik7CisJCXJldHVybiBSQ19QRU5VUDsKKwl9CisKKwkqc2FtcGxlID0gd205N3h4X3JlZ19yZWFkKHdtLCBBQzk3X1dNOTdYWF9ESUdJVElTRVJfUkQpOworCWlmICh3bS0+bWFjaF9vcHMgJiYgd20tPm1hY2hfb3BzLT5wb3N0X3NhbXBsZSkKKwkJd20tPm1hY2hfb3BzLT5wb3N0X3NhbXBsZShhZGNzZWwpOworCisJLyogY2hlY2sgd2UgaGF2ZSBjb3JyZWN0IHNhbXBsZSAqLworCWlmICgoKnNhbXBsZSAmIFdNOTdYWF9BRENTRUxfTUFTSykgIT0gYWRjc2VsKSB7CisJCWRldl9kYmcod20tPmRldiwgImFkYyB3cm9uZyBzYW1wbGUsIHJlYWQgJXggZ290ICV4IiwgYWRjc2VsLAorCQkqc2FtcGxlICYgV005N1hYX0FEQ1NFTF9NQVNLKTsKKwkJcmV0dXJuIFJDX1BFTlVQOworCX0KKworCWlmICghKCpzYW1wbGUgJiBXTTk3WFhfUEVOX0RPV04pKSB7CisJCXdtLT5wZW5fcHJvYmFibHlfZG93biA9IDA7CisJCXJldHVybiBSQ19QRU5VUDsKKwl9CisKKwlyZXR1cm4gUkNfVkFMSUQ7Cit9CisKKy8qCisgKiBSZWFkIGEgY29vcmQgZnJvbSB0aGUgV005NzEyIGFkYyBpbiBwb2xsaW5nIG1vZGUuCisgKi8KK3N0YXRpYyBpbnQgd205NzEyX3BvbGxfY29vcmQoc3RydWN0IHdtOTd4eCAqd20sIHN0cnVjdCB3bTk3eHhfZGF0YSAqZGF0YSkKK3sKKwlpbnQgdGltZW91dCA9IDUgKiBkZWxheTsKKworCWlmICghd20tPnBlbl9wcm9iYWJseV9kb3duKSB7CisJCXUxNiBkYXRhX3JkID0gd205N3h4X3JlZ19yZWFkKHdtLCBBQzk3X1dNOTdYWF9ESUdJVElTRVJfUkQpOworCQlpZiAoIShkYXRhX3JkICYgV005N1hYX1BFTl9ET1dOKSkKKwkJCXJldHVybiBSQ19QRU5VUDsKKwkJd20tPnBlbl9wcm9iYWJseV9kb3duID0gMTsKKwl9CisKKwkvKiBzZXQgdXAgZGlnaXRpc2VyICovCisJaWYgKHdtLT5tYWNoX29wcyAmJiB3bS0+bWFjaF9vcHMtPnByZV9zYW1wbGUpCisJCXdtLT5tYWNoX29wcy0+cHJlX3NhbXBsZShXTTk3WFhfQURDU0VMX1ggfCBXTTk3WFhfQURDU0VMX1kpOworCisJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19XTTk3WFhfRElHSVRJU0VSMSwKKwkJV005N1hYX0NPTyB8IFdNOTdYWF9QT0xMIHwgV005N1hYX0RFTEFZKGRlbGF5KSk7CisKKwkvKiB3YWl0IDMgQUM5NyB0aW1lIHNsb3RzICsgZGVsYXkgZm9yIGNvbnZlcnNpb24gYW5kIHJlYWQgeCAqLworCXBvbGxfZGVsYXkoZGVsYXkpOworCWRhdGEtPnggPSB3bTk3eHhfcmVnX3JlYWQod20sIEFDOTdfV005N1hYX0RJR0lUSVNFUl9SRCk7CisJLyogd2FpdCBmb3IgUE9MTCB0byBnbyBsb3cgKi8KKwl3aGlsZSAoKHdtOTd4eF9yZWdfcmVhZCh3bSwgQUM5N19XTTk3WFhfRElHSVRJU0VSMSkgJiBXTTk3WFhfUE9MTCkKKwkgICAgICAgJiYgdGltZW91dCkgeworCQl1ZGVsYXkoQUM5N19MSU5LX0ZSQU1FKTsKKwkJdGltZW91dC0tOworCX0KKworCWlmICh0aW1lb3V0IDw9IDApIHsKKwkJLyogSWYgUERFTiBpcyBzZXQsIHdlIGNhbiBnZXQgYSB0aW1lb3V0IHdoZW4gcGVuIGdvZXMgdXAgKi8KKwkJaWYgKGlzX3BkZW4od20pKQorCQkJd20tPnBlbl9wcm9iYWJseV9kb3duID0gMDsKKwkJZWxzZQorCQkJZGV2X2RiZyh3bS0+ZGV2LCAiYWRjIHNhbXBsZSB0aW1lb3V0Iik7CisJCXJldHVybiBSQ19QRU5VUDsKKwl9CisKKwkvKiByZWFkIGJhY2sgeSBkYXRhICovCisJZGF0YS0+eSA9IHdtOTd4eF9yZWdfcmVhZCh3bSwgQUM5N19XTTk3WFhfRElHSVRJU0VSX1JEKTsKKwlpZiAocGlsKQorCQlkYXRhLT5wID0gd205N3h4X3JlZ19yZWFkKHdtLCBBQzk3X1dNOTdYWF9ESUdJVElTRVJfUkQpOworCWVsc2UKKwkJZGF0YS0+cCA9IERFRkFVTFRfUFJFU1NVUkU7CisKKwlpZiAod20tPm1hY2hfb3BzICYmIHdtLT5tYWNoX29wcy0+cG9zdF9zYW1wbGUpCisJCXdtLT5tYWNoX29wcy0+cG9zdF9zYW1wbGUoV005N1hYX0FEQ1NFTF9YIHwgV005N1hYX0FEQ1NFTF9ZKTsKKworCS8qIGNoZWNrIHdlIGhhdmUgY29ycmVjdCBzYW1wbGUgKi8KKwlpZiAoIShkYXRhLT54ICYgV005N1hYX0FEQ1NFTF9YKSB8fCAhKGRhdGEtPnkgJiBXTTk3WFhfQURDU0VMX1kpKQorCQlnb3RvIGVycjsKKwlpZiAocGlsICYmICEoZGF0YS0+cCAmIFdNOTdYWF9BRENTRUxfUFJFUykpCisJCWdvdG8gZXJyOworCisJaWYgKCEoZGF0YS0+eCAmIFdNOTdYWF9QRU5fRE9XTikgfHwgIShkYXRhLT55ICYgV005N1hYX1BFTl9ET1dOKSkgeworCQl3bS0+cGVuX3Byb2JhYmx5X2Rvd24gPSAwOworCQlyZXR1cm4gUkNfUEVOVVA7CisJfQorCXJldHVybiBSQ19WQUxJRDsKK2VycjoKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNhbXBsZSB0aGUgV005NzEyIHRvdWNoc2NyZWVuIGluIHBvbGxpbmcgbW9kZQorICovCitzdGF0aWMgaW50IHdtOTcxMl9wb2xsX3RvdWNoKHN0cnVjdCB3bTk3eHggKndtLCBzdHJ1Y3Qgd205N3h4X2RhdGEgKmRhdGEpCit7CisJaW50IHJjOworCisJaWYgKGNvb3JkKSB7CisJCXJjID0gd205NzEyX3BvbGxfY29vcmQod20sIGRhdGEpOworCQlpZiAocmMgIT0gUkNfVkFMSUQpCisJCQlyZXR1cm4gcmM7CisJfSBlbHNlIHsKKwkJcmMgPSB3bTk3MTJfcG9sbF9zYW1wbGUod20sIFdNOTdYWF9BRENTRUxfWCwgJmRhdGEtPngpOworCQlpZiAocmMgIT0gUkNfVkFMSUQpCisJCQlyZXR1cm4gcmM7CisKKwkJcmMgPSB3bTk3MTJfcG9sbF9zYW1wbGUod20sIFdNOTdYWF9BRENTRUxfWSwgJmRhdGEtPnkpOworCQlpZiAocmMgIT0gUkNfVkFMSUQpCisJCQlyZXR1cm4gcmM7CisKKwkJaWYgKHBpbCAmJiAhZml2ZV93aXJlKSB7CisJCQlyYyA9IHdtOTcxMl9wb2xsX3NhbXBsZSh3bSwgV005N1hYX0FEQ1NFTF9QUkVTLAorCQkJCQkJJmRhdGEtPnApOworCQkJaWYgKHJjICE9IFJDX1ZBTElEKQorCQkJCXJldHVybiByYzsKKwkJfSBlbHNlCisJCQlkYXRhLT5wID0gREVGQVVMVF9QUkVTU1VSRTsKKwl9CisJcmV0dXJuIFJDX1ZBTElEOworfQorCisvKgorICogRW5hYmxlIFdNOTcxMiBjb250aW51b3VzIG1vZGUsIGkuZS4gdG91Y2ggZGF0YSBpcyBzdHJlYW1lZCBhY3Jvc3MKKyAqIGFuIEFDOTcgc2xvdAorICovCitzdGF0aWMgaW50IHdtOTcxMl9hY2NfZW5hYmxlKHN0cnVjdCB3bTk3eHggKndtLCBpbnQgZW5hYmxlKQoreworCXUxNiBkaWcxLCBkaWcyOworCWludCByZXQgPSAwOworCisJZGlnMSA9IHdtLT5kaWdbMV07CisJZGlnMiA9IHdtLT5kaWdbMl07CisKKwlpZiAoZW5hYmxlKSB7CisJCS8qIGNvbnRpbm91cyBtb2RlICovCisJCWlmICh3bS0+bWFjaF9vcHMtPmFjY19zdGFydHVwKSB7CisJCQlyZXQgPSB3bS0+bWFjaF9vcHMtPmFjY19zdGFydHVwKHdtKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJZGlnMSAmPSB+KFdNOTdYWF9DTV9SQVRFX01BU0sgfCBXTTk3WFhfQURDU0VMX01BU0sgfAorCQkJV005N1hYX0RFTEFZX01BU0sgfCBXTTk3WFhfU0xUX01BU0spOworCQlkaWcxIHw9IFdNOTdYWF9DVEMgfCBXTTk3WFhfQ09PIHwgV005N1hYX1NMRU4gfAorCQkJV005N1hYX0RFTEFZKGRlbGF5KSB8CisJCQlXTTk3WFhfU0xUKHdtLT5hY2Nfc2xvdCkgfAorCQkJV005N1hYX1JBVEUod20tPmFjY19yYXRlKTsKKwkJaWYgKHBpbCkKKwkJCWRpZzEgfD0gV005N1hYX0FEQ1NFTF9QUkVTOworCQlkaWcyIHw9IFdNOTcxMl9QREVOOworCX0gZWxzZSB7CisJCWRpZzEgJj0gfihXTTk3WFhfQ1RDIHwgV005N1hYX0NPTyB8IFdNOTdYWF9TTEVOKTsKKwkJZGlnMiAmPSB+V005NzEyX1BERU47CisJCWlmICh3bS0+bWFjaF9vcHMtPmFjY19zaHV0ZG93bikKKwkJCXdtLT5tYWNoX29wcy0+YWNjX3NodXRkb3duKHdtKTsKKwl9CisKKwl3bTk3eHhfcmVnX3dyaXRlKHdtLCBBQzk3X1dNOTdYWF9ESUdJVElTRVIxLCBkaWcxKTsKKwl3bTk3eHhfcmVnX3dyaXRlKHdtLCBBQzk3X1dNOTdYWF9ESUdJVElTRVIyLCBkaWcyKTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgd205N3h4X2NvZGVjX2RydiB3bTk3MTJfY29kZWMgPSB7CisJLmlkID0gV005NzEyX0lEMiwKKwkubmFtZSA9ICJ3bTk3MTIiLAorCS5wb2xsX3NhbXBsZSA9IHdtOTcxMl9wb2xsX3NhbXBsZSwKKwkucG9sbF90b3VjaCA9IHdtOTcxMl9wb2xsX3RvdWNoLAorCS5hY2NfZW5hYmxlID0gd205NzEyX2FjY19lbmFibGUsCisJLnBoeV9pbml0ID0gd205NzEyX3BoeV9pbml0LAorCS5kaWdfZW5hYmxlID0gd205NzEyX2RpZ19lbmFibGUsCisJLmRpZ19yZXN0b3JlID0gd205NzEyX2RpZ19yZXN0b3JlLAorCS5hdXhfcHJlcGFyZSA9IHdtOTcxMl9hdXhfcHJlcGFyZSwKK307CitFWFBPUlRfU1lNQk9MX0dQTCh3bTk3MTJfY29kZWMpOworCisvKiBNb2R1bGUgaW5mb3JtYXRpb24gKi8KK01PRFVMRV9BVVRIT1IoIkxpYW0gR2lyZHdvb2QgPGxpYW0uZ2lyZHdvb2RAd29sZnNvbm1pY3JvLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiV005NzEyIFRvdWNoIFNjcmVlbiBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vd205NzEzLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3dtOTcxMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMjc4YmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3dtOTcxMy5jCkBAIC0wLDAgKzEsNDYwIEBACisvKgorICogd205NzEzLmMgIC0tICBDb2RlYyB0b3VjaCBkcml2ZXIgZm9yIFdvbGZzb24gV005NzEzIEFDOTcgQ29kZWMuCisgKgorICogQ29weXJpZ2h0IDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqIEF1dGhvcjogTGlhbSBHaXJkd29vZAorICogICAgICAgICBsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20gb3IgbGludXhAd29sZnNvbm1pY3JvLmNvbQorICogUGFydHMgQ29weXJpZ2h0IDogSWFuIE1vbHRvbiA8c3B5cm9AZjJzLmNvbT4KKyAqICAgICAgICAgICAgICAgICAgIEFuZHJldyBaYWJvbG90bnkgPHphcEBob21lbGluay5ydT4KKyAqICAgICAgICAgICAgICAgICAgIFJ1c3NlbGwgS2luZyA8cm1rQGFybS5saW51eC5vcmcudWs+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvd205N3h4Lmg+CisKKyNkZWZpbmUgVFNfTkFNRQkJCSJ3bTk3eHgiCisjZGVmaW5lIFdNOTcxM19WRVJTSU9OCQkiMS4wMCIKKyNkZWZpbmUgREVGQVVMVF9QUkVTU1VSRQkweGIwYzAKKworLyoKKyAqIE1vZHVsZSBwYXJhbWV0ZXJzCisgKi8KKworLyoKKyAqIFNldCBpbnRlcm5hbCBwdWxsIHVwIGZvciBwZW4gZGV0ZWN0LgorICoKKyAqIFB1bGwgdXAgaXMgaW4gdGhlIHJhbmdlIDEuMDJrIChsZWFzdCBzZW5zaXRpdmUpIHRvIDY0ayAobW9zdCBzZW5zaXRpdmUpCisgKiBpLmUuIHB1bGwgdXAgcmVzaXN0YW5jZSA9IDY0ayBPaG1zIC8gcnB1LgorICoKKyAqIEFkanVzdCB0aGlzIHZhbHVlIGlmIHlvdSBhcmUgaGF2aW5nIHByb2JsZW1zIHdpdGggcGVuIGRldGVjdCBub3QKKyAqIGRldGVjdGluZyBhbnkgZG93biBldmVudC4KKyAqLworc3RhdGljIGludCBycHUgPSA4OworbW9kdWxlX3BhcmFtKHJwdSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocnB1LCAiU2V0IGludGVybmFsIHB1bGwgdXAgcmVzaXRvciBmb3IgcGVuIGRldGVjdC4iKTsKKworLyoKKyAqIFNldCBjdXJyZW50IHVzZWQgZm9yIHByZXNzdXJlIG1lYXN1cmVtZW50LgorICoKKyAqIFNldCBwaWwgPSAyIHRvIHVzZSA0MDB1QQorICogICAgIHBpbCA9IDEgdG8gdXNlIDIwMHVBIGFuZAorICogICAgIHBpbCA9IDAgdG8gZGlzYWJsZSBwcmVzc3VyZSBtZWFzdXJlbWVudC4KKyAqCisgKiBUaGlzIGlzIHVzZWQgdG8gaW5jcmVhc2UgdGhlIHJhbmdlIG9mIHZhbHVlcyByZXR1cm5lZCBieSB0aGUgYWRjCisgKiB3aGVuIG1lYXN1cmVpbmcgdG91Y2hwYW5lbCBwcmVzc3VyZS4KKyAqLworc3RhdGljIGludCBwaWw7Cittb2R1bGVfcGFyYW0ocGlsLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhwaWwsICJTZXQgY3VycmVudCB1c2VkIGZvciBwcmVzc3VyZSBtZWFzdXJlbWVudC4iKTsKKworLyoKKyAqIFNldCB0aHJlc2hvbGQgZm9yIHByZXNzdXJlIG1lYXN1cmVtZW50LgorICoKKyAqIFBlbiBkb3duIHByZXNzdXJlIGJlbG93IHRocmVzaG9sZCBpcyBpZ25vcmVkLgorICovCitzdGF0aWMgaW50IHByZXNzdXJlID0gREVGQVVMVF9QUkVTU1VSRSAmIDB4ZmZmOworbW9kdWxlX3BhcmFtKHByZXNzdXJlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhwcmVzc3VyZSwgIlNldCB0aHJlc2hvbGQgZm9yIHByZXNzdXJlIG1lYXN1cmVtZW50LiIpOworCisvKgorICogU2V0IGFkYyBzYW1wbGUgZGVsYXkuCisgKgorICogRm9yIGFjY3VyYXRlIHRvdWNocGFuZWwgbWVhc3VyZW1lbnRzLCBzb21lIHNldHRsaW5nIHRpbWUgbWF5IGJlCisgKiByZXF1aXJlZCBiZXR3ZWVuIHRoZSBzd2l0Y2ggbWF0cml4IGFwcGx5aW5nIGEgdm9sdGFnZSBhY3Jvc3MgdGhlCisgKiB0b3VjaHBhbmVsIHBsYXRlIGFuZCB0aGUgQURDIHNhbXBsaW5nIHRoZSBzaWduYWwuCisgKgorICogVGhpcyBkZWxheSBjYW4gYmUgc2V0IGJ5IHNldHRpbmcgZGVsYXkgPSBuLCB3aGVyZSBuIGlzIHRoZSBhcnJheQorICogcG9zaXRpb24gb2YgdGhlIGRlbGF5IGluIHRoZSBhcnJheSBkZWxheV90YWJsZSBiZWxvdy4KKyAqIExvbmcgZGVsYXlzID4gMW1zIGFyZSBzdXBwb3J0ZWQgZm9yIGNvbXBsZXRlbmVzcywgYnV0IGFyZSBub3QKKyAqIHJlY29tbWVuZGVkLgorICovCitzdGF0aWMgaW50IGRlbGF5ID0gNDsKK21vZHVsZV9wYXJhbShkZWxheSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVsYXksICJTZXQgYWRjIHNhbXBsZSBkZWxheS4iKTsKKworLyoKKyAqIFNldCBhZGMgbWFzayBmdW5jdGlvbi4KKyAqCisgKiBTb3VyY2VzIG9mIGdsaXRjaCBub2lzZSwgc3VjaCBhcyBzaWduYWxzIGRyaXZpbmcgYW4gTENEIGRpc3BsYXksIG1heSBmZWVkCisgKiB0aHJvdWdoIHRvIHRoZSB0b3VjaCBzY3JlZW4gcGxhdGVzIGFuZCBhZmZlY3QgbWVhc3VyZW1lbnQgYWNjdXJhY3kuIEluCisgKiBvcmRlciB0byBtaW5pbWlzZSB0aGlzLCBhIHNpZ25hbCBtYXkgYmUgYXBwbGllZCB0byB0aGUgTUFTSyBwaW4gdG8gZGVsYXkgb3IKKyAqIHN5bmNocm9uaXNlIHRoZSBzYW1wbGluZy4KKyAqCisgKiAwID0gTm8gZGVsYXkgb3Igc3luYworICogMSA9IEhpZ2ggb24gcGluIHN0b3BzIGNvbnZlcnNpb25zCisgKiAyID0gRWRnZSB0cmlnZ2VyZWQsIGVkZ2Ugb24gcGluIGRlbGF5cyBjb252ZXJzaW9uIGJ5IGRlbGF5IHBhcmFtIChhYm92ZSkKKyAqIDMgPSBFZGdlIHRyaWdnZXJlZCwgZWRnZSBvbiBwaW4gc3RhcnRzIGNvbnZlcnNpb24gYWZ0ZXIgZGVsYXkgcGFyYW0KKyAqLworc3RhdGljIGludCBtYXNrOworbW9kdWxlX3BhcmFtKG1hc2ssIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1hc2ssICJTZXQgYWRjIG1hc2sgZnVuY3Rpb24uIik7CisKKy8qCisgKiBDb29yZGluYXRlIFBvbGxpbmcgRW5hYmxlLgorICoKKyAqIFNldCB0byAxIHRvIGVuYWJsZSBjb29yZGluYXRlIHBvbGxpbmcuIGUuZy4geCx5WyxwXSBpcyBzYW1wbGVkIHRvZ2V0aGVyCisgKiBmb3IgZXZlcnkgcG9sbC4KKyAqLworc3RhdGljIGludCBjb29yZDsKK21vZHVsZV9wYXJhbShjb29yZCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoY29vcmQsICJQb2xsaW5nIGNvb3JkaW5hdGUgbW9kZSIpOworCisvKgorICogQURDIHNhbXBsZSBkZWxheSB0aW1lcyBpbiB1UworICovCitzdGF0aWMgY29uc3QgaW50IGRlbGF5X3RhYmxlW10gPSB7CisJMjEsICAgIC8qIDEgQUM5NyBMaW5rIGZyYW1lcyAqLworCTQyLCAgICAvKiAyICovCisJODQsICAgIC8qIDQgKi8KKwkxNjcsICAgLyogOCAqLworCTMzMywgICAvKiAxNiAqLworCTY2NywgICAvKiAzMiAqLworCTEwMDAsICAvKiA0OCAqLworCTEzMzMsICAvKiA2NCAqLworCTIwMDAsICAvKiA5NiAqLworCTI2NjcsICAvKiAxMjggKi8KKwkzMzMzLCAgLyogMTYwICovCisJNDAwMCwgIC8qIDE5MiAqLworCTQ2NjcsICAvKiAyMjQgKi8KKwk1MzMzLCAgLyogMjU2ICovCisJNjAwMCwgIC8qIDI4OCAqLworCTAgICAgICAvKiBObyBkZWxheSwgc3dpdGNoIG1hdHJpeCBhbHdheXMgb24gKi8KK307CisKKy8qCisgKiBEZWxheSBhZnRlciBpc3N1aW5nIGEgUE9MTCBjb21tYW5kLgorICoKKyAqIFRoZSBkZWxheSBpcyAzIEFDOTcgbGluayBmcmFtZXMgKyB0aGUgdG91Y2hwYW5lbCBzZXR0bGluZyBkZWxheQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcG9sbF9kZWxheShpbnQgZCkKK3sKKwl1ZGVsYXkoMyAqIEFDOTdfTElOS19GUkFNRSArIGRlbGF5X3RhYmxlW2RdKTsKK30KKworLyoKKyAqIHNldCB1cCB0aGUgcGh5c2ljYWwgc2V0dGluZ3Mgb2YgdGhlIFdNOTcxMworICovCitzdGF0aWMgdm9pZCB3bTk3MTNfcGh5X2luaXQoc3RydWN0IHdtOTd4eCAqd20pCit7CisJdTE2IGRpZzEgPSAwLCBkaWcyLCBkaWczOworCisJLyogZGVmYXVsdCB2YWx1ZXMgKi8KKwlkaWcyID0gV005N1hYX0RFTEFZKDQpIHwgV005N1hYX1NMVCg1KTsKKwlkaWczID0gV005NzEyX1JQVSgxKTsKKworCS8qIHJwdSAqLworCWlmIChycHUpIHsKKwkJZGlnMyAmPSAweGZmYzA7CisJCWRpZzMgfD0gV005NzEyX1JQVShycHUpOworCQlkZXZfaW5mbyh3bS0+ZGV2LCAic2V0dGluZyBwZW4gZGV0ZWN0IHB1bGwtdXAgdG8gJWQgT2htc1xuIiwKKwkJCSA2NDAwMCAvIHJwdSk7CisJfQorCisJLyogdG91Y2hwYW5lbCBwcmVzc3VyZSAqLworCWlmIChwaWwgPT0gMikgeworCQlkaWczIHw9IFdNOTcxMl9QSUw7CisJCWRldl9pbmZvKHdtLT5kZXYsCisJCQkgInNldHRpbmcgcHJlc3N1cmUgbWVhc3VyZW1lbnQgY3VycmVudCB0byA0MDB1QS4iKTsKKwl9IGVsc2UgaWYgKHBpbCkKKwkJZGV2X2luZm8od20tPmRldiwKKwkJCSAic2V0dGluZyBwcmVzc3VyZSBtZWFzdXJlbWVudCBjdXJyZW50IHRvIDIwMHVBLiIpOworCWlmICghcGlsKQorCQlwcmVzc3VyZSA9IDA7CisKKwkvKiBzYW1wbGUgc2V0dGxpbmcgZGVsYXkgKi8KKwlpZiAoZGVsYXkgPCAwIHx8IGRlbGF5ID4gMTUpIHsKKwkJZGV2X2luZm8od20tPmRldiwgInN1cHBsaWVkIGRlbGF5IG91dCBvZiByYW5nZS4iKTsKKwkJZGVsYXkgPSA0OworCQlkZXZfaW5mbyh3bS0+ZGV2LCAic2V0dGluZyBhZGMgc2FtcGxlIGRlbGF5IHRvICVkIHUgU2Vjcy4iLAorCQkJIGRlbGF5X3RhYmxlW2RlbGF5XSk7CisJfQorCWRpZzIgJj0gMHhmZjBmOworCWRpZzIgfD0gV005N1hYX0RFTEFZKGRlbGF5KTsKKworCS8qIG1hc2sgKi8KKwlkaWczIHw9ICgobWFzayAmIDB4MykgPDwgNCk7CisJaWYgKGNvb3JkKQorCQlkaWczIHw9IFdNOTcxM19XQUlUOworCisJd20tPm1pc2MgPSB3bTk3eHhfcmVnX3JlYWQod20sIDB4NWEpOworCisJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19XTTk3MTNfRElHMSwgZGlnMSk7CisJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19XTTk3MTNfRElHMiwgZGlnMik7CisJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19XTTk3MTNfRElHMywgZGlnMyk7CisJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19HUElPX1NUSUNLWSwgMHgwKTsKK30KKworc3RhdGljIHZvaWQgd205NzEzX2RpZ19lbmFibGUoc3RydWN0IHdtOTd4eCAqd20sIGludCBlbmFibGUpCit7CisJdTE2IHZhbDsKKworCWlmIChlbmFibGUpIHsKKwkJdmFsID0gd205N3h4X3JlZ19yZWFkKHdtLCBBQzk3X0VYVEVOREVEX01JRCk7CisJCXdtOTd4eF9yZWdfd3JpdGUod20sIEFDOTdfRVhURU5ERURfTUlELCB2YWwgJiAweDdmZmYpOworCQl3bTk3eHhfcmVnX3dyaXRlKHdtLCBBQzk3X1dNOTcxM19ESUczLCB3bS0+ZGlnWzJdIHwKKwkJCQkgV005N1hYX1BSUF9ERVRfRElHKTsKKwkJd205N3h4X3JlZ19yZWFkKHdtLCBBQzk3X1dNOTdYWF9ESUdJVElTRVJfUkQpOyAvKiBkdW1teSByZWFkICovCisJfSBlbHNlIHsKKwkJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19XTTk3MTNfRElHMywgd20tPmRpZ1syXSAmCisJCQkJCX5XTTk3WFhfUFJQX0RFVF9ESUcpOworCQl2YWwgPSB3bTk3eHhfcmVnX3JlYWQod20sIEFDOTdfRVhURU5ERURfTUlEKTsKKwkJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19FWFRFTkRFRF9NSUQsIHZhbCB8IDB4ODAwMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCB3bTk3MTNfZGlnX3Jlc3RvcmUoc3RydWN0IHdtOTd4eCAqd20pCit7CisJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19XTTk3MTNfRElHMSwgd20tPmRpZ19zYXZlWzBdKTsKKwl3bTk3eHhfcmVnX3dyaXRlKHdtLCBBQzk3X1dNOTcxM19ESUcyLCB3bS0+ZGlnX3NhdmVbMV0pOworCXdtOTd4eF9yZWdfd3JpdGUod20sIEFDOTdfV005NzEzX0RJRzMsIHdtLT5kaWdfc2F2ZVsyXSk7Cit9CisKK3N0YXRpYyB2b2lkIHdtOTcxM19hdXhfcHJlcGFyZShzdHJ1Y3Qgd205N3h4ICp3bSkKK3sKKwltZW1jcHkod20tPmRpZ19zYXZlLCB3bS0+ZGlnLCBzaXplb2Yod20tPmRpZykpOworCXdtOTd4eF9yZWdfd3JpdGUod20sIEFDOTdfV005NzEzX0RJRzEsIDApOworCXdtOTd4eF9yZWdfd3JpdGUod20sIEFDOTdfV005NzEzX0RJRzIsIDApOworCXdtOTd4eF9yZWdfd3JpdGUod20sIEFDOTdfV005NzEzX0RJRzMsIFdNOTdYWF9QUlBfREVUX0RJRyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3BkZW4oc3RydWN0IHdtOTd4eCAqd20pCit7CisJcmV0dXJuIHdtLT5kaWdbMl0gJiBXTTk3MTNfUERFTjsKK30KKworLyoKKyAqIFJlYWQgYSBzYW1wbGUgZnJvbSB0aGUgV005NzEzIGFkYyBpbiBwb2xsaW5nIG1vZGUuCisgKi8KK3N0YXRpYyBpbnQgd205NzEzX3BvbGxfc2FtcGxlKHN0cnVjdCB3bTk3eHggKndtLCBpbnQgYWRjc2VsLCBpbnQgKnNhbXBsZSkKK3sKKwl1MTYgZGlnMTsKKwlpbnQgdGltZW91dCA9IDUgKiBkZWxheTsKKworCWlmICghd20tPnBlbl9wcm9iYWJseV9kb3duKSB7CisJCXUxNiBkYXRhID0gd205N3h4X3JlZ19yZWFkKHdtLCBBQzk3X1dNOTdYWF9ESUdJVElTRVJfUkQpOworCQlpZiAoIShkYXRhICYgV005N1hYX1BFTl9ET1dOKSkKKwkJCXJldHVybiBSQ19QRU5VUDsKKwkJd20tPnBlbl9wcm9iYWJseV9kb3duID0gMTsKKwl9CisKKwkvKiBzZXQgdXAgZGlnaXRpc2VyICovCisJaWYgKGFkY3NlbCAmIDB4ODAwMCkKKwkJYWRjc2VsID0gMSA8PCAoKGFkY3NlbCAmIDB4N2ZmZikgKyAzKTsKKworCWRpZzEgPSB3bTk3eHhfcmVnX3JlYWQod20sIEFDOTdfV005NzEzX0RJRzEpOworCWRpZzEgJj0gfldNOTcxM19BRENTRUxfTUFTSzsKKworCWlmICh3bS0+bWFjaF9vcHMgJiYgd20tPm1hY2hfb3BzLT5wcmVfc2FtcGxlKQorCQl3bS0+bWFjaF9vcHMtPnByZV9zYW1wbGUoYWRjc2VsKTsKKwl3bTk3eHhfcmVnX3dyaXRlKHdtLCBBQzk3X1dNOTcxM19ESUcxLCBkaWcxIHwgYWRjc2VsIHwgV005NzEzX1BPTEwpOworCisJLyogd2FpdCAzIEFDOTcgdGltZSBzbG90cyArIGRlbGF5IGZvciBjb252ZXJzaW9uICovCisJcG9sbF9kZWxheShkZWxheSk7CisKKwkvKiB3YWl0IGZvciBQT0xMIHRvIGdvIGxvdyAqLworCXdoaWxlICgod205N3h4X3JlZ19yZWFkKHdtLCBBQzk3X1dNOTcxM19ESUcxKSAmIFdNOTcxM19QT0xMKSAmJgorCQl0aW1lb3V0KSB7CisJCXVkZWxheShBQzk3X0xJTktfRlJBTUUpOworCQl0aW1lb3V0LS07CisJfQorCisJaWYgKHRpbWVvdXQgPD0gMCkgeworCQkvKiBJZiBQREVOIGlzIHNldCwgd2UgY2FuIGdldCBhIHRpbWVvdXQgd2hlbiBwZW4gZ29lcyB1cCAqLworCQlpZiAoaXNfcGRlbih3bSkpCisJCQl3bS0+cGVuX3Byb2JhYmx5X2Rvd24gPSAwOworCQllbHNlCisJCQlkZXZfZGJnKHdtLT5kZXYsICJhZGMgc2FtcGxlIHRpbWVvdXQiKTsKKwkJcmV0dXJuIFJDX1BFTlVQOworCX0KKworCSpzYW1wbGUgPSB3bTk3eHhfcmVnX3JlYWQod20sIEFDOTdfV005N1hYX0RJR0lUSVNFUl9SRCk7CisJaWYgKHdtLT5tYWNoX29wcyAmJiB3bS0+bWFjaF9vcHMtPnBvc3Rfc2FtcGxlKQorCQl3bS0+bWFjaF9vcHMtPnBvc3Rfc2FtcGxlKGFkY3NlbCk7CisKKwkvKiBjaGVjayB3ZSBoYXZlIGNvcnJlY3Qgc2FtcGxlICovCisJaWYgKCgqc2FtcGxlICYgV005N1hYX0FEQ1NSQ19NQVNLKSAhPSBmZnMoYWRjc2VsID4+IDEpIDw8IDEyKSB7CisJCWRldl9kYmcod20tPmRldiwgImFkYyB3cm9uZyBzYW1wbGUsIHJlYWQgJXggZ290ICV4IiwgYWRjc2VsLAorCQkJKnNhbXBsZSAmIFdNOTdYWF9BRENTUkNfTUFTSyk7CisJCXJldHVybiBSQ19QRU5VUDsKKwl9CisKKwlpZiAoISgqc2FtcGxlICYgV005N1hYX1BFTl9ET1dOKSkgeworCQl3bS0+cGVuX3Byb2JhYmx5X2Rvd24gPSAwOworCQlyZXR1cm4gUkNfUEVOVVA7CisJfQorCisJcmV0dXJuIFJDX1ZBTElEOworfQorCisvKgorICogUmVhZCBhIGNvb3JkaW5hdGUgZnJvbSB0aGUgV005NzEzIGFkYyBpbiBwb2xsaW5nIG1vZGUuCisgKi8KK3N0YXRpYyBpbnQgd205NzEzX3BvbGxfY29vcmQoc3RydWN0IHdtOTd4eCAqd20sIHN0cnVjdCB3bTk3eHhfZGF0YSAqZGF0YSkKK3sKKwl1MTYgZGlnMTsKKwlpbnQgdGltZW91dCA9IDUgKiBkZWxheTsKKworCWlmICghd20tPnBlbl9wcm9iYWJseV9kb3duKSB7CisJCXUxNiB2YWwgPSB3bTk3eHhfcmVnX3JlYWQod20sIEFDOTdfV005N1hYX0RJR0lUSVNFUl9SRCk7CisJCWlmICghKHZhbCAmIFdNOTdYWF9QRU5fRE9XTikpCisJCQlyZXR1cm4gUkNfUEVOVVA7CisJCXdtLT5wZW5fcHJvYmFibHlfZG93biA9IDE7CisJfQorCisJLyogc2V0IHVwIGRpZ2l0aXNlciAqLworCWRpZzEgPSB3bTk3eHhfcmVnX3JlYWQod20sIEFDOTdfV005NzEzX0RJRzEpOworCWRpZzEgJj0gfldNOTcxM19BRENTRUxfTUFTSzsKKwlpZiAocGlsKQorCQlkaWcxIHw9IFdNOTcxM19BRENTRUxfUFJFUzsKKworCWlmICh3bS0+bWFjaF9vcHMgJiYgd20tPm1hY2hfb3BzLT5wcmVfc2FtcGxlKQorCQl3bS0+bWFjaF9vcHMtPnByZV9zYW1wbGUoV005N1hYX0FEQ1NFTF9YIHwgV005N1hYX0FEQ1NFTF9ZKTsKKwl3bTk3eHhfcmVnX3dyaXRlKHdtLCBBQzk3X1dNOTcxM19ESUcxLAorCQkJIGRpZzEgfCBXTTk3MTNfUE9MTCB8IFdNOTcxM19DT08pOworCisJLyogd2FpdCAzIEFDOTcgdGltZSBzbG90cyArIGRlbGF5IGZvciBjb252ZXJzaW9uICovCisJcG9sbF9kZWxheShkZWxheSk7CisJZGF0YS0+eCA9IHdtOTd4eF9yZWdfcmVhZCh3bSwgQUM5N19XTTk3WFhfRElHSVRJU0VSX1JEKTsKKwkvKiB3YWl0IGZvciBQT0xMIHRvIGdvIGxvdyAqLworCXdoaWxlICgod205N3h4X3JlZ19yZWFkKHdtLCBBQzk3X1dNOTcxM19ESUcxKSAmIFdNOTcxM19QT0xMKQorCSAgICAgICAmJiB0aW1lb3V0KSB7CisJCXVkZWxheShBQzk3X0xJTktfRlJBTUUpOworCQl0aW1lb3V0LS07CisJfQorCisJaWYgKHRpbWVvdXQgPD0gMCkgeworCQkvKiBJZiBQREVOIGlzIHNldCwgd2UgY2FuIGdldCBhIHRpbWVvdXQgd2hlbiBwZW4gZ29lcyB1cCAqLworCQlpZiAoaXNfcGRlbih3bSkpCisJCQl3bS0+cGVuX3Byb2JhYmx5X2Rvd24gPSAwOworCQllbHNlCisJCQlkZXZfZGJnKHdtLT5kZXYsICJhZGMgc2FtcGxlIHRpbWVvdXQiKTsKKwkJcmV0dXJuIFJDX1BFTlVQOworCX0KKworCS8qIHJlYWQgYmFjayBkYXRhICovCisJZGF0YS0+eSA9IHdtOTd4eF9yZWdfcmVhZCh3bSwgQUM5N19XTTk3WFhfRElHSVRJU0VSX1JEKTsKKwlpZiAocGlsKQorCQlkYXRhLT5wID0gd205N3h4X3JlZ19yZWFkKHdtLCBBQzk3X1dNOTdYWF9ESUdJVElTRVJfUkQpOworCWVsc2UKKwkJZGF0YS0+cCA9IERFRkFVTFRfUFJFU1NVUkU7CisKKwlpZiAod20tPm1hY2hfb3BzICYmIHdtLT5tYWNoX29wcy0+cG9zdF9zYW1wbGUpCisJCXdtLT5tYWNoX29wcy0+cG9zdF9zYW1wbGUoV005N1hYX0FEQ1NFTF9YIHwgV005N1hYX0FEQ1NFTF9ZKTsKKworCS8qIGNoZWNrIHdlIGhhdmUgY29ycmVjdCBzYW1wbGUgKi8KKwlpZiAoIShkYXRhLT54ICYgV005N1hYX0FEQ1NFTF9YKSB8fCAhKGRhdGEtPnkgJiBXTTk3WFhfQURDU0VMX1kpKQorCQlnb3RvIGVycjsKKwlpZiAocGlsICYmICEoZGF0YS0+cCAmIFdNOTdYWF9BRENTRUxfUFJFUykpCisJCWdvdG8gZXJyOworCisJaWYgKCEoZGF0YS0+eCAmIFdNOTdYWF9QRU5fRE9XTikgfHwgIShkYXRhLT55ICYgV005N1hYX1BFTl9ET1dOKSkgeworCQl3bS0+cGVuX3Byb2JhYmx5X2Rvd24gPSAwOworCQlyZXR1cm4gUkNfUEVOVVA7CisJfQorCXJldHVybiBSQ19WQUxJRDsKK2VycjoKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNhbXBsZSB0aGUgV005NzEzIHRvdWNoc2NyZWVuIGluIHBvbGxpbmcgbW9kZQorICovCitzdGF0aWMgaW50IHdtOTcxM19wb2xsX3RvdWNoKHN0cnVjdCB3bTk3eHggKndtLCBzdHJ1Y3Qgd205N3h4X2RhdGEgKmRhdGEpCit7CisJaW50IHJjOworCisJaWYgKGNvb3JkKSB7CisJCXJjID0gd205NzEzX3BvbGxfY29vcmQod20sIGRhdGEpOworCQlpZiAocmMgIT0gUkNfVkFMSUQpCisJCQlyZXR1cm4gcmM7CisJfSBlbHNlIHsKKwkJcmMgPSB3bTk3MTNfcG9sbF9zYW1wbGUod20sIFdNOTcxM19BRENTRUxfWCwgJmRhdGEtPngpOworCQlpZiAocmMgIT0gUkNfVkFMSUQpCisJCQlyZXR1cm4gcmM7CisJCXJjID0gd205NzEzX3BvbGxfc2FtcGxlKHdtLCBXTTk3MTNfQURDU0VMX1ksICZkYXRhLT55KTsKKwkJaWYgKHJjICE9IFJDX1ZBTElEKQorCQkJcmV0dXJuIHJjOworCQlpZiAocGlsKSB7CisJCQlyYyA9IHdtOTcxM19wb2xsX3NhbXBsZSh3bSwgV005NzEzX0FEQ1NFTF9QUkVTLAorCQkJCQkJJmRhdGEtPnApOworCQkJaWYgKHJjICE9IFJDX1ZBTElEKQorCQkJCXJldHVybiByYzsKKwkJfSBlbHNlCisJCQlkYXRhLT5wID0gREVGQVVMVF9QUkVTU1VSRTsKKwl9CisJcmV0dXJuIFJDX1ZBTElEOworfQorCisvKgorICogRW5hYmxlIFdNOTcxMyBjb250aW51b3VzIG1vZGUsIGkuZS4gdG91Y2ggZGF0YSBpcyBzdHJlYW1lZCBhY3Jvc3MKKyAqIGFuIEFDOTcgc2xvdAorICovCitzdGF0aWMgaW50IHdtOTcxM19hY2NfZW5hYmxlKHN0cnVjdCB3bTk3eHggKndtLCBpbnQgZW5hYmxlKQoreworCXUxNiBkaWcxLCBkaWcyLCBkaWczOworCWludCByZXQgPSAwOworCisJZGlnMSA9IHdtLT5kaWdbMF07CisJZGlnMiA9IHdtLT5kaWdbMV07CisJZGlnMyA9IHdtLT5kaWdbMl07CisKKwlpZiAoZW5hYmxlKSB7CisJCS8qIGNvbnRpbm91cyBtb2RlICovCisJCWlmICh3bS0+bWFjaF9vcHMtPmFjY19zdGFydHVwICYmCisJCQkocmV0ID0gd20tPm1hY2hfb3BzLT5hY2Nfc3RhcnR1cCh3bSkpIDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJZGlnMSAmPSB+V005NzEzX0FEQ1NFTF9NQVNLOworCQlkaWcxIHw9IFdNOTcxM19DVEMgfCBXTTk3MTNfQ09PIHwgV005NzEzX0FEQ1NFTF9YIHwKKwkJCVdNOTcxM19BRENTRUxfWTsKKwkJaWYgKHBpbCkKKwkJCWRpZzEgfD0gV005NzEzX0FEQ1NFTF9QUkVTOworCQlkaWcyICY9IH4oV005N1hYX0RFTEFZX01BU0sgfCBXTTk3WFhfU0xUX01BU0sgIHwKKwkJCVdNOTdYWF9DTV9SQVRFX01BU0spOworCQlkaWcyIHw9IFdNOTdYWF9TTEVOIHwgV005N1hYX0RFTEFZKGRlbGF5KSB8CisJCVdNOTdYWF9TTFQod20tPmFjY19zbG90KSB8IFdNOTdYWF9SQVRFKHdtLT5hY2NfcmF0ZSk7CisJCWRpZzMgfD0gV005NzEzX1BERU47CisJfSBlbHNlIHsKKwkJZGlnMSAmPSB+KFdNOTcxM19DVEMgfCBXTTk3MTNfQ09PKTsKKwkJZGlnMiAmPSB+V005N1hYX1NMRU47CisJCWRpZzMgJj0gfldNOTcxM19QREVOOworCQlpZiAod20tPm1hY2hfb3BzLT5hY2Nfc2h1dGRvd24pCisJCQl3bS0+bWFjaF9vcHMtPmFjY19zaHV0ZG93bih3bSk7CisJfQorCisJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19XTTk3MTNfRElHMSwgZGlnMSk7CisJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19XTTk3MTNfRElHMiwgZGlnMik7CisJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19XTTk3MTNfRElHMywgZGlnMyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3Qgd205N3h4X2NvZGVjX2RydiB3bTk3MTNfY29kZWMgPSB7CisJLmlkID0gV005NzEzX0lEMiwKKwkubmFtZSA9ICJ3bTk3MTMiLAorCS5wb2xsX3NhbXBsZSA9IHdtOTcxM19wb2xsX3NhbXBsZSwKKwkucG9sbF90b3VjaCA9IHdtOTcxM19wb2xsX3RvdWNoLAorCS5hY2NfZW5hYmxlID0gd205NzEzX2FjY19lbmFibGUsCisJLnBoeV9pbml0ID0gd205NzEzX3BoeV9pbml0LAorCS5kaWdfZW5hYmxlID0gd205NzEzX2RpZ19lbmFibGUsCisJLmRpZ19yZXN0b3JlID0gd205NzEzX2RpZ19yZXN0b3JlLAorCS5hdXhfcHJlcGFyZSA9IHdtOTcxM19hdXhfcHJlcGFyZSwKK307CitFWFBPUlRfU1lNQk9MX0dQTCh3bTk3MTNfY29kZWMpOworCisvKiBNb2R1bGUgaW5mb3JtYXRpb24gKi8KK01PRFVMRV9BVVRIT1IoIkxpYW0gR2lyZHdvb2QgPGxpYW0uZ2lyZHdvb2RAd29sZnNvbm1pY3JvLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiV005NzEzIFRvdWNoIFNjcmVlbiBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vd205N3h4LWNvcmUuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vd205N3h4LWNvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWM3ZWE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi93bTk3eHgtY29yZS5jCkBAIC0wLDAgKzEsODI5IEBACisvKgorICogd205N3h4LWNvcmUuYyAgLS0gIFRvdWNoIHNjcmVlbiBkcml2ZXIgY29yZSBmb3IgV29sZnNvbiBXTTk3MDUsIFdNOTcxMgorICogICAgICAgICAgICAgICAgICAgIGFuZCBXTTk3MTMgQUM5NyBDb2RlY3MuCisgKgorICogQ29weXJpZ2h0IDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqIEF1dGhvcjogTGlhbSBHaXJkd29vZAorICogICAgICAgICBsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20gb3IgbGludXhAd29sZnNvbm1pY3JvLmNvbQorICogUGFydHMgQ29weXJpZ2h0IDogSWFuIE1vbHRvbiA8c3B5cm9AZjJzLmNvbT4KKyAqICAgICAgICAgICAgICAgICAgIEFuZHJldyBaYWJvbG90bnkgPHphcEBob21lbGluay5ydT4KKyAqICAgICAgICAgICAgICAgICAgIFJ1c3NlbGwgS2luZyA8cm1rQGFybS5saW51eC5vcmcudWs+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTm90ZXM6CisgKgorICogIEZlYXR1cmVzOgorICogICAgICAgLSBzdXBwb3J0cyBXTTk3MDUsIFdNOTcxMiwgV005NzEzCisgKiAgICAgICAtIHBvbGxpbmcgbW9kZQorICogICAgICAgLSBjb250aW51b3VzIG1vZGUgKGFyY2gtZGVwZW5kZW50KQorICogICAgICAgLSBhZGp1c3RhYmxlIHJwdS9kcHAgc2V0dGluZ3MKKyAqICAgICAgIC0gYWRqdXN0YWJsZSBwcmVzc3VyZSBjdXJyZW50CisgKiAgICAgICAtIGFkanVzdGFibGUgc2FtcGxlIHNldHRsZSBkZWxheQorICogICAgICAgLSA0IGFuZCA1IHdpcmUgdG91Y2hzY3JlZW5zICg1IHdpcmUgaXMgV005NzEyIG9ubHkpCisgKiAgICAgICAtIHBlbiBkb3duIGRldGVjdGlvbgorICogICAgICAgLSBiYXR0ZXJ5IG1vbml0b3IKKyAqICAgICAgIC0gc2FtcGxlIEFVWCBhZGNzCisgKiAgICAgICAtIHBvd2VyIG1hbmFnZW1lbnQKKyAqICAgICAgIC0gY29kZWMgR1BJTworICogICAgICAgLSBjb2RlYyBldmVudCBub3RpZmljYXRpb24KKyAqIFRvZG8KKyAqICAgICAgIC0gU3VwcG9ydCBmb3IgYXN5bmMgc2FtcGxpbmcgY29udHJvbCBmb3Igbm9pc3kgTENEcy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dtOTd4eC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjZGVmaW5lIFRTX05BTUUJCQkid205N3h4IgorI2RlZmluZSBXTV9DT1JFX1ZFUlNJT04JCSIxLjAwIgorI2RlZmluZSBERUZBVUxUX1BSRVNTVVJFCTB4YjBjMAorCisKKy8qCisgKiBUb3VjaHNjcmVlbiBhYnNvbHV0ZSB2YWx1ZXMKKyAqCisgKiBUaGVzZSBwYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIGhlbHAgdGhlIGlucHV0IGxheWVyIGRpc2NhcmQgb3V0IG9mCisgKiByYW5nZSByZWFkaW5ncyBhbmQgcmVkdWNlIGppdHRlciBldGMuCisgKgorICogICBvIG1pbiwgbWF4Oi0gaW5kaWNhdGUgdGhlIG1pbiBhbmQgbWF4IHZhbHVlcyB5b3VyIHRvdWNoIHNjcmVlbiByZXR1cm5zCisgKiAgIG8gZnV6ejotIHVzZSBhIGhpZ2hlciBudW1iZXIgdG8gcmVkdWNlIGppdHRlcgorICoKKyAqIFRoZSBkZWZhdWx0IHZhbHVlcyBjb3JyZXNwb25kIHRvIE1haW5zdG9uZSBJSSBpbiBRVkdBIG1vZGUKKyAqCisgKiBQbGVhc2UgcmVhZAorICogRG9jdW1lbnRhdGlvbi9pbnB1dC9pbnB1dC1wcm9ncmFtbWluZy50eHQgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitzdGF0aWMgaW50IGFic194WzNdID0gezM1MCwgMzkwMCwgNX07Cittb2R1bGVfcGFyYW1fYXJyYXkoYWJzX3gsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGFic194LCAiVG91Y2hzY3JlZW4gYWJzb2x1dGUgWCBtaW4sIG1heCwgZnV6eiIpOworCitzdGF0aWMgaW50IGFic195WzNdID0gezMyMCwgMzc1MCwgNDB9OworbW9kdWxlX3BhcmFtX2FycmF5KGFic195LCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhhYnNfeSwgIlRvdWNoc2NyZWVuIGFic29sdXRlIFkgbWluLCBtYXgsIGZ1enoiKTsKKworc3RhdGljIGludCBhYnNfcFszXSA9IHswLCAxNTAsIDR9OworbW9kdWxlX3BhcmFtX2FycmF5KGFic19wLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhhYnNfcCwgIlRvdWNoc2NyZWVuIGFic29sdXRlIFByZXNzdXJlIG1pbiwgbWF4LCBmdXp6Iik7CisKKy8qCisgKiB3bTk3eHggSU8gYWNjZXNzLCBhbGwgSU8gbG9ja2luZyBkb25lIGJ5IEFDOTcgbGF5ZXIKKyAqLworaW50IHdtOTd4eF9yZWdfcmVhZChzdHJ1Y3Qgd205N3h4ICp3bSwgdTE2IHJlZykKK3sKKwlpZiAod20tPmFjOTcpCisJCXJldHVybiB3bS0+YWM5Ny0+YnVzLT5vcHMtPnJlYWQod20tPmFjOTcsIHJlZyk7CisJZWxzZQorCQlyZXR1cm4gLTE7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3bTk3eHhfcmVnX3JlYWQpOworCit2b2lkIHdtOTd4eF9yZWdfd3JpdGUoc3RydWN0IHdtOTd4eCAqd20sIHUxNiByZWcsIHUxNiB2YWwpCit7CisJLyogY2FjaGUgZGlnaXRpc2VyIHJlZ2lzdGVycyAqLworCWlmIChyZWcgPj0gQUM5N19XTTk3MTNfRElHMSAmJiByZWcgPD0gQUM5N19XTTk3MTNfRElHMykKKwkJd20tPmRpZ1socmVnIC0gQUM5N19XTTk3MTNfRElHMSkgPj4gMV0gPSB2YWw7CisKKwkvKiBjYWNoZSBncGlvIHJlZ3MgKi8KKwlpZiAocmVnID49IEFDOTdfR1BJT19DRkcgJiYgcmVnIDw9IEFDOTdfTUlTQ19BRkUpCisJCXdtLT5ncGlvWyhyZWcgLSBBQzk3X0dQSU9fQ0ZHKSA+PiAxXSA9IHZhbDsKKworCS8qIHdtOTcxMyBpcnEgcmVnICovCisJaWYgKHJlZyA9PSAweDVhKQorCQl3bS0+bWlzYyA9IHZhbDsKKworCWlmICh3bS0+YWM5NykKKwkJd20tPmFjOTctPmJ1cy0+b3BzLT53cml0ZSh3bS0+YWM5NywgcmVnLCB2YWwpOworfQorRVhQT1JUX1NZTUJPTF9HUEwod205N3h4X3JlZ193cml0ZSk7CisKKy8qKgorICogd205N3h4X3JlYWRfYXV4X2FkYyAtIFJlYWQgdGhlIGF1eCBhZGMuCisgKiBAd206IHdtOTd4eCBkZXZpY2UuCisgKiBAYWRjc2VsOiBjb2RlYyBBREMgdG8gYmUgcmVhZAorICoKKyAqIFJlYWRzIHRoZSBzZWxlY3RlZCBBVVggQURDLgorICovCisKK2ludCB3bTk3eHhfcmVhZF9hdXhfYWRjKHN0cnVjdCB3bTk3eHggKndtLCB1MTYgYWRjc2VsKQoreworCWludCBwb3dlcl9hZGMgPSAwLCBhdXh2YWw7CisJdTE2IHBvd2VyID0gMDsKKworCS8qIGdldCBjb2RlYyAqLworCW11dGV4X2xvY2soJndtLT5jb2RlY19tdXRleCk7CisKKwkvKiBXaGVuIHRoZSB0b3VjaHNjcmVlbiBpcyBub3QgaW4gdXNlLCB3ZSBtYXkgaGF2ZSB0byBwb3dlciB1cAorCSAqIHRoZSBBVVggQURDIGJlZm9yZSB3ZSBjYW4gdXNlIHNhbXBsZSB0aGUgQVVYIGlucHV0cy0+CisJICovCisJaWYgKHdtLT5pZCA9PSBXTTk3MTNfSUQyICYmCisJICAgIChwb3dlciA9IHdtOTd4eF9yZWdfcmVhZCh3bSwgQUM5N19FWFRFTkRFRF9NSUQpKSAmIDB4ODAwMCkgeworCQlwb3dlcl9hZGMgPSAxOworCQl3bTk3eHhfcmVnX3dyaXRlKHdtLCBBQzk3X0VYVEVOREVEX01JRCwgcG93ZXIgJiAweDdmZmYpOworCX0KKworCS8qIFByZXBhcmUgdGhlIGNvZGVjIGZvciBBVVggcmVhZGluZyAqLworCXdtLT5jb2RlYy0+YXV4X3ByZXBhcmUod20pOworCisJLyogVHVybiBwb2xsaW5nIG1vZGUgb24gdG8gcmVhZCBBVVggQURDICovCisJd20tPnBlbl9wcm9iYWJseV9kb3duID0gMTsKKwl3bS0+Y29kZWMtPnBvbGxfc2FtcGxlKHdtLCBhZGNzZWwsICZhdXh2YWwpOworCisJaWYgKHBvd2VyX2FkYykKKwkJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19FWFRFTkRFRF9NSUQsIHBvd2VyIHwgMHg4MDAwKTsKKworCXdtLT5jb2RlYy0+ZGlnX3Jlc3RvcmUod20pOworCisJd20tPnBlbl9wcm9iYWJseV9kb3duID0gMDsKKworCW11dGV4X3VubG9jaygmd20tPmNvZGVjX211dGV4KTsKKwlyZXR1cm4gYXV4dmFsICYgMHhmZmY7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3bTk3eHhfcmVhZF9hdXhfYWRjKTsKKworLyoqCisgKiB3bTk3eHhfZ2V0X2dwaW8gLSBHZXQgdGhlIHN0YXR1cyBvZiBhIGNvZGVjIEdQSU8uCisgKiBAd206IHdtOTd4eCBkZXZpY2UuCisgKiBAZ3BpbzogZ3BpbworICoKKyAqIEdldCB0aGUgc3RhdHVzIG9mIGEgY29kZWMgR1BJTyBwaW4KKyAqLworCitlbnVtIHdtOTd4eF9ncGlvX3N0YXR1cyB3bTk3eHhfZ2V0X2dwaW8oc3RydWN0IHdtOTd4eCAqd20sIHUzMiBncGlvKQoreworCXUxNiBzdGF0dXM7CisJZW51bSB3bTk3eHhfZ3Bpb19zdGF0dXMgcmV0OworCisJbXV0ZXhfbG9jaygmd20tPmNvZGVjX211dGV4KTsKKwlzdGF0dXMgPSB3bTk3eHhfcmVnX3JlYWQod20sIEFDOTdfR1BJT19TVEFUVVMpOworCisJaWYgKHN0YXR1cyAmIGdwaW8pCisJCXJldCA9IFdNOTdYWF9HUElPX0hJR0g7CisJZWxzZQorCQlyZXQgPSBXTTk3WFhfR1BJT19MT1c7CisKKwltdXRleF91bmxvY2soJndtLT5jb2RlY19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdtOTd4eF9nZXRfZ3Bpbyk7CisKKy8qKgorICogd205N3h4X3NldF9ncGlvIC0gU2V0IHRoZSBzdGF0dXMgb2YgYSBjb2RlYyBHUElPLgorICogQHdtOiB3bTk3eHggZGV2aWNlLgorICogQGdwaW86IGdwaW8KKyAqCisgKgorICogU2V0IHRoZSBzdGF0dXMgb2YgYSBjb2RlYyBHUElPIHBpbgorICovCisKK3ZvaWQgd205N3h4X3NldF9ncGlvKHN0cnVjdCB3bTk3eHggKndtLCB1MzIgZ3BpbywKKwkJCQllbnVtIHdtOTd4eF9ncGlvX3N0YXR1cyBzdGF0dXMpCit7CisJdTE2IHJlZzsKKworCW11dGV4X2xvY2soJndtLT5jb2RlY19tdXRleCk7CisJcmVnID0gd205N3h4X3JlZ19yZWFkKHdtLCBBQzk3X0dQSU9fU1RBVFVTKTsKKworCWlmIChzdGF0dXMgJiBXTTk3WFhfR1BJT19ISUdIKQorCQlyZWcgfD0gZ3BpbzsKKwllbHNlCisJCXJlZyAmPSB+Z3BpbzsKKworCWlmICh3bS0+aWQgPT0gV005NzEyX0lEMikKKwkJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19HUElPX1NUQVRVUywgcmVnIDw8IDEpOworCWVsc2UKKwkJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19HUElPX1NUQVRVUywgcmVnKTsKKwltdXRleF91bmxvY2soJndtLT5jb2RlY19tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3bTk3eHhfc2V0X2dwaW8pOworCisvKgorICogQ29kZWMgR1BJTyBwaW4gY29uZmlndXJhdGlvbiwgdGhpcyBzZXRzIHBpbiBkaXJlY3Rpb24sIHBvbGFyaXR5LAorICogc3RpY2t5bmVzcyBhbmQgd2FrZSB1cC4KKyAqLwordm9pZCB3bTk3eHhfY29uZmlnX2dwaW8oc3RydWN0IHdtOTd4eCAqd20sIHUzMiBncGlvLCBlbnVtIHdtOTd4eF9ncGlvX2RpciBkaXIsCisJCSAgIGVudW0gd205N3h4X2dwaW9fcG9sIHBvbCwgZW51bSB3bTk3eHhfZ3Bpb19zdGlja3kgc3RpY2t5LAorCQkgICBlbnVtIHdtOTd4eF9ncGlvX3dha2Ugd2FrZSkKK3sKKwl1MTYgcmVnOworCisJbXV0ZXhfbG9jaygmd20tPmNvZGVjX211dGV4KTsKKwlyZWcgPSB3bTk3eHhfcmVnX3JlYWQod20sIEFDOTdfR1BJT19QT0xBUklUWSk7CisKKwlpZiAocG9sID09IFdNOTdYWF9HUElPX1BPTF9ISUdIKQorCQlyZWcgfD0gZ3BpbzsKKwllbHNlCisJCXJlZyAmPSB+Z3BpbzsKKworCXdtOTd4eF9yZWdfd3JpdGUod20sIEFDOTdfR1BJT19QT0xBUklUWSwgcmVnKTsKKwlyZWcgPSB3bTk3eHhfcmVnX3JlYWQod20sIEFDOTdfR1BJT19TVElDS1kpOworCisJaWYgKHN0aWNreSA9PSBXTTk3WFhfR1BJT19TVElDS1kpCisJCXJlZyB8PSBncGlvOworCWVsc2UKKwkJcmVnICY9IH5ncGlvOworCisJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19HUElPX1NUSUNLWSwgcmVnKTsKKwlyZWcgPSB3bTk3eHhfcmVnX3JlYWQod20sIEFDOTdfR1BJT19XQUtFVVApOworCisJaWYgKHdha2UgPT0gV005N1hYX0dQSU9fV0FLRSkKKwkJcmVnIHw9IGdwaW87CisJZWxzZQorCQlyZWcgJj0gfmdwaW87CisKKwl3bTk3eHhfcmVnX3dyaXRlKHdtLCBBQzk3X0dQSU9fV0FLRVVQLCByZWcpOworCXJlZyA9IHdtOTd4eF9yZWdfcmVhZCh3bSwgQUM5N19HUElPX0NGRyk7CisKKwlpZiAoZGlyID09IFdNOTdYWF9HUElPX0lOKQorCQlyZWcgfD0gZ3BpbzsKKwllbHNlCisJCXJlZyAmPSB+Z3BpbzsKKworCXdtOTd4eF9yZWdfd3JpdGUod20sIEFDOTdfR1BJT19DRkcsIHJlZyk7CisJbXV0ZXhfdW5sb2NrKCZ3bS0+Y29kZWNfbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwod205N3h4X2NvbmZpZ19ncGlvKTsKKworLyoKKyAqIENvbmZpZ3VyZSB0aGUgV005N1hYX1BSUCB2YWx1ZSB0byB1c2Ugd2hpbGUgc3lzdGVtIGlzIHN1c3BlbmRlZC4KKyAqIElmIGEgdmFsdWUgb3RoZXIgdGhhbiAwIGlzIHNldCB0aGVuIFdNOTd4eCBwZW4gZGV0ZWN0aW9uIHdpbGwgYmUKKyAqIGxlZnQgZW5hYmxlZCBpbiB0aGUgY29uZmlndXJlZCBtb2RlIHdoaWxlIHRoZSBzeXN0ZW0gaXMgaW4gc3VzcGVuZCwKKyAqIHRoZSBkZXZpY2UgaGFzIHVzZXJzIGFuZCBzdXNwZW5kIGhhcyBub3QgYmVlbiBkaXNhYmxlZCB2aWEgdGhlCisgKiB3YWtldXAgc3lzZnMgZW50cmllcy4KKyAqCisgKiBAd206ICAgV005N3h4IGRldmljZSB0byBjb25maWd1cmUKKyAqIEBtb2RlOiBXTTk3WFhfUFJQIHZhbHVlIHRvIGNvbmZpZ3VyZSB3aGlsZSBzdXNwZW5kZWQKKyAqLwordm9pZCB3bTk3eHhfc2V0X3N1c3BlbmRfbW9kZShzdHJ1Y3Qgd205N3h4ICp3bSwgdTE2IG1vZGUpCit7CisJd20tPnN1c3BlbmRfbW9kZSA9IG1vZGU7CisJZGV2aWNlX2luaXRfd2FrZXVwKCZ3bS0+aW5wdXRfZGV2LT5kZXYsIG1vZGUgIT0gMCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3bTk3eHhfc2V0X3N1c3BlbmRfbW9kZSk7CisKKy8qCisgKiBIYW5kbGUgYSBwZW4gZG93biBpbnRlcnJ1cHQuCisgKi8KK3N0YXRpYyB2b2lkIHdtOTd4eF9wZW5faXJxX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHdtOTd4eCAqd20gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHdtOTd4eCwgcGVuX2V2ZW50X3dvcmspOworCWludCBwZW5fd2FzX2Rvd24gPSB3bS0+cGVuX2lzX2Rvd247CisKKwkvKiBkbyB3ZSBuZWVkIHRvIGVuYWJsZSB0aGUgdG91Y2ggcGFuZWwgcmVhZGVyICovCisJaWYgKHdtLT5pZCA9PSBXTTk3MDVfSUQyKSB7CisJCWlmICh3bTk3eHhfcmVnX3JlYWQod20sIEFDOTdfV005N1hYX0RJR0lUSVNFUl9SRCkgJgorCQkJCQlXTTk3WFhfUEVOX0RPV04pCisJCQl3bS0+cGVuX2lzX2Rvd24gPSAxOworCQllbHNlCisJCQl3bS0+cGVuX2lzX2Rvd24gPSAwOworCX0gZWxzZSB7CisJCXUxNiBzdGF0dXMsIHBvbDsKKwkJbXV0ZXhfbG9jaygmd20tPmNvZGVjX211dGV4KTsKKwkJc3RhdHVzID0gd205N3h4X3JlZ19yZWFkKHdtLCBBQzk3X0dQSU9fU1RBVFVTKTsKKwkJcG9sID0gd205N3h4X3JlZ19yZWFkKHdtLCBBQzk3X0dQSU9fUE9MQVJJVFkpOworCisJCWlmIChXTTk3WFhfR1BJT18xMyAmIHBvbCAmIHN0YXR1cykgeworCQkJd20tPnBlbl9pc19kb3duID0gMTsKKwkJCXdtOTd4eF9yZWdfd3JpdGUod20sIEFDOTdfR1BJT19QT0xBUklUWSwgcG9sICYKKwkJCQkJCX5XTTk3WFhfR1BJT18xMyk7CisJCX0gZWxzZSB7CisJCQl3bS0+cGVuX2lzX2Rvd24gPSAwOworCQkJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19HUElPX1BPTEFSSVRZLCBwb2wgfAorCQkJCQkgV005N1hYX0dQSU9fMTMpOworCQl9CisKKwkJaWYgKHdtLT5pZCA9PSBXTTk3MTJfSUQyKQorCQkJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19HUElPX1NUQVRVUywgKHN0YXR1cyAmCisJCQkJCQl+V005N1hYX0dQSU9fMTMpIDw8IDEpOworCQllbHNlCisJCQl3bTk3eHhfcmVnX3dyaXRlKHdtLCBBQzk3X0dQSU9fU1RBVFVTLCBzdGF0dXMgJgorCQkJCQkJfldNOTdYWF9HUElPXzEzKTsKKwkJbXV0ZXhfdW5sb2NrKCZ3bS0+Y29kZWNfbXV0ZXgpOworCX0KKworCS8qIElmIHRoZSBzeXN0ZW0gaXMgbm90IHVzaW5nIGNvbnRpbnVvdXMgbW9kZSBvciBpdCBwcm92aWRlcyBhCisJICogcGVuIGRvd24gb3BlcmF0aW9uIHRoZW4gd2UgbmVlZCB0byBzY2hlZHVsZSBwb2xscyB3aGlsZSB0aGUKKwkgKiBwZW4gaXMgZG93bi4gIE90aGVyd2lzZSB0aGUgbWFjaGluZSBkcml2ZXIgaXMgcmVzcG9uc2libGUKKwkgKiBmb3Igc2NoZWR1bGluZyByZWFkcy4KKwkgKi8KKwlpZiAoIXdtLT5tYWNoX29wcy0+YWNjX2VuYWJsZWQgfHwgd20tPm1hY2hfb3BzLT5hY2NfcGVuX2Rvd24pIHsKKwkJaWYgKHdtLT5wZW5faXNfZG93biAmJiAhcGVuX3dhc19kb3duKSB7CisJCQkvKiBEYXRhIGlzIG5vdCBhdmFpbGlhYmxlIGltbWVkaWF0ZWx5IG9uIHBlbiBkb3duICovCisJCQlxdWV1ZV9kZWxheWVkX3dvcmsod20tPnRzX3dvcmtxLCAmd20tPnRzX3JlYWRlciwgMSk7CisJCX0KKworCQkvKiBMZXQgdHNfcmVhZGVyIHJlcG9ydCB0aGUgcGVuIHVwIGZvciBkZWJvdW5jZS4gKi8KKwkJaWYgKCF3bS0+cGVuX2lzX2Rvd24gJiYgcGVuX3dhc19kb3duKQorCQkJd20tPnBlbl9pc19kb3duID0gMTsKKwl9CisKKwlpZiAoIXdtLT5wZW5faXNfZG93biAmJiB3bS0+bWFjaF9vcHMtPmFjY19lbmFibGVkKQorCQl3bS0+bWFjaF9vcHMtPmFjY19wZW5fdXAod20pOworCisJd20tPm1hY2hfb3BzLT5pcnFfZW5hYmxlKHdtLCAxKTsKK30KKworLyoKKyAqIENvZGVjIFBFTkRPV04gaXJxIGhhbmRsZXIKKyAqCisgKiBXZSBoYXZlIHRvIGRpc2FibGUgdGhlIGNvZGVjIGludGVycnVwdCBpbiB0aGUgaGFuZGxlciBiZWNhdXNlIGl0CisgKiBjYW4gdGFrZSB1cHRvIDFtcyB0byBjbGVhciB0aGUgaW50ZXJydXB0IHNvdXJjZS4gV2Ugc2NoZWR1bGUgYSB0YXNrCisgKiBpbiBhIHdvcmsgcXVldWUgdG8gZG8gdGhlIGFjdHVhbCBpbnRlcmFjdGlvbiB3aXRoIHRoZSBjaGlwLiAgVGhlCisgKiBpbnRlcnJ1cHQgaXMgdGhlbiBlbmFibGVkIGFnYWluIGluIHRoZSBzbG93IGhhbmRsZXIgd2hlbiB0aGUgc291cmNlCisgKiBoYXMgYmVlbiBjbGVhcmVkLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgd205N3h4X3Blbl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCB3bTk3eHggKndtID0gZGV2X2lkOworCisJaWYgKCF3b3JrX3BlbmRpbmcoJndtLT5wZW5fZXZlbnRfd29yaykpIHsKKwkJd20tPm1hY2hfb3BzLT5pcnFfZW5hYmxlKHdtLCAwKTsKKwkJcXVldWVfd29yayh3bS0+dHNfd29ya3EsICZ3bS0+cGVuX2V2ZW50X3dvcmspOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIGluaXRpYWxpc2UgcGVuIElSUSBoYW5kbGVyIGFuZCB3b3JrcXVldWUKKyAqLworc3RhdGljIGludCB3bTk3eHhfaW5pdF9wZW5faXJxKHN0cnVjdCB3bTk3eHggKndtKQoreworCXUxNiByZWc7CisKKwkvKiBJZiBhbiBpbnRlcnJ1cHQgaXMgc3VwcGxpZWQgYW4gSVJRIGVuYWJsZSBvcGVyYXRpb24gbXVzdCBhbHNvIGJlCisJICogcHJvdmlkZWQuICovCisJQlVHX09OKCF3bS0+bWFjaF9vcHMtPmlycV9lbmFibGUpOworCisJaWYgKHJlcXVlc3RfaXJxKHdtLT5wZW5faXJxLCB3bTk3eHhfcGVuX2ludGVycnVwdCwKKwkJCUlSUUZfU0hBUkVEIHwgSVJRRl9TQU1QTEVfUkFORE9NLAorCQkJIndtOTd4eC1wZW4iLCB3bSkpIHsKKwkJZGV2X2Vycih3bS0+ZGV2LAorCQkJIkZhaWxlZCB0byByZWdpc3RlciBwZW4gZG93biBpbnRlcnJ1cHQsIHBvbGxpbmciKTsKKwkJd20tPnBlbl9pcnEgPSAwOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDb25maWd1cmUgR1BJTyBhcyBpbnRlcnJ1cHQgc291cmNlIG9uIFdNOTcxeCAqLworCWlmICh3bS0+aWQgIT0gV005NzA1X0lEMikgeworCQlCVUdfT04oIXdtLT5tYWNoX29wcy0+aXJxX2dwaW8pOworCQlyZWcgPSB3bTk3eHhfcmVnX3JlYWQod20sIEFDOTdfTUlTQ19BRkUpOworCQl3bTk3eHhfcmVnX3dyaXRlKHdtLCBBQzk3X01JU0NfQUZFLAorCQkJCXJlZyAmIH4od20tPm1hY2hfb3BzLT5pcnFfZ3BpbykpOworCQlyZWcgPSB3bTk3eHhfcmVnX3JlYWQod20sIDB4NWEpOworCQl3bTk3eHhfcmVnX3dyaXRlKHdtLCAweDVhLCByZWcgJiB+MHgwMDAxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTk3eHhfcmVhZF9zYW1wbGVzKHN0cnVjdCB3bTk3eHggKndtKQoreworCXN0cnVjdCB3bTk3eHhfZGF0YSBkYXRhOworCWludCByYzsKKworCW11dGV4X2xvY2soJndtLT5jb2RlY19tdXRleCk7CisKKwlpZiAod20tPm1hY2hfb3BzICYmIHdtLT5tYWNoX29wcy0+YWNjX2VuYWJsZWQpCisJCXJjID0gd20tPm1hY2hfb3BzLT5hY2NfcGVuX2Rvd24od20pOworCWVsc2UKKwkJcmMgPSB3bS0+Y29kZWMtPnBvbGxfdG91Y2god20sICZkYXRhKTsKKworCWlmIChyYyAmIFJDX1BFTlVQKSB7CisJCWlmICh3bS0+cGVuX2lzX2Rvd24pIHsKKwkJCXdtLT5wZW5faXNfZG93biA9IDA7CisJCQlkZXZfZGJnKHdtLT5kZXYsICJwZW4gdXBcbiIpOworCQkJaW5wdXRfcmVwb3J0X2Ficyh3bS0+aW5wdXRfZGV2LCBBQlNfUFJFU1NVUkUsIDApOworCQkJaW5wdXRfc3luYyh3bS0+aW5wdXRfZGV2KTsKKwkJfSBlbHNlIGlmICghKHJjICYgUkNfQUdBSU4pKSB7CisJCQkvKiBXZSBuZWVkIGhpZ2ggZnJlcXVlbmN5IHVwZGF0ZXMgb25seSB3aGlsZQorCQkJKiBwZW4gaXMgZG93biwgdGhlIHVzZXIgbmV2ZXIgd2lsbCBiZSBhYmxlIHRvCisJCQkqIHRvdWNoIHNjcmVlbiBmYXN0ZXIgdGhhbiBhIGZldyB0aW1lcyBwZXIKKwkJCSogc2Vjb25kLi4uIE9uIHRoZSBvdGhlciBoYW5kLCB3aGVuIHRoZSB1c2VyCisJCQkqIGlzIGFjdGl2ZWx5IHdvcmtpbmcgd2l0aCB0aGUgdG91Y2hzY3JlZW4gd2UKKwkJCSogZG9uJ3Qgd2FudCB0byBsb3NlIHRoZSBxdWljayByZXNwb25zZS4gU28gd2UKKwkJCSogd2lsbCBzbG93bHkgaW5jcmVhc2Ugc2xlZXAgdGltZSBhZnRlciB0aGUKKwkJCSogcGVuIGlzIHVwIGFuZCBxdWlja3kgcmVzdG9yZSBpdCB0byB+b25lIHRhc2sKKwkJCSogc3dpdGNoIHdoZW4gcGVuIGlzIGRvd24gYWdhaW4uCisJCQkqLworCQkJaWYgKHdtLT50c19yZWFkZXJfaW50ZXJ2YWwgPCBIWiAvIDEwKQorCQkJCXdtLT50c19yZWFkZXJfaW50ZXJ2YWwrKzsKKwkJfQorCisJfSBlbHNlIGlmIChyYyAmIFJDX1ZBTElEKSB7CisJCWRldl9kYmcod20tPmRldiwKKwkJCSJwZW4gZG93bjogeD0leDolZCwgeT0leDolZCwgcHJlc3N1cmU9JXg6JWRcbiIsCisJCQlkYXRhLnggPj4gMTIsIGRhdGEueCAmIDB4ZmZmLCBkYXRhLnkgPj4gMTIsCisJCQlkYXRhLnkgJiAweGZmZiwgZGF0YS5wID4+IDEyLCBkYXRhLnAgJiAweGZmZik7CisJCWlucHV0X3JlcG9ydF9hYnMod20tPmlucHV0X2RldiwgQUJTX1gsIGRhdGEueCAmIDB4ZmZmKTsKKwkJaW5wdXRfcmVwb3J0X2Ficyh3bS0+aW5wdXRfZGV2LCBBQlNfWSwgZGF0YS55ICYgMHhmZmYpOworCQlpbnB1dF9yZXBvcnRfYWJzKHdtLT5pbnB1dF9kZXYsIEFCU19QUkVTU1VSRSwgZGF0YS5wICYgMHhmZmYpOworCQlpbnB1dF9zeW5jKHdtLT5pbnB1dF9kZXYpOworCQl3bS0+cGVuX2lzX2Rvd24gPSAxOworCQl3bS0+dHNfcmVhZGVyX2ludGVydmFsID0gd20tPnRzX3JlYWRlcl9taW5faW50ZXJ2YWw7CisJfSBlbHNlIGlmIChyYyAmIFJDX1BFTkRPV04pIHsKKwkJZGV2X2RiZyh3bS0+ZGV2LCAicGVuIGRvd25cbiIpOworCQl3bS0+cGVuX2lzX2Rvd24gPSAxOworCQl3bS0+dHNfcmVhZGVyX2ludGVydmFsID0gd20tPnRzX3JlYWRlcl9taW5faW50ZXJ2YWw7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZ3bS0+Y29kZWNfbXV0ZXgpOworCXJldHVybiByYzsKK30KKworLyoKKyogVGhlIHRvdWNoc2NyZWVuIHNhbXBsZSByZWFkZXIuCisqLworc3RhdGljIHZvaWQgd205N3h4X3RzX3JlYWRlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJaW50IHJjOworCXN0cnVjdCB3bTk3eHggKndtID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3bTk3eHgsIHRzX3JlYWRlci53b3JrKTsKKworCUJVR19PTighd20tPmNvZGVjKTsKKworCWRvIHsKKwkJcmMgPSB3bTk3eHhfcmVhZF9zYW1wbGVzKHdtKTsKKwl9IHdoaWxlIChyYyAmIFJDX0FHQUlOKTsKKworCWlmICh3bS0+cGVuX2lzX2Rvd24gfHwgIXdtLT5wZW5faXJxKQorCQlxdWV1ZV9kZWxheWVkX3dvcmsod20tPnRzX3dvcmtxLCAmd20tPnRzX3JlYWRlciwKKwkJCQkgICB3bS0+dHNfcmVhZGVyX2ludGVydmFsKTsKK30KKworLyoqCisgKiB3bTk3eHhfdHNfaW5wdXRfb3BlbiAtIE9wZW4gdGhlIHRvdWNoIHNjcmVlbiBpbnB1dCBkZXZpY2UuCisgKiBAaWRldjoJSW5wdXQgZGV2aWNlIHRvIGJlIG9wZW5lZC4KKyAqCisgKiBDYWxsZWQgYnkgdGhlIGlucHV0IHN1YiBzeXN0ZW0gdG8gb3BlbiBhIHdtOTd4eCB0b3VjaHNjcmVlbiBkZXZpY2UuCisgKiBTdGFydHMgdGhlIHRvdWNoc2NyZWVuIHRocmVhZCBhbmQgdG91Y2ggZGlnaXRpc2VyLgorICovCitzdGF0aWMgaW50IHdtOTd4eF90c19pbnB1dF9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmlkZXYpCit7CisJc3RydWN0IHdtOTd4eCAqd20gPSBpbnB1dF9nZXRfZHJ2ZGF0YShpZGV2KTsKKworCXdtLT50c193b3JrcSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJrd205N3h4Iik7CisJaWYgKHdtLT50c193b3JrcSA9PSBOVUxMKSB7CisJCWRldl9lcnIod20tPmRldiwKKwkJCSJGYWlsZWQgdG8gY3JlYXRlIHdvcmtxdWV1ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHN0YXJ0IGRpZ2l0aXNlciAqLworCWlmICh3bS0+bWFjaF9vcHMgJiYgd20tPm1hY2hfb3BzLT5hY2NfZW5hYmxlZCkKKwkJd20tPmNvZGVjLT5hY2NfZW5hYmxlKHdtLCAxKTsKKwl3bS0+Y29kZWMtPmRpZ19lbmFibGUod20sIDEpOworCisJSU5JVF9ERUxBWUVEX1dPUksoJndtLT50c19yZWFkZXIsIHdtOTd4eF90c19yZWFkZXIpOworCUlOSVRfV09SSygmd20tPnBlbl9ldmVudF93b3JrLCB3bTk3eHhfcGVuX2lycV93b3JrZXIpOworCisJd20tPnRzX3JlYWRlcl9taW5faW50ZXJ2YWwgPSBIWiA+PSAxMDAgPyBIWiAvIDEwMCA6IDE7CisJaWYgKHdtLT50c19yZWFkZXJfbWluX2ludGVydmFsIDwgMSkKKwkJd20tPnRzX3JlYWRlcl9taW5faW50ZXJ2YWwgPSAxOworCXdtLT50c19yZWFkZXJfaW50ZXJ2YWwgPSB3bS0+dHNfcmVhZGVyX21pbl9pbnRlcnZhbDsKKworCXdtLT5wZW5faXNfZG93biA9IDA7CisJaWYgKHdtLT5wZW5faXJxKQorCQl3bTk3eHhfaW5pdF9wZW5faXJxKHdtKTsKKwllbHNlCisJCWRldl9lcnIod20tPmRldiwgIk5vIElSUSBzcGVjaWZpZWRcbiIpOworCisJLyogSWYgd2UgZWl0aGVyIGRvbid0IGhhdmUgYW4gaW50ZXJydXB0IGZvciBwZW4gZG93biBldmVudHMgb3IKKwkgKiBmYWlsZWQgdG8gYWNxdWlyZSBpdCB0aGVuIHdlIG5lZWQgdG8gcG9sbC4KKwkgKi8KKwlpZiAod20tPnBlbl9pcnEgPT0gMCkKKwkJcXVldWVfZGVsYXllZF93b3JrKHdtLT50c193b3JrcSwgJndtLT50c19yZWFkZXIsCisJCQkJICAgd20tPnRzX3JlYWRlcl9pbnRlcnZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3bTk3eHhfdHNfaW5wdXRfY2xvc2UgLSBDbG9zZSB0aGUgdG91Y2ggc2NyZWVuIGlucHV0IGRldmljZS4KKyAqIEBpZGV2OglJbnB1dCBkZXZpY2UgdG8gYmUgY2xvc2VkLgorICoKKyAqIENhbGxlZCBieSB0aGUgaW5wdXQgc3ViIHN5c3RlbSB0byBjbG9zZSBhIHdtOTd4eCB0b3VjaHNjcmVlbgorICogZGV2aWNlLiAgS2lsbHMgdGhlIHRvdWNoc2NyZWVuIHRocmVhZCBhbmQgc3RvcHMgdGhlIHRvdWNoCisgKiBkaWdpdGlzZXIuCisgKi8KKworc3RhdGljIHZvaWQgd205N3h4X3RzX2lucHV0X2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmlkZXYpCit7CisJc3RydWN0IHdtOTd4eCAqd20gPSBpbnB1dF9nZXRfZHJ2ZGF0YShpZGV2KTsKKwl1MTYgcmVnOworCisJaWYgKHdtLT5wZW5faXJxKSB7CisJCS8qIFJldHVybiB0aGUgaW50ZXJydXB0IHRvIEdQSU8gdXNhZ2UgKGRpc2FibGluZyBpdCkgKi8KKwkJaWYgKHdtLT5pZCAhPSBXTTk3MDVfSUQyKSB7CisJCQlCVUdfT04oIXdtLT5tYWNoX29wcy0+aXJxX2dwaW8pOworCQkJcmVnID0gd205N3h4X3JlZ19yZWFkKHdtLCBBQzk3X01JU0NfQUZFKTsKKwkJCXdtOTd4eF9yZWdfd3JpdGUod20sIEFDOTdfTUlTQ19BRkUsCisJCQkJCSByZWcgfCB3bS0+bWFjaF9vcHMtPmlycV9ncGlvKTsKKwkJfQorCisJCWZyZWVfaXJxKHdtLT5wZW5faXJxLCB3bSk7CisJfQorCisJd20tPnBlbl9pc19kb3duID0gMDsKKworCS8qIEJhbGFuY2Ugb3V0IGludGVycnVwdCBkaXNhYmxlcy9lbmFibGVzICovCisJaWYgKGNhbmNlbF93b3JrX3N5bmMoJndtLT5wZW5fZXZlbnRfd29yaykpCisJCXdtLT5tYWNoX29wcy0+aXJxX2VuYWJsZSh3bSwgMSk7CisKKwkvKiB0c19yZWFkZXIgcmVhcm1zIGl0c2VsZiBzbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgc3RvcCBpdAorCSAqIGJlZm9yZSB3ZSBkZXN0cm95IHRoZSB3b3JrcXVldWUuCisJICovCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ3bS0+dHNfcmVhZGVyKTsKKworCWRlc3Ryb3lfd29ya3F1ZXVlKHdtLT50c193b3JrcSk7CisKKwkvKiBzdG9wIGRpZ2l0aXNlciAqLworCXdtLT5jb2RlYy0+ZGlnX2VuYWJsZSh3bSwgMCk7CisJaWYgKHdtLT5tYWNoX29wcyAmJiB3bS0+bWFjaF9vcHMtPmFjY19lbmFibGVkKQorCQl3bS0+Y29kZWMtPmFjY19lbmFibGUod20sIDApOworfQorCitzdGF0aWMgaW50IHdtOTd4eF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHdtOTd4eCAqd207CisJaW50IHJldCA9IDAsIGlkID0gMDsKKworCXdtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdtOTd4eCksIEdGUF9LRVJORUwpOworCWlmICghd20pCisJCXJldHVybiAtRU5PTUVNOworCW11dGV4X2luaXQoJndtLT5jb2RlY19tdXRleCk7CisKKwl3bS0+ZGV2ID0gZGV2OworCWRldi0+ZHJpdmVyX2RhdGEgPSB3bTsKKwl3bS0+YWM5NyA9IHRvX2FjOTdfdChkZXYpOworCisJLyogY2hlY2sgdGhhdCB3ZSBoYXZlIGEgc3VwcG9ydGVkIGNvZGVjICovCisJaWQgPSB3bTk3eHhfcmVnX3JlYWQod20sIEFDOTdfVkVORE9SX0lEMSk7CisJaWYgKGlkICE9IFdNOTdYWF9JRDEpIHsKKwkJZGV2X2VycihkZXYsICJEZXZpY2Ugd2l0aCB2ZW5kb3IgJTA0eCBpcyBub3QgYSB3bTk3eHhcbiIsIGlkKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBhbGxvY19lcnI7CisJfQorCisJd20tPmlkID0gd205N3h4X3JlZ19yZWFkKHdtLCBBQzk3X1ZFTkRPUl9JRDIpOworCisJZGV2X2luZm8od20tPmRldiwgImRldGVjdGVkIGEgd205NyUwMnggY29kZWNcbiIsIHdtLT5pZCAmIDB4ZmYpOworCisJc3dpdGNoICh3bS0+aWQgJiAweGZmKSB7CisjaWZkZWYgQ09ORklHX1RPVUNIU0NSRUVOX1dNOTcwNQorCWNhc2UgMHgwNToKKwkJd20tPmNvZGVjID0gJndtOTcwNV9jb2RlYzsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVE9VQ0hTQ1JFRU5fV005NzEyCisJY2FzZSAweDEyOgorCQl3bS0+Y29kZWMgPSAmd205NzEyX2NvZGVjOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19UT1VDSFNDUkVFTl9XTTk3MTMKKwljYXNlIDB4MTM6CisJCXdtLT5jb2RlYyA9ICZ3bTk3MTNfY29kZWM7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJZGV2X2Vycih3bS0+ZGV2LCAiU3VwcG9ydCBmb3Igd205NyUwMnggbm90IGNvbXBpbGVkIGluLlxuIiwKKwkJCXdtLT5pZCAmIDB4ZmYpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGFsbG9jX2VycjsKKwl9CisKKwl3bS0+aW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHdtLT5pbnB1dF9kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGFsbG9jX2VycjsKKwl9CisKKwkvKiBzZXQgdXAgdG91Y2ggY29uZmlndXJhdGlvbiAqLworCXdtLT5pbnB1dF9kZXYtPm5hbWUgPSAid205N3h4IHRvdWNoc2NyZWVuIjsKKwl3bS0+aW5wdXRfZGV2LT5vcGVuID0gd205N3h4X3RzX2lucHV0X29wZW47CisJd20tPmlucHV0X2Rldi0+Y2xvc2UgPSB3bTk3eHhfdHNfaW5wdXRfY2xvc2U7CisJc2V0X2JpdChFVl9BQlMsIHdtLT5pbnB1dF9kZXYtPmV2Yml0KTsKKwlzZXRfYml0KEFCU19YLCB3bS0+aW5wdXRfZGV2LT5hYnNiaXQpOworCXNldF9iaXQoQUJTX1ksIHdtLT5pbnB1dF9kZXYtPmFic2JpdCk7CisJc2V0X2JpdChBQlNfUFJFU1NVUkUsIHdtLT5pbnB1dF9kZXYtPmFic2JpdCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMod20tPmlucHV0X2RldiwgQUJTX1gsIGFic194WzBdLCBhYnNfeFsxXSwKKwkJCSAgICAgYWJzX3hbMl0sIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKHdtLT5pbnB1dF9kZXYsIEFCU19ZLCBhYnNfeVswXSwgYWJzX3lbMV0sCisJCQkgICAgIGFic195WzJdLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyh3bS0+aW5wdXRfZGV2LCBBQlNfUFJFU1NVUkUsIGFic19wWzBdLCBhYnNfcFsxXSwKKwkJCSAgICAgYWJzX3BbMl0sIDApOworCWlucHV0X3NldF9kcnZkYXRhKHdtLT5pbnB1dF9kZXYsIHdtKTsKKwl3bS0+aW5wdXRfZGV2LT5kZXYucGFyZW50ID0gZGV2OworCXJldCA9IGlucHV0X3JlZ2lzdGVyX2RldmljZSh3bS0+aW5wdXRfZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBkZXZfYWxsb2NfZXJyOworCisJLyogc2V0IHVwIHBoeXNpY2FsIGNoYXJhY3RlcmlzdGljcyAqLworCXdtLT5jb2RlYy0+cGh5X2luaXQod20pOworCisJLyogbG9hZCBncGlvIGNhY2hlICovCisJd20tPmdwaW9bMF0gPSB3bTk3eHhfcmVnX3JlYWQod20sIEFDOTdfR1BJT19DRkcpOworCXdtLT5ncGlvWzFdID0gd205N3h4X3JlZ19yZWFkKHdtLCBBQzk3X0dQSU9fUE9MQVJJVFkpOworCXdtLT5ncGlvWzJdID0gd205N3h4X3JlZ19yZWFkKHdtLCBBQzk3X0dQSU9fU1RJQ0tZKTsKKwl3bS0+Z3Bpb1szXSA9IHdtOTd4eF9yZWdfcmVhZCh3bSwgQUM5N19HUElPX1dBS0VVUCk7CisJd20tPmdwaW9bNF0gPSB3bTk3eHhfcmVnX3JlYWQod20sIEFDOTdfR1BJT19TVEFUVVMpOworCXdtLT5ncGlvWzVdID0gd205N3h4X3JlZ19yZWFkKHdtLCBBQzk3X01JU0NfQUZFKTsKKworCS8qIHJlZ2lzdGVyIG91ciBiYXR0ZXJ5IGRldmljZSAqLworCXdtLT5iYXR0ZXJ5X2RldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygid205N3h4LWJhdHRlcnkiLCAtMSk7CisJaWYgKCF3bS0+YmF0dGVyeV9kZXYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBiYXR0X2VycjsKKwl9CisJcGxhdGZvcm1fc2V0X2RydmRhdGEod20tPmJhdHRlcnlfZGV2LCB3bSk7CisJd20tPmJhdHRlcnlfZGV2LT5kZXYucGFyZW50ID0gZGV2OworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQod20tPmJhdHRlcnlfZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBiYXR0X3JlZ19lcnI7CisKKwkvKiByZWdpc3RlciBvdXIgZXh0ZW5kZWQgdG91Y2ggZGV2aWNlIChmb3IgbWFjaGluZSBzcGVjaWZpYworCSAqIGV4dGVuc2lvbnMpICovCisJd20tPnRvdWNoX2RldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygid205N3h4LXRvdWNoIiwgLTEpOworCWlmICghd20tPnRvdWNoX2RldikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHRvdWNoX2VycjsKKwl9CisJcGxhdGZvcm1fc2V0X2RydmRhdGEod20tPnRvdWNoX2Rldiwgd20pOworCXdtLT50b3VjaF9kZXYtPmRldi5wYXJlbnQgPSBkZXY7CisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZCh3bS0+dG91Y2hfZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byB0b3VjaF9yZWdfZXJyOworCisJcmV0dXJuIHJldDsKKworIHRvdWNoX3JlZ19lcnI6CisJcGxhdGZvcm1fZGV2aWNlX3B1dCh3bS0+dG91Y2hfZGV2KTsKKyB0b3VjaF9lcnI6CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIod20tPmJhdHRlcnlfZGV2KTsKKwl3bS0+YmF0dGVyeV9kZXYgPSBOVUxMOworIGJhdHRfcmVnX2VycjoKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KHdtLT5iYXR0ZXJ5X2Rldik7CisgYmF0dF9lcnI6CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uod20tPmlucHV0X2Rldik7CisJd20tPmlucHV0X2RldiA9IE5VTEw7CisgZGV2X2FsbG9jX2VycjoKKwlpbnB1dF9mcmVlX2RldmljZSh3bS0+aW5wdXRfZGV2KTsKKyBhbGxvY19lcnI6CisJa2ZyZWUod20pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3bTk3eHhfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgd205N3h4ICp3bSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIod20tPmJhdHRlcnlfZGV2KTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcih3bS0+dG91Y2hfZGV2KTsKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSh3bS0+aW5wdXRfZGV2KTsKKwlrZnJlZSh3bSk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCB3bTk3eHhfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgd205N3h4ICp3bSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXUxNiByZWc7CisJaW50IHN1c3BlbmRfbW9kZTsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmd20tPmlucHV0X2Rldi0+ZGV2KSkKKwkJc3VzcGVuZF9tb2RlID0gd20tPnN1c3BlbmRfbW9kZTsKKwllbHNlCisJCXN1c3BlbmRfbW9kZSA9IDA7CisKKwlpZiAod20tPmlucHV0X2Rldi0+dXNlcnMpCisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmd20tPnRzX3JlYWRlcik7CisKKwkvKiBQb3dlciBkb3duIHRoZSBkaWdpdGlzZXIgKGJ5cGFzc2luZyB0aGUgY2FjaGUgZm9yIHJlc3VtZSkgKi8KKwlyZWcgPSB3bTk3eHhfcmVnX3JlYWQod20sIEFDOTdfV005N1hYX0RJR0lUSVNFUjIpOworCXJlZyAmPSB+V005N1hYX1BSUF9ERVRfRElHOworCWlmICh3bS0+aW5wdXRfZGV2LT51c2VycykKKwkJcmVnIHw9IHN1c3BlbmRfbW9kZTsKKwl3bS0+YWM5Ny0+YnVzLT5vcHMtPndyaXRlKHdtLT5hYzk3LCBBQzk3X1dNOTdYWF9ESUdJVElTRVIyLCByZWcpOworCisJLyogV005NzEzIGhhcyBhbiBhZGRpdGlvbmFsIHBvd2VyIGJpdCAtIHR1cm4gaXQgb2ZmIGlmIHRoZXJlCisJICogYXJlIG5vIHVzZXJzIG9yIGlmIHN1c3BlbmQgbW9kZSBpcyB6ZXJvLiAqLworCWlmICh3bS0+aWQgPT0gV005NzEzX0lEMiAmJgorCSAgICAoIXdtLT5pbnB1dF9kZXYtPnVzZXJzIHx8ICFzdXNwZW5kX21vZGUpKSB7CisJCXJlZyA9IHdtOTd4eF9yZWdfcmVhZCh3bSwgQUM5N19FWFRFTkRFRF9NSUQpIHwgMHg4MDAwOworCQl3bTk3eHhfcmVnX3dyaXRlKHdtLCBBQzk3X0VYVEVOREVEX01JRCwgcmVnKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTk3eHhfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgd205N3h4ICp3bSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJLyogcmVzdG9yZSBkaWdpdGlzZXIgYW5kIGdwaW9zICovCisJaWYgKHdtLT5pZCA9PSBXTTk3MTNfSUQyKSB7CisJCXdtOTd4eF9yZWdfd3JpdGUod20sIEFDOTdfV005NzEzX0RJRzEsIHdtLT5kaWdbMF0pOworCQl3bTk3eHhfcmVnX3dyaXRlKHdtLCAweDVhLCB3bS0+bWlzYyk7CisJCWlmICh3bS0+aW5wdXRfZGV2LT51c2VycykgeworCQkJdTE2IHJlZzsKKwkJCXJlZyA9IHdtOTd4eF9yZWdfcmVhZCh3bSwgQUM5N19FWFRFTkRFRF9NSUQpICYgMHg3ZmZmOworCQkJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19FWFRFTkRFRF9NSUQsIHJlZyk7CisJCX0KKwl9CisKKwl3bTk3eHhfcmVnX3dyaXRlKHdtLCBBQzk3X1dNOTcxM19ESUcyLCB3bS0+ZGlnWzFdKTsKKwl3bTk3eHhfcmVnX3dyaXRlKHdtLCBBQzk3X1dNOTcxM19ESUczLCB3bS0+ZGlnWzJdKTsKKworCXdtOTd4eF9yZWdfd3JpdGUod20sIEFDOTdfR1BJT19DRkcsIHdtLT5ncGlvWzBdKTsKKwl3bTk3eHhfcmVnX3dyaXRlKHdtLCBBQzk3X0dQSU9fUE9MQVJJVFksIHdtLT5ncGlvWzFdKTsKKwl3bTk3eHhfcmVnX3dyaXRlKHdtLCBBQzk3X0dQSU9fU1RJQ0tZLCB3bS0+Z3Bpb1syXSk7CisJd205N3h4X3JlZ193cml0ZSh3bSwgQUM5N19HUElPX1dBS0VVUCwgd20tPmdwaW9bM10pOworCXdtOTd4eF9yZWdfd3JpdGUod20sIEFDOTdfR1BJT19TVEFUVVMsIHdtLT5ncGlvWzRdKTsKKwl3bTk3eHhfcmVnX3dyaXRlKHdtLCBBQzk3X01JU0NfQUZFLCB3bS0+Z3Bpb1s1XSk7CisKKwlpZiAod20tPmlucHV0X2Rldi0+dXNlcnMgJiYgIXdtLT5wZW5faXJxKSB7CisJCXdtLT50c19yZWFkZXJfaW50ZXJ2YWwgPSB3bS0+dHNfcmVhZGVyX21pbl9pbnRlcnZhbDsKKwkJcXVldWVfZGVsYXllZF93b3JrKHdtLT50c193b3JrcSwgJndtLT50c19yZWFkZXIsCisJCQkJICAgd20tPnRzX3JlYWRlcl9pbnRlcnZhbCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisjZGVmaW5lIHdtOTd4eF9zdXNwZW5kCQlOVUxMCisjZGVmaW5lIHdtOTd4eF9yZXN1bWUJCU5VTEwKKyNlbmRpZgorCisvKgorICogTWFjaGluZSBzcGVjaWZpYyBvcGVyYXRpb25zCisgKi8KK2ludCB3bTk3eHhfcmVnaXN0ZXJfbWFjaF9vcHMoc3RydWN0IHdtOTd4eCAqd20sCisJCQkgICAgIHN0cnVjdCB3bTk3eHhfbWFjaF9vcHMgKm1hY2hfb3BzKQoreworCW11dGV4X2xvY2soJndtLT5jb2RlY19tdXRleCk7CisJaWYgKHdtLT5tYWNoX29wcykgeworCQltdXRleF91bmxvY2soJndtLT5jb2RlY19tdXRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl3bS0+bWFjaF9vcHMgPSBtYWNoX29wczsKKwltdXRleF91bmxvY2soJndtLT5jb2RlY19tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdtOTd4eF9yZWdpc3Rlcl9tYWNoX29wcyk7CisKK3ZvaWQgd205N3h4X3VucmVnaXN0ZXJfbWFjaF9vcHMoc3RydWN0IHdtOTd4eCAqd20pCit7CisJbXV0ZXhfbG9jaygmd20tPmNvZGVjX211dGV4KTsKKwl3bS0+bWFjaF9vcHMgPSBOVUxMOworCW11dGV4X3VubG9jaygmd20tPmNvZGVjX211dGV4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdtOTd4eF91bnJlZ2lzdGVyX21hY2hfb3BzKTsKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIHdtOTd4eF9kcml2ZXIgPSB7CisJLm5hbWUgPQkJImFjOTciLAorCS5idXMgPQkJJmFjOTdfYnVzX3R5cGUsCisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLnByb2JlID0Jd205N3h4X3Byb2JlLAorCS5yZW1vdmUgPQl3bTk3eHhfcmVtb3ZlLAorCS5zdXNwZW5kID0Jd205N3h4X3N1c3BlbmQsCisJLnJlc3VtZSA9CXdtOTd4eF9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB3bTk3eHhfaW5pdCh2b2lkKQoreworCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJndtOTd4eF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgd205N3h4X2V4aXQodm9pZCkKK3sKKwlkcml2ZXJfdW5yZWdpc3Rlcigmd205N3h4X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHdtOTd4eF9pbml0KTsKK21vZHVsZV9leGl0KHdtOTd4eF9leGl0KTsKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCJMaWFtIEdpcmR3b29kIDxsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIldNOTd4eCBDb3JlIC0gVG91Y2ggU2NyZWVuIC8gQVVYIEFEQyAvIEdQSU8gRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3hlbi1rYmRmcm9udC5jIGIvZHJpdmVycy9pbnB1dC94ZW4ta2JkZnJvbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjQ3ZjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC94ZW4ta2JkZnJvbnQuYwpAQCAtMCwwICsxLDM0MCBAQAorLyoKKyAqIFhlbiBwYXJhLXZpcnR1YWwgaW5wdXQgZGV2aWNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEFudGhvbnkgTGlndW9yaSA8YWxpZ3VvcmlAdXMuaWJtLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IFJlZCBIYXQsIEluYy4sIE1hcmt1cyBBcm1icnVzdGVyIDxhcm1icnVAcmVkaGF0LmNvbT4KKyAqCisgKiAgQmFzZWQgb24gbGludXgvZHJpdmVycy9pbnB1dC9tb3VzZS9zZXJtb3VzZS5jCisgKgorICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZS4gU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IKKyAqICBtb3JlIGRldGFpbHMuCisgKi8KKworLyoKKyAqIFRPRE86CisgKgorICogU3dpdGNoIHRvIGdyYW50IHRhYmxlcyB0b2dldGhlciB3aXRoIHhlbi1mYmZyb250LmMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KKyNpbmNsdWRlIDx4ZW4vZXZlbnRzLmg+CisjaW5jbHVkZSA8eGVuL3BhZ2UuaD4KKyNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL2lvL2ZiaWYuaD4KKyNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL2lvL2tiZGlmLmg+CisjaW5jbHVkZSA8eGVuL3hlbmJ1cy5oPgorCitzdHJ1Y3QgeGVua2JkX2luZm8geworCXN0cnVjdCBpbnB1dF9kZXYgKmtiZDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpwdHI7CisJc3RydWN0IHhlbmtiZF9wYWdlICpwYWdlOworCWludCBpcnE7CisJc3RydWN0IHhlbmJ1c19kZXZpY2UgKnhiZGV2OworCWNoYXIgcGh5c1szMl07Cit9OworCitzdGF0aWMgaW50IHhlbmtiZF9yZW1vdmUoc3RydWN0IHhlbmJ1c19kZXZpY2UgKik7CitzdGF0aWMgaW50IHhlbmtiZF9jb25uZWN0X2JhY2tlbmQoc3RydWN0IHhlbmJ1c19kZXZpY2UgKiwgc3RydWN0IHhlbmtiZF9pbmZvICopOworc3RhdGljIHZvaWQgeGVua2JkX2Rpc2Nvbm5lY3RfYmFja2VuZChzdHJ1Y3QgeGVua2JkX2luZm8gKik7CisKKy8qCisgKiBOb3RlOiBpZiB5b3UgbmVlZCB0byBzZW5kIG91dCBldmVudHMsIHNlZSB4ZW5mYl9kb191cGRhdGUoKSBmb3IgaG93CisgKiB0byBkbyB0aGF0LgorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBpbnB1dF9oYW5kbGVyKGludCBycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCB4ZW5rYmRfaW5mbyAqaW5mbyA9IGRldl9pZDsKKwlzdHJ1Y3QgeGVua2JkX3BhZ2UgKnBhZ2UgPSBpbmZvLT5wYWdlOworCV9fdTMyIGNvbnMsIHByb2Q7CisKKwlwcm9kID0gcGFnZS0+aW5fcHJvZDsKKwlpZiAocHJvZCA9PSBwYWdlLT5pbl9jb25zKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJcm1iKCk7CQkJLyogZW5zdXJlIHdlIHNlZSByaW5nIGNvbnRlbnRzIHVwIHRvIHByb2QgKi8KKwlmb3IgKGNvbnMgPSBwYWdlLT5pbl9jb25zOyBjb25zICE9IHByb2Q7IGNvbnMrKykgeworCQl1bmlvbiB4ZW5rYmRfaW5fZXZlbnQgKmV2ZW50OworCQlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXY7CisJCWV2ZW50ID0gJlhFTktCRF9JTl9SSU5HX1JFRihwYWdlLCBjb25zKTsKKworCQlkZXYgPSBpbmZvLT5wdHI7CisJCXN3aXRjaCAoZXZlbnQtPnR5cGUpIHsKKwkJY2FzZSBYRU5LQkRfVFlQRV9NT1RJT046CisJCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1gsIGV2ZW50LT5tb3Rpb24ucmVsX3gpOworCQkJaW5wdXRfcmVwb3J0X3JlbChkZXYsIFJFTF9ZLCBldmVudC0+bW90aW9uLnJlbF95KTsKKwkJCWJyZWFrOworCQljYXNlIFhFTktCRF9UWVBFX0tFWToKKwkJCWRldiA9IE5VTEw7CisJCQlpZiAodGVzdF9iaXQoZXZlbnQtPmtleS5rZXljb2RlLCBpbmZvLT5rYmQtPmtleWJpdCkpCisJCQkJZGV2ID0gaW5mby0+a2JkOworCQkJaWYgKHRlc3RfYml0KGV2ZW50LT5rZXkua2V5Y29kZSwgaW5mby0+cHRyLT5rZXliaXQpKQorCQkJCWRldiA9IGluZm8tPnB0cjsKKwkJCWlmIChkZXYpCisJCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIGV2ZW50LT5rZXkua2V5Y29kZSwKKwkJCQkJCSBldmVudC0+a2V5LnByZXNzZWQpOworCQkJZWxzZQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkgICAgICAgInhlbmtiZDogdW5oYW5kbGVkIGtleWNvZGUgMHgleFxuIiwKKwkJCQkgICAgICAgZXZlbnQtPmtleS5rZXljb2RlKTsKKwkJCWJyZWFrOworCQljYXNlIFhFTktCRF9UWVBFX1BPUzoKKwkJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgZXZlbnQtPnBvcy5hYnNfeCk7CisJCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIGV2ZW50LT5wb3MuYWJzX3kpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGRldikKKwkJCWlucHV0X3N5bmMoZGV2KTsKKwl9CisJbWIoKTsJCQkvKiBlbnN1cmUgd2UgZ290IHJpbmcgY29udGVudHMgKi8KKwlwYWdlLT5pbl9jb25zID0gY29uczsKKwlub3RpZnlfcmVtb3RlX3ZpYV9pcnEoaW5mby0+aXJxKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgeGVua2JkX3Byb2JlKHN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXYsCisJCQkJICBjb25zdCBzdHJ1Y3QgeGVuYnVzX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJldCwgaTsKKwlzdHJ1Y3QgeGVua2JkX2luZm8gKmluZm87CisJc3RydWN0IGlucHV0X2RldiAqa2JkLCAqcHRyOworCisJaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKSB7CisJCXhlbmJ1c19kZXZfZmF0YWwoZGV2LCAtRU5PTUVNLCAiYWxsb2NhdGluZyBpbmZvIHN0cnVjdHVyZSIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZGV2LT5kZXYuZHJpdmVyX2RhdGEgPSBpbmZvOworCWluZm8tPnhiZGV2ID0gZGV2OworCWluZm8tPmlycSA9IC0xOworCXNucHJpbnRmKGluZm8tPnBoeXMsIHNpemVvZihpbmZvLT5waHlzKSwgInhlbmJ1cy8lcyIsIGRldi0+bm9kZW5hbWUpOworCisJaW5mby0+cGFnZSA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKKwlpZiAoIWluZm8tPnBhZ2UpCisJCWdvdG8gZXJyb3Jfbm9tZW07CisKKwkvKiBrZXlib2FyZCAqLworCWtiZCA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICgha2JkKQorCQlnb3RvIGVycm9yX25vbWVtOworCWtiZC0+bmFtZSA9ICJYZW4gVmlydHVhbCBLZXlib2FyZCI7CisJa2JkLT5waHlzID0gaW5mby0+cGh5czsKKwlrYmQtPmlkLmJ1c3R5cGUgPSBCVVNfUENJOworCWtiZC0+aWQudmVuZG9yID0gMHg1ODUzOworCWtiZC0+aWQucHJvZHVjdCA9IDB4ZmZmZjsKKwlrYmQtPmV2Yml0WzBdID0gQklUKEVWX0tFWSk7CisJZm9yIChpID0gS0VZX0VTQzsgaSA8IEtFWV9VTktOT1dOOyBpKyspCisJCXNldF9iaXQoaSwga2JkLT5rZXliaXQpOworCWZvciAoaSA9IEtFWV9PSzsgaSA8IEtFWV9NQVg7IGkrKykKKwkJc2V0X2JpdChpLCBrYmQtPmtleWJpdCk7CisKKwlyZXQgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uoa2JkKTsKKwlpZiAocmV0KSB7CisJCWlucHV0X2ZyZWVfZGV2aWNlKGtiZCk7CisJCXhlbmJ1c19kZXZfZmF0YWwoZGV2LCByZXQsICJpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uoa2JkKSIpOworCQlnb3RvIGVycm9yOworCX0KKwlpbmZvLT5rYmQgPSBrYmQ7CisKKwkvKiBwb2ludGluZyBkZXZpY2UgKi8KKwlwdHIgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIXB0cikKKwkJZ290byBlcnJvcl9ub21lbTsKKwlwdHItPm5hbWUgPSAiWGVuIFZpcnR1YWwgUG9pbnRlciI7CisJcHRyLT5waHlzID0gaW5mby0+cGh5czsKKwlwdHItPmlkLmJ1c3R5cGUgPSBCVVNfUENJOworCXB0ci0+aWQudmVuZG9yID0gMHg1ODUzOworCXB0ci0+aWQucHJvZHVjdCA9IDB4ZmZmZTsKKwlwdHItPmV2Yml0WzBdID0gQklUKEVWX0tFWSkgfCBCSVQoRVZfUkVMKSB8IEJJVChFVl9BQlMpOworCWZvciAoaSA9IEJUTl9MRUZUOyBpIDw9IEJUTl9UQVNLOyBpKyspCisJCXNldF9iaXQoaSwgcHRyLT5rZXliaXQpOworCXB0ci0+cmVsYml0WzBdID0gQklUKFJFTF9YKSB8IEJJVChSRUxfWSk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMocHRyLCBBQlNfWCwgMCwgWEVORkJfV0lEVEgsIDAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKHB0ciwgQUJTX1ksIDAsIFhFTkZCX0hFSUdIVCwgMCwgMCk7CisKKwlyZXQgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UocHRyKTsKKwlpZiAocmV0KSB7CisJCWlucHV0X2ZyZWVfZGV2aWNlKHB0cik7CisJCXhlbmJ1c19kZXZfZmF0YWwoZGV2LCByZXQsICJpbnB1dF9yZWdpc3Rlcl9kZXZpY2UocHRyKSIpOworCQlnb3RvIGVycm9yOworCX0KKwlpbmZvLT5wdHIgPSBwdHI7CisKKwlyZXQgPSB4ZW5rYmRfY29ubmVjdF9iYWNrZW5kKGRldiwgaW5mbyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gMDsKKworIGVycm9yX25vbWVtOgorCXJldCA9IC1FTk9NRU07CisJeGVuYnVzX2Rldl9mYXRhbChkZXYsIHJldCwgImFsbG9jYXRpbmcgZGV2aWNlIG1lbW9yeSIpOworIGVycm9yOgorCXhlbmtiZF9yZW1vdmUoZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHhlbmtiZF9yZXN1bWUoc3RydWN0IHhlbmJ1c19kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGVua2JkX2luZm8gKmluZm8gPSBkZXYtPmRldi5kcml2ZXJfZGF0YTsKKworCXhlbmtiZF9kaXNjb25uZWN0X2JhY2tlbmQoaW5mbyk7CisJbWVtc2V0KGluZm8tPnBhZ2UsIDAsIFBBR0VfU0laRSk7CisJcmV0dXJuIHhlbmtiZF9jb25uZWN0X2JhY2tlbmQoZGV2LCBpbmZvKTsKK30KKworc3RhdGljIGludCB4ZW5rYmRfcmVtb3ZlKHN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHhlbmtiZF9pbmZvICppbmZvID0gZGV2LT5kZXYuZHJpdmVyX2RhdGE7CisKKwl4ZW5rYmRfZGlzY29ubmVjdF9iYWNrZW5kKGluZm8pOworCWlmIChpbmZvLT5rYmQpCisJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGluZm8tPmtiZCk7CisJaWYgKGluZm8tPnB0cikKKwkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoaW5mby0+cHRyKTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpaW5mby0+cGFnZSk7CisJa2ZyZWUoaW5mbyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGVua2JkX2Nvbm5lY3RfYmFja2VuZChzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IHhlbmtiZF9pbmZvICppbmZvKQoreworCWludCByZXQsIGV2dGNobjsKKwlzdHJ1Y3QgeGVuYnVzX3RyYW5zYWN0aW9uIHhidDsKKworCXJldCA9IHhlbmJ1c19hbGxvY19ldnRjaG4oZGV2LCAmZXZ0Y2huKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IGJpbmRfZXZ0Y2huX3RvX2lycWhhbmRsZXIoZXZ0Y2huLCBpbnB1dF9oYW5kbGVyLAorCQkJCQkwLCBkZXYtPmRldmljZXR5cGUsIGluZm8pOworCWlmIChyZXQgPCAwKSB7CisJCXhlbmJ1c19mcmVlX2V2dGNobihkZXYsIGV2dGNobik7CisJCXhlbmJ1c19kZXZfZmF0YWwoZGV2LCByZXQsICJiaW5kX2V2dGNobl90b19pcnFoYW5kbGVyIik7CisJCXJldHVybiByZXQ7CisJfQorCWluZm8tPmlycSA9IHJldDsKKworIGFnYWluOgorCXJldCA9IHhlbmJ1c190cmFuc2FjdGlvbl9zdGFydCgmeGJ0KTsKKwlpZiAocmV0KSB7CisJCXhlbmJ1c19kZXZfZmF0YWwoZGV2LCByZXQsICJzdGFydGluZyB0cmFuc2FjdGlvbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSB4ZW5idXNfcHJpbnRmKHhidCwgZGV2LT5ub2RlbmFtZSwgInBhZ2UtcmVmIiwgIiVsdSIsCisJCQkgICAgdmlydF90b19tZm4oaW5mby0+cGFnZSkpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfeGVuYnVzOworCXJldCA9IHhlbmJ1c19wcmludGYoeGJ0LCBkZXYtPm5vZGVuYW1lLCAiZXZlbnQtY2hhbm5lbCIsICIldSIsCisJCQkgICAgZXZ0Y2huKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3hlbmJ1czsKKwlyZXQgPSB4ZW5idXNfdHJhbnNhY3Rpb25fZW5kKHhidCwgMCk7CisJaWYgKHJldCkgeworCQlpZiAocmV0ID09IC1FQUdBSU4pCisJCQlnb3RvIGFnYWluOworCQl4ZW5idXNfZGV2X2ZhdGFsKGRldiwgcmV0LCAiY29tcGxldGluZyB0cmFuc2FjdGlvbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXhlbmJ1c19zd2l0Y2hfc3RhdGUoZGV2LCBYZW5idXNTdGF0ZUluaXRpYWxpc2VkKTsKKwlyZXR1cm4gMDsKKworIGVycm9yX3hlbmJ1czoKKwl4ZW5idXNfdHJhbnNhY3Rpb25fZW5kKHhidCwgMSk7CisJeGVuYnVzX2Rldl9mYXRhbChkZXYsIHJldCwgIndyaXRpbmcgeGVuc3RvcmUiKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB4ZW5rYmRfZGlzY29ubmVjdF9iYWNrZW5kKHN0cnVjdCB4ZW5rYmRfaW5mbyAqaW5mbykKK3sKKwlpZiAoaW5mby0+aXJxID49IDApCisJCXVuYmluZF9mcm9tX2lycWhhbmRsZXIoaW5mby0+aXJxLCBpbmZvKTsKKwlpbmZvLT5pcnEgPSAtMTsKK30KKworc3RhdGljIHZvaWQgeGVua2JkX2JhY2tlbmRfY2hhbmdlZChzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2LAorCQkJCSAgIGVudW0geGVuYnVzX3N0YXRlIGJhY2tlbmRfc3RhdGUpCit7CisJc3RydWN0IHhlbmtiZF9pbmZvICppbmZvID0gZGV2LT5kZXYuZHJpdmVyX2RhdGE7CisJaW50IHJldCwgdmFsOworCisJc3dpdGNoIChiYWNrZW5kX3N0YXRlKSB7CisJY2FzZSBYZW5idXNTdGF0ZUluaXRpYWxpc2luZzoKKwljYXNlIFhlbmJ1c1N0YXRlSW5pdGlhbGlzZWQ6CisJY2FzZSBYZW5idXNTdGF0ZVVua25vd246CisJY2FzZSBYZW5idXNTdGF0ZUNsb3NlZDoKKwkJYnJlYWs7CisKKwljYXNlIFhlbmJ1c1N0YXRlSW5pdFdhaXQ6CitJbml0V2FpdDoKKwkJcmV0ID0geGVuYnVzX3NjYW5mKFhCVF9OSUwsIGluZm8tPnhiZGV2LT5vdGhlcmVuZCwKKwkJCQkgICAiZmVhdHVyZS1hYnMtcG9pbnRlciIsICIlZCIsICZ2YWwpOworCQlpZiAocmV0IDwgMCkKKwkJCXZhbCA9IDA7CisJCWlmICh2YWwpIHsKKwkJCXJldCA9IHhlbmJ1c19wcmludGYoWEJUX05JTCwgaW5mby0+eGJkZXYtPm5vZGVuYW1lLAorCQkJCQkgICAgInJlcXVlc3QtYWJzLXBvaW50ZXIiLCAiMSIpOworCQkJaWYgKHJldCkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICJ4ZW5rYmQ6IGNhbid0IHJlcXVlc3QgYWJzLXBvaW50ZXIiKTsKKwkJfQorCQl4ZW5idXNfc3dpdGNoX3N0YXRlKGRldiwgWGVuYnVzU3RhdGVDb25uZWN0ZWQpOworCQlicmVhazsKKworCWNhc2UgWGVuYnVzU3RhdGVDb25uZWN0ZWQ6CisJCS8qCisJCSAqIFdvcmsgYXJvdW5kIHhlbmJ1cyByYWNlIGNvbmRpdGlvbjogSWYgYmFja2VuZCBnb2VzCisJCSAqIHRocm91Z2ggSW5pdFdhaXQgdG8gQ29ubmVjdGVkIGZhc3QgZW5vdWdoLCB3ZSBjYW4KKwkJICogZ2V0IENvbm5lY3RlZCB0d2ljZSBoZXJlLgorCQkgKi8KKwkJaWYgKGRldi0+c3RhdGUgIT0gWGVuYnVzU3RhdGVDb25uZWN0ZWQpCisJCQlnb3RvIEluaXRXYWl0OyAvKiBubyBJbml0V2FpdCBzZWVuIHlldCwgZnVkZ2UgaXQgKi8KKwkJYnJlYWs7CisKKwljYXNlIFhlbmJ1c1N0YXRlQ2xvc2luZzoKKwkJeGVuYnVzX2Zyb250ZW5kX2Nsb3NlZChkZXYpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeGVuYnVzX2RldmljZV9pZCB4ZW5rYmRfaWRzW10gPSB7CisJeyAidmtiZCIgfSwKKwl7ICIiIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgeGVuYnVzX2RyaXZlciB4ZW5rYmQgPSB7CisJLm5hbWUgPSAidmtiZCIsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmlkcyA9IHhlbmtiZF9pZHMsCisJLnByb2JlID0geGVua2JkX3Byb2JlLAorCS5yZW1vdmUgPSB4ZW5rYmRfcmVtb3ZlLAorCS5yZXN1bWUgPSB4ZW5rYmRfcmVzdW1lLAorCS5vdGhlcmVuZF9jaGFuZ2VkID0geGVua2JkX2JhY2tlbmRfY2hhbmdlZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHhlbmtiZF9pbml0KHZvaWQpCit7CisJaWYgKCFpc19ydW5uaW5nX29uX3hlbigpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIE5vdGhpbmcgdG8gZG8gaWYgcnVubmluZyBpbiBkb20wLiAqLworCWlmIChpc19pbml0aWFsX3hlbmRvbWFpbigpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiB4ZW5idXNfcmVnaXN0ZXJfZnJvbnRlbmQoJnhlbmtiZCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB4ZW5rYmRfY2xlYW51cCh2b2lkKQoreworCXhlbmJ1c191bnJlZ2lzdGVyX2RyaXZlcigmeGVua2JkKTsKK30KKworbW9kdWxlX2luaXQoeGVua2JkX2luaXQpOworbW9kdWxlX2V4aXQoeGVua2JkX2NsZWFudXApOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9tYWNfaGlkLmMgYi9kcml2ZXJzL21hY2ludG9zaC9tYWNfaGlkLmMKaW5kZXggODkzMDIzMC4uZjk3MmZmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvbWFjX2hpZC5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL21hY19oaWQuYwpAQCAtMTAzLDYgKzEwMyw5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgZW11bW91c2VidG5fZXZlbnRfY2xhc3M7CitzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGVtdW1vdXNlYnRuX211dGV4X2NsYXNzOworCiBzdGF0aWMgaW50IGVtdW1vdXNlYnRuX2lucHV0X3JlZ2lzdGVyKHZvaWQpCiB7CiAJaW50IHJldDsKQEAgLTExMSw2ICsxMTQsOSBAQAogCWlmICghZW11bW91c2VidG4pCiAJCXJldHVybiAtRU5PTUVNOwogCisJbG9ja2RlcF9zZXRfY2xhc3MoZW11bW91c2VidG4tPmV2ZW50X2xvY2ssICZlbXVtb3VzZWJ0bl9ldmVudF9jbGFzcyk7CisJbG9ja2RlcF9zZXRfY2xhc3MoZW11bW91c2VidG4tPm11dGV4LCAmZW11bW91c2VidG5fbXV0ZXhfY2xhc3MpOworCiAJZW11bW91c2VidG4tPm5hbWUgPSAiTWFjaW50b3NoIG1vdXNlIGJ1dHRvbiBlbXVsYXRpb24iOwogCWVtdW1vdXNlYnRuLT5pZC5idXN0eXBlID0gQlVTX0FEQjsKIAllbXVtb3VzZWJ0bi0+aWQudmVuZG9yID0gMHgwMDAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9NYWtlZmlsZSBiL2RyaXZlcnMvbWQvTWFrZWZpbGUKaW5kZXggZDlhYTdlZC4uN2JlMDllZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21kL01ha2VmaWxlCkBAIC0zLDEwICszLDEwIEBACiAjCiAKIGRtLW1vZC1vYmpzCTo9IGRtLm8gZG0tdGFibGUubyBkbS10YXJnZXQubyBkbS1saW5lYXIubyBkbS1zdHJpcGUubyBcCi0JCSAgIGRtLWlvY3RsLm8gZG0taW8ubyBrY29weWQubworCQkgICBkbS1pb2N0bC5vIGRtLWlvLm8gZG0ta2NvcHlkLm8KIGRtLW11bHRpcGF0aC1vYmpzIDo9IGRtLWh3LWhhbmRsZXIubyBkbS1wYXRoLXNlbGVjdG9yLm8gZG0tbXBhdGgubwogZG0tc25hcHNob3Qtb2JqcyA6PSBkbS1zbmFwLm8gZG0tZXhjZXB0aW9uLXN0b3JlLm8KLWRtLW1pcnJvci1vYmpzCTo9IGRtLWxvZy5vIGRtLXJhaWQxLm8KK2RtLW1pcnJvci1vYmpzCTo9IGRtLXJhaWQxLm8KIGRtLXJkYWMtb2Jqcwk6PSBkbS1tcGF0aC1yZGFjLm8KIGRtLWhwLXN3LW9ianMJOj0gZG0tbXBhdGgtaHAtc3cubwogbWQtbW9kLW9ianMgICAgIDo9IG1kLm8gYml0bWFwLm8KQEAgLTM5LDcgKzM5LDcgQEAKIG9iai0kKENPTkZJR19ETV9NVUxUSVBBVEhfSFApCSs9IGRtLWhwLXN3Lm8KIG9iai0kKENPTkZJR19ETV9NVUxUSVBBVEhfUkRBQykJKz0gZG0tcmRhYy5vCiBvYmotJChDT05GSUdfRE1fU05BUFNIT1QpCSs9IGRtLXNuYXBzaG90Lm8KLW9iai0kKENPTkZJR19ETV9NSVJST1IpCQkrPSBkbS1taXJyb3Iubworb2JqLSQoQ09ORklHX0RNX01JUlJPUikJCSs9IGRtLW1pcnJvci5vIGRtLWxvZy5vCiBvYmotJChDT05GSUdfRE1fWkVSTykJCSs9IGRtLXplcm8ubwogCiBxdWlldF9jbWRfdW5yb2xsID0gVU5ST0xMICAkQApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1leGNlcHRpb24tc3RvcmUuYyBiL2RyaXZlcnMvbWQvZG0tZXhjZXB0aW9uLXN0b3JlLmMKaW5kZXggNWJiY2UyOS4uNDFmNDA4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1leGNlcHRpb24tc3RvcmUuYworKysgYi9kcml2ZXJzL21kL2RtLWV4Y2VwdGlvbi1zdG9yZS5jCkBAIC05LDEzICs5LDEzIEBACiAKICNpbmNsdWRlICJkbS5oIgogI2luY2x1ZGUgImRtLXNuYXAuaCIKLSNpbmNsdWRlICJkbS1pby5oIgotI2luY2x1ZGUgImtjb3B5ZC5oIgogCiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbS1pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RtLWtjb3B5ZC5oPgogCiAjZGVmaW5lIERNX01TR19QUkVGSVggInNuYXBzaG90cyIKICNkZWZpbmUgRE1fQ0hVTktfU0laRV9ERUZBVUxUX1NFQ1RPUlMgMzIJLyogMTZLQiAqLwpAQCAtMTMxLDcgKzEzMSw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBzZWN0b3JzX3RvX3BhZ2VzKHVuc2lnbmVkIHNlY3RvcnMpCiB7Ci0JcmV0dXJuIHNlY3RvcnMgLyAoUEFHRV9TSVpFID4+IDkpOworCXJldHVybiBESVZfUk9VTkRfVVAoc2VjdG9ycywgUEFHRV9TSVpFID4+IDkpOwogfQogCiBzdGF0aWMgaW50IGFsbG9jX2FyZWEoc3RydWN0IHBzdG9yZSAqcHMpCkBAIC0xNTksNyArMTU5LDcgQEAKIH0KIAogc3RydWN0IG1kYXRhX3JlcSB7Ci0Jc3RydWN0IGlvX3JlZ2lvbiAqd2hlcmU7CisJc3RydWN0IGRtX2lvX3JlZ2lvbiAqd2hlcmU7CiAJc3RydWN0IGRtX2lvX3JlcXVlc3QgKmlvX3JlcTsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKIAlpbnQgcmVzdWx0OwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAgKi8KIHN0YXRpYyBpbnQgY2h1bmtfaW8oc3RydWN0IHBzdG9yZSAqcHMsIHVpbnQzMl90IGNodW5rLCBpbnQgcncsIGludCBtZXRhZGF0YSkKIHsKLQlzdHJ1Y3QgaW9fcmVnaW9uIHdoZXJlID0geworCXN0cnVjdCBkbV9pb19yZWdpb24gd2hlcmUgPSB7CiAJCS5iZGV2ID0gcHMtPnNuYXAtPmNvdy0+YmRldiwKIAkJLnNlY3RvciA9IHBzLT5zbmFwLT5jaHVua19zaXplICogY2h1bmssCiAJCS5jb3VudCA9IHBzLT5zbmFwLT5jaHVua19zaXplLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1pby5jIGIvZHJpdmVycy9tZC9kbS1pby5jCmluZGV4IDhmMjVmNjIuLjQ3ODljNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0taW8uYworKysgYi9kcml2ZXJzL21kL2RtLWlvLmMKQEAgLTUsMTMgKzUsMTQgQEAKICAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgogICovCiAKLSNpbmNsdWRlICJkbS1pby5oIgorI2luY2x1ZGUgImRtLmgiCiAKICNpbmNsdWRlIDxsaW51eC9iaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tZW1wb29sLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZG0taW8uaD4KIAogc3RydWN0IGRtX2lvX2NsaWVudCB7CiAJbWVtcG9vbF90ICpwb29sOwpAQCAtMjAsNyArMjEsNyBAQAogCiAvKiBGSVhNRTogY2FuIHdlIHNocmluayB0aGlzID8gKi8KIHN0cnVjdCBpbyB7Ci0JdW5zaWduZWQgbG9uZyBlcnJvcjsKKwl1bnNpZ25lZCBsb25nIGVycm9yX2JpdHM7CiAJYXRvbWljX3QgY291bnQ7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpzbGVlcGVyOwogCXN0cnVjdCBkbV9pb19jbGllbnQgKmNsaWVudDsKQEAgLTEwNywxNCArMTA4LDE0IEBACiBzdGF0aWMgdm9pZCBkZWNfY291bnQoc3RydWN0IGlvICppbywgdW5zaWduZWQgaW50IHJlZ2lvbiwgaW50IGVycm9yKQogewogCWlmIChlcnJvcikKLQkJc2V0X2JpdChyZWdpb24sICZpby0+ZXJyb3IpOworCQlzZXRfYml0KHJlZ2lvbiwgJmlvLT5lcnJvcl9iaXRzKTsKIAogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZpby0+Y291bnQpKSB7CiAJCWlmIChpby0+c2xlZXBlcikKIAkJCXdha2VfdXBfcHJvY2Vzcyhpby0+c2xlZXBlcik7CiAKIAkJZWxzZSB7Ci0JCQl1bnNpZ25lZCBsb25nIHIgPSBpby0+ZXJyb3I7CisJCQl1bnNpZ25lZCBsb25nIHIgPSBpby0+ZXJyb3JfYml0czsKIAkJCWlvX25vdGlmeV9mbiBmbiA9IGlvLT5jYWxsYmFjazsKIAkJCXZvaWQgKmNvbnRleHQgPSBpby0+Y29udGV4dDsKIApAQCAtMjcxLDcgKzI3Miw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBJTyByb3V0aW5lcyB0aGF0IGFjY2VwdCBhIGxpc3Qgb2YgcGFnZXMuCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBkb19yZWdpb24oaW50IHJ3LCB1bnNpZ25lZCBpbnQgcmVnaW9uLCBzdHJ1Y3QgaW9fcmVnaW9uICp3aGVyZSwKK3N0YXRpYyB2b2lkIGRvX3JlZ2lvbihpbnQgcncsIHVuc2lnbmVkIHJlZ2lvbiwgc3RydWN0IGRtX2lvX3JlZ2lvbiAqd2hlcmUsCiAJCSAgICAgIHN0cnVjdCBkcGFnZXMgKmRwLCBzdHJ1Y3QgaW8gKmlvKQogewogCXN0cnVjdCBiaW8gKmJpbzsKQEAgLTMyMCw3ICszMjEsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBkaXNwYXRjaF9pbyhpbnQgcncsIHVuc2lnbmVkIGludCBudW1fcmVnaW9ucywKLQkJCXN0cnVjdCBpb19yZWdpb24gKndoZXJlLCBzdHJ1Y3QgZHBhZ2VzICpkcCwKKwkJCXN0cnVjdCBkbV9pb19yZWdpb24gKndoZXJlLCBzdHJ1Y3QgZHBhZ2VzICpkcCwKIAkJCXN0cnVjdCBpbyAqaW8sIGludCBzeW5jKQogewogCWludCBpOwpAQCAtMzQ3LDE3ICszNDgsMTcgQEAKIH0KIAogc3RhdGljIGludCBzeW5jX2lvKHN0cnVjdCBkbV9pb19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IG51bV9yZWdpb25zLAotCQkgICBzdHJ1Y3QgaW9fcmVnaW9uICp3aGVyZSwgaW50IHJ3LCBzdHJ1Y3QgZHBhZ2VzICpkcCwKKwkJICAgc3RydWN0IGRtX2lvX3JlZ2lvbiAqd2hlcmUsIGludCBydywgc3RydWN0IGRwYWdlcyAqZHAsCiAJCSAgIHVuc2lnbmVkIGxvbmcgKmVycm9yX2JpdHMpCiB7CiAJc3RydWN0IGlvIGlvOwogCi0JaWYgKG51bV9yZWdpb25zID4gMSAmJiBydyAhPSBXUklURSkgeworCWlmIChudW1fcmVnaW9ucyA+IDEgJiYgKHJ3ICYgUldfTUFTSykgIT0gV1JJVEUpIHsKIAkJV0FSTl9PTigxKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JaW8uZXJyb3IgPSAwOworCWlvLmVycm9yX2JpdHMgPSAwOwogCWF0b21pY19zZXQoJmlvLmNvdW50LCAxKTsgLyogc2VlIGRpc3BhdGNoX2lvKCkgKi8KIAlpby5zbGVlcGVyID0gY3VycmVudDsKIAlpby5jbGllbnQgPSBjbGllbnQ7CkBAIC0zNzgsMjUgKzM3OSwyNSBAQAogCQlyZXR1cm4gLUVJTlRSOwogCiAJaWYgKGVycm9yX2JpdHMpCi0JCSplcnJvcl9iaXRzID0gaW8uZXJyb3I7CisJCSplcnJvcl9iaXRzID0gaW8uZXJyb3JfYml0czsKIAotCXJldHVybiBpby5lcnJvciA/IC1FSU8gOiAwOworCXJldHVybiBpby5lcnJvcl9iaXRzID8gLUVJTyA6IDA7CiB9CiAKIHN0YXRpYyBpbnQgYXN5bmNfaW8oc3RydWN0IGRtX2lvX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgbnVtX3JlZ2lvbnMsCi0JCSAgICBzdHJ1Y3QgaW9fcmVnaW9uICp3aGVyZSwgaW50IHJ3LCBzdHJ1Y3QgZHBhZ2VzICpkcCwKKwkJICAgIHN0cnVjdCBkbV9pb19yZWdpb24gKndoZXJlLCBpbnQgcncsIHN0cnVjdCBkcGFnZXMgKmRwLAogCQkgICAgaW9fbm90aWZ5X2ZuIGZuLCB2b2lkICpjb250ZXh0KQogewogCXN0cnVjdCBpbyAqaW87CiAKLQlpZiAobnVtX3JlZ2lvbnMgPiAxICYmIHJ3ICE9IFdSSVRFKSB7CisJaWYgKG51bV9yZWdpb25zID4gMSAmJiAocncgJiBSV19NQVNLKSAhPSBXUklURSkgewogCQlXQVJOX09OKDEpOwogCQlmbigxLCBjb250ZXh0KTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCiAJaW8gPSBtZW1wb29sX2FsbG9jKGNsaWVudC0+cG9vbCwgR0ZQX05PSU8pOwotCWlvLT5lcnJvciA9IDA7CisJaW8tPmVycm9yX2JpdHMgPSAwOwogCWF0b21pY19zZXQoJmlvLT5jb3VudCwgMSk7IC8qIHNlZSBkaXNwYXRjaF9pbygpICovCiAJaW8tPnNsZWVwZXIgPSBOVUxMOwogCWlvLT5jbGllbnQgPSBjbGllbnQ7CkBAIC00MzUsMTAgKzQzNiwxNSBAQAogfQogCiAvKgotICogTmV3IGNvbGxhcHNlZCAoYSlzeW5jaHJvbm91cyBpbnRlcmZhY2UKKyAqIE5ldyBjb2xsYXBzZWQgKGEpc3luY2hyb25vdXMgaW50ZXJmYWNlLgorICoKKyAqIElmIHRoZSBJTyBpcyBhc3luY2hyb25vdXMgKGkuZS4gaXQgaGFzIG5vdGlmeS5mbiksIHlvdSBtdXN0IGVpdGhlciB1bnBsdWcKKyAqIHRoZSBxdWV1ZSB3aXRoIGJsa191bnBsdWcoKSBzb21lIHRpbWUgbGF0ZXIgb3Igc2V0IHRoZSBCSU9fUldfU1lOQyBiaXQgaW4KKyAqIGlvX3JlcS0+YmlfcncuIElmIHlvdSBmYWlsIHRvIGRvIG9uZSBvZiB0aGVzZSwgdGhlIElPIHdpbGwgYmUgc3VibWl0dGVkIHRvCisgKiB0aGUgZGlzayBhZnRlciBxLT51bnBsdWdfZGVsYXksIHdoaWNoIGRlZmF1bHRzIHRvIDNtcyBpbiBibGstc2V0dGluZ3MuYy4KICAqLwogaW50IGRtX2lvKHN0cnVjdCBkbV9pb19yZXF1ZXN0ICppb19yZXEsIHVuc2lnbmVkIG51bV9yZWdpb25zLAotCSAgc3RydWN0IGlvX3JlZ2lvbiAqd2hlcmUsIHVuc2lnbmVkIGxvbmcgKnN5bmNfZXJyb3JfYml0cykKKwkgIHN0cnVjdCBkbV9pb19yZWdpb24gKndoZXJlLCB1bnNpZ25lZCBsb25nICpzeW5jX2Vycm9yX2JpdHMpCiB7CiAJaW50IHI7CiAJc3RydWN0IGRwYWdlcyBkcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQva2NvcHlkLmMgYi9kcml2ZXJzL21kL2RtLWtjb3B5ZC5jCnNpbWlsYXJpdHkgaW5kZXggNzElCnJlbmFtZSBmcm9tIGRyaXZlcnMvbWQva2NvcHlkLmMKcmVuYW1lIHRvIGRyaXZlcnMvbWQvZG0ta2NvcHlkLmMKaW5kZXggZTc2YjUyYS4uOTk2ODAyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9rY29weWQuYworKysgYi9kcml2ZXJzL21kL2RtLWtjb3B5ZC5jCkBAIC05LDkgKzksOCBAQAogICogY29tcGxldGlvbiBub3RpZmljYXRpb24uCiAgKi8KIAotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotCiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0yMywyNCArMjIsMTUgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kbS1rY29weWQuaD4KIAotI2luY2x1ZGUgImtjb3B5ZC5oIgotCi1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKl9rY29weWRfd3E7Ci1zdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IF9rY29weWRfd29yazsKLQotc3RhdGljIHZvaWQgd2FrZSh2b2lkKQotewotCXF1ZXVlX3dvcmsoX2tjb3B5ZF93cSwgJl9rY29weWRfd29yayk7Ci19CisjaW5jbHVkZSAiZG0uaCIKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRWFjaCBrY29weWQgY2xpZW50IGhhcyBpdHMgb3duIGxpdHRsZSBwb29sIG9mIHByZWFsbG9jYXRlZAogICogcGFnZXMgZm9yIGtjb3B5ZCBpby4KICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0cnVjdCBrY29weWRfY2xpZW50IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0KK3N0cnVjdCBkbV9rY29weWRfY2xpZW50IHsKIAlzcGlubG9ja190IGxvY2s7CiAJc3RydWN0IHBhZ2VfbGlzdCAqcGFnZXM7CiAJdW5zaWduZWQgaW50IG5yX3BhZ2VzOwpAQCAtNTAsOCArNDAsMzIgQEAKIAogCXdhaXRfcXVldWVfaGVhZF90IGRlc3Ryb3lxOwogCWF0b21pY190IG5yX2pvYnM7CisKKwltZW1wb29sX3QgKmpvYl9wb29sOworCisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmtjb3B5ZF93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qga2NvcHlkX3dvcms7CisKKy8qCisgKiBXZSBtYWludGFpbiB0aHJlZSBsaXN0cyBvZiBqb2JzOgorICoKKyAqIGkpICAgam9icyB3YWl0aW5nIGZvciBwYWdlcworICogaWkpICBqb2JzIHRoYXQgaGF2ZSBwYWdlcywgYW5kIGFyZSB3YWl0aW5nIGZvciB0aGUgaW8gdG8gYmUgaXNzdWVkLgorICogaWlpKSBqb2JzIHRoYXQgaGF2ZSBjb21wbGV0ZWQuCisgKgorICogQWxsIHRocmVlIG9mIHRoZXNlIGFyZSBwcm90ZWN0ZWQgYnkgam9iX2xvY2suCisgKi8KKwlzcGlubG9ja190IGpvYl9sb2NrOworCXN0cnVjdCBsaXN0X2hlYWQgY29tcGxldGVfam9iczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGlvX2pvYnM7CisJc3RydWN0IGxpc3RfaGVhZCBwYWdlc19qb2JzOwogfTsKIAorc3RhdGljIHZvaWQgd2FrZShzdHJ1Y3QgZG1fa2NvcHlkX2NsaWVudCAqa2MpCit7CisJcXVldWVfd29yayhrYy0+a2NvcHlkX3dxLCAma2MtPmtjb3B5ZF93b3JrKTsKK30KKwogc3RhdGljIHN0cnVjdCBwYWdlX2xpc3QgKmFsbG9jX3BsKHZvaWQpCiB7CiAJc3RydWN0IHBhZ2VfbGlzdCAqcGw7CkBAIC03NSw3ICs4OSw3IEBACiAJa2ZyZWUocGwpOwogfQogCi1zdGF0aWMgaW50IGtjb3B5ZF9nZXRfcGFnZXMoc3RydWN0IGtjb3B5ZF9jbGllbnQgKmtjLAorc3RhdGljIGludCBrY29weWRfZ2V0X3BhZ2VzKHN0cnVjdCBkbV9rY29weWRfY2xpZW50ICprYywKIAkJCSAgICB1bnNpZ25lZCBpbnQgbnIsIHN0cnVjdCBwYWdlX2xpc3QgKipwYWdlcykKIHsKIAlzdHJ1Y3QgcGFnZV9saXN0ICpwbDsKQEAgLTk4LDcgKzExMiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGtjb3B5ZF9wdXRfcGFnZXMoc3RydWN0IGtjb3B5ZF9jbGllbnQgKmtjLCBzdHJ1Y3QgcGFnZV9saXN0ICpwbCkKK3N0YXRpYyB2b2lkIGtjb3B5ZF9wdXRfcGFnZXMoc3RydWN0IGRtX2tjb3B5ZF9jbGllbnQgKmtjLCBzdHJ1Y3QgcGFnZV9saXN0ICpwbCkKIHsKIAlzdHJ1Y3QgcGFnZV9saXN0ICpjdXJzb3I7CiAKQEAgLTEyNiw3ICsxNDAsNyBAQAogCX0KIH0KIAotc3RhdGljIGludCBjbGllbnRfYWxsb2NfcGFnZXMoc3RydWN0IGtjb3B5ZF9jbGllbnQgKmtjLCB1bnNpZ25lZCBpbnQgbnIpCitzdGF0aWMgaW50IGNsaWVudF9hbGxvY19wYWdlcyhzdHJ1Y3QgZG1fa2NvcHlkX2NsaWVudCAqa2MsIHVuc2lnbmVkIGludCBucikKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIAlzdHJ1Y3QgcGFnZV9saXN0ICpwbCA9IE5VTEwsICpuZXh0OwpAQCAtMTQ3LDcgKzE2MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGNsaWVudF9mcmVlX3BhZ2VzKHN0cnVjdCBrY29weWRfY2xpZW50ICprYykKK3N0YXRpYyB2b2lkIGNsaWVudF9mcmVlX3BhZ2VzKHN0cnVjdCBkbV9rY29weWRfY2xpZW50ICprYykKIHsKIAlCVUdfT04oa2MtPm5yX2ZyZWVfcGFnZXMgIT0ga2MtPm5yX3BhZ2VzKTsKIAlkcm9wX3BhZ2VzKGtjLT5wYWdlcyk7CkBAIC0xNjEsNyArMTc1LDcgQEAKICAqIGV2ZXIgaGF2aW5nIHRvIGRvIGlvICh3aGljaCBjb3VsZCBjYXVzZSBhIGRlYWRsb2NrKS4KICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0cnVjdCBrY29weWRfam9iIHsKLQlzdHJ1Y3Qga2NvcHlkX2NsaWVudCAqa2M7CisJc3RydWN0IGRtX2tjb3B5ZF9jbGllbnQgKmtjOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0xNzUsMTMgKzE4OSwxMyBAQAogCSAqIEVpdGhlciBSRUFEIG9yIFdSSVRFCiAJICovCiAJaW50IHJ3OwotCXN0cnVjdCBpb19yZWdpb24gc291cmNlOworCXN0cnVjdCBkbV9pb19yZWdpb24gc291cmNlOwogCiAJLyoKIAkgKiBUaGUgZGVzdGluYXRpb25zIGZvciB0aGUgdHJhbnNmZXIuCiAJICovCiAJdW5zaWduZWQgaW50IG51bV9kZXN0czsKLQlzdHJ1Y3QgaW9fcmVnaW9uIGRlc3RzW0tDT1BZRF9NQVhfUkVHSU9OU107CisJc3RydWN0IGRtX2lvX3JlZ2lvbiBkZXN0c1tETV9LQ09QWURfTUFYX1JFR0lPTlNdOwogCiAJc2VjdG9yX3Qgb2Zmc2V0OwogCXVuc2lnbmVkIGludCBucl9wYWdlczsKQEAgLTE5MSw3ICsyMDUsNyBAQAogCSAqIFNldCB0aGlzIHRvIGVuc3VyZSB5b3UgYXJlIG5vdGlmaWVkIHdoZW4gdGhlIGpvYiBoYXMKIAkgKiBjb21wbGV0ZWQuICAnY29udGV4dCcgaXMgZm9yIGNhbGxiYWNrIHRvIHVzZS4KIAkgKi8KLQlrY29weWRfbm90aWZ5X2ZuIGZuOworCWRtX2tjb3B5ZF9ub3RpZnlfZm4gZm47CiAJdm9pZCAqY29udGV4dDsKIAogCS8qCkBAIC0yMDcsNDcgKzIyMSwxOSBAQAogI2RlZmluZSBNSU5fSk9CUyA1MTIKIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpfam9iX2NhY2hlOwotc3RhdGljIG1lbXBvb2xfdCAqX2pvYl9wb29sOwogCi0vKgotICogV2UgbWFpbnRhaW4gdGhyZWUgbGlzdHMgb2Ygam9iczoKLSAqCi0gKiBpKSAgIGpvYnMgd2FpdGluZyBmb3IgcGFnZXMKLSAqIGlpKSAgam9icyB0aGF0IGhhdmUgcGFnZXMsIGFuZCBhcmUgd2FpdGluZyBmb3IgdGhlIGlvIHRvIGJlIGlzc3VlZC4KLSAqIGlpaSkgam9icyB0aGF0IGhhdmUgY29tcGxldGVkLgotICoKLSAqIEFsbCB0aHJlZSBvZiB0aGVzZSBhcmUgcHJvdGVjdGVkIGJ5IGpvYl9sb2NrLgotICovCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKF9qb2JfbG9jayk7Ci0KLXN0YXRpYyBMSVNUX0hFQUQoX2NvbXBsZXRlX2pvYnMpOwotc3RhdGljIExJU1RfSEVBRChfaW9fam9icyk7Ci1zdGF0aWMgTElTVF9IRUFEKF9wYWdlc19qb2JzKTsKLQotc3RhdGljIGludCBqb2JzX2luaXQodm9pZCkKK2ludCBfX2luaXQgZG1fa2NvcHlkX2luaXQodm9pZCkKIHsKIAlfam9iX2NhY2hlID0gS01FTV9DQUNIRShrY29weWRfam9iLCAwKTsKIAlpZiAoIV9qb2JfY2FjaGUpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JX2pvYl9wb29sID0gbWVtcG9vbF9jcmVhdGVfc2xhYl9wb29sKE1JTl9KT0JTLCBfam9iX2NhY2hlKTsKLQlpZiAoIV9qb2JfcG9vbCkgewotCQlrbWVtX2NhY2hlX2Rlc3Ryb3koX2pvYl9jYWNoZSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBqb2JzX2V4aXQodm9pZCkKK3ZvaWQgZG1fa2NvcHlkX2V4aXQodm9pZCkKIHsKLQlCVUdfT04oIWxpc3RfZW1wdHkoJl9jb21wbGV0ZV9qb2JzKSk7Ci0JQlVHX09OKCFsaXN0X2VtcHR5KCZfaW9fam9icykpOwotCUJVR19PTighbGlzdF9lbXB0eSgmX3BhZ2VzX2pvYnMpKTsKLQotCW1lbXBvb2xfZGVzdHJveShfam9iX3Bvb2wpOwogCWttZW1fY2FjaGVfZGVzdHJveShfam9iX2NhY2hlKTsKLQlfam9iX3Bvb2wgPSBOVUxMOwogCV9qb2JfY2FjaGUgPSBOVUxMOwogfQogCkBAIC0yNTUsMTggKzI0MSwxOSBAQAogICogRnVuY3Rpb25zIHRvIHB1c2ggYW5kIHBvcCBhIGpvYiBvbnRvIHRoZSBoZWFkIG9mIGEgZ2l2ZW4gam9iCiAgKiBsaXN0LgogICovCi1zdGF0aWMgc3RydWN0IGtjb3B5ZF9qb2IgKnBvcChzdHJ1Y3QgbGlzdF9oZWFkICpqb2JzKQorc3RhdGljIHN0cnVjdCBrY29weWRfam9iICpwb3Aoc3RydWN0IGxpc3RfaGVhZCAqam9icywKKwkJCSAgICAgIHN0cnVjdCBkbV9rY29weWRfY2xpZW50ICprYykKIHsKIAlzdHJ1Y3Qga2NvcHlkX2pvYiAqam9iID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJl9qb2JfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZrYy0+am9iX2xvY2ssIGZsYWdzKTsKIAogCWlmICghbGlzdF9lbXB0eShqb2JzKSkgewogCQlqb2IgPSBsaXN0X2VudHJ5KGpvYnMtPm5leHQsIHN0cnVjdCBrY29weWRfam9iLCBsaXN0KTsKIAkJbGlzdF9kZWwoJmpvYi0+bGlzdCk7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJl9qb2JfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmtjLT5qb2JfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIGpvYjsKIH0KQEAgLTI3NCwxMCArMjYxLDExIEBACiBzdGF0aWMgdm9pZCBwdXNoKHN0cnVjdCBsaXN0X2hlYWQgKmpvYnMsIHN0cnVjdCBrY29weWRfam9iICpqb2IpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZG1fa2NvcHlkX2NsaWVudCAqa2MgPSBqb2ItPmtjOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJl9qb2JfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZrYy0+am9iX2xvY2ssIGZsYWdzKTsKIAlsaXN0X2FkZF90YWlsKCZqb2ItPmxpc3QsIGpvYnMpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJl9qb2JfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmtjLT5qb2JfbG9jaywgZmxhZ3MpOwogfQogCiAvKgpAQCAtMjk0LDExICsyODIsMTEgQEAKIAl2b2lkICpjb250ZXh0ID0gam9iLT5jb250ZXh0OwogCWludCByZWFkX2VyciA9IGpvYi0+cmVhZF9lcnI7CiAJdW5zaWduZWQgbG9uZyB3cml0ZV9lcnIgPSBqb2ItPndyaXRlX2VycjsKLQlrY29weWRfbm90aWZ5X2ZuIGZuID0gam9iLT5mbjsKLQlzdHJ1Y3Qga2NvcHlkX2NsaWVudCAqa2MgPSBqb2ItPmtjOworCWRtX2tjb3B5ZF9ub3RpZnlfZm4gZm4gPSBqb2ItPmZuOworCXN0cnVjdCBkbV9rY29weWRfY2xpZW50ICprYyA9IGpvYi0+a2M7CiAKIAlrY29weWRfcHV0X3BhZ2VzKGtjLCBqb2ItPnBhZ2VzKTsKLQltZW1wb29sX2ZyZWUoam9iLCBfam9iX3Bvb2wpOworCW1lbXBvb2xfZnJlZShqb2IsIGtjLT5qb2JfcG9vbCk7CiAJZm4ocmVhZF9lcnIsIHdyaXRlX2VyciwgY29udGV4dCk7CiAKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgma2MtPm5yX2pvYnMpKQpAQCAtMzEwLDYgKzI5OCw3IEBACiBzdGF0aWMgdm9pZCBjb21wbGV0ZV9pbyh1bnNpZ25lZCBsb25nIGVycm9yLCB2b2lkICpjb250ZXh0KQogewogCXN0cnVjdCBrY29weWRfam9iICpqb2IgPSAoc3RydWN0IGtjb3B5ZF9qb2IgKikgY29udGV4dDsKKwlzdHJ1Y3QgZG1fa2NvcHlkX2NsaWVudCAqa2MgPSBqb2ItPmtjOwogCiAJaWYgKGVycm9yKSB7CiAJCWlmIChqb2ItPnJ3ID09IFdSSVRFKQpAQCAtMzE3LDIyICszMDYsMjIgQEAKIAkJZWxzZQogCQkJam9iLT5yZWFkX2VyciA9IDE7CiAKLQkJaWYgKCF0ZXN0X2JpdChLQ09QWURfSUdOT1JFX0VSUk9SLCAmam9iLT5mbGFncykpIHsKLQkJCXB1c2goJl9jb21wbGV0ZV9qb2JzLCBqb2IpOwotCQkJd2FrZSgpOworCQlpZiAoIXRlc3RfYml0KERNX0tDT1BZRF9JR05PUkVfRVJST1IsICZqb2ItPmZsYWdzKSkgeworCQkJcHVzaCgma2MtPmNvbXBsZXRlX2pvYnMsIGpvYik7CisJCQl3YWtlKGtjKTsKIAkJCXJldHVybjsKIAkJfQogCX0KIAogCWlmIChqb2ItPnJ3ID09IFdSSVRFKQotCQlwdXNoKCZfY29tcGxldGVfam9icywgam9iKTsKKwkJcHVzaCgma2MtPmNvbXBsZXRlX2pvYnMsIGpvYik7CiAKIAllbHNlIHsKIAkJam9iLT5ydyA9IFdSSVRFOwotCQlwdXNoKCZfaW9fam9icywgam9iKTsKKwkJcHVzaCgma2MtPmlvX2pvYnMsIGpvYik7CiAJfQogCi0Jd2FrZSgpOworCXdha2Uoa2MpOwogfQogCiAvKgpAQCAtMzQzLDcgKzMzMiw3IEBACiB7CiAJaW50IHI7CiAJc3RydWN0IGRtX2lvX3JlcXVlc3QgaW9fcmVxID0gewotCQkuYmlfcncgPSBqb2ItPnJ3LAorCQkuYmlfcncgPSBqb2ItPnJ3IHwgKDEgPDwgQklPX1JXX1NZTkMpLAogCQkubWVtLnR5cGUgPSBETV9JT19QQUdFX0xJU1QsCiAJCS5tZW0ucHRyLnBsID0gam9iLT5wYWdlcywKIAkJLm1lbS5vZmZzZXQgPSBqb2ItPm9mZnNldCwKQEAgLTM2OSw3ICszNTgsNyBAQAogCXIgPSBrY29weWRfZ2V0X3BhZ2VzKGpvYi0+a2MsIGpvYi0+bnJfcGFnZXMsICZqb2ItPnBhZ2VzKTsKIAlpZiAoIXIpIHsKIAkJLyogdGhpcyBqb2IgaXMgcmVhZHkgZm9yIGlvICovCi0JCXB1c2goJl9pb19qb2JzLCBqb2IpOworCQlwdXNoKCZqb2ItPmtjLT5pb19qb2JzLCBqb2IpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTM4NCwxMiArMzczLDEzIEBACiAgKiBSdW4gdGhyb3VnaCBhIGxpc3QgZm9yIGFzIGxvbmcgYXMgcG9zc2libGUuICBSZXR1cm5zIHRoZSBjb3VudAogICogb2Ygc3VjY2Vzc2Z1bCBqb2JzLgogICovCi1zdGF0aWMgaW50IHByb2Nlc3Nfam9icyhzdHJ1Y3QgbGlzdF9oZWFkICpqb2JzLCBpbnQgKCpmbikgKHN0cnVjdCBrY29weWRfam9iICopKQorc3RhdGljIGludCBwcm9jZXNzX2pvYnMoc3RydWN0IGxpc3RfaGVhZCAqam9icywgc3RydWN0IGRtX2tjb3B5ZF9jbGllbnQgKmtjLAorCQkJaW50ICgqZm4pIChzdHJ1Y3Qga2NvcHlkX2pvYiAqKSkKIHsKIAlzdHJ1Y3Qga2NvcHlkX2pvYiAqam9iOwogCWludCByLCBjb3VudCA9IDA7CiAKLQl3aGlsZSAoKGpvYiA9IHBvcChqb2JzKSkpIHsKKwl3aGlsZSAoKGpvYiA9IHBvcChqb2JzLCBrYykpKSB7CiAKIAkJciA9IGZuKGpvYik7CiAKQEAgLTM5OSw3ICszODksNyBAQAogCQkJCWpvYi0+d3JpdGVfZXJyID0gKHVuc2lnbmVkIGxvbmcpIC0xTDsKIAkJCWVsc2UKIAkJCQlqb2ItPnJlYWRfZXJyID0gMTsKLQkJCXB1c2goJl9jb21wbGV0ZV9qb2JzLCBqb2IpOworCQkJcHVzaCgma2MtPmNvbXBsZXRlX2pvYnMsIGpvYik7CiAJCQlicmVhazsKIAkJfQogCkBAIC00MjEsOCArNDExLDExIEBACiAvKgogICoga2NvcHlkIGRvZXMgdGhpcyBldmVyeSB0aW1lIGl0J3Mgd29rZW4gdXAuCiAgKi8KLXN0YXRpYyB2b2lkIGRvX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICppZ25vcmVkKQorc3RhdGljIHZvaWQgZG9fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CisJc3RydWN0IGRtX2tjb3B5ZF9jbGllbnQgKmtjID0gY29udGFpbmVyX29mKHdvcmssCisJCQkJCXN0cnVjdCBkbV9rY29weWRfY2xpZW50LCBrY29weWRfd29yayk7CisKIAkvKgogCSAqIFRoZSBvcmRlciB0aGF0IHRoZXNlIGFyZSBjYWxsZWQgaXMgKnZlcnkqIGltcG9ydGFudC4KIAkgKiBjb21wbGV0ZSBqb2JzIGNhbiBmcmVlIHNvbWUgcGFnZXMgZm9yIHBhZ2VzIGpvYnMuCkBAIC00MzAsOSArNDIzLDkgQEAKIAkgKiBsaXN0LiAgaW8gam9icyBjYWxsIHdha2Ugd2hlbiB0aGV5IGNvbXBsZXRlIGFuZCBpdCBhbGwKIAkgKiBzdGFydHMgYWdhaW4uCiAJICovCi0JcHJvY2Vzc19qb2JzKCZfY29tcGxldGVfam9icywgcnVuX2NvbXBsZXRlX2pvYik7Ci0JcHJvY2Vzc19qb2JzKCZfcGFnZXNfam9icywgcnVuX3BhZ2VzX2pvYik7Ci0JcHJvY2Vzc19qb2JzKCZfaW9fam9icywgcnVuX2lvX2pvYik7CisJcHJvY2Vzc19qb2JzKCZrYy0+Y29tcGxldGVfam9icywga2MsIHJ1bl9jb21wbGV0ZV9qb2IpOworCXByb2Nlc3Nfam9icygma2MtPnBhZ2VzX2pvYnMsIGtjLCBydW5fcGFnZXNfam9iKTsKKwlwcm9jZXNzX2pvYnMoJmtjLT5pb19qb2JzLCBrYywgcnVuX2lvX2pvYik7CiB9CiAKIC8qCkBAIC00NDIsOSArNDM1LDEwIEBACiAgKi8KIHN0YXRpYyB2b2lkIGRpc3BhdGNoX2pvYihzdHJ1Y3Qga2NvcHlkX2pvYiAqam9iKQogewotCWF0b21pY19pbmMoJmpvYi0+a2MtPm5yX2pvYnMpOwotCXB1c2goJl9wYWdlc19qb2JzLCBqb2IpOwotCXdha2UoKTsKKwlzdHJ1Y3QgZG1fa2NvcHlkX2NsaWVudCAqa2MgPSBqb2ItPmtjOworCWF0b21pY19pbmMoJmtjLT5ucl9qb2JzKTsKKwlwdXNoKCZrYy0+cGFnZXNfam9icywgam9iKTsKKwl3YWtlKGtjKTsKIH0KIAogI2RlZmluZSBTVUJfSk9CX1NJWkUgMTI4CkBAIC00NjksNyArNDYzLDcgQEAKIAkgKiBPbmx5IGRpc3BhdGNoIG1vcmUgd29yayBpZiB0aGVyZSBoYXNuJ3QgYmVlbiBhbiBlcnJvci4KIAkgKi8KIAlpZiAoKCFqb2ItPnJlYWRfZXJyICYmICFqb2ItPndyaXRlX2VycikgfHwKLQkgICAgdGVzdF9iaXQoS0NPUFlEX0lHTk9SRV9FUlJPUiwgJmpvYi0+ZmxhZ3MpKSB7CisJICAgIHRlc3RfYml0KERNX0tDT1BZRF9JR05PUkVfRVJST1IsICZqb2ItPmZsYWdzKSkgewogCQkvKiBnZXQgdGhlIG5leHQgY2h1bmsgb2Ygd29yayAqLwogCQlwcm9ncmVzcyA9IGpvYi0+cHJvZ3Jlc3M7CiAJCWNvdW50ID0gam9iLT5zb3VyY2UuY291bnQgLSBwcm9ncmVzczsKQEAgLTQ4NCw3ICs0NzgsOCBAQAogCiAJaWYgKGNvdW50KSB7CiAJCWludCBpOwotCQlzdHJ1Y3Qga2NvcHlkX2pvYiAqc3ViX2pvYiA9IG1lbXBvb2xfYWxsb2MoX2pvYl9wb29sLCBHRlBfTk9JTyk7CisJCXN0cnVjdCBrY29weWRfam9iICpzdWJfam9iID0gbWVtcG9vbF9hbGxvYyhqb2ItPmtjLT5qb2JfcG9vbCwKKwkJCQkJCQkgICBHRlBfTk9JTyk7CiAKIAkJKnN1Yl9qb2IgPSAqam9iOwogCQlzdWJfam9iLT5zb3VyY2Uuc2VjdG9yICs9IHByb2dyZXNzOwpAQCAtNTA4LDcgKzUwMyw3IEBACiAJCSAqIGFmdGVyIHdlJ3ZlIGNvbXBsZXRlZC4KIAkJICovCiAJCWpvYi0+Zm4ocmVhZF9lcnIsIHdyaXRlX2Vyciwgam9iLT5jb250ZXh0KTsKLQkJbWVtcG9vbF9mcmVlKGpvYiwgX2pvYl9wb29sKTsKKwkJbWVtcG9vbF9mcmVlKGpvYiwgam9iLT5rYy0+am9iX3Bvb2wpOwogCX0KIH0KIApAQCAtNTI2LDE2ICs1MjEsMTYgQEAKIAkJc2VnbWVudF9jb21wbGV0ZSgwLCAwdSwgam9iKTsKIH0KIAotaW50IGtjb3B5ZF9jb3B5KHN0cnVjdCBrY29weWRfY2xpZW50ICprYywgc3RydWN0IGlvX3JlZ2lvbiAqZnJvbSwKLQkJdW5zaWduZWQgaW50IG51bV9kZXN0cywgc3RydWN0IGlvX3JlZ2lvbiAqZGVzdHMsCi0JCXVuc2lnbmVkIGludCBmbGFncywga2NvcHlkX25vdGlmeV9mbiBmbiwgdm9pZCAqY29udGV4dCkKK2ludCBkbV9rY29weWRfY29weShzdHJ1Y3QgZG1fa2NvcHlkX2NsaWVudCAqa2MsIHN0cnVjdCBkbV9pb19yZWdpb24gKmZyb20sCisJCSAgIHVuc2lnbmVkIGludCBudW1fZGVzdHMsIHN0cnVjdCBkbV9pb19yZWdpb24gKmRlc3RzLAorCQkgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIGRtX2tjb3B5ZF9ub3RpZnlfZm4gZm4sIHZvaWQgKmNvbnRleHQpCiB7CiAJc3RydWN0IGtjb3B5ZF9qb2IgKmpvYjsKIAogCS8qCiAJICogQWxsb2NhdGUgYSBuZXcgam9iLgogCSAqLwotCWpvYiA9IG1lbXBvb2xfYWxsb2MoX2pvYl9wb29sLCBHRlBfTk9JTyk7CisJam9iID0gbWVtcG9vbF9hbGxvYyhrYy0+am9iX3Bvb2wsIEdGUF9OT0lPKTsKIAogCS8qCiAJICogc2V0IHVwIGZvciB0aGUgcmVhZC4KQEAgLTU2OSw2ICs1NjQsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKGRtX2tjb3B5ZF9jb3B5KTsKIAogLyoKICAqIENhbmNlbHMgYSBrY29weWQgam9iLCBlZy4gc29tZW9uZSBtaWdodCBiZSBkZWFjdGl2YXRpbmcgYQpAQCAtNTgzLDEyNiArNTc5LDc2IEBACiAjZW5kaWYgIC8qICAwICAqLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBVbml0IHNldHVwCisgKiBDbGllbnQgc2V0dXAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBERUZJTkVfTVVURVgoX2NsaWVudF9sb2NrKTsKLXN0YXRpYyBMSVNUX0hFQUQoX2NsaWVudHMpOwotCi1zdGF0aWMgdm9pZCBjbGllbnRfYWRkKHN0cnVjdCBrY29weWRfY2xpZW50ICprYykKK2ludCBkbV9rY29weWRfY2xpZW50X2NyZWF0ZSh1bnNpZ25lZCBpbnQgbnJfcGFnZXMsCisJCQkgICAgc3RydWN0IGRtX2tjb3B5ZF9jbGllbnQgKipyZXN1bHQpCiB7Ci0JbXV0ZXhfbG9jaygmX2NsaWVudF9sb2NrKTsKLQlsaXN0X2FkZCgma2MtPmxpc3QsICZfY2xpZW50cyk7Ci0JbXV0ZXhfdW5sb2NrKCZfY2xpZW50X2xvY2spOwotfQotCi1zdGF0aWMgdm9pZCBjbGllbnRfZGVsKHN0cnVjdCBrY29weWRfY2xpZW50ICprYykKLXsKLQltdXRleF9sb2NrKCZfY2xpZW50X2xvY2spOwotCWxpc3RfZGVsKCZrYy0+bGlzdCk7Ci0JbXV0ZXhfdW5sb2NrKCZfY2xpZW50X2xvY2spOwotfQotCi1zdGF0aWMgREVGSU5FX01VVEVYKGtjb3B5ZF9pbml0X2xvY2spOwotc3RhdGljIGludCBrY29weWRfY2xpZW50cyA9IDA7Ci0KLXN0YXRpYyBpbnQga2NvcHlkX2luaXQodm9pZCkKLXsKLQlpbnQgcjsKLQotCW11dGV4X2xvY2soJmtjb3B5ZF9pbml0X2xvY2spOwotCi0JaWYgKGtjb3B5ZF9jbGllbnRzKSB7Ci0JCS8qIEFscmVhZHkgaW5pdGlhbGl6ZWQuICovCi0JCWtjb3B5ZF9jbGllbnRzKys7Ci0JCW11dGV4X3VubG9jaygma2NvcHlkX2luaXRfbG9jayk7Ci0JCXJldHVybiAwOwotCX0KLQotCXIgPSBqb2JzX2luaXQoKTsKLQlpZiAocikgewotCQltdXRleF91bmxvY2soJmtjb3B5ZF9pbml0X2xvY2spOwotCQlyZXR1cm4gcjsKLQl9Ci0KLQlfa2NvcHlkX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImtjb3B5ZCIpOwotCWlmICghX2tjb3B5ZF93cSkgewotCQlqb2JzX2V4aXQoKTsKLQkJbXV0ZXhfdW5sb2NrKCZrY29weWRfaW5pdF9sb2NrKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0Ja2NvcHlkX2NsaWVudHMrKzsKLQlJTklUX1dPUksoJl9rY29weWRfd29yaywgZG9fd29yayk7Ci0JbXV0ZXhfdW5sb2NrKCZrY29weWRfaW5pdF9sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQga2NvcHlkX2V4aXQodm9pZCkKLXsKLQltdXRleF9sb2NrKCZrY29weWRfaW5pdF9sb2NrKTsKLQlrY29weWRfY2xpZW50cy0tOwotCWlmICgha2NvcHlkX2NsaWVudHMpIHsKLQkJam9ic19leGl0KCk7Ci0JCWRlc3Ryb3lfd29ya3F1ZXVlKF9rY29weWRfd3EpOwotCQlfa2NvcHlkX3dxID0gTlVMTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZrY29weWRfaW5pdF9sb2NrKTsKLX0KLQotaW50IGtjb3B5ZF9jbGllbnRfY3JlYXRlKHVuc2lnbmVkIGludCBucl9wYWdlcywgc3RydWN0IGtjb3B5ZF9jbGllbnQgKipyZXN1bHQpCi17Ci0JaW50IHIgPSAwOwotCXN0cnVjdCBrY29weWRfY2xpZW50ICprYzsKLQotCXIgPSBrY29weWRfaW5pdCgpOwotCWlmIChyKQotCQlyZXR1cm4gcjsKKwlpbnQgciA9IC1FTk9NRU07CisJc3RydWN0IGRtX2tjb3B5ZF9jbGllbnQgKmtjOwogCiAJa2MgPSBrbWFsbG9jKHNpemVvZigqa2MpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWtjKSB7Ci0JCWtjb3B5ZF9leGl0KCk7CisJaWYgKCFrYykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJc3Bpbl9sb2NrX2luaXQoJmtjLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgma2MtPmpvYl9sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgma2MtPmNvbXBsZXRlX2pvYnMpOworCUlOSVRfTElTVF9IRUFEKCZrYy0+aW9fam9icyk7CisJSU5JVF9MSVNUX0hFQUQoJmtjLT5wYWdlc19qb2JzKTsKKworCWtjLT5qb2JfcG9vbCA9IG1lbXBvb2xfY3JlYXRlX3NsYWJfcG9vbChNSU5fSk9CUywgX2pvYl9jYWNoZSk7CisJaWYgKCFrYy0+am9iX3Bvb2wpCisJCWdvdG8gYmFkX3NsYWI7CisKKwlJTklUX1dPUksoJmtjLT5rY29weWRfd29yaywgZG9fd29yayk7CisJa2MtPmtjb3B5ZF93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJrY29weWQiKTsKKwlpZiAoIWtjLT5rY29weWRfd3EpCisJCWdvdG8gYmFkX3dvcmtxdWV1ZTsKKwogCWtjLT5wYWdlcyA9IE5VTEw7CiAJa2MtPm5yX3BhZ2VzID0ga2MtPm5yX2ZyZWVfcGFnZXMgPSAwOwogCXIgPSBjbGllbnRfYWxsb2NfcGFnZXMoa2MsIG5yX3BhZ2VzKTsKLQlpZiAocikgewotCQlrZnJlZShrYyk7Ci0JCWtjb3B5ZF9leGl0KCk7Ci0JCXJldHVybiByOwotCX0KKwlpZiAocikKKwkJZ290byBiYWRfY2xpZW50X3BhZ2VzOwogCiAJa2MtPmlvX2NsaWVudCA9IGRtX2lvX2NsaWVudF9jcmVhdGUobnJfcGFnZXMpOwogCWlmIChJU19FUlIoa2MtPmlvX2NsaWVudCkpIHsKIAkJciA9IFBUUl9FUlIoa2MtPmlvX2NsaWVudCk7Ci0JCWNsaWVudF9mcmVlX3BhZ2VzKGtjKTsKLQkJa2ZyZWUoa2MpOwotCQlrY29weWRfZXhpdCgpOwotCQlyZXR1cm4gcjsKKwkJZ290byBiYWRfaW9fY2xpZW50OwogCX0KIAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmtjLT5kZXN0cm95cSk7CiAJYXRvbWljX3NldCgma2MtPm5yX2pvYnMsIDApOwogCi0JY2xpZW50X2FkZChrYyk7CiAJKnJlc3VsdCA9IGtjOwogCXJldHVybiAwOwotfQogCi12b2lkIGtjb3B5ZF9jbGllbnRfZGVzdHJveShzdHJ1Y3Qga2NvcHlkX2NsaWVudCAqa2MpCitiYWRfaW9fY2xpZW50OgorCWNsaWVudF9mcmVlX3BhZ2VzKGtjKTsKK2JhZF9jbGllbnRfcGFnZXM6CisJZGVzdHJveV93b3JrcXVldWUoa2MtPmtjb3B5ZF93cSk7CitiYWRfd29ya3F1ZXVlOgorCW1lbXBvb2xfZGVzdHJveShrYy0+am9iX3Bvb2wpOworYmFkX3NsYWI6CisJa2ZyZWUoa2MpOworCisJcmV0dXJuIHI7Cit9CitFWFBPUlRfU1lNQk9MKGRtX2tjb3B5ZF9jbGllbnRfY3JlYXRlKTsKKwordm9pZCBkbV9rY29weWRfY2xpZW50X2Rlc3Ryb3koc3RydWN0IGRtX2tjb3B5ZF9jbGllbnQgKmtjKQogewogCS8qIFdhaXQgZm9yIGNvbXBsZXRpb24gb2YgYWxsIGpvYnMgc3VibWl0dGVkIGJ5IHRoaXMgY2xpZW50LiAqLwogCXdhaXRfZXZlbnQoa2MtPmRlc3Ryb3lxLCAhYXRvbWljX3JlYWQoJmtjLT5ucl9qb2JzKSk7CiAKKwlCVUdfT04oIWxpc3RfZW1wdHkoJmtjLT5jb21wbGV0ZV9qb2JzKSk7CisJQlVHX09OKCFsaXN0X2VtcHR5KCZrYy0+aW9fam9icykpOworCUJVR19PTighbGlzdF9lbXB0eSgma2MtPnBhZ2VzX2pvYnMpKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShrYy0+a2NvcHlkX3dxKTsKIAlkbV9pb19jbGllbnRfZGVzdHJveShrYy0+aW9fY2xpZW50KTsKIAljbGllbnRfZnJlZV9wYWdlcyhrYyk7Ci0JY2xpZW50X2RlbChrYyk7CisJbWVtcG9vbF9kZXN0cm95KGtjLT5qb2JfcG9vbCk7CiAJa2ZyZWUoa2MpOwotCWtjb3B5ZF9leGl0KCk7CiB9Ci0KLUVYUE9SVF9TWU1CT0woa2NvcHlkX2NsaWVudF9jcmVhdGUpOwotRVhQT1JUX1NZTUJPTChrY29weWRfY2xpZW50X2Rlc3Ryb3kpOwotRVhQT1JUX1NZTUJPTChrY29weWRfY29weSk7CitFWFBPUlRfU1lNQk9MKGRtX2tjb3B5ZF9jbGllbnRfZGVzdHJveSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWxvZy5jIGIvZHJpdmVycy9tZC9kbS1sb2cuYwppbmRleCAyYTc0YjIxLi42N2E2ZjMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWxvZy5jCisrKyBiL2RyaXZlcnMvbWQvZG0tbG9nLmMKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDAzIFNpc3RpbmEgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA4IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIExHUEwuCiAgKi8KQEAgLTgsNjQgKzksNTggQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtLWlvLmg+CisjaW5jbHVkZSA8bGludXgvZG0tZGlydHktbG9nLmg+CiAKLSNpbmNsdWRlICJkbS1sb2cuaCIKLSNpbmNsdWRlICJkbS1pby5oIgorI2luY2x1ZGUgImRtLmgiCiAKLSNkZWZpbmUgRE1fTVNHX1BSRUZJWCAibWlycm9yIGxvZyIKKyNkZWZpbmUgRE1fTVNHX1BSRUZJWCAiZGlydHkgcmVnaW9uIGxvZyIKKworc3RydWN0IGRtX2RpcnR5X2xvZ19pbnRlcm5hbCB7CisJc3RydWN0IGRtX2RpcnR5X2xvZ190eXBlICp0eXBlOworCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWxvbmcgdXNlOworfTsKIAogc3RhdGljIExJU1RfSEVBRChfbG9nX3R5cGVzKTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soX2xvY2spOwogCi1pbnQgZG1fcmVnaXN0ZXJfZGlydHlfbG9nX3R5cGUoc3RydWN0IGRpcnR5X2xvZ190eXBlICp0eXBlKQorc3RhdGljIHN0cnVjdCBkbV9kaXJ0eV9sb2dfaW50ZXJuYWwgKl9fZmluZF9kaXJ0eV9sb2dfdHlwZShjb25zdCBjaGFyICpuYW1lKQogewotCXNwaW5fbG9jaygmX2xvY2spOwotCXR5cGUtPnVzZV9jb3VudCA9IDA7Ci0JbGlzdF9hZGQoJnR5cGUtPmxpc3QsICZfbG9nX3R5cGVzKTsKLQlzcGluX3VubG9jaygmX2xvY2spOworCXN0cnVjdCBkbV9kaXJ0eV9sb2dfaW50ZXJuYWwgKmxvZ190eXBlOwogCi0JcmV0dXJuIDA7Ci19CisJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2dfdHlwZSwgJl9sb2dfdHlwZXMsIGxpc3QpCisJCWlmICghc3RyY21wKG5hbWUsIGxvZ190eXBlLT50eXBlLT5uYW1lKSkKKwkJCXJldHVybiBsb2dfdHlwZTsKIAotaW50IGRtX3VucmVnaXN0ZXJfZGlydHlfbG9nX3R5cGUoc3RydWN0IGRpcnR5X2xvZ190eXBlICp0eXBlKQotewotCXNwaW5fbG9jaygmX2xvY2spOwotCi0JaWYgKHR5cGUtPnVzZV9jb3VudCkKLQkJRE1XQVJOKCJBdHRlbXB0IHRvIHVucmVnaXN0ZXIgYSBsb2cgdHlwZSB0aGF0IGlzIHN0aWxsIGluIHVzZSIpOwotCWVsc2UKLQkJbGlzdF9kZWwoJnR5cGUtPmxpc3QpOwotCi0Jc3Bpbl91bmxvY2soJl9sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGRpcnR5X2xvZ190eXBlICpfZ2V0X3R5cGUoY29uc3QgY2hhciAqdHlwZV9uYW1lKQotewotCXN0cnVjdCBkaXJ0eV9sb2dfdHlwZSAqdHlwZTsKLQotCXNwaW5fbG9jaygmX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkgKHR5cGUsICZfbG9nX3R5cGVzLCBsaXN0KQotCQlpZiAoIXN0cmNtcCh0eXBlX25hbWUsIHR5cGUtPm5hbWUpKSB7Ci0JCQlpZiAoIXR5cGUtPnVzZV9jb3VudCAmJiAhdHJ5X21vZHVsZV9nZXQodHlwZS0+bW9kdWxlKSl7Ci0JCQkJc3Bpbl91bmxvY2soJl9sb2NrKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCXR5cGUtPnVzZV9jb3VudCsrOwotCQkJc3Bpbl91bmxvY2soJl9sb2NrKTsKLQkJCXJldHVybiB0eXBlOwotCQl9Ci0KLQlzcGluX3VubG9jaygmX2xvY2spOwogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgc3RydWN0IGRtX2RpcnR5X2xvZ19pbnRlcm5hbCAqX2dldF9kaXJ0eV9sb2dfdHlwZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBkbV9kaXJ0eV9sb2dfaW50ZXJuYWwgKmxvZ190eXBlOworCisJc3Bpbl9sb2NrKCZfbG9jayk7CisKKwlsb2dfdHlwZSA9IF9fZmluZF9kaXJ0eV9sb2dfdHlwZShuYW1lKTsKKwlpZiAobG9nX3R5cGUpIHsKKwkJaWYgKCFsb2dfdHlwZS0+dXNlICYmICF0cnlfbW9kdWxlX2dldChsb2dfdHlwZS0+dHlwZS0+bW9kdWxlKSkKKwkJCWxvZ190eXBlID0gTlVMTDsKKwkJZWxzZQorCQkJbG9nX3R5cGUtPnVzZSsrOworCX0KKworCXNwaW5fdW5sb2NrKCZfbG9jayk7CisKKwlyZXR1cm4gbG9nX3R5cGU7Cit9CisKIC8qCiAgKiBnZXRfdHlwZQogICogQHR5cGVfbmFtZQogICoKLSAqIEF0dGVtcHQgdG8gcmV0cmlldmUgdGhlIGRpcnR5X2xvZ190eXBlIGJ5IG5hbWUuICBJZiBub3QgYWxyZWFkeQorICogQXR0ZW1wdCB0byByZXRyaWV2ZSB0aGUgZG1fZGlydHlfbG9nX3R5cGUgYnkgbmFtZS4gIElmIG5vdCBhbHJlYWR5CiAgKiBhdmFpbGFibGUsIGF0dGVtcHQgdG8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgbW9kdWxlLgogICoKICAqIExvZyBtb2R1bGVzIGFyZSBuYW1lZCAiZG0tbG9nLSIgZm9sbG93ZWQgYnkgdGhlICd0eXBlX25hbWUnLgpAQCAtNzgsMTQgKzczLDE3IEBACiAgKgogICogUmV0dXJuczogZGlydHlfbG9nX3R5cGUqIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZQogICovCi1zdGF0aWMgc3RydWN0IGRpcnR5X2xvZ190eXBlICpnZXRfdHlwZShjb25zdCBjaGFyICp0eXBlX25hbWUpCitzdGF0aWMgc3RydWN0IGRtX2RpcnR5X2xvZ190eXBlICpnZXRfdHlwZShjb25zdCBjaGFyICp0eXBlX25hbWUpCiB7CiAJY2hhciAqcCwgKnR5cGVfbmFtZV9kdXA7Ci0Jc3RydWN0IGRpcnR5X2xvZ190eXBlICp0eXBlOworCXN0cnVjdCBkbV9kaXJ0eV9sb2dfaW50ZXJuYWwgKmxvZ190eXBlOwogCi0JdHlwZSA9IF9nZXRfdHlwZSh0eXBlX25hbWUpOwotCWlmICh0eXBlKQotCQlyZXR1cm4gdHlwZTsKKwlpZiAoIXR5cGVfbmFtZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsb2dfdHlwZSA9IF9nZXRfZGlydHlfbG9nX3R5cGUodHlwZV9uYW1lKTsKKwlpZiAobG9nX3R5cGUpCisJCXJldHVybiBsb2dfdHlwZS0+dHlwZTsKIAogCXR5cGVfbmFtZV9kdXAgPSBrc3RyZHVwKHR5cGVfbmFtZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0eXBlX25hbWVfZHVwKSB7CkBAIC05NSwzNCArOTMsMTA2IEBACiAJfQogCiAJd2hpbGUgKHJlcXVlc3RfbW9kdWxlKCJkbS1sb2ctJXMiLCB0eXBlX25hbWVfZHVwKSB8fAotCSAgICAgICAhKHR5cGUgPSBfZ2V0X3R5cGUodHlwZV9uYW1lKSkpIHsKKwkgICAgICAgIShsb2dfdHlwZSA9IF9nZXRfZGlydHlfbG9nX3R5cGUodHlwZV9uYW1lKSkpIHsKIAkJcCA9IHN0cnJjaHIodHlwZV9uYW1lX2R1cCwgJy0nKTsKIAkJaWYgKCFwKQogCQkJYnJlYWs7CiAJCXBbMF0gPSAnXDAnOwogCX0KIAotCWlmICghdHlwZSkKKwlpZiAoIWxvZ190eXBlKQogCQlETVdBUk4oIk1vZHVsZSBmb3IgbG9nZ2luZyB0eXBlIFwiJXNcIiBub3QgZm91bmQuIiwgdHlwZV9uYW1lKTsKIAogCWtmcmVlKHR5cGVfbmFtZV9kdXApOwogCi0JcmV0dXJuIHR5cGU7CisJcmV0dXJuIGxvZ190eXBlID8gbG9nX3R5cGUtPnR5cGUgOiBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBwdXRfdHlwZShzdHJ1Y3QgZGlydHlfbG9nX3R5cGUgKnR5cGUpCitzdGF0aWMgdm9pZCBwdXRfdHlwZShzdHJ1Y3QgZG1fZGlydHlfbG9nX3R5cGUgKnR5cGUpCiB7CisJc3RydWN0IGRtX2RpcnR5X2xvZ19pbnRlcm5hbCAqbG9nX3R5cGU7CisKKwlpZiAoIXR5cGUpCisJCXJldHVybjsKKwogCXNwaW5fbG9jaygmX2xvY2spOwotCWlmICghLS10eXBlLT51c2VfY291bnQpCisJbG9nX3R5cGUgPSBfX2ZpbmRfZGlydHlfbG9nX3R5cGUodHlwZS0+bmFtZSk7CisJaWYgKCFsb2dfdHlwZSkKKwkJZ290byBvdXQ7CisKKwlpZiAoIS0tbG9nX3R5cGUtPnVzZSkKIAkJbW9kdWxlX3B1dCh0eXBlLT5tb2R1bGUpOworCisJQlVHX09OKGxvZ190eXBlLT51c2UgPCAwKTsKKworb3V0OgogCXNwaW5fdW5sb2NrKCZfbG9jayk7CiB9CiAKLXN0cnVjdCBkaXJ0eV9sb2cgKmRtX2NyZWF0ZV9kaXJ0eV9sb2coY29uc3QgY2hhciAqdHlwZV9uYW1lLCBzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCitzdGF0aWMgc3RydWN0IGRtX2RpcnR5X2xvZ19pbnRlcm5hbCAqX2FsbG9jX2RpcnR5X2xvZ190eXBlKHN0cnVjdCBkbV9kaXJ0eV9sb2dfdHlwZSAqdHlwZSkKIHsKLQlzdHJ1Y3QgZGlydHlfbG9nX3R5cGUgKnR5cGU7Ci0Jc3RydWN0IGRpcnR5X2xvZyAqbG9nOworCXN0cnVjdCBkbV9kaXJ0eV9sb2dfaW50ZXJuYWwgKmxvZ190eXBlID0ga3phbGxvYyhzaXplb2YoKmxvZ190eXBlKSwKKwkJCQkJCQkgR0ZQX0tFUk5FTCk7CisKKwlpZiAobG9nX3R5cGUpCisJCWxvZ190eXBlLT50eXBlID0gdHlwZTsKKworCXJldHVybiBsb2dfdHlwZTsKK30KKworaW50IGRtX2RpcnR5X2xvZ190eXBlX3JlZ2lzdGVyKHN0cnVjdCBkbV9kaXJ0eV9sb2dfdHlwZSAqdHlwZSkKK3sKKwlzdHJ1Y3QgZG1fZGlydHlfbG9nX2ludGVybmFsICpsb2dfdHlwZSA9IF9hbGxvY19kaXJ0eV9sb2dfdHlwZSh0eXBlKTsKKwlpbnQgciA9IDA7CisKKwlpZiAoIWxvZ190eXBlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9jaygmX2xvY2spOworCWlmICghX19maW5kX2RpcnR5X2xvZ190eXBlKHR5cGUtPm5hbWUpKQorCQlsaXN0X2FkZCgmbG9nX3R5cGUtPmxpc3QsICZfbG9nX3R5cGVzKTsKKwllbHNlIHsKKwkJa2ZyZWUobG9nX3R5cGUpOworCQlyID0gLUVFWElTVDsKKwl9CisJc3Bpbl91bmxvY2soJl9sb2NrKTsKKworCXJldHVybiByOworfQorRVhQT1JUX1NZTUJPTChkbV9kaXJ0eV9sb2dfdHlwZV9yZWdpc3Rlcik7CisKK2ludCBkbV9kaXJ0eV9sb2dfdHlwZV91bnJlZ2lzdGVyKHN0cnVjdCBkbV9kaXJ0eV9sb2dfdHlwZSAqdHlwZSkKK3sKKwlzdHJ1Y3QgZG1fZGlydHlfbG9nX2ludGVybmFsICpsb2dfdHlwZTsKKworCXNwaW5fbG9jaygmX2xvY2spOworCisJbG9nX3R5cGUgPSBfX2ZpbmRfZGlydHlfbG9nX3R5cGUodHlwZS0+bmFtZSk7CisJaWYgKCFsb2dfdHlwZSkgeworCQlzcGluX3VubG9jaygmX2xvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobG9nX3R5cGUtPnVzZSkgeworCQlzcGluX3VubG9jaygmX2xvY2spOworCQlyZXR1cm4gLUVUWFRCU1k7CisJfQorCisJbGlzdF9kZWwoJmxvZ190eXBlLT5saXN0KTsKKworCXNwaW5fdW5sb2NrKCZfbG9jayk7CisJa2ZyZWUobG9nX3R5cGUpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRtX2RpcnR5X2xvZ190eXBlX3VucmVnaXN0ZXIpOworCitzdHJ1Y3QgZG1fZGlydHlfbG9nICpkbV9kaXJ0eV9sb2dfY3JlYXRlKGNvbnN0IGNoYXIgKnR5cGVfbmFtZSwKKwkJCQkJIHN0cnVjdCBkbV90YXJnZXQgKnRpLAorCQkJCQkgdW5zaWduZWQgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBkbV9kaXJ0eV9sb2dfdHlwZSAqdHlwZTsKKwlzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2c7CiAKIAlsb2cgPSBrbWFsbG9jKHNpemVvZigqbG9nKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFsb2cpCkBAIC0xNDMsMTMgKzIxMywxNSBAQAogCiAJcmV0dXJuIGxvZzsKIH0KK0VYUE9SVF9TWU1CT0woZG1fZGlydHlfbG9nX2NyZWF0ZSk7CiAKLXZvaWQgZG1fZGVzdHJveV9kaXJ0eV9sb2coc3RydWN0IGRpcnR5X2xvZyAqbG9nKQordm9pZCBkbV9kaXJ0eV9sb2dfZGVzdHJveShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2cpCiB7CiAJbG9nLT50eXBlLT5kdHIobG9nKTsKIAlwdXRfdHlwZShsb2ctPnR5cGUpOwogCWtmcmVlKGxvZyk7CiB9CitFWFBPUlRfU1lNQk9MKGRtX2RpcnR5X2xvZ19kZXN0cm95KTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogUGVyc2lzdGVudCBhbmQgY29yZSBsb2dzIHNoYXJlIGEgbG90IG9mIHRoZWlyIGltcGxlbWVudGF0aW9uLgpAQCAtMjA3LDcgKzI3OSw3IEBACiAJc3RydWN0IGRtX2RldiAqbG9nX2RldjsKIAlzdHJ1Y3QgbG9nX2hlYWRlciBoZWFkZXI7CiAKLQlzdHJ1Y3QgaW9fcmVnaW9uIGhlYWRlcl9sb2NhdGlvbjsKKwlzdHJ1Y3QgZG1faW9fcmVnaW9uIGhlYWRlcl9sb2NhdGlvbjsKIAlzdHJ1Y3QgbG9nX2hlYWRlciAqZGlza19oZWFkZXI7CiB9OwogCkBAIC0yMTUsNyArMjg3LDcgQEAKICAqIFRoZSB0b3VjaGVkIG1lbWJlciBuZWVkcyB0byBiZSB1cGRhdGVkIGV2ZXJ5IHRpbWUgd2UgYWNjZXNzCiAgKiBvbmUgb2YgdGhlIGJpdHNldHMuCiAgKi8KLXN0YXRpYyAgaW5saW5lIGludCBsb2dfdGVzdF9iaXQodWludDMyX3QgKmJzLCB1bnNpZ25lZCBiaXQpCitzdGF0aWMgaW5saW5lIGludCBsb2dfdGVzdF9iaXQodWludDMyX3QgKmJzLCB1bnNpZ25lZCBiaXQpCiB7CiAJcmV0dXJuIGV4dDJfdGVzdF9iaXQoYml0LCAodW5zaWduZWQgbG9uZyAqKSBicykgPyAxIDogMDsKIH0KQEAgLTMwMiw3ICszNzQsNyBAQAogICogYXJndiBjb250YWlucyByZWdpb25fc2l6ZSBmb2xsb3dlZCBvcHRpb25hbGx5IGJ5IFtub11zeW5jCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNkZWZpbmUgQllURV9TSElGVCAzCi1zdGF0aWMgaW50IGNyZWF0ZV9sb2dfY29udGV4dChzdHJ1Y3QgZGlydHlfbG9nICpsb2csIHN0cnVjdCBkbV90YXJnZXQgKnRpLAorc3RhdGljIGludCBjcmVhdGVfbG9nX2NvbnRleHQoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nLCBzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwKIAkJCSAgICAgIHVuc2lnbmVkIGludCBhcmdjLCBjaGFyICoqYXJndiwKIAkJCSAgICAgIHN0cnVjdCBkbV9kZXYgKmRldikKIHsKQEAgLTMxNSw3ICszODcsNyBAQAogCWludCByOwogCiAJaWYgKGFyZ2MgPCAxIHx8IGFyZ2MgPiAyKSB7Ci0JCURNV0FSTigid3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBtaXJyb3IgbG9nIik7CisJCURNV0FSTigid3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkaXJ0eSByZWdpb24gbG9nIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMzI1LDggKzM5Nyw4IEBACiAJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIm5vc3luYyIpKQogCQkJc3luYyA9IE5PU1lOQzsKIAkJZWxzZSB7Ci0JCQlETVdBUk4oInVucmVjb2duaXNlZCBzeW5jIGFyZ3VtZW50IHRvIG1pcnJvciBsb2c6ICVzIiwKLQkJCSAgICAgICBhcmd2WzFdKTsKKwkJCURNV0FSTigidW5yZWNvZ25pc2VkIHN5bmMgYXJndW1lbnQgdG8gIgorCQkJICAgICAgICJkaXJ0eSByZWdpb24gbG9nOiAlcyIsIGFyZ3ZbMV0pOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CkBAIC00MzQsNyArNTA2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjb3JlX2N0cihzdHJ1Y3QgZGlydHlfbG9nICpsb2csIHN0cnVjdCBkbV90YXJnZXQgKnRpLAorc3RhdGljIGludCBjb3JlX2N0cihzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2csIHN0cnVjdCBkbV90YXJnZXQgKnRpLAogCQkgICAgdW5zaWduZWQgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewogCXJldHVybiBjcmVhdGVfbG9nX2NvbnRleHQobG9nLCB0aSwgYXJnYywgYXJndiwgTlVMTCk7CkBAIC00NDcsNyArNTE5LDcgQEAKIAlrZnJlZShsYyk7CiB9CiAKLXN0YXRpYyB2b2lkIGNvcmVfZHRyKHN0cnVjdCBkaXJ0eV9sb2cgKmxvZykKK3N0YXRpYyB2b2lkIGNvcmVfZHRyKHN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZykKIHsKIAlzdHJ1Y3QgbG9nX2MgKmxjID0gKHN0cnVjdCBsb2dfYyAqKSBsb2ctPmNvbnRleHQ7CiAKQEAgLTQ2MCwxNCArNTMyLDE0IEBACiAgKgogICogYXJndiBjb250YWlucyBsb2dfZGV2aWNlIHJlZ2lvbl9zaXplIGZvbGxvd2VkIG9wdGlvbmFsbHkgYnkgW25vXXN5bmMKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCBkaXNrX2N0cihzdHJ1Y3QgZGlydHlfbG9nICpsb2csIHN0cnVjdCBkbV90YXJnZXQgKnRpLAorc3RhdGljIGludCBkaXNrX2N0cihzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2csIHN0cnVjdCBkbV90YXJnZXQgKnRpLAogCQkgICAgdW5zaWduZWQgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewogCWludCByOwogCXN0cnVjdCBkbV9kZXYgKmRldjsKIAogCWlmIChhcmdjIDwgMiB8fCBhcmdjID4gMykgewotCQlETVdBUk4oIndyb25nIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGlzayBtaXJyb3IgbG9nIik7CisJCURNV0FSTigid3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkaXNrIGRpcnR5IHJlZ2lvbiBsb2ciKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC00ODUsNyArNTU3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZGlza19kdHIoc3RydWN0IGRpcnR5X2xvZyAqbG9nKQorc3RhdGljIHZvaWQgZGlza19kdHIoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nKQogewogCXN0cnVjdCBsb2dfYyAqbGMgPSAoc3RydWN0IGxvZ19jICopIGxvZy0+Y29udGV4dDsKIApAQCAtNTE0LDcgKzU4Niw3IEBACiAJZG1fdGFibGVfZXZlbnQobGMtPnRpLT50YWJsZSk7CiB9CiAKLXN0YXRpYyBpbnQgZGlza19yZXN1bWUoc3RydWN0IGRpcnR5X2xvZyAqbG9nKQorc3RhdGljIGludCBkaXNrX3Jlc3VtZShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2cpCiB7CiAJaW50IHI7CiAJdW5zaWduZWQgaTsKQEAgLTUyNCw3ICs1OTYsNyBAQAogCS8qIHJlYWQgdGhlIGRpc2sgaGVhZGVyICovCiAJciA9IHJlYWRfaGVhZGVyKGxjKTsKIAlpZiAocikgewotCQlETVdBUk4oIiVzOiBGYWlsZWQgdG8gcmVhZCBoZWFkZXIgb24gbWlycm9yIGxvZyBkZXZpY2UiLAorCQlETVdBUk4oIiVzOiBGYWlsZWQgdG8gcmVhZCBoZWFkZXIgb24gZGlydHkgcmVnaW9uIGxvZyBkZXZpY2UiLAogCQkgICAgICAgbGMtPmxvZ19kZXYtPm5hbWUpOwogCQlmYWlsX2xvZ19kZXZpY2UobGMpOwogCQkvKgpAQCAtNTYyLDcgKzYzNCw3IEBACiAJLyogd3JpdGUgdGhlIG5ldyBoZWFkZXIgKi8KIAlyID0gd3JpdGVfaGVhZGVyKGxjKTsKIAlpZiAocikgewotCQlETVdBUk4oIiVzOiBGYWlsZWQgdG8gd3JpdGUgaGVhZGVyIG9uIG1pcnJvciBsb2cgZGV2aWNlIiwKKwkJRE1XQVJOKCIlczogRmFpbGVkIHRvIHdyaXRlIGhlYWRlciBvbiBkaXJ0eSByZWdpb24gbG9nIGRldmljZSIsCiAJCSAgICAgICBsYy0+bG9nX2Rldi0+bmFtZSk7CiAJCWZhaWxfbG9nX2RldmljZShsYyk7CiAJfQpAQCAtNTcwLDM4ICs2NDIsMzggQEAKIAlyZXR1cm4gcjsKIH0KIAotc3RhdGljIHVpbnQzMl90IGNvcmVfZ2V0X3JlZ2lvbl9zaXplKHN0cnVjdCBkaXJ0eV9sb2cgKmxvZykKK3N0YXRpYyB1aW50MzJfdCBjb3JlX2dldF9yZWdpb25fc2l6ZShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2cpCiB7CiAJc3RydWN0IGxvZ19jICpsYyA9IChzdHJ1Y3QgbG9nX2MgKikgbG9nLT5jb250ZXh0OwogCXJldHVybiBsYy0+cmVnaW9uX3NpemU7CiB9CiAKLXN0YXRpYyBpbnQgY29yZV9yZXN1bWUoc3RydWN0IGRpcnR5X2xvZyAqbG9nKQorc3RhdGljIGludCBjb3JlX3Jlc3VtZShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2cpCiB7CiAJc3RydWN0IGxvZ19jICpsYyA9IChzdHJ1Y3QgbG9nX2MgKikgbG9nLT5jb250ZXh0OwogCWxjLT5zeW5jX3NlYXJjaCA9IDA7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY29yZV9pc19jbGVhbihzdHJ1Y3QgZGlydHlfbG9nICpsb2csIHJlZ2lvbl90IHJlZ2lvbikKK3N0YXRpYyBpbnQgY29yZV9pc19jbGVhbihzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2csIHJlZ2lvbl90IHJlZ2lvbikKIHsKIAlzdHJ1Y3QgbG9nX2MgKmxjID0gKHN0cnVjdCBsb2dfYyAqKSBsb2ctPmNvbnRleHQ7CiAJcmV0dXJuIGxvZ190ZXN0X2JpdChsYy0+Y2xlYW5fYml0cywgcmVnaW9uKTsKIH0KIAotc3RhdGljIGludCBjb3JlX2luX3N5bmMoc3RydWN0IGRpcnR5X2xvZyAqbG9nLCByZWdpb25fdCByZWdpb24sIGludCBibG9jaykKK3N0YXRpYyBpbnQgY29yZV9pbl9zeW5jKHN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZywgcmVnaW9uX3QgcmVnaW9uLCBpbnQgYmxvY2spCiB7CiAJc3RydWN0IGxvZ19jICpsYyA9IChzdHJ1Y3QgbG9nX2MgKikgbG9nLT5jb250ZXh0OwogCXJldHVybiBsb2dfdGVzdF9iaXQobGMtPnN5bmNfYml0cywgcmVnaW9uKTsKIH0KIAotc3RhdGljIGludCBjb3JlX2ZsdXNoKHN0cnVjdCBkaXJ0eV9sb2cgKmxvZykKK3N0YXRpYyBpbnQgY29yZV9mbHVzaChzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2cpCiB7CiAJLyogbm8gb3AgKi8KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkaXNrX2ZsdXNoKHN0cnVjdCBkaXJ0eV9sb2cgKmxvZykKK3N0YXRpYyBpbnQgZGlza19mbHVzaChzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2cpCiB7CiAJaW50IHI7CiAJc3RydWN0IGxvZ19jICpsYyA9IChzdHJ1Y3QgbG9nX2MgKikgbG9nLT5jb250ZXh0OwpAQCAtNjE5LDE5ICs2OTEsMTkgQEAKIAlyZXR1cm4gcjsKIH0KIAotc3RhdGljIHZvaWQgY29yZV9tYXJrX3JlZ2lvbihzdHJ1Y3QgZGlydHlfbG9nICpsb2csIHJlZ2lvbl90IHJlZ2lvbikKK3N0YXRpYyB2b2lkIGNvcmVfbWFya19yZWdpb24oc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nLCByZWdpb25fdCByZWdpb24pCiB7CiAJc3RydWN0IGxvZ19jICpsYyA9IChzdHJ1Y3QgbG9nX2MgKikgbG9nLT5jb250ZXh0OwogCWxvZ19jbGVhcl9iaXQobGMsIGxjLT5jbGVhbl9iaXRzLCByZWdpb24pOwogfQogCi1zdGF0aWMgdm9pZCBjb3JlX2NsZWFyX3JlZ2lvbihzdHJ1Y3QgZGlydHlfbG9nICpsb2csIHJlZ2lvbl90IHJlZ2lvbikKK3N0YXRpYyB2b2lkIGNvcmVfY2xlYXJfcmVnaW9uKHN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZywgcmVnaW9uX3QgcmVnaW9uKQogewogCXN0cnVjdCBsb2dfYyAqbGMgPSAoc3RydWN0IGxvZ19jICopIGxvZy0+Y29udGV4dDsKIAlsb2dfc2V0X2JpdChsYywgbGMtPmNsZWFuX2JpdHMsIHJlZ2lvbik7CiB9CiAKLXN0YXRpYyBpbnQgY29yZV9nZXRfcmVzeW5jX3dvcmsoc3RydWN0IGRpcnR5X2xvZyAqbG9nLCByZWdpb25fdCAqcmVnaW9uKQorc3RhdGljIGludCBjb3JlX2dldF9yZXN5bmNfd29yayhzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2csIHJlZ2lvbl90ICpyZWdpb24pCiB7CiAJc3RydWN0IGxvZ19jICpsYyA9IChzdHJ1Y3QgbG9nX2MgKikgbG9nLT5jb250ZXh0OwogCkBAIC02NTQsNyArNzI2LDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHZvaWQgY29yZV9zZXRfcmVnaW9uX3N5bmMoc3RydWN0IGRpcnR5X2xvZyAqbG9nLCByZWdpb25fdCByZWdpb24sCitzdGF0aWMgdm9pZCBjb3JlX3NldF9yZWdpb25fc3luYyhzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2csIHJlZ2lvbl90IHJlZ2lvbiwKIAkJCQkgaW50IGluX3N5bmMpCiB7CiAJc3RydWN0IGxvZ19jICpsYyA9IChzdHJ1Y3QgbG9nX2MgKikgbG9nLT5jb250ZXh0OwpAQCAtNjY5LDcgKzc0MSw3IEBACiAJfQogfQogCi1zdGF0aWMgcmVnaW9uX3QgY29yZV9nZXRfc3luY19jb3VudChzdHJ1Y3QgZGlydHlfbG9nICpsb2cpCitzdGF0aWMgcmVnaW9uX3QgY29yZV9nZXRfc3luY19jb3VudChzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2cpCiB7CiAgICAgICAgIHN0cnVjdCBsb2dfYyAqbGMgPSAoc3RydWN0IGxvZ19jICopIGxvZy0+Y29udGV4dDsKIApAQCAtNjgwLDcgKzc1Miw3IEBACiAJaWYgKGxjLT5zeW5jICE9IERFRkFVTFRTWU5DKSBcCiAJCURNRU1JVCgiJXNzeW5jICIsIGxjLT5zeW5jID09IE5PU1lOQyA/ICJubyIgOiAiIikKIAotc3RhdGljIGludCBjb3JlX3N0YXR1cyhzdHJ1Y3QgZGlydHlfbG9nICpsb2csIHN0YXR1c190eXBlX3Qgc3RhdHVzLAorc3RhdGljIGludCBjb3JlX3N0YXR1cyhzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2csIHN0YXR1c190eXBlX3Qgc3RhdHVzLAogCQkgICAgICAgY2hhciAqcmVzdWx0LCB1bnNpZ25lZCBpbnQgbWF4bGVuKQogewogCWludCBzeiA9IDA7CkBAIC03MDAsNyArNzcyLDcgQEAKIAlyZXR1cm4gc3o7CiB9CiAKLXN0YXRpYyBpbnQgZGlza19zdGF0dXMoc3RydWN0IGRpcnR5X2xvZyAqbG9nLCBzdGF0dXNfdHlwZV90IHN0YXR1cywKK3N0YXRpYyBpbnQgZGlza19zdGF0dXMoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nLCBzdGF0dXNfdHlwZV90IHN0YXR1cywKIAkJICAgICAgIGNoYXIgKnJlc3VsdCwgdW5zaWduZWQgaW50IG1heGxlbikKIHsKIAlpbnQgc3ogPSAwOwpAQCAtNzIyLDcgKzc5NCw3IEBACiAJcmV0dXJuIHN6OwogfQogCi1zdGF0aWMgc3RydWN0IGRpcnR5X2xvZ190eXBlIF9jb3JlX3R5cGUgPSB7CitzdGF0aWMgc3RydWN0IGRtX2RpcnR5X2xvZ190eXBlIF9jb3JlX3R5cGUgPSB7CiAJLm5hbWUgPSAiY29yZSIsCiAJLm1vZHVsZSA9IFRISVNfTU9EVUxFLAogCS5jdHIgPSBjb3JlX2N0ciwKQEAgLTc0MCw3ICs4MTIsNyBAQAogCS5zdGF0dXMgPSBjb3JlX3N0YXR1cywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZGlydHlfbG9nX3R5cGUgX2Rpc2tfdHlwZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZG1fZGlydHlfbG9nX3R5cGUgX2Rpc2tfdHlwZSA9IHsKIAkubmFtZSA9ICJkaXNrIiwKIAkubW9kdWxlID0gVEhJU19NT0RVTEUsCiAJLmN0ciA9IGRpc2tfY3RyLApAQCAtNzYzLDI2ICs4MzUsMjggQEAKIHsKIAlpbnQgcjsKIAotCXIgPSBkbV9yZWdpc3Rlcl9kaXJ0eV9sb2dfdHlwZSgmX2NvcmVfdHlwZSk7CisJciA9IGRtX2RpcnR5X2xvZ190eXBlX3JlZ2lzdGVyKCZfY29yZV90eXBlKTsKIAlpZiAocikKIAkJRE1XQVJOKCJjb3VsZG4ndCByZWdpc3RlciBjb3JlIGxvZyIpOwogCi0JciA9IGRtX3JlZ2lzdGVyX2RpcnR5X2xvZ190eXBlKCZfZGlza190eXBlKTsKKwlyID0gZG1fZGlydHlfbG9nX3R5cGVfcmVnaXN0ZXIoJl9kaXNrX3R5cGUpOwogCWlmIChyKSB7CiAJCURNV0FSTigiY291bGRuJ3QgcmVnaXN0ZXIgZGlzayB0eXBlIik7Ci0JCWRtX3VucmVnaXN0ZXJfZGlydHlfbG9nX3R5cGUoJl9jb3JlX3R5cGUpOworCQlkbV9kaXJ0eV9sb2dfdHlwZV91bnJlZ2lzdGVyKCZfY29yZV90eXBlKTsKIAl9CiAKIAlyZXR1cm4gcjsKIH0KIAotdm9pZCBkbV9kaXJ0eV9sb2dfZXhpdCh2b2lkKQordm9pZCBfX2V4aXQgZG1fZGlydHlfbG9nX2V4aXQodm9pZCkKIHsKLQlkbV91bnJlZ2lzdGVyX2RpcnR5X2xvZ190eXBlKCZfZGlza190eXBlKTsKLQlkbV91bnJlZ2lzdGVyX2RpcnR5X2xvZ190eXBlKCZfY29yZV90eXBlKTsKKwlkbV9kaXJ0eV9sb2dfdHlwZV91bnJlZ2lzdGVyKCZfZGlza190eXBlKTsKKwlkbV9kaXJ0eV9sb2dfdHlwZV91bnJlZ2lzdGVyKCZfY29yZV90eXBlKTsKIH0KIAotRVhQT1JUX1NZTUJPTChkbV9yZWdpc3Rlcl9kaXJ0eV9sb2dfdHlwZSk7Ci1FWFBPUlRfU1lNQk9MKGRtX3VucmVnaXN0ZXJfZGlydHlfbG9nX3R5cGUpOwotRVhQT1JUX1NZTUJPTChkbV9jcmVhdGVfZGlydHlfbG9nKTsKLUVYUE9SVF9TWU1CT0woZG1fZGVzdHJveV9kaXJ0eV9sb2cpOworbW9kdWxlX2luaXQoZG1fZGlydHlfbG9nX2luaXQpOworbW9kdWxlX2V4aXQoZG1fZGlydHlfbG9nX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oRE1fTkFNRSAiIGRpcnR5IHJlZ2lvbiBsb2ciKTsKK01PRFVMRV9BVVRIT1IoIkpvZSBUaG9ybmJlciwgSGVpbnogTWF1ZWxzaGFnZW4gPGRtLWRldmVsQHJlZGhhdC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWxvZy5oIGIvZHJpdmVycy9tZC9kbS1sb2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZhZTg3ZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21kL2RtLWxvZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgU2lzdGluYSBTb2Z0d2FyZQotICoKLSAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgTEdQTC4KLSAqLwotCi0jaWZuZGVmIERNX0RJUlRZX0xPRwotI2RlZmluZSBETV9ESVJUWV9MT0cKLQotI2luY2x1ZGUgImRtLmgiCi0KLXR5cGVkZWYgc2VjdG9yX3QgcmVnaW9uX3Q7Ci0KLXN0cnVjdCBkaXJ0eV9sb2dfdHlwZTsKLQotc3RydWN0IGRpcnR5X2xvZyB7Ci0Jc3RydWN0IGRpcnR5X2xvZ190eXBlICp0eXBlOwotCXZvaWQgKmNvbnRleHQ7Ci19OwotCi1zdHJ1Y3QgZGlydHlfbG9nX3R5cGUgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQljb25zdCBjaGFyICpuYW1lOwotCXN0cnVjdCBtb2R1bGUgKm1vZHVsZTsKLQl1bnNpZ25lZCBpbnQgdXNlX2NvdW50OwotCi0JaW50ICgqY3RyKShzdHJ1Y3QgZGlydHlfbG9nICpsb2csIHN0cnVjdCBkbV90YXJnZXQgKnRpLAotCQkgICB1bnNpZ25lZCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpOwotCXZvaWQgKCpkdHIpKHN0cnVjdCBkaXJ0eV9sb2cgKmxvZyk7Ci0KLQkvKgotCSAqIFRoZXJlIGFyZSB0aW1lcyB3aGVuIHdlIGRvbid0IHdhbnQgdGhlIGxvZyB0byB0b3VjaAotCSAqIHRoZSBkaXNrLgotCSAqLwotCWludCAoKnByZXN1c3BlbmQpKHN0cnVjdCBkaXJ0eV9sb2cgKmxvZyk7Ci0JaW50ICgqcG9zdHN1c3BlbmQpKHN0cnVjdCBkaXJ0eV9sb2cgKmxvZyk7Ci0JaW50ICgqcmVzdW1lKShzdHJ1Y3QgZGlydHlfbG9nICpsb2cpOwotCi0JLyoKLQkgKiBSZXRyaWV2ZXMgdGhlIHNtYWxsZXN0IHNpemUgb2YgcmVnaW9uIHRoYXQgdGhlIGxvZyBjYW4KLQkgKiBkZWFsIHdpdGguCi0JICovCi0JdWludDMyX3QgKCpnZXRfcmVnaW9uX3NpemUpKHN0cnVjdCBkaXJ0eV9sb2cgKmxvZyk7Ci0KLSAgICAgICAgLyoKLQkgKiBBIHByZWRpY2F0ZSB0byBzYXkgd2hldGhlciBhIHJlZ2lvbiBpcyBjbGVhbiBvciBub3QuCi0JICogTWF5IGJsb2NrLgotCSAqLwotCWludCAoKmlzX2NsZWFuKShzdHJ1Y3QgZGlydHlfbG9nICpsb2csIHJlZ2lvbl90IHJlZ2lvbik7Ci0KLQkvKgotCSAqICBSZXR1cm5zOiAwLCAxLCAtRVdPVUxEQkxPQ0ssIDwgMAotCSAqCi0JICogQSBwcmVkaWNhdGUgZnVuY3Rpb24gdG8gY2hlY2sgdGhlIGFyZWEgZ2l2ZW4gYnkKLQkgKiBbc2VjdG9yLCBzZWN0b3IgKyBsZW4pIGlzIGluIHN5bmMuCi0JICoKLQkgKiBJZiAtRVdPVUxEQkxPQ0sgaXMgcmV0dXJuZWQgdGhlIHN0YXRlIG9mIHRoZSByZWdpb24gaXMKLQkgKiB1bmtub3duLCB0eXBpY2FsbHkgdGhpcyB3aWxsIHJlc3VsdCBpbiBhIHJlYWQgYmVpbmcKLQkgKiBwYXNzZWQgdG8gYSBkYWVtb24gdG8gZGVhbCB3aXRoLCBzaW5jZSBhIGRhZW1vbiBpcwotCSAqIGFsbG93ZWQgdG8gYmxvY2suCi0JICovCi0JaW50ICgqaW5fc3luYykoc3RydWN0IGRpcnR5X2xvZyAqbG9nLCByZWdpb25fdCByZWdpb24sIGludCBjYW5fYmxvY2spOwotCi0JLyoKLQkgKiBGbHVzaCB0aGUgY3VycmVudCBsb2cgc3RhdGUgKGVnLCB0byBkaXNrKS4gIFRoaXMKLQkgKiBmdW5jdGlvbiBtYXkgYmxvY2suCi0JICovCi0JaW50ICgqZmx1c2gpKHN0cnVjdCBkaXJ0eV9sb2cgKmxvZyk7Ci0KLQkvKgotCSAqIE1hcmsgYW4gYXJlYSBhcyBjbGVhbiBvciBkaXJ0eS4gIFRoZXNlIGZ1bmN0aW9ucyBtYXkKLQkgKiBibG9jaywgdGhvdWdoIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIGJsb2NraW5nIHNob3VsZAotCSAqIGJlIGV4dHJlbWVseSByYXJlIChlZywgYWxsb2NhdGluZyBhbm90aGVyIGNodW5rIG9mCi0JICogbWVtb3J5IGZvciBzb21lIHJlYXNvbikuCi0JICovCi0Jdm9pZCAoKm1hcmtfcmVnaW9uKShzdHJ1Y3QgZGlydHlfbG9nICpsb2csIHJlZ2lvbl90IHJlZ2lvbik7Ci0Jdm9pZCAoKmNsZWFyX3JlZ2lvbikoc3RydWN0IGRpcnR5X2xvZyAqbG9nLCByZWdpb25fdCByZWdpb24pOwotCi0JLyoKLQkgKiBSZXR1cm5zOiA8MCAoZXJyb3IpLCAwIChubyByZWdpb24pLCAxIChyZWdpb24pCi0JICoKLQkgKiBUaGUgbWlycm9yZCB3aWxsIG5lZWQgcGVyZm9ybSByZWNvdmVyeSBvbiByZWdpb25zIG9mCi0JICogdGhlIG1pcnJvciB0aGF0IGFyZSBpbiB0aGUgTk9TWU5DIHN0YXRlLiAgVGhpcwotCSAqIGZ1bmN0aW9uIGFza3MgdGhlIGxvZyB0byB0ZWxsIHRoZSBjYWxsZXIgYWJvdXQgdGhlCi0JICogbmV4dCByZWdpb24gdGhhdCB0aGlzIG1hY2hpbmUgc2hvdWxkIHJlY292ZXIuCi0JICoKLQkgKiBEbyBub3QgY29uZnVzZSB0aGlzIGZ1bmN0aW9uIHdpdGggJ2luX3N5bmMoKScsIG9uZQotCSAqIHRlbGxzIHlvdSBpZiBhbiBhcmVhIGlzIHN5bmNocm9uaXNlZCwgdGhlIG90aGVyCi0JICogYXNzaWducyByZWNvdmVyeSB3b3JrLgotCSovCi0JaW50ICgqZ2V0X3Jlc3luY193b3JrKShzdHJ1Y3QgZGlydHlfbG9nICpsb2csIHJlZ2lvbl90ICpyZWdpb24pOwotCi0JLyoKLQkgKiBUaGlzIG5vdGlmaWVzIHRoZSBsb2cgdGhhdCB0aGUgcmVzeW5jIHN0YXR1cyBvZiBhIHJlZ2lvbgotCSAqIGhhcyBjaGFuZ2VkLiAgSXQgYWxzbyBjbGVhcnMgdGhlIHJlZ2lvbiBmcm9tIHRoZSByZWNvdmVyaW5nCi0JICogbGlzdCAoaWYgcHJlc2VudCkuCi0JICovCi0Jdm9pZCAoKnNldF9yZWdpb25fc3luYykoc3RydWN0IGRpcnR5X2xvZyAqbG9nLAotCQkJCXJlZ2lvbl90IHJlZ2lvbiwgaW50IGluX3N5bmMpOwotCi0gICAgICAgIC8qCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlZ2lvbnMgdGhhdCBhcmUgaW4gc3luYy4KLSAgICAgICAgICovCi0gICAgICAgIHJlZ2lvbl90ICgqZ2V0X3N5bmNfY291bnQpKHN0cnVjdCBkaXJ0eV9sb2cgKmxvZyk7Ci0KLQkvKgotCSAqIFN1cHBvcnQgZnVuY3Rpb24gZm9yIG1pcnJvciBzdGF0dXMgcmVxdWVzdHMuCi0JICovCi0JaW50ICgqc3RhdHVzKShzdHJ1Y3QgZGlydHlfbG9nICpsb2csIHN0YXR1c190eXBlX3Qgc3RhdHVzX3R5cGUsCi0JCSAgICAgIGNoYXIgKnJlc3VsdCwgdW5zaWduZWQgaW50IG1heGxlbik7Ci19OwotCi1pbnQgZG1fcmVnaXN0ZXJfZGlydHlfbG9nX3R5cGUoc3RydWN0IGRpcnR5X2xvZ190eXBlICp0eXBlKTsKLWludCBkbV91bnJlZ2lzdGVyX2RpcnR5X2xvZ190eXBlKHN0cnVjdCBkaXJ0eV9sb2dfdHlwZSAqdHlwZSk7Ci0KLQotLyoKLSAqIE1ha2Ugc3VyZSB5b3UgdXNlIHRoZXNlIHR3byBmdW5jdGlvbnMsIHJhdGhlciB0aGFuIGNhbGxpbmcKLSAqIHR5cGUtPmNvbnN0cnVjdG9yL2Rlc3RydWN0b3IoKSBkaXJlY3RseS4KLSAqLwotc3RydWN0IGRpcnR5X2xvZyAqZG1fY3JlYXRlX2RpcnR5X2xvZyhjb25zdCBjaGFyICp0eXBlX25hbWUsIHN0cnVjdCBkbV90YXJnZXQgKnRpLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCBhcmdjLCBjaGFyICoqYXJndik7Ci12b2lkIGRtX2Rlc3Ryb3lfZGlydHlfbG9nKHN0cnVjdCBkaXJ0eV9sb2cgKmxvZyk7Ci0KLS8qCi0gKiBpbml0L2V4aXQgZnVuY3Rpb25zLgotICovCi1pbnQgZG1fZGlydHlfbG9nX2luaXQodm9pZCk7Ci12b2lkIGRtX2RpcnR5X2xvZ19leGl0KHZvaWQpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tcmFpZDEuYyBiL2RyaXZlcnMvbWQvZG0tcmFpZDEuYwppbmRleCA3NjJjYjA4Li5mZjA1ZmU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXJhaWQxLmMKKysrIGIvZHJpdmVycy9tZC9kbS1yYWlkMS5jCkBAIC03LDkgKzcsNiBAQAogI2luY2x1ZGUgImRtLmgiCiAjaW5jbHVkZSAiZG0tYmlvLWxpc3QuaCIKICNpbmNsdWRlICJkbS1iaW8tcmVjb3JkLmgiCi0jaW5jbHVkZSAiZG0taW8uaCIKLSNpbmNsdWRlICJkbS1sb2cuaCIKLSNpbmNsdWRlICJrY29weWQuaCIKIAogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMjIsNiArMTksOSBAQAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZG0taW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kbS1kaXJ0eS1sb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9kbS1rY29weWQuaD4KIAogI2RlZmluZSBETV9NU0dfUFJFRklYICJyYWlkMSIKICNkZWZpbmUgRE1fSU9fUEFHRVMgNjQKQEAgLTc0LDcgKzc0LDcgQEAKIAl1bnNpZ25lZCByZWdpb25fc2hpZnQ7CiAKIAkvKiBob2xkcyBwZXJzaXN0ZW50IHJlZ2lvbiBzdGF0ZSAqLwotCXN0cnVjdCBkaXJ0eV9sb2cgKmxvZzsKKwlzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2c7CiAKIAkvKiBoYXNoIHRhYmxlICovCiAJcndsb2NrX3QgaGFzaF9sb2NrOwpAQCAtMTMzLDcgKzEzMyw3IEBACiAJc3RydWN0IGRtX3RhcmdldCAqdGk7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCByZWdpb25faGFzaCByaDsKLQlzdHJ1Y3Qga2NvcHlkX2NsaWVudCAqa2NvcHlkX2NsaWVudDsKKwlzdHJ1Y3QgZG1fa2NvcHlkX2NsaWVudCAqa2NvcHlkX2NsaWVudDsKIAl1aW50NjRfdCBmZWF0dXJlczsKIAogCXNwaW5sb2NrX3QgbG9jazsJLyogcHJvdGVjdHMgdGhlIGxpc3RzICovCkBAIC0xNTQsNiArMTU0LDkgQEAKIAogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICprbWlycm9yZF93cTsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qga21pcnJvcmRfd29yazsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwl1bnNpZ25lZCBsb25nIHRpbWVyX3BlbmRpbmc7CisKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHJpZ2dlcl9ldmVudDsKIAogCXVuc2lnbmVkIGludCBucl9taXJyb3JzOwpAQCAtMTc4LDEzICsxODEsMzIgQEAKIAlxdWV1ZV93b3JrKG1zLT5rbWlycm9yZF93cSwgJm1zLT5rbWlycm9yZF93b3JrKTsKIH0KIAorc3RhdGljIHZvaWQgZGVsYXllZF93YWtlX2ZuKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbWlycm9yX3NldCAqbXMgPSAoc3RydWN0IG1pcnJvcl9zZXQgKikgZGF0YTsKKworCWNsZWFyX2JpdCgwLCAmbXMtPnRpbWVyX3BlbmRpbmcpOworCXdha2UobXMpOworfQorCitzdGF0aWMgdm9pZCBkZWxheWVkX3dha2Uoc3RydWN0IG1pcnJvcl9zZXQgKm1zKQoreworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZtcy0+dGltZXJfcGVuZGluZykpCisJCXJldHVybjsKKworCW1zLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaIC8gNTsKKwltcy0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtczsKKwltcy0+dGltZXIuZnVuY3Rpb24gPSBkZWxheWVkX3dha2VfZm47CisJYWRkX3RpbWVyKCZtcy0+dGltZXIpOworfQorCiAvKiBGSVhNRSBtb3ZlIHRoaXMgKi8KIHN0YXRpYyB2b2lkIHF1ZXVlX2JpbyhzdHJ1Y3QgbWlycm9yX3NldCAqbXMsIHN0cnVjdCBiaW8gKmJpbywgaW50IHJ3KTsKIAogI2RlZmluZSBNSU5fUkVHSU9OUyA2NAogI2RlZmluZSBNQVhfUkVDT1ZFUlkgMQogc3RhdGljIGludCByaF9pbml0KHN0cnVjdCByZWdpb25faGFzaCAqcmgsIHN0cnVjdCBtaXJyb3Jfc2V0ICptcywKLQkJICAgc3RydWN0IGRpcnR5X2xvZyAqbG9nLCB1aW50MzJfdCByZWdpb25fc2l6ZSwKKwkJICAgc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nLCB1aW50MzJfdCByZWdpb25fc2l6ZSwKIAkJICAgcmVnaW9uX3QgbnJfcmVnaW9ucykKIHsKIAl1bnNpZ25lZCBpbnQgbnJfYnVja2V0cywgbWF4X2J1Y2tldHM7CkBAIC0yNDksNyArMjcxLDcgQEAKIAl9CiAKIAlpZiAocmgtPmxvZykKLQkJZG1fZGVzdHJveV9kaXJ0eV9sb2cocmgtPmxvZyk7CisJCWRtX2RpcnR5X2xvZ19kZXN0cm95KHJoLT5sb2cpOwogCWlmIChyaC0+cmVnaW9uX3Bvb2wpCiAJCW1lbXBvb2xfZGVzdHJveShyaC0+cmVnaW9uX3Bvb2wpOwogCXZmcmVlKHJoLT5idWNrZXRzKTsKQEAgLTQwNSwyNCArNDI3LDIyIEBACiAJd3JpdGVfbG9ja19pcnEoJnJoLT5oYXNoX2xvY2spOwogCXNwaW5fbG9jaygmcmgtPnJlZ2lvbl9sb2NrKTsKIAlpZiAoIWxpc3RfZW1wdHkoJnJoLT5jbGVhbl9yZWdpb25zKSkgewotCQlsaXN0X3NwbGljZSgmcmgtPmNsZWFuX3JlZ2lvbnMsICZjbGVhbik7Ci0JCUlOSVRfTElTVF9IRUFEKCZyaC0+Y2xlYW5fcmVnaW9ucyk7CisJCWxpc3Rfc3BsaWNlX2luaXQoJnJoLT5jbGVhbl9yZWdpb25zLCAmY2xlYW4pOwogCiAJCWxpc3RfZm9yX2VhY2hfZW50cnkocmVnLCAmY2xlYW4sIGxpc3QpCiAJCQlsaXN0X2RlbCgmcmVnLT5oYXNoX2xpc3QpOwogCX0KIAogCWlmICghbGlzdF9lbXB0eSgmcmgtPnJlY292ZXJlZF9yZWdpb25zKSkgewotCQlsaXN0X3NwbGljZSgmcmgtPnJlY292ZXJlZF9yZWdpb25zLCAmcmVjb3ZlcmVkKTsKLQkJSU5JVF9MSVNUX0hFQUQoJnJoLT5yZWNvdmVyZWRfcmVnaW9ucyk7CisJCWxpc3Rfc3BsaWNlX2luaXQoJnJoLT5yZWNvdmVyZWRfcmVnaW9ucywgJnJlY292ZXJlZCk7CiAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeSAocmVnLCAmcmVjb3ZlcmVkLCBsaXN0KQogCQkJbGlzdF9kZWwoJnJlZy0+aGFzaF9saXN0KTsKIAl9CiAKIAlpZiAoIWxpc3RfZW1wdHkoJnJoLT5mYWlsZWRfcmVjb3ZlcmVkX3JlZ2lvbnMpKSB7Ci0JCWxpc3Rfc3BsaWNlKCZyaC0+ZmFpbGVkX3JlY292ZXJlZF9yZWdpb25zLCAmZmFpbGVkX3JlY292ZXJlZCk7Ci0JCUlOSVRfTElTVF9IRUFEKCZyaC0+ZmFpbGVkX3JlY292ZXJlZF9yZWdpb25zKTsKKwkJbGlzdF9zcGxpY2VfaW5pdCgmcmgtPmZhaWxlZF9yZWNvdmVyZWRfcmVnaW9ucywKKwkJCQkgJmZhaWxlZF9yZWNvdmVyZWQpOwogCiAJCWxpc3RfZm9yX2VhY2hfZW50cnkocmVnLCAmZmFpbGVkX3JlY292ZXJlZCwgbGlzdCkKIAkJCWxpc3RfZGVsKCZyZWctPmhhc2hfbGlzdCk7CkBAIC03OTAsNyArODEwLDcgQEAKIHsKIAlpbnQgcjsKIAl1bnNpZ25lZCBpbnQgaTsKLQlzdHJ1Y3QgaW9fcmVnaW9uIGZyb20sIHRvW0tDT1BZRF9NQVhfUkVHSU9OU10sICpkZXN0OworCXN0cnVjdCBkbV9pb19yZWdpb24gZnJvbSwgdG9bRE1fS0NPUFlEX01BWF9SRUdJT05TXSwgKmRlc3Q7CiAJc3RydWN0IG1pcnJvciAqbTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIApAQCAtODIyLDkgKzg0Miw5IEBACiAJfQogCiAJLyogaGFuZCB0byBrY29weWQgKi8KLQlzZXRfYml0KEtDT1BZRF9JR05PUkVfRVJST1IsICZmbGFncyk7Ci0JciA9IGtjb3B5ZF9jb3B5KG1zLT5rY29weWRfY2xpZW50LCAmZnJvbSwgbXMtPm5yX21pcnJvcnMgLSAxLCB0bywgZmxhZ3MsCi0JCQlyZWNvdmVyeV9jb21wbGV0ZSwgcmVnKTsKKwlzZXRfYml0KERNX0tDT1BZRF9JR05PUkVfRVJST1IsICZmbGFncyk7CisJciA9IGRtX2tjb3B5ZF9jb3B5KG1zLT5rY29weWRfY2xpZW50LCAmZnJvbSwgbXMtPm5yX21pcnJvcnMgLSAxLCB0bywKKwkJCSAgIGZsYWdzLCByZWNvdmVyeV9jb21wbGV0ZSwgcmVnKTsKIAogCXJldHVybiByOwogfQpAQCAtODMzLDcgKzg1Myw3IEBACiB7CiAJaW50IHI7CiAJc3RydWN0IHJlZ2lvbiAqcmVnOwotCXN0cnVjdCBkaXJ0eV9sb2cgKmxvZyA9IG1zLT5yaC5sb2c7CisJc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nID0gbXMtPnJoLmxvZzsKIAogCS8qCiAJICogU3RhcnQgcXVpZXNjaW5nIHNvbWUgcmVnaW9ucy4KQEAgLTkwOSw3ICs5MjksNyBAQAogCWJpby0+Ymlfc2VjdG9yID0gbWFwX3NlY3RvcihtLCBiaW8pOwogfQogCi1zdGF0aWMgdm9pZCBtYXBfcmVnaW9uKHN0cnVjdCBpb19yZWdpb24gKmlvLCBzdHJ1Y3QgbWlycm9yICptLAorc3RhdGljIHZvaWQgbWFwX3JlZ2lvbihzdHJ1Y3QgZG1faW9fcmVnaW9uICppbywgc3RydWN0IG1pcnJvciAqbSwKIAkJICAgICAgIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlpby0+YmRldiA9IG0tPmRldi0+YmRldjsKQEAgLTk1MSw3ICs5NzEsNyBAQAogLyogQXN5bmNocm9ub3VzIHJlYWQuICovCiBzdGF0aWMgdm9pZCByZWFkX2FzeW5jX2JpbyhzdHJ1Y3QgbWlycm9yICptLCBzdHJ1Y3QgYmlvICpiaW8pCiB7Ci0Jc3RydWN0IGlvX3JlZ2lvbiBpbzsKKwlzdHJ1Y3QgZG1faW9fcmVnaW9uIGlvOwogCXN0cnVjdCBkbV9pb19yZXF1ZXN0IGlvX3JlcSA9IHsKIAkJLmJpX3J3ID0gUkVBRCwKIAkJLm1lbS50eXBlID0gRE1fSU9fQlZFQywKQEAgLTEwMTksNyArMTAzOSw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgcmVnaW9uX2hhc2ggKnJoID0gJm1zLT5yaDsKLQlzdHJ1Y3QgZGlydHlfbG9nICpsb2cgPSBtcy0+cmgubG9nOworCXN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZyA9IG1zLT5yaC5sb2c7CiAJc3RydWN0IHJlZ2lvbiAqcmVnOwogCXJlZ2lvbl90IHJlZ2lvbiA9IGJpb190b19yZWdpb24ocmgsIGJpbyk7CiAJaW50IHJlY292ZXJpbmcgPSAwOwpAQCAtMTEwNyw3ICsxMTI3LDcgQEAKIHN0YXRpYyB2b2lkIGRvX3dyaXRlKHN0cnVjdCBtaXJyb3Jfc2V0ICptcywgc3RydWN0IGJpbyAqYmlvKQogewogCXVuc2lnbmVkIGludCBpOwotCXN0cnVjdCBpb19yZWdpb24gaW9bbXMtPm5yX21pcnJvcnNdLCAqZGVzdCA9IGlvOworCXN0cnVjdCBkbV9pb19yZWdpb24gaW9bbXMtPm5yX21pcnJvcnNdLCAqZGVzdCA9IGlvOwogCXN0cnVjdCBtaXJyb3IgKm07CiAJc3RydWN0IGRtX2lvX3JlcXVlc3QgaW9fcmVxID0gewogCQkuYmlfcncgPSBXUklURSwKQEAgLTExODIsNiArMTIwMiw3IEBACiAJCXNwaW5fbG9ja19pcnEoJm1zLT5sb2NrKTsKIAkJYmlvX2xpc3RfbWVyZ2UoJm1zLT5mYWlsdXJlcywgJnN5bmMpOwogCQlzcGluX3VubG9ja19pcnEoJm1zLT5sb2NrKTsKKwkJd2FrZShtcyk7CiAJfSBlbHNlCiAJCXdoaWxlICgoYmlvID0gYmlvX2xpc3RfcG9wKCZzeW5jKSkpCiAJCQlkb193cml0ZShtcywgYmlvKTsKQEAgLTEyNDEsNyArMTI2Miw3IEBACiAJYmlvX2xpc3RfbWVyZ2UoJm1zLT5mYWlsdXJlcywgZmFpbHVyZXMpOwogCXNwaW5fdW5sb2NrX2lycSgmbXMtPmxvY2spOwogCi0Jd2FrZShtcyk7CisJZGVsYXllZF93YWtlKG1zKTsKIH0KIAogc3RhdGljIHZvaWQgdHJpZ2dlcl9ldmVudChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC0xMjU1LDcgKzEyNzYsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICoga21pcnJvcmQKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgX2RvX21pcnJvcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCBkb19taXJyb3Ioc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBtaXJyb3Jfc2V0ICptcyA9Y29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBtaXJyb3Jfc2V0LAogCQkJCQkgICAga21pcnJvcmRfd29yayk7CkBAIC0xMjc3LDIzICsxMjk4LDcgQEAKIAlkb193cml0ZXMobXMsICZ3cml0ZXMpOwogCWRvX2ZhaWx1cmVzKG1zLCAmZmFpbHVyZXMpOwogCi0JcmV0dXJuIChtcy0+ZmFpbHVyZXMuaGVhZCkgPyAxIDogMDsKLX0KLQotc3RhdGljIHZvaWQgZG9fbWlycm9yKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQkvKgotCSAqIElmIF9kb19taXJyb3IgcmV0dXJucyAxLCB3ZSBnaXZlIGl0Ci0JICogYW5vdGhlciBzaG90LiAgVGhpcyBoZWxwcyBmb3IgY2FzZXMgbGlrZQotCSAqICdzdXNwZW5kJyB3aGVyZSB3ZSBjYWxsIGZsdXNoX3dvcmtxdWV1ZQotCSAqIGFuZCBleHBlY3QgYWxsIHdvcmsgdG8gYmUgZmluaXNoZWQuICBJZgotCSAqIGEgZmFpbHVyZSBoYXBwZW5zIGR1cmluZyBhIHN1c3BlbmQsIHdlCi0JICogY291bGRuJ3QgaXNzdWUgYSAnd2FrZScgYmVjYXVzZSBpdCB3b3VsZAotCSAqIG5vdCBiZSBob25vcmVkLiAgVGhlcmVmb3JlLCB3ZSByZXR1cm4gJzEnCi0JICogZnJvbSBfZG9fbWlycm9yLCBhbmQgcmV0cnkgaGVyZS4KLQkgKi8KLQl3aGlsZSAoX2RvX21pcnJvcih3b3JrKSkKLQkJc2NoZWR1bGUoKTsKKwlkbV90YWJsZV91bnBsdWdfYWxsKG1zLT50aS0+dGFibGUpOwogfQogCiAKQEAgLTEzMDMsNyArMTMwOCw3IEBACiBzdGF0aWMgc3RydWN0IG1pcnJvcl9zZXQgKmFsbG9jX2NvbnRleHQodW5zaWduZWQgaW50IG5yX21pcnJvcnMsCiAJCQkJCXVpbnQzMl90IHJlZ2lvbl9zaXplLAogCQkJCQlzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwKLQkJCQkJc3RydWN0IGRpcnR5X2xvZyAqZGwpCisJCQkJCXN0cnVjdCBkbV9kaXJ0eV9sb2cgKmRsKQogewogCXNpemVfdCBsZW47CiAJc3RydWN0IG1pcnJvcl9zZXQgKm1zID0gTlVMTDsKQEAgLTE0MDMsMTIgKzE0MDgsMTIgQEAKIC8qCiAgKiBDcmVhdGUgZGlydHkgbG9nOiBsb2dfdHlwZSAjbG9nX3BhcmFtcyA8bG9nX3BhcmFtcz4KICAqLwotc3RhdGljIHN0cnVjdCBkaXJ0eV9sb2cgKmNyZWF0ZV9kaXJ0eV9sb2coc3RydWN0IGRtX3RhcmdldCAqdGksCitzdGF0aWMgc3RydWN0IGRtX2RpcnR5X2xvZyAqY3JlYXRlX2RpcnR5X2xvZyhzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwKIAkJCQkJICB1bnNpZ25lZCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCiAJCQkJCSAgdW5zaWduZWQgaW50ICphcmdzX3VzZWQpCiB7CiAJdW5zaWduZWQgaW50IHBhcmFtX2NvdW50OwotCXN0cnVjdCBkaXJ0eV9sb2cgKmRsOworCXN0cnVjdCBkbV9kaXJ0eV9sb2cgKmRsOwogCiAJaWYgKGFyZ2MgPCAyKSB7CiAJCXRpLT5lcnJvciA9ICJJbnN1ZmZpY2llbnQgbWlycm9yIGxvZyBhcmd1bWVudHMiOwpAQCAtMTQyNyw3ICsxNDMyLDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JZGwgPSBkbV9jcmVhdGVfZGlydHlfbG9nKGFyZ3ZbMF0sIHRpLCBwYXJhbV9jb3VudCwgYXJndiArIDIpOworCWRsID0gZG1fZGlydHlfbG9nX2NyZWF0ZShhcmd2WzBdLCB0aSwgcGFyYW1fY291bnQsIGFyZ3YgKyAyKTsKIAlpZiAoIWRsKSB7CiAJCXRpLT5lcnJvciA9ICJFcnJvciBjcmVhdGluZyBtaXJyb3IgZGlydHkgbG9nIjsKIAkJcmV0dXJuIE5VTEw7CkBAIC0xNDM1LDcgKzE0NDAsNyBAQAogCiAJaWYgKCFfY2hlY2tfcmVnaW9uX3NpemUodGksIGRsLT50eXBlLT5nZXRfcmVnaW9uX3NpemUoZGwpKSkgewogCQl0aS0+ZXJyb3IgPSAiSW52YWxpZCByZWdpb24gc2l6ZSI7Ci0JCWRtX2Rlc3Ryb3lfZGlydHlfbG9nKGRsKTsKKwkJZG1fZGlydHlfbG9nX2Rlc3Ryb3koZGwpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTE0OTYsNyArMTUwMSw3IEBACiAJaW50IHI7CiAJdW5zaWduZWQgaW50IG5yX21pcnJvcnMsIG0sIGFyZ3NfdXNlZDsKIAlzdHJ1Y3QgbWlycm9yX3NldCAqbXM7Ci0Jc3RydWN0IGRpcnR5X2xvZyAqZGw7CisJc3RydWN0IGRtX2RpcnR5X2xvZyAqZGw7CiAKIAlkbCA9IGNyZWF0ZV9kaXJ0eV9sb2codGksIGFyZ2MsIGFyZ3YsICZhcmdzX3VzZWQpOwogCWlmICghZGwpCkBAIC0xNTA2LDkgKzE1MTEsOSBAQAogCWFyZ2MgLT0gYXJnc191c2VkOwogCiAJaWYgKCFhcmdjIHx8IHNzY2FuZihhcmd2WzBdLCAiJXUiLCAmbnJfbWlycm9ycykgIT0gMSB8fAotCSAgICBucl9taXJyb3JzIDwgMiB8fCBucl9taXJyb3JzID4gS0NPUFlEX01BWF9SRUdJT05TICsgMSkgeworCSAgICBucl9taXJyb3JzIDwgMiB8fCBucl9taXJyb3JzID4gRE1fS0NPUFlEX01BWF9SRUdJT05TICsgMSkgewogCQl0aS0+ZXJyb3IgPSAiSW52YWxpZCBudW1iZXIgb2YgbWlycm9ycyI7Ci0JCWRtX2Rlc3Ryb3lfZGlydHlfbG9nKGRsKTsKKwkJZG1fZGlydHlfbG9nX2Rlc3Ryb3koZGwpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE1MTYsMTMgKzE1MjEsMTMgQEAKIAogCWlmIChhcmdjIDwgbnJfbWlycm9ycyAqIDIpIHsKIAkJdGktPmVycm9yID0gIlRvbyBmZXcgbWlycm9yIGFyZ3VtZW50cyI7Ci0JCWRtX2Rlc3Ryb3lfZGlydHlfbG9nKGRsKTsKKwkJZG1fZGlydHlfbG9nX2Rlc3Ryb3koZGwpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAltcyA9IGFsbG9jX2NvbnRleHQobnJfbWlycm9ycywgZGwtPnR5cGUtPmdldF9yZWdpb25fc2l6ZShkbCksIHRpLCBkbCk7CiAJaWYgKCFtcykgewotCQlkbV9kZXN0cm95X2RpcnR5X2xvZyhkbCk7CisJCWRtX2RpcnR5X2xvZ19kZXN0cm95KGRsKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xNTQ3LDYgKzE1NTIsOCBAQAogCQlnb3RvIGVycl9mcmVlX2NvbnRleHQ7CiAJfQogCUlOSVRfV09SSygmbXMtPmttaXJyb3JkX3dvcmssIGRvX21pcnJvcik7CisJaW5pdF90aW1lcigmbXMtPnRpbWVyKTsKKwltcy0+dGltZXJfcGVuZGluZyA9IDA7CiAJSU5JVF9XT1JLKCZtcy0+dHJpZ2dlcl9ldmVudCwgdHJpZ2dlcl9ldmVudCk7CiAKIAlyID0gcGFyc2VfZmVhdHVyZXMobXMsIGFyZ2MsIGFyZ3YsICZhcmdzX3VzZWQpOwpAQCAtMTU3MSw3ICsxNTc4LDcgQEAKIAkJZ290byBlcnJfZGVzdHJveV93cTsKIAl9CiAKLQlyID0ga2NvcHlkX2NsaWVudF9jcmVhdGUoRE1fSU9fUEFHRVMsICZtcy0+a2NvcHlkX2NsaWVudCk7CisJciA9IGRtX2tjb3B5ZF9jbGllbnRfY3JlYXRlKERNX0lPX1BBR0VTLCAmbXMtPmtjb3B5ZF9jbGllbnQpOwogCWlmIChyKQogCQlnb3RvIGVycl9kZXN0cm95X3dxOwogCkBAIC0xNTg5LDggKzE1OTYsOSBAQAogewogCXN0cnVjdCBtaXJyb3Jfc2V0ICptcyA9IChzdHJ1Y3QgbWlycm9yX3NldCAqKSB0aS0+cHJpdmF0ZTsKIAorCWRlbF90aW1lcl9zeW5jKCZtcy0+dGltZXIpOwogCWZsdXNoX3dvcmtxdWV1ZShtcy0+a21pcnJvcmRfd3EpOwotCWtjb3B5ZF9jbGllbnRfZGVzdHJveShtcy0+a2NvcHlkX2NsaWVudCk7CisJZG1fa2NvcHlkX2NsaWVudF9kZXN0cm95KG1zLT5rY29weWRfY2xpZW50KTsKIAlkZXN0cm95X3dvcmtxdWV1ZShtcy0+a21pcnJvcmRfd3EpOwogCWZyZWVfY29udGV4dChtcywgdGksIG1zLT5ucl9taXJyb3JzKTsKIH0KQEAgLTE3MzQsNyArMTc0Miw3IEBACiBzdGF0aWMgdm9pZCBtaXJyb3JfcHJlc3VzcGVuZChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKIHsKIAlzdHJ1Y3QgbWlycm9yX3NldCAqbXMgPSAoc3RydWN0IG1pcnJvcl9zZXQgKikgdGktPnByaXZhdGU7Ci0Jc3RydWN0IGRpcnR5X2xvZyAqbG9nID0gbXMtPnJoLmxvZzsKKwlzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2cgPSBtcy0+cmgubG9nOwogCiAJYXRvbWljX3NldCgmbXMtPnN1c3BlbmQsIDEpOwogCkBAIC0xNzYzLDcgKzE3NzEsNyBAQAogc3RhdGljIHZvaWQgbWlycm9yX3Bvc3RzdXNwZW5kKHN0cnVjdCBkbV90YXJnZXQgKnRpKQogewogCXN0cnVjdCBtaXJyb3Jfc2V0ICptcyA9IHRpLT5wcml2YXRlOwotCXN0cnVjdCBkaXJ0eV9sb2cgKmxvZyA9IG1zLT5yaC5sb2c7CisJc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nID0gbXMtPnJoLmxvZzsKIAogCWlmIChsb2ctPnR5cGUtPnBvc3RzdXNwZW5kICYmIGxvZy0+dHlwZS0+cG9zdHN1c3BlbmQobG9nKSkKIAkJLyogRklYTUU6IG5lZWQgYmV0dGVyIGVycm9yIGhhbmRsaW5nICovCkBAIC0xNzczLDcgKzE3ODEsNyBAQAogc3RhdGljIHZvaWQgbWlycm9yX3Jlc3VtZShzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKIHsKIAlzdHJ1Y3QgbWlycm9yX3NldCAqbXMgPSB0aS0+cHJpdmF0ZTsKLQlzdHJ1Y3QgZGlydHlfbG9nICpsb2cgPSBtcy0+cmgubG9nOworCXN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZyA9IG1zLT5yaC5sb2c7CiAKIAlhdG9taWNfc2V0KCZtcy0+c3VzcGVuZCwgMCk7CiAJaWYgKGxvZy0+dHlwZS0+cmVzdW1lICYmIGxvZy0+dHlwZS0+cmVzdW1lKGxvZykpCkBAIC0xODExLDcgKzE4MTksNyBAQAogewogCXVuc2lnbmVkIGludCBtLCBzeiA9IDA7CiAJc3RydWN0IG1pcnJvcl9zZXQgKm1zID0gKHN0cnVjdCBtaXJyb3Jfc2V0ICopIHRpLT5wcml2YXRlOwotCXN0cnVjdCBkaXJ0eV9sb2cgKmxvZyA9IG1zLT5yaC5sb2c7CisJc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nID0gbXMtPnJoLmxvZzsKIAljaGFyIGJ1ZmZlclttcy0+bnJfbWlycm9ycyArIDFdOwogCiAJc3dpdGNoICh0eXBlKSB7CkBAIC0xODY0LDE1ICsxODcyLDkgQEAKIHsKIAlpbnQgcjsKIAotCXIgPSBkbV9kaXJ0eV9sb2dfaW5pdCgpOwotCWlmIChyKQotCQlyZXR1cm4gcjsKLQogCXIgPSBkbV9yZWdpc3Rlcl90YXJnZXQoJm1pcnJvcl90YXJnZXQpOwotCWlmIChyIDwgMCkgeworCWlmIChyIDwgMCkKIAkJRE1FUlIoIkZhaWxlZCB0byByZWdpc3RlciBtaXJyb3IgdGFyZ2V0Iik7Ci0JCWRtX2RpcnR5X2xvZ19leGl0KCk7Ci0JfQogCiAJcmV0dXJuIHI7CiB9CkBAIC0xODg0LDggKzE4ODYsNiBAQAogCXIgPSBkbV91bnJlZ2lzdGVyX3RhcmdldCgmbWlycm9yX3RhcmdldCk7CiAJaWYgKHIgPCAwKQogCQlETUVSUigidW5yZWdpc3RlciBmYWlsZWQgJWQiLCByKTsKLQotCWRtX2RpcnR5X2xvZ19leGl0KCk7CiB9CiAKIC8qIE1vZHVsZSBob29rcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1zbmFwLmMgYi9kcml2ZXJzL21kL2RtLXNuYXAuYwppbmRleCA0ZGM4YTQzLi4xYmE4YTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXNuYXAuYworKysgYi9kcml2ZXJzL21kL2RtLXNuYXAuYwpAQCAtMTgsMTAgKzE4LDEwIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisjaW5jbHVkZSA8bGludXgvZG0ta2NvcHlkLmg+CiAKICNpbmNsdWRlICJkbS1zbmFwLmgiCiAjaW5jbHVkZSAiZG0tYmlvLWxpc3QuaCIKLSNpbmNsdWRlICJrY29weWQuaCIKIAogI2RlZmluZSBETV9NU0dfUFJFRklYICJzbmFwc2hvdHMiCiAKQEAgLTM2LDkgKzM2LDkgQEAKICNkZWZpbmUgU05BUFNIT1RfQ09QWV9QUklPUklUWSAyCiAKIC8qCi0gKiBFYWNoIHNuYXBzaG90IHJlc2VydmVzIHRoaXMgbWFueSBwYWdlcyBmb3IgaW8KKyAqIFJlc2VydmUgMU1CIGZvciBlYWNoIHNuYXBzaG90IGluaXRpYWxseSAod2l0aCBtaW5pbXVtIG9mIDEgcGFnZSkuCiAgKi8KLSNkZWZpbmUgU05BUFNIT1RfUEFHRVMgMjU2CisjZGVmaW5lIFNOQVBTSE9UX1BBR0VTICgoKDFVTCA8PCAyMCkgPj4gUEFHRV9TSElGVCkgPyA6IDEpCiAKIHN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqa3NuYXBkOwogc3RhdGljIHZvaWQgZmx1c2hfcXVldWVkX2Jpb3Moc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKQEAgLTUzNiw3ICs1MzYsNyBAQAogCXMtPmxhc3RfcGVyY2VudCA9IDA7CiAJaW5pdF9yd3NlbSgmcy0+bG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnMtPnBlX2xvY2spOwotCXMtPnRhYmxlID0gdGktPnRhYmxlOworCXMtPnRpID0gdGk7CiAKIAkvKiBBbGxvY2F0ZSBoYXNoIHRhYmxlIGZvciBDT1cgZGF0YSAqLwogCWlmIChpbml0X2hhc2hfdGFibGVzKHMpKSB7CkBAIC01NTgsNyArNTU4LDcgQEAKIAkJZ290byBiYWQ0OwogCX0KIAotCXIgPSBrY29weWRfY2xpZW50X2NyZWF0ZShTTkFQU0hPVF9QQUdFUywgJnMtPmtjb3B5ZF9jbGllbnQpOworCXIgPSBkbV9rY29weWRfY2xpZW50X2NyZWF0ZShTTkFQU0hPVF9QQUdFUywgJnMtPmtjb3B5ZF9jbGllbnQpOwogCWlmIChyKSB7CiAJCXRpLT5lcnJvciA9ICJDb3VsZCBub3QgY3JlYXRlIGtjb3B5ZCBjbGllbnQiOwogCQlnb3RvIGJhZDU7CkBAIC01OTEsNyArNTkxLDcgQEAKIAlyZXR1cm4gMDsKIAogIGJhZDY6Ci0Ja2NvcHlkX2NsaWVudF9kZXN0cm95KHMtPmtjb3B5ZF9jbGllbnQpOworCWRtX2tjb3B5ZF9jbGllbnRfZGVzdHJveShzLT5rY29weWRfY2xpZW50KTsKIAogIGJhZDU6CiAJcy0+c3RvcmUuZGVzdHJveSgmcy0+c3RvcmUpOwpAQCAtNjEzLDcgKzYxMyw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZnJlZV9leGNlcHRpb25zKHN0cnVjdCBkbV9zbmFwc2hvdCAqcykKIHsKLQlrY29weWRfY2xpZW50X2Rlc3Ryb3kocy0+a2NvcHlkX2NsaWVudCk7CisJZG1fa2NvcHlkX2NsaWVudF9kZXN0cm95KHMtPmtjb3B5ZF9jbGllbnQpOwogCXMtPmtjb3B5ZF9jbGllbnQgPSBOVUxMOwogCiAJZXhpdF9leGNlcHRpb25fdGFibGUoJnMtPnBlbmRpbmcsIHBlbmRpbmdfY2FjaGUpOwpAQCAtNjk5LDcgKzY5OSw3IEBACiAKIAlzLT52YWxpZCA9IDA7CiAKLQlkbV90YWJsZV9ldmVudChzLT50YWJsZSk7CisJZG1fdGFibGVfZXZlbnQocy0+dGktPnRhYmxlKTsKIH0KIAogc3RhdGljIHZvaWQgZ2V0X3BlbmRpbmdfZXhjZXB0aW9uKHN0cnVjdCBkbV9zbmFwX3BlbmRpbmdfZXhjZXB0aW9uICpwZSkKQEAgLTgyNCw3ICs4MjQsNyBAQAogc3RhdGljIHZvaWQgc3RhcnRfY29weShzdHJ1Y3QgZG1fc25hcF9wZW5kaW5nX2V4Y2VwdGlvbiAqcGUpCiB7CiAJc3RydWN0IGRtX3NuYXBzaG90ICpzID0gcGUtPnNuYXA7Ci0Jc3RydWN0IGlvX3JlZ2lvbiBzcmMsIGRlc3Q7CisJc3RydWN0IGRtX2lvX3JlZ2lvbiBzcmMsIGRlc3Q7CiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IHMtPm9yaWdpbi0+YmRldjsKIAlzZWN0b3JfdCBkZXZfc2l6ZTsKIApAQCAtODM5LDcgKzgzOSw3IEBACiAJZGVzdC5jb3VudCA9IHNyYy5jb3VudDsKIAogCS8qIEhhbmQgb3ZlciB0byBrY29weWQgKi8KLQlrY29weWRfY29weShzLT5rY29weWRfY2xpZW50LAorCWRtX2tjb3B5ZF9jb3B5KHMtPmtjb3B5ZF9jbGllbnQsCiAJCSAgICAmc3JjLCAxLCAmZGVzdCwgMCwgY29weV9jYWxsYmFjaywgcGUpOwogfQogCkBAIC0xMDYwLDcgKzEwNjAsNyBAQAogCQkJZ290byBuZXh0X3NuYXBzaG90OwogCiAJCS8qIE5vdGhpbmcgdG8gZG8gaWYgd3JpdGluZyBiZXlvbmQgZW5kIG9mIHNuYXBzaG90ICovCi0JCWlmIChiaW8tPmJpX3NlY3RvciA+PSBkbV90YWJsZV9nZXRfc2l6ZShzbmFwLT50YWJsZSkpCisJCWlmIChiaW8tPmJpX3NlY3RvciA+PSBkbV90YWJsZV9nZXRfc2l6ZShzbmFwLT50aS0+dGFibGUpKQogCQkJZ290byBuZXh0X3NuYXBzaG90OwogCiAJCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXNuYXAuaCBiL2RyaXZlcnMvbWQvZG0tc25hcC5oCmluZGV4IDkzYmNlNWQuLjI0ZjlmYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tc25hcC5oCisrKyBiL2RyaXZlcnMvbWQvZG0tc25hcC5oCkBAIC0xMzIsNyArMTMyLDcgQEAKIAogc3RydWN0IGRtX3NuYXBzaG90IHsKIAlzdHJ1Y3Qgcndfc2VtYXBob3JlIGxvY2s7Ci0Jc3RydWN0IGRtX3RhYmxlICp0YWJsZTsKKwlzdHJ1Y3QgZG1fdGFyZ2V0ICp0aTsKIAogCXN0cnVjdCBkbV9kZXYgKm9yaWdpbjsKIAlzdHJ1Y3QgZG1fZGV2ICpjb3c7CkBAIC0xNjksNyArMTY5LDcgQEAKIAkvKiBUaGUgb24gZGlzayBtZXRhZGF0YSBoYW5kbGVyICovCiAJc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSBzdG9yZTsKIAotCXN0cnVjdCBrY29weWRfY2xpZW50ICprY29weWRfY2xpZW50OworCXN0cnVjdCBkbV9rY29weWRfY2xpZW50ICprY29weWRfY2xpZW50OwogCiAJLyogUXVldWUgb2Ygc25hcHNob3Qgd3JpdGVzIGZvciBrc25hcGQgdG8gZmx1c2ggKi8KIAlzdHJ1Y3QgYmlvX2xpc3QgcXVldWVkX2Jpb3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXRhYmxlLmMgYi9kcml2ZXJzL21kL2RtLXRhYmxlLmMKaW5kZXggZTc1YjE0My4uNTFiZTUzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS10YWJsZS5jCisrKyBiL2RyaXZlcnMvbWQvZG0tdGFibGUuYwpAQCAtMjQ1LDQ0ICsyNDUsNiBAQAogCXJldHVybiAwOwogfQogCi1pbnQgZG1fY3JlYXRlX2Vycm9yX3RhYmxlKHN0cnVjdCBkbV90YWJsZSAqKnJlc3VsdCwgc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKQotewotCXN0cnVjdCBkbV90YWJsZSAqdDsKLQlzZWN0b3JfdCBkZXZfc2l6ZSA9IDE7Ci0JaW50IHI7Ci0KLQkvKgotCSAqIEZpbmQgY3VycmVudCBzaXplIG9mIGRldmljZS4KLQkgKiBEZWZhdWx0IHRvIDEgc2VjdG9yIGlmIGluYWN0aXZlLgotCSAqLwotCXQgPSBkbV9nZXRfdGFibGUobWQpOwotCWlmICh0KSB7Ci0JCWRldl9zaXplID0gZG1fdGFibGVfZ2V0X3NpemUodCk7Ci0JCWRtX3RhYmxlX3B1dCh0KTsKLQl9Ci0KLQlyID0gZG1fdGFibGVfY3JlYXRlKCZ0LCBGTU9ERV9SRUFELCAxLCBtZCk7Ci0JaWYgKHIpCi0JCXJldHVybiByOwotCi0JciA9IGRtX3RhYmxlX2FkZF90YXJnZXQodCwgImVycm9yIiwgMCwgZGV2X3NpemUsIE5VTEwpOwotCWlmIChyKQotCQlnb3RvIG91dDsKLQotCXIgPSBkbV90YWJsZV9jb21wbGV0ZSh0KTsKLQlpZiAocikKLQkJZ290byBvdXQ7Ci0KLQkqcmVzdWx0ID0gdDsKLQotb3V0OgotCWlmIChyKQotCQlkbV90YWJsZV9wdXQodCk7Ci0KLQlyZXR1cm4gcjsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGRtX2NyZWF0ZV9lcnJvcl90YWJsZSk7Ci0KIHN0YXRpYyB2b2lkIGZyZWVfZGV2aWNlcyhzdHJ1Y3QgbGlzdF9oZWFkICpkZXZpY2VzKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCwgKm5leHQ7CkBAIC05NTQsNyArOTE2LDcgQEAKIAlpZiAoIXQpCiAJCXJldHVybjsKIAotCXJldHVybiBzdXNwZW5kX3RhcmdldHModCwgMCk7CisJc3VzcGVuZF90YXJnZXRzKHQsIDApOwogfQogCiB2b2lkIGRtX3RhYmxlX3Bvc3RzdXNwZW5kX3RhcmdldHMoc3RydWN0IGRtX3RhYmxlICp0KQpAQCAtOTYyLDcgKzkyNCw3IEBACiAJaWYgKCF0KQogCQlyZXR1cm47CiAKLQlyZXR1cm4gc3VzcGVuZF90YXJnZXRzKHQsIDEpOworCXN1c3BlbmRfdGFyZ2V0cyh0LCAxKTsKIH0KIAogaW50IGRtX3RhYmxlX3Jlc3VtZV90YXJnZXRzKHN0cnVjdCBkbV90YWJsZSAqdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0uYyBiL2RyaXZlcnMvbWQvZG0uYwppbmRleCA2NjE3Y2U0Li4zNzIzNjliIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLmMKKysrIGIvZHJpdmVycy9tZC9kbS5jCkBAIC0yMDQsNiArMjA0LDcgQEAKIAlkbV90YXJnZXRfaW5pdCwKIAlkbV9saW5lYXJfaW5pdCwKIAlkbV9zdHJpcGVfaW5pdCwKKwlkbV9rY29weWRfaW5pdCwKIAlkbV9pbnRlcmZhY2VfaW5pdCwKIH07CiAKQEAgLTIxMiw2ICsyMTMsNyBAQAogCWRtX3RhcmdldF9leGl0LAogCWRtX2xpbmVhcl9leGl0LAogCWRtX3N0cmlwZV9leGl0LAorCWRtX2tjb3B5ZF9leGl0LAogCWRtX2ludGVyZmFjZV9leGl0LAogfTsKIApAQCAtOTIyLDcgKzkyNCw3IEBACiAvKgogICogU2VlIGlmIHRoZSBkZXZpY2Ugd2l0aCBhIHNwZWNpZmljIG1pbm9yICMgaXMgZnJlZS4KICAqLwotc3RhdGljIGludCBzcGVjaWZpY19taW5vcihzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQsIGludCBtaW5vcikKK3N0YXRpYyBpbnQgc3BlY2lmaWNfbWlub3IoaW50IG1pbm9yKQogewogCWludCByLCBtOwogCkBAIC05NTUsNyArOTU3LDcgQEAKIAlyZXR1cm4gcjsKIH0KIAotc3RhdGljIGludCBuZXh0X2ZyZWVfbWlub3Ioc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kLCBpbnQgKm1pbm9yKQorc3RhdGljIGludCBuZXh0X2ZyZWVfbWlub3IoaW50ICptaW5vcikKIHsKIAlpbnQgciwgbTsKIApAQCAtOTY2LDkgKzk2OCw4IEBACiAJc3Bpbl9sb2NrKCZfbWlub3JfbG9jayk7CiAKIAlyID0gaWRyX2dldF9uZXcoJl9taW5vcl9pZHIsIE1JTk9SX0FMTE9DRUQsICZtKTsKLQlpZiAocikgeworCWlmIChyKQogCQlnb3RvIG91dDsKLQl9CiAKIAlpZiAobSA+PSAoMSA8PCBNSU5PUkJJVFMpKSB7CiAJCWlkcl9yZW1vdmUoJl9taW5vcl9pZHIsIG0pOwpAQCAtOTkxLDcgKzk5Miw3IEBACiBzdGF0aWMgc3RydWN0IG1hcHBlZF9kZXZpY2UgKmFsbG9jX2RldihpbnQgbWlub3IpCiB7CiAJaW50IHI7Ci0Jc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kID0ga21hbGxvYyhzaXplb2YoKm1kKSwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kID0ga3phbGxvYyhzaXplb2YoKm1kKSwgR0ZQX0tFUk5FTCk7CiAJdm9pZCAqb2xkX21kOwogCiAJaWYgKCFtZCkgewpAQCAtMTAwNCwxMyArMTAwNSwxMiBAQAogCiAJLyogZ2V0IGEgbWlub3IgbnVtYmVyIGZvciB0aGUgZGV2ICovCiAJaWYgKG1pbm9yID09IERNX0FOWV9NSU5PUikKLQkJciA9IG5leHRfZnJlZV9taW5vcihtZCwgJm1pbm9yKTsKKwkJciA9IG5leHRfZnJlZV9taW5vcigmbWlub3IpOwogCWVsc2UKLQkJciA9IHNwZWNpZmljX21pbm9yKG1kLCBtaW5vcik7CisJCXIgPSBzcGVjaWZpY19taW5vcihtaW5vcik7CiAJaWYgKHIgPCAwKQogCQlnb3RvIGJhZF9taW5vcjsKIAotCW1lbXNldChtZCwgMCwgc2l6ZW9mKCptZCkpOwogCWluaXRfcndzZW0oJm1kLT5pb19sb2NrKTsKIAltdXRleF9pbml0KCZtZC0+c3VzcGVuZF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmbWQtPnB1c2hiYWNrX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS5oIGIvZHJpdmVycy9tZC9kbS5oCmluZGV4IGI0NTg0YTMuLjhjMDNiNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0uaAorKysgYi9kcml2ZXJzL21kL2RtLmgKQEAgLTE2LDY3ICsxNiw2IEBACiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KIAotI2RlZmluZSBETV9OQU1FICJkZXZpY2UtbWFwcGVyIgotCi0jZGVmaW5lIERNRVJSKGYsIGFyZy4uLikgXAotCXByaW50ayhLRVJOX0VSUiBETV9OQU1FICI6ICIgRE1fTVNHX1BSRUZJWCAiOiAiIGYgIlxuIiwgIyMgYXJnKQotI2RlZmluZSBETUVSUl9MSU1JVChmLCBhcmcuLi4pIFwKLQlkbyB7IFwKLQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkJXAotCQkJcHJpbnRrKEtFUk5fRVJSIERNX05BTUUgIjogIiBETV9NU0dfUFJFRklYICI6ICIgXAotCQkJICAgICAgIGYgIlxuIiwgIyMgYXJnKTsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgRE1XQVJOKGYsIGFyZy4uLikgXAotCXByaW50ayhLRVJOX1dBUk5JTkcgRE1fTkFNRSAiOiAiIERNX01TR19QUkVGSVggIjogIiBmICJcbiIsICMjIGFyZykKLSNkZWZpbmUgRE1XQVJOX0xJTUlUKGYsIGFyZy4uLikgXAotCWRvIHsgXAotCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQlcCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HIERNX05BTUUgIjogIiBETV9NU0dfUFJFRklYICI6ICIgXAotCQkJICAgICAgIGYgIlxuIiwgIyMgYXJnKTsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgRE1JTkZPKGYsIGFyZy4uLikgXAotCXByaW50ayhLRVJOX0lORk8gRE1fTkFNRSAiOiAiIERNX01TR19QUkVGSVggIjogIiBmICJcbiIsICMjIGFyZykKLSNkZWZpbmUgRE1JTkZPX0xJTUlUKGYsIGFyZy4uLikgXAotCWRvIHsgXAotCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQlcCi0JCQlwcmludGsoS0VSTl9JTkZPIERNX05BTUUgIjogIiBETV9NU0dfUFJFRklYICI6ICIgZiBcCi0JCQkgICAgICAgIlxuIiwgIyMgYXJnKTsgXAotCX0gd2hpbGUgKDApCi0KLSNpZmRlZiBDT05GSUdfRE1fREVCVUcKLSMgIGRlZmluZSBETURFQlVHKGYsIGFyZy4uLikgXAotCXByaW50ayhLRVJOX0RFQlVHIERNX05BTUUgIjogIiBETV9NU0dfUFJFRklYICIgREVCVUc6ICIgZiAiXG4iLCAjIyBhcmcpCi0jICBkZWZpbmUgRE1ERUJVR19MSU1JVChmLCBhcmcuLi4pIFwKLQlkbyB7IFwKLQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkJXAotCQkJcHJpbnRrKEtFUk5fREVCVUcgRE1fTkFNRSAiOiAiIERNX01TR19QUkVGSVggIjogIiBmIFwKLQkJCSAgICAgICAiXG4iLCAjIyBhcmcpOyBcCi0JfSB3aGlsZSAoMCkKLSNlbHNlCi0jICBkZWZpbmUgRE1ERUJVRyhmLCBhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQotIyAgZGVmaW5lIERNREVCVUdfTElNSVQoZiwgYXJnLi4uKSBkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jZGVmaW5lIERNRU1JVCh4Li4uKSBzeiArPSAoKHN6ID49IG1heGxlbikgPyBcCi0JCQkgIDAgOiBzY25wcmludGYocmVzdWx0ICsgc3osIG1heGxlbiAtIHN6LCB4KSkKLQotI2RlZmluZSBTRUNUT1JfU0hJRlQgOQotCi0vKgotICogRGVmaW5pdGlvbnMgb2YgcmV0dXJuIHZhbHVlcyBmcm9tIHRhcmdldCBlbmRfaW8gZnVuY3Rpb24uCi0gKi8KLSNkZWZpbmUgRE1fRU5ESU9fSU5DT01QTEVURQkxCi0jZGVmaW5lIERNX0VORElPX1JFUVVFVUUJMgotCi0vKgotICogRGVmaW5pdGlvbnMgb2YgcmV0dXJuIHZhbHVlcyBmcm9tIHRhcmdldCBtYXAgZnVuY3Rpb24uCi0gKi8KLSNkZWZpbmUgRE1fTUFQSU9fU1VCTUlUVEVECTAKLSNkZWZpbmUgRE1fTUFQSU9fUkVNQVBQRUQJMQotI2RlZmluZSBETV9NQVBJT19SRVFVRVVFCURNX0VORElPX1JFUVVFVUUKLQogLyoKICAqIFN1c3BlbmQgZmVhdHVyZSBmbGFncwogICovCkBAIC0xMzYsMzQgKzc1LDYgQEAKIAlyZXR1cm4gKG51bSA+IChVTE9OR19NQVggLSBmaXhlZCkgLyBvYmopOwogfQogCi0vKgotICogQ2VpbGluZyhuIC8gc3opCi0gKi8KLSNkZWZpbmUgZG1fZGl2X3VwKG4sIHN6KSAoKChuKSArIChzeikgLSAxKSAvIChzeikpCi0KLSNkZWZpbmUgZG1fc2VjdG9yX2Rpdl91cChuLCBzeikgKCBcCi17IFwKLQlzZWN0b3JfdCBfciA9ICgobikgKyAoc3opIC0gMSk7IFwKLQlzZWN0b3JfZGl2KF9yLCAoc3opKTsgXAotCV9yOyBcCi19IFwKLSkKLQotLyoKLSAqIGNlaWxpbmcobiAvIHNpemUpICogc2l6ZQotICovCi0jZGVmaW5lIGRtX3JvdW5kX3VwKG4sIHN6KSAoZG1fZGl2X3VwKChuKSwgKHN6KSkgKiAoc3opKQotCi1zdGF0aWMgaW5saW5lIHNlY3Rvcl90IHRvX3NlY3Rvcih1bnNpZ25lZCBsb25nIG4pCi17Ci0JcmV0dXJuIChuID4+IDkpOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdG9fYnl0ZXMoc2VjdG9yX3QgbikKLXsKLQlyZXR1cm4gKG4gPDwgOSk7Ci19Ci0KIGludCBkbV9zcGxpdF9hcmdzKGludCAqYXJnYywgY2hhciAqKiphcmd2cCwgY2hhciAqaW5wdXQpOwogCiAvKgpAQCAtMTg5LDQgKzEwMCwxMyBAQAogCiB2b2lkIGRtX2tvYmplY3RfdWV2ZW50KHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCk7CiAKKy8qCisgKiBEaXJ0eSBsb2cKKyAqLworaW50IGRtX2RpcnR5X2xvZ19pbml0KHZvaWQpOwordm9pZCBkbV9kaXJ0eV9sb2dfZXhpdCh2b2lkKTsKKworaW50IGRtX2tjb3B5ZF9pbml0KHZvaWQpOwordm9pZCBkbV9rY29weWRfZXhpdCh2b2lkKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2tjb3B5ZC5oIGIvZHJpdmVycy9tZC9rY29weWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0NWYyYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21kL2tjb3B5ZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMSBTaXN0aW5hIFNvZnR3YXJlCi0gKgotICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCi0gKgotICogS2NvcHlkIHByb3ZpZGVzIGEgc2ltcGxlIGludGVyZmFjZSBmb3IgY29weWluZyBhbiBhcmVhIG9mIG9uZQotICogYmxvY2stZGV2aWNlIHRvIG9uZSBvciBtb3JlIG90aGVyIGJsb2NrLWRldmljZXMsIHdpdGggYW4gYXN5bmNocm9ub3VzCi0gKiBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbi4KLSAqLwotCi0jaWZuZGVmIERNX0tDT1BZRF9ICi0jZGVmaW5lIERNX0tDT1BZRF9ICi0KLSNpbmNsdWRlICJkbS1pby5oIgotCi0vKiBGSVhNRTogbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZSAqLwotI2RlZmluZSBLQ09QWURfTUFYX1JFR0lPTlMgOAotCi0jZGVmaW5lIEtDT1BZRF9JR05PUkVfRVJST1IgMQotCi0vKgotICogVG8gdXNlIGtjb3B5ZCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgYSBrY29weWQgY2xpZW50IG9iamVjdC4KLSAqLwotc3RydWN0IGtjb3B5ZF9jbGllbnQ7Ci1pbnQga2NvcHlkX2NsaWVudF9jcmVhdGUodW5zaWduZWQgaW50IG51bV9wYWdlcywgc3RydWN0IGtjb3B5ZF9jbGllbnQgKipyZXN1bHQpOwotdm9pZCBrY29weWRfY2xpZW50X2Rlc3Ryb3koc3RydWN0IGtjb3B5ZF9jbGllbnQgKmtjKTsKLQotLyoKLSAqIFN1Ym1pdCBhIGNvcHkgam9iIHRvIGtjb3B5ZC4gIFRoaXMgaXMgYnVpbHQgb24gdG9wIG9mIHRoZQotICogcHJldmlvdXMgdGhyZWUgZm5zLgotICoKLSAqIHJlYWRfZXJyIGlzIGEgYm9vbGVhbiwKLSAqIHdyaXRlX2VyciBpcyBhIGJpdHNldCwgd2l0aCAxIGJpdCBmb3IgZWFjaCBkZXN0aW5hdGlvbiByZWdpb24KLSAqLwotdHlwZWRlZiB2b2lkICgqa2NvcHlkX25vdGlmeV9mbikoaW50IHJlYWRfZXJyLCB1bnNpZ25lZCBsb25nIHdyaXRlX2VyciwKLQkJCQkgdm9pZCAqY29udGV4dCk7Ci0KLWludCBrY29weWRfY29weShzdHJ1Y3Qga2NvcHlkX2NsaWVudCAqa2MsIHN0cnVjdCBpb19yZWdpb24gKmZyb20sCi0JCXVuc2lnbmVkIGludCBudW1fZGVzdHMsIHN0cnVjdCBpb19yZWdpb24gKmRlc3RzLAotCQl1bnNpZ25lZCBpbnQgZmxhZ3MsIGtjb3B5ZF9ub3RpZnlfZm4gZm4sIHZvaWQgKmNvbnRleHQpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL0tjb25maWcgYi9kcml2ZXJzL210ZC9LY29uZmlnCmluZGV4IGU4NTAzMzQuLmVlZDA2ZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvS2NvbmZpZwpAQCAtMTU4LDYgKzE1OCwxMiBAQAogCSAgdGhlIHBhcnRpdGlvbiBtYXAgZnJvbSB0aGUgY2hpbGRyZW4gb2YgdGhlIGZsYXNoIG5vZGUsCiAJICBhcyBkZXNjcmliZWQgaW4gRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2Jvb3Rpbmctd2l0aG91dC1vZi50eHQuCiAKK2NvbmZpZyBNVERfQVI3X1BBUlRTCisJdHJpc3RhdGUgIlRJIEFSNyBwYXJ0aXRpb25pbmcgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE1URF9QQVJUSVRJT05TCisJLS0taGVscC0tLQorCSAgVEkgQVI3IHBhcnRpdGlvbmluZyBzdXBwb3J0CisKIGNvbW1lbnQgIlVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzIgogCiBjb25maWcgTVREX0NIQVIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL01ha2VmaWxlIGIvZHJpdmVycy9tdGQvTWFrZWZpbGUKaW5kZXggNTM4ZTMzZC4uNGI3NzMzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tdGQvTWFrZWZpbGUKQEAgLTExLDYgKzExLDcgQEAKIG9iai0kKENPTkZJR19NVERfUkVEQk9PVF9QQVJUUykgKz0gcmVkYm9vdC5vCiBvYmotJChDT05GSUdfTVREX0NNRExJTkVfUEFSVFMpICs9IGNtZGxpbmVwYXJ0Lm8KIG9iai0kKENPTkZJR19NVERfQUZTX1BBUlRTKQkrPSBhZnMubworb2JqLSQoQ09ORklHX01URF9BUjdfUEFSVFMpCSs9IGFyN3BhcnQubwogb2JqLSQoQ09ORklHX01URF9PRl9QQVJUUykgICAgICArPSBvZnBhcnQubwogCiAjICdVc2VycycgLSBjb2RlIHdoaWNoIHByZXNlbnRzIGZ1bmN0aW9uYWxpdHkgdG8gdXNlcnNwYWNlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvYXI3cGFydC5jIGIvZHJpdmVycy9tdGQvYXI3cGFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZjE3MGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC9hcjdwYXJ0LmMKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwNyBFdWdlbmUgS29uZXYgPGVqa2FAb3BlbndydC5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKiBUSSBBUjcgZmxhc2ggcGFydGl0aW9uIHRhYmxlLgorICogQmFzZWQgb24gYXI3IG1hcCBieSBGZWxpeCBGaWV0a2F1IDxuYmRAb3BlbndydC5vcmc+CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KKworI2RlZmluZSBBUjdfUEFSVFMJNAorI2RlZmluZSBST09UX09GRlNFVAkweGUwMDAwCisKKyNkZWZpbmUgTE9BREVSX01BR0lDMQlsZTMyX3RvX2NwdSgweGZlZWRmYTQyKQorI2RlZmluZSBMT0FERVJfTUFHSUMyCWxlMzJfdG9fY3B1KDB4ZmVlZDEyODEpCisKKyNpZm5kZWYgU1FVQVNIRlNfTUFHSUMKKyNkZWZpbmUgU1FVQVNIRlNfTUFHSUMJMHg3MzcxNzM2OAorI2VuZGlmCisKK3N0cnVjdCBhcjdfYmluX3JlYyB7CisJdW5zaWduZWQgaW50IGNoZWNrc3VtOworCXVuc2lnbmVkIGludCBsZW5ndGg7CisJdW5zaWduZWQgaW50IGFkZHJlc3M7Cit9OworCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gYXI3X3BhcnRzW0FSN19QQVJUU107CisKK3N0YXRpYyBpbnQgY3JlYXRlX210ZF9wYXJ0aXRpb25zKHN0cnVjdCBtdGRfaW5mbyAqbWFzdGVyLAorCQkJCSBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqKnBwYXJ0cywKKwkJCQkgdW5zaWduZWQgbG9uZyBvcmlnaW4pCit7CisJc3RydWN0IGFyN19iaW5fcmVjIGhlYWRlcjsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXNpemVfdCBsZW47CisJdW5zaWduZWQgaW50IHByZV9zaXplID0gbWFzdGVyLT5lcmFzZXNpemUsIHBvc3Rfc2l6ZSA9IDA7CisJdW5zaWduZWQgaW50IHJvb3Rfb2Zmc2V0ID0gUk9PVF9PRkZTRVQ7CisKKwlpbnQgcmV0cmllcyA9IDEwOworCisJYXI3X3BhcnRzWzBdLm5hbWUgPSAibG9hZGVyIjsKKwlhcjdfcGFydHNbMF0ub2Zmc2V0ID0gMDsKKwlhcjdfcGFydHNbMF0uc2l6ZSA9IG1hc3Rlci0+ZXJhc2VzaXplOworCWFyN19wYXJ0c1swXS5tYXNrX2ZsYWdzID0gTVREX1dSSVRFQUJMRTsKKworCWFyN19wYXJ0c1sxXS5uYW1lID0gImNvbmZpZyI7CisJYXI3X3BhcnRzWzFdLm9mZnNldCA9IDA7CisJYXI3X3BhcnRzWzFdLnNpemUgPSBtYXN0ZXItPmVyYXNlc2l6ZTsKKwlhcjdfcGFydHNbMV0ubWFza19mbGFncyA9IDA7CisKKwlkbyB7IC8qIFRyeSAxMCBibG9ja3Mgc3RhcnRpbmcgZnJvbSBtYXN0ZXItPmVyYXNlc2l6ZSAqLworCQlvZmZzZXQgPSBwcmVfc2l6ZTsKKwkJbWFzdGVyLT5yZWFkKG1hc3Rlciwgb2Zmc2V0LAorCQkJICAgICBzaXplb2YoaGVhZGVyKSwgJmxlbiwgKHVpbnQ4X3QgKikmaGVhZGVyKTsKKwkJaWYgKCFzdHJuY21wKChjaGFyICopJmhlYWRlciwgIlRJRU5WMC44IiwgOCkpCisJCQlhcjdfcGFydHNbMV0ub2Zmc2V0ID0gcHJlX3NpemU7CisJCWlmIChoZWFkZXIuY2hlY2tzdW0gPT0gTE9BREVSX01BR0lDMSkKKwkJCWJyZWFrOworCQlpZiAoaGVhZGVyLmNoZWNrc3VtID09IExPQURFUl9NQUdJQzIpCisJCQlicmVhazsKKwkJcHJlX3NpemUgKz0gbWFzdGVyLT5lcmFzZXNpemU7CisJfSB3aGlsZSAocmV0cmllcy0tKTsKKworCXByZV9zaXplID0gb2Zmc2V0OworCisJaWYgKCFhcjdfcGFydHNbMV0ub2Zmc2V0KSB7CisJCWFyN19wYXJ0c1sxXS5vZmZzZXQgPSBtYXN0ZXItPnNpemUgLSBtYXN0ZXItPmVyYXNlc2l6ZTsKKwkJcG9zdF9zaXplID0gbWFzdGVyLT5lcmFzZXNpemU7CisJfQorCisJc3dpdGNoIChoZWFkZXIuY2hlY2tzdW0pIHsKKwljYXNlIExPQURFUl9NQUdJQzE6CisJCXdoaWxlIChoZWFkZXIubGVuZ3RoKSB7CisJCQlvZmZzZXQgKz0gc2l6ZW9mKGhlYWRlcikgKyBoZWFkZXIubGVuZ3RoOworCQkJbWFzdGVyLT5yZWFkKG1hc3Rlciwgb2Zmc2V0LCBzaXplb2YoaGVhZGVyKSwKKwkJCQkgICAgICZsZW4sICh1aW50OF90ICopJmhlYWRlcik7CisJCX0KKwkJcm9vdF9vZmZzZXQgPSBvZmZzZXQgKyBzaXplb2YoaGVhZGVyKSArIDQ7CisJCWJyZWFrOworCWNhc2UgTE9BREVSX01BR0lDMjoKKwkJd2hpbGUgKGhlYWRlci5sZW5ndGgpIHsKKwkJCW9mZnNldCArPSBzaXplb2YoaGVhZGVyKSArIGhlYWRlci5sZW5ndGg7CisJCQltYXN0ZXItPnJlYWQobWFzdGVyLCBvZmZzZXQsIHNpemVvZihoZWFkZXIpLAorCQkJCSAgICAgJmxlbiwgKHVpbnQ4X3QgKikmaGVhZGVyKTsKKwkJfQorCQlyb290X29mZnNldCA9IG9mZnNldCArIHNpemVvZihoZWFkZXIpICsgNCArIDB4ZmY7CisJCXJvb3Rfb2Zmc2V0ICY9IH4odWludDMyX3QpMHhmZjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5rbm93biBtYWdpYzogJTA4eFxuIiwgaGVhZGVyLmNoZWNrc3VtKTsKKwkJYnJlYWs7CisJfQorCisJbWFzdGVyLT5yZWFkKG1hc3Rlciwgcm9vdF9vZmZzZXQsCisJCXNpemVvZihoZWFkZXIpLCAmbGVuLCAodTggKikmaGVhZGVyKTsKKwlpZiAoaGVhZGVyLmNoZWNrc3VtICE9IFNRVUFTSEZTX01BR0lDKSB7CisJCXJvb3Rfb2Zmc2V0ICs9IG1hc3Rlci0+ZXJhc2VzaXplIC0gMTsKKwkJcm9vdF9vZmZzZXQgJj0gfihtYXN0ZXItPmVyYXNlc2l6ZSAtIDEpOworCX0KKworCWFyN19wYXJ0c1syXS5uYW1lID0gImxpbnV4IjsKKwlhcjdfcGFydHNbMl0ub2Zmc2V0ID0gcHJlX3NpemU7CisJYXI3X3BhcnRzWzJdLnNpemUgPSBtYXN0ZXItPnNpemUgLSBwcmVfc2l6ZSAtIHBvc3Rfc2l6ZTsKKwlhcjdfcGFydHNbMl0ubWFza19mbGFncyA9IDA7CisKKwlhcjdfcGFydHNbM10ubmFtZSA9ICJyb290ZnMiOworCWFyN19wYXJ0c1szXS5vZmZzZXQgPSByb290X29mZnNldDsKKwlhcjdfcGFydHNbM10uc2l6ZSA9IG1hc3Rlci0+c2l6ZSAtIHJvb3Rfb2Zmc2V0IC0gcG9zdF9zaXplOworCWFyN19wYXJ0c1szXS5tYXNrX2ZsYWdzID0gMDsKKworCSpwcGFydHMgPSBhcjdfcGFydHM7CisJcmV0dXJuIEFSN19QQVJUUzsKK30KKworc3RhdGljIHN0cnVjdCBtdGRfcGFydF9wYXJzZXIgYXI3X3BhcnNlciA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkucGFyc2VfZm4gPSBjcmVhdGVfbXRkX3BhcnRpdGlvbnMsCisJLm5hbWUgPSAiYXI3cGFydCIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhcjdfcGFyc2VyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfbXRkX3BhcnNlcigmYXI3X3BhcnNlcik7Cit9CisKK21vZHVsZV9pbml0KGFyN19wYXJzZXJfaW5pdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoCSJGZWxpeCBGaWV0a2F1IDxuYmRAb3BlbndydC5vcmc+LCAiCisJCSJFdWdlbmUgS29uZXYgPGVqa2FAb3BlbndydC5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1URCBwYXJ0aXRpb25pbmcgZm9yIFRJIEFSNyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAxLmMgYi9kcml2ZXJzL210ZC9jaGlwcy9jZmlfY21kc2V0XzAwMDEuYwppbmRleCAwMDgwNDUyLi5lODEyZGY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9jaGlwcy9jZmlfY21kc2V0XzAwMDEuYworKysgYi9kcml2ZXJzL210ZC9jaGlwcy9jZmlfY21kc2V0XzAwMDEuYwpAQCAtMzg0LDcgKzM4NCw3IEBACiAJCQlpZiAoZXh0cF9zaXplID4gNDA5NikgewogCQkJCXByaW50ayhLRVJOX0VSUgogCQkJCQkiJXM6IGNmaV9wcmlfaW50ZWxleHQgaXMgdG9vIGZhdFxuIiwKLQkJCQkJX19GVU5DVElPTl9fKTsKKwkJCQkJX19mdW5jX18pOwogCQkJCXJldHVybiBOVUxMOwogCQkJfQogCQkJZ290byBhZ2FpbjsKQEAgLTYxOSw2ICs2MTksOSBAQAogCQkJCSAgc2l6ZW9mKHN0cnVjdCBjZmlfaW50ZWxleHRfYmxvY2tpbmZvKTsKIAkJfQogCisJCWlmICghbnVtcGFydHMpCisJCQludW1wYXJ0cyA9IDE7CisKIAkJLyogUHJvZ3JhbW1pbmcgUmVnaW9uIGluZm8gKi8KIAkJaWYgKGV4dHAtPk1pbm9yVmVyc2lvbiA+PSAnNCcpIHsKIAkJCXN0cnVjdCBjZmlfaW50ZWxleHRfcHJvZ3JhbW1pbmdfcmVnaW9uaW5mbyAqcHJpbmZvOwpAQCAtNjQxLDcgKzY0NCw3IEBACiAJCWlmICgoMSA8PCBwYXJ0c2hpZnQpIDwgbXRkLT5lcmFzZXNpemUpIHsKIAkJCXByaW50ayggS0VSTl9FUlIKIAkJCQkiJXM6IGJhZCBudW1iZXIgb2YgaHcgcGFydGl0aW9ucyAoJWQpXG4iLAotCQkJCV9fRlVOQ1RJT05fXywgbnVtcGFydHMpOworCQkJCV9fZnVuY19fLCBudW1wYXJ0cyk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCkBAIC0xMDcxLDEwICsxMDc0LDEwIEBACiAJCQljaGlwLT5zdGF0ZSA9IG5ld3N0YXRlOwogCQkJbWFwX3dyaXRlKG1hcCwgQ01EKDB4ZmYpLCBhZHIpOwogCQkJKHZvaWQpIG1hcF9yZWFkKG1hcCwgYWRyKTsKLQkJCWFzbSB2b2xhdGlsZSAoIi5yZXAgODsgbm9wOyAuZW5kciIpOworCQkJeGlwX2lwcmVmZXRjaCgpOwogCQkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCQkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwotCQkJYXNtIHZvbGF0aWxlICgiLnJlcCA4OyBub3A7IC5lbmRyIik7CisJCQl4aXBfaXByZWZldGNoKCk7CiAJCQljb25kX3Jlc2NoZWQoKTsKIAogCQkJLyoKQEAgLTIwMTMsNyArMjAxNiw3IEBACiAKICNpZmRlZiBERUJVR19MT0NLX0JJVFMKIAlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGxvY2sgc3RhdHVzIGJlZm9yZSwgb2ZzPTB4JTA4bGx4LCBsZW49MHglMDhYXG4iLAotCSAgICAgICBfX0ZVTkNUSU9OX18sIG9mcywgbGVuKTsKKwkgICAgICAgX19mdW5jX18sIG9mcywgbGVuKTsKIAljZmlfdmFyc2l6ZV9mcm9iKG10ZCwgZG9fcHJpbnRsb2Nrc3RhdHVzX29uZWJsb2NrLAogCQlvZnMsIGxlbiwgTlVMTCk7CiAjZW5kaWYKQEAgLTIwMjMsNyArMjAyNiw3IEBACiAKICNpZmRlZiBERUJVR19MT0NLX0JJVFMKIAlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGxvY2sgc3RhdHVzIGFmdGVyLCByZXQ9JWRcbiIsCi0JICAgICAgIF9fRlVOQ1RJT05fXywgcmV0KTsKKwkgICAgICAgX19mdW5jX18sIHJldCk7CiAJY2ZpX3ZhcnNpemVfZnJvYihtdGQsIGRvX3ByaW50bG9ja3N0YXR1c19vbmVibG9jaywKIAkJb2ZzLCBsZW4sIE5VTEwpOwogI2VuZGlmCkBAIC0yMDM3LDcgKzIwNDAsNyBAQAogCiAjaWZkZWYgREVCVUdfTE9DS19CSVRTCiAJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBsb2NrIHN0YXR1cyBiZWZvcmUsIG9mcz0weCUwOGxseCwgbGVuPTB4JTA4WFxuIiwKLQkgICAgICAgX19GVU5DVElPTl9fLCBvZnMsIGxlbik7CisJICAgICAgIF9fZnVuY19fLCBvZnMsIGxlbik7CiAJY2ZpX3ZhcnNpemVfZnJvYihtdGQsIGRvX3ByaW50bG9ja3N0YXR1c19vbmVibG9jaywKIAkJb2ZzLCBsZW4sIE5VTEwpOwogI2VuZGlmCkBAIC0yMDQ3LDcgKzIwNTAsNyBAQAogCiAjaWZkZWYgREVCVUdfTE9DS19CSVRTCiAJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBsb2NrIHN0YXR1cyBhZnRlciwgcmV0PSVkXG4iLAotCSAgICAgICBfX0ZVTkNUSU9OX18sIHJldCk7CisJICAgICAgIF9fZnVuY19fLCByZXQpOwogCWNmaV92YXJzaXplX2Zyb2IobXRkLCBkb19wcmludGxvY2tzdGF0dXNfb25lYmxvY2ssCiAJCW9mcywgbGVuLCBOVUxMKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAyLmMgYi9kcml2ZXJzL210ZC9jaGlwcy9jZmlfY21kc2V0XzAwMDIuYwppbmRleCA0NThkNDc3Li5mN2ZjYzYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9jaGlwcy9jZmlfY21kc2V0XzAwMDIuYworKysgYi9kcml2ZXJzL210ZC9jaGlwcy9jZmlfY21kc2V0XzAwMDIuYwpAQCAtMjIwLDYgKzIyMCwyOCBAQAogCW10ZC0+ZmxhZ3MgfD0gTVREX1BPV0VSVVBfTE9DSzsKIH0KIAorc3RhdGljIHZvaWQgZml4dXBfczI5Z2wwNjRuX3NlY3RvcnMoc3RydWN0IG10ZF9pbmZvICptdGQsIHZvaWQgKnBhcmFtKQoreworCXN0cnVjdCBtYXBfaW5mbyAqbWFwID0gbXRkLT5wcml2OworCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpID0gbWFwLT5mbGRydl9wcml2OworCisJaWYgKChjZmktPmNmaXEtPkVyYXNlUmVnaW9uSW5mb1swXSAmIDB4ZmZmZikgPT0gMHgwMDNmKSB7CisJCWNmaS0+Y2ZpcS0+RXJhc2VSZWdpb25JbmZvWzBdIHw9IDB4MDA0MDsKKwkJcHJfd2FybmluZygiJXM6IEJhZCBTMjlHTDA2NE4gQ0ZJIGRhdGEsIGFkanVzdCBmcm9tIDY0IHRvIDEyOCBzZWN0b3JzXG4iLCBtdGQtPm5hbWUpOworCX0KK30KKworc3RhdGljIHZvaWQgZml4dXBfczI5Z2wwMzJuX3NlY3RvcnMoc3RydWN0IG10ZF9pbmZvICptdGQsIHZvaWQgKnBhcmFtKQoreworCXN0cnVjdCBtYXBfaW5mbyAqbWFwID0gbXRkLT5wcml2OworCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpID0gbWFwLT5mbGRydl9wcml2OworCisJaWYgKChjZmktPmNmaXEtPkVyYXNlUmVnaW9uSW5mb1sxXSAmIDB4ZmZmZikgPT0gMHgwMDdlKSB7CisJCWNmaS0+Y2ZpcS0+RXJhc2VSZWdpb25JbmZvWzFdICY9IH4weDAwNDA7CisJCXByX3dhcm5pbmcoIiVzOiBCYWQgUzI5R0wwMzJOIENGSSBkYXRhLCBhZGp1c3QgZnJvbSAxMjcgdG8gNjMgc2VjdG9yc1xuIiwgbXRkLT5uYW1lKTsKKwl9Cit9CisKIHN0YXRpYyBzdHJ1Y3QgY2ZpX2ZpeHVwIGNmaV9maXh1cF90YWJsZVtdID0gewogCXsgQ0ZJX01GUl9BVE1FTCwgQ0ZJX0lEX0FOWSwgZml4dXBfY29udmVydF9hdG1lbF9wcmksIE5VTEwgfSwKICNpZmRlZiBBTURfQk9PVExPQ19CVUcKQEAgLTIzMSw2ICsyNTMsMTAgQEAKIAl7IENGSV9NRlJfQU1ELCAweDAwNTYsIGZpeHVwX3VzZV9zZWNzaSwgTlVMTCwgfSwKIAl7IENGSV9NRlJfQU1ELCAweDAwNUMsIGZpeHVwX3VzZV9zZWNzaSwgTlVMTCwgfSwKIAl7IENGSV9NRlJfQU1ELCAweDAwNUYsIGZpeHVwX3VzZV9zZWNzaSwgTlVMTCwgfSwKKwl7IENGSV9NRlJfQU1ELCAweDBjMDEsIGZpeHVwX3MyOWdsMDY0bl9zZWN0b3JzLCBOVUxMLCB9LAorCXsgQ0ZJX01GUl9BTUQsIDB4MTMwMSwgZml4dXBfczI5Z2wwNjRuX3NlY3RvcnMsIE5VTEwsIH0sCisJeyBDRklfTUZSX0FNRCwgMHgxYTAwLCBmaXh1cF9zMjlnbDAzMm5fc2VjdG9ycywgTlVMTCwgfSwKKwl7IENGSV9NRlJfQU1ELCAweDFhMDEsIGZpeHVwX3MyOWdsMDMybl9zZWN0b3JzLCBOVUxMLCB9LAogI2lmICFGT1JDRV9XT1JEX1dSSVRFCiAJeyBDRklfTUZSX0FOWSwgQ0ZJX0lEX0FOWSwgZml4dXBfdXNlX3dyaXRlX2J1ZmZlcnMsIE5VTEwsIH0sCiAjZW5kaWYKQEAgLTcyMywxMCArNzQ5LDEwIEBACiAJCQljaGlwLT5lcmFzZV9zdXNwZW5kZWQgPSAxOwogCQkJbWFwX3dyaXRlKG1hcCwgQ01EKDB4ZjApLCBhZHIpOwogCQkJKHZvaWQpIG1hcF9yZWFkKG1hcCwgYWRyKTsKLQkJCWFzbSB2b2xhdGlsZSAoIi5yZXAgODsgbm9wOyAuZW5kciIpOworCQkJeGlwX2lwcmVmZXRjaCgpOwogCQkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCQkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwotCQkJYXNtIHZvbGF0aWxlICgiLnJlcCA4OyBub3A7IC5lbmRyIik7CisJCQl4aXBfaXByZWZldGNoKCk7CiAJCQljb25kX3Jlc2NoZWQoKTsKIAogCQkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV9jbWRzZXRfMDAyMC5jIGIvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDIwLmMKaW5kZXggNDkyZTJhYi4uMWI3MjBjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDIwLmMKKysrIGIvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDIwLmMKQEAgLTQ0NSw3ICs0NDUsNyBAQAogIHJldHJ5OgogCiAjaWZkZWYgREVCVUdfQ0ZJX0ZFQVRVUkVTCi0gICAgICAgcHJpbnRrKCIlczogY2hpcC0+c3RhdGVbJWRdXG4iLCBfX0ZVTkNUSU9OX18sIGNoaXAtPnN0YXRlKTsKKyAgICAgICBwcmludGsoIiVzOiBjaGlwLT5zdGF0ZVslZF1cbiIsIF9fZnVuY19fLCBjaGlwLT5zdGF0ZSk7CiAjZW5kaWYKIAlzcGluX2xvY2tfYmgoY2hpcC0+bXV0ZXgpOwogCkBAIC00NjMsNyArNDYzLDcgQEAKIAkJbWFwX3dyaXRlKG1hcCwgQ01EKDB4NzApLCBjbWRfYWRyKTsKICAgICAgICAgICAgICAgICBjaGlwLT5zdGF0ZSA9IEZMX1NUQVRVUzsKICNpZmRlZiBERUJVR19DRklfRkVBVFVSRVMKLSAgICAgICAgcHJpbnRrKCIlczogMSBzdGF0dXNbJXhdXG4iLCBfX0ZVTkNUSU9OX18sIG1hcF9yZWFkKG1hcCwgY21kX2FkcikpOworCXByaW50aygiJXM6IDEgc3RhdHVzWyV4XVxuIiwgX19mdW5jX18sIG1hcF9yZWFkKG1hcCwgY21kX2FkcikpOwogI2VuZGlmCiAKIAljYXNlIEZMX1NUQVRVUzoKQEAgLTU5MSw3ICs1OTEsNyBAQAogICAgICAgICAvKiBjaGVjayBmb3IgZXJyb3JzOiAnbG9jayBiaXQnLCAnVlBQJywgJ2RlYWQgY2VsbCcvJ3VuZXJhc2VkIGNlbGwnIG9yICdpbmNvcnJlY3QgY21kJyAtLSBzYXcgKi8KICAgICAgICAgaWYgKG1hcF93b3JkX2JpdHNzZXQobWFwLCBzdGF0dXMsIENNRCgweDNhKSkpIHsKICNpZmRlZiBERUJVR19DRklfRkVBVFVSRVMKLQkJcHJpbnRrKCIlczogMiBzdGF0dXNbJWx4XVxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMueFswXSk7CisJCXByaW50aygiJXM6IDIgc3RhdHVzWyVseF1cbiIsIF9fZnVuY19fLCBzdGF0dXMueFswXSk7CiAjZW5kaWYKIAkJLyogY2xlYXIgc3RhdHVzICovCiAJCW1hcF93cml0ZShtYXAsIENNRCgweDUwKSwgY21kX2Fkcik7CkBAIC02MjUsOSArNjI1LDkgQEAKIAlvZnMgPSB0byAgLSAoY2hpcG51bSA8PCBjZmktPmNoaXBzaGlmdCk7CiAKICNpZmRlZiBERUJVR19DRklfRkVBVFVSRVMKLSAgICAgICAgcHJpbnRrKCIlczogbWFwX2Jhbmt3aWR0aChtYXApWyV4XVxuIiwgX19GVU5DVElPTl9fLCBtYXBfYmFua3dpZHRoKG1hcCkpOwotICAgICAgICBwcmludGsoIiVzOiBjaGlwbnVtWyV4XSB3YnVmc2l6ZVsleF1cbiIsIF9fRlVOQ1RJT05fXywgY2hpcG51bSwgd2J1ZnNpemUpOwotICAgICAgICBwcmludGsoIiVzOiBvZnNbJXhdIGxlblsleF1cbiIsIF9fRlVOQ1RJT05fXywgb2ZzLCBsZW4pOworCXByaW50aygiJXM6IG1hcF9iYW5rd2lkdGgobWFwKVsleF1cbiIsIF9fZnVuY19fLCBtYXBfYmFua3dpZHRoKG1hcCkpOworCXByaW50aygiJXM6IGNoaXBudW1bJXhdIHdidWZzaXplWyV4XVxuIiwgX19mdW5jX18sIGNoaXBudW0sIHdidWZzaXplKTsKKwlwcmludGsoIiVzOiBvZnNbJXhdIGxlblsleF1cbiIsIF9fZnVuY19fLCBvZnMsIGxlbik7CiAjZW5kaWYKIAogICAgICAgICAvKiBXcml0ZSBidWZmZXIgaXMgd29ydGggaXQgb25seSBpZiBtb3JlIHRoYW4gb25lIHdvcmQgdG8gd3JpdGUuLi4gKi8KQEAgLTg5Myw3ICs4OTMsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBjZmlfc3RhYV9lcmFzZV92YXJzaXplKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgZXJhc2VfaW5mbyAqaW5zdHIpCitzdGF0aWMgaW50IGNmaV9zdGFhX2VyYXNlX3ZhcnNpemUoc3RydWN0IG10ZF9pbmZvICptdGQsCisJCQkJICBzdHJ1Y3QgZXJhc2VfaW5mbyAqaW5zdHIpCiB7CXN0cnVjdCBtYXBfaW5mbyAqbWFwID0gbXRkLT5wcml2OwogCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpID0gbWFwLT5mbGRydl9wcml2OwogCXVuc2lnbmVkIGxvbmcgYWRyLCBsZW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9jaGlwcy9jZmlfcHJvYmUuYyBiL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV9wcm9iZS5jCmluZGV4IGY2NTFiNmUuLmE0NDYzYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV9wcm9iZS5jCisrKyBiL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV9wcm9iZS5jCkBAIC0zOSw3ICszOSw3IEBACiAjZGVmaW5lIHhpcF9hbGxvd2VkKGJhc2UsIG1hcCkgXAogZG8geyBcCiAJKHZvaWQpIG1hcF9yZWFkKG1hcCwgYmFzZSk7IFwKLQlhc20gdm9sYXRpbGUgKCIucmVwIDg7IG5vcDsgLmVuZHIiKTsgXAorCXhpcF9pcHJlZmV0Y2goKTsgXAogCWxvY2FsX2lycV9lbmFibGUoKTsgXAogfSB3aGlsZSAoMCkKIApAQCAtMjMyLDYgKzIzMiwxMSBAQAogCWNmaS0+bWZyID0gY2ZpX3JlYWRfcXVlcnkxNihtYXAsIGJhc2UpOwogCWNmaS0+aWQgPSBjZmlfcmVhZF9xdWVyeTE2KG1hcCwgYmFzZSArIG9mc19mYWN0b3IpOwogCisJLyogR2V0IEFNRC9TcGFuc2lvbiBleHRlbmRlZCBKRURFQyBJRCAqLworCWlmIChjZmktPm1mciA9PSBDRklfTUZSX0FNRCAmJiAoY2ZpLT5pZCAmIDB4ZmYpID09IDB4N2UpCisJCWNmaS0+aWQgPSBjZmlfcmVhZF9xdWVyeShtYXAsIGJhc2UgKyAweGUgKiBvZnNfZmFjdG9yKSA8PCA4IHwKKwkJCSAgY2ZpX3JlYWRfcXVlcnkobWFwLCBiYXNlICsgMHhmICogb2ZzX2ZhY3Rvcik7CisKIAkvKiBQdXQgaXQgYmFjayBpbnRvIFJlYWQgTW9kZSAqLwogCWNmaV9zZW5kX2dlbl9jbWQoMHhGMCwgMCwgYmFzZSwgbWFwLCBjZmksIGNmaS0+ZGV2aWNlX3R5cGUsIE5VTEwpOwogCS8qIC4uLiBldmVuIGlmIGl0J3MgYW4gSW50ZWwgY2hpcCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX3V0aWwuYyBiL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV91dGlsLmMKaW5kZXggMmU1MTQ5Ni4uNzJlMDAyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX3V0aWwuYworKysgYi9kcml2ZXJzL210ZC9jaGlwcy9jZmlfdXRpbC5jCkBAIC02NSw3ICs2NSw3IEBACiAKICNpZmRlZiBDT05GSUdfTVREX1hJUAogCSh2b2lkKSBtYXBfcmVhZChtYXAsIGJhc2UpOwotCWFzbSB2b2xhdGlsZSAoIi5yZXAgODsgbm9wOyAuZW5kciIpOworCXhpcF9pcHJlZmV0Y2goKTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvY2hpcHMvamVkZWNfcHJvYmUuYyBiL2RyaXZlcnMvbXRkL2NoaXBzL2plZGVjX3Byb2JlLmMKaW5kZXggNGJlNTFhOC4uYWEwNzU3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvY2hpcHMvamVkZWNfcHJvYmUuYworKysgYi9kcml2ZXJzL210ZC9jaGlwcy9qZWRlY19wcm9iZS5jCkBAIC0xMzIsNiArMTMyLDggQEAKICNkZWZpbmUgTTI5RjgwMEFCCTB4MDA1OAogI2RlZmluZSBNMjlXODAwRFQJMHgwMEQ3CiAjZGVmaW5lIE0yOVc4MDBEQgkweDAwNUIKKyNkZWZpbmUgTTI5VzQwMERUCTB4MDBFRQorI2RlZmluZSBNMjlXNDAwREIJMHgwMEVGCiAjZGVmaW5lIE0yOVcxNjBEVAkweDIyQzQKICNkZWZpbmUgTTI5VzE2MERCCTB4MjI0OQogI2RlZmluZSBNMjlXMDQwQgkweDAwRTMKQEAgLTE2MCw2ICsxNjIsNyBAQAogI2RlZmluZSBTU1Q0OUxGMDMwQQkweDAwMUMKICNkZWZpbmUgU1NUNDlMRjA0MEEJMHgwMDUxCiAjZGVmaW5lIFNTVDQ5TEYwODBBCTB4MDA1QgorI2RlZmluZSBTU1QzNlZGMzIwMwkweDczNTQKIAogLyogVG9zaGliYSAqLwogI2RlZmluZSBUQzU4RlZUMTYwCTB4MDBDMgpAQCAtMTExMyw3ICsxMTE2LDcgQEAKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgxMDAwMCw4KSwKIAkJfQotICAgICAgICB9LCB7CisJfSwgewogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9NQUNST05JWCwKIAkJLmRldl9pZAkJPSBNWDI5RjAxNiwKIAkJLm5hbWUJCT0gIk1hY3Jvbml4IE1YMjlGMDE2IiwKQEAgLTExMjUsNyArMTEyOCw3IEBACiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MTAwMDAsMzIpLAogCQl9Ci0gICAgICAgIH0sIHsKKwl9LCB7CiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX01BQ1JPTklYLAogCQkuZGV2X2lkCQk9IE1YMjlGMDA0VCwKIAkJLm5hbWUJCT0gIk1hY3Jvbml4IE1YMjlGMDA0VCIsCkBAIC0xMTQwLDcgKzExNDMsNyBAQAogCQkJRVJBU0VJTkZPKDB4MDIwMDAsMiksCiAJCQlFUkFTRUlORk8oMHgwNDAwMCwxKSwKIAkJfQotICAgICAgICB9LCB7CisJfSwgewogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9NQUNST05JWCwKIAkJLmRldl9pZAkJPSBNWDI5RjAwNEIsCiAJCS5uYW1lCQk9ICJNYWNyb25peCBNWDI5RjAwNEIiLApAQCAtMTIxOCw3ICsxMjIxLDcgQEAKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHg0MDAwMCwxNiksCiAJCX0KLSAgICAgICAgfSwgeworCX0sIHsKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfU1NULAogCQkuZGV2X2lkCQk9IFNTVDM5TEY1MTIsCiAJCS5uYW1lCQk9ICJTU1QgMzlMRjUxMiIsCkBAIC0xMjMwLDcgKzEyMzMsNyBAQAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDAxMDAwLDE2KSwKIAkJfQotICAgICAgICB9LCB7CisJfSwgewogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9TU1QsCiAJCS5kZXZfaWQJCT0gU1NUMzlMRjAxMCwKIAkJLm5hbWUJCT0gIlNTVCAzOUxGMDEwIiwKQEAgLTEyNDIsNyArMTI0NSw3IEBACiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MDEwMDAsMzIpLAogCQl9Ci0gICAgICAgIH0sIHsKKwl9LCB7CiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX1NTVCwKICAJCS5kZXZfaWQgCT0gU1NUMjlFRTAyMCwKIAkJLm5hbWUJCT0gIlNTVCAyOUVFMDIwIiwKQEAgLTEyNzYsNyArMTI3OSw3IEBACiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MDEwMDAsNjQpLAogCQl9Ci0gICAgICAgIH0sIHsKKwl9LCB7CiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX1NTVCwKIAkJLmRldl9pZAkJPSBTU1QzOUxGMDQwLAogCQkubmFtZQkJPSAiU1NUIDM5TEYwNDAiLApAQCAtMTI4OCw3ICsxMjkxLDcgQEAKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgwMTAwMCwxMjgpLAogCQl9Ci0gICAgICAgIH0sIHsKKwl9LCB7CiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX1NTVCwKIAkJLmRldl9pZAkJPSBTU1QzOVNGMDEwQSwKIAkJLm5hbWUJCT0gIlNTVCAzOVNGMDEwQSIsCkBAIC0xMzAwLDcgKzEzMDMsNyBAQAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDAxMDAwLDMyKSwKIAkJfQotICAgICAgICB9LCB7CisJfSwgewogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9TU1QsCiAJCS5kZXZfaWQJCT0gU1NUMzlTRjAyMEEsCiAJCS5uYW1lCQk9ICJTU1QgMzlTRjAyMEEiLApAQCAtMTQxMiw2ICsxNDE1LDE4IEBACiAJCQlFUkFTRUlORk8oMHgxMDAwLDI1NikKIAkJfQogCX0sIHsKKwkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfU1NULAorCQkuZGV2X2lkCQk9IFNTVDM2VkYzMjAzLAorCQkubmFtZQkJPSAiU1NUIDM2VkYzMjAzIiwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDE2fENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4MEFBQV8weDA1NTUsCisJCS5kZXZfc2l6ZQk9IFNJWkVfNE1pQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gMSwKKwkJLnJlZ2lvbnMJPSB7CisJCQlFUkFTRUlORk8oMHgxMDAwMCw2NCksCisJCX0KKwl9LCB7CiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX1NULAogCQkuZGV2X2lkCQk9IE0yOUY4MDBBQiwKIAkJLm5hbWUJCT0gIlNUIE0yOUY4MDBBQiIsCkBAIC0xNDI2LDcgKzE0NDEsNyBAQAogCQkJRVJBU0VJTkZPKDB4MDgwMDAsMSksCiAJCQlFUkFTRUlORk8oMHgxMDAwMCwxNSksCiAJCX0KLSAgICAgICB9LCB7CisJfSwgewogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9TVCwJLyogRklYTUUgLSBDRkkgZGV2aWNlPyAqLwogCQkuZGV2X2lkCQk9IE0yOVc4MDBEVCwKIAkJLm5hbWUJCT0gIlNUIE0yOVc4MDBEVCIsCkBAIC0xNDU2LDYgKzE0NzEsMzYgQEAKIAkJCUVSQVNFSU5GTygweDA4MDAwLDEpLAogCQkJRVJBU0VJTkZPKDB4MTAwMDAsMTUpCiAJCX0KKwl9LCAgeworCQkubWZyX2lkICAgICAgICAgPSBNQU5VRkFDVFVSRVJfU1QsCisJCS5kZXZfaWQgICAgICAgICA9IE0yOVc0MDBEVCwKKwkJLm5hbWUgICAgICAgICAgID0gIlNUIE0yOVc0MDBEVCIsCisJCS5kZXZ0eXBlcyAgICAgICA9IENGSV9ERVZJQ0VUWVBFX1gxNnxDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyICAgICAgICAgID0gTVREX1VBRERSXzB4MEFBQV8weDA1NTUsCisJCS5kZXZfc2l6ZSAgICAgICA9IFNJWkVfNTEyS2lCLAorCQkuY21kX3NldCAgICAgICAgPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zICAgICA9IDQsCisJCS5yZWdpb25zICAgICAgICA9IHsKKwkJCUVSQVNFSU5GTygweDA0MDAwLDcpLAorCQkJRVJBU0VJTkZPKDB4MDIwMDAsMSksCisJCQlFUkFTRUlORk8oMHgwODAwMCwyKSwKKwkJCUVSQVNFSU5GTygweDEwMDAwLDEpCisJCX0KKwl9LCB7CisJCS5tZnJfaWQgICAgICAgICA9IE1BTlVGQUNUVVJFUl9TVCwKKwkJLmRldl9pZCAgICAgICAgID0gTTI5VzQwMERCLAorCQkubmFtZSAgICAgICAgICAgPSAiU1QgTTI5VzQwMERCIiwKKwkJLmRldnR5cGVzICAgICAgID0gQ0ZJX0RFVklDRVRZUEVfWDE2fENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIgICAgICAgICAgPSBNVERfVUFERFJfMHgwQUFBXzB4MDU1NSwKKwkJLmRldl9zaXplICAgICAgID0gU0laRV81MTJLaUIsCisJCS5jbWRfc2V0ICAgICAgICA9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMgICAgID0gNCwKKwkJLnJlZ2lvbnMgICAgICAgID0geworCQkJRVJBU0VJTkZPKDB4MDQwMDAsMSksCisJCQlFUkFTRUlORk8oMHgwMjAwMCwyKSwKKwkJCUVSQVNFSU5GTygweDA4MDAwLDEpLAorCQkJRVJBU0VJTkZPKDB4MTAwMDAsNykKKwkJfQogCX0sIHsKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfU1QsCS8qIEZJWE1FIC0gQ0ZJIGRldmljZT8gKi8KIAkJLmRldl9pZAkJPSBNMjlXMTYwRFQsCkBAIC0xNDg2LDcgKzE1MzEsNyBAQAogCQkJRVJBU0VJTkZPKDB4MDgwMDAsMSksCiAJCQlFUkFTRUlORk8oMHgxMDAwMCwzMSkKIAkJfQotICAgICAgICB9LCB7CisJfSwgewogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9TVCwKIAkJLmRldl9pZAkJPSBNMjlXMDQwQiwKIAkJLm5hbWUJCT0gIlNUIE0yOVcwNDBCIiwKQEAgLTE0OTgsNyArMTU0Myw3IEBACiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MTAwMDAsOCksCiAJCX0KLSAgICAgICAgfSwgeworCX0sIHsKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfU1QsCiAJCS5kZXZfaWQJCT0gTTUwRlcwNDAsCiAJCS5uYW1lCQk9ICJTVCBNNTBGVzA0MCIsCkBAIC0xNTEwLDcgKzE1NTUsNyBAQAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDEwMDAwLDgpLAogCQl9Ci0gICAgICAgIH0sIHsKKwl9LCB7CiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX1NULAogCQkuZGV2X2lkCQk9IE01MEZXMDgwLAogCQkubmFtZQkJPSAiU1QgTTUwRlcwODAiLApAQCAtMTUyMiw3ICsxNTY3LDcgQEAKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgxMDAwMCwxNiksCiAJCX0KLSAgICAgICAgfSwgeworCX0sIHsKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfU1QsCiAJCS5kZXZfaWQJCT0gTTUwRlcwMTYsCiAJCS5uYW1lCQk9ICJTVCBNNTBGVzAxNiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9jbWRsaW5lcGFydC5jIGIvZHJpdmVycy9tdGQvY21kbGluZXBhcnQuYwppbmRleCBiNDQyOTJhLi5lNDcyYTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9jbWRsaW5lcGFydC5jCisrKyBiL2RyaXZlcnMvbXRkL2NtZGxpbmVwYXJ0LmMKQEAgLTExOSw3ICsxMTksOCBAQAogCQljaGFyICpwOwogCiAJICAgIAluYW1lID0gKytzOwotCQlpZiAoKHAgPSBzdHJjaHIobmFtZSwgZGVsaW0pKSA9PSAwKQorCQlwID0gc3RyY2hyKG5hbWUsIGRlbGltKTsKKwkJaWYgKCFwKQogCQl7CiAJCQlwcmludGsoS0VSTl9FUlIgRVJSUCAibm8gY2xvc2luZyAlYyBmb3VuZCBpbiBwYXJ0aXRpb24gbmFtZVxuIiwgZGVsaW0pOwogCQkJcmV0dXJuIE5VTEw7CkBAIC0xNTksOSArMTYwLDEwIEBACiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQkvKiBtb3JlIHBhcnRpdGlvbnMgZm9sbG93LCBwYXJzZSB0aGVtICovCi0JCWlmICgocGFydHMgPSBuZXdwYXJ0KHMgKyAxLCAmcywgbnVtX3BhcnRzLAotCQkgICAgICAgICAgICAgICAgICAgICB0aGlzX3BhcnQgKyAxLCAmZXh0cmFfbWVtLCBleHRyYV9tZW1fc2l6ZSkpID09IDApCi0JCSAgcmV0dXJuIE5VTEw7CisJCXBhcnRzID0gbmV3cGFydChzICsgMSwgJnMsIG51bV9wYXJ0cywgdGhpc19wYXJ0ICsgMSwKKwkJCQkmZXh0cmFfbWVtLCBleHRyYV9tZW1fc2l6ZSk7CisJCWlmICghcGFydHMpCisJCQlyZXR1cm4gTlVMTDsKIAl9CiAJZWxzZQogCXsJLyogdGhpcyBpcyB0aGUgbGFzdCBwYXJ0aXRpb246IGFsbG9jYXRlIHNwYWNlIGZvciBhbGwgKi8KQEAgLTMwOCw5ICszMTAsNiBAQAogCXN0cnVjdCBjbWRsaW5lX210ZF9wYXJ0aXRpb24gKnBhcnQ7CiAJY2hhciAqbXRkX2lkID0gbWFzdGVyLT5uYW1lOwogCi0JaWYoIWNtZGxpbmUpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJLyogcGFyc2UgY29tbWFuZCBsaW5lICovCiAJaWYgKCFjbWRsaW5lX3BhcnNlZCkKIAkJbXRkcGFydF9zZXR1cF9yZWFsKGNtZGxpbmUpOwpAQCAtMzQxLDcgKzM0MCw3IEBACiAJCQlyZXR1cm4gcGFydC0+bnVtX3BhcnRzOwogCQl9CiAJfQotCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvS2NvbmZpZyBiL2RyaXZlcnMvbXRkL2RldmljZXMvS2NvbmZpZwppbmRleCA4MTFkNTZmLi4zNWVkMTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9LY29uZmlnCkBAIC03Nyw2ICs3NywxMyBAQAogCSAgaWYgeW91IHdhbnQgdG8gc3BlY2lmeSBkZXZpY2UgcGFydGl0aW9uaW5nIG9yIHRvIHVzZSBhIGRldmljZSB3aGljaAogCSAgZG9lc24ndCBzdXBwb3J0IHRoZSBKRURFQyBJRCBpbnN0cnVjdGlvbi4KIAorY29uZmlnIE0yNVBYWF9VU0VfRkFTVF9SRUFECisJYm9vbCAiVXNlIEZBU1RfUkVBRCBPUENvZGUgYWxsb3dpbmcgU1BJIENMSyA8PSA1ME1IeiIKKwlkZXBlbmRzIG9uIE1URF9NMjVQODAKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIEZBU1RfUkVBRCBhY2Nlc3Mgc3VwcG9ydGVkIGJ5IFNUIE0yNVB4eC4KKwogY29uZmlnIE1URF9TTFJBTQogCXRyaXN0YXRlICJVbmNhY2hlZCBzeXN0ZW0gUkFNIgogCWhlbHAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvYmxvY2sybXRkLmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL2Jsb2NrMm10ZC5jCmluZGV4IGFkMTg4MGMuLjUxOWQ5NDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvYmxvY2sybXRkLmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9ibG9jazJtdGQuYwpAQCAtMzA1LDcgKzMwNSw3IEBACiAJfQogCWxpc3RfYWRkKCZkZXYtPmxpc3QsICZibGttdGRfZGV2aWNlX2xpc3QpOwogCUlORk8oIm10ZCVkOiBbJXNdIGVyYXNlX3NpemUgPSAlZEtpQiBbJWRdIiwgZGV2LT5tdGQuaW5kZXgsCi0JCQlkZXYtPm10ZC5uYW1lICsgc3RybGVuKCJibGttdGQ6ICIpLAorCQkJZGV2LT5tdGQubmFtZSArIHN0cmxlbigiYmxvY2sybXRkOiAiKSwKIAkJCWRldi0+bXRkLmVyYXNlc2l6ZSA+PiAxMCwgZGV2LT5tdGQuZXJhc2VzaXplKTsKIAlyZXR1cm4gZGV2OwogCkBAIC0zNjYsOSArMzY2LDkgQEAKIH0KIAogCi0jZGVmaW5lIHBhcnNlX2VycihmbXQsIGFyZ3MuLi4pIGRvIHsJCVwKLQlFUlJPUigiYmxvY2sybXRkOiAiIGZtdCAiXG4iLCAjIyBhcmdzKTsJXAotCXJldHVybiAwOwkJCQlcCisjZGVmaW5lIHBhcnNlX2VycihmbXQsIGFyZ3MuLi4pIGRvIHsJXAorCUVSUk9SKGZtdCwgIyMgYXJncyk7CQlcCisJcmV0dXJuIDA7CQkJXAogfSB3aGlsZSAoMCkKIAogI2lmbmRlZiBNT0RVTEUKQEAgLTQ3Myw3ICs0NzMsNyBAQAogCQlibG9jazJtdGRfc3luYygmZGV2LT5tdGQpOwogCQlkZWxfbXRkX2RldmljZSgmZGV2LT5tdGQpOwogCQlJTkZPKCJtdGQlZDogWyVzXSByZW1vdmVkIiwgZGV2LT5tdGQuaW5kZXgsCi0JCQkJZGV2LT5tdGQubmFtZSArIHN0cmxlbigiYmxrbXRkOiAiKSk7CisJCQkJZGV2LT5tdGQubmFtZSArIHN0cmxlbigiYmxvY2sybXRkOiAiKSk7CiAJCWxpc3RfZGVsKCZkZXYtPmxpc3QpOwogCQlibG9jazJtdGRfZnJlZV9kZXZpY2UoZGV2KTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL2xhcnQuYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbGFydC5jCmluZGV4IDk5ZmQyMTAuLjFkMzI0ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvbGFydC5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbGFydC5jCkBAIC0yNzUsNyArMjc1LDcgQEAKIHsKICAgIHZvbGF0aWxlIF9fdTggKmRhdGEgPSAoX191OCAqKSAoRkxBU0hfT0ZGU0VUICsgb2Zmc2V0KTsKICNpZmRlZiBMQVJUX0RFQlVHCi0gICBwcmludGsgKEtFUk5fREVCVUcgIiVzKCk6IDB4JS44eCAtPiAweCUuMnhcbiIsX19GVU5DVElPTl9fLG9mZnNldCwqZGF0YSk7CisgICBwcmludGsgKEtFUk5fREVCVUcgIiVzKCk6IDB4JS44eCAtPiAweCUuMnhcbiIsIF9fZnVuY19fLCBvZmZzZXQsICpkYXRhKTsKICNlbmRpZgogICAgcmV0dXJuICgqZGF0YSk7CiB9CkBAIC0yODQsNyArMjg0LDcgQEAKIHsKICAgIHZvbGF0aWxlIF9fdTMyICpkYXRhID0gKF9fdTMyICopIChGTEFTSF9PRkZTRVQgKyBvZmZzZXQpOwogI2lmZGVmIExBUlRfREVCVUcKLSAgIHByaW50ayAoS0VSTl9ERUJVRyAiJXMoKTogMHglLjh4IC0+IDB4JS44eFxuIixfX0ZVTkNUSU9OX18sb2Zmc2V0LCpkYXRhKTsKKyAgIHByaW50ayAoS0VSTl9ERUJVRyAiJXMoKTogMHglLjh4IC0+IDB4JS44eFxuIiwgX19mdW5jX18sIG9mZnNldCwgKmRhdGEpOwogI2VuZGlmCiAgICByZXR1cm4gKCpkYXRhKTsKIH0KQEAgLTI5NCw3ICsyOTQsNyBAQAogICAgdm9sYXRpbGUgX191MzIgKmRhdGEgPSAoX191MzIgKikgKEZMQVNIX09GRlNFVCArIG9mZnNldCk7CiAgICAqZGF0YSA9IHg7CiAjaWZkZWYgTEFSVF9ERUJVRwotICAgcHJpbnRrIChLRVJOX0RFQlVHICIlcygpOiAweCUuOHggPC0gMHglLjh4XG4iLF9fRlVOQ1RJT05fXyxvZmZzZXQsKmRhdGEpOworICAgcHJpbnRrIChLRVJOX0RFQlVHICIlcygpOiAweCUuOHggPC0gMHglLjh4XG4iLCBfX2Z1bmNfXywgb2Zmc2V0LCAqZGF0YSk7CiAjZW5kaWYKIH0KIApAQCAtMzM3LDcgKzMzNyw3IEBACiAgICBfX3UzMiBzdGF0dXM7CiAKICNpZmRlZiBMQVJUX0RFQlVHCi0gICBwcmludGsgKEtFUk5fREVCVUcgIiVzKCk6IDB4JS44eFxuIixfX0ZVTkNUSU9OX18sb2Zmc2V0KTsKKyAgIHByaW50ayAoS0VSTl9ERUJVRyAiJXMoKTogMHglLjh4XG4iLCBfX2Z1bmNfXywgb2Zmc2V0KTsKICNlbmRpZgogCiAgICAvKiBlcmFzZSBhbmQgY29uZmlybSAqLwpAQCAtMzcxLDcgKzM3MSw3IEBACiAgICBpbnQgaSxmaXJzdDsKIAogI2lmZGVmIExBUlRfREVCVUcKLSAgIHByaW50ayAoS0VSTl9ERUJVRyAiJXMoYWRkciA9IDB4JS44eCwgbGVuID0gJWQpXG4iLF9fRlVOQ1RJT05fXyxpbnN0ci0+YWRkcixpbnN0ci0+bGVuKTsKKyAgIHByaW50ayAoS0VSTl9ERUJVRyAiJXMoYWRkciA9IDB4JS44eCwgbGVuID0gJWQpXG4iLCBfX2Z1bmNfXywgaW5zdHItPmFkZHIsIGluc3RyLT5sZW4pOwogI2VuZGlmCiAKICAgIC8qIHNhbml0eSBjaGVja3MgKi8KQEAgLTQ0Miw3ICs0NDIsNyBAQAogc3RhdGljIGludCBmbGFzaF9yZWFkIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCxsb2ZmX3QgZnJvbSxzaXplX3QgbGVuLHNpemVfdCAqcmV0bGVuLHVfY2hhciAqYnVmKQogewogI2lmZGVmIExBUlRfREVCVUcKLSAgIHByaW50ayAoS0VSTl9ERUJVRyAiJXMoZnJvbSA9IDB4JS44eCwgbGVuID0gJWQpXG4iLF9fRlVOQ1RJT05fXywoX191MzIpIGZyb20sbGVuKTsKKyAgIHByaW50ayAoS0VSTl9ERUJVRyAiJXMoZnJvbSA9IDB4JS44eCwgbGVuID0gJWQpXG4iLCBfX2Z1bmNfXywgKF9fdTMyKWZyb20sIGxlbik7CiAjZW5kaWYKIAogICAgLyogc2FuaXR5IGNoZWNrcyAqLwpAQCAtNDg4LDcgKzQ4OCw3IEBACiAgICBfX3UzMiBzdGF0dXM7CiAKICNpZmRlZiBMQVJUX0RFQlVHCi0gICBwcmludGsgKEtFUk5fREVCVUcgIiVzKCk6IDB4JS44eCA8LSAweCUuOHhcbiIsX19GVU5DVElPTl9fLG9mZnNldCx4KTsKKyAgIHByaW50ayAoS0VSTl9ERUJVRyAiJXMoKTogMHglLjh4IDwtIDB4JS44eFxuIiwgX19mdW5jX18sIG9mZnNldCwgeCk7CiAjZW5kaWYKIAogICAgLyogc2V0dXAgd3JpdGluZyAqLwpAQCAtNTI0LDcgKzUyNCw3IEBACiAgICBpbnQgaSxuOwogCiAjaWZkZWYgTEFSVF9ERUJVRwotICAgcHJpbnRrIChLRVJOX0RFQlVHICIlcyh0byA9IDB4JS44eCwgbGVuID0gJWQpXG4iLF9fRlVOQ1RJT05fXywoX191MzIpIHRvLGxlbik7CisgICBwcmludGsgKEtFUk5fREVCVUcgIiVzKHRvID0gMHglLjh4LCBsZW4gPSAlZClcbiIsIF9fZnVuY19fLCAoX191MzIpdG8sIGxlbik7CiAjZW5kaWYKIAogICAgKnJldGxlbiA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL20yNXA4MC5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tMjVwODAuYwppbmRleCA5OGRmNWJjLi4yNWVmZDMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL20yNXA4MC5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbTI1cDgwLmMKQEAgLTMzLDcgKzMzLDcgQEAKIC8qIEZsYXNoIG9wY29kZXMuICovCiAjZGVmaW5lCU9QQ09ERV9XUkVOCQkweDA2CS8qIFdyaXRlIGVuYWJsZSAqLwogI2RlZmluZQlPUENPREVfUkRTUgkJMHgwNQkvKiBSZWFkIHN0YXR1cyByZWdpc3RlciAqLwotI2RlZmluZQlPUENPREVfUkVBRAkJMHgwMwkvKiBSZWFkIGRhdGEgYnl0ZXMgKGxvdyBmcmVxdWVuY3kpICovCisjZGVmaW5lCU9QQ09ERV9OT1JNX1JFQUQJMHgwMwkvKiBSZWFkIGRhdGEgYnl0ZXMgKGxvdyBmcmVxdWVuY3kpICovCiAjZGVmaW5lCU9QQ09ERV9GQVNUX1JFQUQJMHgwYgkvKiBSZWFkIGRhdGEgYnl0ZXMgKGhpZ2ggZnJlcXVlbmN5KSAqLwogI2RlZmluZQlPUENPREVfUFAJCTB4MDIJLyogUGFnZSBwcm9ncmFtICh1cCB0byAyNTYgYnl0ZXMpICovCiAjZGVmaW5lCU9QQ09ERV9CRV80SyAJCTB4MjAJLyogRXJhc2UgNEtpQiBibG9jayAqLwpAQCAtNTIsNyArNTIsMTUgQEAKIAogLyogRGVmaW5lIG1heCB0aW1lcyB0byBjaGVjayBzdGF0dXMgcmVnaXN0ZXIgYmVmb3JlIHdlIGdpdmUgdXAuICovCiAjZGVmaW5lCU1BWF9SRUFEWV9XQUlUX0NPVU5UCTEwMDAwMAorI2RlZmluZQlDTURfU0laRQkJNAogCisjaWZkZWYgQ09ORklHX00yNVBYWF9VU0VfRkFTVF9SRUFECisjZGVmaW5lIE9QQ09ERV9SRUFEIAlPUENPREVfRkFTVF9SRUFECisjZGVmaW5lIEZBU1RfUkVBRF9EVU1NWV9CWVRFIDEKKyNlbHNlCisjZGVmaW5lIE9QQ09ERV9SRUFEIAlPUENPREVfTk9STV9SRUFECisjZGVmaW5lIEZBU1RfUkVBRF9EVU1NWV9CWVRFIDAKKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCiAjZGVmaW5lCW10ZF9oYXNfcGFydGl0aW9ucygpCSgxKQpAQCAtNjgsNyArNzYsNyBAQAogCXN0cnVjdCBtdGRfaW5mbwkJbXRkOwogCXVuc2lnbmVkCQlwYXJ0aXRpb25lZDoxOwogCXU4CQkJZXJhc2Vfb3Bjb2RlOwotCXU4CQkJY29tbWFuZFs0XTsKKwl1OAkJCWNvbW1hbmRbQ01EX1NJWkUgKyBGQVNUX1JFQURfRFVNTVlfQllURV07CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBtMjVwICptdGRfdG9fbTI1cChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKQEAgLTE1MSw3ICsxNTksNyBAQAogc3RhdGljIGludCBlcmFzZV9zZWN0b3Ioc3RydWN0IG0yNXAgKmZsYXNoLCB1MzIgb2Zmc2V0KQogewogCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICIlczogJXMgJWRLaUIgYXQgMHglMDh4XG4iLAotCQkJZmxhc2gtPnNwaS0+ZGV2LmJ1c19pZCwgX19GVU5DVElPTl9fLAorCQkJZmxhc2gtPnNwaS0+ZGV2LmJ1c19pZCwgX19mdW5jX18sCiAJCQlmbGFzaC0+bXRkLmVyYXNlc2l6ZSAvIDEwMjQsIG9mZnNldCk7CiAKIAkvKiBXYWl0IHVudGlsIGZpbmlzaGVkIHByZXZpb3VzIHdyaXRlIGNvbW1hbmQuICovCkBAIC0xNjcsNyArMTc1LDcgQEAKIAlmbGFzaC0+Y29tbWFuZFsyXSA9IG9mZnNldCA+PiA4OwogCWZsYXNoLT5jb21tYW5kWzNdID0gb2Zmc2V0OwogCi0Jc3BpX3dyaXRlKGZsYXNoLT5zcGksIGZsYXNoLT5jb21tYW5kLCBzaXplb2YoZmxhc2gtPmNvbW1hbmQpKTsKKwlzcGlfd3JpdGUoZmxhc2gtPnNwaSwgZmxhc2gtPmNvbW1hbmQsIENNRF9TSVpFKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTg4LDcgKzE5Niw3IEBACiAJdTMyIGFkZHIsbGVuOwogCiAJREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgIiVzOiAlcyAlcyAweCUwOHgsIGxlbiAlZFxuIiwKLQkJCWZsYXNoLT5zcGktPmRldi5idXNfaWQsIF9fRlVOQ1RJT05fXywgImF0IiwKKwkJCWZsYXNoLT5zcGktPmRldi5idXNfaWQsIF9fZnVuY19fLCAiYXQiLAogCQkJKHUzMilpbnN0ci0+YWRkciwgaW5zdHItPmxlbik7CiAKIAkvKiBzYW5pdHkgY2hlY2tzICovCkBAIC0yNDAsNyArMjQ4LDcgQEAKIAlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbTsKIAogCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogJXMgJXMgMHglMDh4LCBsZW4gJXpkXG4iLAotCQkJZmxhc2gtPnNwaS0+ZGV2LmJ1c19pZCwgX19GVU5DVElPTl9fLCAiZnJvbSIsCisJCQlmbGFzaC0+c3BpLT5kZXYuYnVzX2lkLCBfX2Z1bmNfXywgImZyb20iLAogCQkJKHUzMilmcm9tLCBsZW4pOwogCiAJLyogc2FuaXR5IGNoZWNrcyAqLwpAQCAtMjUzLDggKzI2MSwxMiBAQAogCXNwaV9tZXNzYWdlX2luaXQoJm0pOwogCW1lbXNldCh0LCAwLCAoc2l6ZW9mIHQpKTsKIAorCS8qIE5PVEU6CisJICogT1BDT0RFX0ZBU1RfUkVBRCAoaWYgYXZhaWxhYmxlKSBpcyBmYXN0ZXIuCisJICogU2hvdWxkIGFkZCAxIGJ5dGUgRFVNTVlfQllURS4KKwkgKi8KIAl0WzBdLnR4X2J1ZiA9IGZsYXNoLT5jb21tYW5kOwotCXRbMF0ubGVuID0gc2l6ZW9mKGZsYXNoLT5jb21tYW5kKTsKKwl0WzBdLmxlbiA9IENNRF9TSVpFICsgRkFTVF9SRUFEX0RVTU1ZX0JZVEU7CiAJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnRbMF0sICZtKTsKIAogCXRbMV0ucnhfYnVmID0gYnVmOwpAQCAtMjg3LDcgKzI5OSw3IEBACiAKIAlzcGlfc3luYyhmbGFzaC0+c3BpLCAmbSk7CiAKLQkqcmV0bGVuID0gbS5hY3R1YWxfbGVuZ3RoIC0gc2l6ZW9mKGZsYXNoLT5jb21tYW5kKTsKKwkqcmV0bGVuID0gbS5hY3R1YWxfbGVuZ3RoIC0gQ01EX1NJWkUgLSBGQVNUX1JFQURfRFVNTVlfQllURTsKIAogCW11dGV4X3VubG9jaygmZmxhc2gtPmxvY2spOwogCkBAIC0zMDgsNyArMzIwLDcgQEAKIAlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbTsKIAogCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogJXMgJXMgMHglMDh4LCBsZW4gJXpkXG4iLAotCQkJZmxhc2gtPnNwaS0+ZGV2LmJ1c19pZCwgX19GVU5DVElPTl9fLCAidG8iLAorCQkJZmxhc2gtPnNwaS0+ZGV2LmJ1c19pZCwgX19mdW5jX18sICJ0byIsCiAJCQkodTMyKXRvLCBsZW4pOwogCiAJaWYgKHJldGxlbikKQEAgLTMyNSw3ICszMzcsNyBAQAogCW1lbXNldCh0LCAwLCAoc2l6ZW9mIHQpKTsKIAogCXRbMF0udHhfYnVmID0gZmxhc2gtPmNvbW1hbmQ7Ci0JdFswXS5sZW4gPSBzaXplb2YoZmxhc2gtPmNvbW1hbmQpOworCXRbMF0ubGVuID0gQ01EX1NJWkU7CiAJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnRbMF0sICZtKTsKIAogCXRbMV0udHhfYnVmID0gYnVmOwpAQCAtMzU0LDcgKzM2Niw3IEBACiAKIAkJc3BpX3N5bmMoZmxhc2gtPnNwaSwgJm0pOwogCi0JCSpyZXRsZW4gPSBtLmFjdHVhbF9sZW5ndGggLSBzaXplb2YoZmxhc2gtPmNvbW1hbmQpOworCQkqcmV0bGVuID0gbS5hY3R1YWxfbGVuZ3RoIC0gQ01EX1NJWkU7CiAJfSBlbHNlIHsKIAkJdTMyIGk7CiAKQEAgLTM2NCw3ICszNzYsNyBAQAogCQl0WzFdLmxlbiA9IHBhZ2Vfc2l6ZTsKIAkJc3BpX3N5bmMoZmxhc2gtPnNwaSwgJm0pOwogCi0JCSpyZXRsZW4gPSBtLmFjdHVhbF9sZW5ndGggLSBzaXplb2YoZmxhc2gtPmNvbW1hbmQpOworCQkqcmV0bGVuID0gbS5hY3R1YWxfbGVuZ3RoIC0gQ01EX1NJWkU7CiAKIAkJLyogd3JpdGUgZXZlcnl0aGluZyBpbiBQQUdFU0laRSBjaHVua3MgKi8KIAkJZm9yIChpID0gcGFnZV9zaXplOyBpIDwgbGVuOyBpICs9IHBhZ2Vfc2l6ZSkgewpAQCAtMzg3LDggKzM5OSw3IEBACiAJCQlzcGlfc3luYyhmbGFzaC0+c3BpLCAmbSk7CiAKIAkJCWlmIChyZXRsZW4pCi0JCQkJKnJldGxlbiArPSBtLmFjdHVhbF9sZW5ndGgKLQkJCQkJLSBzaXplb2YoZmxhc2gtPmNvbW1hbmQpOworCQkJCSpyZXRsZW4gKz0gbS5hY3R1YWxfbGVuZ3RoIC0gQ01EX1NJWkU7CiAJCX0KIAl9CiAKQEAgLTQzNSw2ICs0NDYsNyBAQAogCXsgImF0MjVmczA0MCIsICAweDFmNjYwNCwgNjQgKiAxMDI0LCA4LCBTRUNUXzRLLCB9LAogCiAJeyAiYXQyNWRmMDQxYSIsIDB4MWY0NDAxLCA2NCAqIDEwMjQsIDgsIFNFQ1RfNEssIH0sCisJeyAiYXQyNWRmNjQxIiwgIDB4MWY0ODAwLCA2NCAqIDEwMjQsIDEyOCwgU0VDVF80SywgfSwKIAogCXsgImF0MjZmMDA0IiwgICAweDFmMDQwMCwgNjQgKiAxMDI0LCA4LCBTRUNUXzRLLCB9LAogCXsgImF0MjZkZjA4MWEiLCAweDFmNDUwMSwgNjQgKiAxMDI0LCAxNiwgU0VDVF80SywgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkcmFtLmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL210ZHJhbS5jCmluZGV4IGU0MjdjODIuLmJmNDg1ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkcmFtLmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tdGRyYW0uYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvY29tcGF0bWFjLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGRyYW0uaD4KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgdG90YWxfc2l6ZSA9IENPTkZJR19NVERSQU1fVE9UQUxfU0laRTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGVyYXNlX3NpemUgPSBDT05GSUdfTVREUkFNX0VSQVNFX1NJWkU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL3BocmFtLmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL3BocmFtLmMKaW5kZXggMTgwMjk4Yi4uNWY5NjAxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9waHJhbS5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvcGhyYW0uYwpAQCAtMjgyLDcgKzI4Miw3IEBACiB9CiAKIG1vZHVsZV9wYXJhbV9jYWxsKHBocmFtLCBwaHJhbV9zZXR1cCwgTlVMTCwgTlVMTCwgMDAwKTsKLU1PRFVMRV9QQVJNX0RFU0MocGhyYW0sIk1lbW9yeSByZWdpb24gdG8gbWFwLiBcIm1hcD08bmFtZT4sPHN0YXJ0Piw8bGVuZ3RoPlwiIik7CitNT0RVTEVfUEFSTV9ERVNDKHBocmFtLCAiTWVtb3J5IHJlZ2lvbiB0byBtYXAuIFwicGhyYW09PG5hbWU+LDxzdGFydD4sPGxlbmd0aD5cIiIpOwogCiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfcGhyYW0odm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2Z0bC5jIGIvZHJpdmVycy9tdGQvZnRsLmMKaW5kZXggYzgxNWQwZi4uNGE3OWIxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZnRsLmMKKysrIGIvZHJpdmVycy9tdGQvZnRsLmMKQEAgLTEzNiw4ICsxMzYsNiBAQAogI2VuZGlmCiB9IHBhcnRpdGlvbl90OwogCi12b2lkIGZ0bF9mcmVlcGFydChwYXJ0aXRpb25fdCAqcGFydCk7Ci0KIC8qIFBhcnRpdGlvbiBzdGF0ZSBmbGFncyAqLwogI2RlZmluZSBGVExfRk9STUFUVEVECTB4MDEKIApAQCAtMTAxNCw3ICsxMDEyLDcgQEAKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKLXZvaWQgZnRsX2ZyZWVwYXJ0KHBhcnRpdGlvbl90ICpwYXJ0KQorc3RhdGljIHZvaWQgZnRsX2ZyZWVwYXJ0KHBhcnRpdGlvbl90ICpwYXJ0KQogewogCXZmcmVlKHBhcnQtPlZpcnR1YWxCbG9ja01hcCk7CiAJcGFydC0+VmlydHVhbEJsb2NrTWFwID0gTlVMTDsKQEAgLTEwNjksNyArMTA2Nyw3IEBACiAJa2ZyZWUoZGV2KTsKIH0KIAotc3RydWN0IG10ZF9ibGt0cmFuc19vcHMgZnRsX3RyID0geworc3RhdGljIHN0cnVjdCBtdGRfYmxrdHJhbnNfb3BzIGZ0bF90ciA9IHsKIAkubmFtZQkJPSAiZnRsIiwKIAkubWFqb3IJCT0gRlRMX01BSk9SLAogCS5wYXJ0X2JpdHMJPSBQQVJUX0JJVFMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9pbmZ0bG1vdW50LmMgYi9kcml2ZXJzL210ZC9pbmZ0bG1vdW50LmMKaW5kZXggYjg5MTdiZS4uYzU1MWQyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvaW5mdGxtb3VudC5jCisrKyBiL2RyaXZlcnMvbXRkL2luZnRsbW91bnQuYwpAQCAtNDEsMTEgKzQxLDYgQEAKIAogY2hhciBpbmZ0bG1vdW50cmV2W109IiRSZXZpc2lvbjogMS4xOCAkIjsKIAotZXh0ZXJuIGludCBpbmZ0bF9yZWFkX29vYihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mZnMsIHNpemVfdCBsZW4sCi0JCQkgIHNpemVfdCAqcmV0bGVuLCB1aW50OF90ICpidWYpOwotZXh0ZXJuIGludCBpbmZ0bF93cml0ZV9vb2Ioc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZmZzLCBzaXplX3QgbGVuLAotCQkJICAgc2l6ZV90ICpyZXRsZW4sIHVpbnQ4X3QgKmJ1Zik7Ci0KIC8qCiAgKiBmaW5kX2Jvb3RfcmVjb3JkOiBGaW5kIHRoZSBJTkZUTCBNZWRpYSBIZWFkZXIgYW5kIGl0cyBTcGFyZSBjb3B5IHdoaWNoCiAgKgljb250YWlucyB0aGUgdmFyaW91cyBkZXZpY2UgaW5mb3JtYXRpb24gb2YgdGhlIElORlRMIHBhcnRpdGlvbiBhbmQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZyBiL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZwppbmRleCAxMmMyNTM2Li4xYmQ2OWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnCkBAIC0yMSw2ICsyMSw5IEBACiAJICBwYXJ0aWN1bGFyIGJvYXJkIGFzIHdlbGwgYXMgdGhlIGJ1cyB3aWR0aCwgZWl0aGVyIHN0YXRpY2FsbHkKIAkgIHdpdGggY29uZmlnIG9wdGlvbnMgb3IgYXQgcnVuLXRpbWUuCiAKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBoeXNtYXAuCisKIGNvbmZpZyBNVERfUEhZU01BUF9TVEFSVAogCWhleCAiUGh5c2ljYWwgc3RhcnQgYWRkcmVzcyBvZiBmbGFzaCBtYXBwaW5nIgogCWRlcGVuZHMgb24gTVREX1BIWVNNQVAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvYmFzdC1mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9iYXN0LWZsYXNoLmMKaW5kZXggZmMzYjI2Ny4uMWY0OTIwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9iYXN0LWZsYXNoLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9iYXN0LWZsYXNoLmMKQEAgLTEzNyw3ICsxMzcsNyBAQAogCWlmIChpbmZvLT5tYXAuc2l6ZSA+IEFSRUFfTUFYU0laRSkKIAkJaW5mby0+bWFwLnNpemUgPSBBUkVBX01BWFNJWkU7CiAKLQlwcl9kZWJ1ZygiJXM6IGFyZWEgJTA4bHgsIHNpemUgJWxkXG4iLCBfX0ZVTkNUSU9OX18sCisJcHJfZGVidWcoIiVzOiBhcmVhICUwOGx4LCBzaXplICVsZFxuIiwgX19mdW5jX18sCiAJCSBpbmZvLT5tYXAucGh5cywgaW5mby0+bWFwLnNpemUpOwogCiAJaW5mby0+YXJlYSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCBpbmZvLT5tYXAuc2l6ZSwKQEAgLTE0OSw3ICsxNDksNyBAQAogCX0KIAogCWluZm8tPm1hcC52aXJ0ID0gaW9yZW1hcChyZXMtPnN0YXJ0LCBpbmZvLT5tYXAuc2l6ZSk7Ci0JcHJfZGVidWcoIiVzOiB2aXJ0IGF0ICUwOHhcbiIsIF9fRlVOQ1RJT05fXywgKGludClpbmZvLT5tYXAudmlydCk7CisJcHJfZGVidWcoIiVzOiB2aXJ0IGF0ICUwOHhcbiIsIF9fZnVuY19fLCAoaW50KWluZm8tPm1hcC52aXJ0KTsKIAogCWlmIChpbmZvLT5tYXAudmlydCA9PSAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggImZhaWxlZCB0byBpb3JlbWFwKCkgcmVnaW9uXG4iKTsKQEAgLTIyMywzICsyMjMsNCBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJCQVNUIE1URCBNYXAgZHJpdmVyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmJhc3Qtbm9yIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2NrODA0eHJvbS5jIGIvZHJpdmVycy9tdGQvbWFwcy9jazgwNHhyb20uYwppbmRleCA2ODhlZjQ5Li41OWQ4ZmI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2NrODA0eHJvbS5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvY2s4MDR4cm9tLmMKQEAgLTI4LDYgKzI4LDkgQEAKIAogI2RlZmluZSBST01fUFJPQkVfU1RFUF9TSVpFICg2NCoxMDI0KQogCisjZGVmaW5lIERFVl9DSzgwNCAxCisjZGVmaW5lIERFVl9NQ1A1NSAyCisKIHN0cnVjdCBjazgwNHhyb21fd2luZG93IHsKIAl2b2lkIF9faW9tZW0gKnZpcnQ7CiAJdW5zaWduZWQgbG9uZyBwaHlzOwpAQCAtNDUsOCArNDgsOSBAQAogCWNoYXIgbWFwX25hbWVbc2l6ZW9mKE1PRF9OQU1FKSArIDIgKyBBRERSRVNTX05BTUVfTEVOXTsKIH07CiAKLQotLyogVGhlIDIgYml0cyBjb250cm9sbGluZyB0aGUgd2luZG93IHNpemUgYXJlIG9mdGVuIHNldCB0byBhbGxvdyByZWFkaW5nCisvKgorICogVGhlIGZvbGxvd2luZyBhcHBsaWVzIHRvIGNrODA0IG9ubHk6CisgKiBUaGUgMiBiaXRzIGNvbnRyb2xsaW5nIHRoZSB3aW5kb3cgc2l6ZSBhcmUgb2Z0ZW4gc2V0IHRvIGFsbG93IHJlYWRpbmcKICAqIHRoZSBCSU9TLCBidXQgdG9vIHNtYWxsIHRvIGFsbG93IHdyaXRpbmcsIHNpbmNlIHRoZSBsb2NrIHJlZ2lzdGVycyBhcmUKICAqIDRNaUIgbG93ZXIgaW4gdGhlIGFkZHJlc3Mgc3BhY2UgdGhhbiB0aGUgZGF0YS4KICAqCkBAIC01OCwxMCArNjIsMTcgQEAKICAqIElmIG9ubHkgdGhlIDcgQml0IGlzIHNldCwgaXQgaXMgYSA0TWlCIHdpbmRvdy4gIE90aGVyd2lzZSwgYQogICogNjRLaUIgd2luZG93LgogICoKKyAqIFRoZSBmb2xsb3dpbmcgYXBwbGllcyB0byBtY3A1NSBvbmx5OgorICogVGhlIDE1IGJpdHMgY29udHJvbGxpbmcgdGhlIHdpbmRvdyBzaXplIGFyZSBkaXN0cmlidXRlZCBhcyBmb2xsb3dzOiAKKyAqIGJ5dGUgQDB4ODg6IGJpdCAwLi43CisgKiBieXRlIEAweDhjOiBiaXQgOC4uMTUKKyAqIHdvcmQgQDB4OTA6IGJpdCAxNi4uMzAKKyAqIElmIGFsbCBiaXRzIGFyZSBlbmFibGVkLCB3ZSBoYXZlIGEgMTY/IE1pQiB3aW5kb3cKKyAqIFBsZWFzZSBzZXQgd2luX3NpemVfYml0cyB0byAweDdmZmZmZmZmIGlmIHlvdSBhY3R1YWxseSB3YW50IHRvIGRvIHNvbWV0aGluZwogICovCiBzdGF0aWMgdWludCB3aW5fc2l6ZV9iaXRzID0gMDsKIG1vZHVsZV9wYXJhbSh3aW5fc2l6ZV9iaXRzLCB1aW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0Mod2luX3NpemVfYml0cywgIlJPTSB3aW5kb3cgc2l6ZSBiaXRzIG92ZXJyaWRlIGZvciAweDg4IGJ5dGUsIG5vcm1hbGx5IHNldCBieSBCSU9TLiIpOworTU9EVUxFX1BBUk1fREVTQyh3aW5fc2l6ZV9iaXRzLCAiUk9NIHdpbmRvdyBzaXplIGJpdHMgb3ZlcnJpZGUsIG5vcm1hbGx5IHNldCBieSBCSU9TLiIpOwogCiBzdGF0aWMgc3RydWN0IGNrODA0eHJvbV93aW5kb3cgY2s4MDR4cm9tX3dpbmRvdyA9IHsKIAkubWFwcyA9IExJU1RfSEVBRF9JTklUKGNrODA0eHJvbV93aW5kb3cubWFwcyksCkBAIC0xMDIsMTAgKzExMywxMSBAQAogCiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGNrODA0eHJvbV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKKwkJCQkJIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CiAJc3RhdGljIGNoYXIgKnJvbV9wcm9iZV90eXBlc1tdID0geyAiY2ZpX3Byb2JlIiwgImplZGVjX3Byb2JlIiwgTlVMTCB9OwogCXU4IGJ5dGU7CisJdTE2IHdvcmQ7CiAJc3RydWN0IGNrODA0eHJvbV93aW5kb3cgKndpbmRvdyA9ICZjazgwNHhyb21fd2luZG93OwogCXN0cnVjdCBjazgwNHhyb21fbWFwX2luZm8gKm1hcCA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBtYXBfdG9wOwpAQCAtMTEzLDI2ICsxMjUsNDIgQEAKIAkvKiBSZW1lbWJlciB0aGUgcGNpIGRldiBJIGZpbmQgdGhlIHdpbmRvdyBpbiAqLwogCXdpbmRvdy0+cGRldiA9IHBjaV9kZXZfZ2V0KHBkZXYpOwogCi0JLyogRW5hYmxlIHRoZSBzZWxlY3RlZCByb20gd2luZG93LiAgVGhpcyBpcyBvZnRlbiBpbmNvcnJlY3RseQotCSAqIHNldCB1cCBieSB0aGUgQklPUywgYW5kIHRoZSA0TWlCIG9mZnNldCBmb3IgdGhlIGxvY2sgcmVnaXN0ZXJzCi0JICogcmVxdWlyZXMgdGhlIGZ1bGwgNU1pQiBvZiB3aW5kb3cgc3BhY2UuCi0JICoKLQkgKiBUaGlzICd3cml0ZSwgdGhlbiByZWFkJyBhcHByb2FjaCBsZWF2ZXMgdGhlIGJpdHMgZm9yCi0JICogb3RoZXIgdXNlcyBvZiB0aGUgaGFyZHdhcmUgaW5mby4KLQkgKi8KLSAgICAgICAgcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg4OCwgJmJ5dGUpOwotICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg4OCwgYnl0ZSB8IHdpbl9zaXplX2JpdHMgKTsKKwlzd2l0Y2ggKGVudC0+ZHJpdmVyX2RhdGEpIHsKKwljYXNlIERFVl9DSzgwNDoKKwkJLyogRW5hYmxlIHRoZSBzZWxlY3RlZCByb20gd2luZG93LiAgVGhpcyBpcyBvZnRlbiBpbmNvcnJlY3RseQorCQkgKiBzZXQgdXAgYnkgdGhlIEJJT1MsIGFuZCB0aGUgNE1pQiBvZmZzZXQgZm9yIHRoZSBsb2NrIHJlZ2lzdGVycworCQkgKiByZXF1aXJlcyB0aGUgZnVsbCA1TWlCIG9mIHdpbmRvdyBzcGFjZS4KKwkJICoKKwkJICogVGhpcyAnd3JpdGUsIHRoZW4gcmVhZCcgYXBwcm9hY2ggbGVhdmVzIHRoZSBiaXRzIGZvcgorCQkgKiBvdGhlciB1c2VzIG9mIHRoZSBoYXJkd2FyZSBpbmZvLgorCQkgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg4OCwgJmJ5dGUpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg4OCwgYnl0ZSB8IHdpbl9zaXplX2JpdHMgKTsKIAorCQkvKiBBc3N1bWUgdGhlIHJvbSB3aW5kb3cgaXMgcHJvcGVybHkgc2V0dXAsIGFuZCBmaW5kIGl0J3Mgc2l6ZSAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDg4LCAmYnl0ZSk7CiAKLQkvKiBBc3N1bWUgdGhlIHJvbSB3aW5kb3cgaXMgcHJvcGVybHkgc2V0dXAsIGFuZCBmaW5kIGl0J3Mgc2l6ZSAqLwotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4ODgsICZieXRlKTsKKwkJaWYgKChieXRlICYgKCgxPDw3KXwoMTw8NikpKSA9PSAoKDE8PDcpfCgxPDw2KSkpCisJCQl3aW5kb3ctPnBoeXMgPSAweGZmYjAwMDAwOyAvKiA1TWlCICovCisJCWVsc2UgaWYgKChieXRlICYgKDE8PDcpKSA9PSAoMTw8NykpCisJCQl3aW5kb3ctPnBoeXMgPSAweGZmYzAwMDAwOyAvKiA0TWlCICovCisJCWVsc2UKKwkJCXdpbmRvdy0+cGh5cyA9IDB4ZmZmZjAwMDA7IC8qIDY0S2lCICovCisJCWJyZWFrOwogCi0JaWYgKChieXRlICYgKCgxPDw3KXwoMTw8NikpKSA9PSAoKDE8PDcpfCgxPDw2KSkpCi0JCXdpbmRvdy0+cGh5cyA9IDB4ZmZiMDAwMDA7IC8qIDVNaUIgKi8KLQllbHNlIGlmICgoYnl0ZSAmICgxPDw3KSkgPT0gKDE8PDcpKQotCQl3aW5kb3ctPnBoeXMgPSAweGZmYzAwMDAwOyAvKiA0TWlCICovCi0JZWxzZQotCQl3aW5kb3ctPnBoeXMgPSAweGZmZmYwMDAwOyAvKiA2NEtpQiAqLworCWNhc2UgREVWX01DUDU1OgorCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDg4LCAmYnl0ZSk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDg4LCBieXRlIHwgKHdpbl9zaXplX2JpdHMgJiAweGZmKSk7CisKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg4YywgJmJ5dGUpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg4YywgYnl0ZSB8ICgod2luX3NpemVfYml0cyAmIDB4ZmYwMCkgPj4gOCkpOworCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIDB4OTAsICZ3b3JkKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIDB4OTAsIHdvcmQgfCAoKHdpbl9zaXplX2JpdHMgJiAweDdmZmYwMDAwKSA+PiAxNikpOworCisJCXdpbmRvdy0+cGh5cyA9IDB4ZmYwMDAwMDA7IC8qIDE2TWlCLCBoYXJkY29kZWQgZm9yIG5vdyAqLworCQlicmVhazsKKwl9CiAKIAl3aW5kb3ctPnNpemUgPSAweGZmZmZmZmZmVUwgLSB3aW5kb3ctPnBoeXMgKyAxVUw7CiAKQEAgLTMwMyw4ICszMzEsMTUgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGNrODA0eHJvbV9wY2lfdGJsW10gPSB7Ci0JeyBQQ0lfVkVORE9SX0lEX05WSURJQSwgMHgwMDUxLAotICAgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LCAvKiBudmlkaWEgY2s4MDQgKi8KKwl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCAweDAwNTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIERFVl9DSzgwNCB9LAorCXsgUENJX1ZFTkRPUl9JRF9OVklESUEsIDB4MDM2MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgREVWX01DUDU1IH0sCisJeyBQQ0lfVkVORE9SX0lEX05WSURJQSwgMHgwMzYxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBERVZfTUNQNTUgfSwKKwl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCAweDAzNjIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIERFVl9NQ1A1NSB9LAorCXsgUENJX1ZFTkRPUl9JRF9OVklESUEsIDB4MDM2MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgREVWX01DUDU1IH0sCisJeyBQQ0lfVkVORE9SX0lEX05WSURJQSwgMHgwMzY0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBERVZfTUNQNTUgfSwKKwl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCAweDAzNjUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIERFVl9NQ1A1NSB9LAorCXsgUENJX1ZFTkRPUl9JRF9OVklESUEsIDB4MDM2NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgREVWX01DUDU1IH0sCisJeyBQQ0lfVkVORE9SX0lEX05WSURJQSwgMHgwMzY3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBERVZfTUNQNTUgfSwKIAl7IDAsIH0KIH07CiAKQEAgLTMzMiw3ICszNjcsNyBAQAogCQkJYnJlYWs7CiAJfQogCWlmIChwZGV2KSB7Ci0JCXJldFZhbCA9IGNrODA0eHJvbV9pbml0X29uZShwZGV2LCAmY2s4MDR4cm9tX3BjaV90YmxbMF0pOworCQlyZXRWYWwgPSBjazgwNHhyb21faW5pdF9vbmUocGRldiwgaWQpOwogCQlwY2lfZGV2X3B1dChwZGV2KTsKIAkJcmV0dXJuIHJldFZhbDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2ludGVncmF0b3ItZmxhc2guYyBiL2RyaXZlcnMvbXRkL21hcHMvaW50ZWdyYXRvci1mbGFzaC5jCmluZGV4IDY5NDZkODAuLjMyNWM4ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvaW50ZWdyYXRvci1mbGFzaC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvaW50ZWdyYXRvci1mbGFzaC5jCkBAIC0xOTAsNiArMTkwLDcgQEAKIAkucmVtb3ZlCQk9IGFybWZsYXNoX3JlbW92ZSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAiYXJtZmxhc2giLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAogfTsKIApAQCAtMjA5LDMgKzIxMCw0IEBACiBNT0RVTEVfQVVUSE9SKCJBUk0gTHRkIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkFSTSBJbnRlZ3JhdG9yIENGSSBtYXAgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmFybWZsYXNoIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2l4cDIwMDAuYyBiL2RyaXZlcnMvbXRkL21hcHMvaXhwMjAwMC5jCmluZGV4IGMyNjQ4OGEuLmM4Mzk2YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvaXhwMjAwMC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvaXhwMjAwMC5jCkBAIC0yNTMsNiArMjUzLDcgQEAKIAkucmVtb3ZlCQk9IGl4cDIwMDBfZmxhc2hfcmVtb3ZlLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJJWFAyMDAwLUZsYXNoIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKIH07CiAKQEAgLTI3MCw0ICsyNzEsNCBAQAogbW9kdWxlX2V4aXQoaXhwMjAwMF9mbGFzaF9leGl0KTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIkRlZXBhayBTYXhlbmEgPGRzYXhlbmFAcGxleGl0eS5uZXQ+Iik7Ci0KK01PRFVMRV9BTElBUygicGxhdGZvcm06SVhQMjAwMC1GbGFzaCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9peHA0eHguYyBiL2RyaXZlcnMvbXRkL21hcHMvaXhwNHh4LmMKaW5kZXggN2E4MjhlMy4uMDFmMTlhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9peHA0eHguYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2l4cDR4eC5jCkBAIC0yNzUsNiArMjc1LDcgQEAKIAkucmVtb3ZlCQk9IGl4cDR4eF9mbGFzaF9yZW1vdmUsCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gIklYUDRYWC1GbGFzaCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCiB9OwogCkBAIC0yOTUsMyArMjk2LDQgQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiTVREIG1hcCBkcml2ZXIgZm9yIEludGVsIElYUDR4eCBzeXN0ZW1zIik7CiBNT0RVTEVfQVVUSE9SKCJEZWVwYWsgU2F4ZW5hIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOklYUDRYWC1GbGFzaCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9vbWFwX25vci5jIGIvZHJpdmVycy9tdGQvbWFwcy9vbWFwX25vci5jCmluZGV4IGU4ZDlhZTUuLjI0MGIwZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvb21hcF9ub3IuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL29tYXBfbm9yLmMKQEAgLTcwLDcgKzcwLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IG9tYXBmbGFzaF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2luaXQgb21hcGZsYXNoX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJaW50IGVycjsKIAlzdHJ1Y3Qgb21hcGZsYXNoX2luZm8gKmluZm87CkBAIC0xMzAsNyArMTMwLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBvbWFwZmxhc2hfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZXhpdCBvbWFwZmxhc2hfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IG9tYXBmbGFzaF9pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKQEAgLTE1MiwxNiArMTUyLDE2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9tYXBmbGFzaF9kcml2ZXIgPSB7Ci0JLnByb2JlCT0gb21hcGZsYXNoX3Byb2JlLAotCS5yZW1vdmUJPSBfX2RldmV4aXRfcChvbWFwZmxhc2hfcmVtb3ZlKSwKKwkucmVtb3ZlCT0gX19leGl0X3Aob21hcGZsYXNoX3JlbW92ZSksCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUJPSAib21hcGZsYXNoIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IG9tYXBmbGFzaF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmb21hcGZsYXNoX2RyaXZlcik7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmb21hcGZsYXNoX2RyaXZlciwgb21hcGZsYXNoX3Byb2JlKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IG9tYXBmbGFzaF9leGl0KHZvaWQpCkBAIC0xNzQsNCArMTc0LDQgQEAKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJNVEQgTk9SIG1hcCBkcml2ZXIgZm9yIFRJIE9NQVAgYm9hcmRzIik7Ci0KK01PRFVMRV9BTElBUygicGxhdGZvcm06b21hcGZsYXNoIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL3BjbWNpYW10ZC5jIGIvZHJpdmVycy9tdGQvbWFwcy9wY21jaWFtdGQuYwppbmRleCBlYWViNTZhLi4xOTEyZDk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL3BjbWNpYW10ZC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvcGNtY2lhbXRkLmMKQEAgLTMzLDcgKzMzLDcgQEAKICN1bmRlZiBERUJVRwogI2RlZmluZSBERUJVRyhuLCBmb3JtYXQsIGFyZy4uLikgXAogCWlmIChuIDw9IGRlYnVnKSB7CSBcCi0JCXByaW50ayhLRVJOX0RFQlVHIF9fRklMRV9fICI6JXMoKTogIiBmb3JtYXQgIlxuIiwgX19GVU5DVElPTl9fICwgIyMgYXJnKTsgXAorCQlwcmludGsoS0VSTl9ERUJVRyBfX0ZJTEVfXyAiOiVzKCk6ICIgZm9ybWF0ICJcbiIsIF9fZnVuY19fICwgIyMgYXJnKTsgXAogCX0KIAogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvcGh5c21hcC5jIGIvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwLmMKaW5kZXggYmM0NjQ5YTEuLjE4MzI1NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvcGh5c21hcC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvcGh5c21hcC5jCkBAIC0yNDIsNiArMjQyLDcgQEAKIAkuc2h1dGRvd24JPSBwaHlzbWFwX2ZsYXNoX3NodXRkb3duLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJwaHlzbWFwLWZsYXNoIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKIH07CiAKQEAgLTMxOSwzICszMjAsMTAgQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIkRhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiR2VuZXJpYyBjb25maWd1cmFibGUgTVREIG1hcCBkcml2ZXIiKTsKKworLyogbGVnYWN5IHBsYXRmb3JtIGRyaXZlcnMgY2FuJ3QgaG90cGx1ZyBvciBjb2xkcGxnICovCisjaWZuZGVmIFBIWVNNQVBfQ09NUEFUCisvKiB3b3JrIHdpdGggaG90cGx1ZyBhbmQgY29sZHBsdWcgKi8KK01PRFVMRV9BTElBUygicGxhdGZvcm06cGh5c21hcC1mbGFzaCIpOworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvcGxhdC1yYW0uYyBiL2RyaXZlcnMvbXRkL21hcHMvcGxhdC1yYW0uYwppbmRleCA4OTRjMGIyLi5mMGIxMGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL3BsYXQtcmFtLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9wbGF0LXJhbS5jCkBAIC00Nyw2ICs0Nyw3IEBACiAJc3RydWN0IG10ZF9pbmZvCQkqbXRkOwogCXN0cnVjdCBtYXBfaW5mbwkJIG1hcDsKIAlzdHJ1Y3QgbXRkX3BhcnRpdGlvbgkqcGFydGl0aW9uczsKKwlib29sCQkJZnJlZV9wYXJ0aXRpb25zOwogCXN0cnVjdCByZXNvdXJjZQkJKmFyZWE7CiAJc3RydWN0IHBsYXRkYXRhX210ZF9yYW0JKnBkYXRhOwogfTsKQEAgLTk4LDcgKzk5LDggQEAKICNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKIAkJaWYgKGluZm8tPnBhcnRpdGlvbnMpIHsKIAkJCWRlbF9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGQpOwotCQkJa2ZyZWUoaW5mby0+cGFydGl0aW9ucyk7CisJCQlpZiAoaW5mby0+ZnJlZV9wYXJ0aXRpb25zKQorCQkJCWtmcmVlKGluZm8tPnBhcnRpdGlvbnMpOwogCQl9CiAjZW5kaWYKIAkJZGVsX210ZF9kZXZpY2UoaW5mby0+bXRkKTsKQEAgLTE3Niw3ICsxNzgsOCBAQAogCiAJaW5mby0+bWFwLnBoeXMgPSByZXMtPnN0YXJ0OwogCWluZm8tPm1hcC5zaXplID0gKHJlcy0+ZW5kIC0gcmVzLT5zdGFydCkgKyAxOwotCWluZm8tPm1hcC5uYW1lID0gcGRhdGEtPm1hcG5hbWUgIT0gTlVMTCA/IHBkYXRhLT5tYXBuYW1lIDogKGNoYXIgKilwZGV2LT5uYW1lOworCWluZm8tPm1hcC5uYW1lID0gcGRhdGEtPm1hcG5hbWUgIT0gTlVMTCA/CisJCQkoY2hhciAqKXBkYXRhLT5tYXBuYW1lIDogKGNoYXIgKilwZGV2LT5uYW1lOwogCWluZm8tPm1hcC5iYW5rd2lkdGggPSBwZGF0YS0+YmFua3dpZHRoOwogCiAJLyogcmVnaXN0ZXIgb3VyIHVzYWdlIG9mIHRoZSBtZW1vcnkgYXJlYSAqLwpAQCAtMjAzLDkgKzIwNiwxOSBAQAogCiAJZGV2X2RiZygmcGRldi0+ZGV2LCAiaW5pdGlhbGlzZWQgbWFwLCBwcm9iaW5nIGZvciBtdGRcbiIpOwogCi0JLyogcHJvYmUgZm9yIHRoZSByaWdodCBtdGQgbWFwIGRyaXZlciAqLworCS8qIHByb2JlIGZvciB0aGUgcmlnaHQgbXRkIG1hcCBkcml2ZXIKKwkgKiBzdXBwbGllZCBieSB0aGUgcGxhdGZvcm1fZGF0YSBzdHJ1Y3QgKi8KIAotCWluZm8tPm10ZCA9IGRvX21hcF9wcm9iZSgibWFwX3JhbSIgLCAmaW5mby0+bWFwKTsKKwlpZiAocGRhdGEtPm1hcF9wcm9iZXMgIT0gMCkgeworCQljb25zdCBjaGFyICoqbWFwX3Byb2JlcyA9IHBkYXRhLT5tYXBfcHJvYmVzOworCisJCWZvciAoIDsgIWluZm8tPm10ZCAmJiAqbWFwX3Byb2JlczsgbWFwX3Byb2JlcysrKQorCQkJaW5mby0+bXRkID0gZG9fbWFwX3Byb2JlKCptYXBfcHJvYmVzICwgJmluZm8tPm1hcCk7CisJfQorCS8qIGZhbGxiYWNrIHRvIG1hcF9yYW0gKi8KKwllbHNlCisJCWluZm8tPm10ZCA9IGRvX21hcF9wcm9iZSgibWFwX3JhbSIsICZpbmZvLT5tYXApOworCiAJaWYgKGluZm8tPm10ZCA9PSBOVUxMKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBwcm9iZSBmb3IgbWFwX3JhbVxuIik7CiAJCWVyciA9IC1FTk9NRU07CkBAIC0yMjAsMTkgKzIzMywyMSBAQAogCSAqIHRvIGFkZCB0aGlzIGRldmljZSB3aG9sZSAqLwogCiAjaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCi0JaWYgKHBkYXRhLT5ucl9wYXJ0aXRpb25zID4gMCkgewotCQljb25zdCBjaGFyICoqcHJvYmVzID0geyBOVUxMIH07Ci0KLQkJaWYgKHBkYXRhLT5wcm9iZXMpCi0JCQlwcm9iZXMgPSAoY29uc3QgY2hhciAqKilwZGF0YS0+cHJvYmVzOwotCi0JCWVyciA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKGluZm8tPm10ZCwgcHJvYmVzLAorCWlmICghcGRhdGEtPm5yX3BhcnRpdGlvbnMpIHsKKwkJLyogdHJ5IHRvIHByb2JlIHVzaW5nIHRoZSBzdXBwbGllZCBwcm9iZSB0eXBlICovCisJCWlmIChwZGF0YS0+cHJvYmVzKSB7CisJCQllcnIgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGQsIHBkYXRhLT5wcm9iZXMsCiAJCQkJCSAgICZpbmZvLT5wYXJ0aXRpb25zLCAwKTsKLQkJaWYgKGVyciA+IDApIHsKLQkJCWVyciA9IGFkZF9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGQsIGluZm8tPnBhcnRpdGlvbnMsCi0JCQkJCQkgZXJyKTsKKwkJCWluZm8tPmZyZWVfcGFydGl0aW9ucyA9IDE7CisJCQlpZiAoZXJyID4gMCkKKwkJCQllcnIgPSBhZGRfbXRkX3BhcnRpdGlvbnMoaW5mby0+bXRkLAorCQkJCQlpbmZvLT5wYXJ0aXRpb25zLCBlcnIpOwogCQl9CiAJfQorCS8qIHVzZSB0aGUgc3RhdGljIG1hcHBpbmcgKi8KKwllbHNlCisJCWVyciA9IGFkZF9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGQsIHBkYXRhLT5wYXJ0aXRpb25zLAorCQkJCXBkYXRhLT5ucl9wYXJ0aXRpb25zKTsKICNlbmRpZiAvKiBDT05GSUdfTVREX1BBUlRJVElPTlMgKi8KIAogCWlmIChhZGRfbXRkX2RldmljZShpbmZvLT5tdGQpKSB7CkBAIC0yNDAsNyArMjU1LDkgQEAKIAkJZXJyID0gLUVOT01FTTsKIAl9CiAKLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAicmVnaXN0ZXJlZCBtdGQgZGV2aWNlXG4iKTsKKwlpZiAoIWVycikKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgInJlZ2lzdGVyZWQgbXRkIGRldmljZVxuIik7CisKIAlyZXR1cm4gZXJyOwogCiAgZXhpdF9mcmVlOgpAQCAtMjUxLDYgKzI2OCw5IEBACiAKIC8qIGRldmljZSBkcml2ZXIgaW5mbyAqLwogCisvKiB3b3JrIHdpdGggaG90cGx1ZyBhbmQgY29sZHBsdWcgKi8KK01PRFVMRV9BTElBUygicGxhdGZvcm06bXRkLXJhbSIpOworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwbGF0cmFtX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gcGxhdHJhbV9wcm9iZSwKIAkucmVtb3ZlCQk9IHBsYXRyYW1fcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9wbWNtc3AtZmxhc2guYyBiL2RyaXZlcnMvbXRkL21hcHMvcG1jbXNwLWZsYXNoLmMKaW5kZXggMDJiZGU4Yy4uZjQzYmEyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9wbWNtc3AtZmxhc2guYworKysgYi9kcml2ZXJzL210ZC9tYXBzL3BtY21zcC1mbGFzaC5jCkBAIC00Niw3ICs0Niw3IEBACiBzdGF0aWMgc3RydWN0IG1hcF9pbmZvICptc3BfbWFwczsKIHN0YXRpYyBpbnQgZmNudDsKIAotI2RlZmluZSBERUJVR19NQVJLRVIgcHJpbnRrKEtFUk5fTk9USUNFICIlc1slZF1cbiIsX19GVU5DVElPTl9fLF9fTElORV9fKQorI2RlZmluZSBERUJVR19NQVJLRVIgcHJpbnRrKEtFUk5fTk9USUNFICIlc1slZF1cbiIsIF9fZnVuY19fLCBfX0xJTkVfXykKIAogaW50IF9faW5pdCBpbml0X21zcF9mbGFzaCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9zYTExMDAtZmxhc2guYyBiL2RyaXZlcnMvbXRkL21hcHMvc2ExMTAwLWZsYXNoLmMKaW5kZXggZjkwNGU2Yi4uYzdkNWE1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9zYTExMDAtZmxhc2guYworKysgYi9kcml2ZXJzL210ZC9tYXBzL3NhMTEwMC1mbGFzaC5jCkBAIC00NTYsNiArNDU2LDcgQEAKIAkuc2h1dGRvd24JPSBzYTExMDBfbXRkX3NodXRkb3duLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJmbGFzaCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCiB9OwogCkBAIC00NzUsMyArNDc2LDQgQEAKIE1PRFVMRV9BVVRIT1IoIk5pY29sYXMgUGl0cmUiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU0ExMTAwIENGSSBtYXAgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmZsYXNoIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL3NoYXJwc2wtZmxhc2guYyBiL2RyaXZlcnMvbXRkL21hcHMvc2hhcnBzbC1mbGFzaC5jCmluZGV4IDEyZmU1M2MuLjkxN2RjNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvc2hhcnBzbC1mbGFzaC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvc2hhcnBzbC1mbGFzaC5jCkBAIC05Miw3ICs5Miw3IEBACiAJcGFydHMgPSBzaGFycHNsX3BhcnRpdGlvbnM7CiAJbmJfcGFydHMgPSBBUlJBWV9TSVpFKHNoYXJwc2xfcGFydGl0aW9ucyk7CiAKLQlwcmludGsoS0VSTl9OT1RJQ0UgIlVzaW5nICVzIHBhcnRpc2lvbiBkZWZpbml0aW9uXG4iLCBwYXJ0X3R5cGUpOworCXByaW50ayhLRVJOX05PVElDRSAiVXNpbmcgJXMgcGFydGl0aW9uIGRlZmluaXRpb25cbiIsIHBhcnRfdHlwZSk7CiAJYWRkX210ZF9wYXJ0aXRpb25zKG15bXRkLCBwYXJ0cywgbmJfcGFydHMpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL3RxbTh4eGwuYyBiL2RyaXZlcnMvbXRkL21hcHMvdHFtOHh4bC5jCmluZGV4IDM3ZTRkZWQuLjUyMTczNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvdHFtOHh4bC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvdHFtOHh4bC5jCkBAIC0xMjQsNyArMTI0LDcgQEAKIAkvL3JlcXVlc3QgbWF4aW11bSBmbGFzaCBzaXplIGFkZHJlc3Mgc3BhY2UKIAlzdGFydF9zY2FuX2FkZHIgPSBpb3JlbWFwKGZsYXNoX2FkZHIsIGZsYXNoX3NpemUpOwogCWlmICghc3RhcnRfc2Nhbl9hZGRyKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOkZhaWxlZCB0byBpb3JlbWFwIGFkZHJlc3M6MHgleFxuIiwgX19GVU5DVElPTl9fLCBmbGFzaF9hZGRyKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6RmFpbGVkIHRvIGlvcmVtYXAgYWRkcmVzczoweCV4XG4iLCBfX2Z1bmNfXywgZmxhc2hfYWRkcik7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtMTMyLDcgKzEzMiw3IEBACiAJCWlmKG10ZF9zaXplID49IGZsYXNoX3NpemUpCiAJCQlicmVhazsKIAotCQlwcmludGsoS0VSTl9JTkZPICIlczogY2hpcCBwcm9iaW5nIGNvdW50ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGlkeCk7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBjaGlwIHByb2JpbmcgY291bnQgJWRcbiIsIF9fZnVuY19fLCBpZHgpOwogCiAJCW1hcF9iYW5rc1tpZHhdID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1hcF9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJCWlmKG1hcF9iYW5rc1tpZHhdID09IE5VTEwpIHsKQEAgLTE3OCw3ICsxNzgsNyBAQAogCQkJbXRkX3NpemUgKz0gbXRkX2JhbmtzW2lkeF0tPnNpemU7CiAJCQludW1fYmFua3MrKzsKIAotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGJhbmslZCwgbmFtZTolcywgc2l6ZTolZGJ5dGVzIFxuIiwgX19GVU5DVElPTl9fLCBudW1fYmFua3MsCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogYmFuayVkLCBuYW1lOiVzLCBzaXplOiVkYnl0ZXMgXG4iLCBfX2Z1bmNfXywgbnVtX2JhbmtzLAogCQkJbXRkX2JhbmtzW2lkeF0tPm5hbWUsIG10ZF9iYW5rc1tpZHhdLT5zaXplKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL210ZG9vcHMuYyBiL2RyaXZlcnMvbXRkL210ZG9vcHMuYwppbmRleCBkM2NmMDUwLi41YTY4MGUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tdGRvb3BzLmMKKysrIGIvZHJpdmVycy9tdGQvbXRkb29wcy5jCkBAIC0zNSw3ICszNSw3IEBACiAKICNkZWZpbmUgT09QU19QQUdFX1NJWkUgNDA5NgogCi1zdHJ1Y3QgbXRkb29wc19jb250ZXh0IHsKK3N0YXRpYyBzdHJ1Y3QgbXRkb29wc19jb250ZXh0IHsKIAlpbnQgbXRkX2luZGV4OwogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrX2VyYXNlOwogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrX3dyaXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnIGIvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnCmluZGV4IDk1OWZiODYuLjUwNzZmYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvS2NvbmZpZworKysgYi9kcml2ZXJzL210ZC9uYW5kL0tjb25maWcKQEAgLTI3OCw2ICsyNzgsNTQgQEAKIAloZWxwCiAJICBFbmFibGVzIHN1cHBvcnQgZm9yIE5BTkQgRmxhc2ggLyBTbWFydCBNZWRpYSBDYXJkIGludGVyZmFjZQogCSAgb24gQXRtZWwgQVQ5MSBwcm9jZXNzb3JzLgorY2hvaWNlCisJcHJvbXB0ICJFQ0MgbWFuYWdlbWVudCBmb3IgTkFORCBGbGFzaCAvIFNtYXJ0TWVkaWEgb24gQVQ5MSIKKwlkZXBlbmRzIG9uIE1URF9OQU5EX0FUOTEKKworY29uZmlnIE1URF9OQU5EX0FUOTFfRUNDX0hXCisJYm9vbCAiSGFyZHdhcmUgRUNDIgorCWRlcGVuZHMgb24gQVJDSF9BVDkxU0FNOTI2MyB8fCBBUkNIX0FUOTFTQU05MjYwCisJaGVscAorCSAgVXNlcyBoYXJkd2FyZSBFQ0MgcHJvdmlkZWQgYnkgdGhlIGF0OTFzYW05MjYwL2F0OTFzYW05MjYzIGNoaXAKKwkgIGluc3RlYWQgb2Ygc29mdHdhcmUgRUNDLgorCSAgVGhlIGhhcmR3YXJlIEVDQyBjb250cm9sbGVyIGlzIGNhcGFibGUgb2Ygc2luZ2xlIGJpdCBlcnJvcgorCSAgY29ycmVjdGlvbiBhbmQgMi1iaXQgcmFuZG9tIGRldGVjdGlvbiBwZXIgcGFnZS4KKworCSAgTkIgOiBoYXJkd2FyZSBhbmQgc29mdHdhcmUgRUNDIHNjaGVtZXMgYXJlIGluY29tcGF0aWJsZS4KKwkgIElmIHlvdSBzd2l0Y2ggZnJvbSBvbmUgdG8gYW5vdGhlciwgeW91J2xsIGhhdmUgdG8gZXJhc2UgeW91cgorCSAgbXRkIHBhcnRpdGlvbi4KKworCSAgSWYgdW5zdXJlLCBzYXkgWQorCitjb25maWcgTVREX05BTkRfQVQ5MV9FQ0NfU09GVAorCWJvb2wgIlNvZnR3YXJlIEVDQyIKKwloZWxwCisJICBVc2VzIHNvZnR3YXJlIEVDQy4KKworCSAgTkIgOiBoYXJkd2FyZSBhbmQgc29mdHdhcmUgRUNDIHNjaGVtZXMgYXJlIGluY29tcGF0aWJsZS4KKwkgIElmIHlvdSBzd2l0Y2ggZnJvbSBvbmUgdG8gYW5vdGhlciwgeW91J2xsIGhhdmUgdG8gZXJhc2UgeW91cgorCSAgbXRkIHBhcnRpdGlvbi4KKworY29uZmlnIE1URF9OQU5EX0FUOTFfRUNDX05PTkUKKwlib29sICJObyBFQ0MgKHRlc3Rpbmcgb25seSwgREFOR0VST1VTKSIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCWhlbHAKKwkgIE5vIEVDQyB3aWxsIGJlIHVzZWQuCisJICBJdCdzIG5vdCBhIGdvb2QgaWRlYSBhbmQgaXQgc2hvdWxkIGJlIHJlc2VydmVkIGZvciB0ZXN0aW5nCisJICBwdXJwb3NlIG9ubHkuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4KKworCSAgZW5kY2hvaWNlCisKK2VuZGNob2ljZQorCitjb25maWcgTVREX05BTkRfUFhBM3h4CisJYm9vbCAiU3VwcG9ydCBmb3IgTkFORCBmbGFzaCBkZXZpY2VzIG9uIFBYQTN4eCIKKwlkZXBlbmRzIG9uIE1URF9OQU5EICYmIFBYQTN4eAorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB0aGUgZHJpdmVyIGZvciB0aGUgTkFORCBmbGFzaCBkZXZpY2UgZm91bmQgb24KKwkgIFBYQTN4eCBwcm9jZXNzb3JzCiAKIGNvbmZpZyBNVERfTkFORF9DTV9YMjcwCiAJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIE5BTkQgRmxhc2ggb24gQ00tWDI3MCBtb2R1bGVzIgpAQCAtMzMwLDQgKzM3OCwxMiBAQAogCSAgRW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBlbmFibGUgeW91IHRvIHVzZSB0aGlzIHRvIGNvbnRyb2wKIAkgIGV4dGVybmFsIE5BTkQgZGV2aWNlcy4KIAorY29uZmlnIE1URF9OQU5EX0ZTTF9VUE0KKwl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgTkFORCBvbiBGcmVlc2NhbGUgVVBNIgorCWRlcGVuZHMgb24gTVREX05BTkQgJiYgT0ZfR1BJTyAmJiAoUFBDXzgzeHggfHwgUFBDXzg1eHgpCisJc2VsZWN0IEZTTF9MQkMKKwloZWxwCisJICBFbmFibGVzIHN1cHBvcnQgZm9yIE5BTkQgRmxhc2ggY2hpcHMgd2lyZWQgb250byBGcmVlc2NhbGUgUG93ZXJQQworCSAgcHJvY2Vzc29yIGxvY2FsYnVzIHdpdGggVXNlci1Qcm9ncmFtbWFibGUgTWFjaGluZSBzdXBwb3J0LgorCiBlbmRpZiAjIE1URF9OQU5ECmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL01ha2VmaWxlIGIvZHJpdmVycy9tdGQvbmFuZC9NYWtlZmlsZQppbmRleCA4MGQ1NzVlLi5hNmU3NGE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvTWFrZWZpbGUKQEAgLTI3LDEwICsyNywxMiBAQAogb2JqLSQoQ09ORklHX01URF9OQU5EX0FUOTEpCQkrPSBhdDkxX25hbmQubwogb2JqLSQoQ09ORklHX01URF9OQU5EX0NNX1gyNzApCQkrPSBjbXgyNzBfbmFuZC5vCiBvYmotJChDT05GSUdfTVREX05BTkRfQkFTTEVSX0VYQ0lURSkJKz0gZXhjaXRlX25hbmRmbGFzaC5vCitvYmotJChDT05GSUdfTVREX05BTkRfUFhBM3h4KQkJKz0gcHhhM3h4X25hbmQubwogb2JqLSQoQ09ORklHX01URF9OQU5EX1BMQVRGT1JNKQkJKz0gcGxhdF9uYW5kLm8KIG9iai0kKENPTkZJR19NVERfQUxBVURBKQkJKz0gYWxhdWRhLm8KIG9iai0kKENPTkZJR19NVERfTkFORF9QQVNFTUkpCQkrPSBwYXNlbWlfbmFuZC5vCiBvYmotJChDT05GSUdfTVREX05BTkRfT1JJT04pCQkrPSBvcmlvbl9uYW5kLm8KIG9iai0kKENPTkZJR19NVERfTkFORF9GU0xfRUxCQykJCSs9IGZzbF9lbGJjX25hbmQubworb2JqLSQoQ09ORklHX01URF9OQU5EX0ZTTF9VUE0pCQkrPSBmc2xfdXBtLm8KIAogbmFuZC1vYmpzIDo9IG5hbmRfYmFzZS5vIG5hbmRfYmJ0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvYXQ5MV9uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL2F0OTFfbmFuZC5jCmluZGV4IGM5ZmIyYWMuLjQxNGNlYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvYXQ5MV9uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9hdDkxX25hbmQuYwpAQCAtOSw2ICs5LDE1IEBACiAgKiAgRGVyaXZlZCBmcm9tIGRyaXZlcnMvbXRkL3NwaWEuYwogICoJIENvcHlyaWdodCAoQykgMjAwMCBTdGV2ZW4gSi4gSGlsbCAoc2poaWxsQGNvdHcuY29tKQogICoKKyAqCisgKiAgQWRkIEhhcmR3YXJlIEVDQyBzdXBwb3J0IGZvciBBVDkxU0FNOTI2MCAvIEFUOTFTQU05MjYzCisgKiAgICAgUmljaGFyZCBHZW5vdWQgKHJpY2hhcmQuZ2Vub3VkQGdtYWlsLmNvbSksIEFkZW5lbyBDb3B5cmlnaHQgKEMpIDIwMDcKKyAqCisgKiAgICAgRGVyaXZlZCBmcm9tIERhcyBVLUJvb3Qgc291cmNlIGNvZGUKKyAqICAgICAJCSh1LWJvb3QtMS4xLjUvYm9hcmQvYXRtZWwvYXQ5MXNhbTkyNjNlay9uYW5kLmMpCisgKiAgICAgKEMpIENvcHlyaWdodCAyMDA2IEFUTUVMIFJvdXNzZXQsIExhY3Jlc3Nvbm5pZXJlIE5pY29sYXMKKyAqCisgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KQEAgLTI5LDExICszOCw1OSBAQAogI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgogCisjaWZkZWYgQ09ORklHX01URF9OQU5EX0FUOTFfRUNDX0hXCisjZGVmaW5lIGhhcmRfZWNjCTEKKyNlbHNlCisjZGVmaW5lIGhhcmRfZWNjCTAKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01URF9OQU5EX0FUOTFfRUNDX05PTkUKKyNkZWZpbmUgbm9fZWNjCQkxCisjZWxzZQorI2RlZmluZSBub19lY2MJCTAKKyNlbmRpZgorCisvKiBSZWdpc3RlciBhY2Nlc3MgbWFjcm9zICovCisjZGVmaW5lIGVjY19yZWFkbChhZGQsIHJlZykJCQkJXAorCV9fcmF3X3JlYWRsKGFkZCArIEFUOTFfRUNDXyMjcmVnKQorI2RlZmluZSBlY2Nfd3JpdGVsKGFkZCwgcmVnLCB2YWx1ZSkJCQlcCisJX19yYXdfd3JpdGVsKCh2YWx1ZSksIGFkZCArIEFUOTFfRUNDXyMjcmVnKQorCisjaW5jbHVkZSA8YXNtL2FyY2gvYXQ5MV9lY2MuaD4gLyogQVQ5MVNBTTkyNjAvMyBFQ0MgcmVnaXN0ZXJzICovCisKKy8qIG9vYiBsYXlvdXQgZm9yIGxhcmdlIHBhZ2Ugc2l6ZQorICogYmFkIGJsb2NrIGluZm8gaXMgb24gYnl0ZXMgMCBhbmQgMQorICogdGhlIGJ5dGVzIGhhdmUgdG8gYmUgY29uc2VjdXRpdmVzIHRvIGF2b2lkCisgKiBzZXZlcmFsIE5BTkRfQ01EX1JORE9VVCBkdXJpbmcgcmVhZAorICovCitzdGF0aWMgc3RydWN0IG5hbmRfZWNjbGF5b3V0IGF0OTFfb29iaW5mb19sYXJnZSA9IHsKKwkuZWNjYnl0ZXMgPSA0LAorCS5lY2Nwb3MgPSB7NjAsIDYxLCA2MiwgNjN9LAorCS5vb2JmcmVlID0geworCQl7MiwgNTh9CisJfSwKK307CisKKy8qIG9vYiBsYXlvdXQgZm9yIHNtYWxsIHBhZ2Ugc2l6ZQorICogYmFkIGJsb2NrIGluZm8gaXMgb24gYnl0ZXMgNCBhbmQgNQorICogdGhlIGJ5dGVzIGhhdmUgdG8gYmUgY29uc2VjdXRpdmVzIHRvIGF2b2lkCisgKiBzZXZlcmFsIE5BTkRfQ01EX1JORE9VVCBkdXJpbmcgcmVhZAorICovCitzdGF0aWMgc3RydWN0IG5hbmRfZWNjbGF5b3V0IGF0OTFfb29iaW5mb19zbWFsbCA9IHsKKwkuZWNjYnl0ZXMgPSA0LAorCS5lY2Nwb3MgPSB7MCwgMSwgMiwgM30sCisJLm9vYmZyZWUgPSB7CisJCXs2LCAxMH0KKwl9LAorfTsKKwogc3RydWN0IGF0OTFfbmFuZF9ob3N0IHsKIAlzdHJ1Y3QgbmFuZF9jaGlwCW5hbmRfY2hpcDsKIAlzdHJ1Y3QgbXRkX2luZm8JCW10ZDsKIAl2b2lkIF9faW9tZW0JCSppb19iYXNlOwogCXN0cnVjdCBhdDkxX25hbmRfZGF0YQkqYm9hcmQ7CisJc3RydWN0IGRldmljZQkJKmRldjsKKwl2b2lkIF9faW9tZW0JCSplY2M7CiB9OwogCiAvKgpAQCAtNDQsNiArMTAxLDEyIEBACiAJc3RydWN0IG5hbmRfY2hpcCAqbmFuZF9jaGlwID0gbXRkLT5wcml2OwogCXN0cnVjdCBhdDkxX25hbmRfaG9zdCAqaG9zdCA9IG5hbmRfY2hpcC0+cHJpdjsKIAorCWlmIChob3N0LT5ib2FyZC0+ZW5hYmxlX3BpbiAmJiAoY3RybCAmIE5BTkRfQ1RSTF9DSEFOR0UpKSB7CisJCWlmIChjdHJsICYgTkFORF9OQ0UpCisJCQlhdDkxX3NldF9ncGlvX3ZhbHVlKGhvc3QtPmJvYXJkLT5lbmFibGVfcGluLCAwKTsKKwkJZWxzZQorCQkJYXQ5MV9zZXRfZ3Bpb192YWx1ZShob3N0LT5ib2FyZC0+ZW5hYmxlX3BpbiwgMSk7CisJfQogCWlmIChjbWQgPT0gTkFORF9DTURfTk9ORSkKIAkJcmV0dXJuOwogCkBAIC04Miw4ICsxNDUsMjE3IEBACiAJCWF0OTFfc2V0X2dwaW9fdmFsdWUoaG9zdC0+Ym9hcmQtPmVuYWJsZV9waW4sIDEpOwogfQogCisvKgorICogd3JpdGUgb29iIGZvciBzbWFsbCBwYWdlcworICovCitzdGF0aWMgaW50IGF0OTFfbmFuZF93cml0ZV9vb2JfNTEyKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAorCQlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQgcGFnZSkKK3sKKwlpbnQgY2h1bmsgPSBjaGlwLT5lY2MuYnl0ZXMgKyBjaGlwLT5lY2MucHJlcGFkICsgY2hpcC0+ZWNjLnBvc3RwYWQ7CisJaW50IGVjY3NpemUgPSBjaGlwLT5lY2Muc2l6ZSwgbGVuZ3RoID0gbXRkLT5vb2JzaXplOworCWludCBsZW4sIHBvcywgc3RhdHVzID0gMDsKKwljb25zdCB1aW50OF90ICpidWZwb2kgPSBjaGlwLT5vb2JfcG9pOworCisJcG9zID0gZWNjc2l6ZSArIGNodW5rOworCisJY2hpcC0+Y21kZnVuYyhtdGQsIE5BTkRfQ01EX1NFUUlOLCBwb3MsIHBhZ2UpOworCWxlbiA9IG1pbl90KGludCwgbGVuZ3RoLCBjaHVuayk7CisJY2hpcC0+d3JpdGVfYnVmKG10ZCwgYnVmcG9pLCBsZW4pOworCWJ1ZnBvaSArPSBsZW47CisJbGVuZ3RoIC09IGxlbjsKKwlpZiAobGVuZ3RoID4gMCkKKwkJY2hpcC0+d3JpdGVfYnVmKG10ZCwgYnVmcG9pLCBsZW5ndGgpOworCisJY2hpcC0+Y21kZnVuYyhtdGQsIE5BTkRfQ01EX1BBR0VQUk9HLCAtMSwgLTEpOworCXN0YXR1cyA9IGNoaXAtPndhaXRmdW5jKG10ZCwgY2hpcCk7CisKKwlyZXR1cm4gc3RhdHVzICYgTkFORF9TVEFUVVNfRkFJTCA/IC1FSU8gOiAwOworCit9CisKKy8qCisgKiByZWFkIG9vYiBmb3Igc21hbGwgcGFnZXMKKyAqLworc3RhdGljIGludCBhdDkxX25hbmRfcmVhZF9vb2JfNTEyKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAorCQlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAlpbnQgcGFnZSwgaW50IHNuZGNtZCkKK3sKKwlpZiAoc25kY21kKSB7CisJCWNoaXAtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9SRUFET09CLCAwLCBwYWdlKTsKKwkJc25kY21kID0gMDsKKwl9CisJY2hpcC0+cmVhZF9idWYobXRkLCBjaGlwLT5vb2JfcG9pLCBtdGQtPm9vYnNpemUpOworCXJldHVybiBzbmRjbWQ7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgSFcgRUNDCisgKgorICogZnVuY3Rpb24gY2FsbGVkIGFmdGVyIGEgd3JpdGUKKyAqCisgKiBtdGQ6ICAgICAgICBNVEQgYmxvY2sgc3RydWN0dXJlCisgKiBkYXQ6ICAgICAgICByYXcgZGF0YSAodW51c2VkKQorICogZWNjX2NvZGU6ICAgYnVmZmVyIGZvciBFQ0MKKyAqLworc3RhdGljIGludCBhdDkxX25hbmRfY2FsY3VsYXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAorCQljb25zdCB1X2NoYXIgKmRhdCwgdW5zaWduZWQgY2hhciAqZWNjX2NvZGUpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqbmFuZF9jaGlwID0gbXRkLT5wcml2OworCXN0cnVjdCBhdDkxX25hbmRfaG9zdCAqaG9zdCA9IG5hbmRfY2hpcC0+cHJpdjsKKwl1aW50MzJfdCAqZWNjcG9zID0gbmFuZF9jaGlwLT5lY2MubGF5b3V0LT5lY2Nwb3M7CisJdW5zaWduZWQgaW50IGVjY192YWx1ZTsKKworCS8qIGdldCB0aGUgZmlyc3QgMiBFQ0MgYnl0ZXMgKi8KKwllY2NfdmFsdWUgPSBlY2NfcmVhZGwoaG9zdC0+ZWNjLCBQUik7CisKKwllY2NfY29kZVtlY2Nwb3NbMF1dID0gZWNjX3ZhbHVlICYgMHhGRjsKKwllY2NfY29kZVtlY2Nwb3NbMV1dID0gKGVjY192YWx1ZSA+PiA4KSAmIDB4RkY7CisKKwkvKiBnZXQgdGhlIGxhc3QgMiBFQ0MgYnl0ZXMgKi8KKwllY2NfdmFsdWUgPSBlY2NfcmVhZGwoaG9zdC0+ZWNjLCBOUFIpICYgQVQ5MV9FQ0NfTlBBUklUWTsKKworCWVjY19jb2RlW2VjY3Bvc1syXV0gPSBlY2NfdmFsdWUgJiAweEZGOworCWVjY19jb2RlW2VjY3Bvc1szXV0gPSAoZWNjX3ZhbHVlID4+IDgpICYgMHhGRjsKKworCXJldHVybiAwOworfQorCisvKgorICogSFcgRUNDIHJlYWQgcGFnZSBmdW5jdGlvbgorICoKKyAqIG10ZDogICAgICAgIG10ZCBpbmZvIHN0cnVjdHVyZQorICogY2hpcDogICAgICAgbmFuZCBjaGlwIGluZm8gc3RydWN0dXJlCisgKiBidWY6ICAgICAgICBidWZmZXIgdG8gc3RvcmUgcmVhZCBkYXRhCisgKi8KK3N0YXRpYyBpbnQgYXQ5MV9uYW5kX3JlYWRfcGFnZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKKwkJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgdWludDhfdCAqYnVmKQoreworCWludCBlY2NzaXplID0gY2hpcC0+ZWNjLnNpemU7CisJaW50IGVjY2J5dGVzID0gY2hpcC0+ZWNjLmJ5dGVzOworCXVpbnQzMl90ICplY2Nwb3MgPSBjaGlwLT5lY2MubGF5b3V0LT5lY2Nwb3M7CisJdWludDhfdCAqcCA9IGJ1ZjsKKwl1aW50OF90ICpvb2IgPSBjaGlwLT5vb2JfcG9pOworCXVpbnQ4X3QgKmVjY19wb3M7CisJaW50IHN0YXQ7CisKKwkvKiByZWFkIHRoZSBwYWdlICovCisJY2hpcC0+cmVhZF9idWYobXRkLCBwLCBlY2NzaXplKTsKKworCS8qIG1vdmUgdG8gRUNDIHBvc2l0aW9uIGlmIG5lZWRlZCAqLworCWlmIChlY2Nwb3NbMF0gIT0gMCkgeworCQkvKiBUaGlzIG9ubHkgd29ya3Mgb24gbGFyZ2UgcGFnZXMKKwkJICogYmVjYXVzZSB0aGUgRUNDIGNvbnRyb2xsZXIgd2FpdHMgZm9yCisJCSAqIE5BTkRfQ01EX1JORE9VVFNUQVJUIGFmdGVyIHRoZQorCQkgKiBOQU5EX0NNRF9STkRPVVQuCisJCSAqIGFueXdheSwgZm9yIHNtYWxsIHBhZ2VzLCB0aGUgZWNjcG9zWzBdID09IDAKKwkJICovCisJCWNoaXAtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9STkRPVVQsCisJCQkJbXRkLT53cml0ZXNpemUgKyBlY2Nwb3NbMF0sIC0xKTsKKwl9CisKKwkvKiB0aGUgRUNDIGNvbnRyb2xsZXIgbmVlZHMgdG8gcmVhZCB0aGUgRUNDIGp1c3QgYWZ0ZXIgdGhlIGRhdGEgKi8KKwllY2NfcG9zID0gb29iICsgZWNjcG9zWzBdOworCWNoaXAtPnJlYWRfYnVmKG10ZCwgZWNjX3BvcywgZWNjYnl0ZXMpOworCisJLyogY2hlY2sgaWYgdGhlcmUncyBhbiBlcnJvciAqLworCXN0YXQgPSBjaGlwLT5lY2MuY29ycmVjdChtdGQsIHAsIG9vYiwgTlVMTCk7CisKKwlpZiAoc3RhdCA8IDApCisJCW10ZC0+ZWNjX3N0YXRzLmZhaWxlZCsrOworCWVsc2UKKwkJbXRkLT5lY2Nfc3RhdHMuY29ycmVjdGVkICs9IHN0YXQ7CisKKwkvKiBnZXQgYmFjayB0byBvb2Igc3RhcnQgKGVuZCBvZiBwYWdlKSAqLworCWNoaXAtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9STkRPVVQsIG10ZC0+d3JpdGVzaXplLCAtMSk7CisKKwkvKiByZWFkIHRoZSBvb2IgKi8KKwljaGlwLT5yZWFkX2J1ZihtdGQsIG9vYiwgbXRkLT5vb2JzaXplKTsKKworCXJldHVybiAwOworfQorCisvKgorICogSFcgRUNDIENvcnJlY3Rpb24KKyAqCisgKiBmdW5jdGlvbiBjYWxsZWQgYWZ0ZXIgYSByZWFkCisgKgorICogbXRkOiAgICAgICAgTVREIGJsb2NrIHN0cnVjdHVyZQorICogZGF0OiAgICAgICAgcmF3IGRhdGEgcmVhZCBmcm9tIHRoZSBjaGlwCisgKiByZWFkX2VjYzogICBFQ0MgZnJvbSB0aGUgY2hpcCAodW51c2VkKQorICogaXNudWxsOiAgICAgdW51c2VkCisgKgorICogRGV0ZWN0IGFuZCBjb3JyZWN0IGEgMSBiaXQgZXJyb3IgZm9yIGEgcGFnZQorICovCitzdGF0aWMgaW50IGF0OTFfbmFuZF9jb3JyZWN0KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgKmRhdCwKKwkJdV9jaGFyICpyZWFkX2VjYywgdV9jaGFyICppc251bGwpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqbmFuZF9jaGlwID0gbXRkLT5wcml2OworCXN0cnVjdCBhdDkxX25hbmRfaG9zdCAqaG9zdCA9IG5hbmRfY2hpcC0+cHJpdjsKKwl1bnNpZ25lZCBpbnQgZWNjX3N0YXR1czsKKwl1bnNpZ25lZCBpbnQgZWNjX3dvcmQsIGVjY19iaXQ7CisKKwkvKiBnZXQgdGhlIHN0YXR1cyBmcm9tIHRoZSBTdGF0dXMgUmVnaXN0ZXIgKi8KKwllY2Nfc3RhdHVzID0gZWNjX3JlYWRsKGhvc3QtPmVjYywgU1IpOworCisJLyogaWYgdGhlcmUncyBubyBlcnJvciAqLworCWlmIChsaWtlbHkoIShlY2Nfc3RhdHVzICYgQVQ5MV9FQ0NfUkVDRVJSKSkpCisJCXJldHVybiAwOworCisJLyogZ2V0IGVycm9yIGJpdCBvZmZzZXQgKDQgYml0cykgKi8KKwllY2NfYml0ID0gZWNjX3JlYWRsKGhvc3QtPmVjYywgUFIpICYgQVQ5MV9FQ0NfQklUQUREUjsKKwkvKiBnZXQgd29yZCBhZGRyZXNzICgxMiBiaXRzKSAqLworCWVjY193b3JkID0gZWNjX3JlYWRsKGhvc3QtPmVjYywgUFIpICYgQVQ5MV9FQ0NfV09SREFERFI7CisJZWNjX3dvcmQgPj49IDQ7CisKKwkvKiBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgZXJyb3JzICovCisJaWYgKGVjY19zdGF0dXMgJiBBVDkxX0VDQ19NVUxFUlIpIHsKKwkJLyogY2hlY2sgaWYgaXQgaXMgYSBmcmVzaGx5IGVyYXNlZCBibG9jaworCQkgKiAoZmlsbGVkIHdpdGggMHhmZikgKi8KKwkJaWYgKChlY2NfYml0ID09IEFUOTFfRUNDX0JJVEFERFIpCisJCQkJJiYgKGVjY193b3JkID09IChBVDkxX0VDQ19XT1JEQUREUiA+PiA0KSkpIHsKKwkJCS8qIHRoZSBibG9jayBoYXMganVzdCBiZWVuIGVyYXNlZCwgcmV0dXJuIE9LICovCisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBpdCBkb2Vzbid0IHNlZW1zIHRvIGJlIGEgZnJlc2hseQorCQkgKiBlcmFzZWQgYmxvY2suCisJCSAqIFdlIGNhbid0IGNvcnJlY3Qgc28gbWFueSBlcnJvcnMgKi8KKwkJZGV2X2RiZyhob3N0LT5kZXYsICJhdDkxX25hbmQgOiBtdWx0aXBsZSBlcnJvcnMgZGV0ZWN0ZWQuIgorCQkJCSIgVW5hYmxlIHRvIGNvcnJlY3QuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogaWYgdGhlcmUncyBhIHNpbmdsZSBiaXQgZXJyb3IgOiB3ZSBjYW4gY29ycmVjdCBpdCAqLworCWlmIChlY2Nfc3RhdHVzICYgQVQ5MV9FQ0NfRUNDRVJSKSB7CisJCS8qIHRoZXJlJ3Mgbm90aGluZyBtdWNoIHRvIGRvIGhlcmUuCisJCSAqIHRoZSBiaXQgZXJyb3IgaXMgb24gdGhlIEVDQyBpdHNlbGYuCisJCSAqLworCQlkZXZfZGJnKGhvc3QtPmRldiwgImF0OTFfbmFuZCA6IG9uZSBiaXQgZXJyb3Igb24gRUNDIGNvZGUuIgorCQkJCSIgTm90aGluZyB0byBjb3JyZWN0XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZGV2X2RiZyhob3N0LT5kZXYsICJhdDkxX25hbmQgOiBvbmUgYml0IGVycm9yIG9uIGRhdGEuIgorCQkJIiAod29yZCBvZmZzZXQgaW4gdGhlIHBhZ2UgOiIKKwkJCSIgMHgleCBiaXQgb2Zmc2V0IDogMHgleClcbiIsCisJCQllY2Nfd29yZCwgZWNjX2JpdCk7CisJLyogY29ycmVjdCB0aGUgZXJyb3IgKi8KKwlpZiAobmFuZF9jaGlwLT5vcHRpb25zICYgTkFORF9CVVNXSURUSF8xNikgeworCQkvKiAxNiBiaXRzIHdvcmRzICovCisJCSgodW5zaWduZWQgc2hvcnQgKikgZGF0KVtlY2Nfd29yZF0gXj0gKDEgPDwgZWNjX2JpdCk7CisJfSBlbHNlIHsKKwkJLyogOCBiaXRzIHdvcmRzICovCisJCWRhdFtlY2Nfd29yZF0gXj0gKDEgPDwgZWNjX2JpdCk7CisJfQorCWRldl9kYmcoaG9zdC0+ZGV2LCAiYXQ5MV9uYW5kIDogZXJyb3IgY29ycmVjdGVkXG4iKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEVuYWJsZSBIVyBFQ0MgOiB1bnN1c2VkCisgKi8KK3N0YXRpYyB2b2lkIGF0OTFfbmFuZF9od2N0bChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IG1vZGUpIHsgOyB9CisKICNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKLWNvbnN0IGNoYXIgKnBhcnRfcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKK3N0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMIH07CiAjZW5kaWYKIAogLyoKQEAgLTk0LDYgKzM2Niw4IEBACiAJc3RydWN0IGF0OTFfbmFuZF9ob3N0ICpob3N0OwogCXN0cnVjdCBtdGRfaW5mbyAqbXRkOwogCXN0cnVjdCBuYW5kX2NoaXAgKm5hbmRfY2hpcDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlZ3M7CisJc3RydWN0IHJlc291cmNlICptZW07CiAJaW50IHJlczsKIAogI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUwpAQCAtMTA4LDggKzM4MiwxMyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlob3N0LT5pb19iYXNlID0gaW9yZW1hcChwZGV2LT5yZXNvdXJjZVswXS5zdGFydCwKLQkJCQlwZGV2LT5yZXNvdXJjZVswXS5lbmQgLSBwZGV2LT5yZXNvdXJjZVswXS5zdGFydCArIDEpOworCW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFtZW0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhdDkxX25hbmQ6IGNhbid0IGdldCBJL08gcmVzb3VyY2UgbWVtXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlob3N0LT5pb19iYXNlID0gaW9yZW1hcChtZW0tPnN0YXJ0LCBtZW0tPmVuZCAtIG1lbS0+c3RhcnQgKyAxKTsKIAlpZiAoaG9zdC0+aW9fYmFzZSA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiYXQ5MV9uYW5kOiBpb3JlbWFwIGZhaWxlZFxuIik7CiAJCWtmcmVlKGhvc3QpOwpAQCAtMTE5LDYgKzM5OCw3IEBACiAJbXRkID0gJmhvc3QtPm10ZDsKIAluYW5kX2NoaXAgPSAmaG9zdC0+bmFuZF9jaGlwOwogCWhvc3QtPmJvYXJkID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaG9zdC0+ZGV2ID0gJnBkZXYtPmRldjsKIAogCW5hbmRfY2hpcC0+cHJpdiA9IGhvc3Q7CQkvKiBsaW5rIHRoZSBwcml2YXRlIGRhdGEgc3RydWN0dXJlcyAqLwogCW10ZC0+cHJpdiA9IG5hbmRfY2hpcDsKQEAgLTEzMiw3ICs0MTIsMzIgQEAKIAlpZiAoaG9zdC0+Ym9hcmQtPnJkeV9waW4pCiAJCW5hbmRfY2hpcC0+ZGV2X3JlYWR5ID0gYXQ5MV9uYW5kX2RldmljZV9yZWFkeTsKIAorCXJlZ3MgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDEpOworCWlmICghcmVncyAmJiBoYXJkX2VjYykgeworCQlwcmludGsoS0VSTl9FUlIgImF0OTFfbmFuZDogY2FuJ3QgZ2V0IEkvTyByZXNvdXJjZSAiCisJCQkJInJlZ3NcbkZhbGxpbmcgYmFjayBvbiBzb2Z0d2FyZSBFQ0NcbiIpOworCX0KKwogCW5hbmRfY2hpcC0+ZWNjLm1vZGUgPSBOQU5EX0VDQ19TT0ZUOwkvKiBlbmFibGUgRUNDICovCisJaWYgKG5vX2VjYykKKwkJbmFuZF9jaGlwLT5lY2MubW9kZSA9IE5BTkRfRUNDX05PTkU7CisJaWYgKGhhcmRfZWNjICYmIHJlZ3MpIHsKKwkJaG9zdC0+ZWNjID0gaW9yZW1hcChyZWdzLT5zdGFydCwgcmVncy0+ZW5kIC0gcmVncy0+c3RhcnQgKyAxKTsKKwkJaWYgKGhvc3QtPmVjYyA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImF0OTFfbmFuZDogaW9yZW1hcCBmYWlsZWRcbiIpOworCQkJcmVzID0gLUVJTzsKKwkJCWdvdG8gZXJyX2VjY19pb3JlbWFwOworCQl9CisJCW5hbmRfY2hpcC0+ZWNjLm1vZGUgPSBOQU5EX0VDQ19IV19TWU5EUk9NRTsKKwkJbmFuZF9jaGlwLT5lY2MuY2FsY3VsYXRlID0gYXQ5MV9uYW5kX2NhbGN1bGF0ZTsKKwkJbmFuZF9jaGlwLT5lY2MuY29ycmVjdCA9IGF0OTFfbmFuZF9jb3JyZWN0OworCQluYW5kX2NoaXAtPmVjYy5od2N0bCA9IGF0OTFfbmFuZF9od2N0bDsKKwkJbmFuZF9jaGlwLT5lY2MucmVhZF9wYWdlID0gYXQ5MV9uYW5kX3JlYWRfcGFnZTsKKwkJbmFuZF9jaGlwLT5lY2MuYnl0ZXMgPSA0OworCQluYW5kX2NoaXAtPmVjYy5wcmVwYWQgPSAwOworCQluYW5kX2NoaXAtPmVjYy5wb3N0cGFkID0gMDsKKwl9CisKIAluYW5kX2NoaXAtPmNoaXBfZGVsYXkgPSAyMDsJCS8qIDIwdXMgY29tbWFuZCBkZWxheSB0aW1lICovCiAKIAlpZiAoaG9zdC0+Ym9hcmQtPmJ1c193aWR0aF8xNikJCS8qIDE2LWJpdCBidXMgd2lkdGggKi8KQEAgLTE0OSw4ICs0NTQsNTMgQEAKIAkJfQogCX0KIAotCS8qIFNjYW4gdG8gZmluZCBleGlzdGFuY2Ugb2YgdGhlIGRldmljZSAqLwotCWlmIChuYW5kX3NjYW4obXRkLCAxKSkgeworCS8qIGZpcnN0IHNjYW4gdG8gZmluZCB0aGUgZGV2aWNlIGFuZCBnZXQgdGhlIHBhZ2Ugc2l6ZSAqLworCWlmIChuYW5kX3NjYW5faWRlbnQobXRkLCAxKSkgeworCQlyZXMgPSAtRU5YSU87CisJCWdvdG8gb3V0OworCX0KKworCWlmIChuYW5kX2NoaXAtPmVjYy5tb2RlID09IE5BTkRfRUNDX0hXX1NZTkRST01FKSB7CisJCS8qIEVDQyBpcyBjYWxjdWxhdGVkIGZvciB0aGUgd2hvbGUgcGFnZSAoMSBzdGVwKSAqLworCQluYW5kX2NoaXAtPmVjYy5zaXplID0gbXRkLT53cml0ZXNpemU7CisKKwkJLyogc2V0IEVDQyBwYWdlIHNpemUgYW5kIG9vYiBsYXlvdXQgKi8KKwkJc3dpdGNoIChtdGQtPndyaXRlc2l6ZSkgeworCQljYXNlIDUxMjoKKwkJCW5hbmRfY2hpcC0+ZWNjLmxheW91dCA9ICZhdDkxX29vYmluZm9fc21hbGw7CisJCQluYW5kX2NoaXAtPmVjYy5yZWFkX29vYiA9IGF0OTFfbmFuZF9yZWFkX29vYl81MTI7CisJCQluYW5kX2NoaXAtPmVjYy53cml0ZV9vb2IgPSBhdDkxX25hbmRfd3JpdGVfb29iXzUxMjsKKwkJCWVjY193cml0ZWwoaG9zdC0+ZWNjLCBNUiwgQVQ5MV9FQ0NfUEFHRVNJWkVfNTI4KTsKKwkJCWJyZWFrOworCQljYXNlIDEwMjQ6CisJCQluYW5kX2NoaXAtPmVjYy5sYXlvdXQgPSAmYXQ5MV9vb2JpbmZvX2xhcmdlOworCQkJZWNjX3dyaXRlbChob3N0LT5lY2MsIE1SLCBBVDkxX0VDQ19QQUdFU0laRV8xMDU2KTsKKwkJCWJyZWFrOworCQljYXNlIDIwNDg6CisJCQluYW5kX2NoaXAtPmVjYy5sYXlvdXQgPSAmYXQ5MV9vb2JpbmZvX2xhcmdlOworCQkJZWNjX3dyaXRlbChob3N0LT5lY2MsIE1SLCBBVDkxX0VDQ19QQUdFU0laRV8yMTEyKTsKKwkJCWJyZWFrOworCQljYXNlIDQwOTY6CisJCQluYW5kX2NoaXAtPmVjYy5sYXlvdXQgPSAmYXQ5MV9vb2JpbmZvX2xhcmdlOworCQkJZWNjX3dyaXRlbChob3N0LT5lY2MsIE1SLCBBVDkxX0VDQ19QQUdFU0laRV80MjI0KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogcGFnZSBzaXplIG5vdCBoYW5kbGVkIGJ5IEhXIEVDQyAqLworCQkJLyogc3dpdGNoaW5nIGJhY2sgdG8gc29mdCBFQ0MgKi8KKwkJCW5hbmRfY2hpcC0+ZWNjLm1vZGUgPSBOQU5EX0VDQ19TT0ZUOworCQkJbmFuZF9jaGlwLT5lY2MuY2FsY3VsYXRlID0gTlVMTDsKKwkJCW5hbmRfY2hpcC0+ZWNjLmNvcnJlY3QgPSBOVUxMOworCQkJbmFuZF9jaGlwLT5lY2MuaHdjdGwgPSBOVUxMOworCQkJbmFuZF9jaGlwLT5lY2MucmVhZF9wYWdlID0gTlVMTDsKKwkJCW5hbmRfY2hpcC0+ZWNjLnBvc3RwYWQgPSAwOworCQkJbmFuZF9jaGlwLT5lY2MucHJlcGFkID0gMDsKKwkJCW5hbmRfY2hpcC0+ZWNjLmJ5dGVzID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogc2Vjb25kIHBoYXNlIHNjYW4gKi8KKwlpZiAobmFuZF9zY2FuX3RhaWwobXRkKSkgewogCQlyZXMgPSAtRU5YSU87CiAJCWdvdG8gb3V0OwogCX0KQEAgLTE3OSw5ICs1MjksMTUgQEAKIAlpZiAoIXJlcykKIAkJcmV0dXJuIHJlczsKIAorI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUwogcmVsZWFzZToKKyNlbmRpZgogCW5hbmRfcmVsZWFzZShtdGQpOworCiBvdXQ6CisJaW91bm1hcChob3N0LT5lY2MpOworCitlcnJfZWNjX2lvcmVtYXA6CiAJYXQ5MV9uYW5kX2Rpc2FibGUoaG9zdCk7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJaW91bm1hcChob3N0LT5pb19iYXNlKTsKQEAgLTIwMiw2ICs1NTgsNyBAQAogCWF0OTFfbmFuZF9kaXNhYmxlKGhvc3QpOwogCiAJaW91bm1hcChob3N0LT5pb19iYXNlKTsKKwlpb3VubWFwKGhvc3QtPmVjYyk7CiAJa2ZyZWUoaG9zdCk7CiAKIAlyZXR1cm4gMDsKQEAgLTIzMyw0ICs1OTAsNSBAQAogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJSaWNrIEJyb25zb24iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTkFORC9TbWFydE1lZGlhIGRyaXZlciBmb3IgQVQ5MVJNOTIwMCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOQU5EL1NtYXJ0TWVkaWEgZHJpdmVyIGZvciBBVDkxUk05MjAwIC8gQVQ5MVNBTTkiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06YXQ5MV9uYW5kIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2JmNXh4X25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvYmY1eHhfbmFuZC5jCmluZGV4IDc0NzA0MmEuLmU4N2E1NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvYmY1eHhfbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvYmY1eHhfbmFuZC5jCkBAIC0xLDYgKzEsNiBAQAogLyogbGludXgvZHJpdmVycy9tdGQvbmFuZC9iZjV4eF9uYW5kLmMKICAqCi0gKiBDb3B5cmlnaHQgMjAwNi0yMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA2LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoJaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwogICoJQnJ5YW4gV3UgPGJyeWFuLnd1QGFuYWxvZy5jb20+CiAgKgpAQCAtNzQsNyArNzQsNyBAQAogc3RhdGljIGludCBoYXJkd2FyZV9lY2M7CiAjZW5kaWYKIAotc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fbmZjX3Bpbl9yZXFbXSA9CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgYmZpbl9uZmNfcGluX3JlcVtdID0KIAl7UF9OQU5EX0NFLAogCSBQX05BTkRfUkIsCiAJIFBfTkFORF9EMCwKQEAgLTU4MSwxMiArNTgxLDYgQEAKIAliZmluX3dyaXRlX05GQ19JUlFTVEFUKHZhbCk7CiAJU1NZTkMoKTsKIAotCWlmIChwZXJpcGhlcmFsX3JlcXVlc3RfbGlzdChiZmluX25mY19waW5fcmVxLCBEUlZfTkFNRSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCi0JCSI6IFJlcXVlc3RpbmcgUGVyaXBoZXJhbHMgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCiAJLyogRE1BIGluaXRpYWxpemF0aW9uICAqLwogCWlmIChiZjV4eF9uYW5kX2RtYV9pbml0KGluZm8pKQogCQllcnIgPSAtRU5YSU87CkBAIC02NTQsNiArNjQ4LDEyIEBACiAKIAlkZXZfZGJnKCZwZGV2LT5kZXYsICIoJXApXG4iLCBwZGV2KTsKIAorCWlmIChwZXJpcGhlcmFsX3JlcXVlc3RfbGlzdChiZmluX25mY19waW5fcmVxLCBEUlZfTkFNRSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCisJCSI6IFJlcXVlc3RpbmcgUGVyaXBoZXJhbHMgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCiAJaWYgKCFwbGF0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHBsYXRmb3JtIHNwZWNpZmljIGluZm9ybWF0aW9uXG4iKTsKIAkJZ290byBleGl0X2Vycm9yOwpAQCAtODAzLDMgKzgwMyw0IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKERSVl9BVVRIT1IpOwogTU9EVUxFX0RFU0NSSVBUSU9OKERSVl9ERVNDKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06IiBEUlZfTkFNRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2NzNTUzeF9uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL2NzNTUzeF9uYW5kLmMKaW5kZXggOGRhYjY5Ni4uMzM3MGE4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9jczU1M3hfbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvY3M1NTN4X25hbmQuYwpAQCAtMjc5LDcgKzI3OSw3IEBACiAKIAogI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUwotY29uc3QgY2hhciAqcGFydF9wcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCB9Oworc3RhdGljIGNvbnN0IGNoYXIgKnBhcnRfcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKICNlbmRpZgogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvZnNsX2VsYmNfbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9mc2xfZWxiY19uYW5kLmMKaW5kZXggMzc4YjdhYS4uNGI2OWFhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9mc2xfZWxiY19uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9mc2xfZWxiY19uYW5kLmMKQEAgLTE4NCwxMSArMTg0LDExIEBACiAJICAgICAgICAgaW5fYmUzMigmbGJjLT5mYmFyKSwgaW5fYmUzMigmbGJjLT5mcGFyKSwKIAkgICAgICAgICBpbl9iZTMyKCZsYmMtPmZiY3IpLCBwcml2LT5iYW5rKTsKIAorCWN0cmwtPmlycV9zdGF0dXMgPSAwOwogCS8qIGV4ZWN1dGUgc3BlY2lhbCBvcGVyYXRpb24gKi8KIAlvdXRfYmUzMigmbGJjLT5sc29yLCBwcml2LT5iYW5rKTsKIAogCS8qIHdhaXQgZm9yIEZDTSBjb21wbGV0ZSBmbGFnIG9yIHRpbWVvdXQgKi8KLQljdHJsLT5pcnFfc3RhdHVzID0gMDsKIAl3YWl0X2V2ZW50X3RpbWVvdXQoY3RybC0+aXJxX3dhaXQsIGN0cmwtPmlycV9zdGF0dXMsCiAJICAgICAgICAgICAgICAgICAgIEZDTV9USU1FT1VUX01TRUNTICogSFovMTAwMCk7CiAJY3RybC0+c3RhdHVzID0gY3RybC0+aXJxX3N0YXR1czsKQEAgLTM0NiwxOSArMzQ2LDIwIEBACiAJCWN0cmwtPmNvbHVtbiA9IGNvbHVtbjsKIAkJY3RybC0+b29iID0gMDsKIAotCQlmY3IgPSAoTkFORF9DTURfUEFHRVBST0cgPDwgRkNSX0NNRDFfU0hJRlQpIHwKLQkJICAgICAgKE5BTkRfQ01EX1NFUUlOIDw8IEZDUl9DTUQyX1NISUZUKTsKLQogCQlpZiAocHJpdi0+cGFnZV9zaXplKSB7CisJCQlmY3IgPSAoTkFORF9DTURfU0VRSU4gPDwgRkNSX0NNRDBfU0hJRlQpIHwKKwkJCSAgICAgIChOQU5EX0NNRF9QQUdFUFJPRyA8PCBGQ1JfQ01EMV9TSElGVCk7CisKIAkJCW91dF9iZTMyKCZsYmMtPmZpciwKIAkJCSAgICAgICAgIChGSVJfT1BfQ1cwIDw8IEZJUl9PUDBfU0hJRlQpIHwKIAkJCSAgICAgICAgIChGSVJfT1BfQ0EgIDw8IEZJUl9PUDFfU0hJRlQpIHwKIAkJCSAgICAgICAgIChGSVJfT1BfUEEgIDw8IEZJUl9PUDJfU0hJRlQpIHwKIAkJCSAgICAgICAgIChGSVJfT1BfV0IgIDw8IEZJUl9PUDNfU0hJRlQpIHwKIAkJCSAgICAgICAgIChGSVJfT1BfQ1cxIDw8IEZJUl9PUDRfU0hJRlQpKTsKLQotCQkJZmNyIHw9IE5BTkRfQ01EX1JFQUQwIDw8IEZDUl9DTUQwX1NISUZUOwogCQl9IGVsc2UgeworCQkJZmNyID0gKE5BTkRfQ01EX1BBR0VQUk9HIDw8IEZDUl9DTUQxX1NISUZUKSB8CisJCQkgICAgICAoTkFORF9DTURfU0VRSU4gPDwgRkNSX0NNRDJfU0hJRlQpOworCiAJCQlvdXRfYmUzMigmbGJjLT5maXIsCiAJCQkgICAgICAgICAoRklSX09QX0NXMCA8PCBGSVJfT1AwX1NISUZUKSB8CiAJCQkgICAgICAgICAoRklSX09QX0NNMiA8PCBGSVJfT1AxX1NISUZUKSB8CkBAIC00ODAsNyArNDgxLDcgQEAKIAlzdHJ1Y3QgZnNsX2VsYmNfY3RybCAqY3RybCA9IHByaXYtPmN0cmw7CiAJdW5zaWduZWQgaW50IGJ1ZnNpemUgPSBtdGQtPndyaXRlc2l6ZSArIG10ZC0+b29ic2l6ZTsKIAotCWlmIChsZW4gPCAwKSB7CisJaWYgKGxlbiA8PSAwKSB7CiAJCWRldl9lcnIoY3RybC0+ZGV2LCAid3JpdGVfYnVmIG9mICVkIGJ5dGVzIiwgbGVuKTsKIAkJY3RybC0+c3RhdHVzID0gMDsKIAkJcmV0dXJuOwpAQCAtNDk1LDYgKzQ5NiwxNSBAQAogCX0KIAogCW1lbWNweV90b2lvKCZjdHJsLT5hZGRyW2N0cmwtPmluZGV4XSwgYnVmLCBsZW4pOworCS8qCisJICogVGhpcyBpcyB3b3JrYXJvdW5kIGZvciB0aGUgd2VpcmQgZWxiYyBoYW5ncyBkdXJpbmcgbmFuZCB3cml0ZSwKKwkgKiBTY290dCBXb29kIHNheXM6ICIuLi5wZXJoYXBzIGRpZmZlcmVuY2UgaW4gaG93IGxvbmcgaXQgdGFrZXMgYQorCSAqIHdyaXRlIHRvIG1ha2UgaXQgdGhyb3VnaCB0aGUgbG9jYWxidXMgY29tcGFyZWQgdG8gYSB3cml0ZSB0byBJTU1SCisJICogaXMgY2F1c2luZyBwcm9ibGVtcywgYW5kIHN5bmMgaXNuJ3QgaGVscGluZyBmb3Igc29tZSByZWFzb24uIgorCSAqIFJlYWRpbmcgYmFjayB0aGUgbGFzdCBieXRlIGhlbHBzIHRob3VnaC4KKwkgKi8KKwlpbl84KCZjdHJsLT5hZGRyW2N0cmwtPmluZGV4XSArIGxlbiAtIDEpOworCiAJY3RybC0+aW5kZXggKz0gbGVuOwogfQogCkBAIC02NjYsNyArNjc2LDcgQEAKIAkvKiBhZGp1c3QgT3B0aW9uIFJlZ2lzdGVyIGFuZCBFQ0MgdG8gbWF0Y2ggRmxhc2ggcGFnZSBzaXplICovCiAJaWYgKG10ZC0+d3JpdGVzaXplID09IDUxMikgewogCQlwcml2LT5wYWdlX3NpemUgPSAwOwotCQljbHJiaXRzMzIoJmxiYy0+YmFua1twcml2LT5iYW5rXS5vciwgfk9SX0ZDTV9QR1MpOworCQljbHJiaXRzMzIoJmxiYy0+YmFua1twcml2LT5iYW5rXS5vciwgT1JfRkNNX1BHUyk7CiAJfSBlbHNlIGlmIChtdGQtPndyaXRlc2l6ZSA9PSAyMDQ4KSB7CiAJCXByaXYtPnBhZ2Vfc2l6ZSA9IDE7CiAJCXNldGJpdHMzMigmbGJjLT5iYW5rW3ByaXYtPmJhbmtdLm9yLCBPUl9GQ01fUEdTKTsKQEAgLTY4NywxMSArNjk3LDYgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCS8qIFRoZSBkZWZhdWx0IHUtYm9vdCBjb25maWd1cmF0aW9uIG9uIE1QQzgzMTNFUkRCIGNhdXNlcyBlcnJvcnM7Ci0JICogbW9yZSBkZWxheSBpcyBuZWVkZWQuICBUaGlzIHNob3VsZCBiZSBzYWZlIGZvciBvdGhlciBib2FyZHMKLQkgKiBhcyB3ZWxsLgotCSAqLwotCXNldGJpdHMzMigmbGJjLT5iYW5rW3ByaXYtPmJhbmtdLm9yLCAweDcwKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzc5LDYgKzc4NCw4IEBACiAKIAluYW5kX3JlbGVhc2UoJnByaXYtPm10ZCk7CiAKKwlrZnJlZShwcml2LT5tdGQubmFtZSk7CisKIAlpZiAocHJpdi0+dmJhc2UpCiAJCWlvdW5tYXAocHJpdi0+dmJhc2UpOwogCkBAIC04MzksNiArODQ2LDEyIEBACiAJCWdvdG8gZXJyOwogCX0KIAorCXByaXYtPm10ZC5uYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIleC5mbGFzaCIsIHJlcy5zdGFydCk7CisJaWYgKCFwcml2LT5tdGQubmFtZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKIAlyZXQgPSBmc2xfZWxiY19jaGlwX2luaXQocHJpdik7CiAJaWYgKHJldCkKIAkJZ290byBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2ZzbF91cG0uYyBiL2RyaXZlcnMvbXRkL25hbmQvZnNsX3VwbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYmZkODcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC9uYW5kL2ZzbF91cG0uYwpAQCAtMCwwICsxLDI5MSBAQAorLyoKKyAqIEZyZWVzY2FsZSBVUE0gTkFORCBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IMKpIDIwMDctMjAwOCAgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIEF1dGhvcjogQW50b24gVm9yb250c292IDxhdm9yb250c292QHJ1Lm12aXN0YS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9lY2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS9mc2xfbGJjLmg+CisKK3N0cnVjdCBmc2xfdXBtX25hbmQgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbXRkX2luZm8gbXRkOworCXN0cnVjdCBuYW5kX2NoaXAgY2hpcDsKKwlpbnQgbGFzdF9jdHJsOworI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUworCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0czsKKyNlbmRpZgorCisJc3RydWN0IGZzbF91cG0gdXBtOworCXVpbnQ4X3QgdXBtX2FkZHJfb2Zmc2V0OworCXVpbnQ4X3QgdXBtX2NtZF9vZmZzZXQ7CisJdm9pZCBfX2lvbWVtICppb19iYXNlOworCWludCBybmJfZ3BpbzsKKwljb25zdCB1aW50MzJfdCAqd2FpdF9wYXR0ZXJuOworCWNvbnN0IHVpbnQzMl90ICp3YWl0X3dyaXRlOworCWludCBjaGlwX2RlbGF5OworfTsKKworI2RlZmluZSB0b19mc2xfdXBtX25hbmQobXRkKSBjb250YWluZXJfb2YobXRkLCBzdHJ1Y3QgZnNsX3VwbV9uYW5kLCBtdGQpCisKK3N0YXRpYyBpbnQgZnVuX2NoaXBfcmVhZHkoc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJc3RydWN0IGZzbF91cG1fbmFuZCAqZnVuID0gdG9fZnNsX3VwbV9uYW5kKG10ZCk7CisKKwlpZiAoZ3Bpb19nZXRfdmFsdWUoZnVuLT5ybmJfZ3BpbykpCisJCXJldHVybiAxOworCisJZGV2X3ZkYmcoZnVuLT5kZXYsICJidXN5XG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnVuX3dhaXRfcm5iKHN0cnVjdCBmc2xfdXBtX25hbmQgKmZ1bikKK3sKKwlpbnQgY250ID0gMTAwMDAwMDsKKworCWlmIChmdW4tPnJuYl9ncGlvID49IDApIHsKKwkJd2hpbGUgKC0tY250ICYmICFmdW5fY2hpcF9yZWFkeSgmZnVuLT5tdGQpKQorCQkJY3B1X3JlbGF4KCk7CisJfQorCisJaWYgKCFjbnQpCisJCWRldl9lcnIoZnVuLT5kZXYsICJ0aXJlZCB3YWl0aW5nIGZvciBSTkJcbiIpOworfQorCitzdGF0aWMgdm9pZCBmdW5fY21kX2N0cmwoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBjbWQsIHVuc2lnbmVkIGludCBjdHJsKQoreworCXN0cnVjdCBmc2xfdXBtX25hbmQgKmZ1biA9IHRvX2ZzbF91cG1fbmFuZChtdGQpOworCisJaWYgKCEoY3RybCAmIGZ1bi0+bGFzdF9jdHJsKSkgeworCQlmc2xfdXBtX2VuZF9wYXR0ZXJuKCZmdW4tPnVwbSk7CisKKwkJaWYgKGNtZCA9PSBOQU5EX0NNRF9OT05FKQorCQkJcmV0dXJuOworCisJCWZ1bi0+bGFzdF9jdHJsID0gY3RybCAmIChOQU5EX0FMRSB8IE5BTkRfQ0xFKTsKKwl9CisKKwlpZiAoY3RybCAmIE5BTkRfQ1RSTF9DSEFOR0UpIHsKKwkJaWYgKGN0cmwgJiBOQU5EX0FMRSkKKwkJCWZzbF91cG1fc3RhcnRfcGF0dGVybigmZnVuLT51cG0sIGZ1bi0+dXBtX2FkZHJfb2Zmc2V0KTsKKwkJZWxzZSBpZiAoY3RybCAmIE5BTkRfQ0xFKQorCQkJZnNsX3VwbV9zdGFydF9wYXR0ZXJuKCZmdW4tPnVwbSwgZnVuLT51cG1fY21kX29mZnNldCk7CisJfQorCisJZnNsX3VwbV9ydW5fcGF0dGVybigmZnVuLT51cG0sIGZ1bi0+aW9fYmFzZSwgY21kKTsKKworCWlmIChmdW4tPndhaXRfcGF0dGVybikKKwkJZnVuX3dhaXRfcm5iKGZ1bik7Cit9CisKK3N0YXRpYyB1aW50OF90IGZ1bl9yZWFkX2J5dGUoc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJc3RydWN0IGZzbF91cG1fbmFuZCAqZnVuID0gdG9fZnNsX3VwbV9uYW5kKG10ZCk7CisKKwlyZXR1cm4gaW5fOChmdW4tPmNoaXAuSU9fQUREUl9SKTsKK30KKworc3RhdGljIHZvaWQgZnVuX3JlYWRfYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1aW50OF90ICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGZzbF91cG1fbmFuZCAqZnVuID0gdG9fZnNsX3VwbV9uYW5kKG10ZCk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCWJ1ZltpXSA9IGluXzgoZnVuLT5jaGlwLklPX0FERFJfUik7Cit9CisKK3N0YXRpYyB2b2lkIGZ1bl93cml0ZV9idWYoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgZnNsX3VwbV9uYW5kICpmdW4gPSB0b19mc2xfdXBtX25hbmQobXRkKTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlvdXRfOChmdW4tPmNoaXAuSU9fQUREUl9XLCBidWZbaV0pOworCQlpZiAoZnVuLT53YWl0X3dyaXRlKQorCQkJZnVuX3dhaXRfcm5iKGZ1bik7CisJfQorfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBmdW5fY2hpcF9pbml0KHN0cnVjdCBmc2xfdXBtX25hbmQgKmZ1bikKK3sKKwlpbnQgcmV0OworI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUworCXN0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3R5cGVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwsIH07CisjZW5kaWYKKworCWZ1bi0+Y2hpcC5JT19BRERSX1IgPSBmdW4tPmlvX2Jhc2U7CisJZnVuLT5jaGlwLklPX0FERFJfVyA9IGZ1bi0+aW9fYmFzZTsKKwlmdW4tPmNoaXAuY21kX2N0cmwgPSBmdW5fY21kX2N0cmw7CisJZnVuLT5jaGlwLmNoaXBfZGVsYXkgPSBmdW4tPmNoaXBfZGVsYXk7CisJZnVuLT5jaGlwLnJlYWRfYnl0ZSA9IGZ1bl9yZWFkX2J5dGU7CisJZnVuLT5jaGlwLnJlYWRfYnVmID0gZnVuX3JlYWRfYnVmOworCWZ1bi0+Y2hpcC53cml0ZV9idWYgPSBmdW5fd3JpdGVfYnVmOworCWZ1bi0+Y2hpcC5lY2MubW9kZSA9IE5BTkRfRUNDX1NPRlQ7CisKKwlpZiAoZnVuLT5ybmJfZ3BpbyA+PSAwKQorCQlmdW4tPmNoaXAuZGV2X3JlYWR5ID0gZnVuX2NoaXBfcmVhZHk7CisKKwlmdW4tPm10ZC5wcml2ID0gJmZ1bi0+Y2hpcDsKKwlmdW4tPm10ZC5vd25lciA9IFRISVNfTU9EVUxFOworCisJcmV0ID0gbmFuZF9zY2FuKCZmdW4tPm10ZCwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWZ1bi0+bXRkLm5hbWUgPSBmdW4tPmRldi0+YnVzX2lkOworCisjaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCisJcmV0ID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoJmZ1bi0+bXRkLCBwYXJ0X3R5cGVzLCAmZnVuLT5wYXJ0cywgMCk7CisJaWYgKHJldCA+IDApCisJCXJldHVybiBhZGRfbXRkX3BhcnRpdGlvbnMoJmZ1bi0+bXRkLCBmdW4tPnBhcnRzLCByZXQpOworI2VuZGlmCisJcmV0dXJuIGFkZF9tdGRfZGV2aWNlKCZmdW4tPm10ZCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGZ1bl9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZmlkKQoreworCXN0cnVjdCBmc2xfdXBtX25hbmQgKmZ1bjsKKwlzdHJ1Y3QgcmVzb3VyY2UgaW9fcmVzOworCWNvbnN0IHVpbnQzMl90ICpwcm9wOworCWludCByZXQ7CisJaW50IHNpemU7CisKKwlmdW4gPSBremFsbG9jKHNpemVvZigqZnVuKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmdW4pCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShvZmRldi0+bm9kZSwgMCwgJmlvX3Jlcyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZvZmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IElPIGJhc2VcbiIpOworCQlnb3RvIGVycjE7CisJfQorCisJcmV0ID0gZnNsX3VwbV9maW5kKGlvX3Jlcy5zdGFydCwgJmZ1bi0+dXBtKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJm9mZGV2LT5kZXYsICJjYW4ndCBmaW5kIFVQTVxuIik7CisJCWdvdG8gZXJyMTsKKwl9CisKKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG9mZGV2LT5ub2RlLCAiZnNsLHVwbS1hZGRyLW9mZnNldCIsICZzaXplKTsKKwlpZiAoIXByb3AgfHwgc2l6ZSAhPSBzaXplb2YodWludDMyX3QpKSB7CisJCWRldl9lcnIoJm9mZGV2LT5kZXYsICJjYW4ndCBnZXQgVVBNIGFkZHJlc3Mgb2Zmc2V0XG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnIyOworCX0KKwlmdW4tPnVwbV9hZGRyX29mZnNldCA9ICpwcm9wOworCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShvZmRldi0+bm9kZSwgImZzbCx1cG0tY21kLW9mZnNldCIsICZzaXplKTsKKwlpZiAoIXByb3AgfHwgc2l6ZSAhPSBzaXplb2YodWludDMyX3QpKSB7CisJCWRldl9lcnIoJm9mZGV2LT5kZXYsICJjYW4ndCBnZXQgVVBNIGNvbW1hbmQgb2Zmc2V0XG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnIyOworCX0KKwlmdW4tPnVwbV9jbWRfb2Zmc2V0ID0gKnByb3A7CisKKwlmdW4tPnJuYl9ncGlvID0gb2ZfZ2V0X2dwaW8ob2ZkZXYtPm5vZGUsIDApOworCWlmIChmdW4tPnJuYl9ncGlvID49IDApIHsKKwkJcmV0ID0gZ3Bpb19yZXF1ZXN0KGZ1bi0+cm5iX2dwaW8sIG9mZGV2LT5kZXYuYnVzX2lkKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycigmb2ZkZXYtPmRldiwgImNhbid0IHJlcXVlc3QgUk5CIGdwaW9cbiIpOworCQkJZ290byBlcnIyOworCQl9CisJCWdwaW9fZGlyZWN0aW9uX2lucHV0KGZ1bi0+cm5iX2dwaW8pOworCX0gZWxzZSBpZiAoZnVuLT5ybmJfZ3BpbyA9PSAtRUlOVkFMKSB7CisJCWRldl9lcnIoJm9mZGV2LT5kZXYsICJzcGVjaWZpZWQgUk5CIGdwaW8gaXMgaW52YWxpZFxuIik7CisJCWdvdG8gZXJyMjsKKwl9CisKKwlmdW4tPmlvX2Jhc2UgPSBkZXZtX2lvcmVtYXBfbm9jYWNoZSgmb2ZkZXYtPmRldiwgaW9fcmVzLnN0YXJ0LAorCQkJCQkgIGlvX3Jlcy5lbmQgLSBpb19yZXMuc3RhcnQgKyAxKTsKKwlpZiAoIWZ1bi0+aW9fYmFzZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjI7CisJfQorCisJZnVuLT5kZXYgPSAmb2ZkZXYtPmRldjsKKwlmdW4tPmxhc3RfY3RybCA9IE5BTkRfQ0xFOworCWZ1bi0+d2FpdF9wYXR0ZXJuID0gb2ZfZ2V0X3Byb3BlcnR5KG9mZGV2LT5ub2RlLCAiZnNsLHdhaXQtcGF0dGVybiIsCisJCQkJCSAgICBOVUxMKTsKKwlmdW4tPndhaXRfd3JpdGUgPSBvZl9nZXRfcHJvcGVydHkob2ZkZXYtPm5vZGUsICJmc2wsd2FpdC13cml0ZSIsIE5VTEwpOworCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShvZmRldi0+bm9kZSwgImNoaXAtZGVsYXkiLCBOVUxMKTsKKwlpZiAocHJvcCkKKwkJZnVuLT5jaGlwX2RlbGF5ID0gKnByb3A7CisJZWxzZQorCQlmdW4tPmNoaXBfZGVsYXkgPSA1MDsKKworCXJldCA9IGZ1bl9jaGlwX2luaXQoZnVuKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjI7CisKKwlkZXZfc2V0X2RydmRhdGEoJm9mZGV2LT5kZXYsIGZ1bik7CisKKwlyZXR1cm4gMDsKK2VycjI6CisJaWYgKGZ1bi0+cm5iX2dwaW8gPj0gMCkKKwkJZ3Bpb19mcmVlKGZ1bi0+cm5iX2dwaW8pOworZXJyMToKKwlrZnJlZShmdW4pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZnVuX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldikKK3sKKwlzdHJ1Y3QgZnNsX3VwbV9uYW5kICpmdW4gPSBkZXZfZ2V0X2RydmRhdGEoJm9mZGV2LT5kZXYpOworCisJbmFuZF9yZWxlYXNlKCZmdW4tPm10ZCk7CisKKwlpZiAoZnVuLT5ybmJfZ3BpbyA+PSAwKQorCQlncGlvX2ZyZWUoZnVuLT5ybmJfZ3Bpbyk7CisKKwlrZnJlZShmdW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX2Z1bl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLHVwbS1uYW5kIiB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG9mX2Z1bl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIG9mX2Z1bl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImZzbCx1cG0tbmFuZCIsCisJLm1hdGNoX3RhYmxlCT0gb2ZfZnVuX21hdGNoLAorCS5wcm9iZQkJPSBmdW5fcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChmdW5fcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGZ1bl9tb2R1bGVfaW5pdCh2b2lkKQoreworCXJldHVybiBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJm9mX2Z1bl9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoZnVuX21vZHVsZV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGZ1bl9tb2R1bGVfZXhpdCh2b2lkKQoreworCW9mX3VucmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZvZl9mdW5fZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGZ1bl9tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkFudG9uIFZvcm9udHNvdiA8YXZvcm9udHNvdkBydS5tdmlzdGEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIE5BTkQgY2hpcHMgd29ya2luZyB0aHJvdWdoIEZyZWVzY2FsZSAiCisJCSAgICJMb2NhbEJ1cyBVc2VyLVByb2dyYW1tYWJsZSBNYWNoaW5lIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmFzZS5jIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2Jhc2UuYwppbmRleCA3YWNiMWEwLi5iYTFiZGY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmFzZS5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMKQEAgLTIyMjksNiArMjIyOSw3IEBACiB7CiAJc3RydWN0IG5hbmRfZmxhc2hfZGV2ICp0eXBlID0gTlVMTDsKIAlpbnQgaSwgZGV2X2lkLCBtYWZfaWR4OworCWludCB0bXBfaWQsIHRtcF9tYW5mOwogCiAJLyogU2VsZWN0IHRoZSBkZXZpY2UgKi8KIAljaGlwLT5zZWxlY3RfY2hpcChtdGQsIDApOwpAQCAtMjI0MCw2ICsyMjQxLDI2IEBACiAJKm1hZl9pZCA9IGNoaXAtPnJlYWRfYnl0ZShtdGQpOwogCWRldl9pZCA9IGNoaXAtPnJlYWRfYnl0ZShtdGQpOwogCisJLyogVHJ5IGFnYWluIHRvIG1ha2Ugc3VyZSwgYXMgc29tZSBzeXN0ZW1zIHRoZSBidXMtaG9sZCBvciBvdGhlcgorCSAqIGludGVyZmFjZSBjb25jZXJucyBjYW4gY2F1c2UgcmFuZG9tIGRhdGEgd2hpY2ggbG9va3MgbGlrZSBhCisJICogcG9zc2libHkgY3JlZGlibGUgTkFORCBmbGFzaCB0byBhcHBlYXIuIElmIHRoZSB0d28gcmVzdWx0cyBkbworCSAqIG5vdCBtYXRjaCwgaWdub3JlIHRoZSBkZXZpY2UgY29tcGxldGVseS4KKwkgKi8KKworCWNoaXAtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9SRUFESUQsIDB4MDAsIC0xKTsKKworCS8qIFJlYWQgbWFudWZhY3R1cmVyIGFuZCBkZXZpY2UgSURzICovCisKKwl0bXBfbWFuZiA9IGNoaXAtPnJlYWRfYnl0ZShtdGQpOworCXRtcF9pZCA9IGNoaXAtPnJlYWRfYnl0ZShtdGQpOworCisJaWYgKHRtcF9tYW5mICE9ICptYWZfaWQgfHwgdG1wX2lkICE9IGRldl9pZCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogc2Vjb25kIElEIHJlYWQgZGlkIG5vdCBtYXRjaCAiCisJCSAgICAgICAiJTAyeCwlMDJ4IGFnYWluc3QgJTAyeCwlMDJ4XG4iLCBfX2Z1bmNfXywKKwkJICAgICAgICptYWZfaWQsIGRldl9pZCwgdG1wX21hbmYsIHRtcF9pZCk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCX0KKwogCS8qIExvb2t1cCB0aGUgZmxhc2ggaWQgKi8KIAlmb3IgKGkgPSAwOyBuYW5kX2ZsYXNoX2lkc1tpXS5uYW1lICE9IE5VTEw7IGkrKykgewogCQlpZiAoZGV2X2lkID09IG5hbmRfZmxhc2hfaWRzW2ldLmlkKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL25kZmMuYyBiL2RyaXZlcnMvbXRkL25hbmQvbmRmYy5jCmluZGV4IDFjMGU4OWYuLjk1NTk1OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbmRmYy5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvbmRmYy5jCkBAIC0zMTcsMyArMzE3LDUgQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIlRob21hcyBHbGVpeG5lciA8dGdseEBsaW51dHJvbml4LmRlPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJQbGF0Zm9ybSBkcml2ZXIgZm9yIE5ERkMiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06bmRmYy1jaGlwIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOm5kZmMtbmFuZCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9vcmlvbl9uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL29yaW9uX25hbmQuYwppbmRleCBlYzVhZDI4Li41OWUwNWExIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL29yaW9uX25hbmQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL29yaW9uX25hbmQuYwpAQCAtMTY5LDMgKzE2OSw0IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJUemFjaGkgUGVyZWxzdGVpbiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJOQU5EIGdsdWUgZm9yIE9yaW9uIHBsYXRmb3JtcyIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpvcmlvbl9uYW5kIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3BsYXRfbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9wbGF0X25hbmQuYwppbmRleCBmNmQ1YzJhLi5mNjc0YzU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL3BsYXRfbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvcGxhdF9uYW5kLmMKQEAgLTU0LDYgKzU0LDcgQEAKIAlkYXRhLT5jaGlwLnByaXYgPSAmZGF0YTsKIAlkYXRhLT5tdGQucHJpdiA9ICZkYXRhLT5jaGlwOwogCWRhdGEtPm10ZC5vd25lciA9IFRISVNfTU9EVUxFOworCWRhdGEtPm10ZC5uYW1lID0gcGRldi0+ZGV2LmJ1c19pZDsKIAogCWRhdGEtPmNoaXAuSU9fQUREUl9SID0gZGF0YS0+aW9fYmFzZTsKIAlkYXRhLT5jaGlwLklPX0FERFJfVyA9IGRhdGEtPmlvX2Jhc2U7CkBAIC0xNTAsMyArMTUxLDQgQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIlZpdGFseSBXb29sIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlNpbXBsZSBnZW5lcmljIE5BTkQgZHJpdmVyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmdlbl9uYW5kIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3B4YTN4eF9uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL3B4YTN4eF9uYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNlYjQ2OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvcHhhM3h4X25hbmQuYwpAQCAtMCwwICsxLDEyNDkgQEAKKy8qCisgKiBkcml2ZXJzL210ZC9uYW5kL3B4YTN4eF9uYW5kLmMKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IMKpIDIwMDYgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhM3h4X25hbmQuaD4KKworI2RlZmluZQlDSElQX0RFTEFZX1RJTUVPVVQJKDIgKiBIWi8xMCkKKworLyogcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgTkRDUgkJKDB4MDApIC8qIENvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTkRUUjBDUzAJKDB4MDQpIC8qIFRpbWluZyBQYXJhbWV0ZXIgMCBmb3IgQ1MwICovCisjZGVmaW5lIE5EVFIxQ1MwCSgweDBDKSAvKiBUaW1pbmcgUGFyYW1ldGVyIDEgZm9yIENTMCAqLworI2RlZmluZSBORFNSCQkoMHgxNCkgLyogU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE5EUENSCQkoMHgxOCkgLyogUGFnZSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZSBOREJEUjAJCSgweDFDKSAvKiBCYWQgQmxvY2sgUmVnaXN0ZXIgMCAqLworI2RlZmluZSBOREJEUjEJCSgweDIwKSAvKiBCYWQgQmxvY2sgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBORERCCQkoMHg0MCkgLyogRGF0YSBCdWZmZXIgKi8KKyNkZWZpbmUgTkRDQjAJCSgweDQ4KSAvKiBDb21tYW5kIEJ1ZmZlcjAgKi8KKyNkZWZpbmUgTkRDQjEJCSgweDRDKSAvKiBDb21tYW5kIEJ1ZmZlcjEgKi8KKyNkZWZpbmUgTkRDQjIJCSgweDUwKSAvKiBDb21tYW5kIEJ1ZmZlcjIgKi8KKworI2RlZmluZSBORENSX1NQQVJFX0VOCQkoMHgxIDw8IDMxKQorI2RlZmluZSBORENSX0VDQ19FTgkJKDB4MSA8PCAzMCkKKyNkZWZpbmUgTkRDUl9ETUFfRU4JCSgweDEgPDwgMjkpCisjZGVmaW5lIE5EQ1JfTkRfUlVOCQkoMHgxIDw8IDI4KQorI2RlZmluZSBORENSX0RXSURUSF9DCQkoMHgxIDw8IDI3KQorI2RlZmluZSBORENSX0RXSURUSF9NCQkoMHgxIDw8IDI2KQorI2RlZmluZSBORENSX1BBR0VfU1oJCSgweDEgPDwgMjQpCisjZGVmaW5lIE5EQ1JfTkNTWAkJKDB4MSA8PCAyMykKKyNkZWZpbmUgTkRDUl9ORF9NT0RFCQkoMHgzIDw8IDIxKQorI2RlZmluZSBORENSX05BTkRfTU9ERSAgIAkoMHgwKQorI2RlZmluZSBORENSX0NMUl9QR19DTlQJCSgweDEgPDwgMjApCisjZGVmaW5lIE5EQ1JfQ0xSX0VDQwkJKDB4MSA8PCAxOSkKKyNkZWZpbmUgTkRDUl9SRF9JRF9DTlRfTUFTSwkoMHg3IDw8IDE2KQorI2RlZmluZSBORENSX1JEX0lEX0NOVCh4KQkoKCh4KSA8PCAxNikgJiBORENSX1JEX0lEX0NOVF9NQVNLKQorCisjZGVmaW5lIE5EQ1JfUkFfU1RBUlQJCSgweDEgPDwgMTUpCisjZGVmaW5lIE5EQ1JfUEdfUEVSX0JMSwkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgTkRDUl9ORF9BUkJfRU4JCSgweDEgPDwgMTIpCisKKyNkZWZpbmUgTkRTUl9NQVNLCQkoMHhmZmYpCisjZGVmaW5lIE5EU1JfUkRZCQkoMHgxIDw8IDExKQorI2RlZmluZSBORFNSX0NTMF9QQUdFRAkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgTkRTUl9DUzFfUEFHRUQJCSgweDEgPDwgOSkKKyNkZWZpbmUgTkRTUl9DUzBfQ01ERAkJKDB4MSA8PCA4KQorI2RlZmluZSBORFNSX0NTMV9DTURECQkoMHgxIDw8IDcpCisjZGVmaW5lIE5EU1JfQ1MwX0JCRAkJKDB4MSA8PCA2KQorI2RlZmluZSBORFNSX0NTMV9CQkQJCSgweDEgPDwgNSkKKyNkZWZpbmUgTkRTUl9EQkVSUgkJKDB4MSA8PCA0KQorI2RlZmluZSBORFNSX1NCRVJSCQkoMHgxIDw8IDMpCisjZGVmaW5lIE5EU1JfV1JEUkVRCQkoMHgxIDw8IDIpCisjZGVmaW5lIE5EU1JfUkREUkVRCQkoMHgxIDw8IDEpCisjZGVmaW5lIE5EU1JfV1JDTURSRVEJCSgweDEpCisKKyNkZWZpbmUgTkRDQjBfQVVUT19SUwkJKDB4MSA8PCAyNSkKKyNkZWZpbmUgTkRDQjBfQ1NFTAkJKDB4MSA8PCAyNCkKKyNkZWZpbmUgTkRDQjBfQ01EX1RZUEVfTUFTSwkoMHg3IDw8IDIxKQorI2RlZmluZSBORENCMF9DTURfVFlQRSh4KQkoKCh4KSA8PCAyMSkgJiBORENCMF9DTURfVFlQRV9NQVNLKQorI2RlZmluZSBORENCMF9OQwkJKDB4MSA8PCAyMCkKKyNkZWZpbmUgTkRDQjBfREJDCQkoMHgxIDw8IDE5KQorI2RlZmluZSBORENCMF9BRERSX0NZQ19NQVNLCSgweDcgPDwgMTYpCisjZGVmaW5lIE5EQ0IwX0FERFJfQ1lDKHgpCSgoKHgpIDw8IDE2KSAmIE5EQ0IwX0FERFJfQ1lDX01BU0spCisjZGVmaW5lIE5EQ0IwX0NNRDJfTUFTSwkJKDB4ZmYgPDwgOCkKKyNkZWZpbmUgTkRDQjBfQ01EMV9NQVNLCQkoMHhmZikKKyNkZWZpbmUgTkRDQjBfQUREUl9DWUNfU0hJRlQJKDE2KQorCisvKiBkbWEtYWJsZSBJL08gYWRkcmVzcyBmb3IgdGhlIE5BTkQgZGF0YSBhbmQgY29tbWFuZHMgKi8KKyNkZWZpbmUgTkRDQjBfRE1BX0FERFIJCSgweDQzMTAwMDQ4KQorI2RlZmluZSBORERCX0RNQV9BRERSCQkoMHg0MzEwMDA0MCkKKworLyogbWFjcm9zIGZvciByZWdpc3RlcnMgcmVhZC93cml0ZSAqLworI2RlZmluZSBuYW5kX3dyaXRlbChpbmZvLCBvZmYsIHZhbCkJXAorCV9fcmF3X3dyaXRlbCgodmFsKSwgKGluZm8pLT5tbWlvX2Jhc2UgKyAob2ZmKSkKKworI2RlZmluZSBuYW5kX3JlYWRsKGluZm8sIG9mZikJCVwKKwlfX3Jhd19yZWFkbCgoaW5mbyktPm1taW9fYmFzZSArIChvZmYpKQorCisvKiBlcnJvciBjb2RlIGFuZCBzdGF0ZSAqLworZW51bSB7CisJRVJSX05PTkUJPSAwLAorCUVSUl9ETUFCVVNFUlIJPSAtMSwKKwlFUlJfU0VORENNRAk9IC0yLAorCUVSUl9EQkVSUgk9IC0zLAorCUVSUl9CQkVSUgk9IC00LAorfTsKKworZW51bSB7CisJU1RBVEVfUkVBRFkJPSAwLAorCVNUQVRFX0NNRF9IQU5ETEUsCisJU1RBVEVfRE1BX1JFQURJTkcsCisJU1RBVEVfRE1BX1dSSVRJTkcsCisJU1RBVEVfRE1BX0RPTkUsCisJU1RBVEVfUElPX1JFQURJTkcsCisJU1RBVEVfUElPX1dSSVRJTkcsCit9OworCitzdHJ1Y3QgcHhhM3h4X25hbmRfdGltaW5nIHsKKwl1bnNpZ25lZCBpbnQJdENIOyAgLyogRW5hYmxlIHNpZ25hbCBob2xkIHRpbWUgKi8KKwl1bnNpZ25lZCBpbnQJdENTOyAgLyogRW5hYmxlIHNpZ25hbCBzZXR1cCB0aW1lICovCisJdW5zaWduZWQgaW50CXRXSDsgIC8qIE5EX25XRSBoaWdoIGR1cmF0aW9uICovCisJdW5zaWduZWQgaW50CXRXUDsgIC8qIE5EX25XRSBwdWxzZSB0aW1lICovCisJdW5zaWduZWQgaW50CXRSSDsgIC8qIE5EX25SRSBoaWdoIGR1cmF0aW9uICovCisJdW5zaWduZWQgaW50CXRSUDsgIC8qIE5EX25SRSBwdWxzZSB3aWR0aCAqLworCXVuc2lnbmVkIGludAl0UjsgICAvKiBORF9uV0UgaGlnaCB0byBORF9uUkUgbG93IGZvciByZWFkICovCisJdW5zaWduZWQgaW50CXRXSFI7IC8qIE5EX25XRSBoaWdoIHRvIE5EX25SRSBsb3cgZm9yIHN0YXR1cyByZWFkICovCisJdW5zaWduZWQgaW50CXRBUjsgIC8qIE5EX0FMRSBsb3cgdG8gTkRfblJFIGxvdyBkZWxheSAqLworfTsKKworc3RydWN0IHB4YTN4eF9uYW5kX2NtZHNldCB7CisJdWludDE2X3QJcmVhZDE7CisJdWludDE2X3QJcmVhZDI7CisJdWludDE2X3QJcHJvZ3JhbTsKKwl1aW50MTZfdAlyZWFkX3N0YXR1czsKKwl1aW50MTZfdAlyZWFkX2lkOworCXVpbnQxNl90CWVyYXNlOworCXVpbnQxNl90CXJlc2V0OworCXVpbnQxNl90CWxvY2s7CisJdWludDE2X3QJdW5sb2NrOworCXVpbnQxNl90CWxvY2tfc3RhdHVzOworfTsKKworc3RydWN0IHB4YTN4eF9uYW5kX2ZsYXNoIHsKKwlzdHJ1Y3QgcHhhM3h4X25hbmRfdGltaW5nICp0aW1pbmc7IC8qIE5BTkQgRmxhc2ggdGltaW5nICovCisJc3RydWN0IHB4YTN4eF9uYW5kX2NtZHNldCAqY21kc2V0OworCisJdWludDMyX3QgcGFnZV9wZXJfYmxvY2s7LyogUGFnZXMgcGVyIGJsb2NrIChQR19QRVJfQkxLKSAqLworCXVpbnQzMl90IHBhZ2Vfc2l6ZTsJLyogUGFnZSBzaXplIGluIGJ5dGVzIChQQUdFX1NaKSAqLworCXVpbnQzMl90IGZsYXNoX3dpZHRoOwkvKiBXaWR0aCBvZiBGbGFzaCBtZW1vcnkgKERXSURUSF9NKSAqLworCXVpbnQzMl90IGRmY193aWR0aDsJLyogV2lkdGggb2YgZmxhc2ggY29udHJvbGxlcihEV0lEVEhfQykgKi8KKwl1aW50MzJfdCBudW1fYmxvY2tzOwkvKiBOdW1iZXIgb2YgcGh5c2ljYWwgYmxvY2tzIGluIEZsYXNoICovCisJdWludDMyX3QgY2hpcF9pZDsKKworCS8qIE5PVEU6IHRoZXNlIGFyZSBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZWQsIGRvIG5vdCBkZWZpbmUgKi8KKwlzaXplX3QJCW9vYl9zaXplOworCXNpemVfdAkJcmVhZF9pZF9ieXRlczsKKworCXVuc2lnbmVkIGludAljb2xfYWRkcl9jeWNsZXM7CisJdW5zaWduZWQgaW50CXJvd19hZGRyX2N5Y2xlczsKK307CisKK3N0cnVjdCBweGEzeHhfbmFuZF9pbmZvIHsKKwlzdHJ1Y3QgbmFuZF9jaGlwCW5hbmRfY2hpcDsKKworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJICpwZGV2OworCXN0cnVjdCBweGEzeHhfbmFuZF9mbGFzaCAqZmxhc2hfaW5mbzsKKworCXN0cnVjdCBjbGsJCSpjbGs7CisJdm9pZCBfX2lvbWVtCQkqbW1pb19iYXNlOworCisJdW5zaWduZWQgaW50IAkJYnVmX3N0YXJ0OworCXVuc2lnbmVkIGludAkJYnVmX2NvdW50OworCisJLyogRE1BIGluZm9ybWF0aW9uICovCisJaW50CQkJZHJjbXJfZGF0OworCWludAkJCWRyY21yX2NtZDsKKworCXVuc2lnbmVkIGNoYXIJCSpkYXRhX2J1ZmY7CisJZG1hX2FkZHJfdCAJCWRhdGFfYnVmZl9waHlzOworCXNpemVfdAkJCWRhdGFfYnVmZl9zaXplOworCWludCAJCQlkYXRhX2RtYV9jaDsKKwlzdHJ1Y3QgcHhhX2RtYV9kZXNjCSpkYXRhX2Rlc2M7CisJZG1hX2FkZHJfdCAJCWRhdGFfZGVzY19hZGRyOworCisJdWludDMyX3QJCXJlZ19uZGNyOworCisJLyogc2F2ZWQgY29sdW1uL3BhZ2VfYWRkciBkdXJpbmcgQ01EX1NFUUlOICovCisJaW50CQkJc2VxaW5fY29sdW1uOworCWludAkJCXNlcWluX3BhZ2VfYWRkcjsKKworCS8qIHJlbGF0ZSB0byB0aGUgY29tbWFuZCAqLworCXVuc2lnbmVkIGludAkJc3RhdGU7CisKKwlpbnQJCQl1c2VfZWNjOwkvKiB1c2UgSFcgRUNDID8gKi8KKwlpbnQJCQl1c2VfZG1hOwkvKiB1c2UgRE1BID8gKi8KKworCXNpemVfdAkJCWRhdGFfc2l6ZTsJLyogZGF0YSBzaXplIGluIEZJRk8gKi8KKwlpbnQgCQkJcmV0Y29kZTsKKwlzdHJ1Y3QgY29tcGxldGlvbiAJY21kX2NvbXBsZXRlOworCisJLyogZ2VuZXJhdGVkIE5EQ0J4IHJlZ2lzdGVyIHZhbHVlcyAqLworCXVpbnQzMl90CQluZGNiMDsKKwl1aW50MzJfdAkJbmRjYjE7CisJdWludDMyX3QJCW5kY2IyOworfTsKKworc3RhdGljIGludCB1c2VfZG1hID0gMTsKK21vZHVsZV9wYXJhbSh1c2VfZG1hLCBib29sLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0ModXNlX2RtYSwgImVuYWJsZSBETUEgZm9yIGRhdGEgdHJhbnNmZXJpbmcgdG8vZnJvbSBOQU5EIEhXIik7CisKK3N0YXRpYyBzdHJ1Y3QgcHhhM3h4X25hbmRfY21kc2V0IHNtYWxscGFnZV9jbWRzZXQgPSB7CisJLnJlYWQxCQk9IDB4MDAwMCwKKwkucmVhZDIJCT0gMHgwMDUwLAorCS5wcm9ncmFtCT0gMHgxMDgwLAorCS5yZWFkX3N0YXR1cwk9IDB4MDA3MCwKKwkucmVhZF9pZAk9IDB4MDA5MCwKKwkuZXJhc2UJCT0gMHhEMDYwLAorCS5yZXNldAkJPSAweDAwRkYsCisJLmxvY2sJCT0gMHgwMDJBLAorCS51bmxvY2sJCT0gMHgyNDIzLAorCS5sb2NrX3N0YXR1cwk9IDB4MDA3QSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhM3h4X25hbmRfY21kc2V0IGxhcmdlcGFnZV9jbWRzZXQgPSB7CisJLnJlYWQxCQk9IDB4MzAwMCwKKwkucmVhZDIJCT0gMHgwMDUwLAorCS5wcm9ncmFtCT0gMHgxMDgwLAorCS5yZWFkX3N0YXR1cwk9IDB4MDA3MCwKKwkucmVhZF9pZAk9IDB4MDA5MCwKKwkuZXJhc2UJCT0gMHhEMDYwLAorCS5yZXNldAkJPSAweDAwRkYsCisJLmxvY2sJCT0gMHgwMDJBLAorCS51bmxvY2sJCT0gMHgyNDIzLAorCS5sb2NrX3N0YXR1cwk9IDB4MDA3QSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhM3h4X25hbmRfdGltaW5nIHNhbXN1bmc1MTJNYlgxNl90aW1pbmcgPSB7CisJLnRDSAk9IDEwLAorCS50Q1MJPSAwLAorCS50V0gJPSAyMCwKKwkudFdQCT0gNDAsCisJLnRSSAk9IDMwLAorCS50UlAJPSA0MCwKKwkudFIJPSAxMTEyMywKKwkudFdIUgk9IDExMCwKKwkudEFSCT0gMTAsCit9OworCitzdGF0aWMgc3RydWN0IHB4YTN4eF9uYW5kX2ZsYXNoIHNhbXN1bmc1MTJNYlgxNiA9IHsKKwkudGltaW5nCQk9ICZzYW1zdW5nNTEyTWJYMTZfdGltaW5nLAorCS5jbWRzZXQJCT0gJnNtYWxscGFnZV9jbWRzZXQsCisJLnBhZ2VfcGVyX2Jsb2NrCT0gMzIsCisJLnBhZ2Vfc2l6ZQk9IDUxMiwKKwkuZmxhc2hfd2lkdGgJPSAxNiwKKwkuZGZjX3dpZHRoCT0gMTYsCisJLm51bV9ibG9ja3MJPSA0MDk2LAorCS5jaGlwX2lkCT0gMHg0NmVjLAorfTsKKworc3RhdGljIHN0cnVjdCBweGEzeHhfbmFuZF90aW1pbmcgbWljcm9uX3RpbWluZyA9IHsKKwkudENICT0gMTAsCisJLnRDUwk9IDI1LAorCS50V0gJPSAxNSwKKwkudFdQCT0gMjUsCisJLnRSSAk9IDE1LAorCS50UlAJPSAyNSwKKwkudFIJPSAyNTAwMCwKKwkudFdIUgk9IDYwLAorCS50QVIJPSAxMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhM3h4X25hbmRfZmxhc2ggbWljcm9uMUdiWDggPSB7CisJLnRpbWluZwkJPSAmbWljcm9uX3RpbWluZywKKwkuY21kc2V0CQk9ICZsYXJnZXBhZ2VfY21kc2V0LAorCS5wYWdlX3Blcl9ibG9jawk9IDY0LAorCS5wYWdlX3NpemUJPSAyMDQ4LAorCS5mbGFzaF93aWR0aAk9IDgsCisJLmRmY193aWR0aAk9IDgsCisJLm51bV9ibG9ja3MJPSAxMDI0LAorCS5jaGlwX2lkCT0gMHhhMTJjLAorfTsKKworc3RhdGljIHN0cnVjdCBweGEzeHhfbmFuZF9mbGFzaCBtaWNyb24xR2JYMTYgPSB7CisJLnRpbWluZwkJPSAmbWljcm9uX3RpbWluZywKKwkuY21kc2V0CQk9ICZsYXJnZXBhZ2VfY21kc2V0LAorCS5wYWdlX3Blcl9ibG9jawk9IDY0LAorCS5wYWdlX3NpemUJPSAyMDQ4LAorCS5mbGFzaF93aWR0aAk9IDE2LAorCS5kZmNfd2lkdGgJPSAxNiwKKwkubnVtX2Jsb2Nrcwk9IDEwMjQsCisJLmNoaXBfaWQJPSAweGIxMmMsCit9OworCitzdGF0aWMgc3RydWN0IHB4YTN4eF9uYW5kX2ZsYXNoICpidWlsdGluX2ZsYXNoX3R5cGVzW10gPSB7CisJJnNhbXN1bmc1MTJNYlgxNiwKKwkmbWljcm9uMUdiWDgsCisJJm1pY3JvbjFHYlgxNiwKK307CisKKyNkZWZpbmUgTkRUUjBfdENIKGMpCShtaW4oKGMpLCA3KSA8PCAxOSkKKyNkZWZpbmUgTkRUUjBfdENTKGMpCShtaW4oKGMpLCA3KSA8PCAxNikKKyNkZWZpbmUgTkRUUjBfdFdIKGMpCShtaW4oKGMpLCA3KSA8PCAxMSkKKyNkZWZpbmUgTkRUUjBfdFdQKGMpCShtaW4oKGMpLCA3KSA8PCA4KQorI2RlZmluZSBORFRSMF90UkgoYykJKG1pbigoYyksIDcpIDw8IDMpCisjZGVmaW5lIE5EVFIwX3RSUChjKQkobWluKChjKSwgNykgPDwgMCkKKworI2RlZmluZSBORFRSMV90UihjKQkobWluKChjKSwgNjU1MzUpIDw8IDE2KQorI2RlZmluZSBORFRSMV90V0hSKGMpCShtaW4oKGMpLCAxNSkgPDwgNCkKKyNkZWZpbmUgTkRUUjFfdEFSKGMpCShtaW4oKGMpLCAxNSkgPDwgMCkKKworLyogY29udmVydCBuYW5vLXNlY29uZHMgdG8gbmFuZCBmbGFzaCBjb250cm9sbGVyIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBuczJjeWNsZShucywgY2xrKQkoaW50KSgoKG5zKSAqIChjbGsgLyAxMDAwMDAwKSAvIDEwMDApICsgMSkKKworc3RhdGljIHZvaWQgcHhhM3h4X25hbmRfc2V0X3RpbWluZyhzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbywKKwkJCQkgICBzdHJ1Y3QgcHhhM3h4X25hbmRfdGltaW5nICp0KQoreworCXVuc2lnbmVkIGxvbmcgbmFuZF9jbGsgPSBjbGtfZ2V0X3JhdGUoaW5mby0+Y2xrKTsKKwl1aW50MzJfdCBuZHRyMCwgbmR0cjE7CisKKwluZHRyMCA9IE5EVFIwX3RDSChuczJjeWNsZSh0LT50Q0gsIG5hbmRfY2xrKSkgfAorCQlORFRSMF90Q1MobnMyY3ljbGUodC0+dENTLCBuYW5kX2NsaykpIHwKKwkJTkRUUjBfdFdIKG5zMmN5Y2xlKHQtPnRXSCwgbmFuZF9jbGspKSB8CisJCU5EVFIwX3RXUChuczJjeWNsZSh0LT50V1AsIG5hbmRfY2xrKSkgfAorCQlORFRSMF90UkgobnMyY3ljbGUodC0+dFJILCBuYW5kX2NsaykpIHwKKwkJTkRUUjBfdFJQKG5zMmN5Y2xlKHQtPnRSUCwgbmFuZF9jbGspKTsKKworCW5kdHIxID0gTkRUUjFfdFIobnMyY3ljbGUodC0+dFIsIG5hbmRfY2xrKSkgfAorCQlORFRSMV90V0hSKG5zMmN5Y2xlKHQtPnRXSFIsIG5hbmRfY2xrKSkgfAorCQlORFRSMV90QVIobnMyY3ljbGUodC0+dEFSLCBuYW5kX2NsaykpOworCisJbmFuZF93cml0ZWwoaW5mbywgTkRUUjBDUzAsIG5kdHIwKTsKKwluYW5kX3dyaXRlbChpbmZvLCBORFRSMUNTMCwgbmR0cjEpOworfQorCisjZGVmaW5lIFdBSVRfRVZFTlRfVElNRU9VVAkxMAorCitzdGF0aWMgaW50IHdhaXRfZm9yX2V2ZW50KHN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvLCB1aW50MzJfdCBldmVudCkKK3sKKwlpbnQgdGltZW91dCA9IFdBSVRfRVZFTlRfVElNRU9VVDsKKwl1aW50MzJfdCBuZHNyOworCisJd2hpbGUgKHRpbWVvdXQtLSkgeworCQluZHNyID0gbmFuZF9yZWFkbChpbmZvLCBORFNSKSAmIE5EU1JfTUFTSzsKKwkJaWYgKG5kc3IgJiBldmVudCkgeworCQkJbmFuZF93cml0ZWwoaW5mbywgTkRTUiwgbmRzcik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQl1ZGVsYXkoMTApOworCX0KKworCXJldHVybiAtRVRJTUVET1VUOworfQorCitzdGF0aWMgaW50IHByZXBhcmVfcmVhZF9wcm9nX2NtZChzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbywKKwkJCXVpbnQxNl90IGNtZCwgaW50IGNvbHVtbiwgaW50IHBhZ2VfYWRkcikKK3sKKwlzdHJ1Y3QgcHhhM3h4X25hbmRfZmxhc2ggKmYgPSBpbmZvLT5mbGFzaF9pbmZvOworCXN0cnVjdCBweGEzeHhfbmFuZF9jbWRzZXQgKmNtZHNldCA9IGYtPmNtZHNldDsKKworCS8qIGNhbGN1bGF0ZSBkYXRhIHNpemUgKi8KKwlzd2l0Y2ggKGYtPnBhZ2Vfc2l6ZSkgeworCWNhc2UgMjA0ODoKKwkJaW5mby0+ZGF0YV9zaXplID0gKGluZm8tPnVzZV9lY2MpID8gMjA4OCA6IDIxMTI7CisJCWJyZWFrOworCWNhc2UgNTEyOgorCQlpbmZvLT5kYXRhX3NpemUgPSAoaW5mby0+dXNlX2VjYykgPyA1MjAgOiA1Mjg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGdlbmVyYXRlIHZhbHVlcyBmb3IgTkRDQnggcmVnaXN0ZXJzICovCisJaW5mby0+bmRjYjAgPSBjbWQgfCAoKGNtZCAmIDB4ZmYwMCkgPyBORENCMF9EQkMgOiAwKTsKKwlpbmZvLT5uZGNiMSA9IDA7CisJaW5mby0+bmRjYjIgPSAwOworCWluZm8tPm5kY2IwIHw9IE5EQ0IwX0FERFJfQ1lDKGYtPnJvd19hZGRyX2N5Y2xlcyArIGYtPmNvbF9hZGRyX2N5Y2xlcyk7CisKKwlpZiAoZi0+Y29sX2FkZHJfY3ljbGVzID09IDIpIHsKKwkJLyogbGFyZ2UgYmxvY2ssIDIgY3ljbGVzIGZvciBjb2x1bW4gYWRkcmVzcworCQkgKiByb3cgYWRkcmVzcyBzdGFydHMgZnJvbSAzcmQgY3ljbGUKKwkJICovCisJCWluZm8tPm5kY2IxIHw9IChwYWdlX2FkZHIgPDwgMTYpIHwgKGNvbHVtbiAmIDB4ZmZmZik7CisJCWlmIChmLT5yb3dfYWRkcl9jeWNsZXMgPT0gMykKKwkJCWluZm8tPm5kY2IyID0gKHBhZ2VfYWRkciA+PiAxNikgJiAweGZmOworCX0gZWxzZQorCQkvKiBzbWFsbCBibG9jaywgMSBjeWNsZXMgZm9yIGNvbHVtbiBhZGRyZXNzCisJCSAqIHJvdyBhZGRyZXNzIHN0YXJ0cyBmcm9tIDJuZCBjeWNsZQorCQkgKi8KKwkJaW5mby0+bmRjYjEgPSAocGFnZV9hZGRyIDw8IDgpIHwgKGNvbHVtbiAmIDB4ZmYpOworCisJaWYgKGNtZCA9PSBjbWRzZXQtPnByb2dyYW0pCisJCWluZm8tPm5kY2IwIHw9IE5EQ0IwX0NNRF9UWVBFKDEpIHwgTkRDQjBfQVVUT19SUzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByZXBhcmVfZXJhc2VfY21kKHN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvLAorCQkJdWludDE2X3QgY21kLCBpbnQgcGFnZV9hZGRyKQoreworCWluZm8tPm5kY2IwID0gY21kIHwgKChjbWQgJiAweGZmMDApID8gTkRDQjBfREJDIDogMCk7CisJaW5mby0+bmRjYjAgfD0gTkRDQjBfQ01EX1RZUEUoMikgfCBORENCMF9BVVRPX1JTIHwgTkRDQjBfQUREUl9DWUMoMyk7CisJaW5mby0+bmRjYjEgPSBwYWdlX2FkZHI7CisJaW5mby0+bmRjYjIgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByZXBhcmVfb3RoZXJfY21kKHN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvLCB1aW50MTZfdCBjbWQpCit7CisJc3RydWN0IHB4YTN4eF9uYW5kX2NtZHNldCAqY21kc2V0ID0gaW5mby0+Zmxhc2hfaW5mby0+Y21kc2V0OworCisJaW5mby0+bmRjYjAgPSBjbWQgfCAoKGNtZCAmIDB4ZmYwMCkgPyBORENCMF9EQkMgOiAwKTsKKwlpbmZvLT5uZGNiMSA9IDA7CisJaW5mby0+bmRjYjIgPSAwOworCisJaWYgKGNtZCA9PSBjbWRzZXQtPnJlYWRfaWQpIHsKKwkJaW5mby0+bmRjYjAgfD0gTkRDQjBfQ01EX1RZUEUoMyk7CisJCWluZm8tPmRhdGFfc2l6ZSA9IDg7CisJfSBlbHNlIGlmIChjbWQgPT0gY21kc2V0LT5yZWFkX3N0YXR1cykgeworCQlpbmZvLT5uZGNiMCB8PSBORENCMF9DTURfVFlQRSg0KTsKKwkJaW5mby0+ZGF0YV9zaXplID0gODsKKwl9IGVsc2UgaWYgKGNtZCA9PSBjbWRzZXQtPnJlc2V0IHx8IGNtZCA9PSBjbWRzZXQtPmxvY2sgfHwKKwkJICAgY21kID09IGNtZHNldC0+dW5sb2NrKSB7CisJCWluZm8tPm5kY2IwIHw9IE5EQ0IwX0NNRF9UWVBFKDUpOworCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbmFibGVfaW50KHN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvLCB1aW50MzJfdCBpbnRfbWFzaykKK3sKKwl1aW50MzJfdCBuZGNyOworCisJbmRjciA9IG5hbmRfcmVhZGwoaW5mbywgTkRDUik7CisJbmFuZF93cml0ZWwoaW5mbywgTkRDUiwgbmRjciAmIH5pbnRfbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIGRpc2FibGVfaW50KHN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvLCB1aW50MzJfdCBpbnRfbWFzaykKK3sKKwl1aW50MzJfdCBuZGNyOworCisJbmRjciA9IG5hbmRfcmVhZGwoaW5mbywgTkRDUik7CisJbmFuZF93cml0ZWwoaW5mbywgTkRDUiwgbmRjciB8IGludF9tYXNrKTsKK30KKworLyogTk9URTogaXQgaXMgYSBtdXN0IHRvIHNldCBORF9SVU4gZmlyc3RseSwgdGhlbiB3cml0ZSBjb21tYW5kIGJ1ZmZlcgorICogb3RoZXJ3aXNlLCBpdCBkb2VzIG5vdCB3b3JrCisgKi8KK3N0YXRpYyBpbnQgd3JpdGVfY21kKHN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvKQoreworCXVpbnQzMl90IG5kY3I7CisKKwkvKiBjbGVhciBzdGF0dXMgYml0cyBhbmQgcnVuICovCisJbmFuZF93cml0ZWwoaW5mbywgTkRTUiwgTkRTUl9NQVNLKTsKKworCW5kY3IgPSBpbmZvLT5yZWdfbmRjcjsKKworCW5kY3IgfD0gaW5mby0+dXNlX2VjYyA/IE5EQ1JfRUNDX0VOIDogMDsKKwluZGNyIHw9IGluZm8tPnVzZV9kbWEgPyBORENSX0RNQV9FTiA6IDA7CisJbmRjciB8PSBORENSX05EX1JVTjsKKworCW5hbmRfd3JpdGVsKGluZm8sIE5EQ1IsIG5kY3IpOworCisJaWYgKHdhaXRfZm9yX2V2ZW50KGluZm8sIE5EU1JfV1JDTURSRVEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAidGltZWQgb3V0IHdyaXRpbmcgY29tbWFuZFxuIik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCW5hbmRfd3JpdGVsKGluZm8sIE5EQ0IwLCBpbmZvLT5uZGNiMCk7CisJbmFuZF93cml0ZWwoaW5mbywgTkRDQjAsIGluZm8tPm5kY2IxKTsKKwluYW5kX3dyaXRlbChpbmZvLCBORENCMCwgaW5mby0+bmRjYjIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9kYXRhX3BpbyhzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0LCB0aW1lb3V0ID0gQ0hJUF9ERUxBWV9USU1FT1VUOworCisJc3dpdGNoIChpbmZvLT5zdGF0ZSkgeworCWNhc2UgU1RBVEVfUElPX1dSSVRJTkc6CisJCV9fcmF3X3dyaXRlc2woaW5mby0+bW1pb19iYXNlICsgTkREQiwgaW5mby0+ZGF0YV9idWZmLAorCQkJCWluZm8tPmRhdGFfc2l6ZSA8PCAyKTsKKworCQllbmFibGVfaW50KGluZm8sIE5EU1JfQ1MwX0JCRCB8IE5EU1JfQ1MwX0NNREQpOworCisJCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW5mby0+Y21kX2NvbXBsZXRlLCB0aW1lb3V0KTsKKwkJaWYgKCFyZXQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAicHJvZ3JhbSBjb21tYW5kIHRpbWUgb3V0XG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNUQVRFX1BJT19SRUFESU5HOgorCQlfX3Jhd19yZWFkc2woaW5mby0+bW1pb19iYXNlICsgTkREQiwgaW5mby0+ZGF0YV9idWZmLAorCQkJCWluZm8tPmRhdGFfc2l6ZSA8PCAyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaW52YWxpZCBzdGF0ZSAlZFxuIiwgX19mdW5jX18sCisJCQkJaW5mby0+c3RhdGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpbmZvLT5zdGF0ZSA9IFNUQVRFX1JFQURZOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9kYXRhX2RtYShzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbywgaW50IGRpcl9vdXQpCit7CisJc3RydWN0IHB4YV9kbWFfZGVzYyAqZGVzYyA9IGluZm8tPmRhdGFfZGVzYzsKKwlpbnQgZG1hX2xlbiA9IEFMSUdOKGluZm8tPmRhdGFfc2l6ZSwgMzIpOworCisJZGVzYy0+ZGRhZHIgPSBEREFEUl9TVE9QOworCWRlc2MtPmRjbWQgPSBEQ01EX0VORElSUUVOIHwgRENNRF9XSURUSDQgfCBEQ01EX0JVUlNUMzIgfCBkbWFfbGVuOworCisJaWYgKGRpcl9vdXQpIHsKKwkJZGVzYy0+ZHNhZHIgPSBpbmZvLT5kYXRhX2J1ZmZfcGh5czsKKwkJZGVzYy0+ZHRhZHIgPSBORERCX0RNQV9BRERSOworCQlkZXNjLT5kY21kIHw9IERDTURfSU5DU1JDQUREUiB8IERDTURfRkxPV1RSRzsKKwl9IGVsc2UgeworCQlkZXNjLT5kdGFkciA9IGluZm8tPmRhdGFfYnVmZl9waHlzOworCQlkZXNjLT5kc2FkciA9IE5EREJfRE1BX0FERFI7CisJCWRlc2MtPmRjbWQgfD0gRENNRF9JTkNUUkdBRERSIHwgRENNRF9GTE9XU1JDOworCX0KKworCURSQ01SKGluZm8tPmRyY21yX2RhdCkgPSBEUkNNUl9NQVBWTEQgfCBpbmZvLT5kYXRhX2RtYV9jaDsKKwlEREFEUihpbmZvLT5kYXRhX2RtYV9jaCkgPSBpbmZvLT5kYXRhX2Rlc2NfYWRkcjsKKwlEQ1NSKGluZm8tPmRhdGFfZG1hX2NoKSB8PSBEQ1NSX1JVTjsKK30KKworc3RhdGljIHZvaWQgcHhhM3h4X25hbmRfZGF0YV9kbWFfaXJxKGludCBjaGFubmVsLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvID0gZGF0YTsKKwl1aW50MzJfdCBkY3NyOworCisJZGNzciA9IERDU1IoY2hhbm5lbCk7CisJRENTUihjaGFubmVsKSA9IGRjc3I7CisKKwlpZiAoZGNzciAmIERDU1JfQlVTRVJSKSB7CisJCWluZm8tPnJldGNvZGUgPSBFUlJfRE1BQlVTRVJSOworCQljb21wbGV0ZSgmaW5mby0+Y21kX2NvbXBsZXRlKTsKKwl9CisKKwlpZiAoaW5mby0+c3RhdGUgPT0gU1RBVEVfRE1BX1dSSVRJTkcpIHsKKwkJaW5mby0+c3RhdGUgPSBTVEFURV9ETUFfRE9ORTsKKwkJZW5hYmxlX2ludChpbmZvLCBORFNSX0NTMF9CQkQgfCBORFNSX0NTMF9DTUREKTsKKwl9IGVsc2UgeworCQlpbmZvLT5zdGF0ZSA9IFNUQVRFX1JFQURZOworCQljb21wbGV0ZSgmaW5mby0+Y21kX2NvbXBsZXRlKTsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBweGEzeHhfbmFuZF9pcnEoaW50IGlycSwgdm9pZCAqZGV2aWQpCit7CisJc3RydWN0IHB4YTN4eF9uYW5kX2luZm8gKmluZm8gPSBkZXZpZDsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gbmFuZF9yZWFkbChpbmZvLCBORFNSKTsKKworCWlmIChzdGF0dXMgJiAoTkRTUl9SRERSRVEgfCBORFNSX0RCRVJSKSkgeworCQlpZiAoc3RhdHVzICYgTkRTUl9EQkVSUikKKwkJCWluZm8tPnJldGNvZGUgPSBFUlJfREJFUlI7CisKKwkJZGlzYWJsZV9pbnQoaW5mbywgTkRTUl9SRERSRVEgfCBORFNSX0RCRVJSKTsKKworCQlpZiAoaW5mby0+dXNlX2RtYSkgeworCQkJaW5mby0+c3RhdGUgPSBTVEFURV9ETUFfUkVBRElORzsKKwkJCXN0YXJ0X2RhdGFfZG1hKGluZm8sIDApOworCQl9IGVsc2UgeworCQkJaW5mby0+c3RhdGUgPSBTVEFURV9QSU9fUkVBRElORzsKKwkJCWNvbXBsZXRlKCZpbmZvLT5jbWRfY29tcGxldGUpOworCQl9CisJfSBlbHNlIGlmIChzdGF0dXMgJiBORFNSX1dSRFJFUSkgeworCQlkaXNhYmxlX2ludChpbmZvLCBORFNSX1dSRFJFUSk7CisJCWlmIChpbmZvLT51c2VfZG1hKSB7CisJCQlpbmZvLT5zdGF0ZSA9IFNUQVRFX0RNQV9XUklUSU5HOworCQkJc3RhcnRfZGF0YV9kbWEoaW5mbywgMSk7CisJCX0gZWxzZSB7CisJCQlpbmZvLT5zdGF0ZSA9IFNUQVRFX1BJT19XUklUSU5HOworCQkJY29tcGxldGUoJmluZm8tPmNtZF9jb21wbGV0ZSk7CisJCX0KKwl9IGVsc2UgaWYgKHN0YXR1cyAmIChORFNSX0NTMF9CQkQgfCBORFNSX0NTMF9DTUREKSkgeworCQlpZiAoc3RhdHVzICYgTkRTUl9DUzBfQkJEKQorCQkJaW5mby0+cmV0Y29kZSA9IEVSUl9CQkVSUjsKKworCQlkaXNhYmxlX2ludChpbmZvLCBORFNSX0NTMF9CQkQgfCBORFNSX0NTMF9DTUREKTsKKwkJaW5mby0+c3RhdGUgPSBTVEFURV9SRUFEWTsKKwkJY29tcGxldGUoJmluZm8tPmNtZF9jb21wbGV0ZSk7CisJfQorCW5hbmRfd3JpdGVsKGluZm8sIE5EU1IsIHN0YXR1cyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHB4YTN4eF9uYW5kX2RvX2NtZChzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbywgdWludDMyX3QgZXZlbnQpCit7CisJdWludDMyX3QgbmRjcjsKKwlpbnQgcmV0LCB0aW1lb3V0ID0gQ0hJUF9ERUxBWV9USU1FT1VUOworCisJaWYgKHdyaXRlX2NtZChpbmZvKSkgeworCQlpbmZvLT5yZXRjb2RlID0gRVJSX1NFTkRDTUQ7CisJCWdvdG8gZmFpbF9zdG9wOworCX0KKworCWluZm8tPnN0YXRlID0gU1RBVEVfQ01EX0hBTkRMRTsKKworCWVuYWJsZV9pbnQoaW5mbywgZXZlbnQpOworCisJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpbmZvLT5jbWRfY29tcGxldGUsIHRpbWVvdXQpOworCWlmICghcmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiY29tbWFuZCBleGVjdXRpb24gdGltZWQgb3V0XG4iKTsKKwkJaW5mby0+cmV0Y29kZSA9IEVSUl9TRU5EQ01EOworCQlnb3RvIGZhaWxfc3RvcDsKKwl9CisKKwlpZiAoaW5mby0+dXNlX2RtYSA9PSAwICYmIGluZm8tPmRhdGFfc2l6ZSA+IDApCisJCWlmIChoYW5kbGVfZGF0YV9waW8oaW5mbykpCisJCQlnb3RvIGZhaWxfc3RvcDsKKworCXJldHVybiAwOworCitmYWlsX3N0b3A6CisJbmRjciA9IG5hbmRfcmVhZGwoaW5mbywgTkRDUik7CisJbmFuZF93cml0ZWwoaW5mbywgTkRDUiwgbmRjciAmIH5ORENSX05EX1JVTik7CisJdWRlbGF5KDEwKTsKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworc3RhdGljIGludCBweGEzeHhfbmFuZF9kZXZfcmVhZHkoc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJc3RydWN0IHB4YTN4eF9uYW5kX2luZm8gKmluZm8gPSBtdGQtPnByaXY7CisJcmV0dXJuIChuYW5kX3JlYWRsKGluZm8sIE5EU1IpICYgTkRTUl9SRFkpID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2J1Zl9ibGFuayh1aW50OF90ICpidWYsIHNpemVfdCBsZW4pCit7CisJZm9yICg7IGxlbiA+IDA7IGxlbi0tKQorCQlpZiAoKmJ1ZisrICE9IDB4ZmYpCisJCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcHhhM3h4X25hbmRfY21kZnVuYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdW5zaWduZWQgY29tbWFuZCwKKwkJCQlpbnQgY29sdW1uLCBpbnQgcGFnZV9hZGRyKQoreworCXN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvID0gbXRkLT5wcml2OworCXN0cnVjdCBweGEzeHhfbmFuZF9mbGFzaCAqZmxhc2hfaW5mbyA9IGluZm8tPmZsYXNoX2luZm87CisJc3RydWN0IHB4YTN4eF9uYW5kX2NtZHNldCAqY21kc2V0ID0gZmxhc2hfaW5mby0+Y21kc2V0OworCWludCByZXQ7CisKKwlpbmZvLT51c2VfZG1hID0gKHVzZV9kbWEpID8gMSA6IDA7CisJaW5mby0+dXNlX2VjYyA9IDA7CisJaW5mby0+ZGF0YV9zaXplID0gMDsKKwlpbmZvLT5zdGF0ZSA9IFNUQVRFX1JFQURZOworCisJaW5pdF9jb21wbGV0aW9uKCZpbmZvLT5jbWRfY29tcGxldGUpOworCisJc3dpdGNoIChjb21tYW5kKSB7CisJY2FzZSBOQU5EX0NNRF9SRUFET09COgorCQkvKiBkaXNhYmxlIEhXIEVDQyB0byBnZXQgYWxsIHRoZSBPT0IgZGF0YSAqLworCQlpbmZvLT5idWZfY291bnQgPSBtdGQtPndyaXRlc2l6ZSArIG10ZC0+b29ic2l6ZTsKKwkJaW5mby0+YnVmX3N0YXJ0ID0gbXRkLT53cml0ZXNpemUgKyBjb2x1bW47CisKKwkJaWYgKHByZXBhcmVfcmVhZF9wcm9nX2NtZChpbmZvLCBjbWRzZXQtPnJlYWQxLCBjb2x1bW4sIHBhZ2VfYWRkcikpCisJCQlicmVhazsKKworCQlweGEzeHhfbmFuZF9kb19jbWQoaW5mbywgTkRTUl9SRERSRVEgfCBORFNSX0RCRVJSKTsKKworCQkvKiBXZSBvbmx5IGFyZSBPT0IsIHNvIGlmIHRoZSBkYXRhIGhhcyBlcnJvciwgZG9lcyBub3QgbWF0dGVyICovCisJCWlmIChpbmZvLT5yZXRjb2RlID09IEVSUl9EQkVSUikKKwkJCWluZm8tPnJldGNvZGUgPSBFUlJfTk9ORTsKKwkJYnJlYWs7CisKKwljYXNlIE5BTkRfQ01EX1JFQUQwOgorCQlpbmZvLT51c2VfZWNjID0gMTsKKwkJaW5mby0+cmV0Y29kZSA9IEVSUl9OT05FOworCQlpbmZvLT5idWZfc3RhcnQgPSBjb2x1bW47CisJCWluZm8tPmJ1Zl9jb3VudCA9IG10ZC0+d3JpdGVzaXplICsgbXRkLT5vb2JzaXplOworCQltZW1zZXQoaW5mby0+ZGF0YV9idWZmLCAweEZGLCBpbmZvLT5idWZfY291bnQpOworCisJCWlmIChwcmVwYXJlX3JlYWRfcHJvZ19jbWQoaW5mbywgY21kc2V0LT5yZWFkMSwgY29sdW1uLCBwYWdlX2FkZHIpKQorCQkJYnJlYWs7CisKKwkJcHhhM3h4X25hbmRfZG9fY21kKGluZm8sIE5EU1JfUkREUkVRIHwgTkRTUl9EQkVSUik7CisKKwkJaWYgKGluZm8tPnJldGNvZGUgPT0gRVJSX0RCRVJSKSB7CisJCQkvKiBmb3IgYmxhbmsgcGFnZSAoYWxsIDB4ZmYpLCBIVyB3aWxsIGNhbGN1bGF0ZSBpdHMgRUNDIGFzCisJCQkgKiAwLCB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgRUNDIGluZm9ybWF0aW9uIHdpdGhpbgorCQkJICogT09CLCBpZ25vcmUgc3VjaCBkb3VibGUgYml0IGVycm9ycworCQkJICovCisJCQlpZiAoaXNfYnVmX2JsYW5rKGluZm8tPmRhdGFfYnVmZiwgbXRkLT53cml0ZXNpemUpKQorCQkJCWluZm8tPnJldGNvZGUgPSBFUlJfTk9ORTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5BTkRfQ01EX1NFUUlOOgorCQlpbmZvLT5idWZfc3RhcnQgPSBjb2x1bW47CisJCWluZm8tPmJ1Zl9jb3VudCA9IG10ZC0+d3JpdGVzaXplICsgbXRkLT5vb2JzaXplOworCQltZW1zZXQoaW5mby0+ZGF0YV9idWZmLCAweGZmLCBpbmZvLT5idWZfY291bnQpOworCisJCS8qIHNhdmUgY29sdW1uL3BhZ2VfYWRkciBmb3IgbmV4dCBDTURfUEFHRVBST0cgKi8KKwkJaW5mby0+c2VxaW5fY29sdW1uID0gY29sdW1uOworCQlpbmZvLT5zZXFpbl9wYWdlX2FkZHIgPSBwYWdlX2FkZHI7CisJCWJyZWFrOworCWNhc2UgTkFORF9DTURfUEFHRVBST0c6CisJCWluZm8tPnVzZV9lY2MgPSAoaW5mby0+c2VxaW5fY29sdW1uID49IG10ZC0+d3JpdGVzaXplKSA/IDAgOiAxOworCisJCWlmIChwcmVwYXJlX3JlYWRfcHJvZ19jbWQoaW5mbywgY21kc2V0LT5wcm9ncmFtLAorCQkJCWluZm8tPnNlcWluX2NvbHVtbiwgaW5mby0+c2VxaW5fcGFnZV9hZGRyKSkKKwkJCWJyZWFrOworCisJCXB4YTN4eF9uYW5kX2RvX2NtZChpbmZvLCBORFNSX1dSRFJFUSk7CisJCWJyZWFrOworCWNhc2UgTkFORF9DTURfRVJBU0UxOgorCQlpZiAocHJlcGFyZV9lcmFzZV9jbWQoaW5mbywgY21kc2V0LT5lcmFzZSwgcGFnZV9hZGRyKSkKKwkJCWJyZWFrOworCisJCXB4YTN4eF9uYW5kX2RvX2NtZChpbmZvLCBORFNSX0NTMF9CQkQgfCBORFNSX0NTMF9DTUREKTsKKwkJYnJlYWs7CisJY2FzZSBOQU5EX0NNRF9FUkFTRTI6CisJCWJyZWFrOworCWNhc2UgTkFORF9DTURfUkVBRElEOgorCWNhc2UgTkFORF9DTURfU1RBVFVTOgorCQlpbmZvLT51c2VfZG1hID0gMDsJLyogZm9yY2UgUElPIHJlYWQgKi8KKwkJaW5mby0+YnVmX3N0YXJ0ID0gMDsKKwkJaW5mby0+YnVmX2NvdW50ID0gKGNvbW1hbmQgPT0gTkFORF9DTURfUkVBRElEKSA/CisJCQkJZmxhc2hfaW5mby0+cmVhZF9pZF9ieXRlcyA6IDE7CisKKwkJaWYgKHByZXBhcmVfb3RoZXJfY21kKGluZm8sIChjb21tYW5kID09IE5BTkRfQ01EX1JFQURJRCkgPworCQkJCWNtZHNldC0+cmVhZF9pZCA6IGNtZHNldC0+cmVhZF9zdGF0dXMpKQorCQkJYnJlYWs7CisKKwkJcHhhM3h4X25hbmRfZG9fY21kKGluZm8sIE5EU1JfUkREUkVRKTsKKwkJYnJlYWs7CisJY2FzZSBOQU5EX0NNRF9SRVNFVDoKKwkJaWYgKHByZXBhcmVfb3RoZXJfY21kKGluZm8sIGNtZHNldC0+cmVzZXQpKQorCQkJYnJlYWs7CisKKwkJcmV0ID0gcHhhM3h4X25hbmRfZG9fY21kKGluZm8sIE5EU1JfQ1MwX0NNREQpOworCQlpZiAocmV0ID09IDApIHsKKwkJCWludCB0aW1lb3V0ID0gMjsKKwkJCXVpbnQzMl90IG5kY3I7CisKKwkJCXdoaWxlICh0aW1lb3V0LS0pIHsKKwkJCQlpZiAobmFuZF9yZWFkbChpbmZvLCBORFNSKSAmIE5EU1JfUkRZKQorCQkJCQlicmVhazsKKwkJCQltc2xlZXAoMTApOworCQkJfQorCisJCQluZGNyID0gbmFuZF9yZWFkbChpbmZvLCBORENSKTsKKwkJCW5hbmRfd3JpdGVsKGluZm8sIE5EQ1IsIG5kY3IgJiB+TkRDUl9ORF9SVU4pOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAibm9uLXN1cHBvcnRlZCBjb21tYW5kLlxuIik7CisJCWJyZWFrOworCX0KKworCWlmIChpbmZvLT5yZXRjb2RlID09IEVSUl9EQkVSUikgeworCQlwcmludGsoS0VSTl9FUlIgImRvdWJsZSBiaXQgZXJyb3IgQCBwYWdlICUwOHhcbiIsIHBhZ2VfYWRkcik7CisJCWluZm8tPnJldGNvZGUgPSBFUlJfTk9ORTsKKwl9Cit9CisKK3N0YXRpYyB1aW50OF90IHB4YTN4eF9uYW5kX3JlYWRfYnl0ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbyA9IG10ZC0+cHJpdjsKKwljaGFyIHJldHZhbCA9IDB4RkY7CisKKwlpZiAoaW5mby0+YnVmX3N0YXJ0IDwgaW5mby0+YnVmX2NvdW50KQorCQkvKiBIYXMganVzdCBzZW5kIGEgbmV3IGNvbW1hbmQ/ICovCisJCXJldHZhbCA9IGluZm8tPmRhdGFfYnVmZltpbmZvLT5idWZfc3RhcnQrK107CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdTE2IHB4YTN4eF9uYW5kX3JlYWRfd29yZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbyA9IG10ZC0+cHJpdjsKKwl1MTYgcmV0dmFsID0gMHhGRkZGOworCisJaWYgKCEoaW5mby0+YnVmX3N0YXJ0ICYgMHgwMSkgJiYgaW5mby0+YnVmX3N0YXJ0IDwgaW5mby0+YnVmX2NvdW50KSB7CisJCXJldHZhbCA9ICooKHUxNiAqKShpbmZvLT5kYXRhX2J1ZmYraW5mby0+YnVmX3N0YXJ0KSk7CisJCWluZm8tPmJ1Zl9zdGFydCArPSAyOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBweGEzeHhfbmFuZF9yZWFkX2J1ZihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdWludDhfdCAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvID0gbXRkLT5wcml2OworCWludCByZWFsX2xlbiA9IG1pbl90KHNpemVfdCwgbGVuLCBpbmZvLT5idWZfY291bnQgLSBpbmZvLT5idWZfc3RhcnQpOworCisJbWVtY3B5KGJ1ZiwgaW5mby0+ZGF0YV9idWZmICsgaW5mby0+YnVmX3N0YXJ0LCByZWFsX2xlbik7CisJaW5mby0+YnVmX3N0YXJ0ICs9IHJlYWxfbGVuOworfQorCitzdGF0aWMgdm9pZCBweGEzeHhfbmFuZF93cml0ZV9idWYoc3RydWN0IG10ZF9pbmZvICptdGQsCisJCWNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbyA9IG10ZC0+cHJpdjsKKwlpbnQgcmVhbF9sZW4gPSBtaW5fdChzaXplX3QsIGxlbiwgaW5mby0+YnVmX2NvdW50IC0gaW5mby0+YnVmX3N0YXJ0KTsKKworCW1lbWNweShpbmZvLT5kYXRhX2J1ZmYgKyBpbmZvLT5idWZfc3RhcnQsIGJ1ZiwgcmVhbF9sZW4pOworCWluZm8tPmJ1Zl9zdGFydCArPSByZWFsX2xlbjsKK30KKworc3RhdGljIGludCBweGEzeHhfbmFuZF92ZXJpZnlfYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAorCQljb25zdCB1aW50OF90ICpidWYsIGludCBsZW4pCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB4YTN4eF9uYW5kX3NlbGVjdF9jaGlwKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgY2hpcCkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgcHhhM3h4X25hbmRfd2FpdGZ1bmMoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2NoaXAgKnRoaXMpCit7CisJc3RydWN0IHB4YTN4eF9uYW5kX2luZm8gKmluZm8gPSBtdGQtPnByaXY7CisKKwkvKiBweGEzeHhfbmFuZF9zZW5kX2NvbW1hbmQgaGFzIHdhaXRlZCBmb3IgY29tbWFuZCBjb21wbGV0ZSAqLworCWlmICh0aGlzLT5zdGF0ZSA9PSBGTF9XUklUSU5HIHx8IHRoaXMtPnN0YXRlID09IEZMX0VSQVNJTkcpIHsKKwkJaWYgKGluZm8tPnJldGNvZGUgPT0gRVJSX05PTkUpCisJCQlyZXR1cm4gMDsKKwkJZWxzZSB7CisJCQkvKgorCQkJICogYW55IGVycm9yIG1ha2UgaXQgcmV0dXJuIDB4MDEgd2hpY2ggd2lsbCB0ZWxsCisJCQkgKiB0aGUgY2FsbGVyIHRoZSBlcmFzZSBhbmQgd3JpdGUgZmFpbAorCQkJICovCisJCQlyZXR1cm4gMHgwMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBweGEzeHhfbmFuZF9lY2NfaHdjdGwoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBtb2RlKQoreworCXJldHVybjsKK30KKworc3RhdGljIGludCBweGEzeHhfbmFuZF9lY2NfY2FsY3VsYXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAorCQljb25zdCB1aW50OF90ICpkYXQsIHVpbnQ4X3QgKmVjY19jb2RlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB4YTN4eF9uYW5kX2VjY19jb3JyZWN0KHN0cnVjdCBtdGRfaW5mbyAqbXRkLAorCQl1aW50OF90ICpkYXQsIHVpbnQ4X3QgKnJlYWRfZWNjLCB1aW50OF90ICpjYWxjX2VjYykKK3sKKwlzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbyA9IG10ZC0+cHJpdjsKKwkvKgorCSAqIEFueSBlcnJvciBpbmNsdWRlIEVSUl9TRU5EX0NNRCwgRVJSX0RCRVJSLCBFUlJfQlVTRVJSLCB3ZQorCSAqIGNvbnNpZGVyIGl0IGFzIGEgZWNjIGVycm9yIHdoaWNoIHdpbGwgdGVsbCB0aGUgY2FsbGVyIHRoZQorCSAqIHJlYWQgZmFpbCBXZSBoYXZlIGRpc3Rpbmd1aXNoIGFsbCB0aGUgZXJyb3JzLCBidXQgdGhlCisJICogbmFuZF9yZWFkX2VjYyBvbmx5IGNoZWNrIHRoaXMgZnVuY3Rpb24gcmV0dXJuIHZhbHVlCisJICovCisJaWYgKGluZm8tPnJldGNvZGUgIT0gRVJSX05PTkUpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fcmVhZGlkKHN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvLCB1aW50MzJfdCAqaWQpCit7CisJc3RydWN0IHB4YTN4eF9uYW5kX2ZsYXNoICpmID0gaW5mby0+Zmxhc2hfaW5mbzsKKwlzdHJ1Y3QgcHhhM3h4X25hbmRfY21kc2V0ICpjbWRzZXQgPSBmLT5jbWRzZXQ7CisJdWludDMyX3QgbmRjcjsKKwl1aW50OF90ICBpZF9idWZmWzhdOworCisJaWYgKHByZXBhcmVfb3RoZXJfY21kKGluZm8sIGNtZHNldC0+cmVhZF9pZCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gcHJlcGFyZSBjb21tYW5kXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogU2VuZCBjb21tYW5kICovCisJaWYgKHdyaXRlX2NtZChpbmZvKSkKKwkJZ290byBmYWlsX3RpbWVvdXQ7CisKKwkvKiBXYWl0IGZvciBDTURETShjb21tYW5kIGRvbmUgc3VjY2Vzc2Z1bGx5KSAqLworCWlmICh3YWl0X2Zvcl9ldmVudChpbmZvLCBORFNSX1JERFJFUSkpCisJCWdvdG8gZmFpbF90aW1lb3V0OworCisJX19yYXdfcmVhZHNsKGluZm8tPm1taW9fYmFzZSArIE5EREIsIGlkX2J1ZmYsIDIpOworCSppZCA9IGlkX2J1ZmZbMF0gfCAoaWRfYnVmZlsxXSA8PCA4KTsKKwlyZXR1cm4gMDsKKworZmFpbF90aW1lb3V0OgorCW5kY3IgPSBuYW5kX3JlYWRsKGluZm8sIE5EQ1IpOworCW5hbmRfd3JpdGVsKGluZm8sIE5EQ1IsIG5kY3IgJiB+TkRDUl9ORF9SVU4pOworCXVkZWxheSgxMCk7CisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKK3N0YXRpYyBpbnQgcHhhM3h4X25hbmRfY29uZmlnX2ZsYXNoKHN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvLAorCQkJCSAgICBzdHJ1Y3QgcHhhM3h4X25hbmRfZmxhc2ggKmYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IGluZm8tPnBkZXY7CisJc3RydWN0IHB4YTN4eF9uYW5kX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJdWludDMyX3QgbmRjciA9IDB4MDAwMDBGRkY7IC8qIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKworCWlmIChmLT5wYWdlX3NpemUgIT0gMjA0OCAmJiBmLT5wYWdlX3NpemUgIT0gNTEyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChmLT5mbGFzaF93aWR0aCAhPSAxNiAmJiBmLT5mbGFzaF93aWR0aCAhPSA4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGNhbGN1bGF0ZSBmbGFzaCBpbmZvcm1hdGlvbiAqLworCWYtPm9vYl9zaXplID0gKGYtPnBhZ2Vfc2l6ZSA9PSAyMDQ4KSA/IDY0IDogMTY7CisJZi0+cmVhZF9pZF9ieXRlcyA9IChmLT5wYWdlX3NpemUgPT0gMjA0OCkgPyA0IDogMjsKKworCS8qIGNhbGN1bGF0ZSBhZGRyZXNzaW5nIGluZm9ybWF0aW9uICovCisJZi0+Y29sX2FkZHJfY3ljbGVzID0gKGYtPnBhZ2Vfc2l6ZSA9PSAyMDQ4KSA/IDIgOiAxOworCisJaWYgKGYtPm51bV9ibG9ja3MgKiBmLT5wYWdlX3Blcl9ibG9jayA+IDY1NTM2KQorCQlmLT5yb3dfYWRkcl9jeWNsZXMgPSAzOworCWVsc2UKKwkJZi0+cm93X2FkZHJfY3ljbGVzID0gMjsKKworCW5kY3IgfD0gKHBkYXRhLT5lbmFibGVfYXJiaXRlcikgPyBORENSX05EX0FSQl9FTiA6IDA7CisJbmRjciB8PSAoZi0+Y29sX2FkZHJfY3ljbGVzID09IDIpID8gTkRDUl9SQV9TVEFSVCA6IDA7CisJbmRjciB8PSAoZi0+cGFnZV9wZXJfYmxvY2sgPT0gNjQpID8gTkRDUl9QR19QRVJfQkxLIDogMDsKKwluZGNyIHw9IChmLT5wYWdlX3NpemUgPT0gMjA0OCkgPyBORENSX1BBR0VfU1ogOiAwOworCW5kY3IgfD0gKGYtPmZsYXNoX3dpZHRoID09IDE2KSA/IE5EQ1JfRFdJRFRIX00gOiAwOworCW5kY3IgfD0gKGYtPmRmY193aWR0aCA9PSAxNikgPyBORENSX0RXSURUSF9DIDogMDsKKworCW5kY3IgfD0gTkRDUl9SRF9JRF9DTlQoZi0+cmVhZF9pZF9ieXRlcyk7CisJbmRjciB8PSBORENSX1NQQVJFX0VOOyAvKiBlbmFibGUgc3BhcmUgYnkgZGVmYXVsdCAqLworCisJaW5mby0+cmVnX25kY3IgPSBuZGNyOworCisJcHhhM3h4X25hbmRfc2V0X3RpbWluZyhpbmZvLCBmLT50aW1pbmcpOworCWluZm8tPmZsYXNoX2luZm8gPSBmOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB4YTN4eF9uYW5kX2RldGVjdF9mbGFzaChzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgcHhhM3h4X25hbmRfZmxhc2ggKmY7CisJdWludDMyX3QgaWQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidWlsdGluX2ZsYXNoX3R5cGVzKTsgaSsrKSB7CisKKwkJZiA9IGJ1aWx0aW5fZmxhc2hfdHlwZXNbaV07CisKKwkJaWYgKHB4YTN4eF9uYW5kX2NvbmZpZ19mbGFzaChpbmZvLCBmKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChfX3JlYWRpZChpbmZvLCAmaWQpKQorCQkJY29udGludWU7CisKKwkJaWYgKGlkID09IGYtPmNoaXBfaWQpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyogdGhlIG1heGltdW0gcG9zc2libGUgYnVmZmVyIHNpemUgZm9yIGxhcmdlIHBhZ2Ugd2l0aCBPT0IgZGF0YQorICogaXM6IDIwNDggKyA2NCA9IDIxMTIgYnl0ZXMsIGFsbG9jYXRlIGEgcGFnZSBoZXJlIGZvciBib3RoIHRoZQorICogZGF0YSBidWZmZXIgYW5kIHRoZSBETUEgZGVzY3JpcHRvcgorICovCisjZGVmaW5lIE1BWF9CVUZGX1NJWkUJUEFHRV9TSVpFCisKK3N0YXRpYyBpbnQgcHhhM3h4X25hbmRfaW5pdF9idWZmKHN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSBpbmZvLT5wZGV2OworCWludCBkYXRhX2Rlc2Nfb2Zmc2V0ID0gTUFYX0JVRkZfU0laRSAtIHNpemVvZihzdHJ1Y3QgcHhhX2RtYV9kZXNjKTsKKworCWlmICh1c2VfZG1hID09IDApIHsKKwkJaW5mby0+ZGF0YV9idWZmID0ga21hbGxvYyhNQVhfQlVGRl9TSVpFLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGluZm8tPmRhdGFfYnVmZiA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXJldHVybiAwOworCX0KKworCWluZm8tPmRhdGFfYnVmZiA9IGRtYV9hbGxvY19jb2hlcmVudCgmcGRldi0+ZGV2LCBNQVhfQlVGRl9TSVpFLAorCQkJCSZpbmZvLT5kYXRhX2J1ZmZfcGh5cywgR0ZQX0tFUk5FTCk7CisJaWYgKGluZm8tPmRhdGFfYnVmZiA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBkbWEgYnVmZmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaW5mby0+ZGF0YV9idWZmX3NpemUgPSBNQVhfQlVGRl9TSVpFOworCWluZm8tPmRhdGFfZGVzYyA9ICh2b2lkICopaW5mby0+ZGF0YV9idWZmICsgZGF0YV9kZXNjX29mZnNldDsKKwlpbmZvLT5kYXRhX2Rlc2NfYWRkciA9IGluZm8tPmRhdGFfYnVmZl9waHlzICsgZGF0YV9kZXNjX29mZnNldDsKKworCWluZm8tPmRhdGFfZG1hX2NoID0gcHhhX3JlcXVlc3RfZG1hKCJuYW5kLWRhdGEiLCBETUFfUFJJT19MT1csCisJCQkJcHhhM3h4X25hbmRfZGF0YV9kbWFfaXJxLCBpbmZvKTsKKwlpZiAoaW5mby0+ZGF0YV9kbWFfY2ggPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IGRhdGEgZG1hXG4iKTsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldiwgaW5mby0+ZGF0YV9idWZmX3NpemUsCisJCQkJaW5mby0+ZGF0YV9idWZmLCBpbmZvLT5kYXRhX2J1ZmZfcGh5cyk7CisJCXJldHVybiBpbmZvLT5kYXRhX2RtYV9jaDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuYW5kX2VjY2xheW91dCBod19zbWFsbHBhZ2VfZWNjbGF5b3V0ID0geworCS5lY2NieXRlcyA9IDYsCisJLmVjY3BvcyA9IHs4LCA5LCAxMCwgMTEsIDEyLCAxMyB9LAorCS5vb2JmcmVlID0geyB7MiwgNn0gfQorfTsKKworc3RhdGljIHN0cnVjdCBuYW5kX2VjY2xheW91dCBod19sYXJnZXBhZ2VfZWNjbGF5b3V0ID0geworCS5lY2NieXRlcyA9IDI0LAorCS5lY2Nwb3MgPSB7CisJCTQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywKKwkJNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LAorCQk1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjN9LAorCS5vb2JmcmVlID0geyB7MiwgMzh9IH0KK307CisKK3N0YXRpYyB2b2lkIHB4YTN4eF9uYW5kX2luaXRfbXRkKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAorCQkJCSBzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgcHhhM3h4X25hbmRfZmxhc2ggKmYgPSBpbmZvLT5mbGFzaF9pbmZvOworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSAmaW5mby0+bmFuZF9jaGlwOworCisJdGhpcy0+b3B0aW9ucyA9IChmLT5mbGFzaF93aWR0aCA9PSAxNikgPyBOQU5EX0JVU1dJRFRIXzE2OiAwOworCisJdGhpcy0+d2FpdGZ1bmMJCT0gcHhhM3h4X25hbmRfd2FpdGZ1bmM7CisJdGhpcy0+c2VsZWN0X2NoaXAJPSBweGEzeHhfbmFuZF9zZWxlY3RfY2hpcDsKKwl0aGlzLT5kZXZfcmVhZHkJCT0gcHhhM3h4X25hbmRfZGV2X3JlYWR5OworCXRoaXMtPmNtZGZ1bmMJCT0gcHhhM3h4X25hbmRfY21kZnVuYzsKKwl0aGlzLT5yZWFkX3dvcmQJCT0gcHhhM3h4X25hbmRfcmVhZF93b3JkOworCXRoaXMtPnJlYWRfYnl0ZQkJPSBweGEzeHhfbmFuZF9yZWFkX2J5dGU7CisJdGhpcy0+cmVhZF9idWYJCT0gcHhhM3h4X25hbmRfcmVhZF9idWY7CisJdGhpcy0+d3JpdGVfYnVmCQk9IHB4YTN4eF9uYW5kX3dyaXRlX2J1ZjsKKwl0aGlzLT52ZXJpZnlfYnVmCT0gcHhhM3h4X25hbmRfdmVyaWZ5X2J1ZjsKKworCXRoaXMtPmVjYy5tb2RlCQk9IE5BTkRfRUNDX0hXOworCXRoaXMtPmVjYy5od2N0bAkJPSBweGEzeHhfbmFuZF9lY2NfaHdjdGw7CisJdGhpcy0+ZWNjLmNhbGN1bGF0ZQk9IHB4YTN4eF9uYW5kX2VjY19jYWxjdWxhdGU7CisJdGhpcy0+ZWNjLmNvcnJlY3QJPSBweGEzeHhfbmFuZF9lY2NfY29ycmVjdDsKKwl0aGlzLT5lY2Muc2l6ZQkJPSBmLT5wYWdlX3NpemU7CisKKwlpZiAoZi0+cGFnZV9zaXplID09IDIwNDgpCisJCXRoaXMtPmVjYy5sYXlvdXQgPSAmaHdfbGFyZ2VwYWdlX2VjY2xheW91dDsKKwllbHNlCisJCXRoaXMtPmVjYy5sYXlvdXQgPSAmaHdfc21hbGxwYWdlX2VjY2xheW91dDsKKworCXRoaXMtPmNoaXBfZGVsYXkgPSAyNTsKK30KKworc3RhdGljIGludCBweGEzeHhfbmFuZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBweGEzeHhfbmFuZF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzOworCXN0cnVjdCBtdGRfaW5mbyAqbXRkOworCXN0cnVjdCByZXNvdXJjZSAqcjsKKwlpbnQgcmV0ID0gMCwgaXJxOworCisJcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWlmICghcGRhdGEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gcGxhdGZvcm0gZGF0YSBkZWZpbmVkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbXRkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG10ZF9pbmZvKSArIHNpemVvZihzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyksCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIW10ZCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaW5mbyA9IChzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqKSgmbXRkWzFdKTsKKwlpbmZvLT5wZGV2ID0gcGRldjsKKworCXRoaXMgPSAmaW5mby0+bmFuZF9jaGlwOworCW10ZC0+cHJpdiA9IGluZm87CisKKwlpbmZvLT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJOQU5EQ0xLIik7CisJaWYgKElTX0VSUihpbmZvLT5jbGspKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgbmFuZCBjbG9ja1xuIik7CisJCXJldCA9IFBUUl9FUlIoaW5mby0+Y2xrKTsKKwkJZ290byBmYWlsX2ZyZWVfbXRkOworCX0KKwljbGtfZW5hYmxlKGluZm8tPmNsayk7CisKKwlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAwKTsKKwlpZiAociA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHJlc291cmNlIGRlZmluZWQgZm9yIGRhdGEgRE1BXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGZhaWxfcHV0X2NsazsKKwl9CisJaW5mby0+ZHJjbXJfZGF0ID0gci0+c3RhcnQ7CisKKwlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAxKTsKKwlpZiAociA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHJlc291cmNlIGRlZmluZWQgZm9yIGNvbW1hbmQgRE1BXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGZhaWxfcHV0X2NsazsKKwl9CisJaW5mby0+ZHJjbXJfY21kID0gci0+c3RhcnQ7CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIElSUSByZXNvdXJjZSBkZWZpbmVkXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGZhaWxfcHV0X2NsazsKKwl9CisKKwlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAociA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIElPIG1lbW9yeSByZXNvdXJjZSBkZWZpbmVkXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBmYWlsX3B1dF9jbGs7CisJfQorCisJciA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyLT5zdGFydCwgci0+ZW5kIC0gci0+c3RhcnQgKyAxLCBwZGV2LT5uYW1lKTsKKwlpZiAociA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IG1lbW9yeSByZXNvdXJjZVxuIik7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBmYWlsX3B1dF9jbGs7CisJfQorCisJaW5mby0+bW1pb19iYXNlID0gaW9yZW1hcChyLT5zdGFydCwgci0+ZW5kIC0gci0+c3RhcnQgKyAxKTsKKwlpZiAoaW5mby0+bW1pb19iYXNlID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW9yZW1hcCgpIGZhaWxlZFxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbF9mcmVlX3JlczsKKwl9CisKKwlyZXQgPSBweGEzeHhfbmFuZF9pbml0X2J1ZmYoaW5mbyk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsX2ZyZWVfaW87CisKKwlyZXQgPSByZXF1ZXN0X2lycShJUlFfTkFORCwgcHhhM3h4X25hbmRfaXJxLCBJUlFGX0RJU0FCTEVELAorCQkJCXBkZXYtPm5hbWUsIGluZm8pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IElSUVxuIik7CisJCWdvdG8gZmFpbF9mcmVlX2J1ZjsKKwl9CisKKwlyZXQgPSBweGEzeHhfbmFuZF9kZXRlY3RfZmxhc2goaW5mbyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZGV0ZWN0IGZsYXNoXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBmYWlsX2ZyZWVfaXJxOworCX0KKworCXB4YTN4eF9uYW5kX2luaXRfbXRkKG10ZCwgaW5mbyk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtdGQpOworCisJaWYgKG5hbmRfc2NhbihtdGQsIDEpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBzY2FuIG5hbmRcbiIpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZmFpbF9mcmVlX2lycTsKKwl9CisKKwlyZXR1cm4gYWRkX210ZF9wYXJ0aXRpb25zKG10ZCwgcGRhdGEtPnBhcnRzLCBwZGF0YS0+bnJfcGFydHMpOworCitmYWlsX2ZyZWVfaXJxOgorCWZyZWVfaXJxKElSUV9OQU5ELCBpbmZvKTsKK2ZhaWxfZnJlZV9idWY6CisJaWYgKHVzZV9kbWEpIHsKKwkJcHhhX2ZyZWVfZG1hKGluZm8tPmRhdGFfZG1hX2NoKTsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldiwgaW5mby0+ZGF0YV9idWZmX3NpemUsCisJCQlpbmZvLT5kYXRhX2J1ZmYsIGluZm8tPmRhdGFfYnVmZl9waHlzKTsKKwl9IGVsc2UKKwkJa2ZyZWUoaW5mby0+ZGF0YV9idWZmKTsKK2ZhaWxfZnJlZV9pbzoKKwlpb3VubWFwKGluZm8tPm1taW9fYmFzZSk7CitmYWlsX2ZyZWVfcmVzOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihyLT5zdGFydCwgci0+ZW5kIC0gci0+c3RhcnQgKyAxKTsKK2ZhaWxfcHV0X2NsazoKKwljbGtfZGlzYWJsZShpbmZvLT5jbGspOworCWNsa19wdXQoaW5mby0+Y2xrKTsKK2ZhaWxfZnJlZV9tdGQ6CisJa2ZyZWUobXRkKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHB4YTN4eF9uYW5kX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHB4YTN4eF9uYW5kX2luZm8gKmluZm8gPSBtdGQtPnByaXY7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCWRlbF9tdGRfZGV2aWNlKG10ZCk7CisJZGVsX210ZF9wYXJ0aXRpb25zKG10ZCk7CisJZnJlZV9pcnEoSVJRX05BTkQsIGluZm8pOworCWlmICh1c2VfZG1hKSB7CisJCXB4YV9mcmVlX2RtYShpbmZvLT5kYXRhX2RtYV9jaCk7CisJCWRtYV9mcmVlX3dyaXRlY29tYmluZSgmcGRldi0+ZGV2LCBpbmZvLT5kYXRhX2J1ZmZfc2l6ZSwKKwkJCQlpbmZvLT5kYXRhX2J1ZmYsIGluZm8tPmRhdGFfYnVmZl9waHlzKTsKKwl9IGVsc2UKKwkJa2ZyZWUoaW5mby0+ZGF0YV9idWZmKTsKKwlrZnJlZShtdGQpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHB4YTN4eF9uYW5kX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gKHN0cnVjdCBtdGRfaW5mbyAqKXBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvID0gbXRkLT5wcml2OworCisJaWYgKGluZm8tPnN0YXRlICE9IFNUQVRFX1JFQURZKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImRyaXZlciBidXN5LCBzdGF0ZSA9ICVkXG4iLCBpbmZvLT5zdGF0ZSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB4YTN4eF9uYW5kX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gKHN0cnVjdCBtdGRfaW5mbyAqKXBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvID0gbXRkLT5wcml2OworCisJY2xrX2VuYWJsZShpbmZvLT5jbGspOworCisJcmV0dXJuIHB4YTN4eF9uYW5kX2NvbmZpZ19mbGFzaChpbmZvKTsKK30KKyNlbHNlCisjZGVmaW5lIHB4YTN4eF9uYW5kX3N1c3BlbmQJTlVMTAorI2RlZmluZSBweGEzeHhfbmFuZF9yZXN1bWUJTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHB4YTN4eF9uYW5kX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJweGEzeHgtbmFuZCIsCisJfSwKKwkucHJvYmUJCT0gcHhhM3h4X25hbmRfcHJvYmUsCisJLnJlbW92ZQkJPSBweGEzeHhfbmFuZF9yZW1vdmUsCisJLnN1c3BlbmQJPSBweGEzeHhfbmFuZF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gcHhhM3h4X25hbmRfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcHhhM3h4X25hbmRfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnB4YTN4eF9uYW5kX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChweGEzeHhfbmFuZF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHB4YTN4eF9uYW5kX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcHhhM3h4X25hbmRfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHB4YTN4eF9uYW5kX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBYQTN4eCBOQU5EIGNvbnRyb2xsZXIgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3J0Y19mcm9tNC5jIGIvZHJpdmVycy9tdGQvbmFuZC9ydGNfZnJvbTQuYwppbmRleCAwZjZhYzI1Li4yNmY4ODIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL3J0Y19mcm9tNC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvcnRjX2Zyb200LmMKQEAgLTQ3OCw2ICs0NzgsNyBAQAogCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXM7CiAJdW5zaWduZWQgc2hvcnQgYmNyMSwgYmNyMiwgd2NyMjsKIAlpbnQgaTsKKwlpbnQgcmV0OwogCiAJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBNVEQgZGV2aWNlIHN0cnVjdHVyZSBhbmQgcHJpdmF0ZSBkYXRhICovCiAJcnRjX2Zyb200X210ZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtdGRfaW5mbykgKyBzaXplb2Yoc3RydWN0IG5hbmRfY2hpcCksIEdGUF9LRVJORUwpOwpAQCAtNTM3LDYgKzUzOCwyMiBAQAogCXRoaXMtPmVjYy5od2N0bCA9IHJ0Y19mcm9tNF9lbmFibGVfaHdlY2M7CiAJdGhpcy0+ZWNjLmNhbGN1bGF0ZSA9IHJ0Y19mcm9tNF9jYWxjdWxhdGVfZWNjOwogCXRoaXMtPmVjYy5jb3JyZWN0ID0gcnRjX2Zyb200X2NvcnJlY3RfZGF0YTsKKworCS8qIFdlIGNvdWxkIGNyZWF0ZSB0aGUgZGVjb2RlciBvbiBkZW1hbmQsIGlmIG1lbW9yeSBpcyBhIGNvbmNlcm4uCisJICogVGhpcyB3YXkgd2UgaGF2ZSBpdCBoYW5keSwgaWYgYW4gZXJyb3IgaGFwcGVucworCSAqCisJICogU3ltYm9sc2l6ZSBpcyAxMCAoYml0cykKKwkgKiBQcmltaXR2ZSBwb2x5bm9taWFsIGlzIHheMTAreF4zKzEKKwkgKiBmaXJzdCBjb25zZWN1dGl2ZSByb290IGlzIDAKKwkgKiBwcmltaXR2ZSBlbGVtZW50IHRvIGdlbmVyYXRlIHJvb3RzID0gMQorCSAqIGdlbmVyYXRvciBwb2xpbm9taWFsIGRlZ3JlZSA9IDYKKwkgKi8KKwlyc19kZWNvZGVyID0gaW5pdF9ycygxMCwgMHg0MDksIDAsIDEsIDYpOworCWlmICghcnNfZGVjb2RlcikgeworCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBjcmVhdGUgYSBSUyBkZWNvZGVyXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfMTsKKwl9CiAjZWxzZQogCXByaW50ayhLRVJOX0lORk8gInJ0Y19mcm9tNF9pbml0OiB1c2luZyBzb2Z0d2FyZSBFQ0MgZGV0ZWN0aW9uLlxuIik7CiAKQEAgLTU0OSw4ICs1NjYsOCBAQAogCiAJLyogU2NhbiB0byBmaW5kIGV4aXN0ZW5jZSBvZiB0aGUgZGV2aWNlICovCiAJaWYgKG5hbmRfc2NhbihydGNfZnJvbTRfbXRkLCBSVENfRlJPTTRfTUFYX0NISVBTKSkgewotCQlrZnJlZShydGNfZnJvbTRfbXRkKTsKLQkJcmV0dXJuIC1FTlhJTzsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGVycl8yOwogCX0KIAogCS8qIFBlcmZvcm0gJ2RldmljZSByZWNvdmVyeScgZm9yIGVhY2ggY2hpcCBpbiBjYXNlIHRoZXJlIHdhcyBhIHBvd2VyIGxvc3MuICovCkBAIC01NjYsMjggKzU4MywxOSBAQAogI2VuZGlmCiAKIAkvKiBSZWdpc3RlciB0aGUgcGFydGl0aW9ucyAqLwotCWFkZF9tdGRfcGFydGl0aW9ucyhydGNfZnJvbTRfbXRkLCBwYXJ0aXRpb25faW5mbywgTlVNX1BBUlRJVElPTlMpOworCXJldCA9IGFkZF9tdGRfcGFydGl0aW9ucyhydGNfZnJvbTRfbXRkLCBwYXJ0aXRpb25faW5mbywgTlVNX1BBUlRJVElPTlMpOworCWlmIChyZXQpCisJCWdvdG8gZXJyXzM7CiAKLSNpZmRlZiBSVENfRlJPTTRfSFdFQ0MKLQkvKiBXZSBjb3VsZCBjcmVhdGUgdGhlIGRlY29kZXIgb24gZGVtYW5kLCBpZiBtZW1vcnkgaXMgYSBjb25jZXJuLgotCSAqIFRoaXMgd2F5IHdlIGhhdmUgaXQgaGFuZHksIGlmIGFuIGVycm9yIGhhcHBlbnMKLQkgKgotCSAqIFN5bWJvbHNpemUgaXMgMTAgKGJpdHMpCi0JICogUHJpbWl0dmUgcG9seW5vbWlhbCBpcyB4XjEwK3heMysxCi0JICogZmlyc3QgY29uc2VjdXRpdmUgcm9vdCBpcyAwCi0JICogcHJpbWl0dmUgZWxlbWVudCB0byBnZW5lcmF0ZSByb290cyA9IDEKLQkgKiBnZW5lcmF0b3IgcG9saW5vbWlhbCBkZWdyZWUgPSA2Ci0JICovCi0JcnNfZGVjb2RlciA9IGluaXRfcnMoMTAsIDB4NDA5LCAwLCAxLCA2KTsKLQlpZiAoIXJzX2RlY29kZXIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgY3JlYXRlIGEgUlMgZGVjb2RlclxuIik7Ci0JCW5hbmRfcmVsZWFzZShydGNfZnJvbTRfbXRkKTsKLQkJa2ZyZWUocnRjX2Zyb200X210ZCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLSNlbmRpZgogCS8qIFJldHVybiBoYXBweSAqLwogCXJldHVybiAwOworZXJyXzM6CisJbmFuZF9yZWxlYXNlKHJ0Y19mcm9tNF9tdGQpOworZXJyXzI6CisJZnJlZV9ycyhyc19kZWNvZGVyKTsKK2Vycl8xOgorCWtmcmVlKHJ0Y19mcm9tNF9tdGQpOworCXJldHVybiByZXQ7CiB9CiAKIG1vZHVsZV9pbml0KHJ0Y19mcm9tNF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvczNjMjQxMC5jIGIvZHJpdmVycy9tdGQvbmFuZC9zM2MyNDEwLmMKaW5kZXggOTI2MGFkOTQuLmIzNGE0NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvczNjMjQxMC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvczNjMjQxMC5jCkBAIC0xMTksOCArMTE5LDcgQEAKIAl2b2lkIF9faW9tZW0JCQkqc2VsX3JlZzsKIAlpbnQJCQkJc2VsX2JpdDsKIAlpbnQJCQkJbXRkX2NvdW50OwotCi0JdW5zaWduZWQgbG9uZwkJCXNhdmVfbmZjb25mOworCXVuc2lnbmVkIGxvbmcJCQlzYXZlX3NlbDsKIAogCWVudW0gczNjX2NwdV90eXBlCQljcHVfdHlwZTsKIH07CkBAIC0zNTgsNiArMzU3LDE0IEBACiAJaWYgKGRpZmYwID09IDAgJiYgZGlmZjEgPT0gMCAmJiBkaWZmMiA9PSAwKQogCQlyZXR1cm4gMDsJCS8qIEVDQyBpcyBvayAqLwogCisJLyogc29tZXRpbWVzIHBlb3BsZSBkbyBub3QgdGhpbmsgYWJvdXQgdXNpbmcgdGhlIEVDQywgc28gY2hlY2sKKwkgKiB0byBzZWUgaWYgd2UgaGF2ZSBhbiAweGZmLDB4ZmYsMHhmZiByZWFkIEVDQyBhbmQgdGhlbiBpZ25vcmUKKwkgKiB0aGUgZXJyb3IsIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhpcyBpcyBhbiB1bi1lY2NkIHBhZ2UuCisJICovCisJaWYgKHJlYWRfZWNjWzBdID09IDB4ZmYgJiYgcmVhZF9lY2NbMV0gPT0gMHhmZiAmJiByZWFkX2VjY1syXSA9PSAweGZmCisJICAgICYmIGluZm8tPnBsYXRmb3JtLT5pZ25vcmVfdW5zZXRfZWNjKQorCQlyZXR1cm4gMDsKKwogCS8qIENhbiB3ZSBjb3JyZWN0IHRoaXMgRUNDIChpZSwgb25lIHJvdyBhbmQgY29sdW1uIGNoYW5nZSkuCiAJICogTm90ZSwgdGhpcyBpcyBzaW1pbGFyIHRvIHRoZSAyNTYgZXJyb3IgY29kZSBvbiBzbWFydG1lZGlhICovCiAKQEAgLTQ3Myw3ICs0ODAsNyBAQAogCWVjY19jb2RlWzFdID0gZWNjID4+IDg7CiAJZWNjX2NvZGVbMl0gPSBlY2MgPj4gMTY7CiAKLQlwcl9kZWJ1ZygiJXM6IHJldHVybmluZyBlY2MgJTA2bHhcbiIsIF9fZnVuY19fLCBlY2MpOworCXByX2RlYnVnKCIlczogcmV0dXJuaW5nIGVjYyAlMDZseFxuIiwgX19mdW5jX18sIGVjYyAmIDB4ZmZmZmZmKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjQ0LDkgKzY1MSw2IEBACiAJCWNoaXAtPmVjYy5jYWxjdWxhdGUgPSBzM2MyNDEwX25hbmRfY2FsY3VsYXRlX2VjYzsKIAkJY2hpcC0+ZWNjLmNvcnJlY3QgICA9IHMzYzI0MTBfbmFuZF9jb3JyZWN0X2RhdGE7CiAJCWNoaXAtPmVjYy5tb2RlCSAgICA9IE5BTkRfRUNDX0hXOwotCQljaGlwLT5lY2Muc2l6ZQkgICAgPSA1MTI7Ci0JCWNoaXAtPmVjYy5ieXRlcwkgICAgPSAzOwotCQljaGlwLT5lY2MubGF5b3V0ICAgID0gJm5hbmRfaHdfZWNjb29iOwogCiAJCXN3aXRjaCAoaW5mby0+Y3B1X3R5cGUpIHsKIAkJY2FzZSBUWVBFX1MzQzI0MTA6CkBAIC02NjgsNiArNjcyLDQwIEBACiAJfSBlbHNlIHsKIAkJY2hpcC0+ZWNjLm1vZGUJICAgID0gTkFORF9FQ0NfU09GVDsKIAl9CisKKwlpZiAoc2V0LT5lY2NfbGF5b3V0ICE9IE5VTEwpCisJCWNoaXAtPmVjYy5sYXlvdXQgPSBzZXQtPmVjY19sYXlvdXQ7CisKKwlpZiAoc2V0LT5kaXNhYmxlX2VjYykKKwkJY2hpcC0+ZWNjLm1vZGUJPSBOQU5EX0VDQ19OT05FOworfQorCisvKiBzM2MyNDEwX25hbmRfdXBkYXRlX2NoaXAKKyAqCisgKiBwb3N0LXByb2JlIGNoaXAgdXBkYXRlLCB0byBjaGFuZ2UgYW55IGl0ZW1zLCBzdWNoIGFzIHRoZQorICogbGF5b3V0IGZvciBsYXJnZSBwYWdlIG5hbmQKKyAqLworCitzdGF0aWMgdm9pZCBzM2MyNDEwX25hbmRfdXBkYXRlX2NoaXAoc3RydWN0IHMzYzI0MTBfbmFuZF9pbmZvICppbmZvLAorCQkJCSAgICAgc3RydWN0IHMzYzI0MTBfbmFuZF9tdGQgKm5tdGQpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9ICZubXRkLT5jaGlwOworCisJcHJpbnRrKCIlczogY2hpcCAlcDogJWRcbiIsIF9fZnVuY19fLCBjaGlwLCBjaGlwLT5wYWdlX3NoaWZ0KTsKKworCWlmIChoYXJkd2FyZV9lY2MpIHsKKwkJLyogY2hhbmdlIHRoZSBiZWhhdmlvdXIgZGVwZW5kaW5nIG9uIHdldGhlciB3ZSBhcmUgdXNpbmcKKwkJICogdGhlIGxhcmdlIG9yIHNtYWxsIHBhZ2UgbmFuZCBkZXZpY2UgKi8KKworCQlpZiAoY2hpcC0+cGFnZV9zaGlmdCA+IDEwKSB7CisJCQljaGlwLT5lY2Muc2l6ZQkgICAgPSAyNTY7CisJCQljaGlwLT5lY2MuYnl0ZXMJICAgID0gMzsKKwkJfSBlbHNlIHsKKwkJCWNoaXAtPmVjYy5zaXplCSAgICA9IDUxMjsKKwkJCWNoaXAtPmVjYy5ieXRlcwkgICAgPSAzOworCQkJY2hpcC0+ZWNjLmxheW91dCAgICA9ICZuYW5kX2h3X2VjY29vYjsKKwkJfQorCX0KIH0KIAogLyogczNjMjQxMF9uYW5kX3Byb2JlCkBAIC03NzYsOSArODE0LDEyIEBACiAKIAkJczNjMjQxMF9uYW5kX2luaXRfY2hpcChpbmZvLCBubXRkLCBzZXRzKTsKIAotCQlubXRkLT5zY2FuX3JlcyA9IG5hbmRfc2Nhbigmbm10ZC0+bXRkLCAoc2V0cykgPyBzZXRzLT5ucl9jaGlwcyA6IDEpOworCQlubXRkLT5zY2FuX3JlcyA9IG5hbmRfc2Nhbl9pZGVudCgmbm10ZC0+bXRkLAorCQkJCQkJIChzZXRzKSA/IHNldHMtPm5yX2NoaXBzIDogMSk7CiAKIAkJaWYgKG5tdGQtPnNjYW5fcmVzID09IDApIHsKKwkJCXMzYzI0MTBfbmFuZF91cGRhdGVfY2hpcChpbmZvLCBubXRkKTsKKwkJCW5hbmRfc2Nhbl90YWlsKCZubXRkLT5tdGQpOwogCQkJczNjMjQxMF9uYW5kX2FkZF9wYXJ0aXRpb24oaW5mbywgbm10ZCwgc2V0cyk7CiAJCX0KIApAQCAtODEwLDE1ICs4NTEsMTQgQEAKIAlzdHJ1Y3QgczNjMjQxMF9uYW5kX2luZm8gKmluZm8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJaWYgKGluZm8pIHsKLQkJaW5mby0+c2F2ZV9uZmNvbmYgPSByZWFkbChpbmZvLT5yZWdzICsgUzNDMjQxMF9ORkNPTkYpOworCQlpbmZvLT5zYXZlX3NlbCA9IHJlYWRsKGluZm8tPnNlbF9yZWcpOwogCiAJCS8qIEZvciB0aGUgbW9tZW50LCB3ZSBtdXN0IGVuc3VyZSBuRkNFIGlzIGhpZ2ggZHVyaW5nCiAJCSAqIHRoZSB0aW1lIHdlIGFyZSBzdXNwZW5kZWQuIFRoaXMgcmVhbGx5IHNob3VsZCBiZQogCQkgKiBoYW5kbGVkIGJ5IHN1c3BlbmRpbmcgdGhlIE1URHMgd2UgYXJlIHVzaW5nLCBidXQKIAkJICogdGhhdCBpcyBjdXJyZW50bHkgbm90IHRoZSBjYXNlLiAqLwogCi0JCXdyaXRlbChpbmZvLT5zYXZlX25mY29uZiB8IGluZm8tPnNlbF9iaXQsCi0JCSAgICAgICBpbmZvLT5yZWdzICsgUzNDMjQxMF9ORkNPTkYpOworCQl3cml0ZWwoaW5mby0+c2F2ZV9zZWwgfCBpbmZvLT5zZWxfYml0LCBpbmZvLT5zZWxfcmVnKTsKIAogCQlpZiAoIWFsbG93X2Nsa19zdG9wKGluZm8pKQogCQkJY2xrX2Rpc2FibGUoaW5mby0+Y2xrKTsKQEAgLTgzMCw3ICs4NzAsNyBAQAogc3RhdGljIGludCBzM2MyNHh4X25hbmRfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgczNjMjQxMF9uYW5kX2luZm8gKmluZm8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOwotCXVuc2lnbmVkIGxvbmcgbmZjb25mOworCXVuc2lnbmVkIGxvbmcgc2VsOwogCiAJaWYgKGluZm8pIHsKIAkJY2xrX2VuYWJsZShpbmZvLT5jbGspOwpAQCAtODM4LDEwICs4NzgsMTAgQEAKIAogCQkvKiBSZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgbkZDRSBsaW5lLiAqLwogCi0JCW5mY29uZiA9IHJlYWRsKGluZm8tPnJlZ3MgKyBTM0MyNDEwX05GQ09ORik7Ci0JCW5mY29uZiAmPSB+aW5mby0+c2VsX2JpdDsKLQkJbmZjb25mIHw9IGluZm8tPnNhdmVfbmZjb25mICYgaW5mby0+c2VsX2JpdDsKLQkJd3JpdGVsKG5mY29uZiwgaW5mby0+cmVncyArIFMzQzI0MTBfTkZDT05GKTsKKwkJc2VsID0gcmVhZGwoaW5mby0+c2VsX3JlZyk7CisJCXNlbCAmPSB+aW5mby0+c2VsX2JpdDsKKwkJc2VsIHw9IGluZm8tPnNhdmVfc2VsICYgaW5mby0+c2VsX2JpdDsKKwkJd3JpdGVsKHNlbCwgaW5mby0+c2VsX3JlZyk7CiAKIAkJaWYgKGFsbG93X2Nsa19zdG9wKGluZm8pKQogCQkJY2xrX2Rpc2FibGUoaW5mby0+Y2xrKTsKQEAgLTkyNywzICs5NjcsNiBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTM0MyNFhYIE1URCBOQU5EIGRyaXZlciIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzM2MyNDEwLW5hbmQiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06czNjMjQxMi1uYW5kIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnMzYzI0NDAtbmFuZCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmZ0bG1vdW50LmMgYi9kcml2ZXJzL210ZC9uZnRsbW91bnQuYwppbmRleCAwNTEzY2JjLi4zNDVlNmVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uZnRsbW91bnQuYworKysgYi9kcml2ZXJzL210ZC9uZnRsbW91bnQuYwpAQCAtMzMsMTEgKzMzLDYgQEAKIAogY2hhciBuZnRsbW91bnRyZXZbXT0iJFJldmlzaW9uOiAxLjQxICQiOwogCi1leHRlcm4gaW50IG5mdGxfcmVhZF9vb2Ioc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZmZzLCBzaXplX3QgbGVuLAotCQkJIHNpemVfdCAqcmV0bGVuLCB1aW50OF90ICpidWYpOwotZXh0ZXJuIGludCBuZnRsX3dyaXRlX29vYihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mZnMsIHNpemVfdCBsZW4sCi0JCQkgIHNpemVfdCAqcmV0bGVuLCB1aW50OF90ICpidWYpOwotCiAvKiBmaW5kX2Jvb3RfcmVjb3JkOiBGaW5kIHRoZSBORlRMIE1lZGlhIEhlYWRlciBhbmQgaXRzIFNwYXJlIGNvcHkgd2hpY2ggY29udGFpbnMgdGhlCiAgKgl2YXJpb3VzIGRldmljZSBpbmZvcm1hdGlvbiBvZiB0aGUgTkZUTCBwYXJ0aXRpb24gYW5kIEJhZCBVbml0IFRhYmxlLiBVcGRhdGUKICAqCXRoZSBSZXBsVW5pdFRhYmxlW10gdGFibGUgYWNjcm9kaW5nIHRvIHRoZSBCYWQgVW5pdCBUYWJsZS4gUmVwbFVuaXRUYWJsZVtdCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9vZnBhcnQuYyBiL2RyaXZlcnMvbXRkL29mcGFydC5jCmluZGV4IGY4NmUwNjkuLjRmODBjMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL29mcGFydC5jCisrKyBiL2RyaXZlcnMvbXRkL29mcGFydC5jCkBAIC03MiwzICs3Miw1IEBACiAJcmV0dXJuIG5yX3BhcnRzOwogfQogRVhQT1JUX1NZTUJPTChvZl9tdGRfcGFyc2VfcGFydGl0aW9ucyk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL29uZW5hbmQvb25lbmFuZF9iYXNlLmMgYi9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmRfYmFzZS5jCmluZGV4IDhkN2QyMWIuLjVkNzk2NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL29uZW5hbmQvb25lbmFuZF9iYXNlLmMKKysrIGIvZHJpdmVycy9tdGQvb25lbmFuZC9vbmVuYW5kX2Jhc2UuYwpAQCAtMzI5LDYgKzMyOSwyMSBAQAogCQlwcmludGsoS0VSTl9FUlIgIm9uZW5hbmRfd2FpdDogY29udHJvbGxlciBlcnJvciA9IDB4JTA0eFxuIiwgY3RybCk7CiAJCWlmIChjdHJsICYgT05FTkFORF9DVFJMX0xPQ0spCiAJCQlwcmludGsoS0VSTl9FUlIgIm9uZW5hbmRfd2FpdDogaXQncyBsb2NrZWQgZXJyb3IuXG4iKTsKKwkJaWYgKHN0YXRlID09IEZMX1JFQURJTkcpIHsKKwkJCS8qCisJCQkgKiBBIHBvd2VyIGxvc3Mgd2hpbGUgd3JpdGluZyBjYW4gcmVzdWx0IGluIGEgcGFnZQorCQkJICogYmVjb21pbmcgdW5yZWFkYWJsZS4gIFdoZW4gdGhlIGRldmljZSBpcyBtb3VudGVkCisJCQkgKiBhZ2FpbiwgcmVhZGluZyB0aGF0IHBhZ2UgZ2l2ZXMgY29udHJvbGxlciBlcnJvcnMuCisJCQkgKiBVcHBlciBsZXZlbCBzb2Z0d2FyZSBsaWtlIEpGRlMyIHRyZWF0IC1FSU8gYXMgZmF0YWwsCisJCQkgKiByZWZ1c2luZyB0byBtb3VudCBhdCBhbGwuICBUaGF0IG1lYW5zIGl0IGlzIG5lY2Vzc2FyeQorCQkJICogdG8gdHJlYXQgdGhlIGVycm9yIGFzIGFuIEVDQyBlcnJvciB0byBhbGxvdyByZWNvdmVyeS4KKwkJCSAqIE5vdGUgdGhhdCB0eXBpY2FsbHkgaW4gdGhpcyBjYXNlLCB0aGUgZXJhc2VibG9jayBjYW4KKwkJCSAqIHN0aWxsIGJlIGVyYXNlZCBhbmQgcmV3cml0dGVuIGkuZS4gaXQgaGFzIG5vdCBiZWNvbWUKKwkJCSAqIGEgYmFkIGJsb2NrLgorCQkJICovCisJCQltdGQtPmVjY19zdGF0cy5mYWlsZWQrKzsKKwkJCXJldHVybiAtRUJBRE1TRzsKKwkJfQogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTEzMzYsNyArMTM1MSw3IEBACiAJfQogCiAJLyogUmVqZWN0IHdyaXRlcywgd2hpY2ggYXJlIG5vdCBwYWdlIGFsaWduZWQgKi8KLSAgICAgICAgaWYgKHVubGlrZWx5KE5PVEFMSUdORUQodG8pKSB8fCB1bmxpa2VseShOT1RBTElHTkVEKGxlbikpKSB7CisgICAgICAgIGlmICh1bmxpa2VseShOT1RBTElHTkVEKHRvKSB8fCBOT1RBTElHTkVEKGxlbikpKSB7CiAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJvbmVuYW5kX3BhbmljX3dyaXRlOiBBdHRlbXB0IHRvIHdyaXRlIG5vdCBwYWdlIGFsaWduZWQgZGF0YVxuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KQEAgLTE0NjYsNyArMTQ4MSw3IEBACiAJfQogCiAJLyogUmVqZWN0IHdyaXRlcywgd2hpY2ggYXJlIG5vdCBwYWdlIGFsaWduZWQgKi8KLSAgICAgICAgaWYgKHVubGlrZWx5KE5PVEFMSUdORUQodG8pKSB8fCB1bmxpa2VseShOT1RBTElHTkVEKGxlbikpKSB7CisgICAgICAgIGlmICh1bmxpa2VseShOT1RBTElHTkVEKHRvKSB8fCBOT1RBTElHTkVEKGxlbikpKSB7CiAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJvbmVuYW5kX3dyaXRlX29wc19ub2xvY2s6IEF0dGVtcHQgdG8gd3JpdGUgbm90IHBhZ2UgYWxpZ25lZCBkYXRhXG4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfQpAQCAtMjA1Miw3ICsyMDY3LDcgQEAKICAqCiAgKiBDaGVjayBsb2NrIHN0YXR1cwogICovCi1zdGF0aWMgdm9pZCBvbmVuYW5kX2NoZWNrX2xvY2tfc3RhdHVzKHN0cnVjdCBvbmVuYW5kX2NoaXAgKnRoaXMpCitzdGF0aWMgaW50IG9uZW5hbmRfY2hlY2tfbG9ja19zdGF0dXMoc3RydWN0IG9uZW5hbmRfY2hpcCAqdGhpcykKIHsKIAl1bnNpZ25lZCBpbnQgdmFsdWUsIGJsb2NrLCBzdGF0dXM7CiAJdW5zaWduZWQgaW50IGVuZDsKQEAgLTIwNzAsOSArMjA4NSwxMyBAQAogCiAJCS8qIENoZWNrIGxvY2sgc3RhdHVzICovCiAJCXN0YXR1cyA9IHRoaXMtPnJlYWRfd29yZCh0aGlzLT5iYXNlICsgT05FTkFORF9SRUdfV1BfU1RBVFVTKTsKLQkJaWYgKCEoc3RhdHVzICYgT05FTkFORF9XUF9VUykpCisJCWlmICghKHN0YXR1cyAmIE9ORU5BTkRfV1BfVVMpKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImJsb2NrID0gJWQsIHdwIHN0YXR1cyA9IDB4JXhcbiIsIGJsb2NrLCBzdGF0dXMpOworCQkJcmV0dXJuIDA7CisJCX0KIAl9CisKKwlyZXR1cm4gMTsKIH0KIAogLyoqCkBAIC0yMDgxLDkgKzIxMDAsMTEgQEAKICAqCiAgKiBVbmxvY2sgYWxsIGJsb2NrcwogICovCi1zdGF0aWMgaW50IG9uZW5hbmRfdW5sb2NrX2FsbChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3N0YXRpYyB2b2lkIG9uZW5hbmRfdW5sb2NrX2FsbChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKIHsKIAlzdHJ1Y3Qgb25lbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCWxvZmZfdCBvZnMgPSAwOworCXNpemVfdCBsZW4gPSB0aGlzLT5jaGlwc2l6ZTsKIAogCWlmICh0aGlzLT5vcHRpb25zICYgT05FTkFORF9IQVNfVU5MT0NLX0FMTCkgewogCQkvKiBTZXQgc3RhcnQgYmxvY2sgYWRkcmVzcyAqLwpAQCAtMjA5OSwyMyArMjEyMCwxOSBAQAogCQkgICAgJiBPTkVOQU5EX0NUUkxfT05HTykKIAkJCWNvbnRpbnVlOwogCisJCS8qIENoZWNrIGxvY2sgc3RhdHVzICovCisJCWlmIChvbmVuYW5kX2NoZWNrX2xvY2tfc3RhdHVzKHRoaXMpKQorCQkJcmV0dXJuOworCiAJCS8qIFdvcmthcm91bmQgZm9yIGFsbCBibG9jayB1bmxvY2sgaW4gRERQICovCiAJCWlmIChPTkVOQU5EX0lTX0REUCh0aGlzKSkgewotCQkJLyogMXN0IGJsb2NrIG9uIGFub3RoZXIgY2hpcCAqLwotCQkJbG9mZl90IG9mcyA9IHRoaXMtPmNoaXBzaXplID4+IDE7Ci0JCQlzaXplX3QgbGVuID0gbXRkLT5lcmFzZXNpemU7Ci0KLQkJCW9uZW5hbmRfZG9fbG9ja19jbWQobXRkLCBvZnMsIGxlbiwgT05FTkFORF9DTURfVU5MT0NLKTsKKwkJCS8qIEFsbCBibG9ja3Mgb24gYW5vdGhlciBjaGlwICovCisJCQlvZnMgPSB0aGlzLT5jaGlwc2l6ZSA+PiAxOworCQkJbGVuID0gdGhpcy0+Y2hpcHNpemUgPj4gMTsKIAkJfQotCi0JCW9uZW5hbmRfY2hlY2tfbG9ja19zdGF0dXModGhpcyk7Ci0KLQkJcmV0dXJuIDA7CiAJfQogCi0Jb25lbmFuZF9kb19sb2NrX2NtZChtdGQsIDB4MCwgdGhpcy0+Y2hpcHNpemUsIE9ORU5BTkRfQ01EX1VOTE9DSyk7Ci0KLQlyZXR1cm4gMDsKKwlvbmVuYW5kX2RvX2xvY2tfY21kKG10ZCwgb2ZzLCBsZW4sIE9ORU5BTkRfQ01EX1VOTE9DSyk7CiB9CiAKICNpZmRlZiBDT05GSUdfTVREX09ORU5BTkRfT1RQCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmRfYmJ0LmMgYi9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmRfYmJ0LmMKaW5kZXggYWVjZGQ1MC4uMmY1M2I1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvb25lbmFuZC9vbmVuYW5kX2JidC5jCisrKyBiL2RyaXZlcnMvbXRkL29uZW5hbmQvb25lbmFuZF9iYnQuYwpAQCAtMTcsOSArMTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9vbmVuYW5kLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL2NvbXBhdG1hYy5oPgogCi1leHRlcm4gaW50IG9uZW5hbmRfYmJ0X3JlYWRfb29iKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwKLQkJCQlzdHJ1Y3QgbXRkX29vYl9vcHMgKm9wcyk7Ci0KIC8qKgogICogY2hlY2tfc2hvcnRfcGF0dGVybiAtIFtHRU5FUklDXSBjaGVjayBpZiBhIHBhdHRlcm4gaXMgaW4gdGhlIGJ1ZmZlcgogICogQHBhcmFtIGJ1ZgkJdGhlIGJ1ZmZlciB0byBzZWFyY2gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3JmZF9mdGwuYyBiL2RyaXZlcnMvbXRkL3JmZF9mdGwuYwppbmRleCA4MjNmYmE0Li5jODRlNDU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9yZmRfZnRsLmMKKysrIGIvZHJpdmVycy9tdGQvcmZkX2Z0bC5jCkBAIC04MjMsNyArODIzLDcgQEAKIAlrZnJlZShwYXJ0KTsKIH0KIAotc3RydWN0IG10ZF9ibGt0cmFuc19vcHMgcmZkX2Z0bF90ciA9IHsKK3N0YXRpYyBzdHJ1Y3QgbXRkX2Jsa3RyYW5zX29wcyByZmRfZnRsX3RyID0gewogCS5uYW1lCQk9ICJyZmQiLAogCS5tYWpvcgkJPSBSRkRfRlRMX01BSk9SLAogCS5wYXJ0X2JpdHMJPSBQQVJUX0JJVFMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91YmkvS2NvbmZpZyBiL2RyaXZlcnMvbXRkL3ViaS9LY29uZmlnCmluZGV4IGI5ZGFmMTUuLjNmMDYzMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9LY29uZmlnCkBAIC0yNCw4ICsyNCwxMyBAQAogCSAgZXJhc2UgY291bnRlciB2YWx1ZSBhbmQgdGhlIGxvd2VzdCBlcmFzZSBjb3VudGVyIHZhbHVlIG9mIGVyYXNlYmxvY2tzCiAJICBvZiBVQkkgZGV2aWNlcy4gV2hlbiB0aGlzIHRocmVzaG9sZCBpcyBleGNlZWRlZCwgVUJJIHN0YXJ0cyBwZXJmb3JtaW5nCiAJICB3ZWFyIGxldmVsaW5nIGJ5IG1lYW5zIG9mIG1vdmluZyBkYXRhIGZyb20gZXJhc2VibG9jayB3aXRoIGxvdyBlcmFzZQotCSAgY291bnRlciB0byBlcmFzZWJsb2NrcyB3aXRoIGhpZ2ggZXJhc2UgY291bnRlci4gTGVhdmUgdGhlIGRlZmF1bHQKLQkgIHZhbHVlIGlmIHVuc3VyZS4KKwkgIGNvdW50ZXIgdG8gZXJhc2VibG9ja3Mgd2l0aCBoaWdoIGVyYXNlIGNvdW50ZXIuCisKKwkgIFRoZSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSBPSyBmb3IgU0xDIE5BTkQgZmxhc2hlcywgTk9SIGZsYXNoZXMgYW5kCisJICBvdGhlciBmbGFzaGVzIHdoaWNoIGhhdmUgZXJhc2VibG9jayBsaWZlLWN5Y2xlIDEwMDAwMCBvciBtb3JlLgorCSAgSG93ZXZlciwgaW4gY2FzZSBvZiBNTEMgTkFORCBmbGFzaGVzIHdoaWNoIHR5cGljYWxseSBoYXZlIGVyYXNlYmxvY2sKKwkgIGxpZmUtY3ljbGUgbGVzcyB0aGVuIDEwMDAwLCB0aGUgdGhyZXNob2xkIHNob3VsZCBiZSBsZXNzZW5lZCAoZS5nLiwKKwkgIHRvIDEyOCBvciAyNTYsIGFsdGhvdWdoIGl0IGRvZXMgbm90IGhhdmUgdG8gYmUgcG93ZXIgb2YgMikuCiAKIGNvbmZpZyBNVERfVUJJX0JFQl9SRVNFUlZFCiAJaW50ICJQZXJjZW50YWdlIG9mIHJlc2VydmVkIGVyYXNlYmxvY2tzIGZvciBiYWQgZXJhc2VibG9ja3MgaGFuZGxpbmciCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91YmkvYnVpbGQuYyBiL2RyaXZlcnMvbXRkL3ViaS9idWlsZC5jCmluZGV4IDI3NTk2MDQuLjk2MTQxNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS9idWlsZC5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9idWlsZC5jCkBAIC02MDYsOCArNjA2LDE2IEBACiAJCXViaS0+cm9fbW9kZSA9IDE7CiAJfQogCi0JZGJnX21zZygibGViX3NpemUgICAgICAgICAlZCIsIHViaS0+bGViX3NpemUpOwotCWRiZ19tc2coInJvX21vZGUgICAgICAgICAgJWQiLCB1YmktPnJvX21vZGUpOworCXViaV9tc2coInBoeXNpY2FsIGVyYXNlYmxvY2sgc2l6ZTogICAlZCBieXRlcyAoJWQgS2lCKSIsCisJCXViaS0+cGViX3NpemUsIHViaS0+cGViX3NpemUgPj4gMTApOworCXViaV9tc2coImxvZ2ljYWwgZXJhc2VibG9jayBzaXplOiAgICAlZCBieXRlcyIsIHViaS0+bGViX3NpemUpOworCXViaV9tc2coInNtYWxsZXN0IGZsYXNoIEkvTyB1bml0OiAgICAlZCIsIHViaS0+bWluX2lvX3NpemUpOworCWlmICh1YmktPmhkcnNfbWluX2lvX3NpemUgIT0gdWJpLT5taW5faW9fc2l6ZSkKKwkJdWJpX21zZygic3ViLXBhZ2Ugc2l6ZTogICAgICAgICAgICAgICVkIiwKKwkJCXViaS0+aGRyc19taW5faW9fc2l6ZSk7CisJdWJpX21zZygiVklEIGhlYWRlciBvZmZzZXQ6ICAgICAgICAgICVkIChhbGlnbmVkICVkKSIsCisJCXViaS0+dmlkX2hkcl9vZmZzZXQsIHViaS0+dmlkX2hkcl9hbG9mZnNldCk7CisJdWJpX21zZygiZGF0YSBvZmZzZXQ6ICAgICAgICAgICAgICAgICVkIiwgdWJpLT5sZWJfc3RhcnQpOwogCiAJLyoKIAkgKiBOb3RlLCBpZGVhbGx5LCB3ZSBoYXZlIHRvIGluaXRpYWxpemUgdWJpLT5iYWRfcGViX2NvdW50IGhlcmUuIEJ1dApAQCAtNzU1LDggKzc2Myw3IEBACiAJbXV0ZXhfaW5pdCgmdWJpLT52b2x1bWVzX211dGV4KTsKIAlzcGluX2xvY2tfaW5pdCgmdWJpLT52b2x1bWVzX2xvY2spOwogCi0JZGJnX21zZygiYXR0YWNoaW5nIG10ZCVkIHRvIHViaSVkOiBWSUQgaGVhZGVyIG9mZnNldCAlZCIsCi0JCW10ZC0+aW5kZXgsIHViaV9udW0sIHZpZF9oZHJfb2Zmc2V0KTsKKwl1YmlfbXNnKCJhdHRhY2hpbmcgbXRkJWQgdG8gdWJpJWQiLCBtdGQtPmluZGV4LCB1YmlfbnVtKTsKIAogCWVyciA9IGlvX2luaXQodWJpKTsKIAlpZiAoZXJyKQpAQCAtODA0LDE1ICs4MTEsOCBAQAogCXViaV9tc2coImF0dGFjaGVkIG10ZCVkIHRvIHViaSVkIiwgbXRkLT5pbmRleCwgdWJpX251bSk7CiAJdWJpX21zZygiTVREIGRldmljZSBuYW1lOiAgICAgICAgICAgIFwiJXNcIiIsIG10ZC0+bmFtZSk7CiAJdWJpX21zZygiTVREIGRldmljZSBzaXplOiAgICAgICAgICAgICVsbHUgTWlCIiwgdWJpLT5mbGFzaF9zaXplID4+IDIwKTsKLQl1YmlfbXNnKCJwaHlzaWNhbCBlcmFzZWJsb2NrIHNpemU6ICAgJWQgYnl0ZXMgKCVkIEtpQikiLAotCQl1YmktPnBlYl9zaXplLCB1YmktPnBlYl9zaXplID4+IDEwKTsKLQl1YmlfbXNnKCJsb2dpY2FsIGVyYXNlYmxvY2sgc2l6ZTogICAgJWQgYnl0ZXMiLCB1YmktPmxlYl9zaXplKTsKIAl1YmlfbXNnKCJudW1iZXIgb2YgZ29vZCBQRUJzOiAgICAgICAgJWQiLCB1YmktPmdvb2RfcGViX2NvdW50KTsKIAl1YmlfbXNnKCJudW1iZXIgb2YgYmFkIFBFQnM6ICAgICAgICAgJWQiLCB1YmktPmJhZF9wZWJfY291bnQpOwotCXViaV9tc2coInNtYWxsZXN0IGZsYXNoIEkvTyB1bml0OiAgICAlZCIsIHViaS0+bWluX2lvX3NpemUpOwotCXViaV9tc2coIlZJRCBoZWFkZXIgb2Zmc2V0OiAgICAgICAgICAlZCAoYWxpZ25lZCAlZCkiLAotCQl1YmktPnZpZF9oZHJfb2Zmc2V0LCB1YmktPnZpZF9oZHJfYWxvZmZzZXQpOwotCXViaV9tc2coImRhdGEgb2Zmc2V0OiAgICAgICAgICAgICAgICAlZCIsIHViaS0+bGViX3N0YXJ0KTsKIAl1YmlfbXNnKCJtYXguIGFsbG93ZWQgdm9sdW1lczogICAgICAgJWQiLCB1YmktPnZ0Ymxfc2xvdHMpOwogCXViaV9tc2coIndlYXItbGV2ZWxpbmcgdGhyZXNob2xkOiAgICAlZCIsIENPTkZJR19NVERfVUJJX1dMX1RIUkVTSE9MRCk7CiAJdWJpX21zZygibnVtYmVyIG9mIGludGVybmFsIHZvbHVtZXM6ICVkIiwgVUJJX0lOVF9WT0xfQ09VTlQpOwpAQCAtOTUwLDggKzk1MCw3IEBACiAJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgdWJpX3ZpZF9oZHIpICE9IDY0KTsKIAogCWlmIChtdGRfZGV2cyA+IFVCSV9NQVhfREVWSUNFUykgewotCQlwcmludGsoS0VSTl9FUlIgIlVCSSBlcnJvcjogdG9vIG1hbnkgTVREIGRldmljZXMsICIKLQkJICAgICAgICJtYXhpbXVtIGlzICVkXG4iLCBVQklfTUFYX0RFVklDRVMpOworCQl1YmlfZXJyKCJ0b28gbWFueSBNVEQgZGV2aWNlcywgbWF4aW11bSBpcyAlZCIsIFVCSV9NQVhfREVWSUNFUyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtOTU5LDI1ICs5NTgsMjUgQEAKIAl1YmlfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsIFVCSV9OQU1FX1NUUik7CiAJaWYgKElTX0VSUih1YmlfY2xhc3MpKSB7CiAJCWVyciA9IFBUUl9FUlIodWJpX2NsYXNzKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJVQkkgZXJyb3I6IGNhbm5vdCBjcmVhdGUgVUJJIGNsYXNzXG4iKTsKKwkJdWJpX2VycigiY2Fubm90IGNyZWF0ZSBVQkkgY2xhc3MiKTsKIAkJZ290byBvdXQ7CiAJfQogCiAJZXJyID0gY2xhc3NfY3JlYXRlX2ZpbGUodWJpX2NsYXNzLCAmdWJpX3ZlcnNpb24pOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVQkkgZXJyb3I6IGNhbm5vdCBjcmVhdGUgc3lzZnMgZmlsZVxuIik7CisJCXViaV9lcnIoImNhbm5vdCBjcmVhdGUgc3lzZnMgZmlsZSIpOwogCQlnb3RvIG91dF9jbGFzczsKIAl9CiAKIAllcnIgPSBtaXNjX3JlZ2lzdGVyKCZ1YmlfY3RybF9jZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVUJJIGVycm9yOiBjYW5ub3QgcmVnaXN0ZXIgZGV2aWNlXG4iKTsKKwkJdWJpX2VycigiY2Fubm90IHJlZ2lzdGVyIGRldmljZSIpOwogCQlnb3RvIG91dF92ZXJzaW9uOwogCX0KIAogCXViaV93bF9lbnRyeV9zbGFiID0ga21lbV9jYWNoZV9jcmVhdGUoInViaV93bF9lbnRyeV9zbGFiIiwKLQkJCQkJCXNpemVvZihzdHJ1Y3QgdWJpX3dsX2VudHJ5KSwKLQkJCQkJCTAsIDAsIE5VTEwpOworCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHViaV93bF9lbnRyeSksCisJCQkJCSAgICAgIDAsIDAsIE5VTEwpOwogCWlmICghdWJpX3dsX2VudHJ5X3NsYWIpCiAJCWdvdG8gb3V0X2Rldl91bnJlZzsKIApAQCAtMTAwMCw4ICs5OTksNyBAQAogCQltdXRleF91bmxvY2soJnViaV9kZXZpY2VzX211dGV4KTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCXB1dF9tdGRfZGV2aWNlKG10ZCk7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlVCSSBlcnJvcjogY2Fubm90IGF0dGFjaCBtdGQlZFxuIiwKLQkJCSAgICAgICBtdGQtPmluZGV4KTsKKwkJCXViaV9lcnIoImNhbm5vdCBhdHRhY2ggbXRkJWQiLCBtdGQtPmluZGV4KTsKIAkJCWdvdG8gb3V0X2RldGFjaDsKIAkJfQogCX0KQEAgLTEwMjMsNyArMTAyMSw3IEBACiBvdXRfY2xhc3M6CiAJY2xhc3NfZGVzdHJveSh1YmlfY2xhc3MpOwogb3V0OgotCXByaW50ayhLRVJOX0VSUiAiVUJJIGVycm9yOiBjYW5ub3QgaW5pdGlhbGl6ZSBVQkksIGVycm9yICVkXG4iLCBlcnIpOworCXViaV9lcnIoIlVCSSBlcnJvcjogY2Fubm90IGluaXRpYWxpemUgVUJJLCBlcnJvciAlZCIsIGVycik7CiAJcmV0dXJuIGVycjsKIH0KIG1vZHVsZV9pbml0KHViaV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9kZWJ1Zy5oIGIvZHJpdmVycy9tdGQvdWJpL2RlYnVnLmgKaW5kZXggNTFjNDBiMS4uOGVhOTlkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL2RlYnVnLmgKKysrIGIvZHJpdmVycy9tdGQvdWJpL2RlYnVnLmgKQEAgLTQxLDcgKzQxLDcgQEAKIC8qIEdlbmVyaWMgZGVidWdnaW5nIG1lc3NhZ2UgKi8KICNkZWZpbmUgZGJnX21zZyhmbXQsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJcHJpbnRrKEtFUk5fREVCVUcgIlVCSSBEQkcgKHBpZCAlZCk6ICVzOiAiIGZtdCAiXG4iLCBcCi0JICAgICAgIGN1cnJlbnQtPnBpZCwgX19GVU5DVElPTl9fLCAjI19fVkFfQVJHU19fKQorCSAgICAgICBjdXJyZW50LT5waWQsIF9fZnVuY19fLCAjI19fVkFfQVJHU19fKQogCiAjZGVmaW5lIHViaV9kYmdfZHVtcF9zdGFjaygpIGR1bXBfc3RhY2soKQogCkBAIC05OSw4ICs5OSwxMCBAQAogI2lmZGVmIENPTkZJR19NVERfVUJJX0RFQlVHX01TR19CTEQKIC8qIEluaXRpYWxpemF0aW9uIGFuZCBidWlsZCBtZXNzYWdlcyAqLwogI2RlZmluZSBkYmdfYmxkKGZtdCwgLi4uKSBkYmdfbXNnKGZtdCwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgVUJJX0lPX0RFQlVHIDEKICNlbHNlCiAjZGVmaW5lIGRiZ19ibGQoZm10LCAuLi4pICh7fSkKKyNkZWZpbmUgVUJJX0lPX0RFQlVHIDAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX01URF9VQklfREVCVUdfRU1VTEFURV9CSVRGTElQUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL2dsdWViaS5jIGIvZHJpdmVycy9tdGQvdWJpL2dsdWViaS5jCmluZGV4IGQzOTcyMTkuLmU5MDliMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS9nbHVlYmkuYworKysgYi9kcml2ZXJzL210ZC91YmkvZ2x1ZWJpLmMKQEAgLTI5MSwxMSArMjkxLDEyIEBACiAJLyoKIAkgKiBJbiBjYXNlIG9mIGR5bmFtaWMgdm9sdW1lLCBNVEQgZGV2aWNlIHNpemUgaXMganVzdCB2b2x1bWUgc2l6ZS4gSW4KIAkgKiBjYXNlIG9mIGEgc3RhdGljIHZvbHVtZSB0aGUgc2l6ZSBpcyBlcXVpdmFsZW50IHRvIHRoZSBhbW91bnQgb2YgZGF0YQotCSAqIGJ5dGVzLCB3aGljaCBpcyB6ZXJvIGF0IHRoaXMgbW9tZW50IGFuZCB3aWxsIGJlIGNoYW5nZWQgYWZ0ZXIgdm9sdW1lCi0JICogdXBkYXRlLgorCSAqIGJ5dGVzLgogCSAqLwogCWlmICh2b2wtPnZvbF90eXBlID09IFVCSV9EWU5BTUlDX1ZPTFVNRSkKIAkJbXRkLT5zaXplID0gdm9sLT51c2FibGVfbGViX3NpemUgKiB2b2wtPnJlc2VydmVkX3BlYnM7CisJZWxzZQorCQltdGQtPnNpemUgPSB2b2wtPnVzZWRfYnl0ZXM7CiAKIAlpZiAoYWRkX210ZF9kZXZpY2UobXRkKSkgewogCQl1YmlfZXJyKCJjYW5ub3Qgbm90IGFkZCBNVEQgZGV2aWNlXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9pby5jIGIvZHJpdmVycy9tdGQvdWJpL2lvLmMKaW5kZXggZGIzZWZkZS4uNGFjMTFkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL2lvLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL2lvLmMKQEAgLTYzMSw2ICs2MzEsOCBAQAogCiAJZGJnX2lvKCJyZWFkIEVDIGhlYWRlciBmcm9tIFBFQiAlZCIsIHBudW0pOwogCXViaV9hc3NlcnQocG51bSA+PSAwICYmIHBudW0gPCB1YmktPnBlYl9jb3VudCk7CisJaWYgKFVCSV9JT19ERUJVRykKKwkJdmVyYm9zZSA9IDE7CiAKIAllcnIgPSB1YmlfaW9fcmVhZCh1YmksIGVjX2hkciwgcG51bSwgMCwgVUJJX0VDX0hEUl9TSVpFKTsKIAlpZiAoZXJyKSB7CkBAIC05MDQsNiArOTA2LDggQEAKIAogCWRiZ19pbygicmVhZCBWSUQgaGVhZGVyIGZyb20gUEVCICVkIiwgcG51bSk7CiAJdWJpX2Fzc2VydChwbnVtID49IDAgJiYgIHBudW0gPCB1YmktPnBlYl9jb3VudCk7CisJaWYgKFVCSV9JT19ERUJVRykKKwkJdmVyYm9zZSA9IDE7CiAKIAlwID0gKGNoYXIgKil2aWRfaGRyIC0gdWJpLT52aWRfaGRyX3NoaWZ0OwogCWVyciA9IHViaV9pb19yZWFkKHViaSwgcCwgcG51bSwgdWJpLT52aWRfaGRyX2Fsb2Zmc2V0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL3NjYW4uYyBiL2RyaXZlcnMvbXRkL3ViaS9zY2FuLmMKaW5kZXggMDVhYTNlNy4uOTZkNDEwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL3NjYW4uYworKysgYi9kcml2ZXJzL210ZC91Ymkvc2Nhbi5jCkBAIC00Miw2ICs0Miw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2luY2x1ZGUgInViaS5oIgogCiAjaWZkZWYgQ09ORklHX01URF9VQklfREVCVUdfUEFSQU5PSUQKQEAgLTkyLDI3ICs5Myw2IEBACiB9CiAKIC8qKgotICogY29tbWl0X3RvX21lYW5fdmFsdWUgLSBjb21taXQgaW50ZXJtZWRpYXRlIHJlc3VsdHMgdG8gdGhlIGZpbmFsIG1lYW4gZXJhc2UKLSAqIGNvdW50ZXIgdmFsdWUuCi0gKiBAc2k6IHNjYW5uaW5nIGluZm9ybWF0aW9uCi0gKgotICogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB3aGljaCBjYWxjdWxhdGVzIHBhcnRpYWwgbWVhbiBlcmFzZSBjb3VudGVyIG1lYW4KLSAqIHZhbHVlIGFuZCBhZGRzIGl0IHRvIHRoZSByZXN1bHRpbmcgbWVhbiB2YWx1ZS4gQXMgd2UgY2FuIHdvcmsgb25seSBpbgotICogaW50ZWdlciBhcml0aG1ldGljIGFuZCB3ZSB3YW50IHRvIGNhbGN1bGF0ZSB0aGUgbWVhbiB2YWx1ZSBvZiBlcmFzZSBjb3VudGVyCi0gKiBhY2N1cmF0ZWx5LCB3ZSBmaXJzdCBzdW0gZXJhc2UgY291bnRlciB2YWx1ZXMgaW4gQHNpLT5lY19zdW0gdmFyaWFibGUgYW5kCi0gKiBjb3VudCB0aGVzZSBjb21wb25lbnRzIGluIEBzaS0+ZWNfY291bnQuIElmIHRoaXMgdGVtcG9yYXJ5IEBzaS0+ZWNfc3VtIGlzCi0gKiBnb2luZyB0byBvdmVyZmxvdywgd2UgY2FsY3VsYXRlIHRoZSBwYXJ0aWFsIG1lYW4gdmFsdWUKLSAqIChAc2ktPmVjX3N1bS9Ac2ktPmVjX2NvdW50KSBhbmQgYWRkIGl0IHRvIEBzaS0+bWVhbl9lYy4KLSAqLwotc3RhdGljIHZvaWQgY29tbWl0X3RvX21lYW5fdmFsdWUoc3RydWN0IHViaV9zY2FuX2luZm8gKnNpKQotewotCXNpLT5lY19zdW0gLz0gc2ktPmVjX2NvdW50OwotCWlmIChzaS0+ZWNfc3VtICUgc2ktPmVjX2NvdW50ID49IHNpLT5lY19jb3VudCAvIDIpCi0JCXNpLT5tZWFuX2VjICs9IDE7Ci0Jc2ktPm1lYW5fZWMgKz0gc2ktPmVjX3N1bTsKLX0KLQotLyoqCiAgKiB2YWxpZGF0ZV92aWRfaGRyIC0gY2hlY2sgdGhhdCB2b2x1bWUgaWRlbnRpZmllciBoZWFkZXIgaXMgY29ycmVjdCBhbmQKICAqIGNvbnNpc3RlbnQuCiAgKiBAdmlkX2hkcjogdGhlIHZvbHVtZSBpZGVudGlmaWVyIGhlYWRlciB0byBjaGVjawpAQCAtOTAxLDE1ICs4ODEsOCBAQAogCiBhZGp1c3RfbWVhbl9lYzoKIAlpZiAoIWVjX2NvcnIpIHsKLQkJaWYgKHNpLT5lY19zdW0gKyBlYyA8IGVjKSB7Ci0JCQljb21taXRfdG9fbWVhbl92YWx1ZShzaSk7Ci0JCQlzaS0+ZWNfc3VtID0gMDsKLQkJCXNpLT5lY19jb3VudCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlzaS0+ZWNfc3VtICs9IGVjOwotCQkJc2ktPmVjX2NvdW50ICs9IDE7Ci0JCX0KLQorCQlzaS0+ZWNfc3VtICs9IGVjOworCQlzaS0+ZWNfY291bnQgKz0gMTsKIAkJaWYgKGVjID4gc2ktPm1heF9lYykKIAkJCXNpLT5tYXhfZWMgPSBlYzsKIAkJaWYgKGVjIDwgc2ktPm1pbl9lYykKQEAgLTk2NSw5ICs5MzgsMTEgQEAKIAogCWRiZ19tc2coInNjYW5uaW5nIGlzIGZpbmlzaGVkIik7CiAKLQkvKiBGaW5pc2ggbWVhbiBlcmFzZSBjb3VudGVyIGNhbGN1bGF0aW9ucyAqLwotCWlmIChzaS0+ZWNfY291bnQpCi0JCWNvbW1pdF90b19tZWFuX3ZhbHVlKHNpKTsKKwkvKiBDYWxjdWxhdGUgbWVhbiBlcmFzZSBjb3VudGVyICovCisJaWYgKHNpLT5lY19jb3VudCkgeworCQlkb19kaXYoc2ktPmVjX3N1bSwgc2ktPmVjX2NvdW50KTsKKwkJc2ktPm1lYW5fZWMgPSBzaS0+ZWNfc3VtOworCX0KIAogCWlmIChzaS0+aXNfZW1wdHkpCiAJCXViaV9tc2coImVtcHR5IE1URCBkZXZpY2UgZGV0ZWN0ZWQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9zY2FuLmggYi9kcml2ZXJzL210ZC91Ymkvc2Nhbi5oCmluZGV4IDQ2ZDQ0NGEuLjk2NmI5YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS9zY2FuLmgKKysrIGIvZHJpdmVycy9tdGQvdWJpL3NjYW4uaApAQCAtMTI0LDcgKzEyNCw3IEBACiAJaW50IG1heF9lYzsKIAl1bnNpZ25lZCBsb25nIGxvbmcgbWF4X3NxbnVtOwogCWludCBtZWFuX2VjOwotCWludCBlY19zdW07CisJdWludDY0X3QgZWNfc3VtOwogCWludCBlY19jb3VudDsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXRkL3ViaS1oZWFkZXIuaCBiL2RyaXZlcnMvbXRkL3ViaS91YmktbWVkaWEuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBpbmNsdWRlL210ZC91YmktaGVhZGVyLmgKcmVuYW1lIHRvIGRyaXZlcnMvbXRkL3ViaS91YmktbWVkaWEuaAppbmRleCAyOTJmOTE2Li5jMzE4NWQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL210ZC91YmktaGVhZGVyLmgKKysrIGIvZHJpdmVycy9tdGQvdWJpL3ViaS1tZWRpYS5oCkBAIC0yNCwxMSArMjQsMTEgQEAKIAogLyoKICAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBsYXlvdXQgb2YgVUJJIGhlYWRlcnMgYW5kIGFsbCB0aGUgb3RoZXIgVUJJIG9uLWZsYXNoCi0gKiBkYXRhIHN0cnVjdHVyZXMuIE1heSBiZSBpbmNsdWRlZCBieSB1c2VyLXNwYWNlLgorICogZGF0YSBzdHJ1Y3R1cmVzLgogICovCiAKLSNpZm5kZWYgX19VQklfSEVBREVSX0hfXwotI2RlZmluZSBfX1VCSV9IRUFERVJfSF9fCisjaWZuZGVmIF9fVUJJX01FRElBX0hfXworI2RlZmluZSBfX1VCSV9NRURJQV9IX18KIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIApAQCAtMzY5LDQgKzM2OSw0IEBACiAJX19iZTMyICBjcmM7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotI2VuZGlmIC8qICFfX1VCSV9IRUFERVJfSF9fICovCisjZW5kaWYgLyogIV9fVUJJX01FRElBX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL3ViaS5oIGIvZHJpdmVycy9tdGQvdWJpL3ViaS5oCmluZGV4IGE1NDhjMWQuLjY3ZGNiZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS91YmkuaAorKysgYi9kcml2ZXJzL210ZC91YmkvdWJpLmgKQEAgLTM3LDEwICszNyw5IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KLQotI2luY2x1ZGUgPG10ZC91YmktaGVhZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3ViaS5oPgogCisjaW5jbHVkZSAidWJpLW1lZGlhLmgiCiAjaW5jbHVkZSAic2Nhbi5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKQEAgLTU0LDEwICs1MywxMCBAQAogI2RlZmluZSB1YmlfbXNnKGZtdCwgLi4uKSBwcmludGsoS0VSTl9OT1RJQ0UgIlVCSTogIiBmbXQgIlxuIiwgIyNfX1ZBX0FSR1NfXykKIC8qIFVCSSB3YXJuaW5nIG1lc3NhZ2VzICovCiAjZGVmaW5lIHViaV93YXJuKGZtdCwgLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HICJVQkkgd2FybmluZzogJXM6ICIgZm10ICJcbiIsIFwKLQkJCQkgIF9fRlVOQ1RJT05fXywgIyNfX1ZBX0FSR1NfXykKKwkJCQkgIF9fZnVuY19fLCAjI19fVkFfQVJHU19fKQogLyogVUJJIGVycm9yIG1lc3NhZ2VzICovCiAjZGVmaW5lIHViaV9lcnIoZm10LCAuLi4pIHByaW50ayhLRVJOX0VSUiAiVUJJIGVycm9yOiAlczogIiBmbXQgIlxuIiwgXAotCQkJCSBfX0ZVTkNUSU9OX18sICMjX19WQV9BUkdTX18pCisJCQkJIF9fZnVuY19fLCAjI19fVkFfQVJHU19fKQogCiAvKiBMb3dlc3QgbnVtYmVyIFBFQnMgcmVzZXJ2ZWQgZm9yIGJhZCBQRUIgaGFuZGxpbmcgKi8KICNkZWZpbmUgTUlOX1JFU0VWRURfUEVCUyAyCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0vYXQ5MV9ldGhlci5jIGIvZHJpdmVycy9uZXQvYXJtL2F0OTFfZXRoZXIuYwppbmRleCA5NzhlMjBhLi4xZTM5ZTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcm0vYXQ5MV9ldGhlci5jCisrKyBiL2RyaXZlcnMvbmV0L2FybS9hdDkxX2V0aGVyLmMKQEAgLTEyNDgsMyArMTI0OCw0IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkFUOTFSTTkyMDAgRU1BQyBFdGhlcm5ldCBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIkFuZHJldyBWaWN0b3IiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06IiBEUlZfTkFNRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0vZXA5M3h4X2V0aC5jIGIvZHJpdmVycy9uZXQvYXJtL2VwOTN4eF9ldGguYwppbmRleCA5MWE2NTkwLi5lY2Q4ZmM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcm0vZXA5M3h4X2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2FybS9lcDkzeHhfZXRoLmMKQEAgLTg5Nyw2ICs4OTcsNyBAQAogCS5yZW1vdmUJCT0gZXA5M3h4X2V0aF9yZW1vdmUsCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gImVwOTN4eC1ldGgiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAogfTsKIApAQCAtOTE0LDMgKzkxNSw0IEBACiBtb2R1bGVfaW5pdChlcDkzeHhfZXRoX2luaXRfbW9kdWxlKTsKIG1vZHVsZV9leGl0KGVwOTN4eF9ldGhfY2xlYW51cF9tb2R1bGUpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTplcDkzeHgtZXRoIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGx4L2F0bDEuYyBiL2RyaXZlcnMvbmV0L2F0bHgvYXRsMS5jCmluZGV4IDU1ODZmYzYuLjBhZmU1MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2F0bHgvYXRsMS5jCisrKyBiL2RyaXZlcnMvbmV0L2F0bHgvYXRsMS5jCkBAIC05MSw2ICs5MSwxNDQgQEAKICNpbmNsdWRlICJhdGx4LmMiCiAKIC8qCisgKiBUaGlzIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgbmVlZHMgdG8gYmUgY2hhbmdlZCB0byBhZGp1c3QgdGhlCisgKiBtYXhpbXVtIG51bWJlciBvZiBwb3J0cyB0aGF0IHRoZSBkcml2ZXIgY2FuIG1hbmFnZS4KKyAqLworI2RlZmluZSBBVEwxX01BWF9OSUMgNAorCisjZGVmaW5lIE9QVElPTl9VTlNFVCAgICAtMQorI2RlZmluZSBPUFRJT05fRElTQUJMRUQgMAorI2RlZmluZSBPUFRJT05fRU5BQkxFRCAgMQorCisjZGVmaW5lIEFUTDFfUEFSQU1fSU5JVCB7IFswIC4uLiBBVEwxX01BWF9OSUNdID0gT1BUSU9OX1VOU0VUIH0KKworLyoKKyAqIEludGVycnVwdCBNb2RlcmF0ZSBUaW1lciBpbiB1bml0cyBvZiAyIHVzCisgKgorICogVmFsaWQgUmFuZ2U6IDEwLTY1NTM1CisgKgorICogRGVmYXVsdCBWYWx1ZTogMTAwICgyMDB1cykKKyAqLworc3RhdGljIGludCBfX2RldmluaXRkYXRhIGludF9tb2RfdGltZXJbQVRMMV9NQVhfTklDKzFdID0gQVRMMV9QQVJBTV9JTklUOworc3RhdGljIGludCBudW1faW50X21vZF90aW1lcjsKK21vZHVsZV9wYXJhbV9hcnJheV9uYW1lZChpbnRfbW9kX3RpbWVyLCBpbnRfbW9kX3RpbWVyLCBpbnQsCisJJm51bV9pbnRfbW9kX3RpbWVyLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW50X21vZF90aW1lciwgIkludGVycnVwdCBtb2RlcmF0b3IgdGltZXIiKTsKKworI2RlZmluZSBERUZBVUxUX0lOVF9NT0RfQ05UCTEwMAkvKiAyMDB1cyAqLworI2RlZmluZSBNQVhfSU5UX01PRF9DTlQJCTY1MDAwCisjZGVmaW5lIE1JTl9JTlRfTU9EX0NOVAkJNTAKKworc3RydWN0IGF0bDFfb3B0aW9uIHsKKwllbnVtIHsgZW5hYmxlX29wdGlvbiwgcmFuZ2Vfb3B0aW9uLCBsaXN0X29wdGlvbiB9IHR5cGU7CisJY2hhciAqbmFtZTsKKwljaGFyICplcnI7CisJaW50IGRlZjsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CS8qIHJhbmdlX29wdGlvbiBpbmZvICovCisJCQlpbnQgbWluOworCQkJaW50IG1heDsKKwkJfSByOworCQlzdHJ1Y3QgewkvKiBsaXN0X29wdGlvbiBpbmZvICovCisJCQlpbnQgbnI7CisJCQlzdHJ1Y3QgYXRsMV9vcHRfbGlzdCB7CisJCQkJaW50IGk7CisJCQkJY2hhciAqc3RyOworCQkJfSAqcDsKKwkJfSBsOworCX0gYXJnOworfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYXRsMV92YWxpZGF0ZV9vcHRpb24oaW50ICp2YWx1ZSwgc3RydWN0IGF0bDFfb3B0aW9uICpvcHQsCisJc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaWYgKCp2YWx1ZSA9PSBPUFRJT05fVU5TRVQpIHsKKwkJKnZhbHVlID0gb3B0LT5kZWY7CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAob3B0LT50eXBlKSB7CisJY2FzZSBlbmFibGVfb3B0aW9uOgorCQlzd2l0Y2ggKCp2YWx1ZSkgeworCQljYXNlIE9QVElPTl9FTkFCTEVEOgorCQkJZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzIGVuYWJsZWRcbiIsIG9wdC0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBPUFRJT05fRElTQUJMRUQ6CisJCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiJXMgZGlzYWJsZWRcbiIsIG9wdC0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIHJhbmdlX29wdGlvbjoKKwkJaWYgKCp2YWx1ZSA+PSBvcHQtPmFyZy5yLm1pbiAmJiAqdmFsdWUgPD0gb3B0LT5hcmcuci5tYXgpIHsKKwkJCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlcyBzZXQgdG8gJWlcbiIsIG9wdC0+bmFtZSwKKwkJCQkqdmFsdWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBsaXN0X29wdGlvbjp7CisJCQlpbnQgaTsKKwkJCXN0cnVjdCBhdGwxX29wdF9saXN0ICplbnQ7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBvcHQtPmFyZy5sLm5yOyBpKyspIHsKKwkJCQllbnQgPSAmb3B0LT5hcmcubC5wW2ldOworCQkJCWlmICgqdmFsdWUgPT0gZW50LT5pKSB7CisJCQkJCWlmIChlbnQtPnN0clswXSAhPSAnXDAnKQorCQkJCQkJZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzXG4iLAorCQkJCQkJCWVudC0+c3RyKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJZGV2X2luZm8oJnBkZXYtPmRldiwgImludmFsaWQgJXMgc3BlY2lmaWVkICglaSkgJXNcbiIsCisJCW9wdC0+bmFtZSwgKnZhbHVlLCBvcHQtPmVycik7CisJKnZhbHVlID0gb3B0LT5kZWY7CisJcmV0dXJuIC0xOworfQorCisvKgorICogYXRsMV9jaGVja19vcHRpb25zIC0gUmFuZ2UgQ2hlY2tpbmcgZm9yIENvbW1hbmQgTGluZSBQYXJhbWV0ZXJzCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIHJvdXRpbmUgY2hlY2tzIGFsbCBjb21tYW5kIGxpbmUgcGFyYW1ldGVycyBmb3IgdmFsaWQgdXNlcgorICogaW5wdXQuICBJZiBhbiBpbnZhbGlkIHZhbHVlIGlzIGdpdmVuLCBvciBpZiBubyB1c2VyIHNwZWNpZmllZAorICogdmFsdWUgZXhpc3RzLCBhIGRlZmF1bHQgdmFsdWUgaXMgdXNlZC4gIFRoZSBmaW5hbCB2YWx1ZSBpcyBzdG9yZWQKKyAqIGluIGEgdmFyaWFibGUgaW4gdGhlIGFkYXB0ZXIgc3RydWN0dXJlLgorICovCit2b2lkIF9fZGV2aW5pdCBhdGwxX2NoZWNrX29wdGlvbnMoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisJaW50IGJkID0gYWRhcHRlci0+YmRfbnVtYmVyOworCWlmIChiZCA+PSBBVEwxX01BWF9OSUMpIHsKKwkJZGV2X25vdGljZSgmcGRldi0+ZGV2LCAibm8gY29uZmlndXJhdGlvbiBmb3IgYm9hcmQjJWlcbiIsIGJkKTsKKwkJZGV2X25vdGljZSgmcGRldi0+ZGV2LCAidXNpbmcgZGVmYXVsdHMgZm9yIGFsbCB2YWx1ZXNcbiIpOworCX0KKwl7CQkJLyogSW50ZXJydXB0IE1vZGVyYXRlIFRpbWVyICovCisJCXN0cnVjdCBhdGwxX29wdGlvbiBvcHQgPSB7CisJCQkudHlwZSA9IHJhbmdlX29wdGlvbiwKKwkJCS5uYW1lID0gIkludGVycnVwdCBNb2RlcmF0b3IgVGltZXIiLAorCQkJLmVyciA9ICJ1c2luZyBkZWZhdWx0IG9mICIKKwkJCQlfX01PRFVMRV9TVFJJTkcoREVGQVVMVF9JTlRfTU9EX0NOVCksCisJCQkuZGVmID0gREVGQVVMVF9JTlRfTU9EX0NOVCwKKwkJCS5hcmcgPSB7LnIgPSB7Lm1pbiA9IE1JTl9JTlRfTU9EX0NOVCwKKwkJCQkJLm1heCA9IE1BWF9JTlRfTU9EX0NOVH0gfQorCQl9OworCQlpbnQgdmFsOworCQlpZiAobnVtX2ludF9tb2RfdGltZXIgPiBiZCkgeworCQkJdmFsID0gaW50X21vZF90aW1lcltiZF07CisJCQlhdGwxX3ZhbGlkYXRlX29wdGlvbigmdmFsLCAmb3B0LCBwZGV2KTsKKwkJCWFkYXB0ZXItPmltdCA9ICh1MTYpIHZhbDsKKwkJfSBlbHNlCisJCQlhZGFwdGVyLT5pbXQgPSAodTE2KSAob3B0LmRlZik7CisJfQorfQorCisvKgogICogYXRsMV9wY2lfdGJsIC0gUENJIERldmljZSBJRCBUYWJsZQogICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgYXRsMV9wY2lfdGJsW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGx4L2F0bHguYyBiL2RyaXZlcnMvbmV0L2F0bHgvYXRseC5jCmluZGV4IDQxODYzMjYuLmYwNmI4NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2F0bHgvYXRseC5jCisrKyBiL2RyaXZlcnMvbmV0L2F0bHgvYXRseC5jCkBAIC0yNTMsMTgxICsyNTMsNCBAQAogCWF0bHhfdmxhbl9yeF9yZWdpc3RlcihhZGFwdGVyLT5uZXRkZXYsIGFkYXB0ZXItPnZsZ3JwKTsKIH0KIAotLyoKLSAqIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgdGhhdCBuZWVkcyB0byBiZSBjaGFuZ2VkIHRvIGFkanVzdCB0aGUKLSAqIG1heGltdW0gbnVtYmVyIG9mIHBvcnRzIHRoYXQgdGhlIGRyaXZlciBjYW4gbWFuYWdlLgotICovCi0jZGVmaW5lIEFUTDFfTUFYX05JQyA0Ci0KLSNkZWZpbmUgT1BUSU9OX1VOU0VUICAgIC0xCi0jZGVmaW5lIE9QVElPTl9ESVNBQkxFRCAwCi0jZGVmaW5lIE9QVElPTl9FTkFCTEVEICAxCi0KLSNkZWZpbmUgQVRMMV9QQVJBTV9JTklUIHsgWzAgLi4uIEFUTDFfTUFYX05JQ10gPSBPUFRJT05fVU5TRVQgfQotCi0vKgotICogSW50ZXJydXB0IE1vZGVyYXRlIFRpbWVyIGluIHVuaXRzIG9mIDIgdXMKLSAqCi0gKiBWYWxpZCBSYW5nZTogMTAtNjU1MzUKLSAqCi0gKiBEZWZhdWx0IFZhbHVlOiAxMDAgKDIwMHVzKQotICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdGRhdGEgaW50X21vZF90aW1lcltBVEwxX01BWF9OSUMrMV0gPSBBVEwxX1BBUkFNX0lOSVQ7Ci1zdGF0aWMgaW50IG51bV9pbnRfbW9kX3RpbWVyOwotbW9kdWxlX3BhcmFtX2FycmF5X25hbWVkKGludF9tb2RfdGltZXIsIGludF9tb2RfdGltZXIsIGludCwKLQkmbnVtX2ludF9tb2RfdGltZXIsIDApOwotTU9EVUxFX1BBUk1fREVTQyhpbnRfbW9kX3RpbWVyLCAiSW50ZXJydXB0IG1vZGVyYXRvciB0aW1lciIpOwotCi0vKgotICogZmxhc2hfdmVuZG9yCi0gKgotICogVmFsaWQgUmFuZ2U6IDAtMgotICoKLSAqIDAgLSBBdG1lbAotICogMSAtIFNTVAotICogMiAtIFNUCi0gKgotICogRGVmYXVsdCBWYWx1ZTogMAotICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdGRhdGEgZmxhc2hfdmVuZG9yW0FUTDFfTUFYX05JQysxXSA9IEFUTDFfUEFSQU1fSU5JVDsKLXN0YXRpYyBpbnQgbnVtX2ZsYXNoX3ZlbmRvcjsKLW1vZHVsZV9wYXJhbV9hcnJheV9uYW1lZChmbGFzaF92ZW5kb3IsIGZsYXNoX3ZlbmRvciwgaW50LCAmbnVtX2ZsYXNoX3ZlbmRvciwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGZsYXNoX3ZlbmRvciwgIlNQSSBmbGFzaCB2ZW5kb3IiKTsKLQotI2RlZmluZSBERUZBVUxUX0lOVF9NT0RfQ05UCTEwMAkvKiAyMDB1cyAqLwotI2RlZmluZSBNQVhfSU5UX01PRF9DTlQJCTY1MDAwCi0jZGVmaW5lIE1JTl9JTlRfTU9EX0NOVAkJNTAKLQotI2RlZmluZSBGTEFTSF9WRU5ET1JfREVGQVVMVAkwCi0jZGVmaW5lIEZMQVNIX1ZFTkRPUl9NSU4JMAotI2RlZmluZSBGTEFTSF9WRU5ET1JfTUFYCTIKLQotc3RydWN0IGF0bDFfb3B0aW9uIHsKLQllbnVtIHsgZW5hYmxlX29wdGlvbiwgcmFuZ2Vfb3B0aW9uLCBsaXN0X29wdGlvbiB9IHR5cGU7Ci0JY2hhciAqbmFtZTsKLQljaGFyICplcnI7Ci0JaW50IGRlZjsKLQl1bmlvbiB7Ci0JCXN0cnVjdCB7CS8qIHJhbmdlX29wdGlvbiBpbmZvICovCi0JCQlpbnQgbWluOwotCQkJaW50IG1heDsKLQkJfSByOwotCQlzdHJ1Y3QgewkvKiBsaXN0X29wdGlvbiBpbmZvICovCi0JCQlpbnQgbnI7Ci0JCQlzdHJ1Y3QgYXRsMV9vcHRfbGlzdCB7Ci0JCQkJaW50IGk7Ci0JCQkJY2hhciAqc3RyOwotCQkJfSAqcDsKLQkJfSBsOwotCX0gYXJnOwotfTsKLQotc3RhdGljIGludCBfX2RldmluaXQgYXRsMV92YWxpZGF0ZV9vcHRpb24oaW50ICp2YWx1ZSwgc3RydWN0IGF0bDFfb3B0aW9uICpvcHQsCi0Jc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0JaWYgKCp2YWx1ZSA9PSBPUFRJT05fVU5TRVQpIHsKLQkJKnZhbHVlID0gb3B0LT5kZWY7Ci0JCXJldHVybiAwOwotCX0KLQotCXN3aXRjaCAob3B0LT50eXBlKSB7Ci0JY2FzZSBlbmFibGVfb3B0aW9uOgotCQlzd2l0Y2ggKCp2YWx1ZSkgewotCQljYXNlIE9QVElPTl9FTkFCTEVEOgotCQkJZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzIGVuYWJsZWRcbiIsIG9wdC0+bmFtZSk7Ci0JCQlyZXR1cm4gMDsKLQkJY2FzZSBPUFRJT05fRElTQUJMRUQ6Ci0JCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiJXMgZGlzYWJsZWRcbiIsIG9wdC0+bmFtZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIHJhbmdlX29wdGlvbjoKLQkJaWYgKCp2YWx1ZSA+PSBvcHQtPmFyZy5yLm1pbiAmJiAqdmFsdWUgPD0gb3B0LT5hcmcuci5tYXgpIHsKLQkJCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlcyBzZXQgdG8gJWlcbiIsIG9wdC0+bmFtZSwKLQkJCQkqdmFsdWUpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBsaXN0X29wdGlvbjp7Ci0JCQlpbnQgaTsKLQkJCXN0cnVjdCBhdGwxX29wdF9saXN0ICplbnQ7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBvcHQtPmFyZy5sLm5yOyBpKyspIHsKLQkJCQllbnQgPSAmb3B0LT5hcmcubC5wW2ldOwotCQkJCWlmICgqdmFsdWUgPT0gZW50LT5pKSB7Ci0JCQkJCWlmIChlbnQtPnN0clswXSAhPSAnXDAnKQotCQkJCQkJZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzXG4iLAotCQkJCQkJCWVudC0+c3RyKTsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JZGV2X2luZm8oJnBkZXYtPmRldiwgImludmFsaWQgJXMgc3BlY2lmaWVkICglaSkgJXNcbiIsCi0JCW9wdC0+bmFtZSwgKnZhbHVlLCBvcHQtPmVycik7Ci0JKnZhbHVlID0gb3B0LT5kZWY7Ci0JcmV0dXJuIC0xOwotfQotCi0vKgotICogYXRsMV9jaGVja19vcHRpb25zIC0gUmFuZ2UgQ2hlY2tpbmcgZm9yIENvbW1hbmQgTGluZSBQYXJhbWV0ZXJzCi0gKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqCi0gKiBUaGlzIHJvdXRpbmUgY2hlY2tzIGFsbCBjb21tYW5kIGxpbmUgcGFyYW1ldGVycyBmb3IgdmFsaWQgdXNlcgotICogaW5wdXQuICBJZiBhbiBpbnZhbGlkIHZhbHVlIGlzIGdpdmVuLCBvciBpZiBubyB1c2VyIHNwZWNpZmllZAotICogdmFsdWUgZXhpc3RzLCBhIGRlZmF1bHQgdmFsdWUgaXMgdXNlZC4gIFRoZSBmaW5hbCB2YWx1ZSBpcyBzdG9yZWQKLSAqIGluIGEgdmFyaWFibGUgaW4gdGhlIGFkYXB0ZXIgc3RydWN0dXJlLgotICovCi12b2lkIF9fZGV2aW5pdCBhdGwxX2NoZWNrX29wdGlvbnMoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7Ci0JaW50IGJkID0gYWRhcHRlci0+YmRfbnVtYmVyOwotCWlmIChiZCA+PSBBVEwxX01BWF9OSUMpIHsKLQkJZGV2X25vdGljZSgmcGRldi0+ZGV2LCAibm8gY29uZmlndXJhdGlvbiBmb3IgYm9hcmQjJWlcbiIsIGJkKTsKLQkJZGV2X25vdGljZSgmcGRldi0+ZGV2LCAidXNpbmcgZGVmYXVsdHMgZm9yIGFsbCB2YWx1ZXNcbiIpOwotCX0KLQl7CQkJLyogSW50ZXJydXB0IE1vZGVyYXRlIFRpbWVyICovCi0JCXN0cnVjdCBhdGwxX29wdGlvbiBvcHQgPSB7Ci0JCQkudHlwZSA9IHJhbmdlX29wdGlvbiwKLQkJCS5uYW1lID0gIkludGVycnVwdCBNb2RlcmF0b3IgVGltZXIiLAotCQkJLmVyciA9ICJ1c2luZyBkZWZhdWx0IG9mICIKLQkJCQlfX01PRFVMRV9TVFJJTkcoREVGQVVMVF9JTlRfTU9EX0NOVCksCi0JCQkuZGVmID0gREVGQVVMVF9JTlRfTU9EX0NOVCwKLQkJCS5hcmcgPSB7LnIgPSB7Lm1pbiA9IE1JTl9JTlRfTU9EX0NOVCwKLQkJCQkJLm1heCA9IE1BWF9JTlRfTU9EX0NOVH0gfQotCQl9OwotCQlpbnQgdmFsOwotCQlpZiAobnVtX2ludF9tb2RfdGltZXIgPiBiZCkgewotCQkJdmFsID0gaW50X21vZF90aW1lcltiZF07Ci0JCQlhdGwxX3ZhbGlkYXRlX29wdGlvbigmdmFsLCAmb3B0LCBwZGV2KTsKLQkJCWFkYXB0ZXItPmltdCA9ICh1MTYpIHZhbDsKLQkJfSBlbHNlCi0JCQlhZGFwdGVyLT5pbXQgPSAodTE2KSAob3B0LmRlZik7Ci0JfQotCi0JewkJCS8qIEZsYXNoIFZlbmRvciAqLwotCQlzdHJ1Y3QgYXRsMV9vcHRpb24gb3B0ID0gewotCQkJLnR5cGUgPSByYW5nZV9vcHRpb24sCi0JCQkubmFtZSA9ICJTUEkgRmxhc2ggVmVuZG9yIiwKLQkJCS5lcnIgPSAidXNpbmcgZGVmYXVsdCBvZiAiCi0JCQkJX19NT0RVTEVfU1RSSU5HKEZMQVNIX1ZFTkRPUl9ERUZBVUxUKSwKLQkJCS5kZWYgPSBERUZBVUxUX0lOVF9NT0RfQ05ULAotCQkJLmFyZyA9IHsuciA9IHsubWluID0gRkxBU0hfVkVORE9SX01JTiwKLQkJCQkJLm1heCA9IEZMQVNIX1ZFTkRPUl9NQVh9IH0KLQkJfTsKLQkJaW50IHZhbDsKLQkJaWYgKG51bV9mbGFzaF92ZW5kb3IgPiBiZCkgewotCQkJdmFsID0gZmxhc2hfdmVuZG9yW2JkXTsKLQkJCWF0bDFfdmFsaWRhdGVfb3B0aW9uKCZ2YWwsICZvcHQsIHBkZXYpOwotCQkJYWRhcHRlci0+aHcuZmxhc2hfdmVuZG9yID0gKHU4KSB2YWw7Ci0JCX0gZWxzZQotCQkJYWRhcHRlci0+aHcuZmxhc2hfdmVuZG9yID0gKHU4KSAob3B0LmRlZik7Ci0JfQotfQotCiAjZW5kaWYgLyogQVRMWF9DICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9heDg4Nzk2LmMgYi9kcml2ZXJzL25ldC9heDg4Nzk2LmMKaW5kZXggMTk0OTQ5YS4uMGI0YWRmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXg4ODc5Ni5jCisrKyBiL2RyaXZlcnMvbmV0L2F4ODg3OTYuYwpAQCAtMTAwNSwzICsxMDA1LDQgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiQVg4ODc5NiAxMC8xMDAgRXRoZXJuZXQgcGxhdGZvcm0gZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJCZW4gRG9va3MsIDxiZW5Ac2ltdGVjLmNvLnVrPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpheDg4Nzk2Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9iZmluX21hYy5jIGIvZHJpdmVycy9uZXQvYmZpbl9tYWMuYwppbmRleCA3MTdkY2MxLi40ZmVjODU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9iZmluX21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2JmaW5fbWFjLmMKQEAgLTQ3LDYgKzQ3LDcgQEAKIE1PRFVMRV9BVVRIT1IoRFJWX0FVVEhPUik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oRFJWX0RFU0MpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpiZmluX21hYyIpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9NQUNfVVNFX0wxKQogIyBkZWZpbmUgYmZpbl9tYWNfYWxsb2MoZG1hX2hhbmRsZSwgc2l6ZSkgIGwxX2RhdGFfc3JhbV96YWxsb2Moc2l6ZSkKQEAgLTEwODksOCArMTA5MCw5IEBACiAJLnJlc3VtZSA9IGJmaW5fbWFjX3Jlc3VtZSwKIAkuc3VzcGVuZCA9IGJmaW5fbWFjX3N1c3BlbmQsCiAJLmRyaXZlciA9IHsKLQkJICAgLm5hbWUgPSBEUlZfTkFNRSwKLQkJICAgfSwKKwkJLm5hbWUgPSBEUlZfTkFNRSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGJmaW5fbWFjX2luaXQodm9pZCkKQEAgLTExMDYsMyArMTEwOCw0IEBACiB9CiAKIG1vZHVsZV9leGl0KGJmaW5fbWFjX2NsZWFudXApOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jcG1hYy5jIGIvZHJpdmVycy9uZXQvY3BtYWMuYwppbmRleCA5ZGE3ZmY0Li4yYjU3NDBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jcG1hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2NwbWFjLmMKQEAgLTQyLDYgKzQyLDcgQEAKIE1PRFVMRV9BVVRIT1IoIkV1Z2VuZSBLb25ldiA8ZWprYUBpbWZpLmtzcHUucnU+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlRJIEFSNyBldGhlcm5ldCBkcml2ZXIgKENQTUFDKSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpjcG1hYyIpOwogCiBzdGF0aWMgaW50IGRlYnVnX2xldmVsID0gODsKIHN0YXRpYyBpbnQgZHVtYl9zd2l0Y2g7CkBAIC0xMTAzLDYgKzExMDQsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjcG1hY19kcml2ZXIgPSB7CiAJLmRyaXZlci5uYW1lID0gImNwbWFjIiwKKwkuZHJpdmVyLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLnByb2JlID0gY3BtYWNfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGNwbWFjX3JlbW92ZSksCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZG05MDAwLmMgYi9kcml2ZXJzL25ldC9kbTkwMDAuYwppbmRleCBkNjNjYzkzLi5lNmZlMjYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kbTkwMDAuYworKysgYi9kcml2ZXJzL25ldC9kbTkwMDAuYwpAQCAtMTQxOCwzICsxNDE4LDQgQEAKIE1PRFVMRV9BVVRIT1IoIlNhc2NoYSBIYXVlciwgQmVuIERvb2tzIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkRhdmljb20gRE05MDAwIG5ldHdvcmsgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmRtOTAwMCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDBlLzgyNTcxLmMgYi9kcml2ZXJzL25ldC9lMTAwMGUvODI1NzEuYwppbmRleCAwMWM4ODY2Li40NjIzNTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMGUvODI1NzEuYworKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvODI1NzEuYwpAQCAtMTMyNiwxMiArMTMyNiwxMCBAQAogCS5tYWMJCQk9IGUxMDAwXzgyNTcxLAogCS5mbGFncwkJCT0gRkxBR19IQVNfSFdfVkxBTl9GSUxURVIKIAkJCQkgIHwgRkxBR19IQVNfSlVNQk9fRlJBTUVTCi0JCQkJICB8IEZMQUdfSEFTX1NUQVRTX1BUQ19QUkMKIAkJCQkgIHwgRkxBR19IQVNfV09MCiAJCQkJICB8IEZMQUdfQVBNRV9JTl9DVFJMMwogCQkJCSAgfCBGTEFHX1JYX0NTVU1fRU5BQkxFRAogCQkJCSAgfCBGTEFHX0hBU19DVFJMRVhUX09OX0xPQUQKLQkJCQkgIHwgRkxBR19IQVNfU1RBVFNfSUNSX0lDVAogCQkJCSAgfCBGTEFHX0hBU19TTUFSVF9QT1dFUl9ET1dOCiAJCQkJICB8IEZMQUdfUkVTRVRfT1ZFUldSSVRFU19MQUEgLyogZXJyYXRhICovCiAJCQkJICB8IEZMQUdfVEFSQ19TUEVFRF9NT0RFX0JJVCAvKiBlcnJhdGEgKi8KQEAgLTEzNDcsMTIgKzEzNDUsMTAgQEAKIAkubWFjCQkJPSBlMTAwMF84MjU3MiwKIAkuZmxhZ3MJCQk9IEZMQUdfSEFTX0hXX1ZMQU5fRklMVEVSCiAJCQkJICB8IEZMQUdfSEFTX0pVTUJPX0ZSQU1FUwotCQkJCSAgfCBGTEFHX0hBU19TVEFUU19QVENfUFJDCiAJCQkJICB8IEZMQUdfSEFTX1dPTAogCQkJCSAgfCBGTEFHX0FQTUVfSU5fQ1RSTDMKIAkJCQkgIHwgRkxBR19SWF9DU1VNX0VOQUJMRUQKIAkJCQkgIHwgRkxBR19IQVNfQ1RSTEVYVF9PTl9MT0FECi0JCQkJICB8IEZMQUdfSEFTX1NUQVRTX0lDUl9JQ1QKIAkJCQkgIHwgRkxBR19UQVJDX1NQRUVEX01PREVfQklULCAvKiBlcnJhdGEgKi8KIAkucGJhCQkJPSAzOCwKIAkuZ2V0X3ZhcmlhbnRzCQk9IGUxMDAwX2dldF92YXJpYW50c184MjU3MSwKQEAgLTEzNjUsMTEgKzEzNjEsOSBAQAogCS5tYWMJCQk9IGUxMDAwXzgyNTczLAogCS5mbGFncwkJCT0gRkxBR19IQVNfSFdfVkxBTl9GSUxURVIKIAkJCQkgIHwgRkxBR19IQVNfSlVNQk9fRlJBTUVTCi0JCQkJICB8IEZMQUdfSEFTX1NUQVRTX1BUQ19QUkMKIAkJCQkgIHwgRkxBR19IQVNfV09MCiAJCQkJICB8IEZMQUdfQVBNRV9JTl9DVFJMMwogCQkJCSAgfCBGTEFHX1JYX0NTVU1fRU5BQkxFRAotCQkJCSAgfCBGTEFHX0hBU19TVEFUU19JQ1JfSUNUCiAJCQkJICB8IEZMQUdfSEFTX1NNQVJUX1BPV0VSX0RPV04KIAkJCQkgIHwgRkxBR19IQVNfQU1UCiAJCQkJICB8IEZMQUdfSEFTX0VSVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDBlL2RlZmluZXMuaCBiL2RyaXZlcnMvbmV0L2UxMDAwZS9kZWZpbmVzLmgKaW5kZXggNTcyY2ZkNC4uMmE1Mzg3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDBlL2RlZmluZXMuaAorKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvZGVmaW5lcy5oCkBAIC0xODQsNiArMTg0LDcgQEAKICNkZWZpbmUgRTEwMDBfU1dGV19FRVBfU00gICAweDEKICNkZWZpbmUgRTEwMDBfU1dGV19QSFkwX1NNICAweDIKICNkZWZpbmUgRTEwMDBfU1dGV19QSFkxX1NNICAweDQKKyNkZWZpbmUgRTEwMDBfU1dGV19DU1JfU00gICAweDgKIAogLyogRGV2aWNlIENvbnRyb2wgKi8KICNkZWZpbmUgRTEwMDBfQ1RSTF9GRCAgICAgICAweDAwMDAwMDAxICAvKiBGdWxsIGR1cGxleC4wPWhhbGY7IDE9ZnVsbCAqLwpAQCAtNTI3LDggKzUyOCwxMCBAQAogI2RlZmluZSBQSFlfSUQyICAgICAgICAgIDB4MDMgLyogUGh5IElkIFJlZyAod29yZCAyKSAqLwogI2RlZmluZSBQSFlfQVVUT05FR19BRFYgIDB4MDQgLyogQXV0b25lZyBBZHZlcnRpc2VtZW50ICovCiAjZGVmaW5lIFBIWV9MUF9BQklMSVRZICAgMHgwNSAvKiBMaW5rIFBhcnRuZXIgQWJpbGl0eSAoQmFzZSBQYWdlKSAqLworI2RlZmluZSBQSFlfQVVUT05FR19FWFAgIDB4MDYgLyogQXV0b25lZyBFeHBhbnNpb24gUmVnICovCiAjZGVmaW5lIFBIWV8xMDAwVF9DVFJMICAgMHgwOSAvKiAxMDAwQmFzZS1UIENvbnRyb2wgUmVnICovCiAjZGVmaW5lIFBIWV8xMDAwVF9TVEFUVVMgMHgwQSAvKiAxMDAwQmFzZS1UIFN0YXR1cyBSZWcgKi8KKyNkZWZpbmUgUEhZX0VYVF9TVEFUVVMgICAweDBGIC8qIEV4dGVuZGVkIFN0YXR1cyBSZWcgKi8KIAogLyogTlZNIENvbnRyb2wgKi8KICNkZWZpbmUgRTEwMDBfRUVDRF9TSyAgICAgICAgMHgwMDAwMDAwMSAvKiBOVk0gQ2xvY2sgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwZS9lMTAwMC5oIGIvZHJpdmVycy9uZXQvZTEwMDBlL2UxMDAwLmgKaW5kZXggNWE4OWRmZi4uMzhiZmQwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDBlL2UxMDAwLmgKKysrIGIvZHJpdmVycy9uZXQvZTEwMDBlL2UxMDAwLmgKQEAgLTY0LDExICs2NCwxNCBAQAogLyogVHgvUnggZGVzY3JpcHRvciBkZWZpbmVzICovCiAjZGVmaW5lIEUxMDAwX0RFRkFVTFRfVFhECQkyNTYKICNkZWZpbmUgRTEwMDBfTUFYX1RYRAkJCTQwOTYKLSNkZWZpbmUgRTEwMDBfTUlOX1RYRAkJCTgwCisjZGVmaW5lIEUxMDAwX01JTl9UWEQJCQk2NAogCiAjZGVmaW5lIEUxMDAwX0RFRkFVTFRfUlhECQkyNTYKICNkZWZpbmUgRTEwMDBfTUFYX1JYRAkJCTQwOTYKLSNkZWZpbmUgRTEwMDBfTUlOX1JYRAkJCTgwCisjZGVmaW5lIEUxMDAwX01JTl9SWEQJCQk2NAorCisjZGVmaW5lIEUxMDAwX01JTl9JVFJfVVNFQ1MJCTEwIC8qIDEwMDAwMCBpcnEvc2VjICovCisjZGVmaW5lIEUxMDAwX01BWF9JVFJfVVNFQ1MJCTEwMDAwIC8qIDEwMCAgICBpcnEvc2VjICovCiAKIC8qIEVhcmx5IFJlY2VpdmUgZGVmaW5lcyAqLwogI2RlZmluZSBFMTAwMF9FUlRfMjA0OAkJCTB4MTAwCkBAIC0xNDcsNiArMTUwLDE4IEBACiAJc3RydWN0IGUxMDAwX3F1ZXVlX3N0YXRzIHN0YXRzOwogfTsKIAorLyogUEhZIHJlZ2lzdGVyIHNuYXBzaG90IHZhbHVlcyAqLworc3RydWN0IGUxMDAwX3BoeV9yZWdzIHsKKwl1MTYgYm1jcjsJCS8qIGJhc2ljIG1vZGUgY29udHJvbCByZWdpc3RlciAgICAqLworCXUxNiBibXNyOwkJLyogYmFzaWMgbW9kZSBzdGF0dXMgcmVnaXN0ZXIgICAgICovCisJdTE2IGFkdmVydGlzZTsJCS8qIGF1dG8tbmVnb3RpYXRpb24gYWR2ZXJ0aXNlbWVudCAqLworCXUxNiBscGE7CQkvKiBsaW5rIHBhcnRuZXIgYWJpbGl0eSByZWdpc3RlciAgKi8KKwl1MTYgZXhwYW5zaW9uOwkJLyogYXV0by1uZWdvdGlhdGlvbiBleHBhbnNpb24gcmVnICovCisJdTE2IGN0cmwxMDAwOwkJLyogMTAwMEJBU0UtVCBjb250cm9sIHJlZ2lzdGVyICAgICovCisJdTE2IHN0YXQxMDAwOwkJLyogMTAwMEJBU0UtVCBzdGF0dXMgcmVnaXN0ZXIgICAgICovCisJdTE2IGVzdGF0dXM7CQkvKiBleHRlbmRlZCBzdGF0dXMgcmVnaXN0ZXIgICAgICAgKi8KK307CisKIC8qIGJvYXJkIHNwZWNpZmljIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgKi8KIHN0cnVjdCBlMTAwMF9hZGFwdGVyIHsKIAlzdHJ1Y3QgdGltZXJfbGlzdCB3YXRjaGRvZ190aW1lcjsKQEAgLTIwMiw4ICsyMTcsOCBAQAogCS8qIFR4IHN0YXRzICovCiAJdTY0IHRwdF9vbGQ7CiAJdTY0IGNvbGNfb2xkOwotCXU2NCBnb3RjbF9vbGQ7Ci0JdTMyIGdvdGNsOworCXUzMiBnb3RjOworCXU2NCBnb3RjX29sZDsKIAl1MzIgdHhfdGltZW91dF9jb3VudDsKIAl1MzIgdHhfZmlmb19oZWFkOwogCXUzMiB0eF9oZWFkX2FkZHI7CkBAIC0yMjcsOCArMjQyLDggQEAKIAl1NjQgaHdfY3N1bV9lcnI7CiAJdTY0IGh3X2NzdW1fZ29vZDsKIAl1NjQgcnhfaGRyX3NwbGl0OwotCXU2NCBnb3JjbF9vbGQ7Ci0JdTMyIGdvcmNsOworCXUzMiBnb3JjOworCXU2NCBnb3JjX29sZDsKIAl1MzIgYWxsb2NfcnhfYnVmZl9mYWlsZWQ7CiAJdTMyIHJ4X2RtYV9mYWlsZWQ7CiAKQEAgLTI1MCw2ICsyNjUsOSBAQAogCXN0cnVjdCBlMTAwMF9waHlfaW5mbyBwaHlfaW5mbzsKIAlzdHJ1Y3QgZTEwMDBfcGh5X3N0YXRzIHBoeV9zdGF0czsKIAorCS8qIFNuYXBzaG90IG9mIFBIWSByZWdpc3RlcnMgKi8KKwlzdHJ1Y3QgZTEwMDBfcGh5X3JlZ3MgcGh5X3JlZ3M7CisKIAlzdHJ1Y3QgZTEwMDBfcmluZyB0ZXN0X3R4X3Jpbmc7CiAJc3RydWN0IGUxMDAwX3JpbmcgdGVzdF9yeF9yaW5nOwogCXUzMiB0ZXN0X2ljcjsKQEAgLTI4Niw4ICszMDQsNiBAQAogI2RlZmluZSBGTEFHX0hBU19DVFJMRVhUX09OX0xPQUQgICAgICAgICAgKDEgPDwgNSkKICNkZWZpbmUgRkxBR19IQVNfU1dTTV9PTl9MT0FEICAgICAgICAgICAgICgxIDw8IDYpCiAjZGVmaW5lIEZMQUdfSEFTX0pVTUJPX0ZSQU1FUyAgICAgICAgICAgICAoMSA8PCA3KQotI2RlZmluZSBGTEFHX0hBU19TVEFUU19JQ1JfSUNUICAgICAgICAgICAgKDEgPDwgOSkKLSNkZWZpbmUgRkxBR19IQVNfU1RBVFNfUFRDX1BSQyAgICAgICAgICAgICgxIDw8IDEwKQogI2RlZmluZSBGTEFHX0hBU19TTUFSVF9QT1dFUl9ET1dOICAgICAgICAgKDEgPDwgMTEpCiAjZGVmaW5lIEZMQUdfSVNfUVVBRF9QT1JUX0EgICAgICAgICAgICAgICAoMSA8PCAxMikKICNkZWZpbmUgRkxBR19JU19RVUFEX1BPUlQgICAgICAgICAgICAgICAgICgxIDw8IDEzKQpAQCAtNDMzLDYgKzQ0OSw4IEBACiBleHRlcm4gczMyIGUxMDAwZV9waHlfaGFzX2xpbmtfZ2VuZXJpYyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgaXRlcmF0aW9ucywKIAkJCSAgICAgICB1MzIgdXNlY19pbnRlcnZhbCwgYm9vbCAqc3VjY2Vzcyk7CiBleHRlcm4gczMyIGUxMDAwZV9waHlfcmVzZXRfZHNwKHN0cnVjdCBlMTAwMF9odyAqaHcpOworZXh0ZXJuIHMzMiBlMTAwMGVfcmVhZF9waHlfcmVnX21kaWMoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTE2ICpkYXRhKTsKK2V4dGVybiBzMzIgZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LCB1MTYgZGF0YSk7CiBleHRlcm4gczMyIGUxMDAwZV9jaGVja19kb3duc2hpZnQoc3RydWN0IGUxMDAwX2h3ICpodyk7CiAKIHN0YXRpYyBpbmxpbmUgczMyIGUxMDAwX3BoeV9od19yZXNldChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDBlL2VzMmxhbi5jIGIvZHJpdmVycy9uZXQvZTEwMDBlL2VzMmxhbi5jCmluZGV4IGQ1OWE5OWEuLmRjNTUyZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwZS9lczJsYW4uYworKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvZXMybGFuLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNkZWZpbmUgRTEwMDBfS01STkNUUkxTVEFfT0ZGU0VUX0ZJRk9fQ1RSTAkgMHgwMAogI2RlZmluZSBFMTAwMF9LTVJOQ1RSTFNUQV9PRkZTRVRfSU5CX0NUUkwJIDB4MDIKICNkZWZpbmUgRTEwMDBfS01STkNUUkxTVEFfT0ZGU0VUX0hEX0NUUkwJIDB4MTAKKyNkZWZpbmUgRTEwMDBfS01STkNUUkxTVEFfT0ZGU0VUX01BQzJQSFlfT1BNT0RFCSAweDFGCiAKICNkZWZpbmUgRTEwMDBfS01STkNUUkxTVEFfRklGT19DVFJMX1JYX0JZUEFTUwkgMHgwMDA4CiAjZGVmaW5lIEUxMDAwX0tNUk5DVFJMU1RBX0ZJRk9fQ1RSTF9UWF9CWVBBU1MJIDB4MDgwMApAQCAtNDgsNiArNDksNyBAQAogCiAjZGVmaW5lIEUxMDAwX0tNUk5DVFJMU1RBX0hEX0NUUkxfMTBfMTAwX0RFRkFVTFQgMHgwMDA0CiAjZGVmaW5lIEUxMDAwX0tNUk5DVFJMU1RBX0hEX0NUUkxfMTAwMF9ERUZBVUxUCSAweDAwMDAKKyNkZWZpbmUgRTEwMDBfS01STkNUUkxTVEFfT1BNT0RFX0VfSURMRQkJIDB4MjAwMAogCiAjZGVmaW5lIEUxMDAwX1RDVExfRVhUX0dDRVhfTUFTSyAweDAwMEZGQzAwIC8qIEdpZ2FiaXQgQ2FycnkgRXh0ZW5kIFBhZGRpbmcgKi8KICNkZWZpbmUgREVGQVVMVF9UQ1RMX0VYVF9HQ0VYXzgwMDAzRVMyTEFOCSAweDAwMDEwMDAwCkBAIC04NSw2ICs4Nyw5IEBACiAvKiBLdW1lcmFuIE1vZGUgQ29udHJvbCBSZWdpc3RlciAoUGFnZSAxOTMsIFJlZ2lzdGVyIDE2KSAqLwogI2RlZmluZSBHRzgyNTYzX0tNQ1JfUEFTU19GQUxTRV9DQVJSSUVSCQkgMHgwODAwCiAKKy8qIE1heCBudW1iZXIgb2YgdGltZXMgS3VtZXJhbiByZWFkL3dyaXRlIHNob3VsZCBiZSB2YWxpZGF0ZWQgKi8KKyNkZWZpbmUgR0c4MjU2M19NQVhfS01STl9SRVRSWSAgMHg1CisKIC8qIFBvd2VyIE1hbmFnZW1lbnQgQ29udHJvbCBSZWdpc3RlciAoUGFnZSAxOTMsIFJlZ2lzdGVyIDIwKSAqLwogI2RlZmluZSBHRzgyNTYzX1BNQ1JfRU5BQkxFX0VMRUNUUklDQUxfSURMRQkgMHgwMDAxCiAJCQkJCSAgIC8qIDE9RW5hYmxlIFNFUkRFUyBFbGVjdHJpY2FsIElkbGUgKi8KQEAgLTI3MCw2ICsyNzUsNyBAQAogCXUxNiBtYXNrOwogCiAJbWFzayA9IGh3LT5idXMuZnVuYyA/IEUxMDAwX1NXRldfUEhZMV9TTSA6IEUxMDAwX1NXRldfUEhZMF9TTTsKKwltYXNrIHw9IEUxMDAwX1NXRldfQ1NSX1NNOwogCiAJcmV0dXJuIGUxMDAwX2FjcXVpcmVfc3dmd19zeW5jXzgwMDAzZXMybGFuKGh3LCBtYXNrKTsKIH0KQEAgLTI4Niw2ICsyOTIsOCBAQAogCXUxNiBtYXNrOwogCiAJbWFzayA9IGh3LT5idXMuZnVuYyA/IEUxMDAwX1NXRldfUEhZMV9TTSA6IEUxMDAwX1NXRldfUEhZMF9TTTsKKwltYXNrIHw9IEUxMDAwX1NXRldfQ1NSX1NNOworCiAJZTEwMDBfcmVsZWFzZV9zd2Z3X3N5bmNfODAwMDNlczJsYW4oaHcsIG1hc2spOwogfQogCkBAIC00MTAsMjAgKzQxOCwyNyBAQAogCXUzMiBwYWdlX3NlbGVjdDsKIAl1MTYgdGVtcDsKIAorCXJldF92YWwgPSBlMTAwMF9hY3F1aXJlX3BoeV84MDAwM2VzMmxhbihodyk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOworCiAJLyogU2VsZWN0IENvbmZpZ3VyYXRpb24gUGFnZSAqLwotCWlmICgob2Zmc2V0ICYgTUFYX1BIWV9SRUdfQUREUkVTUykgPCBHRzgyNTYzX01JTl9BTFRfUkVHKQorCWlmICgob2Zmc2V0ICYgTUFYX1BIWV9SRUdfQUREUkVTUykgPCBHRzgyNTYzX01JTl9BTFRfUkVHKSB7CiAJCXBhZ2Vfc2VsZWN0ID0gR0c4MjU2M19QSFlfUEFHRV9TRUxFQ1Q7Ci0JZWxzZQorCX0gZWxzZSB7CiAJCS8qCiAJCSAqIFVzZSBBbHRlcm5hdGl2ZSBQYWdlIFNlbGVjdCByZWdpc3RlciB0byBhY2Nlc3MKIAkJICogcmVnaXN0ZXJzIDMwIGFuZCAzMQogCQkgKi8KIAkJcGFnZV9zZWxlY3QgPSBHRzgyNTYzX1BIWV9QQUdFX1NFTEVDVF9BTFQ7CisJfQogCiAJdGVtcCA9ICh1MTYpKCh1MTYpb2Zmc2V0ID4+IEdHODI1NjNfUEFHRV9TSElGVCk7Ci0JcmV0X3ZhbCA9IGUxMDAwZV93cml0ZV9waHlfcmVnX204OChodywgcGFnZV9zZWxlY3QsIHRlbXApOwotCWlmIChyZXRfdmFsKQorCXJldF92YWwgPSBlMTAwMGVfd3JpdGVfcGh5X3JlZ19tZGljKGh3LCBwYWdlX3NlbGVjdCwgdGVtcCk7CisJaWYgKHJldF92YWwpIHsKKwkJZTEwMDBfcmVsZWFzZV9waHlfODAwMDNlczJsYW4oaHcpOwogCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CiAKIAkvKgogCSAqIFRoZSAicmVhZHkiIGJpdCBpbiB0aGUgTURJQyByZWdpc3RlciBtYXkgYmUgaW5jb3JyZWN0bHkgc2V0CkBAIC00MzMsMjAgKzQ0OCwyMSBAQAogCXVkZWxheSgyMDApOwogCiAJLyogLi4uYW5kIHZlcmlmeSB0aGUgY29tbWFuZCB3YXMgc3VjY2Vzc2Z1bC4gKi8KLQlyZXRfdmFsID0gZTEwMDBlX3JlYWRfcGh5X3JlZ19tODgoaHcsIHBhZ2Vfc2VsZWN0LCAmdGVtcCk7CisJcmV0X3ZhbCA9IGUxMDAwZV9yZWFkX3BoeV9yZWdfbWRpYyhodywgcGFnZV9zZWxlY3QsICZ0ZW1wKTsKIAogCWlmICgoKHUxNilvZmZzZXQgPj4gR0c4MjU2M19QQUdFX1NISUZUKSAhPSB0ZW1wKSB7CiAJCXJldF92YWwgPSAtRTEwMDBfRVJSX1BIWTsKKwkJZTEwMDBfcmVsZWFzZV9waHlfODAwMDNlczJsYW4oaHcpOwogCQlyZXR1cm4gcmV0X3ZhbDsKIAl9CiAKIAl1ZGVsYXkoMjAwKTsKIAotCXJldF92YWwgPSBlMTAwMGVfcmVhZF9waHlfcmVnX204OChodywKLQkJCQkJIE1BWF9QSFlfUkVHX0FERFJFU1MgJiBvZmZzZXQsCi0JCQkJCSBkYXRhKTsKKwlyZXRfdmFsID0gZTEwMDBlX3JlYWRfcGh5X3JlZ19tZGljKGh3LCBNQVhfUEhZX1JFR19BRERSRVNTICYgb2Zmc2V0LAorCQkJCQkgICBkYXRhKTsKIAogCXVkZWxheSgyMDApOworCWUxMDAwX3JlbGVhc2VfcGh5XzgwMDAzZXMybGFuKGh3KTsKIAogCXJldHVybiByZXRfdmFsOwogfQpAQCAtNDY3LDIwICs0ODMsMjcgQEAKIAl1MzIgcGFnZV9zZWxlY3Q7CiAJdTE2IHRlbXA7CiAKKwlyZXRfdmFsID0gZTEwMDBfYWNxdWlyZV9waHlfODAwMDNlczJsYW4oaHcpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKwogCS8qIFNlbGVjdCBDb25maWd1cmF0aW9uIFBhZ2UgKi8KLQlpZiAoKG9mZnNldCAmIE1BWF9QSFlfUkVHX0FERFJFU1MpIDwgR0c4MjU2M19NSU5fQUxUX1JFRykKKwlpZiAoKG9mZnNldCAmIE1BWF9QSFlfUkVHX0FERFJFU1MpIDwgR0c4MjU2M19NSU5fQUxUX1JFRykgewogCQlwYWdlX3NlbGVjdCA9IEdHODI1NjNfUEhZX1BBR0VfU0VMRUNUOwotCWVsc2UKKwl9IGVsc2UgewogCQkvKgogCQkgKiBVc2UgQWx0ZXJuYXRpdmUgUGFnZSBTZWxlY3QgcmVnaXN0ZXIgdG8gYWNjZXNzCiAJCSAqIHJlZ2lzdGVycyAzMCBhbmQgMzEKIAkJICovCiAJCXBhZ2Vfc2VsZWN0ID0gR0c4MjU2M19QSFlfUEFHRV9TRUxFQ1RfQUxUOworCX0KIAogCXRlbXAgPSAodTE2KSgodTE2KW9mZnNldCA+PiBHRzgyNTYzX1BBR0VfU0hJRlQpOwotCXJldF92YWwgPSBlMTAwMGVfd3JpdGVfcGh5X3JlZ19tODgoaHcsIHBhZ2Vfc2VsZWN0LCB0ZW1wKTsKLQlpZiAocmV0X3ZhbCkKKwlyZXRfdmFsID0gZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhodywgcGFnZV9zZWxlY3QsIHRlbXApOworCWlmIChyZXRfdmFsKSB7CisJCWUxMDAwX3JlbGVhc2VfcGh5XzgwMDAzZXMybGFuKGh3KTsKIAkJcmV0dXJuIHJldF92YWw7CisJfQogCiAKIAkvKgpAQCAtNDkxLDE4ICs1MTQsMjAgQEAKIAl1ZGVsYXkoMjAwKTsKIAogCS8qIC4uLmFuZCB2ZXJpZnkgdGhlIGNvbW1hbmQgd2FzIHN1Y2Nlc3NmdWwuICovCi0JcmV0X3ZhbCA9IGUxMDAwZV9yZWFkX3BoeV9yZWdfbTg4KGh3LCBwYWdlX3NlbGVjdCwgJnRlbXApOworCXJldF92YWwgPSBlMTAwMGVfcmVhZF9waHlfcmVnX21kaWMoaHcsIHBhZ2Vfc2VsZWN0LCAmdGVtcCk7CiAKLQlpZiAoKCh1MTYpb2Zmc2V0ID4+IEdHODI1NjNfUEFHRV9TSElGVCkgIT0gdGVtcCkKKwlpZiAoKCh1MTYpb2Zmc2V0ID4+IEdHODI1NjNfUEFHRV9TSElGVCkgIT0gdGVtcCkgeworCQllMTAwMF9yZWxlYXNlX3BoeV84MDAwM2VzMmxhbihodyk7CiAJCXJldHVybiAtRTEwMDBfRVJSX1BIWTsKKwl9CiAKIAl1ZGVsYXkoMjAwKTsKIAotCXJldF92YWwgPSBlMTAwMGVfd3JpdGVfcGh5X3JlZ19tODgoaHcsCi0JCQkJCSAgTUFYX1BIWV9SRUdfQUREUkVTUyAmIG9mZnNldCwKLQkJCQkJICBkYXRhKTsKKwlyZXRfdmFsID0gZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhodywgTUFYX1BIWV9SRUdfQUREUkVTUyAmIG9mZnNldCwKKwkJCQkJICAgIGRhdGEpOwogCiAJdWRlbGF5KDIwMCk7CisJZTEwMDBfcmVsZWFzZV9waHlfODAwMDNlczJsYW4oaHcpOwogCiAJcmV0dXJuIHJldF92YWw7CiB9CkBAIC04ODIsMTAgKzkwNywxMCBAQAogCXN0cnVjdCBlMTAwMF9waHlfaW5mbyAqcGh5ID0gJmh3LT5waHk7CiAJczMyIHJldF92YWw7CiAJdTMyIGN0cmxfZXh0OwotCXUxNiBkYXRhOworCXUzMiBpID0gMDsKKwl1MTYgZGF0YSwgZGF0YTI7CiAKLQlyZXRfdmFsID0gZTFlX3JwaHkoaHcsIEdHODI1NjNfUEhZX01BQ19TUEVDX0NUUkwsCi0JCQkJICAgICAmZGF0YSk7CisJcmV0X3ZhbCA9IGUxZV9ycGh5KGh3LCBHRzgyNTYzX1BIWV9NQUNfU1BFQ19DVFJMLCAmZGF0YSk7CiAJaWYgKHJldF92YWwpCiAJCXJldHVybiByZXRfdmFsOwogCkBAIC04OTMsOCArOTE4LDcgQEAKIAkvKiBVc2UgMjVNSHogZm9yIGJvdGggbGluayBkb3duIGFuZCAxMDAwQmFzZS1UIGZvciBUeCBjbG9jay4gKi8KIAlkYXRhIHw9IEdHODI1NjNfTVNDUl9UWF9DTEtfMTAwME1CUFNfMjU7CiAKLQlyZXRfdmFsID0gZTFlX3dwaHkoaHcsIEdHODI1NjNfUEhZX01BQ19TUEVDX0NUUkwsCi0JCQkJICAgICAgZGF0YSk7CisJcmV0X3ZhbCA9IGUxZV93cGh5KGh3LCBHRzgyNTYzX1BIWV9NQUNfU1BFQ19DVFJMLCBkYXRhKTsKIAlpZiAocmV0X3ZhbCkKIAkJcmV0dXJuIHJldF92YWw7CiAKQEAgLTk1NCw2ICs5NzgsMTggQEAKIAlpZiAocmV0X3ZhbCkKIAkJcmV0dXJuIHJldF92YWw7CiAKKwlyZXRfdmFsID0gZTEwMDBlX3JlYWRfa21ybl9yZWcoaHcsCisJCQkJICAgICAgIEUxMDAwX0tNUk5DVFJMU1RBX09GRlNFVF9NQUMyUEhZX09QTU9ERSwKKwkJCQkgICAgICAgJmRhdGEpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKwlkYXRhIHw9IEUxMDAwX0tNUk5DVFJMU1RBX09QTU9ERV9FX0lETEU7CisJcmV0X3ZhbCA9IGUxMDAwZV93cml0ZV9rbXJuX3JlZyhodywKKwkJCQkJRTEwMDBfS01STkNUUkxTVEFfT0ZGU0VUX01BQzJQSFlfT1BNT0RFLAorCQkJCQlkYXRhKTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CisKIAlyZXRfdmFsID0gZTFlX3JwaHkoaHcsIEdHODI1NjNfUEhZX1NQRUNfQ1RSTF8yLCAmZGF0YSk7CiAJaWYgKHJldF92YWwpCiAJCXJldHVybiByZXRfdmFsOwpAQCAtOTgzLDkgKzEwMTksMTggQEAKIAkJaWYgKHJldF92YWwpCiAJCQlyZXR1cm4gcmV0X3ZhbDsKIAotCQlyZXRfdmFsID0gZTFlX3JwaHkoaHcsIEdHODI1NjNfUEhZX0tNUk5fTU9ERV9DVFJMLCAmZGF0YSk7Ci0JCWlmIChyZXRfdmFsKQotCQkJcmV0dXJuIHJldF92YWw7CisJCWRvIHsKKwkJCXJldF92YWwgPSBlMWVfcnBoeShodywgR0c4MjU2M19QSFlfS01STl9NT0RFX0NUUkwsCisJCQkJCSAgICZkYXRhKTsKKwkJCWlmIChyZXRfdmFsKQorCQkJCXJldHVybiByZXRfdmFsOworCisJCQlyZXRfdmFsID0gZTFlX3JwaHkoaHcsIEdHODI1NjNfUEhZX0tNUk5fTU9ERV9DVFJMLAorCQkJCQkgICAmZGF0YTIpOworCQkJaWYgKHJldF92YWwpCisJCQkJcmV0dXJuIHJldF92YWw7CisJCQlpKys7CisJCX0gd2hpbGUgKChkYXRhICE9IGRhdGEyKSAmJiAoaSA8IEdHODI1NjNfTUFYX0tNUk5fUkVUUlkpKTsKIAogCQlkYXRhICY9IH5HRzgyNTYzX0tNQ1JfUEFTU19GQUxTRV9DQVJSSUVSOwogCQlyZXRfdmFsID0gZTFlX3dwaHkoaHcsIEdHODI1NjNfUEhZX0tNUk5fTU9ERV9DVFJMLCBkYXRhKTsKQEAgLTEwNzQsNyArMTExOSw4IEBACiB7CiAJczMyIHJldF92YWw7CiAJdTMyIHRpcGc7Ci0JdTE2IHJlZ19kYXRhOworCXUzMiBpID0gMDsKKwl1MTYgcmVnX2RhdGEsIHJlZ19kYXRhMjsKIAogCXJlZ19kYXRhID0gRTEwMDBfS01STkNUUkxTVEFfSERfQ1RSTF8xMF8xMDBfREVGQVVMVDsKIAlyZXRfdmFsID0gZTEwMDBlX3dyaXRlX2ttcm5fcmVnKGh3LCBFMTAwMF9LTVJOQ1RSTFNUQV9PRkZTRVRfSERfQ1RSTCwKQEAgLTEwODgsOSArMTEzNCwxNiBAQAogCXRpcGcgfD0gREVGQVVMVF9USVBHX0lQR1RfMTBfMTAwXzgwMDAzRVMyTEFOOwogCWV3MzIoVElQRywgdGlwZyk7CiAKLQlyZXRfdmFsID0gZTFlX3JwaHkoaHcsIEdHODI1NjNfUEhZX0tNUk5fTU9ERV9DVFJMLCAmcmVnX2RhdGEpOwotCWlmIChyZXRfdmFsKQotCQlyZXR1cm4gcmV0X3ZhbDsKKwlkbyB7CisJCXJldF92YWwgPSBlMWVfcnBoeShodywgR0c4MjU2M19QSFlfS01STl9NT0RFX0NUUkwsICZyZWdfZGF0YSk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CisKKwkJcmV0X3ZhbCA9IGUxZV9ycGh5KGh3LCBHRzgyNTYzX1BIWV9LTVJOX01PREVfQ1RSTCwgJnJlZ19kYXRhMik7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CisJCWkrKzsKKwl9IHdoaWxlICgocmVnX2RhdGEgIT0gcmVnX2RhdGEyKSAmJiAoaSA8IEdHODI1NjNfTUFYX0tNUk5fUkVUUlkpKTsKIAogCWlmIChkdXBsZXggPT0gSEFMRl9EVVBMRVgpCiAJCXJlZ19kYXRhIHw9IEdHODI1NjNfS01DUl9QQVNTX0ZBTFNFX0NBUlJJRVI7CkBAIC0xMTEyLDggKzExNjUsOSBAQAogc3RhdGljIHMzMiBlMTAwMF9jZmdfa21ybl8xMDAwXzgwMDAzZXMybGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7CiAJczMyIHJldF92YWw7Ci0JdTE2IHJlZ19kYXRhOworCXUxNiByZWdfZGF0YSwgcmVnX2RhdGEyOwogCXUzMiB0aXBnOworCXUzMiBpID0gMDsKIAogCXJlZ19kYXRhID0gRTEwMDBfS01STkNUUkxTVEFfSERfQ1RSTF8xMDAwX0RFRkFVTFQ7CiAJcmV0X3ZhbCA9IGUxMDAwZV93cml0ZV9rbXJuX3JlZyhodywgRTEwMDBfS01STkNUUkxTVEFfT0ZGU0VUX0hEX0NUUkwsCkBAIC0xMTI3LDkgKzExODEsMTYgQEAKIAl0aXBnIHw9IERFRkFVTFRfVElQR19JUEdUXzEwMDBfODAwMDNFUzJMQU47CiAJZXczMihUSVBHLCB0aXBnKTsKIAotCXJldF92YWwgPSBlMWVfcnBoeShodywgR0c4MjU2M19QSFlfS01STl9NT0RFX0NUUkwsICZyZWdfZGF0YSk7Ci0JaWYgKHJldF92YWwpCi0JCXJldHVybiByZXRfdmFsOworCWRvIHsKKwkJcmV0X3ZhbCA9IGUxZV9ycGh5KGh3LCBHRzgyNTYzX1BIWV9LTVJOX01PREVfQ1RSTCwgJnJlZ19kYXRhKTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKworCQlyZXRfdmFsID0gZTFlX3JwaHkoaHcsIEdHODI1NjNfUEhZX0tNUk5fTU9ERV9DVFJMLCAmcmVnX2RhdGEyKTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJaSsrOworCX0gd2hpbGUgKChyZWdfZGF0YSAhPSByZWdfZGF0YTIpICYmIChpIDwgR0c4MjU2M19NQVhfS01STl9SRVRSWSkpOwogCiAJcmVnX2RhdGEgJj0gfkdHODI1NjNfS01DUl9QQVNTX0ZBTFNFX0NBUlJJRVI7CiAJcmV0X3ZhbCA9IGUxZV93cGh5KGh3LCBHRzgyNTYzX1BIWV9LTVJOX01PREVfQ1RSTCwgcmVnX2RhdGEpOwpAQCAtMTIzMSwxMiArMTI5MiwxMCBAQAogCS5tYWMJCQk9IGUxMDAwXzgwMDAzZXMybGFuLAogCS5mbGFncwkJCT0gRkxBR19IQVNfSFdfVkxBTl9GSUxURVIKIAkJCQkgIHwgRkxBR19IQVNfSlVNQk9fRlJBTUVTCi0JCQkJICB8IEZMQUdfSEFTX1NUQVRTX1BUQ19QUkMKIAkJCQkgIHwgRkxBR19IQVNfV09MCiAJCQkJICB8IEZMQUdfQVBNRV9JTl9DVFJMMwogCQkJCSAgfCBGTEFHX1JYX0NTVU1fRU5BQkxFRAogCQkJCSAgfCBGTEFHX0hBU19DVFJMRVhUX09OX0xPQUQKLQkJCQkgIHwgRkxBR19IQVNfU1RBVFNfSUNSX0lDVAogCQkJCSAgfCBGTEFHX1JYX05FRURTX1JFU1RBUlQgLyogZXJyYXRhICovCiAJCQkJICB8IEZMQUdfVEFSQ19TRVRfQklUX1pFUk8gLyogZXJyYXRhICovCiAJCQkJICB8IEZMQUdfQVBNRV9DSEVDS19QT1JUX0IKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwZS9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9lMTAwMGUvZXRodG9vbC5jCmluZGV4IDZkMWIyNTcuLmNlMDQ1YWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwZS9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDBlL2V0aHRvb2wuYwpAQCAtNDYsOCArNDYsOCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBlMTAwMF9zdGF0cyBlMTAwMF9nc3RyaW5nc19zdGF0c1tdID0gewogCXsgInJ4X3BhY2tldHMiLCBFMTAwMF9TVEFUKHN0YXRzLmdwcmMpIH0sCiAJeyAidHhfcGFja2V0cyIsIEUxMDAwX1NUQVQoc3RhdHMuZ3B0YykgfSwKLQl7ICJyeF9ieXRlcyIsIEUxMDAwX1NUQVQoc3RhdHMuZ29yY2wpIH0sCi0JeyAidHhfYnl0ZXMiLCBFMTAwMF9TVEFUKHN0YXRzLmdvdGNsKSB9LAorCXsgInJ4X2J5dGVzIiwgRTEwMDBfU1RBVChzdGF0cy5nb3JjKSB9LAorCXsgInR4X2J5dGVzIiwgRTEwMDBfU1RBVChzdGF0cy5nb3RjKSB9LAogCXsgInJ4X2Jyb2FkY2FzdCIsIEUxMDAwX1NUQVQoc3RhdHMuYnByYykgfSwKIAl7ICJ0eF9icm9hZGNhc3QiLCBFMTAwMF9TVEFUKHN0YXRzLmJwdGMpIH0sCiAJeyAicnhfbXVsdGljYXN0IiwgRTEwMDBfU1RBVChzdGF0cy5tcHJjKSB9LApAQCAtODMsNyArODMsNyBAQAogCXsgInJ4X2Zsb3dfY29udHJvbF94b2ZmIiwgRTEwMDBfU1RBVChzdGF0cy54b2ZmcnhjKSB9LAogCXsgInR4X2Zsb3dfY29udHJvbF94b24iLCBFMTAwMF9TVEFUKHN0YXRzLnhvbnR4YykgfSwKIAl7ICJ0eF9mbG93X2NvbnRyb2xfeG9mZiIsIEUxMDAwX1NUQVQoc3RhdHMueG9mZnR4YykgfSwKLQl7ICJyeF9sb25nX2J5dGVfY291bnQiLCBFMTAwMF9TVEFUKHN0YXRzLmdvcmNsKSB9LAorCXsgInJ4X2xvbmdfYnl0ZV9jb3VudCIsIEUxMDAwX1NUQVQoc3RhdHMuZ29yYykgfSwKIAl7ICJyeF9jc3VtX29mZmxvYWRfZ29vZCIsIEUxMDAwX1NUQVQoaHdfY3N1bV9nb29kKSB9LAogCXsgInJ4X2NzdW1fb2ZmbG9hZF9lcnJvcnMiLCBFMTAwMF9TVEFUKGh3X2NzdW1fZXJyKSB9LAogCXsgInJ4X2hlYWRlcl9zcGxpdCIsIEUxMDAwX1NUQVQocnhfaGRyX3NwbGl0KSB9LApAQCAtMTc3MCw2ICsxNzcwLDQ3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZTEwMDBfZ2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqZWMpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKGFkYXB0ZXItPml0cl9zZXR0aW5nIDw9IDMpCisJCWVjLT5yeF9jb2FsZXNjZV91c2VjcyA9IGFkYXB0ZXItPml0cl9zZXR0aW5nOworCWVsc2UKKwkJZWMtPnJ4X2NvYWxlc2NlX3VzZWNzID0gMTAwMDAwMCAvIGFkYXB0ZXItPml0cl9zZXR0aW5nOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZTEwMDBfc2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqZWMpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisKKwlpZiAoKGVjLT5yeF9jb2FsZXNjZV91c2VjcyA+IEUxMDAwX01BWF9JVFJfVVNFQ1MpIHx8CisJICAgICgoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzID4gMykgJiYKKwkgICAgIChlYy0+cnhfY29hbGVzY2VfdXNlY3MgPCBFMTAwMF9NSU5fSVRSX1VTRUNTKSkgfHwKKwkgICAgKGVjLT5yeF9jb2FsZXNjZV91c2VjcyA9PSAyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzIDw9IDMpIHsKKwkJYWRhcHRlci0+aXRyID0gMjAwMDA7CisJCWFkYXB0ZXItPml0cl9zZXR0aW5nID0gZWMtPnJ4X2NvYWxlc2NlX3VzZWNzOworCX0gZWxzZSB7CisJCWFkYXB0ZXItPml0ciA9ICgxMDAwMDAwIC8gZWMtPnJ4X2NvYWxlc2NlX3VzZWNzKTsKKwkJYWRhcHRlci0+aXRyX3NldHRpbmcgPSBhZGFwdGVyLT5pdHIgJiB+MzsKKwl9CisKKwlpZiAoYWRhcHRlci0+aXRyX3NldHRpbmcgIT0gMCkKKwkJZXczMihJVFIsIDEwMDAwMDAwMDAgLyAoYWRhcHRlci0+aXRyICogMjU2KSk7CisJZWxzZQorCQlldzMyKElUUiwgMCk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBlMTAwMF9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwpAQCAtMTg0NSw2ICsxODg2LDggQEAKIAkucGh5c19pZAkJPSBlMTAwMF9waHlzX2lkLAogCS5nZXRfZXRodG9vbF9zdGF0cwk9IGUxMDAwX2dldF9ldGh0b29sX3N0YXRzLAogCS5nZXRfc3NldF9jb3VudAkJPSBlMTAwMGVfZ2V0X3NzZXRfY291bnQsCisJLmdldF9jb2FsZXNjZQkJPSBlMTAwMF9nZXRfY29hbGVzY2UsCisJLnNldF9jb2FsZXNjZQkJPSBlMTAwMF9zZXRfY29hbGVzY2UsCiB9OwogCiB2b2lkIGUxMDAwZV9zZXRfZXRodG9vbF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwZS9ody5oIGIvZHJpdmVycy9uZXQvZTEwMDBlL2h3LmgKaW5kZXggNTNmMWFjNi4uYTkzMGU2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDBlL2h3LmgKKysrIGIvZHJpdmVycy9uZXQvZTEwMDBlL2h3LmgKQEAgLTU5MiwxMCArNTkyLDggQEAKIAl1NjQgYnByYzsKIAl1NjQgbXByYzsKIAl1NjQgZ3B0YzsKLQl1NjQgZ29yY2w7Ci0JdTY0IGdvcmNoOwotCXU2NCBnb3RjbDsKLQl1NjQgZ290Y2g7CisJdTY0IGdvcmM7CisJdTY0IGdvdGM7CiAJdTY0IHJuYmM7CiAJdTY0IHJ1YzsKIAl1NjQgcmZjOwpAQCAtNjA0LDEwICs2MDIsOCBAQAogCXU2NCBtZ3ByYzsKIAl1NjQgbWdwZGM7CiAJdTY0IG1ncHRjOwotCXU2NCB0b3JsOwotCXU2NCB0b3JoOwotCXU2NCB0b3RsOwotCXU2NCB0b3RoOworCXU2NCB0b3I7CisJdTY0IHRvdDsKIAl1NjQgdHByOwogCXU2NCB0cHQ7CiAJdTY0IHB0YzY0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDBlL25ldGRldi5jIGIvZHJpdmVycy9uZXQvZTEwMDBlL25ldGRldi5jCmluZGV4IGM4ZGM0N2YuLjg5OTFhYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwZS9uZXRkZXYuYworKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvbmV0ZGV2LmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogI2luY2x1ZGUgImUxMDAwLmgiCiAKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMi4wIgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4yLjEiCiBjaGFyIGUxMDAwZV9kcml2ZXJfbmFtZVtdID0gImUxMDAwZSI7CiBjb25zdCBjaGFyIGUxMDAwZV9kcml2ZXJfdmVyc2lvbltdID0gRFJWX1ZFUlNJT047CiAKQEAgLTQ2NiwxMCArNDY2LDEwIEBACiAJaWYgKGNsZWFuZWRfY291bnQpCiAJCWFkYXB0ZXItPmFsbG9jX3J4X2J1ZihhZGFwdGVyLCBjbGVhbmVkX2NvdW50KTsKIAotCWFkYXB0ZXItPnRvdGFsX3J4X3BhY2tldHMgKz0gdG90YWxfcnhfcGFja2V0czsKIAlhZGFwdGVyLT50b3RhbF9yeF9ieXRlcyArPSB0b3RhbF9yeF9ieXRlczsKLQlhZGFwdGVyLT5uZXRfc3RhdHMucnhfcGFja2V0cyArPSB0b3RhbF9yeF9wYWNrZXRzOworCWFkYXB0ZXItPnRvdGFsX3J4X3BhY2tldHMgKz0gdG90YWxfcnhfcGFja2V0czsKIAlhZGFwdGVyLT5uZXRfc3RhdHMucnhfYnl0ZXMgKz0gdG90YWxfcnhfYnl0ZXM7CisJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X3BhY2tldHMgKz0gdG90YWxfcnhfcGFja2V0czsKIAlyZXR1cm4gY2xlYW5lZDsKIH0KIApAQCAtNjA2LDggKzYwNiw4IEBACiAJfQogCWFkYXB0ZXItPnRvdGFsX3R4X2J5dGVzICs9IHRvdGFsX3R4X2J5dGVzOwogCWFkYXB0ZXItPnRvdGFsX3R4X3BhY2tldHMgKz0gdG90YWxfdHhfcGFja2V0czsKLQlhZGFwdGVyLT5uZXRfc3RhdHMudHhfcGFja2V0cyArPSB0b3RhbF90eF9wYWNrZXRzOwogCWFkYXB0ZXItPm5ldF9zdGF0cy50eF9ieXRlcyArPSB0b3RhbF90eF9ieXRlczsKKwlhZGFwdGVyLT5uZXRfc3RhdHMudHhfcGFja2V0cyArPSB0b3RhbF90eF9wYWNrZXRzOwogCXJldHVybiBjbGVhbmVkOwogfQogCkBAIC03NzUsMTAgKzc3NSwxMCBAQAogCWlmIChjbGVhbmVkX2NvdW50KQogCQlhZGFwdGVyLT5hbGxvY19yeF9idWYoYWRhcHRlciwgY2xlYW5lZF9jb3VudCk7CiAKLQlhZGFwdGVyLT50b3RhbF9yeF9wYWNrZXRzICs9IHRvdGFsX3J4X3BhY2tldHM7CiAJYWRhcHRlci0+dG90YWxfcnhfYnl0ZXMgKz0gdG90YWxfcnhfYnl0ZXM7Ci0JYWRhcHRlci0+bmV0X3N0YXRzLnJ4X3BhY2tldHMgKz0gdG90YWxfcnhfcGFja2V0czsKKwlhZGFwdGVyLT50b3RhbF9yeF9wYWNrZXRzICs9IHRvdGFsX3J4X3BhY2tldHM7CiAJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X2J5dGVzICs9IHRvdGFsX3J4X2J5dGVzOworCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9wYWNrZXRzICs9IHRvdGFsX3J4X3BhY2tldHM7CiAJcmV0dXJuIGNsZWFuZWQ7CiB9CiAKQEAgLTI1MDYsNTYgKzI1MDYsMjcgQEAKIAogCWFkYXB0ZXItPnN0YXRzLmNyY2VycnMgKz0gZXIzMihDUkNFUlJTKTsKIAlhZGFwdGVyLT5zdGF0cy5ncHJjICs9IGVyMzIoR1BSQyk7Ci0JYWRhcHRlci0+c3RhdHMuZ29yY2wgKz0gZXIzMihHT1JDTCk7Ci0JYWRhcHRlci0+c3RhdHMuZ29yY2ggKz0gZXIzMihHT1JDSCk7CisJYWRhcHRlci0+c3RhdHMuZ29yYyArPSBlcjMyKEdPUkNMKTsKKwllcjMyKEdPUkNIKTsgLyogQ2xlYXIgZ29yYyAqLwogCWFkYXB0ZXItPnN0YXRzLmJwcmMgKz0gZXIzMihCUFJDKTsKIAlhZGFwdGVyLT5zdGF0cy5tcHJjICs9IGVyMzIoTVBSQyk7CiAJYWRhcHRlci0+c3RhdHMucm9jICs9IGVyMzIoUk9DKTsKIAotCWlmIChhZGFwdGVyLT5mbGFncyAmIEZMQUdfSEFTX1NUQVRTX1BUQ19QUkMpIHsKLQkJYWRhcHRlci0+c3RhdHMucHJjNjQgKz0gZXIzMihQUkM2NCk7Ci0JCWFkYXB0ZXItPnN0YXRzLnByYzEyNyArPSBlcjMyKFBSQzEyNyk7Ci0JCWFkYXB0ZXItPnN0YXRzLnByYzI1NSArPSBlcjMyKFBSQzI1NSk7Ci0JCWFkYXB0ZXItPnN0YXRzLnByYzUxMSArPSBlcjMyKFBSQzUxMSk7Ci0JCWFkYXB0ZXItPnN0YXRzLnByYzEwMjMgKz0gZXIzMihQUkMxMDIzKTsKLQkJYWRhcHRlci0+c3RhdHMucHJjMTUyMiArPSBlcjMyKFBSQzE1MjIpOwotCQlhZGFwdGVyLT5zdGF0cy5zeW1lcnJzICs9IGVyMzIoU1lNRVJSUyk7Ci0JCWFkYXB0ZXItPnN0YXRzLnNlYyArPSBlcjMyKFNFQyk7Ci0JfQotCiAJYWRhcHRlci0+c3RhdHMubXBjICs9IGVyMzIoTVBDKTsKIAlhZGFwdGVyLT5zdGF0cy5zY2MgKz0gZXIzMihTQ0MpOwogCWFkYXB0ZXItPnN0YXRzLmVjb2wgKz0gZXIzMihFQ09MKTsKIAlhZGFwdGVyLT5zdGF0cy5tY2MgKz0gZXIzMihNQ0MpOwogCWFkYXB0ZXItPnN0YXRzLmxhdGVjb2wgKz0gZXIzMihMQVRFQ09MKTsKIAlhZGFwdGVyLT5zdGF0cy5kYyArPSBlcjMyKERDKTsKLQlhZGFwdGVyLT5zdGF0cy5ybGVjICs9IGVyMzIoUkxFQyk7CiAJYWRhcHRlci0+c3RhdHMueG9ucnhjICs9IGVyMzIoWE9OUlhDKTsKIAlhZGFwdGVyLT5zdGF0cy54b250eGMgKz0gZXIzMihYT05UWEMpOwogCWFkYXB0ZXItPnN0YXRzLnhvZmZyeGMgKz0gZXIzMihYT0ZGUlhDKTsKIAlhZGFwdGVyLT5zdGF0cy54b2ZmdHhjICs9IGVyMzIoWE9GRlRYQyk7Ci0JYWRhcHRlci0+c3RhdHMuZmNydWMgKz0gZXIzMihGQ1JVQyk7CiAJYWRhcHRlci0+c3RhdHMuZ3B0YyArPSBlcjMyKEdQVEMpOwotCWFkYXB0ZXItPnN0YXRzLmdvdGNsICs9IGVyMzIoR09UQ0wpOwotCWFkYXB0ZXItPnN0YXRzLmdvdGNoICs9IGVyMzIoR09UQ0gpOworCWFkYXB0ZXItPnN0YXRzLmdvdGMgKz0gZXIzMihHT1RDTCk7CisJZXIzMihHT1RDSCk7IC8qIENsZWFyIGdvdGMgKi8KIAlhZGFwdGVyLT5zdGF0cy5ybmJjICs9IGVyMzIoUk5CQyk7CiAJYWRhcHRlci0+c3RhdHMucnVjICs9IGVyMzIoUlVDKTsKLQlhZGFwdGVyLT5zdGF0cy5yZmMgKz0gZXIzMihSRkMpOwotCWFkYXB0ZXItPnN0YXRzLnJqYyArPSBlcjMyKFJKQyk7Ci0JYWRhcHRlci0+c3RhdHMudG9ybCArPSBlcjMyKFRPUkwpOwotCWFkYXB0ZXItPnN0YXRzLnRvcmggKz0gZXIzMihUT1JIKTsKLQlhZGFwdGVyLT5zdGF0cy50b3RsICs9IGVyMzIoVE9UTCk7Ci0JYWRhcHRlci0+c3RhdHMudG90aCArPSBlcjMyKFRPVEgpOwotCWFkYXB0ZXItPnN0YXRzLnRwciArPSBlcjMyKFRQUik7Ci0KLQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBGTEFHX0hBU19TVEFUU19QVENfUFJDKSB7Ci0JCWFkYXB0ZXItPnN0YXRzLnB0YzY0ICs9IGVyMzIoUFRDNjQpOwotCQlhZGFwdGVyLT5zdGF0cy5wdGMxMjcgKz0gZXIzMihQVEMxMjcpOwotCQlhZGFwdGVyLT5zdGF0cy5wdGMyNTUgKz0gZXIzMihQVEMyNTUpOwotCQlhZGFwdGVyLT5zdGF0cy5wdGM1MTEgKz0gZXIzMihQVEM1MTEpOwotCQlhZGFwdGVyLT5zdGF0cy5wdGMxMDIzICs9IGVyMzIoUFRDMTAyMyk7Ci0JCWFkYXB0ZXItPnN0YXRzLnB0YzE1MjIgKz0gZXIzMihQVEMxNTIyKTsKLQl9CiAKIAlhZGFwdGVyLT5zdGF0cy5tcHRjICs9IGVyMzIoTVBUQyk7CiAJYWRhcHRlci0+c3RhdHMuYnB0YyArPSBlcjMyKEJQVEMpOwpAQCAtMjU3NCwxOSArMjU0NSw2IEBACiAJYWRhcHRlci0+c3RhdHMudHNjdGMgKz0gZXIzMihUU0NUQyk7CiAJYWRhcHRlci0+c3RhdHMudHNjdGZjICs9IGVyMzIoVFNDVEZDKTsKIAotCWFkYXB0ZXItPnN0YXRzLmlhYyArPSBlcjMyKElBQyk7Ci0KLQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBGTEFHX0hBU19TVEFUU19JQ1JfSUNUKSB7Ci0JCWFkYXB0ZXItPnN0YXRzLmljcnhvYyArPSBlcjMyKElDUlhPQyk7Ci0JCWFkYXB0ZXItPnN0YXRzLmljcnhwdGMgKz0gZXIzMihJQ1JYUFRDKTsKLQkJYWRhcHRlci0+c3RhdHMuaWNyeGF0YyArPSBlcjMyKElDUlhBVEMpOwotCQlhZGFwdGVyLT5zdGF0cy5pY3R4cHRjICs9IGVyMzIoSUNUWFBUQyk7Ci0JCWFkYXB0ZXItPnN0YXRzLmljdHhhdGMgKz0gZXIzMihJQ1RYQVRDKTsKLQkJYWRhcHRlci0+c3RhdHMuaWN0eHFlYyArPSBlcjMyKElDVFhRRUMpOwotCQlhZGFwdGVyLT5zdGF0cy5pY3R4cW10YyArPSBlcjMyKElDVFhRTVRDKTsKLQkJYWRhcHRlci0+c3RhdHMuaWNyeGRtdGMgKz0gZXIzMihJQ1JYRE1UQyk7Ci0JfQotCiAJLyogRmlsbCBvdXQgdGhlIE9TIHN0YXRpc3RpY3Mgc3RydWN0dXJlICovCiAJYWRhcHRlci0+bmV0X3N0YXRzLm11bHRpY2FzdCA9IGFkYXB0ZXItPnN0YXRzLm1wcmM7CiAJYWRhcHRlci0+bmV0X3N0YXRzLmNvbGxpc2lvbnMgPSBhZGFwdGVyLT5zdGF0cy5jb2xjOwpAQCAtMjYzMyw2ICsyNTkxLDU0IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+c3RhdHNfbG9jaywgaXJxX2ZsYWdzKTsKIH0KIAorLyoqCisgKiBlMTAwMF9waHlfcmVhZF9zdGF0dXMgLSBVcGRhdGUgdGhlIFBIWSByZWdpc3RlciBzdGF0dXMgc25hcHNob3QKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoqLworc3RhdGljIHZvaWQgZTEwMDBfcGh5X3JlYWRfc3RhdHVzKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJc3RydWN0IGUxMDAwX3BoeV9yZWdzICpwaHkgPSAmYWRhcHRlci0+cGh5X3JlZ3M7CisJaW50IHJldF92YWw7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5zdGF0c19sb2NrLCBpcnFfZmxhZ3MpOworCisJaWYgKChlcjMyKFNUQVRVUykgJiBFMTAwMF9TVEFUVVNfTFUpICYmCisJICAgIChhZGFwdGVyLT5ody5waHkubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikpIHsKKwkJcmV0X3ZhbCAgPSBlMWVfcnBoeShodywgUEhZX0NPTlRST0wsICZwaHktPmJtY3IpOworCQlyZXRfdmFsIHw9IGUxZV9ycGh5KGh3LCBQSFlfU1RBVFVTLCAmcGh5LT5ibXNyKTsKKwkJcmV0X3ZhbCB8PSBlMWVfcnBoeShodywgUEhZX0FVVE9ORUdfQURWLCAmcGh5LT5hZHZlcnRpc2UpOworCQlyZXRfdmFsIHw9IGUxZV9ycGh5KGh3LCBQSFlfTFBfQUJJTElUWSwgJnBoeS0+bHBhKTsKKwkJcmV0X3ZhbCB8PSBlMWVfcnBoeShodywgUEhZX0FVVE9ORUdfRVhQLCAmcGh5LT5leHBhbnNpb24pOworCQlyZXRfdmFsIHw9IGUxZV9ycGh5KGh3LCBQSFlfMTAwMFRfQ1RSTCwgJnBoeS0+Y3RybDEwMDApOworCQlyZXRfdmFsIHw9IGUxZV9ycGh5KGh3LCBQSFlfMTAwMFRfU1RBVFVTLCAmcGh5LT5zdGF0MTAwMCk7CisJCXJldF92YWwgfD0gZTFlX3JwaHkoaHcsIFBIWV9FWFRfU1RBVFVTLCAmcGh5LT5lc3RhdHVzKTsKKwkJaWYgKHJldF92YWwpCisJCQluZGV2X3dhcm4oYWRhcHRlci0+bmV0ZGV2LAorCQkJCSAgIkVycm9yIHJlYWRpbmcgUEhZIHJlZ2lzdGVyXG4iKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBEbyBub3QgcmVhZCBQSFkgcmVnaXN0ZXJzIGlmIGxpbmsgaXMgbm90IHVwCisJCSAqIFNldCB2YWx1ZXMgdG8gdHlwaWNhbCBwb3dlci1vbiBkZWZhdWx0cworCQkgKi8KKwkJcGh5LT5ibWNyID0gKEJNQ1JfU1BFRUQxMDAwIHwgQk1DUl9BTkVOQUJMRSB8IEJNQ1JfRlVMTERQTFgpOworCQlwaHktPmJtc3IgPSAoQk1TUl8xMDBGVUxMIHwgQk1TUl8xMDBIQUxGIHwgQk1TUl8xMEZVTEwgfAorCQkJICAgICBCTVNSXzEwSEFMRiB8IEJNU1JfRVNUQVRFTiB8IEJNU1JfQU5FR0NBUEFCTEUgfAorCQkJICAgICBCTVNSX0VSQ0FQKTsKKwkJcGh5LT5hZHZlcnRpc2UgPSAoQURWRVJUSVNFX1BBVVNFX0FTWU0gfCBBRFZFUlRJU0VfUEFVU0VfQ0FQIHwKKwkJCQkgIEFEVkVSVElTRV9BTEwgfCBBRFZFUlRJU0VfQ1NNQSk7CisJCXBoeS0+bHBhID0gMDsKKwkJcGh5LT5leHBhbnNpb24gPSBFWFBBTlNJT05fRU5BQkxFTlBBR0U7CisJCXBoeS0+Y3RybDEwMDAgPSBBRFZFUlRJU0VfMTAwMEZVTEw7CisJCXBoeS0+c3RhdDEwMDAgPSAwOworCQlwaHktPmVzdGF0dXMgPSAoRVNUQVRVU18xMDAwX1RGVUxMIHwgRVNUQVRVU18xMDAwX1RIQUxGKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5zdGF0c19sb2NrLCBpcnFfZmxhZ3MpOworfQorCiBzdGF0aWMgdm9pZCBlMTAwMF9wcmludF9saW5rX2luZm8oc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKQEAgLTI3NDUsNiArMjc1MSw3IEBACiAJCWlmICghbmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKSB7CiAJCQlib29sIHR4YjJiID0gMTsKIAkJCS8qIHVwZGF0ZSBzbmFwc2hvdCBvZiBQSFkgcmVnaXN0ZXJzIG9uIExTQyAqLworCQkJZTEwMDBfcGh5X3JlYWRfc3RhdHVzKGFkYXB0ZXIpOwogCQkJbWFjLT5vcHMuZ2V0X2xpbmtfdXBfaW5mbygmYWRhcHRlci0+aHcsCiAJCQkJCQkgICAmYWRhcHRlci0+bGlua19zcGVlZCwKIAkJCQkJCSAgICZhZGFwdGVyLT5saW5rX2R1cGxleCk7CkBAIC0yODQyLDEwICsyODQ5LDEwIEBACiAJbWFjLT5jb2xsaXNpb25fZGVsdGEgPSBhZGFwdGVyLT5zdGF0cy5jb2xjIC0gYWRhcHRlci0+Y29sY19vbGQ7CiAJYWRhcHRlci0+Y29sY19vbGQgPSBhZGFwdGVyLT5zdGF0cy5jb2xjOwogCi0JYWRhcHRlci0+Z29yY2wgPSBhZGFwdGVyLT5zdGF0cy5nb3JjbCAtIGFkYXB0ZXItPmdvcmNsX29sZDsKLQlhZGFwdGVyLT5nb3JjbF9vbGQgPSBhZGFwdGVyLT5zdGF0cy5nb3JjbDsKLQlhZGFwdGVyLT5nb3RjbCA9IGFkYXB0ZXItPnN0YXRzLmdvdGNsIC0gYWRhcHRlci0+Z290Y2xfb2xkOwotCWFkYXB0ZXItPmdvdGNsX29sZCA9IGFkYXB0ZXItPnN0YXRzLmdvdGNsOworCWFkYXB0ZXItPmdvcmMgPSBhZGFwdGVyLT5zdGF0cy5nb3JjIC0gYWRhcHRlci0+Z29yY19vbGQ7CisJYWRhcHRlci0+Z29yY19vbGQgPSBhZGFwdGVyLT5zdGF0cy5nb3JjOworCWFkYXB0ZXItPmdvdGMgPSBhZGFwdGVyLT5zdGF0cy5nb3RjIC0gYWRhcHRlci0+Z290Y19vbGQ7CisJYWRhcHRlci0+Z290Y19vbGQgPSBhZGFwdGVyLT5zdGF0cy5nb3RjOwogCiAJZTEwMDBlX3VwZGF0ZV9hZGFwdGl2ZSgmYWRhcHRlci0+aHcpOwogCkBAIC0zNTAwLDcgKzM1MDcsNiBAQAogewogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKmRhdGEgPSBpZl9taWkoaWZyKTsKLQl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKIAogCWlmIChhZGFwdGVyLT5ody5waHkubWVkaWFfdHlwZSAhPSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwpAQCAtMzUxMiwxMyArMzUxOCw0MCBAQAogCWNhc2UgU0lPQ0dNSUlSRUc6CiAJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKIAkJCXJldHVybiAtRVBFUk07Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5zdGF0c19sb2NrLCBpcnFfZmxhZ3MpOwotCQlpZiAoZTFlX3JwaHkoJmFkYXB0ZXItPmh3LCBkYXRhLT5yZWdfbnVtICYgMHgxRiwKLQkJCQkgICAmZGF0YS0+dmFsX291dCkpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPnN0YXRzX2xvY2ssIGlycV9mbGFncyk7CisJCXN3aXRjaCAoZGF0YS0+cmVnX251bSAmIDB4MUYpIHsKKwkJY2FzZSBNSUlfQk1DUjoKKwkJCWRhdGEtPnZhbF9vdXQgPSBhZGFwdGVyLT5waHlfcmVncy5ibWNyOworCQkJYnJlYWs7CisJCWNhc2UgTUlJX0JNU1I6CisJCQlkYXRhLT52YWxfb3V0ID0gYWRhcHRlci0+cGh5X3JlZ3MuYm1zcjsKKwkJCWJyZWFrOworCQljYXNlIE1JSV9QSFlTSUQxOgorCQkJZGF0YS0+dmFsX291dCA9IChhZGFwdGVyLT5ody5waHkuaWQgPj4gMTYpOworCQkJYnJlYWs7CisJCWNhc2UgTUlJX1BIWVNJRDI6CisJCQlkYXRhLT52YWxfb3V0ID0gKGFkYXB0ZXItPmh3LnBoeS5pZCAmIDB4RkZGRik7CisJCQlicmVhazsKKwkJY2FzZSBNSUlfQURWRVJUSVNFOgorCQkJZGF0YS0+dmFsX291dCA9IGFkYXB0ZXItPnBoeV9yZWdzLmFkdmVydGlzZTsKKwkJCWJyZWFrOworCQljYXNlIE1JSV9MUEE6CisJCQlkYXRhLT52YWxfb3V0ID0gYWRhcHRlci0+cGh5X3JlZ3MubHBhOworCQkJYnJlYWs7CisJCWNhc2UgTUlJX0VYUEFOU0lPTjoKKwkJCWRhdGEtPnZhbF9vdXQgPSBhZGFwdGVyLT5waHlfcmVncy5leHBhbnNpb247CisJCQlicmVhazsKKwkJY2FzZSBNSUlfQ1RSTDEwMDA6CisJCQlkYXRhLT52YWxfb3V0ID0gYWRhcHRlci0+cGh5X3JlZ3MuY3RybDEwMDA7CisJCQlicmVhazsKKwkJY2FzZSBNSUlfU1RBVDEwMDA6CisJCQlkYXRhLT52YWxfb3V0ID0gYWRhcHRlci0+cGh5X3JlZ3Muc3RhdDEwMDA7CisJCQlicmVhazsKKwkJY2FzZSBNSUlfRVNUQVRVUzoKKwkJCWRhdGEtPnZhbF9vdXQgPSBhZGFwdGVyLT5waHlfcmVncy5lc3RhdHVzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5zdGF0c19sb2NrLCBpcnFfZmxhZ3MpOwogCQlicmVhazsKIAljYXNlIFNJT0NTTUlJUkVHOgogCWRlZmF1bHQ6CkBAIC0zNzc0LDYgKzM4MDcsNyBAQAogCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfRElTQ09OTkVDVDsKIAl9CiAJcGNpX3NldF9tYXN0ZXIocGRldik7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CiAKIAlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzaG90LCAwKTsKIAlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzY29sZCwgMCk7CkBAIC0zOTAwLDYgKzM5MzQsNyBAQAogCQlnb3RvIGVycl9wY2lfcmVnOwogCiAJcGNpX3NldF9tYXN0ZXIocGRldik7CisJcGNpX3NhdmVfc3RhdGUocGRldik7CiAKIAllcnIgPSAtRU5PTUVNOwogCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgZTEwMDBfYWRhcHRlcikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDBlL3BoeS5jIGIvZHJpdmVycy9uZXQvZTEwMDBlL3BoeS5jCmluZGV4IDNhNDU3NGMuLmUxMDIzMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwZS9waHkuYworKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvcGh5LmMKQEAgLTExNiw3ICsxMTYsNyBAQAogfQogCiAvKioKLSAqICBlMTAwMF9yZWFkX3BoeV9yZWdfbWRpYyAtIFJlYWQgTURJIGNvbnRyb2wgcmVnaXN0ZXIKKyAqICBlMTAwMGVfcmVhZF9waHlfcmVnX21kaWMgLSBSZWFkIE1ESSBjb250cm9sIHJlZ2lzdGVyCiAgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKICAqICBAb2Zmc2V0OiByZWdpc3RlciBvZmZzZXQgdG8gYmUgcmVhZAogICogIEBkYXRhOiBwb2ludGVyIHRvIHRoZSByZWFkIGRhdGEKQEAgLTEyNCw3ICsxMjQsNyBAQAogICogIFJlYWRzIHRoZSBNREkgY29udHJvbCByZWdpc3RlciBpbiB0aGUgUEhZIGF0IG9mZnNldCBhbmQgc3RvcmVzIHRoZQogICogIGluZm9ybWF0aW9uIHJlYWQgdG8gZGF0YS4KICAqKi8KLXN0YXRpYyBzMzIgZTEwMDBfcmVhZF9waHlfcmVnX21kaWMoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTE2ICpkYXRhKQorczMyIGUxMDAwZV9yZWFkX3BoeV9yZWdfbWRpYyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LCB1MTYgKmRhdGEpCiB7CiAJc3RydWN0IGUxMDAwX3BoeV9pbmZvICpwaHkgPSAmaHctPnBoeTsKIAl1MzIgaSwgbWRpYyA9IDA7CkBAIC0xNTAsNyArMTUwLDcgQEAKIAkgKiBJbmNyZWFzaW5nIHRoZSB0aW1lIG91dCBhcyB0ZXN0aW5nIHNob3dlZCBmYWlsdXJlcyB3aXRoCiAJICogdGhlIGxvd2VyIHRpbWUgb3V0CiAJICovCi0JZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgKEUxMDAwX0dFTl9QT0xMX1RJTUVPVVQgKiAzKTsgaSsrKSB7CiAJCXVkZWxheSg1MCk7CiAJCW1kaWMgPSBlcjMyKE1ESUMpOwogCQlpZiAobWRpYyAmIEUxMDAwX01ESUNfUkVBRFkpCkBAIC0xNzAsMTQgKzE3MCwxNCBAQAogfQogCiAvKioKLSAqICBlMTAwMF93cml0ZV9waHlfcmVnX21kaWMgLSBXcml0ZSBNREkgY29udHJvbCByZWdpc3RlcgorICogIGUxMDAwZV93cml0ZV9waHlfcmVnX21kaWMgLSBXcml0ZSBNREkgY29udHJvbCByZWdpc3RlcgogICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCiAgKiAgQG9mZnNldDogcmVnaXN0ZXIgb2Zmc2V0IHRvIHdyaXRlIHRvCiAgKiAgQGRhdGE6IGRhdGEgdG8gd3JpdGUgdG8gcmVnaXN0ZXIgYXQgb2Zmc2V0CiAgKgogICogIFdyaXRlcyBkYXRhIHRvIE1ESSBjb250cm9sIHJlZ2lzdGVyIGluIHRoZSBQSFkgYXQgb2Zmc2V0LgogICoqLwotc3RhdGljIHMzMiBlMTAwMF93cml0ZV9waHlfcmVnX21kaWMoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTE2IGRhdGEpCitzMzIgZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LCB1MTYgZGF0YSkKIHsKIAlzdHJ1Y3QgZTEwMDBfcGh5X2luZm8gKnBoeSA9ICZody0+cGh5OwogCXUzMiBpLCBtZGljID0gMDsKQEAgLTE5OSw5ICsxOTksMTMgQEAKIAogCWV3MzIoTURJQywgbWRpYyk7CiAKLQkvKiBQb2xsIHRoZSByZWFkeSBiaXQgdG8gc2VlIGlmIHRoZSBNREkgcmVhZCBjb21wbGV0ZWQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgRTEwMDBfR0VOX1BPTExfVElNRU9VVDsgaSsrKSB7Ci0JCXVkZWxheSg1KTsKKwkvKgorCSAqIFBvbGwgdGhlIHJlYWR5IGJpdCB0byBzZWUgaWYgdGhlIE1ESSByZWFkIGNvbXBsZXRlZAorCSAqIEluY3JlYXNpbmcgdGhlIHRpbWUgb3V0IGFzIHRlc3Rpbmcgc2hvd2VkIGZhaWx1cmVzIHdpdGgKKwkgKiB0aGUgbG93ZXIgdGltZSBvdXQKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgKEUxMDAwX0dFTl9QT0xMX1RJTUVPVVQgKiAzKTsgaSsrKSB7CisJCXVkZWxheSg1MCk7CiAJCW1kaWMgPSBlcjMyKE1ESUMpOwogCQlpZiAobWRpYyAmIEUxMDAwX01ESUNfUkVBRFkpCiAJCQlicmVhazsKQEAgLTIxMCw2ICsyMTQsMTAgQEAKIAkJaHdfZGJnKGh3LCAiTURJIFdyaXRlIGRpZCBub3QgY29tcGxldGVcbiIpOwogCQlyZXR1cm4gLUUxMDAwX0VSUl9QSFk7CiAJfQorCWlmIChtZGljICYgRTEwMDBfTURJQ19FUlJPUikgeworCQlod19kYmcoaHcsICJNREkgRXJyb3JcbiIpOworCQlyZXR1cm4gLUUxMDAwX0VSUl9QSFk7CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMzIsOSArMjQwLDggQEAKIAlpZiAocmV0X3ZhbCkKIAkJcmV0dXJuIHJldF92YWw7CiAKLQlyZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnX21kaWMoaHcsCi0JCQkJCSAgTUFYX1BIWV9SRUdfQUREUkVTUyAmIG9mZnNldCwKLQkJCQkJICBkYXRhKTsKKwlyZXRfdmFsID0gZTEwMDBlX3JlYWRfcGh5X3JlZ19tZGljKGh3LCBNQVhfUEhZX1JFR19BRERSRVNTICYgb2Zmc2V0LAorCQkJCQkgICBkYXRhKTsKIAogCWh3LT5waHkub3BzLnJlbGVhc2VfcGh5KGh3KTsKIApAQCAtMjU4LDkgKzI2NSw4IEBACiAJaWYgKHJldF92YWwpCiAJCXJldHVybiByZXRfdmFsOwogCi0JcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWdfbWRpYyhodywKLQkJCQkJICAgTUFYX1BIWV9SRUdfQUREUkVTUyAmIG9mZnNldCwKLQkJCQkJICAgZGF0YSk7CisJcmV0X3ZhbCA9IGUxMDAwZV93cml0ZV9waHlfcmVnX21kaWMoaHcsIE1BWF9QSFlfUkVHX0FERFJFU1MgJiBvZmZzZXQsCisJCQkJCSAgICBkYXRhKTsKIAogCWh3LT5waHkub3BzLnJlbGVhc2VfcGh5KGh3KTsKIApAQCAtMjg2LDE4ICsyOTIsMTcgQEAKIAkJcmV0dXJuIHJldF92YWw7CiAKIAlpZiAob2Zmc2V0ID4gTUFYX1BIWV9NVUxUSV9QQUdFX1JFRykgewotCQlyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZ19tZGljKGh3LAotCQkJCQkJICAgSUdQMDFFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsCi0JCQkJCQkgICAodTE2KW9mZnNldCk7CisJCXJldF92YWwgPSBlMTAwMGVfd3JpdGVfcGh5X3JlZ19tZGljKGh3LAorCQkJCQkJICAgIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNULAorCQkJCQkJICAgICh1MTYpb2Zmc2V0KTsKIAkJaWYgKHJldF92YWwpIHsKIAkJCWh3LT5waHkub3BzLnJlbGVhc2VfcGh5KGh3KTsKIAkJCXJldHVybiByZXRfdmFsOwogCQl9CiAJfQogCi0JcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZ19tZGljKGh3LAotCQkJCQkgIE1BWF9QSFlfUkVHX0FERFJFU1MgJiBvZmZzZXQsCi0JCQkJCSAgZGF0YSk7CisJcmV0X3ZhbCA9IGUxMDAwZV9yZWFkX3BoeV9yZWdfbWRpYyhodywgTUFYX1BIWV9SRUdfQUREUkVTUyAmIG9mZnNldCwKKwkJCQkJICAgZGF0YSk7CiAKIAlody0+cGh5Lm9wcy5yZWxlYXNlX3BoeShodyk7CiAKQEAgLTMyMiwxOCArMzI3LDE3IEBACiAJCXJldHVybiByZXRfdmFsOwogCiAJaWYgKG9mZnNldCA+IE1BWF9QSFlfTVVMVElfUEFHRV9SRUcpIHsKLQkJcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWdfbWRpYyhodywKLQkJCQkJCSAgIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNULAotCQkJCQkJICAgKHUxNilvZmZzZXQpOworCQlyZXRfdmFsID0gZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhodywKKwkJCQkJCSAgICBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCwKKwkJCQkJCSAgICAodTE2KW9mZnNldCk7CiAJCWlmIChyZXRfdmFsKSB7CiAJCQlody0+cGh5Lm9wcy5yZWxlYXNlX3BoeShodyk7CiAJCQlyZXR1cm4gcmV0X3ZhbDsKIAkJfQogCX0KIAotCXJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnX21kaWMoaHcsCi0JCQkJCSAgIE1BWF9QSFlfUkVHX0FERFJFU1MgJiBvZmZzZXQsCi0JCQkJCSAgIGRhdGEpOworCXJldF92YWwgPSBlMTAwMGVfd3JpdGVfcGh5X3JlZ19tZGljKGh3LCBNQVhfUEhZX1JFR19BRERSRVNTICYgb2Zmc2V0LAorCQkJCQkgICAgZGF0YSk7CiAKIAlody0+cGh5Lm9wcy5yZWxlYXNlX3BoeShodyk7CiAKQEAgLTQyMCw3ICs0MjQsOSBAQAogCWlmIChyZXRfdmFsKQogCQlyZXR1cm4gcmV0X3ZhbDsKIAotCXBoeV9kYXRhIHw9IE04OEUxMDAwX1BTQ1JfQVNTRVJUX0NSU19PTl9UWDsKKwkvKiBGb3IgbmV3ZXIgUEhZcyB0aGlzIGJpdCBpcyBkb3duc2hpZnQgZW5hYmxlICovCisJaWYgKHBoeS0+dHlwZSA9PSBlMTAwMF9waHlfbTg4KQorCQlwaHlfZGF0YSB8PSBNODhFMTAwMF9QU0NSX0FTU0VSVF9DUlNfT05fVFg7CiAKIAkvKgogCSAqIE9wdGlvbnM6CkBAIC00NjMsNyArNDY5LDcgQEAKIAlpZiAocmV0X3ZhbCkKIAkJcmV0dXJuIHJldF92YWw7CiAKLQlpZiAocGh5LT5yZXZpc2lvbiA8IDQpIHsKKwlpZiAoKHBoeS0+dHlwZSA9PSBlMTAwMF9waHlfbTg4KSAmJiAocGh5LT5yZXZpc2lvbiA8IDQpKSB7CiAJCS8qCiAJCSAqIEZvcmNlIFRYX0NMSyBpbiB0aGUgRXh0ZW5kZWQgUEhZIFNwZWNpZmljIENvbnRyb2wgUmVnaXN0ZXIKIAkJICogdG8gMjVNSHogY2xvY2suCkBAIC01MTgsOCArNTI0LDExIEBACiAJCXJldHVybiByZXRfdmFsOwogCX0KIAotCS8qIFdhaXQgMTVtcyBmb3IgTUFDIHRvIGNvbmZpZ3VyZSBQSFkgZnJvbSBOVk0gc2V0dGluZ3MuICovCi0JbXNsZWVwKDE1KTsKKwkvKgorCSAqIFdhaXQgMTAwbXMgZm9yIE1BQyB0byBjb25maWd1cmUgUEhZIGZyb20gTlZNIHNldHRpbmdzLCB0byBhdm9pZAorCSAqIHRpbWVvdXQgaXNzdWVzIHdoZW4gTEZTIGlzIGVuYWJsZWQuCisJICovCisJbXNsZWVwKDEwMCk7CiAKIAkvKiBkaXNhYmxlIGxwbHUgZDAgZHVyaW5nIGRyaXZlciBpbml0ICovCiAJcmV0X3ZhbCA9IGUxMDAwX3NldF9kMF9scGx1X3N0YXRlKGh3LCAwKTsKQEAgLTExNTIsOSArMTE2MSw3IEBACiAKIAlpZiAoIWFjdGl2ZSkgewogCQlkYXRhICY9IH5JR1AwMkUxMDAwX1BNX0QzX0xQTFU7Ci0JCXJldF92YWwgPSBlMWVfd3BoeShodywKLQkJCQkJICAgICBJR1AwMkUxMDAwX1BIWV9QT1dFUl9NR01ULAotCQkJCQkgICAgIGRhdGEpOworCQlyZXRfdmFsID0gZTFlX3dwaHkoaHcsIElHUDAyRTEwMDBfUEhZX1BPV0VSX01HTVQsIGRhdGEpOwogCQlpZiAocmV0X3ZhbCkKIAkJCXJldHVybiByZXRfdmFsOwogCQkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX21haW4uYyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9tYWluLmMKaW5kZXggOWZmNzUzOC4uZjliYzIxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX21haW4uYworKysgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfbWFpbi5jCkBAIC0yNjExLDcgKzI2MTEsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgZWhlYV9wdXJnZV9zcShzdHJ1Y3QgZWhlYV9xcCAqb3JpZ19xcCkKK3N0YXRpYyB2b2lkIGVoZWFfcHVyZ2Vfc3Eoc3RydWN0IGVoZWFfcXAgKm9yaWdfcXApCiB7CiAJc3RydWN0IGVoZWFfcXAgcXAgPSAqb3JpZ19xcDsKIAlzdHJ1Y3QgZWhlYV9xcF9pbml0X2F0dHIgKmluaXRfYXR0ciA9ICZxcC5pbml0X2F0dHI7CkBAIC0yNjI1LDcgKzI2MjUsNyBAQAogCX0KIH0KIAotdm9pZCBlaGVhX2ZsdXNoX3NxKHN0cnVjdCBlaGVhX3BvcnQgKnBvcnQpCitzdGF0aWMgdm9pZCBlaGVhX2ZsdXNoX3NxKHN0cnVjdCBlaGVhX3BvcnQgKnBvcnQpCiB7CiAJaW50IGk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZvcmNlZGV0aC5jIGIvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKaW5kZXggOGM0MjE0Yi4uMzVmNjZkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKQEAgLTk2LDYgKzk2LDcgQEAKICNkZWZpbmUgREVWX0hBU19QQVVTRUZSQU1FX1RYX1YyICAgMHgxMDAwMCAgLyogZGV2aWNlIHN1cHBvcnRzIHR4IHBhdXNlIGZyYW1lcyB2ZXJzaW9uIDIgKi8KICNkZWZpbmUgREVWX0hBU19QQVVTRUZSQU1FX1RYX1YzICAgMHgyMDAwMCAgLyogZGV2aWNlIHN1cHBvcnRzIHR4IHBhdXNlIGZyYW1lcyB2ZXJzaW9uIDMgKi8KICNkZWZpbmUgREVWX05FRURfVFhfTElNSVQgICAgICAgICAgMHg0MDAwMCAgLyogZGV2aWNlIG5lZWRzIHRvIGxpbWl0IHR4ICovCisjZGVmaW5lIERFVl9IQVNfR0VBUl9NT0RFICAgICAgICAgIDB4ODAwMDAgIC8qIGRldmljZSBzdXBwb3J0cyBnZWFyIG1vZGUgKi8KIAogZW51bSB7CiAJTnZSZWdJcnFTdGF0dXMgPSAweDAwMCwKQEAgLTE3NCwxMSArMTc1LDEzIEBACiAJTnZSZWdSZWNlaXZlclN0YXR1cyA9IDB4OTgsCiAjZGVmaW5lIE5WUkVHX1JDVlNUQVRfQlVTWQkweDAxCiAKLQlOdlJlZ1JhbmRvbVNlZWQgPSAweDljLAotI2RlZmluZSBOVlJFR19STkRTRUVEX01BU0sJMHgwMGZmCi0jZGVmaW5lIE5WUkVHX1JORFNFRURfRk9SQ0UJMHg3ZjAwCi0jZGVmaW5lIE5WUkVHX1JORFNFRURfRk9SQ0UyCTB4MmQwMAotI2RlZmluZSBOVlJFR19STkRTRUVEX0ZPUkNFMwkweDc0MDAKKwlOdlJlZ1Nsb3RUaW1lID0gMHg5YywKKyNkZWZpbmUgTlZSRUdfU0xPVFRJTUVfTEVHQkZfRU5BQkxFRAkweDgwMDAwMDAwCisjZGVmaW5lIE5WUkVHX1NMT1RUSU1FXzEwXzEwMF9GVUxMCTB4MDAwMDdmMDAKKyNkZWZpbmUgTlZSRUdfU0xPVFRJTUVfMTAwMF9GVUxMIAkweDAwMDNmZjAwCisjZGVmaW5lIE5WUkVHX1NMT1RUSU1FX0hBTEYJCTB4MDAwMGZmMDAKKyNkZWZpbmUgTlZSRUdfU0xPVFRJTUVfREVGQVVMVAkgCTB4MDAwMDdmMDAKKyNkZWZpbmUgTlZSRUdfU0xPVFRJTUVfTUFTSwkJMHgwMDAwMDBmZgogCiAJTnZSZWdUeERlZmVycmFsID0gMHhBMCwKICNkZWZpbmUgTlZSRUdfVFhfREVGRVJSQUxfREVGQVVMVAkJMHgxNTA1MGYKQEAgLTIwMSw2ICsyMDQsMTEgQEAKIAogCU52UmVnUGh5SW50ZXJmYWNlID0gMHhDMCwKICNkZWZpbmUgUEhZX1JHTUlJCQkweDEwMDAwMDAwCisJTnZSZWdCYWNrT2ZmQ29udHJvbCA9IDB4QzQsCisjZGVmaW5lIE5WUkVHX0JLT0ZGQ1RSTF9ERUZBVUxUCQkJMHg3MDAwMDAwMAorI2RlZmluZSBOVlJFR19CS09GRkNUUkxfU0VFRF9NQVNLCQkweDAwMDAwM2ZmCisjZGVmaW5lIE5WUkVHX0JLT0ZGQ1RSTF9TRUxFQ1QJCQkyNAorI2RlZmluZSBOVlJFR19CS09GRkNUUkxfR0VBUgkJCTEyCiAKIAlOdlJlZ1R4UmluZ1BoeXNBZGRyID0gMHgxMDAsCiAJTnZSZWdSeFJpbmdQaHlzQWRkciA9IDB4MTA0LApAQCAtMzUyLDYgKzM2MCw3IEBACiAKICNkZWZpbmUgTlZfVFhfTEFTVFBBQ0tFVAkoMTw8MTYpCiAjZGVmaW5lIE5WX1RYX1JFVFJZRVJST1IJKDE8PDE5KQorI2RlZmluZSBOVl9UWF9SRVRSWUNPVU5UX01BU0sJKDB4Rjw8MjApCiAjZGVmaW5lIE5WX1RYX0ZPUkNFRF9JTlRFUlJVUFQJKDE8PDI0KQogI2RlZmluZSBOVl9UWF9ERUZFUlJFRAkJKDE8PDI2KQogI2RlZmluZSBOVl9UWF9DQVJSSUVSTE9TVAkoMTw8MjcpCkBAIC0zNjIsNiArMzcxLDcgQEAKIAogI2RlZmluZSBOVl9UWDJfTEFTVFBBQ0tFVAkoMTw8MjkpCiAjZGVmaW5lIE5WX1RYMl9SRVRSWUVSUk9SCSgxPDwxOCkKKyNkZWZpbmUgTlZfVFgyX1JFVFJZQ09VTlRfTUFTSwkoMHhGPDwxOSkKICNkZWZpbmUgTlZfVFgyX0ZPUkNFRF9JTlRFUlJVUFQJKDE8PDMwKQogI2RlZmluZSBOVl9UWDJfREVGRVJSRUQJCSgxPDwyNSkKICNkZWZpbmUgTlZfVFgyX0NBUlJJRVJMT1NUCSgxPDwyNikKQEAgLTQ3MywxNiArNDgzLDIyIEBACiAjZGVmaW5lIERFU0NfVkVSXzMJMwogCiAvKiBQSFkgZGVmaW5lcyAqLwotI2RlZmluZSBQSFlfT1VJX01BUlZFTEwJMHg1MDQzCi0jZGVmaW5lIFBIWV9PVUlfQ0lDQURBCTB4MDNmMQotI2RlZmluZSBQSFlfT1VJX1ZJVEVTU0UJMHgwMWMxCi0jZGVmaW5lIFBIWV9PVUlfUkVBTFRFSwkweDA3MzIKKyNkZWZpbmUgUEhZX09VSV9NQVJWRUxMCQkweDUwNDMKKyNkZWZpbmUgUEhZX09VSV9DSUNBREEJCTB4MDNmMQorI2RlZmluZSBQSFlfT1VJX1ZJVEVTU0UJCTB4MDFjMQorI2RlZmluZSBQSFlfT1VJX1JFQUxURUsJCTB4MDczMgorI2RlZmluZSBQSFlfT1VJX1JFQUxURUsyCTB4MDAyMAogI2RlZmluZSBQSFlJRDFfT1VJX01BU0sJMHgwM2ZmCiAjZGVmaW5lIFBIWUlEMV9PVUlfU0hGVAk2CiAjZGVmaW5lIFBIWUlEMl9PVUlfTUFTSwkweGZjMDAKICNkZWZpbmUgUEhZSUQyX09VSV9TSEZUCTEwCiAjZGVmaW5lIFBIWUlEMl9NT0RFTF9NQVNLCQkweDAzZjAKLSNkZWZpbmUgUEhZX01PREVMX01BUlZFTExfRTMwMTYJCTB4MjIwCisjZGVmaW5lIFBIWV9NT0RFTF9SRUFMVEVLXzgyMTEJCTB4MDExMAorI2RlZmluZSBQSFlfUkVWX01BU0sJCQkweDAwMDEKKyNkZWZpbmUgUEhZX1JFVl9SRUFMVEVLXzgyMTFCCQkweDAwMDAKKyNkZWZpbmUgUEhZX1JFVl9SRUFMVEVLXzgyMTFDCQkweDAwMDEKKyNkZWZpbmUgUEhZX01PREVMX1JFQUxURUtfODIwMQkJMHgwMjAwCisjZGVmaW5lIFBIWV9NT0RFTF9NQVJWRUxMX0UzMDE2CQkweDAyMjAKICNkZWZpbmUgUEhZX01BUlZFTExfRTMwMTZfSU5JVE1BU0sJMHgwMzAwCiAjZGVmaW5lIFBIWV9DSUNBREFfSU5JVDEJMHgwZjAwMAogI2RlZmluZSBQSFlfQ0lDQURBX0lOSVQyCTB4MGUwMApAQCAtNTA5LDEwICs1MjUsMTggQEAKICNkZWZpbmUgUEhZX1JFQUxURUtfSU5JVF9SRUcxCTB4MWYKICNkZWZpbmUgUEhZX1JFQUxURUtfSU5JVF9SRUcyCTB4MTkKICNkZWZpbmUgUEhZX1JFQUxURUtfSU5JVF9SRUczCTB4MTMKKyNkZWZpbmUgUEhZX1JFQUxURUtfSU5JVF9SRUc0CTB4MTQKKyNkZWZpbmUgUEhZX1JFQUxURUtfSU5JVF9SRUc1CTB4MTgKKyNkZWZpbmUgUEhZX1JFQUxURUtfSU5JVF9SRUc2CTB4MTEKICNkZWZpbmUgUEhZX1JFQUxURUtfSU5JVDEJMHgwMDAwCiAjZGVmaW5lIFBIWV9SRUFMVEVLX0lOSVQyCTB4OGUwMAogI2RlZmluZSBQSFlfUkVBTFRFS19JTklUMwkweDAwMDEKICNkZWZpbmUgUEhZX1JFQUxURUtfSU5JVDQJMHhhZDE3CisjZGVmaW5lIFBIWV9SRUFMVEVLX0lOSVQ1CTB4ZmI1NAorI2RlZmluZSBQSFlfUkVBTFRFS19JTklUNgkweGY1YzcKKyNkZWZpbmUgUEhZX1JFQUxURUtfSU5JVDcJMHgxMDAwCisjZGVmaW5lIFBIWV9SRUFMVEVLX0lOSVQ4CTB4MDAwMworI2RlZmluZSBQSFlfUkVBTFRFS19JTklUX01TSzEJMHgwMDAzCiAKICNkZWZpbmUgUEhZX0dJR0FCSVQJMHgwMTAwCiAKQEAgLTY5MSw2ICs3MTUsNyBAQAogCWludCB3b2xlbmFibGVkOwogCXVuc2lnbmVkIGludCBwaHlfb3VpOwogCXVuc2lnbmVkIGludCBwaHlfbW9kZWw7CisJdW5zaWduZWQgaW50IHBoeV9yZXY7CiAJdTE2IGdpZ2FiaXQ7CiAJaW50IGludHJfdGVzdDsKIAlpbnQgcmVjb3Zlcl9lcnJvcjsKQEAgLTcwNCw2ICs3MjksNyBAQAogCXUzMiB0eHJ4Y3RsX2JpdHM7CiAJdTMyIHZsYW5jdGxfYml0czsKIAl1MzIgZHJpdmVyX2RhdGE7CisJdTMyIGRldmljZV9pZDsKIAl1MzIgcmVnaXN0ZXJfc2l6ZTsKIAlpbnQgcnhfY3N1bTsKIAl1MzIgbWFjX2luX3VzZTsKQEAgLTgxNCw2ICs4NDAsMTYgQEAKIH07CiBzdGF0aWMgaW50IGRtYV82NGJpdCA9IE5WX0RNQV82NEJJVF9FTkFCTEVEOwogCisvKgorICogQ3Jvc3NvdmVyIERldGVjdGlvbgorICogUmVhbHRlayA4MjAxIHBoeSArIHNvbWUgT0VNIGJvYXJkcyBkbyBub3Qgd29yayBwcm9wZXJseS4KKyAqLworZW51bSB7CisJTlZfQ1JPU1NPVkVSX0RFVEVDVElPTl9ESVNBQkxFRCwKKwlOVl9DUk9TU09WRVJfREVURUNUSU9OX0VOQUJMRUQKK307CitzdGF0aWMgaW50IHBoeV9jcm9zcyA9IE5WX0NST1NTT1ZFUl9ERVRFQ1RJT05fRElTQUJMRUQ7CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGZlX3ByaXYgKmdldF9udnByaXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTEwNzgsMjUgKzExMTQsNTMgQEAKIAkJfQogCX0KIAlpZiAobnAtPnBoeV9vdWkgPT0gUEhZX09VSV9SRUFMVEVLKSB7Ci0JCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcxLCBQSFlfUkVBTFRFS19JTklUMSkpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOwotCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJaWYgKG5wLT5waHlfbW9kZWwgPT0gUEhZX01PREVMX1JFQUxURUtfODIxMSAmJgorCQkgICAgbnAtPnBoeV9yZXYgPT0gUEhZX1JFVl9SRUFMVEVLXzgyMTFCKSB7CisJCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9SRUFMVEVLX0lOSVRfUkVHMSwgUEhZX1JFQUxURUtfSU5JVDEpKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJCX0KKwkJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcyLCBQSFlfUkVBTFRFS19JTklUMikpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCQlyZXR1cm4gUEhZX0VSUk9SOworCQkJfQorCQkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzEsIFBIWV9SRUFMVEVLX0lOSVQzKSkgeworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJCXJldHVybiBQSFlfRVJST1I7CisJCQl9CisJCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9SRUFMVEVLX0lOSVRfUkVHMywgUEhZX1JFQUxURUtfSU5JVDQpKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJCX0KKwkJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUc0LCBQSFlfUkVBTFRFS19JTklUNSkpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCQlyZXR1cm4gUEhZX0VSUk9SOworCQkJfQorCQkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzUsIFBIWV9SRUFMVEVLX0lOSVQ2KSkgeworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJCXJldHVybiBQSFlfRVJST1I7CisJCQl9CisJCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9SRUFMVEVLX0lOSVRfUkVHMSwgUEhZX1JFQUxURUtfSU5JVDEpKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJCX0KIAkJfQotCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9SRUFMVEVLX0lOSVRfUkVHMiwgUEhZX1JFQUxURUtfSU5JVDIpKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKLQkJCXJldHVybiBQSFlfRVJST1I7Ci0JCX0KLQkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzEsIFBIWV9SRUFMVEVLX0lOSVQzKSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7Ci0JCQlyZXR1cm4gUEhZX0VSUk9SOwotCQl9Ci0JCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUczLCBQSFlfUkVBTFRFS19JTklUNCkpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOwotCQkJcmV0dXJuIFBIWV9FUlJPUjsKLQkJfQotCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9SRUFMVEVLX0lOSVRfUkVHMSwgUEhZX1JFQUxURUtfSU5JVDEpKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKLQkJCXJldHVybiBQSFlfRVJST1I7CisJCWlmIChucC0+cGh5X21vZGVsID09IFBIWV9NT0RFTF9SRUFMVEVLXzgyMDEpIHsKKwkJCWlmIChucC0+ZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8zMiB8fAorCQkJICAgIG5wLT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzMzIHx8CisJCQkgICAgbnAtPmRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMzQgfHwKKwkJCSAgICBucC0+ZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8zNSB8fAorCQkJICAgIG5wLT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzM2IHx8CisJCQkgICAgbnAtPmRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMzcgfHwKKwkJCSAgICBucC0+ZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8zOCB8fAorCQkJICAgIG5wLT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzM5KSB7CisJCQkJcGh5X3Jlc2VydmVkID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9SRUFMVEVLX0lOSVRfUkVHNiwgTUlJX1JFQUQpOworCQkJCXBoeV9yZXNlcnZlZCB8PSBQSFlfUkVBTFRFS19JTklUNzsKKwkJCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9SRUFMVEVLX0lOSVRfUkVHNiwgcGh5X3Jlc2VydmVkKSkgeworCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJCQl9CisJCQl9CiAJCX0KIAl9CiAKQEAgLTEyMzYsMjYgKzEzMDAsNzEgQEAKIAkJfQogCX0KIAlpZiAobnAtPnBoeV9vdWkgPT0gUEhZX09VSV9SRUFMVEVLKSB7Ci0JCS8qIHJlc2V0IGNvdWxkIGhhdmUgY2xlYXJlZCB0aGVzZSBvdXQsIHNldCB0aGVtIGJhY2sgKi8KLQkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzEsIFBIWV9SRUFMVEVLX0lOSVQxKSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7Ci0JCQlyZXR1cm4gUEhZX0VSUk9SOworCQlpZiAobnAtPnBoeV9tb2RlbCA9PSBQSFlfTU9ERUxfUkVBTFRFS184MjExICYmCisJCSAgICBucC0+cGh5X3JldiA9PSBQSFlfUkVWX1JFQUxURUtfODIxMUIpIHsKKwkJCS8qIHJlc2V0IGNvdWxkIGhhdmUgY2xlYXJlZCB0aGVzZSBvdXQsIHNldCB0aGVtIGJhY2sgKi8KKwkJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcxLCBQSFlfUkVBTFRFS19JTklUMSkpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCQlyZXR1cm4gUEhZX0VSUk9SOworCQkJfQorCQkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzIsIFBIWV9SRUFMVEVLX0lOSVQyKSkgeworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJCXJldHVybiBQSFlfRVJST1I7CisJCQl9CisJCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9SRUFMVEVLX0lOSVRfUkVHMSwgUEhZX1JFQUxURUtfSU5JVDMpKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJCX0KKwkJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUczLCBQSFlfUkVBTFRFS19JTklUNCkpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCQlyZXR1cm4gUEhZX0VSUk9SOworCQkJfQorCQkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzQsIFBIWV9SRUFMVEVLX0lOSVQ1KSkgeworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJCXJldHVybiBQSFlfRVJST1I7CisJCQl9CisJCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9SRUFMVEVLX0lOSVRfUkVHNSwgUEhZX1JFQUxURUtfSU5JVDYpKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJCX0KKwkJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcxLCBQSFlfUkVBTFRFS19JTklUMSkpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCQlyZXR1cm4gUEhZX0VSUk9SOworCQkJfQogCQl9Ci0JCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcyLCBQSFlfUkVBTFRFS19JTklUMikpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOwotCQkJcmV0dXJuIFBIWV9FUlJPUjsKLQkJfQotCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9SRUFMVEVLX0lOSVRfUkVHMSwgUEhZX1JFQUxURUtfSU5JVDMpKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKLQkJCXJldHVybiBQSFlfRVJST1I7Ci0JCX0KLQkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzMsIFBIWV9SRUFMVEVLX0lOSVQ0KSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7Ci0JCQlyZXR1cm4gUEhZX0VSUk9SOwotCQl9Ci0JCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcxLCBQSFlfUkVBTFRFS19JTklUMSkpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOwotCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJaWYgKG5wLT5waHlfbW9kZWwgPT0gUEhZX01PREVMX1JFQUxURUtfODIwMSkgeworCQkJaWYgKG5wLT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzMyIHx8CisJCQkgICAgbnAtPmRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMzMgfHwKKwkJCSAgICBucC0+ZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8zNCB8fAorCQkJICAgIG5wLT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzM1IHx8CisJCQkgICAgbnAtPmRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMzYgfHwKKwkJCSAgICBucC0+ZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8zNyB8fAorCQkJICAgIG5wLT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzM4IHx8CisJCQkgICAgbnAtPmRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMzkpIHsKKwkJCQlwaHlfcmVzZXJ2ZWQgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUc2LCBNSUlfUkVBRCk7CisJCQkJcGh5X3Jlc2VydmVkIHw9IFBIWV9SRUFMVEVLX0lOSVQ3OworCQkJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUc2LCBwaHlfcmVzZXJ2ZWQpKSB7CisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJCQlyZXR1cm4gUEhZX0VSUk9SOworCQkJCX0KKwkJCX0KKwkJCWlmIChwaHlfY3Jvc3MgPT0gTlZfQ1JPU1NPVkVSX0RFVEVDVElPTl9ESVNBQkxFRCkgeworCQkJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcxLCBQSFlfUkVBTFRFS19JTklUMykpIHsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQkJCXJldHVybiBQSFlfRVJST1I7CisJCQkJfQorCQkJCXBoeV9yZXNlcnZlZCA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzIsIE1JSV9SRUFEKTsKKwkJCQlwaHlfcmVzZXJ2ZWQgJj0gflBIWV9SRUFMVEVLX0lOSVRfTVNLMTsKKwkJCQlwaHlfcmVzZXJ2ZWQgfD0gUEhZX1JFQUxURUtfSU5JVDM7CisJCQkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzIsIHBoeV9yZXNlcnZlZCkpIHsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQkJCXJldHVybiBQSFlfRVJST1I7CisJCQkJfQorCQkJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcxLCBQSFlfUkVBTFRFS19JTklUMSkpIHsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQkJCXJldHVybiBQSFlfRVJST1I7CisJCQkJfQorCQkJfQogCQl9CiAJfQogCkBAIC0xNzY5LDYgKzE4NzgsMTE1IEBACiAJcmV0dXJuICh1MzIpKG5wLT50eF9yaW5nX3NpemUgLSAoKG5wLT50eF9yaW5nX3NpemUgKyAobnAtPnB1dF90eF9jdHggLSBucC0+Z2V0X3R4X2N0eCkpICUgbnAtPnR4X3Jpbmdfc2l6ZSkpOwogfQogCitzdGF0aWMgdm9pZCBudl9sZWdhY3liYWNrb2ZmX3Jlc2VlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXU4IF9faW9tZW0gKmJhc2UgPSBnZXRfaHdiYXNlKGRldik7CisJdTMyIHJlZzsKKwl1MzIgbG93OworCWludCB0eF9zdGF0dXMgPSAwOworCisJcmVnID0gcmVhZGwoYmFzZSArIE52UmVnU2xvdFRpbWUpICYgfk5WUkVHX1NMT1RUSU1FX01BU0s7CisJZ2V0X3JhbmRvbV9ieXRlcygmbG93LCBzaXplb2YobG93KSk7CisJcmVnIHw9IGxvdyAmIE5WUkVHX1NMT1RUSU1FX01BU0s7CisKKwkvKiBOZWVkIHRvIHN0b3AgdHggYmVmb3JlIGNoYW5nZSB0YWtlcyBlZmZlY3QuCisJICogQ2FsbGVyIGhhcyBhbHJlYWR5IGdhaW5lZCBucC0+bG9jay4KKwkgKi8KKwl0eF9zdGF0dXMgPSByZWFkbChiYXNlICsgTnZSZWdUcmFuc21pdHRlckNvbnRyb2wpICYgTlZSRUdfWE1JVENUTF9TVEFSVDsKKwlpZiAodHhfc3RhdHVzKQorCQludl9zdG9wX3R4KGRldik7CisJbnZfc3RvcF9yeChkZXYpOworCXdyaXRlbChyZWcsIGJhc2UgKyBOdlJlZ1Nsb3RUaW1lKTsKKwlpZiAodHhfc3RhdHVzKQorCQludl9zdGFydF90eChkZXYpOworCW52X3N0YXJ0X3J4KGRldik7Cit9CisKKy8qIEdlYXIgQmFja29mZiBTZWVkcyAqLworI2RlZmluZSBCQUNLT0ZGX1NFRURTRVRfUk9XUwk4CisjZGVmaW5lIEJBQ0tPRkZfU0VFRFNFVF9MRlNSUwkxNQorCisvKiBLbm93biBHb29kIHNlZWQgc2V0cyAqLworc3RhdGljIGNvbnN0IHUzMiBtYWluX3NlZWRzZXRbQkFDS09GRl9TRUVEU0VUX1JPV1NdW0JBQ0tPRkZfU0VFRFNFVF9MRlNSU10gPSB7CisgICAgezE0NSwgMTU1LCAxNjUsIDE3NSwgMTg1LCAxOTYsIDIzNSwgMjQ1LCAyNTUsIDI2NSwgMjc1LCAyODUsIDY2MCwgNjkwLCA4NzR9LAorICAgIHsyNDUsIDI1NSwgMjY1LCA1NzUsIDM4NSwgMjk4LCAzMzUsIDM0NSwgMzU1LCAzNjYsIDM3NSwgMzg1LCA3NjEsIDc5MCwgOTc0fSwKKyAgICB7MTQ1LCAxNTUsIDE2NSwgMTc1LCAxODUsIDE5NiwgMjM1LCAyNDUsIDI1NSwgMjY1LCAyNzUsIDI4NSwgNjYwLCA2OTAsIDg3NH0sCisgICAgezI0NSwgMjU1LCAyNjUsIDU3NSwgMzg1LCAyOTgsIDMzNSwgMzQ1LCAzNTUsIDM2NiwgMzc1LCAzODYsIDc2MSwgNzkwLCA5NzR9LAorICAgIHsyNjYsIDI2NSwgMjc2LCA1ODUsIDM5NywgMjA4LCAzNDUsIDM1NSwgMzY1LCAzNzYsIDM4NSwgMzk2LCA3NzEsIDcwMCwgOTg0fSwKKyAgICB7MjY2LCAyNjUsIDI3NiwgNTg2LCAzOTcsIDIwOCwgMzQ2LCAzNTUsIDM2NSwgMzc2LCAyODUsIDM5NiwgNzcxLCA3MDAsIDk4NH0sCisgICAgezM2NiwgMzY1LCAzNzYsIDY4NiwgNDk3LCAzMDgsIDQ0NywgNDU1LCA0NjYsIDQ3NiwgNDg1LCA0OTYsIDg3MSwgODAwLCAgODR9LAorICAgIHs0NjYsIDQ2NSwgNDc2LCA3ODYsIDU5NywgNDA4LCA1NDcsIDU1NSwgNTY2LCA1NzYsIDU4NSwgNTk3LCA5NzEsIDkwMCwgMTg0fX07CisKK3N0YXRpYyBjb25zdCB1MzIgZ2Vhcl9zZWVkc2V0W0JBQ0tPRkZfU0VFRFNFVF9ST1dTXVtCQUNLT0ZGX1NFRURTRVRfTEZTUlNdID0geworICAgIHsyNTEsIDI2MiwgMjczLCAzMjQsIDMxOSwgNTA4LCAzNzUsIDM2NCwgMzQxLCAzNzEsIDM5OCwgMTkzLCAzNzUsICAzMCwgMjk1fSwKKyAgICB7MzUxLCAzNzUsIDM3MywgNDY5LCA1NTEsIDYzOSwgNDc3LCA0NjQsIDQ0MSwgNDcyLCA0OTgsIDI5MywgNDc2LCAxMzAsIDM5NX0sCisgICAgezM1MSwgMzc1LCAzNzMsIDQ2OSwgNTUxLCA2MzksIDQ3NywgNDY0LCA0NDEsIDQ3MiwgNDk4LCAyOTMsIDQ3NiwgMTMwLCAzOTd9LAorICAgIHsyNTEsIDI2MiwgMjczLCAzMjQsIDMxOSwgNTA4LCAzNzUsIDM2NCwgMzQxLCAzNzEsIDM5OCwgMTkzLCAzNzUsICAzMCwgMjk1fSwKKyAgICB7MjUxLCAyNjIsIDI3MywgMzI0LCAzMTksIDUwOCwgMzc1LCAzNjQsIDM0MSwgMzcxLCAzOTgsIDE5MywgMzc1LCAgMzAsIDI5NX0sCisgICAgezM1MSwgMzc1LCAzNzMsIDQ2OSwgNTUxLCA2MzksIDQ3NywgNDY0LCA0NDEsIDQ3MiwgNDk4LCAyOTMsIDQ3NiwgMTMwLCAzOTV9LAorICAgIHszNTEsIDM3NSwgMzczLCA0NjksIDU1MSwgNjM5LCA0NzcsIDQ2NCwgNDQxLCA0NzIsIDQ5OCwgMjkzLCA0NzYsIDEzMCwgMzk1fSwKKyAgICB7MzUxLCAzNzUsIDM3MywgNDY5LCA1NTEsIDYzOSwgNDc3LCA0NjQsIDQ0MSwgNDcyLCA0OTgsIDI5MywgNDc2LCAxMzAsIDM5NX19OworCitzdGF0aWMgdm9pZCBudl9nZWFyX2JhY2tvZmZfcmVzZWVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTggX19pb21lbSAqYmFzZSA9IGdldF9od2Jhc2UoZGV2KTsKKwl1MzIgbWluaXNlZWQxLCBtaW5pc2VlZDIsIG1pbmlzZWVkMl9yZXZlcnNlZCwgbWluaXNlZWQzLCBtaW5pc2VlZDNfcmV2ZXJzZWQ7CisJdTMyIHRlbXAsIHNlZWRzZXQsIGNvbWJpbmVkU2VlZDsKKwlpbnQgaTsKKworCS8qIFNldHVwIHNlZWQgZm9yIGZyZWUgcnVubmluZyBMRlNSICovCisJLyogV2UgYXJlIGdvaW5nIHRvIHJlYWQgdGhlIHRpbWUgc3RhbXAgY291bnRlciAzIHRpbWVzCisJICAgYW5kIHN3aXp6bGUgYml0cyBhcm91bmQgdG8gaW5jcmVhc2UgcmFuZG9tbmVzcyAqLworCWdldF9yYW5kb21fYnl0ZXMoJm1pbmlzZWVkMSwgc2l6ZW9mKG1pbmlzZWVkMSkpOworCW1pbmlzZWVkMSAmPSAweDBmZmY7CisJaWYgKG1pbmlzZWVkMSA9PSAwKQorCQltaW5pc2VlZDEgPSAweGFiYzsKKworCWdldF9yYW5kb21fYnl0ZXMoJm1pbmlzZWVkMiwgc2l6ZW9mKG1pbmlzZWVkMikpOworCW1pbmlzZWVkMiAmPSAweDBmZmY7CisJaWYgKG1pbmlzZWVkMiA9PSAwKQorCQltaW5pc2VlZDIgPSAweGFiYzsKKwltaW5pc2VlZDJfcmV2ZXJzZWQgPQorCQkoKG1pbmlzZWVkMiAmIDB4RjAwKSA+PiA4KSB8CisJCSAobWluaXNlZWQyICYgMHgwRjApIHwKKwkJICgobWluaXNlZWQyICYgMHgwMEYpIDw8IDgpOworCisJZ2V0X3JhbmRvbV9ieXRlcygmbWluaXNlZWQzLCBzaXplb2YobWluaXNlZWQzKSk7CisJbWluaXNlZWQzICY9IDB4MGZmZjsKKwlpZiAobWluaXNlZWQzID09IDApCisJCW1pbmlzZWVkMyA9IDB4YWJjOworCW1pbmlzZWVkM19yZXZlcnNlZCA9CisJCSgobWluaXNlZWQzICYgMHhGMDApID4+IDgpIHwKKwkJIChtaW5pc2VlZDMgJiAweDBGMCkgfAorCQkgKChtaW5pc2VlZDMgJiAweDAwRikgPDwgOCk7CisKKwljb21iaW5lZFNlZWQgPSAoKG1pbmlzZWVkMSBeIG1pbmlzZWVkMl9yZXZlcnNlZCkgPDwgMTIpIHwKKwkJICAgICAgIChtaW5pc2VlZDIgXiBtaW5pc2VlZDNfcmV2ZXJzZWQpOworCisJLyogU2VlZHMgY2FuIG5vdCBiZSB6ZXJvICovCisJaWYgKChjb21iaW5lZFNlZWQgJiBOVlJFR19CS09GRkNUUkxfU0VFRF9NQVNLKSA9PSAwKQorCQljb21iaW5lZFNlZWQgfD0gMHgwODsKKwlpZiAoKGNvbWJpbmVkU2VlZCAmIChOVlJFR19CS09GRkNUUkxfU0VFRF9NQVNLIDw8IE5WUkVHX0JLT0ZGQ1RSTF9HRUFSKSkgPT0gMCkKKwkJY29tYmluZWRTZWVkIHw9IDB4ODAwMDsKKworCS8qIE5vIG5lZWQgdG8gZGlzYWJsZSB0eCBoZXJlICovCisJdGVtcCA9IE5WUkVHX0JLT0ZGQ1RSTF9ERUZBVUxUIHwgKDAgPDwgTlZSRUdfQktPRkZDVFJMX1NFTEVDVCk7CisJdGVtcCB8PSBjb21iaW5lZFNlZWQgJiBOVlJFR19CS09GRkNUUkxfU0VFRF9NQVNLOworCXRlbXAgfD0gY29tYmluZWRTZWVkID4+IE5WUkVHX0JLT0ZGQ1RSTF9HRUFSOworCXdyaXRlbCh0ZW1wLGJhc2UgKyBOdlJlZ0JhY2tPZmZDb250cm9sKTsKKworICAgIAkvKiBTZXR1cCBzZWVkcyBmb3IgYWxsIGdlYXIgTEZTUnMuICovCisJZ2V0X3JhbmRvbV9ieXRlcygmc2VlZHNldCwgc2l6ZW9mKHNlZWRzZXQpKTsKKwlzZWVkc2V0ID0gc2VlZHNldCAlIEJBQ0tPRkZfU0VFRFNFVF9ST1dTOworCWZvciAoaSA9IDE7IGkgPD0gQkFDS09GRl9TRUVEU0VUX0xGU1JTOyBpKyspCisJeworCQl0ZW1wID0gTlZSRUdfQktPRkZDVFJMX0RFRkFVTFQgfCAoaSA8PCBOVlJFR19CS09GRkNUUkxfU0VMRUNUKTsKKwkJdGVtcCB8PSBtYWluX3NlZWRzZXRbc2VlZHNldF1baS0xXSAmIDB4M2ZmOworCQl0ZW1wIHw9ICgoZ2Vhcl9zZWVkc2V0W3NlZWRzZXRdW2ktMV0gJiAweDNmZikgPDwgTlZSRUdfQktPRkZDVFJMX0dFQVIpOworCQl3cml0ZWwodGVtcCwgYmFzZSArIE52UmVnQmFja09mZkNvbnRyb2wpOworCX0KK30KKwogLyoKICAqIG52X3N0YXJ0X3htaXQ6IGRldi0+aGFyZF9zdGFydF94bWl0IGZ1bmN0aW9uCiAgKiBDYWxsZWQgd2l0aCBuZXRpZl90eF9sb2NrIGhlbGQuCkBAIC0yMDg4LDYgKzIzMDYsOCBAQAogCQkJCQkJZGV2LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOwogCQkJCQlpZiAoZmxhZ3MgJiBOVl9UWF9DQVJSSUVSTE9TVCkKIAkJCQkJCWRldi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCQkJaWYgKChmbGFncyAmIE5WX1RYX1JFVFJZRVJST1IpICYmICEoZmxhZ3MgJiBOVl9UWF9SRVRSWUNPVU5UX01BU0spKQorCQkJCQkJbnZfbGVnYWN5YmFja29mZl9yZXNlZWQoZGV2KTsKIAkJCQkJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAkJCQl9IGVsc2UgewogCQkJCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKQEAgLTIxMDMsNiArMjMyMyw4IEBACiAJCQkJCQlkZXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CiAJCQkJCWlmIChmbGFncyAmIE5WX1RYMl9DQVJSSUVSTE9TVCkKIAkJCQkJCWRldi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCQkJaWYgKChmbGFncyAmIE5WX1RYMl9SRVRSWUVSUk9SKSAmJiAhKGZsYWdzICYgTlZfVFgyX1JFVFJZQ09VTlRfTUFTSykpCisJCQkJCQludl9sZWdhY3liYWNrb2ZmX3Jlc2VlZChkZXYpOwogCQkJCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCQkJCX0gZWxzZSB7CiAJCQkJCWRldi0+c3RhdHMudHhfcGFja2V0cysrOwpAQCAtMjE0NCw2ICsyMzY2LDE1IEBACiAJCWlmIChmbGFncyAmIE5WX1RYMl9MQVNUUEFDS0VUKSB7CiAJCQlpZiAoIShmbGFncyAmIE5WX1RYMl9FUlJPUikpCiAJCQkJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQllbHNlIHsKKwkJCQlpZiAoKGZsYWdzICYgTlZfVFgyX1JFVFJZRVJST1IpICYmICEoZmxhZ3MgJiBOVl9UWDJfUkVUUllDT1VOVF9NQVNLKSkgeworCQkJCQlpZiAobnAtPmRyaXZlcl9kYXRhICYgREVWX0hBU19HRUFSX01PREUpCisJCQkJCQludl9nZWFyX2JhY2tvZmZfcmVzZWVkKGRldik7CisJCQkJCWVsc2UKKwkJCQkJCW52X2xlZ2FjeWJhY2tvZmZfcmVzZWVkKGRldik7CisJCQkJfQorCQkJfQorCiAJCQlkZXZfa2ZyZWVfc2tiX2FueShucC0+Z2V0X3R4X2N0eC0+c2tiKTsKIAkJCW5wLT5nZXRfdHhfY3R4LT5za2IgPSBOVUxMOwogCkBAIC0yOTA1LDE1ICszMTM2LDE0IEBACiAJfQogCiAJaWYgKG5wLT5naWdhYml0ID09IFBIWV9HSUdBQklUKSB7Ci0JCXBoeXJlZyA9IHJlYWRsKGJhc2UgKyBOdlJlZ1JhbmRvbVNlZWQpOworCQlwaHlyZWcgPSByZWFkbChiYXNlICsgTnZSZWdTbG90VGltZSk7CiAJCXBoeXJlZyAmPSB+KDB4M0ZGMDApOwotCQlpZiAoKG5wLT5saW5rc3BlZWQgJiAweEZGRikgPT0gTlZSRUdfTElOS1NQRUVEXzEwKQotCQkJcGh5cmVnIHw9IE5WUkVHX1JORFNFRURfRk9SQ0UzOwotCQllbHNlIGlmICgobnAtPmxpbmtzcGVlZCAmIDB4RkZGKSA9PSBOVlJFR19MSU5LU1BFRURfMTAwKQotCQkJcGh5cmVnIHw9IE5WUkVHX1JORFNFRURfRk9SQ0UyOworCQlpZiAoKChucC0+bGlua3NwZWVkICYgMHhGRkYpID09IE5WUkVHX0xJTktTUEVFRF8xMCkgfHwKKwkJICAgICgobnAtPmxpbmtzcGVlZCAmIDB4RkZGKSA9PSBOVlJFR19MSU5LU1BFRURfMTAwKSkKKwkJCXBoeXJlZyB8PSBOVlJFR19TTE9UVElNRV8xMF8xMDBfRlVMTDsKIAkJZWxzZSBpZiAoKG5wLT5saW5rc3BlZWQgJiAweEZGRikgPT0gTlZSRUdfTElOS1NQRUVEXzEwMDApCi0JCQlwaHlyZWcgfD0gTlZSRUdfUk5EU0VFRF9GT1JDRTsKLQkJd3JpdGVsKHBoeXJlZywgYmFzZSArIE52UmVnUmFuZG9tU2VlZCk7CisJCQlwaHlyZWcgfD0gTlZSRUdfU0xPVFRJTUVfMTAwMF9GVUxMOworCQl3cml0ZWwocGh5cmVnLCBiYXNlICsgTnZSZWdTbG90VGltZSk7CiAJfQogCiAJcGh5cmVnID0gcmVhZGwoYmFzZSArIE52UmVnUGh5SW50ZXJmYWNlKTsKQEAgLTQ4NDMsNiArNTA3Myw3IEBACiAJdTggX19pb21lbSAqYmFzZSA9IGdldF9od2Jhc2UoZGV2KTsKIAlpbnQgcmV0ID0gMTsKIAlpbnQgb29tLCBpOworCXUzMiBsb3c7CiAKIAlkcHJpbnRrKEtFUk5fREVCVUcgIm52X29wZW46IGJlZ2luXG4iKTsKIApAQCAtNDkwMiw4ICs1MTMzLDIwIEBACiAJd3JpdGVsKG5wLT5yeF9idWZfc3osIGJhc2UgKyBOdlJlZ09mZmxvYWRDb25maWcpOwogCiAJd3JpdGVsKHJlYWRsKGJhc2UgKyBOdlJlZ1JlY2VpdmVyU3RhdHVzKSwgYmFzZSArIE52UmVnUmVjZWl2ZXJTdGF0dXMpOwotCWdldF9yYW5kb21fYnl0ZXMoJmksIHNpemVvZihpKSk7Ci0Jd3JpdGVsKE5WUkVHX1JORFNFRURfRk9SQ0UgfCAoaSZOVlJFR19STkRTRUVEX01BU0spLCBiYXNlICsgTnZSZWdSYW5kb21TZWVkKTsKKworCWdldF9yYW5kb21fYnl0ZXMoJmxvdywgc2l6ZW9mKGxvdykpOworCWxvdyAmPSBOVlJFR19TTE9UVElNRV9NQVNLOworCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSkgeworCQl3cml0ZWwobG93fE5WUkVHX1NMT1RUSU1FX0RFRkFVTFQsIGJhc2UgKyBOdlJlZ1Nsb3RUaW1lKTsKKwl9IGVsc2UgeworCQlpZiAoIShucC0+ZHJpdmVyX2RhdGEgJiBERVZfSEFTX0dFQVJfTU9ERSkpIHsKKwkJCS8qIHNldHVwIGxlZ2FjeSBiYWNrb2ZmICovCisJCQl3cml0ZWwoTlZSRUdfU0xPVFRJTUVfTEVHQkZfRU5BQkxFRHxOVlJFR19TTE9UVElNRV8xMF8xMDBfRlVMTHxsb3csIGJhc2UgKyBOdlJlZ1Nsb3RUaW1lKTsKKwkJfSBlbHNlIHsKKwkJCXdyaXRlbChOVlJFR19TTE9UVElNRV8xMF8xMDBfRlVMTCwgYmFzZSArIE52UmVnU2xvdFRpbWUpOworCQkJbnZfZ2Vhcl9iYWNrb2ZmX3Jlc2VlZChkZXYpOworCQl9CisJfQogCXdyaXRlbChOVlJFR19UWF9ERUZFUlJBTF9ERUZBVUxULCBiYXNlICsgTnZSZWdUeERlZmVycmFsKTsKIAl3cml0ZWwoTlZSRUdfUlhfREVGRVJSQUxfREVGQVVMVCwgYmFzZSArIE52UmVnUnhEZWZlcnJhbCk7CiAJaWYgKHBvbGxfaW50ZXJ2YWwgPT0gLTEpIHsKQEAgLTUxMTAsNiArNTM1Myw4IEBACiAKIAkvKiBjb3B5IG9mIGRyaXZlciBkYXRhICovCiAJbnAtPmRyaXZlcl9kYXRhID0gaWQtPmRyaXZlcl9kYXRhOworCS8qIGNvcHkgb2YgZGV2aWNlIGlkICovCisJbnAtPmRldmljZV9pZCA9IGlkLT5kZXZpY2U7CiAKIAkvKiBoYW5kbGUgZGlmZmVyZW50IGRlc2NyaXB0b3IgdmVyc2lvbnMgKi8KIAlpZiAoaWQtPmRyaXZlcl9kYXRhICYgREVWX0hBU19ISUdIX0RNQSkgewpAQCAtNTM5OSw2ICs1NjQ0LDE0IEBACiAJCQlwY2lfbmFtZShwY2lfZGV2KSwgaWQxLCBpZDIsIHBoeWFkZHIpOwogCQlucC0+cGh5YWRkciA9IHBoeWFkZHI7CiAJCW5wLT5waHlfb3VpID0gaWQxIHwgaWQyOworCisJCS8qIFJlYWx0ZWsgaGFyZGNvZGVkIHBoeSBpZDEgdG8gYWxsIHplcm8ncyBvbiBjZXJ0YWluIHBoeXMgKi8KKwkJaWYgKG5wLT5waHlfb3VpID09IFBIWV9PVUlfUkVBTFRFSzIpCisJCQlucC0+cGh5X291aSA9IFBIWV9PVUlfUkVBTFRFSzsKKwkJLyogU2V0dXAgcGh5IHJldmlzaW9uIGZvciBSZWFsdGVrICovCisJCWlmIChucC0+cGh5X291aSA9PSBQSFlfT1VJX1JFQUxURUsgJiYgbnAtPnBoeV9tb2RlbCA9PSBQSFlfTU9ERUxfUkVBTFRFS184MjExKQorCQkJbnAtPnBoeV9yZXYgPSBtaWlfcncoZGV2LCBwaHlhZGRyLCBNSUlfUkVTVjEsIE1JSV9SRUFEKSAmIFBIWV9SRVZfTUFTSzsKKwogCQlicmVhazsKIAl9CiAJaWYgKGkgPT0gMzMpIHsKQEAgLTU0NzcsNiArNTczMCwyOCBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyB2b2lkIG52X3Jlc3RvcmVfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MTYgcGh5X3Jlc2VydmVkLCBtaWlfY29udHJvbDsKKworCWlmIChucC0+cGh5X291aSA9PSBQSFlfT1VJX1JFQUxURUsgJiYKKwkgICAgbnAtPnBoeV9tb2RlbCA9PSBQSFlfTU9ERUxfUkVBTFRFS184MjAxICYmCisJICAgIHBoeV9jcm9zcyA9PSBOVl9DUk9TU09WRVJfREVURUNUSU9OX0RJU0FCTEVEKSB7CisJCW1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzEsIFBIWV9SRUFMVEVLX0lOSVQzKTsKKwkJcGh5X3Jlc2VydmVkID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9SRUFMVEVLX0lOSVRfUkVHMiwgTUlJX1JFQUQpOworCQlwaHlfcmVzZXJ2ZWQgJj0gflBIWV9SRUFMVEVLX0lOSVRfTVNLMTsKKwkJcGh5X3Jlc2VydmVkIHw9IFBIWV9SRUFMVEVLX0lOSVQ4OworCQltaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcyLCBwaHlfcmVzZXJ2ZWQpOworCQltaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcxLCBQSFlfUkVBTFRFS19JTklUMSk7CisKKwkJLyogcmVzdGFydCBhdXRvIG5lZ290aWF0aW9uICovCisJCW1paV9jb250cm9sID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9CTUNSLCBNSUlfUkVBRCk7CisJCW1paV9jb250cm9sIHw9IChCTUNSX0FOUkVTVEFSVCB8IEJNQ1JfQU5FTkFCTEUpOworCQltaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0JNQ1IsIG1paV9jb250cm9sKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBudl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKQEAgLTU0OTMsNiArNTc2OCw5IEBACiAJd3JpdGVsKHJlYWRsKGJhc2UgKyBOdlJlZ1RyYW5zbWl0UG9sbCkgJiB+TlZSRUdfVFJBTlNNSVRQT0xMX01BQ19BRERSX1JFViwKIAkgICAgICAgYmFzZSArIE52UmVnVHJhbnNtaXRQb2xsKTsKIAorCS8qIHJlc3RvcmUgYW55IHBoeSByZWxhdGVkIGNoYW5nZXMgKi8KKwludl9yZXN0b3JlX3BoeShkZXYpOworCiAJLyogZnJlZSBhbGwgc3RydWN0dXJlcyAqLwogCWZyZWVfcmluZ3MoZGV2KTsKIAlpb3VubWFwKGdldF9od2Jhc2UoZGV2KSk7CkBAIC01NjMyLDgzICs1OTEwLDgzIEBACiAJfSwKIAl7CS8qIE1DUDY1IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzIwKSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfTEFSR0VERVNDfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjF8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfTkVFRF9UWF9MSU1JVHxERVZfTkVFRF9UWF9MSU1JVCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfTEFSR0VERVNDfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjF8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfTkVFRF9UWF9MSU1JVHxERVZfTkVFRF9UWF9MSU1JVHxERVZfSEFTX0dFQVJfTU9ERSwKIAl9LAogCXsJLyogTUNQNjUgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjEpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WMXxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9ORUVEX1RYX0xJTUlULAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WMXxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9ORUVEX1RYX0xJTUlUfERFVl9IQVNfR0VBUl9NT0RFLAogCX0sCiAJewkvKiBNQ1A2NSBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8yMiksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0xBUkdFREVTQ3xERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YxfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX05FRURfVFhfTElNSVQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0xBUkdFREVTQ3xERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YxfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX05FRURfVFhfTElNSVR8REVWX0hBU19HRUFSX01PREUsCiAJfSwKIAl7CS8qIE1DUDY1IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzIzKSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfTEFSR0VERVNDfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjF8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfTkVFRF9UWF9MSU1JVCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfTEFSR0VERVNDfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjF8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfTkVFRF9UWF9MSU1JVHxERVZfSEFTX0dFQVJfTU9ERSwKIAl9LAogCXsJLyogTUNQNjcgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjQpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WMXxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WMXxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9IQVNfR0VBUl9NT0RFLAogCX0sCiAJewkvKiBNQ1A2NyBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8yNSksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YxfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFIsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YxfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX0hBU19HRUFSX01PREUsCiAJfSwKIAl7CS8qIE1DUDY3IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzI2KSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjF8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUiwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjF8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfSEFTX0dFQVJfTU9ERSwKIAl9LAogCXsJLyogTUNQNjcgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjcpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WMXxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WMXxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9IQVNfR0VBUl9NT0RFLAogCX0sCiAJewkvKiBNQ1A3MyBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8yOCksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YxfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX0hBU19DT0xMSVNJT05fRklYLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WMXxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9IQVNfQ09MTElTSU9OX0ZJWHxERVZfSEFTX0dFQVJfTU9ERSwKIAl9LAogCXsJLyogTUNQNzMgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjkpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WMXxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9IQVNfQ09MTElTSU9OX0ZJWCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjF8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfSEFTX0NPTExJU0lPTl9GSVh8REVWX0hBU19HRUFSX01PREUsCiAJfSwKIAl7CS8qIE1DUDczIEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzMwKSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjF8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfSEFTX0NPTExJU0lPTl9GSVgsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YxfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX0hBU19DT0xMSVNJT05fRklYfERFVl9IQVNfR0VBUl9NT0RFLAogCX0sCiAJewkvKiBNQ1A3MyBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8zMSksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YxfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX0hBU19DT0xMSVNJT05fRklYLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WMXxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9IQVNfQ09MTElTSU9OX0ZJWHxERVZfSEFTX0dFQVJfTU9ERSwKIAl9LAogCXsJLyogTUNQNzcgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMzIpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfTVNJfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YyfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX0hBU19DT0xMSVNJT05fRklYfERFVl9ORUVEX1RYX0xJTUlULAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfTVNJfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YyfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX0hBU19DT0xMSVNJT05fRklYfERFVl9ORUVEX1RYX0xJTUlUfERFVl9IQVNfR0VBUl9NT0RFLAogCX0sCiAJewkvKiBNQ1A3NyBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8zMyksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19NU0l8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjJ8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfSEFTX0NPTExJU0lPTl9GSVh8REVWX05FRURfVFhfTElNSVQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19NU0l8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjJ8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfSEFTX0NPTExJU0lPTl9GSVh8REVWX05FRURfVFhfTElNSVR8REVWX0hBU19HRUFSX01PREUsCiAJfSwKIAl7CS8qIE1DUDc3IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzM0KSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfQ0hFQ0tTVU18REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX01TSXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WMnxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9IQVNfQ09MTElTSU9OX0ZJWHxERVZfTkVFRF9UWF9MSU1JVCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfQ0hFQ0tTVU18REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX01TSXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WMnxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9IQVNfQ09MTElTSU9OX0ZJWHxERVZfTkVFRF9UWF9MSU1JVHxERVZfSEFTX0dFQVJfTU9ERSwKIAl9LAogCXsJLyogTUNQNzcgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMzUpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfTVNJfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YyfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX0hBU19DT0xMSVNJT05fRklYfERFVl9ORUVEX1RYX0xJTUlULAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfTVNJfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YyfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX0hBU19DT0xMSVNJT05fRklYfERFVl9ORUVEX1RYX0xJTUlUfERFVl9IQVNfR0VBUl9NT0RFLAogCX0sCiAJewkvKiBNQ1A3OSBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8zNiksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19NU0l8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjN8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfSEFTX0NPTExJU0lPTl9GSVh8REVWX05FRURfVFhfTElNSVQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19NU0l8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjN8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfSEFTX0NPTExJU0lPTl9GSVh8REVWX05FRURfVFhfTElNSVR8REVWX0hBU19HRUFSX01PREUsCiAJfSwKIAl7CS8qIE1DUDc5IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzM3KSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfQ0hFQ0tTVU18REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX01TSXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WM3xERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9IQVNfQ09MTElTSU9OX0ZJWHxERVZfTkVFRF9UWF9MSU1JVCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfQ0hFQ0tTVU18REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX01TSXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WM3xERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9IQVNfQ09MTElTSU9OX0ZJWHxERVZfTkVFRF9UWF9MSU1JVHxERVZfSEFTX0dFQVJfTU9ERSwKIAl9LAogCXsJLyogTUNQNzkgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMzgpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfTVNJfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YzfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX0hBU19DT0xMSVNJT05fRklYfERFVl9ORUVEX1RYX0xJTUlULAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfTVNJfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YzfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX0hBU19DT0xMSVNJT05fRklYfERFVl9ORUVEX1RYX0xJTUlUfERFVl9IQVNfR0VBUl9NT0RFLAogCX0sCiAJewkvKiBNQ1A3OSBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8zOSksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19NU0l8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjN8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfSEFTX0NPTExJU0lPTl9GSVh8REVWX05FRURfVFhfTElNSVQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19NU0l8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjN8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfSEFTX0NPTExJU0lPTl9GSVh8REVWX05FRURfVFhfTElNSVR8REVWX0hBU19HRUFSX01PREUsCiAJfSwKIAl7MCx9LAogfTsKQEAgLTU3NDQsNiArNjAyMiw4IEBACiBNT0RVTEVfUEFSTV9ERVNDKG1zaXgsICJNU0lYIGludGVycnVwdHMgYXJlIGVuYWJsZWQgYnkgc2V0dGluZyB0byAxIGFuZCBkaXNhYmxlZCBieSBzZXR0aW5nIHRvIDAuIik7CiBtb2R1bGVfcGFyYW0oZG1hXzY0Yml0LCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhkbWFfNjRiaXQsICJIaWdoIERNQSBpcyBlbmFibGVkIGJ5IHNldHRpbmcgdG8gMSBhbmQgZGlzYWJsZWQgYnkgc2V0dGluZyB0byAwLiIpOworbW9kdWxlX3BhcmFtKHBoeV9jcm9zcywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocGh5X2Nyb3NzLCAiUGh5IGNyb3Nzb3ZlciBkZXRlY3Rpb24gZm9yIFJlYWx0ZWsgODIwMSBwaHkgaXMgZW5hYmxlZCBieSBzZXR0aW5nIHRvIDEgYW5kIGRpc2FibGVkIGJ5IHNldHRpbmcgdG8gMC4iKTsKIAogTU9EVUxFX0FVVEhPUigiTWFuZnJlZCBTcHJhdWwgPG1hbmZyZWRAY29sb3JmdWxsaWZlLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiUmV2ZXJzZSBFbmdpbmVlcmVkIG5Gb3JjZSBldGhlcm5ldCBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2dpYW5mYXIuYyBiL2RyaXZlcnMvbmV0L2dpYW5mYXIuYwppbmRleCBjOGMzZGY3Li45OWE0Yjk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9naWFuZmFyLmMKKysrIGIvZHJpdmVycy9uZXQvZ2lhbmZhci5jCkBAIC05OCw3ICs5OCw2IEBACiAjaW5jbHVkZSAiZ2lhbmZhcl9taWkuaCIKIAogI2RlZmluZSBUWF9USU1FT1VUICAgICAgKDEqSFopCi0jZGVmaW5lIFNLQl9BTExPQ19USU1FT1VUIDEwMDAwMDAKICN1bmRlZiBCUklFRl9HRkFSX0VSUk9SUwogI3VuZGVmIFZFUkJPU0VfR0ZBUl9FUlJPUlMKIApAQCAtMTE1LDcgKzExNCw5IEBACiBzdGF0aWMgaW50IGdmYXJfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkIGdmYXJfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQgZ2Zhcl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0cnVjdCBza19idWZmICpnZmFyX25ld19za2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHJ4YmQ4ICpiZHApOworc3RydWN0IHNrX2J1ZmYgKmdmYXJfbmV3X3NrYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGdmYXJfbmV3X3J4YmRwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCByeGJkOCAqYmRwLAorCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHN0YXRpYyBpbnQgZ2Zhcl9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50IGdmYXJfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSk7CiBzdGF0aWMgaXJxcmV0dXJuX3QgZ2Zhcl9lcnJvcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwpAQCAtNzgzLDE0ICs3ODQsMjEgQEAKIAogCXJ4YmRwID0gcHJpdi0+cnhfYmRfYmFzZTsKIAlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+cnhfcmluZ19zaXplOyBpKyspIHsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJCXN0cnVjdCBza19idWZmICpza2I7CiAKLQkJcnhiZHAtPnN0YXR1cyA9IDA7CisJCXNrYiA9IGdmYXJfbmV3X3NrYihkZXYpOwogCi0JCXNrYiA9IGdmYXJfbmV3X3NrYihkZXYsIHJ4YmRwKTsKKwkJaWYgKCFza2IpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IGFsbG9jYXRlIFJYIGJ1ZmZlcnNcbiIsCisJCQkJCWRldi0+bmFtZSk7CisKKwkJCWdvdG8gZXJyX3J4YWxsb2NfZmFpbDsKKwkJfQogCiAJCXByaXYtPnJ4X3NrYnVmZltpXSA9IHNrYjsKIAorCQlnZmFyX25ld19yeGJkcChkZXYsIHJ4YmRwLCBza2IpOworCiAJCXJ4YmRwKys7CiAJfQogCkBAIC05MTYsNiArOTI0LDcgQEAKIHR4X2lycV9mYWlsOgogCWZyZWVfaXJxKHByaXYtPmludGVycnVwdEVycm9yLCBkZXYpOwogZXJyX2lycV9mYWlsOgorZXJyX3J4YWxsb2NfZmFpbDoJCiByeF9za2JfZmFpbDoKIAlmcmVlX3NrYl9yZXNvdXJjZXMocHJpdik7CiB0eF9za2JfZmFpbDoKQEAgLTEzMjgsMTggKzEzMzcsMzcgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0cnVjdCBza19idWZmICogZ2Zhcl9uZXdfc2tiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCByeGJkOCAqYmRwKQorc3RhdGljIHZvaWQgZ2Zhcl9uZXdfcnhiZHAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHJ4YmQ4ICpiZHAsCisJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTMyICogc3RhdHVzX2xlbiA9ICh1MzIgKiliZHA7CisJdTE2IGZsYWdzOworCisJYmRwLT5idWZQdHIgPSBkbWFfbWFwX3NpbmdsZSgmZGV2LT5kZXYsIHNrYi0+ZGF0YSwKKwkJCXByaXYtPnJ4X2J1ZmZlcl9zaXplLCBETUFfRlJPTV9ERVZJQ0UpOworCisJZmxhZ3MgPSBSWEJEX0VNUFRZIHwgUlhCRF9JTlRFUlJVUFQ7CisKKwlpZiAoYmRwID09IHByaXYtPnJ4X2JkX2Jhc2UgKyBwcml2LT5yeF9yaW5nX3NpemUgLSAxKQorCQlmbGFncyB8PSBSWEJEX1dSQVA7CisKKwllaWVpbygpOworCisJKnN0YXR1c19sZW4gPSAodTMyKWZsYWdzIDw8IDE2OworfQorCisKK3N0cnVjdCBza19idWZmICogZ2Zhcl9uZXdfc2tiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJdW5zaWduZWQgaW50IGFsaWduYW1vdW50OwogCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwotCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gU0tCX0FMTE9DX1RJTUVPVVQ7CiAKIAkvKiBXZSBoYXZlIHRvIGFsbG9jYXRlIHRoZSBza2IsIHNvIGtlZXAgdHJ5aW5nIHRpbGwgd2Ugc3VjY2VlZCAqLwotCXdoaWxlICgoIXNrYikgJiYgdGltZW91dC0tKQotCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHByaXYtPnJ4X2J1ZmZlcl9zaXplICsgUlhCVUZfQUxJR05NRU5UKTsKKwlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKGRldiwgcHJpdi0+cnhfYnVmZmVyX3NpemUgKyBSWEJVRl9BTElHTk1FTlQpOwogCi0JaWYgKE5VTEwgPT0gc2tiKQorCWlmICghc2tiKQogCQlyZXR1cm4gTlVMTDsKIAogCWFsaWduYW1vdW50ID0gUlhCVUZfQUxJR05NRU5UIC0KQEAgLTEzNTAsMTUgKzEzNzgsNiBAQAogCSAqLwogCXNrYl9yZXNlcnZlKHNrYiwgYWxpZ25hbW91bnQpOwogCi0JYmRwLT5idWZQdHIgPSBkbWFfbWFwX3NpbmdsZSgmZGV2LT5kZXYsIHNrYi0+ZGF0YSwKLQkJCXByaXYtPnJ4X2J1ZmZlcl9zaXplLCBETUFfRlJPTV9ERVZJQ0UpOwotCi0JYmRwLT5sZW5ndGggPSAwOwotCi0JLyogTWFyayB0aGUgYnVmZmVyIGVtcHR5ICovCi0JZWllaW8oKTsKLQliZHAtPnN0YXR1cyB8PSAoUlhCRF9FTVBUWSB8IFJYQkRfSU5URVJSVVBUKTsKLQogCXJldHVybiBza2I7CiB9CiAKQEAgLTE1NDQsMTAgKzE1NjMsMzEgQEAKIAliZHAgPSBwcml2LT5jdXJfcng7CiAKIAl3aGlsZSAoISgoYmRwLT5zdGF0dXMgJiBSWEJEX0VNUFRZKSB8fCAoLS1yeF93b3JrX2xpbWl0IDwgMCkpKSB7CisJCXN0cnVjdCBza19idWZmICpuZXdza2I7CiAJCXJtYigpOworCisJCS8qIEFkZCBhbm90aGVyIHNrYiBmb3IgdGhlIGZ1dHVyZSAqLworCQluZXdza2IgPSBnZmFyX25ld19za2IoZGV2KTsKKwogCQlza2IgPSBwcml2LT5yeF9za2J1ZmZbcHJpdi0+c2tiX2N1cnJ4XTsKIAotCQlpZiAoKGJkcC0+c3RhdHVzICYgUlhCRF9MQVNUKSAmJiAhKGJkcC0+c3RhdHVzICYgUlhCRF9FUlIpKSB7CisJCS8qIFdlIGRyb3AgdGhlIGZyYW1lIGlmIHdlIGZhaWxlZCB0byBhbGxvY2F0ZSBhIG5ldyBidWZmZXIgKi8KKwkJaWYgKHVubGlrZWx5KCFuZXdza2IgfHwgIShiZHAtPnN0YXR1cyAmIFJYQkRfTEFTVCkgfHwKKwkJCQkgYmRwLT5zdGF0dXMgJiBSWEJEX0VSUikpIHsKKwkJCWNvdW50X2Vycm9ycyhiZHAtPnN0YXR1cywgZGV2KTsKKworCQkJaWYgKHVubGlrZWx5KCFuZXdza2IpKQorCQkJCW5ld3NrYiA9IHNrYjsKKworCQkJaWYgKHNrYikgeworCQkJCWRtYV91bm1hcF9zaW5nbGUoJnByaXYtPmRldi0+ZGV2LAorCQkJCQkJYmRwLT5idWZQdHIsCisJCQkJCQlwcml2LT5yeF9idWZmZXJfc2l6ZSwKKwkJCQkJCURNQV9GUk9NX0RFVklDRSk7CisKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJfQorCQl9IGVsc2UgewogCQkJLyogSW5jcmVtZW50IHRoZSBudW1iZXIgb2YgcGFja2V0cyAqLwogCQkJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CiAJCQlob3dtYW55Kys7CkBAIC0xNTU4LDIzICsxNTk4LDE0IEBACiAJCQlnZmFyX3Byb2Nlc3NfZnJhbWUoZGV2LCBza2IsIHBrdF9sZW4pOwogCiAJCQlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47Ci0JCX0gZWxzZSB7Ci0JCQljb3VudF9lcnJvcnMoYmRwLT5zdGF0dXMsIGRldik7Ci0KLQkJCWlmIChza2IpCi0JCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQotCQkJcHJpdi0+cnhfc2tidWZmW3ByaXYtPnNrYl9jdXJyeF0gPSBOVUxMOwogCQl9CiAKIAkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKIAotCQkvKiBDbGVhciB0aGUgc3RhdHVzIGZsYWdzIGZvciB0aGlzIGJ1ZmZlciAqLwotCQliZHAtPnN0YXR1cyAmPSB+UlhCRF9TVEFUUzsKKwkJcHJpdi0+cnhfc2tidWZmW3ByaXYtPnNrYl9jdXJyeF0gPSBuZXdza2I7CiAKLQkJLyogQWRkIGFub3RoZXIgc2tiIGZvciB0aGUgZnV0dXJlICovCi0JCXNrYiA9IGdmYXJfbmV3X3NrYihkZXYsIGJkcCk7Ci0JCXByaXYtPnJ4X3NrYnVmZltwcml2LT5za2JfY3VycnhdID0gc2tiOworCQkvKiBTZXR1cCB0aGUgbmV3IGJkcCAqLworCQlnZmFyX25ld19yeGJkcChkZXYsIGJkcCwgbmV3c2tiKTsKIAogCQkvKiBVcGRhdGUgdG8gdGhlIG5leHQgcG9pbnRlciAqLwogCQlpZiAoYmRwLT5zdGF0dXMgJiBSWEJEX1dSQVApCkBAIC0xNTg0LDkgKzE2MTUsOCBAQAogCiAJCS8qIHVwZGF0ZSB0byBwb2ludCBhdCB0aGUgbmV4dCBza2IgKi8KIAkJcHJpdi0+c2tiX2N1cnJ4ID0KLQkJICAgIChwcml2LT5za2JfY3VycnggKwotCQkgICAgIDEpICYgUlhfUklOR19NT0RfTUFTSyhwcml2LT5yeF9yaW5nX3NpemUpOwotCisJCSAgICAocHJpdi0+c2tiX2N1cnJ4ICsgMSkgJgorCQkgICAgUlhfUklOR19NT0RfTUFTSyhwcml2LT5yeF9yaW5nX3NpemUpOwogCX0KIAogCS8qIFVwZGF0ZSB0aGUgY3VycmVudCByeGJkIHBvaW50ZXIgdG8gYmUgdGhlIG5leHQgb25lICovCkBAIC0yMDAxLDEyICsyMDMxLDE2IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCisvKiB3b3JrIHdpdGggaG90cGx1ZyBhbmQgY29sZHBsdWcgKi8KK01PRFVMRV9BTElBUygicGxhdGZvcm06ZnNsLWdpYW5mYXIiKTsKKwogLyogU3RydWN0dXJlIGZvciBhIGRldmljZSBkcml2ZXIgKi8KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGdmYXJfZHJpdmVyID0gewogCS5wcm9iZSA9IGdmYXJfcHJvYmUsCiAJLnJlbW92ZSA9IGdmYXJfcmVtb3ZlLAogCS5kcml2ZXIJPSB7CiAJCS5uYW1lID0gImZzbC1naWFuZmFyIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL2NvcmUuYyBiL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL2NvcmUuYwppbmRleCAzNzhhMjM5Li41ZDIxMDhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvY29yZS5jCkBAIC00Myw2ICs0Myw4IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2Rjci5oPgorI2luY2x1ZGUgPGFzbS9kY3ItcmVncy5oPgogCiAjaW5jbHVkZSAiY29yZS5oIgogCkBAIC0xMjcsMTAgKzEyOSwzNSBAQAogc3RhdGljIGlubGluZSB2b2lkIGVtYWNfcmVwb3J0X3RpbWVvdXRfZXJyb3Ioc3RydWN0IGVtYWNfaW5zdGFuY2UgKmRldiwKIAkJCQkJICAgICBjb25zdCBjaGFyICplcnJvcikKIHsKLQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCWlmIChlbWFjX2hhc19mZWF0dXJlKGRldiwgRU1BQ19GVFJfNDQwR1hfUEhZX0NMS19GSVggfAorCQkJCSAgRU1BQ19GVFJfNDQwRVBfUEhZX0NMS19GSVgpKQorCQlEQkcoZGV2LCAiJXMiIE5MLCBlcnJvcik7CisJZWxzZSBpZiAobmV0X3JhdGVsaW1pdCgpKQogCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlc1xuIiwgZGV2LT5uZGV2LT5uYW1lLCBlcnJvcik7CiB9CiAKKy8qIEVNQUMgUEhZIGNsb2NrIHdvcmthcm91bmQ6CisgKiA0NDBFUC80NDBHUiBoYXMgbW9yZSBzYW5lIFNEUjBfTUZSIHJlZ2lzdGVyIGltcGxlbWVudGF0aW9uIHRoYW4gNDQwR1gsCisgKiB3aGljaCBhbGxvd3MgY29udHJvbGxpbmcgZWFjaCBFTUFDIGNsb2NrCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlbWFjX3J4X2Nsa190eChzdHJ1Y3QgZW1hY19pbnN0YW5jZSAqZGV2KQoreworI2lmZGVmIENPTkZJR19QUENfRENSX05BVElWRQorCWlmIChlbWFjX2hhc19mZWF0dXJlKGRldiwgRU1BQ19GVFJfNDQwRVBfUEhZX0NMS19GSVgpKQorCQlkY3JpX2NscnNldChTRFIwLCBTRFIwX01GUiwKKwkJCSAgICAwLCBTRFIwX01GUl9FQ1MgPj4gZGV2LT5jZWxsX2luZGV4KTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW1hY19yeF9jbGtfZGVmYXVsdChzdHJ1Y3QgZW1hY19pbnN0YW5jZSAqZGV2KQoreworI2lmZGVmIENPTkZJR19QUENfRENSX05BVElWRQorCWlmIChlbWFjX2hhc19mZWF0dXJlKGRldiwgRU1BQ19GVFJfNDQwRVBfUEhZX0NMS19GSVgpKQorCQlkY3JpX2NscnNldChTRFIwLCBTRFIwX01GUiwKKwkJCSAgICBTRFIwX01GUl9FQ1MgPj4gZGV2LT5jZWxsX2luZGV4LCAwKTsKKyNlbmRpZgorfQorCiAvKiBQSFkgcG9sbGluZyBpbnRlcnZhbHMgKi8KICNkZWZpbmUgUEhZX1BPTExfTElOS19PTglIWgogI2RlZmluZSBQSFlfUE9MTF9MSU5LX09GRgkoSFogLyA1KQpAQCAtNTI0LDcgKzU1MSwxMCBAQAogCQlyeF9zaXplID0gZGV2LT5yeF9maWZvX3NpemVfZ2lnZTsKIAogCQlpZiAoZGV2LT5uZGV2LT5tdHUgPiBFVEhfREFUQV9MRU4pIHsKLQkJCW1yMSB8PSBFTUFDX01SMV9KUFNNOworCQkJaWYgKGVtYWNfaGFzX2ZlYXR1cmUoZGV2LCBFTUFDX0ZUUl9FTUFDNCkpCisJCQkJbXIxIHw9IEVNQUM0X01SMV9KUFNNOworCQkJZWxzZQorCQkJCW1yMSB8PSBFTUFDX01SMV9KUFNNOwogCQkJZGV2LT5zdG9wX3RpbWVvdXQgPSBTVE9QX1RJTUVPVVRfMTAwMF9KVU1CTzsKIAkJfSBlbHNlCiAJCQlkZXYtPnN0b3BfdGltZW91dCA9IFNUT1BfVElNRU9VVF8xMDAwOwpAQCAtNzA4LDcgKzczOCw3IEBACiAJCXJnbWlpX2dldF9tZGlvKGRldi0+cmdtaWlfZGV2LCBkZXYtPnJnbWlpX3BvcnQpOwogCiAJLyogV2FpdCBmb3IgbWFuYWdlbWVudCBpbnRlcmZhY2UgdG8gYmVjb21lIGlkbGUgKi8KLQluID0gMTA7CisJbiA9IDIwOwogCXdoaWxlICghZW1hY19waHlfZG9uZShkZXYsIGluX2JlMzIoJnAtPnN0YWNyKSkpIHsKIAkJdWRlbGF5KDEpOwogCQlpZiAoIS0tbikgewpAQCAtNzMzLDcgKzc2Myw3IEBACiAJb3V0X2JlMzIoJnAtPnN0YWNyLCByKTsKIAogCS8qIFdhaXQgZm9yIHJlYWQgdG8gY29tcGxldGUgKi8KLQluID0gMTAwOworCW4gPSAyMDA7CiAJd2hpbGUgKCFlbWFjX3BoeV9kb25lKGRldiwgKHIgPSBpbl9iZTMyKCZwLT5zdGFjcikpKSkgewogCQl1ZGVsYXkoMSk7CiAJCWlmICghLS1uKSB7CkBAIC03ODAsNyArODEwLDcgQEAKIAkJcmdtaWlfZ2V0X21kaW8oZGV2LT5yZ21paV9kZXYsIGRldi0+cmdtaWlfcG9ydCk7CiAKIAkvKiBXYWl0IGZvciBtYW5hZ2VtZW50IGludGVyZmFjZSB0byBiZSBpZGxlICovCi0JbiA9IDEwOworCW4gPSAyMDsKIAl3aGlsZSAoIWVtYWNfcGh5X2RvbmUoZGV2LCBpbl9iZTMyKCZwLT5zdGFjcikpKSB7CiAJCXVkZWxheSgxKTsKIAkJaWYgKCEtLW4pIHsKQEAgLTgwNiw3ICs4MzYsNyBAQAogCW91dF9iZTMyKCZwLT5zdGFjciwgcik7CiAKIAkvKiBXYWl0IGZvciB3cml0ZSB0byBjb21wbGV0ZSAqLwotCW4gPSAxMDA7CisJbiA9IDIwMDsKIAl3aGlsZSAoIWVtYWNfcGh5X2RvbmUoZGV2LCBpbl9iZTMyKCZwLT5zdGFjcikpKSB7CiAJCXVkZWxheSgxKTsKIAkJaWYgKCEtLW4pIHsKQEAgLTEwOTQsOSArMTEyNCwxMSBAQAogCQlpbnQgbGlua19wb2xsX2ludGVydmFsOwogCQlpZiAoZGV2LT5waHkuZGVmLT5vcHMtPnBvbGxfbGluaygmZGV2LT5waHkpKSB7CiAJCQlkZXYtPnBoeS5kZWYtPm9wcy0+cmVhZF9saW5rKCZkZXYtPnBoeSk7CisJCQllbWFjX3J4X2Nsa19kZWZhdWx0KGRldik7CiAJCQluZXRpZl9jYXJyaWVyX29uKGRldi0+bmRldik7CiAJCQlsaW5rX3BvbGxfaW50ZXJ2YWwgPSBQSFlfUE9MTF9MSU5LX09OOwogCQl9IGVsc2UgeworCQkJZW1hY19yeF9jbGtfdHgoZGV2KTsKIAkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldi0+bmRldik7CiAJCQlsaW5rX3BvbGxfaW50ZXJ2YWwgPSBQSFlfUE9MTF9MSU5LX09GRjsKIAkJfQpAQCAtMTE3NCw2ICsxMjA2LDcgQEAKIAogCWlmIChkZXYtPnBoeS5kZWYtPm9wcy0+cG9sbF9saW5rKCZkZXYtPnBoeSkpIHsKIAkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKGRldi0+bmRldikpIHsKKwkJCWVtYWNfcnhfY2xrX2RlZmF1bHQoZGV2KTsKIAkJCS8qIEdldCBuZXcgbGluayBwYXJhbWV0ZXJzICovCiAJCQlkZXYtPnBoeS5kZWYtPm9wcy0+cmVhZF9saW5rKCZkZXYtPnBoeSk7CiAKQEAgLTExODYsNiArMTIxOSw3IEBACiAJCWxpbmtfcG9sbF9pbnRlcnZhbCA9IFBIWV9QT0xMX0xJTktfT047CiAJfSBlbHNlIHsKIAkJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2LT5uZGV2KSkgeworCQkJZW1hY19yeF9jbGtfdHgoZGV2KTsKIAkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldi0+bmRldik7CiAJCQluZXRpZl90eF9kaXNhYmxlKGRldi0+bmRldik7CiAJCQllbWFjX3JlaW5pdGlhbGl6ZShkZXYpOwpAQCAtMjIzNyw3ICsyMjcxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBlbWFjX29mX2J1c19ub3RpZmllciA9IHsKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZW1hY19vZl9idXNfbm90aWZpZXIgX19kZXZpbml0ZGF0YSA9IHsKIAkubm90aWZpZXJfY2FsbCA9IGVtYWNfb2ZfYnVzX25vdGlmeQogfTsKIApAQCAtMjMzMCw2ICsyMzY0LDE5IEBACiAJZGV2LT5waHkubWRpb19yZWFkID0gZW1hY19tZGlvX3JlYWQ7CiAJZGV2LT5waHkubWRpb193cml0ZSA9IGVtYWNfbWRpb193cml0ZTsKIAorCS8qIEVuYWJsZSBpbnRlcm5hbCBjbG9jayBzb3VyY2UgKi8KKyNpZmRlZiBDT05GSUdfUFBDX0RDUl9OQVRJVkUKKwlpZiAoZW1hY19oYXNfZmVhdHVyZShkZXYsIEVNQUNfRlRSXzQ0MEdYX1BIWV9DTEtfRklYKSkKKwkJZGNyaV9jbHJzZXQoU0RSMCwgU0RSMF9NRlIsIDAsIFNEUjBfTUZSX0VDUyk7CisjZW5kaWYKKwkvKiBQSFkgY2xvY2sgd29ya2Fyb3VuZCAqLworCWVtYWNfcnhfY2xrX3R4KGRldik7CisKKwkvKiBFbmFibGUgaW50ZXJuYWwgY2xvY2sgc291cmNlIG9uIDQ0MEdYKi8KKyNpZmRlZiBDT05GSUdfUFBDX0RDUl9OQVRJVkUKKwlpZiAoZW1hY19oYXNfZmVhdHVyZShkZXYsIEVNQUNfRlRSXzQ0MEdYX1BIWV9DTEtfRklYKSkKKwkJZGNyaV9jbHJzZXQoU0RSMCwgU0RSMF9NRlIsIDAsIFNEUjBfTUZSX0VDUyk7CisjZW5kaWYKIAkvKiBDb25maWd1cmUgRU1BQyB3aXRoIGRlZmF1bHRzIHNvIHdlIGNhbiBhdCBsZWFzdCB1c2UgTURJTwogCSAqIFRoaXMgaXMgbmVlZGVkIG1vc3RseSBmb3IgNDQwR1gKIAkgKi8KQEAgLTIzNjIsNiArMjQwOSwxMiBAQAogCQkJaWYgKCFlbWFjX21paV9waHlfcHJvYmUoJmRldi0+cGh5LCBpKSkKIAkJCQlicmVhazsKIAkJfQorCisJLyogRW5hYmxlIGV4dGVybmFsIGNsb2NrIHNvdXJjZSAqLworI2lmZGVmIENPTkZJR19QUENfRENSX05BVElWRQorCWlmIChlbWFjX2hhc19mZWF0dXJlKGRldiwgRU1BQ19GVFJfNDQwR1hfUEhZX0NMS19GSVgpKQorCQlkY3JpX2NscnNldChTRFIwLCBTRFIwX01GUiwgU0RSMF9NRlJfRUNTLCAwKTsKKyNlbmRpZgogCW11dGV4X3VubG9jaygmZW1hY19waHlfbWFwX2xvY2spOwogCWlmIChpID09IDB4MjApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNhbid0IGZpbmQgUEhZIVxuIiwgbnAtPmZ1bGxfbmFtZSk7CkBAIC0yNDg3LDggKzI1NDAsMTUgQEAKIAl9CiAKIAkvKiBDaGVjayBFTUFDIHZlcnNpb24gKi8KLQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJpYm0sZW1hYzQiKSkKKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJpYm0sZW1hYzQiKSkgewogCQlkZXYtPmZlYXR1cmVzIHw9IEVNQUNfRlRSX0VNQUM0OworCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJpYm0sZW1hYy00NDBneCIpKQorCQkJZGV2LT5mZWF0dXJlcyB8PSBFTUFDX0ZUUl80NDBHWF9QSFlfQ0xLX0ZJWDsKKwl9IGVsc2UgeworCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJpYm0sZW1hYy00NDBlcCIpIHx8CisJCSAgICBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImlibSxlbWFjLTQ0MGdyIikpCisJCQlkZXYtPmZlYXR1cmVzIHw9IEVNQUNfRlRSXzQ0MEVQX1BIWV9DTEtfRklYOworCX0KIAogCS8qIEZpeHVwIHNvbWUgZmVhdHVyZSBiaXRzIGJhc2VkIG9uIHRoZSBkZXZpY2UgdHJlZSAqLwogCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJoYXMtaW52ZXJ0ZWQtc3RhY3Itb2MiLCBOVUxMKSkKQEAgLTI1NTksOCArMjYxOSwxMSBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqKmJsaXN0ID0gTlVMTDsKIAlpbnQgZXJyLCBpOwogCi0JLyogU2tpcCB1bnVzZWQvdW53aXJlZCBFTUFDUyAqLwotCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJ1bnVzZWQiLCBOVUxMKSkKKwkvKiBTa2lwIHVudXNlZC91bndpcmVkIEVNQUNTLiAgV2UgbGVhdmUgdGhlIGNoZWNrIGZvciBhbiB1bnVzZWQKKwkgKiBwcm9wZXJ0eSBoZXJlIGZvciBub3csIGJ1dCBuZXcgZmxhdCBkZXZpY2UgdHJlZXMgc2hvdWxkIHNldCBhCisJICogc3RhdHVzIHByb3BlcnR5IHRvICJkaXNhYmxlZCIgaW5zdGVhZC4KKwkgKi8KKwlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAidW51c2VkIiwgTlVMTCkgfHwgIW9mX2RldmljZV9pc19hdmFpbGFibGUobnApKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIEZpbmQgb3Vyc2VsdmVzIGluIHRoZSBib290bGlzdCBpZiB3ZSBhcmUgdGhlcmUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL2NvcmUuaCBiL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL2NvcmUuaAppbmRleCA0ZTc0ZDgyLi4xNjgzZGI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9jb3JlLmgKKysrIGIvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvY29yZS5oCkBAIC0zMDEsNiArMzAxLDE0IEBACiAgKiBTZXQgaWYgd2UgaGF2ZSBuZXcgdHlwZSBTVEFDUiB3aXRoIFNUQU9QQwogICovCiAjZGVmaW5lIEVNQUNfRlRSX0hBU19ORVdfU1RBQ1IJCTB4MDAwMDAwNDAKKy8qCisgKiBTZXQgaWYgd2UgbmVlZCBwaHkgY2xvY2sgd29ya2Fyb3VuZCBmb3IgNDQwZ3gKKyAqLworI2RlZmluZSBFTUFDX0ZUUl80NDBHWF9QSFlfQ0xLX0ZJWAkweDAwMDAwMDgwCisvKgorICogU2V0IGlmIHdlIG5lZWQgcGh5IGNsb2NrIHdvcmthcm91bmQgZm9yIDQ0MGVwIG9yIDQ0MGdyCisgKi8KKyNkZWZpbmUgRU1BQ19GVFJfNDQwRVBfUEhZX0NMS19GSVgJMHgwMDAwMDEwMAogCiAKIC8qIFJpZ2h0IG5vdywgd2UgZG9uJ3QgcXVpdGUgaGFuZGxlIHRoZSBhbHdheXMvcG9zc2libGUgbWFza3Mgb24gdGhlCkBAIC0zMTIsOCArMzIwLDggQEAKIAogCUVNQUNfRlRSU19QT1NTSUJMRQk9CiAjaWZkZWYgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNAotCSAgICBFTUFDX0ZUUl9FTUFDNAl8IEVNQUNfRlRSX0hBU19ORVdfU1RBQ1IJfAotCSAgICBFTUFDX0ZUUl9TVEFDUl9PQ19JTlZFUlQJfAorCSAgICBFTUFDX0ZUUl9FTUFDNCB8IEVNQUNfRlRSX0hBU19ORVdfU1RBQ1IgfAorCSAgICBFTUFDX0ZUUl9TVEFDUl9PQ19JTlZFUlQgfCBFTUFDX0ZUUl80NDBHWF9QSFlfQ0xLX0ZJWCB8CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfSUJNX05FV19FTUFDX1RBSAogCSAgICBFTUFDX0ZUUl9IQVNfVEFICXwKQEAgLTMyNCw3ICszMzIsNyBAQAogI2lmZGVmIENPTkZJR19JQk1fTkVXX0VNQUNfUkdNSUkKIAkgICAgRU1BQ19GVFJfSEFTX1JHTUlJCXwKICNlbmRpZgotCSAgICAwLAorCUVNQUNfRlRSXzQ0MEVQX1BIWV9DTEtfRklYLAogfTsKIAogc3RhdGljIGlubGluZSBpbnQgZW1hY19oYXNfZmVhdHVyZShzdHJ1Y3QgZW1hY19pbnN0YW5jZSAqZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvbWFsLmMgYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9tYWwuYwppbmRleCA2ODY5ZjA4Li4xMGMyNjdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9tYWwuYworKysgYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9tYWwuYwpAQCAtNjEsOCArNjEsOCBAQAogCXJldHVybiAwOwogfQogCi12b2lkIF9fZGV2ZXhpdCBtYWxfdW5yZWdpc3Rlcl9jb21tYWMoc3RydWN0IG1hbF9pbnN0YW5jZQkqbWFsLAotCQkJCSAgICAgc3RydWN0IG1hbF9jb21tYWMJCSpjb21tYWMpCit2b2lkIG1hbF91bnJlZ2lzdGVyX2NvbW1hYyhzdHJ1Y3QgbWFsX2luc3RhbmNlCSptYWwsCisJCXN0cnVjdCBtYWxfY29tbWFjICpjb21tYWMpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMTM2LDYgKzEzNiwxNCBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwkvKgorCSAqIE9uIHNvbWUgNHh4IFBQQydzIChlLmcuIDQ2MEVYL0dUKSwgdGhlIHJ4IGNoYW5uZWwgaXMgYSBtdWx0aXBsZQorCSAqIG9mIDgsIGJ1dCBlbmFibGluZyBpbiBNQUxfUlhDQVNSIG5lZWRzIHRoZSBkaXZpZGVkIGJ5IDggdmFsdWUKKwkgKiBmb3IgdGhlIGJpdG1hc2sKKwkgKi8KKwlpZiAoIShjaGFubmVsICUgOCkpCisJCWNoYW5uZWwgPj49IDM7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbWFsLT5sb2NrLCBmbGFncyk7CiAKIAlNQUxfREJHKG1hbCwgImVuYWJsZV9yeCglZCkiIE5MLCBjaGFubmVsKTsKQEAgLTE0OCw2ICsxNTYsMTQgQEAKIAogdm9pZCBtYWxfZGlzYWJsZV9yeF9jaGFubmVsKHN0cnVjdCBtYWxfaW5zdGFuY2UgKm1hbCwgaW50IGNoYW5uZWwpCiB7CisJLyoKKwkgKiBPbiBzb21lIDR4eCBQUEMncyAoZS5nLiA0NjBFWC9HVCksIHRoZSByeCBjaGFubmVsIGlzIGEgbXVsdGlwbGUKKwkgKiBvZiA4LCBidXQgZW5hYmxpbmcgaW4gTUFMX1JYQ0FTUiBuZWVkcyB0aGUgZGl2aWRlZCBieSA4IHZhbHVlCisJICogZm9yIHRoZSBiaXRtYXNrCisJICovCisJaWYgKCEoY2hhbm5lbCAlIDgpKQorCQljaGFubmVsID4+PSAzOworCiAJc2V0X21hbF9kY3JuKG1hbCwgTUFMX1JYQ0FSUiwgTUFMX0NIQU5fTUFTSyhjaGFubmVsKSk7CiAKIAlNQUxfREJHKG1hbCwgImRpc2FibGVfcngoJWQpIiBOTCwgY2hhbm5lbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9yZ21paS5jIGIvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvcmdtaWkuYwppbmRleCA1NzU3Nzg4Li5lMzJkYTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9yZ21paS5jCisrKyBiL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL3JnbWlpLmMKQEAgLTE3OSw3ICsxNzksNyBAQAogCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIH0KIAotdm9pZCBfX2RldmV4aXQgcmdtaWlfZGV0YWNoKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2LCBpbnQgaW5wdXQpCit2b2lkIHJnbWlpX2RldGFjaChzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldiwgaW50IGlucHV0KQogewogCXN0cnVjdCByZ21paV9pbnN0YW5jZSAqZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZvZmRldi0+ZGV2KTsKIAlzdHJ1Y3QgcmdtaWlfcmVncyBfX2lvbWVtICpwID0gZGV2LT5iYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvdGFoLmMgYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy90YWguYwppbmRleCBiMDIzZDEwLi4zMDE3M2E5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy90YWguYworKysgYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy90YWguYwpAQCAtMzUsNyArMzUsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIF9fZGV2ZXhpdCB0YWhfZGV0YWNoKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2LCBpbnQgY2hhbm5lbCkKK3ZvaWQgdGFoX2RldGFjaChzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldiwgaW50IGNoYW5uZWwpCiB7CiAJc3RydWN0IHRhaF9pbnN0YW5jZSAqZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZvZmRldi0+ZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvem1paS5jIGIvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvem1paS5jCmluZGV4IDJlYTQ3MmEuLjE3YjE1NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL3ptaWkuYworKysgYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy96bWlpLmMKQEAgLTE4OSw3ICsxODksNyBAQAogCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIH0KIAotdm9pZCBfX2RldmV4aXQgem1paV9kZXRhY2goc3RydWN0IG9mX2RldmljZSAqb2ZkZXYsIGludCBpbnB1dCkKK3ZvaWQgem1paV9kZXRhY2goc3RydWN0IG9mX2RldmljZSAqb2ZkZXYsIGludCBpbnB1dCkKIHsKIAlzdHJ1Y3Qgem1paV9pbnN0YW5jZSAqZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZvZmRldi0+ZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWdiL2lnYl9tYWluLmMgYi9kcml2ZXJzL25ldC9pZ2IvaWdiX21haW4uYwppbmRleCBhYWVlMDJlLi5hZTM5OGYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pZ2IvaWdiX21haW4uYworKysgYi9kcml2ZXJzL25ldC9pZ2IvaWdiX21haW4uYwpAQCAtODcxLDYgKzg3MSw3IEBACiAJCWdvdG8gZXJyX3BjaV9yZWc7CiAKIAlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKIAogCWVyciA9IC1FTk9NRU07CiAJbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBpZ2JfYWRhcHRlcikpOwpAQCAtNDA3OSw2ICs0MDgwLDcgQEAKIAkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q7CiAJfQogCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOwogCiAJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2hvdCwgMCk7CiAJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9hbGktaXJjYy5jIGIvZHJpdmVycy9uZXQvaXJkYS9hbGktaXJjYy5jCmluZGV4IDlmNTg0NTIuLjA4M2IwZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvYWxpLWlyY2MuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL2FsaS1pcmNjLmMKQEAgLTYwLDYgKzYwLDcgQEAKIAkucmVzdW1lCQk9IGFsaV9pcmNjX3Jlc3VtZSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSBBTElfSVJDQ19EUklWRVJfTkFNRSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKIH07CiAKQEAgLTIyNTYsNiArMjI1Nyw3IEBACiBNT0RVTEVfQVVUSE9SKCJCZW5qYW1pbiBLb25nIDxiZW5qYW1pbl9rb25nQGFsaS5jb20udHc+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkFMaSBGSVIgQ29udHJvbGxlciBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06IiBBTElfSVJDQ19EUklWRVJfTkFNRSk7CiAKIAogbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9weGFmaWNwX2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL3B4YWZpY3BfaXIuYwppbmRleCA4ZGI3MWFiLi5kNWMyZDI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3B4YWZpY3BfaXIuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3B4YWZpY3BfaXIuYwpAQCAtOTA4LDYgKzkwOCw3IEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBweGFfaXJfZHJpdmVyID0gewogCS5kcml2ZXIgICAgICAgICA9IHsKIAkJLm5hbWUgICA9ICJweGEyeHgtaXIiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAogCS5wcm9iZQkJPSBweGFfaXJkYV9wcm9iZSwKIAkucmVtb3ZlCQk9IHB4YV9pcmRhX3JlbW92ZSwKQEAgLTkyOSwzICs5MzAsNCBAQAogbW9kdWxlX2V4aXQocHhhX2lyZGFfZXhpdCk7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06cHhhMnh4LWlyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3NhMTEwMF9pci5jIGIvZHJpdmVycy9uZXQvaXJkYS9zYTExMDBfaXIuYwppbmRleCAwNTY2MzlmLi4xYmM4NTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3NhMTEwMF9pci5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc2ExMTAwX2lyLmMKQEAgLTEwMDgsNiArMTAwOCw3IEBACiAJLnJlc3VtZQkJPSBzYTExMDBfaXJkYV9yZXN1bWUsCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gInNhMTF4MC1pciIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCiB9OwogCkBAIC0xMDQxLDMgKzEwNDIsNCBAQAogTU9EVUxFX1BBUk1fREVTQyhwb3dlcl9sZXZlbCwgIklyREEgcG93ZXIgbGV2ZWwsIDEgKGxvdykgdG8gMyAoaGlnaCkiKTsKIE1PRFVMRV9QQVJNX0RFU0ModHhfbHBtLCAiRW5hYmxlIHRyYW5zbWl0dGVyIGxvdyBwb3dlciAoMS42dXMpIG1vZGUiKTsKIE1PRFVMRV9QQVJNX0RFU0MobWF4X3JhdGUsICJNYXhpbXVtIGJhdWQgcmF0ZSAoNDAwMDAwMCwgMTE1MjAwLCA1NzYwMCwgMzg0MDAsIDE5MjAwLCA5NjAwKSIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzYTExeDAtaXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX21haW4uYyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX21haW4uYwppbmRleCBjYjM3MWE4Li43Yjg1OTIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfbWFpbi5jCkBAIC0zNDMxLDYgKzM0MzEsNyBAQAogCX0KIAogCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwogCiAjaWZkZWYgQ09ORklHX05FVERFVklDRVNfTVVMVElRVUVVRQogCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2X21xKHNpemVvZihzdHJ1Y3QgaXhnYmVfYWRhcHRlciksIE1BWF9UWF9RVUVVRVMpOwpAQCAtMzcyMSw2ICszNzIyLDcgQEAKIAkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q7CiAJfQogCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOwogCiAJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2hvdCwgMCk7CiAJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvamF6enNvbmljLmMgYi9kcml2ZXJzL25ldC9qYXp6c29uaWMuYwppbmRleCA1YzE1NGZlLi4wNzk0NDgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9qYXp6c29uaWMuYworKysgYi9kcml2ZXJzL25ldC9qYXp6c29uaWMuYwpAQCAtMjQ5LDYgKzI0OSw3IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkphenogU09OSUMgZXRoZXJuZXQgZHJpdmVyIik7CiBtb2R1bGVfcGFyYW0oc29uaWNfZGVidWcsIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHNvbmljX2RlYnVnLCAiamF6enNvbmljIGRlYnVnIGxldmVsICgxLTQpIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmphenpzb25pYyIpOwogCiAjaW5jbHVkZSAic29uaWMuYyIKIApAQCAtMjcxLDYgKzI3Miw3IEBACiAJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKGphenpfc29uaWNfZGV2aWNlX3JlbW92ZSksCiAJLmRyaXZlcgk9IHsKIAkJLm5hbWUJPSBqYXp6X3NvbmljX3N0cmluZywKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2tvcmluYS5jIGIvZHJpdmVycy9uZXQva29yaW5hLmMKaW5kZXggMWQyNGE3My4uZTE4NTc2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQva29yaW5hLmMKKysrIGIvZHJpdmVycy9uZXQva29yaW5hLmMKQEAgLTg4Myw3ICs4ODMsNyBAQAogc3RhdGljIGludCBrb3JpbmFfcmVzdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBrb3JpbmFfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCWludCByZXQgPSAwOworCWludCByZXQ7CiAKIAkvKgogCSAqIERpc2FibGUgaW50ZXJydXB0cwpAQCAtOTg3LDcgKzk4Nyw3IEBACiBzdGF0aWMgaW50IGtvcmluYV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGtvcmluYV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldDsKIAogCS8qIEluaXRpYWxpemUgKi8KIAlyZXQgPSBrb3JpbmFfaW5pdChkZXYpOwpAQCAtMTAzMSw2ICsxMDMxLDggQEAKIAkJICAgIGRldi0+bmFtZSwgbHAtPnVuZF9pcnEpOwogCQlnb3RvIGVycl9mcmVlX292cl9pcnE7CiAJfQorb3V0OgorCXJldHVybiByZXQ7CiAKIGVycl9mcmVlX292cl9pcnE6CiAJZnJlZV9pcnEobHAtPm92cl9pcnEsIGRldik7CkBAIC0xMDQxLDggKzEwNDMsNiBAQAogZXJyX3JlbGVhc2U6CiAJa29yaW5hX2ZyZWVfcmluZyhkZXYpOwogCWdvdG8gb3V0Owotb3V0OgotCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQga29yaW5hX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0xMDgyLDcgKzEwODIsNyBAQAogCXN0cnVjdCBrb3JpbmFfcHJpdmF0ZSAqbHA7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnI7Ci0JaW50IHJldHZhbCwgZXJyOworCWludCByYzsKIAogCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3Qga29yaW5hX3ByaXZhdGUpKTsKIAlpZiAoIWRldikgewpAQCAtMTEwNiw3ICsxMTA2LDcgQEAKIAlscC0+ZXRoX3JlZ3MgPSBpb3JlbWFwX25vY2FjaGUoci0+c3RhcnQsIHItPmVuZCAtIHItPnN0YXJ0KTsKIAlpZiAoIWxwLT5ldGhfcmVncykgewogCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgImNhbm5vdCByZW1hcCByZWdpc3RlcnNcbiIpOwotCQlyZXR2YWwgPSAtRU5YSU87CisJCXJjID0gLUVOWElPOwogCQlnb3RvIHByb2JlX2Vycl9vdXQ7CiAJfQogCkBAIC0xMTE0LDcgKzExMTQsNyBAQAogCWxwLT5yeF9kbWFfcmVncyA9IGlvcmVtYXBfbm9jYWNoZShyLT5zdGFydCwgci0+ZW5kIC0gci0+c3RhcnQpOwogCWlmICghbHAtPnJ4X2RtYV9yZWdzKSB7CiAJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiY2Fubm90IHJlbWFwIFJ4IERNQSByZWdpc3RlcnNcbiIpOwotCQlyZXR2YWwgPSAtRU5YSU87CisJCXJjID0gLUVOWElPOwogCQlnb3RvIHByb2JlX2Vycl9kbWFfcng7CiAJfQogCkBAIC0xMTIyLDE0ICsxMTIyLDE0IEBACiAJbHAtPnR4X2RtYV9yZWdzID0gaW9yZW1hcF9ub2NhY2hlKHItPnN0YXJ0LCByLT5lbmQgLSByLT5zdGFydCk7CiAJaWYgKCFscC0+dHhfZG1hX3JlZ3MpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICJjYW5ub3QgcmVtYXAgVHggRE1BIHJlZ2lzdGVyc1xuIik7Ci0JCXJldHZhbCA9IC1FTlhJTzsKKwkJcmMgPSAtRU5YSU87CiAJCWdvdG8gcHJvYmVfZXJyX2RtYV90eDsKIAl9CiAKIAlscC0+dGRfcmluZyA9IGttYWxsb2MoVERfUklOR19TSVpFICsgUkRfUklOR19TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWxwLT50ZF9yaW5nKSB7CiAJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiY2Fubm90IGFsbG9jYXRlIGRlc2NyaXB0b3JzXG4iKTsKLQkJcmV0dmFsID0gLUVOT01FTTsKKwkJcmMgPSAtRU5YSU87CiAJCWdvdG8gcHJvYmVfZXJyX3RkX3Jpbmc7CiAJfQogCkBAIC0xMTY2LDE0ICsxMTY2LDE0IEBACiAJbHAtPm1paV9pZi5waHlfaWRfbWFzayA9IDB4MWY7CiAJbHAtPm1paV9pZi5yZWdfbnVtX21hc2sgPSAweDFmOwogCi0JZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JaWYgKGVycikgeworCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJjIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUKLQkJCSI6IGNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlICVkXG4iLCBlcnIpOwotCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJIjogY2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2UgJWRcbiIsIHJjKTsKIAkJZ290byBwcm9iZV9lcnJfcmVnaXN0ZXI7CiAJfQotCXJldHVybiAwOworb3V0OgorCXJldHVybiByYzsKIAogcHJvYmVfZXJyX3JlZ2lzdGVyOgogCWtmcmVlKGxwLT50ZF9yaW5nKTsKQEAgLTExODUsNyArMTE4NSw3IEBACiAJaW91bm1hcChscC0+ZXRoX3JlZ3MpOwogcHJvYmVfZXJyX291dDoKIAlmcmVlX25ldGRldihkZXYpOwotCXJldHVybiByZXR2YWw7CisJZ290byBvdXQ7CiB9CiAKIHN0YXRpYyBpbnQga29yaW5hX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtMTE5MywxMiArMTE5Myw5IEBACiAJc3RydWN0IGtvcmluYV9kZXZpY2UgKmJpZiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBrb3JpbmFfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihiaWYtPmRldik7CiAKLQlpZiAobHAtPmV0aF9yZWdzKQotCQlpb3VubWFwKGxwLT5ldGhfcmVncyk7Ci0JaWYgKGxwLT5yeF9kbWFfcmVncykKLQkJaW91bm1hcChscC0+cnhfZG1hX3JlZ3MpOwotCWlmIChscC0+dHhfZG1hX3JlZ3MpCi0JCWlvdW5tYXAobHAtPnR4X2RtYV9yZWdzKTsKKwlpb3VubWFwKGxwLT5ldGhfcmVncyk7CisJaW91bm1hcChscC0+cnhfZG1hX3JlZ3MpOworCWlvdW5tYXAobHAtPnR4X2RtYV9yZWdzKTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCXVucmVnaXN0ZXJfbmV0ZGV2KGJpZi0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hY2IuYyBiL2RyaXZlcnMvbmV0L21hY2IuYwppbmRleCBkNTEzYmI4Li45MmRjY2Q0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tYWNiLmMKKysrIGIvZHJpdmVycy9uZXQvbWFjYi5jCkBAIC0xMjgxLDYgKzEyODEsNyBAQAogCS5yZW1vdmUJCT0gX19leGl0X3AobWFjYl9yZW1vdmUpLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQkJPSAibWFjYiIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCiB9OwogCkBAIC0xMzAwLDMgKzEzMDEsNCBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBdG1lbCBNQUNCIEV0aGVybmV0IGRyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiSGFhdmFyZCBTa2lubmVtb2VuIDxoc2tpbm5lbW9lbkBhdG1lbC5jb20+Iik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOm1hY2IiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21ldGguYyBiL2RyaXZlcnMvbmV0L21ldGguYwppbmRleCBjZGFhOGZjLi4wYjMyNjQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvbWV0aC5jCkBAIC04MzAsNiArODMwLDcgQEAKIAkucmVtb3ZlCT0gX19kZXZleGl0X3AobWV0aF9yZW1vdmUpLAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gIm1ldGgiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9CiB9OwogCkBAIC04NTUsMyArODU2LDQgQEAKIE1PRFVMRV9BVVRIT1IoIklseWEgVm9seW5ldHMgPGlseWFAdGhlSWx5YS5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlNHSSBPMiBCdWlsdGluIEZhc3QgRXRoZXJuZXQgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOm1ldGgiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmMgYi9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5jCmluZGV4IDYwMWZmZDYuLjM4MWIzNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvbXY2NDN4eF9ldGguYwpAQCAtMjAzMCw2ICsyMDMwLDcgQEAKIAkuc2h1dGRvd24gPSBtdjY0M3h4X2V0aF9zaHV0ZG93biwKIAkuZHJpdmVyID0gewogCQkubmFtZSA9IE1WNjQzWFhfRVRIX05BTUUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCiB9OwogCkBAIC0yMDM4LDYgKzIwMzksNyBAQAogCS5yZW1vdmUgPSBtdjY0M3h4X2V0aF9zaGFyZWRfcmVtb3ZlLAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gTVY2NDNYWF9FVEhfU0hBUkVEX05BTUUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCiB9OwogCkBAIC0yMDg1LDcgKzIwODcsOCBAQAogTU9EVUxFX0FVVEhPUigJIlJhYmVlaCBLaG91cnksIEFzc2FmIEhvZmZtYW4sIE1hdHRoZXcgRGhhcm0sIE1hbmlzaCBMYWNod2FuaSIKIAkJIiBhbmQgRGFsZSBGYXJuc3dvcnRoIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkV0aGVybmV0IGRyaXZlciBmb3IgTWFydmVsbCBNVjY0M1hYIik7Ci1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOm12NjQzeHhfZXRoIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgTVY2NDNYWF9FVEhfTkFNRSk7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgTVY2NDNYWF9FVEhfU0hBUkVEX05BTUUpOwogCiAvKgogICogVGhlIHNlY29uZCBwYXJ0IGlzIHRoZSBsb3cgbGV2ZWwgZHJpdmVyIG9mIHRoZSBnaWdFIGV0aGVybmV0IHBvcnRzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eC1ldGguYyBiL2RyaXZlcnMvbmV0L25ldHgtZXRoLmMKaW5kZXggNzhkMzRhZi4uZGM0NDJlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmV0eC1ldGguYworKysgYi9kcml2ZXJzL25ldC9uZXR4LWV0aC5jCkBAIC01MDIsNCArNTAyLDQgQEAKIAogTU9EVUxFX0FVVEhPUigiU2FzY2hhIEhhdWVyLCBQZW5ndXRyb25peCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgQ0FSRE5BTUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaHcuYyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2h3LmMKaW5kZXggMDU3NDhjYS4uYWY3MzU2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaHcuYworKysgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19ody5jCkBAIC0xMTMyLDggKzExMzIsOCBAQAogCXUzMiBmd19taW5vciA9IDA7CiAJdTMyIGZ3X2J1aWxkID0gMDsKIAljaGFyIGJyZF9uYW1lW05FVFhFTl9NQVhfU0hPUlRfTkFNRV07Ci0Jc3RydWN0IG5ldHhlbl9uZXdfdXNlcl9pbmZvIHVzZXJfaW5mbzsKLQlpbnQgaSwgYWRkciA9IE5FVFhFTl9VU0VSX1NUQVJUOworCWNoYXIgc2VyaWFsX251bVszMl07CisJaW50IGksIGFkZHI7CiAJX19sZTMyICpwdHIzMjsKIAogCXN0cnVjdCBuZXR4ZW5fYm9hcmRfaW5mbyAqYm9hcmRfaW5mbyA9ICYoYWRhcHRlci0+YWh3LmJvYXJkY2ZnKTsKQEAgLTExNTAsMTAgKzExNTAsMTAgQEAKIAkJdmFsaWQgPSAwOwogCX0KIAlpZiAodmFsaWQpIHsKLQkJcHRyMzIgPSAodTMyICopICYgdXNlcl9pbmZvOwotCQlmb3IgKGkgPSAwOwotCQkgICAgIGkgPCBzaXplb2Yoc3RydWN0IG5ldHhlbl9uZXdfdXNlcl9pbmZvKSAvIHNpemVvZih1MzIpOwotCQkgICAgIGkrKykgeworCQlwdHIzMiA9ICh1MzIgKikmc2VyaWFsX251bTsKKwkJYWRkciA9IE5FVFhFTl9VU0VSX1NUQVJUICsKKwkJICAgICAgIG9mZnNldG9mKHN0cnVjdCBuZXR4ZW5fbmV3X3VzZXJfaW5mbywgc2VyaWFsX251bSk7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKIAkJCWlmIChuZXR4ZW5fcm9tX2Zhc3RfcmVhZChhZGFwdGVyLCBhZGRyLCBwdHIzMikgPT0gLTEpIHsKIAkJCQlwcmludGsoIiVzOiBFUlJPUiByZWFkaW5nICVzIGJvYXJkIHVzZXJhcmVhLlxuIiwKIAkJCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwKQEAgLTExNjMsMTAgKzExNjMsMTEgQEAKIAkJCXB0cjMyKys7CiAJCQlhZGRyICs9IHNpemVvZih1MzIpOwogCQl9CisKIAkJZ2V0X2JyZF9uYW1lX2J5X3R5cGUoYm9hcmRfaW5mby0+Ym9hcmRfdHlwZSwgYnJkX25hbWUpOwogCiAJCXByaW50aygiTmV0WGVuICVzIEJvYXJkIFMvTiAlcyAgQ2hpcCBpZCAweCV4XG4iLAotCQkgICAgICAgYnJkX25hbWUsIHVzZXJfaW5mby5zZXJpYWxfbnVtLCBib2FyZF9pbmZvLT5jaGlwX2lkKTsKKwkJICAgICAgIGJyZF9uYW1lLCBzZXJpYWxfbnVtLCBib2FyZF9pbmZvLT5jaGlwX2lkKTsKIAogCQlwcmludGsoIk5ldFhlbiAlcyBCb2FyZCAjJWQsIENoaXAgaWQgMHgleFxuIiwKIAkJICAgICAgIGJvYXJkX2luZm8tPmJvYXJkX3R5cGUgPT0gMHgwYiA/ICJYR0IiIDogIkdCRSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uaXUuYyBiL2RyaXZlcnMvbmV0L25pdS5jCmluZGV4IDc1NjVjMmQuLjQwMDljNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25pdS5jCisrKyBiL2RyaXZlcnMvbmV0L25pdS5jCkBAIC0zMyw4ICszMyw4IEBACiAKICNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkibml1IgogI2RlZmluZSBQRlggRFJWX01PRFVMRV9OQU1FCSI6ICIKLSNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIwLjciCi0jZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiRmVicnVhcnkgMTgsIDIwMDgiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMC44IgorI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIkFwcmlsIDI0LCAyMDA4IgogCiBzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CiAJRFJWX01PRFVMRV9OQU1FICIuYzp2IiBEUlZfTU9EVUxFX1ZFUlNJT04gIiAoIiBEUlZfTU9EVUxFX1JFTERBVEUgIilcbiI7CkBAIC02NzMsMTEgKzY3MywxNiBAQAogCX0KIAogCWlmICgoc2lnICYgbWFzaykgIT0gdmFsKSB7CisJCWlmIChucC0+ZmxhZ3MgJiBOSVVfRkxBR1NfSE9UUExVR19QSFkpIHsKKwkJCW5wLT5mbGFncyAmPSB+TklVX0ZMQUdTX0hPVFBMVUdfUEhZX1BSRVNFTlQ7CisJCQlyZXR1cm4gMDsKKwkJfQogCQlkZXZfZXJyKG5wLT5kZXZpY2UsIFBGWCAiUG9ydCAldSBzaWduYWwgYml0cyBbJTA4eF0gYXJlIG5vdCAiCiAJCQkiWyUwOHhdXG4iLCBucC0+cG9ydCwgKGludCkgKHNpZyAmIG1hc2spLCAoaW50KSB2YWwpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0KKwlpZiAobnAtPmZsYWdzICYgTklVX0ZMQUdTX0hPVFBMVUdfUEhZKQorCQlucC0+ZmxhZ3MgfD0gTklVX0ZMQUdTX0hPVFBMVUdfUEhZX1BSRVNFTlQ7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk5OCw2ICsxMDAzLDI4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYmNtODcwNl9pbml0X3VzZXJfZGV2MyhzdHJ1Y3Qgbml1ICpucCkKK3sKKwlpbnQgZXJyOworCisKKwllcnIgPSBtZGlvX3JlYWQobnAsIG5wLT5waHlfYWRkciwgQkNNODcwNF9VU0VSX0RFVjNfQUREUiwKKwkJCUJDTTg3MDRfVVNFUl9PUFRfRElHSVRBTF9DVFJMKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgJj0gflVTRVJfT0RJR19DVFJMX0dQSU9TOworCWVyciB8PSAoMHgzIDw8IFVTRVJfT0RJR19DVFJMX0dQSU9TX1NISUZUKTsKKwllcnIgfD0gIFVTRVJfT0RJR19DVFJMX1JFU1YyOworCWVyciA9IG1kaW9fd3JpdGUobnAsIG5wLT5waHlfYWRkciwgQkNNODcwNF9VU0VSX0RFVjNfQUREUiwKKwkJCSBCQ004NzA0X1VTRVJfT1BUX0RJR0lUQUxfQ1RSTCwgZXJyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJbWRlbGF5KDEwMDApOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgYmNtODcwNF9pbml0X3VzZXJfZGV2MyhzdHJ1Y3Qgbml1ICpucCkKIHsKIAlpbnQgZXJyOwpAQCAtMTEyNywzMyArMTE1NCwxMSBAQAogCQkJICBNUlZMODhYMjAxMV8xMEdfUE1EX1RYX0RJUywgTVJWTDg4WDIwMTFfRU5BX1BNRFRYKTsKIH0KIAotc3RhdGljIGludCB4Y3ZyX2luaXRfMTBnX2JjbTg3MDQoc3RydWN0IG5pdSAqbnApCisKK3N0YXRpYyBpbnQgeGN2cl9kaWFnX2JjbTg3MHgoc3RydWN0IG5pdSAqbnApCiB7Ci0Jc3RydWN0IG5pdV9saW5rX2NvbmZpZyAqbHAgPSAmbnAtPmxpbmtfY29uZmlnOwogCXUxNiBhbmFsb2dfc3RhdDAsIHR4X2FsYXJtX3N0YXR1czsKLQlpbnQgZXJyOwotCi0JZXJyID0gYmNtODcwNF9yZXNldChucCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWVyciA9IGJjbTg3MDRfaW5pdF91c2VyX2RldjMobnApOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQllcnIgPSBtZGlvX3JlYWQobnAsIG5wLT5waHlfYWRkciwgQkNNODcwNF9QQ1NfREVWX0FERFIsCi0JCQlNSUlfQk1DUik7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JZXJyICY9IH5CTUNSX0xPT1BCQUNLOwotCi0JaWYgKGxwLT5sb29wYmFja19tb2RlID09IExPT1BCQUNLX01BQykKLQkJZXJyIHw9IEJNQ1JfTE9PUEJBQ0s7Ci0KLQllcnIgPSBtZGlvX3dyaXRlKG5wLCBucC0+cGh5X2FkZHIsIEJDTTg3MDRfUENTX0RFVl9BRERSLAotCQkJIE1JSV9CTUNSLCBlcnIpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7CisJaW50IGVyciA9IDA7CiAKICNpZiAxCiAJZXJyID0gbWRpb19yZWFkKG5wLCBucC0+cGh5X2FkZHIsIEJDTTg3MDRfUE1BX1BNRF9ERVZfQUREUiwKQEAgLTEyMTEsNiArMTIxNiw4OSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHhjdnJfMTBnX3NldF9sYl9iY204NzB4KHN0cnVjdCBuaXUgKm5wKQoreworCXN0cnVjdCBuaXVfbGlua19jb25maWcgKmxwID0gJm5wLT5saW5rX2NvbmZpZzsKKwlpbnQgZXJyOworCisJZXJyID0gbWRpb19yZWFkKG5wLCBucC0+cGh5X2FkZHIsIEJDTTg3MDRfUENTX0RFVl9BRERSLAorCQkJTUlJX0JNQ1IpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyICY9IH5CTUNSX0xPT1BCQUNLOworCisJaWYgKGxwLT5sb29wYmFja19tb2RlID09IExPT1BCQUNLX01BQykKKwkJZXJyIHw9IEJNQ1JfTE9PUEJBQ0s7CisKKwllcnIgPSBtZGlvX3dyaXRlKG5wLCBucC0+cGh5X2FkZHIsIEJDTTg3MDRfUENTX0RFVl9BRERSLAorCQkJIE1JSV9CTUNSLCBlcnIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4Y3ZyX2luaXRfMTBnX2JjbTg3MDYoc3RydWN0IG5pdSAqbnApCit7CisJaW50IGVyciA9IDA7CisJdTY0IHZhbDsKKworCWlmICgobnAtPmZsYWdzICYgTklVX0ZMQUdTX0hPVFBMVUdfUEhZKSAmJgorCSAgICAobnAtPmZsYWdzICYgTklVX0ZMQUdTX0hPVFBMVUdfUEhZX1BSRVNFTlQpID09IDApCisJCQlyZXR1cm4gZXJyOworCisJdmFsID0gbnI2NF9tYWMoWE1BQ19DT05GSUcpOworCXZhbCAmPSB+WE1BQ19DT05GSUdfTEVEX1BPTEFSSVRZOworCXZhbCB8PSBYTUFDX0NPTkZJR19GT1JDRV9MRURfT047CisJbnc2NF9tYWMoWE1BQ19DT05GSUcsIHZhbCk7CisKKwl2YWwgPSBucjY0KE1JRl9DT05GSUcpOworCXZhbCB8PSBNSUZfQ09ORklHX0lORElSRUNUX01PREU7CisJbnc2NChNSUZfQ09ORklHLCB2YWwpOworCisJZXJyID0gYmNtODcwNF9yZXNldChucCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHhjdnJfMTBnX3NldF9sYl9iY204NzB4KG5wKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gYmNtODcwNl9pbml0X3VzZXJfZGV2MyhucCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHhjdnJfZGlhZ19iY204NzB4KG5wKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGN2cl9pbml0XzEwZ19iY204NzA0KHN0cnVjdCBuaXUgKm5wKQoreworCWludCBlcnI7CisKKwllcnIgPSBiY204NzA0X3Jlc2V0KG5wKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gYmNtODcwNF9pbml0X3VzZXJfZGV2MyhucCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHhjdnJfMTBnX3NldF9sYl9iY204NzB4KG5wKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gIHhjdnJfZGlhZ19iY204NzB4KG5wKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgeGN2cl9pbml0XzEwZyhzdHJ1Y3Qgbml1ICpucCkKIHsKIAlpbnQgcGh5X2lkLCBlcnI7CkBAIC0xNTQ4LDYgKzE2MzYsNTkgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IGxpbmtfc3RhdHVzXzEwZ19iY204NzA2KHN0cnVjdCBuaXUgKm5wLCBpbnQgKmxpbmtfdXBfcCkKK3sKKwlpbnQgZXJyLCBsaW5rX3VwOworCWxpbmtfdXAgPSAwOworCisJZXJyID0gbWRpb19yZWFkKG5wLCBucC0+cGh5X2FkZHIsIEJDTTg3MDRfUE1BX1BNRF9ERVZfQUREUiwKKwkJCUJDTTg3MDRfUE1EX1JDVl9TSUdERVQpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKwlpZiAoIShlcnIgJiBQTURfUkNWX1NJR0RFVF9HTE9CQUwpKSB7CisJCWVyciA9IDA7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IG1kaW9fcmVhZChucCwgbnAtPnBoeV9hZGRyLCBCQ004NzA0X1BDU19ERVZfQUREUiwKKwkJCUJDTTg3MDRfUENTXzEwR19SX1NUQVRVUyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJaWYgKCEoZXJyICYgUENTXzEwR19SX1NUQVRVU19CTEtfTE9DSykpIHsKKwkJZXJyID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gbWRpb19yZWFkKG5wLCBucC0+cGh5X2FkZHIsIEJDTTg3MDRfUEhZWFNfREVWX0FERFIsCisJCQlCQ004NzA0X1BIWVhTX1hHWFNfTEFORV9TVEFUKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisJaWYgKGVyciAhPSAoUEhZWFNfWEdYU19MQU5FX1NUQVRfQUxJTkdFRCB8CisJCSAgICBQSFlYU19YR1hTX0xBTkVfU1RBVF9NQUdJQyB8CisJCSAgICBQSFlYU19YR1hTX0xBTkVfU1RBVF9QQVRURVNUIHwKKwkJICAgIFBIWVhTX1hHWFNfTEFORV9TVEFUX0xBTkUzIHwKKwkJICAgIFBIWVhTX1hHWFNfTEFORV9TVEFUX0xBTkUyIHwKKwkJICAgIFBIWVhTX1hHWFNfTEFORV9TVEFUX0xBTkUxIHwKKwkJICAgIFBIWVhTX1hHWFNfTEFORV9TVEFUX0xBTkUwKSkgeworCQllcnIgPSAwOworCQlucC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID0gU1BFRURfSU5WQUxJRDsKKwkJbnAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXggPSBEVVBMRVhfSU5WQUxJRDsKKwkJZ290byBvdXQ7CisJfQorCisJbGlua191cCA9IDE7CisJbnAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCA9IFNQRUVEXzEwMDAwOworCW5wLT5saW5rX2NvbmZpZy5hY3RpdmVfZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJZXJyID0gMDsKKworb3V0OgorCSpsaW5rX3VwX3AgPSBsaW5rX3VwOworCWlmIChucC0+ZmxhZ3MgJiBOSVVfRkxBR1NfSE9UUExVR19QSFkpCisJCWVyciA9IDA7CisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIGludCBsaW5rX3N0YXR1c18xMGdfYmNvbShzdHJ1Y3Qgbml1ICpucCwgaW50ICpsaW5rX3VwX3ApCiB7CiAJaW50IGVyciwgbGlua191cDsKQEAgLTE2MjcsNiArMTc2OCw4MiBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgbml1XzEwZ19waHlfcHJlc2VudChzdHJ1Y3Qgbml1ICpucCkKK3sKKwl1NjQgc2lnLCBtYXNrLCB2YWw7CisKKwlzaWcgPSBucjY0KEVTUl9JTlRfU0lHTkFMUyk7CisJc3dpdGNoIChucC0+cG9ydCkgeworCWNhc2UgMDoKKwkJbWFzayA9IEVTUl9JTlRfU0lHTkFMU19QMF9CSVRTOworCQl2YWwgPSAoRVNSX0lOVF9TUkRZMF9QMCB8CisJCSAgICAgICBFU1JfSU5UX0RFVDBfUDAgfAorCQkgICAgICAgRVNSX0lOVF9YU1JEWV9QMCB8CisJCSAgICAgICBFU1JfSU5UX1hEUF9QMF9DSDMgfAorCQkgICAgICAgRVNSX0lOVF9YRFBfUDBfQ0gyIHwKKwkJICAgICAgIEVTUl9JTlRfWERQX1AwX0NIMSB8CisJCSAgICAgICBFU1JfSU5UX1hEUF9QMF9DSDApOworCQlicmVhazsKKworCWNhc2UgMToKKwkJbWFzayA9IEVTUl9JTlRfU0lHTkFMU19QMV9CSVRTOworCQl2YWwgPSAoRVNSX0lOVF9TUkRZMF9QMSB8CisJCSAgICAgICBFU1JfSU5UX0RFVDBfUDEgfAorCQkgICAgICAgRVNSX0lOVF9YU1JEWV9QMSB8CisJCSAgICAgICBFU1JfSU5UX1hEUF9QMV9DSDMgfAorCQkgICAgICAgRVNSX0lOVF9YRFBfUDFfQ0gyIHwKKwkJICAgICAgIEVTUl9JTlRfWERQX1AxX0NIMSB8CisJCSAgICAgICBFU1JfSU5UX1hEUF9QMV9DSDApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCWlmICgoc2lnICYgbWFzaykgIT0gdmFsKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBsaW5rX3N0YXR1c18xMGdfaG90cGx1ZyhzdHJ1Y3Qgbml1ICpucCwgaW50ICpsaW5rX3VwX3ApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyID0gMDsKKwlpbnQgcGh5X3ByZXNlbnQ7CisJaW50IHBoeV9wcmVzZW50X3ByZXY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbnAtPmxvY2ssIGZsYWdzKTsKKworCWlmIChucC0+bGlua19jb25maWcubG9vcGJhY2tfbW9kZSA9PSBMT09QQkFDS19ESVNBQkxFRCkgeworCQlwaHlfcHJlc2VudF9wcmV2ID0gKG5wLT5mbGFncyAmIE5JVV9GTEFHU19IT1RQTFVHX1BIWV9QUkVTRU5UKSA/CisJCQkxIDogMDsKKwkJcGh5X3ByZXNlbnQgPSBuaXVfMTBnX3BoeV9wcmVzZW50KG5wKTsKKwkJaWYgKHBoeV9wcmVzZW50ICE9IHBoeV9wcmVzZW50X3ByZXYpIHsKKwkJCS8qIHN0YXRlIGNoYW5nZSAqLworCQkJaWYgKHBoeV9wcmVzZW50KSB7CisJCQkJbnAtPmZsYWdzIHw9IE5JVV9GTEFHU19IT1RQTFVHX1BIWV9QUkVTRU5UOworCQkJCWlmIChucC0+cGh5X29wcy0+eGN2cl9pbml0KQorCQkJCQllcnIgPSBucC0+cGh5X29wcy0+eGN2cl9pbml0KG5wKTsKKwkJCQlpZiAoZXJyKSB7CisJCQkJCS8qIGRlYm91bmNlICovCisJCQkJCW5wLT5mbGFncyAmPSB+TklVX0ZMQUdTX0hPVFBMVUdfUEhZX1BSRVNFTlQ7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlucC0+ZmxhZ3MgJj0gfk5JVV9GTEFHU19IT1RQTFVHX1BIWV9QUkVTRU5UOworCQkJCSpsaW5rX3VwX3AgPSAwOworCQkJCW5pdXdhcm4oTElOSywgIiVzOiBIb3RwbHVnIFBIWSBSZW1vdmVkXG4iLAorCQkJCQlucC0+ZGV2LT5uYW1lKTsKKwkJCX0KKwkJfQorCQlpZiAobnAtPmZsYWdzICYgTklVX0ZMQUdTX0hPVFBMVUdfUEhZX1BSRVNFTlQpCisJCQllcnIgPSBsaW5rX3N0YXR1c18xMGdfYmNtODcwNihucCwgbGlua191cF9wKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIGludCBsaW5rX3N0YXR1c18xZyhzdHJ1Y3Qgbml1ICpucCwgaW50ICpsaW5rX3VwX3ApCiB7CiAJc3RydWN0IG5pdV9saW5rX2NvbmZpZyAqbHAgPSAmbnAtPmxpbmtfY29uZmlnOwpAQCAtMTc2MSw2ICsxOTc4LDEyIEBACiAJLmxpbmtfc3RhdHVzCQk9IGxpbmtfc3RhdHVzXzEwZywKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgbml1X3BoeV9vcHMgcGh5X29wc18xMGdfZmliZXJfaG90cGx1ZyA9IHsKKwkuc2VyZGVzX2luaXQJCT0gc2VyZGVzX2luaXRfMTBnLAorCS54Y3ZyX2luaXQJCT0geGN2cl9pbml0XzEwZ19iY204NzA2LAorCS5saW5rX3N0YXR1cwkJPSBsaW5rX3N0YXR1c18xMGdfaG90cGx1ZywKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgbml1X3BoeV9vcHMgcGh5X29wc18xMGdfY29wcGVyID0gewogCS5zZXJkZXNfaW5pdAkJPSBzZXJkZXNfaW5pdF8xMGcsCiAJLmxpbmtfc3RhdHVzCQk9IGxpbmtfc3RhdHVzXzEwZywgLyogWFhYICovCkBAIC0xNzkyLDYgKzIwMTUsMTEgQEAKIAkucGh5X2FkZHJfYmFzZQk9IDgsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5pdV9waHlfdGVtcGxhdGUgcGh5X3RlbXBsYXRlXzEwZ19maWJlcl9ob3RwbHVnID0geworCS5vcHMJCT0gJnBoeV9vcHNfMTBnX2ZpYmVyX2hvdHBsdWcsCisJLnBoeV9hZGRyX2Jhc2UJPSA4LAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBuaXVfcGh5X3RlbXBsYXRlIHBoeV90ZW1wbGF0ZV8xMGdfY29wcGVyID0gewogCS5vcHMJCT0gJnBoeV9vcHNfMTBnX2NvcHBlciwKIAkucGh5X2FkZHJfYmFzZQk9IDEwLApAQCAtMTk5Niw2ICsyMjI0LDEzIEBACiAJCQkgICAgcGxhdF90eXBlID09IFBMQVRfVFlQRV9WRl9QMSkKIAkJCQlwaHlfYWRkcl9vZmYgPSA4OwogCQkJcGh5X2FkZHJfb2ZmICs9IG5wLT5wb3J0OworCQkJaWYgKG5wLT5mbGFncyAmIE5JVV9GTEFHU19IT1RQTFVHX1BIWSkgeworCQkJCXRwID0gJnBoeV90ZW1wbGF0ZV8xMGdfZmliZXJfaG90cGx1ZzsKKwkJCQlpZiAobnAtPnBvcnQgPT0gMCkKKwkJCQkJcGh5X2FkZHJfb2ZmID0gODsKKwkJCQlpZiAobnAtPnBvcnQgPT0gMSkKKwkJCQkJcGh5X2FkZHJfb2ZmID0gMTI7CisJCQl9CiAJCQlicmVhazsKIAogCQljYXNlIE5JVV9GTEFHU18xMEcgfCBOSVVfRkxBR1NfWENWUl9TRVJERVM6CkBAIC02NzczLDYgKzcwMDgsMzcgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogbml1IGJvYXJkIG1vZGVscyBoYXZlIGEgdHJhaWxpbmcgZGFzaCB2ZXJzaW9uIGluY3JlbWVudGVkCisgKiB3aXRoIEhXIHJldiBjaGFuZ2UuIE5lZWQgdG8gaW5nbm9yZSB0aGUgIGRhc2ggdmVyc2lvbiB3aGlsZQorICogY2hlY2tpbmcgZm9yIG1hdGNoCisgKgorICogZm9yIGV4YW1wbGUsIGZvciB0aGUgMTBHIGNhcmQgdGhlIGN1cnJlbnQgdnBkLmJvYXJkX21vZGVsCisgKiBpcyA1MDEtNTI4My0wNCwgb2Ygd2hpY2ggLTA0IGlzIHRoZSAgZGFzaCB2ZXJzaW9uIGFuZCBoYXZlCisgKiB0byBiZSBpZ25vcmVkCisgKi8KK3N0YXRpYyBpbnQgbml1X2JvYXJkX21vZGVsX21hdGNoKHN0cnVjdCBuaXUgKm5wLCBjb25zdCBjaGFyICptb2RlbCkKK3sKKwlyZXR1cm4gIXN0cm5jbXAobnAtPnZwZC5ib2FyZF9tb2RlbCwgbW9kZWwsIHN0cmxlbihtb2RlbCkpOworfQorCitzdGF0aWMgaW50IG5pdV9wY2lfdnBkX2dldF9ucG9ydHMoc3RydWN0IG5pdSAqbnApCit7CisJaW50IHBvcnRzID0gMDsKKworCWlmICgobml1X2JvYXJkX21vZGVsX21hdGNoKG5wLCBOSVVfUUdDX0xQX0JNX1NUUikpIHx8CisJICAgIChuaXVfYm9hcmRfbW9kZWxfbWF0Y2gobnAsIE5JVV9RR0NfUEVNX0JNX1NUUikpIHx8CisJICAgIChuaXVfYm9hcmRfbW9kZWxfbWF0Y2gobnAsIE5JVV9BTE9OU09fQk1fU1RSKSkpIHsKKwkJcG9ydHMgPSA0OworCX0gZWxzZSBpZiAoKG5pdV9ib2FyZF9tb2RlbF9tYXRjaChucCwgTklVXzJYR0ZfTFBfQk1fU1RSKSkgfHwKKwkJICAgKG5pdV9ib2FyZF9tb2RlbF9tYXRjaChucCwgTklVXzJYR0ZfUEVNX0JNX1NUUikpIHx8CisJCSAgIChuaXVfYm9hcmRfbW9kZWxfbWF0Y2gobnAsIE5JVV9GT1hYWV9CTV9TVFIpKSB8fAorCQkgICAobml1X2JvYXJkX21vZGVsX21hdGNoKG5wLCBOSVVfMlhHRl9NUlZMX0JNX1NUUikpKSB7CisJCXBvcnRzID0gMjsKKwl9CisKKwlyZXR1cm4gcG9ydHM7Cit9CisKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBuaXVfcGNpX3ZwZF92YWxpZGF0ZShzdHJ1Y3Qgbml1ICpucCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbnAtPmRldjsKQEAgLTY3OTksNiArNzA2NSw5IEBACiAJCX0KIAkJaWYgKG5wLT5mbGFncyAmIE5JVV9GTEFHU18xMEcpCiAJCQkgbnAtPm1hY194Y3ZyID0gTUFDX1hDVlJfWFBDUzsKKwl9IGVsc2UgaWYgKG5pdV9ib2FyZF9tb2RlbF9tYXRjaChucCwgTklVX0ZPWFhZX0JNX1NUUikpIHsKKwkJbnAtPmZsYWdzIHw9IChOSVVfRkxBR1NfMTBHIHwgTklVX0ZMQUdTX0ZJQkVSIHwKKwkJCSAgICAgIE5JVV9GTEFHU19IT1RQTFVHX1BIWSk7CiAJfSBlbHNlIGlmIChuaXVfcGh5X3R5cGVfcHJvcF9kZWNvZGUobnAsIG5wLT52cGQucGh5X3R5cGUpKSB7CiAJCWRldl9lcnIobnAtPmRldmljZSwgUEZYICJJbGxlZ2FsIHBoeSBzdHJpbmcgWyVzXS5cbiIsCiAJCQlucC0+dnBkLnBoeV90eXBlKTsKQEAgLTY5ODcsMTEgKzcyNTYsMTcgQEAKIAkJaWYgKHBhcmVudC0+cGxhdF90eXBlID09IFBMQVRfVFlQRV9OSVUpIHsKIAkJCXBhcmVudC0+bnVtX3BvcnRzID0gMjsKIAkJfSBlbHNlIHsKLQkJCXBhcmVudC0+bnVtX3BvcnRzID0gbnI2NChFU1BDX05VTV9QT1JUU19NQUNTKSAmCi0JCQkJRVNQQ19OVU1fUE9SVFNfTUFDU19WQUw7CisJCQlwYXJlbnQtPm51bV9wb3J0cyA9IG5pdV9wY2lfdnBkX2dldF9ucG9ydHMobnApOworCQkJaWYgKCFwYXJlbnQtPm51bV9wb3J0cykgeworCQkJCS8qIEZhbGwgYmFjayB0byBTUFJPTSBhcyBsYXN0IHJlc29ydC4KKwkJCQkgKiBUaGlzIHdpbGwgZmFpbCBvbiBtb3N0IGNhcmRzLgorCQkJCSAqLworCQkJCXBhcmVudC0+bnVtX3BvcnRzID0gbnI2NChFU1BDX05VTV9QT1JUU19NQUNTKSAmCisJCQkJCUVTUENfTlVNX1BPUlRTX01BQ1NfVkFMOwogCi0JCQlpZiAoIXBhcmVudC0+bnVtX3BvcnRzKQotCQkJCXBhcmVudC0+bnVtX3BvcnRzID0gNDsKKwkJCQlpZiAoIXBhcmVudC0+bnVtX3BvcnRzKQorCQkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCX0KIAkJfQogCX0KIApAQCAtNzAxNSw3ICs3MjkwLDggQEAKIAkJcmV0dXJuIDA7CiAJaWYgKHR5cGUgPT0gUEhZX1RZUEVfUE1BX1BNRCB8fCB0eXBlID09IFBIWV9UWVBFX1BDUykgewogCQlpZiAoKChpZCAmIE5JVV9QSFlfSURfTUFTSykgIT0gTklVX1BIWV9JRF9CQ004NzA0KSAmJgotCQkgICAgKChpZCAmIE5JVV9QSFlfSURfTUFTSykgIT0gTklVX1BIWV9JRF9NUlZMODhYMjAxMSkpCisJCSAgICAoKGlkICYgTklVX1BIWV9JRF9NQVNLKSAhPSBOSVVfUEhZX0lEX01SVkw4OFgyMDExKSAmJgorCQkgICAgKChpZCAmIE5JVV9QSFlfSURfTUFTSykgIT0gTklVX1BIWV9JRF9CQ004NzA2KSkKIAkJCXJldHVybiAwOwogCX0gZWxzZSB7CiAJCWlmICgoaWQgJiBOSVVfUEhZX0lEX01BU0spICE9IE5JVV9QSFlfSURfQkNNNTQ2NFIpCkBAIC03MjYyLDcgKzc1MzgsNiBAQAogCXUzMiB2YWw7CiAJaW50IGVycjsKIAotCiAJaWYgKCFzdHJjbXAobnAtPnZwZC5tb2RlbCwgIlNVTlcsQ1AzMjIwIikgfHwKIAkgICAgIXN0cmNtcChucC0+dnBkLm1vZGVsLCAiU1VOVyxDUDMyNjAiKSkgewogCQludW1fMTBnID0gMDsKQEAgLTcyNzMsNiArNzU0OCwxMiBAQAogCQkgICAgICAgcGh5X2VuY29kZShQT1JUX1RZUEVfMUcsIDEpIHwKIAkJICAgICAgIHBoeV9lbmNvZGUoUE9SVF9UWVBFXzFHLCAyKSB8CiAJCSAgICAgICBwaHlfZW5jb2RlKFBPUlRfVFlQRV8xRywgMykpOworCX0gZWxzZSBpZiAobml1X2JvYXJkX21vZGVsX21hdGNoKG5wLCBOSVVfRk9YWFlfQk1fU1RSKSkgeworCQludW1fMTBnID0gMjsKKwkJbnVtXzFnID0gMDsKKwkJcGFyZW50LT5udW1fcG9ydHMgPSAyOworCQl2YWwgPSAocGh5X2VuY29kZShQT1JUX1RZUEVfMTBHLCAwKSB8CisJCSAgICAgICBwaHlfZW5jb2RlKFBPUlRfVFlQRV8xMEcsIDEpKTsKIAl9IGVsc2UgewogCQllcnIgPSBmaWxsX3BoeV9wcm9iZV9pbmZvKG5wLCBwYXJlbnQsIGluZm8pOwogCQlpZiAoZXJyKQpAQCAtNzczMywxNSArODAxNCwxNiBAQAogCiAJaGF2ZV9wcm9wcyA9ICFlcnI7CiAKLQllcnIgPSBuaXVfZ2V0X2FuZF92YWxpZGF0ZV9wb3J0KG5wKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCiAJZXJyID0gbml1X2luaXRfbWFjX2lwcF9wY3NfYmFzZShucCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlmICghaGF2ZV9wcm9wcykgeworCWlmIChoYXZlX3Byb3BzKSB7CisJCWVyciA9IG5pdV9nZXRfYW5kX3ZhbGlkYXRlX3BvcnQobnApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCX0gZWxzZSAgewogCQlpZiAobnAtPnBhcmVudC0+cGxhdF90eXBlID09IFBMQVRfVFlQRV9OSVUpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtNzc1MywxMCArODAzNSwxNyBAQAogCQkJbml1X3BjaV92cGRfZmV0Y2gobnAsIG9mZnNldCk7CiAJCW53NjQoRVNQQ19QSU9fRU4sIDApOwogCi0JCWlmIChucC0+ZmxhZ3MgJiBOSVVfRkxBR1NfVlBEX1ZBTElEKQorCQlpZiAobnAtPmZsYWdzICYgTklVX0ZMQUdTX1ZQRF9WQUxJRCkgewogCQkJbml1X3BjaV92cGRfdmFsaWRhdGUobnApOworCQkJZXJyID0gbml1X2dldF9hbmRfdmFsaWRhdGVfcG9ydChucCk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCX0KIAogCQlpZiAoIShucC0+ZmxhZ3MgJiBOSVVfRkxBR1NfVlBEX1ZBTElEKSkgeworCQkJZXJyID0gbml1X2dldF9hbmRfdmFsaWRhdGVfcG9ydChucCk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CiAJCQllcnIgPSBuaXVfcGNpX3Byb2JlX3Nwcm9tKG5wKTsKIAkJCWlmIChlcnIpCiAJCQkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25pdS5oIGIvZHJpdmVycy9uZXQvbml1LmgKaW5kZXggMzM2YWVkMC4uOTdmZmJlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbml1LmgKKysrIGIvZHJpdmVycy9uZXQvbml1LmgKQEAgLTI1MzcsNiArMjUzNyw3IEBACiAKICNkZWZpbmUgTklVX1BIWV9JRF9NQVNLCQkJMHhmZmZmZjBmMAogI2RlZmluZSBOSVVfUEhZX0lEX0JDTTg3MDQJCTB4MDAyMDYwMzAKKyNkZWZpbmUgTklVX1BIWV9JRF9CQ004NzA2CQkweDAwMjA2MDM1CiAjZGVmaW5lIE5JVV9QSFlfSURfQkNNNTQ2NFIJCTB4MDAyMDYwYjAKICNkZWZpbmUgTklVX1BIWV9JRF9NUlZMODhYMjAxMQkJMHgwMTQxMDAyMAogCkBAIC0yOTM3LDYgKzI5MzgsMTUgQEAKIAogI2RlZmluZSBOSVVfTUFYX01UVQkJOTIxNgogCisvKiBWUEQgc3RyaW5ncyAqLworI2RlZmluZQlOSVVfUUdDX0xQX0JNX1NUUgkiNTAxLTc2MDYiCisjZGVmaW5lCU5JVV8yWEdGX0xQX0JNX1NUUgkiNTAxLTcyODMiCisjZGVmaW5lCU5JVV9RR0NfUEVNX0JNX1NUUgkiNTAxLTc3NjUiCisjZGVmaW5lCU5JVV8yWEdGX1BFTV9CTV9TVFIJIjUwMS03NjI2IgorI2RlZmluZQlOSVVfQUxPTlNPX0JNX1NUUgkiMzczLTAyMDIiCisjZGVmaW5lCU5JVV9GT1hYWV9CTV9TVFIJIjUwMS03OTYxIgorI2RlZmluZQlOSVVfMlhHRl9NUlZMX0JNX1NUUgkiU0stNkU4MiIKKwogI2RlZmluZSBOSVVfVlBEX01JTl9NQUpPUgkzCiAjZGVmaW5lIE5JVV9WUERfTUlOX01JTk9SCTQKIApAQCAtMzE5OSw2ICszMjA5LDggQEAKIAlzdHJ1Y3Qgbml1X3BhcmVudAkJKnBhcmVudDsKIAogCXUzMgkJCQlmbGFnczsKKyNkZWZpbmUgTklVX0ZMQUdTX0hPVFBMVUdfUEhZX1BSRVNFTlQJMHgwMjAwMDAwMCAvKiBSZW1vdmViYWxlIFBIWSBkZXRlY3RlZCovCisjZGVmaW5lIE5JVV9GTEFHU19IT1RQTFVHX1BIWQkJMHgwMTAwMDAwMCAvKiBSZW1vdmViYWxlIFBIWSAqLwogI2RlZmluZSBOSVVfRkxBR1NfVlBEX1ZBTElECQkweDAwODAwMDAwIC8qIFZQRCBoYXMgdmFsaWQgdmVyc2lvbiAqLwogI2RlZmluZSBOSVVfRkxBR1NfTVNJWAkJCTB4MDA0MDAwMDAgLyogTVNJLVggaW4gdXNlICovCiAjZGVmaW5lIE5JVV9GTEFHU19NQ0FTVAkJCTB4MDAyMDAwMDAgLyogbXVsdGljYXN0IGZpbHRlciBlbmFibGVkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvbWRpb19idXMuYyBiL2RyaXZlcnMvbmV0L3BoeS9tZGlvX2J1cy5jCmluZGV4IDk2MzYzMGMuLjk0ZTBiN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9tZGlvX2J1cy5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9tZGlvX2J1cy5jCkBAIC04OSw2ICs4OSw5IEBACiAKIAkJCXBoeWRldi0+YnVzID0gYnVzOwogCisJCQkvKiBSdW4gYWxsIG9mIHRoZSBmaXh1cHMgZm9yIHRoaXMgUEhZICovCisJCQlwaHlfc2Nhbl9maXh1cHMocGh5ZGV2KTsKKwogCQkJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZwaHlkZXYtPmRldik7CiAKIAkJCWlmIChlcnIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9waHkuYyBiL2RyaXZlcnMvbmV0L3BoeS9waHkuYwppbmRleCAxMmZjY2IxLi4zYzE4YmI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvcGh5L3BoeS5jCkBAIC00MDYsOCArNDA2LDEwIEBACiAJCQogCQlpZiAobWlpX2RhdGEtPnJlZ19udW0gPT0gTUlJX0JNQ1IgCiAJCQkJJiYgdmFsICYgQk1DUl9SRVNFVAotCQkJCSYmIHBoeWRldi0+ZHJ2LT5jb25maWdfaW5pdCkKKwkJCQkmJiBwaHlkZXYtPmRydi0+Y29uZmlnX2luaXQpIHsKKwkJCXBoeV9zY2FuX2ZpeHVwcyhwaHlkZXYpOwogCQkJcGh5ZGV2LT5kcnYtPmNvbmZpZ19pbml0KHBoeWRldik7CisJCX0KIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L3BoeV9kZXZpY2UuYyBiL2RyaXZlcnMvbmV0L3BoeS9waHlfZGV2aWNlLmMKaW5kZXggOGIxMTIxYi4uZGRmOGQ1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L3BoeV9kZXZpY2UuYworKysgYi9kcml2ZXJzL25ldC9waHkvcGh5X2RldmljZS5jCkBAIC01Myw2ICs1Myw5NiBAQAogCXBoeV9kZXZpY2VfZnJlZSh0b19waHlfZGV2aWNlKGRldikpOwogfQogCitzdGF0aWMgTElTVF9IRUFEKHBoeV9maXh1cF9saXN0KTsKK3N0YXRpYyBERUZJTkVfTVVURVgocGh5X2ZpeHVwX2xvY2spOworCisvKgorICogQ3JlYXRlcyBhIG5ldyBwaHlfZml4dXAgYW5kIGFkZHMgaXQgdG8gdGhlIGxpc3QKKyAqIEBidXNfaWQ6IEEgc3RyaW5nIHdoaWNoIG1hdGNoZXMgcGh5ZGV2LT5kZXYuYnVzX2lkIChvciBQSFlfQU5ZX0lEKQorICogQHBoeV91aWQ6IFVzZWQgdG8gbWF0Y2ggYWdhaW5zdCBwaHlkZXYtPnBoeV9pZCAodGhlIFVJRCBvZiB0aGUgUEhZKQorICogCUl0IGNhbiBhbHNvIGJlIFBIWV9BTllfVUlECisgKiBAcGh5X3VpZF9tYXNrOiBBcHBsaWVkIHRvIHBoeWRldi0+cGh5X2lkIGFuZCBmaXh1cC0+cGh5X3VpZCBiZWZvcmUKKyAqIAljb21wYXJpc29uCisgKiBAcnVuOiBUaGUgYWN0dWFsIGNvZGUgdG8gYmUgcnVuIHdoZW4gYSBtYXRjaGluZyBQSFkgaXMgZm91bmQKKyAqLworaW50IHBoeV9yZWdpc3Rlcl9maXh1cChjb25zdCBjaGFyICpidXNfaWQsIHUzMiBwaHlfdWlkLCB1MzIgcGh5X3VpZF9tYXNrLAorCQlpbnQgKCpydW4pKHN0cnVjdCBwaHlfZGV2aWNlICopKQoreworCXN0cnVjdCBwaHlfZml4dXAgKmZpeHVwOworCisJZml4dXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGh5X2ZpeHVwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmaXh1cCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzdHJuY3B5KGZpeHVwLT5idXNfaWQsIGJ1c19pZCwgQlVTX0lEX1NJWkUpOworCWZpeHVwLT5waHlfdWlkID0gcGh5X3VpZDsKKwlmaXh1cC0+cGh5X3VpZF9tYXNrID0gcGh5X3VpZF9tYXNrOworCWZpeHVwLT5ydW4gPSBydW47CisKKwltdXRleF9sb2NrKCZwaHlfZml4dXBfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmZml4dXAtPmxpc3QsICZwaHlfZml4dXBfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZwaHlfZml4dXBfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wocGh5X3JlZ2lzdGVyX2ZpeHVwKTsKKworLyogUmVnaXN0ZXJzIGEgZml4dXAgdG8gYmUgcnVuIG9uIGFueSBQSFkgd2l0aCB0aGUgVUlEIGluIHBoeV91aWQgKi8KK2ludCBwaHlfcmVnaXN0ZXJfZml4dXBfZm9yX3VpZCh1MzIgcGh5X3VpZCwgdTMyIHBoeV91aWRfbWFzaywKKwkJaW50ICgqcnVuKShzdHJ1Y3QgcGh5X2RldmljZSAqKSkKK3sKKwlyZXR1cm4gcGh5X3JlZ2lzdGVyX2ZpeHVwKFBIWV9BTllfSUQsIHBoeV91aWQsIHBoeV91aWRfbWFzaywgcnVuKTsKK30KK0VYUE9SVF9TWU1CT0wocGh5X3JlZ2lzdGVyX2ZpeHVwX2Zvcl91aWQpOworCisvKiBSZWdpc3RlcnMgYSBmaXh1cCB0byBiZSBydW4gb24gdGhlIFBIWSB3aXRoIGlkIHN0cmluZyBidXNfaWQgKi8KK2ludCBwaHlfcmVnaXN0ZXJfZml4dXBfZm9yX2lkKGNvbnN0IGNoYXIgKmJ1c19pZCwKKwkJaW50ICgqcnVuKShzdHJ1Y3QgcGh5X2RldmljZSAqKSkKK3sKKwlyZXR1cm4gcGh5X3JlZ2lzdGVyX2ZpeHVwKGJ1c19pZCwgUEhZX0FOWV9VSUQsIDB4ZmZmZmZmZmYsIHJ1bik7Cit9CitFWFBPUlRfU1lNQk9MKHBoeV9yZWdpc3Rlcl9maXh1cF9mb3JfaWQpOworCisvKgorICogUmV0dXJucyAxIGlmIGZpeHVwIG1hdGNoZXMgcGh5ZGV2IGluIGJ1c19pZCBhbmQgcGh5X3VpZC4KKyAqIEZpeHVwcyBjYW4gYmUgc2V0IHRvIG1hdGNoIGFueSBpbiBvbmUgb3IgbW9yZSBmaWVsZHMuCisgKi8KK3N0YXRpYyBpbnQgcGh5X25lZWRzX2ZpeHVwKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYsIHN0cnVjdCBwaHlfZml4dXAgKmZpeHVwKQoreworCWlmIChzdHJjbXAoZml4dXAtPmJ1c19pZCwgcGh5ZGV2LT5kZXYuYnVzX2lkKSAhPSAwKQorCQlpZiAoc3RyY21wKGZpeHVwLT5idXNfaWQsIFBIWV9BTllfSUQpICE9IDApCisJCQlyZXR1cm4gMDsKKworCWlmICgoZml4dXAtPnBoeV91aWQgJiBmaXh1cC0+cGh5X3VpZF9tYXNrKSAhPQorCQkJKHBoeWRldi0+cGh5X2lkICYgZml4dXAtPnBoeV91aWRfbWFzaykpCisJCWlmIChmaXh1cC0+cGh5X3VpZCAhPSBQSFlfQU5ZX1VJRCkKKwkJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKKy8qIFJ1bnMgYW55IG1hdGNoaW5nIGZpeHVwcyBmb3IgdGhpcyBwaHlkZXYgKi8KK2ludCBwaHlfc2Nhbl9maXh1cHMoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwlzdHJ1Y3QgcGh5X2ZpeHVwICpmaXh1cDsKKworCW11dGV4X2xvY2soJnBoeV9maXh1cF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZpeHVwLCAmcGh5X2ZpeHVwX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHBoeV9uZWVkc19maXh1cChwaHlkZXYsIGZpeHVwKSkgeworCQkJaW50IGVycjsKKworCQkJZXJyID0gZml4dXAtPnJ1bihwaHlkZXYpOworCisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCW11dGV4X3VubG9jaygmcGh5X2ZpeHVwX2xvY2spOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHBoeV9zY2FuX2ZpeHVwcyk7CisKIHN0cnVjdCBwaHlfZGV2aWNlKiBwaHlfZGV2aWNlX2NyZWF0ZShzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgYWRkciwgaW50IHBoeV9pZCkKIHsKIAlzdHJ1Y3QgcGh5X2RldmljZSAqZGV2OwpAQCAtMTc5LDEzICsyNjksMTMgQEAKICAqICAgY2hvb3NlIHRvIGNhbGwgb25seSB0aGUgc3Vic2V0IG9mIGZ1bmN0aW9ucyB3aGljaCBwcm92aWRlCiAgKiAgIHRoZSBkZXNpcmVkIGZ1bmN0aW9uYWxpdHkuCiAgKi8KLXN0cnVjdCBwaHlfZGV2aWNlICogcGh5X2Nvbm5lY3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqcGh5X2lkLAorc3RydWN0IHBoeV9kZXZpY2UgKiBwaHlfY29ubmVjdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpidXNfaWQsCiAJCXZvaWQgKCpoYW5kbGVyKShzdHJ1Y3QgbmV0X2RldmljZSAqKSwgdTMyIGZsYWdzLAogCQlwaHlfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKQogewogCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7CiAKLQlwaHlkZXYgPSBwaHlfYXR0YWNoKGRldiwgcGh5X2lkLCBmbGFncywgaW50ZXJmYWNlKTsKKwlwaHlkZXYgPSBwaHlfYXR0YWNoKGRldiwgYnVzX2lkLCBmbGFncywgaW50ZXJmYWNlKTsKIAogCWlmIChJU19FUlIocGh5ZGV2KSkKIAkJcmV0dXJuIHBoeWRldjsKQEAgLTIyNiw3ICszMTYsNyBAQAogLyoqCiAgKiBwaHlfYXR0YWNoIC0gYXR0YWNoIGEgbmV0d29yayBkZXZpY2UgdG8gYSBwYXJ0aWN1bGFyIFBIWSBkZXZpY2UKICAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHRvIGF0dGFjaAotICogQHBoeV9pZDogUEhZIGRldmljZSB0byBhdHRhY2gKKyAqIEBidXNfaWQ6IFBIWSBkZXZpY2UgdG8gYXR0YWNoCiAgKiBAZmxhZ3M6IFBIWSBkZXZpY2UncyBkZXZfZmxhZ3MKICAqIEBpbnRlcmZhY2U6IFBIWSBkZXZpY2UncyBpbnRlcmZhY2UKICAqCkBAIC0yMzgsNyArMzI4LDcgQEAKICAqICAgICBjaGFuZ2UuICBUaGUgcGh5X2RldmljZSBpcyByZXR1cm5lZCB0byB0aGUgYXR0YWNoaW5nIGRyaXZlci4KICAqLwogc3RydWN0IHBoeV9kZXZpY2UgKnBoeV9hdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJY29uc3QgY2hhciAqcGh5X2lkLCB1MzIgZmxhZ3MsIHBoeV9pbnRlcmZhY2VfdCBpbnRlcmZhY2UpCisJCWNvbnN0IGNoYXIgKmJ1c19pZCwgdTMyIGZsYWdzLCBwaHlfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKQogewogCXN0cnVjdCBidXNfdHlwZSAqYnVzID0gJm1kaW9fYnVzX3R5cGU7CiAJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKQEAgLTI0NiwxMiArMzM2LDEyIEBACiAKIAkvKiBTZWFyY2ggdGhlIGxpc3Qgb2YgUEhZIGRldmljZXMgb24gdGhlIG1kaW8gYnVzIGZvciB0aGUKIAkgKiBQSFkgd2l0aCB0aGUgcmVxdWVzdGVkIG5hbWUgKi8KLQlkID0gYnVzX2ZpbmRfZGV2aWNlKGJ1cywgTlVMTCwgKHZvaWQgKilwaHlfaWQsIHBoeV9jb21wYXJlX2lkKTsKKwlkID0gYnVzX2ZpbmRfZGV2aWNlKGJ1cywgTlVMTCwgKHZvaWQgKilidXNfaWQsIHBoeV9jb21wYXJlX2lkKTsKIAogCWlmIChkKSB7CiAJCXBoeWRldiA9IHRvX3BoeV9kZXZpY2UoZCk7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlcyBub3QgZm91bmRcbiIsIHBoeV9pZCk7CisJCXByaW50ayhLRVJOX0VSUiAiJXMgbm90IGZvdW5kXG4iLCBidXNfaWQpOwogCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKIAl9CiAKQEAgLTI3MSw3ICszNjEsNyBAQAogCiAJaWYgKHBoeWRldi0+YXR0YWNoZWRfZGV2KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzIGFscmVhZHkgYXR0YWNoZWRcbiIsCi0JCQkJZGV2LT5uYW1lLCBwaHlfaWQpOworCQkJCWRldi0+bmFtZSwgYnVzX2lkKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVCVVNZKTsKIAl9CiAKQEAgLTI4Nyw2ICszNzcsMTEgQEAKIAlpZiAocGh5ZGV2LT5kcnYtPmNvbmZpZ19pbml0KSB7CiAJCWludCBlcnI7CiAKKwkJZXJyID0gcGh5X3NjYW5fZml4dXBzKHBoeWRldik7CisKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCiAJCWVyciA9IHBoeWRldi0+ZHJ2LT5jb25maWdfaW5pdChwaHlkZXYpOwogCiAJCWlmIChlcnIgPCAwKQpAQCAtMzk1LDYgKzQ5MCw3IEBACiAgKi8KIGludCBnZW5waHlfc2V0dXBfZm9yY2VkKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCiB7CisJaW50IGVycjsKIAlpbnQgY3RsID0gMDsKIAogCXBoeWRldi0+cGF1c2UgPSBwaHlkZXYtPmFzeW1fcGF1c2UgPSAwOwpAQCAtNDA3LDE3ICs1MDMsMjYgQEAKIAlpZiAoRFVQTEVYX0ZVTEwgPT0gcGh5ZGV2LT5kdXBsZXgpCiAJCWN0bCB8PSBCTUNSX0ZVTExEUExYOwogCQotCWN0bCA9IHBoeV93cml0ZShwaHlkZXYsIE1JSV9CTUNSLCBjdGwpOworCWVyciA9IHBoeV93cml0ZShwaHlkZXYsIE1JSV9CTUNSLCBjdGwpOwogCi0JaWYgKGN0bCA8IDApCi0JCXJldHVybiBjdGw7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKgorCSAqIFJ1biB0aGUgZml4dXBzIG9uIHRoaXMgUEhZLCBqdXN0IGluIGNhc2UgdGhlCisJICogYm9hcmQgY29kZSBuZWVkcyB0byBjaGFuZ2Ugc29tZXRoaW5nIGFmdGVyIGEgcmVzZXQKKwkgKi8KKwllcnIgPSBwaHlfc2Nhbl9maXh1cHMocGh5ZGV2KTsKKworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwogCiAJLyogV2UganVzdCByZXNldCB0aGUgZGV2aWNlLCBzbyB3ZSdkIGJldHRlciBjb25maWd1cmUgYW55CiAJICogc2V0dGluZ3MgdGhlIFBIWSByZXF1aXJlcyB0byBvcGVyYXRlICovCiAJaWYgKHBoeWRldi0+ZHJ2LT5jb25maWdfaW5pdCkKLQkJY3RsID0gcGh5ZGV2LT5kcnYtPmNvbmZpZ19pbml0KHBoeWRldik7CisJCWVyciA9IHBoeWRldi0+ZHJ2LT5jb25maWdfaW5pdChwaHlkZXYpOwogCi0JcmV0dXJuIGN0bDsKKwlyZXR1cm4gZXJyOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3MyaW8uYyBiL2RyaXZlcnMvbmV0L3MyaW8uYwppbmRleCBkY2JlMDFiLi4xNTdmZDkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zMmlvLmMKKysrIGIvZHJpdmVycy9uZXQvczJpby5jCkBAIC04Niw3ICs4Niw3IEBACiAjaW5jbHVkZSAiczJpby5oIgogI2luY2x1ZGUgInMyaW8tcmVncy5oIgogCi0jZGVmaW5lIERSVl9WRVJTSU9OICIyLjAuMjYuMjAiCisjZGVmaW5lIERSVl9WRVJTSU9OICIyLjAuMjYuMjIiCiAKIC8qIFMyaW8gRHJpdmVyIG5hbWUgJiB2ZXJzaW9uLiAqLwogc3RhdGljIGNoYXIgczJpb19kcml2ZXJfbmFtZVtdID0gIk5ldGVyaW9uIjsKQEAgLTExNywyMCArMTE3LDYgQEAKIAogI2RlZmluZSBMSU5LX0lTX1VQKHZhbDY0KSAoISh2YWw2NCAmIChBREFQVEVSX1NUQVRVU19STUFDX1JFTU9URV9GQVVMVCB8IFwKIAkJCQkgICAgICBBREFQVEVSX1NUQVRVU19STUFDX0xPQ0FMX0ZBVUxUKSkpCi0jZGVmaW5lIFRBU0tMRVRfSU5fVVNFIHRlc3RfYW5kX3NldF9iaXQoMCwgKCZzcC0+dGFza2xldF9zdGF0dXMpKQotI2RlZmluZSBQQU5JQwkxCi0jZGVmaW5lIExPVwkyCi1zdGF0aWMgaW5saW5lIGludCByeF9idWZmZXJfbGV2ZWwoc3RydWN0IHMyaW9fbmljICogc3AsIGludCByeGJfc2l6ZSwgaW50IHJpbmcpCi17Ci0Jc3RydWN0IG1hY19pbmZvICptYWNfY29udHJvbDsKLQotCW1hY19jb250cm9sID0gJnNwLT5tYWNfY29udHJvbDsKLQlpZiAocnhiX3NpemUgPD0gcnhkX2NvdW50W3NwLT5yeGRfbW9kZV0pCi0JCXJldHVybiBQQU5JQzsKLQllbHNlIGlmICgobWFjX2NvbnRyb2wtPnJpbmdzW3JpbmddLnBrdF9jbnQgLSByeGJfc2l6ZSkgPiAxNikKLQkJcmV0dXJuICBMT1c7Ci0JcmV0dXJuIDA7Ci19CiAKIHN0YXRpYyBpbmxpbmUgaW50IGlzX3MyaW9fY2FyZF91cChjb25zdCBzdHJ1Y3QgczJpb19uaWMgKiBzcCkKIHsKQEAgLTI0NTgsNyArMjQ0NCw3IEBACiAJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+dHhfZmlmb19udW07IGkrKykgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWFjX2NvbnRyb2wtPmZpZm9zW2ldLnR4X2xvY2ssIGZsYWdzKTsKLQkJZm9yIChqID0gMDsgaiA8IGNvbmZpZy0+dHhfY2ZnW2ldLmZpZm9fbGVuIC0gMTsgaisrKSB7CisJCWZvciAoaiA9IDA7IGogPCBjb25maWctPnR4X2NmZ1tpXS5maWZvX2xlbjsgaisrKSB7CiAJCQl0eGRwID0gKHN0cnVjdCBUeEQgKikgXAogCQkJbWFjX2NvbnRyb2wtPmZpZm9zW2ldLmxpc3RfaW5mb1tqXS5saXN0X3ZpcnRfYWRkcjsKIAkJCXNrYiA9IHMyaW9fdHhkbF9nZXRza2IoJm1hY19jb250cm9sLT5maWZvc1tpXSwgdHhkcCwgaik7CkBAIC0yNTQ0LDcgKzI1MzAsNiBAQAogCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKIAl1NjQgdG1wOwogCXN0cnVjdCBidWZmQWRkICpiYTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBSeERfdCAqZmlyc3RfcnhkcCA9IE5VTEw7CiAJdTY0IEJ1ZmZlcjBfcHRyID0gMCwgQnVmZmVyMV9wdHIgPSAwOwogCXN0cnVjdCBSeEQxICpyeGRwMTsKQEAgLTI1OTIsMTUgKzI1NzcsNyBAQAogCQkJREJHX1BSSU5UKElOVFJfREJHLCAiJXM6IE5leHQgYmxvY2sgYXQ6ICVwXG4iLAogCQkJCSAgZGV2LT5uYW1lLCByeGRwKTsKIAkJfQotCQlpZighbmFwaSkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJm5pYy0+cHV0X2xvY2ssIGZsYWdzKTsKLQkJCW1hY19jb250cm9sLT5yaW5nc1tyaW5nX25vXS5wdXRfcG9zID0KLQkJCShibG9ja19ubyAqIChyeGRfY291bnRbbmljLT5yeGRfbW9kZV0gKyAxKSkgKyBvZmY7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuaWMtPnB1dF9sb2NrLCBmbGFncyk7Ci0JCX0gZWxzZSB7Ci0JCQltYWNfY29udHJvbC0+cmluZ3NbcmluZ19ub10ucHV0X3BvcyA9Ci0JCQkoYmxvY2tfbm8gKiAocnhkX2NvdW50W25pYy0+cnhkX21vZGVdICsgMSkpICsgb2ZmOwotCQl9CisKIAkJaWYgKChyeGRwLT5Db250cm9sXzEgJiBSWERfT1dOX1hFTkEpICYmCiAJCQkoKG5pYy0+cnhkX21vZGUgPT0gUlhEX01PREVfM0IpICYmCiAJCQkJKHJ4ZHAtPkNvbnRyb2xfMiAmIHMyQklUKDApKSkpIHsKQEAgLTI5NzgsNyArMjk1NSw3IEBACiB7CiAJc3RydWN0IHMyaW9fbmljICpuaWMgPSByaW5nX2RhdGEtPm5pYzsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIG5pYy0+ZGV2OwotCWludCBnZXRfYmxvY2ssIHB1dF9ibG9jaywgcHV0X29mZnNldDsKKwlpbnQgZ2V0X2Jsb2NrLCBwdXRfYmxvY2s7CiAJc3RydWN0IHJ4X2N1cnJfZ2V0X2luZm8gZ2V0X2luZm8sIHB1dF9pbmZvOwogCXN0cnVjdCBSeERfdCAqcnhkcDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMjk4NywxOSArMjk2NCwxMSBAQAogCXN0cnVjdCBSeEQxKiByeGRwMTsKIAlzdHJ1Y3QgUnhEMyogcnhkcDM7CiAKLQlzcGluX2xvY2soJm5pYy0+cnhfbG9jayk7Ci0KIAlnZXRfaW5mbyA9IHJpbmdfZGF0YS0+cnhfY3Vycl9nZXRfaW5mbzsKIAlnZXRfYmxvY2sgPSBnZXRfaW5mby5ibG9ja19pbmRleDsKIAltZW1jcHkoJnB1dF9pbmZvLCAmcmluZ19kYXRhLT5yeF9jdXJyX3B1dF9pbmZvLCBzaXplb2YocHV0X2luZm8pKTsKIAlwdXRfYmxvY2sgPSBwdXRfaW5mby5ibG9ja19pbmRleDsKIAlyeGRwID0gcmluZ19kYXRhLT5yeF9ibG9ja3NbZ2V0X2Jsb2NrXS5yeGRzW2dldF9pbmZvLm9mZnNldF0udmlydF9hZGRyOwotCWlmICghbmFwaSkgewotCQlzcGluX2xvY2soJm5pYy0+cHV0X2xvY2spOwotCQlwdXRfb2Zmc2V0ID0gcmluZ19kYXRhLT5wdXRfcG9zOwotCQlzcGluX3VubG9jaygmbmljLT5wdXRfbG9jayk7Ci0JfSBlbHNlCi0JCXB1dF9vZmZzZXQgPSByaW5nX2RhdGEtPnB1dF9wb3M7CiAKIAl3aGlsZSAoUlhEX0lTX1VQMkRUKHJ4ZHApKSB7CiAJCS8qCkBAIC0zMDE2LDcgKzI5ODUsNiBAQAogCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogVGhlIHNrYiBpcyAiLAogCQkJCSAgZGV2LT5uYW1lKTsKIAkJCURCR19QUklOVChFUlJfREJHLCAiTnVsbCBpbiBSeCBJbnRyXG4iKTsKLQkJCXNwaW5fdW5sb2NrKCZuaWMtPnJ4X2xvY2spOwogCQkJcmV0dXJuOwogCQl9CiAJCWlmIChuaWMtPnJ4ZF9tb2RlID09IFJYRF9NT0RFXzEpIHsKQEAgLTMwNzIsOCArMzA0MCw2IEBACiAJCQl9CiAJCX0KIAl9Ci0KLQlzcGluX3VubG9jaygmbmljLT5yeF9sb2NrKTsKIH0KIAogLyoqCkBAIC00MTA1LDcgKzQwNzEsNiBAQAogCQkJZG9fczJpb19kZWxldGVfdW5pY2FzdF9tYyhzcCwgdG1wNjQpOwogCX0KIAotCS8qIFJlc2V0IGNhcmQsIGtpbGwgdGFza2xldCBhbmQgZnJlZSBUeCBhbmQgUnggYnVmZmVycy4gKi8KIAlzMmlvX2NhcmRfZG93bihzcCk7CiAKIAlyZXR1cm4gMDsKQEAgLTQzNzAsMjkgKzQzMzUsOSBAQAogCiBzdGF0aWMgaW50IHMyaW9fY2hrX3J4X2J1ZmZlcnMoc3RydWN0IHMyaW9fbmljICpzcCwgaW50IHJuZ19uKQogewotCWludCByeGJfc2l6ZSwgbGV2ZWw7Ci0KLQlpZiAoIXNwLT5scm8pIHsKLQkJcnhiX3NpemUgPSBhdG9taWNfcmVhZCgmc3AtPnJ4X2J1ZnNfbGVmdFtybmdfbl0pOwotCQlsZXZlbCA9IHJ4X2J1ZmZlcl9sZXZlbChzcCwgcnhiX3NpemUsIHJuZ19uKTsKLQotCQlpZiAoKGxldmVsID09IFBBTklDKSAmJiAoIVRBU0tMRVRfSU5fVVNFKSkgewotCQkJaW50IHJldDsKLQkJCURCR19QUklOVChJTlRSX0RCRywgIiVzOiBSeCBCRCBoaXQgIiwgX19GVU5DVElPTl9fKTsKLQkJCURCR19QUklOVChJTlRSX0RCRywgIlBBTklDIGxldmVsc1xuIik7Ci0JCQlpZiAoKHJldCA9IGZpbGxfcnhfYnVmZmVycyhzcCwgcm5nX24pKSA9PSAtRU5PTUVNKSB7Ci0JCQkJREJHX1BSSU5UKElORk9fREJHLCAiT3V0IG9mIG1lbW9yeSBpbiAlcyIsCi0JCQkJCSAgX19GVU5DVElPTl9fKTsKLQkJCQljbGVhcl9iaXQoMCwgKCZzcC0+dGFza2xldF9zdGF0dXMpKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQljbGVhcl9iaXQoMCwgKCZzcC0+dGFza2xldF9zdGF0dXMpKTsKLQkJfSBlbHNlIGlmIChsZXZlbCA9PSBMT1cpCi0JCQl0YXNrbGV0X3NjaGVkdWxlKCZzcC0+dGFzayk7Ci0KLQl9IGVsc2UgaWYgKGZpbGxfcnhfYnVmZmVycyhzcCwgcm5nX24pID09IC1FTk9NRU0pIHsKLQkJCURCR19QUklOVChJTkZPX0RCRywgIiVzOk91dCBvZiBtZW1vcnkiLCBzcC0+ZGV2LT5uYW1lKTsKLQkJCURCR19QUklOVChJTkZPX0RCRywgIiBpbiBSeCBJbnRyISFcbiIpOworCWlmIChmaWxsX3J4X2J1ZmZlcnMoc3AsIHJuZ19uKSA9PSAtRU5PTUVNKSB7CisJCURCR19QUklOVChJTkZPX0RCRywgIiVzOk91dCBvZiBtZW1vcnkiLCBzcC0+ZGV2LT5uYW1lKTsKKwkJREJHX1BSSU5UKElORk9fREJHLCAiIGluIFJ4IEludHIhIVxuIik7CiAJfQogCXJldHVybiAwOwogfQpAQCAtNjc3MCw0OSArNjcxNSw2IEBACiB9CiAKIC8qKgotICogIHMyaW9fdGFza2xldCAtIEJvdHRvbSBoYWxmIG9mIHRoZSBJU1IuCi0gKiAgQGRldl9hZHIgOiBhZGRyZXNzIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlIGluIGRtYV9hZGRyX3QgZm9ybWF0LgotICogIERlc2NyaXB0aW9uOgotICogIFRoaXMgaXMgdGhlIHRhc2tsZXQgb3IgdGhlIGJvdHRvbSBoYWxmIG9mIHRoZSBJU1IuIFRoaXMgaXMKLSAqICBhbiBleHRlbnNpb24gb2YgdGhlIElTUiB3aGljaCBpcyBzY2hlZHVsZWQgYnkgdGhlIHNjaGVkdWxlciB0byBiZSBydW4KLSAqICB3aGVuIHRoZSBsb2FkIG9uIHRoZSBDUFUgaXMgbG93LiBBbGwgbG93IHByaW9yaXR5IHRhc2tzIG9mIHRoZSBJU1IgY2FuCi0gKiAgYmUgcHVzaGVkIGludG8gdGhlIHRhc2tsZXQuIEZvciBub3cgdGhlIHRhc2tsZXQgaXMgdXNlZCBvbmx5IHRvCi0gKiAgcmVwbGVuaXNoIHRoZSBSeCBidWZmZXJzIGluIHRoZSBSeCBidWZmZXIgZGVzY3JpcHRvcnMuCi0gKiAgUmV0dXJuIHZhbHVlOgotICogIHZvaWQuCi0gKi8KLQotc3RhdGljIHZvaWQgczJpb190YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGV2X2FkZHIpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfYWRkcjsKLQlzdHJ1Y3QgczJpb19uaWMgKnNwID0gZGV2LT5wcml2OwotCWludCBpLCByZXQ7Ci0Jc3RydWN0IG1hY19pbmZvICptYWNfY29udHJvbDsKLQlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7Ci0KLQltYWNfY29udHJvbCA9ICZzcC0+bWFjX2NvbnRyb2w7Ci0JY29uZmlnID0gJnNwLT5jb25maWc7Ci0KLQlpZiAoIVRBU0tMRVRfSU5fVVNFKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnJ4X3JpbmdfbnVtOyBpKyspIHsKLQkJCXJldCA9IGZpbGxfcnhfYnVmZmVycyhzcCwgaSk7Ci0JCQlpZiAocmV0ID09IC1FTk9NRU0pIHsKLQkJCQlEQkdfUFJJTlQoSU5GT19EQkcsICIlczogT3V0IG9mICIsCi0JCQkJCSAgZGV2LT5uYW1lKTsKLQkJCQlEQkdfUFJJTlQoSU5GT19EQkcsICJtZW1vcnkgaW4gdGFza2xldFxuIik7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKHJldCA9PSAtRUZJTEwpIHsKLQkJCQlEQkdfUFJJTlQoSU5GT19EQkcsCi0JCQkJCSAgIiVzOiBSeCBSaW5nICVkIGlzIGZ1bGxcbiIsCi0JCQkJCSAgZGV2LT5uYW1lLCBpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQljbGVhcl9iaXQoMCwgKCZzcC0+dGFza2xldF9zdGF0dXMpKTsKLQl9Ci19Ci0KLS8qKgogICogczJpb19zZXRfbGluayAtIFNldCB0aGUgTEluayBzdGF0dXMKICAqIEBkYXRhOiBsb25nIHBvaW50ZXIgdG8gZGV2aWNlIHByaXZhdGUgc3RydWN0dWUKICAqIERlc2NyaXB0aW9uOiBTZXRzIHRoZSBsaW5rIHN0YXR1cyBmb3IgdGhlIGFkYXB0ZXIKQEAgLTcxNjEsNyArNzA2Myw2IEBACiB7CiAJaW50IGNudCA9IDA7CiAJc3RydWN0IFhFTkFfZGV2X2NvbmZpZyBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlyZWdpc3RlciB1NjQgdmFsNjQgPSAwOwogCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKIAljb25maWcgPSAmc3AtPmNvbmZpZzsKQEAgLTcxODYsOSArNzA4Nyw2IEBACiAKIAlzMmlvX3JlbV9pc3Ioc3ApOwogCi0JLyogS2lsbCB0YXNrbGV0LiAqLwotCXRhc2tsZXRfa2lsbCgmc3AtPnRhc2spOwotCiAJLyogQ2hlY2sgaWYgdGhlIGRldmljZSBpcyBRdWllc2NlbnQgYW5kIHRoZW4gUmVzZXQgdGhlIE5JQyAqLwogCXdoaWxlKGRvX2lvKSB7CiAJCS8qIEFzIHBlciB0aGUgSFcgcmVxdWlyZW1lbnQgd2UgbmVlZCB0byByZXBsZW5pc2ggdGhlCkBAIC03MjIzLDkgKzcxMjEsNyBAQAogCWZyZWVfdHhfYnVmZmVycyhzcCk7CiAKIAkvKiBGcmVlIGFsbCBSeCBidWZmZXJzICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNwLT5yeF9sb2NrLCBmbGFncyk7CiAJZnJlZV9yeF9idWZmZXJzKHNwKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcC0+cnhfbG9jaywgZmxhZ3MpOwogCiAJY2xlYXJfYml0KF9fUzJJT19TVEFURV9MSU5LX1RBU0ssICYoc3AtPnN0YXRlKSk7CiB9CkBAIC03MzE0LDkgKzcyMTAsNiBAQAogCiAJUzJJT19USU1FUl9DT05GKHNwLT5hbGFybV90aW1lciwgczJpb19hbGFybV9oYW5kbGUsIHNwLCAoSFovMikpOwogCi0JLyogRW5hYmxlIHRhc2tsZXQgZm9yIHRoZSBkZXZpY2UgKi8KLQl0YXNrbGV0X2luaXQoJnNwLT50YXNrLCBzMmlvX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKSBkZXYpOwotCiAJLyogIEVuYWJsZSBzZWxlY3QgaW50ZXJydXB0cyAqLwogCWVuX2Rpc19lcnJfYWxhcm1zKHNwLCBFTkFfQUxMX0lOVFJTLCBFTkFCTEVfSU5UUlMpOwogCWlmIChzcC0+Y29uZmlnLmludHJfdHlwZSAhPSBJTlRBKQpAQCAtODExOSwyMCArODAxMiwxNSBAQAogCXMyaW9fcmVzZXQoc3ApOwogCiAJLyoKLQkgKiBJbml0aWFsaXplIHRoZSB0YXNrbGV0IHN0YXR1cyBhbmQgbGluayBzdGF0ZSBmbGFncworCSAqIEluaXRpYWxpemUgbGluayBzdGF0ZSBmbGFncwogCSAqIGFuZCB0aGUgY2FyZCBzdGF0ZSBwYXJhbWV0ZXIKIAkgKi8KLQlzcC0+dGFza2xldF9zdGF0dXMgPSAwOwogCXNwLT5zdGF0ZSA9IDA7CiAKIAkvKiBJbml0aWFsaXplIHNwaW5sb2NrcyAqLwogCWZvciAoaSA9IDA7IGkgPCBzcC0+Y29uZmlnLnR4X2ZpZm9fbnVtOyBpKyspCiAJCXNwaW5fbG9ja19pbml0KCZtYWNfY29udHJvbC0+Zmlmb3NbaV0udHhfbG9jayk7CiAKLQlpZiAoIW5hcGkpCi0JCXNwaW5fbG9ja19pbml0KCZzcC0+cHV0X2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZzcC0+cnhfbG9jayk7Ci0KIAkvKgogCSAqIFNYRS0wMDI6IENvbmZpZ3VyZSBsaW5rIGFuZCBhY3Rpdml0eSBMRUQgdG8gaW5pdCBzdGF0ZQogCSAqIG9uIGRyaXZlciBsb2FkLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvczJpby5oIGIvZHJpdmVycy9uZXQvczJpby5oCmluZGV4IGU2OGZkZjcuLmNlNTNhMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3MyaW8uaAorKysgYi9kcml2ZXJzL25ldC9zMmlvLmgKQEAgLTcwMyw5ICs3MDMsNiBAQAogCSAqLwogCXN0cnVjdCByeF9jdXJyX2dldF9pbmZvIHJ4X2N1cnJfZ2V0X2luZm87CiAKLQkvKiBJbmRleCB0byB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHB1dCBwb2ludGVyIG9mIFJ4IHJpbmcgKi8KLQlpbnQgcHV0X3BvczsKLQogCS8qIEJ1ZmZlciBBZGRyZXNzIHN0b3JlLiAqLwogCXN0cnVjdCBidWZmQWRkICoqYmE7CiAJc3RydWN0IHMyaW9fbmljICpuaWM7CkBAIC04NjgsOCArODY1LDYgQEAKIAlpbnQgZGV2aWNlX2VuYWJsZWRfb25jZTsKIAogCWNoYXIgbmFtZVs2MF07Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IHRhc2s7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB0YXNrbGV0X3N0YXR1czsKIAogCS8qIFRpbWVyIHRoYXQgaGFuZGxlcyBJL08gZXJyb3JzL2V4Y2VwdGlvbnMgKi8KIAlzdHJ1Y3QgdGltZXJfbGlzdCBhbGFybV90aW1lcjsKQEAgLTg3OSw4ICs4NzQsNiBAQAogCiAJYXRvbWljX3QgcnhfYnVmc19sZWZ0W01BWF9SWF9SSU5HU107CiAKLQlzcGlubG9ja190IHB1dF9sb2NrOwotCiAjZGVmaW5lIFBST01JU0MgICAgIDEKICNkZWZpbmUgQUxMX01VTFRJICAgMgogCkBAIC05NjQsNyArOTU3LDYgQEAKIAl1OAkJbHJvOwogCXUxNgkJbHJvX21heF9hZ2dyX3Blcl9zZXNzOwogCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgc3RhdGU7Ci0Jc3BpbmxvY2tfdAlyeF9sb2NrOwogCXU2NAkJZ2VuZXJhbF9pbnRfbWFzazsKICNkZWZpbmUgVlBEX1NUUklOR19MRU4gODAKIAl1OCAgcHJvZHVjdF9uYW1lW1ZQRF9TVFJJTkdfTEVOXTsKQEAgLTEwOTQsNyArMTA4Niw2IEBACiBzdGF0aWMgaW50IHMyaW9fc3RhcnRlcih2b2lkKTsKIHN0YXRpYyB2b2lkIHMyaW9fY2xvc2VyKHZvaWQpOwogc3RhdGljIHZvaWQgczJpb190eF93YXRjaGRvZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIHMyaW9fdGFza2xldCh1bnNpZ25lZCBsb25nIGRldl9hZGRyKTsKIHN0YXRpYyB2b2lkIHMyaW9fc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQgcnhfb3NtX2hhbmRsZXIoc3RydWN0IHJpbmdfaW5mbyAqcmluZ19kYXRhLCBzdHJ1Y3QgUnhEX3QgKiByeGRwKTsKIHN0YXRpYyB2b2lkIHMyaW9fbGluayhzdHJ1Y3QgczJpb19uaWMgKiBzcCwgaW50IGxpbmspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2dpc2VlcS5jIGIvZHJpdmVycy9uZXQvc2dpc2VlcS5jCmluZGV4IDc4OTk0ZWQuLjYyNjEyMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NnaXNlZXEuYworKysgYi9kcml2ZXJzL25ldC9zZ2lzZWVxLmMKQEAgLTgyNSw3ICs4MjUsOCBAQAogCS5wcm9iZQk9IHNnaXNlZXFfcHJvYmUsCiAJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKHNnaXNlZXFfcmVtb3ZlKSwKIAkuZHJpdmVyID0gewotCQkubmFtZQk9ICJzZ2lzZWVxIgorCQkubmFtZQk9ICJzZ2lzZWVxIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfQogfTsKIApAQCAtODUwLDMgKzg1MSw0IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIlNHSSBTZWVxIDgwMDMgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJMaW51eC9NSVBTIE1haWxpbmcgTGlzdCA8bGludXgtbWlwc0BsaW51eC1taXBzLm9yZz4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06c2dpc2VlcSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc21jOTExeC5jIGIvZHJpdmVycy9uZXQvc21jOTExeC5jCmluZGV4IDc2Y2MxZDMuLjRlMjgwMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NtYzkxMXguYworKysgYi9kcml2ZXJzL25ldC9zbWM5MTF4LmMKQEAgLTkyLDYgKzkyLDcgQEAKIE1PRFVMRV9QQVJNX0RFU0ModHhfZmlmb19rYiwidHJhbnNtaXQgRklGTyBzaXplIGluIEtCICgxPHg8MTUpKGRlZmF1bHQ9OCkiKTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzbWM5MTF4Iik7CiAKIC8qCiAgKiBUaGUgaW50ZXJuYWwgd29ya2luZ3Mgb2YgdGhlIGRyaXZlci4gIElmIHlvdSBhcmUgY2hhbmdpbmcgYW55dGhpbmcKQEAgLTI0Myw3ICsyNDQsNyBAQAogCQlkbyB7CiAJCQl1ZGVsYXkoMTApOwogCQkJcmVnID0gU01DX0dFVF9QTVRfQ1RSTCgpICYgUE1UX0NUUkxfUkVBRFlfOwotCQl9IHdoaWxlICggdGltZW91dC0tICYmICFyZWcpOworCQl9IHdoaWxlICgtLXRpbWVvdXQgJiYgIXJlZyk7CiAJCWlmICh0aW1lb3V0ID09IDApIHsKIAkJCVBSSU5USygiJXM6IHNtYzkxMXhfcmVzZXQgdGltZW91dCB3YWl0aW5nIGZvciBQTSByZXN0b3JlXG4iLCBkZXYtPm5hbWUpOwogCQkJcmV0dXJuOwpAQCAtMjY3LDcgKzI2OCw3IEBACiAJCQkJcmVzZXRzKys7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCX0gd2hpbGUgKCB0aW1lb3V0LS0gJiYgKHJlZyAmIEhXX0NGR19TUlNUXykpOworCQl9IHdoaWxlICgtLXRpbWVvdXQgJiYgKHJlZyAmIEhXX0NGR19TUlNUXykpOwogCX0KIAlpZiAodGltZW91dCA9PSAwKSB7CiAJCVBSSU5USygiJXM6IHNtYzkxMXhfcmVzZXQgdGltZW91dCB3YWl0aW5nIGZvciByZXNldFxuIiwgZGV2LT5uYW1lKTsKQEAgLTQxMyw3ICs0MTQsNyBAQAogCQlkbyB7CiAJCQl1ZGVsYXkoMTApOwogCQkJcmVnID0gU01DX0dFVF9SWF9EUF9DVFJMKCkgJiBSWF9EUF9DVFJMX0ZGV0RfQlVTWV87Ci0JCX0gd2hpbGUgKCB0aW1lb3V0LS0gJiYgcmVnKTsKKwkJfSB3aGlsZSAoLS10aW1lb3V0ICYmIHJlZyk7CiAJCWlmICh0aW1lb3V0ID09IDApIHsKIAkJCVBSSU5USygiJXM6IHRpbWVvdXQgd2FpdGluZyBmb3IgUlggZmFzdCBmb3J3YXJkXG4iLCBkZXYtPm5hbWUpOwogCQl9CkBAIC0yMjYyLDYgKzIyNjMsNyBAQAogCS5yZXN1bWUJID0gc21jOTExeF9kcnZfcmVzdW1lLAogCS5kcml2ZXIJID0gewogCQkubmFtZQkgPSBDQVJETkFNRSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYzkxeC5jIGIvZHJpdmVycy9uZXQvc21jOTF4LmMKaW5kZXggNjAwYjkyYS4uYTE4OGUzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21jOTF4LmMKKysrIGIvZHJpdmVycy9uZXQvc21jOTF4LmMKQEAgLTEzMiw2ICsxMzIsNyBAQAogTU9EVUxFX1BBUk1fREVTQyh3YXRjaGRvZywgInRyYW5zbWl0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIik7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06c21jOTF4Iik7CiAKIC8qCiAgKiBUaGUgaW50ZXJuYWwgd29ya2luZ3Mgb2YgdGhlIGRyaXZlci4gIElmIHlvdSBhcmUgY2hhbmdpbmcgYW55dGhpbmcKQEAgLTIzMDgsNiArMjMwOSw3IEBACiAJLnJlc3VtZQkJPSBzbWNfZHJ2X3Jlc3VtZSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSBDQVJETkFNRSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NuaV84MjU5Ni5jIGIvZHJpdmVycy9uZXQvc25pXzgyNTk2LmMKaW5kZXggMmNmNjc5NC4uODU0Y2NmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc25pXzgyNTk2LmMKKysrIGIvZHJpdmVycy9uZXQvc25pXzgyNTk2LmMKQEAgLTQ0LDYgKzQ0LDcgQEAKIE1PRFVMRV9BVVRIT1IoIlRob21hcyBCb2dlbmRvZXJmZXIiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiaTgyNTk2IGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzbmlybV84MjU5NiIpOwogbW9kdWxlX3BhcmFtKGk1OTZfZGVidWcsIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGk1OTZfZGVidWcsICI4MjU5NiBkZWJ1ZyBtYXNrIik7CiAKQEAgLTE2Niw2ICsxNjcsNyBAQAogCS5yZW1vdmUJPSBfX2RldmV4aXRfcChzbmlfODI1OTZfZHJpdmVyX3JlbW92ZSksCiAJLmRyaXZlcgk9IHsKIAkJLm5hbWUJPSBzbmlfODI1OTZfc3RyaW5nLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGVodXRpLmMgYi9kcml2ZXJzL25ldC90ZWh1dGkuYwppbmRleCAxNzU4NWU1Li5lODNiMTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90ZWh1dGkuYworKysgYi9kcml2ZXJzL25ldC90ZWh1dGkuYwpAQCAtNjI1LDYgKzYyNSwxMiBAQAogCQlzX2Zpcm1Mb2FkW2ldID0gQ1BVX0NISVBfU1dBUDMyKHNfZmlybUxvYWRbaV0pOwogfQogCitzdGF0aWMgaW50IGJkeF9yYW5nZV9jaGVjayhzdHJ1Y3QgYmR4X3ByaXYgKnByaXYsIHUzMiBvZmZzZXQpCit7CisJcmV0dXJuIChvZmZzZXQgPiAodTMyKSAoQkRYX1JFR1NfU0laRSAvIHByaXYtPm5pYy0+cG9ydF9udW0pKSA/CisJCS1FSU5WQUwgOiAwOworfQorCiBzdGF0aWMgaW50IGJkeF9pb2N0bF9wcml2KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKIHsKIAlzdHJ1Y3QgYmR4X3ByaXYgKnByaXYgPSBuZGV2LT5wcml2OwpAQCAtNjQzLDkgKzY0OSwxNSBAQAogCQlEQkcoIiVkIDB4JXggMHgleFxuIiwgZGF0YVswXSwgZGF0YVsxXSwgZGF0YVsyXSk7CiAJfQogCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCiAJc3dpdGNoIChkYXRhWzBdKSB7CiAKIAljYXNlIEJEWF9PUF9SRUFEOgorCQllcnJvciA9IGJkeF9yYW5nZV9jaGVjayhwcml2LCBkYXRhWzFdKTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCXJldHVybiBlcnJvcjsKIAkJZGF0YVsyXSA9IFJFQURfUkVHKHByaXYsIGRhdGFbMV0pOwogCQlEQkcoInJlYWRfcmVnKDB4JXgpPTB4JXggKGRlYyAlZClcbiIsIGRhdGFbMV0sIGRhdGFbMl0sCiAJCSAgICBkYXRhWzJdKTsKQEAgLTY1NSw2ICs2NjcsOSBAQAogCQlicmVhazsKIAogCWNhc2UgQkRYX09QX1dSSVRFOgorCQllcnJvciA9IGJkeF9yYW5nZV9jaGVjayhwcml2LCBkYXRhWzFdKTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCXJldHVybiBlcnJvcjsKIAkJV1JJVEVfUkVHKHByaXYsIGRhdGFbMV0sIGRhdGFbMl0pOwogCQlEQkcoIndyaXRlX3JlZygweCV4LCAweCV4KVxuIiwgZGF0YVsxXSwgZGF0YVsyXSk7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGczLmMgYi9kcml2ZXJzL25ldC90ZzMuYwppbmRleCBiYzRjNjJiLi5lM2Y3NGM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90ZzMuYworKysgYi9kcml2ZXJzL25ldC90ZzMuYwpAQCAtNDAxNyw2ICs0MDE3LDggQEAKICAqIEludm9rZWQgd2l0aCB0cC0+bG9jayBoZWxkLgogICovCiBzdGF0aWMgaW50IHRnM19yZXN0YXJ0X2h3KHN0cnVjdCB0ZzMgKnRwLCBpbnQgcmVzZXRfcGh5KQorCV9fcmVsZWFzZXModHAtPmxvY2spCisJX19hY3F1aXJlcyh0cC0+bG9jaykKIHsKIAlpbnQgZXJyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90c2kxMDhfZXRoLmMgYi9kcml2ZXJzL25ldC90c2kxMDhfZXRoLmMKaW5kZXggNmYzM2Y4NC4uNjAxN2Q1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHNpMTA4X2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L3RzaTEwOF9ldGguYwpAQCAtMTYyLDYgKzE2Miw3IEBACiAJLnJlbW92ZSA9IHRzaTEwOF9ldGhlcl9yZW1vdmUsCiAJLmRyaXZlcgk9IHsKIAkJLm5hbWUgPSAidHNpLWV0aGVybmV0IiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJfSwKIH07CiAKQEAgLTE3MjksMyArMTczMCw0IEBACiBNT0RVTEVfQVVUSE9SKCJUdW5kcmEgU2VtaWNvbmR1Y3RvciBDb3Jwb3JhdGlvbiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJUc2kxMDggR2lnYWJpdCBFdGhlcm5ldCBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06dHNpLWV0aGVybmV0Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90eXBob29uLmMgYi9kcml2ZXJzL25ldC90eXBob29uLmMKaW5kZXggMzMzOTYxYi4uYzBkZDI1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHlwaG9vbi5jCisrKyBiL2RyaXZlcnMvbmV0L3R5cGhvb24uYwpAQCAtMjE4Myw3ICsyMTgzLDYgQEAKIAl9CiAKIAluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7Ci0JbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKIAlyZXR1cm4gMDsKIAogcmVzZXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91Y2NfZ2V0aC5jIGIvZHJpdmVycy9uZXQvdWNjX2dldGguYwppbmRleCAyZjExMjU0Li4yODFjZTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91Y2NfZ2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMKQEAgLTM5MzIsNyArMzkzMiw3IEBACiAJdWdfaW5mby0+dWZfaW5mby5pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7CiAJZml4ZWRfbGluayA9IG9mX2dldF9wcm9wZXJ0eShucCwgImZpeGVkLWxpbmsiLCBOVUxMKTsKIAlpZiAoZml4ZWRfbGluaykgewotCQl1Z19pbmZvLT5tZGlvX2J1cyA9IDA7CisJCXNucHJpbnRmKHVnX2luZm8tPm1kaW9fYnVzLCBNSUlfQlVTX0lEX1NJWkUsICIwIik7CiAJCXVnX2luZm8tPnBoeV9hZGRyZXNzID0gZml4ZWRfbGlua1swXTsKIAkJcGh5ID0gTlVMTDsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmMgYi9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuYwppbmRleCBlZDFhZmFmLi42YjhkODgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuYworKysgYi9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuYwpAQCAtNjA1LDcgKzYwNSw2IEBACiBzdGF0aWMgdm9pZCB2ZWxvY2l0eV9pbml0X2NhbV9maWx0ZXIoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCiB7CiAJc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzID0gdnB0ci0+bWFjX3JlZ3M7Ci0JdW5zaWduZWQgc2hvcnQgdmlkOwogCiAJLyogVHVybiBvbiBNQ0ZHX1BRRU4sIHR1cm4gb2ZmIE1DRkdfUlRHT1BUICovCiAJV09SRF9SRUdfQklUU19TRVQoTUNGR19QUUVOLCBNQ0ZHX1JUR09QVCwgJnJlZ3MtPk1DRkcpOwpAQCAtNjE3LDI5ICs2MTYsMzMgQEAKIAltYWNfc2V0X3ZsYW5fY2FtX21hc2socmVncywgdnB0ci0+dkNBTW1hc2spOwogCW1hY19zZXRfY2FtX21hc2socmVncywgdnB0ci0+bUNBTW1hc2spOwogCi0JLyogRW5hYmxlIGZpcnN0IFZDQU0gKi8KKwkvKiBFbmFibGUgVkNBTXMgKi8KIAlpZiAodnB0ci0+dmxncnApIHsKLQkJZm9yICh2aWQgPSAwOyB2aWQgPCBWTEFOX1ZJRF9NQVNLOyB2aWQrKykgewotCQkJaWYgKHZsYW5fZ3JvdXBfZ2V0X2RldmljZSh2cHRyLT52bGdycCwgdmlkKSkgewotCQkJCS8qIElmIFRhZ2dpbmcgb3B0aW9uIGlzIGVuYWJsZWQgYW5kCi0JCQkJICAgVkxBTiBJRCBpcyBub3QgemVybywgdGhlbgotCQkJCSAgIHR1cm4gb24gTUNGR19SVEdPUFQgYWxzbyAqLwotCQkJCWlmICh2aWQgIT0gMCkKLQkJCQkJV09SRF9SRUdfQklUU19PTihNQ0ZHX1JUR09QVCwgJnJlZ3MtPk1DRkcpOworCQl1bnNpZ25lZCBpbnQgdmlkLCBpID0gMDsKIAotCQkJCW1hY19zZXRfdmxhbl9jYW0ocmVncywgMCwgKHU4ICopICZ2aWQpOworCQlpZiAoIXZsYW5fZ3JvdXBfZ2V0X2RldmljZSh2cHRyLT52bGdycCwgMCkpCisJCQlXT1JEX1JFR19CSVRTX09OKE1DRkdfUlRHT1BULCAmcmVncy0+TUNGRyk7CisKKwkJZm9yICh2aWQgPSAxOyAodmlkIDwgVkxBTl9WSURfTUFTSyk7IHZpZCsrKSB7CisJCQlpZiAodmxhbl9ncm91cF9nZXRfZGV2aWNlKHZwdHItPnZsZ3JwLCB2aWQpKSB7CisJCQkJbWFjX3NldF92bGFuX2NhbShyZWdzLCBpLCAodTggKikgJnZpZCk7CisJCQkJdnB0ci0+dkNBTW1hc2tbaSAvIDhdIHw9IDB4MSA8PCAoaSAlIDgpOworCQkJCWlmICgrK2kgPj0gVkNBTV9TSVpFKQorCQkJCQlicmVhazsKIAkJCX0KIAkJfQotCQl2cHRyLT52Q0FNbWFza1swXSB8PSAxOwogCQltYWNfc2V0X3ZsYW5fY2FtX21hc2socmVncywgdnB0ci0+dkNBTW1hc2spOwotCX0gZWxzZSB7Ci0JCXUxNiB0ZW1wID0gMDsKLQkJbWFjX3NldF92bGFuX2NhbShyZWdzLCAwLCAodTggKikgJnRlbXApOwotCQl0ZW1wID0gMTsKLQkJbWFjX3NldF92bGFuX2NhbV9tYXNrKHJlZ3MsICh1OCAqKSAmdGVtcCk7CiAJfQogfQogCitzdGF0aWMgdm9pZCB2ZWxvY2l0eV92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKK3sKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IG5ldGRldl9wcml2KGRldik7CisKKwl2cHRyLT52bGdycCA9IGdycDsKK30KKwogc3RhdGljIHZvaWQgdmVsb2NpdHlfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKIHsKIAlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IG5ldGRldl9wcml2KGRldik7CkBAIC05NTksMTEgKzk2MiwxMyBAQAogCiAJZGV2LT52bGFuX3J4X2FkZF92aWQgPSB2ZWxvY2l0eV92bGFuX3J4X2FkZF92aWQ7CiAJZGV2LT52bGFuX3J4X2tpbGxfdmlkID0gdmVsb2NpdHlfdmxhbl9yeF9raWxsX3ZpZDsKKwlkZXYtPnZsYW5fcnhfcmVnaXN0ZXIgPSB2ZWxvY2l0eV92bGFuX3J4X3JlZ2lzdGVyOwogCiAjaWZkZWYgIFZFTE9DSVRZX1pFUk9fQ09QWV9TVVBQT1JUCiAJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHOwogI2VuZGlmCi0JZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fRklMVEVSOworCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX0ZJTFRFUiB8CisJCU5FVElGX0ZfSFdfVkxBTl9SWDsKIAogCWlmICh2cHRyLT5mbGFncyAmIFZFTE9DSVRZX0ZMQUdTX1RYX0NTVU0pCiAJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9JUF9DU1VNOwpAQCAtMTU5Nyw4ICsxNjAyLDEzIEBACiAJc2tiX3B1dChza2IsIHBrdF9sZW4gLSA0KTsKIAlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCB2cHRyLT5kZXYpOwogCisJaWYgKHZwdHItPnZsZ3JwICYmIChyZC0+cmRlc2MwLlJTUiAmIFJTUl9ERVRBRykpIHsKKwkJdmxhbl9od2FjY2VsX3J4KHNrYiwgdnB0ci0+dmxncnAsCisJCQkJc3dhYjE2KGxlMTZfdG9fY3B1KHJkLT5yZGVzYzEuUFFUQUcpKSk7CisJfSBlbHNlCisJCW5ldGlmX3J4KHNrYik7CisKIAlzdGF0cy0+cnhfYnl0ZXMgKz0gcGt0X2xlbjsKLQluZXRpZl9yeChza2IpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vYzEwMS5jIGIvZHJpdmVycy9uZXQvd2FuL2MxMDEuYwppbmRleCBjNGM4ZWFiLi5jMmNjNDJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vYzEwMS5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9jMTAxLmMKQEAgLTQwMiw3ICs0MDIsNyBAQAogI2lmZGVmIE1PRFVMRQogCQlwcmludGsoS0VSTl9JTkZPICJjMTAxOiBubyBjYXJkIGluaXRpYWxpemVkXG4iKTsKICNlbmRpZgotCQlyZXR1cm4gLUVOT1NZUzsJLyogbm8gcGFyYW1ldGVycyBzcGVjaWZpZWQsIGFib3J0ICovCisJCXJldHVybiAtRUlOVkFMOwkvKiBubyBwYXJhbWV0ZXJzIHNwZWNpZmllZCwgYWJvcnQgKi8KIAl9CiAKIAlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgdmVyc2lvbik7CkBAIC00MjAsMTEgKzQyMCwxMSBAQAogCQkJYzEwMV9ydW4oaXJxLCByYW0pOwogCiAJCWlmICgqaHcgPT0gJ1x4MCcpCi0JCQlyZXR1cm4gZmlyc3RfY2FyZCA/IDAgOiAtRU5PU1lTOworCQkJcmV0dXJuIGZpcnN0X2NhcmQgPyAwIDogLUVJTlZBTDsKIAl9d2hpbGUoKmh3KysgPT0gJzonKTsKIAogCXByaW50ayhLRVJOX0VSUiAiYzEwMTogaW52YWxpZCBoYXJkd2FyZSBwYXJhbWV0ZXJzXG4iKTsKLQlyZXR1cm4gZmlyc3RfY2FyZCA/IDAgOiAtRU5PU1lTOworCXJldHVybiBmaXJzdF9jYXJkID8gMCA6IC1FSU5WQUw7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfZnIuYyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2ZyLmMKaW5kZXggYzRhYjAzMi4uNTIwYmIwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfZnIuYworKysgYi9kcml2ZXJzL25ldC93YW4vaGRsY19mci5jCkBAIC0xMDkwLDEwICsxMDkwLDYgQEAKIAlwdmNfZGV2aWNlICpwdmMgPSBOVUxMOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJaW50IHJlc3VsdCwgdXNlZDsKLQljaGFyICogcHJlZml4ID0gInB2YyVkIjsKLQotCWlmICh0eXBlID09IEFSUEhSRF9FVEhFUikKLQkJcHJlZml4ID0gInB2Y2V0aCVkIjsKIAogCWlmICgocHZjID0gYWRkX3B2YyhmcmFkLCBkbGNpKSkgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWVtb3J5IHNxdWVlemUgb24gZnJfYWRkX3B2YygpXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveGVuLW5ldGZyb250LmMgYi9kcml2ZXJzL25ldC94ZW4tbmV0ZnJvbnQuYwppbmRleCA3NDgzZDQ1Yi4uZTYyMDE4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQveGVuLW5ldGZyb250LmMKKysrIGIvZHJpdmVycy9uZXQveGVuLW5ldGZyb250LmMKQEAgLTE4MDksMyArMTgwOSw1IEBACiAKIE1PRFVMRV9ERVNDUklQVElPTigiWGVuIHZpcnR1YWwgbmV0d29yayBkZXZpY2UgZnJvbnRlbmQiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygieGVuOnZpZiIpOworTU9EVUxFX0FMSUFTKCJ4ZW5uZXQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS9jeGFjcnUuYyBiL2RyaXZlcnMvdXNiL2F0bS9jeGFjcnUuYwppbmRleCBhNTFlZWVkLi5kNDcwYzcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vY3hhY3J1LmMKKysrIGIvZHJpdmVycy91c2IvYXRtL2N4YWNydS5jCkBAIC00NDQsNyArNDQ0LDcgQEAKIC8qIHRoZSBmb2xsb3dpbmcgdGhyZWUgZnVuY3Rpb25zIGFyZSBzdG9sZW4gZnJvbSBkcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYyAqLwogc3RhdGljIHZvaWQgY3hhY3J1X2Jsb2NraW5nX2NvbXBsZXRpb24oc3RydWN0IHVyYiAqdXJiKQogewotCWNvbXBsZXRlKChzdHJ1Y3QgY29tcGxldGlvbiAqKXVyYi0+Y29udGV4dCk7CisJY29tcGxldGUodXJiLT5jb250ZXh0KTsKIH0KIAogc3RhdGljIHZvaWQgY3hhY3J1X3RpbWVvdXRfa2lsbCh1bnNpZ25lZCBsb25nIGRhdGEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9hdG0vdWVhZ2xlLWF0bS5jIGIvZHJpdmVycy91c2IvYXRtL3VlYWdsZS1hdG0uYwppbmRleCBjNWVjMWE1Li5hYmI3ZDc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vdWVhZ2xlLWF0bS5jCisrKyBiL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMKQEAgLTgzLDcgKzgzLDcgQEAKIAkJaWYgKGRlYnVnID49IDEpIFwKIAkJCWRldl9kYmcoJih1c2JfZGV2KS0+ZGV2LCBcCiAJCQkJIlt1ZWFnbGUtYXRtIGRiZ10gJXM6ICIgZm9ybWF0LCBcCi0JCQkJCV9fRlVOQ1RJT05fXywgIyNhcmdzKTsgXAorCQkJCQlfX2Z1bmNfXywgIyNhcmdzKTsgXAogCX0gd2hpbGUgKDApCiAKICNkZWZpbmUgdWVhX3ZkYmcodXNiX2RldiwgZm9ybWF0LCBhcmdzLi4uKQlcCkBAIC05NCwxMCArOTQsMTAgQEAKIAl9IHdoaWxlICgwKQogCiAjZGVmaW5lIHVlYV9lbnRlcnModXNiX2RldikgXAotCXVlYV92ZGJnKHVzYl9kZXYsICJlbnRlcmluZyAlc1xuIiwgX19GVU5DVElPTl9fKQorCXVlYV92ZGJnKHVzYl9kZXYsICJlbnRlcmluZyAlc1xuIiwgX19mdW5jX18pCiAKICNkZWZpbmUgdWVhX2xlYXZlcyh1c2JfZGV2KSBcCi0JdWVhX3ZkYmcodXNiX2RldiwgImxlYXZpbmcgICVzXG4iLCBfX0ZVTkNUSU9OX18pCisJdWVhX3ZkYmcodXNiX2RldiwgImxlYXZpbmcgICVzXG4iLCBfX2Z1bmNfXykKIAogI2RlZmluZSB1ZWFfZXJyKHVzYl9kZXYsIGZvcm1hdCxhcmdzLi4uKSBcCiAJZGV2X2VycigmKHVzYl9kZXYpLT5kZXYgLCJbVUVBR0xFLUFUTV0gIiBmb3JtYXQgLCAjI2FyZ3MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmMgYi9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmMKaW5kZXggZTcxN2Y1Yi4uMDcyMjg3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvYXRtL3VzYmF0bS5jCisrKyBiL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYwpAQCAtODAsNiArODAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAKICNpZmRlZiBWRVJCT1NFX0RFQlVHCiBzdGF0aWMgaW50IHVzYmF0bV9wcmludF9wYWNrZXQoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbik7CkBAIC0xMDE0LDEwICsxMDE1LDcgQEAKIAlzdHJ1Y3QgdXNiYXRtX2RhdGEgKmluc3RhbmNlID0gYXJnOwogCWludCByZXQ7CiAKLQlkYWVtb25pemUoaW5zdGFuY2UtPmRyaXZlci0+ZHJpdmVyX25hbWUpOwogCWFsbG93X3NpZ25hbChTSUdURVJNKTsKLQlpbnN0YW5jZS0+dGhyZWFkX3BpZCA9IGN1cnJlbnQtPnBpZDsKLQogCWNvbXBsZXRlKCZpbnN0YW5jZS0+dGhyZWFkX3N0YXJ0ZWQpOwogCiAJcmV0ID0gaW5zdGFuY2UtPmRyaXZlci0+aGVhdnlfaW5pdChpbnN0YW5jZSwgaW5zdGFuY2UtPnVzYl9pbnRmKTsKQEAgLTEwMjYsNyArMTAyNCw3IEBACiAJCXJldCA9IHVzYmF0bV9hdG1faW5pdChpbnN0YW5jZSk7CiAKIAltdXRleF9sb2NrKCZpbnN0YW5jZS0+c2VyaWFsaXplKTsKLQlpbnN0YW5jZS0+dGhyZWFkX3BpZCA9IC0xOworCWluc3RhbmNlLT50aHJlYWQgPSBOVUxMOwogCW11dGV4X3VubG9jaygmaW5zdGFuY2UtPnNlcmlhbGl6ZSk7CiAKIAljb21wbGV0ZV9hbmRfZXhpdCgmaW5zdGFuY2UtPnRocmVhZF9leGl0ZWQsIHJldCk7CkBAIC0xMDM0LDEzICsxMDMyLDE4IEBACiAKIHN0YXRpYyBpbnQgdXNiYXRtX2hlYXZ5X2luaXQoc3RydWN0IHVzYmF0bV9kYXRhICppbnN0YW5jZSkKIHsKLQlpbnQgcmV0ID0ga2VybmVsX3RocmVhZCh1c2JhdG1fZG9faGVhdnlfaW5pdCwgaW5zdGFuY2UsIENMT05FX0ZTIHwgQ0xPTkVfRklMRVMpOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKIAotCWlmIChyZXQgPCAwKSB7Ci0JCXVzYl9lcnIoaW5zdGFuY2UsICIlczogZmFpbGVkIHRvIGNyZWF0ZSBrZXJuZWxfdGhyZWFkICglZCkhXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJcmV0dXJuIHJldDsKKwl0ID0ga3RocmVhZF9jcmVhdGUodXNiYXRtX2RvX2hlYXZ5X2luaXQsIGluc3RhbmNlLAorCQkJaW5zdGFuY2UtPmRyaXZlci0+ZHJpdmVyX25hbWUpOworCWlmIChJU19FUlIodCkpIHsKKwkJdXNiX2VycihpbnN0YW5jZSwgIiVzOiBmYWlsZWQgdG8gY3JlYXRlIGtlcm5lbF90aHJlYWQgKCVsZCkhXG4iLAorCQkJCV9fZnVuY19fLCBQVFJfRVJSKHQpKTsKKwkJcmV0dXJuIFBUUl9FUlIodCk7CiAJfQogCisJaW5zdGFuY2UtPnRocmVhZCA9IHQ7CisJd2FrZV91cF9wcm9jZXNzKHQpOwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJmluc3RhbmNlLT50aHJlYWRfc3RhcnRlZCk7CiAKIAlyZXR1cm4gMDsKQEAgLTExMjQsNyArMTEyNyw3IEBACiAJa3JlZl9pbml0KCZpbnN0YW5jZS0+cmVmY291bnQpOwkJLyogZHJvcHBlZCBpbiB1c2JhdG1fdXNiX2Rpc2Nvbm5lY3QgKi8KIAltdXRleF9pbml0KCZpbnN0YW5jZS0+c2VyaWFsaXplKTsKIAotCWluc3RhbmNlLT50aHJlYWRfcGlkID0gLTE7CisJaW5zdGFuY2UtPnRocmVhZCA9IE5VTEw7CiAJaW5pdF9jb21wbGV0aW9uKCZpbnN0YW5jZS0+dGhyZWFkX3N0YXJ0ZWQpOwogCWluaXRfY29tcGxldGlvbigmaW5zdGFuY2UtPnRocmVhZF9leGl0ZWQpOwogCkBAIC0xMjg3LDggKzEyOTAsOCBAQAogCiAJbXV0ZXhfbG9jaygmaW5zdGFuY2UtPnNlcmlhbGl6ZSk7CiAJaW5zdGFuY2UtPmRpc2Nvbm5lY3RlZCA9IDE7Ci0JaWYgKGluc3RhbmNlLT50aHJlYWRfcGlkID49IDApCi0JCWtpbGxfcHJvYyhpbnN0YW5jZS0+dGhyZWFkX3BpZCwgU0lHVEVSTSwgMSk7CisJaWYgKGluc3RhbmNlLT50aHJlYWQgIT0gTlVMTCkKKwkJc2VuZF9zaWcoU0lHVEVSTSwgaW5zdGFuY2UtPnRocmVhZCwgMSk7CiAJbXV0ZXhfdW5sb2NrKCZpbnN0YW5jZS0+c2VyaWFsaXplKTsKIAogCXdhaXRfZm9yX2NvbXBsZXRpb24oJmluc3RhbmNlLT50aHJlYWRfZXhpdGVkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uaCBiL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uaAppbmRleCBmYzZjMmJlLi5lNjg4N2M2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmgKKysrIGIvZHJpdmVycy91c2IvYXRtL3VzYmF0bS5oCkBAIC0xNzUsNyArMTc1LDcgQEAKIAlpbnQgZGlzY29ubmVjdGVkOwogCiAJLyogaGVhdnkgaW5pdCAqLwotCWludCB0aHJlYWRfcGlkOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGhyZWFkOwogCXN0cnVjdCBjb21wbGV0aW9uIHRocmVhZF9zdGFydGVkOwogCXN0cnVjdCBjb21wbGV0aW9uIHRocmVhZF9leGl0ZWQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYyBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYwppbmRleCAwMTQ3ZWEzLi43YjU3MmU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMKKysrIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jCkBAIC0zMSw2ICszMSw3IEBACiAgKgl2MC4yMyAtIHVzZSBzb2Z0aXJxIGZvciByeCBwcm9jZXNzaW5nLCBhcyBuZWVkZWQgYnkgdHR5IGxheWVyCiAgKgl2MC4yNCAtIGNoYW5nZSBwcm9iZSBtZXRob2QgdG8gZXZhbHVhdGUgQ0RDIHVuaW9uIGRlc2NyaXB0b3IKICAqCXYwLjI1IC0gZG93bnN0cmVhbSB0YXNrcyBwYXJhbGVsaXplZCB0byBtYXhpbWl6ZSB0aHJvdWdocHV0CisgKgl2MC4yNiAtIG11bHRpcGxlIHdyaXRlIHVyYnMsIHdyaXRlc2l6ZSBpbmNyZWFzZWQKICAqLwogCiAvKgpAQCAtNzIsNyArNzMsNyBAQAogLyoKICAqIFZlcnNpb24gSW5mb3JtYXRpb24KICAqLwotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjAuMjUiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MC4yNiIKICNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiQXJtaW4gRnVlcnN0LCBQYXZlbCBNYWNoZWssIEpvaGFubmVzIEVyZGZlbHQsIFZvanRlY2ggUGF2bGlrLCBEYXZpZCBLdWJpY2VrIgogI2RlZmluZSBEUklWRVJfREVTQyAiVVNCIEFic3RyYWN0IENvbnRyb2wgTW9kZWwgZHJpdmVyIGZvciBVU0IgbW9kZW1zIGFuZCBJU0ROIGFkYXB0ZXJzIgogCkBAIC0xMTgsNyArMTE5LDcgQEAKIAlpbnQgaSwgd2JuOwogCXN0cnVjdCBhY21fd2IgKndiOwogCi0Jd2JuID0gYWNtLT53cml0ZV9jdXJyZW50OworCXdibiA9IDA7CiAJaSA9IDA7CiAJZm9yICg7OykgewogCQl3YiA9ICZhY20tPndiW3dibl07CkBAIC0xMzIsMTEgKzEzMyw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBhY21fd2JfZnJlZShzdHJ1Y3QgYWNtICphY20sIGludCB3Ym4pCi17Ci0JYWNtLT53Ylt3Ym5dLnVzZSA9IDA7Ci19Ci0KIHN0YXRpYyBpbnQgYWNtX3diX2lzX2F2YWlsKHN0cnVjdCBhY20gKmFjbSkKIHsKIAlpbnQgaSwgbjsKQEAgLTE1NiwyNiArMTUyLDIyIEBACiAvKgogICogRmluaXNoIHdyaXRlLgogICovCi1zdGF0aWMgdm9pZCBhY21fd3JpdGVfZG9uZShzdHJ1Y3QgYWNtICphY20pCitzdGF0aWMgdm9pZCBhY21fd3JpdGVfZG9uZShzdHJ1Y3QgYWNtICphY20sIHN0cnVjdCBhY21fd2IgKndiKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHdibjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZhY20tPndyaXRlX2xvY2ssIGZsYWdzKTsKIAlhY20tPndyaXRlX3JlYWR5ID0gMTsKLQl3Ym4gPSBhY20tPndyaXRlX2N1cnJlbnQ7Ci0JYWNtX3diX2ZyZWUoYWNtLCB3Ym4pOwotCWFjbS0+d3JpdGVfY3VycmVudCA9ICh3Ym4gKyAxKSAlIEFDTV9OVzsKKwl3Yi0+dXNlID0gMDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhY20tPndyaXRlX2xvY2ssIGZsYWdzKTsKIH0KIAogLyoKICAqIFBva2Ugd3JpdGUuCiAgKi8KLXN0YXRpYyBpbnQgYWNtX3dyaXRlX3N0YXJ0KHN0cnVjdCBhY20gKmFjbSkKK3N0YXRpYyBpbnQgYWNtX3dyaXRlX3N0YXJ0KHN0cnVjdCBhY20gKmFjbSwgaW50IHdibikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCB3Ym47CiAJc3RydWN0IGFjbV93YiAqd2I7CiAJaW50IHJjOwogCkBAIC0xOTAsMjQgKzE4MiwyNCBAQAogCQlyZXR1cm4gMDsJLyogQSB3aGl0ZSBsaWUgKi8KIAl9CiAKLQl3Ym4gPSBhY20tPndyaXRlX2N1cnJlbnQ7CiAJaWYgKCFhY21fd2JfaXNfdXNlZChhY20sIHdibikpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWNtLT53cml0ZV9sb2NrLCBmbGFncyk7CiAJCXJldHVybiAwOwogCX0KIAl3YiA9ICZhY20tPndiW3dibl07CiAKLQlhY20tPndyaXRlX3JlYWR5ID0gMDsKKwlpZihhY21fd2JfaXNfYXZhaWwoYWNtKSA8PSAxKQorCQlhY20tPndyaXRlX3JlYWR5ID0gMDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhY20tPndyaXRlX2xvY2ssIGZsYWdzKTsKIAotCWFjbS0+d3JpdGV1cmItPnRyYW5zZmVyX2J1ZmZlciA9IHdiLT5idWY7Ci0JYWNtLT53cml0ZXVyYi0+dHJhbnNmZXJfZG1hID0gd2ItPmRtYWg7Ci0JYWNtLT53cml0ZXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHdiLT5sZW47Ci0JYWNtLT53cml0ZXVyYi0+ZGV2ID0gYWNtLT5kZXY7CisJd2ItPnVyYi0+dHJhbnNmZXJfYnVmZmVyID0gd2ItPmJ1ZjsKKwl3Yi0+dXJiLT50cmFuc2Zlcl9kbWEgPSB3Yi0+ZG1haDsKKwl3Yi0+dXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gd2ItPmxlbjsKKwl3Yi0+dXJiLT5kZXYgPSBhY20tPmRldjsKIAotCWlmICgocmMgPSB1c2Jfc3VibWl0X3VyYihhY20tPndyaXRldXJiLCBHRlBfQVRPTUlDKSkgPCAwKSB7CisJaWYgKChyYyA9IHVzYl9zdWJtaXRfdXJiKHdiLT51cmIsIEdGUF9BVE9NSUMpKSA8IDApIHsKIAkJZGJnKCJ1c2Jfc3VibWl0X3VyYih3cml0ZSBidWxrKSBmYWlsZWQ6ICVkIiwgcmMpOwotCQlhY21fd3JpdGVfZG9uZShhY20pOworCQlhY21fd3JpdGVfZG9uZShhY20sIHdiKTsKIAl9CiAJcmV0dXJuIHJjOwogfQpAQCAtMjY4LDEwICsyNjAsMTAgQEAKIAljYXNlIC1FTk9FTlQ6CiAJY2FzZSAtRVNIVVRET1dOOgogCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLwotCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAlkZWZhdWx0OgotCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMzE1LDcgKzMwNyw3IEBACiAJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJldHZhbCkKIAkJZXJyICgiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQgJWQiLAotCQkgICAgIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwkJICAgICBfX2Z1bmNfXywgcmV0dmFsKTsKIH0KIAogLyogZGF0YSBpbnRlcmZhY2UgcmV0dXJucyBpbmNvbWluZyBieXRlcywgb3Igd2UgZ290IHVudGhyb3R0bGVkICovCkBAIC00NTAsMTIgKzQ0MiwxMyBAQAogLyogZGF0YSBpbnRlcmZhY2Ugd3JvdGUgdGhvc2Ugb3V0Z29pbmcgYnl0ZXMgKi8KIHN0YXRpYyB2b2lkIGFjbV93cml0ZV9idWxrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgYWNtICphY20gPSAoc3RydWN0IGFjbSAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgYWNtICphY207CisJc3RydWN0IGFjbV93YiAqd2IgPSB1cmItPmNvbnRleHQ7CiAKIAlkYmcoIkVudGVyaW5nIGFjbV93cml0ZV9idWxrIHdpdGggc3RhdHVzICVkIiwgdXJiLT5zdGF0dXMpOwogCi0JYWNtX3dyaXRlX2RvbmUoYWNtKTsKLQlhY21fd3JpdGVfc3RhcnQoYWNtKTsKKwlhY20gPSB3Yi0+aW5zdGFuY2U7CisJYWNtX3dyaXRlX2RvbmUoYWNtLCB3Yik7CiAJaWYgKEFDTV9SRUFEWShhY20pKQogCQlzY2hlZHVsZV93b3JrKCZhY20tPndvcmspOwogfQpAQCAtNDg5LDYgKzQ4Miw3IEBACiAJZWxzZQogCQlydiA9IDA7CiAKKwlzZXRfYml0KFRUWV9OT19XUklURV9TUExJVCwgJnR0eS0+ZmxhZ3MpOwogCXR0eS0+ZHJpdmVyX2RhdGEgPSBhY207CiAJYWNtLT50dHkgPSB0dHk7CiAKQEAgLTU1Niw3ICs1NTAsOCBAQAogCXVzYl9wdXRfaW50ZihhY20tPmNvbnRyb2wpOwogCWFjbV90YWJsZVthY20tPm1pbm9yXSA9IE5VTEw7CiAJdXNiX2ZyZWVfdXJiKGFjbS0+Y3RybHVyYik7Ci0JdXNiX2ZyZWVfdXJiKGFjbS0+d3JpdGV1cmIpOworCWZvciAoaSA9IDA7IGkgPCBBQ01fTlc7IGkrKykKKwkJdXNiX2ZyZWVfdXJiKGFjbS0+d2JbaV0udXJiKTsKIAlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykKIAkJdXNiX2ZyZWVfdXJiKGFjbS0+cnVbaV0udXJiKTsKIAlrZnJlZShhY20tPmNvdW50cnlfY29kZXMpOwpAQCAtNTc3LDcgKzU3Miw4IEBACiAJCWlmIChhY20tPmRldikgewogCQkJYWNtX3NldF9jb250cm9sKGFjbSwgYWNtLT5jdHJsb3V0ID0gMCk7CiAJCQl1c2Jfa2lsbF91cmIoYWNtLT5jdHJsdXJiKTsKLQkJCXVzYl9raWxsX3VyYihhY20tPndyaXRldXJiKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBBQ01fTlc7IGkrKykKKwkJCQl1c2Jfa2lsbF91cmIoYWNtLT53YltpXS51cmIpOwogCQkJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspCiAJCQkJdXNiX2tpbGxfdXJiKGFjbS0+cnVbaV0udXJiKTsKIAkJCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShhY20tPmNvbnRyb2wpOwpAQCAtNjA1LDcgKzYwMSw2IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmFjbS0+d3JpdGVfbG9jaywgZmxhZ3MpOwogCWlmICgod2JuID0gYWNtX3diX2FsbG9jKGFjbSkpIDwgMCkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhY20tPndyaXRlX2xvY2ssIGZsYWdzKTsKLQkJYWNtX3dyaXRlX3N0YXJ0KGFjbSk7CiAJCXJldHVybiAwOwogCX0KIAl3YiA9ICZhY20tPndiW3dibl07CkBAIC02MTYsNyArNjExLDcgQEAKIAl3Yi0+bGVuID0gY291bnQ7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWNtLT53cml0ZV9sb2NrLCBmbGFncyk7CiAKLQlpZiAoKHN0YXQgPSBhY21fd3JpdGVfc3RhcnQoYWNtKSkgPCAwKQorCWlmICgoc3RhdCA9IGFjbV93cml0ZV9zdGFydChhY20sIHdibikpIDwgMCkKIAkJcmV0dXJuIHN0YXQ7CiAJcmV0dXJuIGNvdW50OwogfQpAQCAtODA5LDcgKzgwNCw3IEBACiB7CiAJc3RydWN0IHVzYl9jZGNfdW5pb25fZGVzYyAqdW5pb25faGVhZGVyID0gTlVMTDsKIAlzdHJ1Y3QgdXNiX2NkY19jb3VudHJ5X2Z1bmN0aW9uYWxfZGVzYyAqY2ZkID0gTlVMTDsKLQljaGFyICpidWZmZXIgPSBpbnRmLT5hbHRzZXR0aW5nLT5leHRyYTsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXIgPSBpbnRmLT5hbHRzZXR0aW5nLT5leHRyYTsKIAlpbnQgYnVmbGVuID0gaW50Zi0+YWx0c2V0dGluZy0+ZXh0cmFsZW47CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmNvbnRyb2xfaW50ZXJmYWNlOwogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICpkYXRhX2ludGVyZmFjZTsKQEAgLTg4Niw5ICs4ODEsMTMgQEAKIAkJCQlpZiAoKGNhbGxfbWFuYWdlbWVudF9mdW5jdGlvbiAmIDMpICE9IDMpCiAJCQkJCWVycigiVGhpcyBkZXZpY2UgY2Fubm90IGRvIGNhbGxzIG9uIGl0cyBvd24uIEl0IGlzIG5vIG1vZGVtLiIpOwogCQkJCWJyZWFrOwotCQkJCQogCQkJZGVmYXVsdDoKLQkJCQllcnIoIklnbm9yaW5nIGV4dHJhIGhlYWRlciwgdHlwZSAlZCwgbGVuZ3RoICVkIiwgYnVmZmVyWzJdLCBidWZmZXJbMF0pOworCQkJCS8qIHRoZXJlIGFyZSBMT1RTIG1vcmUgQ0RDIGRlc2NyaXB0b3JzIHRoYXQKKwkJCQkgKiBjb3VsZCBsZWdpdGltYXRlbHkgYmUgZm91bmQgaGVyZS4KKwkJCQkgKi8KKwkJCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJJZ25vcmluZyBkZXNjcmlwdG9yOiAiCisJCQkJCQkidHlwZSAlMDJ4LCBsZW5ndGggJWRcbiIsCisJCQkJCQlidWZmZXJbMl0sIGJ1ZmZlclswXSk7CiAJCQkJYnJlYWs7CiAJCQl9CiBuZXh0X2Rlc2M6CkBAIC05NzYsNyArOTc1LDcgQEAKIAogCWN0cmxzaXplID0gbGUxNl90b19jcHUoZXBjdHJsLT53TWF4UGFja2V0U2l6ZSk7CiAJcmVhZHNpemUgPSBsZTE2X3RvX2NwdShlcHJlYWQtPndNYXhQYWNrZXRTaXplKSogKCBxdWlya3MgPT0gU0lOR0xFX1JYX1VSQiA/IDEgOiAyKTsKLQlhY20tPndyaXRlc2l6ZSA9IGxlMTZfdG9fY3B1KGVwd3JpdGUtPndNYXhQYWNrZXRTaXplKTsKKwlhY20tPndyaXRlc2l6ZSA9IGxlMTZfdG9fY3B1KGVwd3JpdGUtPndNYXhQYWNrZXRTaXplKSAqIDIwOwogCWFjbS0+Y29udHJvbCA9IGNvbnRyb2xfaW50ZXJmYWNlOwogCWFjbS0+ZGF0YSA9IGRhdGFfaW50ZXJmYWNlOwogCWFjbS0+bWlub3IgPSBtaW5vcjsKQEAgLTEwMzEsMTAgKzEwMzAsMTkgQEAKIAkJCWdvdG8gYWxsb2NfZmFpbDc7CiAJCX0KIAl9Ci0JYWNtLT53cml0ZXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhY20tPndyaXRldXJiKSB7Ci0JCWRldl9kYmcoJmludGYtPmRldiwgIm91dCBvZiBtZW1vcnkgKHdyaXRldXJiIGttYWxsb2MpXG4iKTsKLQkJZ290byBhbGxvY19mYWlsNzsKKwlmb3IoaSA9IDA7IGkgPCBBQ01fTlc7IGkrKykKKwl7CisJCXN0cnVjdCBhY21fd2IgKnNuZCA9ICYoYWNtLT53YltpXSk7CisKKwkJaWYgKCEoc25kLT51cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpKSkgeworCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAib3V0IG9mIG1lbW9yeSAod3JpdGUgdXJicyB1c2JfYWxsb2NfdXJiKSIpOworCQkJZ290byBhbGxvY19mYWlsNzsKKwkJfQorCisJCXVzYl9maWxsX2J1bGtfdXJiKHNuZC0+dXJiLCB1c2JfZGV2LCB1c2Jfc25kYnVsa3BpcGUodXNiX2RldiwgZXB3cml0ZS0+YkVuZHBvaW50QWRkcmVzcyksCisJCQkJTlVMTCwgYWNtLT53cml0ZXNpemUsIGFjbV93cml0ZV9idWxrLCBzbmQpOworCQlzbmQtPnVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisJCXNuZC0+aW5zdGFuY2UgPSBhY207CiAJfQogCiAJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgYWNtKTsKQEAgLTEwNzAsMTAgKzEwNzgsNiBAQAogCWFjbS0+Y3RybHVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CiAJYWNtLT5jdHJsdXJiLT50cmFuc2Zlcl9kbWEgPSBhY20tPmN0cmxfZG1hOwogCi0JdXNiX2ZpbGxfYnVsa191cmIoYWNtLT53cml0ZXVyYiwgdXNiX2RldiwgdXNiX3NuZGJ1bGtwaXBlKHVzYl9kZXYsIGVwd3JpdGUtPmJFbmRwb2ludEFkZHJlc3MpLAotCQkJICBOVUxMLCBhY20tPndyaXRlc2l6ZSwgYWNtX3dyaXRlX2J1bGssIGFjbSk7Ci0JYWNtLT53cml0ZXVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX0ZTQlIgfCBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKLQogCWRldl9pbmZvKCZpbnRmLT5kZXYsICJ0dHlBQ00lZDogVVNCIEFDTSBkZXZpY2VcbiIsIG1pbm9yKTsKIAogCWFjbV9zZXRfY29udHJvbChhY20sIGFjbS0+Y3RybG91dCk7CkBAIC0xMDkxLDcgKzEwOTUsOCBAQAogCiAJcmV0dXJuIDA7CiBhbGxvY19mYWlsODoKLQl1c2JfZnJlZV91cmIoYWNtLT53cml0ZXVyYik7CisJZm9yIChpID0gMDsgaSA8IEFDTV9OVzsgaSsrKQorCQl1c2JfZnJlZV91cmIoYWNtLT53YltpXS51cmIpOwogYWxsb2NfZmFpbDc6CiAJZm9yIChpID0gMDsgaSA8IG51bV9yeF9idWY7IGkrKykKIAkJdXNiX2J1ZmZlcl9mcmVlKHVzYl9kZXYsIGFjbS0+cmVhZHNpemUsIGFjbS0+cmJbaV0uYmFzZSwgYWNtLT5yYltpXS5kbWEpOwpAQCAtMTExNSw3ICsxMTIwLDggQEAKIAl0YXNrbGV0X2Rpc2FibGUoJmFjbS0+dXJiX3Rhc2spOwogCiAJdXNiX2tpbGxfdXJiKGFjbS0+Y3RybHVyYik7Ci0JdXNiX2tpbGxfdXJiKGFjbS0+d3JpdGV1cmIpOworCWZvcihpID0gMDsgaSA8IEFDTV9OVzsgaSsrKQorCQl1c2Jfa2lsbF91cmIoYWNtLT53YltpXS51cmIpOwogCWZvciAoaSA9IDA7IGkgPCBhY20tPnJ4X2J1ZmxpbWl0OyBpKyspCiAJCXVzYl9raWxsX3VyYihhY20tPnJ1W2ldLnVyYik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uaCBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uaAppbmRleCA4ZGY2YTU3Li4wNDZlMDY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmgKKysrIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5oCkBAIC01OSw3ICs1OSw3IEBACiAgKiB3aGVuIHByb2Nlc3Npbmcgb25sY3IsIHNvIHdlIG9ubHkgbmVlZCAyIGJ1ZmZlcnMuIFRoZXNlIHZhbHVlcyBtdXN0IGJlCiAgKiBwb3dlcnMgb2YgMi4KICAqLwotI2RlZmluZSBBQ01fTlcgIDIKKyNkZWZpbmUgQUNNX05XICAxNgogI2RlZmluZSBBQ01fTlIgIDE2CiAKIHN0cnVjdCBhY21fd2IgewpAQCAtNjcsNiArNjcsOCBAQAogCWRtYV9hZGRyX3QgZG1haDsKIAlpbnQgbGVuOwogCWludCB1c2U7CisJc3RydWN0IHVyYgkJKnVyYjsKKwlzdHJ1Y3QgYWNtCQkqaW5zdGFuY2U7CiB9OwogCiBzdHJ1Y3QgYWNtX3JiIHsKQEAgLTg4LDcgKzkwLDcgQEAKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqY29udHJvbDsJCQkvKiBjb250cm9sIGludGVyZmFjZSAqLwogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICpkYXRhOwkJCS8qIGRhdGEgaW50ZXJmYWNlICovCiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsJCQkJLyogdGhlIGNvcnJlc3BvbmRpbmcgdHR5ICovCi0Jc3RydWN0IHVyYiAqY3RybHVyYiwgKndyaXRldXJiOwkJCS8qIHVyYnMgKi8KKwlzdHJ1Y3QgdXJiICpjdHJsdXJiOwkJCS8qIHVyYnMgKi8KIAl1OCAqY3RybF9idWZmZXI7CQkJCS8qIGJ1ZmZlcnMgb2YgdXJicyAqLwogCWRtYV9hZGRyX3QgY3RybF9kbWE7CQkJCS8qIGRtYSBoYW5kbGVzIG9mIGJ1ZmZlcnMgKi8KIAl1OCAqY291bnRyeV9jb2RlczsJCQkJLyogY291bnRyeSBjb2RlcyBmcm9tIGRldmljZSAqLwpAQCAtMTAzLDcgKzEwNSw2IEBACiAJc3RydWN0IGxpc3RfaGVhZCBzcGFyZV9yZWFkX3VyYnM7CiAJc3RydWN0IGxpc3RfaGVhZCBzcGFyZV9yZWFkX2J1ZnM7CiAJc3RydWN0IGxpc3RfaGVhZCBmaWxsZWRfcmVhZF9idWZzOwotCWludCB3cml0ZV9jdXJyZW50OwkJCQkvKiBjdXJyZW50IHdyaXRlIGJ1ZmZlciAqLwogCWludCB3cml0ZV91c2VkOwkJCQkJLyogbnVtYmVyIG9mIG5vbi1lbXB0eSB3cml0ZSBidWZmZXJzICovCiAJaW50IHdyaXRlX3JlYWR5OwkJCQkvKiB3cml0ZSB1cmIgaXMgbm90IHJ1bm5pbmcgKi8KIAlzcGlubG9ja190IHdyaXRlX2xvY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL0tjb25maWcgYi9kcml2ZXJzL3VzYi9jb3JlL0tjb25maWcKaW5kZXggYTJiMGFhNC4uY2M5ZjM5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvS2NvbmZpZwpAQCAtNzYsOCArNzYsOCBAQAogCSAgICBOQU1FPSJidXMvdXNiLyRlbnZ7QlVTTlVNfS8kZW52e0RFVk5VTX0iLCBNT0RFPSIwNjQ0IgogCiBjb25maWcgVVNCX0RZTkFNSUNfTUlOT1JTCi0JYm9vbCAiRHluYW1pYyBVU0IgbWlub3IgYWxsb2NhdGlvbiAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIFVTQiAmJiBFWFBFUklNRU5UQUwKKwlib29sICJEeW5hbWljIFVTQiBtaW5vciBhbGxvY2F0aW9uIgorCWRlcGVuZHMgb24gVVNCCiAJaGVscAogCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZSBVU0Igc3Vic3lzdGVtIHdpbGwgdXNlIGR5bmFtaWMgbWlub3IKIAkgIGFsbG9jYXRpb24gZm9yIGFueSBkZXZpY2UgdGhhdCB1c2VzIHRoZSBVU0IgbWFqb3IgbnVtYmVyLgpAQCAtMTAyLDMxICsxMDIsNiBAQAogCiAJICBJZiB5b3UgYXJlIHVuc3VyZSBhYm91dCB0aGlzLCBzYXkgTiBoZXJlLgogCi1jb25maWcgVVNCX1BFUlNJU1QKLQlib29sICJVU0IgZGV2aWNlIHBlcnNpc3RlbmNlIGR1cmluZyBzeXN0ZW0gc3VzcGVuZCAoREFOR0VST1VTKSIKLQlkZXBlbmRzIG9uIFVTQiAmJiBQTSAmJiBFWFBFUklNRU5UQUwKLQlkZWZhdWx0IG4KLQloZWxwCi0KLQkgIElmIHlvdSBzYXkgWSBoZXJlIGFuZCBlbmFibGUgdGhlICJwb3dlci9wZXJzaXN0IiBhdHRyaWJ1dGUKLQkgIGZvciBhIFVTQiBkZXZpY2UsIHRoZSBkZXZpY2UncyBkYXRhIHN0cnVjdHVyZXMgd2lsbCByZW1haW4KLQkgIHBlcnNpc3RlbnQgYWNyb3NzIHN5c3RlbSBzdXNwZW5kLCBldmVuIGlmIHRoZSBVU0IgYnVzIGxvc2VzCi0JICBwb3dlci4gIChUaGlzIGluY2x1ZGVzIGhpYmVybmF0aW9uLCBhbHNvIGtub3duIGFzIHN3c3VzcCBvcgotCSAgc3VzcGVuZC10by1kaXNrLikgIFRoZSBkZXZpY2VzIHdpbGwgcmVhcHBlYXIgYXMgaWYgYnkgbWFnaWMKLQkgIHdoZW4gdGhlIHN5c3RlbSB3YWtlcyB1cCwgd2l0aCBubyBuZWVkIHRvIHVubW91bnQgVVNCCi0JICBmaWxlc3lzdGVtcywgcm1tb2QgaG9zdC1jb250cm9sbGVyIGRyaXZlcnMsIG9yIGRvIGFueXRoaW5nCi0JICBlbHNlLgotCi0JICAJV0FSTklORzogVGhpcyBvcHRpb24gY2FuIGJlIGRhbmdlcm91cyEKLQotCSAgSWYgYSBVU0IgZGV2aWNlIGlzIHJlcGxhY2VkIGJ5IGFub3RoZXIgb2YgdGhlIHNhbWUgdHlwZSB3aGlsZQotCSAgdGhlIHN5c3RlbSBpcyBhc2xlZXAsIHRoZXJlJ3MgYSBnb29kIGNoYW5jZSB0aGUga2VybmVsIHdvbid0Ci0JICBkZXRlY3QgdGhlIGNoYW5nZS4gIExpa2V3aXNlIGlmIHRoZSBtZWRpYSBpbiBhIFVTQiBzdG9yYWdlCi0JICBkZXZpY2UgaXMgcmVwbGFjZWQuICBXaGVuIHRoaXMgaGFwcGVucyBpdCdzIGFsbW9zdCBjZXJ0YWluIHRvCi0JICBjYXVzZSBkYXRhIGNvcnJ1cHRpb24gYW5kIG1heWJlIGV2ZW4gY3Jhc2ggeW91ciBzeXN0ZW0uCi0KLQkgIElmIHlvdSBhcmUgdW5zdXJlLCBzYXkgTiBoZXJlLgotCiBjb25maWcgVVNCX09URwogCWJvb2wKIAlkZXBlbmRzIG9uIFVTQiAmJiBFWFBFUklNRU5UQUwKQEAgLTEzNiwxNCArMTExLDE2IEBACiAKIGNvbmZpZyBVU0JfT1RHX1dISVRFTElTVAogCWJvb2wgIlJlbHkgb24gT1RHIFRhcmdldGVkIFBlcmlwaGVyYWxzIExpc3QiCi0JZGVwZW5kcyBvbiBVU0JfT1RHCi0JZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBVU0JfT1RHIHx8IEVNQkVEREVECisJZGVmYXVsdCB5IGlmIFVTQl9PVEcKKwlkZWZhdWx0IG4gaWYgRU1CRURERUQKIAloZWxwCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSwgdGhlICJvdGdfd2hpdGVsaXN0LmgiIGZpbGUgd2lsbCBiZSB1c2VkIGFzIGEKIAkgIHByb2R1Y3Qgd2hpdGVsaXN0LCBzbyBVU0IgcGVyaXBoZXJhbHMgbm90IGxpc3RlZCB0aGVyZSB3aWxsIGJlCiAJICByZWplY3RlZCBkdXJpbmcgZW51bWVyYXRpb24uICBUaGlzIGJlaGF2aW9yIGlzIHJlcXVpcmVkIGJ5IHRoZQogCSAgVVNCIE9URyBzcGVjaWZpY2F0aW9uIGZvciBhbGwgZGV2aWNlcyBub3Qgb24geW91ciBwcm9kdWN0J3MKLQkgICJUYXJnZXRlZCBQZXJpcGhlcmFscyBMaXN0Ii4KKwkgICJUYXJnZXRlZCBQZXJpcGhlcmFscyBMaXN0Ii4gICJFbWJlZGRlZCBIb3N0cyIgYXJlIGxpa2V3aXNlCisJICBhbGxvd2VkIHRvIHN1cHBvcnQgb25seSBhIGxpbWl0ZWQgbnVtYmVyIG9mIHBlcmlwaGVyYWxzLgogCiAJICBPdGhlcndpc2UsIHBlcmlwaGVyYWxzIG5vdCBsaXN0ZWQgdGhlcmUgd2lsbCBvbmx5IGdlbmVyYXRlIGEKIAkgIHdhcm5pbmcgYW5kIGVudW1lcmF0aW9uIHdpbGwgY29udGludWUuICBUaGF0J3MgbW9yZSBsaWtlIHdoYXQKQEAgLTE1Miw5ICsxMjksMTAgQEAKIAogY29uZmlnIFVTQl9PVEdfQkxBQ0tMSVNUX0hVQgogCWJvb2wgIkRpc2FibGUgZXh0ZXJuYWwgaHVicyIKLQlkZXBlbmRzIG9uIFVTQl9PVEcKKwlkZXBlbmRzIG9uIFVTQl9PVEcgfHwgRU1CRURERUQKIAloZWxwCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSwgdGhlbiBMaW51eCB3aWxsIHJlZnVzZSB0byBlbnVtZXJhdGUKIAkgIGV4dGVybmFsIGh1YnMuICBPVEcgaG9zdHMgYXJlIGFsbG93ZWQgdG8gcmVkdWNlIGhhcmR3YXJlCi0JICBhbmQgc29mdHdhcmUgY29zdHMgYnkgbm90IHN1cHBvcnRpbmcgZXh0ZXJuYWwgaHVicy4KKwkgIGFuZCBzb2Z0d2FyZSBjb3N0cyBieSBub3Qgc3VwcG9ydGluZyBleHRlcm5hbCBodWJzLiAgU28KKwkgIGFyZSAiRW1lZGRlZCBIb3N0cyIgdGhhdCBkb24ndCBvZmZlciBPVEcgc3VwcG9ydC4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9jb25maWcuYyBiL2RyaXZlcnMvdXNiL2NvcmUvY29uZmlnLmMKaW5kZXggYTkyMTIyYS4uNTY4MjQ0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9jb25maWcuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2NvbmZpZy5jCkBAIC0xNDUsNiArMTQ1LDIzIEBACiAJCQllbmRwb2ludC0+ZGVzYy53TWF4UGFja2V0U2l6ZSA9IGNwdV90b19sZTE2KDgpOwogCX0KIAorCS8qCisJICogU29tZSBidWdneSBoaWdoIHNwZWVkIGRldmljZXMgaGF2ZSBidWxrIGVuZHBvaW50cyB1c2luZworCSAqIG1heHBhY2tldCBzaXplcyBvdGhlciB0aGFuIDUxMi4gIEhpZ2ggc3BlZWQgSENEcyBtYXkgbm90CisJICogYmUgYWJsZSB0byBoYW5kbGUgdGhhdCBwYXJ0aWN1bGFyIGJ1Zywgc28gbGV0J3Mgd2Fybi4uLgorCSAqLworCWlmICh0b191c2JfZGV2aWNlKGRkZXYpLT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSAorCQkJJiYgdXNiX2VuZHBvaW50X3hmZXJfYnVsayhkKSkgeworCQl1bnNpZ25lZCBtYXhwOworCisJCW1heHAgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+ZGVzYy53TWF4UGFja2V0U2l6ZSkgJiAweDA3ZmY7CisJCWlmIChtYXhwICE9IDUxMikKKwkJCWRldl93YXJuKGRkZXYsICJjb25maWcgJWQgaW50ZXJmYWNlICVkIGFsdHNldHRpbmcgJWQgIgorCQkJCSJidWxrIGVuZHBvaW50IDB4JVggaGFzIGludmFsaWQgbWF4cGFja2V0ICVkXG4iLAorCQkJCWNmZ25vLCBpbnVtLCBhc251bSwgZC0+YkVuZHBvaW50QWRkcmVzcywKKwkJCQltYXhwKTsKKwl9CisKIAkvKiBTa2lwIG92ZXIgYW55IENsYXNzIFNwZWNpZmljIG9yIFZlbmRvciBTcGVjaWZpYyBkZXNjcmlwdG9yczsKIAkgKiBmaW5kIHRoZSBuZXh0IGVuZHBvaW50IG9yIGludGVyZmFjZSBkZXNjcmlwdG9yICovCiAJZW5kcG9pbnQtPmV4dHJhID0gYnVmZmVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9kZXZpby5jIGIvZHJpdmVycy91c2IvY29yZS9kZXZpby5jCmluZGV4IGFlOTQxNzYuLmRlMTc3MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKQEAgLTY0Nyw2ICs2NDcsNyBAQAogCXN0cnVjdCB1c2JkZXZmc19jdHJsdHJhbnNmZXIgY3RybDsKIAl1bnNpZ25lZCBpbnQgdG1vOwogCXVuc2lnbmVkIGNoYXIgKnRidWY7CisJdW5zaWduZWQgd0xlbmd0aDsKIAlpbnQgaSwgaiwgcmV0OwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZjdHJsLCBhcmcsIHNpemVvZihjdHJsKSkpCkBAIC02NTQsNyArNjU1LDggQEAKIAlyZXQgPSBjaGVja19jdHJscmVjaXAocHMsIGN0cmwuYlJlcXVlc3RUeXBlLCBjdHJsLndJbmRleCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKLQlpZiAoY3RybC53TGVuZ3RoID4gUEFHRV9TSVpFKQorCXdMZW5ndGggPSBjdHJsLndMZW5ndGg7CQkvKiBUbyBzdXBwcmVzcyA2NGsgUEFHRV9TSVpFIHdhcm5pbmcgKi8KKwlpZiAod0xlbmd0aCA+IFBBR0VfU0laRSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJdGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwogCWlmICghdGJ1ZikKQEAgLTk0Niw4ICs5NDgsMTEgQEAKIAlpbnQgcmV0LCBpZm51bSA9IC0xOwogCWludCBpc19pbjsKIAotCWlmICh1dXJiLT5mbGFncyAmIH4oVVNCREVWRlNfVVJCX0lTT19BU0FQfFVTQkRFVkZTX1VSQl9TSE9SVF9OT1RfT0t8Ci0JCQkgICBVUkJfTk9fRlNCUnxVUkJfWkVST19QQUNLRVQpKQorCWlmICh1dXJiLT5mbGFncyAmIH4oVVNCREVWRlNfVVJCX0lTT19BU0FQIHwKKwkJCQlVU0JERVZGU19VUkJfU0hPUlRfTk9UX09LIHwKKwkJCQlVU0JERVZGU19VUkJfTk9fRlNCUiB8CisJCQkJVVNCREVWRlNfVVJCX1pFUk9fUEFDS0VUIHwKKwkJCQlVU0JERVZGU19VUkJfTk9fSU5URVJSVVBUKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKCF1dXJiLT5idWZmZXIpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTEwMiw4ICsxMTA3LDI0IEBACiAJYXMtPnVyYi0+cGlwZSA9ICh1dXJiLT50eXBlIDw8IDMwKSB8CiAJCQlfX2NyZWF0ZV9waXBlKHBzLT5kZXYsIHV1cmItPmVuZHBvaW50ICYgMHhmKSB8CiAJCQkodXVyYi0+ZW5kcG9pbnQgJiBVU0JfRElSX0lOKTsKLQlhcy0+dXJiLT50cmFuc2Zlcl9mbGFncyA9IHV1cmItPmZsYWdzIHwKLQkJCShpc19pbiA/IFVSQl9ESVJfSU4gOiBVUkJfRElSX09VVCk7CisKKwkvKiBUaGlzIHRlZGlvdXMgc2VxdWVuY2UgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIFVSQl8qIGZsYWdzCisJICogYXJlIGludGVybmFsIHRvIHRoZSBrZXJuZWwgYW5kIHN1YmplY3QgdG8gY2hhbmdlLCB3aGVyZWFzCisJICogdGhlIFVTQkRFVkZTX1VSQl8qIGZsYWdzIGFyZSBhIHVzZXIgQVBJIGFuZCBtdXN0IG5vdCBiZSBjaGFuZ2VkLgorCSAqLworCXUgPSAoaXNfaW4gPyBVUkJfRElSX0lOIDogVVJCX0RJUl9PVVQpOworCWlmICh1dXJiLT5mbGFncyAmIFVTQkRFVkZTX1VSQl9JU09fQVNBUCkKKwkJdSB8PSBVUkJfSVNPX0FTQVA7CisJaWYgKHV1cmItPmZsYWdzICYgVVNCREVWRlNfVVJCX1NIT1JUX05PVF9PSykKKwkJdSB8PSBVUkJfU0hPUlRfTk9UX09LOworCWlmICh1dXJiLT5mbGFncyAmIFVTQkRFVkZTX1VSQl9OT19GU0JSKQorCQl1IHw9IFVSQl9OT19GU0JSOworCWlmICh1dXJiLT5mbGFncyAmIFVTQkRFVkZTX1VSQl9aRVJPX1BBQ0tFVCkKKwkJdSB8PSBVUkJfWkVST19QQUNLRVQ7CisJaWYgKHV1cmItPmZsYWdzICYgVVNCREVWRlNfVVJCX05PX0lOVEVSUlVQVCkKKwkJdSB8PSBVUkJfTk9fSU5URVJSVVBUOworCWFzLT51cmItPnRyYW5zZmVyX2ZsYWdzID0gdTsKKwogCWFzLT51cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSB1dXJiLT5idWZmZXJfbGVuZ3RoOwogCWFzLT51cmItPnNldHVwX3BhY2tldCA9ICh1bnNpZ25lZCBjaGFyICopZHI7CiAJYXMtPnVyYi0+c3RhcnRfZnJhbWUgPSB1dXJiLT5zdGFydF9mcmFtZTsKQEAgLTE1MDksNjAgKzE1MzAsNjAgQEAKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBVU0JERVZGU19DT05UUk9MOgotCQlzbm9vcCgmZGV2LT5kZXYsICIlczogQ09OVFJPTFxuIiwgX19GVU5DVElPTl9fKTsKKwkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IENPTlRST0xcbiIsIF9fZnVuY19fKTsKIAkJcmV0ID0gcHJvY19jb250cm9sKHBzLCBwKTsKIAkJaWYgKHJldCA+PSAwKQogCQkJaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CiAJCWJyZWFrOwogCiAJY2FzZSBVU0JERVZGU19CVUxLOgotCQlzbm9vcCgmZGV2LT5kZXYsICIlczogQlVMS1xuIiwgX19GVU5DVElPTl9fKTsKKwkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IEJVTEtcbiIsIF9fZnVuY19fKTsKIAkJcmV0ID0gcHJvY19idWxrKHBzLCBwKTsKIAkJaWYgKHJldCA+PSAwKQogCQkJaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CiAJCWJyZWFrOwogCiAJY2FzZSBVU0JERVZGU19SRVNFVEVQOgotCQlzbm9vcCgmZGV2LT5kZXYsICIlczogUkVTRVRFUFxuIiwgX19GVU5DVElPTl9fKTsKKwkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IFJFU0VURVBcbiIsIF9fZnVuY19fKTsKIAkJcmV0ID0gcHJvY19yZXNldGVwKHBzLCBwKTsKIAkJaWYgKHJldCA+PSAwKQogCQkJaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CiAJCWJyZWFrOwogCiAJY2FzZSBVU0JERVZGU19SRVNFVDoKLQkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IFJFU0VUXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzbm9vcCgmZGV2LT5kZXYsICIlczogUkVTRVRcbiIsIF9fZnVuY19fKTsKIAkJcmV0ID0gcHJvY19yZXNldGRldmljZShwcyk7CiAJCWJyZWFrOwogCiAJY2FzZSBVU0JERVZGU19DTEVBUl9IQUxUOgotCQlzbm9vcCgmZGV2LT5kZXYsICIlczogQ0xFQVJfSEFMVFxuIiwgX19GVU5DVElPTl9fKTsKKwkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IENMRUFSX0hBTFRcbiIsIF9fZnVuY19fKTsKIAkJcmV0ID0gcHJvY19jbGVhcmhhbHQocHMsIHApOwogCQlpZiAocmV0ID49IDApCiAJCQlpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKIAkJYnJlYWs7CiAKIAljYXNlIFVTQkRFVkZTX0dFVERSSVZFUjoKLQkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IEdFVERSSVZFUlxuIiwgX19GVU5DVElPTl9fKTsKKwkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IEdFVERSSVZFUlxuIiwgX19mdW5jX18pOwogCQlyZXQgPSBwcm9jX2dldGRyaXZlcihwcywgcCk7CiAJCWJyZWFrOwogCiAJY2FzZSBVU0JERVZGU19DT05ORUNUSU5GTzoKLQkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IENPTk5FQ1RJTkZPXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzbm9vcCgmZGV2LT5kZXYsICIlczogQ09OTkVDVElORk9cbiIsIF9fZnVuY19fKTsKIAkJcmV0ID0gcHJvY19jb25uZWN0aW5mbyhwcywgcCk7CiAJCWJyZWFrOwogCiAJY2FzZSBVU0JERVZGU19TRVRJTlRFUkZBQ0U6Ci0JCXNub29wKCZkZXYtPmRldiwgIiVzOiBTRVRJTlRFUkZBQ0VcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXNub29wKCZkZXYtPmRldiwgIiVzOiBTRVRJTlRFUkZBQ0VcbiIsIF9fZnVuY19fKTsKIAkJcmV0ID0gcHJvY19zZXRpbnRmKHBzLCBwKTsKIAkJYnJlYWs7CiAKIAljYXNlIFVTQkRFVkZTX1NFVENPTkZJR1VSQVRJT046Ci0JCXNub29wKCZkZXYtPmRldiwgIiVzOiBTRVRDT05GSUdVUkFUSU9OXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzbm9vcCgmZGV2LT5kZXYsICIlczogU0VUQ09ORklHVVJBVElPTlxuIiwgX19mdW5jX18pOwogCQlyZXQgPSBwcm9jX3NldGNvbmZpZyhwcywgcCk7CiAJCWJyZWFrOwogCiAJY2FzZSBVU0JERVZGU19TVUJNSVRVUkI6Ci0JCXNub29wKCZkZXYtPmRldiwgIiVzOiBTVUJNSVRVUkJcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXNub29wKCZkZXYtPmRldiwgIiVzOiBTVUJNSVRVUkJcbiIsIF9fZnVuY19fKTsKIAkJcmV0ID0gcHJvY19zdWJtaXR1cmIocHMsIHApOwogCQlpZiAocmV0ID49IDApCiAJCQlpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKQEAgLTE1NzEsNjAgKzE1OTIsNjAgQEAKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAKIAljYXNlIFVTQkRFVkZTX1NVQk1JVFVSQjMyOgotCQlzbm9vcCgmZGV2LT5kZXYsICIlczogU1VCTUlUVVJCMzJcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXNub29wKCZkZXYtPmRldiwgIiVzOiBTVUJNSVRVUkIzMlxuIiwgX19mdW5jX18pOwogCQlyZXQgPSBwcm9jX3N1Ym1pdHVyYl9jb21wYXQocHMsIHApOwogCQlpZiAocmV0ID49IDApCiAJCQlpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKIAkJYnJlYWs7CiAKIAljYXNlIFVTQkRFVkZTX1JFQVBVUkIzMjoKLQkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IFJFQVBVUkIzMlxuIiwgX19GVU5DVElPTl9fKTsKKwkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IFJFQVBVUkIzMlxuIiwgX19mdW5jX18pOwogCQlyZXQgPSBwcm9jX3JlYXB1cmJfY29tcGF0KHBzLCBwKTsKIAkJYnJlYWs7CiAKIAljYXNlIFVTQkRFVkZTX1JFQVBVUkJOREVMQVkzMjoKLQkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IFJFQVBVUkJERUxBWTMyXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzbm9vcCgmZGV2LT5kZXYsICIlczogUkVBUFVSQkRFTEFZMzJcbiIsIF9fZnVuY19fKTsKIAkJcmV0ID0gcHJvY19yZWFwdXJibm9uYmxvY2tfY29tcGF0KHBzLCBwKTsKIAkJYnJlYWs7CiAKIAljYXNlIFVTQkRFVkZTX0lPQ1RMMzI6Ci0JCXNub29wKCZkZXYtPmRldiwgIiVzOiBJT0NUTFxuIiwgX19GVU5DVElPTl9fKTsKKwkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IElPQ1RMXG4iLCBfX2Z1bmNfXyk7CiAJCXJldCA9IHByb2NfaW9jdGxfY29tcGF0KHBzLCBwdHJfdG9fY29tcGF0KHApKTsKIAkJYnJlYWs7CiAjZW5kaWYKIAogCWNhc2UgVVNCREVWRlNfRElTQ0FSRFVSQjoKLQkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IERJU0NBUkRVUkJcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXNub29wKCZkZXYtPmRldiwgIiVzOiBESVNDQVJEVVJCXG4iLCBfX2Z1bmNfXyk7CiAJCXJldCA9IHByb2NfdW5saW5rdXJiKHBzLCBwKTsKIAkJYnJlYWs7CiAKIAljYXNlIFVTQkRFVkZTX1JFQVBVUkI6Ci0JCXNub29wKCZkZXYtPmRldiwgIiVzOiBSRUFQVVJCXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzbm9vcCgmZGV2LT5kZXYsICIlczogUkVBUFVSQlxuIiwgX19mdW5jX18pOwogCQlyZXQgPSBwcm9jX3JlYXB1cmIocHMsIHApOwogCQlicmVhazsKIAogCWNhc2UgVVNCREVWRlNfUkVBUFVSQk5ERUxBWToKLQkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IFJFQVBVUkJERUxBWVxuIiwgX19GVU5DVElPTl9fKTsKKwkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IFJFQVBVUkJERUxBWVxuIiwgX19mdW5jX18pOwogCQlyZXQgPSBwcm9jX3JlYXB1cmJub25ibG9jayhwcywgcCk7CiAJCWJyZWFrOwogCiAJY2FzZSBVU0JERVZGU19ESVNDU0lHTkFMOgotCQlzbm9vcCgmZGV2LT5kZXYsICIlczogRElTQ1NJR05BTFxuIiwgX19GVU5DVElPTl9fKTsKKwkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IERJU0NTSUdOQUxcbiIsIF9fZnVuY19fKTsKIAkJcmV0ID0gcHJvY19kaXNjb25uZWN0c2lnbmFsKHBzLCBwKTsKIAkJYnJlYWs7CiAKIAljYXNlIFVTQkRFVkZTX0NMQUlNSU5URVJGQUNFOgotCQlzbm9vcCgmZGV2LT5kZXYsICIlczogQ0xBSU1JTlRFUkZBQ0VcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXNub29wKCZkZXYtPmRldiwgIiVzOiBDTEFJTUlOVEVSRkFDRVxuIiwgX19mdW5jX18pOwogCQlyZXQgPSBwcm9jX2NsYWltaW50ZXJmYWNlKHBzLCBwKTsKIAkJYnJlYWs7CiAKIAljYXNlIFVTQkRFVkZTX1JFTEVBU0VJTlRFUkZBQ0U6Ci0JCXNub29wKCZkZXYtPmRldiwgIiVzOiBSRUxFQVNFSU5URVJGQUNFXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzbm9vcCgmZGV2LT5kZXYsICIlczogUkVMRUFTRUlOVEVSRkFDRVxuIiwgX19mdW5jX18pOwogCQlyZXQgPSBwcm9jX3JlbGVhc2VpbnRlcmZhY2UocHMsIHApOwogCQlicmVhazsKIAogCWNhc2UgVVNCREVWRlNfSU9DVEw6Ci0JCXNub29wKCZkZXYtPmRldiwgIiVzOiBJT0NUTFxuIiwgX19GVU5DVElPTl9fKTsKKwkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IElPQ1RMXG4iLCBfX2Z1bmNfXyk7CiAJCXJldCA9IHByb2NfaW9jdGxfZGVmYXVsdChwcywgcCk7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jCmluZGV4IDgwMWI2ZjEuLjFlNTZmMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CiAJaW50IGVycm9yID0gLUVOT0RFVjsKIAotCWRldl9kYmcoZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJZGV2X2RiZyhkZXYsICIlc1xuIiwgX19mdW5jX18pOwogCiAJaWYgKCFpc191c2JfZGV2aWNlKGRldikpCS8qIFNhbml0eSBjaGVjayAqLwogCQlyZXR1cm4gZXJyb3I7CkBAIC0xOTQsNyArMTk0LDcgQEAKIAljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQ7CiAJaW50IGVycm9yID0gLUVOT0RFVjsKIAotCWRldl9kYmcoZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJZGV2X2RiZyhkZXYsICIlc1xuIiwgX19mdW5jX18pOwogCiAJaWYgKGlzX3VzYl9kZXZpY2UoZGV2KSkJCS8qIFNhbml0eSBjaGVjayAqLwogCQlyZXR1cm4gZXJyb3I7CkBAIC0yMTEsNyArMjExLDcgQEAKIAlpZiAoIWlkKQogCQlpZCA9IHVzYl9tYXRjaF9keW5hbWljX2lkKGludGYsIGRyaXZlcik7CiAJaWYgKGlkKSB7Ci0JCWRldl9kYmcoZGV2LCAiJXMgLSBnb3QgaWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRldl9kYmcoZGV2LCAiJXMgLSBnb3QgaWRcbiIsIF9fZnVuY19fKTsKIAogCQllcnJvciA9IHVzYl9hdXRvcmVzdW1lX2RldmljZSh1ZGV2KTsKIAkJaWYgKGVycm9yKQpAQCAtNzkzLDkgKzc5Myw3IEBACiAJc3RhdHVzID0gdWRyaXZlci0+c3VzcGVuZCh1ZGV2LCBtc2cpOwogCiAgZG9uZToKLQlkZXZfdmRiZygmdWRldi0+ZGV2LCAiJXM6IHN0YXR1cyAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOwotCWlmIChzdGF0dXMgPT0gMCkKLQkJdWRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID0gbXNnLmV2ZW50OworCWRldl92ZGJnKCZ1ZGV2LT5kZXYsICIlczogc3RhdHVzICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC04MjMsMTEgKzgyMSw5IEBACiAJc3RhdHVzID0gdWRyaXZlci0+cmVzdW1lKHVkZXYpOwogCiAgZG9uZToKLQlkZXZfdmRiZygmdWRldi0+ZGV2LCAiJXM6IHN0YXR1cyAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOwotCWlmIChzdGF0dXMgPT0gMCkgeworCWRldl92ZGJnKCZ1ZGV2LT5kZXYsICIlczogc3RhdHVzICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwlpZiAoc3RhdHVzID09IDApCiAJCXVkZXYtPmF1dG9yZXN1bWVfZGlzYWJsZWQgPSAwOwotCQl1ZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPSBQTV9FVkVOVF9PTjsKLQl9CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtODY0LDcgKzg2MCw3IEBACiAJfQogCiAgZG9uZToKLQlkZXZfdmRiZygmaW50Zi0+ZGV2LCAiJXM6IHN0YXR1cyAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCWRldl92ZGJnKCZpbnRmLT5kZXYsICIlczogc3RhdHVzICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC05MTQsNyArOTEwLDcgQEAKIAl9CiAKIGRvbmU6Ci0JZGV2X3ZkYmcoJmludGYtPmRldiwgIiVzOiBzdGF0dXMgJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwlkZXZfdmRiZygmaW50Zi0+ZGV2LCAiJXM6IHN0YXR1cyAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJaWYgKHN0YXR1cyA9PSAwKQogCQltYXJrX2FjdGl2ZShpbnRmKTsKIApAQCAtOTM2LDcgKzkzMiw2IEBACiAJICogaXMgZGlzYWJsZWQuICBBbHNvIGZhaWwgaWYgYW55IGludGVyZmFjZXMgcmVxdWlyZSByZW1vdGUgd2FrZXVwCiAJICogYnV0IGl0IGlzbid0IGF2YWlsYWJsZS4KIAkgKi8KLQl1ZGV2LT5kb19yZW1vdGVfd2FrZXVwID0gZGV2aWNlX21heV93YWtldXAoJnVkZXYtPmRldik7CiAJaWYgKHVkZXYtPnBtX3VzYWdlX2NudCA+IDApCiAJCXJldHVybiAtRUJVU1k7CiAJaWYgKHVkZXYtPmF1dG9zdXNwZW5kX2RlbGF5IDwgMCB8fCB1ZGV2LT5hdXRvc3VzcGVuZF9kaXNhYmxlZCkKQEAgLTEwOTgsNyArMTA5Myw3IEBACiAJfQogCiAgZG9uZToKLQlkZXZfdmRiZygmdWRldi0+ZGV2LCAiJXM6IHN0YXR1cyAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCWRldl92ZGJnKCZ1ZGV2LT5kZXYsICIlczogc3RhdHVzICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xMTgwLDggKzExNzUsNyBAQAogCQl9CiAJfSBlbHNlIHsKIAotCQkvKiBOZWVkZWQgZm9yIHNldHRpbmcgdWRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50LAotCQkgKiBmb3IgcG9zc2libGUgZGVidWdnaW5nIG1lc3NhZ2UsIGFuZCBmb3IgcmVzZXRfcmVzdW1lLiAqLworCQkvKiBOZWVkZWQgZm9yIHJlc2V0LXJlc3VtZSAqLwogCQlzdGF0dXMgPSB1c2JfcmVzdW1lX2RldmljZSh1ZGV2KTsKIAl9CiAKQEAgLTExOTMsOCArMTE4Nyw5IEBACiAJfQogCiAgZG9uZToKLQlkZXZfdmRiZygmdWRldi0+ZGV2LCAiJXM6IHN0YXR1cyAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOwotCXVkZXYtPnJlc2V0X3Jlc3VtZSA9IDA7CisJZGV2X3ZkYmcoJnVkZXYtPmRldiwgIiVzOiBzdGF0dXMgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOworCWlmICghc3RhdHVzKQorCQl1ZGV2LT5yZXNldF9yZXN1bWUgPSAwOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTEyNjIsNyArMTI1Nyw3IEBACiAKIAlzdGF0dXMgPSB1c2JfYXV0b3BtX2RvX2RldmljZSh1ZGV2LCAtMSk7CiAJZGV2X3ZkYmcoJnVkZXYtPmRldiwgIiVzOiBjbnQgJWRcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHVkZXYtPnBtX3VzYWdlX2NudCk7CisJCQlfX2Z1bmNfXywgdWRldi0+cG1fdXNhZ2VfY250KTsKIH0KIAogLyoqCkBAIC0xMjgyLDcgKzEyNzcsNyBAQAogewogCXVzYl9hdXRvcG1fZG9fZGV2aWNlKHVkZXYsIDApOwogCWRldl92ZGJnKCZ1ZGV2LT5kZXYsICIlczogY250ICVkXG4iLAotCQkJX19GVU5DVElPTl9fLCB1ZGV2LT5wbV91c2FnZV9jbnQpOworCQkJX19mdW5jX18sIHVkZXYtPnBtX3VzYWdlX2NudCk7CiB9CiAKIC8qKgpAQCAtMTMxMCw3ICsxMzA1LDcgQEAKIAogCXN0YXR1cyA9IHVzYl9hdXRvcG1fZG9fZGV2aWNlKHVkZXYsIDEpOwogCWRldl92ZGJnKCZ1ZGV2LT5kZXYsICIlczogc3RhdHVzICVkIGNudCAlZFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgc3RhdHVzLCB1ZGV2LT5wbV91c2FnZV9jbnQpOworCQkJX19mdW5jX18sIHN0YXR1cywgdWRldi0+cG1fdXNhZ2VfY250KTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xMzgyLDcgKzEzNzcsNyBAQAogCiAJc3RhdHVzID0gdXNiX2F1dG9wbV9kb19pbnRlcmZhY2UoaW50ZiwgLTEpOwogCWRldl92ZGJnKCZpbnRmLT5kZXYsICIlczogc3RhdHVzICVkIGNudCAlZFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgc3RhdHVzLCBpbnRmLT5wbV91c2FnZV9jbnQpOworCQkJX19mdW5jX18sIHN0YXR1cywgaW50Zi0+cG1fdXNhZ2VfY250KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZSk7CiAKQEAgLTE0MjYsNyArMTQyMSw3IEBACiAKIAlzdGF0dXMgPSB1c2JfYXV0b3BtX2RvX2ludGVyZmFjZShpbnRmLCAxKTsKIAlkZXZfdmRiZygmaW50Zi0+ZGV2LCAiJXM6IHN0YXR1cyAlZCBjbnQgJWRcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHN0YXR1cywgaW50Zi0+cG1fdXNhZ2VfY250KTsKKwkJCV9fZnVuY19fLCBzdGF0dXMsIGludGYtPnBtX3VzYWdlX2NudCk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZSk7CkBAIC0xNDQ4LDcgKzE0NDMsNyBAQAogCiAJc3RhdHVzID0gdXNiX2F1dG9wbV9kb19pbnRlcmZhY2UoaW50ZiwgMCk7CiAJZGV2X3ZkYmcoJmludGYtPmRldiwgIiVzOiBzdGF0dXMgJWQgY250ICVkXG4iLAotCQkJX19GVU5DVElPTl9fLCBzdGF0dXMsIGludGYtPnBtX3VzYWdlX2NudCk7CisJCQlfX2Z1bmNfXywgc3RhdHVzLCBpbnRmLT5wbV91c2FnZV9jbnQpOwogCXJldHVybiBzdGF0dXM7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1c2JfYXV0b3BtX3NldF9pbnRlcmZhY2UpOwpAQCAtMTUyMyw5ICsxNTE4LDE0IEBACiAJdWRldiA9IHRvX3VzYl9kZXZpY2UoZGV2KTsKIAogCS8qIElmIHVkZXYgaXMgYWxyZWFkeSBzdXNwZW5kZWQsIHdlIGNhbiBza2lwIHRoaXMgc3VzcGVuZCBhbmQKLQkgKiB3ZSBzaG91bGQgYWxzbyBza2lwIHRoZSB1cGNvbWluZyBzeXN0ZW0gcmVzdW1lLiAqLworCSAqIHdlIHNob3VsZCBhbHNvIHNraXAgdGhlIHVwY29taW5nIHN5c3RlbSByZXN1bWUuICBIaWdoLXNwZWVkCisJICogcm9vdCBodWJzIGFyZSBhbiBleGNlcHRpb247IHRoZXkgbmVlZCB0byByZXN1bWUgd2hlbmV2ZXIgdGhlCisJICogc3lzdGVtIHdha2VzIHVwIGluIG9yZGVyIGZvciBVU0ItUEVSU0lTVCBwb3J0IGhhbmRvdmVyIHRvIHdvcmsKKwkgKiBwcm9wZXJseS4KKwkgKi8KIAlpZiAodWRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX1NVU1BFTkRFRCkgewotCQl1ZGV2LT5za2lwX3N5c19yZXN1bWUgPSAxOworCQlpZiAodWRldi0+cGFyZW50IHx8IHVkZXYtPnNwZWVkICE9IFVTQl9TUEVFRF9ISUdIKQorCQkJdWRldi0+c2tpcF9zeXNfcmVzdW1lID0gMTsKIAkJcmV0dXJuIDA7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC1wY2kuYyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLXBjaS5jCmluZGV4IDg0NzYwZGQuLjViODdhZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLXBjaS5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLXBjaS5jCkBAIC03Myw3ICs3Myw2IEBACiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldikgPCAwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlkZXYtPmN1cnJlbnRfc3RhdGUgPSBQQ0lfRDA7Ci0JZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOwogCiAJaWYgKCFkZXYtPmlycSkgewogCQlkZXZfZXJyKCZkZXYtPmRldiwKQEAgLTIxNiw5ICsyMTUsOSBAQAogCQkJaGNkLT5zdGF0ZSA9PSBIQ19TVEFURV9IQUxUKSkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCWlmIChoY2QtPmRyaXZlci0+c3VzcGVuZCkgewotCQlyZXR2YWwgPSBoY2QtPmRyaXZlci0+c3VzcGVuZChoY2QsIG1lc3NhZ2UpOwotCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQoaGNkLT5kcml2ZXItPnN1c3BlbmQsIHJldHZhbCk7CisJaWYgKGhjZC0+ZHJpdmVyLT5wY2lfc3VzcGVuZCkgeworCQlyZXR2YWwgPSBoY2QtPmRyaXZlci0+cGNpX3N1c3BlbmQoaGNkLCBtZXNzYWdlKTsKKwkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGhjZC0+ZHJpdmVyLT5wY2lfc3VzcGVuZCwgcmV0dmFsKTsKIAkJaWYgKHJldHZhbCkKIAkJCWdvdG8gZG9uZTsKIAl9CkBAIC0zMDIsOCArMzAxLDYgQEAKIAogZG9uZToKIAlpZiAocmV0dmFsID09IDApIHsKLQkJZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX1NVU1BFTkQ7Ci0KICNpZmRlZiBDT05GSUdfUFBDX1BNQUMKIAkJLyogRGlzYWJsZSBBU0lDIGNsb2NrcyBmb3IgVVNCICovCiAJCWlmIChtYWNoaW5lX2lzKHBvd2VybWFjKSkgewpAQCAtNDA2LDEyICs0MDMsMTAgQEAKIAlwY2lfc2V0X21hc3RlcihkZXYpOwogCXBjaV9yZXN0b3JlX3N0YXRlKGRldik7CiAKLQlkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047Ci0KIAljbGVhcl9iaXQoSENEX0ZMQUdfU0FXX0lSUSwgJmhjZC0+ZmxhZ3MpOwogCi0JaWYgKGhjZC0+ZHJpdmVyLT5yZXN1bWUpIHsKLQkJcmV0dmFsID0gaGNkLT5kcml2ZXItPnJlc3VtZShoY2QpOworCWlmIChoY2QtPmRyaXZlci0+cGNpX3Jlc3VtZSkgeworCQlyZXR2YWwgPSBoY2QtPmRyaXZlci0+cGNpX3Jlc3VtZShoY2QpOwogCQlpZiAocmV0dmFsKSB7CiAJCQlkZXZfZXJyKGhjZC0+c2VsZi5jb250cm9sbGVyLAogCQkJCSJQQ0kgcG9zdC1yZXN1bWUgZXJyb3IgJWQhXG4iLCByZXR2YWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9oY2QuYyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKaW5kZXggZTUyZWQxNi4uYmYxMGU5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9oY2QuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCkBAIC0xMjksNyArMTI5LDcgQEAKIAogCTB4MDksCSAgICAvKiAgX191OCAgYkRldmljZUNsYXNzOyBIVUJfQ0xBU1NDT0RFICovCiAJMHgwMCwJICAgIC8qICBfX3U4ICBiRGV2aWNlU3ViQ2xhc3M7ICovCi0JMHgwMSwgICAgICAgLyogIF9fdTggIGJEZXZpY2VQcm90b2NvbDsgWyB1c2IgMi4wIHNpbmdsZSBUVCBdKi8KKwkweDAwLCAgICAgICAvKiAgX191OCAgYkRldmljZVByb3RvY29sOyBbIHVzYiAyLjAgbm8gVFQgXSAqLwogCTB4NDAsICAgICAgIC8qICBfX3U4ICBiTWF4UGFja2V0U2l6ZTA7IDY0IEJ5dGVzICovCiAKIAkweDZiLCAweDFkLCAvKiAgX19sZTE2IGlkVmVuZG9yOyBMaW51eCBGb3VuZGF0aW9uICovCkBAIC0yOTEsNyArMjkxLDYgQEAKICAqIHJoX3N0cmluZyAtIHByb3ZpZGVzIG1hbnVmYWN0dXJlciwgcHJvZHVjdCBhbmQgc2VyaWFsIHN0cmluZ3MgZm9yIHJvb3QgaHViCiAgKiBAaWQ6IHRoZSBzdHJpbmcgSUQgbnVtYmVyICgxOiBzZXJpYWwgbnVtYmVyLCAyOiBwcm9kdWN0LCAzOiB2ZW5kb3IpCiAgKiBAaGNkOiB0aGUgaG9zdCBjb250cm9sbGVyIGZvciB0aGlzIHJvb3QgaHViCi0gKiBAdHlwZTogc3RyaW5nIGRlc2NyaWJpbmcgb3VyIGRyaXZlciAKICAqIEBkYXRhOiByZXR1cm4gcGFja2V0IGluIFVURi0xNiBMRQogICogQGxlbjogbGVuZ3RoIG9mIHRoZSByZXR1cm4gcGFja2V0CiAgKgpAQCAtMzU1LDkgKzM1NCwxMCBAQAogCQlfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQpKSk7CiAJY29uc3QgdTgJKmJ1ZnAgPSB0YnVmOwogCWludAkJbGVuID0gMDsKLQlpbnQJCXBhdGNoX3dha2V1cCA9IDA7CiAJaW50CQlzdGF0dXM7CiAJaW50CQluOworCXU4CQlwYXRjaF93YWtldXAgPSAwOworCXU4CQlwYXRjaF9wcm90b2NvbCA9IDA7CiAKIAltaWdodF9zbGVlcCgpOwogCkBAIC00MzQsNiArNDM0LDggQEAKIAkJCWVsc2UKIAkJCQlnb3RvIGVycm9yOwogCQkJbGVuID0gMTg7CisJCQlpZiAoaGNkLT5oYXNfdHQpCisJCQkJcGF0Y2hfcHJvdG9jb2wgPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgVVNCX0RUX0NPTkZJRyA8PCA4OgogCQkJaWYgKGhjZC0+ZHJpdmVyLT5mbGFncyAmIEhDRF9VU0IyKSB7CkBAIC01MjgsNiArNTMwLDEzIEBACiAJCQkJCQlibUF0dHJpYnV0ZXMpKQogCQkJKChzdHJ1Y3QgdXNiX2NvbmZpZ19kZXNjcmlwdG9yICopdWJ1ZiktPmJtQXR0cmlidXRlcwogCQkJCXw9IFVTQl9DT05GSUdfQVRUX1dBS0VVUDsKKworCQkvKiByZXBvcnQgd2hldGhlciBSSCBoYXJkd2FyZSBoYXMgYW4gaW50ZWdyYXRlZCBUVCAqLworCQlpZiAocGF0Y2hfcHJvdG9jb2wgJiYKKwkJCQlsZW4gPiBvZmZzZXRvZihzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yLAorCQkJCQkJYkRldmljZVByb3RvY29sKSkKKwkJCSgoc3RydWN0IHVzYl9kZXZpY2VfZGVzY3JpcHRvciAqKSB1YnVmKS0+CisJCQkJCWJEZXZpY2VQcm90b2NvbCA9IDE7CiAJfQogCiAJLyogYW55IGVycm9ycyBnZXQgcmV0dXJuZWQgdGhyb3VnaCB0aGUgdXJiIGNvbXBsZXRpb24gKi8KQEAgLTkxNSwxNSArOTI0LDYgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi12b2lkIHVzYl9lbmFibGVfcm9vdF9odWJfaXJxIChzdHJ1Y3QgdXNiX2J1cyAqYnVzKQotewotCXN0cnVjdCB1c2JfaGNkICpoY2Q7Ci0KLQloY2QgPSBjb250YWluZXJfb2YgKGJ1cywgc3RydWN0IHVzYl9oY2QsIHNlbGYpOwotCWlmIChoY2QtPmRyaXZlci0+aHViX2lycV9lbmFibGUgJiYgaGNkLT5zdGF0ZSAhPSBIQ19TVEFURV9IQUxUKQotCQloY2QtPmRyaXZlci0+aHViX2lycV9lbmFibGUgKGhjZCk7Ci19Ci0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtMTY3Nyw3ICsxNjc3LDYgQEAKICAqIHVzYl9oY2RfaXJxIC0gaG9vayBJUlFzIHRvIEhDRCBmcmFtZXdvcmsgKGJ1cyBnbHVlKQogICogQGlycTogdGhlIElSUSBiZWluZyByYWlzZWQKICAqIEBfX2hjZDogcG9pbnRlciB0byB0aGUgSENEIHdob3NlIElSUSBpcyBiZWluZyBzaWduYWxlZAotICogQHI6IHNhdmVkIGhhcmR3YXJlIHJlZ2lzdGVycwogICoKICAqIElmIHRoZSBjb250cm9sbGVyIGlzbid0IEhBTFRlZCwgY2FsbHMgdGhlIGRyaXZlcidzIGlycSBoYW5kbGVyLgogICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNvbnRyb2xsZXIgaXMgbm93IGRlYWQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5oIGIvZHJpdmVycy91c2IvY29yZS9oY2QuaAppbmRleCAyZDFjM2Q1ZS4uMWU0YjgxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9oY2QuaAorKysgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5oCkBAIC0yOCw3ICsyOCw3IEBACiAvKgogICogVVNCIFBhY2tldCBJRHMgKFBJRHMpCiAgKi8KLSNkZWZpbmUgVVNCX1BJRF9VTkRFRl8wCQkJMHhmMAorI2RlZmluZSBVU0JfUElEX0VYVAkJCTB4ZjAJLyogVVNCIDIuMCBMUE0gRUNOICovCiAjZGVmaW5lIFVTQl9QSURfT1VUCQkJMHhlMQogI2RlZmluZSBVU0JfUElEX0FDSwkJCTB4ZDIKICNkZWZpbmUgVVNCX1BJRF9EQVRBMAkJCTB4YzMKQEAgLTk5LDYgKzk5LDcgQEAKIAl1bnNpZ25lZAkJcG9sbF9wZW5kaW5nOjE7CS8qIHN0YXR1cyBoYXMgY2hhbmdlZD8gKi8KIAl1bnNpZ25lZAkJd2lyZWxlc3M6MTsJLyogV2lyZWxlc3MgVVNCIEhDRCAqLwogCXVuc2lnbmVkCQlhdXRob3JpemVkX2RlZmF1bHQ6MTsKKwl1bnNpZ25lZAkJaGFzX3R0OjE7CS8qIEludGVncmF0ZWQgVFQgaW4gcm9vdCBodWIgKi8KIAogCWludAkJCWlycTsJCS8qIGlycSBhbGxvY2F0ZWQgKi8KIAl2b2lkIF9faW9tZW0JCSpyZWdzOwkJLyogZGV2aWNlIG1lbW9yeS9pbyAqLwpAQCAtMTc3LDEwICsxNzgsMTAgQEAKIAkgKiBhIHdob2xlLCBub3QganVzdCB0aGUgcm9vdCBodWI7IHRoZXkncmUgZm9yIFBDSSBidXMgZ2x1ZS4KIAkgKi8KIAkvKiBjYWxsZWQgYWZ0ZXIgc3VzcGVuZGluZyB0aGUgaHViLCBiZWZvcmUgZW50ZXJpbmcgRDMgZXRjICovCi0JaW50CSgqc3VzcGVuZCkgKHN0cnVjdCB1c2JfaGNkICpoY2QsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKTsKKwlpbnQJKCpwY2lfc3VzcGVuZCkgKHN0cnVjdCB1c2JfaGNkICpoY2QsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKTsKIAogCS8qIGNhbGxlZCBhZnRlciBlbnRlcmluZyBEMCAoZXRjKSwgYmVmb3JlIHJlc3VtaW5nIHRoZSBodWIgKi8KLQlpbnQJKCpyZXN1bWUpIChzdHJ1Y3QgdXNiX2hjZCAqaGNkKTsKKwlpbnQJKCpwY2lfcmVzdW1lKSAoc3RydWN0IHVzYl9oY2QgKmhjZCk7CiAKIAkvKiBjbGVhbmx5IG1ha2UgSENEIHN0b3Agd3JpdGluZyBtZW1vcnkgYW5kIGRvaW5nIEkvTyAqLwogCXZvaWQJKCpzdG9wKSAoc3RydWN0IHVzYl9oY2QgKmhjZCk7CkBAIC0yMDksOCArMjEwLDYgQEAKIAlpbnQJKCpidXNfc3VzcGVuZCkoc3RydWN0IHVzYl9oY2QgKik7CiAJaW50CSgqYnVzX3Jlc3VtZSkoc3RydWN0IHVzYl9oY2QgKik7CiAJaW50CSgqc3RhcnRfcG9ydF9yZXNldCkoc3RydWN0IHVzYl9oY2QgKiwgdW5zaWduZWQgcG9ydF9udW0pOwotCXZvaWQJKCpodWJfaXJxX2VuYWJsZSkoc3RydWN0IHVzYl9oY2QgKik7Ci0JCS8qIE5lZWRlZCBvbmx5IGlmIHBvcnQtY2hhbmdlIElSUXMgYXJlIGxldmVsLXRyaWdnZXJlZCAqLwogCiAJCS8qIGZvcmNlIGhhbmRvdmVyIG9mIGhpZ2gtc3BlZWQgcG9ydCB0byBmdWxsLXNwZWVkIGNvbXBhbmlvbiAqLwogCXZvaWQJKCpyZWxpbnF1aXNoX3BvcnQpKHN0cnVjdCB1c2JfaGNkICosIGludCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwppbmRleCA1N2FlY2ExLi5lYjU3ZmNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKQEAgLTMwLDEyICszMCw2IEBACiAjaW5jbHVkZSAiaGNkLmgiCiAjaW5jbHVkZSAiaHViLmgiCiAKLSNpZmRlZglDT05GSUdfVVNCX1BFUlNJU1QKLSNkZWZpbmUJVVNCX1BFUlNJU1QJMQotI2Vsc2UKLSNkZWZpbmUJVVNCX1BFUlNJU1QJMAotI2VuZGlmCi0KIC8qIGlmIHdlIGFyZSBpbiBkZWJ1ZyBtb2RlLCBhbHdheXMgYW5ub3VuY2UgbmV3IGRldmljZXMgKi8KICNpZmRlZiBERUJVRwogI2lmbmRlZiBDT05GSUdfVVNCX0FOTk9VTkNFX05FV19ERVZJQ0VTCkBAIC0zMzMsNiArMzI3LDI3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdGljIGludCBodWJfcG9ydF9zdGF0dXMoc3RydWN0IHVzYl9odWIgKmh1YiwgaW50IHBvcnQxLAorCQl1MTYgKnN0YXR1cywgdTE2ICpjaGFuZ2UpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmh1Yi0+c3RhdHVzX211dGV4KTsKKwlyZXQgPSBnZXRfcG9ydF9zdGF0dXMoaHViLT5oZGV2LCBwb3J0MSwgJmh1Yi0+c3RhdHVzLT5wb3J0KTsKKwlpZiAocmV0IDwgNCkgeworCQlkZXZfZXJyKGh1Yi0+aW50ZmRldiwKKwkJCSIlcyBmYWlsZWQgKGVyciA9ICVkKVxuIiwgX19mdW5jX18sIHJldCk7CisJCWlmIChyZXQgPj0gMCkKKwkJCXJldCA9IC1FSU87CisJfSBlbHNlIHsKKwkJKnN0YXR1cyA9IGxlMTZfdG9fY3B1KGh1Yi0+c3RhdHVzLT5wb3J0LndQb3J0U3RhdHVzKTsKKwkJKmNoYW5nZSA9IGxlMTZfdG9fY3B1KGh1Yi0+c3RhdHVzLT5wb3J0LndQb3J0Q2hhbmdlKTsKKwkJcmV0ID0gMDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZodWItPnN0YXR1c19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHZvaWQga2lja19raHViZChzdHJ1Y3QgdXNiX2h1YiAqaHViKQogewogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CkBAIC01NjAsNyArNTc1LDcgQEAKIAlyZXQgPSBnZXRfaHViX3N0YXR1cyhodWItPmhkZXYsICZodWItPnN0YXR1cy0+aHViKTsKIAlpZiAocmV0IDwgMCkKIAkJZGV2X2VyciAoaHViLT5pbnRmZGV2LAotCQkJIiVzIGZhaWxlZCAoZXJyID0gJWQpXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7CisJCQkiJXMgZmFpbGVkIChlcnIgPSAlZClcbiIsIF9fZnVuY19fLCByZXQpOwogCWVsc2UgewogCQkqc3RhdHVzID0gbGUxNl90b19jcHUoaHViLT5zdGF0dXMtPmh1Yi53SHViU3RhdHVzKTsKIAkJKmNoYW5nZSA9IGxlMTZfdG9fY3B1KGh1Yi0+c3RhdHVzLT5odWIud0h1YkNoYW5nZSk7IApAQCAtNjEwLDkgKzYyNSw4IEBACiB9CiAKIC8qIGNhbGxlciBoYXMgbG9ja2VkIHRoZSBodWIgZGV2aWNlICovCi1zdGF0aWMgaW50IGh1Yl9wcmVfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCitzdGF0aWMgdm9pZCBodWJfc3RvcChzdHJ1Y3QgdXNiX2h1YiAqaHViKQogewotCXN0cnVjdCB1c2JfaHViICpodWIgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCXN0cnVjdCB1c2JfZGV2aWNlICpoZGV2ID0gaHViLT5oZGV2OwogCWludCBpOwogCkBAIC02MjIsNiArNjM2LDg5IEBACiAJCQl1c2JfZGlzY29ubmVjdCgmaGRldi0+Y2hpbGRyZW5baV0pOwogCX0KIAlodWJfcXVpZXNjZShodWIpOworfQorCisjZGVmaW5lIEhVQl9SRVNFVAkJMQorI2RlZmluZSBIVUJfUkVTVU1FCQkyCisjZGVmaW5lIEhVQl9SRVNFVF9SRVNVTUUJMworCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyB2b2lkIGh1Yl9yZXN0YXJ0KHN0cnVjdCB1c2JfaHViICpodWIsIGludCB0eXBlKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpoZGV2ID0gaHViLT5oZGV2OworCWludCBwb3J0MTsKKworCS8qIENoZWNrIGVhY2ggb2YgdGhlIGNoaWxkcmVuIHRvIHNlZSBpZiB0aGV5IHJlcXVpcmUKKwkgKiBVU0ItUEVSU0lTVCBoYW5kbGluZyBvciBkaXNjb25uZWN0aW9uLiAgQWxzbyBjaGVjaworCSAqIGVhY2ggdW5vY2N1cGllZCBwb3J0IHRvIG1ha2Ugc3VyZSBpdCBpcyBzdGlsbCBkaXNhYmxlZC4KKwkgKi8KKwlmb3IgKHBvcnQxID0gMTsgcG9ydDEgPD0gaGRldi0+bWF4Y2hpbGQ7ICsrcG9ydDEpIHsKKwkJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBoZGV2LT5jaGlsZHJlbltwb3J0MS0xXTsKKwkJaW50IHN0YXR1cyA9IDA7CisJCXUxNiBwb3J0c3RhdHVzLCBwb3J0Y2hhbmdlOworCisJCWlmICghdWRldiB8fCB1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpIHsKKwkJCWlmICh0eXBlICE9IEhVQl9SRVNFVCkgeworCQkJCXN0YXR1cyA9IGh1Yl9wb3J0X3N0YXR1cyhodWIsIHBvcnQxLAorCQkJCQkJJnBvcnRzdGF0dXMsICZwb3J0Y2hhbmdlKTsKKwkJCQlpZiAoc3RhdHVzID09IDAgJiYgKHBvcnRzdGF0dXMgJgorCQkJCQkJVVNCX1BPUlRfU1RBVF9FTkFCTEUpKQorCQkJCQljbGVhcl9wb3J0X2ZlYXR1cmUoaGRldiwgcG9ydDEsCisJCQkJCQkJVVNCX1BPUlRfRkVBVF9FTkFCTEUpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQkvKiBXYXMgdGhlIHBvd2VyIHNlc3Npb24gbG9zdCB3aGlsZSB3ZSB3ZXJlIHN1c3BlbmRlZD8gKi8KKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgSFVCX1JFU0VUX1JFU1VNRToKKwkJCXBvcnRzdGF0dXMgPSAwOworCQkJcG9ydGNoYW5nZSA9IFVTQl9QT1JUX1NUQVRfQ19DT05ORUNUSU9OOworCQkJYnJlYWs7CisKKwkJY2FzZSBIVUJfUkVTRVQ6CisJCWNhc2UgSFVCX1JFU1VNRToKKwkJCXN0YXR1cyA9IGh1Yl9wb3J0X3N0YXR1cyhodWIsIHBvcnQxLAorCQkJCQkmcG9ydHN0YXR1cywgJnBvcnRjaGFuZ2UpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBGb3IgIlVTQl9QRVJTSVNUIi1lbmFibGVkIGNoaWxkcmVuIHdlIG11c3QKKwkJICogbWFyayB0aGUgY2hpbGQgZGV2aWNlIGZvciByZXNldC1yZXN1bWUgYW5kCisJCSAqIHR1cm4gb2ZmIHRoZSB2YXJpb3VzIHN0YXR1cyBjaGFuZ2VzIHRvIHByZXZlbnQKKwkJICoga2h1YmQgZnJvbSBkaXNjb25uZWN0aW5nIGl0IGxhdGVyLgorCQkgKi8KKwkJaWYgKHVkZXYtPnBlcnNpc3RfZW5hYmxlZCAmJiBzdGF0dXMgPT0gMCAmJgorCQkJCSEocG9ydHN0YXR1cyAmIFVTQl9QT1JUX1NUQVRfRU5BQkxFKSkgeworCQkJaWYgKHBvcnRjaGFuZ2UgJiBVU0JfUE9SVF9TVEFUX0NfRU5BQkxFKQorCQkJCWNsZWFyX3BvcnRfZmVhdHVyZShodWItPmhkZXYsIHBvcnQxLAorCQkJCQkJVVNCX1BPUlRfRkVBVF9DX0VOQUJMRSk7CisJCQlpZiAocG9ydGNoYW5nZSAmIFVTQl9QT1JUX1NUQVRfQ19DT05ORUNUSU9OKQorCQkJCWNsZWFyX3BvcnRfZmVhdHVyZShodWItPmhkZXYsIHBvcnQxLAorCQkJCQkJVVNCX1BPUlRfRkVBVF9DX0NPTk5FQ1RJT04pOworCQkJdWRldi0+cmVzZXRfcmVzdW1lID0gMTsKKwkJfQorCisJCS8qIE90aGVyd2lzZSBmb3IgYSByZXNldF9yZXN1bWUgd2UgbXVzdCBkaXNjb25uZWN0IHRoZSBjaGlsZCwKKwkJICogYnV0IGFzIHdlIG1heSBub3QgbG9jayB0aGUgY2hpbGQgZGV2aWNlIGhlcmUKKwkJICogd2UgaGF2ZSB0byBkbyBhICJsb2dpY2FsIiBkaXNjb25uZWN0LgorCQkgKi8KKwkJZWxzZSBpZiAodHlwZSA9PSBIVUJfUkVTRVRfUkVTVU1FKQorCQkJaHViX3BvcnRfbG9naWNhbF9kaXNjb25uZWN0KGh1YiwgcG9ydDEpOworCX0KKworCWh1Yl9hY3RpdmF0ZShodWIpOworfQorCisjZW5kaWYJLyogQ09ORklHX1BNICovCisKKy8qIGNhbGxlciBoYXMgbG9ja2VkIHRoZSBodWIgZGV2aWNlICovCitzdGF0aWMgaW50IGh1Yl9wcmVfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYl9odWIgKmh1YiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKwlodWJfc3RvcChodWIpOwogCXJldHVybiAwOwogfQogCkBAIC05MTAsNyArMTAwNyw3IEBACiAKIAkvKiBEaXNjb25uZWN0IGFsbCBjaGlsZHJlbiBhbmQgcXVpZXNjZSB0aGUgaHViICovCiAJaHViLT5lcnJvciA9IDA7Ci0JaHViX3ByZV9yZXNldChpbnRmKTsKKwlodWJfc3RvcChodWIpOwogCiAJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgTlVMTCk7CiAKQEAgLTEwOTgsMjEgKzExOTUsNDIgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2Vfc3RhdGVfbG9jaywgZmxhZ3MpOwogfQogCisvKgorICogV1VTQiBkZXZpY2VzIGFyZSBzaW1wbGU6IHRoZXkgaGF2ZSBubyBodWJzIGJlaGluZCwgc28gdGhlIG1hcHBpbmcKKyAqIGRldmljZSA8LT4gdmlydHVhbCBwb3J0IG51bWJlciBiZWNvbWVzIDE6MS4gV2h5PyB0byBzaW1wbGlmeSB0aGUKKyAqIGxpZmUgb2YgdGhlIGRldmljZSBjb25uZWN0aW9uIGxvZ2ljIGluCisgKiBkcml2ZXJzL3VzYi93dXNiY29yZS9kZXZjb25uZWN0LmMuIFdoZW4gd2UgZG8gdGhlIGluaXRpYWwgc2VjcmV0CisgKiBoYW5kc2hha2Ugd2UgbmVlZCB0byBhc3NpZ24gYSB0ZW1wb3JhcnkgYWRkcmVzcyBpbiB0aGUgdW5hdXRob3JpemVkCisgKiBzcGFjZS4gRm9yIHNpbXBsaWNpdHkgd2UgdXNlIHRoZSBmaXJzdCB2aXJ0dWFsIHBvcnQgbnVtYmVyIGZvdW5kIHRvCisgKiBiZSBmcmVlIFtkcml2ZXJzL3VzYi93dXNiY29yZS9kZXZjb25uZWN0LmM6d3VzYmhjX2RldmNvbm5lY3RfYWNrKCldCisgKiBhbmQgdGhhdCBiZWNvbWVzIGl0J3MgYWRkcmVzcyBbWCA8IDEyOF0gb3IgaXRzIHVuYXV0aG9yaXplZCBhZGRyZXNzCisgKiBbWCB8IDB4ODBdLgorICoKKyAqIFdlIGFkZCAxIGFzIGFuIG9mZnNldCB0byB0aGUgb25lLWJhc2VkIFVTQi1zdGFjayBwb3J0IG51bWJlcgorICogKHplcm8tYmFzZWQgd3VzYiB2aXJ0dWFsIHBvcnQgaW5kZXgpIGZvciB0d28gcmVhc29uczogKGEpIGRldiBhZGRyCisgKiAwIGlzIHJlc2VydmVkIGJ5IFVTQiBmb3IgZGVmYXVsdCBhZGRyZXNzOyAoYikgTGludXgncyBVU0Igc3RhY2sKKyAqIHVzZXMgYWx3YXlzICMxIGZvciB0aGUgcm9vdCBodWIgb2YgdGhlIGNvbnRyb2xsZXIuIFNvIFVTQiBzdGFjaydzCisgKiBwb3J0ICMxLCB3aGljaCBpcyB3dXNiIHZpcnR1YWwtcG9ydCAjMCBoYXMgYWRkcmVzcyAjMi4KKyAqLwogc3RhdGljIHZvaWQgY2hvb3NlX2FkZHJlc3Moc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCiB7CiAJaW50CQlkZXZudW07CiAJc3RydWN0IHVzYl9idXMJKmJ1cyA9IHVkZXYtPmJ1czsKIAogCS8qIElmIGtodWJkIGV2ZXIgYmVjb21lcyBtdWx0aXRocmVhZGVkLCB0aGlzIHdpbGwgbmVlZCBhIGxvY2sgKi8KLQotCS8qIFRyeSB0byBhbGxvY2F0ZSB0aGUgbmV4dCBkZXZudW0gYmVnaW5uaW5nIGF0IGJ1cy0+ZGV2bnVtX25leHQuICovCi0JZGV2bnVtID0gZmluZF9uZXh0X3plcm9fYml0KGJ1cy0+ZGV2bWFwLmRldmljZW1hcCwgMTI4LAotCQkJYnVzLT5kZXZudW1fbmV4dCk7Ci0JaWYgKGRldm51bSA+PSAxMjgpCi0JCWRldm51bSA9IGZpbmRfbmV4dF96ZXJvX2JpdChidXMtPmRldm1hcC5kZXZpY2VtYXAsIDEyOCwgMSk7Ci0KLQlidXMtPmRldm51bV9uZXh0ID0gKCBkZXZudW0gPj0gMTI3ID8gMSA6IGRldm51bSArIDEpOwotCisJaWYgKHVkZXYtPnd1c2IpIHsKKwkJZGV2bnVtID0gdWRldi0+cG9ydG51bSArIDE7CisJCUJVR19PTih0ZXN0X2JpdChkZXZudW0sIGJ1cy0+ZGV2bWFwLmRldmljZW1hcCkpOworCX0gZWxzZSB7CisJCS8qIFRyeSB0byBhbGxvY2F0ZSB0aGUgbmV4dCBkZXZudW0gYmVnaW5uaW5nIGF0CisJCSAqIGJ1cy0+ZGV2bnVtX25leHQuICovCisJCWRldm51bSA9IGZpbmRfbmV4dF96ZXJvX2JpdChidXMtPmRldm1hcC5kZXZpY2VtYXAsIDEyOCwKKwkJCQkJICAgIGJ1cy0+ZGV2bnVtX25leHQpOworCQlpZiAoZGV2bnVtID49IDEyOCkKKwkJCWRldm51bSA9IGZpbmRfbmV4dF96ZXJvX2JpdChidXMtPmRldm1hcC5kZXZpY2VtYXAsCisJCQkJCQkgICAgMTI4LCAxKTsKKwkJYnVzLT5kZXZudW1fbmV4dCA9ICggZGV2bnVtID49IDEyNyA/IDEgOiBkZXZudW0gKyAxKTsKKwl9CiAJaWYgKGRldm51bSA8IDEyOCkgewogCQlzZXRfYml0KGRldm51bSwgYnVzLT5kZXZtYXAuZGV2aWNlbWFwKTsKIAkJdWRldi0+ZGV2bnVtID0gZGV2bnVtOwpAQCAtMTEyNyw2ICsxMjQ1LDEzIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCB1cGRhdGVfYWRkcmVzcyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgaW50IGRldm51bSkKK3sKKwkvKiBUaGUgYWRkcmVzcyBmb3IgYSBXVVNCIGRldmljZSBpcyBtYW5hZ2VkIGJ5IHd1c2Jjb3JlLiAqLworCWlmICghdWRldi0+d3VzYikKKwkJdWRldi0+ZGV2bnVtID0gZGV2bnVtOworfQorCiAjaWZkZWYJQ09ORklHX1VTQl9TVVNQRU5ECiAKIHN0YXRpYyB2b2lkIHVzYl9zdG9wX3BtKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQpAQCAtMTE3Myw3ICsxMjk4LDcgQEAKIAlpbnQJCQlpOwogCiAJaWYgKCF1ZGV2KSB7Ci0JCXByX2RlYnVnICgiJXMgbm9kZXZcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXByX2RlYnVnICgiJXMgbm9kZXZcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTUxMCwyOCArMTYzNSw2IEBACiB9CiAKIAotc3RhdGljIGludCBodWJfcG9ydF9zdGF0dXMoc3RydWN0IHVzYl9odWIgKmh1YiwgaW50IHBvcnQxLAotCQkJICAgICAgIHUxNiAqc3RhdHVzLCB1MTYgKmNoYW5nZSkKLXsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmaHViLT5zdGF0dXNfbXV0ZXgpOwotCXJldCA9IGdldF9wb3J0X3N0YXR1cyhodWItPmhkZXYsIHBvcnQxLCAmaHViLT5zdGF0dXMtPnBvcnQpOwotCWlmIChyZXQgPCA0KSB7Ci0JCWRldl9lcnIgKGh1Yi0+aW50ZmRldiwKLQkJCSIlcyBmYWlsZWQgKGVyciA9ICVkKVxuIiwgX19GVU5DVElPTl9fLCByZXQpOwotCQlpZiAocmV0ID49IDApCi0JCQlyZXQgPSAtRUlPOwotCX0gZWxzZSB7Ci0JCSpzdGF0dXMgPSBsZTE2X3RvX2NwdShodWItPnN0YXR1cy0+cG9ydC53UG9ydFN0YXR1cyk7Ci0JCSpjaGFuZ2UgPSBsZTE2X3RvX2NwdShodWItPnN0YXR1cy0+cG9ydC53UG9ydENoYW5nZSk7IAotCQlyZXQgPSAwOwotCX0KLQltdXRleF91bmxvY2soJmh1Yi0+c3RhdHVzX211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi0KIC8qIFJldHVybnMgMSBpZiBAaHViIGlzIGEgV1VTQiByb290IGh1YiwgMCBvdGhlcndpc2UgKi8KIHN0YXRpYyB1bnNpZ25lZCBodWJfaXNfd3VzYihzdHJ1Y3QgdXNiX2h1YiAqaHViKQogewpAQCAtMTYzNyw3ICsxNzQwLDcgQEAKIAkJY2FzZSAwOgogCQkJLyogVFJTVFJDWSA9IDEwIG1zOyBwbHVzIHNvbWUgZXh0cmEgKi8KIAkJCW1zbGVlcCgxMCArIDQwKTsKLQkJICAJdWRldi0+ZGV2bnVtID0gMDsJLyogRGV2aWNlIG5vdyBhdCBhZGRyZXNzIDAgKi8KKwkJCXVwZGF0ZV9hZGRyZXNzKHVkZXYsIDApOwogCQkJLyogRkFMTCBUSFJPVUdIICovCiAJCWNhc2UgLUVOT1RDT05OOgogCQljYXNlIC1FTk9ERVY6CkBAIC0xODQyLDkgKzE5NDUsOCBAQAogICogdGhlIGhvc3QgYW5kIHRoZSBkZXZpY2UgaXMgdGhlIHNhbWUgYXMgaXQgd2FzIHdoZW4gdGhlIGRldmljZQogICogc3VzcGVuZGVkLgogICoKLSAqIElmIENPTkZJR19VU0JfUEVSU0lTVCBhbmQgQHVkZXYtPnJlc2V0X3Jlc3VtZSBhcmUgYm90aCBzZXQgdGhlbiB0aGlzCi0gKiByb3V0aW5lIHdvbid0IGNoZWNrIHRoYXQgdGhlIHBvcnQgaXMgc3RpbGwgZW5hYmxlZC4gIEZ1cnRoZXJtb3JlLAotICogaWYgQHVkZXYtPnJlc2V0X3Jlc3VtZSBpcyBzZXQgdGhlbiBmaW5pc2hfcG9ydF9yZXN1bWUoKSBhYm92ZSB3aWxsCisgKiBJZiBAdWRldi0+cmVzZXRfcmVzdW1lIGlzIHNldCB0aGVuIHRoaXMgcm91dGluZSB3b24ndCBjaGVjayB0aGF0IHRoZQorICogcG9ydCBpcyBzdGlsbCBlbmFibGVkLiAgRnVydGhlcm1vcmUsIGZpbmlzaF9wb3J0X3Jlc3VtZSgpIGFib3ZlIHdpbGwKICAqIHJlc2V0IEB1ZGV2LiAgVGhlIGVuZCByZXN1bHQgaXMgdGhhdCBhIGJyb2tlbiBwb3dlciBzZXNzaW9uIGNhbiBiZQogICogcmVjb3ZlcmVkIGFuZCBAdWRldiB3aWxsIGFwcGVhciB0byBwZXJzaXN0IGFjcm9zcyBhIGxvc3Mgb2YgVkJVUyBwb3dlci4KICAqCkBAIC0xODU2LDggKzE5NTgsOCBAQAogICogdG8gaXQgd2lsbCBiZSBsb3N0LiAgVXNpbmcgdGhlIFVTQl9QRVJTSVNUIGZhY2lsaXR5LCB0aGUgZGV2aWNlIGNhbiBiZQogICogbWFkZSB0byBhcHBlYXIgYXMgaWYgaXQgaGFkIG5vdCBkaXNjb25uZWN0ZWQuCiAgKgotICogVGhpcyBmYWNpbGl0eSBpcyBpbmhlcmVudGx5IGRhbmdlcm91cy4gIEFsdGhvdWdoIHVzYl9yZXNldF9kZXZpY2UoKQotICogbWFrZXMgZXZlcnkgZWZmb3J0IHRvIGluc3VyZSB0aGF0IHRoZSBzYW1lIGRldmljZSBpcyBwcmVzZW50IGFmdGVyIHRoZQorICogVGhpcyBmYWNpbGl0eSBjYW4gYmUgZGFuZ2Vyb3VzLiAgQWx0aG91Z2ggdXNiX3Jlc2V0X2RldmljZSgpIG1ha2VzCisgKiBldmVyeSBlZmZvcnQgdG8gaW5zdXJlIHRoYXQgdGhlIHNhbWUgZGV2aWNlIGlzIHByZXNlbnQgYWZ0ZXIgdGhlCiAgKiByZXNldCBhcyBiZWZvcmUsIGl0IGNhbm5vdCBwcm92aWRlIGEgMTAwJSBndWFyYW50ZWUuICBGdXJ0aGVybW9yZSBpdCdzCiAgKiBxdWl0ZSBwb3NzaWJsZSBmb3IgYSBkZXZpY2UgdG8gcmVtYWluIHVuYWx0ZXJlZCBidXQgaXRzIG1lZGlhIHRvIGJlCiAgKiBjaGFuZ2VkLiAgSWYgdGhlIHVzZXIgcmVwbGFjZXMgYSBmbGFzaCBtZW1vcnkgY2FyZCB3aGlsZSB0aGUgc3lzdGVtIGlzCkBAIC0xOTAyLDcgKzIwMDQsNyBAQAogCQlzdGF0dXMgPSBodWJfcG9ydF9zdGF0dXMoaHViLCBwb3J0MSwgJnBvcnRzdGF0dXMsICZwb3J0Y2hhbmdlKTsKIAogIFN1c3BlbmRDbGVhcmVkOgotCQlpZiAoVVNCX1BFUlNJU1QgJiYgdWRldi0+cmVzZXRfcmVzdW1lKQorCQlpZiAodWRldi0+cmVzZXRfcmVzdW1lKQogCQkJd2FudF9mbGFncyA9IFVTQl9QT1JUX1NUQVRfUE9XRVIKIAkJCQkJfCBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT047CiAJCWVsc2UKQEAgLTE5MjcsOCArMjAyOSw2IEBACiAJfQogCiAJY2xlYXJfYml0KHBvcnQxLCBodWItPmJ1c3lfYml0cyk7Ci0JaWYgKCFodWItPmhkZXYtPnBhcmVudCAmJiAhaHViLT5idXN5X2JpdHNbMF0pCi0JCXVzYl9lbmFibGVfcm9vdF9odWJfaXJxKGh1Yi0+aGRldi0+YnVzKTsKIAogCWlmIChzdGF0dXMgPT0gMCkKIAkJc3RhdHVzID0gZmluaXNoX3BvcnRfcmVzdW1lKHVkZXYpOwpAQCAtMjAwMCw3ICsyMTAwLDcgQEAKIAkJfQogCX0KIAotCWRldl9kYmcoJmludGYtPmRldiwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCWRldl9kYmcoJmludGYtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBzdG9wIGtodWJkIGFuZCByZWxhdGVkIGFjdGl2aXR5ICovCiAJaHViX3F1aWVzY2UoaHViKTsKQEAgLTIwMDksNDkgKzIxMDksMjAgQEAKIAogc3RhdGljIGludCBodWJfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewotCXN0cnVjdCB1c2JfaHViCQkqaHViID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7CisJc3RydWN0IHVzYl9odWIgKmh1YiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAKLQlkZXZfZGJnKCZpbnRmLT5kZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKLQotCS8qIHRlbGwga2h1YmQgdG8gbG9vayBmb3IgY2hhbmdlcyBvbiB0aGlzIGh1YiAqLwotCWh1Yl9hY3RpdmF0ZShodWIpOworCWRldl9kYmcoJmludGYtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJaHViX3Jlc3RhcnQoaHViLCBIVUJfUkVTVU1FKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBodWJfcmVzZXRfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewogCXN0cnVjdCB1c2JfaHViICpodWIgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwotCXN0cnVjdCB1c2JfZGV2aWNlICpoZGV2ID0gaHViLT5oZGV2OwotCWludCBwb3J0MTsKIAorCWRldl9kYmcoJmludGYtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAJaHViX3Bvd2VyX29uKGh1Yik7Ci0KLQlmb3IgKHBvcnQxID0gMTsgcG9ydDEgPD0gaGRldi0+bWF4Y2hpbGQ7ICsrcG9ydDEpIHsKLQkJc3RydWN0IHVzYl9kZXZpY2UgKmNoaWxkID0gaGRldi0+Y2hpbGRyZW5bcG9ydDEtMV07Ci0KLQkJaWYgKGNoaWxkKSB7Ci0KLQkJCS8qIEZvciAiVVNCX1BFUlNJU1QiLWVuYWJsZWQgY2hpbGRyZW4gd2UgbXVzdAotCQkJICogbWFyayB0aGUgY2hpbGQgZGV2aWNlIGZvciByZXNldC1yZXN1bWUgYW5kCi0JCQkgKiB0dXJuIG9mZiB0aGUgY29ubmVjdC1jaGFuZ2Ugc3RhdHVzIHRvIHByZXZlbnQKLQkJCSAqIGtodWJkIGZyb20gZGlzY29ubmVjdGluZyBpdCBsYXRlci4KLQkJCSAqLwotCQkJaWYgKFVTQl9QRVJTSVNUICYmIGNoaWxkLT5wZXJzaXN0X2VuYWJsZWQpIHsKLQkJCQljaGlsZC0+cmVzZXRfcmVzdW1lID0gMTsKLQkJCQljbGVhcl9wb3J0X2ZlYXR1cmUoaGRldiwgcG9ydDEsCi0JCQkJCQlVU0JfUE9SVF9GRUFUX0NfQ09OTkVDVElPTik7Ci0KLQkJCS8qIE90aGVyd2lzZSB3ZSBtdXN0IGRpc2Nvbm5lY3QgdGhlIGNoaWxkLAotCQkJICogYnV0IGFzIHdlIG1heSBub3QgbG9jayB0aGUgY2hpbGQgZGV2aWNlIGhlcmUKLQkJCSAqIHdlIGhhdmUgdG8gZG8gYSAibG9naWNhbCIgZGlzY29ubmVjdC4KLQkJCSAqLwotCQkJfSBlbHNlIHsKLQkJCQlodWJfcG9ydF9sb2dpY2FsX2Rpc2Nvbm5lY3QoaHViLCBwb3J0MSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlodWJfYWN0aXZhdGUoaHViKTsKKwlodWJfcmVzdGFydChodWIsIEhVQl9SRVNFVF9SRVNVTUUpOwogCXJldHVybiAwOwogfQogCkBAIC0yMDYxLDEwICsyMTMyLDEwIEBACiAgKgogICogVGhlIFVTQiBob3N0IGNvbnRyb2xsZXIgZHJpdmVyIGNhbGxzIHRoaXMgZnVuY3Rpb24gd2hlbiBpdHMgcm9vdCBodWIKICAqIGlzIHJlc3VtZWQgYW5kIFZidXMgcG93ZXIgaGFzIGJlZW4gaW50ZXJydXB0ZWQgb3IgdGhlIGNvbnRyb2xsZXIKLSAqIGhhcyBiZWVuIHJlc2V0LiAgVGhlIHJvdXRpbmUgbWFya3MgQHJoZGV2IGFzIGhhdmluZyBsb3N0IHBvd2VyLiAgV2hlbgotICogdGhlIGh1YiBkcml2ZXIgaXMgcmVzdW1lZCBpdCB3aWxsIHRha2Ugbm90aWNlOyBpZiBDT05GSUdfVVNCX1BFUlNJU1QKLSAqIGlzIGVuYWJsZWQgdGhlbiBpdCB3aWxsIGNhcnJ5IG91dCBwb3dlci1zZXNzaW9uIHJlY292ZXJ5LCBvdGhlcndpc2UKLSAqIGl0IHdpbGwgZGlzY29ubmVjdCBhbGwgdGhlIGNoaWxkIGRldmljZXMuCisgKiBoYXMgYmVlbiByZXNldC4gIFRoZSByb3V0aW5lIG1hcmtzIEByaGRldiBhcyBoYXZpbmcgbG9zdCBwb3dlci4KKyAqIFdoZW4gdGhlIGh1YiBkcml2ZXIgaXMgcmVzdW1lZCBpdCB3aWxsIHRha2Ugbm90aWNlIGFuZCBjYXJyeSBvdXQKKyAqIHBvd2VyLXNlc3Npb24gcmVjb3ZlcnkgZm9yIGFsbCB0aGUgIlVTQi1QRVJTSVNUIi1lbmFibGVkIGNoaWxkIGRldmljZXM7CisgKiB0aGUgb3RoZXJzIHdpbGwgYmUgZGlzY29ubmVjdGVkLgogICovCiB2b2lkIHVzYl9yb290X2h1Yl9sb3N0X3Bvd2VyKHN0cnVjdCB1c2JfZGV2aWNlICpyaGRldikKIHsKQEAgLTIxNDcsMTIgKzIyMTgsMTMgQEAKIAlyZXR1cm4gcG9ydHN0YXR1czsKIH0KIAotc3RhdGljIHZvaWQgZXAwX3JlaW5pdChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK3ZvaWQgdXNiX2VwMF9yZWluaXQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCiB7CiAJdXNiX2Rpc2FibGVfZW5kcG9pbnQodWRldiwgMCArIFVTQl9ESVJfSU4pOwogCXVzYl9kaXNhYmxlX2VuZHBvaW50KHVkZXYsIDAgKyBVU0JfRElSX09VVCk7CiAJdXNiX2VuYWJsZV9lbmRwb2ludCh1ZGV2LCAmdWRldi0+ZXAwKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9lcDBfcmVpbml0KTsKIAogI2RlZmluZSB1c2Jfc25kYWRkcjBwaXBlKCkJKFBJUEVfQ09OVFJPTCA8PCAzMCkKICNkZWZpbmUgdXNiX3JjdmFkZHIwcGlwZSgpCSgoUElQRV9DT05UUk9MIDw8IDMwKSB8IFVTQl9ESVJfSU4pCkBAIC0yMTcxLDkgKzIyNDMsMTAgQEAKIAkJVVNCX1JFUV9TRVRfQUREUkVTUywgMCwgZGV2bnVtLCAwLAogCQlOVUxMLCAwLCBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CiAJaWYgKHJldHZhbCA9PSAwKSB7Ci0JCXVkZXYtPmRldm51bSA9IGRldm51bTsJLyogRGV2aWNlIG5vdyB1c2luZyBwcm9wZXIgYWRkcmVzcyAqLworCQkvKiBEZXZpY2Ugbm93IHVzaW5nIHByb3BlciBhZGRyZXNzLiAqLworCQl1cGRhdGVfYWRkcmVzcyh1ZGV2LCBkZXZudW0pOwogCQl1c2Jfc2V0X2RldmljZV9zdGF0ZSh1ZGV2LCBVU0JfU1RBVEVfQUREUkVTUyk7Ci0JCWVwMF9yZWluaXQodWRldik7CisJCXVzYl9lcDBfcmVpbml0KHVkZXYpOwogCX0KIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtMjM1NSwyNiArMjQyOCwzMyBAQAogI3VuZGVmIEdFVF9ERVNDUklQVE9SX0JVRlNJWkUKIAkJfQogCi0JCWZvciAoaiA9IDA7IGogPCBTRVRfQUREUkVTU19UUklFUzsgKytqKSB7Ci0JCQlyZXR2YWwgPSBodWJfc2V0X2FkZHJlc3ModWRldiwgZGV2bnVtKTsKLQkJCWlmIChyZXR2YWwgPj0gMCkKKyAJCS8qCisgCQkgKiBJZiBkZXZpY2UgaXMgV1VTQiwgd2UgYWxyZWFkeSBhc3NpZ25lZCBhbgorIAkJICogdW5hdXRob3JpemVkIGFkZHJlc3MgaW4gdGhlIENvbm5lY3QgQWNrIHNlcXVlbmNlOworIAkJICogYXV0aG9yaXphdGlvbiB3aWxsIGFzc2lnbiB0aGUgZmluYWwgYWRkcmVzcy4KKyAJCSAqLworIAkJaWYgKHVkZXYtPnd1c2IgPT0gMCkgeworCQkJZm9yIChqID0gMDsgaiA8IFNFVF9BRERSRVNTX1RSSUVTOyArK2opIHsKKwkJCQlyZXR2YWwgPSBodWJfc2V0X2FkZHJlc3ModWRldiwgZGV2bnVtKTsKKwkJCQlpZiAocmV0dmFsID49IDApCisJCQkJCWJyZWFrOworCQkJCW1zbGVlcCgyMDApOworCQkJfQorCQkJaWYgKHJldHZhbCA8IDApIHsKKwkJCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsCisJCQkJCSJkZXZpY2Ugbm90IGFjY2VwdGluZyBhZGRyZXNzICVkLCBlcnJvciAlZFxuIiwKKwkJCQkJZGV2bnVtLCByZXR2YWwpOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKworCQkJLyogY29wZSB3aXRoIGhhcmR3YXJlIHF1aXJraW5lc3M6CisJCQkgKiAgLSBsZXQgU0VUX0FERFJFU1Mgc2V0dGxlLCBzb21lIGRldmljZSBoYXJkd2FyZSB3YW50cyBpdAorCQkJICogIC0gcmVhZCBlcDAgbWF4cGFja2V0IGV2ZW4gZm9yIGhpZ2ggYW5kIGxvdyBzcGVlZCwKKwkJCSAqLworCQkJbXNsZWVwKDEwKTsKKwkJCWlmIChVU0VfTkVXX1NDSEVNRShyZXRyeV9jb3VudGVyKSkKIAkJCQlicmVhazsKLQkJCW1zbGVlcCgyMDApOwotCQl9Ci0JCWlmIChyZXR2YWwgPCAwKSB7Ci0JCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsCi0JCQkJImRldmljZSBub3QgYWNjZXB0aW5nIGFkZHJlc3MgJWQsIGVycm9yICVkXG4iLAotCQkJCWRldm51bSwgcmV0dmFsKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotIAotCQkvKiBjb3BlIHdpdGggaGFyZHdhcmUgcXVpcmtpbmVzczoKLQkJICogIC0gbGV0IFNFVF9BRERSRVNTIHNldHRsZSwgc29tZSBkZXZpY2UgaGFyZHdhcmUgd2FudHMgaXQKLQkJICogIC0gcmVhZCBlcDAgbWF4cGFja2V0IGV2ZW4gZm9yIGhpZ2ggYW5kIGxvdyBzcGVlZCwKLSAgCQkgKi8KLQkJbXNsZWVwKDEwKTsKLQkJaWYgKFVTRV9ORVdfU0NIRU1FKHJldHJ5X2NvdW50ZXIpKQotCQkJYnJlYWs7CisgIAkJfQogCiAJCXJldHZhbCA9IHVzYl9nZXRfZGV2aWNlX2Rlc2NyaXB0b3IodWRldiwgOCk7CiAJCWlmIChyZXR2YWwgPCA4KSB7CkBAIC0yMzkxLDcgKzI0NzEsNyBAQAogCWlmIChyZXR2YWwpCiAJCWdvdG8gZmFpbDsKIAotCWkgPSB1ZGV2LT5kZXNjcmlwdG9yLmJNYXhQYWNrZXRTaXplMCA9PSAweGZmPworCWkgPSB1ZGV2LT5kZXNjcmlwdG9yLmJNYXhQYWNrZXRTaXplMCA9PSAweGZmPwkvKiB3dXNiIGRldmljZT8gKi8KIAkgICAgNTEyIDogdWRldi0+ZGVzY3JpcHRvci5iTWF4UGFja2V0U2l6ZTA7CiAJaWYgKGxlMTZfdG9fY3B1KHVkZXYtPmVwMC5kZXNjLndNYXhQYWNrZXRTaXplKSAhPSBpKSB7CiAJCWlmICh1ZGV2LT5zcGVlZCAhPSBVU0JfU1BFRURfRlVMTCB8fApAQCAtMjQwMiw3ICsyNDgyLDcgQEAKIAkJfQogCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJlcDAgbWF4cGFja2V0ID0gJWRcbiIsIGkpOwogCQl1ZGV2LT5lcDAuZGVzYy53TWF4UGFja2V0U2l6ZSA9IGNwdV90b19sZTE2KGkpOwotCQllcDBfcmVpbml0KHVkZXYpOworCQl1c2JfZXAwX3JlaW5pdCh1ZGV2KTsKIAl9CiAgIAogCXJldHZhbCA9IHVzYl9nZXRfZGV2aWNlX2Rlc2NyaXB0b3IodWRldiwgVVNCX0RUX0RFVklDRV9TSVpFKTsKQEAgLTI0MTksNyArMjQ5OSw3IEBACiBmYWlsOgogCWlmIChyZXR2YWwpIHsKIAkJaHViX3BvcnRfZGlzYWJsZShodWIsIHBvcnQxLCAwKTsKLQkJdWRldi0+ZGV2bnVtID0gZGV2bnVtOwkvKiBmb3IgZGlzY29ubmVjdCBwcm9jZXNzaW5nICovCisJCXVwZGF0ZV9hZGRyZXNzKHVkZXYsIGRldm51bSk7CS8qIGZvciBkaXNjb25uZWN0IHByb2Nlc3NpbmcgKi8KIAl9CiAJbXV0ZXhfdW5sb2NrKCZ1c2JfYWRkcmVzczBfbXV0ZXgpOwogCXJldHVybiByZXR2YWw7CkBAIC0yNTY4LDYgKzI2NDgsNyBAQAogCQl1ZGV2LT5zcGVlZCA9IFVTQl9TUEVFRF9VTktOT1dOOwogIAkJdWRldi0+YnVzX21BID0gaHViLT5tQV9wZXJfcG9ydDsKIAkJdWRldi0+bGV2ZWwgPSBoZGV2LT5sZXZlbCArIDE7CisJCXVkZXYtPnd1c2IgPSBodWJfaXNfd3VzYihodWIpOwogCiAJCS8qIHNldCB0aGUgYWRkcmVzcyAqLwogCQljaG9vc2VfYWRkcmVzcyh1ZGV2KTsKQEAgLTI2NTcsMTIgKzI3MzgsMTMgQEAKIGxvb3BfZGlzYWJsZToKIAkJaHViX3BvcnRfZGlzYWJsZShodWIsIHBvcnQxLCAxKTsKIGxvb3A6Ci0JCWVwMF9yZWluaXQodWRldik7CisJCXVzYl9lcDBfcmVpbml0KHVkZXYpOwogCQlyZWxlYXNlX2FkZHJlc3ModWRldik7CiAJCXVzYl9wdXRfZGV2KHVkZXYpOwogCQlpZiAoKHN0YXR1cyA9PSAtRU5PVENPTk4pIHx8IChzdGF0dXMgPT0gLUVOT1RTVVBQKSkKIAkJCWJyZWFrOwogCX0KKwlkZXZfZXJyKGh1Yl9kZXYsICJ1bmFibGUgdG8gZW51bWVyYXRlIFVTQiBkZXZpY2Ugb24gcG9ydCAlZFxuIiwgcG9ydDEpOwogIAogZG9uZToKIAlodWJfcG9ydF9kaXNhYmxlKGh1YiwgcG9ydDEsIDEpOwpAQCAtMjcyNiw3ICsyODA4LDcgQEAKIAkJLyogSWYgdGhlIGh1YiBoYXMgZGllZCwgY2xlYW4gdXAgYWZ0ZXIgaXQgKi8KIAkJaWYgKGhkZXYtPnN0YXRlID09IFVTQl9TVEFURV9OT1RBVFRBQ0hFRCkgewogCQkJaHViLT5lcnJvciA9IC1FTk9ERVY7Ci0JCQlodWJfcHJlX3Jlc2V0KGludGYpOworCQkJaHViX3N0b3AoaHViKTsKIAkJCWdvdG8gbG9vcDsKIAkJfQogCkBAIC0yODcyLDExICsyOTU0LDYgQEAKIAogCQlodWItPmFjdGl2YXRpbmcgPSAwOwogCi0JCS8qIElmIHRoaXMgaXMgYSByb290IGh1YiwgdGVsbCB0aGUgSENEIGl0J3Mgb2theSB0bwotCQkgKiByZS1lbmFibGUgcG9ydC1jaGFuZ2UgaW50ZXJydXB0cyBub3cuICovCi0JCWlmICghaGRldi0+cGFyZW50ICYmICFodWItPmJ1c3lfYml0c1swXSkKLQkJCXVzYl9lbmFibGVfcm9vdF9odWJfaXJxKGhkZXYtPmJ1cyk7Ci0KIGxvb3BfYXV0b3BtOgogCQkvKiBBbGxvdyBhdXRvc3VzcGVuZCBpZiB3ZSdyZSBub3QgZ29pbmcgdG8gcnVuIGFnYWluICovCiAJCWlmIChsaXN0X2VtcHR5KCZodWItPmV2ZW50X2xpc3QpKQpAQCAtMjg5MCw3ICsyOTY3LDEzIEBACiAKIHN0YXRpYyBpbnQgaHViX3RocmVhZCh2b2lkICpfX3VudXNlZCkKIHsKKwkvKiBraHViZCBuZWVkcyB0byBiZSBmcmVlemFibGUgdG8gYXZvaWQgaW50ZWZlcmluZyB3aXRoIFVTQi1QRVJTSVNUCisJICogcG9ydCBoYW5kb3Zlci4gIE90aGVyd2lzZSBpdCBtaWdodCBzZWUgdGhhdCBhIGZ1bGwtc3BlZWQgZGV2aWNlCisJICogd2FzIGdvbmUgYmVmb3JlIHRoZSBFSENJIGNvbnRyb2xsZXIgaGFkIGhhbmRlZCBpdHMgcG9ydCBvdmVyIHRvCisJICogdGhlIGNvbXBhbmlvbiBmdWxsLXNwZWVkIGNvbnRyb2xsZXIuCisJICovCiAJc2V0X2ZyZWV6YWJsZSgpOworCiAJZG8gewogCQlodWJfZXZlbnRzKCk7CiAJCXdhaXRfZXZlbnRfZnJlZXphYmxlKGtodWJkX3dhaXQsCkBAIC0yOTU5LDE2ICszMDQyLDM2IEBACiAJdXNiX2RlcmVnaXN0ZXIoJmh1Yl9kcml2ZXIpOwogfSAvKiB1c2JfaHViX2NsZWFudXAoKSAqLwogCi1zdGF0aWMgaW50IGNvbmZpZ19kZXNjcmlwdG9yc19jaGFuZ2VkKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQorc3RhdGljIGludCBkZXNjcmlwdG9yc19jaGFuZ2VkKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAorCQlzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yICpvbGRfZGV2aWNlX2Rlc2NyaXB0b3IpCiB7Ci0JdW5zaWduZWQJCQlpbmRleDsKLQl1bnNpZ25lZAkJCWxlbiA9IDA7Ci0Jc3RydWN0IHVzYl9jb25maWdfZGVzY3JpcHRvcgkqYnVmOworCWludAkJY2hhbmdlZCA9IDA7CisJdW5zaWduZWQJaW5kZXg7CisJdW5zaWduZWQJc2VyaWFsX2xlbiA9IDA7CisJdW5zaWduZWQJbGVuOworCXVuc2lnbmVkCW9sZF9sZW5ndGg7CisJaW50CQlsZW5ndGg7CisJY2hhcgkJKmJ1ZjsKIAorCWlmIChtZW1jbXAoJnVkZXYtPmRlc2NyaXB0b3IsIG9sZF9kZXZpY2VfZGVzY3JpcHRvciwKKwkJCXNpemVvZigqb2xkX2RldmljZV9kZXNjcmlwdG9yKSkgIT0gMCkKKwkJcmV0dXJuIDE7CisKKwkvKiBTaW5jZSB0aGUgaWRWZW5kb3IsIGlkUHJvZHVjdCwgYW5kIGJjZERldmljZSB2YWx1ZXMgaW4gdGhlCisJICogZGV2aWNlIGRlc2NyaXB0b3IgaGF2ZW4ndCBjaGFuZ2VkLCB3ZSB3aWxsIGFzc3VtZSB0aGUKKwkgKiBNYW51ZmFjdHVyZXIgYW5kIFByb2R1Y3Qgc3RyaW5ncyBoYXZlbid0IGNoYW5nZWQgZWl0aGVyLgorCSAqIEJ1dCB0aGUgU2VyaWFsTnVtYmVyIHN0cmluZyBjb3VsZCBiZSBkaWZmZXJlbnQgKGUuZy4sIGEKKwkgKiBkaWZmZXJlbnQgZmxhc2ggY2FyZCBvZiB0aGUgc2FtZSBicmFuZCkuCisJICovCisJaWYgKHVkZXYtPnNlcmlhbCkKKwkJc2VyaWFsX2xlbiA9IHN0cmxlbih1ZGV2LT5zZXJpYWwpICsgMTsKKworCWxlbiA9IHNlcmlhbF9sZW47CiAJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdWRldi0+ZGVzY3JpcHRvci5iTnVtQ29uZmlndXJhdGlvbnM7IGluZGV4KyspIHsKLQkJaWYgKGxlbiA8IGxlMTZfdG9fY3B1KHVkZXYtPmNvbmZpZ1tpbmRleF0uZGVzYy53VG90YWxMZW5ndGgpKQotCQkJbGVuID0gbGUxNl90b19jcHUodWRldi0+Y29uZmlnW2luZGV4XS5kZXNjLndUb3RhbExlbmd0aCk7CisJCW9sZF9sZW5ndGggPSBsZTE2X3RvX2NwdSh1ZGV2LT5jb25maWdbaW5kZXhdLmRlc2Mud1RvdGFsTGVuZ3RoKTsKKwkJbGVuID0gbWF4KGxlbiwgb2xkX2xlbmd0aCk7CiAJfQorCiAJYnVmID0ga21hbGxvYyhsZW4sIEdGUF9OT0lPKTsKIAlpZiAoYnVmID09IE5VTEwpIHsKIAkJZGV2X2VycigmdWRldi0+ZGV2LCAibm8gbWVtIHRvIHJlLXJlYWQgY29uZmlncyBhZnRlciByZXNldFxuIik7CkBAIC0yOTc2LDI1ICszMDc5LDQxIEBACiAJCXJldHVybiAxOwogCX0KIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB1ZGV2LT5kZXNjcmlwdG9yLmJOdW1Db25maWd1cmF0aW9uczsgaW5kZXgrKykgewotCQlpbnQgbGVuZ3RoOwotCQlpbnQgb2xkX2xlbmd0aCA9IGxlMTZfdG9fY3B1KHVkZXYtPmNvbmZpZ1tpbmRleF0uZGVzYy53VG90YWxMZW5ndGgpOwotCisJCW9sZF9sZW5ndGggPSBsZTE2X3RvX2NwdSh1ZGV2LT5jb25maWdbaW5kZXhdLmRlc2Mud1RvdGFsTGVuZ3RoKTsKIAkJbGVuZ3RoID0gdXNiX2dldF9kZXNjcmlwdG9yKHVkZXYsIFVTQl9EVF9DT05GSUcsIGluZGV4LCBidWYsCiAJCQkJb2xkX2xlbmd0aCk7Ci0JCWlmIChsZW5ndGggPCBvbGRfbGVuZ3RoKSB7CisJCWlmIChsZW5ndGggIT0gb2xkX2xlbmd0aCkgewogCQkJZGV2X2RiZygmdWRldi0+ZGV2LCAiY29uZmlnIGluZGV4ICVkLCBlcnJvciAlZFxuIiwKIAkJCQkJaW5kZXgsIGxlbmd0aCk7CisJCQljaGFuZ2VkID0gMTsKIAkJCWJyZWFrOwogCQl9CiAJCWlmIChtZW1jbXAgKGJ1ZiwgdWRldi0+cmF3ZGVzY3JpcHRvcnNbaW5kZXhdLCBvbGRfbGVuZ3RoKQogCQkJCSE9IDApIHsKIAkJCWRldl9kYmcoJnVkZXYtPmRldiwgImNvbmZpZyBpbmRleCAlZCBjaGFuZ2VkICgjJWQpXG4iLAotCQkJCWluZGV4LCBidWYtPmJDb25maWd1cmF0aW9uVmFsdWUpOworCQkJCWluZGV4LAorCQkJCSgoc3RydWN0IHVzYl9jb25maWdfZGVzY3JpcHRvciAqKSBidWYpLT4KKwkJCQkJYkNvbmZpZ3VyYXRpb25WYWx1ZSk7CisJCQljaGFuZ2VkID0gMTsKIAkJCWJyZWFrOwogCQl9CiAJfQorCisJaWYgKCFjaGFuZ2VkICYmIHNlcmlhbF9sZW4pIHsKKwkJbGVuZ3RoID0gdXNiX3N0cmluZyh1ZGV2LCB1ZGV2LT5kZXNjcmlwdG9yLmlTZXJpYWxOdW1iZXIsCisJCQkJYnVmLCBzZXJpYWxfbGVuKTsKKwkJaWYgKGxlbmd0aCArIDEgIT0gc2VyaWFsX2xlbikgeworCQkJZGV2X2RiZygmdWRldi0+ZGV2LCAic2VyaWFsIHN0cmluZyBlcnJvciAlZFxuIiwKKwkJCQkJbGVuZ3RoKTsKKwkJCWNoYW5nZWQgPSAxOworCQl9IGVsc2UgaWYgKG1lbWNtcChidWYsIHVkZXYtPnNlcmlhbCwgbGVuZ3RoKSAhPSAwKSB7CisJCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJzZXJpYWwgc3RyaW5nIGNoYW5nZWRcbiIpOworCQkJY2hhbmdlZCA9IDE7CisJCX0KKwl9CisKIAlrZnJlZShidWYpOwotCXJldHVybiBpbmRleCAhPSB1ZGV2LT5kZXNjcmlwdG9yLmJOdW1Db25maWd1cmF0aW9uczsKKwlyZXR1cm4gY2hhbmdlZDsKIH0KIAogLyoqCkBAIC0zMDQ0LDcgKzMxNjMsNyBAQAogCiAJaWYgKCFwYXJlbnRfaGRldikgewogCQkvKiB0aGlzIHJlcXVpcmVzIGhjZC1zcGVjaWZpYyBsb2dpYzsgc2VlIE9IQ0kgaGNfcmVzdGFydCgpICovCi0JCWRldl9kYmcoJnVkZXYtPmRldiwgIiVzIGZvciByb290IGh1YiFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRldl9kYmcoJnVkZXYtPmRldiwgIiVzIGZvciByb290IGh1YiFcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSVNESVI7CiAJfQogCXBhcmVudF9odWIgPSBoZGV2X3RvX2h1YihwYXJlbnRfaGRldik7CkBAIC0zMDU0LDIxICszMTczLDE4IEBACiAKIAkJLyogZXAwIG1heHBhY2tldCBzaXplIG1heSBjaGFuZ2U7IGxldCB0aGUgSENEIGtub3cgYWJvdXQgaXQuCiAJCSAqIE90aGVyIGVuZHBvaW50cyB3aWxsIGJlIGhhbmRsZWQgYnkgcmUtZW51bWVyYXRpb24uICovCi0JCWVwMF9yZWluaXQodWRldik7CisJCXVzYl9lcDBfcmVpbml0KHVkZXYpOwogCQlyZXQgPSBodWJfcG9ydF9pbml0KHBhcmVudF9odWIsIHVkZXYsIHBvcnQxLCBpKTsKIAkJaWYgKHJldCA+PSAwIHx8IHJldCA9PSAtRU5PVENPTk4gfHwgcmV0ID09IC1FTk9ERVYpCiAJCQlicmVhazsKIAl9CiAJY2xlYXJfYml0KHBvcnQxLCBwYXJlbnRfaHViLT5idXN5X2JpdHMpOwotCWlmICghcGFyZW50X2hkZXYtPnBhcmVudCAmJiAhcGFyZW50X2h1Yi0+YnVzeV9iaXRzWzBdKQotCQl1c2JfZW5hYmxlX3Jvb3RfaHViX2lycShwYXJlbnRfaGRldi0+YnVzKTsKIAogCWlmIChyZXQgPCAwKQogCQlnb3RvIHJlX2VudW1lcmF0ZTsKICAKIAkvKiBEZXZpY2UgbWlnaHQgaGF2ZSBjaGFuZ2VkIGZpcm13YXJlIChERlUgb3Igc2ltaWxhcikgKi8KLQlpZiAobWVtY21wKCZ1ZGV2LT5kZXNjcmlwdG9yLCAmZGVzY3JpcHRvciwgc2l6ZW9mIGRlc2NyaXB0b3IpCi0JCQl8fCBjb25maWdfZGVzY3JpcHRvcnNfY2hhbmdlZCAodWRldikpIHsKKwlpZiAoZGVzY3JpcHRvcnNfY2hhbmdlZCh1ZGV2LCAmZGVzY3JpcHRvcikpIHsKIAkJZGV2X2luZm8oJnVkZXYtPmRldiwgImRldmljZSBmaXJtd2FyZSBjaGFuZ2VkXG4iKTsKIAkJdWRldi0+ZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7CS8qIGZvciBkaXNjb25uZWN0KCkgY2FsbHMgKi8KIAkJZ290byByZV9lbnVtZXJhdGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5oIGIvZHJpdmVycy91c2IvY29yZS9odWIuaAppbmRleCAxNTUxYWVkLi4yYTExNmNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5oCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaHViLmgKQEAgLTQxLDkgKzQxLDEwIEBACiAgKi8KICNkZWZpbmUgVVNCX1BPUlRfRkVBVF9DT05ORUNUSU9OCTAKICNkZWZpbmUgVVNCX1BPUlRfRkVBVF9FTkFCTEUJCTEKLSNkZWZpbmUgVVNCX1BPUlRfRkVBVF9TVVNQRU5ECQkyCisjZGVmaW5lIFVTQl9QT1JUX0ZFQVRfU1VTUEVORAkJMgkvKiBMMiBzdXNwZW5kICovCiAjZGVmaW5lIFVTQl9QT1JUX0ZFQVRfT1ZFUl9DVVJSRU5UCTMKICNkZWZpbmUgVVNCX1BPUlRfRkVBVF9SRVNFVAkJNAorI2RlZmluZSBVU0JfUE9SVF9GRUFUX0wxCQk1CS8qIEwxIHN1c3BlbmQgKi8KICNkZWZpbmUgVVNCX1BPUlRfRkVBVF9QT1dFUgkJOAogI2RlZmluZSBVU0JfUE9SVF9GRUFUX0xPV1NQRUVECQk5CiAjZGVmaW5lIFVTQl9QT1JUX0ZFQVRfSElHSFNQRUVECQkxMApAQCAtNTQsNiArNTUsNyBAQAogI2RlZmluZSBVU0JfUE9SVF9GRUFUX0NfUkVTRVQJCTIwCiAjZGVmaW5lIFVTQl9QT1JUX0ZFQVRfVEVTVCAgICAgICAgICAgICAgMjEKICNkZWZpbmUgVVNCX1BPUlRfRkVBVF9JTkRJQ0FUT1IgICAgICAgICAyMgorI2RlZmluZSBVU0JfUE9SVF9GRUFUX0NfUE9SVF9MMSAgICAgICAgIDIzCiAKIC8qCiAgKiBIdWIgU3RhdHVzIGFuZCBIdWIgQ2hhbmdlIHJlc3VsdHMKQEAgLTczLDcgKzc1LDggQEAKICNkZWZpbmUgVVNCX1BPUlRfU1RBVF9TVVNQRU5ECQkweDAwMDQKICNkZWZpbmUgVVNCX1BPUlRfU1RBVF9PVkVSQ1VSUkVOVAkweDAwMDgKICNkZWZpbmUgVVNCX1BPUlRfU1RBVF9SRVNFVAkJMHgwMDEwCi0vKiBiaXRzIDUgdG8gNyBhcmUgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgVVNCX1BPUlRfU1RBVF9MMQkJMHgwMDIwCisvKiBiaXRzIDYgdG8gNyBhcmUgcmVzZXJ2ZWQgKi8KICNkZWZpbmUgVVNCX1BPUlRfU1RBVF9QT1dFUgkJMHgwMTAwCiAjZGVmaW5lIFVTQl9QT1JUX1NUQVRfTE9XX1NQRUVECQkweDAyMDAKICNkZWZpbmUgVVNCX1BPUlRfU1RBVF9ISUdIX1NQRUVEICAgICAgICAweDA0MDAKQEAgLTkxLDYgKzk0LDcgQEAKICNkZWZpbmUgVVNCX1BPUlRfU1RBVF9DX1NVU1BFTkQJCTB4MDAwNAogI2RlZmluZSBVU0JfUE9SVF9TVEFUX0NfT1ZFUkNVUlJFTlQJMHgwMDA4CiAjZGVmaW5lIFVTQl9QT1JUX1NUQVRfQ19SRVNFVAkJMHgwMDEwCisjZGVmaW5lIFVTQl9QT1JUX1NUQVRfQ19MMQkJMHgwMDIwCiAKIC8qCiAgKiB3SHViQ2hhcmFjdGVyaXN0aWNzIChtYXNrcykKQEAgLTE5MSw1ICsxOTUsNiBAQAogfTsKIAogZXh0ZXJuIHZvaWQgdXNiX2h1Yl90dF9jbGVhcl9idWZmZXIoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgaW50IHBpcGUpOworZXh0ZXJuIHZvaWQgdXNiX2VwMF9yZWluaXQoc3RydWN0IHVzYl9kZXZpY2UgKik7CiAKICNlbmRpZiAvKiBfX0xJTlVYX0hVQl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2lub2RlLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2lub2RlLmMKaW5kZXggODNhMzczZS4uODYwNzg0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9pbm9kZS5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaW5vZGUuYwpAQCAtNDYzLDEzICs0NjMsMTMgQEAKIAlpbm9kZSA9IHVzYmZzX2dldF9pbm9kZShzYiwgU19JRkRJUiB8IDA3NTUsIDApOwogCiAJaWYgKCFpbm9kZSkgewotCQlkYmcoIiVzOiBjb3VsZCBub3QgZ2V0IGlub2RlISIsX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlczogY291bGQgbm90IGdldCBpbm9kZSEiLF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJcm9vdCA9IGRfYWxsb2Nfcm9vdChpbm9kZSk7CiAJaWYgKCFyb290KSB7Ci0JCWRiZygiJXM6IGNvdWxkIG5vdCBnZXQgcm9vdCBkZW50cnkhIixfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzOiBjb3VsZCBub3QgZ2V0IHJvb3QgZGVudHJ5ISIsX19mdW5jX18pOwogCQlpcHV0KGlub2RlKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMgYi9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYwppbmRleCBjMzExZjY3Li5lODE5ZTUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYwpAQCAtMzEyLDcgKzMxMiw3IEBACiAJCQkJICAgIHJldHZhbCAhPSAtRUJVU1kpCiAJCQkJCWRldl9lcnIoJmlvLT5kZXYtPmRldiwKIAkJCQkJCSIlcywgdW5saW5rIC0tPiAlZFxuIiwKLQkJCQkJCV9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwkJCQkJCV9fZnVuY19fLCByZXR2YWwpOwogCQkJfSBlbHNlIGlmICh1cmIgPT0gaW8tPnVyYnMgW2ldKQogCQkJCWZvdW5kID0gMTsKIAkJfQpAQCAtNTUwLDcgKzU1MCw3IEBACiAJCQlpby0+dXJic1tpXS0+ZGV2ID0gTlVMTDsKIAkJCWlvLT51cmJzW2ldLT5zdGF0dXMgPSByZXR2YWw7CiAJCQlkZXZfZGJnKCZpby0+ZGV2LT5kZXYsICIlcywgc3VibWl0IC0tPiAlZFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCQkJX19mdW5jX18sIHJldHZhbCk7CiAJCQl1c2Jfc2dfY2FuY2VsKGlvKTsKIAkJfQogCQlzcGluX2xvY2tfaXJxKCZpby0+bG9jayk7CkBAIC02MDAsNyArNjAwLDcgQEAKIAkJCXJldHZhbCA9IHVzYl91bmxpbmtfdXJiKGlvLT51cmJzIFtpXSk7CiAJCQlpZiAocmV0dmFsICE9IC1FSU5QUk9HUkVTUyAmJiByZXR2YWwgIT0gLUVCVVNZKQogCQkJCWRldl93YXJuKCZpby0+ZGV2LT5kZXYsICIlcywgdW5saW5rIC0tPiAlZFxuIiwKLQkJCQkJX19GVU5DVElPTl9fLCByZXR2YWwpOworCQkJCQlfX2Z1bmNfXywgcmV0dmFsKTsKIAkJfQogCQlzcGluX2xvY2soJmlvLT5sb2NrKTsKIAl9CkBAIC03ODQsNyArNzg0LDcgQEAKIAlpZiAoc2l6ZSA8PSAwIHx8ICFidWYgfHwgIWluZGV4KQogCQlyZXR1cm4gLUVJTlZBTDsKIAlidWZbMF0gPSAwOwotCXRidWYgPSBrbWFsbG9jKDI1NiwgR0ZQX0tFUk5FTCk7CisJdGJ1ZiA9IGttYWxsb2MoMjU2LCBHRlBfTk9JTyk7CiAJaWYgKCF0YnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTA2OCw3ICsxMDY4LDcgQEAKIHsKIAlpbnQgaTsKIAotCWRldl9kYmcoJmRldi0+ZGV2LCAiJXMgbnVraW5nICVzIFVSQnNcbiIsIF9fRlVOQ1RJT05fXywKKwlkZXZfZGJnKCZkZXYtPmRldiwgIiVzIG51a2luZyAlcyBVUkJzXG4iLCBfX2Z1bmNfXywKIAkJc2tpcF9lcDAgPyAibm9uLWVwMCIgOiAiYWxsIik7CiAJZm9yIChpID0gc2tpcF9lcDA7IGkgPCAxNjsgKytpKSB7CiAJCXVzYl9kaXNhYmxlX2VuZHBvaW50KGRldiwgaSk7CkBAIC0xMDg5LDggKzEwODksOCBAQAogCQkJCWNvbnRpbnVlOwogCQkJZGV2X2RiZygmZGV2LT5kZXYsICJ1bnJlZ2lzdGVyaW5nIGludGVyZmFjZSAlc1xuIiwKIAkJCQlpbnRlcmZhY2UtPmRldi5idXNfaWQpOwotCQkJdXNiX3JlbW92ZV9zeXNmc19pbnRmX2ZpbGVzKGludGVyZmFjZSk7CiAJCQlkZXZpY2VfZGVsKCZpbnRlcmZhY2UtPmRldik7CisJCQl1c2JfcmVtb3ZlX3N5c2ZzX2ludGZfZmlsZXMoaW50ZXJmYWNlKTsKIAkJfQogCiAJCS8qIE5vdyB0aGF0IHRoZSBpbnRlcmZhY2VzIGFyZSB1bmJvdW5kLCBub2JvZHkgc2hvdWxkCkBAIC0xMjMxLDcgKzEyMzEsNyBAQAogCSAqLwogCiAJLyogcHJldmVudCBzdWJtaXNzaW9ucyB1c2luZyBwcmV2aW91cyBlbmRwb2ludCBzZXR0aW5ncyAqLwotCWlmIChpZmFjZS0+Y3VyX2FsdHNldHRpbmcgIT0gYWx0ICYmIGRldmljZV9pc19yZWdpc3RlcmVkKCZpZmFjZS0+ZGV2KSkKKwlpZiAoaWZhY2UtPmN1cl9hbHRzZXR0aW5nICE9IGFsdCkKIAkJdXNiX3JlbW92ZV9zeXNmc19pbnRmX2ZpbGVzKGlmYWNlKTsKIAl1c2JfZGlzYWJsZV9pbnRlcmZhY2UoZGV2LCBpZmFjZSk7CiAKQEAgLTEzMzAsOCArMTMzMCw3IEBACiAJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gY29uZmlnLT5pbnRlcmZhY2VbaV07CiAJCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdDsKIAotCQlpZiAoZGV2aWNlX2lzX3JlZ2lzdGVyZWQoJmludGYtPmRldikpCi0JCQl1c2JfcmVtb3ZlX3N5c2ZzX2ludGZfZmlsZXMoaW50Zik7CisJCXVzYl9yZW1vdmVfc3lzZnNfaW50Zl9maWxlcyhpbnRmKTsKIAkJYWx0ID0gdXNiX2FsdG51bV90b19hbHRzZXR0aW5nKGludGYsIDApOwogCiAJCS8qIE5vIGFsdHNldHRpbmcgMD8gIFdlJ2xsIGFzc3VtZSB0aGUgZmlyc3QgYWx0c2V0dGluZy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvcXVpcmtzLmMgYi9kcml2ZXJzL3VzYi9jb3JlL3F1aXJrcy5jCmluZGV4IGRmYzU0MTguLjJlMjAxOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvcXVpcmtzLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9xdWlya3MuYwpAQCAtOTcsNCArOTcsMTggQEAKIAlpZiAodWRldi0+ZGVzY3JpcHRvci5iRGV2aWNlQ2xhc3MgIT0gVVNCX0NMQVNTX0hVQikKIAkJdWRldi0+YXV0b3N1c3BlbmRfZGlzYWJsZWQgPSAxOwogI2VuZGlmCisKKwkvKiBGb3IgdGhlIHByZXNlbnQsIGFsbCBkZXZpY2VzIGRlZmF1bHQgdG8gVVNCLVBFUlNJU1QgZW5hYmxlZCAqLworI2lmIDAJCS8qIHdhczogI2lmZGVmIENPTkZJR19QTSAqLworCS8qIEh1YnMgYXJlIGF1dG9tYXRpY2FsbHkgZW5hYmxlZCBmb3IgVVNCLVBFUlNJU1QgKi8KKwlpZiAodWRldi0+ZGVzY3JpcHRvci5iRGV2aWNlQ2xhc3MgPT0gVVNCX0NMQVNTX0hVQikKKwkJdWRldi0+cGVyc2lzdF9lbmFibGVkID0gMTsKKworI2Vsc2UKKwkvKiBJbiB0aGUgYWJzZW5jZSBvZiBQTSwgd2UgY2FuIHNhZmVseSBlbmFibGUgVVNCLVBFUlNJU1QKKwkgKiBmb3IgYWxsIGRldmljZXMuICBJdCB3aWxsIGFmZmVjdCB0aGluZ3MgbGlrZSBodWIgcmVzZXRzCisJICogYW5kIEVNRi1yZWxhdGVkIHBvcnQgZGlzYWJsZXMuCisJICovCisJdWRldi0+cGVyc2lzdF9lbmFibGVkID0gMTsKKyNlbmRpZgkvKiBDT05GSUdfUE0gKi8KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvc3lzZnMuYyBiL2RyaXZlcnMvdXNiL2NvcmUvc3lzZnMuYwppbmRleCBhMzdjY2JkLi41YjIwYTYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL3N5c2ZzLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9zeXNmcy5jCkBAIC0xODAsMTEgKzE4MCw5IEBACiBzdGF0aWMgREVWSUNFX0FUVFIodXJibnVtLCBTX0lSVUdPLCBzaG93X3VyYm51bSwgTlVMTCk7CiAKIAotI2lmIGRlZmluZWQoQ09ORklHX1VTQl9QRVJTSVNUKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfU1VTUEVORCkKLXN0YXRpYyBjb25zdCBjaGFyIHBvd2VyX2dyb3VwW10gPSAicG93ZXIiOwotI2VuZGlmCisjaWZkZWYJQ09ORklHX1BNCiAKLSNpZmRlZglDT05GSUdfVVNCX1BFUlNJU1QKK3N0YXRpYyBjb25zdCBjaGFyIHBvd2VyX2dyb3VwW10gPSAicG93ZXIiOwogCiBzdGF0aWMgc3NpemVfdAogc2hvd19wZXJzaXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKQEAgLTIyMiwxMiArMjIwLDEzIEBACiAJaWYgKGlzX3VzYl9kZXZpY2UoZGV2KSkgewogCQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHRvX3VzYl9kZXZpY2UoZGV2KTsKIAotCQkvKiBIdWJzIGFyZSBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgZm9yIFVTQl9QRVJTSVNUICovCi0JCWlmICh1ZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VDbGFzcyA9PSBVU0JfQ0xBU1NfSFVCKQotCQkJdWRldi0+cGVyc2lzdF9lbmFibGVkID0gMTsKLQkJcmMgPSBzeXNmc19hZGRfZmlsZV90b19ncm91cCgmZGV2LT5rb2JqLAotCQkJCSZkZXZfYXR0cl9wZXJzaXN0LmF0dHIsCi0JCQkJcG93ZXJfZ3JvdXApOworCQkvKiBIdWJzIGFyZSBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgZm9yIFVTQl9QRVJTSVNULAorCQkgKiBubyBwb2ludCBpbiBjcmVhdGluZyB0aGUgYXR0cmlidXRlIGZpbGUuCisJCSAqLworCQlpZiAodWRldi0+ZGVzY3JpcHRvci5iRGV2aWNlQ2xhc3MgIT0gVVNCX0NMQVNTX0hVQikKKwkJCXJjID0gc3lzZnNfYWRkX2ZpbGVfdG9fZ3JvdXAoJmRldi0+a29iaiwKKwkJCQkJJmRldl9hdHRyX3BlcnNpc3QuYXR0ciwKKwkJCQkJcG93ZXJfZ3JvdXApOwogCX0KIAlyZXR1cm4gcmM7CiB9CkBAIC0yMzgsMTMgKzIzNywxMiBAQAogCQkJJmRldl9hdHRyX3BlcnNpc3QuYXR0ciwKIAkJCXBvd2VyX2dyb3VwKTsKIH0KLQogI2Vsc2UKIAogI2RlZmluZSBhZGRfcGVyc2lzdF9hdHRyaWJ1dGVzKGRldikJMAogI2RlZmluZSByZW1vdmVfcGVyc2lzdF9hdHRyaWJ1dGVzKGRldikJZG8ge30gd2hpbGUgKDApCiAKLSNlbmRpZgkvKiBDT05GSUdfVVNCX1BFUlNJU1QgKi8KKyNlbmRpZgkvKiBDT05GSUdfUE0gKi8KIAogI2lmZGVmCUNPTkZJR19VU0JfU1VTUEVORAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3VyYi5jIGIvZHJpdmVycy91c2IvY29yZS91cmIuYwppbmRleCA5ZDdlNjMyLi5jMGIxYWUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL3VyYi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvdXJiLmMKQEAgLTMzNCw3ICszMzQsNyBAQAogCQlkZXZfZGJnKCZkZXYtPmRldiwKIAkJCSJib2d1cyBlbmRwb2ludCBlcCVkJXMgaW4gJXMgKGJhZCBtYXhwYWNrZXQgJWQpXG4iLAogCQkJdXNiX2VuZHBvaW50X251bSgmZXAtPmRlc2MpLCBpc19vdXQgPyAib3V0IiA6ICJpbiIsCi0JCQlfX0ZVTkNUSU9OX18sIG1heCk7CisJCQlfX2Z1bmNfXywgbWF4KTsKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAl9CiAKQEAgLTU5MCw2ICs1OTAsMzAgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9raWxsX2FuY2hvcmVkX3VyYnMpOwogCiAvKioKKyAqIHVzYl91bmxpbmtfYW5jaG9yZWRfdXJicyAtIGFzeW5jaHJvbm91c2x5IGNhbmNlbCB0cmFuc2ZlciByZXF1ZXN0cyBlbiBtYXNzZQorICogQGFuY2hvcjogYW5jaG9yIHRoZSByZXF1ZXN0cyBhcmUgYm91bmQgdG8KKyAqCisgKiB0aGlzIGFsbG93cyBhbGwgb3V0c3RhbmRpbmcgVVJCcyB0byBiZSB1bmxpbmtlZCBzdGFydGluZworICogZnJvbSB0aGUgYmFjayBvZiB0aGUgcXVldWUuIFRoaXMgZnVuY3Rpb24gaXMgYXN5bmNocm9ub3VzLgorICogVGhlIHVubGlua2luZyBpcyBqdXN0IHRpZ2dlcmVkLiBJdCBtYXkgaGFwcGVuIGFmdGVyIHRoaXMKKyAqIGZ1bmN0aW9uIGhhcyByZXR1cm5lZC4KKyAqLwordm9pZCB1c2JfdW5saW5rX2FuY2hvcmVkX3VyYnMoc3RydWN0IHVzYl9hbmNob3IgKmFuY2hvcikKK3sKKwlzdHJ1Y3QgdXJiICp2aWN0aW07CisKKwlzcGluX2xvY2tfaXJxKCZhbmNob3ItPmxvY2spOworCXdoaWxlICghbGlzdF9lbXB0eSgmYW5jaG9yLT51cmJfbGlzdCkpIHsKKwkJdmljdGltID0gbGlzdF9lbnRyeShhbmNob3ItPnVyYl9saXN0LnByZXYsIHN0cnVjdCB1cmIsCisJCQkJICAgIGFuY2hvcl9saXN0KTsKKwkJLyogdGhpcyB3aWxsIHVuYW5jaG9yIHRoZSBVUkIgKi8KKwkJdXNiX3VubGlua191cmIodmljdGltKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZhbmNob3ItPmxvY2spOworfQorRVhQT1JUX1NZTUJPTF9HUEwodXNiX3VubGlua19hbmNob3JlZF91cmJzKTsKKworLyoqCiAgKiB1c2Jfd2FpdF9hbmNob3JfZW1wdHlfdGltZW91dCAtIHdhaXQgZm9yIGFuIGFuY2hvciB0byBiZSB1bnVzZWQKICAqIEBhbmNob3I6IHRoZSBhbmNob3IgeW91IHdhbnQgdG8gYmVjb21lIHVudXNlZAogICogQHRpbWVvdXQ6IGhvdyBsb25nIHlvdSBhcmUgd2lsbGluZyB0byB3YWl0IGluIG1pbGxpc2Vjb25kcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS91c2IuaCBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmgKaW5kZXggMjM3NTE5NC4uMWJmOGNjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS91c2IuaAorKysgYi9kcml2ZXJzL3VzYi9jb3JlL3VzYi5oCkBAIC0xMTQsMTMgKzExNCwxMSBAQAogc3RhdGljIGlubGluZSB2b2lkIG1hcmtfYWN0aXZlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICpmKQogewogCWYtPmlzX2FjdGl2ZSA9IDE7Ci0JZi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID0gUE1fRVZFTlRfT047CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXJrX3F1aWVzY2VkKHN0cnVjdCB1c2JfaW50ZXJmYWNlICpmKQogewogCWYtPmlzX2FjdGl2ZSA9IDA7Ci0JZi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID0gUE1fRVZFTlRfU1VTUEVORDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgaXNfYWN0aXZlKGNvbnN0IHN0cnVjdCB1c2JfaW50ZXJmYWNlICpmKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcgYi9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZwppbmRleCBkNjgxYmIyLi5mN2I1NDY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZwpAQCAtNDQsOCArNDQsOCBAQAogaWYgVVNCX0dBREdFVAogCiBjb25maWcgVVNCX0dBREdFVF9ERUJVRwotCWJvb2xlYW4gIkRlYnVnZ2luZyBtZXNzYWdlcyIKLQlkZXBlbmRzIG9uIFVTQl9HQURHRVQgJiYgREVCVUdfS0VSTkVMICYmIEVYUEVSSU1FTlRBTAorCWJvb2xlYW4gIkRlYnVnZ2luZyBtZXNzYWdlcyAoREVWRUxPUE1FTlQpIgorCWRlcGVuZHMgb24gVVNCX0dBREdFVCAmJiBERUJVR19LRVJORUwKIAloZWxwCiAJICAgTWFueSBjb250cm9sbGVyIGFuZCBnYWRnZXQgZHJpdmVycyB3aWxsIHByaW50IHNvbWUgZGVidWdnaW5nCiAJICAgbWVzc2FnZXMgaWYgeW91IHVzZSB0aGlzIG9wdGlvbiB0byBhc2sgZm9yIHRob3NlIG1lc3NhZ2VzLgpAQCAtNTgsNyArNTgsNyBAQAogCSAgIHByb2R1Y3Rpb24gYnVpbGQuCiAKIGNvbmZpZyBVU0JfR0FER0VUX0RFQlVHX0ZJTEVTCi0JYm9vbGVhbiAiRGVidWdnaW5nIGluZm9ybWF0aW9uIGZpbGVzIgorCWJvb2xlYW4gIkRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmaWxlcyAoREVWRUxPUE1FTlQpIgogCWRlcGVuZHMgb24gVVNCX0dBREdFVCAmJiBQUk9DX0ZTCiAJaGVscAogCSAgIFNvbWUgb2YgdGhlIGRyaXZlcnMgaW4gdGhlICJnYWRnZXQiIGZyYW1ld29yayBjYW4gZXhwb3NlCkBAIC02OSw3ICs2OSw3IEBACiAJICAgaGVyZS4gIElmIGluIGRvdWJ0LCBvciB0byBjb25zZXJ2ZSBrZXJuZWwgbWVtb3J5LCBzYXkgIk4iLgogCiBjb25maWcgVVNCX0dBREdFVF9ERUJVR19GUwotCWJvb2xlYW4gIkRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmaWxlcyBpbiBkZWJ1Z2ZzIgorCWJvb2xlYW4gIkRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmaWxlcyBpbiBkZWJ1Z2ZzIChERVZFTE9QTUVOVCkiCiAJZGVwZW5kcyBvbiBVU0JfR0FER0VUICYmIERFQlVHX0ZTCiAJaGVscAogCSAgIFNvbWUgb2YgdGhlIGRyaXZlcnMgaW4gdGhlICJnYWRnZXQiIGZyYW1ld29yayBjYW4gZXhwb3NlCkBAIC0zMzcsNyArMzM3LDcgQEAKIAogY29uZmlnIFVTQl9HQURHRVRfRFVNTVlfSENECiAJYm9vbGVhbiAiRHVtbXkgSENEIChERVZFTE9QTUVOVCkiCi0JZGVwZW5kcyBvbiAoVVNCPXkgfHwgKFVTQj1tICYmIFVTQl9HQURHRVQ9bSkpICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gVVNCPXkgfHwgKFVTQj1tICYmIFVTQl9HQURHRVQ9bSkKIAlzZWxlY3QgVVNCX0dBREdFVF9EVUFMU1BFRUQKIAloZWxwCiAJICBUaGlzIGhvc3QgY29udHJvbGxlciBkcml2ZXIgZW11bGF0ZXMgVVNCLCBsb29waW5nIGFsbCBkYXRhIHRyYW5zZmVyCkBAIC00MDQsNyArNDA0LDYgQEAKIAogY29uZmlnIFVTQl9aRVJPCiAJdHJpc3RhdGUgIkdhZGdldCBaZXJvIChERVZFTE9QTUVOVCkiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAloZWxwCiAJICBHYWRnZXQgWmVybyBpcyBhIHR3by1jb25maWd1cmF0aW9uIGRldmljZS4gIEl0IGVpdGhlciBzaW5rcyBhbmQKIAkgIHNvdXJjZXMgYnVsayBkYXRhOyBvciBpdCBsb29wcyBiYWNrIGEgY29uZmlndXJhYmxlIG51bWJlciBvZgpAQCAtNDY4LDggKzQ2Nyw4IEBACiAJICBkeW5hbWljYWxseSBsaW5rZWQgbW9kdWxlIGNhbGxlZCAiZ19ldGhlciIuCiAKIGNvbmZpZyBVU0JfRVRIX1JORElTCi0JYm9vbCAiUk5ESVMgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIFVTQl9FVEggJiYgRVhQRVJJTUVOVEFMCisJYm9vbCAiUk5ESVMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQl9FVEgKIAlkZWZhdWx0IHkKIAloZWxwCiAJICAgTWljcm9zb2Z0IFdpbmRvd3MgWFAgYnVuZGxlcyB0aGUgIlJlbW90ZSBORElTIiAoUk5ESVMpIHByb3RvY29sLApAQCAtNDk1LDYgKzQ5NCw5IEBACiAJICBBbGwgZW5kcG9pbnRzLCB0cmFuc2ZlciBzcGVlZHMsIGFuZCB0cmFuc2ZlciB0eXBlcyBzdXBwb3J0ZWQgYnkKIAkgIHRoZSBoYXJkd2FyZSBhcmUgYXZhaWxhYmxlLCB0aHJvdWdoIHJlYWQoKSBhbmQgd3JpdGUoKSBjYWxscy4KIAorCSAgQ3VycmVudGx5LCB0aGlzIG9wdGlvbiBpcyBzdGlsbCBsYWJlbGxlZCBhcyBFWFBFUklNRU5UQUwgYmVjYXVzZQorCSAgb2YgZXhpc3RpbmcgcmFjZSBjb25kaXRpb25zIGluIHRoZSB1bmRlcmx5aW5nIGluLWtlcm5lbCBBSU8gY29yZS4KKwogCSAgU2F5ICJ5IiB0byBsaW5rIHRoZSBkcml2ZXIgc3RhdGljYWxseSwgb3IgIm0iIHRvIGJ1aWxkIGEKIAkgIGR5bmFtaWNhbGx5IGxpbmtlZCBtb2R1bGUgY2FsbGVkICJnYWRnZXRmcyIuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9hbWQ1NTM2dWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvYW1kNTUzNnVkYy5jCmluZGV4IGI2NjNmMjMuLmZjNmYzNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9hbWQ1NTM2dWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2FtZDU1MzZ1ZGMuYwpAQCAtMzI0OCw2ICszMjQ4LDggQEAKIAogCS8qIHBjaSBzZXR1cCAqLwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSA8IDApIHsKKwkJa2ZyZWUoZGV2KTsKKwkJZGV2ID0gMDsKIAkJcmV0dmFsID0gLUVOT0RFVjsKIAkJZ290byBmaW5pc2hlZDsKIAl9CkBAIC0zMjU5LDYgKzMyNjEsOCBAQAogCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzb3VyY2UsIGxlbiwgbmFtZSkpIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAicGNpIGRldmljZSB1c2VkIGFscmVhZHlcbiIpOworCQlrZnJlZShkZXYpOworCQlkZXYgPSAwOwogCQlyZXR2YWwgPSAtRUJVU1k7CiAJCWdvdG8gZmluaXNoZWQ7CiAJfQpAQCAtMzI2NywxOCArMzI3MSwyNCBAQAogCWRldi0+dmlydF9hZGRyID0gaW9yZW1hcF9ub2NhY2hlKHJlc291cmNlLCBsZW4pOwogCWlmIChkZXYtPnZpcnRfYWRkciA9PSBOVUxMKSB7CiAJCWRldl9kYmcoJnBkZXYtPmRldiwgInN0YXJ0IGFkZHJlc3MgY2Fubm90IGJlIG1hcHBlZFxuIik7CisJCWtmcmVlKGRldik7CisJCWRldiA9IDA7CiAJCXJldHZhbCA9IC1FRkFVTFQ7CiAJCWdvdG8gZmluaXNoZWQ7CiAJfQogCiAJaWYgKCFwZGV2LT5pcnEpIHsKIAkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJpcnEgbm90IHNldFxuIik7CisJCWtmcmVlKGRldik7CisJCWRldiA9IDA7CiAJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gZmluaXNoZWQ7CiAJfQogCiAJaWYgKHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgdWRjX2lycSwgSVJRRl9TSEFSRUQsIG5hbWUsIGRldikgIT0gMCkgewogCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgInJlcXVlc3RfaXJxKCVkKSBmYWlsXG4iLCBwZGV2LT5pcnEpOworCQlrZnJlZShkZXYpOworCQlkZXYgPSAwOwogCQlyZXR2YWwgPSAtRUJVU1k7CiAJCWdvdG8gZmluaXNoZWQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2F0OTFfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvYXQ5MV91ZGMuYwppbmRleCBmZDE1Y2VkLi45YjkxM2FmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvYXQ5MV91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvYXQ5MV91ZGMuYwpAQCAtMzg5LDYgKzM4OSw3IEBACiAJdTMyCQljc3IgPSBfX3Jhd19yZWFkbChjcmVnKTsKIAl1OCBfX2lvbWVtCSpkcmVnID0gZXAtPmNyZWcgKyAoQVQ5MV9VRFBfRkRSKDApIC0gQVQ5MV9VRFBfQ1NSKDApKTsKIAl1bnNpZ25lZAl0b3RhbCwgY291bnQsIGlzX2xhc3Q7CisJdTgJCSpidWY7CiAKIAkvKgogCSAqIFRPRE86IGFsbG93IGZvciB3cml0aW5nIHR3byBwYWNrZXRzIHRvIHRoZSBmaWZvIC4uLiB0aGF0J2xsCkBAIC00MTMsNiArNDE0LDggQEAKIAkJCXJldHVybiAwOwogCX0KIAorCWJ1ZiA9IHJlcS0+cmVxLmJ1ZiArIHJlcS0+cmVxLmFjdHVhbDsKKwlwcmVmZXRjaChidWYpOwogCXRvdGFsID0gcmVxLT5yZXEubGVuZ3RoIC0gcmVxLT5yZXEuYWN0dWFsOwogCWlmIChlcC0+ZXAubWF4cGFja2V0IDwgdG90YWwpIHsKIAkJY291bnQgPSBlcC0+ZXAubWF4cGFja2V0OwpAQCAtNDM1LDcgKzQzOCw3IEBACiAJICogcmVjb3ZlciB3aGVuIHRoZSBhY3R1YWwgYnl0ZWNvdW50IG1hdHRlcnMgKGUuZy4gZm9yIFVTQiBUZXN0CiAJICogYW5kIE1lYXN1cmVtZW50IENsYXNzIGRldmljZXMpLgogCSAqLwotCV9fcmF3X3dyaXRlc2IoZHJlZywgcmVxLT5yZXEuYnVmICsgcmVxLT5yZXEuYWN0dWFsLCBjb3VudCk7CisJX19yYXdfd3JpdGVzYihkcmVnLCBidWYsIGNvdW50KTsKIAljc3IgJj0gflNFVF9GWDsKIAljc3IgfD0gQ0xSX0ZYIHwgQVQ5MV9VRFBfVFhQS1RSRFk7CiAJX19yYXdfd3JpdGVsKGNzciwgY3JlZyk7CkBAIC00NTcsNyArNDYwLDcgQEAKIAlpZiAobGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSkKIAkJcmV0dXJuOwogCi0JVkRCRygiJXMgJXNcbiIsIF9fRlVOQ1RJT05fXywgZXAtPmVwLm5hbWUpOworCVZEQkcoIiVzICVzXG4iLCBfX2Z1bmNfXywgZXAtPmVwLm5hbWUpOwogCXdoaWxlICghbGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSkgewogCQlyZXEgPSBsaXN0X2VudHJ5KGVwLT5xdWV1ZS5uZXh0LCBzdHJ1Y3QgYXQ5MV9yZXF1ZXN0LCBxdWV1ZSk7CiAJCWRvbmUoZXAsIHJlcSwgc3RhdHVzKTsKQEAgLTc5Miw3ICs3OTUsNyBAQAogCWludAkJc3RhdHVzID0gLUVJTlZBTDsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCi0JREJHKCIlc1xuIiwgX19GVU5DVElPTl9fICk7CisJREJHKCIlc1xuIiwgX19mdW5jX18gKTsKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKIAlpZiAoIXVkYy0+Y2xvY2tlZCB8fCAhdWRjLT5zdXNwZW5kZWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZHVtbXlfaGNkLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZHVtbXlfaGNkLmMKaW5kZXggY2JlNDQ1My4uNjYyOTMxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2R1bW15X2hjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9kdW1teV9oY2QuYwpAQCAtMzY1LDE2ICszNjUsMTQgQEAKIAkJY2FzZSBVU0JfU1BFRURfSElHSDoKIAkJCWlmIChtYXggPT0gNTEyKQogCQkJCWJyZWFrOwotCQkJLyogY29uc2VydmUgcmV0dXJuIHN0YXRlbWVudHMgKi8KLQkJZGVmYXVsdDoKLQkJCXN3aXRjaCAobWF4KSB7Ci0JCQljYXNlIDg6IGNhc2UgMTY6IGNhc2UgMzI6IGNhc2UgNjQ6CisJCQlnb3RvIGRvbmU7CisJCWNhc2UgVVNCX1NQRUVEX0ZVTEw6CisJCQlpZiAobWF4ID09IDggfHwgbWF4ID09IDE2IHx8IG1heCA9PSAzMiB8fCBtYXggPT0gNjQpCiAJCQkJLyogd2UnbGwgZmFrZSBhbnkgbGVnYWwgc2l6ZSAqLwogCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJY2FzZSBVU0JfU1BFRURfTE9XOgotCQkJCWdvdG8gZG9uZTsKLQkJCX0KKwkJCS8qIHNhdmUgYSByZXR1cm4gc3RhdGVtZW50ICovCisJCWRlZmF1bHQ6CisJCQlnb3RvIGRvbmU7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQ6CkBAIC04OTQsMTMgKzg5MiwxMiBAQAogewogCXN0cnVjdCBkdW1teQkqZHVtID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQlkZXZfZGJnICgmcGRldi0+ZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJZGV2X2RiZyAoJnBkZXYtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAJc3Bpbl9sb2NrX2lycSAoJmR1bS0+bG9jayk7CiAJZHVtLT51ZGNfc3VzcGVuZGVkID0gMTsKIAlzZXRfbGlua19zdGF0ZSAoZHVtKTsKIAlzcGluX3VubG9ja19pcnEgKCZkdW0tPmxvY2spOwogCi0JcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gc3RhdGU7CiAJdXNiX2hjZF9wb2xsX3JoX3N0YXR1cyAoZHVtbXlfdG9faGNkIChkdW0pKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTkwOSwxMyArOTA2LDEyIEBACiB7CiAJc3RydWN0IGR1bW15CSpkdW0gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCWRldl9kYmcgKCZwZGV2LT5kZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlkZXZfZGJnICgmcGRldi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAlzcGluX2xvY2tfaXJxICgmZHVtLT5sb2NrKTsKIAlkdW0tPnVkY19zdXNwZW5kZWQgPSAwOwogCXNldF9saW5rX3N0YXRlIChkdW0pOwogCXNwaW5fdW5sb2NrX2lycSAoJmR1bS0+bG9jayk7CiAKLQlwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOwogCXVzYl9oY2RfcG9sbF9yaF9zdGF0dXMgKGR1bW15X3RvX2hjZCAoZHVtKSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNzExLDcgKzE3MDcsNyBAQAogewogCXN0cnVjdCBkdW1teSAqZHVtID0gaGNkX3RvX2R1bW15IChoY2QpOwogCi0JZGV2X2RiZyAoJmhjZC0+c2VsZi5yb290X2h1Yi0+ZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJZGV2X2RiZyAoJmhjZC0+c2VsZi5yb290X2h1Yi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAogCXNwaW5fbG9ja19pcnEgKCZkdW0tPmxvY2spOwogCWR1bS0+cmhfc3RhdGUgPSBEVU1NWV9SSF9TVVNQRU5ERUQ7CkBAIC0xNzI2LDcgKzE3MjIsNyBAQAogCXN0cnVjdCBkdW1teSAqZHVtID0gaGNkX3RvX2R1bW15IChoY2QpOwogCWludCByYyA9IDA7CiAKLQlkZXZfZGJnICgmaGNkLT5zZWxmLnJvb3RfaHViLT5kZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlkZXZfZGJnICgmaGNkLT5zZWxmLnJvb3RfaHViLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCiAJc3Bpbl9sb2NrX2lycSAoJmR1bS0+bG9jayk7CiAJaWYgKCF0ZXN0X2JpdChIQ0RfRkxBR19IV19BQ0NFU1NJQkxFLCAmaGNkLT5mbGFncykpIHsKQEAgLTE5MDAsNyArMTg5Niw3IEBACiAJc3RydWN0IGR1bW15CQkqZHVtOwogCWludAkJCXJjID0gMDsKIAotCWRldl9kYmcgKCZwZGV2LT5kZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlkZXZfZGJnICgmcGRldi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAogCWhjZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhIChwZGV2KTsKIAlkdW0gPSBoY2RfdG9fZHVtbXkgKGhjZCk7CkBAIC0xOTE2LDcgKzE5MTIsNyBAQAogewogCXN0cnVjdCB1c2JfaGNkCQkqaGNkOwogCi0JZGV2X2RiZyAoJnBkZXYtPmRldiwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCWRldl9kYmcgKCZwZGV2LT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCiAJaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEgKHBkZXYpOwogCXNldF9iaXQoSENEX0ZMQUdfSFdfQUNDRVNTSUJMRSwgJmhjZC0+ZmxhZ3MpOwpAQCAtMTkzNyw2OSArMTkzMyw1NyBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0vKiBUaGVzZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGJlY2F1c2UgdGhlIHBkZXYgc3RydWN0dXJlcyBhcmUKLSAqIHN0YXRpY2FsbHkgYWxsb2NhdGVkLiAqLwotc3RhdGljIHZvaWQKLWR1bW15X3VkY19yZWxlYXNlIChzdHJ1Y3QgZGV2aWNlICpkZXYpIHt9Ci0KLXN0YXRpYyB2b2lkCi1kdW1teV9oY2RfcmVsZWFzZSAoc3RydWN0IGRldmljZSAqZGV2KSB7fQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZQkJdGhlX3VkY19wZGV2ID0gewotCS5uYW1lCQk9IChjaGFyICopIGdhZGdldF9uYW1lLAotCS5pZAkJPSAtMSwKLQkuZGV2CQk9IHsKLQkJLnJlbGVhc2UJPSBkdW1teV91ZGNfcmVsZWFzZSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJCXRoZV9oY2RfcGRldiA9IHsKLQkubmFtZQkJPSAoY2hhciAqKSBkcml2ZXJfbmFtZSwKLQkuaWQJCT0gLTEsCi0JLmRldgkJPSB7Ci0JCS5yZWxlYXNlCT0gZHVtbXlfaGNkX3JlbGVhc2UsCi0JfSwKLX07CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqdGhlX3VkY19wZGV2Oworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnRoZV9oY2RfcGRldjsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdCAodm9pZCkKIHsKLQlpbnQJcmV0dmFsOworCWludAlyZXR2YWwgPSAtRU5PTUVNOwogCiAJaWYgKHVzYl9kaXNhYmxlZCAoKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlyZXR2YWwgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIgKCZkdW1teV9oY2RfZHJpdmVyKTsKLQlpZiAocmV0dmFsIDwgMCkKKwl0aGVfaGNkX3BkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoZHJpdmVyX25hbWUsIC0xKTsKKwlpZiAoIXRoZV9oY2RfcGRldikKIAkJcmV0dXJuIHJldHZhbDsKKwl0aGVfdWRjX3BkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoZ2FkZ2V0X25hbWUsIC0xKTsKKwlpZiAoIXRoZV91ZGNfcGRldikKKwkJZ290byBlcnJfYWxsb2NfdWRjOwogCi0JcmV0dmFsID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyICgmZHVtbXlfdWRjX2RyaXZlcik7CisJcmV0dmFsID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZkdW1teV9oY2RfZHJpdmVyKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBlcnJfcmVnaXN0ZXJfaGNkX2RyaXZlcjsKKwlyZXR2YWwgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmR1bW15X3VkY19kcml2ZXIpOwogCWlmIChyZXR2YWwgPCAwKQogCQlnb3RvIGVycl9yZWdpc3Rlcl91ZGNfZHJpdmVyOwogCi0JcmV0dmFsID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyICgmdGhlX2hjZF9wZGV2KTsKKwlyZXR2YWwgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHRoZV9oY2RfcGRldik7CiAJaWYgKHJldHZhbCA8IDApCi0JCWdvdG8gZXJyX3JlZ2lzdGVyX2hjZDsKLQotCXJldHZhbCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlciAoJnRoZV91ZGNfcGRldik7CisJCWdvdG8gZXJyX2FkZF9oY2Q7CisJcmV0dmFsID0gcGxhdGZvcm1fZGV2aWNlX2FkZCh0aGVfdWRjX3BkZXYpOwogCWlmIChyZXR2YWwgPCAwKQotCQlnb3RvIGVycl9yZWdpc3Rlcl91ZGM7CisJCWdvdG8gZXJyX2FkZF91ZGM7CiAJcmV0dXJuIHJldHZhbDsKIAotZXJyX3JlZ2lzdGVyX3VkYzoKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlciAoJnRoZV9oY2RfcGRldik7Ci1lcnJfcmVnaXN0ZXJfaGNkOgotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyICgmZHVtbXlfdWRjX2RyaXZlcik7CitlcnJfYWRkX3VkYzoKKwlwbGF0Zm9ybV9kZXZpY2VfZGVsKHRoZV9oY2RfcGRldik7CitlcnJfYWRkX2hjZDoKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZHVtbXlfdWRjX2RyaXZlcik7CiBlcnJfcmVnaXN0ZXJfdWRjX2RyaXZlcjoKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlciAoJmR1bW15X2hjZF9kcml2ZXIpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZkdW1teV9oY2RfZHJpdmVyKTsKK2Vycl9yZWdpc3Rlcl9oY2RfZHJpdmVyOgorCXBsYXRmb3JtX2RldmljZV9wdXQodGhlX3VkY19wZGV2KTsKK2Vycl9hbGxvY191ZGM6CisJcGxhdGZvcm1fZGV2aWNlX3B1dCh0aGVfaGNkX3BkZXYpOwogCXJldHVybiByZXR2YWw7CiB9CiBtb2R1bGVfaW5pdCAoaW5pdCk7CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwICh2b2lkKQogewotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyICgmdGhlX3VkY19wZGV2KTsKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlciAoJnRoZV9oY2RfcGRldik7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIgKCZkdW1teV91ZGNfZHJpdmVyKTsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlciAoJmR1bW15X2hjZF9kcml2ZXIpOworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHRoZV91ZGNfcGRldik7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIodGhlX2hjZF9wZGV2KTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZHVtbXlfdWRjX2RyaXZlcik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmR1bW15X2hjZF9kcml2ZXIpOwogfQogbW9kdWxlX2V4aXQgKGNsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2VwYXV0b2NvbmYuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9lcGF1dG9jb25mLmMKaW5kZXggZjlkMDcxMC4uOGJkYWQyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2VwYXV0b2NvbmYuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZXBhdXRvY29uZi5jCkBAIC0zNCwxMiArMzQsMTIgQEAKIAogCiAvKiB3ZSBtdXN0IGFzc2lnbiBhZGRyZXNzZXMgZm9yIGNvbmZpZ3VyYWJsZSBlbmRwb2ludHMgKGxpa2UgbmV0MjI4MCkgKi8KLXN0YXRpYyBfX2RldmluaXRkYXRhIHVuc2lnbmVkIGVwbnVtOworc3RhdGljIF9faW5pdGRhdGEgdW5zaWduZWQgZXBudW07CiAKIC8vICNkZWZpbmUgTUFOWV9FTkRQT0lOVFMKICNpZmRlZiBNQU5ZX0VORFBPSU5UUwogLyogbW9yZSB0aGFuIDE1IGNvbmZpZ3VyYWJsZSBlbmRwb2ludHMgKi8KLXN0YXRpYyBfX2RldmluaXRkYXRhIHVuc2lnbmVkIGluX2VwbnVtOworc3RhdGljIF9faW5pdGRhdGEgdW5zaWduZWQgaW5fZXBudW07CiAjZW5kaWYKIAogCkBAIC01OSw3ICs1OSw3IEBACiAgKiBOT1RFOiAgZWFjaCBlbmRwb2ludCBpcyB1bmlkaXJlY3Rpb25hbCwgYXMgc3BlY2lmaWVkIGJ5IGl0cyBVU0IKICAqIGRlc2NyaXB0b3I7IGFuZCBpc24ndCBzcGVjaWZpYyB0byBhIGNvbmZpZ3VyYXRpb24gb3IgYWx0c2V0dGluZy4KICAqLwotc3RhdGljIGludCBfX2RldmluaXQKK3N0YXRpYyBpbnQgX19pbml0CiBlcF9tYXRjaGVzICgKIAlzdHJ1Y3QgdXNiX2dhZGdldAkJKmdhZGdldCwKIAlzdHJ1Y3QgdXNiX2VwCQkJKmVwLApAQCAtMTg2LDcgKzE4Niw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX2VwICogX19kZXZpbml0CitzdGF0aWMgc3RydWN0IHVzYl9lcCAqIF9faW5pdAogZmluZF9lcCAoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCwgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgdXNiX2VwCSplcDsKQEAgLTIyOCw3ICsyMjgsNyBAQAogICoKICAqIE9uIGZhaWx1cmUsIHRoaXMgcmV0dXJucyBhIG51bGwgZW5kcG9pbnQgZGVzY3JpcHRvci4KICAqLwotc3RydWN0IHVzYl9lcCAqIF9fZGV2aW5pdCB1c2JfZXBfYXV0b2NvbmZpZyAoCitzdHJ1Y3QgdXNiX2VwICogX19pbml0IHVzYl9lcF9hdXRvY29uZmlnICgKIAlzdHJ1Y3QgdXNiX2dhZGdldAkJKmdhZGdldCwKIAlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKmRlc2MKICkKQEAgLTI5NSw3ICsyOTUsNyBAQAogICogc3RhdGUgc3VjaCBhcyBlcC0+ZHJpdmVyX2RhdGEgYW5kIHRoZSByZWNvcmQgb2YgYXNzaWduZWQgZW5kcG9pbnRzCiAgKiB1c2VkIGJ5IHVzYl9lcF9hdXRvY29uZmlnKCkuCiAgKi8KLXZvaWQgX19kZXZpbml0IHVzYl9lcF9hdXRvY29uZmlnX3Jlc2V0IChzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0KQordm9pZCBfX2luaXQgdXNiX2VwX2F1dG9jb25maWdfcmVzZXQgKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQpCiB7CiAJc3RydWN0IHVzYl9lcAkqZXA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2V0aGVyLmMKaW5kZXggZTk5ODcyMy4uYmI5M2JkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2V0aGVyLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2V0aGVyLmMKQEAgLTExMDIsNyArMTEwMiw3IEBACiAJaWYgKGRldi0+Y29uZmlnID09IDApCiAJCXJldHVybjsKIAotCURFQlVHIChkZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlERUJVRyAoZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAogCW5ldGlmX3N0b3BfcXVldWUgKGRldi0+bmV0KTsKIAluZXRpZl9jYXJyaWVyX29mZiAoZGV2LT5uZXQpOwpAQCAtMTI2Myw3ICsxMjYzLDcgQEAKIAlzdHJ1Y3QgdXNiX2NkY19ub3RpZmljYXRpb24JKmV2ZW50OwogCWludAkJCQl2YWx1ZTsKIAotCURFQlVHIChkZXYsICIlcywgZmx1c2ggb2xkIHN0YXR1cyBmaXJzdFxuIiwgX19GVU5DVElPTl9fKTsKKwlERUJVRyAoZGV2LCAiJXMsIGZsdXNoIG9sZCBzdGF0dXMgZmlyc3RcbiIsIF9fZnVuY19fKTsKIAogCS8qIGZsdXNoIG9sZCBzdGF0dXMKIAkgKgpAQCAtMTMyOSw3ICsxMzI5LDcgQEAKIAlzcGluX2xvY2soJmRldi0+bG9jayk7CiAJc3RhdHVzID0gcm5kaXNfbXNnX3BhcnNlciAoZGV2LT5ybmRpc19jb25maWcsICh1OCAqKSByZXEtPmJ1Zik7CiAJaWYgKHN0YXR1cyA8IDApCi0JCUVSUk9SKGRldiwgIiVzOiBybmRpcyBwYXJzZSBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlFUlJPUihkZXYsICIlczogcm5kaXMgcGFyc2UgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCXNwaW5fdW5sb2NrKCZkZXYtPmxvY2spOwogfQogCkBAIC0yMTEzLDcgKzIxMTMsNyBAQAogCiBzdGF0aWMgdm9pZCBldGhfc3RhcnQgKHN0cnVjdCBldGhfZGV2ICpkZXYsIGdmcF90IGdmcF9mbGFncykKIHsKLQlERUJVRyAoZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJREVCVUcgKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBmaWxsIHRoZSByeCBxdWV1ZSAqLwogCXJ4X2ZpbGwgKGRldiwgZ2ZwX2ZsYWdzKTsKQEAgLTIxMzMsNyArMjEzMyw3IEBACiB7CiAJc3RydWN0IGV0aF9kZXYJCSpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOwogCi0JREVCVUcgKGRldiwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCURFQlVHIChkZXYsICIlc1xuIiwgX19mdW5jX18pOwogCWlmIChuZXRpZl9jYXJyaWVyX29rIChkZXYtPm5ldCkpCiAJCWV0aF9zdGFydCAoZGV2LCBHRlBfS0VSTkVMKTsKIAlyZXR1cm4gMDsKQEAgLTIxNDMsNyArMjE0Myw3IEBACiB7CiAJc3RydWN0IGV0aF9kZXYJCSpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOwogCi0JVkRFQlVHIChkZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlWREVCVUcgKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAJbmV0aWZfc3RvcF9xdWV1ZSAobmV0KTsKIAogCURFQlVHIChkZXYsICJzdG9wIHN0YXRzOiByeC90eCAlbGQvJWxkLCBlcnJzICVsZC8lbGRcbiIsCkBAIC0yMjI5LDcgKzIyMjksNyBAQAogCXNldF9nYWRnZXRfZGF0YSAoZ2FkZ2V0LCBOVUxMKTsKIH0KIAotc3RhdGljIHU4IF9fZGV2aW5pdCBuaWJibGUgKHVuc2lnbmVkIGNoYXIgYykKK3N0YXRpYyB1OCBfX2luaXQgbmliYmxlICh1bnNpZ25lZCBjaGFyIGMpCiB7CiAJaWYgKGxpa2VseSAoaXNkaWdpdCAoYykpKQogCQlyZXR1cm4gYyAtICcwJzsKQEAgLTIyMzksNyArMjIzOSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGdldF9ldGhlcl9hZGRyKGNvbnN0IGNoYXIgKnN0ciwgdTggKmRldl9hZGRyKQorc3RhdGljIGludCBfX2luaXQgZ2V0X2V0aGVyX2FkZHIoY29uc3QgY2hhciAqc3RyLCB1OCAqZGV2X2FkZHIpCiB7CiAJaWYgKHN0cikgewogCQl1bnNpZ25lZAlpOwpAQCAtMjI2MCw3ICsyMjYwLDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQKK3N0YXRpYyBpbnQgX19pbml0CiBldGhfYmluZCAoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCkKIHsKIAlzdHJ1Y3QgZXRoX2RldgkJKmRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYwppbmRleCAwMTdhMTk2Li5iZjNmOTQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jCkBAIC02NDQsNyArNjQ0LDcgQEAKIAogCXVuc2lnbmVkIGxvbmcJCWF0b21pY19iaXRmbGFnczsKICNkZWZpbmUgUkVHSVNURVJFRAkJMAotI2RlZmluZSBDTEVBUl9CVUxLX0hBTFRTCTEKKyNkZWZpbmUgSUdOT1JFX0JVTEtfT1VUCQkxCiAjZGVmaW5lIFNVU1BFTkRFRAkJMgogCiAJc3RydWN0IHVzYl9lcAkJKmJ1bGtfaW47CkBAIC0xMTA0LDcgKzExMDQsNyBAQAogCWlmIChyZXEtPmFjdHVhbCA+IDApCiAJCWR1bXBfbXNnKGZzZywgZnNnLT5lcDByZXFfbmFtZSwgcmVxLT5idWYsIHJlcS0+YWN0dWFsKTsKIAlpZiAocmVxLT5zdGF0dXMgfHwgcmVxLT5hY3R1YWwgIT0gcmVxLT5sZW5ndGgpCi0JCURCRyhmc2csICIlcyAtLT4gJWQsICV1LyV1XG4iLCBfX0ZVTkNUSU9OX18sCisJCURCRyhmc2csICIlcyAtLT4gJWQsICV1LyV1XG4iLCBfX2Z1bmNfXywKIAkJCQlyZXEtPnN0YXR1cywgcmVxLT5hY3R1YWwsIHJlcS0+bGVuZ3RoKTsKIAlpZiAocmVxLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQpCQkvLyBSZXF1ZXN0IHdhcyBjYW5jZWxsZWQKIAkJdXNiX2VwX2ZpZm9fZmx1c2goZXApOwpAQCAtMTEyNSw3ICsxMTI1LDcgQEAKIAlzdHJ1Y3QgZnNnX2J1ZmZoZAkqYmggPSByZXEtPmNvbnRleHQ7CiAKIAlpZiAocmVxLT5zdGF0dXMgfHwgcmVxLT5hY3R1YWwgIT0gcmVxLT5sZW5ndGgpCi0JCURCRyhmc2csICIlcyAtLT4gJWQsICV1LyV1XG4iLCBfX0ZVTkNUSU9OX18sCisJCURCRyhmc2csICIlcyAtLT4gJWQsICV1LyV1XG4iLCBfX2Z1bmNfXywKIAkJCQlyZXEtPnN0YXR1cywgcmVxLT5hY3R1YWwsIHJlcS0+bGVuZ3RoKTsKIAlpZiAocmVxLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQpCQkvLyBSZXF1ZXN0IHdhcyBjYW5jZWxsZWQKIAkJdXNiX2VwX2ZpZm9fZmx1c2goZXApOwpAQCAtMTE0Niw3ICsxMTQ2LDcgQEAKIAogCWR1bXBfbXNnKGZzZywgImJ1bGstb3V0IiwgcmVxLT5idWYsIHJlcS0+YWN0dWFsKTsKIAlpZiAocmVxLT5zdGF0dXMgfHwgcmVxLT5hY3R1YWwgIT0gYmgtPmJ1bGtfb3V0X2ludGVuZGVkX2xlbmd0aCkKLQkJREJHKGZzZywgIiVzIC0tPiAlZCwgJXUvJXVcbiIsIF9fRlVOQ1RJT05fXywKKwkJREJHKGZzZywgIiVzIC0tPiAlZCwgJXUvJXVcbiIsIF9fZnVuY19fLAogCQkJCXJlcS0+c3RhdHVzLCByZXEtPmFjdHVhbCwKIAkJCQliaC0+YnVsa19vdXRfaW50ZW5kZWRfbGVuZ3RoKTsKIAlpZiAocmVxLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQpCQkvLyBSZXF1ZXN0IHdhcyBjYW5jZWxsZWQKQEAgLTExNjksNyArMTE2OSw3IEBACiAJc3RydWN0IGZzZ19idWZmaGQJKmJoID0gcmVxLT5jb250ZXh0OwogCiAJaWYgKHJlcS0+c3RhdHVzIHx8IHJlcS0+YWN0dWFsICE9IHJlcS0+bGVuZ3RoKQotCQlEQkcoZnNnLCAiJXMgLS0+ICVkLCAldS8ldVxuIiwgX19GVU5DVElPTl9fLAorCQlEQkcoZnNnLCAiJXMgLS0+ICVkLCAldS8ldVxuIiwgX19mdW5jX18sCiAJCQkJcmVxLT5zdGF0dXMsIHJlcS0+YWN0dWFsLCByZXEtPmxlbmd0aCk7CiAJaWYgKHJlcS0+c3RhdHVzID09IC1FQ09OTlJFU0VUKQkJLy8gUmVxdWVzdCB3YXMgY2FuY2VsbGVkCiAJCXVzYl9lcF9maWZvX2ZsdXNoKGVwKTsKQEAgLTI5MzYsOCArMjkzNiw4IEBACiAJc3RydWN0IHVzYl9yZXF1ZXN0CSpyZXEgPSBiaC0+b3V0cmVxOwogCXN0cnVjdCBidWxrX2NiX3dyYXAJKmNidyA9IHJlcS0+YnVmOwogCi0JLyogV2FzIHRoaXMgYSByZWFsIHBhY2tldD8gKi8KLQlpZiAocmVxLT5zdGF0dXMpCisJLyogV2FzIHRoaXMgYSByZWFsIHBhY2tldD8gIFNob3VsZCBpdCBiZSBpZ25vcmVkPyAqLworCWlmIChyZXEtPnN0YXR1cyB8fCB0ZXN0X2JpdChJR05PUkVfQlVMS19PVVQsICZmc2ctPmF0b21pY19iaXRmbGFncykpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogSXMgdGhlIENCVyB2YWxpZD8gKi8KQEAgLTI5NDgsMTMgKzI5NDgsMTcgQEAKIAkJCQlyZXEtPmFjdHVhbCwKIAkJCQlsZTMyX3RvX2NwdShjYnctPlNpZ25hdHVyZSkpOwogCi0JCS8qIFRoZSBCdWxrLW9ubHkgc3BlYyBzYXlzIHdlIE1VU1Qgc3RhbGwgdGhlIGJ1bGsgcGlwZXMhCi0JCSAqIElmIHdlIHdhbnQgdG8gYXZvaWQgc3RhbGxzLCBzZXQgYSBmbGFnIHNvIHRoYXQgd2Ugd2lsbAotCQkgKiBjbGVhciB0aGUgZW5kcG9pbnQgaGFsdHMgYXQgdGhlIG5leHQgcmVzZXQuICovCi0JCWlmICghbW9kX2RhdGEuY2FuX3N0YWxsKQotCQkJc2V0X2JpdChDTEVBUl9CVUxLX0hBTFRTLCAmZnNnLT5hdG9taWNfYml0ZmxhZ3MpOwotCQlmc2dfc2V0X2hhbHQoZnNnLCBmc2ctPmJ1bGtfb3V0KTsKKwkJLyogVGhlIEJ1bGstb25seSBzcGVjIHNheXMgd2UgTVVTVCBzdGFsbCB0aGUgSU4gZW5kcG9pbnQKKwkJICogKDYuNi4xKSwgc28gaXQncyB1bmF2b2lkYWJsZS4gIEl0IGFsc28gc2F5cyB3ZSBtdXN0CisJCSAqIHJldGFpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSBuZXh0IHJlc2V0LCBidXQgdGhlcmUncworCQkgKiBubyB3YXkgdG8gdGVsbCB0aGUgY29udHJvbGxlciBkcml2ZXIgaXQgc2hvdWxkIGlnbm9yZQorCQkgKiBDbGVhci1GZWF0dXJlKEhBTFQpIHJlcXVlc3RzLgorCQkgKgorCQkgKiBXZSBhcmVuJ3QgcmVxdWlyZWQgdG8gaGFsdCB0aGUgT1VUIGVuZHBvaW50OyBpbnN0ZWFkCisJCSAqIHdlIGNhbiBzaW1wbHkgYWNjZXB0IGFuZCBkaXNjYXJkIGFueSBkYXRhIHJlY2VpdmVkCisJCSAqIHVudGlsIHRoZSBuZXh0IHJlc2V0LiAqLwogCQloYWx0X2J1bGtfaW5fZW5kcG9pbnQoZnNnKTsKKwkJc2V0X2JpdChJR05PUkVfQlVMS19PVVQsICZmc2ctPmF0b21pY19iaXRmbGFncyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMzE0MCw2ICszMTQ0LDcgQEAKIAkJZ290byByZXNldDsKIAlmc2ctPmJ1bGtfb3V0X2VuYWJsZWQgPSAxOwogCWZzZy0+YnVsa19vdXRfbWF4cGFja2V0ID0gbGUxNl90b19jcHUoZC0+d01heFBhY2tldFNpemUpOworCWNsZWFyX2JpdChJR05PUkVfQlVMS19PVVQsICZmc2ctPmF0b21pY19iaXRmbGFncyk7CiAKIAlpZiAodHJhbnNwb3J0X2lzX2NiaSgpKSB7CiAJCWQgPSBlcF9kZXNjKGZzZy0+Z2FkZ2V0LCAmZnNfaW50cl9pbl9kZXNjLCAmaHNfaW50cl9pbl9kZXNjKTsKQEAgLTMzMjEsMTEgKzMzMjYsOCBAQAogCQkvKiBJbiBjYXNlIHdlIHdlcmUgZm9yY2VkIGFnYWluc3Qgb3VyIHdpbGwgdG8gaGFsdCBhCiAJCSAqIGJ1bGsgZW5kcG9pbnQsIGNsZWFyIHRoZSBoYWx0IG5vdy4gIChUaGUgU3VwZXJIIFVEQwogCQkgKiByZXF1aXJlcyB0aGlzLikgKi8KLQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDTEVBUl9CVUxLX0hBTFRTLAotCQkJCSZmc2ctPmF0b21pY19iaXRmbGFncykpIHsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChJR05PUkVfQlVMS19PVVQsICZmc2ctPmF0b21pY19iaXRmbGFncykpCiAJCQl1c2JfZXBfY2xlYXJfaGFsdChmc2ctPmJ1bGtfaW4pOwotCQkJdXNiX2VwX2NsZWFyX2hhbHQoZnNnLT5idWxrX291dCk7Ci0JCX0KIAogCQlpZiAodHJhbnNwb3J0X2lzX2JiYigpKSB7CiAJCQlpZiAoZnNnLT5lcDBfcmVxX3RhZyA9PSBleGNlcHRpb25fcmVxX3RhZykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfdXNiMl91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfdXNiMl91ZGMuYwppbmRleCAyNTQwMTJhLi42NTFiODI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3VzYjJfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF91c2IyX3VkYy5jCkBAIC03NzMsMTEgKzc3MywxMSBAQAogCS8qIGNhdGNoIHZhcmlvdXMgYm9ndXMgcGFyYW1ldGVycyAqLwogCWlmICghX3JlcSB8fCAhcmVxLT5yZXEuY29tcGxldGUgfHwgIXJlcS0+cmVxLmJ1ZgogCQkJfHwgIWxpc3RfZW1wdHkoJnJlcS0+cXVldWUpKSB7Ci0JCVZEQkcoIiVzLCBiYWQgcGFyYW1zXG4iLCBfX0ZVTkNUSU9OX18pOworCQlWREJHKCIlcywgYmFkIHBhcmFtc1xuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKHVubGlrZWx5KCFfZXAgfHwgIWVwLT5kZXNjKSkgewotCQlWREJHKCIlcywgYmFkIGVwXG4iLCBfX0ZVTkNUSU9OX18pOworCQlWREJHKCIlcywgYmFkIGVwXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAoZXAtPmRlc2MtPmJtQXR0cmlidXRlcyA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3VzYjJfdWRjLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3VzYjJfdWRjLmgKaW5kZXggOWZiMGIxZS4uOThiMTQ4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF91c2IyX3VkYy5oCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfdXNiMl91ZGMuaApAQCAtNTEyLDcgKzUxMiw3IEBACiAKICNpZmRlZiBERUJVRwogI2RlZmluZSBEQkcoZm10LCBhcmdzLi4uKSAJcHJpbnRrKEtFUk5fREVCVUcgIlslc10gICIgZm10ICJcbiIsIFwKLQkJCQlfX0ZVTkNUSU9OX18sICMjIGFyZ3MpCisJCQkJX19mdW5jX18sICMjIGFyZ3MpCiAjZWxzZQogI2RlZmluZSBEQkcoZm10LCBhcmdzLi4uKQlkb3t9d2hpbGUoMCkKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2dtaWRpLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZ21pZGkuYwppbmRleCA1YjQyY2NkLi5mZjNhODUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZ21pZGkuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZ21pZGkuYwpAQCAtMTE0OSw3ICsxMTQ5LDcgQEAKIC8qCiAgKiBDcmVhdGVzIGFuIG91dHB1dCBlbmRwb2ludCwgYW5kIGluaXRpYWxpemVzIG91dHB1dCBwb3J0cy4KICAqLwotc3RhdGljIGludCBfX2RldmluaXQgZ21pZGlfYmluZChzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0KQorc3RhdGljIGludCBfX2luaXQgZ21pZGlfYmluZChzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0KQogewogCXN0cnVjdCBnbWlkaV9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgdXNiX2VwICppbl9lcCwgKm91dF9lcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9nb2t1X3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2dva3VfdWRjLmMKaW5kZXggZDNlNzAyNS4uNjRhNTkyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2dva3VfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2dva3VfdWRjLmMKQEAgLTY5Miw3ICs2OTIsNyBAQAogCXJlcS0+cmVxLmFjdHVhbCA9IChjdXJyIC0gcmVxLT5yZXEuZG1hKSArIDE7CiAJcmVxLT5yZXEuc3RhdHVzID0gc3RhdHVzOwogCi0JVkRCRyhlcC0+ZGV2LCAiJXMgJXMgJXMgJWQvJWRcbiIsIF9fRlVOQ1RJT05fXywgZXAtPmVwLm5hbWUsCisJVkRCRyhlcC0+ZGV2LCAiJXMgJXMgJXMgJWQvJWRcbiIsIF9fZnVuY19fLCBlcC0+ZXAubmFtZSwKIAkJZXAtPmlzX2luID8gIklOIiA6ICJPVVQiLAogCQlyZXEtPnJlcS5hY3R1YWwsIHJlcS0+cmVxLmxlbmd0aCk7CiAKQEAgLTgyNiw3ICs4MjYsNyBAQAogCWlmIChkZXYtPmVwMHN0YXRlID09IEVQMF9TVVNQRU5EKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JVkRCRyhkZXYsICIlcyAlcyAlcyAlcyAlcFxuIiwgX19GVU5DVElPTl9fLCBfZXAtPm5hbWUsCisJVkRCRyhkZXYsICIlcyAlcyAlcyAlcyAlcFxuIiwgX19mdW5jX18sIF9lcC0+bmFtZSwKIAkJZXAtPmlzX2luID8gIklOIiA6ICJPVVQiLAogCQllcC0+ZG1hID8gImRtYSIgOiAicGlvIiwKIAkJX3JlcSk7CkBAIC04OTgsNyArODk4LDcgQEAKIAogCS8qIGRvbid0IGNoYW5nZSBFUHhTVEFUVVNfRVBfSU5WQUxJRCB0byBSRUFEWSAqLwogCX0gZWxzZSBpZiAoIWVwLT5kZXNjKSB7Ci0JCURCRyhlcC0+ZGV2LCAiJXMgJXMgaW5hY3RpdmU/XG4iLCBfX0ZVTkNUSU9OX18sIGVwLT5lcC5uYW1lKTsKKwkJREJHKGVwLT5kZXYsICIlcyAlcyBpbmFjdGl2ZT9cbiIsIF9fZnVuY19fLCBlcC0+ZXAubmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtOTQwLDcgKzk0MCw3IEBACiAJcmVncyA9IGVwLT5kZXYtPnJlZ3M7CiAJc2l6ZSA9IHJlYWRsKCZyZWdzLT5FUHhTaXplTEFbZXAtPm51bV0pICYgREFUQVNJWkU7CiAJc2l6ZSArPSByZWFkbCgmcmVncy0+RVB4U2l6ZUxCW2VwLT5udW1dKSAmIERBVEFTSVpFOwotCVZEQkcoZXAtPmRldiwgIiVzICVzICV1XG4iLCBfX0ZVTkNUSU9OX18sIGVwLT5lcC5uYW1lLCBzaXplKTsKKwlWREJHKGVwLT5kZXYsICIlcyAlcyAldVxuIiwgX19mdW5jX18sIGVwLT5lcC5uYW1lLCBzaXplKTsKIAlyZXR1cm4gc2l6ZTsKIH0KIApAQCAtOTUzLDExICs5NTMsMTEgQEAKIAlpZiAoIV9lcCkKIAkJcmV0dXJuOwogCWVwID0gY29udGFpbmVyX29mKF9lcCwgc3RydWN0IGdva3VfZXAsIGVwKTsKLQlWREJHKGVwLT5kZXYsICIlcyAlc1xuIiwgX19GVU5DVElPTl9fLCBlcC0+ZXAubmFtZSk7CisJVkRCRyhlcC0+ZGV2LCAiJXMgJXNcbiIsIF9fZnVuY19fLCBlcC0+ZXAubmFtZSk7CiAKIAkvKiBkb24ndCBjaGFuZ2UgRVB4U1RBVFVTX0VQX0lOVkFMSUQgdG8gUkVBRFkgKi8KIAlpZiAoIWVwLT5kZXNjICYmIGVwLT5udW0gIT0gMCkgewotCQlEQkcoZXAtPmRldiwgIiVzICVzIGluYWN0aXZlP1xuIiwgX19GVU5DVElPTl9fLCBlcC0+ZXAubmFtZSk7CisJCURCRyhlcC0+ZGV2LCAiJXMgJXMgaW5hY3RpdmU/XG4iLCBfX2Z1bmNfXywgZXAtPmVwLm5hbWUpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMjg2LDcgKzEyODYsNyBAQAogCXN0cnVjdCBnb2t1X3VkY19yZWdzIF9faW9tZW0JKnJlZ3MgPSBkZXYtPnJlZ3M7CiAJdW5zaWduZWQJCQlpOwogCi0JVkRCRyhkZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlWREJHKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAl1ZGNfcmVzZXQoZGV2KTsKIAl1ZGNfcmVpbml0IChkZXYpOwpAQCAtMTMyMiw3ICsxMzIyLDcgQEAKIAlpZiAocmVhZGwoJmRldi0+cmVncy0+cG93ZXJfZGV0ZWN0KSAmIFBXX0RFVEVDVCkKIAkJZXAwX3N0YXJ0KGRldik7CiAJZWxzZSB7Ci0JCURCRyhkZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAJCWRldi0+aW50X2VuYWJsZSA9IElOVF9QV1JERVRFQ1Q7CiAJCXdyaXRlbChkZXYtPmludF9lbmFibGUsICZkZXYtPnJlZ3MtPmludF9lbmFibGUpOwogCX0KQEAgLTEzODcsNyArMTM4Nyw3IEBACiB7CiAJdW5zaWduZWQJaTsKIAotCURCRyAoZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJREJHIChkZXYsICIlc1xuIiwgX19mdW5jX18pOwogCiAJaWYgKGRldi0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKQogCQlkcml2ZXIgPSBOVUxMOwpAQCAtMTcyNiw3ICsxNzI2LDcgQEAKIHsKIAlzdHJ1Y3QgZ29rdV91ZGMJCSpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAKLQlEQkcoZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJREJHKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlCVUdfT04oZGV2LT5kcml2ZXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9pbm9kZS5jCmluZGV4IDBhNmZlYWYuLjY5YjBhMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9pbm9kZS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9pbm9kZS5jCkBAIC0xMTA3LDEzICsxMTA3LDEzIEBACiAKIAlzd2l0Y2ggKHN0YXRlKSB7CiAJZGVmYXVsdDoKLQkJREJHIChkZXYsICJmYWlsICVzLCBzdGF0ZSAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0ZSk7CisJCURCRyAoZGV2LCAiZmFpbCAlcywgc3RhdGUgJWRcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CiAJCXJldHZhbCA9IC1FU1JDSDsKIAkJYnJlYWs7CiAJY2FzZSBTVEFURV9ERVZfVU5DT05ORUNURUQ6CiAJY2FzZSBTVEFURV9ERVZfQ09OTkVDVEVEOgogCQlzcGluX3VubG9ja19pcnEgKCZkZXYtPmxvY2spOwotCQlEQkcgKGRldiwgIiVzIHdhaXRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRyAoZGV2LCAiJXMgd2FpdFxuIiwgX19mdW5jX18pOwogCiAJCS8qIHdhaXQgZm9yIGV2ZW50cyAqLwogCQlyZXR2YWwgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUgKGRldi0+d2FpdCwKQEAgLTEyMjIsNyArMTIyMiw3IEBACiAJCQlEQkcoZGV2LCAiYm9ndXMgZXAwb3V0IHN0YWxsIVxuIik7CiAJCX0KIAl9IGVsc2UKLQkJREJHIChkZXYsICJmYWlsICVzLCBzdGF0ZSAlZFxuIiwgX19GVU5DVElPTl9fLCBkZXYtPnN0YXRlKTsKKwkJREJHIChkZXYsICJmYWlsICVzLCBzdGF0ZSAlZFxuIiwgX19mdW5jX18sIGRldi0+c3RhdGUpOwogCiAJc3Bpbl91bmxvY2tfaXJxICgmZGV2LT5sb2NrKTsKIAlyZXR1cm4gcmV0dmFsOwpAQCAtMTIzMyw3ICsxMjMzLDcgQEAKIHsKIAlzdHJ1Y3QgZGV2X2RhdGEJCSpkZXYgPSBmZC0+cHJpdmF0ZV9kYXRhOwogCS8vIGNhbGxlciBtdXN0IEZfU0VUT1dOIGJlZm9yZSBzaWduYWwgZGVsaXZlcnkgaGFwcGVucwotCVZERUJVRyAoZGV2LCAiJXMgJXNcbiIsIF9fRlVOQ1RJT05fXywgb24gPyAib24iIDogIm9mZiIpOworCVZERUJVRyAoZGV2LCAiJXMgJXNcbiIsIF9fZnVuY19fLCBvbiA/ICJvbiIgOiAib2ZmIik7CiAJcmV0dXJuIGZhc3luY19oZWxwZXIgKGYsIGZkLCBvbiwgJmRldi0+ZmFzeW5jKTsKIH0KIApAQCAtMTU3NSw3ICsxNTc1LDcgQEAKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSplbnRyeSwgKnRtcDsKIAotCURCRyAoZGV2LCAiJXMgJWRcbiIsIF9fRlVOQ1RJT05fXywgZGV2LT5zdGF0ZSk7CisJREJHIChkZXYsICIlcyAlZFxuIiwgX19mdW5jX18sIGRldi0+c3RhdGUpOwogCiAJLyogZGV2LT5zdGF0ZSBtdXN0IHByZXZlbnQgaW50ZXJmZXJlbmNlICovCiByZXN0YXJ0OgpAQCAtMTY2Miw3ICsxNjYyLDcgQEAKIAlwdXRfZGV2IChkZXYpOwogCWtmcmVlIChkYXRhKTsKIGVub21lbTA6Ci0JREJHIChkZXYsICIlcyBlbm9tZW1cbiIsIF9fRlVOQ1RJT05fXyk7CisJREJHIChkZXYsICIlcyBlbm9tZW1cbiIsIF9fZnVuY19fKTsKIAlkZXN0cm95X2VwX2ZpbGVzIChkZXYpOwogCXJldHVybiAtRU5PTUVNOwogfQpAQCAtMTY3Miw3ICsxNjcyLDcgQEAKIHsKIAlzdHJ1Y3QgZGV2X2RhdGEJCSpkZXYgPSBnZXRfZ2FkZ2V0X2RhdGEgKGdhZGdldCk7CiAKLQlEQkcgKGRldiwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCURCRyAoZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAogCXNwaW5fbG9ja19pcnEgKCZkZXYtPmxvY2spOwogCWRldi0+c3RhdGUgPSBTVEFURV9ERVZfVU5CT1VORDsKQEAgLTE2ODUsNyArMTY4NSw3IEBACiAJLyogd2UndmUgYWxyZWFkeSBiZWVuIGRpc2Nvbm5lY3RlZCAuLi4gbm8gaS9vIGlzIGFjdGl2ZSAqLwogCWlmIChkZXYtPnJlcSkKIAkJdXNiX2VwX2ZyZWVfcmVxdWVzdCAoZ2FkZ2V0LT5lcDAsIGRldi0+cmVxKTsKLQlEQkcgKGRldiwgIiVzIGRvbmVcbiIsIF9fRlVOQ1RJT05fXyk7CisJREJHIChkZXYsICIlcyBkb25lXG4iLCBfX2Z1bmNfXyk7CiAJcHV0X2RldiAoZGV2KTsKIH0KIApAQCAtMTkzMyw3ICsxOTMzLDcgQEAKIAogZmFpbDoKIAlzcGluX3VubG9ja19pcnEgKCZkZXYtPmxvY2spOwotCXByX2RlYnVnICgiJXM6ICVzIGZhaWwgJVpkLCAlcFxuIiwgc2hvcnRuYW1lLCBfX0ZVTkNUSU9OX18sIHZhbHVlLCBkZXYpOworCXByX2RlYnVnICgiJXM6ICVzIGZhaWwgJVpkLCAlcFxuIiwgc2hvcnRuYW1lLCBfX2Z1bmNfXywgdmFsdWUsIGRldik7CiAJa2ZyZWUgKGRldi0+YnVmKTsKIAlkZXYtPmJ1ZiA9IE5VTEw7CiAJcmV0dXJuIHZhbHVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2xoN2E0MHhfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbGg3YTQweF91ZGMuYwppbmRleCAwNzhmNzI0Li44MjVhYmQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvbGg3YTQweF91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbGg3YTQweF91ZGMuYwpAQCAtMjUzLDcgKzI1Myw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHVkY19kaXNhYmxlKHN0cnVjdCBsaDdhNDB4X3VkYyAqZGV2KQogewotCURFQlVHKCIlcywgJXBcbiIsIF9fRlVOQ1RJT05fXywgZGV2KTsKKwlERUJVRygiJXMsICVwXG4iLCBfX2Z1bmNfXywgZGV2KTsKIAogCXVkY19zZXRfYWRkcmVzcyhkZXYsIDApOwogCkBAIC0yODUsNyArMjg1LDcgQEAKIHsKIAl1MzIgaTsKIAotCURFQlVHKCIlcywgJXBcbiIsIF9fRlVOQ1RJT05fXywgZGV2KTsKKwlERUJVRygiJXMsICVwXG4iLCBfX2Z1bmNfXywgZGV2KTsKIAogCS8qIGRldmljZS9lcDAgcmVjb3JkcyBpbml0ICovCiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+Z2FkZ2V0LmVwX2xpc3QpOwpAQCAtMzE4LDcgKzMxOCw3IEBACiB7CiAJaW50IGVwOwogCi0JREVCVUcoIiVzLCAlcFxuIiwgX19GVU5DVElPTl9fLCBkZXYpOworCURFQlVHKCIlcywgJXBcbiIsIF9fZnVuY19fLCBkZXYpOwogCiAJZGV2LT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsKIApAQCAtNDEyLDcgKzQxMiw3IEBACiAJc3RydWN0IGxoN2E0MHhfdWRjICpkZXYgPSB0aGVfY29udHJvbGxlcjsKIAlpbnQgcmV0dmFsOwogCi0JREVCVUcoIiVzOiAlc1xuIiwgX19GVU5DVElPTl9fLCBkcml2ZXItPmRyaXZlci5uYW1lKTsKKwlERUJVRygiJXM6ICVzXG4iLCBfX2Z1bmNfXywgZHJpdmVyLT5kcml2ZXIubmFtZSk7CiAKIAlpZiAoIWRyaXZlcgogCQkJfHwgZHJpdmVyLT5zcGVlZCAhPSBVU0JfU1BFRURfRlVMTApAQCAtNTIxLDcgKzUyMSw3IEBACiAJCQlpc19zaG9ydCA9IHVubGlrZWx5KG1heCA8IGVwX21heHBhY2tldChlcCkpOwogCQl9CiAKLQkJREVCVUcoIiVzOiB3cm90ZSAlcyAlZCBieXRlcyVzJXMgJWQgbGVmdCAlcFxuIiwgX19GVU5DVElPTl9fLAorCQlERUJVRygiJXM6IHdyb3RlICVzICVkIGJ5dGVzJXMlcyAlZCBsZWZ0ICVwXG4iLCBfX2Z1bmNfXywKIAkJICAgICAgZXAtPmVwLm5hbWUsIGNvdW50LAogCQkgICAgICBpc19sYXN0ID8gIi9MIiA6ICIiLCBpc19zaG9ydCA/ICIvUyIgOiAiIiwKIAkJICAgICAgcmVxLT5yZXEubGVuZ3RoIC0gcmVxLT5yZXEuYWN0dWFsLCByZXEpOwpAQCAtNTU1LDcgKzU1NSw3IEBACiAJLyogbWFrZSBzdXJlIHRoZXJlJ3MgYSBwYWNrZXQgaW4gdGhlIEZJRk8uICovCiAJY3NyID0gdXNiX3JlYWQoZXAtPmNzcjEpOwogCWlmICghKGNzciAmIFVTQl9PVVRfQ1NSMV9PVVRfUEtUX1JEWSkpIHsKLQkJREVCVUcoIiVzOiBQYWNrZXQgTk9UIHJlYWR5IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJREVCVUcoIiVzOiBQYWNrZXQgTk9UIHJlYWR5IVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTYxNCw3ICs2MTQsNyBAQAogCXVuc2lnbmVkIGludCBzdG9wcGVkID0gZXAtPnN0b3BwZWQ7CiAJdTMyIGluZGV4OwogCi0JREVCVUcoIiVzLCAlcFxuIiwgX19GVU5DVElPTl9fLCBlcCk7CisJREVCVUcoIiVzLCAlcFxuIiwgX19mdW5jX18sIGVwKTsKIAlsaXN0X2RlbF9pbml0KCZyZXEtPnF1ZXVlKTsKIAogCWlmIChsaWtlbHkocmVxLT5yZXEuc3RhdHVzID09IC1FSU5QUk9HUkVTUykpCkBAIC02NDQsNyArNjQ0LDcgQEAKIC8qKiBFbmFibGUgRVAgaW50ZXJydXB0ICovCiBzdGF0aWMgdm9pZCBwaW9faXJxX2VuYWJsZShpbnQgZXApCiB7Ci0JREVCVUcoIiVzOiAlZFxuIiwgX19GVU5DVElPTl9fLCBlcCk7CisJREVCVUcoIiVzOiAlZFxuIiwgX19mdW5jX18sIGVwKTsKIAogCXN3aXRjaCAoZXApIHsKIAljYXNlIDE6CkBAIC02NjUsNyArNjY1LDcgQEAKIC8qKiBEaXNhYmxlIEVQIGludGVycnVwdCAqLwogc3RhdGljIHZvaWQgcGlvX2lycV9kaXNhYmxlKGludCBlcCkKIHsKLQlERUJVRygiJXM6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGVwKTsKKwlERUJVRygiJXM6ICVkXG4iLCBfX2Z1bmNfXywgZXApOwogCiAJc3dpdGNoIChlcCkgewogCWNhc2UgMToKQEAgLTY5MCw3ICs2OTAsNyBAQAogewogCXN0cnVjdCBsaDdhNDB4X3JlcXVlc3QgKnJlcTsKIAotCURFQlVHKCIlcywgJXBcbiIsIF9fRlVOQ1RJT05fXywgZXApOworCURFQlVHKCIlcywgJXBcbiIsIF9fZnVuY19fLCBlcCk7CiAKIAkvKiBGbHVzaCBGSUZPICovCiAJZmx1c2goZXApOwpAQCAtNzM0LDcgKzczNCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGZsdXNoKHN0cnVjdCBsaDdhNDB4X2VwICplcCkKIHsKLQlERUJVRygiJXMsICVwXG4iLCBfX0ZVTkNUSU9OX18sIGVwKTsKKwlERUJVRygiJXMsICVwXG4iLCBfX2Z1bmNfXywgZXApOwogCiAJc3dpdGNoIChlcC0+ZXBfdHlwZSkgewogCWNhc2UgZXBfY29udHJvbDoKQEAgLTc2Niw3ICs3NjYsNyBAQAogCXVzYl9zZXRfaW5kZXgoZXBfaWR4KTsKIAogCWNzciA9IHVzYl9yZWFkKGVwLT5jc3IxKTsKLQlERUJVRygiJXM6ICVkLCBjc3IgJXhcbiIsIF9fRlVOQ1RJT05fXywgZXBfaWR4LCBjc3IpOworCURFQlVHKCIlczogJWQsIGNzciAleFxuIiwgX19mdW5jX18sIGVwX2lkeCwgY3NyKTsKIAogCWlmIChjc3IgJiBVU0JfSU5fQ1NSMV9TRU5UX1NUQUxMKSB7CiAJCURFQlVHKCJVU0JfSU5fQ1NSMV9TRU5UX1NUQUxMXG4iKTsKQEAgLTc3Niw3ICs3NzYsNyBAQAogCX0KIAogCWlmICghZXAtPmRlc2MpIHsKLQkJREVCVUcoIiVzOiBOTyBFUCBERVNDXG4iLCBfX0ZVTkNUSU9OX18pOworCQlERUJVRygiJXM6IE5PIEVQIERFU0NcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtODAyLDcgKzgwMiw3IEBACiAJc3RydWN0IGxoN2E0MHhfZXAgKmVwID0gJmRldi0+ZXBbZXBfaWR4XTsKIAlzdHJ1Y3QgbGg3YTQweF9yZXF1ZXN0ICpyZXE7CiAKLQlERUJVRygiJXM6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGVwX2lkeCk7CisJREVCVUcoIiVzOiAlZFxuIiwgX19mdW5jX18sIGVwX2lkeCk7CiAKIAl1c2Jfc2V0X2luZGV4KGVwX2lkeCk7CiAKQEAgLTgxNCwxMSArODE0LDExIEBACiAJCQl1c2JfcmVhZChlcC0+CiAJCQkJIGNzcjEpKSAmIChVU0JfT1VUX0NTUjFfT1VUX1BLVF9SRFkgfAogCQkJCQkgICBVU0JfT1VUX0NTUjFfU0VOVF9TVEFMTCkpIHsKLQkJCURFQlVHKCIlczogJXhcbiIsIF9fRlVOQ1RJT05fXywgY3NyKTsKKwkJCURFQlVHKCIlczogJXhcbiIsIF9fZnVuY19fLCBjc3IpOwogCiAJCQlpZiAoY3NyICYgVVNCX09VVF9DU1IxX1NFTlRfU1RBTEwpIHsKIAkJCQlERUJVRygiJXM6IHN0YWxsIHNlbnQsIGZsdXNoIGZpZm9cbiIsCi0JCQkJICAgICAgX19GVU5DVElPTl9fKTsKKwkJCQkgICAgICBfX2Z1bmNfXyk7CiAJCQkJLyogdXNiX3NldChVU0JfT1VUX0NTUjFfRklGT19GTFVTSCwgZXAtPmNzcjEpOyAqLwogCQkJCWZsdXNoKGVwKTsKIAkJCX0gZWxzZSBpZiAoY3NyICYgVVNCX09VVF9DU1IxX09VVF9QS1RfUkRZKSB7CkBAIC04MzIsNyArODMyLDcgQEAKIAogCQkJCWlmICghcmVxKSB7CiAJCQkJCXByaW50aygiJXM6IE5VTEwgUkVRICVkXG4iLAotCQkJCQkgICAgICAgX19GVU5DVElPTl9fLCBlcF9pZHgpOworCQkJCQkgICAgICAgX19mdW5jX18sIGVwX2lkeCk7CiAJCQkJCWZsdXNoKGVwKTsKIAkJCQkJYnJlYWs7CiAJCQkJfSBlbHNlIHsKQEAgLTg0NCw3ICs4NDQsNyBAQAogCiAJfSBlbHNlIHsKIAkJLyogVGhyb3cgcGFja2V0IGF3YXkuLiAqLwotCQlwcmludGsoIiVzOiBObyBkZXNjcmlwdG9yPyE/XG4iLCBfX0ZVTkNUSU9OX18pOworCQlwcmludGsoIiVzOiBObyBkZXNjcmlwdG9yPyE/XG4iLCBfX2Z1bmNfXyk7CiAJCWZsdXNoKGVwKTsKIAl9CiB9CkBAIC04ODYsNyArODg2LDcgQEAKICNpZiAwCQkJCS8qIGRlZiBDT05GSUdfQVJDSF9MSDdBNDA0ICovCiAJLyogRG9lcyBub3Qgd29yayBhbHdheXMuLi4gKi8KIAotCURFQlVHKCIlczogJWRcbiIsIF9fRlVOQ1RJT05fXywgZGV2LT51c2JfYWRkcmVzcyk7CisJREVCVUcoIiVzOiAlZFxuIiwgX19mdW5jX18sIGRldi0+dXNiX2FkZHJlc3MpOwogCiAJaWYgKCFkZXYtPnVzYl9hZGRyZXNzKSB7CiAJCS8qdXNiX3NldChVU0JfUkVTRVRfSU8sIFVTQl9SRVNFVCk7CkBAIC05MzYsNyArOTM2LDcgQEAKIAkJaWYgKCFpbnRyX291dCAmJiAhaW50cl9pbiAmJiAhaW50cl9pbnQpCiAJCQlicmVhazsKIAotCQlERUJVRygiJXMgKG9uIHN0YXRlICVzKVxuIiwgX19GVU5DVElPTl9fLAorCQlERUJVRygiJXMgKG9uIHN0YXRlICVzKVxuIiwgX19mdW5jX18sCiAJCSAgICAgIHN0YXRlX25hbWVzW2Rldi0+ZXAwc3RhdGVdKTsKIAkJREVCVUcoImludHJfb3V0ID0gJXhcbiIsIGludHJfb3V0KTsKIAkJREVCVUcoImludHJfaW4gID0gJXhcbiIsIGludHJfaW4pOwpAQCAtMTAxNiwxNCArMTAxNiwxNCBAQAogCXN0cnVjdCBsaDdhNDB4X3VkYyAqZGV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlERUJVRygiJXMsICVwXG4iLCBfX0ZVTkNUSU9OX18sIF9lcCk7CisJREVCVUcoIiVzLCAlcFxuIiwgX19mdW5jX18sIF9lcCk7CiAKIAllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBsaDdhNDB4X2VwLCBlcCk7CiAJaWYgKCFfZXAgfHwgIWRlc2MgfHwgZXAtPmRlc2MgfHwgX2VwLT5uYW1lID09IGVwMG5hbWUKIAkgICAgfHwgZGVzYy0+YkRlc2NyaXB0b3JUeXBlICE9IFVTQl9EVF9FTkRQT0lOVAogCSAgICB8fCBlcC0+YkVuZHBvaW50QWRkcmVzcyAhPSBkZXNjLT5iRW5kcG9pbnRBZGRyZXNzCiAJICAgIHx8IGVwX21heHBhY2tldChlcCkgPCBsZTE2X3RvX2NwdShkZXNjLT53TWF4UGFja2V0U2l6ZSkpIHsKLQkJREVCVUcoIiVzLCBiYWQgZXAgb3IgZGVzY3JpcHRvclxuIiwgX19GVU5DVElPTl9fKTsKKwkJREVCVUcoIiVzLCBiYWQgZXAgb3IgZGVzY3JpcHRvclxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTEwMzEsNyArMTAzMSw3IEBACiAJaWYgKGVwLT5ibUF0dHJpYnV0ZXMgIT0gZGVzYy0+Ym1BdHRyaWJ1dGVzCiAJICAgICYmIGVwLT5ibUF0dHJpYnV0ZXMgIT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSwogCSAgICAmJiBkZXNjLT5ibUF0dHJpYnV0ZXMgIT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKSB7Ci0JCURFQlVHKCIlcywgJXMgdHlwZSBtaXNtYXRjaFxuIiwgX19GVU5DVElPTl9fLCBfZXAtPm5hbWUpOworCQlERUJVRygiJXMsICVzIHR5cGUgbWlzbWF0Y2hcbiIsIF9fZnVuY19fLCBfZXAtPm5hbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTEwMzksMTMgKzEwMzksMTMgQEAKIAlpZiAoKGRlc2MtPmJtQXR0cmlidXRlcyA9PSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLCiAJICAgICAmJiBsZTE2X3RvX2NwdShkZXNjLT53TWF4UGFja2V0U2l6ZSkgIT0gZXBfbWF4cGFja2V0KGVwKSkKIAkgICAgfHwgIWRlc2MtPndNYXhQYWNrZXRTaXplKSB7Ci0JCURFQlVHKCIlcywgYmFkICVzIG1heHBhY2tldFxuIiwgX19GVU5DVElPTl9fLCBfZXAtPm5hbWUpOworCQlERUJVRygiJXMsIGJhZCAlcyBtYXhwYWNrZXRcbiIsIF9fZnVuY19fLCBfZXAtPm5hbWUpOwogCQlyZXR1cm4gLUVSQU5HRTsKIAl9CiAKIAlkZXYgPSBlcC0+ZGV2OwogCWlmICghZGV2LT5kcml2ZXIgfHwgZGV2LT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pIHsKLQkJREVCVUcoIiVzLCBib2d1cyBkZXZpY2Ugc3RhdGVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURFQlVHKCIlcywgYm9ndXMgZGV2aWNlIHN0YXRlXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRVNIVVRET1dOOwogCX0KIApAQCAtMTA2MSw3ICsxMDYxLDcgQEAKIAkvKiBSZXNldCBoYWx0IHN0YXRlIChkb2VzIGZsdXNoKSAqLwogCWxoN2E0MHhfc2V0X2hhbHQoX2VwLCAwKTsKIAotCURFQlVHKCIlczogZW5hYmxlZCAlc1xuIiwgX19GVU5DVElPTl9fLCBfZXAtPm5hbWUpOworCURFQlVHKCIlczogZW5hYmxlZCAlc1xuIiwgX19mdW5jX18sIF9lcC0+bmFtZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwNzMsMTEgKzEwNzMsMTEgQEAKIAlzdHJ1Y3QgbGg3YTQweF9lcCAqZXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCURFQlVHKCIlcywgJXBcbiIsIF9fRlVOQ1RJT05fXywgX2VwKTsKKwlERUJVRygiJXMsICVwXG4iLCBfX2Z1bmNfXywgX2VwKTsKIAogCWVwID0gY29udGFpbmVyX29mKF9lcCwgc3RydWN0IGxoN2E0MHhfZXAsIGVwKTsKIAlpZiAoIV9lcCB8fCAhZXAtPmRlc2MpIHsKLQkJREVCVUcoIiVzLCAlcyBub3QgZW5hYmxlZFxuIiwgX19GVU5DVElPTl9fLAorCQlERUJVRygiJXMsICVzIG5vdCBlbmFibGVkXG4iLCBfX2Z1bmNfXywKIAkJICAgICAgX2VwID8gZXAtPmVwLm5hbWUgOiBOVUxMKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTA5Nyw3ICsxMDk3LDcgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwLT5kZXYtPmxvY2ssIGZsYWdzKTsKIAotCURFQlVHKCIlczogZGlzYWJsZWQgJXNcbiIsIF9fRlVOQ1RJT05fXywgX2VwLT5uYW1lKTsKKwlERUJVRygiJXM6IGRpc2FibGVkICVzXG4iLCBfX2Z1bmNfXywgX2VwLT5uYW1lKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTEwNiw3ICsxMTA2LDcgQEAKIHsKIAlzdHJ1Y3QgbGg3YTQweF9yZXF1ZXN0ICpyZXE7CiAKLQlERUJVRygiJXMsICVwXG4iLCBfX0ZVTkNUSU9OX18sIGVwKTsKKwlERUJVRygiJXMsICVwXG4iLCBfX2Z1bmNfXywgZXApOwogCiAJcmVxID0ga3phbGxvYyhzaXplb2YoKnJlcSksIGdmcF9mbGFncyk7CiAJaWYgKCFyZXEpCkBAIC0xMTIxLDcgKzExMjEsNyBAQAogewogCXN0cnVjdCBsaDdhNDB4X3JlcXVlc3QgKnJlcTsKIAotCURFQlVHKCIlcywgJXBcbiIsIF9fRlVOQ1RJT05fXywgZXApOworCURFQlVHKCIlcywgJXBcbiIsIF9fZnVuY19fLCBlcCk7CiAKIAlyZXEgPSBjb250YWluZXJfb2YoX3JlcSwgc3RydWN0IGxoN2E0MHhfcmVxdWVzdCwgcmVxKTsKIAlXQVJOX09OKCFsaXN0X2VtcHR5KCZyZXEtPnF1ZXVlKSk7CkBAIC0xMTQwLDI1ICsxMTQwLDI1IEBACiAJc3RydWN0IGxoN2E0MHhfdWRjICpkZXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCURFQlVHKCJcblxuXG4lcywgJXBcbiIsIF9fRlVOQ1RJT05fXywgX2VwKTsKKwlERUJVRygiXG5cblxuJXMsICVwXG4iLCBfX2Z1bmNfXywgX2VwKTsKIAogCXJlcSA9IGNvbnRhaW5lcl9vZihfcmVxLCBzdHJ1Y3QgbGg3YTQweF9yZXF1ZXN0LCByZXEpOwogCWlmICh1bmxpa2VseQogCSAgICAoIV9yZXEgfHwgIV9yZXEtPmNvbXBsZXRlIHx8ICFfcmVxLT5idWYKIAkgICAgIHx8ICFsaXN0X2VtcHR5KCZyZXEtPnF1ZXVlKSkpIHsKLQkJREVCVUcoIiVzLCBiYWQgcGFyYW1zXG4iLCBfX0ZVTkNUSU9OX18pOworCQlERUJVRygiJXMsIGJhZCBwYXJhbXNcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJZXAgPSBjb250YWluZXJfb2YoX2VwLCBzdHJ1Y3QgbGg3YTQweF9lcCwgZXApOwogCWlmICh1bmxpa2VseSghX2VwIHx8ICghZXAtPmRlc2MgJiYgZXAtPmVwLm5hbWUgIT0gZXAwbmFtZSkpKSB7Ci0JCURFQlVHKCIlcywgYmFkIGVwXG4iLCBfX0ZVTkNUSU9OX18pOworCQlERUJVRygiJXMsIGJhZCBlcFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlkZXYgPSBlcC0+ZGV2OwogCWlmICh1bmxpa2VseSghZGV2LT5kcml2ZXIgfHwgZGV2LT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pKSB7Ci0JCURFQlVHKCIlcywgYm9ndXMgZGV2aWNlIHN0YXRlICVwXG4iLCBfX0ZVTkNUSU9OX18sIGRldi0+ZHJpdmVyKTsKKwkJREVCVUcoIiVzLCBib2d1cyBkZXZpY2Ugc3RhdGUgJXBcbiIsIF9fZnVuY19fLCBkZXYtPmRyaXZlcik7CiAJCXJldHVybiAtRVNIVVRET1dOOwogCX0KIApAQCAtMTIxOCw3ICsxMjE4LDcgQEAKIAlzdHJ1Y3QgbGg3YTQweF9yZXF1ZXN0ICpyZXE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCURFQlVHKCIlcywgJXBcbiIsIF9fRlVOQ1RJT05fXywgX2VwKTsKKwlERUJVRygiJXMsICVwXG4iLCBfX2Z1bmNfXywgX2VwKTsKIAogCWVwID0gY29udGFpbmVyX29mKF9lcCwgc3RydWN0IGxoN2E0MHhfZXAsIGVwKTsKIAlpZiAoIV9lcCB8fCBlcC0+ZXAubmFtZSA9PSBlcDBuYW1lKQpAQCAtMTI1MywxMyArMTI1MywxMyBAQAogCiAJZXAgPSBjb250YWluZXJfb2YoX2VwLCBzdHJ1Y3QgbGg3YTQweF9lcCwgZXApOwogCWlmICh1bmxpa2VseSghX2VwIHx8ICghZXAtPmRlc2MgJiYgZXAtPmVwLm5hbWUgIT0gZXAwbmFtZSkpKSB7Ci0JCURFQlVHKCIlcywgYmFkIGVwXG4iLCBfX0ZVTkNUSU9OX18pOworCQlERUJVRygiJXMsIGJhZCBlcFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAl1c2Jfc2V0X2luZGV4KGVwX2luZGV4KGVwKSk7CiAKLQlERUJVRygiJXMsIGVwICVkLCB2YWwgJWRcbiIsIF9fRlVOQ1RJT05fXywgZXBfaW5kZXgoZXApLCB2YWx1ZSk7CisJREVCVUcoIiVzLCBlcCAlZCwgdmFsICVkXG4iLCBfX2Z1bmNfXywgZXBfaW5kZXgoZXApLCB2YWx1ZSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZXAtPmRldi0+bG9jaywgZmxhZ3MpOwogCkBAIC0xMzI1LDExICsxMzI1LDExIEBACiAKIAllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBsaDdhNDB4X2VwLCBlcCk7CiAJaWYgKCFfZXApIHsKLQkJREVCVUcoIiVzLCBiYWQgZXBcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURFQlVHKCIlcywgYmFkIGVwXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCURFQlVHKCIlcywgJWRcbiIsIF9fRlVOQ1RJT05fXywgZXBfaW5kZXgoZXApKTsKKwlERUJVRygiJXMsICVkXG4iLCBfX2Z1bmNfXywgZXBfaW5kZXgoZXApKTsKIAogCS8qIExQRCBjYW4ndCByZXBvcnQgdW5jbGFpbWVkIGJ5dGVzIGZyb20gSU4gZmlmb3MgKi8KIAlpZiAoZXBfaXNfaW4oZXApKQpAQCAtMTM1NSw3ICsxMzU1LDcgQEAKIAogCWVwID0gY29udGFpbmVyX29mKF9lcCwgc3RydWN0IGxoN2E0MHhfZXAsIGVwKTsKIAlpZiAodW5saWtlbHkoIV9lcCB8fCAoIWVwLT5kZXNjICYmIGVwLT5lcC5uYW1lICE9IGVwMG5hbWUpKSkgewotCQlERUJVRygiJXMsIGJhZCBlcFxuIiwgX19GVU5DVElPTl9fKTsKKwkJREVCVUcoIiVzLCBiYWQgZXBcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTM3Niw3ICsxMzc2LDcgQEAKIAogCW1heCA9IGVwX21heHBhY2tldChlcCk7CiAKLQlERUJVR19FUDAoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCURFQlVHX0VQMCgiJXNcbiIsIF9fZnVuY19fKTsKIAogCWNvdW50ID0gd3JpdGVfcGFja2V0KGVwLCByZXEsIG1heCk7CiAKQEAgLTEzOTAsNyArMTM5MCw3IEBACiAJCQlpc19sYXN0ID0gMTsKIAl9CiAKLQlERUJVR19FUDAoIiVzOiB3cm90ZSAlcyAlZCBieXRlcyVzICVkIGxlZnQgJXBcbiIsIF9fRlVOQ1RJT05fXywKKwlERUJVR19FUDAoIiVzOiB3cm90ZSAlcyAlZCBieXRlcyVzICVkIGxlZnQgJXBcbiIsIF9fZnVuY19fLAogCQkgIGVwLT5lcC5uYW1lLCBjb3VudCwKIAkJICBpc19sYXN0ID8gIi9MIiA6ICIiLCByZXEtPnJlcS5sZW5ndGggLSByZXEtPnJlcS5hY3R1YWwsIHJlcSk7CiAKQEAgLTE0MzQsNyArMTQzNCw3IEBACiAJdW5zaWduZWQgYnVmZmVyc3BhY2UsIGNvdW50LCBpc19zaG9ydDsKIAl2b2xhdGlsZSB1MzIgKmZpZm8gPSAodm9sYXRpbGUgdTMyICopZXAtPmZpZm87CiAKLQlERUJVR19FUDAoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCURFQlVHX0VQMCgiJXNcbiIsIF9fZnVuY19fKTsKIAogCWNzciA9IHVzYl9yZWFkKFVTQl9FUDBfQ1NSKTsKIAlpZiAoIShjc3IgJiBVU0JfT1VUX0NTUjFfT1VUX1BLVF9SRFkpKQpAQCAtMTQ5Miw3ICsxNDkyLDcgQEAKICAqLwogc3RhdGljIHZvaWQgdWRjX3NldF9hZGRyZXNzKHN0cnVjdCBsaDdhNDB4X3VkYyAqZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MpCiB7Ci0JREVCVUdfRVAwKCIlczogJWRcbiIsIF9fRlVOQ1RJT05fXywgYWRkcmVzcyk7CisJREVCVUdfRVAwKCIlczogJWRcbiIsIF9fZnVuY19fLCBhZGRyZXNzKTsKIAkvKiBjLmYuIDE1LjEuMi4yIFRhYmxlIDE1LTQgYWRkcmVzcyB3aWxsIGJlIHVzZWQgYWZ0ZXIgREFUQV9FTkQgaXMgc2V0ICovCiAJZGV2LT51c2JfYWRkcmVzcyA9IGFkZHJlc3M7CiAJdXNiX3NldCgoYWRkcmVzcyAmIFVTQl9GQV9GVU5DVElPTl9BRERSKSwgVVNCX0ZBKTsKQEAgLTE1MTQsNyArMTUxNCw3IEBACiAJc3RydWN0IGxoN2E0MHhfZXAgKmVwID0gJmRldi0+ZXBbMF07CiAJaW50IHJldDsKIAotCURFQlVHX0VQMCgiJXM6ICV4XG4iLCBfX0ZVTkNUSU9OX18sIGNzcik7CisJREVCVUdfRVAwKCIlczogJXhcbiIsIF9fZnVuY19fLCBjc3IpOwogCiAJaWYgKGxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkpCiAJCXJlcSA9IDA7CkBAIC0xNTMzLDEzICsxNTMzLDEzIEBACiAJCWlmIChyZXQpIHsKIAkJCS8qIERvbmUhICovCiAJCQlERUJVR19FUDAoIiVzOiBmaW5pc2hlZCwgd2FpdGluZyBmb3Igc3RhdHVzXG4iLAotCQkJCSAgX19GVU5DVElPTl9fKTsKKwkJCQkgIF9fZnVuY19fKTsKIAogCQkJdXNiX3NldCgoRVAwX0NMUl9PVVQgfCBFUDBfREFUQV9FTkQpLCBVU0JfRVAwX0NTUik7CiAJCQlkZXYtPmVwMHN0YXRlID0gV0FJVF9GT1JfU0VUVVA7CiAJCX0gZWxzZSB7CiAJCQkvKiBOb3QgZG9uZSB5ZXQuLiAqLwotCQkJREVCVUdfRVAwKCIlczogbm90IGZpbmlzaGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJREVCVUdfRVAwKCIlczogbm90IGZpbmlzaGVkXG4iLCBfX2Z1bmNfXyk7CiAJCQl1c2Jfc2V0KEVQMF9DTFJfT1VULCBVU0JfRVAwX0NTUik7CiAJCX0KIAl9IGVsc2UgewpAQCAtMTU1Niw3ICsxNTU2LDcgQEAKIAlzdHJ1Y3QgbGg3YTQweF9lcCAqZXAgPSAmZGV2LT5lcFswXTsKIAlpbnQgcmV0LCBuZWVkX3pscCA9IDA7CiAKLQlERUJVR19FUDAoIiVzOiAleFxuIiwgX19GVU5DVElPTl9fLCBjc3IpOworCURFQlVHX0VQMCgiJXM6ICV4XG4iLCBfX2Z1bmNfXywgY3NyKTsKIAogCWlmIChsaXN0X2VtcHR5KCZlcC0+cXVldWUpKQogCQlyZXEgPSAwOwpAQCAtMTU2NCw3ICsxNTY0LDcgQEAKIAkJcmVxID0gbGlzdF9lbnRyeShlcC0+cXVldWUubmV4dCwgc3RydWN0IGxoN2E0MHhfcmVxdWVzdCwgcXVldWUpOwogCiAJaWYgKCFyZXEpIHsKLQkJREVCVUdfRVAwKCIlczogTlVMTCBSRVFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURFQlVHX0VQMCgiJXM6IE5VTEwgUkVRXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTU4NSwxNyArMTU4NSwxNyBAQAogCiAJaWYgKHJldCA9PSAxICYmICFuZWVkX3pscCkgewogCQkvKiBMYXN0IHBhY2tldCAqLwotCQlERUJVR19FUDAoIiVzOiBmaW5pc2hlZCwgd2FpdGluZyBmb3Igc3RhdHVzXG4iLCBfX0ZVTkNUSU9OX18pOworCQlERUJVR19FUDAoIiVzOiBmaW5pc2hlZCwgd2FpdGluZyBmb3Igc3RhdHVzXG4iLCBfX2Z1bmNfXyk7CiAKIAkJdXNiX3NldCgoRVAwX0lOX1BLVF9SRFkgfCBFUDBfREFUQV9FTkQpLCBVU0JfRVAwX0NTUik7CiAJCWRldi0+ZXAwc3RhdGUgPSBXQUlUX0ZPUl9TRVRVUDsKIAl9IGVsc2UgewotCQlERUJVR19FUDAoIiVzOiBub3QgZmluaXNoZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURFQlVHX0VQMCgiJXM6IG5vdCBmaW5pc2hlZFxuIiwgX19mdW5jX18pOwogCQl1c2Jfc2V0KEVQMF9JTl9QS1RfUkRZLCBVU0JfRVAwX0NTUik7CiAJfQogCiAJaWYgKG5lZWRfemxwKSB7Ci0JCURFQlVHX0VQMCgiJXM6IE5lZWQgWkxQIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJREVCVUdfRVAwKCIlczogTmVlZCBaTFAhXG4iLCBfX2Z1bmNfXyk7CiAJCXVzYl9zZXQoRVAwX0lOX1BLVF9SRFksIFVTQl9FUDBfQ1NSKTsKIAkJZGV2LT5lcDBzdGF0ZSA9IERBVEFfU1RBVEVfTkVFRF9aTFA7CiAJfQpAQCAtMTY5NCw3ICsxNjk0LDcgQEAKIAlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0IGN0cmw7CiAJaW50IGksIGJ5dGVzLCBpc19pbjsKIAotCURFQlVHX1NFVFVQKCIlczogJXhcbiIsIF9fRlVOQ1RJT05fXywgY3NyKTsKKwlERUJVR19TRVRVUCgiJXM6ICV4XG4iLCBfX2Z1bmNfXywgY3NyKTsKIAogCS8qIE51a2UgYWxsIHByZXZpb3VzIHRyYW5zZmVycyAqLwogCW51a2UoZXAsIC1FUFJPVE8pOwpAQCAtMTc5OSw3ICsxNzk5LDcgQEAKICAqLwogc3RhdGljIHZvaWQgbGg3YTQweF9lcDBfaW5femxwKHN0cnVjdCBsaDdhNDB4X3VkYyAqZGV2LCB1MzIgY3NyKQogewotCURFQlVHX0VQMCgiJXM6ICV4XG4iLCBfX0ZVTkNUSU9OX18sIGNzcik7CisJREVCVUdfRVAwKCIlczogJXhcbiIsIF9fZnVuY19fLCBjc3IpOwogCiAJLyogYy5mLiBUYWJsZSAxNS0xNCAqLwogCXVzYl9zZXQoKEVQMF9JTl9QS1RfUkRZIHwgRVAwX0RBVEFfRU5EKSwgVVNCX0VQMF9DU1IpOwpAQCAtMTgxOCw3ICsxODE4LDcgQEAKIAl1c2Jfc2V0X2luZGV4KDApOwogIAljc3IgPSB1c2JfcmVhZChVU0JfRVAwX0NTUik7CiAKLQlERUJVR19FUDAoIiVzOiBjc3IgPSAleFxuIiwgX19GVU5DVElPTl9fLCBjc3IpOworCURFQlVHX0VQMCgiJXM6IGNzciA9ICV4XG4iLCBfX2Z1bmNfXywgY3NyKTsKIAogCS8qCiAJICogRm9yIG92ZXJ2aWV3IG9mIHdoYXQgd2Ugc2hvdWxkIGJlIGRvaW5nIHNlZSBjLmYuIENoYXB0ZXIgMTguMS4yLjQKQEAgLTE4MzIsNyArMTgzMiw3IEBACiAJICogICAgICAtIGNsZWFyIHRoZSBTRU5UX1NUQUxMIGJpdAogCSAqLwogCWlmIChjc3IgJiBFUDBfU0VOVF9TVEFMTCkgewotCQlERUJVR19FUDAoIiVzOiBFUDBfU0VOVF9TVEFMTCBpcyBzZXQ6ICV4XG4iLCBfX0ZVTkNUSU9OX18sIGNzcik7CisJCURFQlVHX0VQMCgiJXM6IEVQMF9TRU5UX1NUQUxMIGlzIHNldDogJXhcbiIsIF9fZnVuY19fLCBjc3IpOwogCQl1c2JfY2xlYXIoKEVQMF9TRU5UX1NUQUxMIHwgRVAwX1NFTkRfU1RBTEwpLCBVU0JfRVAwX0NTUik7CiAJCW51a2UoZXAsIC1FQ09OTkFCT1JURUQpOwogCQlkZXYtPmVwMHN0YXRlID0gV0FJVF9GT1JfU0VUVVA7CkBAIC0xODQ5LDcgKzE4NDksNyBAQAogCSAqLwogCWlmICghKGNzciAmIChFUDBfSU5fUEtUX1JEWSB8IEVQMF9PVVRfUEtUX1JEWSkpKSB7CiAJCURFQlVHX0VQMCgiJXM6IElOX1BLVF9SRFkgYW5kIE9VVF9QS1RfUkRZIGFyZSBjbGVhclxuIiwKLQkJCSAgX19GVU5DVElPTl9fKTsKKwkJCSAgX19mdW5jX18pOwogCiAJCXN3aXRjaCAoZGV2LT5lcDBzdGF0ZSkgewogCQljYXNlIERBVEFfU1RBVEVfWE1JVDoKQEAgLTE4NzcsNyArMTg3Nyw3IEBACiAJICogICAgICAtIHNldCBTRVJWSUNFRF9TRVRVUF9FTkRfQklUCiAJICovCiAJaWYgKGNzciAmIEVQMF9TRVRVUF9FTkQpIHsKLQkJREVCVUdfRVAwKCIlczogRVAwX1NFVFVQX0VORCBpcyBzZXQ6ICV4XG4iLCBfX0ZVTkNUSU9OX18sIGNzcik7CisJCURFQlVHX0VQMCgiJXM6IEVQMF9TRVRVUF9FTkQgaXMgc2V0OiAleFxuIiwgX19mdW5jX18sIGNzcik7CiAKIAkJdXNiX3NldChFUDBfQ0xSX1NFVFVQX0VORCwgVVNCX0VQMF9DU1IpOwogCkBAIC0xODk2LDcgKzE4OTYsNyBAQAogCSAqLwogCWlmIChjc3IgJiBFUDBfT1VUX1BLVF9SRFkpIHsKIAotCQlERUJVR19FUDAoIiVzOiBFUDBfT1VUX1BLVF9SRFkgaXMgc2V0OiAleFxuIiwgX19GVU5DVElPTl9fLAorCQlERUJVR19FUDAoIiVzOiBFUDBfT1VUX1BLVF9SRFkgaXMgc2V0OiAleFxuIiwgX19mdW5jX18sCiAJCQkgIGNzcik7CiAKIAkJc3dpdGNoIChkZXYtPmVwMHN0YXRlKSB7CkBAIC0xOTI2LDcgKzE5MjYsNyBAQAogCXVzYl9zZXRfaW5kZXgoMCk7CiAJY3NyID0gdXNiX3JlYWQoVVNCX0VQMF9DU1IpOwogCi0JREVCVUdfRVAwKCIlczogJXhcbiIsIF9fRlVOQ1RJT05fXywgY3NyKTsKKwlERUJVR19FUDAoIiVzOiAleFxuIiwgX19mdW5jX18sIGNzcik7CiAKIAkvKiBDbGVhciAib3V0IHBhY2tldCByZWFkeSIgKi8KIAl1c2Jfc2V0KEVQMF9DTFJfT1VULCBVU0JfRVAwX0NTUik7CkBAIC0xOTQ5LDcgKzE5NDksNyBAQAogewogCXUzMiBmcmFtZTEgPSB1c2JfcmVhZChVU0JfRlJNX05VTTEpOwkvKiBMZWFzdCBzaWduaWZpY2FudCA4IGJpdHMgKi8KIAl1MzIgZnJhbWUyID0gdXNiX3JlYWQoVVNCX0ZSTV9OVU0yKTsJLyogTW9zdCBzaWduaWZpY2FudCAzIGJpdHMgKi8KLQlERUJVRygiJXMsICVwXG4iLCBfX0ZVTkNUSU9OX18sIF9nYWRnZXQpOworCURFQlVHKCIlcywgJXBcbiIsIF9fZnVuY19fLCBfZ2FkZ2V0KTsKIAlyZXR1cm4gKChmcmFtZTIgJiAweDA3KSA8PCA4KSB8IChmcmFtZTEgJiAweGZmKTsKIH0KIApAQCAtMTk3MCw3ICsxOTcwLDcgQEAKIAogc3RhdGljIHZvaWQgbm9wX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQogewotCURFQlVHKCIlcyAlc1xuIiwgX19GVU5DVElPTl9fLCBkZXYtPmJ1c19pZCk7CisJREVCVUcoIiVzICVzXG4iLCBfX2Z1bmNfXywgZGV2LT5idXNfaWQpOwogfQogCiBzdGF0aWMgc3RydWN0IGxoN2E0MHhfdWRjIG1lbW9yeSA9IHsKQEAgLTIwNjUsNyArMjA2NSw3IEBACiAJc3RydWN0IGxoN2E0MHhfdWRjICpkZXYgPSAmbWVtb3J5OwogCWludCByZXR2YWw7CiAKLQlERUJVRygiJXM6ICVwXG4iLCBfX0ZVTkNUSU9OX18sIHBkZXYpOworCURFQlVHKCIlczogJXBcbiIsIF9fZnVuY19fLCBwZGV2KTsKIAogCXNwaW5fbG9ja19pbml0KCZkZXYtPmxvY2spOwogCWRldi0+ZGV2ID0gJnBkZXYtPmRldjsKQEAgLTIwOTgsNyArMjA5OCw3IEBACiB7CiAJc3RydWN0IGxoN2E0MHhfdWRjICpkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCURFQlVHKCIlczogJXBcbiIsIF9fRlVOQ1RJT05fXywgcGRldik7CisJREVCVUcoIiVzOiAlcFxuIiwgX19mdW5jX18sIHBkZXYpOwogCiAJaWYgKGRldi0+ZHJpdmVyKQogCQlyZXR1cm4gLUVCVVNZOwpAQCAtMjEzMSw3ICsyMTMxLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgdWRjX2luaXQodm9pZCkKIHsKLQlERUJVRygiJXM6ICVzIHZlcnNpb24gJXNcbiIsIF9fRlVOQ1RJT05fXywgZHJpdmVyX25hbWUsIERSSVZFUl9WRVJTSU9OKTsKKwlERUJVRygiJXM6ICVzIHZlcnNpb24gJXNcbiIsIF9fZnVuY19fLCBkcml2ZXJfbmFtZSwgRFJJVkVSX1ZFUlNJT04pOwogCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnVkY19kcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbTY2NTkyLXVkYy5oIGIvZHJpdmVycy91c2IvZ2FkZ2V0L202NjU5Mi11ZGMuaAppbmRleCAxN2I3OTJiLi5iZTBhNGMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvbTY2NTkyLXVkYy5oCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9tNjY1OTItdWRjLmgKQEAgLTQ4NiwxMCArNDg2LDEwIEBACiAKIAlzdHJ1Y3QgdXNiX3JlcXVlc3QJKmVwMF9yZXE7CS8qIGZvciBpbnRlcm5hbCByZXF1ZXN0ICovCiAJdTE2CQkJZXAwX2RhdGE7CS8qIGZvciBpbnRlcm5hbCByZXF1ZXN0ICovCisJdTE2CQkJb2xkX3ZidXM7CiAKIAlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsKIAotCXUxNgkJCW9sZF92YnVzOwogCWludAkJCXNjb3VudDsKIAogCWludAkJCW9sZF9kdnNxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyODAuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC9uZXQyMjgwLmgKaW5kZXggNDRjYTEzOS4uMWYyYWYzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyODAuaAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI4MC5oCkBAIC0yOTksNyArMjk5LDcgQEAKIAkJCSZlcC0+cmVncy0+ZXBfcnNwKTsKIAl9CiB9Ci0jZGVmaW5lIEFTU0VSVF9PVVRfTkFLSU5HKGVwKSBhc3NlcnRfb3V0X25ha2luZyhlcCxfX0ZVTkNUSU9OX18pCisjZGVmaW5lIEFTU0VSVF9PVVRfTkFLSU5HKGVwKSBhc3NlcnRfb3V0X25ha2luZyhlcCxfX2Z1bmNfXykKICNlbHNlCiAjZGVmaW5lIEFTU0VSVF9PVVRfTkFLSU5HKGVwKSBkbyB7fSB3aGlsZSAoMCkKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L29tYXBfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvb21hcF91ZGMuYwppbmRleCBlZTFlOWEzLi45NWY3NjYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvb21hcF91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvb21hcF91ZGMuYwpAQCAtMTYzLDcgKzE2Myw3IEBACiAJCQl8fCBlcC0+YkVuZHBvaW50QWRkcmVzcyAhPSBkZXNjLT5iRW5kcG9pbnRBZGRyZXNzCiAJCQl8fCBlcC0+bWF4cGFja2V0IDwgbGUxNl90b19jcHUKIAkJCQkJCShkZXNjLT53TWF4UGFja2V0U2l6ZSkpIHsKLQkJREJHKCIlcywgYmFkIGVwIG9yIGRlc2NyaXB0b3JcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXMsIGJhZCBlcCBvciBkZXNjcmlwdG9yXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAltYXhwID0gbGUxNl90b19jcHUgKGRlc2MtPndNYXhQYWNrZXRTaXplKTsKQEAgLTE3MSw3ICsxNzEsNyBAQAogCQkJCSYmIG1heHAgIT0gZXAtPm1heHBhY2tldCkKIAkJCXx8IGxlMTZfdG9fY3B1KGRlc2MtPndNYXhQYWNrZXRTaXplKSA+IGVwLT5tYXhwYWNrZXQKIAkJCXx8ICFkZXNjLT53TWF4UGFja2V0U2l6ZSkgewotCQlEQkcoIiVzLCBiYWQgJXMgbWF4cGFja2V0XG4iLCBfX0ZVTkNUSU9OX18sIF9lcC0+bmFtZSk7CisJCURCRygiJXMsIGJhZCAlcyBtYXhwYWNrZXRcbiIsIF9fZnVuY19fLCBfZXAtPm5hbWUpOwogCQlyZXR1cm4gLUVSQU5HRTsKIAl9CiAKQEAgLTE5NCwxMyArMTk0LDEzIEBACiAJaWYgKGVwLT5ibUF0dHJpYnV0ZXMgIT0gZGVzYy0+Ym1BdHRyaWJ1dGVzCiAJCQkmJiBlcC0+Ym1BdHRyaWJ1dGVzICE9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEsKIAkJCSYmIGRlc2MtPmJtQXR0cmlidXRlcyAhPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQpIHsKLQkJREJHKCIlcywgJXMgdHlwZSBtaXNtYXRjaFxuIiwgX19GVU5DVElPTl9fLCBfZXAtPm5hbWUpOworCQlEQkcoIiVzLCAlcyB0eXBlIG1pc21hdGNoXG4iLCBfX2Z1bmNfXywgX2VwLT5uYW1lKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJdWRjID0gZXAtPnVkYzsKIAlpZiAoIXVkYy0+ZHJpdmVyIHx8IHVkYy0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKSB7Ci0JCURCRygiJXMsIGJvZ3VzIGRldmljZSBzdGF0ZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlcywgYm9ndXMgZGV2aWNlIHN0YXRlXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRVNIVVRET1dOOwogCX0KIApAQCAtMjQ5LDcgKzI0OSw3IEBACiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAogCWlmICghX2VwIHx8ICFlcC0+ZGVzYykgewotCQlEQkcoIiVzLCAlcyBub3QgZW5hYmxlZFxuIiwgX19GVU5DVElPTl9fLAorCQlEQkcoIiVzLCAlcyBub3QgZW5hYmxlZFxuIiwgX19mdW5jX18sCiAJCQlfZXAgPyBlcC0+ZXAubmFtZSA6IE5VTEwpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC05MzYsMTEgKzkzNiwxMSBAQAogCS8qIGNhdGNoIHZhcmlvdXMgYm9ndXMgcGFyYW1ldGVycyAqLwogCWlmICghX3JlcSB8fCAhcmVxLT5yZXEuY29tcGxldGUgfHwgIXJlcS0+cmVxLmJ1ZgogCQkJfHwgIWxpc3RfZW1wdHkoJnJlcS0+cXVldWUpKSB7Ci0JCURCRygiJXMsIGJhZCBwYXJhbXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXMsIGJhZCBwYXJhbXNcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmICghX2VwIHx8ICghZXAtPmRlc2MgJiYgZXAtPmJFbmRwb2ludEFkZHJlc3MpKSB7Ci0JCURCRygiJXMsIGJhZCBlcFxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlcywgYmFkIGVwXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAoZXAtPmJtQXR0cmlidXRlcyA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DKSB7CkBAIC05NTksNyArOTU5LDcgQEAKIAkJCSYmIChlcC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pID09IDAKIAkJCSYmICFjcHVfY2xhc3NfaXNfb21hcDIoKQogCQkJJiYgKHJlcS0+cmVxLmxlbmd0aCAlIGVwLT5lcC5tYXhwYWNrZXQpICE9IDApIHsKLQkJREJHKCIlcywgbm8gcGFydGlhbCBwYWNrZXQgT1VUIHJlYWRzXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzLCBubyBwYXJ0aWFsIHBhY2tldCBPVVQgcmVhZHNcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAl9CiAKQEAgLTEyNjUsOCArMTI2NSw2IEBACiAKIHN0YXRpYyB2b2lkIHB1bGx1cF9lbmFibGUoc3RydWN0IG9tYXBfdWRjICp1ZGMpCiB7Ci0JdWRjLT5nYWRnZXQuZGV2LnBhcmVudC0+cG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOwotCXVkYy0+Z2FkZ2V0LmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CiAJVURDX1NZU0NPTjFfUkVHIHw9IFVEQ19QVUxMVVBfRU47CiAJaWYgKCFnYWRnZXRfaXNfb3RnKCZ1ZGMtPmdhZGdldCkgJiYgIWNwdV9pc19vbWFwMTV4eCgpKQogCQlPVEdfQ1RSTF9SRUcgfD0gT1RHX0JTRVNTVkxEOwpAQCAtMzA2MSw4ICszMDU5LDYgQEAKIAkJb21hcF9wdWxsdXAoJnVkYy0+Z2FkZ2V0LCAwKTsKIAl9CiAKLQl1ZGMtPmdhZGdldC5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX1NVU1BFTkQ7Ci0JdWRjLT5nYWRnZXQuZGV2LnBhcmVudC0+cG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX1NVU1BFTkQ7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9wcmludGVyLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHJpbnRlci5jCmluZGV4IDJjMzJiZDAuLjc2YmU3NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9wcmludGVyLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3ByaW50ZXIuYwpAQCAtMzkwLDkgKzM5MCwxMiBAQAogCiAJLyogbm9ybWFsIGNvbXBsZXRpb24gKi8KIAljYXNlIDA6Ci0JCWxpc3RfYWRkX3RhaWwoJnJlcS0+bGlzdCwgJmRldi0+cnhfYnVmZmVycyk7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT5yeF93YWl0KTsKLQkJREJHKGRldiwgIkdfUHJpbnRlciA6IHJ4IGxlbmd0aCAlZFxuIiwgcmVxLT5hY3R1YWwpOworCQlpZiAocmVxLT5hY3R1YWwgPiAwKSB7CisJCQlsaXN0X2FkZF90YWlsKCZyZXEtPmxpc3QsICZkZXYtPnJ4X2J1ZmZlcnMpOworCQkJREJHKGRldiwgIkdfUHJpbnRlciA6IHJ4IGxlbmd0aCAlZFxuIiwgcmVxLT5hY3R1YWwpOworCQl9IGVsc2UgeworCQkJbGlzdF9hZGQoJnJlcS0+bGlzdCwgJmRldi0+cnhfcmVxcyk7CisJCX0KIAkJYnJlYWs7CiAKIAkvKiBzb2Z0d2FyZS1kcml2ZW4gaW50ZXJmYWNlIHNodXRkb3duICovCkBAIC00MTcsNiArNDIwLDggQEAKIAkJbGlzdF9hZGQoJnJlcS0+bGlzdCwgJmRldi0+cnhfcmVxcyk7CiAJCWJyZWFrOwogCX0KKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT5yeF93YWl0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKIH0KIApAQCAtNDk0LDYgKzQ5OSwzOSBAQAogCXJldHVybiAwOwogfQogCisvKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyB0dXJuZWQgb2ZmLiAqLworc3RhdGljIHZvaWQKK3NldHVwX3J4X3JlcXMoc3RydWN0IHByaW50ZXJfZGV2ICpkZXYpCit7CisJc3RydWN0IHVzYl9yZXF1ZXN0ICAgICAgICAgICAgICAqcmVxOworCisJd2hpbGUgKGxpa2VseSghbGlzdF9lbXB0eSgmZGV2LT5yeF9yZXFzKSkpIHsKKwkJaW50IGVycm9yOworCisJCXJlcSA9IGNvbnRhaW5lcl9vZihkZXYtPnJ4X3JlcXMubmV4dCwKKwkJCQlzdHJ1Y3QgdXNiX3JlcXVlc3QsIGxpc3QpOworCQlsaXN0X2RlbF9pbml0KCZyZXEtPmxpc3QpOworCisJCS8qIFRoZSBVU0IgSG9zdCBzZW5kcyB1cyB3aGF0ZXZlciBhbW91bnQgb2YgZGF0YSBpdCB3YW50cyB0bworCQkgKiBzbyB3ZSBhbHdheXMgc2V0IHRoZSBsZW5ndGggZmllbGQgdG8gdGhlIGZ1bGwgVVNCX0JVRlNJWkUuCisJCSAqIElmIHRoZSBhbW91bnQgb2YgZGF0YSBpcyBtb3JlIHRoYW4gdGhlIHJlYWQoKSBjYWxsZXIgYXNrZWQKKwkJICogZm9yIGl0IHdpbGwgYmUgc3RvcmVkIGluIHRoZSByZXF1ZXN0IGJ1ZmZlciB1bnRpbCBpdCBpcworCQkgKiBhc2tlZCBmb3IgYnkgcmVhZCgpLgorCQkgKi8KKwkJcmVxLT5sZW5ndGggPSBVU0JfQlVGU0laRTsKKwkJcmVxLT5jb21wbGV0ZSA9IHJ4X2NvbXBsZXRlOworCisJCWVycm9yID0gdXNiX2VwX3F1ZXVlKGRldi0+b3V0X2VwLCByZXEsIEdGUF9BVE9NSUMpOworCQlpZiAoZXJyb3IpIHsKKwkJCURCRyhkZXYsICJyeCBzdWJtaXQgLS0+ICVkXG4iLCBlcnJvcik7CisJCQlsaXN0X2FkZCgmcmVxLT5saXN0LCAmZGV2LT5yeF9yZXFzKTsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJbGlzdF9hZGQoJnJlcS0+bGlzdCwgJmRldi0+cnhfcmVxc19hY3RpdmUpOworCQl9CisJfQorfQorCiBzdGF0aWMgc3NpemVfdAogcHJpbnRlcl9yZWFkKHN0cnVjdCBmaWxlICpmZCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgbG9mZl90ICpwdHIpCiB7CkBAIC01MjIsMzEgKzU2MCw3IEBACiAJICovCiAJZGV2LT5yZXNldF9wcmludGVyID0gMDsKIAotCXdoaWxlIChsaWtlbHkoIWxpc3RfZW1wdHkoJmRldi0+cnhfcmVxcykpKSB7Ci0JCWludCBlcnJvcjsKLQotCQlyZXEgPSBjb250YWluZXJfb2YoZGV2LT5yeF9yZXFzLm5leHQsCi0JCQkJc3RydWN0IHVzYl9yZXF1ZXN0LCBsaXN0KTsKLQkJbGlzdF9kZWxfaW5pdCgmcmVxLT5saXN0KTsKLQotCQkvKiBUaGUgVVNCIEhvc3Qgc2VuZHMgdXMgd2hhdGV2ZXIgYW1vdW50IG9mIGRhdGEgaXQgd2FudHMgdG8KLQkJICogc28gd2UgYWx3YXlzIHNldCB0aGUgbGVuZ3RoIGZpZWxkIHRvIHRoZSBmdWxsIFVTQl9CVUZTSVpFLgotCQkgKiBJZiB0aGUgYW1vdW50IG9mIGRhdGEgaXMgbW9yZSB0aGFuIHRoZSByZWFkKCkgY2FsbGVyIGFza2VkCi0JCSAqIGZvciBpdCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgcmVxdWVzdCBidWZmZXIgdW50aWwgaXQgaXMKLQkJICogYXNrZWQgZm9yIGJ5IHJlYWQoKS4KLQkJICovCi0JCXJlcS0+bGVuZ3RoID0gVVNCX0JVRlNJWkU7Ci0JCXJlcS0+Y29tcGxldGUgPSByeF9jb21wbGV0ZTsKLQotCQllcnJvciA9IHVzYl9lcF9xdWV1ZShkZXYtPm91dF9lcCwgcmVxLCBHRlBfQVRPTUlDKTsKLQkJaWYgKGVycm9yKSB7Ci0JCQlEQkcoZGV2LCAicnggc3VibWl0IC0tPiAlZFxuIiwgZXJyb3IpOwotCQkJbGlzdF9hZGQoJnJlcS0+bGlzdCwgJmRldi0+cnhfcmVxcyk7Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZkZXYtPnJ4X3JlcXNfYWN0aXZlKTsKLQkJfQotCX0KKwlzZXR1cF9yeF9yZXFzKGRldik7CiAKIAlieXRlc19jb3BpZWQgPSAwOwogCWN1cnJlbnRfcnhfcmVxID0gZGV2LT5jdXJyZW50X3J4X3JlcTsKQEAgLTYxNSw5ICs2MjksOSBAQAogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxvY2ssIGZsYWdzKTsKIAotCQkvKiBXZSd2ZSBkaXNjb25uZWN0ZWQgb3IgcmVzZXQgZnJlZSB0aGUgcmVxIGFuZCBidWZmZXIgKi8KKwkJLyogV2UndmUgZGlzY29ubmVjdGVkIG9yIHJlc2V0IHNvIHJldHVybi4gKi8KIAkJaWYgKGRldi0+cmVzZXRfcHJpbnRlcikgewotCQkJcHJpbnRlcl9yZXFfZnJlZShkZXYtPm91dF9lcCwgY3VycmVudF9yeF9yZXEpOworCQkJbGlzdF9hZGQoJmN1cnJlbnRfcnhfcmVxLT5saXN0LCAmZGV2LT5yeF9yZXFzKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOwogCQkJc3Bpbl91bmxvY2soJmRldi0+bG9ja19wcmludGVyX2lvKTsKIAkJCXJldHVybiAtRUFHQUlOOwpAQCAtNzM1LDcgKzc0OSw3IEBACiAKIAkJLyogV2UndmUgZGlzY29ubmVjdGVkIG9yIHJlc2V0IHNvIGZyZWUgdGhlIHJlcSBhbmQgYnVmZmVyICovCiAJCWlmIChkZXYtPnJlc2V0X3ByaW50ZXIpIHsKLQkJCXByaW50ZXJfcmVxX2ZyZWUoZGV2LT5pbl9lcCwgcmVxKTsKKwkJCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZkZXYtPnR4X3JlcXMpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CiAJCQlzcGluX3VubG9jaygmZGV2LT5sb2NrX3ByaW50ZXJfaW8pOwogCQkJcmV0dXJuIC1FQUdBSU47CkBAIC03OTEsNiArODA1LDEyIEBACiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAJaW50CQkJc3RhdHVzID0gMDsKIAorCXNwaW5fbG9jaygmZGV2LT5sb2NrX3ByaW50ZXJfaW8pOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKwlzZXR1cF9yeF9yZXFzKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2soJmRldi0+bG9ja19wcmludGVyX2lvKTsKKwogCXBvbGxfd2FpdChmZCwgJmRldi0+cnhfd2FpdCwgd2FpdCk7CiAJcG9sbF93YWl0KGZkLCAmZGV2LT50eF93YWl0LCB3YWl0KTsKIApAQCAtNzk4LDcgKzgxOCw4IEBACiAJaWYgKGxpa2VseSghbGlzdF9lbXB0eSgmZGV2LT50eF9yZXFzKSkpCiAJCXN0YXR1cyB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKIAotCWlmIChsaWtlbHkoIWxpc3RfZW1wdHkoJmRldi0+cnhfYnVmZmVycykpKQorCWlmIChsaWtlbHkoZGV2LT5jdXJyZW50X3J4X2J5dGVzKSB8fAorCQkJbGlrZWx5KCFsaXN0X2VtcHR5KCZkZXYtPnJ4X2J1ZmZlcnMpKSkKIAkJc3RhdHVzIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKQEAgLTg5NCw3ICs5MTUsNyBAQAogCWlmIChkZXYtPmludGVyZmFjZSA8IDApCiAJCXJldHVybjsKIAotCURCRyhkZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlEQkcoZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAogCWlmIChkZXYtPmluKQogCQl1c2JfZXBfZGlzYWJsZShkZXYtPmluX2VwKTsKQEAgLTEwODQsNiArMTEwNSw3IEBACiAJaWYgKHVzYl9lcF9lbmFibGUoZGV2LT5vdXRfZXAsIGRldi0+b3V0KSkKIAkJREJHKGRldiwgIkZhaWxlZCB0byBlbmFibGUgVVNCIG91dF9lcFxuIik7CiAKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+cnhfd2FpdCk7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPnR4X3dhaXQpOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT50eF9mbHVzaF93YWl0KTsKIH0KQEAgLTEyNjIsNyArMTI4NCw3IEBACiAJc3RydWN0IHByaW50ZXJfZGV2CSpkZXYgPSBnZXRfZ2FkZ2V0X2RhdGEoZ2FkZ2V0KTsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAotCURCRyhkZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlEQkcoZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxvY2ssIGZsYWdzKTsKIApAQCAtMTI3OCw3ICsxMzAwLDcgQEAKIAlzdHJ1Y3QgdXNiX3JlcXVlc3QJKnJlcTsKIAogCi0JREJHKGRldiwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCURCRyhkZXYsICIlc1xuIiwgX19mdW5jX18pOwogCiAJLyogUmVtb3ZlIHN5c2ZzIGZpbGVzICovCiAJZGV2aWNlX2Rlc3Ryb3kodXNiX2dhZGdldF9jbGFzcywgZ19wcmludGVyX2Rldm5vKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyeHhfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMnh4X3VkYy5jCmluZGV4IGMwMGNkOGIuLjA4ZjY5OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyeHhfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTJ4eF91ZGMuYwpAQCAtMjM1LDcgKzIzNSw3IEBACiAJCQl8fCBlcC0+YkVuZHBvaW50QWRkcmVzcyAhPSBkZXNjLT5iRW5kcG9pbnRBZGRyZXNzCiAJCQl8fCBlcC0+Zmlmb19zaXplIDwgbGUxNl90b19jcHUKIAkJCQkJCShkZXNjLT53TWF4UGFja2V0U2l6ZSkpIHsKLQkJRE1TRygiJXMsIGJhZCBlcCBvciBkZXNjcmlwdG9yXG4iLCBfX0ZVTkNUSU9OX18pOworCQlETVNHKCIlcywgYmFkIGVwIG9yIGRlc2NyaXB0b3JcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yNDMsNyArMjQzLDcgQEAKIAlpZiAoZXAtPmJtQXR0cmlidXRlcyAhPSBkZXNjLT5ibUF0dHJpYnV0ZXMKIAkJCSYmIGVwLT5ibUF0dHJpYnV0ZXMgIT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSwogCQkJJiYgZGVzYy0+Ym1BdHRyaWJ1dGVzICE9IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkgewotCQlETVNHKCIlcywgJXMgdHlwZSBtaXNtYXRjaFxuIiwgX19GVU5DVElPTl9fLCBfZXAtPm5hbWUpOworCQlETVNHKCIlcywgJXMgdHlwZSBtaXNtYXRjaFxuIiwgX19mdW5jX18sIF9lcC0+bmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjUyLDEzICsyNTIsMTMgQEAKIAkJCQkmJiBsZTE2X3RvX2NwdSAoZGVzYy0+d01heFBhY2tldFNpemUpCiAJCQkJCQkhPSBCVUxLX0ZJRk9fU0laRSkKIAkJCXx8ICFkZXNjLT53TWF4UGFja2V0U2l6ZSkgewotCQlETVNHKCIlcywgYmFkICVzIG1heHBhY2tldFxuIiwgX19GVU5DVElPTl9fLCBfZXAtPm5hbWUpOworCQlETVNHKCIlcywgYmFkICVzIG1heHBhY2tldFxuIiwgX19mdW5jX18sIF9lcC0+bmFtZSk7CiAJCXJldHVybiAtRVJBTkdFOwogCX0KIAogCWRldiA9IGVwLT5kZXY7CiAJaWYgKCFkZXYtPmRyaXZlciB8fCBkZXYtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTikgewotCQlETVNHKCIlcywgYm9ndXMgZGV2aWNlIHN0YXRlXG4iLCBfX0ZVTkNUSU9OX18pOworCQlETVNHKCIlcywgYm9ndXMgZGV2aWNlIHN0YXRlXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRVNIVVRET1dOOwogCX0KIApAQCAtMjgzLDcgKzI4Myw3IEBACiAKIAllcCA9IGNvbnRhaW5lcl9vZiAoX2VwLCBzdHJ1Y3QgcHhhMnh4X2VwLCBlcCk7CiAJaWYgKCFfZXAgfHwgIWVwLT5kZXNjKSB7Ci0JCURNU0coIiVzLCAlcyBub3QgZW5hYmxlZFxuIiwgX19GVU5DVElPTl9fLAorCQlETVNHKCIlcywgJXMgbm90IGVuYWJsZWRcbiIsIF9fZnVuY19fLAogCQkJX2VwID8gZXAtPmVwLm5hbWUgOiBOVUxMKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNDYxLDcgKzQ2MSw3IEBACiAJVVNJUjAgPSBVU0lSMF9JUjA7CiAJZGV2LT5yZXFfcGVuZGluZyA9IDA7CiAJREJHKERCR19WRVJZX05PSVNZLCAiJXMgJXMsICUwMngvJTAyeFxuIiwKLQkJX19GVU5DVElPTl9fLCB0YWcsIFVEQ0NTMCwgZmxhZ3MpOworCQlfX2Z1bmNfXywgdGFnLCBVRENDUzAsIGZsYWdzKTsKIH0KIAogc3RhdGljIGludApAQCAtNjUxLDIwICs2NTEsMjAgQEAKIAlyZXEgPSBjb250YWluZXJfb2YoX3JlcSwgc3RydWN0IHB4YTJ4eF9yZXF1ZXN0LCByZXEpOwogCWlmICh1bmxpa2VseSAoIV9yZXEgfHwgIV9yZXEtPmNvbXBsZXRlIHx8ICFfcmVxLT5idWYKIAkJCXx8ICFsaXN0X2VtcHR5KCZyZXEtPnF1ZXVlKSkpIHsKLQkJRE1TRygiJXMsIGJhZCBwYXJhbXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURNU0coIiVzLCBiYWQgcGFyYW1zXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWVwID0gY29udGFpbmVyX29mKF9lcCwgc3RydWN0IHB4YTJ4eF9lcCwgZXApOwogCWlmICh1bmxpa2VseSAoIV9lcCB8fCAoIWVwLT5kZXNjICYmIGVwLT5lcC5uYW1lICE9IGVwMG5hbWUpKSkgewotCQlETVNHKCIlcywgYmFkIGVwXG4iLCBfX0ZVTkNUSU9OX18pOworCQlETVNHKCIlcywgYmFkIGVwXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWRldiA9IGVwLT5kZXY7CiAJaWYgKHVubGlrZWx5ICghZGV2LT5kcml2ZXIKIAkJCXx8IGRldi0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKSkgewotCQlETVNHKCIlcywgYm9ndXMgZGV2aWNlIHN0YXRlXG4iLCBfX0ZVTkNUSU9OX18pOworCQlETVNHKCIlcywgYm9ndXMgZGV2aWNlIHN0YXRlXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRVNIVVRET1dOOwogCX0KIApAQCAtODA3LDcgKzgwNyw3IEBACiAJaWYgKHVubGlrZWx5ICghX2VwCiAJCQl8fCAoIWVwLT5kZXNjICYmIGVwLT5lcC5uYW1lICE9IGVwMG5hbWUpKQogCQkJfHwgZXAtPmJtQXR0cmlidXRlcyA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DKSB7Ci0JCURNU0coIiVzLCBiYWQgZXBcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURNU0coIiVzLCBiYWQgZXBcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmICh2YWx1ZSA9PSAwKSB7CkBAIC04NTksNyArODU5LDcgQEAKIAogCWVwID0gY29udGFpbmVyX29mKF9lcCwgc3RydWN0IHB4YTJ4eF9lcCwgZXApOwogCWlmICghX2VwKSB7Ci0JCURNU0coIiVzLCBiYWQgZXBcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURNU0coIiVzLCBiYWQgZXBcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCS8qIHB4YSBjYW4ndCByZXBvcnQgdW5jbGFpbWVkIGJ5dGVzIGZyb20gSU4gZmlmb3MgKi8KQEAgLTg3OCw3ICs4NzgsNyBAQAogCiAJZXAgPSBjb250YWluZXJfb2YoX2VwLCBzdHJ1Y3QgcHhhMnh4X2VwLCBlcCk7CiAJaWYgKCFfZXAgfHwgZXAtPmVwLm5hbWUgPT0gZXAwbmFtZSB8fCAhbGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSkgewotCQlETVNHKCIlcywgYmFkIGVwXG4iLCBfX0ZVTkNUSU9OX18pOworCQlETVNHKCIlcywgYmFkIGVwXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE4MTMsNyArMTgxMyw3IEBACiAKIHN0YXRpYyB2b2lkIG5vcF9yZWxlYXNlIChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JRE1TRygiJXMgJXNcbiIsIF9fRlVOQ1RJT05fXywgZGV2LT5idXNfaWQpOworCURNU0coIiVzICVzXG4iLCBfX2Z1bmNfXywgZGV2LT5idXNfaWQpOwogfQogCiAvKiB0aGlzIHVzZXMgbG9hZC10aW1lIGFsbG9jYXRpb24gYW5kIGluaXRpYWxpemF0aW9uIChpbnN0ZWFkIG9mCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvcm5kaXMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9ybmRpcy5jCmluZGV4IDNkMDM2NjQuLmJkNThkZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9ybmRpcy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9ybmRpcy5jCkBAIC0yMDQsNyArMjA0LDcgQEAKIAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEX0dFTl9TVVBQT1JURURfTElTVDoKLQkJREJHKCIlczogT0lEX0dFTl9TVVBQT1JURURfTElTVFxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEX0dFTl9TVVBQT1JURURfTElTVFxuIiwgX19mdW5jX18pOwogCQlsZW5ndGggPSBzaXplb2YgKG9pZF9zdXBwb3J0ZWRfbGlzdCk7CiAJCWNvdW50ICA9IGxlbmd0aCAvIHNpemVvZiAodTMyKTsKIAkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCkBAIC0yMTQsNyArMjE0LDcgQEAKIAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEX0dFTl9IQVJEV0FSRV9TVEFUVVM6Ci0JCURCRygiJXM6IE9JRF9HRU5fSEFSRFdBUkVfU1RBVFVTXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfR0VOX0hBUkRXQVJFX1NUQVRVU1xuIiwgX19mdW5jX18pOwogCQkvKiBCb2d1cyBxdWVzdGlvbiEKIAkJICogSGFyZHdhcmUgbXVzdCBiZSByZWFkeSB0byByZWNlaXZlIGhpZ2ggbGV2ZWwgcHJvdG9jb2xzLgogCQkgKiBCVFc6CkBAIC0yMjcsMTQgKzIyNywxNCBAQAogCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX01FRElBX1NVUFBPUlRFRDoKLQkJREJHKCIlczogT0lEX0dFTl9NRURJQV9TVVBQT1JURURcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF9HRU5fTUVESUFfU1VQUE9SVEVEXG4iLCBfX2Z1bmNfXyk7CiAJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5tZWRpdW0pOwogCQlyZXR2YWwgPSAwOwogCQlicmVhazsKIAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEX0dFTl9NRURJQV9JTl9VU0U6Ci0JCURCRygiJXM6IE9JRF9HRU5fTUVESUFfSU5fVVNFXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfR0VOX01FRElBX0lOX1VTRVxuIiwgX19mdW5jX18pOwogCQkvKiBvbmUgbWVkaXVtLCBvbmUgdHJhbnNwb3J0Li4uIChtYXliZSB5b3UgZG8gaXQgYmV0dGVyKSAqLwogCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0ubWVkaXVtKTsKIAkJcmV0dmFsID0gMDsKQEAgLTI0Miw3ICsyNDIsNyBAQAogCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX01BWElNVU1fRlJBTUVfU0laRToKLQkJREJHKCIlczogT0lEX0dFTl9NQVhJTVVNX0ZSQU1FX1NJWkVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF9HRU5fTUFYSU1VTV9GUkFNRV9TSVpFXG4iLCBfX2Z1bmNfXyk7CiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLmRldikgewogCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyICgKIAkJCQlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLmRldi0+bXR1KTsKQEAgLTI1Myw3ICsyNTMsNyBAQAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEX0dFTl9MSU5LX1NQRUVEOgogCQlpZiAocm5kaXNfZGVidWcgPiAxKQotCQkJREJHKCIlczogT0lEX0dFTl9MSU5LX1NQRUVEXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJREJHKCIlczogT0lEX0dFTl9MSU5LX1NQRUVEXG4iLCBfX2Z1bmNfXyk7CiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLm1lZGlhX3N0YXRlCiAJCQkJPT0gTkRJU19NRURJQV9TVEFURV9ESVNDT05ORUNURUQpCiAJCQkqb3V0YnVmID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7CkBAIC0yNjUsNyArMjY1LDcgQEAKIAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEX0dFTl9UUkFOU01JVF9CTE9DS19TSVpFOgotCQlEQkcoIiVzOiBPSURfR0VOX1RSQU5TTUlUX0JMT0NLX1NJWkVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF9HRU5fVFJBTlNNSVRfQkxPQ0tfU0laRVxuIiwgX19mdW5jX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5kZXYpIHsKIAkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAoCiAJCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5kZXYtPm10dSk7CkBAIC0yNzUsNyArMjc1LDcgQEAKIAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEX0dFTl9SRUNFSVZFX0JMT0NLX1NJWkU6Ci0JCURCRygiJXM6IE9JRF9HRU5fUkVDRUlWRV9CTE9DS19TSVpFXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfR0VOX1JFQ0VJVkVfQkxPQ0tfU0laRVxuIiwgX19mdW5jX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5kZXYpIHsKIAkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAoCiAJCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5kZXYtPm10dSk7CkBAIC0yODUsNyArMjg1LDcgQEAKIAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEX0dFTl9WRU5ET1JfSUQ6Ci0JCURCRygiJXM6IE9JRF9HRU5fVkVORE9SX0lEXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfR0VOX1ZFTkRPUl9JRFxuIiwgX19mdW5jX18pOwogCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKAogCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS52ZW5kb3JJRCk7CiAJCXJldHZhbCA9IDA7CkBAIC0yOTMsNyArMjkzLDcgQEAKIAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEX0dFTl9WRU5ET1JfREVTQ1JJUFRJT046Ci0JCURCRygiJXM6IE9JRF9HRU5fVkVORE9SX0RFU0NSSVBUSU9OXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfR0VOX1ZFTkRPUl9ERVNDUklQVElPTlxuIiwgX19mdW5jX18pOwogCQlsZW5ndGggPSBzdHJsZW4gKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0udmVuZG9yRGVzY3IpOwogCQltZW1jcHkgKG91dGJ1ZiwKIAkJCXJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0udmVuZG9yRGVzY3IsIGxlbmd0aCk7CkBAIC0zMDEsNyArMzAxLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIE9JRF9HRU5fVkVORE9SX0RSSVZFUl9WRVJTSU9OOgotCQlEQkcoIiVzOiBPSURfR0VOX1ZFTkRPUl9EUklWRVJfVkVSU0lPTlxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEX0dFTl9WRU5ET1JfRFJJVkVSX1ZFUlNJT05cbiIsIF9fZnVuY19fKTsKIAkJLyogQ3JlYXRlZCBhcyBMRSAqLwogCQkqb3V0YnVmID0gcm5kaXNfZHJpdmVyX3ZlcnNpb247CiAJCXJldHZhbCA9IDA7CkBAIC0zMDksMTQgKzMwOSwxNCBAQAogCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX0NVUlJFTlRfUEFDS0VUX0ZJTFRFUjoKLQkJREJHKCIlczogT0lEX0dFTl9DVVJSRU5UX1BBQ0tFVF9GSUxURVJcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF9HRU5fQ1VSUkVOVF9QQUNLRVRfRklMVEVSXG4iLCBfX2Z1bmNfXyk7CiAJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAoKnJuZGlzX3Blcl9kZXZfcGFyYW1zW2NvbmZpZ05yXS5maWx0ZXIpOwogCQlyZXR2YWwgPSAwOwogCQlicmVhazsKIAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEX0dFTl9NQVhJTVVNX1RPVEFMX1NJWkU6Ci0JCURCRygiJXM6IE9JRF9HRU5fTUFYSU1VTV9UT1RBTF9TSVpFXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfR0VOX01BWElNVU1fVE9UQUxfU0laRVxuIiwgX19mdW5jX18pOwogCQkqb3V0YnVmID0gX19jb25zdGFudF9jcHVfdG9fbGUzMihSTkRJU19NQVhfVE9UQUxfU0laRSk7CiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwpAQCAtMzI0LDE0ICszMjQsMTQgQEAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF9HRU5fTUVESUFfQ09OTkVDVF9TVEFUVVM6CiAJCWlmIChybmRpc19kZWJ1ZyA+IDEpCi0JCQlEQkcoIiVzOiBPSURfR0VOX01FRElBX0NPTk5FQ1RfU1RBVFVTXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJREJHKCIlczogT0lEX0dFTl9NRURJQV9DT05ORUNUX1NUQVRVU1xuIiwgX19mdW5jX18pOwogCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KIAkJCQkJCS5tZWRpYV9zdGF0ZSk7CiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwogCiAJY2FzZSBPSURfR0VOX1BIWVNJQ0FMX01FRElVTToKLQkJREJHKCIlczogT0lEX0dFTl9QSFlTSUNBTF9NRURJVU1cbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF9HRU5fUEhZU0lDQUxfTUVESVVNXG4iLCBfX2Z1bmNfXyk7CiAJCSpvdXRidWYgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CkBAIC0zNDEsNyArMzQxLDcgQEAKIAkgKiB2ZXJzaW9ucyBlbWl0IHVuZGVmaW5lZCBSTkRJUyBtZXNzYWdlcy4gRE9DVU1FTlQgQUxMIFRIRVNFIQogCSAqLwogCWNhc2UgT0lEX0dFTl9NQUNfT1BUSU9OUzoJCS8qIGZyb20gV2luTUUgKi8KLQkJREJHKCIlczogT0lEX0dFTl9NQUNfT1BUSU9OU1xuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEX0dFTl9NQUNfT1BUSU9OU1xuIiwgX19mdW5jX18pOwogCQkqb3V0YnVmID0gX19jb25zdGFudF9jcHVfdG9fbGUzMigKIAkJCSAgTkRJU19NQUNfT1BUSU9OX1JFQ0VJVkVfU0VSSUFMSVpFRAogCQkJfCBORElTX01BQ19PUFRJT05fRlVMTF9EVVBMRVgpOwpAQCAtMzUzLDcgKzM1Myw3IEBACiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX1hNSVRfT0s6CiAJCWlmIChybmRpc19kZWJ1ZyA+IDEpCi0JCQlEQkcoIiVzOiBPSURfR0VOX1hNSVRfT0tcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlEQkcoIiVzOiBPSURfR0VOX1hNSVRfT0tcbiIsIF9fZnVuY19fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMpIHsKIAkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAoCiAJCQkgICAgcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cy0+dHhfcGFja2V0cyAtCkBAIC0zNjYsNyArMzY2LDcgQEAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF9HRU5fUkNWX09LOgogCQlpZiAocm5kaXNfZGVidWcgPiAxKQotCQkJREJHKCIlczogT0lEX0dFTl9SQ1ZfT0tcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlEQkcoIiVzOiBPSURfR0VOX1JDVl9PS1xuIiwgX19mdW5jX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cykgewogCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyICgKIAkJCSAgICBybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzLT5yeF9wYWNrZXRzIC0KQEAgLTM3OSw3ICszNzksNyBAQAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEX0dFTl9YTUlUX0VSUk9SOgogCQlpZiAocm5kaXNfZGVidWcgPiAxKQotCQkJREJHKCIlczogT0lEX0dFTl9YTUlUX0VSUk9SXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJREJHKCIlczogT0lEX0dFTl9YTUlUX0VSUk9SXG4iLCBfX2Z1bmNfXyk7CiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzKSB7CiAJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KIAkJCQkJLnN0YXRzLT50eF9lcnJvcnMpOwpAQCAtMzkwLDcgKzM5MCw3IEBACiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX1JDVl9FUlJPUjoKIAkJaWYgKHJuZGlzX2RlYnVnID4gMSkKLQkJCURCRygiJXM6IE9JRF9HRU5fUkNWX0VSUk9SXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJREJHKCIlczogT0lEX0dFTl9SQ1ZfRVJST1JcbiIsIF9fZnVuY19fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMpIHsKIAkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQogCQkJCQkuc3RhdHMtPnJ4X2Vycm9ycyk7CkBAIC00MDAsNyArNDAwLDcgQEAKIAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEX0dFTl9SQ1ZfTk9fQlVGRkVSOgotCQlEQkcoIiVzOiBPSURfR0VOX1JDVl9OT19CVUZGRVJcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF9HRU5fUkNWX05PX0JVRkZFUlxuIiwgX19mdW5jX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cykgewogCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCiAJCQkJCS5zdGF0cy0+cnhfZHJvcHBlZCk7CkBAIC00MTAsNyArNDEwLDcgQEAKIAogI2lmZGVmCVJORElTX09QVElPTkFMX1NUQVRTCiAJY2FzZSBPSURfR0VOX0RJUkVDVEVEX0JZVEVTX1hNSVQ6Ci0JCURCRygiJXM6IE9JRF9HRU5fRElSRUNURURfQllURVNfWE1JVFxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEX0dFTl9ESVJFQ1RFRF9CWVRFU19YTUlUXG4iLCBfX2Z1bmNfXyk7CiAJCS8qCiAJCSAqIEF1bnQgVGlsbHkncyBzaXplIG9mIHNob2VzCiAJCSAqIG1pbnVzIGFudGFyY3RpY2EgY291bnQgb2YgcGVuZ3VpbnMKQEAgLTQzMCw3ICs0MzAsNyBAQAogCQlicmVhazsKIAogCWNhc2UgT0lEX0dFTl9ESVJFQ1RFRF9GUkFNRVNfWE1JVDoKLQkJREJHKCIlczogT0lEX0dFTl9ESVJFQ1RFRF9GUkFNRVNfWE1JVFxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEX0dFTl9ESVJFQ1RFRF9GUkFNRVNfWE1JVFxuIiwgX19mdW5jX18pOwogCQkvKiBkaXRvICovCiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzKSB7CiAJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKApAQCAtNDQ2LDcgKzQ0Niw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBPSURfR0VOX01VTFRJQ0FTVF9CWVRFU19YTUlUOgotCQlEQkcoIiVzOiBPSURfR0VOX01VTFRJQ0FTVF9CWVRFU19YTUlUXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfR0VOX01VTFRJQ0FTVF9CWVRFU19YTUlUXG4iLCBfX2Z1bmNfXyk7CiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzKSB7CiAJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KIAkJCQkJLnN0YXRzLT5tdWx0aWNhc3QqMTIzNCk7CkBAIC00NTUsNyArNDU1LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIE9JRF9HRU5fTVVMVElDQVNUX0ZSQU1FU19YTUlUOgotCQlEQkcoIiVzOiBPSURfR0VOX01VTFRJQ0FTVF9GUkFNRVNfWE1JVFxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEX0dFTl9NVUxUSUNBU1RfRlJBTUVTX1hNSVRcbiIsIF9fZnVuY19fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMpIHsKIAkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQogCQkJCQkuc3RhdHMtPm11bHRpY2FzdCk7CkBAIC00NjQsNyArNDY0LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIE9JRF9HRU5fQlJPQURDQVNUX0JZVEVTX1hNSVQ6Ci0JCURCRygiJXM6IE9JRF9HRU5fQlJPQURDQVNUX0JZVEVTX1hNSVRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF9HRU5fQlJPQURDQVNUX0JZVEVTX1hNSVRcbiIsIF9fZnVuY19fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMpIHsKIAkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQogCQkJCQkuc3RhdHMtPnR4X3BhY2tldHMvNDIqMjU1KTsKQEAgLTQ3Myw3ICs0NzMsNyBAQAogCQlicmVhazsKIAogCWNhc2UgT0lEX0dFTl9CUk9BRENBU1RfRlJBTUVTX1hNSVQ6Ci0JCURCRygiJXM6IE9JRF9HRU5fQlJPQURDQVNUX0ZSQU1FU19YTUlUXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfR0VOX0JST0FEQ0FTVF9GUkFNRVNfWE1JVFxuIiwgX19mdW5jX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cykgewogCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCiAJCQkJCS5zdGF0cy0+dHhfcGFja2V0cy80Mik7CkBAIC00ODIsMTkgKzQ4MiwxOSBAQAogCQlicmVhazsKIAogCWNhc2UgT0lEX0dFTl9ESVJFQ1RFRF9CWVRFU19SQ1Y6Ci0JCURCRygiJXM6IE9JRF9HRU5fRElSRUNURURfQllURVNfUkNWXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfR0VOX0RJUkVDVEVEX0JZVEVTX1JDVlxuIiwgX19mdW5jX18pOwogCQkqb3V0YnVmID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7CiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwogCiAJY2FzZSBPSURfR0VOX0RJUkVDVEVEX0ZSQU1FU19SQ1Y6Ci0JCURCRygiJXM6IE9JRF9HRU5fRElSRUNURURfRlJBTUVTX1JDVlxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEX0dFTl9ESVJFQ1RFRF9GUkFNRVNfUkNWXG4iLCBfX2Z1bmNfXyk7CiAJCSpvdXRidWYgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CiAKIAljYXNlIE9JRF9HRU5fTVVMVElDQVNUX0JZVEVTX1JDVjoKLQkJREJHKCIlczogT0lEX0dFTl9NVUxUSUNBU1RfQllURVNfUkNWXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfR0VOX01VTFRJQ0FTVF9CWVRFU19SQ1ZcbiIsIF9fZnVuY19fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMpIHsKIAkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQogCQkJCQkuc3RhdHMtPm11bHRpY2FzdCAqIDExMTEpOwpAQCAtNTAzLDcgKzUwMyw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBPSURfR0VOX01VTFRJQ0FTVF9GUkFNRVNfUkNWOgotCQlEQkcoIiVzOiBPSURfR0VOX01VTFRJQ0FTVF9GUkFNRVNfUkNWXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfR0VOX01VTFRJQ0FTVF9GUkFNRVNfUkNWXG4iLCBfX2Z1bmNfXyk7CiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzKSB7CiAJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KIAkJCQkJLnN0YXRzLT5tdWx0aWNhc3QpOwpAQCAtNTEyLDcgKzUxMiw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBPSURfR0VOX0JST0FEQ0FTVF9CWVRFU19SQ1Y6Ci0JCURCRygiJXM6IE9JRF9HRU5fQlJPQURDQVNUX0JZVEVTX1JDVlxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEX0dFTl9CUk9BRENBU1RfQllURVNfUkNWXG4iLCBfX2Z1bmNfXyk7CiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzKSB7CiAJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KIAkJCQkJLnN0YXRzLT5yeF9wYWNrZXRzLzQyKjI1NSk7CkBAIC01MjEsNyArNTIxLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIE9JRF9HRU5fQlJPQURDQVNUX0ZSQU1FU19SQ1Y6Ci0JCURCRygiJXM6IE9JRF9HRU5fQlJPQURDQVNUX0ZSQU1FU19SQ1ZcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF9HRU5fQlJPQURDQVNUX0ZSQU1FU19SQ1ZcbiIsIF9fZnVuY19fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMpIHsKIAkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQogCQkJCQkuc3RhdHMtPnJ4X3BhY2tldHMvNDIpOwpAQCAtNTMwLDcgKzUzMCw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBPSURfR0VOX1JDVl9DUkNfRVJST1I6Ci0JCURCRygiJXM6IE9JRF9HRU5fUkNWX0NSQ19FUlJPUlxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEX0dFTl9SQ1ZfQ1JDX0VSUk9SXG4iLCBfX2Z1bmNfXyk7CiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzKSB7CiAJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KIAkJCQkJLnN0YXRzLT5yeF9jcmNfZXJyb3JzKTsKQEAgLTUzOSw3ICs1MzksNyBAQAogCQlicmVhazsKIAogCWNhc2UgT0lEX0dFTl9UUkFOU01JVF9RVUVVRV9MRU5HVEg6Ci0JCURCRygiJXM6IE9JRF9HRU5fVFJBTlNNSVRfUVVFVUVfTEVOR1RIXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfR0VOX1RSQU5TTUlUX1FVRVVFX0xFTkdUSFxuIiwgX19mdW5jX18pOwogCQkqb3V0YnVmID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7CiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwpAQCAtNTQ5LDcgKzU0OSw3IEBACiAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF84MDJfM19QRVJNQU5FTlRfQUREUkVTUzoKLQkJREJHKCIlczogT0lEXzgwMl8zX1BFUk1BTkVOVF9BRERSRVNTXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfODAyXzNfUEVSTUFORU5UX0FERFJFU1NcbiIsIF9fZnVuY19fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uZGV2KSB7CiAJCQlsZW5ndGggPSBFVEhfQUxFTjsKIAkJCW1lbWNweSAob3V0YnVmLApAQCAtNTYxLDcgKzU2MSw3IEBACiAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF84MDJfM19DVVJSRU5UX0FERFJFU1M6Ci0JCURCRygiJXM6IE9JRF84MDJfM19DVVJSRU5UX0FERFJFU1NcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF84MDJfM19DVVJSRU5UX0FERFJFU1NcbiIsIF9fZnVuY19fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uZGV2KSB7CiAJCQlsZW5ndGggPSBFVEhfQUxFTjsKIAkJCW1lbWNweSAob3V0YnVmLApAQCAtNTczLDcgKzU3Myw3IEBACiAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF84MDJfM19NVUxUSUNBU1RfTElTVDoKLQkJREJHKCIlczogT0lEXzgwMl8zX01VTFRJQ0FTVF9MSVNUXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfODAyXzNfTVVMVElDQVNUX0xJU1RcbiIsIF9fZnVuY19fKTsKIAkJLyogTXVsdGljYXN0IGJhc2UgYWRkcmVzcyBvbmx5ICovCiAJCSpvdXRidWYgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgweEUwMDAwMDAwKTsKIAkJcmV0dmFsID0gMDsKQEAgLTU4MSwyMSArNTgxLDIxIEBACiAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF84MDJfM19NQVhJTVVNX0xJU1RfU0laRToKLQkJREJHKCIlczogT0lEXzgwMl8zX01BWElNVU1fTElTVF9TSVpFXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfODAyXzNfTUFYSU1VTV9MSVNUX1NJWkVcbiIsIF9fZnVuY19fKTsKIAkJLyogTXVsdGljYXN0IGJhc2UgYWRkcmVzcyBvbmx5ICovCiAJCSpvdXRidWYgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgxKTsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CiAKIAljYXNlIE9JRF84MDJfM19NQUNfT1BUSU9OUzoKLQkJREJHKCIlczogT0lEXzgwMl8zX01BQ19PUFRJT05TXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfODAyXzNfTUFDX09QVElPTlNcbiIsIF9fZnVuY19fKTsKIAkJYnJlYWs7CiAKIAkvKiBpZWVlODAyLjMgc3RhdGlzdGljcyBPSURzICh0YWJsZSA0LTQpICovCiAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF84MDJfM19SQ1ZfRVJST1JfQUxJR05NRU5UOgotCQlEQkcoIiVzOiBPSURfODAyXzNfUkNWX0VSUk9SX0FMSUdOTUVOVFxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEXzgwMl8zX1JDVl9FUlJPUl9BTElHTk1FTlRcbiIsIF9fZnVuY19fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMpIHsKIAkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQogCQkJCQkuc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycyk7CkBAIC02MDUsNTEgKzYwNSw1MSBAQAogCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfODAyXzNfWE1JVF9PTkVfQ09MTElTSU9OOgotCQlEQkcoIiVzOiBPSURfODAyXzNfWE1JVF9PTkVfQ09MTElTSU9OXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfODAyXzNfWE1JVF9PTkVfQ09MTElTSU9OXG4iLCBfX2Z1bmNfXyk7CiAJCSpvdXRidWYgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CiAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF84MDJfM19YTUlUX01PUkVfQ09MTElTSU9OUzoKLQkJREJHKCIlczogT0lEXzgwMl8zX1hNSVRfTU9SRV9DT0xMSVNJT05TXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfODAyXzNfWE1JVF9NT1JFX0NPTExJU0lPTlNcbiIsIF9fZnVuY19fKTsKIAkJKm91dGJ1ZiA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOwogCQlyZXR2YWwgPSAwOwogCQlicmVhazsKIAogI2lmZGVmCVJORElTX09QVElPTkFMX1NUQVRTCiAJY2FzZSBPSURfODAyXzNfWE1JVF9ERUZFUlJFRDoKLQkJREJHKCIlczogT0lEXzgwMl8zX1hNSVRfREVGRVJSRURcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF84MDJfM19YTUlUX0RFRkVSUkVEXG4iLCBfX2Z1bmNfXyk7CiAJCS8qIFRPRE8gKi8KIAkJYnJlYWs7CiAKIAljYXNlIE9JRF84MDJfM19YTUlUX01BWF9DT0xMSVNJT05TOgotCQlEQkcoIiVzOiBPSURfODAyXzNfWE1JVF9NQVhfQ09MTElTSU9OU1xuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEXzgwMl8zX1hNSVRfTUFYX0NPTExJU0lPTlNcbiIsIF9fZnVuY19fKTsKIAkJLyogVE9ETyAqLwogCQlicmVhazsKIAogCWNhc2UgT0lEXzgwMl8zX1JDVl9PVkVSUlVOOgotCQlEQkcoIiVzOiBPSURfODAyXzNfUkNWX09WRVJSVU5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF84MDJfM19SQ1ZfT1ZFUlJVTlxuIiwgX19mdW5jX18pOwogCQkvKiBUT0RPICovCiAJCWJyZWFrOwogCiAJY2FzZSBPSURfODAyXzNfWE1JVF9VTkRFUlJVTjoKLQkJREJHKCIlczogT0lEXzgwMl8zX1hNSVRfVU5ERVJSVU5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF84MDJfM19YTUlUX1VOREVSUlVOXG4iLCBfX2Z1bmNfXyk7CiAJCS8qIFRPRE8gKi8KIAkJYnJlYWs7CiAKIAljYXNlIE9JRF84MDJfM19YTUlUX0hFQVJUQkVBVF9GQUlMVVJFOgotCQlEQkcoIiVzOiBPSURfODAyXzNfWE1JVF9IRUFSVEJFQVRfRkFJTFVSRVxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEXzgwMl8zX1hNSVRfSEVBUlRCRUFUX0ZBSUxVUkVcbiIsIF9fZnVuY19fKTsKIAkJLyogVE9ETyAqLwogCQlicmVhazsKIAogCWNhc2UgT0lEXzgwMl8zX1hNSVRfVElNRVNfQ1JTX0xPU1Q6Ci0JCURCRygiJXM6IE9JRF84MDJfM19YTUlUX1RJTUVTX0NSU19MT1NUXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfODAyXzNfWE1JVF9USU1FU19DUlNfTE9TVFxuIiwgX19mdW5jX18pOwogCQkvKiBUT0RPICovCiAJCWJyZWFrOwogCiAJY2FzZSBPSURfODAyXzNfWE1JVF9MQVRFX0NPTExJU0lPTlM6Ci0JCURCRygiJXM6IE9JRF84MDJfM19YTUlUX0xBVEVfQ09MTElTSU9OU1xuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEXzgwMl8zX1hNSVRfTEFURV9DT0xMSVNJT05TXG4iLCBfX2Z1bmNfXyk7CiAJCS8qIFRPRE8gKi8KIAkJYnJlYWs7CiAjZW5kaWYJLyogUk5ESVNfT1BUSU9OQUxfU1RBVFMgKi8KQEAgLTY1Nyw3ICs2NTcsNyBAQAogI2lmZGVmCVJORElTX1BNCiAJLyogcG93ZXIgbWFuYWdlbWVudCBPSURzICh0YWJsZSA0LTUpICovCiAJY2FzZSBPSURfUE5QX0NBUEFCSUxJVElFUzoKLQkJREJHKCIlczogT0lEX1BOUF9DQVBBQklMSVRJRVNcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF9QTlBfQ0FQQUJJTElUSUVTXG4iLCBfX2Z1bmNfXyk7CiAKIAkJLyogZm9yIG5vdywgbm8gd2FrZXVwIGNhcGFiaWxpdGllcyAqLwogCQlsZW5ndGggPSBzaXplb2YgKHN0cnVjdCBORElTX1BOUF9DQVBBQklMSVRJRVMpOwpAQCAtNjY1LDcgKzY2NSw3IEBACiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwogCWNhc2UgT0lEX1BOUF9RVUVSWV9QT1dFUjoKLQkJREJHKCIlczogT0lEX1BOUF9RVUVSWV9QT1dFUiBEJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJREJHKCIlczogT0lEX1BOUF9RVUVSWV9QT1dFUiBEJWRcbiIsIF9fZnVuY19fLAogCQkJCWxlMzJfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fbGUzMiAqKWJ1ZikpIC0gMSk7CiAJCS8qIG9ubHkgc3VzcGVuZCBpcyBhIHJlYWwgcG93ZXIgc3RhdGUsIGFuZAogCQkgKiBpdCBjYW4ndCBiZSBlbnRlcmVkIGJ5IE9JRF9QTlBfU0VUX1BPV0VSLi4uCkBAIC02NzcsNyArNjc3LDcgQEAKIAogCWRlZmF1bHQ6CiAJCXByX3dhcm5pbmcoIiVzOiBxdWVyeSB1bmtub3duIE9JRCAweCUwOFhcbiIsCi0JCQkgX19GVU5DVElPTl9fLCBPSUQpOworCQkJIF9fZnVuY19fLCBPSUQpOwogCX0KIAlpZiAocmV0dmFsIDwgMCkKIAkJbGVuZ3RoID0gMDsKQEAgLTcyOSw3ICs3MjksNyBAQAogCQkqcGFyYW1zLT5maWx0ZXIgPSAodTE2KSBsZTMyX3RvX2NwdShnZXRfdW5hbGlnbmVkKAogCQkJCShfX2xlMzIgKilidWYpKTsKIAkJREJHKCIlczogT0lEX0dFTl9DVVJSRU5UX1BBQ0tFVF9GSUxURVIgJTA4eFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgKnBhcmFtcy0+ZmlsdGVyKTsKKwkJCV9fZnVuY19fLCAqcGFyYW1zLT5maWx0ZXIpOwogCiAJCS8qIHRoaXMgY2FsbCBoYXMgYSBzaWduaWZpY2FudCBzaWRlIGVmZmVjdDogIGl0J3MKIAkJICogd2hhdCBtYWtlcyB0aGUgcGFja2V0IGZsb3cgc3RhcnQgYW5kIHN0b3AsIGxpa2UKQEAgLTc1Myw3ICs3NTMsNyBAQAogCiAJY2FzZSBPSURfODAyXzNfTVVMVElDQVNUX0xJU1Q6CiAJCS8qIEkgdGhpbmsgd2UgY2FuIGlnbm9yZSB0aGlzICovCi0JCURCRygiJXM6IE9JRF84MDJfM19NVUxUSUNBU1RfTElTVFxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEXzgwMl8zX01VTFRJQ0FTVF9MSVNUXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwogI2lmIDAKQEAgLTc2Miw3ICs3NjIsNyBAQAogCQlzdHJ1Y3Qgcm5kaXNfY29uZmlnX3BhcmFtZXRlcgkqcGFyYW07CiAJCXBhcmFtID0gKHN0cnVjdCBybmRpc19jb25maWdfcGFyYW1ldGVyICopIGJ1ZjsKIAkJREJHKCIlczogT0lEX0dFTl9STkRJU19DT05GSUdfUEFSQU1FVEVSICclKnMnXG4iLAotCQkJX19GVU5DVElPTl9fLAorCQkJX19mdW5jX18sCiAJCQltaW4oY3B1X3RvX2xlMzIocGFyYW0tPlBhcmFtZXRlck5hbWVMZW5ndGgpLDgwKSwKIAkJCWJ1ZiArIHBhcmFtLT5QYXJhbWV0ZXJOYW1lT2Zmc2V0KTsKIAkJcmV0dmFsID0gMDsKQEAgLTc3OCw3ICs3NzgsNyBAQAogCQkgKiBGSVhNRSAuLi4gdGhlbiB0aGluZ3MgZ28gYmF0dHk7IFdpbmRvd3Mgd2VkZ2VzIGl0c2VsZi4KIAkJICovCiAJCWkgPSBsZTMyX3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX2xlMzIgKilidWYpKTsKLQkJREJHKCIlczogT0lEX1BOUF9TRVRfUE9XRVIgRCVkXG4iLCBfX0ZVTkNUSU9OX18sIGkgLSAxKTsKKwkJREJHKCIlczogT0lEX1BOUF9TRVRfUE9XRVIgRCVkXG4iLCBfX2Z1bmNfXywgaSAtIDEpOwogCQlzd2l0Y2ggKGkpIHsKIAkJY2FzZSBOZGlzRGV2aWNlU3RhdGVEMDoKIAkJCSpwYXJhbXMtPmZpbHRlciA9IHBhcmFtcy0+c2F2ZWRfZmlsdGVyOwpAQCAtODAyLDcgKzgwMiw3IEBACiAKIAlkZWZhdWx0OgogCQlwcl93YXJuaW5nKCIlczogc2V0IHVua25vd24gT0lEIDB4JTA4WCwgc2l6ZSAlZFxuIiwKLQkJCSBfX0ZVTkNUSU9OX18sIE9JRCwgYnVmX2xlbik7CisJCQkgX19mdW5jX18sIE9JRCwgYnVmX2xlbik7CiAJfQogCiAJcmV0dXJuIHJldHZhbDsKQEAgLTg1NSw3ICs4NTUsNyBAQAogCXJuZGlzX3F1ZXJ5X2NtcGx0X3R5cGUgKnJlc3A7CiAJcm5kaXNfcmVzcF90ICAgICAgICAgICAgKnI7CiAKLQkvLyBEQkcoIiVzOiBPSUQgPSAlMDhYXG4iLCBfX0ZVTkNUSU9OX18sIGNwdV90b19sZTMyKGJ1Zi0+T0lEKSk7CisJLy8gREJHKCIlczogT0lEID0gJTA4WFxuIiwgX19mdW5jX18sIGNwdV90b19sZTMyKGJ1Zi0+T0lEKSk7CiAJaWYgKCFybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLmRldikgcmV0dXJuIC1FTk9UU1VQUDsKIAogCS8qCkBAIC05MDgsOSArOTA4LDkgQEAKIAlCdWZPZmZzZXQgPSBsZTMyX3RvX2NwdSAoYnVmLT5JbmZvcm1hdGlvbkJ1ZmZlck9mZnNldCk7CiAKICNpZmRlZglWRVJCT1NFCi0JREJHKCIlczogTGVuZ3RoOiAlZFxuIiwgX19GVU5DVElPTl9fLCBCdWZMZW5ndGgpOwotCURCRygiJXM6IE9mZnNldDogJWRcbiIsIF9fRlVOQ1RJT05fXywgQnVmT2Zmc2V0KTsKLQlEQkcoIiVzOiBJbmZvQnVmZmVyOiAiLCBfX0ZVTkNUSU9OX18pOworCURCRygiJXM6IExlbmd0aDogJWRcbiIsIF9fZnVuY19fLCBCdWZMZW5ndGgpOworCURCRygiJXM6IE9mZnNldDogJWRcbiIsIF9fZnVuY19fLCBCdWZPZmZzZXQpOworCURCRygiJXM6IEluZm9CdWZmZXI6ICIsIF9fZnVuY19fKTsKIAogCWZvciAoaSA9IDA7IGkgPCBCdWZMZW5ndGg7IGkrKykgewogCQlEQkcoIiUwMnggIiwgKigoKHU4ICopIGJ1ZikgKyBpICsgOCArIEJ1Zk9mZnNldCkpOwpAQCAtMTA4MCwxNCArMTA4MCwxNCBAQAogCXN3aXRjaCAoTXNnVHlwZSkgewogCWNhc2UgUkVNT1RFX05ESVNfSU5JVElBTElaRV9NU0c6CiAJCURCRygiJXM6IFJFTU9URV9ORElTX0lOSVRJQUxJWkVfTVNHXG4iLAotCQkJX19GVU5DVElPTl9fICk7CisJCQlfX2Z1bmNfXyApOwogCQlwYXJhbXMtPnN0YXRlID0gUk5ESVNfSU5JVElBTElaRUQ7CiAJCXJldHVybiAgcm5kaXNfaW5pdF9yZXNwb25zZSAoY29uZmlnTnIsCiAJCQkJCShybmRpc19pbml0X21zZ190eXBlICopIGJ1Zik7CiAKIAljYXNlIFJFTU9URV9ORElTX0hBTFRfTVNHOgogCQlEQkcoIiVzOiBSRU1PVEVfTkRJU19IQUxUX01TR1xuIiwKLQkJCV9fRlVOQ1RJT05fXyApOworCQkJX19mdW5jX18gKTsKIAkJcGFyYW1zLT5zdGF0ZSA9IFJORElTX1VOSU5JVElBTElaRUQ7CiAJCWlmIChwYXJhbXMtPmRldikgewogCQkJbmV0aWZfY2Fycmllcl9vZmYgKHBhcmFtcy0+ZGV2KTsKQEAgLTExMDUsNyArMTEwNSw3IEBACiAKIAljYXNlIFJFTU9URV9ORElTX1JFU0VUX01TRzoKIAkJREJHKCIlczogUkVNT1RFX05ESVNfUkVTRVRfTVNHXG4iLAotCQkJX19GVU5DVElPTl9fICk7CisJCQlfX2Z1bmNfXyApOwogCQlyZXR1cm4gcm5kaXNfcmVzZXRfcmVzcG9uc2UgKGNvbmZpZ05yLAogCQkJCQkocm5kaXNfcmVzZXRfbXNnX3R5cGUgKikgYnVmKTsKIApAQCAtMTExMyw3ICsxMTEzLDcgQEAKIAkJLyogRm9yIFVTQjogaG9zdCBkb2VzIHRoaXMgZXZlcnkgNSBzZWNvbmRzICovCiAJCWlmIChybmRpc19kZWJ1ZyA+IDEpCiAJCQlEQkcoIiVzOiBSRU1PVEVfTkRJU19LRUVQQUxJVkVfTVNHXG4iLAotCQkJCV9fRlVOQ1RJT05fXyApOworCQkJCV9fZnVuY19fICk7CiAJCXJldHVybiBybmRpc19rZWVwYWxpdmVfcmVzcG9uc2UgKGNvbmZpZ05yLAogCQkJCQkJIChybmRpc19rZWVwYWxpdmVfbXNnX3R5cGUgKikKIAkJCQkJCSBidWYpOwpAQCAtMTEyNCw3ICsxMTI0LDcgQEAKIAkJICogc3VzcGVuZGluZyBpdHNlbGYuCiAJCSAqLwogCQlwcl93YXJuaW5nKCIlczogdW5rbm93biBSTkRJUyBtZXNzYWdlIDB4JTA4WCBsZW4gJWRcbiIsCi0JCQlfX0ZVTkNUSU9OX18gLCBNc2dUeXBlLCBNc2dMZW5ndGgpOworCQkJX19mdW5jX18gLCBNc2dUeXBlLCBNc2dMZW5ndGgpOwogCQl7CiAJCQl1bnNpZ25lZCBpOwogCQkJZm9yIChpID0gMDsgaSA8IE1zZ0xlbmd0aDsgaSArPSAxNikgewpAQCAtMTE1OSw3ICsxMTU5LDcgQEAKIAkJaWYgKCFybmRpc19wZXJfZGV2X3BhcmFtcyBbaV0udXNlZCkgewogCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2ldLnVzZWQgPSAxOwogCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2ldLmFjayA9IHJuZGlzX2NvbnRyb2xfYWNrOwotCQkJREJHKCIlczogY29uZmlnTnIgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBpKTsKKwkJCURCRygiJXM6IGNvbmZpZ05yID0gJWRcbiIsIF9fZnVuY19fLCBpKTsKIAkJCXJldHVybiBpOwogCQl9CiAJfQpAQCAtMTE3MCw3ICsxMTcwLDcgQEAKIAogdm9pZCBybmRpc19kZXJlZ2lzdGVyIChpbnQgY29uZmlnTnIpCiB7Ci0JREJHKCIlczogXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwlEQkcoIiVzOiBcbiIsIF9fZnVuY19fICk7CiAKIAlpZiAoY29uZmlnTnIgPj0gUk5ESVNfTUFYX0NPTkZJR1MpIHJldHVybjsKIAlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnVzZWQgPSAwOwpAQCAtMTE4Miw3ICsxMTgyLDcgQEAKIAkJCSBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMsCiAJCQkgdTE2ICpjZGNfZmlsdGVyKQogewotCURCRygiJXM6XG4iLCBfX0ZVTkNUSU9OX18gKTsKKwlEQkcoIiVzOlxuIiwgX19mdW5jX18gKTsKIAlpZiAoIWRldiB8fCAhc3RhdHMpIHJldHVybiAtMTsKIAlpZiAoY29uZmlnTnIgPj0gUk5ESVNfTUFYX0NPTkZJR1MpIHJldHVybiAtMTsKIApAQCAtMTE5NSw3ICsxMTk1LDcgQEAKIAogaW50IHJuZGlzX3NldF9wYXJhbV92ZW5kb3IgKHU4IGNvbmZpZ05yLCB1MzIgdmVuZG9ySUQsIGNvbnN0IGNoYXIgKnZlbmRvckRlc2NyKQogewotCURCRygiJXM6XG4iLCBfX0ZVTkNUSU9OX18gKTsKKwlEQkcoIiVzOlxuIiwgX19mdW5jX18gKTsKIAlpZiAoIXZlbmRvckRlc2NyKSByZXR1cm4gLTE7CiAJaWYgKGNvbmZpZ05yID49IFJORElTX01BWF9DT05GSUdTKSByZXR1cm4gLTE7CiAKQEAgLTEyMDcsNyArMTIwNyw3IEBACiAKIGludCBybmRpc19zZXRfcGFyYW1fbWVkaXVtICh1OCBjb25maWdOciwgdTMyIG1lZGl1bSwgdTMyIHNwZWVkKQogewotCURCRygiJXM6ICV1ICV1XG4iLCBfX0ZVTkNUSU9OX18sIG1lZGl1bSwgc3BlZWQpOworCURCRygiJXM6ICV1ICV1XG4iLCBfX2Z1bmNfXywgbWVkaXVtLCBzcGVlZCk7CiAJaWYgKGNvbmZpZ05yID49IFJORElTX01BWF9DT05GSUdTKSByZXR1cm4gLTE7CiAKIAlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLm1lZGl1bSA9IG1lZGl1bTsKQEAgLTE0MDMsNyArMTQwMyw3IEBACiAjZW5kaWYJLyogQ09ORklHX1VTQl9HQURHRVRfREVCVUdfRklMRVMgKi8KIAogCi1pbnQgX19kZXZpbml0IHJuZGlzX2luaXQgKHZvaWQpCitpbnQgX19pbml0IHJuZGlzX2luaXQgKHZvaWQpCiB7CiAJdTggaTsKIApAQCAtMTQxNSw3ICsxNDE1LDcgQEAKIAkJaWYgKCEocm5kaXNfY29ubmVjdF9zdGF0ZSBbaV0KIAkJCQk9IGNyZWF0ZV9wcm9jX2VudHJ5IChuYW1lLCAwNjYwLCBOVUxMKSkpCiAJCXsKLQkJCURCRygiJXMgOnJlbW92ZSBlbnRyaWVzIiwgX19GVU5DVElPTl9fKTsKKwkJCURCRygiJXMgOnJlbW92ZSBlbnRyaWVzIiwgX19mdW5jX18pOwogCQkJd2hpbGUgKGkpIHsKIAkJCQlzcHJpbnRmIChuYW1lLCBOQU1FX1RFTVBMQVRFLCAtLWkpOwogCQkJCXJlbW92ZV9wcm9jX2VudHJ5IChuYW1lLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9zZXJpYWwuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9zZXJpYWwuYwppbmRleCBmNWMzODk2Li40MzNiM2Y0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvc2VyaWFsLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3NlcmlhbC5jCkBAIC0yMTYzLDggKzIxNjMsNyBAQAogCQkJCXBvcnQtPnBvcnRfZGV2ID0gTlVMTDsKIAkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPnBvcnRfd3JpdGVfd2FpdCk7CiAJCQkJaWYgKHBvcnQtPnBvcnRfdHR5KSB7Ci0JCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+cG9ydF90dHktPnJlYWRfd2FpdCk7Ci0JCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+cG9ydF90dHktPndyaXRlX3dhaXQpOworCQkJCQl0dHlfaGFuZ3VwKHBvcnQtPnBvcnRfdHR5KTsKIAkJCQl9CiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+cG9ydF9sb2NrLCBmbGFncyk7CiAJCQl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnIGIvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnCmluZGV4IGJmOGJlMmEuLjBiODc0ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcKQEAgLTMwLDggKzMwLDggQEAKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBlaGNpLWhjZC4KIAogY29uZmlnIFVTQl9FSENJX1JPT1RfSFVCX1RUCi0JYm9vbCAiUm9vdCBIdWIgVHJhbnNhY3Rpb24gVHJhbnNsYXRvcnMgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBVU0JfRUhDSV9IQ0QgJiYgRVhQRVJJTUVOVEFMCisJYm9vbCAiUm9vdCBIdWIgVHJhbnNhY3Rpb24gVHJhbnNsYXRvcnMiCisJZGVwZW5kcyBvbiBVU0JfRUhDSV9IQ0QKIAktLS1oZWxwLS0tCiAJICBTb21lIEVIQ0kgY2hpcHMgaGF2ZSB2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucyB0byBpbnRlZ3JhdGUKIAkgIHRyYW5zYWN0aW9uIHRyYW5zbGF0b3JzLCBzbyB0aGF0IG5vIE9IQ0kgb3IgVUhDSSBjb21wYW5pb24KQEAgLTI2MCwzICsyNjAsOSBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcjhhNjY1OTctaGNkLgogCitjb25maWcgU1VQRVJIX09OX0NISVBfUjhBNjY1OTcKKwlib29sZWFuICJFbmFibGUgU3VwZXJIIG9uLWNoaXAgVVNCIGxpa2UgdGhlIFI4QTY2NTk3IgorCWRlcGVuZHMgb24gVVNCX1I4QTY2NTk3X0hDRCAmJiBDUFVfU1VCVFlQRV9TSDczNjYKKwloZWxwCisJICAgUmVuZXNhcyBTdXBlckggcHJvY2Vzc29yIGhhcyBVU0IgbGlrZSB0aGUgUjhBNjY1OTcuCisJICAgVGhpcyBkcml2ZXIgc3VwcG9ydGVkIHByb2Nlc3NvciBpcyBTSDczNjYuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktYXUxeHh4LmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktYXUxeHh4LmMKaW5kZXggZGE3NTMyZC4uOGI1Zjk5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWF1MXh4eC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1hdTF4eHguYwpAQCAtMjM3LDYgKzIzNyw3IEBACiAJaWYgKHVzYl9kaXNhYmxlZCgpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCS8qIEZJWE1FIHdlIG9ubHkgd2FudCBvbmUgb25lIHByb2JlKCkgbm90IHR3byAqLwogCXJldCA9IHVzYl9laGNpX2F1MXh4eF9wcm9iZSgmZWhjaV9hdTF4eHhfaGNfZHJpdmVyLCAmaGNkLCBwZGV2KTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjQ1LDYgKzI0Niw3IEBACiB7CiAJc3RydWN0IHVzYl9oY2QgKmhjZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCisJLyogRklYTUUgd2Ugb25seSB3YW50IG9uZSBvbmUgcmVtb3ZlKCkgbm90IHR3byAqLwogCXVzYl9laGNpX2F1MXh4eF9yZW1vdmUoaGNkLCBwZGV2KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTI2NSw3ICsyNjcsNyBAQAogCXJldHVybiAwOwogfQogKi8KLU1PRFVMRV9BTElBUygiYXUxeHh4LWVoY2kiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06YXUxeHh4LWVoY2kiKTsKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGVoY2lfaGNkX2F1MXh4eF9kcml2ZXIgPSB7CiAJLnByb2JlID0gZWhjaV9oY2RfYXUxeHh4X2Rydl9wcm9iZSwKIAkucmVtb3ZlID0gZWhjaV9oY2RfYXUxeHh4X2Rydl9yZW1vdmUsCkBAIC0yNzQsNiArMjc2LDUgQEAKIAkvKi5yZXN1bWUgICAgICAgPSBlaGNpX2hjZF9hdTF4eHhfZHJ2X3Jlc3VtZSwgKi8KIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJhdTF4eHgtZWhjaSIsCi0JCS5idXMgPSAmcGxhdGZvcm1fYnVzX3R5cGUKIAl9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWRiZy5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWRiZy5jCmluZGV4IDY0ZWJmYzUuLjRhZjkwZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1kYmcuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktZGJnLmMKQEAgLTI3LDcgKzI3LDcgQEAKICNkZWZpbmUgZWhjaV93YXJuKGVoY2ksIGZtdCwgYXJncy4uLikgXAogCWRldl93YXJuIChlaGNpX3RvX2hjZChlaGNpKS0+c2VsZi5jb250cm9sbGVyICwgZm10ICwgIyMgYXJncyApCiAKLSNpZmRlZiBFSENJX1ZFUkJPU0VfREVCVUcKKyNpZmRlZiBWRVJCT1NFX0RFQlVHCiAjCWRlZmluZSB2ZGJnIGRiZwogIwlkZWZpbmUgZWhjaV92ZGJnIGVoY2lfZGJnCiAjZWxzZQpAQCAtNjcwLDcgKzY3MCw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSAoJmVoY2ktPmxvY2ssIGZsYWdzKTsKIAotCWlmIChidWYtPmJ1cy0+Y29udHJvbGxlci0+cG93ZXIucG93ZXJfc3RhdGUuZXZlbnQpIHsKKwlpZiAoIXRlc3RfYml0KEhDRF9GTEFHX0hXX0FDQ0VTU0lCTEUsICZoY2QtPmZsYWdzKSkgewogCQlzaXplID0gc2NucHJpbnRmIChuZXh0LCBzaXplLAogCQkJImJ1cyAlcywgZGV2aWNlICVzIChkcml2ZXIgIiBEUklWRVJfVkVSU0lPTiAiKVxuIgogCQkJIiVzXG4iCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktZnNsLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktZnNsLmMKaW5kZXggYWRiMGRlZi4uNmQ5YmVkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWZzbC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1mc2wuYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAoQykgQ29weXJpZ2h0IERhdmlkIEJyb3duZWxsIDIwMDAtMjAwMgogICogQ29weXJpZ2h0IChjKSAyMDA1IE1vbnRhVmlzdGEgU29mdHdhcmUKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjgsNyArMjcsNiBAQAogLyogRklYTUU6IFBvd2VyIE1hbmFnZW1lbnQgaXMgdW4tcG9ydGVkIHNvIHRlbXBvcmFyaWx5IGRpc2FibGUgaXQgKi8KICN1bmRlZiBDT05GSUdfUE0KIAotLyogUENJLWJhc2VkIEhDcyBhcmUgY29tbW9uLCBidXQgcGxlbnR5IG9mIG5vbi1QQ0kgSENzIGFyZSB1c2VkIHRvbyAqLwogCiAvKiBjb25maWd1cmUgc28gYW4gSEMgZGV2aWNlIGFuZCBpZCBhcmUgYWx3YXlzIHByb3ZpZGVkICovCiAvKiBhbHdheXMgY2FsbGVkIHdpdGggcHJvY2VzcyBjb250ZXh0OyBzbGVlcGluZyBpcyBPSyAqLwpAQCAtMzMxLDYgKzMyOSw3IEBACiAJaWYgKHVzYl9kaXNhYmxlZCgpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCS8qIEZJWE1FIHdlIG9ubHkgd2FudCBvbmUgb25lIHByb2JlKCkgbm90IHR3byAqLwogCXJldHVybiB1c2JfaGNkX2ZzbF9wcm9iZSgmZWhjaV9mc2xfaGNfZHJpdmVyLCBwZGV2KTsKIH0KIApAQCAtMzM4LDEyICszMzcsMTIgQEAKIHsKIAlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKKwkvKiBGSVhNRSB3ZSBvbmx5IHdhbnQgb25lIG9uZSByZW1vdmUoKSBub3QgdHdvICovCiAJdXNiX2hjZF9mc2xfcmVtb3ZlKGhjZCwgcGRldik7Ci0KIAlyZXR1cm4gMDsKIH0KIAotTU9EVUxFX0FMSUFTKCJmc2wtZWhjaSIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpmc2wtZWhjaSIpOwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBlaGNpX2ZzbF9kcml2ZXIgPSB7CiAJLnByb2JlID0gZWhjaV9mc2xfZHJ2X3Byb2JlLApAQCAtMzUxLDUgKzM1MCw1IEBACiAJLnNodXRkb3duID0gdXNiX2hjZF9wbGF0Zm9ybV9zaHV0ZG93biwKIAkuZHJpdmVyID0gewogCQkgICAubmFtZSA9ICJmc2wtZWhjaSIsCi0JCSAgIH0sCisJfSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMKaW5kZXggODUwNzRjYi4uMzY5YThhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYwpAQCAtNTcsMzUgKzU3LDYgQEAKICAqIFNwZWNpYWwgdGhhbmtzIHRvIEludGVsIGFuZCBWSUEgZm9yIHByb3ZpZGluZyBob3N0IGNvbnRyb2xsZXJzIHRvCiAgKiB0ZXN0IHRoaXMgZHJpdmVyIG9uLCBhbmQgQ3lwcmVzcyAoaW5jbHVkaW5nIEluLVN5c3RlbSBEZXNpZ24pIGZvcgogICogcHJvdmlkaW5nIGVhcmx5IGRldmljZXMgZm9yIHRob3NlIGhvc3QgY29udHJvbGxlcnMgdG8gdGFsayB0byEKLSAqCi0gKiBISVNUT1JZOgotICoKLSAqIDIwMDQtMDUtMTAgUm9vdCBodWIgYW5kIFBDSSBzdXNwZW5kL3Jlc3VtZSBzdXBwb3J0OyByZW1vdGUgd2FrZXVwLiAoZGIpCi0gKiAyMDA0LTAyLTI0IFJlcGxhY2UgcGNpXyogd2l0aCBnZW5lcmljIGRtYV8qIEFQSSBjYWxscyAoZHNheGVuYUBwbGV4aXR5Lm5ldCkKLSAqIDIwMDMtMTItMjkgUmV3cml0dGVuIGhpZ2ggc3BlZWQgaXNvIHRyYW5zZmVyIHN1cHBvcnQgKGJ5IE1pY2hhbCBTb2prYSwKLSAqCTxzb2prYW1AY2VudHJ1bS5jej4sIHVwZGF0ZXMgYnkgREIpLgotICoKLSAqIDIwMDItMTEtMjkJQ29ycmVjdCBoYW5kbGluZyBmb3IgaHcgYXN5bmNfbmV4dCByZWdpc3Rlci4KLSAqIDIwMDItMDgtMDYJSGFuZGxpbmcgZm9yIGJ1bGsgYW5kIGludGVycnVwdCB0cmFuc2ZlcnMgaXMgbW9zdGx5IHNoYXJlZDsKLSAqCW9ubHkgc2NoZWR1bGluZyBpcyBkaWZmZXJlbnQsIG5vIGFyYml0cmFyeSBsaW1pdGF0aW9ucy4KLSAqIDIwMDItMDctMjUJU2FuaXR5IGNoZWNrIFBDSSByZWFkcywgbW9zdGx5IGZvciBiZXR0ZXIgY2FyZGJ1cyBzdXBwb3J0LAotICoJY2xlYW4gdXAgSEMgcnVuIHN0YXRlIGhhbmRzaGFraW5nLgotICogMjAwMi0wNS0yNAlQcmVsaW1pbmFyeSBGUy9MUyBpbnRlcnJ1cHRzLCB1c2luZyBzY2hlZHVsaW5nIHNob3J0Y3V0cwotICogMjAwMi0wNS0xMQlDbGVhciBUVCBlcnJvcnMgZm9yIEZTL0xTIGN0cmwvYnVsay4gIEZpbGwgaW4gc29tZSBvdGhlcgotICoJbWlzc2luZyBwaWVjZXM6ICBlbmFibGluZyA2NGJpdCBkbWEsIGhhbmRvZmYgZnJvbSBCSU9TL1NNTS4KLSAqIDIwMDItMDUtMDcJU29tZSBlcnJvciBwYXRoIGNsZWFudXBzIHRvIHJlcG9ydCBiZXR0ZXIgZXJyb3JzOyB3bWIoKTsKLSAqCXVzZSBub24tQ1ZTIHZlcnNpb24gaWQ7IGJldHRlciBpc28gYmFuZHdpZHRoIGNsYWltLgotICogMjAwMi0wNC0xOQlDb250cm9sL2J1bGsvaW50ZXJydXB0IHN1Ym1pdCBubyBsb25nZXIgdXNlcyBnaXZlYmFjaygpIG9uCi0gKgllcnJvcnMgaW4gc3VibWl0IHBhdGguICBCdWdmaXhlcyB0byBpbnRlcnJ1cHQgc2NoZWR1bGluZy9wcm9jZXNzaW5nLgotICogMjAwMi0wMy0wNQlJbml0aWFsIGhpZ2gtc3BlZWQgSVNPIHN1cHBvcnQ7IHJlZHVjZSBJVEQgbWVtb3J5OyBzaGlmdAotICoJbW9yZSBjaGVja2luZyB0byBnZW5lcmljIGhjZCBmcmFtZXdvcmsgKGRiKS4gIE1ha2UgaXQgd29yayB3aXRoCi0gKglQaGlsaXBzIEVIQ0k7IHJlZHVjZSBQQ0kgdHJhZmZpYzsgc2hvcnRlbiBJUlEgcGF0aCAoUm9yeSBCb2x0KS4KLSAqIDIwMDItMDEtMTQJTWlub3IgY2xlYW51cDsgdmVyc2lvbiBzeW5jaC4KLSAqIDIwMDItMDEtMDgJRml4IHJvb3RodWIgaGFuZG9mZiBvZiBGUy9MUyB0byBjb21wYW5pb24gY29udHJvbGxlcnMuCi0gKiAyMDAyLTAxLTA0CUNvbnRyb2wvQnVsayBxdWV1aW5nIGJlaGF2ZXMuCi0gKgotICogMjAwMS0xMi0xMglJbml0aWFsIHBhdGNoIHZlcnNpb24gZm9yIExpbnV4IDIuNS4xIGtlcm5lbC4KLSAqIDIwMDEtSnVuZQlXb3JrcyB3aXRoIHVzYi1zdG9yYWdlIGFuZCBORUMgRUhDSSBvbiAyLjQKICAqLwogCiAjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIxMCBEZWMgMjAwNCIKQEAgLTk1LDcgKzY2LDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyCWhjZF9uYW1lIFtdID0gImVoY2lfaGNkIjsKIAogCi0jdW5kZWYgRUhDSV9WRVJCT1NFX0RFQlVHCisjdW5kZWYgVkVSQk9TRV9ERUJVRwogI3VuZGVmIEVIQ0lfVVJCX1RSQUNFCiAKICNpZmRlZiBERUJVRwpAQCAtMTc0LDYgKzE0NSwxNiBAQAogCXJldHVybiAtRVRJTUVET1VUOwogfQogCitzdGF0aWMgaW50IGhhbmRzaGFrZV9vbl9lcnJvcl9zZXRfaGFsdChzdHJ1Y3QgZWhjaV9oY2QgKmVoY2ksIHZvaWQgX19pb21lbSAqcHRyLAorCQkJCSAgICAgICB1MzIgbWFzaywgdTMyIGRvbmUsIGludCB1c2VjKQoreworCWludCBlcnJvciA9IGhhbmRzaGFrZShlaGNpLCBwdHIsIG1hc2ssIGRvbmUsIHVzZWMpOworCWlmIChlcnJvcikKKwkJZWhjaV90b19oY2QoZWhjaSktPnN0YXRlID0gSENfU1RBVEVfSEFMVDsKKworCXJldHVybiBlcnJvcjsKK30KKwogLyogZm9yY2UgSEMgdG8gaGFsdCBzdGF0ZSBmcm9tIHVua25vd24gKEVIQ0kgc3BlYyBzZWN0aW9uIDIuMykgKi8KIHN0YXRpYyBpbnQgZWhjaV9oYWx0IChzdHJ1Y3QgZWhjaV9oY2QgKmVoY2kpCiB7CkBAIC0yNDYsMTEgKzIyNyw5IEBACiAJLyogd2FpdCBmb3IgYW55IHNjaGVkdWxlIGVuYWJsZXMvZGlzYWJsZXMgdG8gdGFrZSBlZmZlY3QgKi8KIAl0ZW1wID0gZWhjaV9yZWFkbChlaGNpLCAmZWhjaS0+cmVncy0+Y29tbWFuZCkgPDwgMTA7CiAJdGVtcCAmPSBTVFNfQVNTIHwgU1RTX1BTUzsKLQlpZiAoaGFuZHNoYWtlIChlaGNpLCAmZWhjaS0+cmVncy0+c3RhdHVzLCBTVFNfQVNTIHwgU1RTX1BTUywKLQkJCQl0ZW1wLCAxNiAqIDEyNSkgIT0gMCkgewotCQllaGNpX3RvX2hjZChlaGNpKS0+c3RhdGUgPSBIQ19TVEFURV9IQUxUOworCWlmIChoYW5kc2hha2Vfb25fZXJyb3Jfc2V0X2hhbHQoZWhjaSwgJmVoY2ktPnJlZ3MtPnN0YXR1cywKKwkJCQkJU1RTX0FTUyB8IFNUU19QU1MsIHRlbXAsIDE2ICogMTI1KSkKIAkJcmV0dXJuOwotCX0KIAogCS8qIHRoZW4gZGlzYWJsZSBhbnl0aGluZyB0aGF0J3Mgc3RpbGwgYWN0aXZlICovCiAJdGVtcCA9IGVoY2lfcmVhZGwoZWhjaSwgJmVoY2ktPnJlZ3MtPmNvbW1hbmQpOwpAQCAtMjU4LDExICsyMzcsOCBAQAogCWVoY2lfd3JpdGVsKGVoY2ksIHRlbXAsICZlaGNpLT5yZWdzLT5jb21tYW5kKTsKIAogCS8qIGhhcmR3YXJlIGNhbiB0YWtlIDE2IG1pY3JvZnJhbWVzIHRvIHR1cm4gb2ZmIC4uLiAqLwotCWlmIChoYW5kc2hha2UgKGVoY2ksICZlaGNpLT5yZWdzLT5zdGF0dXMsIFNUU19BU1MgfCBTVFNfUFNTLAotCQkJCTAsIDE2ICogMTI1KSAhPSAwKSB7Ci0JCWVoY2lfdG9faGNkKGVoY2kpLT5zdGF0ZSA9IEhDX1NUQVRFX0hBTFQ7Ci0JCXJldHVybjsKLQl9CisJaGFuZHNoYWtlX29uX2Vycm9yX3NldF9oYWx0KGVoY2ksICZlaGNpLT5yZWdzLT5zdGF0dXMsCisJCQkJICAgIFNUU19BU1MgfCBTVFNfUFNTLCAwLCAxNiAqIDEyNSk7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0zNTUsMTcgKzMzMSwxMyBAQAogCQkJCSZlaGNpLT5yZWdzLT5wb3J0X3N0YXR1c1twb3J0XSk7CiB9CiAKLS8qIGVoY2lfc2h1dGRvd24ga2ljayBpbiBmb3Igc2lsaWNvbiBvbiBhbnkgYnVzIChub3QganVzdCBwY2ksIGV0YykuCi0gKiBUaGlzIGZvcmNpYmx5IGRpc2FibGVzIGRtYSBhbmQgSVJRcywgaGVscGluZyBrZXhlYyBhbmQgb3RoZXIgY2FzZXMKLSAqIHdoZXJlIHRoZSBuZXh0IHN5c3RlbSBzb2Z0d2FyZSBtYXkgZXhwZWN0IGNsZWFuIHN0YXRlLgorLyoKKyAqIEhhbHQgSEMsIHR1cm4gb2ZmIGFsbCBwb3J0cywgYW5kIGxldCB0aGUgQklPUyB1c2UgdGhlIGNvbXBhbmlvbiBjb250cm9sbGVycy4KKyAqIFNob3VsZCBiZSBjYWxsZWQgd2l0aCBlaGNpLT5sb2NrIGhlbGQuCiAgKi8KLXN0YXRpYyB2b2lkCi1laGNpX3NodXRkb3duIChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQorc3RhdGljIHZvaWQgZWhjaV9zaWxlbmNlX2NvbnRyb2xsZXIoc3RydWN0IGVoY2lfaGNkICplaGNpKQogewotCXN0cnVjdCBlaGNpX2hjZAkqZWhjaTsKLQotCWVoY2kgPSBoY2RfdG9fZWhjaSAoaGNkKTsKLQkodm9pZCkgZWhjaV9oYWx0IChlaGNpKTsKKwllaGNpX2hhbHQoZWhjaSk7CiAJZWhjaV90dXJuX29mZl9hbGxfcG9ydHMoZWhjaSk7CiAKIAkvKiBtYWtlIEJJT1MvZXRjIHVzZSBjb21wYW5pb24gY29udHJvbGxlciBkdXJpbmcgcmVib290ICovCkBAIC0zNzUsNiArMzQ3LDIyIEBACiAJZWhjaV9yZWFkbChlaGNpLCAmZWhjaS0+cmVncy0+Y29uZmlndXJlZF9mbGFnKTsKIH0KIAorLyogZWhjaV9zaHV0ZG93biBraWNrIGluIGZvciBzaWxpY29uIG9uIGFueSBidXMgKG5vdCBqdXN0IHBjaSwgZXRjKS4KKyAqIFRoaXMgZm9yY2libHkgZGlzYWJsZXMgZG1hIGFuZCBJUlFzLCBoZWxwaW5nIGtleGVjIGFuZCBvdGhlciBjYXNlcworICogd2hlcmUgdGhlIG5leHQgc3lzdGVtIHNvZnR3YXJlIG1heSBleHBlY3QgY2xlYW4gc3RhdGUuCisgKi8KK3N0YXRpYyB2b2lkIGVoY2lfc2h1dGRvd24oc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3QgZWhjaV9oY2QJKmVoY2kgPSBoY2RfdG9fZWhjaShoY2QpOworCisJZGVsX3RpbWVyX3N5bmMoJmVoY2ktPndhdGNoZG9nKTsKKwlkZWxfdGltZXJfc3luYygmZWhjaS0+aWFhX3dhdGNoZG9nKTsKKworCXNwaW5fbG9ja19pcnEoJmVoY2ktPmxvY2spOworCWVoY2lfc2lsZW5jZV9jb250cm9sbGVyKGVoY2kpOworCXNwaW5fdW5sb2NrX2lycSgmZWhjaS0+bG9jayk7Cit9CisKIHN0YXRpYyB2b2lkIGVoY2lfcG9ydF9wb3dlciAoc3RydWN0IGVoY2lfaGNkICplaGNpLCBpbnQgaXNfb24pCiB7CiAJdW5zaWduZWQgcG9ydDsKQEAgLTQyNSwxNSArNDEzLDE1IEBACiAJCXRpbWVyX2FjdGlvbiAoZWhjaSwgVElNRVJfSU9fV0FUQ0hET0cpOwogfQogCisvKgorICogQ2FsbGVkIHdoZW4gdGhlIGVoY2lfaGNkIG1vZHVsZSBpcyByZW1vdmVkLgorICovCiBzdGF0aWMgdm9pZCBlaGNpX3N0b3AgKHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7CiAJc3RydWN0IGVoY2lfaGNkCQkqZWhjaSA9IGhjZF90b19laGNpIChoY2QpOwogCiAJZWhjaV9kYmcgKGVoY2ksICJzdG9wXG4iKTsKIAotCS8qIFR1cm4gb2ZmIHBvcnQgcG93ZXIgb24gYWxsIHJvb3QgaHViIHBvcnRzLiAqLwotCWVoY2lfcG9ydF9wb3dlciAoZWhjaSwgMCk7Ci0KIAkvKiBubyBtb3JlIGludGVycnVwdHMgLi4uICovCiAJZGVsX3RpbWVyX3N5bmMgKCZlaGNpLT53YXRjaGRvZyk7CiAJZGVsX3RpbWVyX3N5bmMoJmVoY2ktPmlhYV93YXRjaGRvZyk7CkBAIC00NDIsMTMgKzQzMCwxMCBAQAogCWlmIChIQ19JU19SVU5OSU5HIChoY2QtPnN0YXRlKSkKIAkJZWhjaV9xdWllc2NlIChlaGNpKTsKIAorCWVoY2lfc2lsZW5jZV9jb250cm9sbGVyKGVoY2kpOwogCWVoY2lfcmVzZXQgKGVoY2kpOwotCWVoY2lfd3JpdGVsKGVoY2ksIDAsICZlaGNpLT5yZWdzLT5pbnRyX2VuYWJsZSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZlaGNpLT5sb2NrKTsKIAotCS8qIGxldCBjb21wYW5pb24gY29udHJvbGxlcnMgd29yayB3aGVuIHdlIGFyZW4ndCAqLwotCWVoY2lfd3JpdGVsKGVoY2ksIDAsICZlaGNpLT5yZWdzLT5jb25maWd1cmVkX2ZsYWcpOwotCiAJcmVtb3ZlX2NvbXBhbmlvbl9maWxlKGVoY2kpOwogCXJlbW92ZV9kZWJ1Z19maWxlcyAoZWhjaSk7CiAKQEAgLTY3Niw3ICs2NjEsNyBAQAogCWNtZCA9IGVoY2lfcmVhZGwoZWhjaSwgJmVoY2ktPnJlZ3MtPmNvbW1hbmQpOwogCWJoID0gMDsKIAotI2lmZGVmCUVIQ0lfVkVSQk9TRV9ERUJVRworI2lmZGVmCVZFUkJPU0VfREVCVUcKIAkvKiB1bnJlcXVlc3RlZC9pZ25vcmVkOiBGcmFtZSBMaXN0IFJvbGxvdmVyICovCiAJZGJnX3N0YXR1cyAoZWhjaSwgImlycSIsIHN0YXR1cyk7CiAjZW5kaWYKQEAgLTcxMCw2ICs2OTUsOCBAQAogCS8qIHJlbW90ZSB3YWtldXAgWzQuMy4xXSAqLwogCWlmIChzdGF0dXMgJiBTVFNfUENEKSB7CiAJCXVuc2lnbmVkCWkgPSBIQ1NfTl9QT1JUUyAoZWhjaS0+aGNzX3BhcmFtcyk7CisKKwkJLyoga2ljayByb290IGh1YiBsYXRlciAqLwogCQlwY2Rfc3RhdHVzID0gc3RhdHVzOwogCiAJCS8qIHJlc3VtZSByb290IGh1Yj8gKi8KQEAgLTczOCw4ICs3MjUsNiBAQAogCiAJLyogUENJIGVycm9ycyBbNC4xNS4yLjRdICovCiAJaWYgKHVubGlrZWx5ICgoc3RhdHVzICYgU1RTX0ZBVEFMKSAhPSAwKSkgewotCQkvKiBib2d1cyAiZmF0YWwiIElSUXMgYXBwZWFyIG9uIHNvbWUgY2hpcHMuLi4gd2h5PyAgKi8KLQkJc3RhdHVzID0gZWhjaV9yZWFkbChlaGNpLCAmZWhjaS0+cmVncy0+c3RhdHVzKTsKIAkJZGJnX2NtZCAoZWhjaSwgImZhdGFsIiwgZWhjaV9yZWFkbChlaGNpLAogCQkJCQkJICAgJmVoY2ktPnJlZ3MtPmNvbW1hbmQpKTsKIAkJZGJnX3N0YXR1cyAoZWhjaSwgImZhdGFsIiwgc3RhdHVzKTsKQEAgLTc1OCw3ICs3NDMsNyBAQAogCWlmIChiaCkKIAkJZWhjaV93b3JrIChlaGNpKTsKIAlzcGluX3VubG9jayAoJmVoY2ktPmxvY2spOwotCWlmIChwY2Rfc3RhdHVzICYgU1RTX1BDRCkKKwlpZiAocGNkX3N0YXR1cykKIAkJdXNiX2hjZF9wb2xsX3JoX3N0YXR1cyhoY2QpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTc4OCw4ICs3NzMsMTQgQEAKIAlJTklUX0xJU1RfSEVBRCAoJnF0ZF9saXN0KTsKIAogCXN3aXRjaCAodXNiX3BpcGV0eXBlICh1cmItPnBpcGUpKSB7Ci0JLy8gY2FzZSBQSVBFX0NPTlRST0w6Ci0JLy8gY2FzZSBQSVBFX0JVTEs6CisJY2FzZSBQSVBFX0NPTlRST0w6CisJCS8qIHFoX2NvbXBsZXRpb25zKCkgY29kZSBkb2Vzbid0IGhhbmRsZSBhbGwgdGhlIGZhdWx0IGNhc2VzCisJCSAqIGluIG11bHRpLVREIGNvbnRyb2wgdHJhbnNmZXJzLiAgRXZlbiAxS0IgaXMgcmFyZSBhbnl3YXkuCisJCSAqLworCQlpZiAodXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID4gKDE2ICogMTAyNCkpCisJCQlyZXR1cm4gLUVNU0dTSVpFOworCQkvKiBGQUxMVEhST1VHSCAqLworCS8qIGNhc2UgUElQRV9CVUxLOiAqLwogCWRlZmF1bHQ6CiAJCWlmICghcWhfdXJiX3RyYW5zYWN0aW9uIChlaGNpLCB1cmIsICZxdGRfbGlzdCwgbWVtX2ZsYWdzKSkKIAkJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWh1Yi5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWh1Yi5jCmluZGV4IDRlMDY1ZTUuLmVmZmZlZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1odWIuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaHViLmMKQEAgLTI4LDcgKzI4LDkgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotI2lmZGVmCUNPTkZJR19VU0JfUEVSU0lTVAorI2RlZmluZQlQT1JUX1dBS0VfQklUUwkoUE9SVF9XS09DX0V8UE9SVF9XS0RJU0NfRXxQT1JUX1dLQ09OTl9FKQorCisjaWZkZWYJQ09ORklHX1BNCiAKIHN0YXRpYyBpbnQgZWhjaV9odWJfY29udHJvbCgKIAlzdHJ1Y3QgdXNiX2hjZAkqaGNkLApAQCAtMTA0LDE1ICsxMDYsNiBAQAogCWVoY2ktPm93bmVkX3BvcnRzID0gMDsKIH0KIAotI2Vsc2UJLyogQ09ORklHX1VTQl9QRVJTSVNUICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBlaGNpX2hhbmRvdmVyX2NvbXBhbmlvbl9wb3J0cyhzdHJ1Y3QgZWhjaV9oY2QgKmVoY2kpCi17IH0KLQotI2VuZGlmCi0KLSNpZmRlZglDT05GSUdfUE0KLQogc3RhdGljIGludCBlaGNpX2J1c19zdXNwZW5kIChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQogewogCXN0cnVjdCBlaGNpX2hjZAkJKmVoY2kgPSBoY2RfdG9fZWhjaSAoaGNkKTsKQEAgLTE1OCwxMCArMTUxLDEwIEBACiAJCX0KIAogCQkvKiBlbmFibGUgcmVtb3RlIHdha2V1cCBvbiBhbGwgcG9ydHMgKi8KLQkJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZoY2QtPnNlbGYucm9vdF9odWItPmRldikpCi0JCQl0MiB8PSBQT1JUX1dLT0NfRXxQT1JUX1dLRElTQ19FfFBPUlRfV0tDT05OX0U7CisJCWlmIChoY2QtPnNlbGYucm9vdF9odWItPmRvX3JlbW90ZV93YWtldXApCisJCQl0MiB8PSBQT1JUX1dBS0VfQklUUzsKIAkJZWxzZQotCQkJdDIgJj0gfihQT1JUX1dLT0NfRXxQT1JUX1dLRElTQ19FfFBPUlRfV0tDT05OX0UpOworCQkJdDIgJj0gflBPUlRfV0FLRV9CSVRTOwogCiAJCWlmICh0MSAhPSB0MikgewogCQkJZWhjaV92ZGJnIChlaGNpLCAicG9ydCAlZCwgJTA4eCAtPiAlMDh4XG4iLApAQCAtMTgzLDcgKzE3Niw3IEBACiAKIAkvKiBhbGxvdyByZW1vdGUgd2FrZXVwICovCiAJbWFzayA9IElOVFJfTUFTSzsKLQlpZiAoIWRldmljZV9tYXlfd2FrZXVwKCZoY2QtPnNlbGYucm9vdF9odWItPmRldikpCisJaWYgKCFoY2QtPnNlbGYucm9vdF9odWItPmRvX3JlbW90ZV93YWtldXApCiAJCW1hc2sgJj0gflNUU19QQ0Q7CiAJZWhjaV93cml0ZWwoZWhjaSwgbWFzaywgJmVoY2ktPnJlZ3MtPmludHJfZW5hYmxlKTsKIAllaGNpX3JlYWRsKGVoY2ksICZlaGNpLT5yZWdzLT5pbnRyX2VuYWJsZSk7CkBAIC0yNDEsOCArMjM0LDcgQEAKIAlpID0gSENTX05fUE9SVFMgKGVoY2ktPmhjc19wYXJhbXMpOwogCXdoaWxlIChpLS0pIHsKIAkJdGVtcCA9IGVoY2lfcmVhZGwoZWhjaSwgJmVoY2ktPnJlZ3MtPnBvcnRfc3RhdHVzIFtpXSk7Ci0JCXRlbXAgJj0gfihQT1JUX1JXQ19CSVRTCi0JCQl8IFBPUlRfV0tPQ19FIHwgUE9SVF9XS0RJU0NfRSB8IFBPUlRfV0tDT05OX0UpOworCQl0ZW1wICY9IH4oUE9SVF9SV0NfQklUUyB8IFBPUlRfV0FLRV9CSVRTKTsKIAkJaWYgKHRlc3RfYml0KGksICZlaGNpLT5idXNfc3VzcGVuZGVkKSAmJgogCQkJCSh0ZW1wICYgUE9SVF9TVVNQRU5EKSkgewogCQkJZWhjaS0+cmVzZXRfZG9uZSBbaV0gPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyAoMjApOwpAQCAtMjgxLDkgKzI3Myw3IEBACiAJZWhjaV93cml0ZWwoZWhjaSwgSU5UUl9NQVNLLCAmZWhjaS0+cmVncy0+aW50cl9lbmFibGUpOwogCiAJc3Bpbl91bmxvY2tfaXJxICgmZWhjaS0+bG9jayk7Ci0KLQlpZiAoIXBvd2VyX29rYXkpCi0JCWVoY2lfaGFuZG92ZXJfY29tcGFuaW9uX3BvcnRzKGVoY2kpOworCWVoY2lfaGFuZG92ZXJfY29tcGFuaW9uX3BvcnRzKGVoY2kpOwogCXJldHVybiAwOwogfQogCkBAIC01NDUsOCArNTM1LDYgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotI2RlZmluZQlQT1JUX1dBS0VfQklUUwkoUE9SVF9XS09DX0V8UE9SVF9XS0RJU0NfRXxQT1JUX1dLQ09OTl9FKQotCiBzdGF0aWMgaW50IGVoY2lfaHViX2NvbnRyb2wgKAogCXN0cnVjdCB1c2JfaGNkCSpoY2QsCiAJdTE2CQl0eXBlUmVxLApAQCAtNzc4LDcgKzc2Niw3IEBACiAJCWlmICh0ZW1wICYgUE9SVF9QT1dFUikKIAkJCXN0YXR1cyB8PSAxIDw8IFVTQl9QT1JUX0ZFQVRfUE9XRVI7CiAKLSNpZm5kZWYJRUhDSV9WRVJCT1NFX0RFQlVHCisjaWZuZGVmCVZFUkJPU0VfREVCVUcKIAlpZiAoc3RhdHVzICYgfjB4ZmZmZikJLyogb25seSBpZiB3UG9ydENoYW5nZSBpcyBpbnRlcmVzdGluZyAqLwogI2VuZGlmCiAJCWRiZ19wb3J0IChlaGNpLCAiR2V0U3RhdHVzIiwgd0luZGV4ICsgMSwgdGVtcCk7CkBAIC04MTIsOCArODAwLDYgQEAKIAkJCWlmICgodGVtcCAmIFBPUlRfUEUpID09IDAKIAkJCQkJfHwgKHRlbXAgJiBQT1JUX1JFU0VUKSAhPSAwKQogCQkJCWdvdG8gZXJyb3I7Ci0JCQlpZiAoZGV2aWNlX21heV93YWtldXAoJmhjZC0+c2VsZi5yb290X2h1Yi0+ZGV2KSkKLQkJCQl0ZW1wIHw9IFBPUlRfV0FLRV9CSVRTOwogCQkJZWhjaV93cml0ZWwoZWhjaSwgdGVtcCB8IFBPUlRfU1VTUEVORCwgc3RhdHVzX3JlZyk7CiAJCQlicmVhazsKIAkJY2FzZSBVU0JfUE9SVF9GRUFUX1BPV0VSOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWl4cDR4eC5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWl4cDR4eC5jCmluZGV4IDMwNDFkOGYuLjYwMWM4NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1peHA0eHguYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaXhwNHh4LmMKQEAgLTE0MCwxMyArMTQwLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLU1PRFVMRV9BTElBUygiaXhwNHh4LWVoY2kiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06aXhwNHh4LWVoY2kiKTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaXhwNHh4X2VoY2lfZHJpdmVyID0gewogCS5wcm9iZSA9IGl4cDR4eF9laGNpX3Byb2JlLAogCS5yZW1vdmUgPSBpeHA0eHhfZWhjaV9yZW1vdmUsCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAiaXhwNHh4LWVoY2kiLAotCQkuYnVzID0gJnBsYXRmb3JtX2J1c190eXBlCiAJfSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcGNpLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcGNpLmMKaW5kZXggNzJjY2Q1Ni4uNWJiN2Y2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXBjaS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wY2kuYwpAQCAtMTMwLDYgKzEzMCw3IEBACiAJY2FzZSBQQ0lfVkVORE9SX0lEX1RESToKIAkJaWYgKHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1RESV9FSENJKSB7CiAJCQllaGNpLT5pc190ZGlfcmhfdHQgPSAxOworCQkJaGNkLT5oYXNfdHQgPSAxOwogCQkJdGRpX3Jlc2V0KGVoY2kpOwogCQl9CiAJCWJyZWFrOwpAQCAtMjIxLDYgKzIyMiw3IEBACiAJCWVoY2lfd2FybihlaGNpLCAic2VsZWN0aXZlIHN1c3BlbmQvd2FrZXVwIHVuYXZhaWxhYmxlXG4iKTsKICNlbmRpZgogCisJZWhjaV9wb3J0X3Bvd2VyKGVoY2ksIDEpOwogCXJldHZhbCA9IGVoY2lfcGNpX3JlaW5pdChlaGNpLCBwZGV2KTsKIGRvbmU6CiAJcmV0dXJuIHJldHZhbDsKQEAgLTI5OSw3ICszMDEsNyBAQAogCWlmIChlaGNpX3JlYWRsKGVoY2ksICZlaGNpLT5yZWdzLT5jb25maWd1cmVkX2ZsYWcpID09IEZMQUdfQ0YpIHsKIAkJaW50CW1hc2sgPSBJTlRSX01BU0s7CiAKLQkJaWYgKCFkZXZpY2VfbWF5X3dha2V1cCgmaGNkLT5zZWxmLnJvb3RfaHViLT5kZXYpKQorCQlpZiAoIWhjZC0+c2VsZi5yb290X2h1Yi0+ZG9fcmVtb3RlX3dha2V1cCkKIAkJCW1hc2sgJj0gflNUU19QQ0Q7CiAJCWVoY2lfd3JpdGVsKGVoY2ksIG1hc2ssICZlaGNpLT5yZWdzLT5pbnRyX2VuYWJsZSk7CiAJCWVoY2lfcmVhZGwoZWhjaSwgJmVoY2ktPnJlZ3MtPmludHJfZW5hYmxlKTsKQEAgLTMyOSw3ICszMzEsNiBAQAogCiAJLyogaGVyZSB3ZSAia25vdyIgcm9vdCBwb3J0cyBzaG91bGQgYWx3YXlzIHN0YXkgcG93ZXJlZCAqLwogCWVoY2lfcG9ydF9wb3dlcihlaGNpLCAxKTsKLQllaGNpX2hhbmRvdmVyX2NvbXBhbmlvbl9wb3J0cyhlaGNpKTsKIAogCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9TVVNQRU5ERUQ7CiAJcmV0dXJuIDA7CkBAIC0zNTMsOCArMzU0LDggQEAKIAkucmVzZXQgPQkJZWhjaV9wY2lfc2V0dXAsCiAJLnN0YXJ0ID0JCWVoY2lfcnVuLAogI2lmZGVmCUNPTkZJR19QTQotCS5zdXNwZW5kID0JCWVoY2lfcGNpX3N1c3BlbmQsCi0JLnJlc3VtZSA9CQllaGNpX3BjaV9yZXN1bWUsCisJLnBjaV9zdXNwZW5kID0JCWVoY2lfcGNpX3N1c3BlbmQsCisJLnBjaV9yZXN1bWUgPQkJZWhjaV9wY2lfcmVzdW1lLAogI2VuZGlmCiAJLnN0b3AgPQkJCWVoY2lfc3RvcCwKIAkuc2h1dGRvd24gPQkJZWhjaV9zaHV0ZG93biwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wcGMtc29jLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcHBjLXNvYy5jCmluZGV4IGEzMjQ5MDcuLjZjNzYwMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wcGMtc29jLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXBwYy1zb2MuYwpAQCAtMTc1LDYgKzE3NSw3IEBACiAJaWYgKHVzYl9kaXNhYmxlZCgpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCS8qIEZJWE1FIHdlIG9ubHkgd2FudCBvbmUgb25lIHByb2JlKCkgbm90IHR3byAqLwogCXJldCA9IHVzYl9laGNpX3BwY19zb2NfcHJvYmUoJmVoY2lfcHBjX3NvY19oY19kcml2ZXIsICZoY2QsIHBkZXYpOwogCXJldHVybiByZXQ7CiB9CkBAIC0xODMsMTcgKzE4NCwxNyBAQAogewogCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAorCS8qIEZJWE1FIHdlIG9ubHkgd2FudCBvbmUgb25lIHJlbW92ZSgpIG5vdCB0d28gKi8KIAl1c2JfZWhjaV9wcGNfc29jX3JlbW92ZShoY2QsIHBkZXYpOwogCXJldHVybiAwOwogfQogCi1NT0RVTEVfQUxJQVMoInBwYy1zb2MtZWhjaSIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpwcGMtc29jLWVoY2kiKTsKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGVoY2lfcHBjX3NvY19kcml2ZXIgPSB7CiAJLnByb2JlID0gZWhjaV9oY2RfcHBjX3NvY19kcnZfcHJvYmUsCiAJLnJlbW92ZSA9IGVoY2lfaGNkX3BwY19zb2NfZHJ2X3JlbW92ZSwKIAkuc2h1dGRvd24gPSB1c2JfaGNkX3BsYXRmb3JtX3NodXRkb3duLAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gInBwYy1zb2MtZWhjaSIsCi0JCS5idXMgPSAmcGxhdGZvcm1fYnVzX3R5cGUKIAl9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXBzMy5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXBzMy5jCmluZGV4IGJiZGE1OGUuLjY5NzgyMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wczMuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcHMzLmMKQEAgLTEyNSw3ICsxMjUsNiBAQAogCQlnb3RvIGZhaWxfaXJxOwogCX0KIAotCWRldi0+Y29yZS5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CiAJZGV2LT5jb3JlLmRtYV9tYXNrID0gJmR1bW15X21hc2s7IC8qIEZJWE1FOiBmb3IgaW1wcm9wZXIgdXNiIGNvZGUgKi8KIAogCWhjZCA9IHVzYl9jcmVhdGVfaGNkKCZwczNfZWhjaV9oY19kcml2ZXIsICZkZXYtPmNvcmUsIGRldi0+Y29yZS5idXNfaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXEuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1xLmMKaW5kZXggMmU0OWRlOC4uNWFlNjg5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXEuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcS5jCkBAIC0yNDIsNyArMjQyLDggQEAKIAlpZiAodW5saWtlbHkodXJiLT51bmxpbmtlZCkpIHsKIAkJQ09VTlQoZWhjaS0+c3RhdHMudW5saW5rKTsKIAl9IGVsc2UgewotCQlpZiAobGlrZWx5KHN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpKQorCQkvKiByZXBvcnQgbm9uLWVycm9yIGFuZCBzaG9ydCByZWFkIHN0YXR1cyBhcyB6ZXJvICovCisJCWlmIChzdGF0dXMgPT0gLUVJTlBST0dSRVNTIHx8IHN0YXR1cyA9PSAtRVJFTU9URUlPKQogCQkJc3RhdHVzID0gMDsKIAkJQ09VTlQoZWhjaS0+c3RhdHMuY29tcGxldGUpOwogCX0KQEAgLTI1MCw3ICsyNTEsNyBAQAogI2lmZGVmIEVIQ0lfVVJCX1RSQUNFCiAJZWhjaV9kYmcgKGVoY2ksCiAJCSIlcyAlcyB1cmIgJXAgZXAlZCVzIHN0YXR1cyAlZCBsZW4gJWQvJWRcbiIsCi0JCV9fRlVOQ1RJT05fXywgdXJiLT5kZXYtPmRldnBhdGgsIHVyYiwKKwkJX19mdW5jX18sIHVyYi0+ZGV2LT5kZXZwYXRoLCB1cmIsCiAJCXVzYl9waXBlZW5kcG9pbnQgKHVyYi0+cGlwZSksCiAJCXVzYl9waXBlaW4gKHVyYi0+cGlwZSkgPyAiaW4iIDogIm91dCIsCiAJCXN0YXR1cywKQEAgLTI4Myw3ICsyODQsNiBAQAogCWludAkJCWxhc3Rfc3RhdHVzID0gLUVJTlBST0dSRVNTOwogCWludAkJCXN0b3BwZWQ7CiAJdW5zaWduZWQJCWNvdW50ID0gMDsKLQlpbnQJCQlkb19zdGF0dXMgPSAwOwogCXU4CQkJc3RhdGU7CiAJdTMyCQkJaGFsdCA9IEhBTFRfQklUKGVoY2kpOwogCkBAIC0zMDksNyArMzA5LDYgQEAKIAkJc3RydWN0IGVoY2lfcXRkCSpxdGQ7CiAJCXN0cnVjdCB1cmIJKnVyYjsKIAkJdTMyCQl0b2tlbiA9IDA7Ci0JCWludAkJcXRkX3N0YXR1czsKIAogCQlxdGQgPSBsaXN0X2VudHJ5IChlbnRyeSwgc3RydWN0IGVoY2lfcXRkLCBxdGRfbGlzdCk7CiAJCXVyYiA9IHF0ZC0+dXJiOwpAQCAtMzM2LDExICszMzUsMjAgQEAKIAkJLyogYWx3YXlzIGNsZWFuIHVwIHF0ZHMgdGhlIGhjIGRlLWFjdGl2YXRlZCAqLwogCQlpZiAoKHRva2VuICYgUVREX1NUU19BQ1RJVkUpID09IDApIHsKIAorCQkJLyogb24gU1RBTEwsIGVycm9yLCBhbmQgc2hvcnQgcmVhZHMgdGhpcyB1cmIgbXVzdAorCQkJICogY29tcGxldGUgYW5kIGFsbCBpdHMgcXRkcyBtdXN0IGJlIHJlY3ljbGVkLgorCQkJICovCiAJCQlpZiAoKHRva2VuICYgUVREX1NUU19IQUxUKSAhPSAwKSB7CiAJCQkJc3RvcHBlZCA9IDE7CiAKIAkJCS8qIG1hZ2ljIGR1bW15IGZvciBzb21lIHNob3J0IHJlYWRzOyBxaCB3b24ndCBhZHZhbmNlLgogCQkJICogdGhhdCBzaWxpY29uIHF1aXJrIGNhbiBraWNrIGluIHdpdGggdGhpcyBkdW1teSB0b28uCisJCQkgKgorCQkJICogb3RoZXIgc2hvcnQgcmVhZHMgd29uJ3Qgc3RvcCB0aGUgcXVldWUsIGluY2x1ZGluZworCQkJICogY29udHJvbCB0cmFuc2ZlcnMgKHN0YXR1cyBzdGFnZSBoYW5kbGVzIHRoYXQpIG9yCisJCQkgKiBtb3N0IG90aGVyIHNpbmdsZS1xdGQgcmVhZHMgLi4uIHRoZSBxdWV1ZSBzdG9wcyBpZgorCQkJICogVVJCX1NIT1JUX05PVF9PSyB3YXMgc2V0IHNvIHRoZSBkcml2ZXIgc3VibWl0dGluZworCQkJICogdGhlIHVyYnMgY291bGQgY2xlYW4gaXQgdXAuCiAJCQkgKi8KIAkJCX0gZWxzZSBpZiAoSVNfU0hPUlRfUkVBRCAodG9rZW4pCiAJCQkJCSYmICEocXRkLT5od19hbHRfbmV4dApAQCAtMzU0LDI4ICszNjIsMjEgQEAKIAkJCQkmJiBIQ19JU19SVU5OSU5HIChlaGNpX3RvX2hjZChlaGNpKS0+c3RhdGUpKSkgewogCQkJYnJlYWs7CiAKKwkJLyogc2NhbiB0aGUgd2hvbGUgcXVldWUgZm9yIHVubGlua3Mgd2hlbmV2ZXIgaXQgc3RvcHMgKi8KIAkJfSBlbHNlIHsKIAkJCXN0b3BwZWQgPSAxOwogCi0JCQlpZiAodW5saWtlbHkgKCFIQ19JU19SVU5OSU5HIChlaGNpX3RvX2hjZChlaGNpKS0+c3RhdGUpKSkKKwkJCS8qIGNhbmNlbCBldmVyeXRoaW5nIGlmIHdlIGhhbHQsIHN1c3BlbmQsIGV0YyAqLworCQkJaWYgKCFIQ19JU19SVU5OSU5HKGVoY2lfdG9faGNkKGVoY2kpLT5zdGF0ZSkpCiAJCQkJbGFzdF9zdGF0dXMgPSAtRVNIVVRET1dOOwogCi0JCQkvKiBpZ25vcmUgYWN0aXZlIHVyYnMgdW5sZXNzIHNvbWUgcHJldmlvdXMgcXRkCi0JCQkgKiBmb3IgdGhlIHVyYiBmYXVsdGVkIChpbmNsdWRpbmcgc2hvcnQgcmVhZCkgb3IKLQkJCSAqIGl0cyB1cmIgd2FzIGNhbmNlbGVkLiAgd2UgbWF5IHBhdGNoIHFoIG9yIHF0ZHMuCisJCQkvKiB0aGlzIHF0ZCBpcyBhY3RpdmU7IHNraXAgaXQgdW5sZXNzIGEgcHJldmlvdXMgcXRkCisJCQkgKiBmb3IgaXRzIHVyYiBmYXVsdGVkLCBvciBpdHMgdXJiIHdhcyBjYW5jZWxlZC4KIAkJCSAqLwotCQkJaWYgKGxpa2VseShsYXN0X3N0YXR1cyA9PSAtRUlOUFJPR1JFU1MgJiYKLQkJCQkJIXVyYi0+dW5saW5rZWQpKQorCQkJZWxzZSBpZiAobGFzdF9zdGF0dXMgPT0gLUVJTlBST0dSRVNTICYmICF1cmItPnVubGlua2VkKQogCQkJCWNvbnRpbnVlOwogCi0JCQkvKiBpc3N1ZSBzdGF0dXMgYWZ0ZXIgc2hvcnQgY29udHJvbCByZWFkcyAqLwotCQkJaWYgKHVubGlrZWx5IChkb19zdGF0dXMgIT0gMCkKLQkJCQkJJiYgUVREX1BJRCAodG9rZW4pID09IDAgLyogT1VUICovKSB7Ci0JCQkJZG9fc3RhdHVzID0gMDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLyogdG9rZW4gaW4gb3ZlcmxheSBtYXkgYmUgbW9zdCBjdXJyZW50ICovCisJCQkvKiBxaCB1bmxpbmtlZDsgdG9rZW4gaW4gb3ZlcmxheSBtYXkgYmUgbW9zdCBjdXJyZW50ICovCiAJCQlpZiAoc3RhdGUgPT0gUUhfU1RBVEVfSURMRQogCQkJCQkmJiBjcHVfdG9faGMzMihlaGNpLCBxdGQtPnF0ZF9kbWEpCiAJCQkJCQk9PSBxaC0+aHdfY3VycmVudCkKQEAgLTM5MiwyMSArMzkzLDMyIEBACiAJCQl9CiAJCX0KIAotCQkvKiByZW1vdmUgaXQgZnJvbSB0aGUgcXVldWUgKi8KLQkJcXRkX3N0YXR1cyA9IHF0ZF9jb3B5X3N0YXR1cyhlaGNpLCB1cmIsIHF0ZC0+bGVuZ3RoLCB0b2tlbik7Ci0JCWlmICh1bmxpa2VseShxdGRfc3RhdHVzID09IC1FUkVNT1RFSU8pKSB7Ci0JCQlkb19zdGF0dXMgPSAoIXVyYi0+dW5saW5rZWQgJiYKLQkJCQkJdXNiX3BpcGVjb250cm9sKHVyYi0+cGlwZSkpOwotCQkJcXRkX3N0YXR1cyA9IDA7CisJCS8qIHVubGVzcyB3ZSBhbHJlYWR5IGtub3cgdGhlIHVyYidzIHN0YXR1cywgY29sbGVjdCBxdGQgc3RhdHVzCisJCSAqIGFuZCB1cGRhdGUgY291bnQgb2YgYnl0ZXMgdHJhbnNmZXJyZWQuICBpbiBjb21tb24gc2hvcnQgcmVhZAorCQkgKiBjYXNlcyB3aXRoIG9ubHkgb25lIGRhdGEgcXRkIChpbmNsdWRpbmcgY29udHJvbCB0cmFuc2ZlcnMpLAorCQkgKiBxdWV1ZSBwcm9jZXNzaW5nIHdvbid0IGhhbHQuICBidXQgd2l0aCB0d28gb3IgbW9yZSBxdGRzIChmb3IKKwkJICogZXhhbXBsZSwgd2l0aCBhIDMyIEtCIHRyYW5zZmVyKSwgd2hlbiB0aGUgZmlyc3QgcXRkIGdldHMgYQorCQkgKiBzaG9ydCByZWFkIHRoZSBzZWNvbmQgbXVzdCBiZSByZW1vdmVkIGJ5IGhhbmQuCisJCSAqLworCQlpZiAobGFzdF9zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSB7CisJCQlsYXN0X3N0YXR1cyA9IHF0ZF9jb3B5X3N0YXR1cyhlaGNpLCB1cmIsCisJCQkJCXF0ZC0+bGVuZ3RoLCB0b2tlbik7CisJCQlpZiAobGFzdF9zdGF0dXMgPT0gLUVSRU1PVEVJTworCQkJCQkmJiAocXRkLT5od19hbHRfbmV4dAorCQkJCQkJJiBFSENJX0xJU1RfRU5EKGVoY2kpKSkKKwkJCQlsYXN0X3N0YXR1cyA9IC1FSU5QUk9HUkVTUzsKIAkJfQotCQlpZiAobGlrZWx5KGxhc3Rfc3RhdHVzID09IC1FSU5QUk9HUkVTUykpCi0JCQlsYXN0X3N0YXR1cyA9IHF0ZF9zdGF0dXM7CiAKKwkJLyogaWYgd2UncmUgcmVtb3Zpbmcgc29tZXRoaW5nIG5vdCBhdCB0aGUgcXVldWUgaGVhZCwKKwkJICogcGF0Y2ggdGhlIGhhcmR3YXJlIHF1ZXVlIHBvaW50ZXIuCisJCSAqLwogCQlpZiAoc3RvcHBlZCAmJiBxdGQtPnF0ZF9saXN0LnByZXYgIT0gJnFoLT5xdGRfbGlzdCkgewogCQkJbGFzdCA9IGxpc3RfZW50cnkgKHF0ZC0+cXRkX2xpc3QucHJldiwKIAkJCQkJc3RydWN0IGVoY2lfcXRkLCBxdGRfbGlzdCk7CiAJCQlsYXN0LT5od19uZXh0ID0gcXRkLT5od19uZXh0OwogCQl9CisKKwkJLyogcmVtb3ZlIHF0ZDsgaXQncyByZWN5Y2xlZCBhZnRlciBwb3NzaWJsZSB1cmIgY29tcGxldGlvbiAqLwogCQlsaXN0X2RlbCAoJnF0ZC0+cXRkX2xpc3QpOwogCQlsYXN0ID0gcXRkOwogCX0KQEAgLTQzMSw3ICs0NDMsMTUgQEAKIAkJCXFoX3JlZnJlc2goZWhjaSwgcWgpOwogCQkJYnJlYWs7CiAJCWNhc2UgUUhfU1RBVEVfTElOS0VEOgotCQkJLyogc2hvdWxkIGJlIHJhcmUgZm9yIHBlcmlvZGljIHRyYW5zZmVycywKKwkJCS8qIFdlIHdvbid0IHJlZnJlc2ggYSBRSCB0aGF0J3MgbGlua2VkIChhZnRlciB0aGUgSEMKKwkJCSAqIHN0b3BwZWQgdGhlIHF1ZXVlKS4gIFRoYXQgYXZvaWRzIGEgcmFjZToKKwkJCSAqICAtIEhDIHJlYWRzIGZpcnN0IHBhcnQgb2YgUUg7CisJCQkgKiAgLSBDUFUgdXBkYXRlcyB0aGF0IGZpcnN0IHBhcnQgYW5kIHRoZSB0b2tlbjsKKwkJCSAqICAtIEhDIHJlYWRzIHJlc3Qgb2YgdGhhdCBRSCwgaW5jbHVkaW5nIHRva2VuCisJCQkgKiBSZXN1bHQ6ICBIQyBnZXRzIGFuIGluY29uc2lzdGVudCBpbWFnZSwgYW5kIHRoZW4KKwkJCSAqIERNQXMgdG8vZnJvbSB0aGUgd3JvbmcgbWVtb3J5IChjb3JydXB0aW5nIGl0KS4KKwkJCSAqCisJCQkgKiBUaGF0IHNob3VsZCBiZSByYXJlIGZvciBpbnRlcnJ1cHQgdHJhbnNmZXJzLAogCQkJICogZXhjZXB0IG1heWJlIGhpZ2ggYmFuZHdpZHRoIC4uLgogCQkJICovCiAJCQlpZiAoKGNwdV90b19oYzMyKGVoY2ksIFFIX1NNQVNLKQpAQCAtNTQ5LDYgKzU2OSwxMiBAQAogCQl0aGlzX3F0ZF9sZW4gPSBxdGRfZmlsbChlaGNpLCBxdGQsIGJ1ZiwgbGVuLCB0b2tlbiwgbWF4cGFja2V0KTsKIAkJbGVuIC09IHRoaXNfcXRkX2xlbjsKIAkJYnVmICs9IHRoaXNfcXRkX2xlbjsKKworCQkvKgorCQkgKiBzaG9ydCByZWFkcyBhZHZhbmNlIHRvIGEgIm1hZ2ljIiBkdW1teSBpbnN0ZWFkIG9mIHRoZSBuZXh0CisJCSAqIHF0ZCAuLi4gdGhhdCBmb3JjZXMgdGhlIHF1ZXVlIHRvIHN0b3AsIGZvciBtYW51YWwgY2xlYW51cC4KKwkJICogKHRoaXMgd2lsbCB1c3VhbGx5IGJlIG92ZXJyaWRkZW4gbGF0ZXIuKQorCQkgKi8KIAkJaWYgKGlzX2lucHV0KQogCQkJcXRkLT5od19hbHRfbmV4dCA9IGVoY2ktPmFzeW5jLT5od19hbHRfbmV4dDsKIApAQCAtNTY4LDggKzU5NCwxMCBAQAogCQlsaXN0X2FkZF90YWlsICgmcXRkLT5xdGRfbGlzdCwgaGVhZCk7CiAJfQogCi0JLyogdW5sZXNzIHRoZSBidWxrL2ludGVycnVwdCBjYWxsZXIgd2FudHMgYSBjaGFuY2UgdG8gY2xlYW4KLQkgKiB1cCBhZnRlciBzaG9ydCByZWFkcywgaGMgc2hvdWxkIGFkdmFuY2UgcWggcGFzdCB0aGlzIHVyYgorCS8qCisJICogdW5sZXNzIHRoZSBjYWxsZXIgcmVxdWlyZXMgbWFudWFsIGNsZWFudXAgYWZ0ZXIgc2hvcnQgcmVhZHMsCisJICogaGF2ZSB0aGUgYWx0X25leHQgbWVjaGFuaXNtIGtlZXAgdGhlIHF1ZXVlIHJ1bm5pbmcgYWZ0ZXIgdGhlCisJICogbGFzdCBkYXRhIHF0ZCAodGhlIG9ubHkgb25lLCBmb3IgY29udHJvbCBhbmQgbW9zdCBvdGhlciBjYXNlcykuCiAJICovCiAJaWYgKGxpa2VseSAoKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfU0hPUlRfTk9UX09LKSA9PSAwCiAJCQkJfHwgdXNiX3BpcGVjb250cm9sICh1cmItPnBpcGUpKSkKQEAgLTY1Nyw2ICs2ODUsMTQgQEAKIAl0eXBlID0gdXNiX3BpcGV0eXBlICh1cmItPnBpcGUpOwogCW1heHAgPSB1c2JfbWF4cGFja2V0ICh1cmItPmRldiwgdXJiLT5waXBlLCAhaXNfaW5wdXQpOwogCisJLyogMTAyNCBieXRlIG1heHBhY2tldCBpcyBhIGhhcmR3YXJlIGNlaWxpbmcuICBIaWdoIGJhbmR3aWR0aAorCSAqIGFjdHMgbGlrZSB1cCB0byAzS0IsIGJ1dCBpcyBidWlsdCBmcm9tIHNtYWxsZXIgcGFja2V0cy4KKwkgKi8KKwlpZiAobWF4X3BhY2tldChtYXhwKSA+IDEwMjQpIHsKKwkJZWhjaV9kYmcoZWhjaSwgImJvZ3VzIHFoIG1heHBhY2tldCAlZFxuIiwgbWF4X3BhY2tldChtYXhwKSk7CisJCWdvdG8gZG9uZTsKKwl9CisKIAkvKiBDb21wdXRlIGludGVycnVwdCBzY2hlZHVsaW5nIHBhcmFtZXRlcnMganVzdCBvbmNlLCBhbmQgc2F2ZS4KIAkgKiAtIGFsbG93aW5nIGZvciBoaWdoIGJhbmR3aWR0aCwgaG93IG1hbnkgbnNlYy91ZnJhbWUgYXJlIHVzZWQ/CiAJICogLSBzcGxpdCB0cmFuc2FjdGlvbnMgbmVlZCBhIHNlY29uZCBDU1BMSVQgdWZyYW1lOyBzYW1lIHF1ZXN0aW9uCkBAIC03NTcsNyArNzkzLDEzIEBACiAJCQlpbmZvMiB8PSAoRUhDSV9UVU5FX01VTFRfSFMgPDwgMzApOwogCQl9IGVsc2UgaWYgKHR5cGUgPT0gUElQRV9CVUxLKSB7CiAJCQlpbmZvMSB8PSAoRUhDSV9UVU5FX1JMX0hTIDw8IDI4KTsKLQkJCWluZm8xIHw9IDUxMiA8PCAxNjsJLyogdXNiMiBmaXhlZCBtYXhwYWNrZXQgKi8KKwkJCS8qIFRoZSBVU0Igc3BlYyBzYXlzIHRoYXQgaGlnaCBzcGVlZCBidWxrIGVuZHBvaW50cworCQkJICogYWx3YXlzIHVzZSA1MTIgYnl0ZSBtYXhwYWNrZXQuICBCdXQgc29tZSBkZXZpY2UKKwkJCSAqIHZlbmRvcnMgZGVjaWRlZCB0byBpZ25vcmUgdGhhdCwgYW5kIE1TRlQgaXMgaGFwcHkKKwkJCSAqIHRvIGhlbHAgdGhlbSBkbyBzby4gIFNvIG5vdyBwZW9wbGUgZXhwZWN0IHRvIHVzZQorCQkJICogc3VjaCBub25jb25mb3JtYW50IGRldmljZXMgd2l0aCBMaW51eCB0b287IHNpZ2guCisJCQkgKi8KKwkJCWluZm8xIHw9IG1heF9wYWNrZXQobWF4cCkgPDwgMTY7CiAJCQlpbmZvMiB8PSAoRUhDSV9UVU5FX01VTFRfSFMgPDwgMzApOwogCQl9IGVsc2UgewkJLyogUElQRV9JTlRFUlJVUFQgKi8KIAkJCWluZm8xIHw9IG1heF9wYWNrZXQgKG1heHApIDw8IDE2OwpAQCAtOTMyLDcgKzk3NCw3IEBACiAjaWZkZWYgRUhDSV9VUkJfVFJBQ0UKIAllaGNpX2RiZyAoZWhjaSwKIAkJIiVzICVzIHVyYiAlcCBlcCVkJXMgbGVuICVkLCBxdGQgJXAgW3FoICVwXVxuIiwKLQkJX19GVU5DVElPTl9fLCB1cmItPmRldi0+ZGV2cGF0aCwgdXJiLAorCQlfX2Z1bmNfXywgdXJiLT5kZXYtPmRldnBhdGgsIHVyYiwKIAkJZXBudW0gJiAweDBmLCAoZXBudW0gJiBVU0JfRElSX0lOKSA/ICJpbiIgOiAib3V0IiwKIAkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAogCQlxdGQsIHVyYi0+ZXAtPmhjcHJpdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktc2NoZWQuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zY2hlZC5jCmluZGV4IDhhOGUwOGEuLmJlNTc1ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zY2hlZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zY2hlZC5jCkBAIC00NDAsMTEgKzQ0MCwxMCBAQAogCS8qIGRpZCBjbGVhcmluZyBQU0UgZGlkIHRha2UgZWZmZWN0IHlldD8KIAkgKiB0YWtlcyBlZmZlY3Qgb25seSBhdCBmcmFtZSBib3VuZGFyaWVzLi4uCiAJICovCi0Jc3RhdHVzID0gaGFuZHNoYWtlKGVoY2ksICZlaGNpLT5yZWdzLT5zdGF0dXMsIFNUU19QU1MsIDAsIDkgKiAxMjUpOwotCWlmIChzdGF0dXMgIT0gMCkgewotCQllaGNpX3RvX2hjZChlaGNpKS0+c3RhdGUgPSBIQ19TVEFURV9IQUxUOworCXN0YXR1cyA9IGhhbmRzaGFrZV9vbl9lcnJvcl9zZXRfaGFsdChlaGNpLCAmZWhjaS0+cmVncy0+c3RhdHVzLAorCQkJCQkgICAgIFNUU19QU1MsIDAsIDkgKiAxMjUpOworCWlmIChzdGF0dXMpCiAJCXJldHVybiBzdGF0dXM7Ci0JfQogCiAJY21kID0gZWhjaV9yZWFkbChlaGNpLCAmZWhjaS0+cmVncy0+Y29tbWFuZCkgfCBDTURfUFNFOwogCWVoY2lfd3JpdGVsKGVoY2ksIGNtZCwgJmVoY2ktPnJlZ3MtPmNvbW1hbmQpOwpAQCAtNDY1LDExICs0NjQsMTAgQEAKIAkvKiBkaWQgc2V0dGluZyBQU0Ugbm90IHRha2UgZWZmZWN0IHlldD8KIAkgKiB0YWtlcyBlZmZlY3Qgb25seSBhdCBmcmFtZSBib3VuZGFyaWVzLi4uCiAJICovCi0Jc3RhdHVzID0gaGFuZHNoYWtlKGVoY2ksICZlaGNpLT5yZWdzLT5zdGF0dXMsIFNUU19QU1MsIFNUU19QU1MsIDkgKiAxMjUpOwotCWlmIChzdGF0dXMgIT0gMCkgewotCQllaGNpX3RvX2hjZChlaGNpKS0+c3RhdGUgPSBIQ19TVEFURV9IQUxUOworCXN0YXR1cyA9IGhhbmRzaGFrZV9vbl9lcnJvcl9zZXRfaGFsdChlaGNpLCAmZWhjaS0+cmVncy0+c3RhdHVzLAorCQkJCQkgICAgIFNUU19QU1MsIFNUU19QU1MsIDkgKiAxMjUpOworCWlmIChzdGF0dXMpCiAJCXJldHVybiBzdGF0dXM7Ci0JfQogCiAJY21kID0gZWhjaV9yZWFkbChlaGNpLCAmZWhjaS0+cmVncy0+Y29tbWFuZCkgJiB+Q01EX1BTRTsKIAllaGNpX3dyaXRlbChlaGNpLCBjbWQsICZlaGNpLT5yZWdzLT5jb21tYW5kKTsKQEAgLTExODMsMjEgKzExODEsMTggQEAKIAkJCQkJc3RydWN0IGVoY2lfaXRkLCBpdGRfbGlzdCk7CiAJCQlsaXN0X2RlbCAoJml0ZC0+aXRkX2xpc3QpOwogCQkJaXRkX2RtYSA9IGl0ZC0+aXRkX2RtYTsKLQkJfSBlbHNlCi0JCQlpdGQgPSBOVUxMOwotCi0JCWlmICghaXRkKSB7CisJCX0gZWxzZSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmZWhjaS0+bG9jaywgZmxhZ3MpOwogCQkJaXRkID0gZG1hX3Bvb2xfYWxsb2MgKGVoY2ktPml0ZF9wb29sLCBtZW1fZmxhZ3MsCiAJCQkJCSZpdGRfZG1hKTsKIAkJCXNwaW5fbG9ja19pcnFzYXZlICgmZWhjaS0+bG9jaywgZmxhZ3MpOworCQkJaWYgKCFpdGQpIHsKKwkJCQlpc29fc2NoZWRfZnJlZShzdHJlYW0sIHNjaGVkKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaGNpLT5sb2NrLCBmbGFncyk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CiAJCX0KIAotCQlpZiAodW5saWtlbHkgKE5VTEwgPT0gaXRkKSkgewotCQkJaXNvX3NjaGVkX2ZyZWUgKHN0cmVhbSwgc2NoZWQpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmVoY2ktPmxvY2ssIGZsYWdzKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9CiAJCW1lbXNldCAoaXRkLCAwLCBzaXplb2YgKml0ZCk7CiAJCWl0ZC0+aXRkX2RtYSA9IGl0ZF9kbWE7CiAJCWxpc3RfYWRkICgmaXRkLT5pdGRfbGlzdCwgJnNjaGVkLT50ZF9saXN0KTsKQEAgLTE2ODIsNyArMTY3Nyw3IEBACiAjaWZkZWYgRUhDSV9VUkJfVFJBQ0UKIAllaGNpX2RiZyAoZWhjaSwKIAkJIiVzICVzIHVyYiAlcCBlcCVkJXMgbGVuICVkLCAlZCBwa3RzICVkIHVmcmFtZXMgWyVwXVxuIiwKLQkJX19GVU5DVElPTl9fLCB1cmItPmRldi0+ZGV2cGF0aCwgdXJiLAorCQlfX2Z1bmNfXywgdXJiLT5kZXYtPmRldnBhdGgsIHVyYiwKIAkJdXNiX3BpcGVlbmRwb2ludCAodXJiLT5waXBlKSwKIAkJdXNiX3BpcGVpbiAodXJiLT5waXBlKSA/ICJpbiIgOiAib3V0IiwKIAkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLApAQCAtMTgxNiwyMSArMTgxMSwxOCBAQAogCQkJCQkgc3RydWN0IGVoY2lfc2l0ZCwgc2l0ZF9saXN0KTsKIAkJCWxpc3RfZGVsICgmc2l0ZC0+c2l0ZF9saXN0KTsKIAkJCXNpdGRfZG1hID0gc2l0ZC0+c2l0ZF9kbWE7Ci0JCX0gZWxzZQotCQkJc2l0ZCA9IE5VTEw7Ci0KLQkJaWYgKCFzaXRkKSB7CisJCX0gZWxzZSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmZWhjaS0+bG9jaywgZmxhZ3MpOwogCQkJc2l0ZCA9IGRtYV9wb29sX2FsbG9jIChlaGNpLT5zaXRkX3Bvb2wsIG1lbV9mbGFncywKIAkJCQkJJnNpdGRfZG1hKTsKIAkJCXNwaW5fbG9ja19pcnFzYXZlICgmZWhjaS0+bG9jaywgZmxhZ3MpOworCQkJaWYgKCFzaXRkKSB7CisJCQkJaXNvX3NjaGVkX2ZyZWUoc3RyZWFtLCBpc29fc2NoZWQpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVoY2ktPmxvY2ssIGZsYWdzKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KIAkJfQogCi0JCWlmICghc2l0ZCkgewotCQkJaXNvX3NjaGVkX2ZyZWUgKHN0cmVhbSwgaXNvX3NjaGVkKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZlaGNpLT5sb2NrLCBmbGFncyk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQogCQltZW1zZXQgKHNpdGQsIDAsIHNpemVvZiAqc2l0ZCk7CiAJCXNpdGQtPnNpdGRfZG1hID0gc2l0ZF9kbWE7CiAJCWxpc3RfYWRkICgmc2l0ZC0+c2l0ZF9saXN0LCAmaXNvX3NjaGVkLT50ZF9saXN0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTE2eC1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTE2eC1oY2QuYwppbmRleCAyMDNhMzM1Li4yMGI5YTBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2lzcDExNngtaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxMTZ4LWhjZC5jCkBAIC0xNDAwLDcgKzE0MDAsNyBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc3AxMTZ4LT5sb2NrLCBmbGFncyk7CiAJCXZhbCAmPSAofkhDQ09OVFJPTF9IQ0ZTICYgfkhDQ09OVFJPTF9SV0UpOwogCQl2YWwgfD0gSENDT05UUk9MX1VTQl9TVVNQRU5EOwotCQlpZiAoZGV2aWNlX21heV93YWtldXAoJmhjZC0+c2VsZi5yb290X2h1Yi0+ZGV2KSkKKwkJaWYgKGhjZC0+c2VsZi5yb290X2h1Yi0+ZG9fcmVtb3RlX3dha2V1cCkKIAkJCXZhbCB8PSBIQ0NPTlRST0xfUldFOwogCQkvKiBXYWl0IGZvciB1c2IgdHJhbnNmZXJzIHRvIGZpbmlzaCAqLwogCQltc2xlZXAoMik7CkBAIC0xNDQyLDExICsxNDQyLDYgQEAKIAkJYnJlYWs7CiAJY2FzZSBIQ0NPTlRST0xfVVNCX09QRVI6CiAJCXNwaW5fdW5sb2NrX2lycSgmaXNwMTE2eC0+bG9jayk7Ci0JCS8qIFdpdGhvdXQgc2V0dGluZyBwb3dlcl9zdGF0ZSBoZXJlIHRoZQotCQkgICBTVVNQRU5ERUQgc3RhdGUgd29uJ3QgYmUgcmVtb3ZlZCBmcm9tCi0JCSAgIHN5c2ZzL3VzYk4vcG93ZXIuc3RhdGUgYXMgYSByZXNwb25zZSB0byByZW1vdGUKLQkJICAgd2FrZXVwLiBNYXliZSBpbiB0aGUgZnV0dXJlLiAqLwotCQloY2QtPnNlbGYucm9vdF9odWItPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CiAJCXJldHVybiAwOwogCWRlZmF1bHQ6CiAJCS8qIEhDQ09OVFJPTF9VU0JfUkVTRVQ6IHRoaXMgbWF5IGhhcHBlbiwgd2hlbiBkdXJpbmcKQEAgLTE0NjAsNyArMTQ1NSw2IEBACiAJCWlmICgoaXNwMTE2eC0+cmhkZXNjYSAmIFJIX0FfTkRQKSA9PSAyKQogCQkJaXNwMTE2eF9odWJfY29udHJvbChoY2QsIFNldFBvcnRGZWF0dXJlLAogCQkJCQkgICAgVVNCX1BPUlRfRkVBVF9QT1dFUiwgMiwgTlVMTCwgMCk7Ci0JCWhjZC0+c2VsZi5yb290X2h1Yi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xNDg2LDggKzE0ODAsNiBAQAogCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENDT05UUk9MLAogCQkJICAgICh2YWwgJiB+SENDT05UUk9MX0hDRlMpIHwgSENDT05UUk9MX1VTQl9PUEVSKTsKIAlzcGluX3VubG9ja19pcnEoJmlzcDExNngtPmxvY2spOwotCS8qIHNlZSBhbmFsb2dvdXMgY29tbWVudCBhYm92ZSAqLwotCWhjZC0+c2VsZi5yb290X2h1Yi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKIAloY2QtPnN0YXRlID0gSENfU1RBVEVfUlVOTklORzsKIAogCXJldHVybiAwOwpAQCAtMTY2Myw3ICsxNjU1LDYgQEAKIHN0YXRpYyBpbnQgaXNwMTE2eF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCVZEQkcoIiVzOiBzdGF0ZSAleFxuIiwgX19mdW5jX18sIHN0YXRlLmV2ZW50KTsKLQlkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IHN0YXRlOwogCXJldHVybiAwOwogfQogCkBAIC0xNjcyLDggKzE2NjMsNyBAQAogKi8KIHN0YXRpYyBpbnQgaXNwMTE2eF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewotCVZEQkcoIiVzOiAgc3RhdGUgJXhcbiIsIF9fZnVuY19fLCBkZXYtPnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50KTsKLQlkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CisJVkRCRygiJXNcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWF0OTEuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdDkxLmMKaW5kZXggZDcyZGMwNy4uYzk2ZGIxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWF0OTEuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktYXQ5MS5jCkBAIC0yNjEsNyArMjYxLDYgQEAKIAkgKi8KIAkuaHViX3N0YXR1c19kYXRhID0Jb2hjaV9odWJfc3RhdHVzX2RhdGEsCiAJLmh1Yl9jb250cm9sID0JCW9oY2lfaHViX2NvbnRyb2wsCi0JLmh1Yl9pcnFfZW5hYmxlID0Jb2hjaV9yaHNjX2VuYWJsZSwKICNpZmRlZiBDT05GSUdfUE0KIAkuYnVzX3N1c3BlbmQgPQkJb2hjaV9idXNfc3VzcGVuZCwKIAkuYnVzX3Jlc3VtZSA9CQlvaGNpX2J1c19yZXN1bWUsCkBAIC0zNDgsNiArMzQ3LDcgQEAKIAlpZiAoIWNsb2NrZWQpCiAJCWF0OTFfc3RhcnRfY2xvY2soKTsKIAorCW9oY2lfZmluaXNoX2NvbnRyb2xsZXJfcmVzdW1lKGhjZCk7CiAJcmV0dXJuIDA7CiB9CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWF1MXh4eC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWF1MXh4eC5jCmluZGV4IGY5MGZlMGMuLjFiOWFiZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdTF4eHguYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktYXUxeHh4LmMKQEAgLTI4OCw3ICsyODgsNiBAQAogCSAqLwogCS5odWJfc3RhdHVzX2RhdGEgPQlvaGNpX2h1Yl9zdGF0dXNfZGF0YSwKIAkuaHViX2NvbnRyb2wgPQkJb2hjaV9odWJfY29udHJvbCwKLQkuaHViX2lycV9lbmFibGUgPQlvaGNpX3Joc2NfZW5hYmxlLAogI2lmZGVmCUNPTkZJR19QTQogCS5idXNfc3VzcGVuZCA9CQlvaGNpX2J1c19zdXNwZW5kLAogCS5idXNfcmVzdW1lID0JCW9oY2lfYnVzX3Jlc3VtZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1kYmcuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1kYmcuYwppbmRleCBhMjJjMzBhLi5lMDZiZmFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktZGJnLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWRiZy5jCkBAIC02NTUsNyArNjU1LDcgQEAKIAkJaGNkLT5wcm9kdWN0X2Rlc2MsCiAJCWhjZF9uYW1lKTsKIAotCWlmIChidXMtPmNvbnRyb2xsZXItPnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50KSB7CisJaWYgKCF0ZXN0X2JpdChIQ0RfRkxBR19IV19BQ0NFU1NJQkxFLCAmaGNkLT5mbGFncykpIHsKIAkJc2l6ZSAtPSBzY25wcmludGYgKG5leHQsIHNpemUsCiAJCQkiU1VTUEVOREVEIChubyByZWdpc3RlciBhY2Nlc3MpXG4iKTsKIAkJZ290byBkb25lOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWVwOTN4eC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWVwOTN4eC5jCmluZGV4IDE1NmU5M2EuLjA2YWFkZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1lcDkzeHguYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktZXA5M3h4LmMKQEAgLTEzNSw3ICsxMzUsNiBAQAogCS5nZXRfZnJhbWVfbnVtYmVyCT0gb2hjaV9nZXRfZnJhbWUsCiAJLmh1Yl9zdGF0dXNfZGF0YQk9IG9oY2lfaHViX3N0YXR1c19kYXRhLAogCS5odWJfY29udHJvbAkJPSBvaGNpX2h1Yl9jb250cm9sLAotCS5odWJfaXJxX2VuYWJsZQkJPSBvaGNpX3Joc2NfZW5hYmxlLAogI2lmZGVmIENPTkZJR19QTQogCS5idXNfc3VzcGVuZAkJPSBvaGNpX2J1c19zdXNwZW5kLAogCS5idXNfcmVzdW1lCQk9IG9oY2lfYnVzX3Jlc3VtZSwKQEAgLTE3Nyw3ICsxNzYsNiBAQAogCiAJZXA5M3h4X3N0b3BfaGMoJnBkZXYtPmRldik7CiAJaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX1NVU1BFTkRFRDsKLQlwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX1NVU1BFTkQ7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE5Myw5ICsxOTEsOCBAQAogCW9oY2ktPm5leHRfc3RhdGVjaGFuZ2UgPSBqaWZmaWVzOwogCiAJZXA5M3h4X3N0YXJ0X2hjKCZwZGV2LT5kZXYpOwotCXBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047Ci0JdXNiX2hjZF9yZXN1bWVfcm9vdF9odWIoaGNkKTsKIAorCW9oY2lfZmluaXNoX2NvbnRyb2xsZXJfcmVzdW1lKGhjZCk7CiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1odWIuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1odWIuYwppbmRleCA0OGU0YjExLi41YmUzYmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaHViLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWh1Yi5jCkBAIC0zNiwxOCArMzYsNiBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0vKiBoY2QtPmh1Yl9pcnFfZW5hYmxlKCkgKi8KLXN0YXRpYyB2b2lkIG9oY2lfcmhzY19lbmFibGUgKHN0cnVjdCB1c2JfaGNkICpoY2QpCi17Ci0Jc3RydWN0IG9oY2lfaGNkCQkqb2hjaSA9IGhjZF90b19vaGNpIChoY2QpOwotCi0Jc3Bpbl9sb2NrX2lycSgmb2hjaS0+bG9jayk7Ci0JaWYgKCFvaGNpLT5hdXRvc3RvcCkKLQkJZGVsX3RpbWVyKCZoY2QtPnJoX3RpbWVyKTsJLyogUHJldmVudCBuZXh0IHBvbGwgKi8KLQlvaGNpX3dyaXRlbChvaGNpLCBPSENJX0lOVFJfUkhTQywgJm9oY2ktPnJlZ3MtPmludHJlbmFibGUpOwotCXNwaW5fdW5sb2NrX2lycSgmb2hjaS0+bG9jayk7Ci19Ci0KICNkZWZpbmUgT0hDSV9TQ0hFRF9FTkFCTEVTIFwKIAkoT0hDSV9DVFJMX0NMRXxPSENJX0NUUkxfQkxFfE9IQ0lfQ1RSTF9QTEV8T0hDSV9DVFJMX0lFKQogCkBAIC0xMDMsMTEgKzkxLDExIEBACiAJZmluaXNoX3VubGlua3MgKG9oY2ksIG9oY2lfZnJhbWVfbm8ob2hjaSkpOwogCiAJLyogbWF5YmUgcmVzdW1lIGNhbiB3YWtlIHJvb3QgaHViICovCi0JaWYgKGRldmljZV9tYXlfd2FrZXVwKCZvaGNpX3RvX2hjZChvaGNpKS0+c2VsZi5yb290X2h1Yi0+ZGV2KSB8fAotCQkJYXV0b3N0b3ApCisJaWYgKG9oY2lfdG9faGNkKG9oY2kpLT5zZWxmLnJvb3RfaHViLT5kb19yZW1vdGVfd2FrZXVwIHx8IGF1dG9zdG9wKSB7CiAJCW9oY2ktPmhjX2NvbnRyb2wgfD0gT0hDSV9DVFJMX1JXRTsKLQllbHNlIHsKLQkJb2hjaV93cml0ZWwgKG9oY2ksIE9IQ0lfSU5UUl9SSFNDLCAmb2hjaS0+cmVncy0+aW50cmRpc2FibGUpOworCX0gZWxzZSB7CisJCW9oY2lfd3JpdGVsKG9oY2ksIE9IQ0lfSU5UUl9SSFNDIHwgT0hDSV9JTlRSX1JELAorCQkJCSZvaGNpLT5yZWdzLT5pbnRyZGlzYWJsZSk7CiAJCW9oY2ktPmhjX2NvbnRyb2wgJj0gfk9IQ0lfQ1RSTF9SV0U7CiAJfQogCkBAIC0zMjYsMjMgKzMxNCw3NiBAQAogCXJldHVybiByYzsKIH0KIAorLyogQ2Fycnkgb3V0IHRoZSBmaW5hbCBzdGVwcyBvZiByZXN1bWluZyB0aGUgY29udHJvbGxlciBkZXZpY2UgKi8KK3N0YXRpYyB2b2lkIG9oY2lfZmluaXNoX2NvbnRyb2xsZXJfcmVzdW1lKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJc3RydWN0IG9oY2lfaGNkCQkqb2hjaSA9IGhjZF90b19vaGNpKGhjZCk7CisJaW50CQkJcG9ydDsKKwlib29sCQkJbmVlZF9yZWluaXQgPSBmYWxzZTsKKworCS8qIFNlZSBpZiB0aGUgY29udHJvbGxlciBpcyBhbHJlYWR5IHJ1bm5pbmcgb3IgaGFzIGJlZW4gcmVzZXQgKi8KKwlvaGNpLT5oY19jb250cm9sID0gb2hjaV9yZWFkbChvaGNpLCAmb2hjaS0+cmVncy0+Y29udHJvbCk7CisJaWYgKG9oY2ktPmhjX2NvbnRyb2wgJiAoT0hDSV9DVFJMX0lSIHwgT0hDSV9TQ0hFRF9FTkFCTEVTKSkgeworCQluZWVkX3JlaW5pdCA9IHRydWU7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChvaGNpLT5oY19jb250cm9sICYgT0hDSV9DVFJMX0hDRlMpIHsKKwkJY2FzZSBPSENJX1VTQl9PUEVSOgorCQljYXNlIE9IQ0lfVVNCX1JFU0VUOgorCQkJbmVlZF9yZWluaXQgPSB0cnVlOworCQl9CisJfQorCisJLyogSWYgbmVlZGVkLCByZWluaXRpYWxpemUgYW5kIHN1c3BlbmQgdGhlIHJvb3QgaHViICovCisJaWYgKG5lZWRfcmVpbml0KSB7CisJCXNwaW5fbG9ja19pcnEoJm9oY2ktPmxvY2spOworCQloY2QtPnN0YXRlID0gSENfU1RBVEVfUkVTVU1JTkc7CisJCW9oY2lfcmhfcmVzdW1lKG9oY2kpOworCQloY2QtPnN0YXRlID0gSENfU1RBVEVfUVVJRVNDSU5HOworCQlvaGNpX3JoX3N1c3BlbmQob2hjaSwgMCk7CisJCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9TVVNQRU5ERUQ7CisJCXNwaW5fdW5sb2NrX2lycSgmb2hjaS0+bG9jayk7CisJfQorCisJLyogTm9ybWFsbHkganVzdCB0dXJuIG9uIHBvcnQgcG93ZXIgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJZWxzZSB7CisJCW9oY2lfZGJnKG9oY2ksICJwb3dlcnVwIHBvcnRzXG4iKTsKKwkJZm9yIChwb3J0ID0gMDsgcG9ydCA8IG9oY2ktPm51bV9wb3J0czsgcG9ydCsrKQorCQkJb2hjaV93cml0ZWwob2hjaSwgUkhfUFNfUFBTLAorCQkJCQkmb2hjaS0+cmVncy0+cm9vdGh1Yi5wb3J0c3RhdHVzW3BvcnRdKTsKKworCQlvaGNpX3dyaXRlbChvaGNpLCBPSENJX0lOVFJfTUlFLCAmb2hjaS0+cmVncy0+aW50cmVuYWJsZSk7CisJCW9oY2lfcmVhZGwob2hjaSwgJm9oY2ktPnJlZ3MtPmludHJlbmFibGUpOworCQltc2xlZXAoMjApOworCX0KK30KKwogLyogQ2Fycnkgb3V0IHBvbGxpbmctLCBhdXRvc3RvcC0sIGFuZCBhdXRvcmVzdW1lLXJlbGF0ZWQgc3RhdGUgY2hhbmdlcyAqLwogc3RhdGljIGludCBvaGNpX3Jvb3RfaHViX3N0YXRlX2NoYW5nZXMoc3RydWN0IG9oY2lfaGNkICpvaGNpLCBpbnQgY2hhbmdlZCwKIAkJaW50IGFueV9jb25uZWN0ZWQpCiB7CiAJaW50CXBvbGxfcmggPSAxOworCWludAlyaHNjOwogCisJcmhzYyA9IG9oY2lfcmVhZGwob2hjaSwgJm9oY2ktPnJlZ3MtPmludHJlbmFibGUpICYgT0hDSV9JTlRSX1JIU0M7CiAJc3dpdGNoIChvaGNpLT5oY19jb250cm9sICYgT0hDSV9DVFJMX0hDRlMpIHsKIAogCWNhc2UgT0hDSV9VU0JfT1BFUjoKLQkJLyoga2VlcCBvbiBwb2xsaW5nIHVudGlsIHdlIGtub3cgYSBkZXZpY2UgaXMgY29ubmVjdGVkCi0JCSAqIGFuZCBSSFNDIGlzIGVuYWJsZWQgKi8KKwkJLyogSWYgbm8gc3RhdHVzIGNoYW5nZXMgYXJlIHBlbmRpbmcsIGVuYWJsZSBzdGF0dXMtY2hhbmdlCisJCSAqIGludGVycnVwdHMuCisJCSAqLworCQlpZiAoIXJoc2MgJiYgIWNoYW5nZWQpIHsKKwkJCXJoc2MgPSBPSENJX0lOVFJfUkhTQzsKKwkJCW9oY2lfd3JpdGVsKG9oY2ksIHJoc2MsICZvaGNpLT5yZWdzLT5pbnRyZW5hYmxlKTsKKwkJfQorCisJCS8qIEtlZXAgb24gcG9sbGluZyB1bnRpbCB3ZSBrbm93IGEgZGV2aWNlIGlzIGNvbm5lY3RlZAorCQkgKiBhbmQgUkhTQyBpcyBlbmFibGVkLCBvciB1bnRpbCB3ZSBhdXRvc3RvcC4KKwkJICovCiAJCWlmICghb2hjaS0+YXV0b3N0b3ApIHsKIAkJCWlmIChhbnlfY29ubmVjdGVkIHx8CiAJCQkJCSFkZXZpY2VfbWF5X3dha2V1cCgmb2hjaV90b19oY2Qob2hjaSkKIAkJCQkJCS0+c2VsZi5yb290X2h1Yi0+ZGV2KSkgewotCQkJCWlmIChvaGNpX3JlYWRsKG9oY2ksICZvaGNpLT5yZWdzLT5pbnRyZW5hYmxlKSAmCi0JCQkJCQlPSENJX0lOVFJfUkhTQykKKwkJCQlpZiAocmhzYykKIAkJCQkJcG9sbF9yaCA9IDA7CiAJCQl9IGVsc2UgewogCQkJCW9oY2ktPmF1dG9zdG9wID0gMTsKQEAgLTM1NSwxMiArMzk2LDEzIEBACiAJCQkJb2hjaS0+YXV0b3N0b3AgPSAwOwogCQkJCW9oY2ktPm5leHRfc3RhdGVjaGFuZ2UgPSBqaWZmaWVzICsKIAkJCQkJCVNUQVRFQ0hBTkdFX0RFTEFZOwotCQkJfSBlbHNlIGlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsCisJCQl9IGVsc2UgaWYgKHJoc2MgJiYgdGltZV9hZnRlcl9lcShqaWZmaWVzLAogCQkJCQkJb2hjaS0+bmV4dF9zdGF0ZWNoYW5nZSkKIAkJCQkJJiYgIW9oY2ktPmVkX3JtX2xpc3QKIAkJCQkJJiYgIShvaGNpLT5oY19jb250cm9sICYKIAkJCQkJCU9IQ0lfU0NIRURfRU5BQkxFUykpIHsKIAkJCQlvaGNpX3JoX3N1c3BlbmQob2hjaSwgMSk7CisJCQkJcG9sbF9yaCA9IDA7CiAJCQl9CiAJCX0KIAkJYnJlYWs7CkBAIC0zNzQsNiArNDE2LDEyIEBACiAJCQllbHNlCiAJCQkJdXNiX2hjZF9yZXN1bWVfcm9vdF9odWIob2hjaV90b19oY2Qob2hjaSkpOwogCQl9IGVsc2UgeworCQkJaWYgKCFyaHNjICYmIChvaGNpLT5hdXRvc3RvcCB8fAorCQkJCQlvaGNpX3RvX2hjZChvaGNpKS0+c2VsZi5yb290X2h1Yi0+CisJCQkJCQlkb19yZW1vdGVfd2FrZXVwKSkKKwkJCQlvaGNpX3dyaXRlbChvaGNpLCBPSENJX0lOVFJfUkhTQywKKwkJCQkJCSZvaGNpLT5yZWdzLT5pbnRyZW5hYmxlKTsKKwogCQkJLyogZXZlcnl0aGluZyBpcyBpZGxlLCBubyBuZWVkIGZvciBwb2xsaW5nICovCiAJCQlwb2xsX3JoID0gMDsKIAkJfQpAQCAtMzk1LDEyICs0NDMsMTYgQEAKIHN0YXRpYyBpbnQgb2hjaV9yb290X2h1Yl9zdGF0ZV9jaGFuZ2VzKHN0cnVjdCBvaGNpX2hjZCAqb2hjaSwgaW50IGNoYW5nZWQsCiAJCWludCBhbnlfY29ubmVjdGVkKQogewotCWludAlwb2xsX3JoID0gMTsKLQotCS8qIGtlZXAgb24gcG9sbGluZyB1bnRpbCBSSFNDIGlzIGVuYWJsZWQgKi8KKwkvKiBJZiBSSFNDIGlzIGVuYWJsZWQsIGRvbid0IHBvbGwgKi8KIAlpZiAob2hjaV9yZWFkbChvaGNpLCAmb2hjaS0+cmVncy0+aW50cmVuYWJsZSkgJiBPSENJX0lOVFJfUkhTQykKLQkJcG9sbF9yaCA9IDA7Ci0JcmV0dXJuIHBvbGxfcmg7CisJCXJldHVybiAwOworCisJLyogSWYgbm8gc3RhdHVzIGNoYW5nZXMgYXJlIHBlbmRpbmcsIGVuYWJsZSBzdGF0dXMtY2hhbmdlIGludGVycnVwdHMgKi8KKwlpZiAoIWNoYW5nZWQpIHsKKwkJb2hjaV93cml0ZWwob2hjaSwgT0hDSV9JTlRSX1JIU0MsICZvaGNpLT5yZWdzLT5pbnRyZW5hYmxlKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOwogfQogCiAjZW5kaWYJLyogQ09ORklHX1BNICovCkBAIC01NjQsMTQgKzYxNiwxOCBAQAogCXUzMgl0ZW1wOwogCXUxNglub3cgPSBvaGNpX3JlYWRsKG9oY2ksICZvaGNpLT5yZWdzLT5mbW51bWJlcik7CiAJdTE2CXJlc2V0X2RvbmUgPSBub3cgKyBQT1JUX1JFU0VUX01TRUM7CisJaW50CWxpbWl0XzEgPSBESVZfUk9VTkRfVVAoUE9SVF9SRVNFVF9NU0VDLCBQT1JUX1JFU0VUX0hXX01TRUMpOwogCiAJLyogYnVpbGQgYSAiY29udGludW91cyBlbm91Z2giIHJlc2V0IHNpZ25hbCwgd2l0aCB1cCB0bwogCSAqIDNtc2VjIGdhcCBiZXR3ZWVuIHB1bHNlcy4gIHNjaGVkdWxlciBIWj09MTAwIG11c3Qgd29yazsKIAkgKiB0aGlzIG1pZ2h0IG5lZWQgdG8gYmUgZGVhZGxpbmUtc2NoZWR1bGVkLgogCSAqLwogCWRvIHsKKwkJaW50IGxpbWl0XzI7CisKIAkJLyogc3BpbiB1bnRpbCBhbnkgY3VycmVudCByZXNldCBmaW5pc2hlcyAqLwotCQlmb3IgKDs7KSB7CisJCWxpbWl0XzIgPSBQT1JUX1JFU0VUX0hXX01TRUMgKiAyOworCQl3aGlsZSAoLS1saW1pdF8yID49IDApIHsKIAkJCXRlbXAgPSBvaGNpX3JlYWRsIChvaGNpLCBwb3J0c3RhdCk7CiAJCQkvKiBoYW5kbGUgZS5nLiBDYXJkQnVzIGVqZWN0ICovCiAJCQlpZiAodGVtcCA9PSB+KHUzMikwKQpAQCAtNTgxLDYgKzYzNywxNyBAQAogCQkJdWRlbGF5ICg1MDApOwogCQl9CiAKKwkJLyogdGltZW91dCAoYSBoYXJkd2FyZSBlcnJvcikgaGFzIGJlZW4gb2JzZXJ2ZWQgd2hlbgorCQkgKiBFSENJIHNldHMgQ0Ygd2hpbGUgdGhpcyBkcml2ZXIgaXMgcmVzZXR0aW5nIGEgcG9ydDsKKwkJICogcHJlc3VtYWJseSBvdGhlciBkaXNjb25uZWN0IHBhdGhzIG1pZ2h0IGRvIGl0IHRvby4KKwkJICovCisJCWlmIChsaW1pdF8yIDwgMCkgeworCQkJb2hjaV9kYmcob2hjaSwKKwkJCQkicG9ydFslZF0gcmVzZXQgdGltZW91dCwgc3RhdCAlMDh4XG4iLAorCQkJCXBvcnQsIHRlbXApOworCQkJYnJlYWs7CisJCX0KKwogCQlpZiAoISh0ZW1wICYgUkhfUFNfQ0NTKSkKIAkJCWJyZWFrOwogCQlpZiAodGVtcCAmIFJIX1BTX1BSU0MpCkBAIC01OTAsOCArNjU3LDExIEBACiAJCW9oY2lfd3JpdGVsIChvaGNpLCBSSF9QU19QUlMsIHBvcnRzdGF0KTsKIAkJbXNsZWVwKFBPUlRfUkVTRVRfSFdfTVNFQyk7CiAJCW5vdyA9IG9oY2lfcmVhZGwob2hjaSwgJm9oY2ktPnJlZ3MtPmZtbnVtYmVyKTsKLQl9IHdoaWxlICh0aWNrX2JlZm9yZShub3csIHJlc2V0X2RvbmUpKTsKLQkvKiBjYWxsZXIgc3luY2hyb25pemVzIHVzaW5nIFBSU0MgKi8KKwl9IHdoaWxlICh0aWNrX2JlZm9yZShub3csIHJlc2V0X2RvbmUpICYmIC0tbGltaXRfMSA+PSAwKTsKKworCS8qIGNhbGxlciBzeW5jaHJvbml6ZXMgdXNpbmcgUFJTQyAuLi4gYW5kIGhhbmRsZXMgUFJTCisJICogc3RpbGwgYmVpbmcgc2V0IHdoZW4gdGhpcyByZXR1cm5zLgorCSAqLwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktbGg3YTQwNC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWxoN2E0MDQuYwppbmRleCAxM2MxMmVkLi45NmQxNGZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktbGg3YTQwNC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1saDdhNDA0LmMKQEAgLTE5Myw3ICsxOTMsNiBAQAogCSAqLwogCS5odWJfc3RhdHVzX2RhdGEgPQlvaGNpX2h1Yl9zdGF0dXNfZGF0YSwKIAkuaHViX2NvbnRyb2wgPQkJb2hjaV9odWJfY29udHJvbCwKLQkuaHViX2lycV9lbmFibGUgPQlvaGNpX3Joc2NfZW5hYmxlLAogI2lmZGVmCUNPTkZJR19QTQogCS5idXNfc3VzcGVuZCA9CQlvaGNpX2J1c19zdXNwZW5kLAogCS5idXNfcmVzdW1lID0JCW9oY2lfYnVzX3Jlc3VtZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1vbWFwLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktb21hcC5jCmluZGV4IDdiZmNhMWUuLjY4NTlmYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1vbWFwLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLW9tYXAuYwpAQCAtNDY2LDcgKzQ2Niw2IEBACiAJICovCiAJLmh1Yl9zdGF0dXNfZGF0YSA9CW9oY2lfaHViX3N0YXR1c19kYXRhLAogCS5odWJfY29udHJvbCA9CQlvaGNpX2h1Yl9jb250cm9sLAotCS5odWJfaXJxX2VuYWJsZSA9CW9oY2lfcmhzY19lbmFibGUsCiAjaWZkZWYJQ09ORklHX1BNCiAJLmJ1c19zdXNwZW5kID0JCW9oY2lfYnVzX3N1c3BlbmQsCiAJLmJ1c19yZXN1bWUgPQkJb2hjaV9idXNfcmVzdW1lLApAQCAtNTA1LDIxICs1MDQsMjAgQEAKIAogCW9tYXBfb2hjaV9jbG9ja19wb3dlcigwKTsKIAlvaGNpX3RvX2hjZChvaGNpKS0+c3RhdGUgPSBIQ19TVEFURV9TVVNQRU5ERUQ7Ci0JZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX1NVU1BFTkQ7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgb2hjaV9vbWFwX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG9oY2lfaGNkCSpvaGNpID0gaGNkX3RvX29oY2kocGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KSk7CisJc3RydWN0IHVzYl9oY2QJKmhjZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IG9oY2lfaGNkCSpvaGNpID0gaGNkX3RvX29oY2koaGNkKTsKIAogCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBvaGNpLT5uZXh0X3N0YXRlY2hhbmdlKSkKIAkJbXNsZWVwKDUpOwogCW9oY2ktPm5leHRfc3RhdGVjaGFuZ2UgPSBqaWZmaWVzOwogCiAJb21hcF9vaGNpX2Nsb2NrX3Bvd2VyKDEpOwotCWRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKLQl1c2JfaGNkX3Jlc3VtZV9yb290X2h1YihwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlvaGNpX2ZpbmlzaF9jb250cm9sbGVyX3Jlc3VtZShoY2QpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcGNpLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcGNpLmMKaW5kZXggZDAzNjBmNi4uM2JmMTc1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBjaS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wY2kuYwpAQCAtMjM4LDQyICsyMzgsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLSNpZglkZWZpbmVkKENPTkZJR19VU0JfUEVSU0lTVCkgJiYgKGRlZmluZWQoQ09ORklHX1VTQl9FSENJX0hDRCkgfHwgXAotCQlkZWZpbmVkKENPTkZJR19VU0JfRUhDSV9IQ0RfTU9EVUxFKSkKLQotLyogRm9sbG93aW5nIGEgcG93ZXIgbG9zcywgd2UgbXVzdCBwcmVwYXJlIHRvIHJlZ2FpbiBjb250cm9sIG9mIHRoZSBwb3J0cwotICogd2UgdXNlZCB0byBvd24uICBUaGlzIG1lYW5zIHR1cm5pbmcgb24gdGhlIHBvcnQgcG93ZXIgYmVmb3JlIGVoY2ktaGNkCi0gKiB0cmllcyB0byBzd2l0Y2ggb3duZXJzaGlwLgotICoKLSAqIFRoaXMgaXNuJ3QgYSAxMDAlIHBlcmZlY3Qgc29sdXRpb24uICBPbiBtb3N0IHN5c3RlbXMgdGhlIE9IQ0kgY29udHJvbGxlcnMKLSAqIGxpZSBhdCBsb3dlciBQQ0kgYWRkcmVzc2VzIHRoYW4gdGhlIEVIQ0kgY29udHJvbGxlciwgc28gdGhleSB3aWxsIGJlCi0gKiBkaXNjb3ZlcmVkIChhbmQgaGVuY2UgcmVzdW1lZCkgZmlyc3QuICBCdXQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoaW5ncwotICogd2lsbCBhbHdheXMgd29yayB0aGlzIHdheS4gIElmIHRoZSBFSENJIGNvbnRyb2xsZXIgaXMgcmVzdW1lZCBmaXJzdCBhbmQKLSAqIHRoZSBPSENJIHBvcnRzIGFyZSB1bnBvd2VyZWQsIHRoZW4gdGhlIGhhbmRvdmVyIHdpbGwgZmFpbC4KLSAqLwotc3RhdGljIHZvaWQgcHJlcGFyZV9mb3JfaGFuZG92ZXIoc3RydWN0IHVzYl9oY2QgKmhjZCkKLXsKLQlzdHJ1Y3Qgb2hjaV9oY2QJKm9oY2kgPSBoY2RfdG9fb2hjaShoY2QpOwotCWludAkJcG9ydDsKLQotCS8qIEhlcmUgd2UgImtub3ciIHJvb3QgcG9ydHMgc2hvdWxkIGFsd2F5cyBzdGF5IHBvd2VyZWQgKi8KLQlvaGNpX2RiZyhvaGNpLCAicG93ZXJ1cCBwb3J0c1xuIik7Ci0JZm9yIChwb3J0ID0gMDsgcG9ydCA8IG9oY2ktPm51bV9wb3J0czsgcG9ydCsrKQotCQlvaGNpX3dyaXRlbChvaGNpLCBSSF9QU19QUFMsCi0JCQkJJm9oY2ktPnJlZ3MtPnJvb3RodWIucG9ydHN0YXR1c1twb3J0XSk7Ci0KLQkvKiBGbHVzaCB0aG9zZSB3cml0ZXMgKi8KLQlvaGNpX3JlYWRsKG9oY2ksICZvaGNpLT5yZWdzLT5jb250cm9sKTsKLQltc2xlZXAoMjApOwotfQotCi0jZWxzZQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcHJlcGFyZV9mb3JfaGFuZG92ZXIoc3RydWN0IHVzYl9oY2QgKmhjZCkKLXsgfQotCi0jZW5kaWYJLyogQ09ORklHX1VTQl9QRVJTSVNUIGV0Yy4gKi8KLQogI2lmZGVmCUNPTkZJR19QTQogCiBzdGF0aWMgaW50IG9oY2lfcGNpX3N1c3BlbmQgKHN0cnVjdCB1c2JfaGNkICpoY2QsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQpAQCAtMzEzLDEwICsyNzcsNyBAQAogc3RhdGljIGludCBvaGNpX3BjaV9yZXN1bWUgKHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7CiAJc2V0X2JpdChIQ0RfRkxBR19IV19BQ0NFU1NJQkxFLCAmaGNkLT5mbGFncyk7Ci0KLQkvKiBGSVhNRTogd2Ugc2hvdWxkIHRyeSB0byBkZXRlY3QgbG9zcyBvZiBWQlVTIHBvd2VyIGhlcmUgKi8KLQlwcmVwYXJlX2Zvcl9oYW5kb3ZlcihoY2QpOwotCisJb2hjaV9maW5pc2hfY29udHJvbGxlcl9yZXN1bWUoaGNkKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzQ1LDkgKzMwNiw4IEBACiAJLnNodXRkb3duID0JCW9oY2lfc2h1dGRvd24sCiAKICNpZmRlZglDT05GSUdfUE0KLQkvKiB0aGVzZSBzdXNwZW5kL3Jlc3VtZSBlbnRyaWVzIGFyZSBmb3IgdXBzdHJlYW0gUENJIGdsdWUgT05MWSAqLwotCS5zdXNwZW5kID0JCW9oY2lfcGNpX3N1c3BlbmQsCi0JLnJlc3VtZSA9CQlvaGNpX3BjaV9yZXN1bWUsCisJLnBjaV9zdXNwZW5kID0JCW9oY2lfcGNpX3N1c3BlbmQsCisJLnBjaV9yZXN1bWUgPQkJb2hjaV9wY2lfcmVzdW1lLAogI2VuZGlmCiAKIAkvKgpAQCAtMzY3LDcgKzMyNyw2IEBACiAJICovCiAJLmh1Yl9zdGF0dXNfZGF0YSA9CW9oY2lfaHViX3N0YXR1c19kYXRhLAogCS5odWJfY29udHJvbCA9CQlvaGNpX2h1Yl9jb250cm9sLAotCS5odWJfaXJxX2VuYWJsZSA9CW9oY2lfcmhzY19lbmFibGUsCiAjaWZkZWYJQ09ORklHX1BNCiAJLmJ1c19zdXNwZW5kID0JCW9oY2lfYnVzX3N1c3BlbmQsCiAJLmJ1c19yZXN1bWUgPQkJb2hjaV9idXNfcmVzdW1lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBueDQwMDguYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbng0MDA4LmMKaW5kZXggMjhiNDU4Zi4uNjY0ZjA3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBueDQwMDguYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcG54NDAwOC5jCkBAIC0yODAsNyArMjgwLDYgQEAKIAkgKi8KIAkuaHViX3N0YXR1c19kYXRhID0gb2hjaV9odWJfc3RhdHVzX2RhdGEsCiAJLmh1Yl9jb250cm9sID0gb2hjaV9odWJfY29udHJvbCwKLQkuaHViX2lycV9lbmFibGUgPSBvaGNpX3Joc2NfZW5hYmxlLAogI2lmZGVmCUNPTkZJR19QTQogCS5idXNfc3VzcGVuZCA9IG9oY2lfYnVzX3N1c3BlbmQsCiAJLmJ1c19yZXN1bWUgPSBvaGNpX2J1c19yZXN1bWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcG54ODU1MC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBueDg1NTAuYwppbmRleCA2MDVkNTljLi4yODQ2N2UyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcG54ODU1MC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbng4NTUwLmMKQEAgLTIwMSw3ICsyMDEsNiBAQAogCSAqLwogCS5odWJfc3RhdHVzX2RhdGEgPQlvaGNpX2h1Yl9zdGF0dXNfZGF0YSwKIAkuaHViX2NvbnRyb2wgPQkJb2hjaV9odWJfY29udHJvbCwKLQkuaHViX2lycV9lbmFibGUgPQlvaGNpX3Joc2NfZW5hYmxlLAogI2lmZGVmCUNPTkZJR19QTQogCS5idXNfc3VzcGVuZCA9CQlvaGNpX2J1c19zdXNwZW5kLAogCS5idXNfcmVzdW1lID0JCW9oY2lfYnVzX3Jlc3VtZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wcGMtb2YuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wcGMtb2YuYwppbmRleCBhNjcyNTI3Li41MGU1NWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHBjLW9mLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBwYy1vZi5jCkBAIC03Miw3ICs3Miw2IEBACiAJICovCiAJLmh1Yl9zdGF0dXNfZGF0YSA9CW9oY2lfaHViX3N0YXR1c19kYXRhLAogCS5odWJfY29udHJvbCA9CQlvaGNpX2h1Yl9jb250cm9sLAotCS5odWJfaXJxX2VuYWJsZSA9CW9oY2lfcmhzY19lbmFibGUsCiAjaWZkZWYJQ09ORklHX1BNCiAJLmJ1c19zdXNwZW5kID0JCW9oY2lfYnVzX3N1c3BlbmQsCiAJLmJ1c19yZXN1bWUgPQkJb2hjaV9idXNfcmVzdW1lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBwYy1zb2MuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wcGMtc29jLmMKaW5kZXggNTIzYzMwMS4uY2QzMzk4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBwYy1zb2MuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHBjLXNvYy5jCkBAIC0xNzIsNyArMTcyLDYgQEAKIAkgKi8KIAkuaHViX3N0YXR1c19kYXRhID0Jb2hjaV9odWJfc3RhdHVzX2RhdGEsCiAJLmh1Yl9jb250cm9sID0JCW9oY2lfaHViX2NvbnRyb2wsCi0JLmh1Yl9pcnFfZW5hYmxlID0Jb2hjaV9yaHNjX2VuYWJsZSwKICNpZmRlZglDT05GSUdfUE0KIAkuYnVzX3N1c3BlbmQgPQkJb2hjaV9idXNfc3VzcGVuZCwKIAkuYnVzX3Jlc3VtZSA9CQlvaGNpX2J1c19yZXN1bWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHMzLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHMzLmMKaW5kZXggMDFhMGNhZS4uYmZkZWIwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBzMy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wczMuYwpAQCAtNjgsNyArNjgsNiBAQAogCS5nZXRfZnJhbWVfbnVtYmVyCT0gb2hjaV9nZXRfZnJhbWUsCiAJLmh1Yl9zdGF0dXNfZGF0YQk9IG9oY2lfaHViX3N0YXR1c19kYXRhLAogCS5odWJfY29udHJvbAkJPSBvaGNpX2h1Yl9jb250cm9sLAotCS5odWJfaXJxX2VuYWJsZQkJPSBvaGNpX3Joc2NfZW5hYmxlLAogCS5zdGFydF9wb3J0X3Jlc2V0CT0gb2hjaV9zdGFydF9wb3J0X3Jlc2V0LAogI2lmIGRlZmluZWQoQ09ORklHX1BNKQogCS5idXNfc3VzcGVuZCAJCT0gb2hjaV9idXNfc3VzcGVuZCwKQEAgLTEyNyw3ICsxMjYsNiBAQAogCQlnb3RvIGZhaWxfaXJxOwogCX0KIAotCWRldi0+Y29yZS5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CiAJZGV2LT5jb3JlLmRtYV9tYXNrID0gJmR1bW15X21hc2s7IC8qIEZJWE1FOiBmb3IgaW1wcm9wZXIgdXNiIGNvZGUgKi8KIAogCWhjZCA9IHVzYl9jcmVhdGVfaGNkKCZwczNfb2hjaV9oY19kcml2ZXIsICZkZXYtPmNvcmUsIGRldi0+Y29yZS5idXNfaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXB4YTI3eC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXB4YTI3eC5jCmluZGV4IDhhZDliM2IuLjcwYjBkNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1weGEyN3guYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHhhMjd4LmMKQEAgLTI5OCw3ICsyOTgsNiBAQAogCSAqLwogCS5odWJfc3RhdHVzX2RhdGEgPQlvaGNpX2h1Yl9zdGF0dXNfZGF0YSwKIAkuaHViX2NvbnRyb2wgPQkJb2hjaV9odWJfY29udHJvbCwKLQkuaHViX2lycV9lbmFibGUgPQlvaGNpX3Joc2NfZW5hYmxlLAogI2lmZGVmICBDT05GSUdfUE0KIAkuYnVzX3N1c3BlbmQgPQkJb2hjaV9idXNfc3VzcGVuZCwKIAkuYnVzX3Jlc3VtZSA9CQlvaGNpX2J1c19yZXN1bWUsCkBAIC0zMzksNyArMzM4LDYgQEAKIAogCXB4YTI3eF9zdG9wX2hjKCZwZGV2LT5kZXYpOwogCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9TVVNQRU5ERUQ7Ci0JcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19TVVNQRU5EOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zNTcsOSArMzU1LDcgQEAKIAlpZiAoKHN0YXR1cyA9IHB4YTI3eF9zdGFydF9oYygmcGRldi0+ZGV2KSkgPCAwKQogCQlyZXR1cm4gc3RhdHVzOwogCi0JcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKLQl1c2JfaGNkX3Jlc3VtZV9yb290X2h1YihoY2QpOwotCisJb2hjaV9maW5pc2hfY29udHJvbGxlcl9yZXN1bWUoaGNkKTsKIAlyZXR1cm4gMDsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXMzYzI0MTAuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zM2MyNDEwLmMKaW5kZXggZWFkNDc3Mi4uYTczZDJmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXMzYzI0MTAuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktczNjMjQxMC5jCkBAIC00NjYsNyArNDY2LDYgQEAKIAkgKi8KIAkuaHViX3N0YXR1c19kYXRhID0Jb2hjaV9zM2MyNDEwX2h1Yl9zdGF0dXNfZGF0YSwKIAkuaHViX2NvbnRyb2wgPQkJb2hjaV9zM2MyNDEwX2h1Yl9jb250cm9sLAotCS5odWJfaXJxX2VuYWJsZSA9CW9oY2lfcmhzY19lbmFibGUsCiAjaWZkZWYJQ09ORklHX1BNCiAJLmJ1c19zdXNwZW5kID0JCW9oY2lfYnVzX3N1c3BlbmQsCiAJLmJ1c19yZXN1bWUgPQkJb2hjaV9idXNfcmVzdW1lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXNhMTExMS5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXNhMTExMS5jCmluZGV4IDBmNDhmMmQuLjk5NDM4YzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zYTExMTEuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktc2ExMTExLmMKQEAgLTIzMSw3ICsyMzEsNiBAQAogCSAqLwogCS5odWJfc3RhdHVzX2RhdGEgPQlvaGNpX2h1Yl9zdGF0dXNfZGF0YSwKIAkuaHViX2NvbnRyb2wgPQkJb2hjaV9odWJfY29udHJvbCwKLQkuaHViX2lycV9lbmFibGUgPQlvaGNpX3Joc2NfZW5hYmxlLAogI2lmZGVmCUNPTkZJR19QTQogCS5idXNfc3VzcGVuZCA9CQlvaGNpX2J1c19zdXNwZW5kLAogCS5idXNfcmVzdW1lID0JCW9oY2lfYnVzX3Jlc3VtZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zaC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXNoLmMKaW5kZXggZTdlZTYwNy4uNjBmMDNjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXNoLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXNoLmMKQEAgLTY4LDcgKzY4LDYgQEAKIAkgKi8KIAkuaHViX3N0YXR1c19kYXRhID0Jb2hjaV9odWJfc3RhdHVzX2RhdGEsCiAJLmh1Yl9jb250cm9sID0JCW9oY2lfaHViX2NvbnRyb2wsCi0JLmh1Yl9pcnFfZW5hYmxlID0Jb2hjaV9yaHNjX2VuYWJsZSwKICNpZmRlZglDT05GSUdfUE0KIAkuYnVzX3N1c3BlbmQgPQkJb2hjaV9idXNfc3VzcGVuZCwKIAkuYnVzX3Jlc3VtZSA9CQlvaGNpX2J1c19yZXN1bWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktc201MDEuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zbTUwMS5jCmluZGV4IDRlYTkyNzYuLjc3MjA0ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zbTUwMS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zbTUwMS5jCkBAIC03NSw3ICs3NSw2IEBACiAJICovCiAJLmh1Yl9zdGF0dXNfZGF0YSA9CW9oY2lfaHViX3N0YXR1c19kYXRhLAogCS5odWJfY29udHJvbCA9CQlvaGNpX2h1Yl9jb250cm9sLAotCS5odWJfaXJxX2VuYWJsZSA9CW9oY2lfcmhzY19lbmFibGUsCiAjaWZkZWYJQ09ORklHX1BNCiAJLmJ1c19zdXNwZW5kID0JCW9oY2lfYnVzX3N1c3BlbmQsCiAJLmJ1c19yZXN1bWUgPQkJb2hjaV9idXNfcmVzdW1lLApAQCAtMTk5LDcgKzE5OCw4IEBACiAJdXNiX3B1dF9oY2QoaGNkKTsKIAlkbWFfcmVsZWFzZV9kZWNsYXJlZF9tZW1vcnkoJnBkZXYtPmRldik7CiAJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKLQlyZWxlYXNlX21lbV9yZWdpb24obWVtLT5zdGFydCwgbWVtLT5lbmQgLSBtZW0tPnN0YXJ0ICsgMSk7CisJaWYgKG1lbSkKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIG1lbS0+ZW5kIC0gbWVtLT5zdGFydCArIDEpOwogCiAJLyogbWFzayBpbnRlcnJ1cHRzIGFuZCBkaXNhYmxlIHBvd2VyICovCiAKQEAgLTIyNCwyNCArMjI0LDI2IEBACiAKIAlzbTUwMV91bml0X3Bvd2VyKGRldi0+cGFyZW50LCBTTTUwMV9HQVRFX1VTQl9IT1NULCAwKTsKIAlvaGNpX3RvX2hjZChvaGNpKS0+c3RhdGUgPSBIQ19TVEFURV9TVVNQRU5ERUQ7Ci0JZGV2LT5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfU1VTUEVORDsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBvaGNpX3NtNTAxX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Ci0Jc3RydWN0IG9oY2lfaGNkCSpvaGNpID0gaGNkX3RvX29oY2kocGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldikpOworCXN0cnVjdCB1c2JfaGNkCSpoY2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgb2hjaV9oY2QJKm9oY2kgPSBoY2RfdG9fb2hjaShoY2QpOwogCiAJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIG9oY2ktPm5leHRfc3RhdGVjaGFuZ2UpKQogCQltc2xlZXAoNSk7CiAJb2hjaS0+bmV4dF9zdGF0ZWNoYW5nZSA9IGppZmZpZXM7CiAKIAlzbTUwMV91bml0X3Bvd2VyKGRldi0+cGFyZW50LCBTTTUwMV9HQVRFX1VTQl9IT1NULCAxKTsKLQlkZXYtPnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKLQl1c2JfaGNkX3Jlc3VtZV9yb290X2h1YihwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KSk7CisJb2hjaV9maW5pc2hfY29udHJvbGxlcl9yZXN1bWUoaGNkKTsKIAlyZXR1cm4gMDsKIH0KKyNlbHNlCisjZGVmaW5lIG9oY2lfc201MDFfc3VzcGVuZCBOVUxMCisjZGVmaW5lIG9oY2lfc201MDFfcmVzdW1lIE5VTEwKICNlbmRpZgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMjUzLDEwICsyNTUsOCBAQAogCS5wcm9iZQkJPSBvaGNpX2hjZF9zbTUwMV9kcnZfcHJvYmUsCiAJLnJlbW92ZQkJPSBvaGNpX2hjZF9zbTUwMV9kcnZfcmVtb3ZlLAogCS5zaHV0ZG93bgk9IHVzYl9oY2RfcGxhdGZvcm1fc2h1dGRvd24sCi0jaWZkZWYJQ09ORklHX1BNCiAJLnN1c3BlbmQJPSBvaGNpX3NtNTAxX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSBvaGNpX3NtNTAxX3Jlc3VtZSwKLSNlbmRpZgogCS5kcml2ZXIJCT0gewogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLm5hbWUJPSAic201MDEtdXNiIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zc2IuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zc2IuYwppbmRleCA2ZTljMmQ2Li5jNDI2NWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktc3NiLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXNzYi5jCkBAIC02MCwzNiArNjAsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgc3NiX29oY2lfaGNkX3N1c3BlbmQoc3RydWN0IHVzYl9oY2QgKmhjZCwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCi17Ci0Jc3RydWN0IHNzYl9vaGNpX2RldmljZSAqb2hjaWRldiA9IGhjZF90b19zc2Jfb2hjaShoY2QpOwotCXN0cnVjdCBvaGNpX2hjZCAqb2hjaSA9ICZvaGNpZGV2LT5vaGNpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmb2hjaS0+bG9jaywgZmxhZ3MpOwotCi0Jb2hjaV93cml0ZWwob2hjaSwgT0hDSV9JTlRSX01JRSwgJm9oY2ktPnJlZ3MtPmludHJkaXNhYmxlKTsKLQlvaGNpX3JlYWRsKG9oY2ksICZvaGNpLT5yZWdzLT5pbnRyZGlzYWJsZSk7IC8qIGNvbW1pdCB3cml0ZSAqLwotCi0JLyogbWFrZSBzdXJlIHNuYXBzaG90IGJlaW5nIHJlc3VtZWQgcmUtZW51bWVyYXRlcyBldmVyeXRoaW5nICovCi0JaWYgKG1lc3NhZ2UuZXZlbnQgPT0gUE1fRVZFTlRfUFJFVEhBVykKLQkJb2hjaV91c2JfcmVzZXQob2hjaSk7Ci0KLQljbGVhcl9iaXQoSENEX0ZMQUdfSFdfQUNDRVNTSUJMRSwgJmhjZC0+ZmxhZ3MpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2hjaS0+bG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNzYl9vaGNpX2hjZF9yZXN1bWUoc3RydWN0IHVzYl9oY2QgKmhjZCkKLXsKLQlzZXRfYml0KEhDRF9GTEFHX0hXX0FDQ0VTU0lCTEUsICZoY2QtPmZsYWdzKTsKLQl1c2JfaGNkX3Jlc3VtZV9yb290X2h1YihoY2QpOwotCXJldHVybiAwOwotfQotI2VuZGlmIC8qIENPTkZJR19QTSAqLwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhjX2RyaXZlciBzc2Jfb2hjaV9oY19kcml2ZXIgPSB7CiAJLmRlc2NyaXB0aW9uCQk9ICJzc2ItdXNiLW9oY2kiLAogCS5wcm9kdWN0X2Rlc2MJCT0gIlNTQiBPSENJIENvbnRyb2xsZXIiLApAQCAtMTAzLDExICs3Myw2IEBACiAJLnN0b3AJCQk9IG9oY2lfc3RvcCwKIAkuc2h1dGRvd24JCT0gb2hjaV9zaHV0ZG93biwKIAotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kCQk9IHNzYl9vaGNpX2hjZF9zdXNwZW5kLAotCS5yZXN1bWUJCQk9IHNzYl9vaGNpX2hjZF9yZXN1bWUsCi0jZW5kaWYKLQogCS51cmJfZW5xdWV1ZQkJPSBvaGNpX3VyYl9lbnF1ZXVlLAogCS51cmJfZGVxdWV1ZQkJPSBvaGNpX3VyYl9kZXF1ZXVlLAogCS5lbmRwb2ludF9kaXNhYmxlCT0gb2hjaV9lbmRwb2ludF9kaXNhYmxlLApAQCAtMTE2LDcgKzgxLDYgQEAKIAogCS5odWJfc3RhdHVzX2RhdGEJPSBvaGNpX2h1Yl9zdGF0dXNfZGF0YSwKIAkuaHViX2NvbnRyb2wJCT0gb2hjaV9odWJfY29udHJvbCwKLQkuaHViX2lycV9lbmFibGUJCT0gb2hjaV9yaHNjX2VuYWJsZSwKICNpZmRlZglDT05GSUdfUE0KIAkuYnVzX3N1c3BlbmQJCT0gb2hjaV9idXNfc3VzcGVuZCwKIAkuYnVzX3Jlc3VtZQkJPSBvaGNpX2J1c19yZXN1bWUsCkBAIC0yMjQsNiArMTg4LDcgQEAKIAogCXNzYl9kZXZpY2VfZW5hYmxlKGRldiwgb2hjaWRldi0+ZW5hYmxlX2ZsYWdzKTsKIAorCW9oY2lfZmluaXNoX2NvbnRyb2xsZXJfcmVzdW1lKGhjZCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvcGNpLXF1aXJrcy5jIGIvZHJpdmVycy91c2IvaG9zdC9wY2ktcXVpcmtzLmMKaW5kZXggMGVlNjk0Zi4uYWU2ZTcwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9wY2ktcXVpcmtzLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9wY2ktcXVpcmtzLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFVIQ0lfVVNCTEVHU1VQLCAmbGVnc3VwKTsKIAlpZiAobGVnc3VwICYgfihVSENJX1VTQkxFR1NVUF9STyB8IFVIQ0lfVVNCTEVHU1VQX1JXQykpIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IGxlZ3N1cCA9IDB4JTA0eFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIGxlZ3N1cCk7CisJCQkJX19mdW5jX18sIGxlZ3N1cCk7CiAJCWdvdG8gcmVzZXRfbmVlZGVkOwogCX0KIApAQCAtMTE0LDE0ICsxMTQsMTQgQEAKIAlpZiAoKGNtZCAmIFVIQ0lfVVNCQ01EX1JVTikgfHwgIShjbWQgJiBVSENJX1VTQkNNRF9DT05GSUdVUkUpIHx8CiAJCQkhKGNtZCAmIFVIQ0lfVVNCQ01EX0VHU00pKSB7CiAJCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiBjbWQgPSAweCUwNHhcbiIsCi0JCQkJX19GVU5DVElPTl9fLCBjbWQpOworCQkJCV9fZnVuY19fLCBjbWQpOwogCQlnb3RvIHJlc2V0X25lZWRlZDsKIAl9CiAKIAlpbnRyID0gaW53KGJhc2UgKyBVSENJX1VTQklOVFIpOwogCWlmIChpbnRyICYgKH5VSENJX1VTQklOVFJfUkVTVU1FKSkgewogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogaW50ciA9IDB4JTA0eFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIGludHIpOworCQkJCV9fZnVuY19fLCBpbnRyKTsKIAkJZ290byByZXNldF9uZWVkZWQ7CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9yOGE2NjU5Ny1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QvcjhhNjY1OTctaGNkLmMKaW5kZXggOWY4MGU1Mi4uZjRmYTkzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9yOGE2NjU5Ny1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3I4YTY2NTk3LWhjZC5jCkBAIC00NiwxNSArNDYsMTcgQEAKIE1PRFVMRV9BVVRIT1IoIllvc2hpaGlybyBTaGltb2RhIik7CiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnI4YTY2NTk3X2hjZCIpOwogCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIyOSBNYXkgMjAwNyIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JIjEwIEFwciAyMDA4IgogCiBzdGF0aWMgY29uc3QgY2hhciBoY2RfbmFtZVtdID0gInI4YTY2NTk3X2hjZCI7CiAKIC8qIG1vZHVsZSBwYXJhbWV0ZXJzICovCisjaWYgIWRlZmluZWQoQ09ORklHX1NVUEVSSF9PTl9DSElQX1I4QTY2NTk3KQogc3RhdGljIHVuc2lnbmVkIHNob3J0IGNsb2NrID0gWFRBTDEyOwogbW9kdWxlX3BhcmFtKGNsb2NrLCB1c2hvcnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhjbG9jaywgImlucHV0IGNsb2NrOiA0OE1Iej0zMjc2OCwgMjRNSHo9MTYzODQsIDEyTUh6PTAgIgogCQkiKGRlZmF1bHQ9MCkiKTsKKyNlbmRpZgogCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgdmlmID0gTERSVjsKIG1vZHVsZV9wYXJhbSh2aWYsIHVzaG9ydCwgMDY0NCk7CkBAIC0xMDYsMTEgKzEwOCwyMiBAQAogCXI4YTY2NTk3X3dyaXRlKHI4YTY2NTk3LCB2YWwsIGRldmFkZF9yZWcpOwogfQogCi1zdGF0aWMgaW50IGVuYWJsZV9jb250cm9sbGVyKHN0cnVjdCByOGE2NjU5NyAqcjhhNjY1OTcpCitzdGF0aWMgaW50IHI4YTY2NTk3X2Nsb2NrX2VuYWJsZShzdHJ1Y3QgcjhhNjY1OTcgKnI4YTY2NTk3KQogewogCXUxNiB0bXA7CiAJaW50IGkgPSAwOwogCisjaWYgZGVmaW5lZChDT05GSUdfU1VQRVJIX09OX0NISVBfUjhBNjY1OTcpCisJZG8geworCQlyOGE2NjU5N193cml0ZShyOGE2NjU5NywgU0NLRSwgU1lTQ0ZHMCk7CisJCXRtcCA9IHI4YTY2NTk3X3JlYWQocjhhNjY1OTcsIFNZU0NGRzApOworCQlpZiAoaSsrID4gMTAwMCkgeworCQkJZXJyKCJyZWdpc3RlciBhY2Nlc3MgZmFpbC4iKTsKKwkJCXJldHVybiAtRU5YSU87CisJCX0KKwl9IHdoaWxlICgodG1wICYgU0NLRSkgIT0gU0NLRSk7CisJcjhhNjY1OTdfd3JpdGUocjhhNjY1OTcsIDB4MDQsIDB4MDIpOworI2Vsc2UKIAlkbyB7CiAJCXI4YTY2NTk3X3dyaXRlKHI4YTY2NTk3LCBVU0JFLCBTWVNDRkcwKTsKIAkJdG1wID0gcjhhNjY1OTdfcmVhZChyOGE2NjU5NywgU1lTQ0ZHMCk7CkBAIC0xMzIsMTMgKzE0NSw2MyBAQAogCQkJcmV0dXJuIC1FTlhJTzsKIAkJfQogCX0gd2hpbGUgKCh0bXAgJiBTQ0tFKSAhPSBTQ0tFKTsKKyNlbmRpZgkvKiAjaWYgZGVmaW5lZChDT05GSUdfU1VQRVJIX09OX0NISVBfUjhBNjY1OTcpICovCiAKLQlyOGE2NjU5N19ic2V0KHI4YTY2NTk3LCBEQ0ZNIHwgRFJQRCwgU1lTQ0ZHMCk7Ci0JcjhhNjY1OTdfYnNldChyOGE2NjU5NywgRFJQRCwgU1lTQ0ZHMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHI4YTY2NTk3X2Nsb2NrX2Rpc2FibGUoc3RydWN0IHI4YTY2NTk3ICpyOGE2NjU5NykKK3sKKwlyOGE2NjU5N19iY2xyKHI4YTY2NTk3LCBTQ0tFLCBTWVNDRkcwKTsKKwl1ZGVsYXkoMSk7CisjaWYgIWRlZmluZWQoQ09ORklHX1NVUEVSSF9PTl9DSElQX1I4QTY2NTk3KQorCXI4YTY2NTk3X2JjbHIocjhhNjY1OTcsIFBMTEMsIFNZU0NGRzApOworCXI4YTY2NTk3X2JjbHIocjhhNjY1OTcsIFhDS0UsIFNZU0NGRzApOworCXI4YTY2NTk3X2JjbHIocjhhNjY1OTcsIFVTQkUsIFNZU0NGRzApOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHI4YTY2NTk3X2VuYWJsZV9wb3J0KHN0cnVjdCByOGE2NjU5NyAqcjhhNjY1OTcsIGludCBwb3J0KQoreworCXUxNiB2YWw7CisKKwl2YWwgPSBwb3J0ID8gRFJQRCA6IERDRk0gfCBEUlBEOworCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIHZhbCwgZ2V0X3N5c2NmZ19yZWcocG9ydCkpOworCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIEhTRSwgZ2V0X3N5c2NmZ19yZWcocG9ydCkpOworCisJcjhhNjY1OTdfd3JpdGUocjhhNjY1OTcsIEJVUlNUIHwgQ1BVX0FEUl9SRF9XUiwgZ2V0X2RtYWNmZ19yZWcocG9ydCkpOworCXI4YTY2NTk3X2JjbHIocjhhNjY1OTcsIERUQ0hFLCBnZXRfaW50ZW5iX3JlZyhwb3J0KSk7CisJcjhhNjY1OTdfYnNldChyOGE2NjU5NywgQVRUQ0hFLCBnZXRfaW50ZW5iX3JlZyhwb3J0KSk7Cit9CisKK3N0YXRpYyB2b2lkIHI4YTY2NTk3X2Rpc2FibGVfcG9ydChzdHJ1Y3QgcjhhNjY1OTcgKnI4YTY2NTk3LCBpbnQgcG9ydCkKK3sKKwl1MTYgdmFsLCB0bXA7CisKKwlyOGE2NjU5N193cml0ZShyOGE2NjU5NywgMCwgZ2V0X2ludGVuYl9yZWcocG9ydCkpOworCXI4YTY2NTk3X3dyaXRlKHI4YTY2NTk3LCAwLCBnZXRfaW50c3RzX3JlZyhwb3J0KSk7CisKKwlyOGE2NjU5N19wb3J0X3Bvd2VyKHI4YTY2NTk3LCBwb3J0LCAwKTsKKworCWRvIHsKKwkJdG1wID0gcjhhNjY1OTdfcmVhZChyOGE2NjU5NywgU09GQ0ZHKSAmIEVER0VTVFM7CisJCXVkZWxheSg2NDApOworCX0gd2hpbGUgKHRtcCA9PSBFREdFU1RTKTsKKworCXZhbCA9IHBvcnQgPyBEUlBEIDogRENGTSB8IERSUEQ7CisJcjhhNjY1OTdfYmNscihyOGE2NjU5NywgdmFsLCBnZXRfc3lzY2ZnX3JlZyhwb3J0KSk7CisJcjhhNjY1OTdfYmNscihyOGE2NjU5NywgSFNFLCBnZXRfc3lzY2ZnX3JlZyhwb3J0KSk7Cit9CisKK3N0YXRpYyBpbnQgZW5hYmxlX2NvbnRyb2xsZXIoc3RydWN0IHI4YTY2NTk3ICpyOGE2NjU5NykKK3sKKwlpbnQgcmV0LCBwb3J0OworCisJcmV0ID0gcjhhNjY1OTdfY2xvY2tfZW5hYmxlKHI4YTY2NTk3KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAogCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIHZpZiAmIExEUlYsIFBJTkNGRyk7Ci0JcjhhNjY1OTdfYnNldChyOGE2NjU5NywgSFNFLCBTWVNDRkcwKTsKLQlyOGE2NjU5N19ic2V0KHI4YTY2NTk3LCBIU0UsIFNZU0NGRzEpOwogCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIFVTQkUsIFNZU0NGRzApOwogCiAJcjhhNjY1OTdfYnNldChyOGE2NjU5NywgQkVNUEUgfCBOUkRZRSB8IEJSRFlFLCBJTlRFTkIwKTsKQEAgLTE0Niw1MyArMjA5LDMwIEBACiAJcjhhNjY1OTdfYnNldChyOGE2NjU5NywgQlJEWTAsIEJSRFlFTkIpOwogCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIEJFTVAwLCBCRU1QRU5CKTsKIAotCXI4YTY2NTk3X3dyaXRlKHI4YTY2NTk3LCBCVVJTVCB8IENQVV9BRFJfUkRfV1IsIERNQTBDRkcpOwotCXI4YTY2NTk3X3dyaXRlKHI4YTY2NTk3LCBCVVJTVCB8IENQVV9BRFJfUkRfV1IsIERNQTFDRkcpOwotCiAJcjhhNjY1OTdfYnNldChyOGE2NjU5NywgZW5kaWFuICYgQklHRU5ELCBDRklGT1NFTCk7CiAJcjhhNjY1OTdfYnNldChyOGE2NjU5NywgZW5kaWFuICYgQklHRU5ELCBEMEZJRk9TRUwpOwogCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIGVuZGlhbiAmIEJJR0VORCwgRDFGSUZPU0VMKTsKLQogCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIFRSTkVOU0VMLCBTT0ZDRkcpOwogCiAJcjhhNjY1OTdfYnNldChyOGE2NjU5NywgU0lHTkUgfCBTQUNLRSwgSU5URU5CMSk7Ci0JcjhhNjY1OTdfYmNscihyOGE2NjU5NywgRFRDSEUsIElOVEVOQjEpOwotCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIEFUVENIRSwgSU5URU5CMSk7Ci0JcjhhNjY1OTdfYmNscihyOGE2NjU5NywgRFRDSEUsIElOVEVOQjIpOwotCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIEFUVENIRSwgSU5URU5CMik7CisKKwlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgUjhBNjY1OTdfTUFYX1JPT1RfSFVCOyBwb3J0KyspCisJCXI4YTY2NTk3X2VuYWJsZV9wb3J0KHI4YTY2NTk3LCBwb3J0KTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBkaXNhYmxlX2NvbnRyb2xsZXIoc3RydWN0IHI4YTY2NTk3ICpyOGE2NjU5NykKIHsKLQl1MTYgdG1wOworCWludCBwb3J0OwogCiAJcjhhNjY1OTdfd3JpdGUocjhhNjY1OTcsIDAsIElOVEVOQjApOwotCXI4YTY2NTk3X3dyaXRlKHI4YTY2NTk3LCAwLCBJTlRFTkIxKTsKLQlyOGE2NjU5N193cml0ZShyOGE2NjU5NywgMCwgSU5URU5CMik7CiAJcjhhNjY1OTdfd3JpdGUocjhhNjY1OTcsIDAsIElOVFNUUzApOwotCXI4YTY2NTk3X3dyaXRlKHI4YTY2NTk3LCAwLCBJTlRTVFMxKTsKLQlyOGE2NjU5N193cml0ZShyOGE2NjU5NywgMCwgSU5UU1RTMik7CiAKLQlyOGE2NjU5N19wb3J0X3Bvd2VyKHI4YTY2NTk3LCAwLCAwKTsKLQlyOGE2NjU5N19wb3J0X3Bvd2VyKHI4YTY2NTk3LCAxLCAwKTsKKwlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgUjhBNjY1OTdfTUFYX1JPT1RfSFVCOyBwb3J0KyspCisJCXI4YTY2NTk3X2Rpc2FibGVfcG9ydChyOGE2NjU5NywgcG9ydCk7CiAKLQlkbyB7Ci0JCXRtcCA9IHI4YTY2NTk3X3JlYWQocjhhNjY1OTcsIFNPRkNGRykgJiBFREdFU1RTOwotCQl1ZGVsYXkoNjQwKTsKLQl9IHdoaWxlICh0bXAgPT0gRURHRVNUUyk7Ci0KLQlyOGE2NjU5N19iY2xyKHI4YTY2NTk3LCBEQ0ZNIHwgRFJQRCwgU1lTQ0ZHMCk7Ci0JcjhhNjY1OTdfYmNscihyOGE2NjU5NywgRFJQRCwgU1lTQ0ZHMSk7Ci0JcjhhNjY1OTdfYmNscihyOGE2NjU5NywgSFNFLCBTWVNDRkcwKTsKLQlyOGE2NjU5N19iY2xyKHI4YTY2NTk3LCBIU0UsIFNZU0NGRzEpOwotCi0JcjhhNjY1OTdfYmNscihyOGE2NjU5NywgU0NLRSwgU1lTQ0ZHMCk7Ci0JdWRlbGF5KDEpOwotCXI4YTY2NTk3X2JjbHIocjhhNjY1OTcsIFBMTEMsIFNZU0NGRzApOwotCXI4YTY2NTk3X2JjbHIocjhhNjY1OTcsIFhDS0UsIFNZU0NGRzApOwotCXI4YTY2NTk3X2JjbHIocjhhNjY1OTcsIFVTQkUsIFNZU0NGRzApOworCXI4YTY2NTk3X2Nsb2NrX2Rpc2FibGUocjhhNjY1OTcpOwogfQogCiBzdGF0aWMgaW50IGdldF9wYXJlbnRfcjhhNjY1OTdfYWRkcmVzcyhzdHJ1Y3QgcjhhNjY1OTcgKnI4YTY2NTk3LApAQCAtNTc3LDEzICs2MTcsOSBAQAogCQkgICAgICAgUElQRUJVRik7CiAJcjhhNjY1OTdfd3JpdGUocjhhNjY1OTcsIG1ha2VfZGV2c2VsKGluZm8tPmFkZHJlc3MpIHwgaW5mby0+bWF4cGFja2V0LAogCQkgICAgICAgUElQRU1BWFApOwotCWlmIChpbmZvLT5pbnRlcnZhbCkKLQkJaW5mby0+aW50ZXJ2YWwtLTsKIAlyOGE2NjU5N193cml0ZShyOGE2NjU5NywgaW5mby0+aW50ZXJ2YWwsIFBJUEVQRVJJKTsKIH0KIAotCi0KIC8qIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHQgZGlzYWJsZWQgKi8KIHN0YXRpYyB2b2lkIHBpcGVfc2V0dGluZyhzdHJ1Y3QgcjhhNjY1OTcgKnI4YTY2NTk3LCBzdHJ1Y3QgcjhhNjY1OTdfdGQgKnRkKQogewpAQCAtNzE1LDYgKzc1MSw3IEBACiAJCQkJICAgICBzdHJ1Y3QgcjhhNjY1OTdfcGlwZSAqcGlwZSwKIAkJCQkgICAgIHN0cnVjdCB1cmIgKnVyYikKIHsKKyNpZiAhZGVmaW5lZChDT05GSUdfU1VQRVJIX09OX0NISVBfUjhBNjY1OTcpCiAJaW50IGk7CiAJc3RydWN0IHI4YTY2NTk3X3BpcGVfaW5mbyAqaW5mbyA9ICZwaXBlLT5pbmZvOwogCkBAIC03NDIsNiArNzc5LDcgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQorI2VuZGlmCS8qICNpZiBkZWZpbmVkKENPTkZJR19TVVBFUkhfT05fQ0hJUF9SOEE2NjU5NykgKi8KIH0KIAogLyogdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdCBkaXNhYmxlZCAqLwpAQCAtODI1LDYgKzg2MywyNSBAQAogCWRldi0+ZG1hX21hcCA9IDA7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF90aW1lcl9pbnRlcnZhbChzdHJ1Y3QgdXJiICp1cmIsIF9fdTggaW50ZXJ2YWwpCit7CisJX191OCBpOworCXVuc2lnbmVkIGxvbmcgdGltZSA9IDE7CisKKwlpZiAodXNiX3BpcGVpc29jKHVyYi0+cGlwZSkpCisJCXJldHVybiAwOworCisJaWYgKGdldF9yOGE2NjU5N191c2Jfc3BlZWQodXJiLT5kZXYtPnNwZWVkKSA9PSBIU01PREUpIHsKKwkJZm9yIChpID0gMDsgaSA8IChpbnRlcnZhbCAtIDEpOyBpKyspCisJCQl0aW1lICo9IDI7CisJCXRpbWUgPSB0aW1lICogMTI1IC8gMTAwMDsJLyogdVNPRiAtPiBtc2VjICovCisJfSBlbHNlIHsKKwkJdGltZSA9IGludGVydmFsOworCX0KKworCXJldHVybiB0aW1lOworfQorCiAvKiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0IGRpc2FibGVkICovCiBzdGF0aWMgdm9pZCBpbml0X3BpcGVfaW5mbyhzdHJ1Y3QgcjhhNjY1OTcgKnI4YTY2NTk3LCBzdHJ1Y3QgdXJiICp1cmIsCiAJCQkgICBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmhlcCwKQEAgLTg0MCw3ICs4OTcsMTYgQEAKIAkJCQkgICAgICAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKTsKIAlpbmZvLmJ1Zm51bSA9IGdldF9idWZudW0oaW5mby5waXBlbnVtKTsKIAlpbmZvLmJ1Zl9ic2l6ZSA9IGdldF9idWZfYnNpemUoaW5mby5waXBlbnVtKTsKLQlpbmZvLmludGVydmFsID0gZXAtPmJJbnRlcnZhbDsKKwlpZiAoaW5mby50eXBlID09IFI4QTY2NTk3X0JVTEspIHsKKwkJaW5mby5pbnRlcnZhbCA9IDA7CisJCWluZm8udGltZXJfaW50ZXJ2YWwgPSAwOworCX0gZWxzZSB7CisJCWlmIChlcC0+YkludGVydmFsID4gSUlUVikKKwkJCWluZm8uaW50ZXJ2YWwgPSBJSVRWOworCQllbHNlCisJCQlpbmZvLmludGVydmFsID0gZXAtPmJJbnRlcnZhbCA/IGVwLT5iSW50ZXJ2YWwgLSAxIDogMDsKKwkJaW5mby50aW1lcl9pbnRlcnZhbCA9IGdldF90aW1lcl9pbnRlcnZhbCh1cmIsIGVwLT5iSW50ZXJ2YWwpOworCX0KIAlpZiAoZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spCiAJCWluZm8uZGlyX2luID0gMTsKIAllbHNlCkBAIC04NzYsMTAgKzk0MiwxOSBAQAogfQogCiAvKiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0IGRpc2FibGVkICovCi1zdGF0aWMgdm9pZCByOGE2NjU5N191c2JfcHJlY29ubmVjdChzdHJ1Y3QgcjhhNjY1OTcgKnI4YTY2NTk3LCBpbnQgcG9ydCkKK3N0YXRpYyB2b2lkIHI4YTY2NTk3X2NoZWNrX3N5c3N0cyhzdHJ1Y3QgcjhhNjY1OTcgKnI4YTY2NTk3LCBpbnQgcG9ydCwKKwkJCQkJdTE2IHN5c3N0cykKIHsKLQlyOGE2NjU5Ny0+cm9vdF9odWJbcG9ydF0ucG9ydCB8PSAoMSA8PCBVU0JfUE9SVF9GRUFUX0NPTk5FQ1RJT04pCi0JCQkJCSB8ICgxIDw8IFVTQl9QT1JUX0ZFQVRfQ19DT05ORUNUSU9OKTsKKwlpZiAoc3lzc3RzID09IFNFMCkgeworCQlyOGE2NjU5N19ic2V0KHI4YTY2NTk3LCBBVFRDSEUsIGdldF9pbnRlbmJfcmVnKHBvcnQpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzeXNzdHMgPT0gRlNfSlNUUykKKwkJcjhhNjY1OTdfYnNldChyOGE2NjU5NywgSFNFLCBnZXRfc3lzY2ZnX3JlZyhwb3J0KSk7CisJZWxzZSBpZiAoc3lzc3RzID09IExTX0pTVFMpCisJCXI4YTY2NTk3X2JjbHIocjhhNjY1OTcsIEhTRSwgZ2V0X3N5c2NmZ19yZWcocG9ydCkpOworCiAJcjhhNjY1OTdfd3JpdGUocjhhNjY1OTcsIH5EVENILCBnZXRfaW50c3RzX3JlZyhwb3J0KSk7CiAJcjhhNjY1OTdfYnNldChyOGE2NjU5NywgRFRDSEUsIGdldF9pbnRlbmJfcmVnKHBvcnQpKTsKIH0KQEAgLTk2MCw5ICsxMDM1LDkgQEAKIAkJCQlyOGE2NjU5N193cml0ZShyOGE2NjU5NywgVFJDTFIsCiAJCQkJCQl0ZC0+cGlwZS0+cGlwZXRyZSk7CiAJCQkJcjhhNjY1OTdfd3JpdGUocjhhNjY1OTcsCi0JCQkJCQkodXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoCi0JCQkJCQkrIHRkLT5tYXhwYWNrZXQgLSAxKQotCQkJCQkJLyB0ZC0+bWF4cGFja2V0LAorCQkJCQkJRElWX1JPVU5EX1VQCisJCQkJCQkgICh1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCisJCQkJCQkgICB0ZC0+bWF4cGFja2V0KSwKIAkJCQkJCXRkLT5waXBlLT5waXBldHJuKTsKIAkJCQlyOGE2NjU5N19ic2V0KHI4YTY2NTk3LCBUUkVOQiwKIAkJCQkJCXRkLT5waXBlLT5waXBldHJlKTsKQEAgLTEwMjEsOCArMTA5Niw3IEBACiAJCXI4YTY2NTk3X21kZnkocjhhNjY1OTcsIElTRUwsIElTRUwgfCBDVVJQSVBFLCBDRklGT1NFTCk7CiAJCXI4YTY2NTk3X3JlZ193YWl0KHI4YTY2NTk3LCBDRklGT1NFTCwgQ1VSUElQRSwgMCk7CiAJCXI4YTY2NTk3X3dyaXRlKHI4YTY2NTk3LCB+QkVNUDAsIEJFTVBTVFMpOwotCQlyOGE2NjU5N193cml0ZShyOGE2NjU5NywgQkNMUiwgQ0ZJRk9DVFIpOwotCQlyOGE2NjU5N193cml0ZShyOGE2NjU5NywgQlZBTCwgQ0ZJRk9DVFIpOworCQlyOGE2NjU5N193cml0ZShyOGE2NjU5NywgQkNMUiB8IEJWQUwsIENGSUZPQ1RSKTsKIAkJZW5hYmxlX2lycV9lbXB0eShyOGE2NjU5NywgMCk7CiAJfSBlbHNlIHsKIAkJcjhhNjY1OTdfYmNscihyOGE2NjU5NywgUjhBNjY1OTdfRElSLCBEQ1BDRkcpOwpAQCAtMTQ1NCwxMyArMTUyOCwyMSBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgcjhhNjY1OTdfcm9vdF9odWJfc3RhcnRfcG9sbGluZyhzdHJ1Y3QgcjhhNjY1OTcgKnI4YTY2NTk3KQoreworCW1vZF90aW1lcigmcjhhNjY1OTctPnJoX3RpbWVyLAorCQkJamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoUjhBNjY1OTdfUkhfUE9MTF9USU1FKSk7Cit9CisKIHN0YXRpYyB2b2lkIHN0YXJ0X3Jvb3RfaHViX3NhbXBsaW5nKHN0cnVjdCByOGE2NjU5NyAqcjhhNjY1OTcsIGludCBwb3J0KQogewogCXN0cnVjdCByOGE2NjU5N19yb290X2h1YiAqcmggPSAmcjhhNjY1OTctPnJvb3RfaHViW3BvcnRdOwogCiAJcmgtPm9sZF9zeXNzdHMgPSByOGE2NjU5N19yZWFkKHI4YTY2NTk3LCBnZXRfc3lzc3RzX3JlZyhwb3J0KSkgJiBMTlNUOwogCXJoLT5zY291bnQgPSBSOEE2NjU5N19NQVhfU0FNUExJTkc7Ci0JbW9kX3RpbWVyKCZyOGE2NjU5Ny0+cmhfdGltZXIsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwKSk7CisJcjhhNjY1OTctPnJvb3RfaHViW3BvcnRdLnBvcnQgfD0gKDEgPDwgVVNCX1BPUlRfRkVBVF9DT05ORUNUSU9OKQorCQkJCQkgfCAoMSA8PCBVU0JfUE9SVF9GRUFUX0NfQ09OTkVDVElPTik7CisJcjhhNjY1OTdfcm9vdF9odWJfc3RhcnRfcG9sbGluZyhyOGE2NjU5Nyk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCByOGE2NjU5N19pcnEoc3RydWN0IHVzYl9oY2QgKmhjZCkKQEAgLTE1NDcsNDEgKzE2MjksNTUgQEAKIAkJaWYgKCh0bXAgJiBVU0JSU1QpID09IFVTQlJTVCkgewogCQkJcjhhNjY1OTdfbWRmeShyOGE2NjU5NywgVUFDVCwgVVNCUlNUIHwgVUFDVCwKIAkJCQkgICAgICBkdnN0Y3RyX3JlZyk7Ci0JCQltb2RfdGltZXIoJnI4YTY2NTk3LT5yaF90aW1lciwKLQkJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwKSk7CisJCQlyOGE2NjU5N19yb290X2h1Yl9zdGFydF9wb2xsaW5nKHI4YTY2NTk3KTsKIAkJfSBlbHNlCiAJCQlyOGE2NjU5N191c2JfY29ubmVjdChyOGE2NjU5NywgcG9ydCk7CiAJfQogCisJaWYgKCEocmgtPnBvcnQgJiAoMSA8PCBVU0JfUE9SVF9GRUFUX0NPTk5FQ1RJT04pKSkgeworCQlyOGE2NjU5N193cml0ZShyOGE2NjU5NywgfkFUVENILCBnZXRfaW50c3RzX3JlZyhwb3J0KSk7CisJCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIEFUVENIRSwgZ2V0X2ludGVuYl9yZWcocG9ydCkpOworCX0KKwogCWlmIChyaC0+c2NvdW50ID4gMCkgewogCQl0bXAgPSByOGE2NjU5N19yZWFkKHI4YTY2NTk3LCBnZXRfc3lzc3RzX3JlZyhwb3J0KSkgJiBMTlNUOwogCQlpZiAodG1wID09IHJoLT5vbGRfc3lzc3RzKSB7CiAJCQlyaC0+c2NvdW50LS07Ci0JCQlpZiAocmgtPnNjb3VudCA9PSAwKSB7Ci0JCQkJaWYgKHRtcCA9PSBGU19KU1RTKSB7Ci0JCQkJCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIEhTRSwKLQkJCQkJCSAgICAgIGdldF9zeXNjZmdfcmVnKHBvcnQpKTsKLQkJCQkJcjhhNjY1OTdfdXNiX3ByZWNvbm5lY3QocjhhNjY1OTcsIHBvcnQpOwotCQkJCX0gZWxzZSBpZiAodG1wID09IExTX0pTVFMpIHsKLQkJCQkJcjhhNjY1OTdfYmNscihyOGE2NjU5NywgSFNFLAotCQkJCQkJICAgICAgZ2V0X3N5c2NmZ19yZWcocG9ydCkpOwotCQkJCQlyOGE2NjU5N191c2JfcHJlY29ubmVjdChyOGE2NjU5NywgcG9ydCk7Ci0JCQkJfSBlbHNlIGlmICh0bXAgPT0gU0UwKQotCQkJCQlyOGE2NjU5N19ic2V0KHI4YTY2NTk3LCBBVFRDSEUsCi0JCQkJCQkgICAgICBnZXRfaW50ZW5iX3JlZyhwb3J0KSk7Ci0JCQl9IGVsc2UgewotCQkJCW1vZF90aW1lcigmcjhhNjY1OTctPnJoX3RpbWVyLAotCQkJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwKSk7Ci0JCQl9CisJCQlpZiAocmgtPnNjb3VudCA9PSAwKQorCQkJCXI4YTY2NTk3X2NoZWNrX3N5c3N0cyhyOGE2NjU5NywgcG9ydCwgdG1wKTsKKwkJCWVsc2UKKwkJCQlyOGE2NjU5N19yb290X2h1Yl9zdGFydF9wb2xsaW5nKHI4YTY2NTk3KTsKIAkJfSBlbHNlIHsKIAkJCXJoLT5zY291bnQgPSBSOEE2NjU5N19NQVhfU0FNUExJTkc7CiAJCQlyaC0+b2xkX3N5c3N0cyA9IHRtcDsKLQkJCW1vZF90aW1lcigmcjhhNjY1OTctPnJoX3RpbWVyLAotCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNTApKTsKKwkJCXI4YTY2NTk3X3Jvb3RfaHViX3N0YXJ0X3BvbGxpbmcocjhhNjY1OTcpOwogCQl9CiAJfQogfQogCitzdGF0aWMgdm9pZCByOGE2NjU5N19pbnRlcnZhbF90aW1lcih1bnNpZ25lZCBsb25nIF9yOGE2NjU5NykKK3sKKwlzdHJ1Y3QgcjhhNjY1OTcgKnI4YTY2NTk3ID0gKHN0cnVjdCByOGE2NjU5NyAqKV9yOGE2NjU5NzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiBwaXBlbnVtOworCXN0cnVjdCByOGE2NjU5N190ZCAqdGQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcjhhNjY1OTctPmxvY2ssIGZsYWdzKTsKKworCWZvciAocGlwZW51bSA9IDA7IHBpcGVudW0gPCBSOEE2NjU5N19NQVhfTlVNX1BJUEU7IHBpcGVudW0rKykgeworCQlpZiAoIShyOGE2NjU5Ny0+aW50ZXJ2YWxfbWFwICYgKDEgPDwgcGlwZW51bSkpKQorCQkJY29udGludWU7CisJCWlmICh0aW1lcl9wZW5kaW5nKCZyOGE2NjU5Ny0+aW50ZXJ2YWxfdGltZXJbcGlwZW51bV0pKQorCQkJY29udGludWU7CisKKwkJdGQgPSByOGE2NjU5N19nZXRfdGQocjhhNjY1OTcsIHBpcGVudW0pOworCQlpZiAodGQpCisJCQlzdGFydF90cmFuc2ZlcihyOGE2NjU5NywgdGQpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnI4YTY2NTk3LT5sb2NrLCBmbGFncyk7Cit9CisKIHN0YXRpYyB2b2lkIHI4YTY2NTk3X3RkX3RpbWVyKHVuc2lnbmVkIGxvbmcgX3I4YTY2NTk3KQogewogCXN0cnVjdCByOGE2NjU5NyAqcjhhNjY1OTcgPSAoc3RydWN0IHI4YTY2NTk3ICopX3I4YTY2NTk3OwpAQCAtMTc2MywxMCArMTg1OSwxNyBAQAogCXVyYi0+aGNwcml2ID0gdGQ7CiAKIAlpZiAocmVxdWVzdCkgewotCQlyZXQgPSBzdGFydF90cmFuc2ZlcihyOGE2NjU5NywgdGQpOwotCQlpZiAocmV0IDwgMCkgewotCQkJbGlzdF9kZWwoJnRkLT5xdWV1ZSk7Ci0JCQlrZnJlZSh0ZCk7CisJCWlmICh0ZC0+cGlwZS0+aW5mby50aW1lcl9pbnRlcnZhbCkgeworCQkJcjhhNjY1OTctPmludGVydmFsX21hcCB8PSAxIDw8IHRkLT5waXBlbnVtOworCQkJbW9kX3RpbWVyKCZyOGE2NjU5Ny0+aW50ZXJ2YWxfdGltZXJbdGQtPnBpcGVudW1dLAorCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoCisJCQkJCXRkLT5waXBlLT5pbmZvLnRpbWVyX2ludGVydmFsKSk7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBzdGFydF90cmFuc2ZlcihyOGE2NjU5NywgdGQpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlsaXN0X2RlbCgmdGQtPnF1ZXVlKTsKKwkJCQlrZnJlZSh0ZCk7CisJCQl9CiAJCX0KIAl9IGVsc2UKIAkJc2V0X3RkX3RpbWVyKHI4YTY2NTk3LCB0ZCk7CkBAIC0yMTA3LDEzICsyMjEwLDExIEBACiAjaWYgZGVmaW5lZChDT05GSUdfUE0pCiBzdGF0aWMgaW50IHI4YTY2NTk3X3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewotCXBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IHN0YXRlOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHI4YTY2NTk3X3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CiAJcmV0dXJuIDA7CiB9CiAjZWxzZQkvKiBpZiBkZWZpbmVkKENPTkZJR19QTSkgKi8KQEAgLTIxOTQsNiArMjI5NSw5IEBACiAJCWluaXRfdGltZXIoJnI4YTY2NTk3LT50ZF90aW1lcltpXSk7CiAJCXI4YTY2NTk3LT50ZF90aW1lcltpXS5mdW5jdGlvbiA9IHI4YTY2NTk3X3RkX3RpbWVyOwogCQlyOGE2NjU5Ny0+dGRfdGltZXJbaV0uZGF0YSA9ICh1bnNpZ25lZCBsb25nKXI4YTY2NTk3OworCQlzZXR1cF90aW1lcigmcjhhNjY1OTctPmludGVydmFsX3RpbWVyW2ldLAorCQkJCXI4YTY2NTk3X2ludGVydmFsX3RpbWVyLAorCQkJCSh1bnNpZ25lZCBsb25nKXI4YTY2NTk3KTsKIAl9CiAJSU5JVF9MSVNUX0hFQUQoJnI4YTY2NTk3LT5jaGlsZF9kZXZpY2UpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3I4YTY2NTk3LmggYi9kcml2ZXJzL3VzYi9ob3N0L3I4YTY2NTk3LmgKaW5kZXggNTczODgyNS4uODRlZTAxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9yOGE2NjU5Ny5oCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvcjhhNjY1OTcuaApAQCAtMTg3LDcgKzE4NywxMSBAQAogI2RlZmluZQlSRVcJCTB4NDAwMAkvKiBiMTQ6IEJ1ZmZlciByZXdpbmQgKi8KICNkZWZpbmUJRENMUk0JCTB4MjAwMAkvKiBiMTM6IERNQSBidWZmZXIgY2xlYXIgbW9kZSAqLwogI2RlZmluZQlEUkVRRQkJMHgxMDAwCS8qIGIxMjogRFJFUSBvdXRwdXQgZW5hYmxlICovCisjaWYgZGVmaW5lZChDT05GSUdfU1VQRVJIX09OX0NISVBfUjhBNjY1OTcpCisjZGVmaW5lCU1CVwkJMHgwODAwCisjZWxzZQogI2RlZmluZQlNQlcJCTB4MDQwMAkvKiBiMTA6IE1heGltdW0gYml0IHdpZHRoIGZvciBGSUZPIGFjY2VzcyAqLworI2VuZGlmCiAjZGVmaW5lCSAgTUJXXzgJCSAweDAwMDAJICAvKiAgOGJpdCAqLwogI2RlZmluZQkgIE1CV18xNgkgMHgwNDAwCSAgLyogMTZiaXQgKi8KICNkZWZpbmUJQklHRU5ECQkweDAxMDAJLyogYjg6IEJpZyBlbmRpYW4gbW9kZSAqLwpAQCAtMzk1LDggKzM5OSwxMyBAQAogI2RlZmluZSBSOEE2NjU5N19NQVhfTlVNX1BJUEUJCTEwCiAjZGVmaW5lIFI4QTY2NTk3X0JVRl9CU0laRQkJOAogI2RlZmluZSBSOEE2NjU5N19NQVhfREVWSUNFCQkxMAorI2lmIGRlZmluZWQoQ09ORklHX1NVUEVSSF9PTl9DSElQX1I4QTY2NTk3KQorI2RlZmluZSBSOEE2NjU5N19NQVhfUk9PVF9IVUIJCTEKKyNlbHNlCiAjZGVmaW5lIFI4QTY2NTk3X01BWF9ST09UX0hVQgkJMgotI2RlZmluZSBSOEE2NjU5N19NQVhfU0FNUExJTkcJCTEwCisjZW5kaWYKKyNkZWZpbmUgUjhBNjY1OTdfTUFYX1NBTVBMSU5HCQk1CisjZGVmaW5lIFI4QTY2NTk3X1JIX1BPTExfVElNRQkJMTAKICNkZWZpbmUgUjhBNjY1OTdfTUFYX0RNQV9DSEFOTkVMCTIKICNkZWZpbmUgUjhBNjY1OTdfUElQRV9OT19ETUEJCVI4QTY2NTk3X01BWF9ETUFfQ0hBTk5FTAogI2RlZmluZSBjaGVja19idWxrX29yX2lzb2MocGlwZW51bSkJKChwaXBlbnVtID49IDEgJiYgcGlwZW51bSA8PSA1KSkKQEAgLTQwNCw2ICs0MTMsNyBAQAogI2RlZmluZSBtYWtlX2RldnNlbChhZGRyKQkJKGFkZHIgPDwgMTIpCiAKIHN0cnVjdCByOGE2NjU5N19waXBlX2luZm8geworCXVuc2lnbmVkIGxvbmcgdGltZXJfaW50ZXJ2YWw7CiAJdTE2IHBpcGVudW07CiAJdTE2IGFkZHJlc3M7CS8qIFI4QTY2NTk3IEhDRCB1c2IgYWRkcmVzcyAqLwogCXUxNiBlcG51bTsKQEAgLTQ3OCw5ICs0ODgsMTEgQEAKIAogCXN0cnVjdCB0aW1lcl9saXN0IHJoX3RpbWVyOwogCXN0cnVjdCB0aW1lcl9saXN0IHRkX3RpbWVyW1I4QTY2NTk3X01BWF9OVU1fUElQRV07CisJc3RydWN0IHRpbWVyX2xpc3QgaW50ZXJ2YWxfdGltZXJbUjhBNjY1OTdfTUFYX05VTV9QSVBFXTsKIAogCXVuc2lnbmVkIHNob3J0IGFkZHJlc3NfbWFwOwogCXVuc2lnbmVkIHNob3J0IHRpbWVvdXRfbWFwOworCXVuc2lnbmVkIHNob3J0IGludGVydmFsX21hcDsKIAl1bnNpZ25lZCBjaGFyIHBpcGVfY250W1I4QTY2NTk3X01BWF9OVU1fUElQRV07CiAJdW5zaWduZWQgY2hhciBkbWFfbWFwOwogCkBAIC01MjYsOCArNTM4LDIxIEBACiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHUxNiAqYnVmLAogCQkJCSAgICAgIGludCBsZW4pCiB7CisjaWYgZGVmaW5lZChDT05GSUdfU1VQRVJIX09OX0NISVBfUjhBNjY1OTcpCisJdW5zaWduZWQgbG9uZyBmaWZvYWRkciA9IHI4YTY2NTk3LT5yZWcgKyBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBjb3VudDsKKworCWNvdW50ID0gbGVuIC8gNDsKKwlpbnNsKGZpZm9hZGRyLCBidWYsIGNvdW50KTsKKworCWlmIChsZW4gJiAweDAwMDAwMDAzKSB7CisJCXVuc2lnbmVkIGxvbmcgdG1wID0gaW5sKGZpZm9hZGRyKTsKKwkJbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopYnVmICsgY291bnQgKiA0LCAmdG1wLCBsZW4gJiAweDAzKTsKKwl9CisjZWxzZQogCWxlbiA9IChsZW4gKyAxKSAvIDI7CiAJaW5zdyhyOGE2NjU5Ny0+cmVnICsgb2Zmc2V0LCBidWYsIGxlbik7CisjZW5kaWYKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHI4YTY2NTk3X3dyaXRlKHN0cnVjdCByOGE2NjU5NyAqcjhhNjY1OTcsIHUxNiB2YWwsCkBAIC01NDEsNiArNTY2LDI0IEBACiAJCQkJICAgICAgIGludCBsZW4pCiB7CiAJdW5zaWduZWQgbG9uZyBmaWZvYWRkciA9IHI4YTY2NTk3LT5yZWcgKyBvZmZzZXQ7CisjaWYgZGVmaW5lZChDT05GSUdfU1VQRVJIX09OX0NISVBfUjhBNjY1OTcpCisJdW5zaWduZWQgbG9uZyBjb3VudDsKKwl1bnNpZ25lZCBjaGFyICpwYjsKKwlpbnQgaTsKKworCWNvdW50ID0gbGVuIC8gNDsKKwlvdXRzbChmaWZvYWRkciwgYnVmLCBjb3VudCk7CisKKwlpZiAobGVuICYgMHgwMDAwMDAwMykgeworCQlwYiA9ICh1bnNpZ25lZCBjaGFyICopYnVmICsgY291bnQgKiA0OworCQlmb3IgKGkgPSAwOyBpIDwgKGxlbiAmIDB4MDAwMDAwMDMpOyBpKyspIHsKKwkJCWlmIChyOGE2NjU5N19yZWFkKHI4YTY2NTk3LCBDRklGT1NFTCkgJiBCSUdFTkQpCisJCQkJb3V0YihwYltpXSwgZmlmb2FkZHIgKyBpKTsKKwkJCWVsc2UKKwkJCQlvdXRiKHBiW2ldLCBmaWZvYWRkciArIDMgLSBpKTsKKwkJfQorCX0KKyNlbHNlCiAJaW50IG9kZCA9IGxlbiAmIDB4MDAwMTsKIAogCWxlbiA9IGxlbiAvIDI7CkBAIC01NDksNiArNTkyLDcgQEAKIAkJYnVmID0gJmJ1ZltsZW5dOwogCQlvdXRiKCh1bnNpZ25lZCBjaGFyKSpidWYsIGZpZm9hZGRyKTsKIAl9CisjZW5kaWYKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHI4YTY2NTk3X21kZnkoc3RydWN0IHI4YTY2NTk3ICpyOGE2NjU5NywKQEAgLTU4MSw2ICs2MjUsMTEgQEAKIAlyZXR1cm4gcG9ydCA9PSAwID8gRFZTVENUUjAgOiBEVlNUQ1RSMTsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9kbWFjZmdfcmVnKGludCBwb3J0KQoreworCXJldHVybiBwb3J0ID09IDAgPyBETUEwQ0ZHIDogRE1BMUNGRzsKK30KKwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9pbnRlbmJfcmVnKGludCBwb3J0KQogewogCXJldHVybiBwb3J0ID09IDAgPyBJTlRFTkIxIDogSU5URU5CMjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvc2w4MTEtaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3NsODExLWhjZC5jCmluZGV4IDYyOWJjYTAuLjI3NDI3NmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvc2w4MTEtaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9zbDgxMS1oY2QuYwpAQCAtOTQsMTIgKzk0LDEwIEBACiAKIAkJc2w4MTEtPnBvcnQxID0gKDEgPDwgVVNCX1BPUlRfRkVBVF9QT1dFUik7CiAJCXNsODExLT5pcnFfZW5hYmxlID0gU0wxMUhfSU5UTUFTS19JTlNSTVY7Ci0JCWhjZC0+c2VsZi5jb250cm9sbGVyLT5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CiAJfSBlbHNlIHsKIAkJc2w4MTEtPnBvcnQxID0gMDsKIAkJc2w4MTEtPmlycV9lbmFibGUgPSAwOwogCQloY2QtPnN0YXRlID0gSENfU1RBVEVfSEFMVDsKLQkJaGNkLT5zZWxmLmNvbnRyb2xsZXItPnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19TVVNQRU5EOwogCX0KIAlzbDgxMS0+Y3RybDEgPSAwOwogCXNsODExX3dyaXRlKHNsODExLCBTTDExSF9JUlFfRU5BQkxFLCAwKTsKQEAgLTEzMzcsNyArMTMzNSw3IEBACiBzbDgxMWhfYnVzX3N1c3BlbmQoc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKIAkvLyBTT0ZzIG9mZgotCURCRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJREJHKCIlc1xuIiwgX19mdW5jX18pOwogCXJldHVybiAwOwogfQogCkBAIC0xMzQ1LDcgKzEzNDMsNyBAQAogc2w4MTFoX2J1c19yZXN1bWUoc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKIAkvLyBTT0ZzIG9uCi0JREJHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlEQkcoIiVzXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE3NzIsOCArMTc3MCw2IEBACiAJCXBvcnRfcG93ZXIoc2w4MTEsIDApOwogCQlicmVhazsKIAl9Ci0JaWYgKHJldHZhbCA9PSAwKQotCQlkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IHN0YXRlOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTE3ODYsMTUgKzE3ODIsMTMgQEAKIAkvKiB3aXRoIG5vICJjaGVjayB0byBzZWUgaWYgVkJVUyBpcyBzdGlsbCBwb3dlcmVkIiBib2FyZCBob29rLAogCSAqIGxldCdzIGFzc3VtZSBpdCdkIG9ubHkgYmUgcG93ZXJlZCB0byBlbmFibGUgcmVtb3RlIHdha2V1cC4KIAkgKi8KLQlpZiAoZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfU1VTUEVORAotCQkJfHwgIWRldmljZV9jYW5fd2FrZXVwKCZoY2QtPnNlbGYucm9vdF9odWItPmRldikpIHsKKwlpZiAoIXNsODExLT5wb3J0MSB8fCAhZGV2aWNlX2Nhbl93YWtldXAoJmhjZC0+c2VsZi5yb290X2h1Yi0+ZGV2KSkgewogCQlzbDgxMS0+cG9ydDEgPSAwOwogCQlwb3J0X3Bvd2VyKHNsODExLCAxKTsKIAkJdXNiX3Jvb3RfaHViX2xvc3RfcG93ZXIoaGNkLT5zZWxmLnJvb3RfaHViKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOwogCXJldHVybiBzbDgxMWhfYnVzX3Jlc3VtZShoY2QpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3UxMzItaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3UxMzItaGNkLmMKaW5kZXggOGUxMTdhNy4uZjI5MzA3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC91MTMyLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvdTEzMi1oY2QuYwpAQCAtNjcsNyArNjcsNyBAQAogI2luY2x1ZGUgIm9oY2kuaCIKICNkZWZpbmUgT0hDSV9DT05UUk9MX0lOSVQgT0hDSV9DVFJMX0NCU1IKICNkZWZpbmUgT0hDSV9JTlRSX0lOSVQgKE9IQ0lfSU5UUl9NSUUgfCBPSENJX0lOVFJfVUUgfCBPSENJX0lOVFJfUkQgfCBcCi0gICAgICAgIE9IQ0lfSU5UUl9XREgpCisJT0hDSV9JTlRSX1dESCkKIE1PRFVMRV9BVVRIT1IoIlRvbnkgT2xlY2ggLSBFbGFuIERpZ2l0YWwgU3lzdGVtcyBMaW1pdGVkIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlUxMzIgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTc3LDE1ICs3NywxNSBAQAogc3RhdGljIGludCBkaXN0cnVzdF9maXJtd2FyZSA9IDE7CiBtb2R1bGVfcGFyYW0oZGlzdHJ1c3RfZmlybXdhcmUsIGJvb2wsIDApOwogTU9EVUxFX1BBUk1fREVTQyhkaXN0cnVzdF9maXJtd2FyZSwgInRydWUgdG8gZGlzdHJ1c3QgZmlybXdhcmUgcG93ZXIvb3ZlcmN1cnJlbiIKLSAgICAgICAgInQgc2V0dXAiKTsKKwkidCBzZXR1cCIpOwogc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHUxMzJfaGNkX3dhaXQpOwogLyoKICogdTEzMl9tb2R1bGVfbG9jayBleGlzdHMgdG8gcHJvdGVjdCBhY2Nlc3MgdG8gZ2xvYmFsIHZhcmlhYmxlcwogKgogKi8KIHN0YXRpYyBzdHJ1Y3QgbXV0ZXggdTEzMl9tb2R1bGVfbG9jazsKLXN0YXRpYyBpbnQgdTEzMl9leGl0aW5nID0gMDsKLXN0YXRpYyBpbnQgdTEzMl9pbnN0YW5jZXMgPSAwOworc3RhdGljIGludCB1MTMyX2V4aXRpbmc7CitzdGF0aWMgaW50IHUxMzJfaW5zdGFuY2VzOwogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgdTEzMl9zdGF0aWNfbGlzdDsKIC8qCiAqIGVuZCBvZiB0aGUgZ2xvYmFsIHZhcmlhYmxlcyBwcm90ZWN0ZWQgYnkgdTEzMl9tb2R1bGVfbG9jawpAQCAtOTcsMTE1ICs5NywxMTUgQEAKICNkZWZpbmUgTUFYX1UxMzJfRU5EUFMgMTAwCiAjZGVmaW5lIE1BWF9VMTMyX1JJTkdTIDQKIHN0YXRpYyBjb25zdCBjaGFyICpjY190b190ZXh0WzE2XSA9IHsKLSAgICAgICAgIk5vIEVycm9yICIsCi0gICAgICAgICJDUkMgRXJyb3IgIiwKLSAgICAgICAgIkJpdCBTdHVmZiAiLAotICAgICAgICAiRGF0YSBUb2dnICIsCi0gICAgICAgICJTdGFsbCAiLAotICAgICAgICAiRGV2Tm90UmVzcCAiLAotICAgICAgICAiUElEQ2hlY2sgIiwKLSAgICAgICAgIlVuRXhwUElEICIsCi0gICAgICAgICJEYXRhT3ZlciAiLAotICAgICAgICAiRGF0YVVuZGVyICIsCi0gICAgICAgICIoZm9yIGh3KSAiLAotICAgICAgICAiKGZvciBodykgIiwKLSAgICAgICAgIkJ1ZmZlck92ZXIgIiwKLSAgICAgICAgIkJ1ZmZVbmRlciAiLAotICAgICAgICAiKGZvciBIQ0QpICIsCi0gICAgICAgICIoZm9yIEhDRCkgIgorCSJObyBFcnJvciAiLAorCSJDUkMgRXJyb3IgIiwKKwkiQml0IFN0dWZmICIsCisJIkRhdGEgVG9nZyAiLAorCSJTdGFsbCAiLAorCSJEZXZOb3RSZXNwICIsCisJIlBJRENoZWNrICIsCisJIlVuRXhwUElEICIsCisJIkRhdGFPdmVyICIsCisJIkRhdGFVbmRlciAiLAorCSIoZm9yIGh3KSAiLAorCSIoZm9yIGh3KSAiLAorCSJCdWZmZXJPdmVyICIsCisJIkJ1ZmZVbmRlciAiLAorCSIoZm9yIEhDRCkgIiwKKwkiKGZvciBIQ0QpICIKIH07CiBzdHJ1Y3QgdTEzMl9wb3J0IHsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzI7Ci0gICAgICAgIGludCByZXNldDsKLSAgICAgICAgaW50IGVuYWJsZTsKLSAgICAgICAgaW50IHBvd2VyOwotICAgICAgICBpbnQgU3RhdHVzOworCXN0cnVjdCB1MTMyICp1MTMyOworCWludCByZXNldDsKKwlpbnQgZW5hYmxlOworCWludCBwb3dlcjsKKwlpbnQgU3RhdHVzOwogfTsKIHN0cnVjdCB1MTMyX2FkZHIgewotICAgICAgICB1OCBhZGRyZXNzOworCXU4IGFkZHJlc3M7CiB9Owogc3RydWN0IHUxMzJfdWRldiB7Ci0gICAgICAgIHN0cnVjdCBrcmVmIGtyZWY7Ci0gICAgICAgIHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2aWNlOwotICAgICAgICB1OCBlbnVtZXJhdGlvbjsKLSAgICAgICAgdTggdWRldl9udW1iZXI7Ci0gICAgICAgIHU4IHVzYl9hZGRyOwotICAgICAgICB1OCBwb3J0bnVtYmVyOwotICAgICAgICB1OCBlbmRwX251bWJlcl9pblsxNl07Ci0gICAgICAgIHU4IGVuZHBfbnVtYmVyX291dFsxNl07CisJc3RydWN0IGtyZWYga3JlZjsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldmljZTsKKwl1OCBlbnVtZXJhdGlvbjsKKwl1OCB1ZGV2X251bWJlcjsKKwl1OCB1c2JfYWRkcjsKKwl1OCBwb3J0bnVtYmVyOworCXU4IGVuZHBfbnVtYmVyX2luWzE2XTsKKwl1OCBlbmRwX251bWJlcl9vdXRbMTZdOwogfTsKICNkZWZpbmUgRU5EUF9RVUVVRV9TSElGVCAzCiAjZGVmaW5lIEVORFBfUVVFVUVfU0laRSAoMTw8RU5EUF9RVUVVRV9TSElGVCkKICNkZWZpbmUgRU5EUF9RVUVVRV9NQVNLIChFTkRQX1FVRVVFX1NJWkUtMSkKIHN0cnVjdCB1MTMyX3VyYnEgewotICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIHVyYl9tb3JlOwotICAgICAgICBzdHJ1Y3QgdXJiICp1cmI7CisJc3RydWN0IGxpc3RfaGVhZCB1cmJfbW9yZTsKKwlzdHJ1Y3QgdXJiICp1cmI7CiB9Owogc3RydWN0IHUxMzJfc3BpbiB7Ci0gICAgICAgIHNwaW5sb2NrX3Qgc2xvY2s7CisJc3BpbmxvY2tfdCBzbG9jazsKIH07CiBzdHJ1Y3QgdTEzMl9lbmRwIHsKLSAgICAgICAgc3RydWN0IGtyZWYga3JlZjsKLSAgICAgICAgdTggdWRldl9udW1iZXI7Ci0gICAgICAgIHU4IGVuZHBfbnVtYmVyOwotICAgICAgICB1OCB1c2JfYWRkcjsKLSAgICAgICAgdTggdXNiX2VuZHA7Ci0gICAgICAgIHN0cnVjdCB1MTMyICp1MTMyOwotICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIGVuZHBfcmluZzsKLSAgICAgICAgc3RydWN0IHUxMzJfcmluZyAqcmluZzsKLSAgICAgICAgdW5zaWduZWQgdG9nZ2xlX2JpdHM6MjsKLSAgICAgICAgdW5zaWduZWQgYWN0aXZlOjE7Ci0gICAgICAgIHVuc2lnbmVkIGRlbGF5ZWQ6MTsKLSAgICAgICAgdW5zaWduZWQgaW5wdXQ6MTsKLSAgICAgICAgdW5zaWduZWQgb3V0cHV0OjE7Ci0gICAgICAgIHVuc2lnbmVkIHBpcGV0eXBlOjI7Ci0gICAgICAgIHVuc2lnbmVkIGRlcXVldWVpbmc6MTsKLSAgICAgICAgdW5zaWduZWQgZWRzZXRfZmx1c2g6MTsKLSAgICAgICAgdW5zaWduZWQgc3BhcmVfYml0czoxNDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBqaWZmaWVzOwotICAgICAgICBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmhlcDsKLSAgICAgICAgc3RydWN0IHUxMzJfc3BpbiBxdWV1ZV9sb2NrOwotICAgICAgICB1MTYgcXVldWVfc2l6ZTsKLSAgICAgICAgdTE2IHF1ZXVlX2xhc3Q7Ci0gICAgICAgIHUxNiBxdWV1ZV9uZXh0OwotICAgICAgICBzdHJ1Y3QgdXJiICp1cmJfbGlzdFtFTkRQX1FVRVVFX1NJWkVdOwotICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIHVyYl9tb3JlOwotICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIHNjaGVkdWxlcjsKKwlzdHJ1Y3Qga3JlZiBrcmVmOworCXU4IHVkZXZfbnVtYmVyOworCXU4IGVuZHBfbnVtYmVyOworCXU4IHVzYl9hZGRyOworCXU4IHVzYl9lbmRwOworCXN0cnVjdCB1MTMyICp1MTMyOworCXN0cnVjdCBsaXN0X2hlYWQgZW5kcF9yaW5nOworCXN0cnVjdCB1MTMyX3JpbmcgKnJpbmc7CisJdW5zaWduZWQgdG9nZ2xlX2JpdHM6MjsKKwl1bnNpZ25lZCBhY3RpdmU6MTsKKwl1bnNpZ25lZCBkZWxheWVkOjE7CisJdW5zaWduZWQgaW5wdXQ6MTsKKwl1bnNpZ25lZCBvdXRwdXQ6MTsKKwl1bnNpZ25lZCBwaXBldHlwZToyOworCXVuc2lnbmVkIGRlcXVldWVpbmc6MTsKKwl1bnNpZ25lZCBlZHNldF9mbHVzaDoxOworCXVuc2lnbmVkIHNwYXJlX2JpdHM6MTQ7CisJdW5zaWduZWQgbG9uZyBqaWZmaWVzOworCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqaGVwOworCXN0cnVjdCB1MTMyX3NwaW4gcXVldWVfbG9jazsKKwl1MTYgcXVldWVfc2l6ZTsKKwl1MTYgcXVldWVfbGFzdDsKKwl1MTYgcXVldWVfbmV4dDsKKwlzdHJ1Y3QgdXJiICp1cmJfbGlzdFtFTkRQX1FVRVVFX1NJWkVdOworCXN0cnVjdCBsaXN0X2hlYWQgdXJiX21vcmU7CisJc3RydWN0IGRlbGF5ZWRfd29yayBzY2hlZHVsZXI7CiB9Owogc3RydWN0IHUxMzJfcmluZyB7Ci0gICAgICAgIHVuc2lnbmVkIGluX3VzZToxOwotICAgICAgICB1bnNpZ25lZCBsZW5ndGg6NzsKLSAgICAgICAgdTggbnVtYmVyOwotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMjsKLSAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqY3Vycl9lbmRwOwotICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIHNjaGVkdWxlcjsKKwl1bnNpZ25lZCBpbl91c2U6MTsKKwl1bnNpZ25lZCBsZW5ndGg6NzsKKwl1OCBudW1iZXI7CisJc3RydWN0IHUxMzIgKnUxMzI7CisJc3RydWN0IHUxMzJfZW5kcCAqY3Vycl9lbmRwOworCXN0cnVjdCBkZWxheWVkX3dvcmsgc2NoZWR1bGVyOwogfTsKIHN0cnVjdCB1MTMyIHsKLSAgICAgICAgc3RydWN0IGtyZWYga3JlZjsKLSAgICAgICAgc3RydWN0IGxpc3RfaGVhZCB1MTMyX2xpc3Q7Ci0gICAgICAgIHN0cnVjdCBtdXRleCBzd19sb2NrOwotICAgICAgICBzdHJ1Y3Qgc2VtYXBob3JlIHNjaGVkdWxlcl9sb2NrOwotICAgICAgICBzdHJ1Y3QgdTEzMl9wbGF0Zm9ybV9kYXRhICpib2FyZDsKLSAgICAgICAgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2OwotICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nIHJpbmdbTUFYX1UxMzJfUklOR1NdOwotICAgICAgICBpbnQgc2VxdWVuY2VfbnVtOwotICAgICAgICBpbnQgZ29pbmc7Ci0gICAgICAgIGludCBwb3dlcjsKLSAgICAgICAgaW50IHJlc2V0OwotICAgICAgICBpbnQgbnVtX3BvcnRzOwotICAgICAgICB1MzIgaGNfY29udHJvbDsKLSAgICAgICAgdTMyIGhjX2ZtaW50ZXJ2YWw7Ci0gICAgICAgIHUzMiBoY19yb290aHViX3N0YXR1czsKLSAgICAgICAgdTMyIGhjX3Jvb3RodWJfYTsKLSAgICAgICAgdTMyIGhjX3Jvb3RodWJfcG9ydHN0YXR1c1tNQVhfUk9PVF9QT1JUU107Ci0gICAgICAgIGludCBmbGFnczsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBuZXh0X3N0YXRlY2hhbmdlOwotICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIG1vbml0b3I7Ci0gICAgICAgIGludCBudW1fZW5kcG9pbnRzOwotICAgICAgICBzdHJ1Y3QgdTEzMl9hZGRyIGFkZHJbTUFYX1UxMzJfQUREUlNdOwotICAgICAgICBzdHJ1Y3QgdTEzMl91ZGV2IHVkZXZbTUFYX1UxMzJfVURFVlNdOwotICAgICAgICBzdHJ1Y3QgdTEzMl9wb3J0IHBvcnRbTUFYX1UxMzJfUE9SVFNdOwotICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwW01BWF9VMTMyX0VORFBTXTsKKwlzdHJ1Y3Qga3JlZiBrcmVmOworCXN0cnVjdCBsaXN0X2hlYWQgdTEzMl9saXN0OworCXN0cnVjdCBtdXRleCBzd19sb2NrOworCXN0cnVjdCBtdXRleCBzY2hlZHVsZXJfbG9jazsKKwlzdHJ1Y3QgdTEzMl9wbGF0Zm9ybV9kYXRhICpib2FyZDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXY7CisJc3RydWN0IHUxMzJfcmluZyByaW5nW01BWF9VMTMyX1JJTkdTXTsKKwlpbnQgc2VxdWVuY2VfbnVtOworCWludCBnb2luZzsKKwlpbnQgcG93ZXI7CisJaW50IHJlc2V0OworCWludCBudW1fcG9ydHM7CisJdTMyIGhjX2NvbnRyb2w7CisJdTMyIGhjX2ZtaW50ZXJ2YWw7CisJdTMyIGhjX3Jvb3RodWJfc3RhdHVzOworCXUzMiBoY19yb290aHViX2E7CisJdTMyIGhjX3Jvb3RodWJfcG9ydHN0YXR1c1tNQVhfUk9PVF9QT1JUU107CisJaW50IGZsYWdzOworCXVuc2lnbmVkIGxvbmcgbmV4dF9zdGF0ZWNoYW5nZTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIG1vbml0b3I7CisJaW50IG51bV9lbmRwb2ludHM7CisJc3RydWN0IHUxMzJfYWRkciBhZGRyW01BWF9VMTMyX0FERFJTXTsKKwlzdHJ1Y3QgdTEzMl91ZGV2IHVkZXZbTUFYX1UxMzJfVURFVlNdOworCXN0cnVjdCB1MTMyX3BvcnQgcG9ydFtNQVhfVTEzMl9QT1JUU107CisJc3RydWN0IHUxMzJfZW5kcCAqZW5kcFtNQVhfVTEzMl9FTkRQU107CiB9OwogCiAvKgpAQCAtMjEzLDM0ICsyMTMsMzQgQEAKICogRG9lcyBhbnlvbmUgaGF2ZSBhIGJldHRlciB3YXk/Pz8/PwogKi8KICNkZWZpbmUgZnRkaV9yZWFkX3BjaW1lbShwZGV2LCBtZW1iZXIsIGRhdGEpIHVzYl9mdGRpX2VsYW5fcmVhZF9wY2ltZW0ocGRldiwgXAotICAgICAgICBvZmZzZXRvZihzdHJ1Y3Qgb2hjaV9yZWdzLCBtZW1iZXIpLCAwLCBkYXRhKTsKKwlvZmZzZXRvZihzdHJ1Y3Qgb2hjaV9yZWdzLCBtZW1iZXIpLCAwLCBkYXRhKTsKICNkZWZpbmUgZnRkaV93cml0ZV9wY2ltZW0ocGRldiwgbWVtYmVyLCBkYXRhKSB1c2JfZnRkaV9lbGFuX3dyaXRlX3BjaW1lbShwZGV2LCBcCi0gICAgICAgIG9mZnNldG9mKHN0cnVjdCBvaGNpX3JlZ3MsIG1lbWJlciksIDAsIGRhdGEpOworCW9mZnNldG9mKHN0cnVjdCBvaGNpX3JlZ3MsIG1lbWJlciksIDAsIGRhdGEpOwogI2RlZmluZSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIG1lbWJlciwgZGF0YSkgXAotICAgICAgICB1c2JfZnRkaV9lbGFuX3JlYWRfcGNpbWVtKHUxMzItPnBsYXRmb3JtX2Rldiwgb2Zmc2V0b2Yoc3RydWN0IFwKLSAgICAgICAgb2hjaV9yZWdzLCBtZW1iZXIpLCAwLCBkYXRhKTsKKwl1c2JfZnRkaV9lbGFuX3JlYWRfcGNpbWVtKHUxMzItPnBsYXRmb3JtX2Rldiwgb2Zmc2V0b2Yoc3RydWN0IFwKKwlvaGNpX3JlZ3MsIG1lbWJlciksIDAsIGRhdGEpOwogI2RlZmluZSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCBtZW1iZXIsIGRhdGEpIFwKLSAgICAgICAgdXNiX2Z0ZGlfZWxhbl93cml0ZV9wY2ltZW0odTEzMi0+cGxhdGZvcm1fZGV2LCBvZmZzZXRvZihzdHJ1Y3QgXAotICAgICAgICBvaGNpX3JlZ3MsIG1lbWJlciksIDAsIGRhdGEpOworCXVzYl9mdGRpX2VsYW5fd3JpdGVfcGNpbWVtKHUxMzItPnBsYXRmb3JtX2Rldiwgb2Zmc2V0b2Yoc3RydWN0IFwKKwlvaGNpX3JlZ3MsIG1lbWJlciksIDAsIGRhdGEpOwogc3RhdGljIGlubGluZSBzdHJ1Y3QgdTEzMiAqdWRldl90b191MTMyKHN0cnVjdCB1MTMyX3VkZXYgKnVkZXYpCiB7Ci0gICAgICAgIHU4IHVkZXZfbnVtYmVyID0gdWRldi0+dWRldl9udW1iZXI7Ci0gICAgICAgIHJldHVybiBjb250YWluZXJfb2YodWRldiwgc3RydWN0IHUxMzIsIHVkZXZbdWRldl9udW1iZXJdKTsKKwl1OCB1ZGV2X251bWJlciA9IHVkZXYtPnVkZXZfbnVtYmVyOworCXJldHVybiBjb250YWluZXJfb2YodWRldiwgc3RydWN0IHUxMzIsIHVkZXZbdWRldl9udW1iZXJdKTsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdTEzMiAqaGNkX3RvX3UxMzIoc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKLSAgICAgICAgcmV0dXJuIChzdHJ1Y3QgdTEzMiAqKShoY2QtPmhjZF9wcml2KTsKKwlyZXR1cm4gKHN0cnVjdCB1MTMyICopKGhjZC0+aGNkX3ByaXYpOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2JfaGNkICp1MTMyX3RvX2hjZChzdHJ1Y3QgdTEzMiAqdTEzMikKIHsKLSAgICAgICAgcmV0dXJuIGNvbnRhaW5lcl9vZigodm9pZCAqKXUxMzIsIHN0cnVjdCB1c2JfaGNkLCBoY2RfcHJpdik7CisJcmV0dXJuIGNvbnRhaW5lcl9vZigodm9pZCAqKXUxMzIsIHN0cnVjdCB1c2JfaGNkLCBoY2RfcHJpdik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB1MTMyX2Rpc2FibGUoc3RydWN0IHUxMzIgKnUxMzIpCiB7Ci0gICAgICAgIHUxMzJfdG9faGNkKHUxMzIpLT5zdGF0ZSA9IEhDX1NUQVRFX0hBTFQ7CisJdTEzMl90b19oY2QodTEzMiktPnN0YXRlID0gSENfU1RBVEVfSEFMVDsKIH0KIAogCkBAIC0yNTAsMTQ3ICsyNTAsMTQ3IEBACiAjaW5jbHVkZSAiLi4vbWlzYy91c2JfdTEzMi5oIgogc3RhdGljIGNvbnN0IGNoYXIgaGNkX25hbWVbXSA9ICJ1MTMyX2hjZCI7CiAjZGVmaW5lIFBPUlRfQ19NQVNLICgoVVNCX1BPUlRfU1RBVF9DX0NPTk5FQ1RJT04gfCBVU0JfUE9SVF9TVEFUX0NfRU5BQkxFIHwgXAotICAgICAgICBVU0JfUE9SVF9TVEFUX0NfU1VTUEVORCB8IFVTQl9QT1JUX1NUQVRfQ19PVkVSQ1VSUkVOVCB8IFwKLSAgICAgICAgVVNCX1BPUlRfU1RBVF9DX1JFU0VUKSA8PCAxNikKKwlVU0JfUE9SVF9TVEFUX0NfU1VTUEVORCB8IFVTQl9QT1JUX1NUQVRfQ19PVkVSQ1VSUkVOVCB8IFwKKwlVU0JfUE9SVF9TVEFUX0NfUkVTRVQpIDw8IDE2KQogc3RhdGljIHZvaWQgdTEzMl9oY2RfZGVsZXRlKHN0cnVjdCBrcmVmICprcmVmKQogewotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGtyZWZfdG9fdTEzMihrcmVmKTsKLSAgICAgICAgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHUxMzItPnBsYXRmb3JtX2RldjsKLSAgICAgICAgc3RydWN0IHVzYl9oY2QgKmhjZCA9IHUxMzJfdG9faGNkKHUxMzIpOwotICAgICAgICB1MTMyLT5nb2luZyArPSAxOwotICAgICAgICBtdXRleF9sb2NrKCZ1MTMyX21vZHVsZV9sb2NrKTsKLSAgICAgICAgbGlzdF9kZWxfaW5pdCgmdTEzMi0+dTEzMl9saXN0KTsKLSAgICAgICAgdTEzMl9pbnN0YW5jZXMgLT0gMTsKLSAgICAgICAgbXV0ZXhfdW5sb2NrKCZ1MTMyX21vZHVsZV9sb2NrKTsKLSAgICAgICAgZGV2X3dhcm4oJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiRlJFRUlORyB0aGUgaGNkPSVwIGFuZCB0aHVzIHRoZSB1MTMiCi0gICAgICAgICAgICAgICAgIjI9JXAgZ29pbmc9JWQgcGRldj0lcFxuIiwgaGNkLCB1MTMyLCB1MTMyLT5nb2luZywgcGRldik7Ci0gICAgICAgIHVzYl9wdXRfaGNkKGhjZCk7CisJc3RydWN0IHUxMzIgKnUxMzIgPSBrcmVmX3RvX3UxMzIoa3JlZik7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHUxMzItPnBsYXRmb3JtX2RldjsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gdTEzMl90b19oY2QodTEzMik7CisJdTEzMi0+Z29pbmcgKz0gMTsKKwltdXRleF9sb2NrKCZ1MTMyX21vZHVsZV9sb2NrKTsKKwlsaXN0X2RlbF9pbml0KCZ1MTMyLT51MTMyX2xpc3QpOworCXUxMzJfaW5zdGFuY2VzIC09IDE7CisJbXV0ZXhfdW5sb2NrKCZ1MTMyX21vZHVsZV9sb2NrKTsKKwlkZXZfd2FybigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJGUkVFSU5HIHRoZSBoY2Q9JXAgYW5kIHRodXMgdGhlIHUxMyIKKwkJIjI9JXAgZ29pbmc9JWQgcGRldj0lcFxuIiwgaGNkLCB1MTMyLCB1MTMyLT5nb2luZywgcGRldik7CisJdXNiX3B1dF9oY2QoaGNkKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHUxMzJfdTEzMl9wdXRfa3JlZihzdHJ1Y3QgdTEzMiAqdTEzMikKIHsKLSAgICAgICAga3JlZl9wdXQoJnUxMzItPmtyZWYsIHUxMzJfaGNkX2RlbGV0ZSk7CisJa3JlZl9wdXQoJnUxMzItPmtyZWYsIHUxMzJfaGNkX2RlbGV0ZSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB1MTMyX3UxMzJfaW5pdF9rcmVmKHN0cnVjdCB1MTMyICp1MTMyKQogewotICAgICAgICBrcmVmX2luaXQoJnUxMzItPmtyZWYpOworCWtyZWZfaW5pdCgmdTEzMi0+a3JlZik7CiB9CiAKIHN0YXRpYyB2b2lkIHUxMzJfdWRldl9kZWxldGUoc3RydWN0IGtyZWYgKmtyZWYpCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyX3VkZXYgKnVkZXYgPSBrcmVmX3RvX3UxMzJfdWRldihrcmVmKTsKLSAgICAgICAgdWRldi0+dWRldl9udW1iZXIgPSAwOwotICAgICAgICB1ZGV2LT51c2JfZGV2aWNlID0gTlVMTDsKLSAgICAgICAgdWRldi0+dXNiX2FkZHIgPSAwOwotICAgICAgICB1ZGV2LT5lbnVtZXJhdGlvbiA9IDA7CisJc3RydWN0IHUxMzJfdWRldiAqdWRldiA9IGtyZWZfdG9fdTEzMl91ZGV2KGtyZWYpOworCXVkZXYtPnVkZXZfbnVtYmVyID0gMDsKKwl1ZGV2LT51c2JfZGV2aWNlID0gTlVMTDsKKwl1ZGV2LT51c2JfYWRkciA9IDA7CisJdWRldi0+ZW51bWVyYXRpb24gPSAwOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdTEzMl91ZGV2X3B1dF9rcmVmKHN0cnVjdCB1MTMyICp1MTMyLCBzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2KQogewotICAgICAgICBrcmVmX3B1dCgmdWRldi0+a3JlZiwgdTEzMl91ZGV2X2RlbGV0ZSk7CisJa3JlZl9wdXQoJnVkZXYtPmtyZWYsIHUxMzJfdWRldl9kZWxldGUpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdTEzMl91ZGV2X2dldF9rcmVmKHN0cnVjdCB1MTMyICp1MTMyLCBzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2KQogewotICAgICAgICBrcmVmX2dldCgmdWRldi0+a3JlZik7CisJa3JlZl9nZXQoJnVkZXYtPmtyZWYpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdTEzMl91ZGV2X2luaXRfa3JlZihzdHJ1Y3QgdTEzMiAqdTEzMiwKLSAgICAgICAgc3RydWN0IHUxMzJfdWRldiAqdWRldikKKwlzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2KQogewotICAgICAgICBrcmVmX2luaXQoJnVkZXYtPmtyZWYpOworCWtyZWZfaW5pdCgmdWRldi0+a3JlZik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB1MTMyX3JpbmdfcHV0X2tyZWYoc3RydWN0IHUxMzIgKnUxMzIsIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmcpCiB7Ci0gICAgICAgIGtyZWZfcHV0KCZ1MTMyLT5rcmVmLCB1MTMyX2hjZF9kZWxldGUpOworCWtyZWZfcHV0KCZ1MTMyLT5rcmVmLCB1MTMyX2hjZF9kZWxldGUpOwogfQogCiBzdGF0aWMgdm9pZCB1MTMyX3JpbmdfcmVxdWV1ZV93b3JrKHN0cnVjdCB1MTMyICp1MTMyLCBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nLAotICAgICAgICB1bnNpZ25lZCBpbnQgZGVsdGEpCisJdW5zaWduZWQgaW50IGRlbHRhKQogewotICAgICAgICBpZiAoZGVsdGEgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHF1ZXVlX2RlbGF5ZWRfd29yayh3b3JrcXVldWUsICZyaW5nLT5zY2hlZHVsZXIsIGRlbHRhKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmIChxdWV1ZV9kZWxheWVkX3dvcmsod29ya3F1ZXVlLCAmcmluZy0+c2NoZWR1bGVyLCAwKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGtyZWZfcHV0KCZ1MTMyLT5rcmVmLCB1MTMyX2hjZF9kZWxldGUpOwotICAgICAgICByZXR1cm47CisJaWYgKGRlbHRhID4gMCkgeworCQlpZiAocXVldWVfZGVsYXllZF93b3JrKHdvcmtxdWV1ZSwgJnJpbmctPnNjaGVkdWxlciwgZGVsdGEpKQorCQkJcmV0dXJuOworCX0gZWxzZSBpZiAocXVldWVfZGVsYXllZF93b3JrKHdvcmtxdWV1ZSwgJnJpbmctPnNjaGVkdWxlciwgMCkpCisJCXJldHVybjsKKwlrcmVmX3B1dCgmdTEzMi0+a3JlZiwgdTEzMl9oY2RfZGVsZXRlKTsKKwlyZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkIHUxMzJfcmluZ19xdWV1ZV93b3JrKHN0cnVjdCB1MTMyICp1MTMyLCBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nLAotICAgICAgICB1bnNpZ25lZCBpbnQgZGVsdGEpCisJdW5zaWduZWQgaW50IGRlbHRhKQogewotICAgICAgICBrcmVmX2dldCgmdTEzMi0+a3JlZik7Ci0gICAgICAgIHUxMzJfcmluZ19yZXF1ZXVlX3dvcmsodTEzMiwgcmluZywgZGVsdGEpOwotICAgICAgICByZXR1cm47CisJa3JlZl9nZXQoJnUxMzItPmtyZWYpOworCXUxMzJfcmluZ19yZXF1ZXVlX3dvcmsodTEzMiwgcmluZywgZGVsdGEpOworCXJldHVybjsKIH0KIAogc3RhdGljIHZvaWQgdTEzMl9yaW5nX2NhbmNlbF93b3JrKHN0cnVjdCB1MTMyICp1MTMyLCBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nKQogewotICAgICAgICBpZiAoY2FuY2VsX2RlbGF5ZWRfd29yaygmcmluZy0+c2NoZWR1bGVyKSkgewotICAgICAgICAgICAgICAgIGtyZWZfcHV0KCZ1MTMyLT5rcmVmLCB1MTMyX2hjZF9kZWxldGUpOwotICAgICAgICB9CisJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmsoJnJpbmctPnNjaGVkdWxlcikpCisJCWtyZWZfcHV0KCZ1MTMyLT5rcmVmLCB1MTMyX2hjZF9kZWxldGUpOwogfQogCiBzdGF0aWMgdm9pZCB1MTMyX2VuZHBfZGVsZXRlKHN0cnVjdCBrcmVmICprcmVmKQogewotICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0ga3JlZl90b191MTMyX2VuZHAoa3JlZik7Ci0gICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gZW5kcC0+dTEzMjsKLSAgICAgICAgdTggdXNiX2FkZHIgPSBlbmRwLT51c2JfYWRkcjsKLSAgICAgICAgdTggdXNiX2VuZHAgPSBlbmRwLT51c2JfZW5kcDsKLSAgICAgICAgdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbdXNiX2FkZHJdLmFkZHJlc3M7Ci0gICAgICAgIHN0cnVjdCB1MTMyX3VkZXYgKnVkZXYgPSAmdTEzMi0+dWRldlthZGRyZXNzXTsKLSAgICAgICAgdTggZW5kcF9udW1iZXIgPSBlbmRwLT5lbmRwX251bWJlcjsKLSAgICAgICAgc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICpoZXAgPSBlbmRwLT5oZXA7Ci0gICAgICAgIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmcgPSBlbmRwLT5yaW5nOwotICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJmVuZHAtPmVuZHBfcmluZzsKLSAgICAgICAgcmluZy0+bGVuZ3RoIC09IDE7Ci0gICAgICAgIGlmIChlbmRwID09IHJpbmctPmN1cnJfZW5kcCkgewotICAgICAgICAgICAgICAgIGlmIChsaXN0X2VtcHR5KGhlYWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5jdXJyX2VuZHAgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9kZWwoaGVhZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKm5leHRfZW5kcCA9IGxpc3RfZW50cnkoaGVhZC0+bmV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfZW5kcCwgZW5kcF9yaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJpbmctPmN1cnJfZW5kcCA9IG5leHRfZW5kcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfZGVsKGhlYWQpOwotICAgICAgICB9fSBlbHNlCi0gICAgICAgICAgICAgICAgbGlzdF9kZWwoaGVhZCk7Ci0gICAgICAgIGlmIChlbmRwLT5pbnB1dCkgewotICAgICAgICAgICAgICAgIHVkZXYtPmVuZHBfbnVtYmVyX2luW3VzYl9lbmRwXSA9IDA7Ci0gICAgICAgICAgICAgICAgdTEzMl91ZGV2X3B1dF9rcmVmKHUxMzIsIHVkZXYpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbmRwLT5vdXRwdXQpIHsKLSAgICAgICAgICAgICAgICB1ZGV2LT5lbmRwX251bWJlcl9vdXRbdXNiX2VuZHBdID0gMDsKLSAgICAgICAgICAgICAgICB1MTMyX3VkZXZfcHV0X2tyZWYodTEzMiwgdWRldik7Ci0gICAgICAgIH0KLSAgICAgICAgdTEzMi0+ZW5kcFtlbmRwX251bWJlciAtIDFdID0gTlVMTDsKLSAgICAgICAgaGVwLT5oY3ByaXYgPSBOVUxMOwotICAgICAgICBrZnJlZShlbmRwKTsKLSAgICAgICAgdTEzMl91MTMyX3B1dF9rcmVmKHUxMzIpOworCXN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBrcmVmX3RvX3UxMzJfZW5kcChrcmVmKTsKKwlzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7CisJdTggdXNiX2FkZHIgPSBlbmRwLT51c2JfYWRkcjsKKwl1OCB1c2JfZW5kcCA9IGVuZHAtPnVzYl9lbmRwOworCXU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW3VzYl9hZGRyXS5hZGRyZXNzOworCXN0cnVjdCB1MTMyX3VkZXYgKnVkZXYgPSAmdTEzMi0+dWRldlthZGRyZXNzXTsKKwl1OCBlbmRwX251bWJlciA9IGVuZHAtPmVuZHBfbnVtYmVyOworCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqaGVwID0gZW5kcC0+aGVwOworCXN0cnVjdCB1MTMyX3JpbmcgKnJpbmcgPSBlbmRwLT5yaW5nOworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmZW5kcC0+ZW5kcF9yaW5nOworCXJpbmctPmxlbmd0aCAtPSAxOworCWlmIChlbmRwID09IHJpbmctPmN1cnJfZW5kcCkgeworCQlpZiAobGlzdF9lbXB0eShoZWFkKSkgeworCQkJcmluZy0+Y3Vycl9lbmRwID0gTlVMTDsKKwkJCWxpc3RfZGVsKGhlYWQpOworCQl9IGVsc2UgeworCQkJc3RydWN0IHUxMzJfZW5kcCAqbmV4dF9lbmRwID0gbGlzdF9lbnRyeShoZWFkLT5uZXh0LAorCQkJCXN0cnVjdCB1MTMyX2VuZHAsIGVuZHBfcmluZyk7CisJCQlyaW5nLT5jdXJyX2VuZHAgPSBuZXh0X2VuZHA7CisJCQlsaXN0X2RlbChoZWFkKTsKKwkJfQorCX0gZWxzZQorCQlsaXN0X2RlbChoZWFkKTsKKwlpZiAoZW5kcC0+aW5wdXQpIHsKKwkJdWRldi0+ZW5kcF9udW1iZXJfaW5bdXNiX2VuZHBdID0gMDsKKwkJdTEzMl91ZGV2X3B1dF9rcmVmKHUxMzIsIHVkZXYpOworCX0KKwlpZiAoZW5kcC0+b3V0cHV0KSB7CisJCXVkZXYtPmVuZHBfbnVtYmVyX291dFt1c2JfZW5kcF0gPSAwOworCQl1MTMyX3VkZXZfcHV0X2tyZWYodTEzMiwgdWRldik7CisJfQorCXUxMzItPmVuZHBbZW5kcF9udW1iZXIgLSAxXSA9IE5VTEw7CisJaGVwLT5oY3ByaXYgPSBOVUxMOworCWtmcmVlKGVuZHApOworCXUxMzJfdTEzMl9wdXRfa3JlZih1MTMyKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHUxMzJfZW5kcF9wdXRfa3JlZihzdHJ1Y3QgdTEzMiAqdTEzMiwgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCkKIHsKLSAgICAgICAga3JlZl9wdXQoJmVuZHAtPmtyZWYsIHUxMzJfZW5kcF9kZWxldGUpOworCWtyZWZfcHV0KCZlbmRwLT5rcmVmLCB1MTMyX2VuZHBfZGVsZXRlKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHUxMzJfZW5kcF9nZXRfa3JlZihzdHJ1Y3QgdTEzMiAqdTEzMiwgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCkKIHsKLSAgICAgICAga3JlZl9nZXQoJmVuZHAtPmtyZWYpOworCWtyZWZfZ2V0KCZlbmRwLT5rcmVmKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHUxMzJfZW5kcF9pbml0X2tyZWYoc3RydWN0IHUxMzIgKnUxMzIsCi0gICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHApCisJc3RydWN0IHUxMzJfZW5kcCAqZW5kcCkKIHsKLSAgICAgICAga3JlZl9pbml0KCZlbmRwLT5rcmVmKTsKLSAgICAgICAga3JlZl9nZXQoJnUxMzItPmtyZWYpOworCWtyZWZfaW5pdCgmZW5kcC0+a3JlZik7CisJa3JlZl9nZXQoJnUxMzItPmtyZWYpOwogfQogCiBzdGF0aWMgdm9pZCB1MTMyX2VuZHBfcXVldWVfd29yayhzdHJ1Y3QgdTEzMiAqdTEzMiwgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCwKLSAgICAgICAgdW5zaWduZWQgaW50IGRlbHRhKQorCXVuc2lnbmVkIGludCBkZWx0YSkKIHsKIAlpZiAocXVldWVfZGVsYXllZF93b3JrKHdvcmtxdWV1ZSwgJmVuZHAtPnNjaGVkdWxlciwgZGVsdGEpKQogCQlrcmVmX2dldCgmZW5kcC0+a3JlZik7CkBAIC0zOTgsMTMgKzM5OCwxMyBAQAogCiBzdGF0aWMgdm9pZCB1MTMyX2VuZHBfY2FuY2VsX3dvcmsoc3RydWN0IHUxMzIgKnUxMzIsIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHApCiB7Ci0gICAgICAgIGlmIChjYW5jZWxfZGVsYXllZF93b3JrKCZlbmRwLT5zY2hlZHVsZXIpKQotICAgICAgICAgICAgICAgIGtyZWZfcHV0KCZlbmRwLT5rcmVmLCB1MTMyX2VuZHBfZGVsZXRlKTsKKwlpZiAoY2FuY2VsX2RlbGF5ZWRfd29yaygmZW5kcC0+c2NoZWR1bGVyKSkKKwkJa3JlZl9wdXQoJmVuZHAtPmtyZWYsIHUxMzJfZW5kcF9kZWxldGUpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdTEzMl9tb25pdG9yX3B1dF9rcmVmKHN0cnVjdCB1MTMyICp1MTMyKQogewotICAgICAgICBrcmVmX3B1dCgmdTEzMi0+a3JlZiwgdTEzMl9oY2RfZGVsZXRlKTsKKwlrcmVmX3B1dCgmdTEzMi0+a3JlZiwgdTEzMl9oY2RfZGVsZXRlKTsKIH0KIAogc3RhdGljIHZvaWQgdTEzMl9tb25pdG9yX3F1ZXVlX3dvcmsoc3RydWN0IHUxMzIgKnUxMzIsIHVuc2lnbmVkIGludCBkZWx0YSkKQEAgLTQyMSwyMDAgKzQyMSwyMDEgQEAKIAogc3RhdGljIHZvaWQgdTEzMl9tb25pdG9yX2NhbmNlbF93b3JrKHN0cnVjdCB1MTMyICp1MTMyKQogewotICAgICAgICBpZiAoY2FuY2VsX2RlbGF5ZWRfd29yaygmdTEzMi0+bW9uaXRvcikpCi0gICAgICAgICAgICAgICAga3JlZl9wdXQoJnUxMzItPmtyZWYsIHUxMzJfaGNkX2RlbGV0ZSk7CisJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmsoJnUxMzItPm1vbml0b3IpKQorCQlrcmVmX3B1dCgmdTEzMi0+a3JlZiwgdTEzMl9oY2RfZGVsZXRlKTsKIH0KIAogc3RhdGljIGludCByZWFkX3Jvb3RodWJfaW5mbyhzdHJ1Y3QgdTEzMiAqdTEzMikKIHsKLSAgICAgICAgdTMyIHJldmlzaW9uOwotICAgICAgICBpbnQgcmV0dmFsOwotICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIHJldmlzaW9uLCAmcmV2aXNpb24pOwotICAgICAgICBpZiAocmV0dmFsKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJlcnJvciAlZCBhY2Nlc3NpbmcgZGV2aWNlIGNvIgotICAgICAgICAgICAgICAgICAgICAgICAgIm50cm9sXG4iLCByZXR2YWwpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIH0gZWxzZSBpZiAoKHJldmlzaW9uICYgMHhGRikgPT0gMHgxMCkgewotICAgICAgICB9IGVsc2UgaWYgKChyZXZpc2lvbiAmIDB4RkYpID09IDB4MTEpIHsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSByZXZpc2lvbiBpcyBub3QgdmFsaWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAiICUwOFhcbiIsIHJldmlzaW9uKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICAgICAgfQotICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGNvbnRyb2wsICZ1MTMyLT5oY19jb250cm9sKTsKLSAgICAgICAgaWYgKHJldHZhbCkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZXJyb3IgJWQgYWNjZXNzaW5nIGRldmljZSBjbyIKLSAgICAgICAgICAgICAgICAgICAgICAgICJudHJvbFxuIiwgcmV0dmFsKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICB9Ci0gICAgICAgIHJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgcm9vdGh1Yi5zdGF0dXMsCi0gICAgICAgICAgICAgICAgJnUxMzItPmhjX3Jvb3RodWJfc3RhdHVzKTsKLSAgICAgICAgaWYgKHJldHZhbCkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZXJyb3IgJWQgYWNjZXNzaW5nIGRldmljZSByZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICJnIHJvb3RodWIuc3RhdHVzXG4iLCByZXR2YWwpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCByb290aHViLmEsICZ1MTMyLT5oY19yb290aHViX2EpOwotICAgICAgICBpZiAocmV0dmFsKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJlcnJvciAlZCBhY2Nlc3NpbmcgZGV2aWNlIHJlIgotICAgICAgICAgICAgICAgICAgICAgICAgImcgcm9vdGh1Yi5hXG4iLCByZXR2YWwpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIH0KLSAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBJID0gdTEzMi0+bnVtX3BvcnRzOwotICAgICAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAoSS0tID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCByb290aHViLnBvcnRzdGF0dXNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1MTMyLT5oY19yb290aHViX3BvcnRzdGF0dXNbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImVycm9yICVkIGFjYyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXNzaW5nIGRldmljZSByb290aHViLnBvcnRzdGF0dXNbJWRdXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCByZXR2YWwsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7CisJdTMyIHJldmlzaW9uOworCWludCByZXR2YWw7CisJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCByZXZpc2lvbiwgJnJldmlzaW9uKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZXJyb3IgJWQgYWNjZXNzaW5nIGRldmljZSBjbyIKKwkJCSJudHJvbFxuIiwgcmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9IGVsc2UgaWYgKChyZXZpc2lvbiAmIDB4RkYpID09IDB4MTApIHsKKwl9IGVsc2UgaWYgKChyZXZpc2lvbiAmIDB4RkYpID09IDB4MTEpIHsKKwl9IGVsc2UgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSByZXZpc2lvbiBpcyBub3QgdmFsaWQiCisJCQkiICUwOFhcbiIsIHJldmlzaW9uKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgY29udHJvbCwgJnUxMzItPmhjX2NvbnRyb2wpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJlcnJvciAlZCBhY2Nlc3NpbmcgZGV2aWNlIGNvIgorCQkJIm50cm9sXG4iLCByZXR2YWwpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIHJvb3RodWIuc3RhdHVzLAorCQkmdTEzMi0+aGNfcm9vdGh1Yl9zdGF0dXMpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJlcnJvciAlZCBhY2Nlc3NpbmcgZGV2aWNlIHJlIgorCQkJImcgcm9vdGh1Yi5zdGF0dXNcbiIsIHJldHZhbCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCXJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgcm9vdGh1Yi5hLCAmdTEzMi0+aGNfcm9vdGh1Yl9hKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZXJyb3IgJWQgYWNjZXNzaW5nIGRldmljZSByZSIKKwkJCSJnIHJvb3RodWIuYVxuIiwgcmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJeworCQlpbnQgSSA9IHUxMzItPm51bV9wb3J0czsKKwkJaW50IGkgPSAwOworCQl3aGlsZSAoSS0tID4gMCkgeworCQkJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCByb290aHViLnBvcnRzdGF0dXNbaV0sCisJCQkJJnUxMzItPmhjX3Jvb3RodWJfcG9ydHN0YXR1c1tpXSk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJlcnJvciAlZCBhY2MiCisJCQkJCSJlc3NpbmcgZGV2aWNlIHJvb3RodWIucG9ydHN0YXR1c1slZF1cbiIKKwkJCQkJLCByZXR2YWwsIGkpOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9IGVsc2UKKwkJCQlpICs9IDE7CisJCX0KKwl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHUxMzJfaGNkX21vbml0b3Jfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1MTMyLCBtb25pdG9yLndvcmspOwotICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAxKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgLCB1MTMyLT5nb2luZyk7Ci0gICAgICAgICAgICAgICAgdTEzMl9tb25pdG9yX3B1dF9rcmVmKHUxMzIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkXG4iKTsKLSAgICAgICAgICAgICAgICB1MTMyX21vbml0b3JfcHV0X2tyZWYodTEzMik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCByZXR2YWw7Ci0gICAgICAgICAgICAgICAgbXV0ZXhfbG9jaygmdTEzMi0+c3dfbG9jayk7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcmVhZF9yb290aHViX2luZm8odTEzMik7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9oY2QgKmhjZCA9IHUxMzJfdG9faGNkKHUxMzIpOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9kaXNhYmxlKHUxMzIpOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMi0+Z29pbmcgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zd19sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9oY19kaWVkKGhjZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmdGRpX2VsYW5fZ29uZV9hd2F5KHUxMzItPnBsYXRmb3JtX2Rldik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1MTMyX21vbml0b3JfcHV0X2tyZWYodTEzMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfbW9uaXRvcl9yZXF1ZXVlX3dvcmsodTEzMiwgNTAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG11dGV4X3VubG9jaygmdTEzMi0+c3dfbG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9CisJc3RydWN0IHUxMzIgKnUxMzIgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHUxMzIsIG1vbml0b3Iud29yayk7CisJaWYgKHUxMzItPmdvaW5nID4gMSkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCisJCQksIHUxMzItPmdvaW5nKTsKKwkJdTEzMl9tb25pdG9yX3B1dF9rcmVmKHUxMzIpOworCQlyZXR1cm47CisJfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKKwkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZFxuIik7CisJCXUxMzJfbW9uaXRvcl9wdXRfa3JlZih1MTMyKTsKKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCWludCByZXR2YWw7CisJCW11dGV4X2xvY2soJnUxMzItPnN3X2xvY2spOworCQlyZXR2YWwgPSByZWFkX3Jvb3RodWJfaW5mbyh1MTMyKTsKKwkJaWYgKHJldHZhbCkgeworCQkJc3RydWN0IHVzYl9oY2QgKmhjZCA9IHUxMzJfdG9faGNkKHUxMzIpOworCQkJdTEzMl9kaXNhYmxlKHUxMzIpOworCQkJdTEzMi0+Z29pbmcgPSAxOworCQkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zd19sb2NrKTsKKwkJCXVzYl9oY19kaWVkKGhjZCk7CisJCQlmdGRpX2VsYW5fZ29uZV9hd2F5KHUxMzItPnBsYXRmb3JtX2Rldik7CisJCQl1MTMyX21vbml0b3JfcHV0X2tyZWYodTEzMik7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQl1MTMyX21vbml0b3JfcmVxdWV1ZV93b3JrKHUxMzIsIDUwMCk7CisJCQltdXRleF91bmxvY2soJnUxMzItPnN3X2xvY2spOworCQkJcmV0dXJuOworCQl9CisJfQogfQogCiBzdGF0aWMgdm9pZCB1MTMyX2hjZF9naXZlYmFja191cmIoc3RydWN0IHUxMzIgKnUxMzIsIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAsCi0gICAgICAgIHN0cnVjdCB1cmIgKnVyYiwgaW50IHN0YXR1cykKKwlzdHJ1Y3QgdXJiICp1cmIsIGludCBzdGF0dXMpCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmc7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgaXJxczsKLSAgICAgICAgc3RydWN0IHVzYl9oY2QgKmhjZCA9IHUxMzJfdG9faGNkKHUxMzIpOwotICAgICAgICB1cmItPmVycm9yX2NvdW50ID0gMDsKLSAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOworCXN0cnVjdCB1MTMyX3JpbmcgKnJpbmc7CisJdW5zaWduZWQgbG9uZyBpcnFzOworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSB1MTMyX3RvX2hjZCh1MTMyKTsKKwl1cmItPmVycm9yX2NvdW50ID0gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CiAJdXNiX2hjZF91bmxpbmtfdXJiX2Zyb21fZXAoaGNkLCB1cmIpOwotICAgICAgICBlbmRwLT5xdWV1ZV9uZXh0ICs9IDE7Ci0gICAgICAgIGlmIChFTkRQX1FVRVVFX1NJWkUgPiAtLWVuZHAtPnF1ZXVlX3NpemUpIHsKLSAgICAgICAgICAgICAgICBlbmRwLT5hY3RpdmUgPSAwOwotICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKm5leHQgPSBlbmRwLT51cmJfbW9yZS5uZXh0OwotICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3VyYnEgKnVyYnEgPSBsaXN0X2VudHJ5KG5leHQsIHN0cnVjdCB1MTMyX3VyYnEsCi0gICAgICAgICAgICAgICAgICAgICAgICB1cmJfbW9yZSk7Ci0gICAgICAgICAgICAgICAgbGlzdF9kZWwobmV4dCk7Ci0gICAgICAgICAgICAgICAgZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYgZW5kcC0+cXVldWVfbGFzdCsrXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cmJxLT51cmI7Ci0gICAgICAgICAgICAgICAgZW5kcC0+YWN0aXZlID0gMDsKLSAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKLSAgICAgICAgICAgICAgICBrZnJlZSh1cmJxKTsKLSAgICAgICAgfSBkb3duKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgIHJpbmcgPSBlbmRwLT5yaW5nOwotICAgICAgICByaW5nLT5pbl91c2UgPSAwOwotICAgICAgICB1MTMyX3JpbmdfY2FuY2VsX3dvcmsodTEzMiwgcmluZyk7Ci0gICAgICAgIHUxMzJfcmluZ19xdWV1ZV93b3JrKHUxMzIsIHJpbmcsIDApOwotICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICB1MTMyX2VuZHBfcHV0X2tyZWYodTEzMiwgZW5kcCk7CisJZW5kcC0+cXVldWVfbmV4dCArPSAxOworCWlmIChFTkRQX1FVRVVFX1NJWkUgPiAtLWVuZHAtPnF1ZXVlX3NpemUpIHsKKwkJZW5kcC0+YWN0aXZlID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqbmV4dCA9IGVuZHAtPnVyYl9tb3JlLm5leHQ7CisJCXN0cnVjdCB1MTMyX3VyYnEgKnVyYnEgPSBsaXN0X2VudHJ5KG5leHQsIHN0cnVjdCB1MTMyX3VyYnEsCisJCQl1cmJfbW9yZSk7CisJCWxpc3RfZGVsKG5leHQpOworCQllbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJiBlbmRwLT5xdWV1ZV9sYXN0KytdID0KKwkJCXVyYnEtPnVyYjsKKwkJZW5kcC0+YWN0aXZlID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisJCWtmcmVlKHVyYnEpOworCX0KKwltdXRleF9sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJcmluZyA9IGVuZHAtPnJpbmc7CisJcmluZy0+aW5fdXNlID0gMDsKKwl1MTMyX3JpbmdfY2FuY2VsX3dvcmsodTEzMiwgcmluZyk7CisJdTEzMl9yaW5nX3F1ZXVlX3dvcmsodTEzMiwgcmluZywgMCk7CisJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJdTEzMl9lbmRwX3B1dF9rcmVmKHUxMzIsIGVuZHApOwogCXVzYl9oY2RfZ2l2ZWJhY2tfdXJiKGhjZCwgdXJiLCBzdGF0dXMpOwotICAgICAgICByZXR1cm47CisJcmV0dXJuOwogfQogCiBzdGF0aWMgdm9pZCB1MTMyX2hjZF9mb3JnZXRfdXJiKHN0cnVjdCB1MTMyICp1MTMyLCBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwLAotICAgICAgICBzdHJ1Y3QgdXJiICp1cmIsIGludCBzdGF0dXMpCisJc3RydWN0IHVyYiAqdXJiLCBpbnQgc3RhdHVzKQogewotICAgICAgICB1MTMyX2VuZHBfcHV0X2tyZWYodTEzMiwgZW5kcCk7CisJdTEzMl9lbmRwX3B1dF9rcmVmKHUxMzIsIGVuZHApOwogfQogCiBzdGF0aWMgdm9pZCB1MTMyX2hjZF9hYmFuZG9uX3VyYihzdHJ1Y3QgdTEzMiAqdTEzMiwgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCwKLSAgICAgICAgc3RydWN0IHVyYiAqdXJiLCBpbnQgc3RhdHVzKQorCXN0cnVjdCB1cmIgKnVyYiwgaW50IHN0YXR1cykKIHsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBpcnFzOwotICAgICAgICBzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gdTEzMl90b19oY2QodTEzMik7Ci0gICAgICAgIHVyYi0+ZXJyb3JfY291bnQgPSAwOwotICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisJdW5zaWduZWQgbG9uZyBpcnFzOworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSB1MTMyX3RvX2hjZCh1MTMyKTsKKwl1cmItPmVycm9yX2NvdW50ID0gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CiAJdXNiX2hjZF91bmxpbmtfdXJiX2Zyb21fZXAoaGNkLCB1cmIpOwotICAgICAgICBlbmRwLT5xdWV1ZV9uZXh0ICs9IDE7Ci0gICAgICAgIGlmIChFTkRQX1FVRVVFX1NJWkUgPiAtLWVuZHAtPnF1ZXVlX3NpemUpIHsKLSAgICAgICAgICAgICAgICBlbmRwLT5hY3RpdmUgPSAwOwotICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKm5leHQgPSBlbmRwLT51cmJfbW9yZS5uZXh0OwotICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3VyYnEgKnVyYnEgPSBsaXN0X2VudHJ5KG5leHQsIHN0cnVjdCB1MTMyX3VyYnEsCi0gICAgICAgICAgICAgICAgICAgICAgICB1cmJfbW9yZSk7Ci0gICAgICAgICAgICAgICAgbGlzdF9kZWwobmV4dCk7Ci0gICAgICAgICAgICAgICAgZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYgZW5kcC0+cXVldWVfbGFzdCsrXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cmJxLT51cmI7Ci0gICAgICAgICAgICAgICAgZW5kcC0+YWN0aXZlID0gMDsKLSAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKLSAgICAgICAgICAgICAgICBrZnJlZSh1cmJxKTsKKwllbmRwLT5xdWV1ZV9uZXh0ICs9IDE7CisJaWYgKEVORFBfUVVFVUVfU0laRSA+IC0tZW5kcC0+cXVldWVfc2l6ZSkgeworCQllbmRwLT5hY3RpdmUgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0ID0gZW5kcC0+dXJiX21vcmUubmV4dDsKKwkJc3RydWN0IHUxMzJfdXJicSAqdXJicSA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IHUxMzJfdXJicSwKKwkJCXVyYl9tb3JlKTsKKwkJbGlzdF9kZWwobmV4dCk7CisJCWVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX2xhc3QrK10gPQorCQkJdXJicS0+dXJiOworCQllbmRwLT5hY3RpdmUgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKKwkJa2ZyZWUodXJicSk7CiAJfSB1c2JfaGNkX2dpdmViYWNrX3VyYihoY2QsIHVyYiwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuOworCXJldHVybjsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZWRzZXRfaW5wdXQoc3RydWN0IHUxMzIgKnUxMzIsIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmcsCi0gICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggYWRkcmVzcywgdTggdG9nZ2xlX2JpdHMsCi0gICAgICAgIHZvaWQgKCpjYWxsYmFjaykgKHZvaWQgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggKmJ1ZiwgaW50IGxlbiwKLSAgICAgICAgaW50IHRvZ2dsZV9iaXRzLCBpbnQgZXJyb3JfY291bnQsIGludCBjb25kaXRpb25fY29kZSwgaW50IHJlcGVhdF9udW1iZXIsCi0gICAgICAgICBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKSkKKwlzdHJ1Y3QgdTEzMl9lbmRwICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIsIHU4IGFkZHJlc3MsIHU4IHRvZ2dsZV9iaXRzLAorCXZvaWQgKCpjYWxsYmFjaykgKHZvaWQgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggKmJ1ZiwgaW50IGxlbiwKKwlpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLCBpbnQgcmVwZWF0X251bWJlciwKKwkgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkpCiB7Ci0gICAgICAgIHJldHVybiB1c2JfZnRkaV9lbGFuX2Vkc2V0X2lucHV0KHUxMzItPnBsYXRmb3JtX2RldiwgcmluZy0+bnVtYmVyLCBlbmRwLAotICAgICAgICAgICAgICAgICB1cmIsIGFkZHJlc3MsIGVuZHAtPnVzYl9lbmRwLCB0b2dnbGVfYml0cywgY2FsbGJhY2spOworCXJldHVybiB1c2JfZnRkaV9lbGFuX2Vkc2V0X2lucHV0KHUxMzItPnBsYXRmb3JtX2RldiwgcmluZy0+bnVtYmVyLCBlbmRwLAorCQkgdXJiLCBhZGRyZXNzLCBlbmRwLT51c2JfZW5kcCwgdG9nZ2xlX2JpdHMsIGNhbGxiYWNrKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZWRzZXRfc2V0dXAoc3RydWN0IHUxMzIgKnUxMzIsIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmcsCi0gICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggYWRkcmVzcywgdTggdG9nZ2xlX2JpdHMsCi0gICAgICAgIHZvaWQgKCpjYWxsYmFjaykgKHZvaWQgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggKmJ1ZiwgaW50IGxlbiwKLSAgICAgICAgaW50IHRvZ2dsZV9iaXRzLCBpbnQgZXJyb3JfY291bnQsIGludCBjb25kaXRpb25fY29kZSwgaW50IHJlcGVhdF9udW1iZXIsCi0gICAgICAgICBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKSkKKwlzdHJ1Y3QgdTEzMl9lbmRwICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIsIHU4IGFkZHJlc3MsIHU4IHRvZ2dsZV9iaXRzLAorCXZvaWQgKCpjYWxsYmFjaykgKHZvaWQgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggKmJ1ZiwgaW50IGxlbiwKKwlpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLCBpbnQgcmVwZWF0X251bWJlciwKKwkgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkpCiB7Ci0gICAgICAgIHJldHVybiB1c2JfZnRkaV9lbGFuX2Vkc2V0X3NldHVwKHUxMzItPnBsYXRmb3JtX2RldiwgcmluZy0+bnVtYmVyLCBlbmRwLAotICAgICAgICAgICAgICAgICB1cmIsIGFkZHJlc3MsIGVuZHAtPnVzYl9lbmRwLCB0b2dnbGVfYml0cywgY2FsbGJhY2spOworCXJldHVybiB1c2JfZnRkaV9lbGFuX2Vkc2V0X3NldHVwKHUxMzItPnBsYXRmb3JtX2RldiwgcmluZy0+bnVtYmVyLCBlbmRwLAorCQkgdXJiLCBhZGRyZXNzLCBlbmRwLT51c2JfZW5kcCwgdG9nZ2xlX2JpdHMsIGNhbGxiYWNrKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZWRzZXRfc2luZ2xlKHN0cnVjdCB1MTMyICp1MTMyLCBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nLAotICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIsIHU4IGFkZHJlc3MsIHU4IHRvZ2dsZV9iaXRzLAotICAgICAgICB2b2lkICgqY2FsbGJhY2spICh2b2lkICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIsIHU4ICpidWYsIGludCBsZW4sCi0gICAgICAgIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsIGludCByZXBlYXRfbnVtYmVyLAotICAgICAgICAgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkpCisJc3RydWN0IHUxMzJfZW5kcCAqZW5kcCwgc3RydWN0IHVyYiAqdXJiLCB1OCBhZGRyZXNzLCB1OCB0b2dnbGVfYml0cywKKwl2b2lkICgqY2FsbGJhY2spICh2b2lkICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIsIHU4ICpidWYsIGludCBsZW4sCisJaW50IHRvZ2dsZV9iaXRzLCBpbnQgZXJyb3JfY291bnQsIGludCBjb25kaXRpb25fY29kZSwgaW50IHJlcGVhdF9udW1iZXIsCisJIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpKQogewotICAgICAgICByZXR1cm4gdXNiX2Z0ZGlfZWxhbl9lZHNldF9zaW5nbGUodTEzMi0+cGxhdGZvcm1fZGV2LCByaW5nLT5udW1iZXIsCi0gICAgICAgICAgICAgICAgZW5kcCwgdXJiLCBhZGRyZXNzLCBlbmRwLT51c2JfZW5kcCwgdG9nZ2xlX2JpdHMsIGNhbGxiYWNrKTsKKwlyZXR1cm4gdXNiX2Z0ZGlfZWxhbl9lZHNldF9zaW5nbGUodTEzMi0+cGxhdGZvcm1fZGV2LCByaW5nLT5udW1iZXIsCisJCWVuZHAsIHVyYiwgYWRkcmVzcywgZW5kcC0+dXNiX2VuZHAsIHRvZ2dsZV9iaXRzLCBjYWxsYmFjayk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGVkc2V0X291dHB1dChzdHJ1Y3QgdTEzMiAqdTEzMiwgc3RydWN0IHUxMzJfcmluZyAqcmluZywKLSAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCwgc3RydWN0IHVyYiAqdXJiLCB1OCBhZGRyZXNzLCB1OCB0b2dnbGVfYml0cywKLSAgICAgICAgdm9pZCAoKmNhbGxiYWNrKSAodm9pZCAqZW5kcCwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLCBpbnQgbGVuLAotICAgICAgICBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLCBpbnQgcmVwZWF0X251bWJlciwKLSAgICAgICAgIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpKQorCXN0cnVjdCB1MTMyX2VuZHAgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggYWRkcmVzcywgdTggdG9nZ2xlX2JpdHMsCisJdm9pZCAoKmNhbGxiYWNrKSAodm9pZCAqZW5kcCwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLCBpbnQgbGVuLAorCWludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsIGludCByZXBlYXRfbnVtYmVyLAorCSBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKSkKIHsKLSAgICAgICAgcmV0dXJuIHVzYl9mdGRpX2VsYW5fZWRzZXRfb3V0cHV0KHUxMzItPnBsYXRmb3JtX2RldiwgcmluZy0+bnVtYmVyLAotICAgICAgICAgICAgICAgIGVuZHAsIHVyYiwgYWRkcmVzcywgZW5kcC0+dXNiX2VuZHAsIHRvZ2dsZV9iaXRzLCBjYWxsYmFjayk7CisJcmV0dXJuIHVzYl9mdGRpX2VsYW5fZWRzZXRfb3V0cHV0KHUxMzItPnBsYXRmb3JtX2RldiwgcmluZy0+bnVtYmVyLAorCQllbmRwLCB1cmIsIGFkZHJlc3MsIGVuZHAtPnVzYl9lbmRwLCB0b2dnbGVfYml0cywgY2FsbGJhY2spOwogfQogCiAKQEAgLTYyMyw2ODMgKzYyNCw2NzggQEAKICoKICovCiBzdGF0aWMgdm9pZCB1MTMyX2hjZF9pbnRlcnJ1cHRfcmVjdih2b2lkICpkYXRhLCBzdHJ1Y3QgdXJiICp1cmIsIHU4ICpidWYsCi0gICAgICAgIGludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCi0gICAgICAgIGludCByZXBlYXRfbnVtYmVyLCBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKQorCWludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCisJaW50IHJlcGVhdF9udW1iZXIsIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBkYXRhOwotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7Ci0gICAgICAgIHU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOwotICAgICAgICBzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2ID0gJnUxMzItPnVkZXZbYWRkcmVzc107Ci0gICAgICAgIGRvd24oJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7Ci0gICAgICAgICAgICAgICAgZW5kcC0+ZGVxdWV1ZWluZyA9IDA7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRUlOVFIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKKwlzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gZGF0YTsKKwlzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7CisJdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbZW5kcC0+dXNiX2FkZHJdLmFkZHJlc3M7CisJc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W2FkZHJlc3NdOworCW11dGV4X2xvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7CisJCWVuZHAtPmRlcXVldWVpbmcgPSAwOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgIgogCQkJCSJ1cmI9JXBcbiIsIHVyYik7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKwkJcmV0dXJuOwogCX0gZWxzZSBpZiAoIXVyYi0+dW5saW5rZWQpIHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZW5kcC0+cmluZzsKLSAgICAgICAgICAgICAgICB1OCAqdSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgdXJiLT5hY3R1YWxfbGVuZ3RoOwotICAgICAgICAgICAgICAgIHU4ICpiID0gYnVmOwotICAgICAgICAgICAgICAgIGludCBMID0gbGVuOwotICAgICAgICAgICAgICAgIHdoaWxlIChMLS0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqdSsrID0gKmIrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXJiLT5hY3R1YWxfbGVuZ3RoICs9IGxlbjsKLSAgICAgICAgICAgICAgICBpZiAoKGNvbmRpdGlvbl9jb2RlID09IFREX0NDX05PRVJST1IpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAodXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID4gdXJiLT5hY3R1YWxfbGVuZ3RoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dG9nZ2xlX2JpdHMgPSB0b2dnbGVfYml0czsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9zZXR0b2dnbGUodWRldi0+dXNiX2RldmljZSwgZW5kcC0+dXNiX2VuZHAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgJiB0b2dnbGVfYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV0dmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBlZHNldF9zaW5nbGUodTEzMiwgcmluZywgZW5kcCwgdXJiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsIGVuZHAtPnRvZ2dsZV9iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2ludGVycnVwdF9yZWN2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmluZy0+aW5fdXNlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+YWN0aXZlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+amlmZmllcyA9IGppZmZpZXMgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZWNzX3RvX2ppZmZpZXModXJiLT5pbnRlcnZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfcmluZ19jYW5jZWxfd29yayh1MTMyLCByaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9yaW5nX3F1ZXVlX3dvcmsodTEzMiwgcmluZywgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfZW5kcF9wdXRfa3JlZih1MTMyLCBlbmRwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChjb25kaXRpb25fY29kZSA9PSBURF9EQVRBVU5ERVJSVU4pICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfU0hPUlRfTk9UX09LKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dG9nZ2xlX2JpdHMgPSB0b2dnbGVfYml0czsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9zZXR0b2dnbGUodWRldi0+dXNiX2RldmljZSwgZW5kcC0+dXNiX2VuZHAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgJiB0b2dnbGVfYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb25fY29kZSA9PSBURF9DQ19OT0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnRvZ2dsZV9iaXRzID0gdG9nZ2xlX2JpdHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9zZXR0b2dnbGUodWRldi0+dXNiX2RldmljZSwgZW5kcC0+dXNiX2VuZHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSAmIHRvZ2dsZV9iaXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZGl0aW9uX2NvZGUgPT0gVERfQ0NfU1RBTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dG9nZ2xlX2JpdHMgPSAweDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9zZXR0b2dnbGUodWRldi0+dXNiX2RldmljZSwgZW5kcC0+dXNiX2VuZHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT50b2dnbGVfYml0cyA9IDB4MjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3NldHRvZ2dsZSh1ZGV2LT51c2JfZGV2aWNlLCBlbmRwLT51c2JfZW5kcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJ1cmI9JXAgZ2l2aW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImcgYmFjayBJTlRFUlJVUFQgJXNcbiIsIHVyYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY190b190ZXh0W2NvbmRpdGlvbl9jb2RlXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NfdG9fZXJyb3JbY29uZGl0aW9uX2NvZGVdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7CisJCXN0cnVjdCB1MTMyX3JpbmcgKnJpbmcgPSBlbmRwLT5yaW5nOworCQl1OCAqdSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgdXJiLT5hY3R1YWxfbGVuZ3RoOworCQl1OCAqYiA9IGJ1ZjsKKwkJaW50IEwgPSBsZW47CisKKwkJd2hpbGUgKEwtLSA+IDApCisJCQkqdSsrID0gKmIrKzsKKworCQl1cmItPmFjdHVhbF9sZW5ndGggKz0gbGVuOworCQlpZiAoKGNvbmRpdGlvbl9jb2RlID09IFREX0NDX05PRVJST1IpICYmCisJCQkodXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID4gdXJiLT5hY3R1YWxfbGVuZ3RoKSkgeworCQkJZW5kcC0+dG9nZ2xlX2JpdHMgPSB0b2dnbGVfYml0czsKKwkJCXVzYl9zZXR0b2dnbGUodWRldi0+dXNiX2RldmljZSwgZW5kcC0+dXNiX2VuZHAsIDAsCisJCQkJMSAmIHRvZ2dsZV9iaXRzKTsKKwkJCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPiAwKSB7CisJCQkJaW50IHJldHZhbDsKKwkJCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJCQlyZXR2YWwgPSBlZHNldF9zaW5nbGUodTEzMiwgcmluZywgZW5kcCwgdXJiLAorCQkJCQlhZGRyZXNzLCBlbmRwLT50b2dnbGVfYml0cywKKwkJCQkJdTEzMl9oY2RfaW50ZXJydXB0X3JlY3YpOworCQkJCWlmIChyZXR2YWwgIT0gMCkKKwkJCQkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwKKwkJCQkJCXJldHZhbCk7CisJCQl9IGVsc2UgeworCQkJCXJpbmctPmluX3VzZSA9IDA7CisJCQkJZW5kcC0+YWN0aXZlID0gMDsKKwkJCQllbmRwLT5qaWZmaWVzID0gamlmZmllcyArCisJCQkJCW1zZWNzX3RvX2ppZmZpZXModXJiLT5pbnRlcnZhbCk7CisJCQkJdTEzMl9yaW5nX2NhbmNlbF93b3JrKHUxMzIsIHJpbmcpOworCQkJCXUxMzJfcmluZ19xdWV1ZV93b3JrKHUxMzIsIHJpbmcsIDApOworCQkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJCXUxMzJfZW5kcF9wdXRfa3JlZih1MTMyLCBlbmRwKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmICgoY29uZGl0aW9uX2NvZGUgPT0gVERfREFUQVVOREVSUlVOKSAmJgorCQkJKCh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX1NIT1JUX05PVF9PSykgPT0gMCkpIHsKKwkJCWVuZHAtPnRvZ2dsZV9iaXRzID0gdG9nZ2xlX2JpdHM7CisJCQl1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIGVuZHAtPnVzYl9lbmRwLCAwLAorCQkJCTEgJiB0b2dnbGVfYml0cyk7CisJCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJaWYgKGNvbmRpdGlvbl9jb2RlID09IFREX0NDX05PRVJST1IpIHsKKwkJCQllbmRwLT50b2dnbGVfYml0cyA9IHRvZ2dsZV9iaXRzOworCQkJCXVzYl9zZXR0b2dnbGUodWRldi0+dXNiX2RldmljZSwgZW5kcC0+dXNiX2VuZHAsCisJCQkJCTAsIDEgJiB0b2dnbGVfYml0cyk7CisJCQl9IGVsc2UgaWYgKGNvbmRpdGlvbl9jb2RlID09IFREX0NDX1NUQUxMKSB7CisJCQkJZW5kcC0+dG9nZ2xlX2JpdHMgPSAweDI7CisJCQkJdXNiX3NldHRvZ2dsZSh1ZGV2LT51c2JfZGV2aWNlLCBlbmRwLT51c2JfZW5kcCwKKwkJCQkJMCwgMCk7CisJCQl9IGVsc2UgeworCQkJCWVuZHAtPnRvZ2dsZV9iaXRzID0gMHgyOworCQkJCXVzYl9zZXR0b2dnbGUodWRldi0+dXNiX2RldmljZSwgZW5kcC0+dXNiX2VuZHAsCisJCQkJCTAsIDApOworCQkJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAidXJiPSVwIGdpdmluIgorCQkJCQkiZyBiYWNrIElOVEVSUlVQVCAlc1xuIiwgdXJiLAorCQkJCQljY190b190ZXh0W2NvbmRpdGlvbl9jb2RlXSk7CisJCQl9CisJCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCisJCQkJY2NfdG9fZXJyb3JbY29uZGl0aW9uX2NvZGVdKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiQ0FMTEJBQ0sgY2FsbGVkIHVyYj0lcCAiCiAJCQkJInVubGlua2VkPSVkXG4iLCB1cmIsIHVyYi0+dW5saW5rZWQpOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwogCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKwkJcmV0dXJuOworCX0KIH0KIAogc3RhdGljIHZvaWQgdTEzMl9oY2RfYnVsa19vdXRwdXRfc2VudCh2b2lkICpkYXRhLCBzdHJ1Y3QgdXJiICp1cmIsIHU4ICpidWYsCi0gICAgICAgIGludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCi0gICAgICAgIGludCByZXBlYXRfbnVtYmVyLCBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKQorCWludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCisJaW50IHJlcGVhdF9udW1iZXIsIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBkYXRhOwotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7Ci0gICAgICAgIHU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOwotICAgICAgICBkb3duKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfaGNkX2ZvcmdldF91cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoZW5kcC0+ZGVxdWV1ZWluZykgewotICAgICAgICAgICAgICAgIGVuZHAtPmRlcXVldWVpbmcgPSAwOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CisJc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGRhdGE7CisJc3RydWN0IHUxMzIgKnUxMzIgPSBlbmRwLT51MTMyOworCXU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOworCW11dGV4X2xvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7CisJCWVuZHAtPmRlcXVldWVpbmcgPSAwOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgIgogCQkJCSJ1cmI9JXBcbiIsIHVyYik7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKwkJcmV0dXJuOwogCX0gZWxzZSBpZiAoIXVyYi0+dW5saW5rZWQpIHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZW5kcC0+cmluZzsKLSAgICAgICAgICAgICAgICB1cmItPmFjdHVhbF9sZW5ndGggKz0gbGVuOwotICAgICAgICAgICAgICAgIGVuZHAtPnRvZ2dsZV9iaXRzID0gdG9nZ2xlX2JpdHM7Ci0gICAgICAgICAgICAgICAgaWYgKHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA+IHVyYi0+YWN0dWFsX2xlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBlZHNldF9vdXRwdXQodTEzMiwgcmluZywgZW5kcCwgdXJiLCBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT50b2dnbGVfYml0cywgdTEzMl9oY2RfYnVsa19vdXRwdXRfc2VudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCByZXR2YWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeworCQlzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZW5kcC0+cmluZzsKKwkJdXJiLT5hY3R1YWxfbGVuZ3RoICs9IGxlbjsKKwkJZW5kcC0+dG9nZ2xlX2JpdHMgPSB0b2dnbGVfYml0czsKKwkJaWYgKHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA+IHVyYi0+YWN0dWFsX2xlbmd0aCkgeworCQkJaW50IHJldHZhbDsKKwkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJcmV0dmFsID0gZWRzZXRfb3V0cHV0KHUxMzIsIHJpbmcsIGVuZHAsIHVyYiwgYWRkcmVzcywKKwkJCQllbmRwLT50b2dnbGVfYml0cywgdTEzMl9oY2RfYnVsa19vdXRwdXRfc2VudCk7CisJCQlpZiAocmV0dmFsICE9IDApCisJCQkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgcmV0dmFsKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgMCk7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgewogCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgIkNBTExCQUNLIGNhbGxlZCB1cmI9JXAgIgogCQkJCSJ1bmxpbmtlZD0lZFxuIiwgdXJiLCB1cmItPnVubGlua2VkKTsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKIAkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CisJCXJldHVybjsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHUxMzJfaGNkX2J1bGtfaW5wdXRfcmVjdih2b2lkICpkYXRhLCBzdHJ1Y3QgdXJiICp1cmIsIHU4ICpidWYsCi0gICAgICAgIGludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCi0gICAgICAgIGludCByZXBlYXRfbnVtYmVyLCBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKQorCWludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCisJaW50IHJlcGVhdF9udW1iZXIsIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBkYXRhOwotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7Ci0gICAgICAgIHU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOwotICAgICAgICBzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2ID0gJnUxMzItPnVkZXZbYWRkcmVzc107Ci0gICAgICAgIGRvd24oJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7Ci0gICAgICAgICAgICAgICAgZW5kcC0+ZGVxdWV1ZWluZyA9IDA7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRUlOVFIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKKwlzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gZGF0YTsKKwlzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7CisJdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbZW5kcC0+dXNiX2FkZHJdLmFkZHJlc3M7CisJc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W2FkZHJlc3NdOworCW11dGV4X2xvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7CisJCWVuZHAtPmRlcXVldWVpbmcgPSAwOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgIgogCQkJCSJ1cmI9JXBcbiIsIHVyYik7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKwkJcmV0dXJuOwogCX0gZWxzZSBpZiAoIXVyYi0+dW5saW5rZWQpIHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZW5kcC0+cmluZzsKLSAgICAgICAgICAgICAgICB1OCAqdSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgdXJiLT5hY3R1YWxfbGVuZ3RoOwotICAgICAgICAgICAgICAgIHU4ICpiID0gYnVmOwotICAgICAgICAgICAgICAgIGludCBMID0gbGVuOwotICAgICAgICAgICAgICAgIHdoaWxlIChMLS0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqdSsrID0gKmIrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXJiLT5hY3R1YWxfbGVuZ3RoICs9IGxlbjsKLSAgICAgICAgICAgICAgICBpZiAoKGNvbmRpdGlvbl9jb2RlID09IFREX0NDX05PRVJST1IpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAodXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID4gdXJiLT5hY3R1YWxfbGVuZ3RoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnRvZ2dsZV9iaXRzID0gdG9nZ2xlX2JpdHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIGVuZHAtPnVzYl9lbmRwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICYgdG9nZ2xlX2JpdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHVzYl9mdGRpX2VsYW5fZWRzZXRfaW5wdXQodTEzMi0+cGxhdGZvcm1fZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5udW1iZXIsIGVuZHAsIHVyYiwgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dXNiX2VuZHAsIGVuZHAtPnRvZ2dsZV9iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2hjZF9idWxrX2lucHV0X3JlY3YpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgcmV0dmFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbl9jb2RlID09IFREX0NDX05PRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnRvZ2dsZV9iaXRzID0gdG9nZ2xlX2JpdHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIGVuZHAtPnVzYl9lbmRwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICYgdG9nZ2xlX2JpdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjX3RvX2Vycm9yW2NvbmRpdGlvbl9jb2RlXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoY29uZGl0aW9uX2NvZGUgPT0gVERfREFUQVVOREVSUlVOKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKCh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX1NIT1JUX05PVF9PSykgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnRvZ2dsZV9iaXRzID0gdG9nZ2xlX2JpdHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIGVuZHAtPnVzYl9lbmRwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICYgdG9nZ2xlX2JpdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZGl0aW9uX2NvZGUgPT0gVERfREFUQVVOREVSUlVOKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT50b2dnbGVfYml0cyA9IHRvZ2dsZV9iaXRzOwotICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3NldHRvZ2dsZSh1ZGV2LT51c2JfZGV2aWNlLCBlbmRwLT51c2JfZW5kcCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAmIHRvZ2dsZV9iaXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldl93YXJuKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInVyYj0lcChTSE9SVCBOT1QgT0siCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIGdpdmluZyBiYWNrIEJVTEsgSU4gJXNcbiIsIHVyYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NfdG9fdGV4dFtjb25kaXRpb25fY29kZV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZGl0aW9uX2NvZGUgPT0gVERfQ0NfU1RBTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnRvZ2dsZV9iaXRzID0gMHgyOwotICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3NldHRvZ2dsZSh1ZGV2LT51c2JfZGV2aWNlLCBlbmRwLT51c2JfZW5kcCwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NfdG9fZXJyb3JbY29uZGl0aW9uX2NvZGVdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dG9nZ2xlX2JpdHMgPSAweDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIGVuZHAtPnVzYl9lbmRwLCAwLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAidXJiPSVwIGdpdmluZyBiYWNrIEIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVTEsgSU4gY29kZT0lZCAlc1xuIiwgdXJiLCBjb25kaXRpb25fY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NfdG9fdGV4dFtjb25kaXRpb25fY29kZV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjX3RvX2Vycm9yW2NvbmRpdGlvbl9jb2RlXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeworCQlzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZW5kcC0+cmluZzsKKwkJdTggKnUgPSB1cmItPnRyYW5zZmVyX2J1ZmZlciArIHVyYi0+YWN0dWFsX2xlbmd0aDsKKwkJdTggKmIgPSBidWY7CisJCWludCBMID0gbGVuOworCisJCXdoaWxlIChMLS0gPiAwKQorCQkJKnUrKyA9ICpiKys7CisKKwkJdXJiLT5hY3R1YWxfbGVuZ3RoICs9IGxlbjsKKwkJaWYgKChjb25kaXRpb25fY29kZSA9PSBURF9DQ19OT0VSUk9SKSAmJgorCQkJKHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA+IHVyYi0+YWN0dWFsX2xlbmd0aCkpIHsKKwkJCWludCByZXR2YWw7CisJCQllbmRwLT50b2dnbGVfYml0cyA9IHRvZ2dsZV9iaXRzOworCQkJdXNiX3NldHRvZ2dsZSh1ZGV2LT51c2JfZGV2aWNlLCBlbmRwLT51c2JfZW5kcCwgMCwKKwkJCQkxICYgdG9nZ2xlX2JpdHMpOworCQkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCQlyZXR2YWwgPSB1c2JfZnRkaV9lbGFuX2Vkc2V0X2lucHV0KHUxMzItPnBsYXRmb3JtX2RldiwKKwkJCQlyaW5nLT5udW1iZXIsIGVuZHAsIHVyYiwgYWRkcmVzcywKKwkJCQllbmRwLT51c2JfZW5kcCwgZW5kcC0+dG9nZ2xlX2JpdHMsCisJCQkJdTEzMl9oY2RfYnVsa19pbnB1dF9yZWN2KTsKKwkJCWlmIChyZXR2YWwgIT0gMCkKKwkJCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCByZXR2YWwpOworCQkJcmV0dXJuOworCQl9IGVsc2UgaWYgKGNvbmRpdGlvbl9jb2RlID09IFREX0NDX05PRVJST1IpIHsKKwkJCWVuZHAtPnRvZ2dsZV9iaXRzID0gdG9nZ2xlX2JpdHM7CisJCQl1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIGVuZHAtPnVzYl9lbmRwLCAwLAorCQkJCTEgJiB0b2dnbGVfYml0cyk7CisJCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCisJCQkJY2NfdG9fZXJyb3JbY29uZGl0aW9uX2NvZGVdKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmICgoY29uZGl0aW9uX2NvZGUgPT0gVERfREFUQVVOREVSUlVOKSAmJgorCQkJKCh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX1NIT1JUX05PVF9PSykgPT0gMCkpIHsKKwkJCWVuZHAtPnRvZ2dsZV9iaXRzID0gdG9nZ2xlX2JpdHM7CisJCQl1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIGVuZHAtPnVzYl9lbmRwLCAwLAorCQkJCTEgJiB0b2dnbGVfYml0cyk7CisJCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOworCQkJcmV0dXJuOworCQl9IGVsc2UgaWYgKGNvbmRpdGlvbl9jb2RlID09IFREX0RBVEFVTkRFUlJVTikgeworCQkJZW5kcC0+dG9nZ2xlX2JpdHMgPSB0b2dnbGVfYml0czsKKwkJCXVzYl9zZXR0b2dnbGUodWRldi0+dXNiX2RldmljZSwgZW5kcC0+dXNiX2VuZHAsIDAsCisJCQkJMSAmIHRvZ2dsZV9iaXRzKTsKKwkJCWRldl93YXJuKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInVyYj0lcChTSE9SVCBOT1QgT0siCisJCQkJIikgZ2l2aW5nIGJhY2sgQlVMSyBJTiAlc1xuIiwgdXJiLAorCQkJCWNjX3RvX3RleHRbY29uZGl0aW9uX2NvZGVdKTsKKwkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgMCk7CisJCQlyZXR1cm47CisJCX0gZWxzZSBpZiAoY29uZGl0aW9uX2NvZGUgPT0gVERfQ0NfU1RBTEwpIHsKKwkJCWVuZHAtPnRvZ2dsZV9iaXRzID0gMHgyOworCQkJdXNiX3NldHRvZ2dsZSh1ZGV2LT51c2JfZGV2aWNlLCBlbmRwLT51c2JfZW5kcCwgMCwgMCk7CisJCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCisJCQkJY2NfdG9fZXJyb3JbY29uZGl0aW9uX2NvZGVdKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCWVuZHAtPnRvZ2dsZV9iaXRzID0gMHgyOworCQkJdXNiX3NldHRvZ2dsZSh1ZGV2LT51c2JfZGV2aWNlLCBlbmRwLT51c2JfZW5kcCwgMCwgMCk7CisJCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInVyYj0lcCBnaXZpbmcgYmFjayBCIgorCQkJCSJVTEsgSU4gY29kZT0lZCAlc1xuIiwgdXJiLCBjb25kaXRpb25fY29kZSwKKwkJCQljY190b190ZXh0W2NvbmRpdGlvbl9jb2RlXSk7CisJCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCisJCQkJY2NfdG9fZXJyb3JbY29uZGl0aW9uX2NvZGVdKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiQ0FMTEJBQ0sgY2FsbGVkIHVyYj0lcCAiCiAJCQkJInVubGlua2VkPSVkXG4iLCB1cmIsIHVyYi0+dW5saW5rZWQpOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwogCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKwkJcmV0dXJuOworCX0KIH0KIAogc3RhdGljIHZvaWQgdTEzMl9oY2RfY29uZmlndXJlX2VtcHR5X3NlbnQodm9pZCAqZGF0YSwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLAotICAgICAgICBpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAotICAgICAgICBpbnQgcmVwZWF0X251bWJlciwgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkKKwlpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAorCWludCByZXBlYXRfbnVtYmVyLCBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKQogewotICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gZGF0YTsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBlbmRwLT51MTMyOwotICAgICAgICBkb3duKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfaGNkX2ZvcmdldF91cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoZW5kcC0+ZGVxdWV1ZWluZykgewotICAgICAgICAgICAgICAgIGVuZHAtPmRlcXVldWVpbmcgPSAwOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CisJc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGRhdGE7CisJc3RydWN0IHUxMzIgKnUxMzIgPSBlbmRwLT51MTMyOworCW11dGV4X2xvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7CisJCWVuZHAtPmRlcXVldWVpbmcgPSAwOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgIgogCQkJCSJ1cmI9JXBcbiIsIHVyYik7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKwkJcmV0dXJuOwogCX0gZWxzZSBpZiAoIXVyYi0+dW5saW5rZWQpIHsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIHsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOworCQlyZXR1cm47CisJfSBlbHNlIHsKIAkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJDQUxMQkFDSyBjYWxsZWQgdXJiPSVwICIKIAkJCQkidW5saW5rZWQ9JWRcbiIsIHVyYiwgdXJiLT51bmxpbmtlZCk7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CiAJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorCQlyZXR1cm47CisJfQogfQogCiBzdGF0aWMgdm9pZCB1MTMyX2hjZF9jb25maWd1cmVfaW5wdXRfcmVjdih2b2lkICpkYXRhLCBzdHJ1Y3QgdXJiICp1cmIsIHU4ICpidWYsCi0gICAgICAgIGludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCi0gICAgICAgIGludCByZXBlYXRfbnVtYmVyLCBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKQorCWludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCisJaW50IHJlcGVhdF9udW1iZXIsIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBkYXRhOwotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7Ci0gICAgICAgIHU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOwotICAgICAgICBkb3duKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfaGNkX2ZvcmdldF91cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoZW5kcC0+ZGVxdWV1ZWluZykgewotICAgICAgICAgICAgICAgIGVuZHAtPmRlcXVldWVpbmcgPSAwOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CisJc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGRhdGE7CisJc3RydWN0IHUxMzIgKnUxMzIgPSBlbmRwLT51MTMyOworCXU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOworCW11dGV4X2xvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7CisJCWVuZHAtPmRlcXVldWVpbmcgPSAwOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgIgogCQkJCSJ1cmI9JXBcbiIsIHVyYik7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKwkJcmV0dXJuOwogCX0gZWxzZSBpZiAoIXVyYi0+dW5saW5rZWQpIHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZW5kcC0+cmluZzsKLSAgICAgICAgICAgICAgICB1OCAqdSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwotICAgICAgICAgICAgICAgIHU4ICpiID0gYnVmOwotICAgICAgICAgICAgICAgIGludCBMID0gbGVuOwotICAgICAgICAgICAgICAgIHdoaWxlIChMLS0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqdSsrID0gKmIrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXJiLT5hY3R1YWxfbGVuZ3RoID0gbGVuOwotICAgICAgICAgICAgICAgIGlmICgoY29uZGl0aW9uX2NvZGUgPT0gVERfQ0NfTk9FUlJPUikgfHwgKChjb25kaXRpb25fY29kZSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgVERfREFUQVVOREVSUlVOKSAmJiAoKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJgotICAgICAgICAgICAgICAgICAgICAgICAgVVJCX1NIT1JUX05PVF9PSykgPT0gMCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV0dmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHVzYl9mdGRpX2VsYW5fZWRzZXRfZW1wdHkodTEzMi0+cGxhdGZvcm1fZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5udW1iZXIsIGVuZHAsIHVyYiwgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dXNiX2VuZHAsIDB4MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfY29uZmlndXJlX2VtcHR5X3NlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgcmV0dmFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbl9jb2RlID09IFREX0NDX1NUQUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgZGV2X3dhcm4oJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZ2l2aW5nIGJhY2sgU0VUVVAgSSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5QVVQgU1RBTEwgdXJiICVwXG4iLCB1cmIpOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NfdG9fZXJyb3JbY29uZGl0aW9uX2NvZGVdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZ2l2aW5nIGJhY2sgU0VUVVAgSU4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQVVQgJXMgdXJiICVwXG4iLCBjY190b190ZXh0W2NvbmRpdGlvbl9jb2RlXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjX3RvX2Vycm9yW2NvbmRpdGlvbl9jb2RlXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeworCQlzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZW5kcC0+cmluZzsKKwkJdTggKnUgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwkJdTggKmIgPSBidWY7CisJCWludCBMID0gbGVuOworCisJCXdoaWxlIChMLS0gPiAwKQorCQkJKnUrKyA9ICpiKys7CisKKwkJdXJiLT5hY3R1YWxfbGVuZ3RoID0gbGVuOworCQlpZiAoKGNvbmRpdGlvbl9jb2RlID09IFREX0NDX05PRVJST1IpIHx8ICgoY29uZGl0aW9uX2NvZGUgPT0KKwkJCVREX0RBVEFVTkRFUlJVTikgJiYgKCh1cmItPnRyYW5zZmVyX2ZsYWdzICYKKwkJCVVSQl9TSE9SVF9OT1RfT0spID09IDApKSkgeworCQkJaW50IHJldHZhbDsKKwkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJcmV0dmFsID0gdXNiX2Z0ZGlfZWxhbl9lZHNldF9lbXB0eSh1MTMyLT5wbGF0Zm9ybV9kZXYsCisJCQkJcmluZy0+bnVtYmVyLCBlbmRwLCB1cmIsIGFkZHJlc3MsCisJCQkJZW5kcC0+dXNiX2VuZHAsIDB4MywKKwkJCQl1MTMyX2hjZF9jb25maWd1cmVfZW1wdHlfc2VudCk7CisJCQlpZiAocmV0dmFsICE9IDApCisJCQkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgcmV0dmFsKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmIChjb25kaXRpb25fY29kZSA9PSBURF9DQ19TVEFMTCkgeworCQkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCQlkZXZfd2FybigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJnaXZpbmcgYmFjayBTRVRVUCBJIgorCQkJCSJOUFVUIFNUQUxMIHVyYiAlcFxuIiwgdXJiKTsKKwkJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCisJCQkJY2NfdG9fZXJyb3JbY29uZGl0aW9uX2NvZGVdKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJnaXZpbmcgYmFjayBTRVRVUCBJTiIKKwkJCQkiUFVUICVzIHVyYiAlcFxuIiwgY2NfdG9fdGV4dFtjb25kaXRpb25fY29kZV0sCisJCQkJdXJiKTsKKwkJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCisJCQkJY2NfdG9fZXJyb3JbY29uZGl0aW9uX2NvZGVdKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiQ0FMTEJBQ0sgY2FsbGVkIHVyYj0lcCAiCiAJCQkJInVubGlua2VkPSVkXG4iLCB1cmIsIHVyYi0+dW5saW5rZWQpOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwogCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKwkJcmV0dXJuOworCX0KIH0KIAogc3RhdGljIHZvaWQgdTEzMl9oY2RfY29uZmlndXJlX2VtcHR5X3JlY3Yodm9pZCAqZGF0YSwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLAotICAgICAgICBpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAotICAgICAgICBpbnQgcmVwZWF0X251bWJlciwgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkKKwlpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAorCWludCByZXBlYXRfbnVtYmVyLCBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKQogewotICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gZGF0YTsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBlbmRwLT51MTMyOwotICAgICAgICBkb3duKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfaGNkX2ZvcmdldF91cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoZW5kcC0+ZGVxdWV1ZWluZykgewotICAgICAgICAgICAgICAgIGVuZHAtPmRlcXVldWVpbmcgPSAwOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CisJc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGRhdGE7CisJc3RydWN0IHUxMzIgKnUxMzIgPSBlbmRwLT51MTMyOworCW11dGV4X2xvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7CisJCWVuZHAtPmRlcXVldWVpbmcgPSAwOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgIgogCQkJCSJ1cmI9JXBcbiIsIHVyYik7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKwkJcmV0dXJuOwogCX0gZWxzZSBpZiAoIXVyYi0+dW5saW5rZWQpIHsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIHsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOworCQlyZXR1cm47CisJfSBlbHNlIHsKIAkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJDQUxMQkFDSyBjYWxsZWQgdXJiPSVwICIKIAkJCQkidW5saW5rZWQ9JWRcbiIsIHVyYiwgdXJiLT51bmxpbmtlZCk7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CiAJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorCQlyZXR1cm47CisJfQogfQogCiBzdGF0aWMgdm9pZCB1MTMyX2hjZF9jb25maWd1cmVfc2V0dXBfc2VudCh2b2lkICpkYXRhLCBzdHJ1Y3QgdXJiICp1cmIsIHU4ICpidWYsCi0gICAgICAgIGludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCi0gICAgICAgIGludCByZXBlYXRfbnVtYmVyLCBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKQorCWludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCisJaW50IHJlcGVhdF9udW1iZXIsIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBkYXRhOwotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7Ci0gICAgICAgIHU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOwotICAgICAgICBkb3duKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfaGNkX2ZvcmdldF91cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoZW5kcC0+ZGVxdWV1ZWluZykgewotICAgICAgICAgICAgICAgIGVuZHAtPmRlcXVldWVpbmcgPSAwOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CisJc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGRhdGE7CisJc3RydWN0IHUxMzIgKnUxMzIgPSBlbmRwLT51MTMyOworCXU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOworCW11dGV4X2xvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7CisJCWVuZHAtPmRlcXVldWVpbmcgPSAwOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgIgogCQkJCSJ1cmI9JXBcbiIsIHVyYik7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKwkJcmV0dXJuOwogCX0gZWxzZSBpZiAoIXVyYi0+dW5saW5rZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAodXNiX3BpcGVpbih1cmItPnBpcGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV0dmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfcmluZyAqcmluZyA9IGVuZHAtPnJpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gdXNiX2Z0ZGlfZWxhbl9lZHNldF9pbnB1dCh1MTMyLT5wbGF0Zm9ybV9kZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpbmctPm51bWJlciwgZW5kcCwgdXJiLCBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT51c2JfZW5kcCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfY29uZmlndXJlX2lucHV0X3JlY3YpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgcmV0dmFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmcgPSBlbmRwLT5yaW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHVzYl9mdGRpX2VsYW5fZWRzZXRfaW5wdXQodTEzMi0+cGxhdGZvcm1fZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5udW1iZXIsIGVuZHAsIHVyYiwgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dXNiX2VuZHAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2NvbmZpZ3VyZV9lbXB0eV9yZWN2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIHJldHZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeworCQlpZiAodXNiX3BpcGVpbih1cmItPnBpcGUpKSB7CisJCQlpbnQgcmV0dmFsOworCQkJc3RydWN0IHUxMzJfcmluZyAqcmluZyA9IGVuZHAtPnJpbmc7CisJCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJCXJldHZhbCA9IHVzYl9mdGRpX2VsYW5fZWRzZXRfaW5wdXQodTEzMi0+cGxhdGZvcm1fZGV2LAorCQkJCXJpbmctPm51bWJlciwgZW5kcCwgdXJiLCBhZGRyZXNzLAorCQkJCWVuZHAtPnVzYl9lbmRwLCAwLAorCQkJCXUxMzJfaGNkX2NvbmZpZ3VyZV9pbnB1dF9yZWN2KTsKKwkJCWlmIChyZXR2YWwgIT0gMCkKKwkJCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCByZXR2YWwpOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJaW50IHJldHZhbDsKKwkJCXN0cnVjdCB1MTMyX3JpbmcgKnJpbmcgPSBlbmRwLT5yaW5nOworCQkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCQlyZXR2YWwgPSB1c2JfZnRkaV9lbGFuX2Vkc2V0X2lucHV0KHUxMzItPnBsYXRmb3JtX2RldiwKKwkJCQlyaW5nLT5udW1iZXIsIGVuZHAsIHVyYiwgYWRkcmVzcywKKwkJCQllbmRwLT51c2JfZW5kcCwgMCwKKwkJCQl1MTMyX2hjZF9jb25maWd1cmVfZW1wdHlfcmVjdik7CisJCQlpZiAocmV0dmFsICE9IDApCisJCQkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgcmV0dmFsKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiQ0FMTEJBQ0sgY2FsbGVkIHVyYj0lcCAiCiAJCQkJInVubGlua2VkPSVkXG4iLCB1cmIsIHVyYi0+dW5saW5rZWQpOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwogCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKwkJcmV0dXJuOworCX0KIH0KIAogc3RhdGljIHZvaWQgdTEzMl9oY2RfZW51bWVyYXRpb25fZW1wdHlfcmVjdih2b2lkICpkYXRhLCBzdHJ1Y3QgdXJiICp1cmIsCi0gICAgICAgIHU4ICpidWYsIGludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCi0gICAgICAgIGludCByZXBlYXRfbnVtYmVyLCBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKQorCXU4ICpidWYsIGludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCisJaW50IHJlcGVhdF9udW1iZXIsIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBkYXRhOwotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7Ci0gICAgICAgIHU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOwotICAgICAgICBzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2ID0gJnUxMzItPnVkZXZbYWRkcmVzc107Ci0gICAgICAgIGRvd24oJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7Ci0gICAgICAgICAgICAgICAgZW5kcC0+ZGVxdWV1ZWluZyA9IDA7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRUlOVFIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKKwlzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gZGF0YTsKKwlzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7CisJdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbZW5kcC0+dXNiX2FkZHJdLmFkZHJlc3M7CisJc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W2FkZHJlc3NdOworCW11dGV4X2xvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7CisJCWVuZHAtPmRlcXVldWVpbmcgPSAwOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgIgogCQkJCSJ1cmI9JXBcbiIsIHVyYik7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKwkJcmV0dXJuOwogCX0gZWxzZSBpZiAoIXVyYi0+dW5saW5rZWQpIHsKLSAgICAgICAgICAgICAgICB1MTMyLT5hZGRyWzBdLmFkZHJlc3MgPSAwOwotICAgICAgICAgICAgICAgIGVuZHAtPnVzYl9hZGRyID0gdWRldi0+dXNiX2FkZHI7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSB7CisJCXUxMzItPmFkZHJbMF0uYWRkcmVzcyA9IDA7CisJCWVuZHAtPnVzYl9hZGRyID0gdWRldi0+dXNiX2FkZHI7CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAwKTsKKwkJcmV0dXJuOworCX0gZWxzZSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiQ0FMTEJBQ0sgY2FsbGVkIHVyYj0lcCAiCiAJCQkJInVubGlua2VkPSVkXG4iLCB1cmIsIHVyYi0+dW5saW5rZWQpOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwogCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKwkJcmV0dXJuOworCX0KIH0KIAogc3RhdGljIHZvaWQgdTEzMl9oY2RfZW51bWVyYXRpb25fYWRkcmVzc19zZW50KHZvaWQgKmRhdGEsIHN0cnVjdCB1cmIgKnVyYiwKLSAgICAgICAgdTggKmJ1ZiwgaW50IGxlbiwgaW50IHRvZ2dsZV9iaXRzLCBpbnQgZXJyb3JfY291bnQsIGludCBjb25kaXRpb25fY29kZSwKLSAgICAgICAgaW50IHJlcGVhdF9udW1iZXIsIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpCisJdTggKmJ1ZiwgaW50IGxlbiwgaW50IHRvZ2dsZV9iaXRzLCBpbnQgZXJyb3JfY291bnQsIGludCBjb25kaXRpb25fY29kZSwKKwlpbnQgcmVwZWF0X251bWJlciwgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkKIHsKLSAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGRhdGE7Ci0gICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gZW5kcC0+dTEzMjsKLSAgICAgICAgZG93bigmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAxKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgLCB1MTMyLT5nb2luZyk7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9mb3JnZXRfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKGVuZHAtPmRlcXVldWVpbmcpIHsKLSAgICAgICAgICAgICAgICBlbmRwLT5kZXF1ZXVlaW5nID0gMDsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FSU5UUik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworCXN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBkYXRhOworCXN0cnVjdCB1MTMyICp1MTMyID0gZW5kcC0+dTEzMjsKKwltdXRleF9sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJaWYgKHUxMzItPmdvaW5nID4gMSkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCisJCQksIHUxMzItPmdvaW5nKTsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfaGNkX2ZvcmdldF91cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoZW5kcC0+ZGVxdWV1ZWluZykgeworCQllbmRwLT5kZXF1ZXVlaW5nID0gMDsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FSU5UUik7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgewogCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkICIKIAkJCQkidXJiPSVwXG4iLCB1cmIpOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7CisJCXJldHVybjsKIAl9IGVsc2UgaWYgKCF1cmItPnVubGlua2VkKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZW5kcC0+cmluZzsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHJldHZhbCA9IHVzYl9mdGRpX2VsYW5fZWRzZXRfaW5wdXQodTEzMi0+cGxhdGZvcm1fZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgcmluZy0+bnVtYmVyLCBlbmRwLCB1cmIsIDAsIGVuZHAtPnVzYl9lbmRwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZW51bWVyYXRpb25fZW1wdHlfcmVjdik7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCByZXR2YWwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIHsKKwkJaW50IHJldHZhbDsKKwkJc3RydWN0IHUxMzJfcmluZyAqcmluZyA9IGVuZHAtPnJpbmc7CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQlyZXR2YWwgPSB1c2JfZnRkaV9lbGFuX2Vkc2V0X2lucHV0KHUxMzItPnBsYXRmb3JtX2RldiwKKwkJCXJpbmctPm51bWJlciwgZW5kcCwgdXJiLCAwLCBlbmRwLT51c2JfZW5kcCwgMCwKKwkJCXUxMzJfaGNkX2VudW1lcmF0aW9uX2VtcHR5X3JlY3YpOworCQlpZiAocmV0dmFsICE9IDApCisJCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCByZXR2YWwpOworCQlyZXR1cm47CisJfSBlbHNlIHsKIAkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJDQUxMQkFDSyBjYWxsZWQgdXJiPSVwICIKIAkJCQkidW5saW5rZWQ9JWRcbiIsIHVyYiwgdXJiLT51bmxpbmtlZCk7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CiAJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorCQlyZXR1cm47CisJfQogfQogCiBzdGF0aWMgdm9pZCB1MTMyX2hjZF9pbml0aWFsX2VtcHR5X3NlbnQodm9pZCAqZGF0YSwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLAotICAgICAgICBpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAotICAgICAgICBpbnQgcmVwZWF0X251bWJlciwgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkKKwlpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAorCWludCByZXBlYXRfbnVtYmVyLCBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKQogewotICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gZGF0YTsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBlbmRwLT51MTMyOwotICAgICAgICBkb3duKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfaGNkX2ZvcmdldF91cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoZW5kcC0+ZGVxdWV1ZWluZykgewotICAgICAgICAgICAgICAgIGVuZHAtPmRlcXVldWVpbmcgPSAwOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CisJc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGRhdGE7CisJc3RydWN0IHUxMzIgKnUxMzIgPSBlbmRwLT51MTMyOworCW11dGV4X2xvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7CisJCWVuZHAtPmRlcXVldWVpbmcgPSAwOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgIgogCQkJCSJ1cmI9JXBcbiIsIHVyYik7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKwkJcmV0dXJuOwogCX0gZWxzZSBpZiAoIXVyYi0+dW5saW5rZWQpIHsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIHsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOworCQlyZXR1cm47CisJfSBlbHNlIHsKIAkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJDQUxMQkFDSyBjYWxsZWQgdXJiPSVwICIKIAkJCQkidW5saW5rZWQ9JWRcbiIsIHVyYiwgdXJiLT51bmxpbmtlZCk7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CiAJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorCQlyZXR1cm47CisJfQogfQogCiBzdGF0aWMgdm9pZCB1MTMyX2hjZF9pbml0aWFsX2lucHV0X3JlY3Yodm9pZCAqZGF0YSwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLAotICAgICAgICBpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAotICAgICAgICBpbnQgcmVwZWF0X251bWJlciwgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkKKwlpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAorCWludCByZXBlYXRfbnVtYmVyLCBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKQogewotICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gZGF0YTsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBlbmRwLT51MTMyOwotICAgICAgICB1OCBhZGRyZXNzID0gdTEzMi0+YWRkcltlbmRwLT51c2JfYWRkcl0uYWRkcmVzczsKLSAgICAgICAgZG93bigmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAxKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgLCB1MTMyLT5nb2luZyk7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9mb3JnZXRfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKGVuZHAtPmRlcXVldWVpbmcpIHsKLSAgICAgICAgICAgICAgICBlbmRwLT5kZXF1ZXVlaW5nID0gMDsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FSU5UUik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworCXN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBkYXRhOworCXN0cnVjdCB1MTMyICp1MTMyID0gZW5kcC0+dTEzMjsKKwl1OCBhZGRyZXNzID0gdTEzMi0+YWRkcltlbmRwLT51c2JfYWRkcl0uYWRkcmVzczsKKwltdXRleF9sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJaWYgKHUxMzItPmdvaW5nID4gMSkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCisJCQksIHUxMzItPmdvaW5nKTsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfaGNkX2ZvcmdldF91cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoZW5kcC0+ZGVxdWV1ZWluZykgeworCQllbmRwLT5kZXF1ZXVlaW5nID0gMDsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FSU5UUik7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgewogCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkICIKIAkJCQkidXJiPSVwXG4iLCB1cmIpOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7CisJCXJldHVybjsKIAl9IGVsc2UgaWYgKCF1cmItPnVubGlua2VkKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZW5kcC0+cmluZzsKLSAgICAgICAgICAgICAgICB1OCAqdSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwotICAgICAgICAgICAgICAgIHU4ICpiID0gYnVmOwotICAgICAgICAgICAgICAgIGludCBMID0gbGVuOwotICAgICAgICAgICAgICAgIHdoaWxlIChMLS0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqdSsrID0gKmIrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXJiLT5hY3R1YWxfbGVuZ3RoID0gbGVuOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gdXNiX2Z0ZGlfZWxhbl9lZHNldF9lbXB0eSh1MTMyLT5wbGF0Zm9ybV9kZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5udW1iZXIsIGVuZHAsIHVyYiwgYWRkcmVzcywgZW5kcC0+dXNiX2VuZHAsIDB4MywKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2luaXRpYWxfZW1wdHlfc2VudCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCByZXR2YWwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIHsKKwkJaW50IHJldHZhbDsKKwkJc3RydWN0IHUxMzJfcmluZyAqcmluZyA9IGVuZHAtPnJpbmc7CisJCXU4ICp1ID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJCXU4ICpiID0gYnVmOworCQlpbnQgTCA9IGxlbjsKKworCQl3aGlsZSAoTC0tID4gMCkKKwkJCSp1KysgPSAqYisrOworCisJCXVyYi0+YWN0dWFsX2xlbmd0aCA9IGxlbjsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXJldHZhbCA9IHVzYl9mdGRpX2VsYW5fZWRzZXRfZW1wdHkodTEzMi0+cGxhdGZvcm1fZGV2LAorCQkJcmluZy0+bnVtYmVyLCBlbmRwLCB1cmIsIGFkZHJlc3MsIGVuZHAtPnVzYl9lbmRwLCAweDMsCisJCQl1MTMyX2hjZF9pbml0aWFsX2VtcHR5X3NlbnQpOworCQlpZiAocmV0dmFsICE9IDApCisJCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCByZXR2YWwpOworCQlyZXR1cm47CisJfSBlbHNlIHsKIAkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJDQUxMQkFDSyBjYWxsZWQgdXJiPSVwICIKIAkJCQkidW5saW5rZWQ9JWRcbiIsIHVyYiwgdXJiLT51bmxpbmtlZCk7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CiAJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorCQlyZXR1cm47CisJfQogfQogCiBzdGF0aWMgdm9pZCB1MTMyX2hjZF9pbml0aWFsX3NldHVwX3NlbnQodm9pZCAqZGF0YSwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLAotICAgICAgICBpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAotICAgICAgICBpbnQgcmVwZWF0X251bWJlciwgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkKKwlpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAorCWludCByZXBlYXRfbnVtYmVyLCBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKQogewotICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gZGF0YTsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBlbmRwLT51MTMyOwotICAgICAgICB1OCBhZGRyZXNzID0gdTEzMi0+YWRkcltlbmRwLT51c2JfYWRkcl0uYWRkcmVzczsKLSAgICAgICAgZG93bigmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAxKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgLCB1MTMyLT5nb2luZyk7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9mb3JnZXRfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKGVuZHAtPmRlcXVldWVpbmcpIHsKLSAgICAgICAgICAgICAgICBlbmRwLT5kZXF1ZXVlaW5nID0gMDsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FSU5UUik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworCXN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBkYXRhOworCXN0cnVjdCB1MTMyICp1MTMyID0gZW5kcC0+dTEzMjsKKwl1OCBhZGRyZXNzID0gdTEzMi0+YWRkcltlbmRwLT51c2JfYWRkcl0uYWRkcmVzczsKKwltdXRleF9sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJaWYgKHUxMzItPmdvaW5nID4gMSkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCisJCQksIHUxMzItPmdvaW5nKTsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfaGNkX2ZvcmdldF91cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoZW5kcC0+ZGVxdWV1ZWluZykgeworCQllbmRwLT5kZXF1ZXVlaW5nID0gMDsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FSU5UUik7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgewogCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkICIKIAkJCQkidXJiPSVwXG4iLCB1cmIpOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7CisJCXJldHVybjsKIAl9IGVsc2UgaWYgKCF1cmItPnVubGlua2VkKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZW5kcC0+cmluZzsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHJldHZhbCA9IHVzYl9mdGRpX2VsYW5fZWRzZXRfaW5wdXQodTEzMi0+cGxhdGZvcm1fZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgcmluZy0+bnVtYmVyLCBlbmRwLCB1cmIsIGFkZHJlc3MsIGVuZHAtPnVzYl9lbmRwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfaW5pdGlhbF9pbnB1dF9yZWN2KTsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IDApIHsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIHJldHZhbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgeworCQlpbnQgcmV0dmFsOworCQlzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZW5kcC0+cmluZzsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXJldHZhbCA9IHVzYl9mdGRpX2VsYW5fZWRzZXRfaW5wdXQodTEzMi0+cGxhdGZvcm1fZGV2LAorCQkJcmluZy0+bnVtYmVyLCBlbmRwLCB1cmIsIGFkZHJlc3MsIGVuZHAtPnVzYl9lbmRwLCAwLAorCQkJdTEzMl9oY2RfaW5pdGlhbF9pbnB1dF9yZWN2KTsKKwkJaWYgKHJldHZhbCAhPSAwKQorCQkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgcmV0dmFsKTsKKwkJcmV0dXJuOworCX0gZWxzZSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiQ0FMTEJBQ0sgY2FsbGVkIHVyYj0lcCAiCiAJCQkJInVubGlua2VkPSVkXG4iLCB1cmIsIHVyYi0+dW5saW5rZWQpOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwogCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKwkJcmV0dXJuOworCX0KIH0KIAogLyoKQEAgLTEzMDgsMzAyICsxMzA0LDI5NiBAQAogKi8KIHN0YXRpYyB2b2lkIHUxMzJfaGNkX3Jpbmdfd29ya19zY2hlZHVsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0KKwlzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1MTMyX3JpbmcsIHNjaGVkdWxlci53b3JrKTsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSByaW5nLT51MTMyOwotICAgICAgICBkb3duKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgIGlmIChyaW5nLT5pbl91c2UpIHsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfcmluZ19wdXRfa3JlZih1MTMyLCByaW5nKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAocmluZy0+Y3Vycl9lbmRwKSB7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqbGFzdF9lbmRwID0gcmluZy0+Y3Vycl9lbmRwOwotICAgICAgICAgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKnNjYW47Ci0gICAgICAgICAgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9ICZsYXN0X2VuZHAtPmVuZHBfcmluZzsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHdha2V1cCA9IDA7Ci0gICAgICAgICAgICAgICAgbGlzdF9mb3JfZWFjaChzY2FuLCBoZWFkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gbGlzdF9lbnRyeShzY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwLCBlbmRwX3JpbmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZHAtPnF1ZXVlX25leHQgPT0gZW5kcC0+cXVldWVfbGFzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZW5kcC0+ZGVsYXllZCA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGVuZHAtPmppZmZpZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpbmctPmN1cnJfZW5kcCA9IGVuZHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfZW5kcF9jYW5jZWxfd29yayh1MTMyLCBsYXN0X2VuZHApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2VuZHBfcXVldWVfd29yayh1MTMyLCBsYXN0X2VuZHAsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX3JpbmdfcHV0X2tyZWYodTEzMiwgcmluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZGVsdGEgPSBlbmRwLT5qaWZmaWVzIC0gamlmZmllczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhID4gd2FrZXVwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdha2V1cCA9IGRlbHRhOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobGFzdF9lbmRwLT5xdWV1ZV9uZXh0ID09IGxhc3RfZW5kcC0+cXVldWVfbGFzdCkgewotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGxhc3RfZW5kcC0+ZGVsYXllZCA9PSAwKSB8fCB0aW1lX2FmdGVyX2VxKGppZmZpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2VuZHAtPmppZmZpZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2VuZHBfY2FuY2VsX3dvcmsodTEzMiwgbGFzdF9lbmRwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfZW5kcF9xdWV1ZV93b3JrKHUxMzIsIGxhc3RfZW5kcCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9yaW5nX3B1dF9rcmVmKHUxMzIsIHJpbmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGRlbHRhID0gbGFzdF9lbmRwLT5qaWZmaWVzIC0gamlmZmllczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSA+IHdha2V1cCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FrZXVwID0gZGVsdGE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh3YWtldXAgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1MTMyX3JpbmdfcmVxdWV1ZV93b3JrKHUxMzIsIHJpbmcsIHdha2V1cCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9yaW5nX3B1dF9rcmVmKHUxMzIsIHJpbmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfcmluZ19wdXRfa3JlZih1MTMyLCByaW5nKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKwlzdHJ1Y3QgdTEzMiAqdTEzMiA9IHJpbmctPnUxMzI7CisJbXV0ZXhfbG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCWlmIChyaW5nLT5pbl91c2UpIHsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfcmluZ19wdXRfa3JlZih1MTMyLCByaW5nKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAocmluZy0+Y3Vycl9lbmRwKSB7CisJCXN0cnVjdCB1MTMyX2VuZHAgKmxhc3RfZW5kcCA9IHJpbmctPmN1cnJfZW5kcDsKKwkJc3RydWN0IGxpc3RfaGVhZCAqc2NhbjsKKwkJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9ICZsYXN0X2VuZHAtPmVuZHBfcmluZzsKKwkJdW5zaWduZWQgbG9uZyB3YWtldXAgPSAwOworCQlsaXN0X2Zvcl9lYWNoKHNjYW4sIGhlYWQpIHsKKwkJCXN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBsaXN0X2VudHJ5KHNjYW4sCisJCQkJc3RydWN0IHUxMzJfZW5kcCwgZW5kcF9yaW5nKTsKKwkJCWlmIChlbmRwLT5xdWV1ZV9uZXh0ID09IGVuZHAtPnF1ZXVlX2xhc3QpIHsKKwkJCX0gZWxzZSBpZiAoKGVuZHAtPmRlbGF5ZWQgPT0gMCkKKwkJCQl8fCB0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGVuZHAtPmppZmZpZXMpKSB7CisJCQkJcmluZy0+Y3Vycl9lbmRwID0gZW5kcDsKKwkJCQl1MTMyX2VuZHBfY2FuY2VsX3dvcmsodTEzMiwgbGFzdF9lbmRwKTsKKwkJCQl1MTMyX2VuZHBfcXVldWVfd29yayh1MTMyLCBsYXN0X2VuZHAsIDApOworCQkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJCXUxMzJfcmluZ19wdXRfa3JlZih1MTMyLCByaW5nKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCXVuc2lnbmVkIGxvbmcgZGVsdGEgPSBlbmRwLT5qaWZmaWVzIC0gamlmZmllczsKKwkJCQlpZiAoZGVsdGEgPiB3YWtldXApCisJCQkJCXdha2V1cCA9IGRlbHRhOworCQkJfQorCQl9CisJCWlmIChsYXN0X2VuZHAtPnF1ZXVlX25leHQgPT0gbGFzdF9lbmRwLT5xdWV1ZV9sYXN0KSB7CisJCX0gZWxzZSBpZiAoKGxhc3RfZW5kcC0+ZGVsYXllZCA9PSAwKSB8fCB0aW1lX2FmdGVyX2VxKGppZmZpZXMsCisJCQlsYXN0X2VuZHAtPmppZmZpZXMpKSB7CisJCQl1MTMyX2VuZHBfY2FuY2VsX3dvcmsodTEzMiwgbGFzdF9lbmRwKTsKKwkJCXUxMzJfZW5kcF9xdWV1ZV93b3JrKHUxMzIsIGxhc3RfZW5kcCwgMCk7CisJCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJCXUxMzJfcmluZ19wdXRfa3JlZih1MTMyLCByaW5nKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCXVuc2lnbmVkIGxvbmcgZGVsdGEgPSBsYXN0X2VuZHAtPmppZmZpZXMgLSBqaWZmaWVzOworCQkJaWYgKGRlbHRhID4gd2FrZXVwKQorCQkJCXdha2V1cCA9IGRlbHRhOworCQl9CisJCWlmICh3YWtldXAgPiAwKSB7CisJCQl1MTMyX3JpbmdfcmVxdWV1ZV93b3JrKHUxMzIsIHJpbmcsIHdha2V1cCk7CisJCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJdTEzMl9yaW5nX3B1dF9rcmVmKHUxMzIsIHJpbmcpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfcmluZ19wdXRfa3JlZih1MTMyLCByaW5nKTsKKwkJcmV0dXJuOworCX0KIH0KIAogc3RhdGljIHZvaWQgdTEzMl9oY2RfZW5kcF93b3JrX3NjaGVkdWxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmc7Ci0gICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPQorCXN0cnVjdCB1MTMyX3JpbmcgKnJpbmc7CisJc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdTEzMl9lbmRwLCBzY2hlZHVsZXIud29yayk7Ci0gICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gZW5kcC0+dTEzMjsKLSAgICAgICAgZG93bigmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICByaW5nID0gZW5kcC0+cmluZzsKLSAgICAgICAgaWYgKGVuZHAtPmVkc2V0X2ZsdXNoKSB7Ci0gICAgICAgICAgICAgICAgZW5kcC0+ZWRzZXRfZmx1c2ggPSAwOwotICAgICAgICAgICAgICAgIGlmIChlbmRwLT5kZXF1ZXVlaW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgdXNiX2Z0ZGlfZWxhbl9lZHNldF9mbHVzaCh1MTMyLT5wbGF0Zm9ybV9kZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpbmctPm51bWJlciwgZW5kcCk7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2VuZHBfcHV0X2tyZWYodTEzMiwgZW5kcCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKGVuZHAtPmFjdGl2ZSkgewotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9lbmRwX3B1dF9rcmVmKHUxMzIsIGVuZHApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmIChyaW5nLT5pbl91c2UpIHsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfZW5kcF9wdXRfa3JlZih1MTMyLCBlbmRwKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoZW5kcC0+cXVldWVfbmV4dCA9PSBlbmRwLT5xdWV1ZV9sYXN0KSB7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2VuZHBfcHV0X2tyZWYodTEzMiwgZW5kcCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKGVuZHAtPnBpcGV0eXBlID09IFBJUEVfSU5URVJSVVBUKSB7Ci0gICAgICAgICAgICAgICAgdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbZW5kcC0+dXNiX2FkZHJdLmFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgaWYgKHJpbmctPmluX3VzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfZW5kcF9wdXRfa3JlZih1MTMyLCBlbmRwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1cmIgKnVyYiA9IGVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX25leHRdOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+YWN0aXZlID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJpbmctPmN1cnJfZW5kcCA9IGVuZHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5pbl91c2UgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGVkc2V0X3NpbmdsZSh1MTMyLCByaW5nLCBlbmRwLCB1cmIsIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnRvZ2dsZV9iaXRzLCB1MTMyX2hjZF9pbnRlcnJ1cHRfcmVjdik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCByZXR2YWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChlbmRwLT5waXBldHlwZSA9PSBQSVBFX0NPTlRST0wpIHsKLSAgICAgICAgICAgICAgICB1OCBhZGRyZXNzID0gdTEzMi0+YWRkcltlbmRwLT51c2JfYWRkcl0uYWRkcmVzczsKLSAgICAgICAgICAgICAgICBpZiAocmluZy0+aW5fdXNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9lbmRwX3B1dF9rcmVmKHUxMzIsIGVuZHApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWRkcmVzcyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV0dmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHVyYiAqdXJiID0gZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+cXVldWVfbmV4dF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5hY3RpdmUgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgcmluZy0+Y3Vycl9lbmRwID0gZW5kcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJpbmctPmluX3VzZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gZWRzZXRfc2V0dXAodTEzMiwgcmluZywgZW5kcCwgdXJiLCBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIsIHUxMzJfaGNkX2luaXRpYWxfc2V0dXBfc2VudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCByZXR2YWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5kcC0+dXNiX2FkZHIgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1cmIgKnVyYiA9IGVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX25leHRdOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+YWN0aXZlID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJpbmctPmN1cnJfZW5kcCA9IGVuZHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5pbl91c2UgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGVkc2V0X3NldHVwKHUxMzIsIHJpbmcsIGVuZHAsIHVyYiwgMCwgMHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2hjZF9lbnVtZXJhdGlvbl9hZGRyZXNzX3NlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgcmV0dmFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHVyYiAqdXJiID0gZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+cXVldWVfbmV4dF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5hY3RpdmUgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgcmluZy0+Y3Vycl9lbmRwID0gZW5kcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJpbmctPmluX3VzZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gZWRzZXRfc2V0dXAodTEzMiwgcmluZywgZW5kcCwgdXJiLCBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIsIHUxMzJfaGNkX2NvbmZpZ3VyZV9zZXR1cF9zZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIHJldHZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChlbmRwLT5pbnB1dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbZW5kcC0+dXNiX2FkZHJdLmFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmluZy0+aW5fdXNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfZW5kcF9wdXRfa3JlZih1MTMyLCBlbmRwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHVyYiAqdXJiID0gZW5kcC0+dXJiX2xpc3RbCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EUF9RVUVVRV9NQVNLICYgZW5kcC0+cXVldWVfbmV4dF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPmFjdGl2ZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpbmctPmN1cnJfZW5kcCA9IGVuZHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpbmctPmluX3VzZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGVkc2V0X2lucHV0KHUxMzIsIHJpbmcsIGVuZHAsIHVyYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCBlbmRwLT50b2dnbGVfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2hjZF9idWxrX2lucHV0X3JlY3YpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgLyogb3V0cHV0IHBpcGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJpbmctPmluX3VzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2VuZHBfcHV0X2tyZWYodTEzMiwgZW5kcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXR2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1cmIgKnVyYiA9IGVuZHAtPnVyYl9saXN0WwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX25leHRdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5hY3RpdmUgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5jdXJyX2VuZHAgPSBlbmRwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5pbl91c2UgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBlZHNldF9vdXRwdXQodTEzMiwgcmluZywgZW5kcCwgdXJiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsIGVuZHAtPnRvZ2dsZV9iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2J1bGtfb3V0cHV0X3NlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KKwlzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7CisJbXV0ZXhfbG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCXJpbmcgPSBlbmRwLT5yaW5nOworCWlmIChlbmRwLT5lZHNldF9mbHVzaCkgeworCQllbmRwLT5lZHNldF9mbHVzaCA9IDA7CisJCWlmIChlbmRwLT5kZXF1ZXVlaW5nKQorCQkJdXNiX2Z0ZGlfZWxhbl9lZHNldF9mbHVzaCh1MTMyLT5wbGF0Zm9ybV9kZXYsCisJCQkJcmluZy0+bnVtYmVyLCBlbmRwKTsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfZW5kcF9wdXRfa3JlZih1MTMyLCBlbmRwKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoZW5kcC0+YWN0aXZlKSB7CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQl1MTMyX2VuZHBfcHV0X2tyZWYodTEzMiwgZW5kcCk7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKHJpbmctPmluX3VzZSkgeworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9lbmRwX3B1dF9rcmVmKHUxMzIsIGVuZHApOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChlbmRwLT5xdWV1ZV9uZXh0ID09IGVuZHAtPnF1ZXVlX2xhc3QpIHsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfZW5kcF9wdXRfa3JlZih1MTMyLCBlbmRwKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoZW5kcC0+cGlwZXR5cGUgPT0gUElQRV9JTlRFUlJVUFQpIHsKKwkJdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbZW5kcC0+dXNiX2FkZHJdLmFkZHJlc3M7CisJCWlmIChyaW5nLT5pbl91c2UpIHsKKwkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJdTEzMl9lbmRwX3B1dF9rcmVmKHUxMzIsIGVuZHApOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJaW50IHJldHZhbDsKKwkJCXN0cnVjdCB1cmIgKnVyYiA9IGVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmCisJCQkJZW5kcC0+cXVldWVfbmV4dF07CisJCQllbmRwLT5hY3RpdmUgPSAxOworCQkJcmluZy0+Y3Vycl9lbmRwID0gZW5kcDsKKwkJCXJpbmctPmluX3VzZSA9IDE7CisJCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJCXJldHZhbCA9IGVkc2V0X3NpbmdsZSh1MTMyLCByaW5nLCBlbmRwLCB1cmIsIGFkZHJlc3MsCisJCQkJZW5kcC0+dG9nZ2xlX2JpdHMsIHUxMzJfaGNkX2ludGVycnVwdF9yZWN2KTsKKwkJCWlmIChyZXR2YWwgIT0gMCkKKwkJCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCByZXR2YWwpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIGlmIChlbmRwLT5waXBldHlwZSA9PSBQSVBFX0NPTlRST0wpIHsKKwkJdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbZW5kcC0+dXNiX2FkZHJdLmFkZHJlc3M7CisJCWlmIChyaW5nLT5pbl91c2UpIHsKKwkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJdTEzMl9lbmRwX3B1dF9rcmVmKHUxMzIsIGVuZHApOworCQkJcmV0dXJuOworCQl9IGVsc2UgaWYgKGFkZHJlc3MgPT0gMCkgeworCQkJaW50IHJldHZhbDsKKwkJCXN0cnVjdCB1cmIgKnVyYiA9IGVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmCisJCQkJZW5kcC0+cXVldWVfbmV4dF07CisJCQllbmRwLT5hY3RpdmUgPSAxOworCQkJcmluZy0+Y3Vycl9lbmRwID0gZW5kcDsKKwkJCXJpbmctPmluX3VzZSA9IDE7CisJCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJCXJldHZhbCA9IGVkc2V0X3NldHVwKHUxMzIsIHJpbmcsIGVuZHAsIHVyYiwgYWRkcmVzcywKKwkJCQkweDIsIHUxMzJfaGNkX2luaXRpYWxfc2V0dXBfc2VudCk7CisJCQlpZiAocmV0dmFsICE9IDApCisJCQkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgcmV0dmFsKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmIChlbmRwLT51c2JfYWRkciA9PSAwKSB7CisJCQlpbnQgcmV0dmFsOworCQkJc3RydWN0IHVyYiAqdXJiID0gZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYKKwkJCQllbmRwLT5xdWV1ZV9uZXh0XTsKKwkJCWVuZHAtPmFjdGl2ZSA9IDE7CisJCQlyaW5nLT5jdXJyX2VuZHAgPSBlbmRwOworCQkJcmluZy0+aW5fdXNlID0gMTsKKwkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJcmV0dmFsID0gZWRzZXRfc2V0dXAodTEzMiwgcmluZywgZW5kcCwgdXJiLCAwLCAweDIsCisJCQkJdTEzMl9oY2RfZW51bWVyYXRpb25fYWRkcmVzc19zZW50KTsKKwkJCWlmIChyZXR2YWwgIT0gMCkKKwkJCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCByZXR2YWwpOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJaW50IHJldHZhbDsKKwkJCXU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOworCQkJc3RydWN0IHVyYiAqdXJiID0gZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYKKwkJCQllbmRwLT5xdWV1ZV9uZXh0XTsKKwkJCWVuZHAtPmFjdGl2ZSA9IDE7CisJCQlyaW5nLT5jdXJyX2VuZHAgPSBlbmRwOworCQkJcmluZy0+aW5fdXNlID0gMTsKKwkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJcmV0dmFsID0gZWRzZXRfc2V0dXAodTEzMiwgcmluZywgZW5kcCwgdXJiLCBhZGRyZXNzLAorCQkJCTB4MiwgdTEzMl9oY2RfY29uZmlndXJlX3NldHVwX3NlbnQpOworCQkJaWYgKHJldHZhbCAhPSAwKQorCQkJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIHJldHZhbCk7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZW5kcC0+aW5wdXQpIHsKKwkJCXU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOworCQkJaWYgKHJpbmctPmluX3VzZSkgeworCQkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJCXUxMzJfZW5kcF9wdXRfa3JlZih1MTMyLCBlbmRwKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCWludCByZXR2YWw7CisJCQkJc3RydWN0IHVyYiAqdXJiID0gZW5kcC0+dXJiX2xpc3RbCisJCQkJCUVORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX25leHRdOworCQkJCWVuZHAtPmFjdGl2ZSA9IDE7CisJCQkJcmluZy0+Y3Vycl9lbmRwID0gZW5kcDsKKwkJCQlyaW5nLT5pbl91c2UgPSAxOworCQkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJCXJldHZhbCA9IGVkc2V0X2lucHV0KHUxMzIsIHJpbmcsIGVuZHAsIHVyYiwKKwkJCQkJYWRkcmVzcywgZW5kcC0+dG9nZ2xlX2JpdHMsCisJCQkJCXUxMzJfaGNkX2J1bGtfaW5wdXRfcmVjdik7CisJCQkJaWYgKHJldHZhbCA9PSAwKSB7CisJCQkJfSBlbHNlCisJCQkJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCisJCQkJCQlyZXR2YWwpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfSBlbHNlIHsJLyogb3V0cHV0IHBpcGUgKi8KKwkJCXU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOworCQkJaWYgKHJpbmctPmluX3VzZSkgeworCQkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJCXUxMzJfZW5kcF9wdXRfa3JlZih1MTMyLCBlbmRwKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCWludCByZXR2YWw7CisJCQkJc3RydWN0IHVyYiAqdXJiID0gZW5kcC0+dXJiX2xpc3RbCisJCQkJCUVORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX25leHRdOworCQkJCWVuZHAtPmFjdGl2ZSA9IDE7CisJCQkJcmluZy0+Y3Vycl9lbmRwID0gZW5kcDsKKwkJCQlyaW5nLT5pbl91c2UgPSAxOworCQkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJCXJldHZhbCA9IGVkc2V0X291dHB1dCh1MTMyLCByaW5nLCBlbmRwLCB1cmIsCisJCQkJCWFkZHJlc3MsIGVuZHAtPnRvZ2dsZV9iaXRzLAorCQkJCQl1MTMyX2hjZF9idWxrX291dHB1dF9zZW50KTsKKwkJCQlpZiAocmV0dmFsID09IDApIHsKKwkJCQl9IGVsc2UKKwkJCQkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwKKwkJCQkJCXJldHZhbCk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQogfQogI2lmZGVmIENPTkZJR19QTQogCiBzdGF0aWMgdm9pZCBwb3J0X3Bvd2VyKHN0cnVjdCB1MTMyICp1MTMyLCBpbnQgcG4sIGludCBpc19vbikKIHsKLSAgICAgICAgdTEzMi0+cG9ydFtwbl0ucG93ZXIgPSBpc19vbjsKKwl1MTMyLT5wb3J0W3BuXS5wb3dlciA9IGlzX29uOwogfQogCiAjZW5kaWYKIAogc3RhdGljIHZvaWQgdTEzMl9wb3dlcihzdHJ1Y3QgdTEzMiAqdTEzMiwgaW50IGlzX29uKQogewotICAgICAgICBzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gdTEzMl90b19oY2QodTEzMikKLSAgICAgICAgICAgICAgICA7ICAgICAgICAvKiBodWIgaXMgaW5hY3RpdmUgdW5sZXNzIHRoZSBwb3J0IGlzIHBvd2VyZWQgKi8KLSAgICAgICAgaWYgKGlzX29uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHUxMzItPnBvd2VyKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIHUxMzItPnBvd2VyID0gMTsKLSAgICAgICAgICAgICAgICBoY2QtPnNlbGYuY29udHJvbGxlci0+cG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHUxMzItPnBvd2VyID0gMDsKLSAgICAgICAgICAgICAgICBoY2QtPnN0YXRlID0gSENfU1RBVEVfSEFMVDsKLSAgICAgICAgICAgICAgICBoY2QtPnNlbGYuY29udHJvbGxlci0+cG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX1NVU1BFTkQ7Ci0gICAgICAgIH0KKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gdTEzMl90b19oY2QodTEzMikKKwkJOwkvKiBodWIgaXMgaW5hY3RpdmUgdW5sZXNzIHRoZSBwb3J0IGlzIHBvd2VyZWQgKi8KKwlpZiAoaXNfb24pIHsKKwkJaWYgKHUxMzItPnBvd2VyKQorCQkJcmV0dXJuOworCQl1MTMyLT5wb3dlciA9IDE7CisJfSBlbHNlIHsKKwkJdTEzMi0+cG93ZXIgPSAwOworCQloY2QtPnN0YXRlID0gSENfU1RBVEVfSEFMVDsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgdTEzMl9wZXJpb2RpY19yZWluaXQoc3RydWN0IHUxMzIgKnUxMzIpCiB7Ci0gICAgICAgIGludCByZXR2YWw7Ci0gICAgICAgIHUzMiBmaSA9IHUxMzItPmhjX2ZtaW50ZXJ2YWwgJiAweDAzZmZmOwotICAgICAgICB1MzIgZml0OwotICAgICAgICB1MzIgZm1pbnRlcnZhbDsKLSAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBmbWludGVydmFsLCAmZm1pbnRlcnZhbCk7Ci0gICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgZml0ID0gZm1pbnRlcnZhbCAmIEZJVDsKLSAgICAgICAgcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgZm1pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAoZml0IF4gRklUKSB8IHUxMzItPmhjX2ZtaW50ZXJ2YWwpOwotICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIHJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIHBlcmlvZGljc3RhcnQsCi0gICAgICAgICAgICAgICAgKCg5ICpmaSkgLyAxMCkgJiAweDNmZmYpOwotICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIHJldHVybiAwOworCWludCByZXR2YWw7CisJdTMyIGZpID0gdTEzMi0+aGNfZm1pbnRlcnZhbCAmIDB4MDNmZmY7CisJdTMyIGZpdDsKKwl1MzIgZm1pbnRlcnZhbDsKKwlyZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGZtaW50ZXJ2YWwsICZmbWludGVydmFsKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCWZpdCA9IGZtaW50ZXJ2YWwgJiBGSVQ7CisJcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgZm1pbnRlcnZhbCwKKwkJKGZpdCBeIEZJVCkgfCB1MTMyLT5oY19mbWludGVydmFsKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCXJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIHBlcmlvZGljc3RhcnQsCisJCSgoOSAqIGZpKSAvIDEwKSAmIDB4M2ZmZik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGNoYXIgKmhjZnMyc3RyaW5nKGludCBzdGF0ZSkKIHsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICBjYXNlIE9IQ0lfVVNCX1JFU0VUOgotICAgICAgICAgICAgICAgIHJldHVybiAicmVzZXQiOwotICAgICAgICBjYXNlIE9IQ0lfVVNCX1JFU1VNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gInJlc3VtZSI7Ci0gICAgICAgIGNhc2UgT0hDSV9VU0JfT1BFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gIm9wZXJhdGlvbmFsIjsKLSAgICAgICAgY2FzZSBPSENJX1VTQl9TVVNQRU5EOgotICAgICAgICAgICAgICAgIHJldHVybiAic3VzcGVuZCI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICI/IjsKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBPSENJX1VTQl9SRVNFVDoKKwkJcmV0dXJuICJyZXNldCI7CisJY2FzZSBPSENJX1VTQl9SRVNVTUU6CisJCXJldHVybiAicmVzdW1lIjsKKwljYXNlIE9IQ0lfVVNCX09QRVI6CisJCXJldHVybiAib3BlcmF0aW9uYWwiOworCWNhc2UgT0hDSV9VU0JfU1VTUEVORDoKKwkJcmV0dXJuICJzdXNwZW5kIjsKKwl9CisJcmV0dXJuICI/IjsKIH0KIAogc3RhdGljIGludCB1MTMyX2luaXQoc3RydWN0IHUxMzIgKnUxMzIpCiB7Ci0gICAgICAgIGludCByZXR2YWw7Ci0gICAgICAgIHUzMiBjb250cm9sOwotICAgICAgICB1MTMyX2Rpc2FibGUodTEzMik7Ci0gICAgICAgIHUxMzItPm5leHRfc3RhdGVjaGFuZ2UgPSBqaWZmaWVzOwotICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCBpbnRyZGlzYWJsZSwgT0hDSV9JTlRSX01JRSk7Ci0gICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBjb250cm9sLCAmY29udHJvbCk7Ci0gICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgaWYgKHUxMzItPm51bV9wb3J0cyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdTMyIHJoX2EgPSAtMTsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIHJvb3RodWIuYSwgJnJoX2EpOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICAgICAgICAgIHUxMzItPm51bV9wb3J0cyA9IHJoX2EgJiBSSF9BX05EUDsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByZWFkX3Jvb3RodWJfaW5mbyh1MTMyKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAodTEzMi0+bnVtX3BvcnRzID4gTUFYX1UxMzJfUE9SVFMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKKwlpbnQgcmV0dmFsOworCXUzMiBjb250cm9sOworCXUxMzJfZGlzYWJsZSh1MTMyKTsKKwl1MTMyLT5uZXh0X3N0YXRlY2hhbmdlID0gamlmZmllczsKKwlyZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCBpbnRyZGlzYWJsZSwgT0hDSV9JTlRSX01JRSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlyZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGNvbnRyb2wsICZjb250cm9sKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCWlmICh1MTMyLT5udW1fcG9ydHMgPT0gMCkgeworCQl1MzIgcmhfYSA9IC0xOworCQlyZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIHJvb3RodWIuYSwgJnJoX2EpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJdTEzMi0+bnVtX3BvcnRzID0gcmhfYSAmIFJIX0FfTkRQOworCQlyZXR2YWwgPSByZWFkX3Jvb3RodWJfaW5mbyh1MTMyKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCWlmICh1MTMyLT5udW1fcG9ydHMgPiBNQVhfVTEzMl9QT1JUUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKIH0KIAogCkBAIC0xNjEzLDQ3NyArMTYwMywyNzggQEAKICovCiBzdGF0aWMgaW50IHUxMzJfcnVuKHN0cnVjdCB1MTMyICp1MTMyKQogewotICAgICAgICBpbnQgcmV0dmFsOwotICAgICAgICB1MzIgY29udHJvbDsKLSAgICAgICAgdTMyIHN0YXR1czsKLSAgICAgICAgdTMyIGZtaW50ZXJ2YWw7Ci0gICAgICAgIHUzMiBwZXJpb2RpY3N0YXJ0OwotICAgICAgICB1MzIgY21kc3RhdHVzOwotICAgICAgICB1MzIgcm9vdGh1Yl9hOwotICAgICAgICBpbnQgbWFzayA9IE9IQ0lfSU5UUl9JTklUOwotICAgICAgICBpbnQgZmlyc3QgPSB1MTMyLT5oY19mbWludGVydmFsID09IDA7Ci0gICAgICAgIGludCBzbGVlcF90aW1lID0gMDsKLSAgICAgICAgaW50IHJlc2V0X3RpbWVvdXQgPSAzMDsgICAgICAgIC8qIC4uLiBhbGxvdyBleHRyYSB0aW1lICovCi0gICAgICAgIHUxMzJfZGlzYWJsZSh1MTMyKTsKLSAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgdTMyIHRlbXA7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBmbWludGVydmFsLCAmdGVtcCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgICAgICAgICAgdTEzMi0+aGNfZm1pbnRlcnZhbCA9IHRlbXAgJiAweDNmZmY7Ci0gICAgICAgICAgICAgICAgaWYgKHUxMzItPmhjX2ZtaW50ZXJ2YWwgIT0gRkkpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdTEzMi0+aGNfZm1pbnRlcnZhbCB8PSBGU01QKHUxMzItPmhjX2ZtaW50ZXJ2YWwpIDw8IDE2OwotICAgICAgICB9Ci0gICAgICAgIHJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgY29udHJvbCwgJnUxMzItPmhjX2NvbnRyb2wpOwotICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIGRldl9pbmZvKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInJlc2V0dGluZyBmcm9tIHN0YXRlICclcycsIGNvbnRyb2wgIgotICAgICAgICAgICAgICAgICI9ICUwOFhcbiIsIGhjZnMyc3RyaW5nKHUxMzItPmhjX2NvbnRyb2wgJiBPSENJX0NUUkxfSENGUyksCi0gICAgICAgICAgICAgICAgdTEzMi0+aGNfY29udHJvbCk7Ci0gICAgICAgIHN3aXRjaCAodTEzMi0+aGNfY29udHJvbCAmIE9IQ0lfQ1RSTF9IQ0ZTKSB7Ci0gICAgICAgIGNhc2UgT0hDSV9VU0JfT1BFUjoKLSAgICAgICAgICAgICAgICBzbGVlcF90aW1lID0gMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSENJX1VTQl9TVVNQRU5EOgotICAgICAgICBjYXNlIE9IQ0lfVVNCX1JFU1VNRToKLSAgICAgICAgICAgICAgICB1MTMyLT5oY19jb250cm9sICY9IE9IQ0lfQ1RSTF9SV0M7Ci0gICAgICAgICAgICAgICAgdTEzMi0+aGNfY29udHJvbCB8PSBPSENJX1VTQl9SRVNVTUU7Ci0gICAgICAgICAgICAgICAgc2xlZXBfdGltZSA9IDEwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHUxMzItPmhjX2NvbnRyb2wgJj0gT0hDSV9DVFJMX1JXQzsKLSAgICAgICAgICAgICAgICB1MTMyLT5oY19jb250cm9sIHw9IE9IQ0lfVVNCX1JFU0VUOwotICAgICAgICAgICAgICAgIHNsZWVwX3RpbWUgPSA1MDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCBjb250cm9sLCB1MTMyLT5oY19jb250cm9sKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGNvbnRyb2wsICZjb250cm9sKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICBtc2xlZXAoc2xlZXBfdGltZSk7Ci0gICAgICAgIHJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgcm9vdGh1Yi5hLCAmcm9vdGh1Yl9hKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICBpZiAoIShyb290aHViX2EgJiBSSF9BX05QUykpIHsKLSAgICAgICAgICAgICAgICBpbnQgdGVtcDsgICAgICAgIC8qIHBvd2VyIGRvd24gZWFjaCBwb3J0ICovCi0gICAgICAgICAgICAgICAgZm9yICh0ZW1wID0gMDsgdGVtcCA8IHUxMzItPm51bV9wb3J0czsgdGVtcCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290aHViLnBvcnRzdGF0dXNbdGVtcF0sIFJIX1BTX0xTREEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBjb250cm9sLCAmY29udHJvbCk7Ci0gICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgIHJldHJ5OnJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgY21kc3RhdHVzLCAmc3RhdHVzKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCBjbWRzdGF0dXMsIE9IQ0lfSENSKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgZXh0cmE6ewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgY21kc3RhdHVzLCAmc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgICAgICAgICBpZiAoMCAhPSAoc3RhdHVzICYgT0hDSV9IQ1IpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoLS1yZXNldF90aW1lb3V0ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJVU0IgSEMgcmVzZXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB0aW1lZCBvdXQhXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2xlZXAoNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXh0cmE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh1MTMyLT5mbGFncyAmIE9IQ0lfUVVJUktfSU5JVFJFU0VUKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgY29udHJvbCwgdTEzMi0+aGNfY29udHJvbCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBjb250cm9sLCAmY29udHJvbCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgZWRfY29udHJvbGhlYWQsIDB4MDAwMDAwMDApOwotICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIHJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIGVkX2J1bGtoZWFkLCAweDExMDAwMDAwKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCBoY2NhLCAweDAwMDAwMDAwKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICByZXR2YWwgPSB1MTMyX3BlcmlvZGljX3JlaW5pdCh1MTMyKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGZtaW50ZXJ2YWwsICZmbWludGVydmFsKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIHBlcmlvZGljc3RhcnQsICZwZXJpb2RpY3N0YXJ0KTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICBpZiAoMCA9PSAoZm1pbnRlcnZhbCAmIDB4M2ZmZjAwMDApIHx8IDAgPT0gcGVyaW9kaWNzdGFydCkgewotICAgICAgICAgICAgICAgIGlmICghKHUxMzItPmZsYWdzICYgT0hDSV9RVUlSS19JTklUUkVTRVQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1MTMyLT5mbGFncyB8PSBPSENJX1FVSVJLX0lOSVRSRVNFVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImluaXQgZXJyKCUwOHggJTA0eCkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIsIGZtaW50ZXJ2YWwsIHBlcmlvZGljc3RhcnQpOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgY29udHJvbGxlciBvcGVyYXRpb25zICovCi0gICAgICAgIHUxMzItPmhjX2NvbnRyb2wgJj0gT0hDSV9DVFJMX1JXQzsKLSAgICAgICAgdTEzMi0+aGNfY29udHJvbCB8PSBPSENJX0NPTlRST0xfSU5JVCB8IE9IQ0lfQ1RSTF9CTEUgfCBPSENJX1VTQl9PUEVSOwotICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCBjb250cm9sLCB1MTMyLT5oY19jb250cm9sKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCBjbWRzdGF0dXMsIE9IQ0lfQkxGKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGNtZHN0YXR1cywgJmNtZHN0YXR1cyk7Ci0gICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBjb250cm9sLCAmY29udHJvbCk7Ci0gICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgdTEzMl90b19oY2QodTEzMiktPnN0YXRlID0gSENfU1RBVEVfUlVOTklORzsKLSAgICAgICAgcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgcm9vdGh1Yi5zdGF0dXMsIFJIX0hTX0RSV0UpOwotICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIHJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIGludHJzdGF0dXMsIG1hc2spOwotICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIHJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIGludHJkaXNhYmxlLAotICAgICAgICAgICAgICAgIE9IQ0lfSU5UUl9NSUUgfCBPSENJX0lOVFJfT0MgfCBPSENJX0lOVFJfUkhTQyB8IE9IQ0lfSU5UUl9GTk8gfAotICAgICAgICAgICAgICAgIE9IQ0lfSU5UUl9VRSB8IE9IQ0lfSU5UUl9SRCB8IE9IQ0lfSU5UUl9TRiB8IE9IQ0lfSU5UUl9XREggfAotICAgICAgICAgICAgICAgIE9IQ0lfSU5UUl9TTyk7Ci0gICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsgICAgICAgIC8qIGhhbmRsZSByb290IGh1YiBpbml0IHF1aXJrcyAuLi4gKi8KLSAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCByb290aHViLmEsICZyb290aHViX2EpOwotICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIHJvb3RodWJfYSAmPSB+KFJIX0FfUFNNIHwgUkhfQV9PQ1BNKTsKLSAgICAgICAgaWYgKHUxMzItPmZsYWdzICYgT0hDSV9RVUlSS19TVVBFUklPKSB7Ci0gICAgICAgICAgICAgICAgcm9vdGh1Yl9hIHw9IFJIX0FfTk9DUDsKLSAgICAgICAgICAgICAgICByb290aHViX2EgJj0gfihSSF9BX1BPVFBHVCB8IFJIX0FfTlBTKTsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCByb290aHViLmEsIHJvb3RodWJfYSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIH0gZWxzZSBpZiAoKHUxMzItPmZsYWdzICYgT0hDSV9RVUlSS19BTUQ3NTYpIHx8IGRpc3RydXN0X2Zpcm13YXJlKSB7Ci0gICAgICAgICAgICAgICAgcm9vdGh1Yl9hIHw9IFJIX0FfTlBTOwotICAgICAgICAgICAgICAgIHJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIHJvb3RodWIuYSwgcm9vdGh1Yl9hKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgfQotICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCByb290aHViLnN0YXR1cywgUkhfSFNfTFBTQyk7Ci0gICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgcm9vdGh1Yi5iLAotICAgICAgICAgICAgICAgIChyb290aHViX2EgJiBSSF9BX05QUykgPyAwIDogUkhfQl9QUENNKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGNvbnRyb2wsICZjb250cm9sKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICBtZGVsYXkoKHJvb3RodWJfYSA+PiAyMykgJiAweDFmZSk7Ci0gICAgICAgIHUxMzJfdG9faGNkKHUxMzIpLT5zdGF0ZSA9IEhDX1NUQVRFX1JVTk5JTkc7Ci0gICAgICAgIHJldHVybiAwOworCWludCByZXR2YWw7CisJdTMyIGNvbnRyb2w7CisJdTMyIHN0YXR1czsKKwl1MzIgZm1pbnRlcnZhbDsKKwl1MzIgcGVyaW9kaWNzdGFydDsKKwl1MzIgY21kc3RhdHVzOworCXUzMiByb290aHViX2E7CisJaW50IG1hc2sgPSBPSENJX0lOVFJfSU5JVDsKKwlpbnQgZmlyc3QgPSB1MTMyLT5oY19mbWludGVydmFsID09IDA7CisJaW50IHNsZWVwX3RpbWUgPSAwOworCWludCByZXNldF90aW1lb3V0ID0gMzA7CS8qIC4uLiBhbGxvdyBleHRyYSB0aW1lICovCisJdTEzMl9kaXNhYmxlKHUxMzIpOworCWlmIChmaXJzdCkgeworCQl1MzIgdGVtcDsKKwkJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBmbWludGVydmFsLCAmdGVtcCk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCQl1MTMyLT5oY19mbWludGVydmFsID0gdGVtcCAmIDB4M2ZmZjsKKwkJdTEzMi0+aGNfZm1pbnRlcnZhbCB8PSBGU01QKHUxMzItPmhjX2ZtaW50ZXJ2YWwpIDw8IDE2OworCX0KKwlyZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGNvbnRyb2wsICZ1MTMyLT5oY19jb250cm9sKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCWRldl9pbmZvKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInJlc2V0dGluZyBmcm9tIHN0YXRlICclcycsIGNvbnRyb2wgIgorCQkiPSAlMDhYXG4iLCBoY2ZzMnN0cmluZyh1MTMyLT5oY19jb250cm9sICYgT0hDSV9DVFJMX0hDRlMpLAorCQl1MTMyLT5oY19jb250cm9sKTsKKwlzd2l0Y2ggKHUxMzItPmhjX2NvbnRyb2wgJiBPSENJX0NUUkxfSENGUykgeworCWNhc2UgT0hDSV9VU0JfT1BFUjoKKwkJc2xlZXBfdGltZSA9IDA7CisJCWJyZWFrOworCWNhc2UgT0hDSV9VU0JfU1VTUEVORDoKKwljYXNlIE9IQ0lfVVNCX1JFU1VNRToKKwkJdTEzMi0+aGNfY29udHJvbCAmPSBPSENJX0NUUkxfUldDOworCQl1MTMyLT5oY19jb250cm9sIHw9IE9IQ0lfVVNCX1JFU1VNRTsKKwkJc2xlZXBfdGltZSA9IDEwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl1MTMyLT5oY19jb250cm9sICY9IE9IQ0lfQ1RSTF9SV0M7CisJCXUxMzItPmhjX2NvbnRyb2wgfD0gT0hDSV9VU0JfUkVTRVQ7CisJCXNsZWVwX3RpbWUgPSA1MDsKKwkJYnJlYWs7CisJfQorCXJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIGNvbnRyb2wsIHUxMzItPmhjX2NvbnRyb2wpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBjb250cm9sLCAmY29udHJvbCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwltc2xlZXAoc2xlZXBfdGltZSk7CisJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCByb290aHViLmEsICZyb290aHViX2EpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJaWYgKCEocm9vdGh1Yl9hICYgUkhfQV9OUFMpKSB7CisJCWludCB0ZW1wOwkvKiBwb3dlciBkb3duIGVhY2ggcG9ydCAqLworCQlmb3IgKHRlbXAgPSAwOyB0ZW1wIDwgdTEzMi0+bnVtX3BvcnRzOyB0ZW1wKyspIHsKKwkJCXJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsCisJCQkJcm9vdGh1Yi5wb3J0c3RhdHVzW3RlbXBdLCBSSF9QU19MU0RBKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCX0KKwlyZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGNvbnRyb2wsICZjb250cm9sKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworcmV0cnk6CisJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBjbWRzdGF0dXMsICZzdGF0dXMpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgY21kc3RhdHVzLCBPSENJX0hDUik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKK2V4dHJhOgl7CisJCXJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgY21kc3RhdHVzLCAmc3RhdHVzKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJCWlmICgwICE9IChzdGF0dXMgJiBPSENJX0hDUikpIHsKKwkJCWlmICgtLXJlc2V0X3RpbWVvdXQgPT0gMCkgeworCQkJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiVVNCIEhDIHJlc2V0IgorCQkJCQkiIHRpbWVkIG91dCFcbiIpOworCQkJCXJldHVybiAtRU5PREVWOworCQkJfSBlbHNlIHsKKwkJCQltc2xlZXAoNSk7CisJCQkJZ290byBleHRyYTsKKwkJCX0KKwkJfQorCX0KKwlpZiAodTEzMi0+ZmxhZ3MgJiBPSENJX1FVSVJLX0lOSVRSRVNFVCkgeworCQlyZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCBjb250cm9sLCB1MTMyLT5oY19jb250cm9sKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJCXJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgY29udHJvbCwgJmNvbnRyb2wpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisJcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgZWRfY29udHJvbGhlYWQsIDB4MDAwMDAwMDApOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgZWRfYnVsa2hlYWQsIDB4MTEwMDAwMDApOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgaGNjYSwgMHgwMDAwMDAwMCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlyZXR2YWwgPSB1MTMyX3BlcmlvZGljX3JlaW5pdCh1MTMyKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCXJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgZm1pbnRlcnZhbCwgJmZtaW50ZXJ2YWwpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBwZXJpb2RpY3N0YXJ0LCAmcGVyaW9kaWNzdGFydCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlpZiAoMCA9PSAoZm1pbnRlcnZhbCAmIDB4M2ZmZjAwMDApIHx8IDAgPT0gcGVyaW9kaWNzdGFydCkgeworCQlpZiAoISh1MTMyLT5mbGFncyAmIE9IQ0lfUVVJUktfSU5JVFJFU0VUKSkgeworCQkJdTEzMi0+ZmxhZ3MgfD0gT0hDSV9RVUlSS19JTklUUkVTRVQ7CisJCQlnb3RvIHJldHJ5OworCQl9IGVsc2UKKwkJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiaW5pdCBlcnIoJTA4eCAlMDR4KSIKKwkJCQkiXG4iLCBmbWludGVydmFsLCBwZXJpb2RpY3N0YXJ0KTsKKwl9CQkJLyogc3RhcnQgY29udHJvbGxlciBvcGVyYXRpb25zICovCisJdTEzMi0+aGNfY29udHJvbCAmPSBPSENJX0NUUkxfUldDOworCXUxMzItPmhjX2NvbnRyb2wgfD0gT0hDSV9DT05UUk9MX0lOSVQgfCBPSENJX0NUUkxfQkxFIHwgT0hDSV9VU0JfT1BFUjsKKwlyZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCBjb250cm9sLCB1MTMyLT5oY19jb250cm9sKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCXJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIGNtZHN0YXR1cywgT0hDSV9CTEYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBjbWRzdGF0dXMsICZjbWRzdGF0dXMpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBjb250cm9sLCAmY29udHJvbCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwl1MTMyX3RvX2hjZCh1MTMyKS0+c3RhdGUgPSBIQ19TVEFURV9SVU5OSU5HOworCXJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIHJvb3RodWIuc3RhdHVzLCBSSF9IU19EUldFKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCXJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIGludHJzdGF0dXMsIG1hc2spOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgaW50cmRpc2FibGUsCisJCU9IQ0lfSU5UUl9NSUUgfCBPSENJX0lOVFJfT0MgfCBPSENJX0lOVFJfUkhTQyB8IE9IQ0lfSU5UUl9GTk8gfAorCQlPSENJX0lOVFJfVUUgfCBPSENJX0lOVFJfUkQgfCBPSENJX0lOVFJfU0YgfCBPSENJX0lOVFJfV0RIIHwKKwkJT0hDSV9JTlRSX1NPKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOwkvKiBoYW5kbGUgcm9vdCBodWIgaW5pdCBxdWlya3MgLi4uICovCisJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCByb290aHViLmEsICZyb290aHViX2EpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcm9vdGh1Yl9hICY9IH4oUkhfQV9QU00gfCBSSF9BX09DUE0pOworCWlmICh1MTMyLT5mbGFncyAmIE9IQ0lfUVVJUktfU1VQRVJJTykgeworCQlyb290aHViX2EgfD0gUkhfQV9OT0NQOworCQlyb290aHViX2EgJj0gfihSSF9BX1BPVFBHVCB8IFJIX0FfTlBTKTsKKwkJcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgcm9vdGh1Yi5hLCByb290aHViX2EpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9IGVsc2UgaWYgKCh1MTMyLT5mbGFncyAmIE9IQ0lfUVVJUktfQU1ENzU2KSB8fCBkaXN0cnVzdF9maXJtd2FyZSkgeworCQlyb290aHViX2EgfD0gUkhfQV9OUFM7CisJCXJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIHJvb3RodWIuYSwgcm9vdGh1Yl9hKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCXJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIHJvb3RodWIuc3RhdHVzLCBSSF9IU19MUFNDKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCXJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIHJvb3RodWIuYiwKKwkJKHJvb3RodWJfYSAmIFJIX0FfTlBTKSA/IDAgOiBSSF9CX1BQQ00pOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBjb250cm9sLCAmY29udHJvbCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwltZGVsYXkoKHJvb3RodWJfYSA+PiAyMykgJiAweDFmZSk7CisJdTEzMl90b19oY2QodTEzMiktPnN0YXRlID0gSENfU1RBVEVfUlVOTklORzsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgdTEzMl9oY2Rfc3RvcChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQogewotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7Ci0gICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInUxMzIgZGV2aWNlICVwKGhjZD0lcCkgaGFzIGIiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZWVuIHJlbW92ZWQgJWRcbiIsIHUxMzIsIGhjZCwgdTEzMi0+Z29pbmcpOwotICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhjZD0lcCBpcyBiZWluZyByZW1vdiIKLSAgICAgICAgICAgICAgICAgICAgICAgICJlZFxuIiwgaGNkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtdXRleF9sb2NrKCZ1MTMyLT5zd19sb2NrKTsKLSAgICAgICAgICAgICAgICBtc2xlZXAoMTAwKTsKLSAgICAgICAgICAgICAgICB1MTMyX3Bvd2VyKHUxMzIsIDApOwotICAgICAgICAgICAgICAgIG11dGV4X3VubG9jaygmdTEzMi0+c3dfbG9jayk7Ci0gICAgICAgIH0KKwlzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7CisJaWYgKHUxMzItPmdvaW5nID4gMSkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInUxMzIgZGV2aWNlICVwKGhjZD0lcCkgaGFzIGIiCisJCQkiZWVuIHJlbW92ZWQgJWRcbiIsIHUxMzIsIGhjZCwgdTEzMi0+Z29pbmcpOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhjZD0lcCBpcyBiZWluZyByZW1vdiIKKwkJCSJlZFxuIiwgaGNkKTsKKwl9IGVsc2UgeworCQltdXRleF9sb2NrKCZ1MTMyLT5zd19sb2NrKTsKKwkJbXNsZWVwKDEwMCk7CisJCXUxMzJfcG93ZXIodTEzMiwgMCk7CisJCW11dGV4X3VubG9jaygmdTEzMi0+c3dfbG9jayk7CisJfQogfQogCiBzdGF0aWMgaW50IHUxMzJfaGNkX3N0YXJ0KHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKLSAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOwotICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWRcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRVNIVVRET1dOOwotICAgICAgICB9IGVsc2UgaWYgKGhjZC0+c2VsZi5jb250cm9sbGVyKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRvX3BsYXRmb3JtX2RldmljZShoY2QtPnNlbGYuY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgdTE2IHZlbmRvciA9ICgoc3RydWN0IHUxMzJfcGxhdGZvcm1fZGF0YSAqKQotICAgICAgICAgICAgICAgICAgICAgICAgKHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKSktPnZlbmRvcjsKLSAgICAgICAgICAgICAgICB1MTYgZGV2aWNlID0gKChzdHJ1Y3QgdTEzMl9wbGF0Zm9ybV9kYXRhICopCi0gICAgICAgICAgICAgICAgICAgICAgICAocGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpKS0+ZGV2aWNlOwotICAgICAgICAgICAgICAgIG11dGV4X2xvY2soJnUxMzItPnN3X2xvY2spOwotICAgICAgICAgICAgICAgIG1zbGVlcCgxMCk7Ci0gICAgICAgICAgICAgICAgaWYgKHZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FNRCAmJiBkZXZpY2UgPT0gMHg3NDBjKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1MTMyLT5mbGFncyA9IE9IQ0lfUVVJUktfQU1ENzU2OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmVuZG9yID09IFBDSV9WRU5ET1JfSURfT1BUSSAmJiBkZXZpY2UgPT0gMHhjODYxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgIldBUk5JTkc6IE9QVGkgd29ya2FyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3VuZHMgdW5hdmFpbGFibGVcbiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmVuZG9yID09IFBDSV9WRU5ET1JfSURfQ09NUEFRICYmIGRldmljZSA9PSAweGEwZjgpCi0gICAgICAgICAgICAgICAgICAgICAgICB1MTMyLT5mbGFncyB8PSBPSENJX1FVSVJLX1pGTUlDUk87Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl9ydW4odTEzMik7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9kaXNhYmxlKHUxMzIpOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMi0+Z29pbmcgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtc2xlZXAoMTAwKTsKLSAgICAgICAgICAgICAgICBtdXRleF91bmxvY2soJnUxMzItPnN3X2xvY2spOwotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJwbGF0Zm9ybV9kZXZpY2UgbWlzc2luZ1xuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgICAgIH0KKwlzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7CisJaWYgKHUxMzItPmdvaW5nID4gMSkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCisJCQksIHUxMzItPmdvaW5nKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKKwkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZFxuIik7CisJCXJldHVybiAtRVNIVVRET1dOOworCX0gZWxzZSBpZiAoaGNkLT5zZWxmLmNvbnRyb2xsZXIpIHsKKwkJaW50IHJldHZhbDsKKwkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9CisJCQl0b19wbGF0Zm9ybV9kZXZpY2UoaGNkLT5zZWxmLmNvbnRyb2xsZXIpOworCQl1MTYgdmVuZG9yID0gKChzdHJ1Y3QgdTEzMl9wbGF0Zm9ybV9kYXRhICopCisJCQkocGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpKS0+dmVuZG9yOworCQl1MTYgZGV2aWNlID0gKChzdHJ1Y3QgdTEzMl9wbGF0Zm9ybV9kYXRhICopCisJCQkocGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpKS0+ZGV2aWNlOworCQltdXRleF9sb2NrKCZ1MTMyLT5zd19sb2NrKTsKKwkJbXNsZWVwKDEwKTsKKwkJaWYgKHZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FNRCAmJiBkZXZpY2UgPT0gMHg3NDBjKSB7CisJCQl1MTMyLT5mbGFncyA9IE9IQ0lfUVVJUktfQU1ENzU2OworCQl9IGVsc2UgaWYgKHZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX09QVEkgJiYgZGV2aWNlID09IDB4Yzg2MSkgeworCQkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJXQVJOSU5HOiBPUFRpIHdvcmthciIKKwkJCQkib3VuZHMgdW5hdmFpbGFibGVcbiIpOworCQl9IGVsc2UgaWYgKHZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0NPTVBBUSAmJiBkZXZpY2UgPT0gMHhhMGY4KQorCQkJdTEzMi0+ZmxhZ3MgfD0gT0hDSV9RVUlSS19aRk1JQ1JPOworCQlyZXR2YWwgPSB1MTMyX3J1bih1MTMyKTsKKwkJaWYgKHJldHZhbCkgeworCQkJdTEzMl9kaXNhYmxlKHUxMzIpOworCQkJdTEzMi0+Z29pbmcgPSAxOworCQl9CisJCW1zbGVlcCgxMDApOworCQltdXRleF91bmxvY2soJnUxMzItPnN3X2xvY2spOworCQlyZXR1cm4gcmV0dmFsOworCX0gZWxzZSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAicGxhdGZvcm1fZGV2aWNlIG1pc3NpbmdcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgdTEzMl9oY2RfcmVzZXQoc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOwotICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAxKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgLCB1MTMyLT5nb2luZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgICAgIH0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZFxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FU0hVVERPV047Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICBtdXRleF9sb2NrKCZ1MTMyLT5zd19sb2NrKTsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX2luaXQodTEzMik7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9kaXNhYmxlKHUxMzIpOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMi0+Z29pbmcgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtdXRleF91bmxvY2soJnUxMzItPnN3X2xvY2spOwotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIH0KKwlzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7CisJaWYgKHUxMzItPmdvaW5nID4gMSkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCisJCQksIHUxMzItPmdvaW5nKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKKwkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZFxuIik7CisJCXJldHVybiAtRVNIVVRET1dOOworCX0gZWxzZSB7CisJCWludCByZXR2YWw7CisJCW11dGV4X2xvY2soJnUxMzItPnN3X2xvY2spOworCQlyZXR2YWwgPSB1MTMyX2luaXQodTEzMik7CisJCWlmIChyZXR2YWwpIHsKKwkJCXUxMzJfZGlzYWJsZSh1MTMyKTsKKwkJCXUxMzItPmdvaW5nID0gMTsKKwkJfQorCQltdXRleF91bmxvY2soJnUxMzItPnN3X2xvY2spOworCQlyZXR1cm4gcmV0dmFsOworCX0KIH0KIAogc3RhdGljIGludCBjcmVhdGVfZW5kcG9pbnRfYW5kX3F1ZXVlX2ludChzdHJ1Y3QgdTEzMiAqdTEzMiwKIAlzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2LCBzdHJ1Y3QgdXJiICp1cmIsCi0gICAgICAgIHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LCB1OCB1c2JfYWRkciwgdTggdXNiX2VuZHAsIHU4IGFkZHJlc3MsCi0gICAgICAgIGdmcF90IG1lbV9mbGFncykKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwgdTggdXNiX2FkZHIsIHU4IHVzYl9lbmRwLCB1OCBhZGRyZXNzLAorCWdmcF90IG1lbV9mbGFncykKIHsKLSAgICAgICAgc3RydWN0IHUxMzJfcmluZyAqcmluZzsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBpcnFzOwotCWludCByYzsKLQl1OCBlbmRwX251bWJlcjsKLQlzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHUxMzJfZW5kcCksIG1lbV9mbGFncyk7Ci0KLSAgICAgICAgaWYgKCFlbmRwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgIH0KLQotCXNwaW5fbG9ja19pbml0KCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7Ci0JcmMgPSB1c2JfaGNkX2xpbmtfdXJiX3RvX2VwKHUxMzJfdG9faGNkKHUxMzIpLCB1cmIpOwotCWlmIChyYykgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKLQkJa2ZyZWUoZW5kcCk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQllbmRwX251bWJlciA9ICsrdTEzMi0+bnVtX2VuZHBvaW50czsKLQl1cmItPmVwLT5oY3ByaXYgPSB1MTMyLT5lbmRwW2VuZHBfbnVtYmVyIC0gMV0gPSBlbmRwOwotICAgICAgICBJTklUX0RFTEFZRURfV09SSygmZW5kcC0+c2NoZWR1bGVyLCB1MTMyX2hjZF9lbmRwX3dvcmtfc2NoZWR1bGVyKTsKLSAgICAgICAgSU5JVF9MSVNUX0hFQUQoJmVuZHAtPnVyYl9tb3JlKTsKLSAgICAgICAgcmluZyA9IGVuZHAtPnJpbmcgPSAmdTEzMi0+cmluZ1swXTsKLSAgICAgICAgaWYgKHJpbmctPmN1cnJfZW5kcCkgewotICAgICAgICAgICAgICAgIGxpc3RfYWRkX3RhaWwoJmVuZHAtPmVuZHBfcmluZywgJnJpbmctPmN1cnJfZW5kcC0+ZW5kcF9yaW5nKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBJTklUX0xJU1RfSEVBRCgmZW5kcC0+ZW5kcF9yaW5nKTsKLSAgICAgICAgICAgICAgICByaW5nLT5jdXJyX2VuZHAgPSBlbmRwOwotICAgICAgICB9Ci0gICAgICAgIHJpbmctPmxlbmd0aCArPSAxOwotICAgICAgICBlbmRwLT5kZXF1ZXVlaW5nID0gMDsKLSAgICAgICAgZW5kcC0+ZWRzZXRfZmx1c2ggPSAwOwotICAgICAgICBlbmRwLT5hY3RpdmUgPSAwOwotICAgICAgICBlbmRwLT5kZWxheWVkID0gMDsKLSAgICAgICAgZW5kcC0+ZW5kcF9udW1iZXIgPSBlbmRwX251bWJlcjsKLSAgICAgICAgZW5kcC0+dTEzMiA9IHUxMzI7Ci0JZW5kcC0+aGVwID0gdXJiLT5lcDsKLSAgICAgICAgZW5kcC0+cGlwZXR5cGUgPSB1c2JfcGlwZXR5cGUodXJiLT5waXBlKTsKLSAgICAgICAgdTEzMl9lbmRwX2luaXRfa3JlZih1MTMyLCBlbmRwKTsKLSAgICAgICAgaWYgKHVzYl9waXBlaW4odXJiLT5waXBlKSkgewotICAgICAgICAgICAgICAgIGVuZHAtPnRvZ2dsZV9iaXRzID0gMHgyOwotICAgICAgICAgICAgICAgIHVzYl9zZXR0b2dnbGUodWRldi0+dXNiX2RldmljZSwgdXNiX2VuZHAsIDAsIDApOwotICAgICAgICAgICAgICAgIGVuZHAtPmlucHV0ID0gMTsKLSAgICAgICAgICAgICAgICBlbmRwLT5vdXRwdXQgPSAwOwotICAgICAgICAgICAgICAgIHVkZXYtPmVuZHBfbnVtYmVyX2luW3VzYl9lbmRwXSA9IGVuZHBfbnVtYmVyOwotICAgICAgICAgICAgICAgIHUxMzJfdWRldl9nZXRfa3JlZih1MTMyLCB1ZGV2KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmRwLT50b2dnbGVfYml0cyA9IDB4MjsKLSAgICAgICAgICAgICAgICB1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIHVzYl9lbmRwLCAxLCAwKTsKLSAgICAgICAgICAgICAgICBlbmRwLT5pbnB1dCA9IDA7Ci0gICAgICAgICAgICAgICAgZW5kcC0+b3V0cHV0ID0gMTsKLSAgICAgICAgICAgICAgICB1ZGV2LT5lbmRwX251bWJlcl9vdXRbdXNiX2VuZHBdID0gZW5kcF9udW1iZXI7Ci0gICAgICAgICAgICAgICAgdTEzMl91ZGV2X2dldF9rcmVmKHUxMzIsIHVkZXYpOwotICAgICAgICB9Ci0gICAgICAgIHVyYi0+aGNwcml2ID0gdTEzMjsKLSAgICAgICAgZW5kcC0+ZGVsYXllZCA9IDE7Ci0gICAgICAgIGVuZHAtPmppZmZpZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyh1cmItPmludGVydmFsKTsKLSAgICAgICAgZW5kcC0+dWRldl9udW1iZXIgPSBhZGRyZXNzOwotICAgICAgICBlbmRwLT51c2JfYWRkciA9IHVzYl9hZGRyOwotICAgICAgICBlbmRwLT51c2JfZW5kcCA9IHVzYl9lbmRwOwotICAgICAgICBlbmRwLT5xdWV1ZV9zaXplID0gMTsKLSAgICAgICAgZW5kcC0+cXVldWVfbGFzdCA9IDA7Ci0gICAgICAgIGVuZHAtPnF1ZXVlX25leHQgPSAwOwotICAgICAgICBlbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJiBlbmRwLT5xdWV1ZV9sYXN0KytdID0gdXJiOwotICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKLSAgICAgICAgdTEzMl9lbmRwX3F1ZXVlX3dvcmsodTEzMiwgZW5kcCwgbXNlY3NfdG9famlmZmllcyh1cmItPmludGVydmFsKSk7Ci0gICAgICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHF1ZXVlX2ludF9vbl9vbGRfZW5kcG9pbnQoc3RydWN0IHUxMzIgKnUxMzIsCi0Jc3RydWN0IHUxMzJfdWRldiAqdWRldiwgc3RydWN0IHVyYiAqdXJiLAotICAgICAgICBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2Rldiwgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCwgdTggdXNiX2FkZHIsCi0gICAgICAgIHU4IHVzYl9lbmRwLCB1OCBhZGRyZXNzKQotewotICAgICAgICB1cmItPmhjcHJpdiA9IHUxMzI7Ci0gICAgICAgIGVuZHAtPmRlbGF5ZWQgPSAxOwotICAgICAgICBlbmRwLT5qaWZmaWVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXModXJiLT5pbnRlcnZhbCk7Ci0gICAgICAgIGlmIChlbmRwLT5xdWV1ZV9zaXplKysgPCBFTkRQX1FVRVVFX1NJWkUpIHsKLSAgICAgICAgICAgICAgICBlbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJiBlbmRwLT5xdWV1ZV9sYXN0KytdID0gdXJiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3VyYnEgKnVyYnEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdTEzMl91cmJxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdGUF9BVE9NSUMpOwotICAgICAgICAgICAgICAgIGlmICh1cmJxID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX3NpemUgLT0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2FkZF90YWlsKCZ1cmJxLT51cmJfbW9yZSwgJmVuZHAtPnVyYl9tb3JlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVyYnEtPnVyYiA9IHVyYjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY3JlYXRlX2VuZHBvaW50X2FuZF9xdWV1ZV9idWxrKHN0cnVjdCB1MTMyICp1MTMyLAotCXN0cnVjdCB1MTMyX3VkZXYgKnVkZXYsIHN0cnVjdCB1cmIgKnVyYiwKLSAgICAgICAgc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHU4IHVzYl9hZGRyLCB1OCB1c2JfZW5kcCwgdTggYWRkcmVzcywKLSAgICAgICAgZ2ZwX3QgbWVtX2ZsYWdzKQotewotICAgICAgICBpbnQgcmluZ19udW1iZXI7Ci0gICAgICAgIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmc7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgaXJxczsKLQlpbnQgcmM7Ci0JdTggZW5kcF9udW1iZXI7Ci0Jc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1MTMyX2VuZHApLCBtZW1fZmxhZ3MpOwotCi0gICAgICAgIGlmICghZW5kcCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgICAgICB9Ci0KLQlzcGluX2xvY2tfaW5pdCgmZW5kcC0+cXVldWVfbG9jay5zbG9jayk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOwotCXJjID0gdXNiX2hjZF9saW5rX3VyYl90b19lcCh1MTMyX3RvX2hjZCh1MTMyKSwgdXJiKTsKLQlpZiAocmMpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7Ci0JCWtmcmVlKGVuZHApOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JZW5kcF9udW1iZXIgPSArK3UxMzItPm51bV9lbmRwb2ludHM7Ci0JdXJiLT5lcC0+aGNwcml2ID0gdTEzMi0+ZW5kcFtlbmRwX251bWJlciAtIDFdID0gZW5kcDsKLSAgICAgICAgSU5JVF9ERUxBWUVEX1dPUksoJmVuZHAtPnNjaGVkdWxlciwgdTEzMl9oY2RfZW5kcF93b3JrX3NjaGVkdWxlcik7Ci0gICAgICAgIElOSVRfTElTVF9IRUFEKCZlbmRwLT51cmJfbW9yZSk7Ci0gICAgICAgIGVuZHAtPmRlcXVldWVpbmcgPSAwOwotICAgICAgICBlbmRwLT5lZHNldF9mbHVzaCA9IDA7Ci0gICAgICAgIGVuZHAtPmFjdGl2ZSA9IDA7Ci0gICAgICAgIGVuZHAtPmRlbGF5ZWQgPSAwOwotICAgICAgICBlbmRwLT5lbmRwX251bWJlciA9IGVuZHBfbnVtYmVyOwotICAgICAgICBlbmRwLT51MTMyID0gdTEzMjsKLQllbmRwLT5oZXAgPSB1cmItPmVwOwotICAgICAgICBlbmRwLT5waXBldHlwZSA9IHVzYl9waXBldHlwZSh1cmItPnBpcGUpOwotICAgICAgICB1MTMyX2VuZHBfaW5pdF9rcmVmKHUxMzIsIGVuZHApOwotICAgICAgICBpZiAodXNiX3BpcGVpbih1cmItPnBpcGUpKSB7Ci0gICAgICAgICAgICAgICAgZW5kcC0+dG9nZ2xlX2JpdHMgPSAweDI7Ci0gICAgICAgICAgICAgICAgdXNiX3NldHRvZ2dsZSh1ZGV2LT51c2JfZGV2aWNlLCB1c2JfZW5kcCwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgcmluZ19udW1iZXIgPSAzOwotICAgICAgICAgICAgICAgIGVuZHAtPmlucHV0ID0gMTsKLSAgICAgICAgICAgICAgICBlbmRwLT5vdXRwdXQgPSAwOwotICAgICAgICAgICAgICAgIHVkZXYtPmVuZHBfbnVtYmVyX2luW3VzYl9lbmRwXSA9IGVuZHBfbnVtYmVyOwotICAgICAgICAgICAgICAgIHUxMzJfdWRldl9nZXRfa3JlZih1MTMyLCB1ZGV2KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmRwLT50b2dnbGVfYml0cyA9IDB4MjsKLSAgICAgICAgICAgICAgICB1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIHVzYl9lbmRwLCAxLCAwKTsKLSAgICAgICAgICAgICAgICByaW5nX251bWJlciA9IDI7Ci0gICAgICAgICAgICAgICAgZW5kcC0+aW5wdXQgPSAwOwotICAgICAgICAgICAgICAgIGVuZHAtPm91dHB1dCA9IDE7Ci0gICAgICAgICAgICAgICAgdWRldi0+ZW5kcF9udW1iZXJfb3V0W3VzYl9lbmRwXSA9IGVuZHBfbnVtYmVyOwotICAgICAgICAgICAgICAgIHUxMzJfdWRldl9nZXRfa3JlZih1MTMyLCB1ZGV2KTsKLSAgICAgICAgfQotICAgICAgICByaW5nID0gZW5kcC0+cmluZyA9ICZ1MTMyLT5yaW5nW3JpbmdfbnVtYmVyIC0gMV07Ci0gICAgICAgIGlmIChyaW5nLT5jdXJyX2VuZHApIHsKLSAgICAgICAgICAgICAgICBsaXN0X2FkZF90YWlsKCZlbmRwLT5lbmRwX3JpbmcsICZyaW5nLT5jdXJyX2VuZHAtPmVuZHBfcmluZyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgSU5JVF9MSVNUX0hFQUQoJmVuZHAtPmVuZHBfcmluZyk7Ci0gICAgICAgICAgICAgICAgcmluZy0+Y3Vycl9lbmRwID0gZW5kcDsKLSAgICAgICAgfQotICAgICAgICByaW5nLT5sZW5ndGggKz0gMTsKLSAgICAgICAgdXJiLT5oY3ByaXYgPSB1MTMyOwotICAgICAgICBlbmRwLT51ZGV2X251bWJlciA9IGFkZHJlc3M7Ci0gICAgICAgIGVuZHAtPnVzYl9hZGRyID0gdXNiX2FkZHI7Ci0gICAgICAgIGVuZHAtPnVzYl9lbmRwID0gdXNiX2VuZHA7Ci0gICAgICAgIGVuZHAtPnF1ZXVlX3NpemUgPSAxOwotICAgICAgICBlbmRwLT5xdWV1ZV9sYXN0ID0gMDsKLSAgICAgICAgZW5kcC0+cXVldWVfbmV4dCA9IDA7Ci0gICAgICAgIGVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX2xhc3QrK10gPSB1cmI7Ci0gICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOwotICAgICAgICB1MTMyX2VuZHBfcXVldWVfd29yayh1MTMyLCBlbmRwLCAwKTsKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcXVldWVfYnVsa19vbl9vbGRfZW5kcG9pbnQoc3RydWN0IHUxMzIgKnUxMzIsIHN0cnVjdCB1MTMyX3VkZXYgKnVkZXYsCi0Jc3RydWN0IHVyYiAqdXJiLAotICAgICAgICBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2Rldiwgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCwgdTggdXNiX2FkZHIsCi0gICAgICAgIHU4IHVzYl9lbmRwLCB1OCBhZGRyZXNzKQotewotICAgICAgICB1cmItPmhjcHJpdiA9IHUxMzI7Ci0gICAgICAgIGlmIChlbmRwLT5xdWV1ZV9zaXplKysgPCBFTkRQX1FVRVVFX1NJWkUpIHsKLSAgICAgICAgICAgICAgICBlbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJiBlbmRwLT5xdWV1ZV9sYXN0KytdID0gdXJiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3VyYnEgKnVyYnEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdTEzMl91cmJxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdGUF9BVE9NSUMpOwotICAgICAgICAgICAgICAgIGlmICh1cmJxID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX3NpemUgLT0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2FkZF90YWlsKCZ1cmJxLT51cmJfbW9yZSwgJmVuZHAtPnVyYl9tb3JlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVyYnEtPnVyYiA9IHVyYjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY3JlYXRlX2VuZHBvaW50X2FuZF9xdWV1ZV9jb250cm9sKHN0cnVjdCB1MTMyICp1MTMyLAotCXN0cnVjdCB1cmIgKnVyYiwKLSAgICAgICAgc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHU4IHVzYl9hZGRyLCB1OCB1c2JfZW5kcCwKLSAgICAgICAgZ2ZwX3QgbWVtX2ZsYWdzKQotewotICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nOworCXN0cnVjdCB1MTMyX3JpbmcgKnJpbmc7CiAJdW5zaWduZWQgbG9uZyBpcnFzOwogCWludCByYzsKIAl1OCBlbmRwX251bWJlcjsKIAlzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHUxMzJfZW5kcCksIG1lbV9mbGFncyk7CiAKLSAgICAgICAgaWYgKCFlbmRwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgIH0KKwlpZiAoIWVuZHApCisJCXJldHVybiAtRU5PTUVNOwogCiAJc3Bpbl9sb2NrX2luaXQoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2spOwogCXNwaW5fbG9ja19pcnFzYXZlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKQEAgLTIwOTYsMjA0ICsxODg3LDM5OCBAQAogCiAJZW5kcF9udW1iZXIgPSArK3UxMzItPm51bV9lbmRwb2ludHM7CiAJdXJiLT5lcC0+aGNwcml2ID0gdTEzMi0+ZW5kcFtlbmRwX251bWJlciAtIDFdID0gZW5kcDsKLSAgICAgICAgSU5JVF9ERUxBWUVEX1dPUksoJmVuZHAtPnNjaGVkdWxlciwgdTEzMl9oY2RfZW5kcF93b3JrX3NjaGVkdWxlcik7Ci0gICAgICAgIElOSVRfTElTVF9IRUFEKCZlbmRwLT51cmJfbW9yZSk7Ci0gICAgICAgIHJpbmcgPSBlbmRwLT5yaW5nID0gJnUxMzItPnJpbmdbMF07Ci0gICAgICAgIGlmIChyaW5nLT5jdXJyX2VuZHApIHsKLSAgICAgICAgICAgICAgICBsaXN0X2FkZF90YWlsKCZlbmRwLT5lbmRwX3JpbmcsICZyaW5nLT5jdXJyX2VuZHAtPmVuZHBfcmluZyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgSU5JVF9MSVNUX0hFQUQoJmVuZHAtPmVuZHBfcmluZyk7Ci0gICAgICAgICAgICAgICAgcmluZy0+Y3Vycl9lbmRwID0gZW5kcDsKLSAgICAgICAgfQotICAgICAgICByaW5nLT5sZW5ndGggKz0gMTsKLSAgICAgICAgZW5kcC0+ZGVxdWV1ZWluZyA9IDA7Ci0gICAgICAgIGVuZHAtPmVkc2V0X2ZsdXNoID0gMDsKLSAgICAgICAgZW5kcC0+YWN0aXZlID0gMDsKLSAgICAgICAgZW5kcC0+ZGVsYXllZCA9IDA7Ci0gICAgICAgIGVuZHAtPmVuZHBfbnVtYmVyID0gZW5kcF9udW1iZXI7Ci0gICAgICAgIGVuZHAtPnUxMzIgPSB1MTMyOworCUlOSVRfREVMQVlFRF9XT1JLKCZlbmRwLT5zY2hlZHVsZXIsIHUxMzJfaGNkX2VuZHBfd29ya19zY2hlZHVsZXIpOworCUlOSVRfTElTVF9IRUFEKCZlbmRwLT51cmJfbW9yZSk7CisJcmluZyA9IGVuZHAtPnJpbmcgPSAmdTEzMi0+cmluZ1swXTsKKwlpZiAocmluZy0+Y3Vycl9lbmRwKSB7CisJCWxpc3RfYWRkX3RhaWwoJmVuZHAtPmVuZHBfcmluZywgJnJpbmctPmN1cnJfZW5kcC0+ZW5kcF9yaW5nKTsKKwl9IGVsc2UgeworCQlJTklUX0xJU1RfSEVBRCgmZW5kcC0+ZW5kcF9yaW5nKTsKKwkJcmluZy0+Y3Vycl9lbmRwID0gZW5kcDsKKwl9CisJcmluZy0+bGVuZ3RoICs9IDE7CisJZW5kcC0+ZGVxdWV1ZWluZyA9IDA7CisJZW5kcC0+ZWRzZXRfZmx1c2ggPSAwOworCWVuZHAtPmFjdGl2ZSA9IDA7CisJZW5kcC0+ZGVsYXllZCA9IDA7CisJZW5kcC0+ZW5kcF9udW1iZXIgPSBlbmRwX251bWJlcjsKKwllbmRwLT51MTMyID0gdTEzMjsKIAllbmRwLT5oZXAgPSB1cmItPmVwOwotICAgICAgICB1MTMyX2VuZHBfaW5pdF9rcmVmKHUxMzIsIGVuZHApOwotICAgICAgICB1MTMyX2VuZHBfZ2V0X2tyZWYodTEzMiwgZW5kcCk7Ci0gICAgICAgIGlmICh1c2JfYWRkciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbdXNiX2FkZHJdLmFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W2FkZHJlc3NdOwotICAgICAgICAgICAgICAgIGVuZHAtPnVkZXZfbnVtYmVyID0gYWRkcmVzczsKLSAgICAgICAgICAgICAgICBlbmRwLT51c2JfYWRkciA9IHVzYl9hZGRyOwotICAgICAgICAgICAgICAgIGVuZHAtPnVzYl9lbmRwID0gdXNiX2VuZHA7Ci0gICAgICAgICAgICAgICAgZW5kcC0+aW5wdXQgPSAxOwotICAgICAgICAgICAgICAgIGVuZHAtPm91dHB1dCA9IDE7Ci0gICAgICAgICAgICAgICAgZW5kcC0+cGlwZXR5cGUgPSB1c2JfcGlwZXR5cGUodXJiLT5waXBlKTsKLSAgICAgICAgICAgICAgICB1MTMyX3VkZXZfaW5pdF9rcmVmKHUxMzIsIHVkZXYpOwotICAgICAgICAgICAgICAgIHUxMzJfdWRldl9nZXRfa3JlZih1MTMyLCB1ZGV2KTsKLSAgICAgICAgICAgICAgICB1ZGV2LT5lbmRwX251bWJlcl9pblt1c2JfZW5kcF0gPSBlbmRwX251bWJlcjsKLSAgICAgICAgICAgICAgICB1ZGV2LT5lbmRwX251bWJlcl9vdXRbdXNiX2VuZHBdID0gZW5kcF9udW1iZXI7Ci0gICAgICAgICAgICAgICAgdXJiLT5oY3ByaXYgPSB1MTMyOwotICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX3NpemUgPSAxOwotICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX2xhc3QgPSAwOwotICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX25leHQgPSAwOwotICAgICAgICAgICAgICAgIGVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX2xhc3QrK10gPSB1cmI7Ci0gICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7Ci0gICAgICAgICAgICAgICAgdTEzMl9lbmRwX3F1ZXVlX3dvcmsodTEzMiwgZW5kcCwgMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgIC8qKHVzYl9hZGRyID4gMCkgKi8KLSAgICAgICAgICAgICAgICB1OCBhZGRyZXNzID0gdTEzMi0+YWRkclt1c2JfYWRkcl0uYWRkcmVzczsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2ID0gJnUxMzItPnVkZXZbYWRkcmVzc107Ci0gICAgICAgICAgICAgICAgZW5kcC0+dWRldl9udW1iZXIgPSBhZGRyZXNzOwotICAgICAgICAgICAgICAgIGVuZHAtPnVzYl9hZGRyID0gdXNiX2FkZHI7Ci0gICAgICAgICAgICAgICAgZW5kcC0+dXNiX2VuZHAgPSB1c2JfZW5kcDsKLSAgICAgICAgICAgICAgICBlbmRwLT5pbnB1dCA9IDE7Ci0gICAgICAgICAgICAgICAgZW5kcC0+b3V0cHV0ID0gMTsKLSAgICAgICAgICAgICAgICBlbmRwLT5waXBldHlwZSA9IHVzYl9waXBldHlwZSh1cmItPnBpcGUpOwotICAgICAgICAgICAgICAgIHUxMzJfdWRldl9nZXRfa3JlZih1MTMyLCB1ZGV2KTsKLSAgICAgICAgICAgICAgICB1ZGV2LT5lbnVtZXJhdGlvbiA9IDI7Ci0gICAgICAgICAgICAgICAgdWRldi0+ZW5kcF9udW1iZXJfaW5bdXNiX2VuZHBdID0gZW5kcF9udW1iZXI7Ci0gICAgICAgICAgICAgICAgdWRldi0+ZW5kcF9udW1iZXJfb3V0W3VzYl9lbmRwXSA9IGVuZHBfbnVtYmVyOwotICAgICAgICAgICAgICAgIHVyYi0+aGNwcml2ID0gdTEzMjsKLSAgICAgICAgICAgICAgICBlbmRwLT5xdWV1ZV9zaXplID0gMTsKLSAgICAgICAgICAgICAgICBlbmRwLT5xdWV1ZV9sYXN0ID0gMDsKLSAgICAgICAgICAgICAgICBlbmRwLT5xdWV1ZV9uZXh0ID0gMDsKLSAgICAgICAgICAgICAgICBlbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJiBlbmRwLT5xdWV1ZV9sYXN0KytdID0gdXJiOwotICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOwotICAgICAgICAgICAgICAgIHUxMzJfZW5kcF9xdWV1ZV93b3JrKHUxMzIsIGVuZHAsIDApOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9CisJZW5kcC0+cGlwZXR5cGUgPSB1c2JfcGlwZXR5cGUodXJiLT5waXBlKTsKKwl1MTMyX2VuZHBfaW5pdF9rcmVmKHUxMzIsIGVuZHApOworCWlmICh1c2JfcGlwZWluKHVyYi0+cGlwZSkpIHsKKwkJZW5kcC0+dG9nZ2xlX2JpdHMgPSAweDI7CisJCXVzYl9zZXR0b2dnbGUodWRldi0+dXNiX2RldmljZSwgdXNiX2VuZHAsIDAsIDApOworCQllbmRwLT5pbnB1dCA9IDE7CisJCWVuZHAtPm91dHB1dCA9IDA7CisJCXVkZXYtPmVuZHBfbnVtYmVyX2luW3VzYl9lbmRwXSA9IGVuZHBfbnVtYmVyOworCQl1MTMyX3VkZXZfZ2V0X2tyZWYodTEzMiwgdWRldik7CisJfSBlbHNlIHsKKwkJZW5kcC0+dG9nZ2xlX2JpdHMgPSAweDI7CisJCXVzYl9zZXR0b2dnbGUodWRldi0+dXNiX2RldmljZSwgdXNiX2VuZHAsIDEsIDApOworCQllbmRwLT5pbnB1dCA9IDA7CisJCWVuZHAtPm91dHB1dCA9IDE7CisJCXVkZXYtPmVuZHBfbnVtYmVyX291dFt1c2JfZW5kcF0gPSBlbmRwX251bWJlcjsKKwkJdTEzMl91ZGV2X2dldF9rcmVmKHUxMzIsIHVkZXYpOworCX0KKwl1cmItPmhjcHJpdiA9IHUxMzI7CisJZW5kcC0+ZGVsYXllZCA9IDE7CisJZW5kcC0+amlmZmllcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKHVyYi0+aW50ZXJ2YWwpOworCWVuZHAtPnVkZXZfbnVtYmVyID0gYWRkcmVzczsKKwllbmRwLT51c2JfYWRkciA9IHVzYl9hZGRyOworCWVuZHAtPnVzYl9lbmRwID0gdXNiX2VuZHA7CisJZW5kcC0+cXVldWVfc2l6ZSA9IDE7CisJZW5kcC0+cXVldWVfbGFzdCA9IDA7CisJZW5kcC0+cXVldWVfbmV4dCA9IDA7CisJZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYgZW5kcC0+cXVldWVfbGFzdCsrXSA9IHVyYjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKKwl1MTMyX2VuZHBfcXVldWVfd29yayh1MTMyLCBlbmRwLCBtc2Vjc190b19qaWZmaWVzKHVyYi0+aW50ZXJ2YWwpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxdWV1ZV9pbnRfb25fb2xkX2VuZHBvaW50KHN0cnVjdCB1MTMyICp1MTMyLAorCXN0cnVjdCB1MTMyX3VkZXYgKnVkZXYsIHN0cnVjdCB1cmIgKnVyYiwKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2Rldiwgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCwgdTggdXNiX2FkZHIsCisJdTggdXNiX2VuZHAsIHU4IGFkZHJlc3MpCit7CisJdXJiLT5oY3ByaXYgPSB1MTMyOworCWVuZHAtPmRlbGF5ZWQgPSAxOworCWVuZHAtPmppZmZpZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyh1cmItPmludGVydmFsKTsKKwlpZiAoZW5kcC0+cXVldWVfc2l6ZSsrIDwgRU5EUF9RVUVVRV9TSVpFKSB7CisJCWVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX2xhc3QrK10gPSB1cmI7CisJfSBlbHNlIHsKKwkJc3RydWN0IHUxMzJfdXJicSAqdXJicSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1MTMyX3VyYnEpLAorCQkJR0ZQX0FUT01JQyk7CisJCWlmICh1cmJxID09IE5VTEwpIHsKKwkJCWVuZHAtPnF1ZXVlX3NpemUgLT0gMTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9IGVsc2UgeworCQkJbGlzdF9hZGRfdGFpbCgmdXJicS0+dXJiX21vcmUsICZlbmRwLT51cmJfbW9yZSk7CisJCQl1cmJxLT51cmIgPSB1cmI7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX2VuZHBvaW50X2FuZF9xdWV1ZV9idWxrKHN0cnVjdCB1MTMyICp1MTMyLAorCXN0cnVjdCB1MTMyX3VkZXYgKnVkZXYsIHN0cnVjdCB1cmIgKnVyYiwKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwgdTggdXNiX2FkZHIsIHU4IHVzYl9lbmRwLCB1OCBhZGRyZXNzLAorCWdmcF90IG1lbV9mbGFncykKK3sKKwlpbnQgcmluZ19udW1iZXI7CisJc3RydWN0IHUxMzJfcmluZyAqcmluZzsKKwl1bnNpZ25lZCBsb25nIGlycXM7CisJaW50IHJjOworCXU4IGVuZHBfbnVtYmVyOworCXN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdTEzMl9lbmRwKSwgbWVtX2ZsYWdzKTsKKworCWlmICghZW5kcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaW5pdCgmZW5kcC0+cXVldWVfbG9jay5zbG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOworCXJjID0gdXNiX2hjZF9saW5rX3VyYl90b19lcCh1MTMyX3RvX2hjZCh1MTMyKSwgdXJiKTsKKwlpZiAocmMpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisJCWtmcmVlKGVuZHApOworCQlyZXR1cm4gcmM7CisJfQorCisJZW5kcF9udW1iZXIgPSArK3UxMzItPm51bV9lbmRwb2ludHM7CisJdXJiLT5lcC0+aGNwcml2ID0gdTEzMi0+ZW5kcFtlbmRwX251bWJlciAtIDFdID0gZW5kcDsKKwlJTklUX0RFTEFZRURfV09SSygmZW5kcC0+c2NoZWR1bGVyLCB1MTMyX2hjZF9lbmRwX3dvcmtfc2NoZWR1bGVyKTsKKwlJTklUX0xJU1RfSEVBRCgmZW5kcC0+dXJiX21vcmUpOworCWVuZHAtPmRlcXVldWVpbmcgPSAwOworCWVuZHAtPmVkc2V0X2ZsdXNoID0gMDsKKwllbmRwLT5hY3RpdmUgPSAwOworCWVuZHAtPmRlbGF5ZWQgPSAwOworCWVuZHAtPmVuZHBfbnVtYmVyID0gZW5kcF9udW1iZXI7CisJZW5kcC0+dTEzMiA9IHUxMzI7CisJZW5kcC0+aGVwID0gdXJiLT5lcDsKKwllbmRwLT5waXBldHlwZSA9IHVzYl9waXBldHlwZSh1cmItPnBpcGUpOworCXUxMzJfZW5kcF9pbml0X2tyZWYodTEzMiwgZW5kcCk7CisJaWYgKHVzYl9waXBlaW4odXJiLT5waXBlKSkgeworCQllbmRwLT50b2dnbGVfYml0cyA9IDB4MjsKKwkJdXNiX3NldHRvZ2dsZSh1ZGV2LT51c2JfZGV2aWNlLCB1c2JfZW5kcCwgMCwgMCk7CisJCXJpbmdfbnVtYmVyID0gMzsKKwkJZW5kcC0+aW5wdXQgPSAxOworCQllbmRwLT5vdXRwdXQgPSAwOworCQl1ZGV2LT5lbmRwX251bWJlcl9pblt1c2JfZW5kcF0gPSBlbmRwX251bWJlcjsKKwkJdTEzMl91ZGV2X2dldF9rcmVmKHUxMzIsIHVkZXYpOworCX0gZWxzZSB7CisJCWVuZHAtPnRvZ2dsZV9iaXRzID0gMHgyOworCQl1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIHVzYl9lbmRwLCAxLCAwKTsKKwkJcmluZ19udW1iZXIgPSAyOworCQllbmRwLT5pbnB1dCA9IDA7CisJCWVuZHAtPm91dHB1dCA9IDE7CisJCXVkZXYtPmVuZHBfbnVtYmVyX291dFt1c2JfZW5kcF0gPSBlbmRwX251bWJlcjsKKwkJdTEzMl91ZGV2X2dldF9rcmVmKHUxMzIsIHVkZXYpOworCX0KKwlyaW5nID0gZW5kcC0+cmluZyA9ICZ1MTMyLT5yaW5nW3JpbmdfbnVtYmVyIC0gMV07CisJaWYgKHJpbmctPmN1cnJfZW5kcCkgeworCQlsaXN0X2FkZF90YWlsKCZlbmRwLT5lbmRwX3JpbmcsICZyaW5nLT5jdXJyX2VuZHAtPmVuZHBfcmluZyk7CisJfSBlbHNlIHsKKwkJSU5JVF9MSVNUX0hFQUQoJmVuZHAtPmVuZHBfcmluZyk7CisJCXJpbmctPmN1cnJfZW5kcCA9IGVuZHA7CisJfQorCXJpbmctPmxlbmd0aCArPSAxOworCXVyYi0+aGNwcml2ID0gdTEzMjsKKwllbmRwLT51ZGV2X251bWJlciA9IGFkZHJlc3M7CisJZW5kcC0+dXNiX2FkZHIgPSB1c2JfYWRkcjsKKwllbmRwLT51c2JfZW5kcCA9IHVzYl9lbmRwOworCWVuZHAtPnF1ZXVlX3NpemUgPSAxOworCWVuZHAtPnF1ZXVlX2xhc3QgPSAwOworCWVuZHAtPnF1ZXVlX25leHQgPSAwOworCWVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX2xhc3QrK10gPSB1cmI7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisJdTEzMl9lbmRwX3F1ZXVlX3dvcmsodTEzMiwgZW5kcCwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXVldWVfYnVsa19vbl9vbGRfZW5kcG9pbnQoc3RydWN0IHUxMzIgKnUxMzIsIHN0cnVjdCB1MTMyX3VkZXYgKnVkZXYsCisJc3RydWN0IHVyYiAqdXJiLAorCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LCBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwLCB1OCB1c2JfYWRkciwKKwl1OCB1c2JfZW5kcCwgdTggYWRkcmVzcykKK3sKKwl1cmItPmhjcHJpdiA9IHUxMzI7CisJaWYgKGVuZHAtPnF1ZXVlX3NpemUrKyA8IEVORFBfUVVFVUVfU0laRSkgeworCQllbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJiBlbmRwLT5xdWV1ZV9sYXN0KytdID0gdXJiOworCX0gZWxzZSB7CisJCXN0cnVjdCB1MTMyX3VyYnEgKnVyYnEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdTEzMl91cmJxKSwKKwkJCUdGUF9BVE9NSUMpOworCQlpZiAodXJicSA9PSBOVUxMKSB7CisJCQllbmRwLT5xdWV1ZV9zaXplIC09IDE7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfSBlbHNlIHsKKwkJCWxpc3RfYWRkX3RhaWwoJnVyYnEtPnVyYl9tb3JlLCAmZW5kcC0+dXJiX21vcmUpOworCQkJdXJicS0+dXJiID0gdXJiOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNyZWF0ZV9lbmRwb2ludF9hbmRfcXVldWVfY29udHJvbChzdHJ1Y3QgdTEzMiAqdTEzMiwKKwlzdHJ1Y3QgdXJiICp1cmIsCisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHU4IHVzYl9hZGRyLCB1OCB1c2JfZW5kcCwKKwlnZnBfdCBtZW1fZmxhZ3MpCit7CisJc3RydWN0IHUxMzJfcmluZyAqcmluZzsKKwl1bnNpZ25lZCBsb25nIGlycXM7CisJaW50IHJjOworCXU4IGVuZHBfbnVtYmVyOworCXN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdTEzMl9lbmRwKSwgbWVtX2ZsYWdzKTsKKworCWlmICghZW5kcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaW5pdCgmZW5kcC0+cXVldWVfbG9jay5zbG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOworCXJjID0gdXNiX2hjZF9saW5rX3VyYl90b19lcCh1MTMyX3RvX2hjZCh1MTMyKSwgdXJiKTsKKwlpZiAocmMpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisJCWtmcmVlKGVuZHApOworCQlyZXR1cm4gcmM7CisJfQorCisJZW5kcF9udW1iZXIgPSArK3UxMzItPm51bV9lbmRwb2ludHM7CisJdXJiLT5lcC0+aGNwcml2ID0gdTEzMi0+ZW5kcFtlbmRwX251bWJlciAtIDFdID0gZW5kcDsKKwlJTklUX0RFTEFZRURfV09SSygmZW5kcC0+c2NoZWR1bGVyLCB1MTMyX2hjZF9lbmRwX3dvcmtfc2NoZWR1bGVyKTsKKwlJTklUX0xJU1RfSEVBRCgmZW5kcC0+dXJiX21vcmUpOworCXJpbmcgPSBlbmRwLT5yaW5nID0gJnUxMzItPnJpbmdbMF07CisJaWYgKHJpbmctPmN1cnJfZW5kcCkgeworCQlsaXN0X2FkZF90YWlsKCZlbmRwLT5lbmRwX3JpbmcsICZyaW5nLT5jdXJyX2VuZHAtPmVuZHBfcmluZyk7CisJfSBlbHNlIHsKKwkJSU5JVF9MSVNUX0hFQUQoJmVuZHAtPmVuZHBfcmluZyk7CisJCXJpbmctPmN1cnJfZW5kcCA9IGVuZHA7CisJfQorCXJpbmctPmxlbmd0aCArPSAxOworCWVuZHAtPmRlcXVldWVpbmcgPSAwOworCWVuZHAtPmVkc2V0X2ZsdXNoID0gMDsKKwllbmRwLT5hY3RpdmUgPSAwOworCWVuZHAtPmRlbGF5ZWQgPSAwOworCWVuZHAtPmVuZHBfbnVtYmVyID0gZW5kcF9udW1iZXI7CisJZW5kcC0+dTEzMiA9IHUxMzI7CisJZW5kcC0+aGVwID0gdXJiLT5lcDsKKwl1MTMyX2VuZHBfaW5pdF9rcmVmKHUxMzIsIGVuZHApOworCXUxMzJfZW5kcF9nZXRfa3JlZih1MTMyLCBlbmRwKTsKKwlpZiAodXNiX2FkZHIgPT0gMCkgeworCQl1OCBhZGRyZXNzID0gdTEzMi0+YWRkclt1c2JfYWRkcl0uYWRkcmVzczsKKwkJc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W2FkZHJlc3NdOworCQllbmRwLT51ZGV2X251bWJlciA9IGFkZHJlc3M7CisJCWVuZHAtPnVzYl9hZGRyID0gdXNiX2FkZHI7CisJCWVuZHAtPnVzYl9lbmRwID0gdXNiX2VuZHA7CisJCWVuZHAtPmlucHV0ID0gMTsKKwkJZW5kcC0+b3V0cHV0ID0gMTsKKwkJZW5kcC0+cGlwZXR5cGUgPSB1c2JfcGlwZXR5cGUodXJiLT5waXBlKTsKKwkJdTEzMl91ZGV2X2luaXRfa3JlZih1MTMyLCB1ZGV2KTsKKwkJdTEzMl91ZGV2X2dldF9rcmVmKHUxMzIsIHVkZXYpOworCQl1ZGV2LT5lbmRwX251bWJlcl9pblt1c2JfZW5kcF0gPSBlbmRwX251bWJlcjsKKwkJdWRldi0+ZW5kcF9udW1iZXJfb3V0W3VzYl9lbmRwXSA9IGVuZHBfbnVtYmVyOworCQl1cmItPmhjcHJpdiA9IHUxMzI7CisJCWVuZHAtPnF1ZXVlX3NpemUgPSAxOworCQllbmRwLT5xdWV1ZV9sYXN0ID0gMDsKKwkJZW5kcC0+cXVldWVfbmV4dCA9IDA7CisJCWVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX2xhc3QrK10gPSB1cmI7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOworCQl1MTMyX2VuZHBfcXVldWVfd29yayh1MTMyLCBlbmRwLCAwKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsJCS8qKHVzYl9hZGRyID4gMCkgKi8KKwkJdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbdXNiX2FkZHJdLmFkZHJlc3M7CisJCXN0cnVjdCB1MTMyX3VkZXYgKnVkZXYgPSAmdTEzMi0+dWRldlthZGRyZXNzXTsKKwkJZW5kcC0+dWRldl9udW1iZXIgPSBhZGRyZXNzOworCQllbmRwLT51c2JfYWRkciA9IHVzYl9hZGRyOworCQllbmRwLT51c2JfZW5kcCA9IHVzYl9lbmRwOworCQllbmRwLT5pbnB1dCA9IDE7CisJCWVuZHAtPm91dHB1dCA9IDE7CisJCWVuZHAtPnBpcGV0eXBlID0gdXNiX3BpcGV0eXBlKHVyYi0+cGlwZSk7CisJCXUxMzJfdWRldl9nZXRfa3JlZih1MTMyLCB1ZGV2KTsKKwkJdWRldi0+ZW51bWVyYXRpb24gPSAyOworCQl1ZGV2LT5lbmRwX251bWJlcl9pblt1c2JfZW5kcF0gPSBlbmRwX251bWJlcjsKKwkJdWRldi0+ZW5kcF9udW1iZXJfb3V0W3VzYl9lbmRwXSA9IGVuZHBfbnVtYmVyOworCQl1cmItPmhjcHJpdiA9IHUxMzI7CisJCWVuZHAtPnF1ZXVlX3NpemUgPSAxOworCQllbmRwLT5xdWV1ZV9sYXN0ID0gMDsKKwkJZW5kcC0+cXVldWVfbmV4dCA9IDA7CisJCWVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX2xhc3QrK10gPSB1cmI7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOworCQl1MTMyX2VuZHBfcXVldWVfd29yayh1MTMyLCBlbmRwLCAwKTsKKwkJcmV0dXJuIDA7CisJfQogfQogCiBzdGF0aWMgaW50IHF1ZXVlX2NvbnRyb2xfb25fb2xkX2VuZHBvaW50KHN0cnVjdCB1MTMyICp1MTMyLAogCXN0cnVjdCB1cmIgKnVyYiwKLSAgICAgICAgc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAsIHU4IHVzYl9hZGRyLAotICAgICAgICB1OCB1c2JfZW5kcCkKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2Rldiwgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCwgdTggdXNiX2FkZHIsCisJdTggdXNiX2VuZHApCiB7Ci0gICAgICAgIGlmICh1c2JfYWRkciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHVzYl9waXBlaW4odXJiLT5waXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXJiLT5oY3ByaXYgPSB1MTMyOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZHAtPnF1ZXVlX3NpemUrKyA8IEVORFBfUVVFVUVfU0laRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX2xhc3QrK10gPSB1cmI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl91cmJxICp1cmJxID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdTEzMl91cmJxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRlBfQVRPTUlDKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVyYnEgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX3NpemUgLT0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2FkZF90YWlsKCZ1cmJxLT51cmJfbW9yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmRwLT51cmJfbW9yZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJicS0+dXJiID0gdXJiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgLyogdXNiX3BpcGVvdXQodXJiLT5waXBlKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfYWRkciAqYWRkciA9ICZ1MTMyLT5hZGRyW3VzYl9kZXYtPmRldm51bV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgSSA9IE1BWF9VMTMyX1VERVZTOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKC0tSSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2WysraV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1ZGV2LT51c2JfZGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWRldi0+ZW51bWVyYXRpb24gPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzItPmFkZHJbMF0uYWRkcmVzcyA9IGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dWRldl9udW1iZXIgPSBpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkZXYtPnVkZXZfbnVtYmVyID0gaTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZGV2LT51c2JfYWRkciA9IHVzYl9kZXYtPmRldm51bTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX3VkZXZfaW5pdF9rcmVmKHUxMzIsIHVkZXYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkZXYtPmVuZHBfbnVtYmVyX2luW3VzYl9lbmRwXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5lbmRwX251bWJlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX3VkZXZfZ2V0X2tyZWYodTEzMiwgdWRldik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWRldi0+ZW5kcF9udW1iZXJfb3V0W3VzYl9lbmRwXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5lbmRwX251bWJlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZGV2LT51c2JfZGV2aWNlID0gdXNiX2RldjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHU4ICopICh1cmItPnNldHVwX3BhY2tldCkpWzJdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHItPmFkZHJlc3MgPSBpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfdWRldl9nZXRfa3JlZih1MTMyLCB1ZGV2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInJ1biBvdXQgb2YgZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXZpY2Ugc3BhY2VcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVyYi0+aGNwcml2ID0gdTEzMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmRwLT5xdWV1ZV9zaXplKysgPCBFTkRQX1FVRVVFX1NJWkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5xdWV1ZV9sYXN0KytdID0gdXJiOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfdXJicSAqdXJicSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21hbGxvYyhzaXplb2Yoc3RydWN0IHUxMzJfdXJicSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZQX0FUT01JQyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmJxID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5xdWV1ZV9zaXplIC09IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9hZGRfdGFpbCgmdXJicS0+dXJiX21vcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5kcC0+dXJiX21vcmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyYnEtPnVyYiA9IHVyYjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAvKih1c2JfYWRkciA+IDApICovCi0gICAgICAgICAgICAgICAgdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbdXNiX2FkZHJdLmFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W2FkZHJlc3NdOwotICAgICAgICAgICAgICAgIHVyYi0+aGNwcml2ID0gdTEzMjsKLSAgICAgICAgICAgICAgICBpZiAodWRldi0+ZW51bWVyYXRpb24gPT0gMikgewotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgdWRldi0+ZW51bWVyYXRpb24gPSAyOwotICAgICAgICAgICAgICAgIGlmIChlbmRwLT5xdWV1ZV9zaXplKysgPCBFTkRQX1FVRVVFX1NJWkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX2xhc3QrK10gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3VyYnEgKnVyYnEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdTEzMl91cmJxKSwgR0ZQX0FUT01JQyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXJicSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX3NpemUgLT0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2FkZF90YWlsKCZ1cmJxLT51cmJfbW9yZSwgJmVuZHAtPnVyYl9tb3JlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJicS0+dXJiID0gdXJiOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQorCWlmICh1c2JfYWRkciA9PSAwKSB7CisJCWlmICh1c2JfcGlwZWluKHVyYi0+cGlwZSkpIHsKKwkJCXVyYi0+aGNwcml2ID0gdTEzMjsKKwkJCWlmIChlbmRwLT5xdWV1ZV9zaXplKysgPCBFTkRQX1FVRVVFX1NJWkUpIHsKKwkJCQllbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJgorCQkJCQllbmRwLT5xdWV1ZV9sYXN0KytdID0gdXJiOworCQkJfSBlbHNlIHsKKwkJCQlzdHJ1Y3QgdTEzMl91cmJxICp1cmJxID0KKwkJCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IHUxMzJfdXJicSksCisJCQkJCUdGUF9BVE9NSUMpOworCQkJCWlmICh1cmJxID09IE5VTEwpIHsKKwkJCQkJZW5kcC0+cXVldWVfc2l6ZSAtPSAxOworCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQl9IGVsc2UgeworCQkJCQlsaXN0X2FkZF90YWlsKCZ1cmJxLT51cmJfbW9yZSwKKwkJCQkJCSZlbmRwLT51cmJfbW9yZSk7CisJCQkJCXVyYnEtPnVyYiA9IHVyYjsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsJLyogdXNiX3BpcGVvdXQodXJiLT5waXBlKSAqLworCQkJc3RydWN0IHUxMzJfYWRkciAqYWRkciA9ICZ1MTMyLT5hZGRyW3VzYl9kZXYtPmRldm51bV07CisJCQlpbnQgSSA9IE1BWF9VMTMyX1VERVZTOworCQkJaW50IGkgPSAwOworCQkJd2hpbGUgKC0tSSA+IDApIHsKKwkJCQlzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2ID0gJnUxMzItPnVkZXZbKytpXTsKKwkJCQlpZiAodWRldi0+dXNiX2RldmljZSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9IGVsc2UgeworCQkJCQl1ZGV2LT5lbnVtZXJhdGlvbiA9IDE7CisJCQkJCXUxMzItPmFkZHJbMF0uYWRkcmVzcyA9IGk7CisJCQkJCWVuZHAtPnVkZXZfbnVtYmVyID0gaTsKKwkJCQkJdWRldi0+dWRldl9udW1iZXIgPSBpOworCQkJCQl1ZGV2LT51c2JfYWRkciA9IHVzYl9kZXYtPmRldm51bTsKKwkJCQkJdTEzMl91ZGV2X2luaXRfa3JlZih1MTMyLCB1ZGV2KTsKKwkJCQkJdWRldi0+ZW5kcF9udW1iZXJfaW5bdXNiX2VuZHBdID0KKwkJCQkJCWVuZHAtPmVuZHBfbnVtYmVyOworCQkJCQl1MTMyX3VkZXZfZ2V0X2tyZWYodTEzMiwgdWRldik7CisJCQkJCXVkZXYtPmVuZHBfbnVtYmVyX291dFt1c2JfZW5kcF0gPQorCQkJCQkJZW5kcC0+ZW5kcF9udW1iZXI7CisJCQkJCXVkZXYtPnVzYl9kZXZpY2UgPSB1c2JfZGV2OworCQkJCQkoKHU4ICopICh1cmItPnNldHVwX3BhY2tldCkpWzJdID0KKwkJCQkJCWFkZHItPmFkZHJlc3MgPSBpOworCQkJCQl1MTMyX3VkZXZfZ2V0X2tyZWYodTEzMiwgdWRldik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChJID09IDApIHsKKwkJCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInJ1biBvdXQgb2YgZCIKKwkJCQkJImV2aWNlIHNwYWNlXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCXVyYi0+aGNwcml2ID0gdTEzMjsKKwkJCWlmIChlbmRwLT5xdWV1ZV9zaXplKysgPCBFTkRQX1FVRVVFX1NJWkUpIHsKKwkJCQllbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJgorCQkJCQllbmRwLT5xdWV1ZV9sYXN0KytdID0gdXJiOworCQkJfSBlbHNlIHsKKwkJCQlzdHJ1Y3QgdTEzMl91cmJxICp1cmJxID0KKwkJCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IHUxMzJfdXJicSksCisJCQkJCUdGUF9BVE9NSUMpOworCQkJCWlmICh1cmJxID09IE5VTEwpIHsKKwkJCQkJZW5kcC0+cXVldWVfc2l6ZSAtPSAxOworCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQl9IGVsc2UgeworCQkJCQlsaXN0X2FkZF90YWlsKCZ1cmJxLT51cmJfbW9yZSwKKwkJCQkJCSZlbmRwLT51cmJfbW9yZSk7CisJCQkJCXVyYnEtPnVyYiA9IHVyYjsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSB7CQkvKih1c2JfYWRkciA+IDApICovCisJCXU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW3VzYl9hZGRyXS5hZGRyZXNzOworCQlzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2ID0gJnUxMzItPnVkZXZbYWRkcmVzc107CisJCXVyYi0+aGNwcml2ID0gdTEzMjsKKwkJaWYgKHVkZXYtPmVudW1lcmF0aW9uICE9IDIpCisJCQl1ZGV2LT5lbnVtZXJhdGlvbiA9IDI7CisJCWlmIChlbmRwLT5xdWV1ZV9zaXplKysgPCBFTkRQX1FVRVVFX1NJWkUpIHsKKwkJCWVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX2xhc3QrK10gPQorCQkJCXVyYjsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCB1MTMyX3VyYnEgKnVyYnEgPQorCQkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1MTMyX3VyYnEpLCBHRlBfQVRPTUlDKTsKKwkJCWlmICh1cmJxID09IE5VTEwpIHsKKwkJCQllbmRwLT5xdWV1ZV9zaXplIC09IDE7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9IGVsc2UgeworCQkJCWxpc3RfYWRkX3RhaWwoJnVyYnEtPnVyYl9tb3JlLCAmZW5kcC0+dXJiX21vcmUpOworCQkJCXVyYnEtPnVyYiA9IHVyYjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgdTEzMl91cmJfZW5xdWV1ZShzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXJiICp1cmIsCiAJCWdmcF90IG1lbV9mbGFncykKIHsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOwotICAgICAgICBpZiAoaXJxc19kaXNhYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKF9fR0ZQX1dBSVQgJiBtZW1fZmxhZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiaW52YWxpZCBjb250ZXh0IGZvciBmdW5jdGlvbiB0aGF0IG1pZ2giCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0IHNsZWVwXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAxKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgLCB1MTMyLT5nb2luZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgICAgIH0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CisJc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOworCWlmIChpcnFzX2Rpc2FibGVkKCkpIHsKKwkJaWYgKF9fR0ZQX1dBSVQgJiBtZW1fZmxhZ3MpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiaW52YWxpZCBjb250ZXh0IGZvciBmdW5jdGlvbiB0aGF0IG1pZ2giCisJCQkJInQgc2xlZXBcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJaWYgKHUxMzItPmdvaW5nID4gMSkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCisJCQksIHUxMzItPmdvaW5nKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKIAkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZCAiCiAJCQkJInVyYj0lcFxuIiwgdXJiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVTSFVURE9XTjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1OCB1c2JfYWRkciA9IHVzYl9waXBlZGV2aWNlKHVyYi0+cGlwZSk7Ci0gICAgICAgICAgICAgICAgdTggdXNiX2VuZHAgPSB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSk7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSB1cmItPmRldjsKLSAgICAgICAgICAgICAgICBpZiAodXNiX3BpcGV0eXBlKHVyYi0+cGlwZSkgPT0gUElQRV9JTlRFUlJVUFQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW3VzYl9hZGRyXS5hZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W2FkZHJlc3NdOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IHVyYi0+ZXAtPmhjcHJpdjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVyYi0+YWN0dWFsX2xlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5kcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGlycXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXR2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlycXMpOworCQlyZXR1cm4gLUVTSFVURE9XTjsKKwl9IGVsc2UgeworCQl1OCB1c2JfYWRkciA9IHVzYl9waXBlZGV2aWNlKHVyYi0+cGlwZSk7CisJCXU4IHVzYl9lbmRwID0gdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpOworCQlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IHVyYi0+ZGV2OworCQlpZiAodXNiX3BpcGV0eXBlKHVyYi0+cGlwZSkgPT0gUElQRV9JTlRFUlJVUFQpIHsKKwkJCXU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW3VzYl9hZGRyXS5hZGRyZXNzOworCQkJc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W2FkZHJlc3NdOworCQkJc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IHVyYi0+ZXAtPmhjcHJpdjsKKwkJCXVyYi0+YWN0dWFsX2xlbmd0aCA9IDA7CisJCQlpZiAoZW5kcCkgeworCQkJCXVuc2lnbmVkIGxvbmcgaXJxczsKKwkJCQlpbnQgcmV0dmFsOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLAorCQkJCQlpcnFzKTsKIAkJCQlyZXR2YWwgPSB1c2JfaGNkX2xpbmtfdXJiX3RvX2VwKGhjZCwgdXJiKTsKIAkJCQlpZiAocmV0dmFsID09IDApIHsKIAkJCQkJcmV0dmFsID0gcXVldWVfaW50X29uX29sZF9lbmRwb2ludCgKQEAgLTIzMDMsMzkgKzIyODgsMzkgQEAKIAkJCQkJCQlhZGRyZXNzKTsKIAkJCQkJaWYgKHJldHZhbCkKIAkJCQkJCXVzYl9oY2RfdW5saW5rX3VyYl9mcm9tX2VwKAotCQkJCQkJCQloY2QsIHVyYik7CisJaGNkLCB1cmIpOwogCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcnFzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9lbmRwX3F1ZXVlX3dvcmsodTEzMiwgZW5kcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZWNzX3RvX2ppZmZpZXModXJiLT5pbnRlcnZhbCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodTEzMi0+bnVtX2VuZHBvaW50cyA9PSBNQVhfVTEzMl9FTkRQUykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAvKihlbmRwID09IE5VTEwpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVfZW5kcG9pbnRfYW5kX3F1ZXVlX2ludCh1MTMyLCB1ZGV2LAorCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssCisJCQkJCWlycXMpOworCQkJCWlmIChyZXR2YWwpIHsKKwkJCQkJcmV0dXJuIHJldHZhbDsKKwkJCQl9IGVsc2UgeworCQkJCQl1MTMyX2VuZHBfcXVldWVfd29yayh1MTMyLCBlbmRwLAorCQkJCQkJbXNlY3NfdG9famlmZmllcyh1cmItPmludGVydmFsKSkKKwkJCQkJCTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfSBlbHNlIGlmICh1MTMyLT5udW1fZW5kcG9pbnRzID09IE1BWF9VMTMyX0VORFBTKSB7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9IGVsc2UgewkvKihlbmRwID09IE5VTEwpICovCisJCQkJcmV0dXJuIGNyZWF0ZV9lbmRwb2ludF9hbmRfcXVldWVfaW50KHUxMzIsIHVkZXYsCiAJCQkJCQl1cmIsIHVzYl9kZXYsIHVzYl9hZGRyLAogCQkJCQkJdXNiX2VuZHAsIGFkZHJlc3MsIG1lbV9mbGFncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSA9PSBQSVBFX0lTT0NIUk9OT1VTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInRoZSBoYXJkd2FyZSBkb2VzIG5vIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidCBzdXBwb3J0IFBJUEVfSVNPQ0hST05PVVNcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSA9PSBQSVBFX0JVTEspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW3VzYl9hZGRyXS5hZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W2FkZHJlc3NdOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IHVyYi0+ZXAtPmhjcHJpdjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVyYi0+YWN0dWFsX2xlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5kcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGlycXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXR2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlycXMpOworCQkJfQorCQl9IGVsc2UgaWYgKHVzYl9waXBldHlwZSh1cmItPnBpcGUpID09IFBJUEVfSVNPQ0hST05PVVMpIHsKKwkJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAidGhlIGhhcmR3YXJlIGRvZXMgbm8iCisJCQkJInQgc3VwcG9ydCBQSVBFX0lTT0NIUk9OT1VTXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9IGVsc2UgaWYgKHVzYl9waXBldHlwZSh1cmItPnBpcGUpID09IFBJUEVfQlVMSykgeworCQkJdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbdXNiX2FkZHJdLmFkZHJlc3M7CisJCQlzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2ID0gJnUxMzItPnVkZXZbYWRkcmVzc107CisJCQlzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gdXJiLT5lcC0+aGNwcml2OworCQkJdXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsKKwkJCWlmIChlbmRwKSB7CisJCQkJdW5zaWduZWQgbG9uZyBpcnFzOworCQkJCWludCByZXR2YWw7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssCisJCQkJCWlycXMpOwogCQkJCXJldHZhbCA9IHVzYl9oY2RfbGlua191cmJfdG9fZXAoaGNkLCB1cmIpOwogCQkJCWlmIChyZXR2YWwgPT0gMCkgewogCQkJCQlyZXR2YWwgPSBxdWV1ZV9idWxrX29uX29sZF9lbmRwb2ludCgKQEAgLTIzNDUsNDYgKzIzMzAsNDYgQEAKIAkJCQkJCQlhZGRyZXNzKTsKIAkJCQkJaWYgKHJldHZhbCkKIAkJCQkJCXVzYl9oY2RfdW5saW5rX3VyYl9mcm9tX2VwKAotCQkJCQkJCQloY2QsIHVyYik7CisJaGNkLCB1cmIpOwogCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcnFzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9lbmRwX3F1ZXVlX3dvcmsodTEzMiwgZW5kcCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodTEzMi0+bnVtX2VuZHBvaW50cyA9PSBNQVhfVTEzMl9FTkRQUykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlX2VuZHBvaW50X2FuZF9xdWV1ZV9idWxrKHUxMzIsCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywKKwkJCQkJaXJxcyk7CisJCQkJaWYgKHJldHZhbCkgeworCQkJCQlyZXR1cm4gcmV0dmFsOworCQkJCX0gZWxzZSB7CisJCQkJCXUxMzJfZW5kcF9xdWV1ZV93b3JrKHUxMzIsIGVuZHAsIDApOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHUxMzItPm51bV9lbmRwb2ludHMgPT0gTUFYX1UxMzJfRU5EUFMpIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0gZWxzZQorCQkJCXJldHVybiBjcmVhdGVfZW5kcG9pbnRfYW5kX3F1ZXVlX2J1bGsodTEzMiwKIAkJCQkJdWRldiwgdXJiLCB1c2JfZGV2LCB1c2JfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2JfZW5kcCwgYWRkcmVzcywgbWVtX2ZsYWdzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IHVyYi0+ZXAtPmhjcHJpdjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxNiB1cmJfc2l6ZSA9IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1OCAqYiA9IHVyYi0+c2V0dXBfcGFja2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkYXRhWzMwICozICsgNF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpkID0gZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBtID0gKHNpemVvZihkYXRhKSAtIDEpIC8gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMF0gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHVyYl9zaXplLS0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID4gbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkrKyA8IG0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdyA9IHNwcmludGYoZCwgIiAlMDJYIiwgKmIrKyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCArPSB3OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gdzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCArPSBzcHJpbnRmKGQsICIgLi4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmRwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaXJxczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJxcyk7CisJCQkJCXVzYl9lbmRwLCBhZGRyZXNzLCBtZW1fZmxhZ3MpOworCQl9IGVsc2UgeworCQkJc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IHVyYi0+ZXAtPmhjcHJpdjsKKwkJCXUxNiB1cmJfc2l6ZSA9IDg7CisJCQl1OCAqYiA9IHVyYi0+c2V0dXBfcGFja2V0OworCQkJaW50IGkgPSAwOworCQkJY2hhciBkYXRhWzMwICogMyArIDRdOworCQkJY2hhciAqZCA9IGRhdGE7CisJCQlpbnQgbSA9IChzaXplb2YoZGF0YSkgLSAxKSAvIDM7CisJCQlpbnQgbCA9IDA7CisJCQlkYXRhWzBdID0gMDsKKwkJCXdoaWxlICh1cmJfc2l6ZS0tID4gMCkgeworCQkJCWlmIChpID4gbSkgeworCQkJCX0gZWxzZSBpZiAoaSsrIDwgbSkgeworCQkJCQlpbnQgdyA9IHNwcmludGYoZCwgIiAlMDJYIiwgKmIrKyk7CisJCQkJCWQgKz0gdzsKKwkJCQkJbCArPSB3OworCQkJCX0gZWxzZQorCQkJCQlkICs9IHNwcmludGYoZCwgIiAuLiIpOworCQkJfQorCQkJaWYgKGVuZHApIHsKKwkJCQl1bnNpZ25lZCBsb25nIGlycXM7CisJCQkJaW50IHJldHZhbDsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywKKwkJCQkJaXJxcyk7CiAJCQkJcmV0dmFsID0gdXNiX2hjZF9saW5rX3VyYl90b19lcChoY2QsIHVyYik7CiAJCQkJaWYgKHJldHZhbCA9PSAwKSB7CiAJCQkJCXJldHZhbCA9IHF1ZXVlX2NvbnRyb2xfb25fb2xkX2VuZHBvaW50KApAQCAtMjM5NSwyNjcgKzIzODAsMjY3IEBACiAJCQkJCQl1c2JfaGNkX3VubGlua191cmJfZnJvbV9lcCgKIAkJCQkJCQkJaGNkLCB1cmIpOwogCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcnFzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9lbmRwX3F1ZXVlX3dvcmsodTEzMiwgZW5kcCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodTEzMi0+bnVtX2VuZHBvaW50cyA9PSBNQVhfVTEzMl9FTkRQUykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlX2VuZHBvaW50X2FuZF9xdWV1ZV9jb250cm9sKHUxMzIsCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywKKwkJCQkJaXJxcyk7CisJCQkJaWYgKHJldHZhbCkgeworCQkJCQlyZXR1cm4gcmV0dmFsOworCQkJCX0gZWxzZSB7CisJCQkJCXUxMzJfZW5kcF9xdWV1ZV93b3JrKHUxMzIsIGVuZHAsIDApOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHUxMzItPm51bV9lbmRwb2ludHMgPT0gTUFYX1UxMzJfRU5EUFMpIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0gZWxzZQorCQkJCXJldHVybiBjcmVhdGVfZW5kcG9pbnRfYW5kX3F1ZXVlX2NvbnRyb2wodTEzMiwKIAkJCQkJdXJiLCB1c2JfZGV2LCB1c2JfYWRkciwgdXNiX2VuZHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtX2ZsYWdzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJCQkJbWVtX2ZsYWdzKTsKKwkJfQorCX0KIH0KIAogc3RhdGljIGludCBkZXF1ZXVlX2Zyb21fb3ZlcmZsb3dfY2hhaW4oc3RydWN0IHUxMzIgKnUxMzIsCi0gICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYikKKwlzdHJ1Y3QgdTEzMl9lbmRwICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0gICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKnNjYW47Ci0gICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmZW5kcC0+dXJiX21vcmU7Ci0gICAgICAgIGxpc3RfZm9yX2VhY2goc2NhbiwgaGVhZCkgewotICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3VyYnEgKnVyYnEgPSBsaXN0X2VudHJ5KHNjYW4sIHN0cnVjdCB1MTMyX3VyYnEsCi0gICAgICAgICAgICAgICAgICAgICAgICB1cmJfbW9yZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHVyYnEtPnVyYiA9PSB1cmIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1c2JfaGNkICpoY2QgPSB1MTMyX3RvX2hjZCh1MTMyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfZGVsKHNjYW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+cXVldWVfc2l6ZSAtPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgdXJiLT5lcnJvcl9jb3VudCA9IDA7CisJc3RydWN0IGxpc3RfaGVhZCAqc2NhbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJmVuZHAtPnVyYl9tb3JlOworCWxpc3RfZm9yX2VhY2goc2NhbiwgaGVhZCkgeworCQlzdHJ1Y3QgdTEzMl91cmJxICp1cmJxID0gbGlzdF9lbnRyeShzY2FuLCBzdHJ1Y3QgdTEzMl91cmJxLAorCQkJdXJiX21vcmUpOworCQlpZiAodXJicS0+dXJiID09IHVyYikgeworCQkJc3RydWN0IHVzYl9oY2QgKmhjZCA9IHUxMzJfdG9faGNkKHUxMzIpOworCQkJbGlzdF9kZWwoc2Nhbik7CisJCQllbmRwLT5xdWV1ZV9zaXplIC09IDE7CisJCQl1cmItPmVycm9yX2NvdW50ID0gMDsKIAkJCXVzYl9oY2RfZ2l2ZWJhY2tfdXJiKGhjZCwgdXJiLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJ1cmI9JXAgbm90IGZvdW5kIGluIGVuZHBbJWRdPSVwIHJpbmciCi0gICAgICAgICAgICAgICAgIlslZF0gJWMlYyB1c2JfZW5kcD0lZCB1c2JfYWRkcj0lZCBzaXplPSVkIG5leHQ9JTA0WCBsYXN0PSUwNFgiCi0gICAgICAgICAgICAgICAgIlxuIiwgdXJiLCBlbmRwLT5lbmRwX251bWJlciwgZW5kcCwgZW5kcC0+cmluZy0+bnVtYmVyLAotICAgICAgICAgICAgICAgIGVuZHAtPmlucHV0ID8gJ0knIDogJyAnLCBlbmRwLT5vdXRwdXQgPyAnTycgOiAnICcsCi0gICAgICAgICAgICAgICAgZW5kcC0+dXNiX2VuZHAsIGVuZHAtPnVzYl9hZGRyLCBlbmRwLT5xdWV1ZV9zaXplLAotICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX25leHQsIGVuZHAtPnF1ZXVlX2xhc3QpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiAwOworCQl9IGVsc2UKKwkJCWNvbnRpbnVlOworCX0KKwlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInVyYj0lcCBub3QgZm91bmQgaW4gZW5kcFslZF09JXAgcmluZyIKKwkJIlslZF0gJWMlYyB1c2JfZW5kcD0lZCB1c2JfYWRkcj0lZCBzaXplPSVkIG5leHQ9JTA0WCBsYXN0PSUwNFgiCisJCSJcbiIsIHVyYiwgZW5kcC0+ZW5kcF9udW1iZXIsIGVuZHAsIGVuZHAtPnJpbmctPm51bWJlciwKKwkJZW5kcC0+aW5wdXQgPyAnSScgOiAnICcsIGVuZHAtPm91dHB1dCA/ICdPJyA6ICcgJywKKwkJZW5kcC0+dXNiX2VuZHAsIGVuZHAtPnVzYl9hZGRyLCBlbmRwLT5xdWV1ZV9zaXplLAorCQllbmRwLT5xdWV1ZV9uZXh0LCBlbmRwLT5xdWV1ZV9sYXN0KTsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogc3RhdGljIGludCB1MTMyX2VuZHBfdXJiX2RlcXVldWUoc3RydWN0IHUxMzIgKnUxMzIsIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAsCiAJCXN0cnVjdCB1cmIgKnVyYiwgaW50IHN0YXR1cykKIHsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBpcnFzOworCXVuc2lnbmVkIGxvbmcgaXJxczsKIAlpbnQgcmM7CiAKLSAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOworCXNwaW5fbG9ja19pcnFzYXZlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKIAlyYyA9IHVzYl9oY2RfY2hlY2tfdW5saW5rX3VyYih1MTMyX3RvX2hjZCh1MTMyKSwgdXJiLCBzdGF0dXMpOwogCWlmIChyYykgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKIAkJcmV0dXJuIHJjOwogCX0KLSAgICAgICAgaWYgKGVuZHAtPnF1ZXVlX3NpemUgPT0gMCkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAidXJiPSVwIG5vdCBmb3VuZCBpbiBlbmRwWyVkXSIKLSAgICAgICAgICAgICAgICAgICAgICAgICI9JXAgcmluZ1slZF0gJWMlYyB1c2JfZW5kcD0lZCB1c2JfYWRkcj0lZFxuIiwgdXJiLAotICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+ZW5kcF9udW1iZXIsIGVuZHAsIGVuZHAtPnJpbmctPm51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPmlucHV0ID8gJ0knIDogJyAnLCBlbmRwLT5vdXRwdXQgPyAnTycgOiAnICcsCi0gICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT51c2JfZW5kcCwgZW5kcC0+dXNiX2FkZHIpOwotICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1cmIgPT0gZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYgZW5kcC0+cXVldWVfbmV4dF0pIHsKLSAgICAgICAgICAgICAgICBpZiAoZW5kcC0+YWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5kZXF1ZXVlaW5nID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPmVkc2V0X2ZsdXNoID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfZW5kcF9xdWV1ZV93b3JrKHUxMzIsIGVuZHAsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisJaWYgKGVuZHAtPnF1ZXVlX3NpemUgPT0gMCkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInVyYj0lcCBub3QgZm91bmQgaW4gZW5kcFslZF0iCisJCQkiPSVwIHJpbmdbJWRdICVjJWMgdXNiX2VuZHA9JWQgdXNiX2FkZHI9JWRcbiIsIHVyYiwKKwkJCWVuZHAtPmVuZHBfbnVtYmVyLCBlbmRwLCBlbmRwLT5yaW5nLT5udW1iZXIsCisJCQllbmRwLT5pbnB1dCA/ICdJJyA6ICcgJywgZW5kcC0+b3V0cHV0ID8gJ08nIDogJyAnLAorCQkJZW5kcC0+dXNiX2VuZHAsIGVuZHAtPnVzYl9hZGRyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAodXJiID09IGVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX25leHRdKSB7CisJCWlmIChlbmRwLT5hY3RpdmUpIHsKKwkJCWVuZHAtPmRlcXVldWVpbmcgPSAxOworCQkJZW5kcC0+ZWRzZXRfZmx1c2ggPSAxOworCQkJdTEzMl9lbmRwX3F1ZXVlX3dvcmsodTEzMiwgZW5kcCwgMCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CiAJCQl1MTMyX2hjZF9hYmFuZG9uX3VyYih1MTMyLCBlbmRwLCB1cmIsIHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdTE2IHF1ZXVlX2xpc3QgPSAwOwotICAgICAgICAgICAgICAgIHUxNiBxdWV1ZV9zaXplID0gZW5kcC0+cXVldWVfc2l6ZTsKLSAgICAgICAgICAgICAgICB1MTYgcXVldWVfc2NhbiA9IGVuZHAtPnF1ZXVlX25leHQ7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHVyYiAqKnVyYl9zbG90ID0gTlVMTDsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKytxdWV1ZV9saXN0IDwgRU5EUF9RVUVVRV9TSVpFICYmIC0tcXVldWVfc2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmIgPT0gZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytxdWV1ZV9zY2FuXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmJfc2xvdCA9ICZlbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlX3NjYW5dOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCsrcXVldWVfbGlzdCA8IEVORFBfUVVFVUVfU0laRSAmJiAtLXF1ZXVlX3NpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqdXJiX3Nsb3QgPSBlbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3F1ZXVlX3NjYW5dOwotICAgICAgICAgICAgICAgICAgICAgICAgdXJiX3Nsb3QgPSAmZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVfc2Nhbl07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh1cmJfc2xvdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9oY2QgKmhjZCA9IHUxMzJfdG9faGNkKHUxMzIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQl1MTYgcXVldWVfbGlzdCA9IDA7CisJCXUxNiBxdWV1ZV9zaXplID0gZW5kcC0+cXVldWVfc2l6ZTsKKwkJdTE2IHF1ZXVlX3NjYW4gPSBlbmRwLT5xdWV1ZV9uZXh0OworCQlzdHJ1Y3QgdXJiICoqdXJiX3Nsb3QgPSBOVUxMOworCQl3aGlsZSAoKytxdWV1ZV9saXN0IDwgRU5EUF9RVUVVRV9TSVpFICYmIC0tcXVldWVfc2l6ZSA+IDApIHsKKwkJCWlmICh1cmIgPT0gZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYKKwkJCQkrK3F1ZXVlX3NjYW5dKSB7CisJCQkJdXJiX3Nsb3QgPSAmZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYKKwkJCQkJcXVldWVfc2Nhbl07CisJCQkJYnJlYWs7CisJCQl9IGVsc2UKKwkJCQljb250aW51ZTsKKwkJfQorCQl3aGlsZSAoKytxdWV1ZV9saXN0IDwgRU5EUF9RVUVVRV9TSVpFICYmIC0tcXVldWVfc2l6ZSA+IDApIHsKKwkJCSp1cmJfc2xvdCA9IGVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmCisJCQkJKytxdWV1ZV9zY2FuXTsKKwkJCXVyYl9zbG90ID0gJmVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmCisJCQkJcXVldWVfc2Nhbl07CisJCX0KKwkJaWYgKHVyYl9zbG90KSB7CisJCQlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gdTEzMl90b19oY2QodTEzMik7CiAKIAkJCXVzYl9oY2RfdW5saW5rX3VyYl9mcm9tX2VwKGhjZCwgdXJiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX3NpemUgLT0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0X2VtcHR5KCZlbmRwLT51cmJfbW9yZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcnFzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKm5leHQgPSBlbmRwLT51cmJfbW9yZS5uZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl91cmJxICp1cmJxID0gbGlzdF9lbnRyeShuZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3VyYnEsIHVyYl9tb3JlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9kZWwobmV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp1cmJfc2xvdCA9IHVyYnEtPnVyYjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcnFzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2ZyZWUodXJicSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IHVyYi0+ZXJyb3JfY291bnQgPSAwOworCQkJZW5kcC0+cXVldWVfc2l6ZSAtPSAxOworCQkJaWYgKGxpc3RfZW1wdHkoJmVuZHAtPnVyYl9tb3JlKSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssCisJCQkJCWlycXMpOworCQkJfSBlbHNlIHsKKwkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0ID0gZW5kcC0+dXJiX21vcmUubmV4dDsKKwkJCQlzdHJ1Y3QgdTEzMl91cmJxICp1cmJxID0gbGlzdF9lbnRyeShuZXh0LAorCQkJCQlzdHJ1Y3QgdTEzMl91cmJxLCB1cmJfbW9yZSk7CisJCQkJbGlzdF9kZWwobmV4dCk7CisJCQkJKnVyYl9zbG90ID0gdXJicS0+dXJiOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssCisJCQkJCWlycXMpOworCQkJCWtmcmVlKHVyYnEpOworCQkJfSB1cmItPmVycm9yX2NvdW50ID0gMDsKIAkJCXVzYl9oY2RfZ2l2ZWJhY2tfdXJiKGhjZCwgdXJiLCBzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaXN0X2VtcHR5KCZlbmRwLT51cmJfbW9yZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAidXJiPSVwIG5vdCBmb3VuZCBpbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmRwWyVkXT0lcCByaW5nWyVkXSAlYyVjIHVzYl9lbmRwPSVkIHVzYl9hZGRyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPSVkIHNpemU9JWQgbmV4dD0lMDRYIGxhc3Q9JTA0WFxuIiwgdXJiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5lbmRwX251bWJlciwgZW5kcCwgZW5kcC0+cmluZy0+bnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5pbnB1dCA/ICdJJyA6ICcgJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+b3V0cHV0ID8gJ08nIDogJyAnLCBlbmRwLT51c2JfZW5kcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dXNiX2FkZHIsIGVuZHAtPnF1ZXVlX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX25leHQsIGVuZHAtPnF1ZXVlX2xhc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgeworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAobGlzdF9lbXB0eSgmZW5kcC0+dXJiX21vcmUpKSB7CisJCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInVyYj0lcCBub3QgZm91bmQgaW4gIgorCQkJCSJlbmRwWyVkXT0lcCByaW5nWyVkXSAlYyVjIHVzYl9lbmRwPSVkIHVzYl9hZGRyIgorCQkJCSI9JWQgc2l6ZT0lZCBuZXh0PSUwNFggbGFzdD0lMDRYXG4iLCB1cmIsCisJCQkJZW5kcC0+ZW5kcF9udW1iZXIsIGVuZHAsIGVuZHAtPnJpbmctPm51bWJlciwKKwkJCQllbmRwLT5pbnB1dCA/ICdJJyA6ICcgJywKKwkJCQllbmRwLT5vdXRwdXQgPyAnTycgOiAnICcsIGVuZHAtPnVzYl9lbmRwLAorCQkJCWVuZHAtPnVzYl9hZGRyLCBlbmRwLT5xdWV1ZV9zaXplLAorCQkJCWVuZHAtPnF1ZXVlX25leHQsIGVuZHAtPnF1ZXVlX2xhc3QpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfSBlbHNlIHsKIAkJCWludCByZXR2YWw7CiAKIAkJCXVzYl9oY2RfdW5saW5rX3VyYl9mcm9tX2VwKHUxMzJfdG9faGNkKHUxMzIpLCB1cmIpOwogCQkJcmV0dmFsID0gZGVxdWV1ZV9mcm9tX292ZXJmbG93X2NoYWluKHUxMzIsIGVuZHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9CisJCQkJdXJiKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCX0KIH0KIAogc3RhdGljIGludCB1MTMyX3VyYl9kZXF1ZXVlKHN0cnVjdCB1c2JfaGNkICpoY2QsIHN0cnVjdCB1cmIgKnVyYiwgaW50IHN0YXR1cykKIHsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOwotICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAyKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgLCB1MTMyLT5nb2luZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdTggdXNiX2FkZHIgPSB1c2JfcGlwZWRldmljZSh1cmItPnBpcGUpOwotICAgICAgICAgICAgICAgIHU4IHVzYl9lbmRwID0gdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpOwotICAgICAgICAgICAgICAgIHU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW3VzYl9hZGRyXS5hZGRyZXNzOwotICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3VkZXYgKnVkZXYgPSAmdTEzMi0+dWRldlthZGRyZXNzXTsKLSAgICAgICAgICAgICAgICBpZiAodXNiX3BpcGVpbih1cmItPnBpcGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1OCBlbmRwX251bWJlciA9IHVkZXYtPmVuZHBfbnVtYmVyX2luW3VzYl9lbmRwXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSB1MTMyLT5lbmRwW2VuZHBfbnVtYmVyIC0gMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdTEzMl9lbmRwX3VyYl9kZXF1ZXVlKHUxMzIsIGVuZHAsIHVyYiwgc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdTggZW5kcF9udW1iZXIgPSB1ZGV2LT5lbmRwX251bWJlcl9vdXRbdXNiX2VuZHBdOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IHUxMzItPmVuZHBbZW5kcF9udW1iZXIgLSAxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1MTMyX2VuZHBfdXJiX2RlcXVldWUodTEzMiwgZW5kcCwgdXJiLCBzdGF0dXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQorCXN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAyKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9IGVsc2UgeworCQl1OCB1c2JfYWRkciA9IHVzYl9waXBlZGV2aWNlKHVyYi0+cGlwZSk7CisJCXU4IHVzYl9lbmRwID0gdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpOworCQl1OCBhZGRyZXNzID0gdTEzMi0+YWRkclt1c2JfYWRkcl0uYWRkcmVzczsKKwkJc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W2FkZHJlc3NdOworCQlpZiAodXNiX3BpcGVpbih1cmItPnBpcGUpKSB7CisJCQl1OCBlbmRwX251bWJlciA9IHVkZXYtPmVuZHBfbnVtYmVyX2luW3VzYl9lbmRwXTsKKwkJCXN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSB1MTMyLT5lbmRwW2VuZHBfbnVtYmVyIC0gMV07CisJCQlyZXR1cm4gdTEzMl9lbmRwX3VyYl9kZXF1ZXVlKHUxMzIsIGVuZHAsIHVyYiwgc3RhdHVzKTsKKwkJfSBlbHNlIHsKKwkJCXU4IGVuZHBfbnVtYmVyID0gdWRldi0+ZW5kcF9udW1iZXJfb3V0W3VzYl9lbmRwXTsKKwkJCXN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSB1MTMyLT5lbmRwW2VuZHBfbnVtYmVyIC0gMV07CisJCQlyZXR1cm4gdTEzMl9lbmRwX3VyYl9kZXF1ZXVlKHUxMzIsIGVuZHAsIHVyYiwgc3RhdHVzKTsKKwkJfQorCX0KIH0KIAogc3RhdGljIHZvaWQgdTEzMl9lbmRwb2ludF9kaXNhYmxlKHN0cnVjdCB1c2JfaGNkICpoY2QsCi0gICAgICAgIHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqaGVwKQorCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqaGVwKQogewotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7Ci0gICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDIpIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInUxMzIgZGV2aWNlICVwKGhjZD0lcCBoZXA9JXAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiKSBoYXMgYmVlbiByZW1vdmVkICVkXG4iLCB1MTMyLCBoY2QsIGhlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzItPmdvaW5nKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gaGVwLT5oY3ByaXY7Ci0gICAgICAgICAgICAgICAgaWYgKGVuZHApCi0gICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2VuZHBfcHV0X2tyZWYodTEzMiwgZW5kcCk7Ci0gICAgICAgIH0KKwlzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7CisJaWYgKHUxMzItPmdvaW5nID4gMikgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInUxMzIgZGV2aWNlICVwKGhjZD0lcCBoZXA9JXAiCisJCQkiKSBoYXMgYmVlbiByZW1vdmVkICVkXG4iLCB1MTMyLCBoY2QsIGhlcCwKKwkJCXUxMzItPmdvaW5nKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gaGVwLT5oY3ByaXY7CisJCWlmIChlbmRwKQorCQkJdTEzMl9lbmRwX3B1dF9rcmVmKHUxMzIsIGVuZHApOworCX0KIH0KIAogc3RhdGljIGludCB1MTMyX2dldF9mcmFtZShzdHJ1Y3QgdXNiX2hjZCAqaGNkKQogewotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7Ci0gICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVTSFVURE9XTjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgZnJhbWUgPSAwOwotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiVE9ETzogdTEzMl9nZXRfZnJhbWVcbiIpOwotICAgICAgICAgICAgICAgIG1zbGVlcCgxMDApOwotICAgICAgICAgICAgICAgIHJldHVybiBmcmFtZTsKLSAgICAgICAgfQorCXN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkXG4iKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfSBlbHNlIHsKKwkJaW50IGZyYW1lID0gMDsKKwkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJUT0RPOiB1MTMyX2dldF9mcmFtZVxuIik7CisJCW1zbGVlcCgxMDApOworCQlyZXR1cm4gZnJhbWU7CisJfQogfQogCiBzdGF0aWMgaW50IHUxMzJfcm9vdGh1Yl9kZXNjcmlwdG9yKHN0cnVjdCB1MTMyICp1MTMyLAotICAgICAgICBzdHJ1Y3QgdXNiX2h1Yl9kZXNjcmlwdG9yICpkZXNjKQorCXN0cnVjdCB1c2JfaHViX2Rlc2NyaXB0b3IgKmRlc2MpCiB7Ci0gICAgICAgIGludCByZXR2YWw7Ci0gICAgICAgIHUxNiB0ZW1wOwotICAgICAgICB1MzIgcmhfYSA9IC0xOwotICAgICAgICB1MzIgcmhfYiA9IC0xOwotICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIHJvb3RodWIuYSwgJnJoX2EpOwotICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIGRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9IDB4Mjk7Ci0gICAgICAgIGRlc2MtPmJQd3JPbjJQd3JHb29kID0gKHJoX2EgJiBSSF9BX1BPVFBHVCkgPj4gMjQ7Ci0gICAgICAgIGRlc2MtPmJIdWJDb250ckN1cnJlbnQgPSAwOwotICAgICAgICBkZXNjLT5iTmJyUG9ydHMgPSB1MTMyLT5udW1fcG9ydHM7Ci0gICAgICAgIHRlbXAgPSAxICsgKHUxMzItPm51bV9wb3J0cyAvIDgpOwotICAgICAgICBkZXNjLT5iRGVzY0xlbmd0aCA9IDcgKyAyICp0ZW1wOwotICAgICAgICB0ZW1wID0gMDsKLSAgICAgICAgaWYgKHJoX2EgJiBSSF9BX05QUykKLSAgICAgICAgICAgICAgICB0ZW1wIHw9IDB4MDAwMjsKLSAgICAgICAgaWYgKHJoX2EgJiBSSF9BX1BTTSkKLSAgICAgICAgICAgICAgICB0ZW1wIHw9IDB4MDAwMTsKLSAgICAgICAgaWYgKHJoX2EgJiBSSF9BX05PQ1ApIHsKLSAgICAgICAgICAgICAgICB0ZW1wIHw9IDB4MDAxMDsKLSAgICAgICAgfSBlbHNlIGlmIChyaF9hICYgUkhfQV9PQ1BNKQotICAgICAgICAgICAgICAgIHRlbXAgfD0gMHgwMDA4OwotICAgICAgICBkZXNjLT53SHViQ2hhcmFjdGVyaXN0aWNzID0gY3B1X3RvX2xlMTYodGVtcCk7Ci0gICAgICAgIHJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgcm9vdGh1Yi5iLCAmcmhfYik7Ci0gICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgbWVtc2V0KGRlc2MtPmJpdG1hcCwgMHhmZiwgc2l6ZW9mKGRlc2MtPmJpdG1hcCkpOwotICAgICAgICBkZXNjLT5iaXRtYXBbMF0gPSByaF9iICYgUkhfQl9EUjsKLSAgICAgICAgaWYgKHUxMzItPm51bV9wb3J0cyA+IDcpIHsKLSAgICAgICAgICAgICAgICBkZXNjLT5iaXRtYXBbMV0gPSAocmhfYiAmIFJIX0JfRFIpID4+IDg7Ci0gICAgICAgICAgICAgICAgZGVzYy0+Yml0bWFwWzJdID0gMHhmZjsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgZGVzYy0+Yml0bWFwWzFdID0gMHhmZjsKLSAgICAgICAgcmV0dXJuIDA7CisJaW50IHJldHZhbDsKKwl1MTYgdGVtcDsKKwl1MzIgcmhfYSA9IC0xOworCXUzMiByaF9iID0gLTE7CisJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCByb290aHViLmEsICZyaF9hKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCWRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9IDB4Mjk7CisJZGVzYy0+YlB3ck9uMlB3ckdvb2QgPSAocmhfYSAmIFJIX0FfUE9UUEdUKSA+PiAyNDsKKwlkZXNjLT5iSHViQ29udHJDdXJyZW50ID0gMDsKKwlkZXNjLT5iTmJyUG9ydHMgPSB1MTMyLT5udW1fcG9ydHM7CisJdGVtcCA9IDEgKyAodTEzMi0+bnVtX3BvcnRzIC8gOCk7CisJZGVzYy0+YkRlc2NMZW5ndGggPSA3ICsgMiAqIHRlbXA7CisJdGVtcCA9IDA7CisJaWYgKHJoX2EgJiBSSF9BX05QUykKKwkJdGVtcCB8PSAweDAwMDI7CisJaWYgKHJoX2EgJiBSSF9BX1BTTSkKKwkJdGVtcCB8PSAweDAwMDE7CisJaWYgKHJoX2EgJiBSSF9BX05PQ1ApCisJCXRlbXAgfD0gMHgwMDEwOworCWVsc2UgaWYgKHJoX2EgJiBSSF9BX09DUE0pCisJCXRlbXAgfD0gMHgwMDA4OworCWRlc2MtPndIdWJDaGFyYWN0ZXJpc3RpY3MgPSBjcHVfdG9fbGUxNih0ZW1wKTsKKwlyZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIHJvb3RodWIuYiwgJnJoX2IpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJbWVtc2V0KGRlc2MtPmJpdG1hcCwgMHhmZiwgc2l6ZW9mKGRlc2MtPmJpdG1hcCkpOworCWRlc2MtPmJpdG1hcFswXSA9IHJoX2IgJiBSSF9CX0RSOworCWlmICh1MTMyLT5udW1fcG9ydHMgPiA3KSB7CisJCWRlc2MtPmJpdG1hcFsxXSA9IChyaF9iICYgUkhfQl9EUikgPj4gODsKKwkJZGVzYy0+Yml0bWFwWzJdID0gMHhmZjsKKwl9IGVsc2UKKwkJZGVzYy0+Yml0bWFwWzFdID0gMHhmZjsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB1MTMyX3Jvb3RodWJfc3RhdHVzKHN0cnVjdCB1MTMyICp1MTMyLCBfX2xlMzIgKmRlc2MpCiB7Ci0gICAgICAgIHUzMiByaF9zdGF0dXMgPSAtMTsKLSAgICAgICAgaW50IHJldF9zdGF0dXMgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIHJvb3RodWIuc3RhdHVzLCAmcmhfc3RhdHVzKTsKLSAgICAgICAgKmRlc2MgPSBjcHVfdG9fbGUzMihyaF9zdGF0dXMpOwotICAgICAgICByZXR1cm4gcmV0X3N0YXR1czsKKwl1MzIgcmhfc3RhdHVzID0gLTE7CisJaW50IHJldF9zdGF0dXMgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIHJvb3RodWIuc3RhdHVzLCAmcmhfc3RhdHVzKTsKKwkqZGVzYyA9IGNwdV90b19sZTMyKHJoX3N0YXR1cyk7CisJcmV0dXJuIHJldF9zdGF0dXM7CiB9CiAKIHN0YXRpYyBpbnQgdTEzMl9yb290aHViX3BvcnRzdGF0dXMoc3RydWN0IHUxMzIgKnUxMzIsIF9fbGUzMiAqZGVzYywgdTE2IHdJbmRleCkKIHsKLSAgICAgICAgaWYgKHdJbmRleCA9PSAwIHx8IHdJbmRleCA+IHUxMzItPm51bV9wb3J0cykgewotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCBwb3J0ID0gd0luZGV4IC0gMTsKLSAgICAgICAgICAgICAgICB1MzIgcmhfcG9ydHN0YXR1cyA9IC0xOwotICAgICAgICAgICAgICAgIGludCByZXRfcG9ydHN0YXR1cyA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RodWIucG9ydHN0YXR1c1twb3J0XSwgJnJoX3BvcnRzdGF0dXMpOwotICAgICAgICAgICAgICAgICpkZXNjID0gY3B1X3RvX2xlMzIocmhfcG9ydHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgaWYgKCoodTE2ICopIChkZXNjICsgMikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldl9pbmZvKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgIlBvcnQgJWQgU3RhdHVzIENoYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZSA9ICUwOFhcbiIsIHBvcnQsICpkZXNjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF9wb3J0c3RhdHVzOwotICAgICAgICB9CisJaWYgKHdJbmRleCA9PSAwIHx8IHdJbmRleCA+IHUxMzItPm51bV9wb3J0cykgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlpbnQgcG9ydCA9IHdJbmRleCAtIDE7CisJCXUzMiByaF9wb3J0c3RhdHVzID0gLTE7CisJCWludCByZXRfcG9ydHN0YXR1cyA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwKKwkJCXJvb3RodWIucG9ydHN0YXR1c1twb3J0XSwgJnJoX3BvcnRzdGF0dXMpOworCQkqZGVzYyA9IGNwdV90b19sZTMyKHJoX3BvcnRzdGF0dXMpOworCQlpZiAoKih1MTYgKikgKGRlc2MgKyAyKSkgeworCQkJZGV2X2luZm8oJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiUG9ydCAlZCBTdGF0dXMgQ2hhbiIKKwkJCQkiZ2UgPSAlMDhYXG4iLCBwb3J0LCAqZGVzYyk7CisJCX0KKwkJcmV0dXJuIHJldF9wb3J0c3RhdHVzOworCX0KIH0KIAogCkBAIC0yNjY2LDM4MSArMjY1MSwzNDAgQEAKICNkZWZpbmUgdGlja19iZWZvcmUodDEsIHQyKSAoKHMxNikoKChzMTYpKHQxKSktKChzMTYpKHQyKSkpIDwgMCkKIHN0YXRpYyBpbnQgdTEzMl9yb290aHViX3BvcnRyZXNldChzdHJ1Y3QgdTEzMiAqdTEzMiwgaW50IHBvcnRfaW5kZXgpCiB7Ci0gICAgICAgIGludCByZXR2YWw7Ci0gICAgICAgIHUzMiBmbW51bWJlcjsKLSAgICAgICAgdTE2IG5vdzsKLSAgICAgICAgdTE2IHJlc2V0X2RvbmU7Ci0gICAgICAgIHJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgZm1udW1iZXIsICZmbW51bWJlcik7Ci0gICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgbm93ID0gZm1udW1iZXI7Ci0gICAgICAgIHJlc2V0X2RvbmUgPSBub3cgKyBQT1JUX1JFU0VUX01TRUM7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICB1MzIgcG9ydHN0YXQ7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290aHViLnBvcnRzdGF0dXNbcG9ydF9pbmRleF0sICZwb3J0c3RhdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJIX1BTX1BSUyAmIHBvcnRzdGF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRpY2tfYmVmb3JlKG5vdywgcmVzZXRfZG9uZSkpOwotICAgICAgICAgICAgICAgIGlmIChSSF9QU19QUlMgJiBwb3J0c3RhdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOwotICAgICAgICAgICAgICAgIGlmIChSSF9QU19DQ1MgJiBwb3J0c3RhdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJIX1BTX1BSU0MgJiBwb3J0c3RhdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RodWIucG9ydHN0YXR1c1twb3J0X2luZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSF9QU19QUlNDKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAvKiBzdGFydCB0aGUgbmV4dCByZXNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXAgdGlsbCBpdCdzIHByb2JhYmx5IGRvbmUgKi8KLSAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCByb290aHViLnBvcnRzdGF0dXNbcG9ydF9pbmRleF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgUkhfUFNfUFJTKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgICAgICAgICBtc2xlZXAoUE9SVF9SRVNFVF9IV19NU0VDKTsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGZtbnVtYmVyLCAmZm1udW1iZXIpOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICAgICAgICAgIG5vdyA9IGZtbnVtYmVyOwotICAgICAgICB9IHdoaWxlICh0aWNrX2JlZm9yZShub3csIHJlc2V0X2RvbmUpKTsKLSAgICAgICAgcmV0dXJuIDA7CisJaW50IHJldHZhbDsKKwl1MzIgZm1udW1iZXI7CisJdTE2IG5vdzsKKwl1MTYgcmVzZXRfZG9uZTsKKwlyZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGZtbnVtYmVyLCAmZm1udW1iZXIpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJbm93ID0gZm1udW1iZXI7CisJcmVzZXRfZG9uZSA9IG5vdyArIFBPUlRfUkVTRVRfTVNFQzsKKwlkbyB7CisJCXUzMiBwb3J0c3RhdDsKKwkJZG8geworCQkJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLAorCQkJCXJvb3RodWIucG9ydHN0YXR1c1twb3J0X2luZGV4XSwgJnBvcnRzdGF0KTsKKwkJCWlmIChyZXR2YWwpCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCWlmIChSSF9QU19QUlMgJiBwb3J0c3RhdCkKKwkJCQljb250aW51ZTsKKwkJCWVsc2UKKwkJCQlicmVhazsKKwkJfSB3aGlsZSAodGlja19iZWZvcmUobm93LCByZXNldF9kb25lKSk7CisJCWlmIChSSF9QU19QUlMgJiBwb3J0c3RhdCkKKwkJCXJldHVybiAtRU5PREVWOworCQlpZiAoUkhfUFNfQ0NTICYgcG9ydHN0YXQpIHsKKwkJCWlmIChSSF9QU19QUlNDICYgcG9ydHN0YXQpIHsKKwkJCQlyZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLAorCQkJCQlyb290aHViLnBvcnRzdGF0dXNbcG9ydF9pbmRleF0sCisJCQkJCVJIX1BTX1BSU0MpOworCQkJCWlmIChyZXR2YWwpCisJCQkJCXJldHVybiByZXR2YWw7CisJCQl9CisJCX0gZWxzZQorCQkJYnJlYWs7CS8qIHN0YXJ0IHRoZSBuZXh0IHJlc2V0LAorCQkJCXNsZWVwIHRpbGwgaXQncyBwcm9iYWJseSBkb25lICovCisJCXJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIHJvb3RodWIucG9ydHN0YXR1c1twb3J0X2luZGV4XSwKKwkJCSBSSF9QU19QUlMpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJbXNsZWVwKFBPUlRfUkVTRVRfSFdfTVNFQyk7CisJCXJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgZm1udW1iZXIsICZmbW51bWJlcik7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCQlub3cgPSBmbW51bWJlcjsKKwl9IHdoaWxlICh0aWNrX2JlZm9yZShub3csIHJlc2V0X2RvbmUpKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB1MTMyX3Jvb3RodWJfc2V0cG9ydGZlYXR1cmUoc3RydWN0IHUxMzIgKnUxMzIsIHUxNiB3VmFsdWUsCi0gICAgICAgIHUxNiB3SW5kZXgpCisJdTE2IHdJbmRleCkKIHsKLSAgICAgICAgaWYgKHdJbmRleCA9PSAwIHx8IHdJbmRleCA+IHUxMzItPm51bV9wb3J0cykgewotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCByZXR2YWw7Ci0gICAgICAgICAgICAgICAgaW50IHBvcnRfaW5kZXggPSB3SW5kZXggLSAxOwotICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3BvcnQgKnBvcnQgPSAmdTEzMi0+cG9ydFtwb3J0X2luZGV4XTsKLSAgICAgICAgICAgICAgICBwb3J0LT5TdGF0dXMgJj0gfigxIDw8IHdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICh3VmFsdWUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFVTQl9QT1JUX0ZFQVRfU1VTUEVORDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RodWIucG9ydHN0YXR1c1twb3J0X2luZGV4XSwgUkhfUFNfUFNTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICBjYXNlIFVTQl9QT1JUX0ZFQVRfUE9XRVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290aHViLnBvcnRzdGF0dXNbcG9ydF9pbmRleF0sIFJIX1BTX1BQUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgY2FzZSBVU0JfUE9SVF9GRUFUX1JFU0VUOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl9yb290aHViX3BvcnRyZXNldCh1MTMyLCBwb3J0X2luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FUElQRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KKwlpZiAod0luZGV4ID09IDAgfHwgd0luZGV4ID4gdTEzMi0+bnVtX3BvcnRzKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCWludCByZXR2YWw7CisJCWludCBwb3J0X2luZGV4ID0gd0luZGV4IC0gMTsKKwkJc3RydWN0IHUxMzJfcG9ydCAqcG9ydCA9ICZ1MTMyLT5wb3J0W3BvcnRfaW5kZXhdOworCQlwb3J0LT5TdGF0dXMgJj0gfigxIDw8IHdWYWx1ZSk7CisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9TVVNQRU5EOgorCQkJcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwKKwkJCQlyb290aHViLnBvcnRzdGF0dXNbcG9ydF9pbmRleF0sIFJIX1BTX1BTUyk7CisJCQlpZiAocmV0dmFsKQorCQkJCXJldHVybiByZXR2YWw7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX1BPV0VSOgorCQkJcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwKKwkJCQlyb290aHViLnBvcnRzdGF0dXNbcG9ydF9pbmRleF0sIFJIX1BTX1BQUyk7CisJCQlpZiAocmV0dmFsKQorCQkJCXJldHVybiByZXR2YWw7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX1JFU0VUOgorCQkJcmV0dmFsID0gdTEzMl9yb290aHViX3BvcnRyZXNldCh1MTMyLCBwb3J0X2luZGV4KTsKKwkJCWlmIChyZXR2YWwpCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCXJldHVybiAwOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FUElQRTsKKwkJfQorCX0KIH0KIAogc3RhdGljIGludCB1MTMyX3Jvb3RodWJfY2xlYXJwb3J0ZmVhdHVyZShzdHJ1Y3QgdTEzMiAqdTEzMiwgdTE2IHdWYWx1ZSwKLSAgICAgICAgdTE2IHdJbmRleCkKKwl1MTYgd0luZGV4KQogewotICAgICAgICBpZiAod0luZGV4ID09IDAgfHwgd0luZGV4ID4gdTEzMi0+bnVtX3BvcnRzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IHBvcnRfaW5kZXggPSB3SW5kZXggLSAxOwotICAgICAgICAgICAgICAgIHUzMiB0ZW1wOwotICAgICAgICAgICAgICAgIGludCByZXR2YWw7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfcG9ydCAqcG9ydCA9ICZ1MTMyLT5wb3J0W3BvcnRfaW5kZXhdOwotICAgICAgICAgICAgICAgIHBvcnQtPlN0YXR1cyAmPSB+KDEgPDwgd1ZhbHVlKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHdWYWx1ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgVVNCX1BPUlRfRkVBVF9FTkFCTEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gUkhfUFNfQ0NTOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBVU0JfUE9SVF9GRUFUX0NfRU5BQkxFOgotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IFJIX1BTX1BFU0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFVTQl9QT1JUX0ZFQVRfU1VTUEVORDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBSSF9QU19QT0NJOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh1MTMyLT5oY19jb250cm9sICYgT0hDSV9DVFJMX0hDRlMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE9IQ0lfVVNCX09QRVIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJUT0RPIHJlc3VtZV8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJvb3RfaHViXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVVNCX1BPUlRfRkVBVF9DX1NVU1BFTkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gUkhfUFNfUFNTQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVVNCX1BPUlRfRkVBVF9QT1dFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBSSF9QU19MU0RBOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBVU0JfUE9SVF9GRUFUX0NfQ09OTkVDVElPTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBSSF9QU19DU0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFVTQl9QT1JUX0ZFQVRfQ19PVkVSX0NVUlJFTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gUkhfUFNfT0NJQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVVNCX1BPUlRfRkVBVF9DX1JFU0VUOgotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IFJIX1BTX1BSU0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FUElQRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgcm9vdGh1Yi5wb3J0c3RhdHVzW3BvcnRfaW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXApOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9CisJaWYgKHdJbmRleCA9PSAwIHx8IHdJbmRleCA+IHUxMzItPm51bV9wb3J0cykgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlpbnQgcG9ydF9pbmRleCA9IHdJbmRleCAtIDE7CisJCXUzMiB0ZW1wOworCQlpbnQgcmV0dmFsOworCQlzdHJ1Y3QgdTEzMl9wb3J0ICpwb3J0ID0gJnUxMzItPnBvcnRbcG9ydF9pbmRleF07CisJCXBvcnQtPlN0YXR1cyAmPSB+KDEgPDwgd1ZhbHVlKTsKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX0VOQUJMRToKKwkJCXRlbXAgPSBSSF9QU19DQ1M7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX0NfRU5BQkxFOgorCQkJdGVtcCA9IFJIX1BTX1BFU0M7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX1NVU1BFTkQ6CisJCQl0ZW1wID0gUkhfUFNfUE9DSTsKKwkJCWlmICgodTEzMi0+aGNfY29udHJvbCAmIE9IQ0lfQ1RSTF9IQ0ZTKQorCQkJCSE9IE9IQ0lfVVNCX09QRVIpIHsKKwkJCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgIlRPRE8gcmVzdW1lXyIKKwkJCQkJInJvb3RfaHViXG4iKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFVTQl9QT1JUX0ZFQVRfQ19TVVNQRU5EOgorCQkJdGVtcCA9IFJIX1BTX1BTU0M7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX1BPV0VSOgorCQkJdGVtcCA9IFJIX1BTX0xTREE7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX0NfQ09OTkVDVElPTjoKKwkJCXRlbXAgPSBSSF9QU19DU0M7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX0NfT1ZFUl9DVVJSRU5UOgorCQkJdGVtcCA9IFJIX1BTX09DSUM7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX0NfUkVTRVQ6CisJCQl0ZW1wID0gUkhfUFNfUFJTQzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FUElQRTsKKwkJfQorCQlyZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCByb290aHViLnBvcnRzdGF0dXNbcG9ydF9pbmRleF0sCisJCQkgdGVtcCk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCQlyZXR1cm4gMDsKKwl9CiB9CiAKIAogLyogdGhlIHZpcnR1YWwgcm9vdCBodWIgdGltZXIgSVJRIGNoZWNrcyBmb3IgaHViIHN0YXR1cyovCiBzdGF0aWMgaW50IHUxMzJfaHViX3N0YXR1c19kYXRhKHN0cnVjdCB1c2JfaGNkICpoY2QsIGNoYXIgKmJ1ZikKIHsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOwotICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAxKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGNkPSVwIGhhcyBiZWVuIHJlbW92IgotICAgICAgICAgICAgICAgICAgICAgICAgImVkICVkXG4iLCBoY2QsIHUxMzItPmdvaW5nKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoY2Q9JXAgaXMgYmVpbmcgcmVtb3YiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZWRcbiIsIGhjZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FU0hVVERPV047Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IGksIGNoYW5nZWQgPSAwLCBsZW5ndGggPSAxOwotICAgICAgICAgICAgICAgIGlmICh1MTMyLT5mbGFncyAmIE9IQ0lfUVVJUktfQU1ENzU2KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHUxMzItPmhjX3Jvb3RodWJfYSAmIFJIX0FfTkRQKSA+IE1BWF9ST09UX1BPUlRTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiYm9ndXMgTkRQLCByIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcmVhZHMgYXMgTkRQPSVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzItPmhjX3Jvb3RodWJfYSAmIFJIX0FfTkRQKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodTEzMi0+aGNfcm9vdGh1Yl9zdGF0dXMgJiAoUkhfSFNfTFBTQyB8IFJIX0hTX09DSUMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWZbMF0gPSBjaGFuZ2VkID0gMTsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZlswXSA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKHUxMzItPm51bV9wb3J0cyA+IDcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZlsxXSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHUxMzItPm51bV9wb3J0czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodTEzMi0+aGNfcm9vdGh1Yl9wb3J0c3RhdHVzW2ldICYgKFJIX1BTX0NTQyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIX1BTX1BFU0MgfCBSSF9QU19QU1NDIHwgUkhfUFNfT0NJQyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIX1BTX1BSU0MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IDcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZbMF0gfD0gMSA8PCAoaSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZbMV0gfD0gMSA8PCAoaSAtIDcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHUxMzItPmhjX3Jvb3RodWJfcG9ydHN0YXR1c1tpXSAmIFJIX1BTX0NDUykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHUxMzItPmhjX3Jvb3RodWJfcG9ydHN0YXR1c1tpXSAmIFJIX1BTX1BTUykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBkb25lOnJldHVybiBjaGFuZ2VkID8gbGVuZ3RoIDogMDsKLSAgICAgICAgfQorCXN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhjZD0lcCBoYXMgYmVlbiByZW1vdiIKKwkJCSJlZCAlZFxuIiwgaGNkLCB1MTMyLT5nb2luZyk7CisJCXJldHVybiAtRU5PREVWOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhjZD0lcCBpcyBiZWluZyByZW1vdiIKKwkJCSJlZFxuIiwgaGNkKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfSBlbHNlIHsKKwkJaW50IGksIGNoYW5nZWQgPSAwLCBsZW5ndGggPSAxOworCQlpZiAodTEzMi0+ZmxhZ3MgJiBPSENJX1FVSVJLX0FNRDc1NikgeworCQkJaWYgKCh1MTMyLT5oY19yb290aHViX2EgJiBSSF9BX05EUCkgPiBNQVhfUk9PVF9QT1JUUykgeworCQkJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiYm9ndXMgTkRQLCByIgorCQkJCQkiZXJlYWRzIGFzIE5EUD0lZFxuIiwKKwkJCQkJdTEzMi0+aGNfcm9vdGh1Yl9hICYgUkhfQV9ORFApOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJfQorCQlpZiAodTEzMi0+aGNfcm9vdGh1Yl9zdGF0dXMgJiAoUkhfSFNfTFBTQyB8IFJIX0hTX09DSUMpKQorCQkJYnVmWzBdID0gY2hhbmdlZCA9IDE7CisJCWVsc2UKKwkJCWJ1ZlswXSA9IDA7CisJCWlmICh1MTMyLT5udW1fcG9ydHMgPiA3KSB7CisJCQlidWZbMV0gPSAwOworCQkJbGVuZ3RoKys7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IHUxMzItPm51bV9wb3J0czsgaSsrKSB7CisJCQlpZiAodTEzMi0+aGNfcm9vdGh1Yl9wb3J0c3RhdHVzW2ldICYgKFJIX1BTX0NTQyB8CisJCQkJUkhfUFNfUEVTQyB8IFJIX1BTX1BTU0MgfCBSSF9QU19PQ0lDIHwKKwkJCQlSSF9QU19QUlNDKSkgeworCQkJCWNoYW5nZWQgPSAxOworCQkJCWlmIChpIDwgNykKKwkJCQkJYnVmWzBdIHw9IDEgPDwgKGkgKyAxKTsKKwkJCQllbHNlCisJCQkJCWJ1ZlsxXSB8PSAxIDw8IChpIC0gNyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoISh1MTMyLT5oY19yb290aHViX3BvcnRzdGF0dXNbaV0gJiBSSF9QU19DQ1MpKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoKHUxMzItPmhjX3Jvb3RodWJfcG9ydHN0YXR1c1tpXSAmIFJIX1BTX1BTUykpCisJCQkJY29udGludWU7CisJCX0KK2RvbmU6CisJCXJldHVybiBjaGFuZ2VkID8gbGVuZ3RoIDogMDsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgdTEzMl9odWJfY29udHJvbChzdHJ1Y3QgdXNiX2hjZCAqaGNkLCB1MTYgdHlwZVJlcSwgdTE2IHdWYWx1ZSwKLSAgICAgICAgdTE2IHdJbmRleCwgY2hhciAqYnVmLCB1MTYgd0xlbmd0aCkKKwl1MTYgd0luZGV4LCBjaGFyICpidWYsIHUxNiB3TGVuZ3RoKQogewotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7Ci0gICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVTSFVURE9XTjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgcmV0dmFsID0gMDsKLSAgICAgICAgICAgICAgICBtdXRleF9sb2NrKCZ1MTMyLT5zd19sb2NrKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGVSZXEpIHsKLSAgICAgICAgICAgICAgICBjYXNlIENsZWFySHViRmVhdHVyZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAod1ZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENfSFVCX09WRVJfQ1VSUkVOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ19IVUJfTE9DQUxfUE9XRVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBzdGFsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2V0SHViRmVhdHVyZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAod1ZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENfSFVCX09WRVJfQ1VSUkVOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ19IVUJfTE9DQUxfUE9XRVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBzdGFsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQ2xlYXJQb3J0RmVhdHVyZTp7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHUxMzJfcm9vdGh1Yl9jbGVhcnBvcnRmZWF0dXJlKHUxMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1ZhbHVlLCB3SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgR2V0SHViRGVzY3JpcHRvcjp7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHUxMzJfcm9vdGh1Yl9kZXNjcmlwdG9yKHUxMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCB1c2JfaHViX2Rlc2NyaXB0b3IgKilidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgR2V0SHViU3RhdHVzOnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl9yb290aHViX3N0YXR1cyh1MTMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX2xlMzIgKikgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIEdldFBvcnRTdGF0dXM6ewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3Jvb3RodWJfcG9ydHN0YXR1cyh1MTMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX2xlMzIgKikgYnVmLCB3SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgU2V0UG9ydEZlYXR1cmU6ewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3Jvb3RodWJfc2V0cG9ydGZlYXR1cmUodTEzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3VmFsdWUsIHdJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gc3RhbGw7Ci0gICAgICAgICAgICAgICAgICAgICAgZXJyb3I6dTEzMl9kaXNhYmxlKHUxMzIpOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMi0+Z29pbmcgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgc3RhbGw6cmV0dmFsID0gLUVQSVBFOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG11dGV4X3VubG9jaygmdTEzMi0+c3dfbG9jayk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgfQorCXN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkXG4iKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfSBlbHNlIHsKKwkJaW50IHJldHZhbCA9IDA7CisJCW11dGV4X2xvY2soJnUxMzItPnN3X2xvY2spOworCQlzd2l0Y2ggKHR5cGVSZXEpIHsKKwkJY2FzZSBDbGVhckh1YkZlYXR1cmU6CisJCQlzd2l0Y2ggKHdWYWx1ZSkgeworCQkJY2FzZSBDX0hVQl9PVkVSX0NVUlJFTlQ6CisJCQljYXNlIENfSFVCX0xPQ0FMX1BPV0VSOgorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlnb3RvIHN0YWxsOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU2V0SHViRmVhdHVyZToKKwkJCXN3aXRjaCAod1ZhbHVlKSB7CisJCQljYXNlIENfSFVCX09WRVJfQ1VSUkVOVDoKKwkJCWNhc2UgQ19IVUJfTE9DQUxfUE9XRVI6CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWdvdG8gc3RhbGw7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDbGVhclBvcnRGZWF0dXJlOnsKKwkJCQlyZXR2YWwgPSB1MTMyX3Jvb3RodWJfY2xlYXJwb3J0ZmVhdHVyZSh1MTMyLAorCQkJCQl3VmFsdWUsIHdJbmRleCk7CisJCQkJaWYgKHJldHZhbCkKKwkJCQkJZ290byBlcnJvcjsKKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSBHZXRIdWJEZXNjcmlwdG9yOnsKKwkJCQlyZXR2YWwgPSB1MTMyX3Jvb3RodWJfZGVzY3JpcHRvcih1MTMyLAorCQkJCQkoc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciAqKWJ1Zik7CisJCQkJaWYgKHJldHZhbCkKKwkJCQkJZ290byBlcnJvcjsKKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSBHZXRIdWJTdGF0dXM6eworCQkJCXJldHZhbCA9IHUxMzJfcm9vdGh1Yl9zdGF0dXModTEzMiwKKwkJCQkJKF9fbGUzMiAqKSBidWYpOworCQkJCWlmIChyZXR2YWwpCisJCQkJCWdvdG8gZXJyb3I7CisJCQkJYnJlYWs7CisJCQl9CisJCWNhc2UgR2V0UG9ydFN0YXR1czp7CisJCQkJcmV0dmFsID0gdTEzMl9yb290aHViX3BvcnRzdGF0dXModTEzMiwKKwkJCQkJKF9fbGUzMiAqKSBidWYsIHdJbmRleCk7CisJCQkJaWYgKHJldHZhbCkKKwkJCQkJZ290byBlcnJvcjsKKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSBTZXRQb3J0RmVhdHVyZTp7CisJCQkJcmV0dmFsID0gdTEzMl9yb290aHViX3NldHBvcnRmZWF0dXJlKHUxMzIsCisJCQkJCXdWYWx1ZSwgd0luZGV4KTsKKwkJCQlpZiAocmV0dmFsKQorCQkJCQlnb3RvIGVycm9yOworCQkJCWJyZWFrOworCQkJfQorCQlkZWZhdWx0OgorCQkJZ290byBzdGFsbDsKKwkJZXJyb3I6CisJCQl1MTMyX2Rpc2FibGUodTEzMik7CisJCQl1MTMyLT5nb2luZyA9IDE7CisJCQlicmVhazsKKwkJc3RhbGw6CisJCQlyZXR2YWwgPSAtRVBJUEU7CisJCQlicmVhazsKKwkJfQorCQltdXRleF91bmxvY2soJnUxMzItPnN3X2xvY2spOworCQlyZXR1cm4gcmV0dmFsOworCX0KIH0KIAogc3RhdGljIGludCB1MTMyX3N0YXJ0X3BvcnRfcmVzZXQoc3RydWN0IHVzYl9oY2QgKmhjZCwgdW5zaWduZWQgcG9ydF9udW0pCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKLSAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOwotICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWRcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRVNIVVRET1dOOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdTEzMl9odWJfaXJxX2VuYWJsZShzdHJ1Y3QgdXNiX2hjZCAqaGNkKQotewotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7Ci0gICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKLSAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApCi0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZFxuIik7CisJc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOworCWlmICh1MTMyLT5nb2luZyA+IDEpIHsKKwkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgorCQkJLCB1MTMyLT5nb2luZyk7CisJCXJldHVybiAtRU5PREVWOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWRcbiIpOworCQlyZXR1cm4gLUVTSFVURE9XTjsKKwl9IGVsc2UKKwkJcmV0dXJuIDA7CiB9CiAKIAogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCB1MTMyX2hjZF9zdXNwZW5kKHN0cnVjdCB1c2JfaGNkICpoY2QsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQotewotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7Ci0gICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVTSFVURE9XTjsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdTEzMl9oY2RfcmVzdW1lKHN0cnVjdCB1c2JfaGNkICpoY2QpCi17Ci0gICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKLSAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOwotICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWRcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRVNIVVRET1dOOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCB1MTMyX2J1c19zdXNwZW5kKHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKLSAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOwotICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWRcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRVNIVVRET1dOOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwlzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7CisJaWYgKHUxMzItPmdvaW5nID4gMSkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCisJCQksIHUxMzItPmdvaW5nKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKKwkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZFxuIik7CisJCXJldHVybiAtRVNIVVRET1dOOworCX0gZWxzZQorCQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB1MTMyX2J1c19yZXN1bWUoc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOwotICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAxKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgLCB1MTMyLT5nb2luZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgICAgIH0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZFxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FU0hVVERPV047Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiAwOworCXN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkXG4iKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfSBlbHNlCisJCXJldHVybiAwOwogfQogCiAjZWxzZQotI2RlZmluZSB1MTMyX2hjZF9zdXNwZW5kIE5VTEwKLSNkZWZpbmUgdTEzMl9oY2RfcmVzdW1lIE5VTEwKICNkZWZpbmUgdTEzMl9idXNfc3VzcGVuZCBOVUxMCiAjZGVmaW5lIHUxMzJfYnVzX3Jlc3VtZSBOVUxMCiAjZW5kaWYKIHN0YXRpYyBzdHJ1Y3QgaGNfZHJpdmVyIHUxMzJfaGNfZHJpdmVyID0gewotICAgICAgICAuZGVzY3JpcHRpb24gPSBoY2RfbmFtZSwKLSAgICAgICAgLmhjZF9wcml2X3NpemUgPSBzaXplb2Yoc3RydWN0IHUxMzIpLAotICAgICAgICAuaXJxID0gTlVMTCwKLSAgICAgICAgLmZsYWdzID0gSENEX1VTQjExIHwgSENEX01FTU9SWSwKLSAgICAgICAgLnJlc2V0ID0gdTEzMl9oY2RfcmVzZXQsCi0gICAgICAgIC5zdGFydCA9IHUxMzJfaGNkX3N0YXJ0LAotICAgICAgICAuc3VzcGVuZCA9IHUxMzJfaGNkX3N1c3BlbmQsCi0gICAgICAgIC5yZXN1bWUgPSB1MTMyX2hjZF9yZXN1bWUsCi0gICAgICAgIC5zdG9wID0gdTEzMl9oY2Rfc3RvcCwKLSAgICAgICAgLnVyYl9lbnF1ZXVlID0gdTEzMl91cmJfZW5xdWV1ZSwKLSAgICAgICAgLnVyYl9kZXF1ZXVlID0gdTEzMl91cmJfZGVxdWV1ZSwKLSAgICAgICAgLmVuZHBvaW50X2Rpc2FibGUgPSB1MTMyX2VuZHBvaW50X2Rpc2FibGUsCi0gICAgICAgIC5nZXRfZnJhbWVfbnVtYmVyID0gdTEzMl9nZXRfZnJhbWUsCi0gICAgICAgIC5odWJfc3RhdHVzX2RhdGEgPSB1MTMyX2h1Yl9zdGF0dXNfZGF0YSwKLSAgICAgICAgLmh1Yl9jb250cm9sID0gdTEzMl9odWJfY29udHJvbCwKLSAgICAgICAgLmJ1c19zdXNwZW5kID0gdTEzMl9idXNfc3VzcGVuZCwKLSAgICAgICAgLmJ1c19yZXN1bWUgPSB1MTMyX2J1c19yZXN1bWUsCi0gICAgICAgIC5zdGFydF9wb3J0X3Jlc2V0ID0gdTEzMl9zdGFydF9wb3J0X3Jlc2V0LAotICAgICAgICAuaHViX2lycV9lbmFibGUgPSB1MTMyX2h1Yl9pcnFfZW5hYmxlLAorCS5kZXNjcmlwdGlvbiA9IGhjZF9uYW1lLAorCS5oY2RfcHJpdl9zaXplID0gc2l6ZW9mKHN0cnVjdCB1MTMyKSwKKwkuaXJxID0gTlVMTCwKKwkuZmxhZ3MgPSBIQ0RfVVNCMTEgfCBIQ0RfTUVNT1JZLAorCS5yZXNldCA9IHUxMzJfaGNkX3Jlc2V0LAorCS5zdGFydCA9IHUxMzJfaGNkX3N0YXJ0LAorCS5zdG9wID0gdTEzMl9oY2Rfc3RvcCwKKwkudXJiX2VucXVldWUgPSB1MTMyX3VyYl9lbnF1ZXVlLAorCS51cmJfZGVxdWV1ZSA9IHUxMzJfdXJiX2RlcXVldWUsCisJLmVuZHBvaW50X2Rpc2FibGUgPSB1MTMyX2VuZHBvaW50X2Rpc2FibGUsCisJLmdldF9mcmFtZV9udW1iZXIgPSB1MTMyX2dldF9mcmFtZSwKKwkuaHViX3N0YXR1c19kYXRhID0gdTEzMl9odWJfc3RhdHVzX2RhdGEsCisJLmh1Yl9jb250cm9sID0gdTEzMl9odWJfY29udHJvbCwKKwkuYnVzX3N1c3BlbmQgPSB1MTMyX2J1c19zdXNwZW5kLAorCS5idXNfcmVzdW1lID0gdTEzMl9idXNfcmVzdW1lLAorCS5zdGFydF9wb3J0X3Jlc2V0ID0gdTEzMl9zdGFydF9wb3J0X3Jlc2V0LAogfTsKIAogLyoKQEAgLTMwNTEsMTQ4ICsyOTk1LDE1MiBAQAogKi8KIHN0YXRpYyBpbnQgX19kZXZleGl0IHUxMzJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0gICAgICAgIHN0cnVjdCB1c2JfaGNkICpoY2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLSAgICAgICAgaWYgKGhjZCkgewotICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKLSAgICAgICAgICAgICAgICBpZiAodTEzMi0+Z29pbmcrKyA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiYWxyZWFkeSBiZWluZyByZW1vdmUiCisJc3RydWN0IHVzYl9oY2QgKmhjZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWlmIChoY2QpIHsKKwkJc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOworCQlpZiAodTEzMi0+Z29pbmcrKyA+IDEpIHsKKwkJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiYWxyZWFkeSBiZWluZyByZW1vdmUiCiAJCQkJImRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCByaW5ncyA9IE1BWF9VMTMyX1JJTkdTOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZHBzID0gTUFYX1UxMzJfRU5EUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInJlbW92aW5nIGRldmljZSB1MTMyIgorCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0gZWxzZSB7CisJCQlpbnQgcmluZ3MgPSBNQVhfVTEzMl9SSU5HUzsKKwkJCWludCBlbmRwcyA9IE1BWF9VMTMyX0VORFBTOworCQkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJyZW1vdmluZyBkZXZpY2UgdTEzMiIKIAkJCQkiLiVkXG4iLCB1MTMyLT5zZXF1ZW5jZV9udW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgbXNsZWVwKDEwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtdXRleF9sb2NrKCZ1MTMyLT5zd19sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfbW9uaXRvcl9jYW5jZWxfd29yayh1MTMyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyaW5ncy0tID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gJnUxMzItPnJpbmdbcmluZ3NdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX3JpbmdfY2FuY2VsX3dvcmsodTEzMiwgcmluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChlbmRwcy0tID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gdTEzMi0+ZW5kcFtlbmRwc107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmRwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfZW5kcF9jYW5jZWxfd29yayh1MTMyLCBlbmRwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzItPmdvaW5nICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJyZW1vdmluZyBkZXZpY2UgdTEzMi4lZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMi0+c2VxdWVuY2VfbnVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG11dGV4X3VubG9jaygmdTEzMi0+c3dfbG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2JfcmVtb3ZlX2hjZChoY2QpOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl91MTMyX3B1dF9rcmVmKHUxMzIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwkJCW1zbGVlcCgxMDApOworCQkJbXV0ZXhfbG9jaygmdTEzMi0+c3dfbG9jayk7CisJCQl1MTMyX21vbml0b3JfY2FuY2VsX3dvcmsodTEzMik7CisJCQl3aGlsZSAocmluZ3MtLSA+IDApIHsKKwkJCQlzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gJnUxMzItPnJpbmdbcmluZ3NdOworCQkJCXUxMzJfcmluZ19jYW5jZWxfd29yayh1MTMyLCByaW5nKTsKKwkJCX0gd2hpbGUgKGVuZHBzLS0gPiAwKSB7CisJCQkJc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IHUxMzItPmVuZHBbZW5kcHNdOworCQkJCWlmIChlbmRwKQorCQkJCQl1MTMyX2VuZHBfY2FuY2VsX3dvcmsodTEzMiwgZW5kcCk7CisJCQl9CisJCQl1MTMyLT5nb2luZyArPSAxOworCQkJcHJpbnRrKEtFUk5fSU5GTyAicmVtb3ZpbmcgZGV2aWNlIHUxMzIuJWRcbiIsCisJCQkJdTEzMi0+c2VxdWVuY2VfbnVtKTsKKwkJCW11dGV4X3VubG9jaygmdTEzMi0+c3dfbG9jayk7CisJCQl1c2JfcmVtb3ZlX2hjZChoY2QpOworCQkJdTEzMl91MTMyX3B1dF9rcmVmKHUxMzIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UKKwkJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHUxMzJfaW5pdGlhbGlzZShzdHJ1Y3QgdTEzMiAqdTEzMiwgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLSAgICAgICAgaW50IHJpbmdzID0gTUFYX1UxMzJfUklOR1M7Ci0gICAgICAgIGludCBwb3J0cyA9IE1BWF9VMTMyX1BPUlRTOwotICAgICAgICBpbnQgYWRkcnMgPSBNQVhfVTEzMl9BRERSUzsKLSAgICAgICAgaW50IHVkZXZzID0gTUFYX1UxMzJfVURFVlM7Ci0gICAgICAgIGludCBlbmRwcyA9IE1BWF9VMTMyX0VORFBTOwotICAgICAgICB1MTMyLT5ib2FyZCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotICAgICAgICB1MTMyLT5wbGF0Zm9ybV9kZXYgPSBwZGV2OwotICAgICAgICB1MTMyLT5wb3dlciA9IDA7Ci0gICAgICAgIHUxMzItPnJlc2V0ID0gMDsKLSAgICAgICAgbXV0ZXhfaW5pdCgmdTEzMi0+c3dfbG9jayk7Ci0gICAgICAgIGluaXRfTVVURVgoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgd2hpbGUgKHJpbmdzLS0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfcmluZyAqcmluZyA9ICZ1MTMyLT5yaW5nW3JpbmdzXTsKLSAgICAgICAgICAgICAgICByaW5nLT51MTMyID0gdTEzMjsKLSAgICAgICAgICAgICAgICByaW5nLT5udW1iZXIgPSByaW5ncyArIDE7Ci0gICAgICAgICAgICAgICAgcmluZy0+bGVuZ3RoID0gMDsKLSAgICAgICAgICAgICAgICByaW5nLT5jdXJyX2VuZHAgPSBOVUxMOwotICAgICAgICAgICAgICAgIElOSVRfREVMQVlFRF9XT1JLKCZyaW5nLT5zY2hlZHVsZXIsCisJaW50IHJpbmdzID0gTUFYX1UxMzJfUklOR1M7CisJaW50IHBvcnRzID0gTUFYX1UxMzJfUE9SVFM7CisJaW50IGFkZHJzID0gTUFYX1UxMzJfQUREUlM7CisJaW50IHVkZXZzID0gTUFYX1UxMzJfVURFVlM7CisJaW50IGVuZHBzID0gTUFYX1UxMzJfRU5EUFM7CisJdTEzMi0+Ym9hcmQgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwl1MTMyLT5wbGF0Zm9ybV9kZXYgPSBwZGV2OworCXUxMzItPnBvd2VyID0gMDsKKwl1MTMyLT5yZXNldCA9IDA7CisJbXV0ZXhfaW5pdCgmdTEzMi0+c3dfbG9jayk7CisJbXV0ZXhfaW5pdCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCXdoaWxlIChyaW5ncy0tID4gMCkgeworCQlzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gJnUxMzItPnJpbmdbcmluZ3NdOworCQlyaW5nLT51MTMyID0gdTEzMjsKKwkJcmluZy0+bnVtYmVyID0gcmluZ3MgKyAxOworCQlyaW5nLT5sZW5ndGggPSAwOworCQlyaW5nLT5jdXJyX2VuZHAgPSBOVUxMOworCQlJTklUX0RFTEFZRURfV09SSygmcmluZy0+c2NoZWR1bGVyLAogCQkJCSAgdTEzMl9oY2RfcmluZ193b3JrX3NjaGVkdWxlcik7Ci0gICAgICAgIH0gbXV0ZXhfbG9jaygmdTEzMi0+c3dfbG9jayk7Ci0gICAgICAgIElOSVRfREVMQVlFRF9XT1JLKCZ1MTMyLT5tb25pdG9yLCB1MTMyX2hjZF9tb25pdG9yX3dvcmspOwotICAgICAgICB3aGlsZSAocG9ydHMtLSA+IDApIHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9wb3J0ICpwb3J0ID0gJnUxMzItPnBvcnRbcG9ydHNdOwotICAgICAgICAgICAgICAgIHBvcnQtPnUxMzIgPSB1MTMyOwotICAgICAgICAgICAgICAgIHBvcnQtPnJlc2V0ID0gMDsKLSAgICAgICAgICAgICAgICBwb3J0LT5lbmFibGUgPSAwOwotICAgICAgICAgICAgICAgIHBvcnQtPnBvd2VyID0gMDsKLSAgICAgICAgICAgICAgICBwb3J0LT5TdGF0dXMgPSAwOwotICAgICAgICB9IHdoaWxlIChhZGRycy0tID4gMCkgewotICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX2FkZHIgKmFkZHIgPSAmdTEzMi0+YWRkclthZGRyc107Ci0gICAgICAgICAgICAgICAgYWRkci0+YWRkcmVzcyA9IDA7Ci0gICAgICAgIH0gd2hpbGUgKHVkZXZzLS0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W3VkZXZzXTsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IEFSUkFZX1NJWkUodWRldi0+ZW5kcF9udW1iZXJfaW4pOwotICAgICAgICAgICAgICAgIGludCBvID0gQVJSQVlfU0laRSh1ZGV2LT5lbmRwX251bWJlcl9vdXQpOwotICAgICAgICAgICAgICAgIHVkZXYtPnVzYl9kZXZpY2UgPSBOVUxMOwotICAgICAgICAgICAgICAgIHVkZXYtPnVkZXZfbnVtYmVyID0gMDsKLSAgICAgICAgICAgICAgICB1ZGV2LT51c2JfYWRkciA9IDA7Ci0gICAgICAgICAgICAgICAgdWRldi0+cG9ydG51bWJlciA9IDA7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGktLSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVkZXYtPmVuZHBfbnVtYmVyX2luW2ldID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2hpbGUgKG8tLSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVkZXYtPmVuZHBfbnVtYmVyX291dFtvXSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChlbmRwcy0tID4gMCkgewotICAgICAgICAgICAgICAgIHUxMzItPmVuZHBbZW5kcHNdID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBtdXRleF91bmxvY2soJnUxMzItPnN3X2xvY2spOwotICAgICAgICByZXR1cm47CisJfQorCW11dGV4X2xvY2soJnUxMzItPnN3X2xvY2spOworCUlOSVRfREVMQVlFRF9XT1JLKCZ1MTMyLT5tb25pdG9yLCB1MTMyX2hjZF9tb25pdG9yX3dvcmspOworCXdoaWxlIChwb3J0cy0tID4gMCkgeworCQlzdHJ1Y3QgdTEzMl9wb3J0ICpwb3J0ID0gJnUxMzItPnBvcnRbcG9ydHNdOworCQlwb3J0LT51MTMyID0gdTEzMjsKKwkJcG9ydC0+cmVzZXQgPSAwOworCQlwb3J0LT5lbmFibGUgPSAwOworCQlwb3J0LT5wb3dlciA9IDA7CisJCXBvcnQtPlN0YXR1cyA9IDA7CisJfQorCXdoaWxlIChhZGRycy0tID4gMCkgeworCQlzdHJ1Y3QgdTEzMl9hZGRyICphZGRyID0gJnUxMzItPmFkZHJbYWRkcnNdOworCQlhZGRyLT5hZGRyZXNzID0gMDsKKwl9CisJd2hpbGUgKHVkZXZzLS0gPiAwKSB7CisJCXN0cnVjdCB1MTMyX3VkZXYgKnVkZXYgPSAmdTEzMi0+dWRldlt1ZGV2c107CisJCWludCBpID0gQVJSQVlfU0laRSh1ZGV2LT5lbmRwX251bWJlcl9pbik7CisJCWludCBvID0gQVJSQVlfU0laRSh1ZGV2LT5lbmRwX251bWJlcl9vdXQpOworCQl1ZGV2LT51c2JfZGV2aWNlID0gTlVMTDsKKwkJdWRldi0+dWRldl9udW1iZXIgPSAwOworCQl1ZGV2LT51c2JfYWRkciA9IDA7CisJCXVkZXYtPnBvcnRudW1iZXIgPSAwOworCQl3aGlsZSAoaS0tID4gMCkKKwkJCXVkZXYtPmVuZHBfbnVtYmVyX2luW2ldID0gMDsKKworCQl3aGlsZSAoby0tID4gMCkKKwkJCXVkZXYtPmVuZHBfbnVtYmVyX291dFtvXSA9IDA7CisKKwl9CisJd2hpbGUgKGVuZHBzLS0gPiAwKQorCQl1MTMyLT5lbmRwW2VuZHBzXSA9IE5VTEw7CisKKwltdXRleF91bmxvY2soJnUxMzItPnN3X2xvY2spOworCXJldHVybjsKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgdTEzMl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotICAgICAgICBzdHJ1Y3QgdXNiX2hjZCAqaGNkOwotICAgICAgICBpbnQgcmV0dmFsOwotICAgICAgICB1MzIgY29udHJvbDsKLSAgICAgICAgdTMyIHJoX2EgPSAtMTsKLSAgICAgICAgdTMyIG51bV9wb3J0czsKLSAgICAgICAgbXNsZWVwKDEwMCk7Ci0gICAgICAgIGlmICh1MTMyX2V4aXRpbmcgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dmFsID0gZnRkaV93cml0ZV9wY2ltZW0ocGRldiwgaW50cmRpc2FibGUsIE9IQ0lfSU5UUl9NSUUpOwotICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIHJldHZhbCA9IGZ0ZGlfcmVhZF9wY2ltZW0ocGRldiwgY29udHJvbCwgJmNvbnRyb2wpOwotICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIHJldHZhbCA9IGZ0ZGlfcmVhZF9wY2ltZW0ocGRldiwgcm9vdGh1Yi5hLCAmcmhfYSk7Ci0gICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgbnVtX3BvcnRzID0gcmhfYSAmIFJIX0FfTkRQOyAgICAgICAgLyogcmVmdXNlIHRvIGNvbmZ1c2UgdXNiY29yZSAqLwotICAgICAgICBpZiAocGRldi0+ZGV2LmRtYV9tYXNrKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgaGNkID0gdXNiX2NyZWF0ZV9oY2QoJnUxMzJfaGNfZHJpdmVyLCAmcGRldi0+ZGV2LCBwZGV2LT5kZXYuYnVzX2lkKTsKLSAgICAgICAgaWYgKCFoY2QpIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBjcmVhdGUgdGhlIHVzYiBoY2Qgc3RydWN0IGZvciBVMTMyXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgIGZ0ZGlfZWxhbl9nb25lX2F3YXkocGRldik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IHJldHZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOwotICAgICAgICAgICAgICAgIGhjZC0+cnNyY19zdGFydCA9IDA7Ci0gICAgICAgICAgICAgICAgbXV0ZXhfbG9jaygmdTEzMl9tb2R1bGVfbG9jayk7Ci0gICAgICAgICAgICAgICAgbGlzdF9hZGRfdGFpbCgmdTEzMi0+dTEzMl9saXN0LCAmdTEzMl9zdGF0aWNfbGlzdCk7Ci0gICAgICAgICAgICAgICAgdTEzMi0+c2VxdWVuY2VfbnVtID0gKyt1MTMyX2luc3RhbmNlczsKLSAgICAgICAgICAgICAgICBtdXRleF91bmxvY2soJnUxMzJfbW9kdWxlX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfdTEzMl9pbml0X2tyZWYodTEzMik7Ci0gICAgICAgICAgICAgICAgdTEzMl9pbml0aWFsaXNlKHUxMzIsIHBkZXYpOwotICAgICAgICAgICAgICAgIGhjZC0+cHJvZHVjdF9kZXNjID0gIkVMQU4gVTEzMiBIb3N0IENvbnRyb2xsZXIiOwotICAgICAgICAgICAgICAgIHJldHZhbCA9IHVzYl9hZGRfaGNkKGhjZCwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImluaXQgZXJyb3IgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1MTMyX3UxMzJfcHV0X2tyZWYodTEzMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1MTMyX21vbml0b3JfcXVldWVfd29yayh1MTMyLCAxMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9CisJc3RydWN0IHVzYl9oY2QgKmhjZDsKKwlpbnQgcmV0dmFsOworCXUzMiBjb250cm9sOworCXUzMiByaF9hID0gLTE7CisJdTMyIG51bV9wb3J0czsKKworCW1zbGVlcCgxMDApOworCWlmICh1MTMyX2V4aXRpbmcgPiAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHZhbCA9IGZ0ZGlfd3JpdGVfcGNpbWVtKHBkZXYsIGludHJkaXNhYmxlLCBPSENJX0lOVFJfTUlFKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCXJldHZhbCA9IGZ0ZGlfcmVhZF9wY2ltZW0ocGRldiwgY29udHJvbCwgJmNvbnRyb2wpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gZnRkaV9yZWFkX3BjaW1lbShwZGV2LCByb290aHViLmEsICZyaF9hKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCW51bV9wb3J0cyA9IHJoX2EgJiBSSF9BX05EUDsJLyogcmVmdXNlIHRvIGNvbmZ1c2UgdXNiY29yZSAqLworCWlmIChwZGV2LT5kZXYuZG1hX21hc2spCisJCXJldHVybiAtRUlOVkFMOworCisJaGNkID0gdXNiX2NyZWF0ZV9oY2QoJnUxMzJfaGNfZHJpdmVyLCAmcGRldi0+ZGV2LCBwZGV2LT5kZXYuYnVzX2lkKTsKKwlpZiAoIWhjZCkgeworCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBjcmVhdGUgdGhlIHVzYiBoY2Qgc3RydWN0IGZvciBVMTMyXG4iCisJCQkpOworCQlmdGRpX2VsYW5fZ29uZV9hd2F5KHBkZXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9IGVsc2UgeworCQlpbnQgcmV0dmFsID0gMDsKKwkJc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOworCQloY2QtPnJzcmNfc3RhcnQgPSAwOworCQltdXRleF9sb2NrKCZ1MTMyX21vZHVsZV9sb2NrKTsKKwkJbGlzdF9hZGRfdGFpbCgmdTEzMi0+dTEzMl9saXN0LCAmdTEzMl9zdGF0aWNfbGlzdCk7CisJCXUxMzItPnNlcXVlbmNlX251bSA9ICsrdTEzMl9pbnN0YW5jZXM7CisJCW11dGV4X3VubG9jaygmdTEzMl9tb2R1bGVfbG9jayk7CisJCXUxMzJfdTEzMl9pbml0X2tyZWYodTEzMik7CisJCXUxMzJfaW5pdGlhbGlzZSh1MTMyLCBwZGV2KTsKKwkJaGNkLT5wcm9kdWN0X2Rlc2MgPSAiRUxBTiBVMTMyIEhvc3QgQ29udHJvbGxlciI7CisJCXJldHZhbCA9IHVzYl9hZGRfaGNkKGhjZCwgMCwgMCk7CisJCWlmIChyZXR2YWwgIT0gMCkgeworCQkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJpbml0IGVycm9yICVkXG4iLAorCQkJCXJldHZhbCk7CisJCQl1MTMyX3UxMzJfcHV0X2tyZWYodTEzMik7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9IGVsc2UgeworCQkJdTEzMl9tb25pdG9yX3F1ZXVlX3dvcmsodTEzMiwgMTAwKTsKKwkJCXJldHVybiAwOworCQl9CisJfQogfQogCiAKQEAgLTMyMDMsNjEgKzMxNTEsNTggQEAKICovCiBzdGF0aWMgaW50IHUxMzJfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0gICAgICAgIHN0cnVjdCB1c2JfaGNkICpoY2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOwotICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAxKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgLCB1MTMyLT5nb2luZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgICAgIH0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZFxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FU0hVVERPV047Ci0gICAgICAgIH0gZWxzZSB7CisJc3RydWN0IHVzYl9oY2QgKmhjZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkXG4iKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfSBlbHNlIHsKIAkJaW50IHJldHZhbCA9IDAsIHBvcnRzOwogCiAJCXN3aXRjaCAoc3RhdGUuZXZlbnQpIHsKIAkJY2FzZSBQTV9FVkVOVF9GUkVFWkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX2J1c19zdXNwZW5kKGhjZCk7CisJCQlyZXR2YWwgPSB1MTMyX2J1c19zdXNwZW5kKGhjZCk7CiAJCQlicmVhazsKIAkJY2FzZSBQTV9FVkVOVF9TVVNQRU5EOgogCQljYXNlIFBNX0VWRU5UX0hJQkVSTkFURToKIAkJCXBvcnRzID0gTUFYX1UxMzJfUE9SVFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocG9ydHMtLSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydF9wb3dlcih1MTMyLCBwb3J0cywgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisJCQl3aGlsZSAocG9ydHMtLSA+IDApIHsKKwkJCQlwb3J0X3Bvd2VyKHUxMzIsIHBvcnRzLCAwKTsKKwkJCX0KIAkJCWJyZWFrOwogCQl9Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgfQorCQlyZXR1cm4gcmV0dmFsOworCX0KIH0KIAogc3RhdGljIGludCB1MTMyX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotICAgICAgICBzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0gICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKLSAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOwotICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWRcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRVNIVVRET1dOOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCByZXR2YWwgPSAwOwotICAgICAgICAgICAgICAgIGlmIChwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfU1VTUEVORCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnRzID0gTUFYX1UxMzJfUE9SVFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocG9ydHMtLSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydF9wb3dlcih1MTMyLCBwb3J0cywgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl9idXNfcmVzdW1lKGhjZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIH0KKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOworCWlmICh1MTMyLT5nb2luZyA+IDEpIHsKKwkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgorCQkJLCB1MTMyLT5nb2luZyk7CisJCXJldHVybiAtRU5PREVWOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWRcbiIpOworCQlyZXR1cm4gLUVTSFVURE9XTjsKKwl9IGVsc2UgeworCQlpbnQgcmV0dmFsID0gMDsKKwkJaWYgKCF1MTMyLT5wb3J0WzBdLnBvd2VyKSB7CisJCQlpbnQgcG9ydHMgPSBNQVhfVTEzMl9QT1JUUzsKKwkJCXdoaWxlIChwb3J0cy0tID4gMCkgeworCQkJCXBvcnRfcG93ZXIodTEzMiwgcG9ydHMsIDEpOworCQkJfQorCQkJcmV0dmFsID0gMDsKKwkJfSBlbHNlIHsKKwkJCXJldHZhbCA9IHUxMzJfYnVzX3Jlc3VtZShoY2QpOworCQl9CisJCXJldHVybiByZXR2YWw7CisJfQogfQogCiAjZWxzZQpAQCAtMzI3MCw0NyArMzIxNSw0OCBAQAogKiB0aGUgcGxhdGZvcm1fZHJpdmVyIHN0cnVjdCBpcyBzdGF0aWMgYmVjYXVzZSBpdCBpcyBwZXIgdHlwZSBvZiBtb2R1bGUKICovCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB1MTMyX3BsYXRmb3JtX2RyaXZlciA9IHsKLSAgICAgICAgLnByb2JlID0gdTEzMl9wcm9iZSwKLSAgICAgICAgLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHUxMzJfcmVtb3ZlKSwKLSAgICAgICAgLnN1c3BlbmQgPSB1MTMyX3N1c3BlbmQsCi0gICAgICAgIC5yZXN1bWUgPSB1MTMyX3Jlc3VtZSwKLSAgICAgICAgLmRyaXZlciA9IHsKLSAgICAgICAgICAgICAgICAgICAubmFtZSA9IChjaGFyICopaGNkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgLm93bmVyID0gVEhJU19NT0RVTEUsCi0gICAgICAgICAgICAgICAgICAgfSwKKwkucHJvYmUgPSB1MTMyX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcCh1MTMyX3JlbW92ZSksCisJLnN1c3BlbmQgPSB1MTMyX3N1c3BlbmQsCisJLnJlc3VtZSA9IHUxMzJfcmVzdW1lLAorCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gKGNoYXIgKiloY2RfbmFtZSwKKwkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisJCSAgIH0sCiB9Owogc3RhdGljIGludCBfX2luaXQgdTEzMl9oY2RfaW5pdCh2b2lkKQogewotICAgICAgICBpbnQgcmV0dmFsOwotICAgICAgICBJTklUX0xJU1RfSEVBRCgmdTEzMl9zdGF0aWNfbGlzdCk7Ci0gICAgICAgIHUxMzJfaW5zdGFuY2VzID0gMDsKLSAgICAgICAgdTEzMl9leGl0aW5nID0gMDsKLSAgICAgICAgbXV0ZXhfaW5pdCgmdTEzMl9tb2R1bGVfbG9jayk7Ci0gICAgICAgIGlmICh1c2JfZGlzYWJsZWQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiZHJpdmVyICVzIGJ1aWx0IGF0ICVzIG9uICVzXG4iLCBoY2RfbmFtZSwgX19USU1FX18sCi0gICAgICAgICAgICAgICAgX19EQVRFX18pOwotICAgICAgICB3b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgidTEzMiIpOwotICAgICAgICByZXR2YWwgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnUxMzJfcGxhdGZvcm1fZHJpdmVyKTsKLSAgICAgICAgcmV0dXJuIHJldHZhbDsKKwlpbnQgcmV0dmFsOworCUlOSVRfTElTVF9IRUFEKCZ1MTMyX3N0YXRpY19saXN0KTsKKwl1MTMyX2luc3RhbmNlcyA9IDA7CisJdTEzMl9leGl0aW5nID0gMDsKKwltdXRleF9pbml0KCZ1MTMyX21vZHVsZV9sb2NrKTsKKwlpZiAodXNiX2Rpc2FibGVkKCkpCisJCXJldHVybiAtRU5PREVWOworCXByaW50ayhLRVJOX0lORk8gImRyaXZlciAlcyBidWlsdCBhdCAlcyBvbiAlc1xuIiwgaGNkX25hbWUsIF9fVElNRV9fLAorCQlfX0RBVEVfXyk7CisJd29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInUxMzIiKTsKKwlyZXR2YWwgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnUxMzJfcGxhdGZvcm1fZHJpdmVyKTsKKwlyZXR1cm4gcmV0dmFsOwogfQogCiAKIG1vZHVsZV9pbml0KHUxMzJfaGNkX2luaXQpOwogc3RhdGljIHZvaWQgX19leGl0IHUxMzJfaGNkX2V4aXQodm9pZCkKIHsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzI7Ci0gICAgICAgIHN0cnVjdCB1MTMyICp0ZW1wOwotICAgICAgICBtdXRleF9sb2NrKCZ1MTMyX21vZHVsZV9sb2NrKTsKLSAgICAgICAgdTEzMl9leGl0aW5nICs9IDE7Ci0gICAgICAgIG11dGV4X3VubG9jaygmdTEzMl9tb2R1bGVfbG9jayk7Ci0gICAgICAgIGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh1MTMyLCB0ZW1wLCAmdTEzMl9zdGF0aWNfbGlzdCwgdTEzMl9saXN0KSB7Ci0gICAgICAgICAgICAgICAgcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIodTEzMi0+cGxhdGZvcm1fZGV2KTsKLSAgICAgICAgfSBwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdTEzMl9wbGF0Zm9ybV9kcml2ZXIpOwotICAgICAgICBwcmludGsoS0VSTl9JTkZPICJ1MTMyLWhjZCBkcml2ZXIgZGVyZWdpc3RlcmVkXG4iKTsKLSAgICAgICAgd2FpdF9ldmVudCh1MTMyX2hjZF93YWl0LCB1MTMyX2luc3RhbmNlcyA9PSAwKTsKLSAgICAgICAgZmx1c2hfd29ya3F1ZXVlKHdvcmtxdWV1ZSk7Ci0gICAgICAgIGRlc3Ryb3lfd29ya3F1ZXVlKHdvcmtxdWV1ZSk7CisJc3RydWN0IHUxMzIgKnUxMzI7CisJc3RydWN0IHUxMzIgKnRlbXA7CisJbXV0ZXhfbG9jaygmdTEzMl9tb2R1bGVfbG9jayk7CisJdTEzMl9leGl0aW5nICs9IDE7CisJbXV0ZXhfdW5sb2NrKCZ1MTMyX21vZHVsZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodTEzMiwgdGVtcCwgJnUxMzJfc3RhdGljX2xpc3QsIHUxMzJfbGlzdCkgeworCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcih1MTMyLT5wbGF0Zm9ybV9kZXYpOworCX0KKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdTEzMl9wbGF0Zm9ybV9kcml2ZXIpOworCXByaW50ayhLRVJOX0lORk8gInUxMzItaGNkIGRyaXZlciBkZXJlZ2lzdGVyZWRcbiIpOworCXdhaXRfZXZlbnQodTEzMl9oY2Rfd2FpdCwgdTEzMl9pbnN0YW5jZXMgPT0gMCk7CisJZmx1c2hfd29ya3F1ZXVlKHdvcmtxdWV1ZSk7CisJZGVzdHJveV93b3JrcXVldWUod29ya3F1ZXVlKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaGNkLmMKaW5kZXggZWM5ODc4OS4uZDNlMGQ4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC91aGNpLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1oY2QuYwpAQCAtMjYyLDIwICsyNjIsMTIgQEAKIHsKIAlpbnQgYXV0b19zdG9wOwogCWludCBpbnRfZW5hYmxlLCBlZ3NtX2VuYWJsZTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqcmhkZXYgPSB1aGNpX3RvX2hjZCh1aGNpKS0+c2VsZi5yb290X2h1YjsKIAogCWF1dG9fc3RvcCA9IChuZXdfc3RhdGUgPT0gVUhDSV9SSF9BVVRPX1NUT1BQRUQpOwotCWRldl9kYmcoJnVoY2lfdG9faGNkKHVoY2kpLT5zZWxmLnJvb3RfaHViLT5kZXYsCi0JCQkiJXMlc1xuIiwgX19GVU5DVElPTl9fLAorCWRldl9kYmcoJnJoZGV2LT5kZXYsICIlcyVzXG4iLCBfX2Z1bmNfXywKIAkJCShhdXRvX3N0b3AgPyAiIChhdXRvLXN0b3ApIiA6ICIiKSk7CiAKLQkvKiBJZiB3ZSBnZXQgYSBzdXNwZW5kIHJlcXVlc3Qgd2hlbiB3ZSdyZSBhbHJlYWR5IGF1dG8tc3RvcHBlZAotCSAqIHRoZW4gdGhlcmUncyBub3RoaW5nIHRvIGRvLgotCSAqLwotCWlmICh1aGNpLT5yaF9zdGF0ZSA9PSBVSENJX1JIX0FVVE9fU1RPUFBFRCkgewotCQl1aGNpLT5yaF9zdGF0ZSA9IG5ld19zdGF0ZTsKLQkJcmV0dXJuOwotCX0KLQogCS8qIEVuYWJsZSByZXN1bWUtZGV0ZWN0IGludGVycnVwdHMgaWYgdGhleSB3b3JrLgogCSAqIFRoZW4gZW50ZXIgR2xvYmFsIFN1c3BlbmQgbW9kZSBpZiBfaXRfIHdvcmtzLCBzdGlsbCBjb25maWd1cmVkLgogCSAqLwpAQCAtMjg1LDggKzI3NywxMCBAQAogCWlmIChyZW1vdGVfd2FrZXVwX2lzX2Jyb2tlbih1aGNpKSkKIAkJZWdzbV9lbmFibGUgPSAwOwogCWlmIChyZXN1bWVfZGV0ZWN0X2ludGVycnVwdHNfYXJlX2Jyb2tlbih1aGNpKSB8fCAhZWdzbV9lbmFibGUgfHwKLQkJCSFkZXZpY2VfbWF5X3dha2V1cCgKLQkJCQkmdWhjaV90b19oY2QodWhjaSktPnNlbGYucm9vdF9odWItPmRldikpCisjaWZkZWYgQ09ORklHX1BNCisJCQkoIWF1dG9fc3RvcCAmJiAhcmhkZXYtPmRvX3JlbW90ZV93YWtldXApIHx8CisjZW5kaWYKKwkJCShhdXRvX3N0b3AgJiYgIWRldmljZV9tYXlfd2FrZXVwKCZyaGRldi0+ZGV2KSkpCiAJCXVoY2ktPndvcmtpbmdfUkQgPSBpbnRfZW5hYmxlID0gMDsKIAogCW91dHcoaW50X2VuYWJsZSwgdWhjaS0+aW9fYWRkciArIFVTQklOVFIpOwpAQCAtMzA4LDggKzMwMiw3IEBACiAJCQlyZXR1cm47CiAJfQogCWlmICghKGludyh1aGNpLT5pb19hZGRyICsgVVNCU1RTKSAmIFVTQlNUU19IQ0gpKQotCQlkZXZfd2FybigmdWhjaV90b19oY2QodWhjaSktPnNlbGYucm9vdF9odWItPmRldiwKLQkJCSJDb250cm9sbGVyIG5vdCBzdG9wcGVkIHlldCFcbiIpOworCQlkZXZfd2Fybih1aGNpX2Rldih1aGNpKSwgIkNvbnRyb2xsZXIgbm90IHN0b3BwZWQgeWV0IVxuIik7CiAKIAl1aGNpX2dldF9jdXJyZW50X2ZyYW1lX251bWJlcih1aGNpKTsKIApAQCAtMzQyLDcgKzMzNSw3IEBACiBfX2FjcXVpcmVzKHVoY2ktPmxvY2spCiB7CiAJZGV2X2RiZygmdWhjaV90b19oY2QodWhjaSktPnNlbGYucm9vdF9odWItPmRldiwKLQkJCSIlcyVzXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkiJXMlc1xuIiwgX19mdW5jX18sCiAJCQl1aGNpLT5yaF9zdGF0ZSA9PSBVSENJX1JIX0FVVE9fU1RPUFBFRCA/CiAJCQkJIiAoYXV0by1zdGFydCkiIDogIiIpOwogCkBAIC03MzcsMTIgKzczMCwxMiBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCB1aGNpX3N1c3BlbmQoc3RydWN0IHVzYl9oY2QgKmhjZCwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCitzdGF0aWMgaW50IHVoY2lfcGNpX3N1c3BlbmQoc3RydWN0IHVzYl9oY2QgKmhjZCwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCiB7CiAJc3RydWN0IHVoY2lfaGNkICp1aGNpID0gaGNkX3RvX3VoY2koaGNkKTsKIAlpbnQgcmMgPSAwOwogCi0JZGV2X2RiZyh1aGNpX2Rldih1aGNpKSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCWRldl9kYmcodWhjaV9kZXYodWhjaSksICIlc1xuIiwgX19mdW5jX18pOwogCiAJc3Bpbl9sb2NrX2lycSgmdWhjaS0+bG9jayk7CiAJaWYgKCF0ZXN0X2JpdChIQ0RfRkxBR19IV19BQ0NFU1NJQkxFLCAmaGNkLT5mbGFncykgfHwgdWhjaS0+ZGVhZCkKQEAgLTc3NCwxMSArNzY3LDExIEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IHVoY2lfcmVzdW1lKHN0cnVjdCB1c2JfaGNkICpoY2QpCitzdGF0aWMgaW50IHVoY2lfcGNpX3Jlc3VtZShzdHJ1Y3QgdXNiX2hjZCAqaGNkKQogewogCXN0cnVjdCB1aGNpX2hjZCAqdWhjaSA9IGhjZF90b191aGNpKGhjZCk7CiAKLQlkZXZfZGJnKHVoY2lfZGV2KHVoY2kpLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJZGV2X2RiZyh1aGNpX2Rldih1aGNpKSwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBTaW5jZSB3ZSBhcmVuJ3QgaW4gRDMgYW55IG1vcmUsIGl0J3Mgc2FmZSB0byBzZXQgdGhpcyBmbGFnCiAJICogZXZlbiBpZiB0aGUgY29udHJvbGxlciB3YXMgZGVhZC4KQEAgLTg3Miw4ICs4NjUsOCBAQAogCS5yZXNldCA9CQl1aGNpX2luaXQsCiAJLnN0YXJ0ID0JCXVoY2lfc3RhcnQsCiAjaWZkZWYgQ09ORklHX1BNCi0JLnN1c3BlbmQgPQkJdWhjaV9zdXNwZW5kLAotCS5yZXN1bWUgPQkJdWhjaV9yZXN1bWUsCisJLnBjaV9zdXNwZW5kID0JCXVoY2lfcGNpX3N1c3BlbmQsCisJLnBjaV9yZXN1bWUgPQkJdWhjaV9wY2lfcmVzdW1lLAogCS5idXNfc3VzcGVuZCA9CQl1aGNpX3JoX3N1c3BlbmQsCiAJLmJ1c19yZXN1bWUgPQkJdWhjaV9yaF9yZXN1bWUsCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1xLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktcS5jCmluZGV4IDYwMzc5YjEuLmRiNjQ1OTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1xLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC91aGNpLXEuYwpAQCAtMTE3MSw3ICsxMTcxLDcgQEAKIAkJCQkvKiBTb21lIGRlYnVnZ2luZyBjb2RlICovCiAJCQkJZGV2X2RiZygmdXJiLT5kZXYtPmRldiwKIAkJCQkJCSIlczogZmFpbGVkIHdpdGggc3RhdHVzICV4XG4iLAotCQkJCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJCQkJX19mdW5jX18sIHN0YXR1cyk7CiAKIAkJCQlpZiAoZGVidWcgPiAxICYmIGVycmJ1ZikgewogCQkJCQkvKiBQcmludCB0aGUgY2hhaW4gZm9yIGRlYnVnZ2luZyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW1hZ2UvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2ltYWdlL0tjb25maWcKaW5kZXggNzU5NWRmYi4uMzMzNTBmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW1hZ2UvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9pbWFnZS9LY29uZmlnCkBAIC01LDggKzUsOCBAQAogCWRlcGVuZHMgb24gVVNCCiAKIGNvbmZpZyBVU0JfTURDODAwCi0JdHJpc3RhdGUgIlVTQiBNdXN0ZWsgTURDODAwIERpZ2l0YWwgQ2FtZXJhIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBVU0IgJiYgRVhQRVJJTUVOVEFMCisJdHJpc3RhdGUgIlVTQiBNdXN0ZWsgTURDODAwIERpZ2l0YWwgQ2FtZXJhIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0IKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgdGhpcyB0eXBlIG9mIHN0aWxsIGNhbWVyYSB0bwogCSAgeW91ciBjb21wdXRlcidzIFVTQiBwb3J0LiBUaGlzIGRyaXZlciBjYW4gYmUgdXNlZCB3aXRoIGdwaG90byAwLjQuMwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW1hZ2UvbWljcm90ZWsuYyBiL2RyaXZlcnMvdXNiL2ltYWdlL21pY3JvdGVrLmMKaW5kZXggYmMyMDdlMy4uODg1ODY3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW1hZ2UvbWljcm90ZWsuYworKysgYi9kcml2ZXJzL3VzYi9pbWFnZS9taWNyb3Rlay5jCkBAIC0xODUsNyArMTg1LDcgQEAKIAlwcmludGsoIEtFUk5fREVCVUcgTVRTX05BTUUgeCApCiAKICNkZWZpbmUgTVRTX0RFQlVHX0dPVF9IRVJFKCkgXAotCU1UU19ERUJVRygiZ290IHRvICVzOiVkICglcylcbiIsIF9fRklMRV9fLCAoaW50KV9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fICkKKwlNVFNfREVCVUcoImdvdCB0byAlczolZCAoJXMpXG4iLCBfX0ZJTEVfXywgKGludClfX0xJTkVfXywgX19mdW5jX18gKQogI2RlZmluZSBNVFNfREVCVUdfSU5UKCkgXAogCWRvIHsgTVRTX0RFQlVHX0dPVF9IRVJFKCk7IFwKIAkgICAgIE1UU19ERUJVRygidHJhbnNmZXIgPSAweCV4IGNvbnRleHQgPSAweCV4XG4iLChpbnQpdHJhbnNmZXIsKGludCljb250ZXh0ICk7IFwKQEAgLTc5NCw3ICs3OTQsNiBAQAogCiAJbmV3X2Rlc2MtPnVzYl9kZXYgPSBkZXY7CiAJbmV3X2Rlc2MtPnVzYl9pbnRmID0gaW50ZjsKLQlpbml0X01VVEVYKCZuZXdfZGVzYy0+bG9jayk7CiAKIAkvKiBlbmRwb2ludHMgKi8KIAluZXdfZGVzYy0+ZXBfb3V0ID0gZXBfb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW1hZ2UvbWljcm90ZWsuaCBiL2RyaXZlcnMvdXNiL2ltYWdlL21pY3JvdGVrLmgKaW5kZXggZDVkNjJhOS4uY2NjZTMxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW1hZ2UvbWljcm90ZWsuaAorKysgYi9kcml2ZXJzL3VzYi9pbWFnZS9taWNyb3Rlay5oCkBAIC0zOSw3ICszOSw2IEBACiAJdTggZXBfaW1hZ2U7CiAKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICogaG9zdDsKLQlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CiAKIAlzdHJ1Y3QgdXJiICp1cmI7CiAJc3RydWN0IG10c190cmFuc2Zlcl9jb250ZXh0IGNvbnRleHQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL0tjb25maWcgYi9kcml2ZXJzL3VzYi9taXNjL0tjb25maWcKaW5kZXggOWM3ZWI2MS4uYTUzZGIxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvS2NvbmZpZwpAQCAtMzMsOCArMzMsOCBAQAogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGVtaTI2LgogCiBjb25maWcgVVNCX0FEVVRVWAotCXRyaXN0YXRlICJBRFUgZGV2aWNlcyBmcm9tIE9udHJhayBDb250cm9sIFN5c3RlbXMgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBVU0IgJiYgRVhQRVJJTUVOVEFMCisJdHJpc3RhdGUgIkFEVSBkZXZpY2VzIGZyb20gT250cmFrIENvbnRyb2wgU3lzdGVtcyIKKwlkZXBlbmRzIG9uIFVTQgogCWhlbHAKIAkgIFNheSBZIGlmIHlvdSB3YW50IHRvIHVzZSBhbiBBRFUgZGV2aWNlIGZyb20gT250cmFrIENvbnRyb2wKIAkgIFN5c3RlbXMuCkBAIC00Myw4ICs0Myw4IEBACiAJICB3aWxsIGJlIGNhbGxlZCBhZHV0dXguCiAKIGNvbmZpZyBVU0JfQVVFUlNXQUxECi0JdHJpc3RhdGUgIlVTQiBBdWVyc3dhbGQgSVNETiBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCICYmIEVYUEVSSU1FTlRBTAorCXRyaXN0YXRlICJVU0IgQXVlcnN3YWxkIElTRE4gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQgogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29ubmVjdCBhbiBBdWVyc3dhbGQgVVNCIElTRE4gRGV2aWNlCiAJICB0byB5b3VyIGNvbXB1dGVyJ3MgVVNCIHBvcnQuCkBAIC01Myw4ICs1Myw4IEBACiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYXVlcnN3YWxkLgogCiBjb25maWcgVVNCX1JJTzUwMAotCXRyaXN0YXRlICJVU0IgRGlhbW9uZCBSaW81MDAgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIFVTQiAmJiBFWFBFUklNRU5UQUwKKwl0cmlzdGF0ZSAiVVNCIERpYW1vbmQgUmlvNTAwIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0IKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgYSBVU0IgUmlvNTAwIG1wMyBwbGF5ZXIgdG8geW91cgogCSAgY29tcHV0ZXIncyBVU0IgcG9ydC4gUGxlYXNlIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi91c2IvcmlvLnR4dD4KQEAgLTY0LDggKzY0LDggQEAKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCByaW81MDAuCiAKIGNvbmZpZyBVU0JfTEVHT1RPV0VSCi0JdHJpc3RhdGUgIlVTQiBMZWdvIEluZnJhcmVkIFRvd2VyIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBVU0IgJiYgRVhQRVJJTUVOVEFMCisJdHJpc3RhdGUgIlVTQiBMZWdvIEluZnJhcmVkIFRvd2VyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0IKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgYSBVU0IgTGVnbyBJbmZyYXJlZCBUb3dlciB0byB5b3VyCiAJICBjb21wdXRlcidzIFVTQiBwb3J0LgpAQCAtMjU5LDggKzI1OSw4IEBACiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaW93YXJyaW9yLgogCiBjb25maWcgVVNCX1RFU1QKLQl0cmlzdGF0ZSAiVVNCIHRlc3RpbmcgZHJpdmVyIChERVZFTE9QTUVOVCkiCi0JZGVwZW5kcyBvbiBVU0IgJiYgVVNCX0RFVklDRUZTICYmIEVYUEVSSU1FTlRBTAorCXRyaXN0YXRlICJVU0IgdGVzdGluZyBkcml2ZXIiCisJZGVwZW5kcyBvbiBVU0IgJiYgVVNCX0RFVklDRUZTCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgaXMgZm9yIHRlc3RpbmcgaG9zdCBjb250cm9sbGVyIHNvZnR3YXJlLiAgSXQgaXMgdXNlZAogCSAgd2l0aCBzcGVjaWFsaXplZCBkZXZpY2UgZmlybXdhcmUgZm9yIHJlZ3Jlc3Npb24gYW5kIHN0cmVzcyB0ZXN0aW5nLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9hZHV0dXguYyBiL2RyaXZlcnMvdXNiL21pc2MvYWR1dHV4LmMKaW5kZXggNWEyYzQ0ZS4uOTY1ZjZlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9hZHV0dXguYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2FkdXR1eC5jCkBAIC0xNDcsMTAgKzE0NywxMCBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoMiwiICVzIDogZW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCWRiZygyLCIgJXMgOiBlbnRlciIsIF9fZnVuY19fKTsKIAogCWlmIChkZXYtPnVkZXYgPT0gTlVMTCkgewotCQlkYmcoMSwiICVzIDogdWRldiBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKDEsIiAlcyA6IHVkZXYgaXMgbnVsbCIsIF9fZnVuY19fKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMTcyLDEyICsxNzIsMTIgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5idWZsb2NrLCBmbGFncyk7CiAKIGV4aXQ6Ci0JZGJnKDIsIiAlcyA6IGxlYXZlIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoMiwiICVzIDogbGVhdmUiLCBfX2Z1bmNfXyk7CiB9CiAKIHN0YXRpYyB2b2lkIGFkdV9kZWxldGUoc3RydWN0IGFkdV9kZXZpY2UgKmRldikKIHsKLQlkYmcoMiwgIiVzIGVudGVyIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoMiwgIiVzIGVudGVyIiwgX19mdW5jX18pOwogCiAJLyogZnJlZSBkYXRhIHN0cnVjdHVyZXMgKi8KIAl1c2JfZnJlZV91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiKTsKQEAgLTE4OCw3ICsxODgsNyBAQAogCWtmcmVlKGRldi0+aW50ZXJydXB0X291dF9idWZmZXIpOwogCWtmcmVlKGRldik7CiAKLQlkYmcoMiwgIiVzIDogbGVhdmUiLCBfX0ZVTkNUSU9OX18pOworCWRiZygyLCAiJXMgOiBsZWF2ZSIsIF9fZnVuY19fKTsKIH0KIAogc3RhdGljIHZvaWQgYWR1X2ludGVycnVwdF9pbl9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCkBAIC0xOTYsOCArMTk2LDggQEAKIAlzdHJ1Y3QgYWR1X2RldmljZSAqZGV2ID0gdXJiLT5jb250ZXh0OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZyg0LCIgJXMgOiBlbnRlciwgc3RhdHVzICVkIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOwotCWFkdV9kZWJ1Z19kYXRhKDUsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLAorCWRiZyg0LCIgJXMgOiBlbnRlciwgc3RhdHVzICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CisJYWR1X2RlYnVnX2RhdGEoNSwgX19mdW5jX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwKIAkJICAgICAgIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIAogCXNwaW5fbG9jaygmZGV2LT5idWZsb2NrKTsKQEAgLTIwNiw3ICsyMDYsNyBAQAogCQlpZiAoKHN0YXR1cyAhPSAtRU5PRU5UKSAmJiAoc3RhdHVzICE9IC1FQ09OTlJFU0VUKSAmJgogCQkJKHN0YXR1cyAhPSAtRVNIVVRET1dOKSkgewogCQkJZGJnKDEsIiAlcyA6IG5vbnplcm8gc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQl9CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC0yMjAsMTAgKzIyMCwxMCBAQAogCQkJCWRldi0+aW50ZXJydXB0X2luX2J1ZmZlciwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAogCQkJZGV2LT5yZWFkX2J1ZmZlcl9sZW5ndGggKz0gdXJiLT5hY3R1YWxfbGVuZ3RoOwotCQkJZGJnKDIsIiAlcyByZWFkaW5nICAlZCAiLCBfX0ZVTkNUSU9OX18sCisJCQlkYmcoMiwiICVzIHJlYWRpbmcgICVkICIsIF9fZnVuY19fLAogCQkJICAgIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCX0gZWxzZSB7Ci0JCQlkYmcoMSwiICVzIDogcmVhZF9idWZmZXIgb3ZlcmZsb3ciLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKDEsIiAlcyA6IHJlYWRfYnVmZmVyIG92ZXJmbG93IiwgX19mdW5jX18pOwogCQl9CiAJfQogCkBAIC0yMzIsOSArMjMyLDkgQEAKIAlzcGluX3VubG9jaygmZGV2LT5idWZsb2NrKTsKIAkvKiBhbHdheXMgd2FrZSB1cCBzbyB3ZSByZWNvdmVyIGZyb20gZXJyb3JzICovCiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPnJlYWRfd2FpdCk7Ci0JYWR1X2RlYnVnX2RhdGEoNSwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgsCisJYWR1X2RlYnVnX2RhdGEoNSwgX19mdW5jX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwKIAkJICAgICAgIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKLQlkYmcoNCwiICVzIDogbGVhdmUsIHN0YXR1cyAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwlkYmcoNCwiICVzIDogbGVhdmUsIHN0YXR1cyAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogfQogCiBzdGF0aWMgdm9pZCBhZHVfaW50ZXJydXB0X291dF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCkBAIC0yNDIsMTQgKzI0MiwxNCBAQAogCXN0cnVjdCBhZHVfZGV2aWNlICpkZXYgPSB1cmItPmNvbnRleHQ7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKDQsIiAlcyA6IGVudGVyLCBzdGF0dXMgJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7Ci0JYWR1X2RlYnVnX2RhdGEoNSxfX0ZVTkNUSU9OX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwgdXJiLT50cmFuc2Zlcl9idWZmZXIpOworCWRiZyg0LCIgJXMgOiBlbnRlciwgc3RhdHVzICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CisJYWR1X2RlYnVnX2RhdGEoNSxfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCB1cmItPnRyYW5zZmVyX2J1ZmZlcik7CiAKIAlpZiAoc3RhdHVzICE9IDApIHsKIAkJaWYgKChzdGF0dXMgIT0gLUVOT0VOVCkgJiYKIAkJICAgIChzdGF0dXMgIT0gLUVDT05OUkVTRVQpKSB7CiAJCQlkYmcoMSwgIiAlcyA6bm9uemVybyBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCX0KIAkJZ290byBleGl0OwogCX0KQEAgLTI2MCw5ICsyNjAsOSBAQAogCXNwaW5fdW5sb2NrKCZkZXYtPmJ1ZmxvY2spOwogZXhpdDoKIAotCWFkdV9kZWJ1Z19kYXRhKDUsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLAorCWFkdV9kZWJ1Z19kYXRhKDUsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgsCiAJCSAgICAgICB1cmItPnRyYW5zZmVyX2J1ZmZlcik7Ci0JZGJnKDQsIiAlcyA6IGxlYXZlLCBzdGF0dXMgJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJZGJnKDQsIiAlcyA6IGxlYXZlLCBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIH0KIAogc3RhdGljIGludCBhZHVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKQEAgLTI3MiwxOSArMjcyLDE5IEBACiAJaW50IHN1Ym1pbm9yOwogCWludCByZXR2YWw7CiAKLQlkYmcoMiwiJXMgOiBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsIiVzIDogZW50ZXIiLCBfX2Z1bmNfXyk7CiAKIAlzdWJtaW5vciA9IGltaW5vcihpbm9kZSk7CiAKIAlpZiAoKHJldHZhbCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmYWR1dHV4X211dGV4KSkpIHsKLQkJZGJnKDIsICIlcyA6IG11dGV4IGxvY2sgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKDIsICIlcyA6IG11dGV4IGxvY2sgZmFpbGVkIiwgX19mdW5jX18pOwogCQlnb3RvIGV4aXRfbm9fbG9jazsKIAl9CiAKIAlpbnRlcmZhY2UgPSB1c2JfZmluZF9pbnRlcmZhY2UoJmFkdV9kcml2ZXIsIHN1Ym1pbm9yKTsKIAlpZiAoIWludGVyZmFjZSkgewogCQllcnIoIiVzIC0gZXJyb3IsIGNhbid0IGZpbmQgZGV2aWNlIGZvciBtaW5vciAlZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN1Ym1pbm9yKTsKKwkJICAgIF9fZnVuY19fLCBzdWJtaW5vcik7CiAJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gZXhpdF9ub19kZXZpY2U7CiAJfQpAQCAtMzAyLDcgKzMwMiw3IEBACiAJfQogCiAJKytkZXYtPm9wZW5fY291bnQ7Ci0JZGJnKDIsIiVzIDogb3BlbiBjb3VudCAlZCIsIF9fRlVOQ1RJT05fXywgZGV2LT5vcGVuX2NvdW50KTsKKwlkYmcoMiwiJXMgOiBvcGVuIGNvdW50ICVkIiwgX19mdW5jX18sIGRldi0+b3Blbl9jb3VudCk7CiAKIAkvKiBzYXZlIGRldmljZSBpbiB0aGUgZmlsZSdzIHByaXZhdGUgc3RydWN0dXJlICovCiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZGV2OwpAQCAtMzMyLDIzICszMzIsMjMgQEAKIGV4aXRfbm9fZGV2aWNlOgogCW11dGV4X3VubG9jaygmYWR1dHV4X211dGV4KTsKIGV4aXRfbm9fbG9jazoKLQlkYmcoMiwiJXMgOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkICIsIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwlkYmcoMiwiJXMgOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkICIsIF9fZnVuY19fLCByZXR2YWwpOwogCXJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyB2b2lkIGFkdV9yZWxlYXNlX2ludGVybmFsKHN0cnVjdCBhZHVfZGV2aWNlICpkZXYpCiB7Ci0JZGJnKDIsIiAlcyA6IGVudGVyIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoMiwiICVzIDogZW50ZXIiLCBfX2Z1bmNfXyk7CiAKIAkvKiBkZWNyZW1lbnQgb3VyIHVzYWdlIGNvdW50IGZvciB0aGUgZGV2aWNlICovCiAJLS1kZXYtPm9wZW5fY291bnQ7Ci0JZGJnKDIsIiAlcyA6IG9wZW4gY291bnQgJWQiLCBfX0ZVTkNUSU9OX18sIGRldi0+b3Blbl9jb3VudCk7CisJZGJnKDIsIiAlcyA6IG9wZW4gY291bnQgJWQiLCBfX2Z1bmNfXywgZGV2LT5vcGVuX2NvdW50KTsKIAlpZiAoZGV2LT5vcGVuX2NvdW50IDw9IDApIHsKIAkJYWR1X2Fib3J0X3RyYW5zZmVycyhkZXYpOwogCQlkZXYtPm9wZW5fY291bnQgPSAwOwogCX0KIAotCWRiZygyLCIgJXMgOiBsZWF2ZSIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsIiAlcyA6IGxlYXZlIiwgX19mdW5jX18pOwogfQogCiBzdGF0aWMgaW50IGFkdV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQpAQCAtMzU2LDE3ICszNTYsMTcgQEAKIAlzdHJ1Y3QgYWR1X2RldmljZSAqZGV2OwogCWludCByZXR2YWwgPSAwOwogCi0JZGJnKDIsIiAlcyA6IGVudGVyIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoMiwiICVzIDogZW50ZXIiLCBfX2Z1bmNfXyk7CiAKIAlpZiAoZmlsZSA9PSBOVUxMKSB7Ci0gCQlkYmcoMSwiICVzIDogZmlsZSBpcyBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAJCWRiZygxLCIgJXMgOiBmaWxlIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CiAJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaWYgKGRldiA9PSBOVUxMKSB7Ci0gCQlkYmcoMSwiICVzIDogb2JqZWN0IGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworIAkJZGJnKDEsIiAlcyA6IG9iamVjdCBpcyBOVUxMIiwgX19mdW5jX18pOwogCQlyZXR2YWwgPSAtRU5PREVWOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtMzc0LDcgKzM3NCw3IEBACiAJbXV0ZXhfbG9jaygmYWR1dHV4X211dGV4KTsgLyogbm90IGludGVycnVwdGlibGUgKi8KIAogCWlmIChkZXYtPm9wZW5fY291bnQgPD0gMCkgewotCQlkYmcoMSwiICVzIDogZGV2aWNlIG5vdCBvcGVuZWQiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoMSwiICVzIDogZGV2aWNlIG5vdCBvcGVuZWQiLCBfX2Z1bmNfXyk7CiAJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC0zODgsNyArMzg4LDcgQEAKIAogZXhpdDoKIAltdXRleF91bmxvY2soJmFkdXR1eF9tdXRleCk7Ci0JZGJnKDIsIiAlcyA6IGxlYXZlLCByZXR1cm4gdmFsdWUgJWQiLCBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJZGJnKDIsIiAlcyA6IGxlYXZlLCByZXR1cm4gdmFsdWUgJWQiLCBfX2Z1bmNfXywgcmV0dmFsKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC00MDUsMTAgKzQwNSwxMCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAKLQlkYmcoMiwiICVzIDogZW50ZXIsIGNvdW50ID0gJVpkLCBmaWxlPSVwIiwgX19GVU5DVElPTl9fLCBjb3VudCwgZmlsZSk7CisJZGJnKDIsIiAlcyA6IGVudGVyLCBjb3VudCA9ICVaZCwgZmlsZT0lcCIsIF9fZnVuY19fLCBjb3VudCwgZmlsZSk7CiAKIAlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JZGJnKDIsIiAlcyA6IGRldj0lcCIsIF9fRlVOQ1RJT05fXywgZGV2KTsKKwlkYmcoMiwiICVzIDogZGV2PSVwIiwgX19mdW5jX18sIGRldik7CiAKIAlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPm10eCkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CkBAIC00MjIsMTYgKzQyMiwxNiBAQAogCiAJLyogdmVyaWZ5IHRoYXQgc29tZSBkYXRhIHdhcyByZXF1ZXN0ZWQgKi8KIAlpZiAoY291bnQgPT0gMCkgewotCQlkYmcoMSwiICVzIDogcmVhZCByZXF1ZXN0IG9mIDAgYnl0ZXMiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoMSwiICVzIDogcmVhZCByZXF1ZXN0IG9mIDAgYnl0ZXMiLCBfX2Z1bmNfXyk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAl0aW1lb3V0ID0gQ09NTUFORF9USU1FT1VUOwotCWRiZygyLCIgJXMgOiBhYm91dCB0byBzdGFydCBsb29waW5nIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoMiwiICVzIDogYWJvdXQgdG8gc3RhcnQgbG9vcGluZyIsIF9fZnVuY19fKTsKIAl3aGlsZSAoYnl0ZXNfdG9fcmVhZCkgewogCQlpbnQgZGF0YV9pbl9zZWNvbmRhcnkgPSBkZXYtPnNlY29uZGFyeV90YWlsIC0gZGV2LT5zZWNvbmRhcnlfaGVhZDsKIAkJZGJnKDIsIiAlcyA6IHdoaWxlLCBkYXRhX2luX3NlY29uZGFyeT0lZCwgc3RhdHVzPSVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgZGF0YV9pbl9zZWNvbmRhcnksCisJCSAgICBfX2Z1bmNfXywgZGF0YV9pbl9zZWNvbmRhcnksCiAJCSAgICBkZXYtPmludGVycnVwdF9pbl91cmItPnN0YXR1cyk7CiAKIAkJaWYgKGRhdGFfaW5fc2Vjb25kYXJ5KSB7CkBAIC00NTYsNyArNDU2LDcgQEAKIAkJCQkvKiB3ZSBzZWN1cmUgYWNjZXNzIHRvIHRoZSBwcmltYXJ5ICovCiAJCQkJY2hhciAqdG1wOwogCQkJCWRiZygyLCIgJXMgOiBzd2FwLCByZWFkX2J1ZmZlcl9sZW5ndGggPSAlZCIsCi0JCQkJICAgIF9fRlVOQ1RJT05fXywgZGV2LT5yZWFkX2J1ZmZlcl9sZW5ndGgpOworCQkJCSAgICBfX2Z1bmNfXywgZGV2LT5yZWFkX2J1ZmZlcl9sZW5ndGgpOwogCQkJCXRtcCA9IGRldi0+cmVhZF9idWZmZXJfc2Vjb25kYXJ5OwogCQkJCWRldi0+cmVhZF9idWZmZXJfc2Vjb25kYXJ5ID0gZGV2LT5yZWFkX2J1ZmZlcl9wcmltYXJ5OwogCQkJCWRldi0+cmVhZF9idWZmZXJfcHJpbWFyeSA9IHRtcDsKQEAgLTQ3MSwxMCArNDcxLDEwIEBACiAJCQkJaWYgKCFkZXYtPnJlYWRfdXJiX2ZpbmlzaGVkKSB7CiAJCQkJCS8qIHNvbWVib2R5IGlzIGRvaW5nIElPICovCiAJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+YnVmbG9jaywgZmxhZ3MpOwotCQkJCQlkYmcoMiwiICVzIDogc3VibWl0dGVkIGFscmVhZHkiLCBfX0ZVTkNUSU9OX18pOworCQkJCQlkYmcoMiwiICVzIDogc3VibWl0dGVkIGFscmVhZHkiLCBfX2Z1bmNfXyk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJLyogd2UgbXVzdCBpbml0aWF0ZSBpbnB1dCAqLwotCQkJCQlkYmcoMiwiICVzIDogaW5pdGlhdGUgaW5wdXQiLCBfX0ZVTkNUSU9OX18pOworCQkJCQlkYmcoMiwiICVzIDogaW5pdGlhdGUgaW5wdXQiLCBfX2Z1bmNfXyk7CiAJCQkJCWRldi0+cmVhZF91cmJfZmluaXNoZWQgPSAwOwogCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmJ1ZmxvY2ssIGZsYWdzKTsKIApAQCAtNDkyLDcgKzQ5Miw3IEBACiAJCQkJCQlpZiAocmV0dmFsID09IC1FTk9NRU0pIHsKIAkJCQkJCQlyZXR2YWwgPSBieXRlc19yZWFkID8gYnl0ZXNfcmVhZCA6IC1FTk9NRU07CiAJCQkJCQl9Ci0JCQkJCQlkYmcoMiwiICVzIDogc3VibWl0IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCQlkYmcoMiwiICVzIDogc3VibWl0IGZhaWxlZCIsIF9fZnVuY19fKTsKIAkJCQkJCWdvdG8gZXhpdDsKIAkJCQkJfQogCQkJCX0KQEAgLTUxMSwxMyArNTExLDEzIEBACiAJCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmRldi0+cmVhZF93YWl0LCAmd2FpdCk7CiAKIAkJCQlpZiAodGltZW91dCA8PSAwKSB7Ci0JCQkJCWRiZygyLCIgJXMgOiB0aW1lb3V0IiwgX19GVU5DVElPTl9fKTsKKwkJCQkJZGJnKDIsIiAlcyA6IHRpbWVvdXQiLCBfX2Z1bmNfXyk7CiAJCQkJCXJldHZhbCA9IGJ5dGVzX3JlYWQgPyBieXRlc19yZWFkIDogLUVUSU1FRE9VVDsKIAkJCQkJZ290byBleGl0OwogCQkJCX0KIAogCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJCQlkYmcoMiwiICVzIDogc2lnbmFsIHBlbmRpbmciLCBfX0ZVTkNUSU9OX18pOworCQkJCQlkYmcoMiwiICVzIDogc2lnbmFsIHBlbmRpbmciLCBfX2Z1bmNfXyk7CiAJCQkJCXJldHZhbCA9IGJ5dGVzX3JlYWQgPyBieXRlc19yZWFkIDogLUVJTlRSOwogCQkJCQlnb3RvIGV4aXQ7CiAJCQkJfQpAQCAtNTUwLDcgKzU1MCw3IEBACiAJLyogdW5sb2NrIHRoZSBkZXZpY2UgKi8KIAltdXRleF91bmxvY2soJmRldi0+bXR4KTsKIAotCWRiZygyLCIgJXMgOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkIiwgX19GVU5DVElPTl9fLCByZXR2YWwpOworCWRiZygyLCIgJXMgOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkIiwgX19mdW5jX18sIHJldHZhbCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtNTY1LDcgKzU2NSw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0dmFsOwogCi0JZGJnKDIsIiAlcyA6IGVudGVyLCBjb3VudCA9ICVaZCIsIF9fRlVOQ1RJT05fXywgY291bnQpOworCWRiZygyLCIgJXMgOiBlbnRlciwgY291bnQgPSAlWmQiLCBfX2Z1bmNfXywgY291bnQpOwogCiAJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCkBAIC01ODIsNyArNTgyLDcgQEAKIAogCS8qIHZlcmlmeSB0aGF0IHdlIGFjdHVhbGx5IGhhdmUgc29tZSBkYXRhIHRvIHdyaXRlICovCiAJaWYgKGNvdW50ID09IDApIHsKLQkJZGJnKDEsIiAlcyA6IHdyaXRlIHJlcXVlc3Qgb2YgMCBieXRlcyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygxLCIgJXMgOiB3cml0ZSByZXF1ZXN0IG9mIDAgYnl0ZXMiLCBfX2Z1bmNfXyk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTU5NSwxMyArNTk1LDEzIEBACiAKIAkJCW11dGV4X3VubG9jaygmZGV2LT5tdHgpOwogCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQkJZGJnKDEsIiAlcyA6IGludGVycnVwdGVkIiwgX19GVU5DVElPTl9fKTsKKwkJCQlkYmcoMSwiICVzIDogaW50ZXJydXB0ZWQiLCBfX2Z1bmNfXyk7CiAJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAkJCQlyZXR2YWwgPSAtRUlOVFI7CiAJCQkJZ290byBleGl0X29ucXVldWU7CiAJCQl9CiAJCQlpZiAoc2NoZWR1bGVfdGltZW91dChDT01NQU5EX1RJTUVPVVQpID09IDApIHsKLQkJCQlkYmcoMSwgIiVzIC0gY29tbWFuZCB0aW1lZCBvdXQuIiwgX19GVU5DVElPTl9fKTsKKwkJCQlkYmcoMSwgIiVzIC0gY29tbWFuZCB0aW1lZCBvdXQuIiwgX19mdW5jX18pOwogCQkJCXJldHZhbCA9IC1FVElNRURPVVQ7CiAJCQkJZ290byBleGl0X29ucXVldWU7CiAJCQl9CkBAIC02MTIsMTggKzYxMiwxOCBAQAogCQkJCWdvdG8gZXhpdF9ub2xvY2s7CiAJCQl9CiAKLQkJCWRiZyg0LCIgJXMgOiBpbiBwcm9ncmVzcywgY291bnQgPSAlWmQiLCBfX0ZVTkNUSU9OX18sIGNvdW50KTsKKwkJCWRiZyg0LCIgJXMgOiBpbiBwcm9ncmVzcywgY291bnQgPSAlWmQiLCBfX2Z1bmNfXywgY291bnQpOwogCQl9IGVsc2UgewogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5idWZsb2NrLCBmbGFncyk7CiAJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmRldi0+d3JpdGVfd2FpdCwgJndhaXRhKTsKLQkJCWRiZyg0LCIgJXMgOiBzZW5kaW5nLCBjb3VudCA9ICVaZCIsIF9fRlVOQ1RJT05fXywgY291bnQpOworCQkJZGJnKDQsIiAlcyA6IHNlbmRpbmcsIGNvdW50ID0gJVpkIiwgX19mdW5jX18sIGNvdW50KTsKIAogCQkJLyogd3JpdGUgdGhlIGRhdGEgaW50byBpbnRlcnJ1cHRfb3V0X2J1ZmZlciBmcm9tIHVzZXJzcGFjZSAqLwogCQkJYnVmZmVyX3NpemUgPSBsZTE2X3RvX2NwdShkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKIAkJCWJ5dGVzX3RvX3dyaXRlID0gY291bnQgPiBidWZmZXJfc2l6ZSA/IGJ1ZmZlcl9zaXplIDogY291bnQ7CiAJCQlkYmcoNCwiICVzIDogYnVmZmVyX3NpemUgPSAlWmQsIGNvdW50ID0gJVpkLCBieXRlc190b193cml0ZSA9ICVaZCIsCi0JCQkgICAgX19GVU5DVElPTl9fLCBidWZmZXJfc2l6ZSwgY291bnQsIGJ5dGVzX3RvX3dyaXRlKTsKKwkJCSAgICBfX2Z1bmNfXywgYnVmZmVyX3NpemUsIGNvdW50LCBieXRlc190b193cml0ZSk7CiAKIAkJCWlmIChjb3B5X2Zyb21fdXNlcihkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyLCBidWZmZXIsIGJ5dGVzX3RvX3dyaXRlKSAhPSAwKSB7CiAJCQkJcmV0dmFsID0gLUVGQVVMVDsKQEAgLTY2MSw3ICs2NjEsNyBAQAogZXhpdDoKIAltdXRleF91bmxvY2soJmRldi0+bXR4KTsKIGV4aXRfbm9sb2NrOgotCWRiZygyLCIgJXMgOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkIiwgX19GVU5DVElPTl9fLCByZXR2YWwpOworCWRiZygyLCIgJXMgOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkIiwgX19mdW5jX18sIHJldHZhbCk7CiAJcmV0dXJuIHJldHZhbDsKIAogZXhpdF9vbnF1ZXVlOgpAQCAtNzA2LDcgKzcwNiw3IEBACiAJaW50IG91dF9lbmRfc2l6ZTsKIAlpbnQgaTsKIAotCWRiZygyLCIgJXMgOiBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsIiAlcyA6IGVudGVyIiwgX19mdW5jX18pOwogCiAJaWYgKHVkZXYgPT0gTlVMTCkgewogCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgInVkZXYgaXMgTlVMTC5cbiIpOwpAQCAtODA3LDcgKzgwNyw3IEBACiAJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiQ291bGQgbm90IHJldHJpZXZlIHNlcmlhbCBudW1iZXJcbiIpOwogCQlnb3RvIGVycm9yOwogCX0KLQlkYmcoMiwiICVzIDogc2VyaWFsX251bWJlcj0lcyIsIF9fRlVOQ1RJT05fXywgZGV2LT5zZXJpYWxfbnVtYmVyKTsKKwlkYmcoMiwiICVzIDogc2VyaWFsX251bWJlcj0lcyIsIF9fZnVuY19fLCBkZXYtPnNlcmlhbF9udW1iZXIpOwogCiAJLyogd2UgY2FuIHJlZ2lzdGVyIHRoZSBkZXZpY2Ugbm93LCBhcyBpdCBpcyByZWFkeSAqLwogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBkZXYpOwpAQCAtODI4LDcgKzgyOCw3IEBACiAJCSB1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCwgZGV2LT5zZXJpYWxfbnVtYmVyLAogCQkgKGRldi0+bWlub3IgLSBBRFVfTUlOT1JfQkFTRSkpOwogZXhpdDoKLQlkYmcoMiwiICVzIDogbGVhdmUsIHJldHVybiB2YWx1ZSAlcCAoZGV2KSIsIF9fRlVOQ1RJT05fXywgZGV2KTsKKwlkYmcoMiwiICVzIDogbGVhdmUsIHJldHVybiB2YWx1ZSAlcCAoZGV2KSIsIF9fZnVuY19fLCBkZXYpOwogCiAJcmV0dXJuIHJldHZhbDsKIApAQCAtODQ3LDcgKzg0Nyw3IEBACiAJc3RydWN0IGFkdV9kZXZpY2UgKmRldjsKIAlpbnQgbWlub3I7CiAKLQlkYmcoMiwiICVzIDogZW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCWRiZygyLCIgJXMgOiBlbnRlciIsIF9fZnVuY19fKTsKIAogCWRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKIApAQCAtODYxLDcgKzg2MSw3IEBACiAJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOwogCiAJLyogaWYgdGhlIGRldmljZSBpcyBub3Qgb3BlbmVkLCB0aGVuIHdlIGNsZWFuIHVwIHJpZ2h0IG5vdyAqLwotCWRiZygyLCIgJXMgOiBvcGVuIGNvdW50ICVkIiwgX19GVU5DVElPTl9fLCBkZXYtPm9wZW5fY291bnQpOworCWRiZygyLCIgJXMgOiBvcGVuIGNvdW50ICVkIiwgX19mdW5jX18sIGRldi0+b3Blbl9jb3VudCk7CiAJaWYgKCFkZXYtPm9wZW5fY291bnQpCiAJCWFkdV9kZWxldGUoZGV2KTsKIApAQCAtODcwLDcgKzg3MCw3IEBACiAJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LCAiQURVIGRldmljZSBhZHV0dXglZCBub3cgZGlzY29ubmVjdGVkXG4iLAogCQkgKG1pbm9yIC0gQURVX01JTk9SX0JBU0UpKTsKIAotCWRiZygyLCIgJXMgOiBsZWF2ZSIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsIiAlcyA6IGxlYXZlIiwgX19mdW5jX18pOwogfQogCiAvKiB1c2Igc3BlY2lmaWMgb2JqZWN0IG5lZWRlZCB0byByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSB1c2Igc3Vic3lzdGVtICovCkBAIC04ODUsNyArODg1LDcgQEAKIHsKIAlpbnQgcmVzdWx0OwogCi0JZGJnKDIsIiAlcyA6IGVudGVyIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoMiwiICVzIDogZW50ZXIiLCBfX2Z1bmNfXyk7CiAKIAkvKiByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCiAJcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZhZHVfZHJpdmVyKTsKQEAgLTg5OSwxNyArODk5LDE3IEBACiAJaW5mbygiYWR1dHV4IGlzIGFuIGV4cGVyaW1lbnRhbCBkcml2ZXIuIFVzZSBhdCB5b3VyIG93biByaXNrIik7CiAKIGV4aXQ6Ci0JZGJnKDIsIiAlcyA6IGxlYXZlLCByZXR1cm4gdmFsdWUgJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJZGJnKDIsIiAlcyA6IGxlYXZlLCByZXR1cm4gdmFsdWUgJWQiLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAogCXJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhZHVfZXhpdCh2b2lkKQogewotCWRiZygyLCIgJXMgOiBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsIiAlcyA6IGVudGVyIiwgX19mdW5jX18pOwogCS8qIGRlcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLwogCXVzYl9kZXJlZ2lzdGVyKCZhZHVfZHJpdmVyKTsKLQlkYmcoMiwiICVzIDogbGVhdmUiLCBfX0ZVTkNUSU9OX18pOworCWRiZygyLCIgJXMgOiBsZWF2ZSIsIF9fZnVuY19fKTsKIH0KIAogbW9kdWxlX2luaXQoYWR1X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9hcHBsZWRpc3BsYXkuYyBiL2RyaXZlcnMvdXNiL21pc2MvYXBwbGVkaXNwbGF5LmMKaW5kZXggYTVlNGMzNS4uYTA3NmMyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9hcHBsZWRpc3BsYXkuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2FwcGxlZGlzcGxheS5jCkBAIC0xMDMsMTEgKzEwMywxMSBAQAogCWNhc2UgLUVTSFVURE9XTjoKIAkJLyogVGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KIAkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZ2Rvd24gd2l0aCBzdGF0dXM6ICVkIiwKLQkJCV9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCV9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJX19mdW5jX18sIHN0YXR1cyk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTEzMSw3ICsxMzEsNyBAQAogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKHBkYXRhLT51cmIsIEdGUF9BVE9NSUMpOwogCWlmIChyZXR2YWwpIHsKIAkJZXJyKCIlcyAtIHVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHJlc3VsdCAlZCIsCi0JCQlfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCQlfX2Z1bmNfXywgcmV0dmFsKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvYXVlcnN3YWxkLmMgYi9kcml2ZXJzL3VzYi9taXNjL2F1ZXJzd2FsZC5jCmluZGV4IGRmN2UxZWMuLjA5MzkzODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvYXVlcnN3YWxkLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9hdWVyc3dhbGQuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIERlYnVnIHN1cHBvcnQgCQkJCQkJICAgICAqLwpAQCAtMjMyLDcgKzIzMyw3IEBACiAvKiBVU0IgZGV2aWNlIGNvbnRleHQgKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0Jc3RydWN0IHNlbWFwaG9yZSAJbXV0ZXg7ICAgICAgICAgCSAgICAvKiBwcm90ZWN0aW9uIGluIHVzZXIgY29udGV4dCAqLworCXN0cnVjdCBtdXRleCAJbXV0ZXg7ICAgICAgICAgCSAgICAvKiBwcm90ZWN0aW9uIGluIHVzZXIgY29udGV4dCAqLwogCWNoYXIgCQkJbmFtZVsyMF07CSAgICAvKiBuYW1lIG9mIHRoZSAvZGV2L3VzYiBlbnRyeSAqLwogCXVuc2lnbmVkIGludAkJZHRpbmRleDsJICAgIC8qIGluZGV4IGluIHRoZSBkZXZpY2UgdGFibGUgKi8KIAlzdHJ1Y3QgdXNiX2RldmljZSAqCXVzYmRldjsgICAgICAJICAgIC8qIFVTQiBkZXZpY2UgaGFuZGxlICovCkBAIC0yNTMsMTIgKzI1NCwxMiBAQAogLyogY2hhcmFjdGVyIGRldmljZSBjb250ZXh0ICovCiB0eXBlZGVmIHN0cnVjdAogewotCXN0cnVjdCBzZW1hcGhvcmUgbXV0ZXg7ICAgICAgICAgLyogcHJvdGVjdGlvbiBpbiB1c2VyIGNvbnRleHQgKi8KKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CQkvKiBwcm90ZWN0aW9uIGluIHVzZXIgY29udGV4dCAqLwogCXBhdWVyc3dhbGRfdCBhdWVyZGV2OyAgICAgICAgICAgLyogY29udGV4dCBwb2ludGVyIG9mIGFzc2lnbmVkIGRldmljZSAqLwogICAgICAgICBhdWVyYnVmY3RsX3QgYnVmY3RsOyAgICAgICAgICAgIC8qIGNvbnRyb2xzIHRoZSBidWZmZXIgY2hhaW4gKi8KICAgICAgICAgYXVlcnNjb25fdCBzY29udGV4dDsgICAgICAgICAgICAvKiBzZXJ2aWNlIGNvbnRleHQgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCByZWFkd2FpdDsgICAgIC8qIGZvciBzeW5jaHJvbm91cyByZWFkaW5nICovCi0Jc3RydWN0IHNlbWFwaG9yZSByZWFkbXV0ZXg7ICAgICAvKiBwcm90ZWN0aW9uIGFnYWluc3QgbXVsdGlwbGUgcmVhZHMgKi8KKwlzdHJ1Y3QgbXV0ZXggcmVhZG11dGV4OwkJLyogcHJvdGVjdGlvbiBhZ2FpbnN0IG11bHRpcGxlIHJlYWRzICovCiAJcGF1ZXJidWZfdCByZWFkYnVmOwkJLyogYnVmZmVyIGhlbGQgZm9yIHBhcnRpYWwgcmVhZGluZyAqLwogCXVuc2lnbmVkIGludCByZWFkb2Zmc2V0OwkvKiBjdXJyZW50IG9mZnNldCBpbiByZWFkYnVmICovCiAJdW5zaWduZWQgaW50IHJlbW92ZWQ7CQkvKiBpcyAhPSAwIGlmIGRldmljZSBpcyByZW1vdmVkICovCkBAIC0yODMsNyArMjg0LDcgQEAKICAgICAgICAgaW50IHJlc3VsdDsKIAogICAgICAgICAvKiBnZXQgcG9pbnRlciB0byBlbGVtZW50IGFuZCB0byBjaGFpbiAqLwotICAgICAgICBwYXVlcmNoYWluZWxlbWVudF90IGFjZXAgPSAocGF1ZXJjaGFpbmVsZW1lbnRfdCkgdXJiLT5jb250ZXh0OworCXBhdWVyY2hhaW5lbGVtZW50X3QgYWNlcCA9IHVyYi0+Y29udGV4dDsKICAgICAgICAgcGF1ZXJjaGFpbl90ICAgICAgICAgYWNwID0gYWNlcC0+Y2hhaW47CiAKICAgICAgICAgLyogcmVzdG9yZSBvcmlnaW5hbCBlbnRyaWVzIGluIHVyYiAqLwpAQCAtNTkzLDcgKzU5NCw3IEBACiAvKiBjb21wbGV0aW9uIGhhbmRsZXIgZm9yIHN5bmNocm9ub3VzIGNoYWluZWQgVVJCcyAqLwogc3RhdGljIHZvaWQgYXVlcmNoYWluX2Jsb2NraW5nX2NvbXBsZXRpb24gKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlwYXVlcmNoYWluX2Noc190IHBjaHMgPSAocGF1ZXJjaGFpbl9jaHNfdCl1cmItPmNvbnRleHQ7CisJcGF1ZXJjaGFpbl9jaHNfdCBwY2hzID0gdXJiLT5jb250ZXh0OwogCXBjaHMtPmRvbmUgPSAxOwogCXdtYigpOwogCXdha2VfdXAgKCZwY2hzLT53cWgpOwpAQCAtODQ2LDcgKzg0Nyw3IEBACiAvKiBDb21wbGV0aW9uIG9mIGFzeW5jaHJvbm91cyB3cml0ZSBibG9jayAqLwogc3RhdGljIHZvaWQgYXVlcmNoYXJfY3RybHdyaXRlX2NvbXBsZXRlIChzdHJ1Y3QgdXJiICogdXJiKQogewotCXBhdWVyYnVmX3QgYnAgPSAocGF1ZXJidWZfdCkgdXJiLT5jb250ZXh0OworCXBhdWVyYnVmX3QgYnAgPSAgdXJiLT5jb250ZXh0OwogCXBhdWVyc3dhbGRfdCBjcCA9ICgocGF1ZXJzd2FsZF90KSgoY2hhciAqKShicC0+bGlzdCktKHVuc2lnbmVkIGxvbmcpKCYoKHBhdWVyc3dhbGRfdCkwKS0+YnVmY3RsKSkpOwogCWRiZyAoImF1ZXJjaGFyX2N0cmx3cml0ZV9jb21wbGV0ZSBjYWxsZWQiKTsKIApAQCAtODU5LDcgKzg2MCw3IEBACiAvKiBDb21wbGV0aW9uIGhhbmRsZXIgZm9yIGR1bW15IHJldHJ5IHBhY2tldCAqLwogc3RhdGljIHZvaWQgYXVlcnN3YWxkX2N0cmxyZWFkX3dyZXRjb21wbGV0ZSAoc3RydWN0IHVyYiAqIHVyYikKIHsKLSAgICAgICAgcGF1ZXJidWZfdCBicCA9IChwYXVlcmJ1Zl90KSB1cmItPmNvbnRleHQ7CisJcGF1ZXJidWZfdCBicCA9IHVyYi0+Y29udGV4dDsKICAgICAgICAgcGF1ZXJzd2FsZF90IGNwOwogCWludCByZXQ7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwpAQCAtOTAzLDcgKzkwNCw3IEBACiAgICAgICAgIHVuc2lnbmVkIGludCAgc2VydmljZWlkOwogICAgICAgICBwYXVlcnN3YWxkX3QgIGNwOwogICAgICAgICBwYXVlcnNjb25fdCAgIHNjcDsKLSAgICAgICAgcGF1ZXJidWZfdCAgICBicCAgPSAocGF1ZXJidWZfdCkgdXJiLT5jb250ZXh0OworCXBhdWVyYnVmX3QgYnAgPSB1cmItPmNvbnRleHQ7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCWludCByZXQ7CiAKQEAgLTk4MCw5ICs5ODEsOSBAQAogICAgICAgICBpbnQgcmV0OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKICAgICAgICAgcGF1ZXJidWZfdCAgIGJwID0gTlVMTDsKLSAgICAgICAgcGF1ZXJzd2FsZF90IGNwID0gKHBhdWVyc3dhbGRfdCkgdXJiLT5jb250ZXh0OworCXBhdWVyc3dhbGRfdCBjcCA9IHVyYi0+Y29udGV4dDsKIAotICAgICAgICBkYmcgKCIlcyBjYWxsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBkYmcgKCIlcyBjYWxsZWQiLCBfX2Z1bmNfXyk7CiAKIAlzd2l0Y2ggKHN0YXR1cykgewogCWNhc2UgMDoKQEAgLTk5MiwxMCArOTkzLDEwIEBACiAJY2FzZSAtRU5PRU5UOgogCWNhc2UgLUVTSFVURE9XTjoKIAkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KLQkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKLQkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTEwODAsNyArMTA4MSw3IEBACiAJcmV0ID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJldCkKIAkJZXJyICgiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQgJWQiLAotCQkgICAgIF9fRlVOQ1RJT05fXywgcmV0KTsKKwkJICAgICBfX2Z1bmNfXywgcmV0KTsKIH0KIAogLyogaW50IG1lbW9yeSBkZWFsbG9jYXRpb24KQEAgLTEzNzYsNyArMTM3Nyw3IEBACiAJaWYgKGNwID09IE5VTEwpIHsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCWlmIChkb3duX2ludGVycnVwdGlibGUgKCZjcC0+bXV0ZXgpKSB7CisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY3AtPm11dGV4KSkgewogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCX0KIApAQCAtMTM4OSw4ICsxMzkwLDggQEAKIAl9CiAKIAkvKiBJbml0aWFsaXplIGRldmljZSBkZXNjcmlwdG9yICovCi0JaW5pdF9NVVRFWCggJmNjcC0+bXV0ZXgpOwotCWluaXRfTVVURVgoICZjY3AtPnJlYWRtdXRleCk7CisJbXV0ZXhfaW5pdCgmY2NwLT5tdXRleCk7CisJbXV0ZXhfaW5pdCgmY2NwLT5yZWFkbXV0ZXgpOwogICAgICAgICBhdWVyYnVmX2luaXQgKCZjY3AtPmJ1ZmN0bCk7CiAgICAgICAgIGNjcC0+c2NvbnRleHQuaWQgPSBBVUhfVU5BU1NJR05FRDsKICAgICAgICAgY2NwLT5zY29udGV4dC5kaXNwYXRjaCA9IGF1ZXJjaGFyX2N0cmxyZWFkX2Rpc3BhdGNoOwpAQCAtMTQwNSw3ICsxNDA2LDcgQEAKIAljcC0+b3Blbl9jb3VudCsrOwogCWNjcC0+YXVlcmRldiA9IGNwOwogCWRiZygib3BlbiAlcyBhcyAvZGV2LyVzIiwgY3AtPmRldl9kZXNjLCBjcC0+bmFtZSk7Ci0JdXAgKCZjcC0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmY3AtPm11dGV4KTsKIAogCS8qIGZpbGUgSU8gc3R1ZmYgKi8KIAlmaWxlLT5mX3BvcyA9IDA7CkBAIC0xNDEzLDcgKzE0MTQsNyBAQAogCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKIAogCS8qIEVycm9yIGV4aXQgKi8KLW9mYWlsOgl1cCAoJmNwLT5tdXRleCk7CitvZmFpbDoJbXV0ZXhfdW5sb2NrKCZjcC0+bXV0ZXgpOwogCWF1ZXJjaGFyX2RlbGV0ZSAoY2NwKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTQzMiwyMyArMTQzMywyMyBAQAogICAgICAgICBkYmcgKCJpb2N0bCIpOwogCiAJLyogZ2V0IHRoZSBtdXRleGVzICovCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmNjcC0+bXV0ZXgpKSB7CisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY2NwLT5tdXRleCkpIHsKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAl9CiAJY3AgPSBjY3AtPmF1ZXJkZXY7CiAJaWYgKCFjcCkgewotCQl1cCAoJmNjcC0+bXV0ZXgpOworCQltdXRleF91bmxvY2soJmNjcC0+bXV0ZXgpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOwogCX0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmY3AtPm11dGV4KSkgewotCQl1cCgmY2NwLT5tdXRleCk7CisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY3AtPm11dGV4KSkgeworCQltdXRleF91bmxvY2soJmNjcC0+bXV0ZXgpOwogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCX0KIAogCS8qIENoZWNrIGZvciByZW1vdmFsICovCiAJaWYgKCFjcC0+dXNiZGV2KSB7Ci0JCXVwKCZjcC0+bXV0ZXgpOwotCQl1cCgmY2NwLT5tdXRleCk7CisJCW11dGV4X3VubG9jaygmY3AtPm11dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZjY3AtPm11dGV4KTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTE1NTAsOCArMTU1MSw4IEBACiAJCWJyZWFrOwogICAgICAgICB9CiAJLyogcmVsZWFzZSB0aGUgbXV0ZXhlcyAqLwotCXVwKCZjcC0+bXV0ZXgpOwotCXVwKCZjY3AtPm11dGV4KTsKKwltdXRleF91bmxvY2soJmNwLT5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZjY3AtPm11dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNTc0LDE4ICsxNTc1LDE4IEBACiAJCXJldHVybiAwOwogCiAJLyogZ2V0IHRoZSBtdXRleCAqLwotCWlmIChkb3duX2ludGVycnVwdGlibGUgKCZjY3AtPm11dGV4KSkKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjY3AtPm11dGV4KSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAogCS8qIENhbiB3ZSBleHBlY3QgdG8gcmVhZCBzb21ldGhpbmc/ICovCiAJaWYgKGNjcC0+c2NvbnRleHQuaWQgPT0gQVVIX1VOQVNTSUdORUQpIHsKLQkJdXAgKCZjY3AtPm11dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZjY3AtPm11dGV4KTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTzsKIAl9CiAKIAkvKiBvbmx5IG9uZSByZWFkZXIgcGVyIGRldmljZSBhbGxvd2VkICovCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmNjcC0+cmVhZG11dGV4KSkgewotCQl1cCAoJmNjcC0+bXV0ZXgpOworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNjcC0+cmVhZG11dGV4KSkgeworCQltdXRleF91bmxvY2soJmNjcC0+bXV0ZXgpOwogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCX0KIApAQCAtMTYwMiw4ICsxNjAzLDggQEAKIAkJaWYgKGNvdW50KSB7CiAJCQlpZiAoY29weV90b191c2VyIChidWYsIGJwLT5idWZwK2NjcC0+cmVhZG9mZnNldCwgY291bnQpKSB7CiAJCQkJZGJnICgiYXVlcnN3YWxkX3JlYWQ6IGNvcHlfdG9fdXNlciBmYWlsZWQiKTsKLQkJCQl1cCAoJmNjcC0+cmVhZG11dGV4KTsKLQkJCQl1cCAoJmNjcC0+bXV0ZXgpOworCQkJCW11dGV4X3VubG9jaygmY2NwLT5yZWFkbXV0ZXgpOworCQkJCW11dGV4X3VubG9jaygmY2NwLT5tdXRleCk7CiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQl9CiAJCX0KQEAgLTE2MTcsOCArMTYxOCw4IEBACiAJCX0KIAkJLyogcmV0dXJuIHdpdGggbnVtYmVyIG9mIGJ5dGVzIHJlYWQgKi8KIAkJaWYgKGNvdW50KSB7Ci0JCQl1cCAoJmNjcC0+cmVhZG11dGV4KTsKLQkJCXVwICgmY2NwLT5tdXRleCk7CisJCQltdXRleF91bmxvY2soJmNjcC0+cmVhZG11dGV4KTsKKwkJCW11dGV4X3VubG9jaygmY2NwLT5tdXRleCk7CiAJCQlyZXR1cm4gY291bnQ7CiAJCX0KIAl9CkBAIC0xNjU0LDI5ICsxNjU1LDI5IEBACiAgICAgICAgICAgICAgICAgZGJnICgiTm8gcmVhZCBidWZmZXIgYXZhaWxhYmxlLCByZXR1cm5pbmcgLUVBR0FJTiIpOwogCQlzZXRfY3VycmVudF9zdGF0ZSAoVEFTS19SVU5OSU5HKTsKIAkJcmVtb3ZlX3dhaXRfcXVldWUgKCZjY3AtPnJlYWR3YWl0LCAmd2FpdCk7Ci0JCXVwICgmY2NwLT5yZWFkbXV0ZXgpOwotCQl1cCAoJmNjcC0+bXV0ZXgpOworCQltdXRleF91bmxvY2soJmNjcC0+cmVhZG11dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZjY3AtPm11dGV4KTsKIAkJcmV0dXJuIC1FQUdBSU47ICAvKiBub25ibG9ja2luZywgbm8gZGF0YSBhdmFpbGFibGUgKi8KICAgICAgICAgfQogCiAJLyogeWVzLCB3ZSBzaG91bGQgd2FpdCEgKi8KLQl1cCAoJmNjcC0+bXV0ZXgpOyAvKiBhbGxvdyBvdGhlciBvcGVyYXRpb25zIHdoaWxlIHdlIHdhaXQgKi8KKwltdXRleF91bmxvY2soJmNjcC0+bXV0ZXgpOyAvKiBhbGxvdyBvdGhlciBvcGVyYXRpb25zIHdoaWxlIHdlIHdhaXQgKi8KIAlzY2hlZHVsZSgpOwogCXJlbW92ZV93YWl0X3F1ZXVlICgmY2NwLT5yZWFkd2FpdCwgJndhaXQpOwogCWlmIChzaWduYWxfcGVuZGluZyAoY3VycmVudCkpIHsKIAkJLyogd2FrZWQgdXAgYnkgYSBzaWduYWwgKi8KLQkJdXAgKCZjY3AtPnJlYWRtdXRleCk7CisJCW11dGV4X3VubG9jaygmY2NwLT5yZWFkbXV0ZXgpOwogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCX0KIAogCS8qIEFueXRoaW5nIGxlZnQgdG8gcmVhZD8gKi8KIAlpZiAoKGNjcC0+c2NvbnRleHQuaWQgPT0gQVVIX1VOQVNTSUdORUQpIHx8IGNjcC0+cmVtb3ZlZCkgewotCQl1cCAoJmNjcC0+cmVhZG11dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZjY3AtPnJlYWRtdXRleCk7CiAJCXJldHVybiAtRUlPOwogCX0KIAotCWlmIChkb3duX2ludGVycnVwdGlibGUgKCZjY3AtPm11dGV4KSkgewotCQl1cCAoJmNjcC0+cmVhZG11dGV4KTsKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjY3AtPm11dGV4KSkgeworCQltdXRleF91bmxvY2soJmNjcC0+cmVhZG11dGV4KTsKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAl9CiAKQEAgLTE3MDcsMjcgKzE3MDgsMjcgQEAKIAogd3JpdGVfYWdhaW46CiAJLyogZ2V0IHRoZSBtdXRleCAqLwotCWlmIChkb3duX2ludGVycnVwdGlibGUgKCZjY3AtPm11dGV4KSkKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjY3AtPm11dGV4KSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAogCS8qIENhbiB3ZSBleHBlY3QgdG8gd3JpdGUgc29tZXRoaW5nPyAqLwogCWlmIChjY3AtPnNjb250ZXh0LmlkID09IEFVSF9VTkFTU0lHTkVEKSB7Ci0JCXVwICgmY2NwLT5tdXRleCk7CisJCW11dGV4X3VubG9jaygmY2NwLT5tdXRleCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU87CiAJfQogCiAJY3AgPSBjY3AtPmF1ZXJkZXY7CiAJaWYgKCFjcCkgewotCQl1cCAoJmNjcC0+bXV0ZXgpOworCQltdXRleF91bmxvY2soJmNjcC0+bXV0ZXgpOwogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCX0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmY3AtPm11dGV4KSkgewotCQl1cCAoJmNjcC0+bXV0ZXgpOworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNwLT5tdXRleCkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZjY3AtPm11dGV4KTsKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAl9CiAJaWYgKCFjcC0+dXNiZGV2KSB7Ci0JCXVwICgmY3AtPm11dGV4KTsKLQkJdXAgKCZjY3AtPm11dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZjcC0+bXV0ZXgpOworCQltdXRleF91bmxvY2soJmNjcC0+bXV0ZXgpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJLyogUHJlcGFyZSBmb3Igc2xlZXAgKi8KQEAgLTE3NTAsOCArMTc1MSw4IEBACiAKIAkvKiBhcmUgdGhlcmUgYW55IGJ1ZmZlcnMgbGVmdD8gKi8KIAlpZiAoIWJwKSB7Ci0JCXVwICgmY3AtPm11dGV4KTsKLQkJdXAgKCZjY3AtPm11dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZjcC0+bXV0ZXgpOworCQltdXRleF91bmxvY2soJmNjcC0+bXV0ZXgpOwogCiAJCS8qIE5PTkJMT0NLOiBkb24ndCB3YWl0ICovCiAJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewpAQCAtMTc4Myw4ICsxNzg0LDggQEAKIAkJYXVlcmJ1Zl9yZWxlYXNlYnVmIChicCk7CiAJCS8qIFdha2UgdXAgYWxsIHByb2Nlc3NlcyB3YWl0aW5nIGZvciBhIGJ1ZmZlciAqLwogCQl3YWtlX3VwICgmY3AtPmJ1ZmZlcndhaXQpOwotCQl1cCAoJmNwLT5tdXRleCk7Ci0JCXVwICgmY2NwLT5tdXRleCk7CisJCW11dGV4X3VubG9jaygmY3AtPm11dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZjY3AtPm11dGV4KTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCkBAIC0xODAzLDE4ICsxODA0LDE4IEBACiAJCSAgICBhdWVyY2hhcl9jdHJsd3JpdGVfY29tcGxldGUsIGJwKTsKIAkvKiB1cCB3ZSBnbyAqLwogCXJldCA9IGF1ZXJjaGFpbl9zdWJtaXRfdXJiICgmY3AtPmNvbnRyb2xjaGFpbiwgYnAtPnVyYnApOwotCXVwICgmY3AtPm11dGV4KTsKKwltdXRleF91bmxvY2soJmNwLT5tdXRleCk7CiAJaWYgKHJldCkgewogCQlkYmcgKCJhdWVyY2hhcl93cml0ZTogbm9uemVybyByZXN1bHQgb2YgYXVlcmNoYWluX3N1Ym1pdF91cmIgJWQiLCByZXQpOwogCQlhdWVyYnVmX3JlbGVhc2VidWYgKGJwKTsKIAkJLyogV2FrZSB1cCBhbGwgcHJvY2Vzc2VzIHdhaXRpbmcgZm9yIGEgYnVmZmVyICovCiAJCXdha2VfdXAgKCZjcC0+YnVmZmVyd2FpdCk7Ci0JCXVwICgmY2NwLT5tdXRleCk7CisJCW11dGV4X3VubG9jaygmY2NwLT5tdXRleCk7CiAJCXJldHVybiAtRUlPOwogCX0KIAllbHNlIHsKIAkJZGJnICgiYXVlcmNoYXJfd3JpdGU6IFdyaXRlIE9LIik7Ci0JCXVwICgmY2NwLT5tdXRleCk7CisJCW11dGV4X3VubG9jaygmY2NwLT5tdXRleCk7CiAJCXJldHVybiBsZW47CiAJfQogfQpAQCAtMTgyNywyNCArMTgyOCwyNCBAQAogCXBhdWVyc3dhbGRfdCBjcDsKIAlkYmcoInJlbGVhc2UiKTsKIAotCWRvd24oJmNjcC0+bXV0ZXgpOworCW11dGV4X2xvY2soJmNjcC0+bXV0ZXgpOwogCWNwID0gY2NwLT5hdWVyZGV2OwogCWlmIChjcCkgewotCQlkb3duKCZjcC0+bXV0ZXgpOworCQltdXRleF9sb2NrKCZjcC0+bXV0ZXgpOwogCQkvKiByZW1vdmUgYW4gb3BlbiBzZXJ2aWNlICovCiAJCWF1ZXJzd2FsZF9yZW1vdmVzZXJ2aWNlIChjcCwgJmNjcC0+c2NvbnRleHQpOwogCQkvKiBkZXRhY2ggZnJvbSBkZXZpY2UgKi8KIAkJaWYgKCgtLWNwLT5vcGVuX2NvdW50IDw9IDApICYmIChjcC0+dXNiZGV2ID09IE5VTEwpKSB7CiAJCQkvKiB1c2IgZGV2aWNlIHdhaXRzIGZvciByZW1vdmFsICovCi0JCQl1cCAoJmNwLT5tdXRleCk7CisJCQltdXRleF91bmxvY2soJmNwLT5tdXRleCk7CiAJCQlhdWVyc3dhbGRfZGVsZXRlIChjcCk7CiAJCX0gZWxzZSB7Ci0JCQl1cCAoJmNwLT5tdXRleCk7CisJCQltdXRleF91bmxvY2soJmNwLT5tdXRleCk7CiAJCX0KIAkJY3AgPSBOVUxMOwogCQljY3AtPmF1ZXJkZXYgPSBOVUxMOwogCX0KLQl1cCAoJmNjcC0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmY2NwLT5tdXRleCk7CiAJYXVlcmNoYXJfZGVsZXRlIChjY3ApOwogCiAJcmV0dXJuIDA7CkBAIC0xOTE3LDcgKzE5MTgsNyBAQAogCX0KIAogCS8qIEluaXRpYWxpemUgZGV2aWNlIGRlc2NyaXB0b3IgKi8KLQlpbml0X01VVEVYICgmY3AtPm11dGV4KTsKKwltdXRleF9pbml0KCZjcC0+bXV0ZXgpOwogCWNwLT51c2JkZXYgPSB1c2JkZXY7CiAJYXVlcmNoYWluX2luaXQgKCZjcC0+Y29udHJvbGNoYWluKTsKICAgICAgICAgYXVlcmJ1Zl9pbml0ICgmY3AtPmJ1ZmN0bCk7CkBAIC0yMDQyLDcgKzIwNDMsNyBAQAogCS8qIGdpdmUgYmFjayBvdXIgVVNCIG1pbm9yIG51bWJlciAqLwogCXVzYl9kZXJlZ2lzdGVyX2RldihpbnRmLCAmYXVlcnN3YWxkX2NsYXNzKTsKIAotCWRvd24gKCZjcC0+bXV0ZXgpOworCW11dGV4X2xvY2soJmNwLT5tdXRleCk7CiAJaW5mbyAoImRldmljZSAvZGV2LyVzIG5vdyBkaXNjb25uZWN0aW5nIiwgY3AtPm5hbWUpOwogCiAJLyogU3RvcCB0aGUgaW50ZXJydXB0IGVuZHBvaW50ICovCkBAIC0yMDU3LDE2ICsyMDU4LDE4IEBACiAKIAlpZiAoY3AtPm9wZW5fY291bnQgPT0gMCkgewogCQkvKiBub2JvZHkgaXMgdXNpbmcgdGhpcyBkZXZpY2UuIFNvIHdlIGNhbiBjbGVhbiB1cCBub3cgKi8KLQkJdXAgKCZjcC0+bXV0ZXgpOy8qIHVwKCkgaXMgcG9zc2libGUgaGVyZSBiZWNhdXNlIG5vIG90aGVyIHRhc2sKLQkJCQkgICBjYW4gb3BlbiB0aGUgZGV2aWNlIChzZWUgYWJvdmUpLiBJIGRvbid0IHdhbnQKLQkJCQkgICB0byBrZnJlZSgpIGEgbG9ja2VkIG11dGV4LiAqLworCQltdXRleF91bmxvY2soJmNwLT5tdXRleCk7CisJCS8qIG11dGV4X3VubG9jaygpIGlzIHBvc3NpYmxlIGhlcmUgYmVjYXVzZSBubyBvdGhlciB0YXNrCisJCSAgIGNhbiBvcGVuIHRoZSBkZXZpY2UgKHNlZSBhYm92ZSkuIEkgZG9uJ3Qgd2FudAorCQkgICB0byBrZnJlZSgpIGEgbG9ja2VkIG11dGV4LiAqLworCiAJCWF1ZXJzd2FsZF9kZWxldGUgKGNwKTsKIAl9IGVsc2UgewogCQkvKiBkZXZpY2UgaXMgdXNlZC4gUmVtb3ZlIHRoZSBwb2ludGVyIHRvIHRoZQogCQkgICB1c2IgZGV2aWNlIChpdCdzIG5vdCB2YWxpZCBhbnkgbW9yZSkuIFRoZSBsYXN0CiAJCSAgIHJlbGVhc2UoKSB3aWxsIGRvIHRoZSBjbGVhbiB1cCAqLwogCQljcC0+dXNiZGV2ID0gTlVMTDsKLQkJdXAgKCZjcC0+bXV0ZXgpOworCQltdXRleF91bmxvY2soJmNwLT5tdXRleCk7CiAJCS8qIFRlcm1pbmF0ZSB3YWl0aW5nIHdyaXRlcnMgKi8KIAkJd2FrZV91cCAoJmNwLT5idWZmZXJ3YWl0KTsKIAkJLyogSW5mb3JtIGFsbCB3YWl0aW5nIHJlYWRlcnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvZW1pMjYuYyBiL2RyaXZlcnMvdXNiL21pc2MvZW1pMjYuYwppbmRleCA0YTA5Yjg3Li40YjlkYzgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2VtaTI2LmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9lbWkyNi5jCkBAIC03MCw4ICs3MCw4IEBACiBzdGF0aWMgaW50IGVtaTI2X3NldF9yZXNldCAoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciByZXNldF9iaXQpCiB7CiAJaW50IHJlc3BvbnNlOwotCWluZm8oIiVzIC0gJWQiLCBfX0ZVTkNUSU9OX18sIHJlc2V0X2JpdCk7Ci0JLyogcHJpbnRrKEtFUk5fREVCVUcgIiVzIC0gJWQiLCBfX0ZVTkNUSU9OX18sIHJlc2V0X2JpdCk7ICovCisJaW5mbygiJXMgLSAlZCIsIF9fZnVuY19fLCByZXNldF9iaXQpOworCS8qIHByaW50ayhLRVJOX0RFQlVHICIlcyAtICVkIiwgX19mdW5jX18sIHJlc2V0X2JpdCk7ICovCiAJcmVzcG9uc2UgPSBlbWkyNl93cml0ZW1lbW9yeSAoZGV2LCBDUFVDU19SRUcsICZyZXNldF9iaXQsIDEsIDB4YTApOwogCWlmIChyZXNwb25zZSA8IDApIHsKIAkJZXJyKCJlbWkyNjogc2V0X3Jlc2V0ICglZCkgZmFpbGVkIiwgcmVzZXRfYml0KTsKQEAgLTkxLDcgKzkxLDcgQEAKIAogCWJ1ZiA9IGttYWxsb2MoRldfTE9BRF9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikgewotCQllcnIoICIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX0ZVTkNUSU9OX18sIC1FTk9NRU0pOworCQllcnIoICIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgLUVOT01FTSk7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gd3JhcGVycjsKIAl9CkBAIC05OSw3ICs5OSw3IEBACiAJLyogQXNzZXJ0IHJlc2V0IChzdG9wIHRoZSBDUFUgaW4gdGhlIEVNSSkgKi8KIAllcnIgPSBlbWkyNl9zZXRfcmVzZXQoZGV2LDEpOwogCWlmIChlcnIgPCAwKSB7Ci0JCWVyciggIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJZXJyKCAiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkIiwgX19mdW5jX18sIGVycik7CiAJCWdvdG8gd3JhcGVycjsKIAl9CiAKQEAgLTEwNyw3ICsxMDcsNyBAQAogCWZvciAoaT0wOyBnX0xvYWRlcltpXS50eXBlID09IDA7IGkrKykgewogCQllcnIgPSBlbWkyNl93cml0ZW1lbW9yeShkZXYsIGdfTG9hZGVyW2ldLmFkZHJlc3MsIGdfTG9hZGVyW2ldLmRhdGEsIGdfTG9hZGVyW2ldLmxlbmd0aCwgQU5DSE9SX0xPQURfSU5URVJOQUwpOwogCQlpZiAoZXJyIDwgMCkgewotCQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fZnVuY19fLCBlcnIpOwogCQkJZ290byB3cmFwZXJyOwogCQl9CiAJfQpAQCAtMTE1LDcgKzExNSw3IEBACiAJLyogRGUtYXNzZXJ0IHJlc2V0IChsZXQgdGhlIENQVSBydW4pICovCiAJZXJyID0gZW1pMjZfc2V0X3Jlc2V0KGRldiwwKTsKIAlpZiAoZXJyIDwgMCkgewotCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgZXJyKTsKIAkJZ290byB3cmFwZXJyOwogCX0KIAltc2xlZXAoMjUwKTsJLyogbGV0IGRldmljZSBzZXR0bGUgKi8KQEAgLTEzNSw3ICsxMzUsNyBAQAogCQl9CiAJCWVyciA9IGVtaTI2X3dyaXRlbWVtb3J5KGRldiwgYWRkciwgYnVmLCBpLCBBTkNIT1JfTE9BRF9GUEdBKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgZXJyKTsKIAkJCWdvdG8gd3JhcGVycjsKIAkJfQogCX0gd2hpbGUgKGkgPiAwKTsKQEAgLTE0Myw3ICsxNDMsNyBAQAogCS8qIEFzc2VydCByZXNldCAoc3RvcCB0aGUgQ1BVIGluIHRoZSBFTUkpICovCiAJZXJyID0gZW1pMjZfc2V0X3Jlc2V0KGRldiwxKTsKIAlpZiAoZXJyIDwgMCkgewotCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgZXJyKTsKIAkJZ290byB3cmFwZXJyOwogCX0KIApAQCAtMTUxLDcgKzE1MSw3IEBACiAJZm9yIChpPTA7IGdfTG9hZGVyW2ldLnR5cGUgPT0gMDsgaSsrKSB7CiAJCWVyciA9IGVtaTI2X3dyaXRlbWVtb3J5KGRldiwgZ19Mb2FkZXJbaV0uYWRkcmVzcywgZ19Mb2FkZXJbaV0uZGF0YSwgZ19Mb2FkZXJbaV0ubGVuZ3RoLCBBTkNIT1JfTE9BRF9JTlRFUk5BTCk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkIiwgX19mdW5jX18sIGVycik7CiAJCQlnb3RvIHdyYXBlcnI7CiAJCX0KIAl9CkBAIC0xNjAsNyArMTYwLDcgQEAKIAkvKiBEZS1hc3NlcnQgcmVzZXQgKGxldCB0aGUgQ1BVIHJ1bikgKi8KIAllcnIgPSBlbWkyNl9zZXRfcmVzZXQoZGV2LDApOwogCWlmIChlcnIgPCAwKSB7Ci0JCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fZnVuY19fLCBlcnIpOwogCQlnb3RvIHdyYXBlcnI7CiAJfQogCkBAIC0xNjksNyArMTY5LDcgQEAKIAkJaWYgKCFJTlRFUk5BTF9SQU0oZ19GaXJtd2FyZVtpXS5hZGRyZXNzKSkgewogCQkJZXJyID0gZW1pMjZfd3JpdGVtZW1vcnkoZGV2LCBnX0Zpcm13YXJlW2ldLmFkZHJlc3MsIGdfRmlybXdhcmVbaV0uZGF0YSwgZ19GaXJtd2FyZVtpXS5sZW5ndGgsIEFOQ0hPUl9MT0FEX0VYVEVSTkFMKTsKIAkJCWlmIChlcnIgPCAwKSB7Ci0JCQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgZXJyKTsKIAkJCQlnb3RvIHdyYXBlcnI7CiAJCQl9CiAJCX0KQEAgLTE3OCw3ICsxNzgsNyBAQAogCS8qIEFzc2VydCByZXNldCAoc3RvcCB0aGUgQ1BVIGluIHRoZSBFTUkpICovCiAJZXJyID0gZW1pMjZfc2V0X3Jlc2V0KGRldiwxKTsKIAlpZiAoZXJyIDwgMCkgewotCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgZXJyKTsKIAkJZ290byB3cmFwZXJyOwogCX0KIApAQCAtMTg2LDcgKzE4Niw3IEBACiAJCWlmIChJTlRFUk5BTF9SQU0oZ19GaXJtd2FyZVtpXS5hZGRyZXNzKSkgewogCQkJZXJyID0gZW1pMjZfd3JpdGVtZW1vcnkoZGV2LCBnX0Zpcm13YXJlW2ldLmFkZHJlc3MsIGdfRmlybXdhcmVbaV0uZGF0YSwgZ19GaXJtd2FyZVtpXS5sZW5ndGgsIEFOQ0hPUl9MT0FEX0lOVEVSTkFMKTsKIAkJCWlmIChlcnIgPCAwKSB7Ci0JCQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgZXJyKTsKIAkJCQlnb3RvIHdyYXBlcnI7CiAJCQl9CiAJCX0KQEAgLTE5NSw3ICsxOTUsNyBAQAogCS8qIERlLWFzc2VydCByZXNldCAobGV0IHRoZSBDUFUgcnVuKSAqLwogCWVyciA9IGVtaTI2X3NldF9yZXNldChkZXYsMCk7CiAJaWYgKGVyciA8IDApIHsKLQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkIiwgX19mdW5jX18sIGVycik7CiAJCWdvdG8gd3JhcGVycjsKIAl9CiAJbXNsZWVwKDI1MCk7CS8qIGxldCBkZXZpY2Ugc2V0dGxlICovCkBAIC0yMjEsNyArMjIxLDcgQEAKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKIAotCWluZm8oIiVzIHN0YXJ0IiwgX19GVU5DVElPTl9fKTsgCisJaW5mbygiJXMgc3RhcnQiLCBfX2Z1bmNfXyk7CiAKIAllbWkyNl9sb2FkX2Zpcm13YXJlKGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvZW1pNjIuYyBiL2RyaXZlcnMvdXNiL21pc2MvZW1pNjIuYwppbmRleCBkMTM2MjQxLi4xYTJiNzlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2VtaTYyLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9lbWk2Mi5jCkBAIC03OCw3ICs3OCw3IEBACiBzdGF0aWMgaW50IGVtaTYyX3NldF9yZXNldCAoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciByZXNldF9iaXQpCiB7CiAJaW50IHJlc3BvbnNlOwotCWluZm8oIiVzIC0gJWQiLCBfX0ZVTkNUSU9OX18sIHJlc2V0X2JpdCk7CisJaW5mbygiJXMgLSAlZCIsIF9fZnVuY19fLCByZXNldF9iaXQpOwogCQogCXJlc3BvbnNlID0gZW1pNjJfd3JpdGVtZW1vcnkgKGRldiwgQ1BVQ1NfUkVHLCAmcmVzZXRfYml0LCAxLCAweGEwKTsKIAlpZiAocmVzcG9uc2UgPCAwKSB7CkBAIC0xMDAsNyArMTAwLDcgQEAKIAlkZXZfZGJnKCZkZXYtPmRldiwgImxvYWRfZmlybXdhcmVcbiIpOwogCWJ1ZiA9IGttYWxsb2MoRldfTE9BRF9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikgewotCQllcnIoICIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX0ZVTkNUSU9OX18sIC1FTk9NRU0pOworCQllcnIoICIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgLUVOT01FTSk7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gd3JhcGVycjsKIAl9CkBAIC0xMDgsNyArMTA4LDcgQEAKIAkvKiBBc3NlcnQgcmVzZXQgKHN0b3AgdGhlIENQVSBpbiB0aGUgRU1JKSAqLwogCWVyciA9IGVtaTYyX3NldF9yZXNldChkZXYsMSk7CiAJaWYgKGVyciA8IDApIHsKLQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkIiwgX19mdW5jX18sIGVycik7CiAJCWdvdG8gd3JhcGVycjsKIAl9CiAKQEAgLTExNiw3ICsxMTYsNyBAQAogCWZvciAoaT0wOyBnX2VtaTYyX2xvYWRlcltpXS50eXBlID09IDA7IGkrKykgewogCQllcnIgPSBlbWk2Ml93cml0ZW1lbW9yeShkZXYsIGdfZW1pNjJfbG9hZGVyW2ldLmFkZHJlc3MsIGdfZW1pNjJfbG9hZGVyW2ldLmRhdGEsIGdfZW1pNjJfbG9hZGVyW2ldLmxlbmd0aCwgQU5DSE9SX0xPQURfSU5URVJOQUwpOwogCQlpZiAoZXJyIDwgMCkgewotCQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fZnVuY19fLCBlcnIpOwogCQkJZ290byB3cmFwZXJyOwogCQl9CiAJfQpAQCAtMTI0LDcgKzEyNCw3IEBACiAJLyogRGUtYXNzZXJ0IHJlc2V0IChsZXQgdGhlIENQVSBydW4pICovCiAJZXJyID0gZW1pNjJfc2V0X3Jlc2V0KGRldiwwKTsKIAlpZiAoZXJyIDwgMCkgewotCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgZXJyKTsKIAkJZ290byB3cmFwZXJyOwogCX0KIAltc2xlZXAoMjUwKTsJLyogbGV0IGRldmljZSBzZXR0bGUgKi8KQEAgLTE0NCw3ICsxNDQsNyBAQAogCQl9CiAJCWVyciA9IGVtaTYyX3dyaXRlbWVtb3J5KGRldiwgYWRkciwgYnVmLCBpLCBBTkNIT1JfTE9BRF9GUEdBKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgZXJyKTsKIAkJCWdvdG8gd3JhcGVycjsKIAkJfQogCX0gd2hpbGUgKGkgPiAwKTsKQEAgLTE1Miw3ICsxNTIsNyBAQAogCS8qIEFzc2VydCByZXNldCAoc3RvcCB0aGUgQ1BVIGluIHRoZSBFTUkpICovCiAJZXJyID0gZW1pNjJfc2V0X3Jlc2V0KGRldiwxKTsKIAlpZiAoZXJyIDwgMCkgewotCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgZXJyKTsKIAkJZ290byB3cmFwZXJyOwogCX0KIApAQCAtMTYwLDcgKzE2MCw3IEBACiAJZm9yIChpPTA7IGdfZW1pNjJfbG9hZGVyW2ldLnR5cGUgPT0gMDsgaSsrKSB7CiAJCWVyciA9IGVtaTYyX3dyaXRlbWVtb3J5KGRldiwgZ19lbWk2Ml9sb2FkZXJbaV0uYWRkcmVzcywgZ19lbWk2Ml9sb2FkZXJbaV0uZGF0YSwgZ19lbWk2Ml9sb2FkZXJbaV0ubGVuZ3RoLCBBTkNIT1JfTE9BRF9JTlRFUk5BTCk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkIiwgX19mdW5jX18sIGVycik7CiAJCQlnb3RvIHdyYXBlcnI7CiAJCX0KIAl9CkBAIC0xNjgsNyArMTY4LDcgQEAKIAkvKiBEZS1hc3NlcnQgcmVzZXQgKGxldCB0aGUgQ1BVIHJ1bikgKi8KIAllcnIgPSBlbWk2Ml9zZXRfcmVzZXQoZGV2LDApOwogCWlmIChlcnIgPCAwKSB7Ci0JCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fZnVuY19fLCBlcnIpOwogCQlnb3RvIHdyYXBlcnI7CiAJfQogCW1zbGVlcCgyNTApOwkvKiBsZXQgZGV2aWNlIHNldHRsZSAqLwpAQCAtMTgxLDcgKzE4MSw3IEBACiAJCWlmICghSU5URVJOQUxfUkFNKGdfSGV4U3BkaWZGdzYyW2ldLmFkZHJlc3MpKSB7CiAJCQllcnIgPSBlbWk2Ml93cml0ZW1lbW9yeShkZXYsIGdfSGV4U3BkaWZGdzYyW2ldLmFkZHJlc3MsIGdfSGV4U3BkaWZGdzYyW2ldLmRhdGEsIGdfSGV4U3BkaWZGdzYyW2ldLmxlbmd0aCwgQU5DSE9SX0xPQURfRVhURVJOQUwpOwogCQkJaWYgKGVyciA8IDApIHsKLQkJCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fZnVuY19fLCBlcnIpOwogCQkJCWdvdG8gd3JhcGVycjsKIAkJCX0KIAkJfQpAQCAtMTkxLDcgKzE5MSw3IEBACiAJCWlmICghSU5URVJOQUxfUkFNKGdfSGV4TWlkaUZ3NjJbaV0uYWRkcmVzcykpIHsKIAkJCWVyciA9IGVtaTYyX3dyaXRlbWVtb3J5KGRldiwgZ19IZXhNaWRpRnc2MltpXS5hZGRyZXNzLCBnX0hleE1pZGlGdzYyW2ldLmRhdGEsIGdfSGV4TWlkaUZ3NjJbaV0ubGVuZ3RoLCBBTkNIT1JfTE9BRF9FWFRFUk5BTCk7CiAJCQlpZiAoZXJyIDwgMCkgewotCQkJCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWRcbiIsIF9fZnVuY19fLCBlcnIpOwogCQkJCWdvdG8gd3JhcGVycjsKIAkJCQlyZXR1cm4gZXJyOwogCQkJfQpAQCAtMjAxLDcgKzIwMSw3IEBACiAJLyogQXNzZXJ0IHJlc2V0IChzdG9wIHRoZSBDUFUgaW4gdGhlIEVNSSkgKi8KIAllcnIgPSBlbWk2Ml9zZXRfcmVzZXQoZGV2LDEpOwogCWlmIChlcnIgPCAwKSB7Ci0JCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fZnVuY19fLCBlcnIpOwogCQlnb3RvIHdyYXBlcnI7CiAJfQogCkBAIC0yMTEsNyArMjExLDcgQEAKIAkJaWYgKElOVEVSTkFMX1JBTShnX0hleFNwZGlmRnc2MltpXS5hZGRyZXNzKSkgewogCQkJZXJyID0gZW1pNjJfd3JpdGVtZW1vcnkoZGV2LCBnX0hleFNwZGlmRnc2MltpXS5hZGRyZXNzLCBnX0hleFNwZGlmRnc2MltpXS5kYXRhLCBnX0hleFNwZGlmRnc2MltpXS5sZW5ndGgsIEFOQ0hPUl9MT0FEX0lOVEVSTkFMKTsKIAkJCWlmIChlcnIgPCAwKSB7Ci0JCQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgZXJyKTsKIAkJCQlnb3RvIHdyYXBlcnI7CiAJCQl9CiAJCX0KQEAgLTIyMSw3ICsyMjEsNyBAQAogCQlpZiAoSU5URVJOQUxfUkFNKGdfSGV4TWlkaUZ3NjJbaV0uYWRkcmVzcykpIHsKIAkJCWVyciA9IGVtaTYyX3dyaXRlbWVtb3J5KGRldiwgZ19IZXhNaWRpRnc2MltpXS5hZGRyZXNzLCBnX0hleE1pZGlGdzYyW2ldLmRhdGEsIGdfSGV4TWlkaUZ3NjJbaV0ubGVuZ3RoLCBBTkNIT1JfTE9BRF9JTlRFUk5BTCk7CiAJCQlpZiAoZXJyIDwgMCkgewotCQkJCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWRcbiIsIF9fZnVuY19fLCBlcnIpOwogCQkJCWdvdG8gd3JhcGVycjsKIAkJCX0KIAkJfQpAQCAtMjMxLDcgKzIzMSw3IEBACiAJLyogRGUtYXNzZXJ0IHJlc2V0IChsZXQgdGhlIENQVSBydW4pICovCiAJZXJyID0gZW1pNjJfc2V0X3Jlc2V0KGRldiwwKTsKIAlpZiAoZXJyIDwgMCkgewotCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgZXJyKTsKIAkJZ290byB3cmFwZXJyOwogCX0KIAltc2xlZXAoMjUwKTsJLyogbGV0IGRldmljZSBzZXR0bGUgKi8KQEAgLTI2MCw3ICsyNjAsNyBAQAogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwogCWRldl9kYmcoJmludGYtPmRldiwgImVtaTYyX3Byb2JlXG4iKTsKIAotCWluZm8oIiVzIHN0YXJ0IiwgX19GVU5DVElPTl9fKTsgCisJaW5mbygiJXMgc3RhcnQiLCBfX2Z1bmNfXyk7CiAKIAllbWk2Ml9sb2FkX2Zpcm13YXJlKGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvZnRkaS1lbGFuLmMgYi9kcml2ZXJzL3VzYi9taXNjL2Z0ZGktZWxhbi5jCmluZGV4IDE0OGI3ZmUuLmVjODhiM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvZnRkaS1lbGFuLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9mdGRpLWVsYW4uYwpAQCAtNzQ2LDcgKzc0Niw3IEBACiAKIHN0YXRpYyB2b2lkIGZ0ZGlfZWxhbl93cml0ZV9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLSAgICAgICAgc3RydWN0IHVzYl9mdGRpICpmdGRpID0gKHN0cnVjdCB1c2JfZnRkaSAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkgPSB1cmItPmNvbnRleHQ7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCiAJaWYgKHN0YXR1cyAmJiAhKHN0YXR1cyA9PSAtRU5PRU5UIHx8IHN0YXR1cyA9PSAtRUNPTk5SRVNFVCB8fApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9pb3dhcnJpb3IuYyBiL2RyaXZlcnMvdXNiL21pc2MvaW93YXJyaW9yLmMKaW5kZXggODAxMDcwNS4uMWNiNTRhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9pb3dhcnJpb3IuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2lvd2Fycmlvci5jCkBAIC0xNTQsNyArMTU0LDcgQEAKICAqLwogc3RhdGljIHZvaWQgaW93YXJyaW9yX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgaW93YXJyaW9yICpkZXYgPSAoc3RydWN0IGlvd2FycmlvciAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgaW93YXJyaW9yICpkZXYgPSB1cmItPmNvbnRleHQ7CiAJaW50IGludHJfaWR4OwogCWludCByZWFkX2lkeDsKIAlpbnQgYXV4X2lkeDsKQEAgLTIxOCw3ICsyMTgsNyBAQAogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJldHZhbCkKIAkJZGV2X2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwgIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0ICVkXG4iLAotCQkJX19GVU5DVElPTl9fLCByZXR2YWwpOworCQkJX19mdW5jX18sIHJldHZhbCk7CiAKIH0KIApAQCAtMjMwLDcgKzIzMCw3IEBACiAJc3RydWN0IGlvd2FycmlvciAqZGV2OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRldiA9IChzdHJ1Y3QgaW93YXJyaW9yICopdXJiLT5jb250ZXh0OworCWRldiA9IHVyYi0+Y29udGV4dDsKIAkvKiBzeW5jL2FzeW5jIHVubGluayBmYXVsdHMgYXJlbid0IGVycm9ycyAqLwogCWlmIChzdGF0dXMgJiYKIAkgICAgIShzdGF0dXMgPT0gLUVOT0VOVCB8fApAQCAtNDUzLDcgKzQ1Myw3IEBACiAJZGVmYXVsdDoKIAkJLyogd2hhdCBkbyB3ZSBoYXZlIGhlcmUgPyBBbiB1bnN1cHBvcnRlZCBQcm9kdWN0LUlEID8gKi8KIAkJZGV2X2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwgIiVzIC0gbm90IHN1cHBvcnRlZCBmb3IgcHJvZHVjdD0weCV4XG4iLAotCQkJX19GVU5DVElPTl9fLCBkZXYtPnByb2R1Y3RfaWQpOworCQkJX19mdW5jX18sIGRldi0+cHJvZHVjdF9pZCk7CiAJCXJldHZhbCA9IC1FRkFVTFQ7CiAJCWdvdG8gZXhpdDsKIAkJYnJlYWs7CkBAIC02MDQsNyArNjA0LDcgQEAKIAogCWludGVyZmFjZSA9IHVzYl9maW5kX2ludGVyZmFjZSgmaW93YXJyaW9yX2RyaXZlciwgc3VibWlub3IpOwogCWlmICghaW50ZXJmYWNlKSB7Ci0JCWVycigiJXMgLSBlcnJvciwgY2FuJ3QgZmluZCBkZXZpY2UgZm9yIG1pbm9yICVkIiwgX19GVU5DVElPTl9fLAorCQllcnIoIiVzIC0gZXJyb3IsIGNhbid0IGZpbmQgZGV2aWNlIGZvciBtaW5vciAlZCIsIF9fZnVuY19fLAogCQkgICAgc3VibWlub3IpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2xkdXNiLmMgYi9kcml2ZXJzL3VzYi9taXNjL2xkdXNiLmMKaW5kZXggYzczMGQyMC4uMTE1ODBlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9sZHVzYi5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvbGR1c2IuYwpAQCAtMjMxLDcgKzIzMSw3IEBACiAJCQlnb3RvIGV4aXQ7CiAJCX0gZWxzZSB7CiAJCQlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogbm9uemVybyBzdGF0dXMgcmVjZWl2ZWQ6ICVkXG4iLAotCQkJCSBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQkJIF9fZnVuY19fLCBzdGF0dXMpOwogCQkJc3Bpbl9sb2NrKCZkZXYtPnJic2wpOwogCQkJZ290byByZXN1Ym1pdDsgLyogbWF5YmUgd2UgY2FuIHJlY292ZXIgKi8KIAkJfQpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJCQltZW1jcHkoYWN0dWFsX2J1ZmZlcisxLCBkZXYtPmludGVycnVwdF9pbl9idWZmZXIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCQlkZXYtPnJpbmdfaGVhZCA9IG5leHRfcmluZ19oZWFkOwogCQkJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IHJlY2VpdmVkICVkIGJ5dGVzXG4iLAotCQkJCSBfX0ZVTkNUSU9OX18sIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCQkJIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQl9IGVsc2UgewogCQkJZGV2X3dhcm4oJmRldi0+aW50Zi0+ZGV2LAogCQkJCSAiUmluZyBidWZmZXIgb3ZlcmZsb3csICVkIGJ5dGVzIGRyb3BwZWRcbiIsCkBAIC0yODYsNyArMjg2LDcgQEAKIAkJCXN0YXR1cyA9PSAtRVNIVVRET1dOKSkKIAkJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LAogCQkJICIlcyAtIG5vbnplcm8gd3JpdGUgaW50ZXJydXB0IHN0YXR1cyByZWNlaXZlZDogJWRcbiIsCi0JCQkgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJIF9fZnVuY19fLCBzdGF0dXMpOwogCiAJZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kgPSAwOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT53cml0ZV93YWl0KTsKQEAgLTMwOSw3ICszMDksNyBAQAogCiAJaWYgKCFpbnRlcmZhY2UpIHsKIAkJZXJyKCIlcyAtIGVycm9yLCBjYW4ndCBmaW5kIGRldmljZSBmb3IgbWlub3IgJWRcbiIsCi0JCSAgICAgX19GVU5DVElPTl9fLCBzdWJtaW5vcik7CisJCSAgICAgX19mdW5jX18sIHN1Ym1pbm9yKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC01NTYsNyArNTU2LDcgQEAKIAlieXRlc190b193cml0ZSA9IG1pbihjb3VudCwgd3JpdGVfYnVmZmVyX3NpemUqZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50X3NpemUpOwogCWlmIChieXRlc190b193cml0ZSA8IGNvdW50KQogCQlkZXZfd2FybigmZGV2LT5pbnRmLT5kZXYsICJXcml0ZSBidWZmZXIgb3ZlcmZsb3csICV6ZCBieXRlcyBkcm9wcGVkXG4iLGNvdW50LWJ5dGVzX3RvX3dyaXRlKTsKLQlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogY291bnQgPSAlemQsIGJ5dGVzX3RvX3dyaXRlID0gJXpkXG4iLCBfX0ZVTkNUSU9OX18sIGNvdW50LCBieXRlc190b193cml0ZSk7CisJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IGNvdW50ID0gJXpkLCBieXRlc190b193cml0ZSA9ICV6ZFxuIiwgX19mdW5jX18sIGNvdW50LCBieXRlc190b193cml0ZSk7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlciwgYnVmZmVyLCBieXRlc190b193cml0ZSkpIHsKIAkJcmV0dmFsID0gLUVGQVVMVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvbGVnb3VzYnRvd2VyLmMgYi9kcml2ZXJzL3VzYi9taXNjL2xlZ291c2J0b3dlci5jCmluZGV4IDY2NjQwNDMuLjkzNzAzMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvbGVnb3VzYnRvd2VyLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9sZWdvdXNidG93ZXIuYwpAQCAtMzEsNyArMzEsNyBAQAogICogICAtIGltcG9ydGVkIGludG8gbGVqb3MgcHJvamVjdAogICogICAtIGNoYW5nZWQgd2FrZV91cCB0byB3YWtlX3VwX2ludGVycnVwdGlibGUKICAqICAgLSBjaGFuZ2VkIHRvIHVzZSBsZWdvMCByYXRoZXIgdGhhbiB0b3dlcjAKLSAqICAgLSBjaGFuZ2VkIGRiZygpIHRvIHVzZSBfX2Z1bmNfXyByYXRoZXIgdGhhbiBkZXByZWNhdGVkIF9fRlVOQ1RJT05fXworICogICAtIGNoYW5nZWQgZGJnKCkgdG8gdXNlIF9fZnVuY19fIHJhdGhlciB0aGFuIGRlcHJlY2F0ZWQgX19mdW5jX18KICAqIDIwMDMtMDEtMTIgLSAwLjUzIGRhdmlkIChkYXZpZEBjc3NlLnV3YS5lZHUuYXUpCiAgKiAgIC0gY2hhbmdlZCByZWFkIGFuZCB3cml0ZSB0byB3cml0ZSBldmVyeXRoaW5nIG9yCiAgKiAgICAgdGltZW91dCAoZnJvbSBhIHBhdGNoIGJ5IENocmlzIFJpZXNlbiBhbmQgQnJldHQgVGhhZWxlciBkcml2ZXIpCkBAIC00OSw3ICs0OSw3IEBACiAgKiAgIC0gYWRkZWQgcG9sbAogICogICAtIGZvcmJpZCBzZWVraW5nCiAgKiAgIC0gYWRkZWQgbm9uYmxvY2tpbmcgSS9PCi0gKiAgIC0gY2hhbmdlZCBiYWNrIF9fZnVuY19fIHRvIF9fRlVOQ1RJT05fXworICogICAtIGNoYW5nZWQgYmFjayBfX2Z1bmNfXyB0byBfX2Z1bmNfXwogICogICAtIHJlYWQgYW5kIGxvZyB0b3dlciBmaXJtd2FyZSB2ZXJzaW9uCiAgKiAgIC0gcmVzZXQgdG93ZXIgb24gcHJvYmUsIGF2b2lkcyBmYWlsdXJlIG9mIGZpcnN0IHdyaXRlCiAgKiAyMDA0LTAzLTA5IC0gMC43IEp1ZXJnZW4gU3R1YmVyIDxzdGFyYmx1ZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CkBAIC0zMDksNyArMzA5LDcgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIHRvd2VyX2RlbGV0ZSAoc3RydWN0IGxlZ29fdXNiX3Rvd2VyICpkZXYpCiB7Ci0JZGJnKDIsICIlczogZW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCWRiZygyLCAiJXM6IGVudGVyIiwgX19mdW5jX18pOwogCiAJdG93ZXJfYWJvcnRfdHJhbnNmZXJzIChkZXYpOwogCkBAIC0zMjEsNyArMzIxLDcgQEAKIAlrZnJlZSAoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlcik7CiAJa2ZyZWUgKGRldik7CiAKLQlkYmcoMiwgIiVzOiBsZWF2ZSIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsICIlczogbGVhdmUiLCBfX2Z1bmNfXyk7CiB9CiAKIApAQCAtMzM3LDcgKzMzNyw3IEBACiAJc3RydWN0IHRvd2VyX3Jlc2V0X3JlcGx5IHJlc2V0X3JlcGx5OwogCWludCByZXN1bHQ7CiAKLQlkYmcoMiwgIiVzOiBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsICIlczogZW50ZXIiLCBfX2Z1bmNfXyk7CiAKIAlub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKIAlzdWJtaW5vciA9IGltaW5vcihpbm9kZSk7CkBAIC0zNDYsNyArMzQ2LDcgQEAKIAogCWlmICghaW50ZXJmYWNlKSB7CiAJCWVyciAoIiVzIC0gZXJyb3IsIGNhbid0IGZpbmQgZGV2aWNlIGZvciBtaW5vciAlZCIsCi0JCSAgICAgX19GVU5DVElPTl9fLCBzdWJtaW5vcik7CisJCSAgICAgX19mdW5jX18sIHN1Ym1pbm9yKTsKIAkJcmV0dmFsID0gLUVOT0RFVjsKIAkJZ290byBleGl0OwogCX0KQEAgLTQyNCw3ICs0MjQsNyBAQAogCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIAogZXhpdDoKLQlkYmcoMiwgIiVzOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkICIsIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwlkYmcoMiwgIiVzOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkICIsIF9fZnVuY19fLCByZXR2YWwpOwogCiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTQzNywxMiArNDM3LDEyIEBACiAJc3RydWN0IGxlZ29fdXNiX3Rvd2VyICpkZXY7CiAJaW50IHJldHZhbCA9IDA7CiAKLQlkYmcoMiwgIiVzOiBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsICIlczogZW50ZXIiLCBfX2Z1bmNfXyk7CiAKIAlkZXYgPSAoc3RydWN0IGxlZ29fdXNiX3Rvd2VyICopZmlsZS0+cHJpdmF0ZV9kYXRhOwogCiAJaWYgKGRldiA9PSBOVUxMKSB7Ci0JCWRiZygxLCAiJXM6IG9iamVjdCBpcyBOVUxMIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKDEsICIlczogb2JqZWN0IGlzIE5VTEwiLCBfX2Z1bmNfXyk7CiAJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gZXhpdF9ub2xvY2s7CiAJfQpAQCAtNDU0LDcgKzQ1NCw3IEBACiAJfQogCiAJaWYgKGRldi0+b3Blbl9jb3VudCAhPSAxKSB7Ci0JCWRiZygxLCAiJXM6IGRldmljZSBub3Qgb3BlbmVkIGV4YWN0bHkgb25jZSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygxLCAiJXM6IGRldmljZSBub3Qgb3BlbmVkIGV4YWN0bHkgb25jZSIsIF9fZnVuY19fKTsKIAkJcmV0dmFsID0gLUVOT0RFVjsKIAkJZ290byB1bmxvY2tfZXhpdDsKIAl9CkBAIC00ODAsNyArNDgwLDcgQEAKIGV4aXQ6CiAJbXV0ZXhfdW5sb2NrKCZvcGVuX2Rpc2NfbXV0ZXgpOwogZXhpdF9ub2xvY2s6Ci0JZGJnKDIsICIlczogbGVhdmUsIHJldHVybiB2YWx1ZSAlZCIsIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwlkYmcoMiwgIiVzOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkIiwgX19mdW5jX18sIHJldHZhbCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtNDkxLDEwICs0OTEsMTAgQEAKICAqLwogc3RhdGljIHZvaWQgdG93ZXJfYWJvcnRfdHJhbnNmZXJzIChzdHJ1Y3QgbGVnb191c2JfdG93ZXIgKmRldikKIHsKLQlkYmcoMiwgIiVzOiBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsICIlczogZW50ZXIiLCBfX2Z1bmNfXyk7CiAKIAlpZiAoZGV2ID09IE5VTEwpIHsKLQkJZGJnKDEsICIlczogZGV2IGlzIG51bGwiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoMSwgIiVzOiBkZXYgaXMgbnVsbCIsIF9fZnVuY19fKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtNTA5LDcgKzUwOSw3IEBACiAJCXVzYl9raWxsX3VyYihkZXYtPmludGVycnVwdF9vdXRfdXJiKTsKIAogZXhpdDoKLQlkYmcoMiwgIiVzOiBsZWF2ZSIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsICIlczogbGVhdmUiLCBfX2Z1bmNfXyk7CiB9CiAKIApAQCAtNTQyLDcgKzU0Miw3IEBACiAJc3RydWN0IGxlZ29fdXNiX3Rvd2VyICpkZXY7CiAJdW5zaWduZWQgaW50IG1hc2sgPSAwOwogCi0JZGJnKDIsICIlczogZW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCWRiZygyLCAiJXM6IGVudGVyIiwgX19mdW5jX18pOwogCiAJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCkBAIC01NTcsNyArNTU3LDcgQEAKIAkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKIAl9CiAKLQlkYmcoMiwgIiVzOiBsZWF2ZSwgbWFzayA9ICVkIiwgX19GVU5DVElPTl9fLCBtYXNrKTsKKwlkYmcoMiwgIiVzOiBsZWF2ZSwgbWFzayA9ICVkIiwgX19mdW5jX18sIG1hc2spOwogCiAJcmV0dXJuIG1hc2s7CiB9CkBAIC01ODMsNyArNTgzLDcgQEAKIAlpbnQgcmV0dmFsID0gMDsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSAwOwogCi0JZGJnKDIsICIlczogZW50ZXIsIGNvdW50ID0gJVpkIiwgX19GVU5DVElPTl9fLCBjb3VudCk7CisJZGJnKDIsICIlczogZW50ZXIsIGNvdW50ID0gJVpkIiwgX19mdW5jX18sIGNvdW50KTsKIAogCWRldiA9IChzdHJ1Y3QgbGVnb191c2JfdG93ZXIgKilmaWxlLT5wcml2YXRlX2RhdGE7CiAKQEAgLTYwMiw3ICs2MDIsNyBAQAogCiAJLyogdmVyaWZ5IHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBzb21lIGRhdGEgdG8gcmVhZCAqLwogCWlmIChjb3VudCA9PSAwKSB7Ci0JCWRiZygxLCAiJXM6IHJlYWQgcmVxdWVzdCBvZiAwIGJ5dGVzIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKDEsICIlczogcmVhZCByZXF1ZXN0IG9mIDAgYnl0ZXMiLCBfX2Z1bmNfXyk7CiAJCWdvdG8gdW5sb2NrX2V4aXQ7CiAJfQogCkBAIC02NTgsNyArNjU4LDcgQEAKIAltdXRleF91bmxvY2soJmRldi0+bG9jayk7CiAKIGV4aXQ6Ci0JZGJnKDIsICIlczogbGVhdmUsIHJldHVybiB2YWx1ZSAlZCIsIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwlkYmcoMiwgIiVzOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkIiwgX19mdW5jX18sIHJldHZhbCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtNjcyLDcgKzY3Miw3IEBACiAJc2l6ZV90IGJ5dGVzX3RvX3dyaXRlOwogCWludCByZXR2YWwgPSAwOwogCi0JZGJnKDIsICIlczogZW50ZXIsIGNvdW50ID0gJVpkIiwgX19GVU5DVElPTl9fLCBjb3VudCk7CisJZGJnKDIsICIlczogZW50ZXIsIGNvdW50ID0gJVpkIiwgX19mdW5jX18sIGNvdW50KTsKIAogCWRldiA9IChzdHJ1Y3QgbGVnb191c2JfdG93ZXIgKilmaWxlLT5wcml2YXRlX2RhdGE7CiAKQEAgLTY5MSw3ICs2OTEsNyBAQAogCiAJLyogdmVyaWZ5IHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBzb21lIGRhdGEgdG8gd3JpdGUgKi8KIAlpZiAoY291bnQgPT0gMCkgewotCQlkYmcoMSwgIiVzOiB3cml0ZSByZXF1ZXN0IG9mIDAgYnl0ZXMiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoMSwgIiVzOiB3cml0ZSByZXF1ZXN0IG9mIDAgYnl0ZXMiLCBfX2Z1bmNfXyk7CiAJCWdvdG8gdW5sb2NrX2V4aXQ7CiAJfQogCkBAIC03MDksNyArNzA5LDcgQEAKIAogCS8qIHdyaXRlIHRoZSBkYXRhIGludG8gaW50ZXJydXB0X291dF9idWZmZXIgZnJvbSB1c2Vyc3BhY2UgKi8KIAlieXRlc190b193cml0ZSA9IG1pbl90KGludCwgY291bnQsIHdyaXRlX2J1ZmZlcl9zaXplKTsKLQlkYmcoNCwgIiVzOiBjb3VudCA9ICVaZCwgYnl0ZXNfdG9fd3JpdGUgPSAlWmQiLCBfX0ZVTkNUSU9OX18sIGNvdW50LCBieXRlc190b193cml0ZSk7CisJZGJnKDQsICIlczogY291bnQgPSAlWmQsIGJ5dGVzX3RvX3dyaXRlID0gJVpkIiwgX19mdW5jX18sIGNvdW50LCBieXRlc190b193cml0ZSk7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIgKGRldi0+aW50ZXJydXB0X291dF9idWZmZXIsIGJ1ZmZlciwgYnl0ZXNfdG9fd3JpdGUpKSB7CiAJCXJldHZhbCA9IC1FRkFVTFQ7CkBAIC03NDIsNyArNzQyLDcgQEAKIAltdXRleF91bmxvY2soJmRldi0+bG9jayk7CiAKIGV4aXQ6Ci0JZGJnKDIsICIlczogbGVhdmUsIHJldHVybiB2YWx1ZSAlZCIsIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwlkYmcoMiwgIiVzOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkIiwgX19mdW5jX18sIHJldHZhbCk7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtNzUzLDEzICs3NTMsMTMgQEAKICAqLwogc3RhdGljIHZvaWQgdG93ZXJfaW50ZXJydXB0X2luX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IGxlZ29fdXNiX3Rvd2VyICpkZXYgPSAoc3RydWN0IGxlZ29fdXNiX3Rvd2VyICopdXJiLT5jb250ZXh0OworCXN0cnVjdCBsZWdvX3VzYl90b3dlciAqZGV2ID0gdXJiLT5jb250ZXh0OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAlpbnQgcmV0dmFsOwogCi0JZGJnKDQsICIlczogZW50ZXIsIHN0YXR1cyAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwlkYmcoNCwgIiVzOiBlbnRlciwgc3RhdHVzICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAKLQlsZWdvX3VzYl90b3dlcl9kZWJ1Z19kYXRhKDUsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCB1cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJbGVnb191c2JfdG93ZXJfZGVidWdfZGF0YSg1LCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCB1cmItPnRyYW5zZmVyX2J1ZmZlcik7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCWlmIChzdGF0dXMgPT0gLUVOT0VOVCB8fApAQCAtNzY3LDcgKzc2Nyw3IEBACiAJCSAgICBzdGF0dXMgPT0gLUVTSFVURE9XTikgewogCQkJZ290byBleGl0OwogCQl9IGVsc2UgewotCQkJZGJnKDEsICIlczogbm9uemVybyBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJZGJnKDEsICIlczogbm9uemVybyBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCQlnb3RvIHJlc3VibWl0OyAvKiBtYXliZSB3ZSBjYW4gcmVjb3ZlciAqLwogCQl9CiAJfQpAQCAtNzgwLDkgKzc4MCw5IEBACiAJCQkJdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJCWRldi0+cmVhZF9idWZmZXJfbGVuZ3RoICs9IHVyYi0+YWN0dWFsX2xlbmd0aDsKIAkJCWRldi0+cmVhZF9sYXN0X2Fycml2YWwgPSBqaWZmaWVzOwotCQkJZGJnKDMsICIlczogcmVjZWl2ZWQgJWQgYnl0ZXMiLCBfX0ZVTkNUSU9OX18sIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCQlkYmcoMywgIiVzOiByZWNlaXZlZCAlZCBieXRlcyIsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQl9IGVsc2UgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJlYWRfYnVmZmVyIG92ZXJmbG93LCAlZCBieXRlcyBkcm9wcGVkIiwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJlYWRfYnVmZmVyIG92ZXJmbG93LCAlZCBieXRlcyBkcm9wcGVkIiwgX19mdW5jX18sIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCX0KIAkJc3Bpbl91bmxvY2sgKCZkZXYtPnJlYWRfYnVmZmVyX2xvY2spOwogCX0KQEAgLTc5Miw3ICs3OTIsNyBAQAogCWlmIChkZXYtPmludGVycnVwdF9pbl9ydW5uaW5nICYmIGRldi0+dWRldikgewogCQlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYiAoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJldHZhbCkgewotCQkJZXJyKCIlczogdXNiX3N1Ym1pdF91cmIgZmFpbGVkICglZCkiLCBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCQllcnIoIiVzOiB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgKCVkKSIsIF9fZnVuY19fLCByZXR2YWwpOwogCQl9CiAJfQogCkBAIC04MDAsOCArODAwLDggQEAKIAlkZXYtPmludGVycnVwdF9pbl9kb25lID0gMTsKIAl3YWtlX3VwX2ludGVycnVwdGlibGUgKCZkZXYtPnJlYWRfd2FpdCk7CiAKLQlsZWdvX3VzYl90b3dlcl9kZWJ1Z19kYXRhKDUsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCB1cmItPnRyYW5zZmVyX2J1ZmZlcik7Ci0JZGJnKDQsICIlczogbGVhdmUsIHN0YXR1cyAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwlsZWdvX3VzYl90b3dlcl9kZWJ1Z19kYXRhKDUsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgsIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwlkYmcoNCwgIiVzOiBsZWF2ZSwgc3RhdHVzICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiB9CiAKIApAQCAtODEwLDI1ICs4MTAsMjUgQEAKICAqLwogc3RhdGljIHZvaWQgdG93ZXJfaW50ZXJydXB0X291dF9jYWxsYmFjayAoc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCBsZWdvX3VzYl90b3dlciAqZGV2ID0gKHN0cnVjdCBsZWdvX3VzYl90b3dlciAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgbGVnb191c2JfdG93ZXIgKmRldiA9IHVyYi0+Y29udGV4dDsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcoNCwgIiVzOiBlbnRlciwgc3RhdHVzICVkIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOwotCWxlZ29fdXNiX3Rvd2VyX2RlYnVnX2RhdGEoNSwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgsIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwlkYmcoNCwgIiVzOiBlbnRlciwgc3RhdHVzICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CisJbGVnb191c2JfdG93ZXJfZGVidWdfZGF0YSg1LCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCB1cmItPnRyYW5zZmVyX2J1ZmZlcik7CiAKIAkvKiBzeW5jL2FzeW5jIHVubGluayBmYXVsdHMgYXJlbid0IGVycm9ycyAqLwogCWlmIChzdGF0dXMgJiYgIShzdGF0dXMgPT0gLUVOT0VOVCB8fAogCQkJc3RhdHVzID09IC1FQ09OTlJFU0VUIHx8CiAJCQlzdGF0dXMgPT0gLUVTSFVURE9XTikpIHsKIAkJZGJnKDEsICIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCX0KIAogCWRldi0+aW50ZXJydXB0X291dF9idXN5ID0gMDsKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+d3JpdGVfd2FpdCk7CiAKLQlsZWdvX3VzYl90b3dlcl9kZWJ1Z19kYXRhKDUsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCB1cmItPnRyYW5zZmVyX2J1ZmZlcik7Ci0JZGJnKDQsICIlczogbGVhdmUsIHN0YXR1cyAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwlsZWdvX3VzYl90b3dlcl9kZWJ1Z19kYXRhKDUsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgsIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwlkYmcoNCwgIiVzOiBsZWF2ZSwgc3RhdHVzICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiB9CiAKIApAQCAtODQ5LDcgKzg0OSw3IEBACiAJaW50IHJldHZhbCA9IC1FTk9NRU07CiAJaW50IHJlc3VsdDsKIAotCWRiZygyLCAiJXM6IGVudGVyIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoMiwgIiVzOiBlbnRlciIsIF9fZnVuY19fKTsKIAogCWlmICh1ZGV2ID09IE5VTEwpIHsKIAkJaW5mbyAoInVkZXYgaXMgTlVMTC4iKTsKQEAgLTk3OCw3ICs5NzgsNyBAQAogCiAKIGV4aXQ6Ci0JZGJnKDIsICIlczogbGVhdmUsIHJldHVybiB2YWx1ZSAweCUuOGx4IChkZXYpIiwgX19GVU5DVElPTl9fLCAobG9uZykgZGV2KTsKKwlkYmcoMiwgIiVzOiBsZWF2ZSwgcmV0dXJuIHZhbHVlIDB4JS44bHggKGRldikiLCBfX2Z1bmNfXywgKGxvbmcpIGRldik7CiAKIAlyZXR1cm4gcmV0dmFsOwogCkBAIC05OTgsNyArOTk4LDcgQEAKIAlzdHJ1Y3QgbGVnb191c2JfdG93ZXIgKmRldjsKIAlpbnQgbWlub3I7CiAKLQlkYmcoMiwgIiVzOiBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsICIlczogZW50ZXIiLCBfX2Z1bmNfXyk7CiAKIAlkZXYgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRlcmZhY2UpOwogCW11dGV4X2xvY2soJm9wZW5fZGlzY19tdXRleCk7CkBAIC0xMDIzLDcgKzEwMjMsNyBAQAogCiAJaW5mbygiTEVHTyBVU0IgVG93ZXIgIyVkIG5vdyBkaXNjb25uZWN0ZWQiLCAobWlub3IgLSBMRUdPX1VTQl9UT1dFUl9NSU5PUl9CQVNFKSk7CiAKLQlkYmcoMiwgIiVzOiBsZWF2ZSIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsICIlczogbGVhdmUiLCBfX2Z1bmNfXyk7CiB9CiAKIApAQCAtMTAzNiw3ICsxMDM2LDcgQEAKIAlpbnQgcmVzdWx0OwogCWludCByZXR2YWwgPSAwOwogCi0JZGJnKDIsICIlczogZW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCWRiZygyLCAiJXM6IGVudGVyIiwgX19mdW5jX18pOwogCiAJLyogcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLwogCXJlc3VsdCA9IHVzYl9yZWdpc3RlcigmdG93ZXJfZHJpdmVyKTsKQEAgLTEwNDksNyArMTA0OSw3IEBACiAJaW5mbyhEUklWRVJfREVTQyAiICIgRFJJVkVSX1ZFUlNJT04pOwogCiBleGl0OgotCWRiZygyLCAiJXM6IGxlYXZlLCByZXR1cm4gdmFsdWUgJWQiLCBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJZGJnKDIsICIlczogbGVhdmUsIHJldHVybiB2YWx1ZSAlZCIsIF9fZnVuY19fLCByZXR2YWwpOwogCiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTEwNjAsMTIgKzEwNjAsMTIgQEAKICAqLwogc3RhdGljIHZvaWQgX19leGl0IGxlZ29fdXNiX3Rvd2VyX2V4aXQodm9pZCkKIHsKLQlkYmcoMiwgIiVzOiBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsICIlczogZW50ZXIiLCBfX2Z1bmNfXyk7CiAKIAkvKiBkZXJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIFVTQiBzdWJzeXN0ZW0gKi8KIAl1c2JfZGVyZWdpc3RlciAoJnRvd2VyX2RyaXZlcik7CiAKLQlkYmcoMiwgIiVzOiBsZWF2ZSIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsICIlczogbGVhdmUiLCBfX2Z1bmNfXyk7CiB9CiAKIG1vZHVsZV9pbml0IChsZWdvX3VzYl90b3dlcl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvcGhpZGdldGtpdC5jIGIvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0a2l0LmMKaW5kZXggYWE5YmNjZS4uMjQyMzBjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0a2l0LmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0a2l0LmMKQEAgLTExMyw3ICsxMTMsNyBAQAogCiAJYnVmZmVyID0ga3phbGxvYyg0LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZmZlcikgewotCQlkZXZfZXJyKCZraXQtPnVkZXYtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2Vycigma2l0LT51ZGV2LT5kZXYsICIlcyAtIG91dCBvZiBtZW1vcnlcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWJ1ZmZlclswXSA9ICh1OClraXQtPm91dHB1dHM7CkBAIC0xNDYsNyArMTQ2LDcgQEAKIAlidWZmZXIgPSBrbWFsbG9jKDgsIEdGUF9LRVJORUwpOwogCWZvcm1fYnVmZmVyID0ga21hbGxvYygzMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCghYnVmZmVyKSB8fCAoIWZvcm1fYnVmZmVyKSkgewotCQlkZXZfZXJyKCZraXQtPnVkZXYtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2Vycigma2l0LT51ZGV2LT5kZXYsICIlcyAtIG91dCBvZiBtZW1vcnlcbiIsIF9fZnVuY19fKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMjE2LDcgKzIxNiw3IEBACiAJCiAJYnVmZmVyID0ga3phbGxvYyg4LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZmZlcikgewotCQlkZXZfZXJyKCZraXQtPnVkZXYtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2Vycigma2l0LT51ZGV2LT5kZXYsICIlcyAtIG91dCBvZiBtZW1vcnlcbiIsIF9fZnVuY19fKTsKIAkJZ290byBleGl0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0bW90b3Jjb250cm9sLmMgYi9kcml2ZXJzL3VzYi9taXNjL3BoaWRnZXRtb3RvcmNvbnRyb2wuYwppbmRleCAyYWQwOWIxLi5mMDExM2MxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL3BoaWRnZXRtb3RvcmNvbnRyb2wuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL3BoaWRnZXRtb3RvcmNvbnRyb2wuYwpAQCAtNjEsNyArNjEsNyBAQAogCiAJYnVmZmVyID0ga3phbGxvYyg4LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZmZlcikgewotCQlkZXZfZXJyKCZtYy0+aW50Zi0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX0ZVTkNUSU9OX18pOworCQlkZXZfZXJyKCZtYy0+aW50Zi0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0c2Vydm8uYyBiL2RyaXZlcnMvdXNiL21pc2MvcGhpZGdldHNlcnZvLmMKaW5kZXggMGQ5ZGUyZi4uN2Q1OTBjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0c2Vydm8uYworKysgYi9kcml2ZXJzL3VzYi9taXNjL3BoaWRnZXRzZXJ2by5jCkBAIC04OSw3ICs4OSw3IEBACiAJYnVmZmVyID0ga21hbGxvYyg2LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZmZlcikgewogCQlkZXZfZXJyKCZzZXJ2by0+dWRldi0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLAotCQkJX19GVU5DVElPTl9fKTsKKwkJCV9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xNjIsNyArMTYyLDcgQEAKIAlidWZmZXIgPSBrbWFsbG9jKDIsIEdGUF9LRVJORUwpOwogCWlmICghYnVmZmVyKSB7CiAJCWRldl9lcnIoJnNlcnZvLT51ZGV2LT5kZXYsICIlcyAtIG91dCBvZiBtZW1vcnlcbiIsCi0JCQlfX0ZVTkNUSU9OX18pOworCQkJX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTI1OSw3ICsyNTksNyBAQAogCiAJZGV2ID0ga3phbGxvYyhzaXplb2YgKHN0cnVjdCBwaGlkZ2V0X3NlcnZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGRldiA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX0ZVTkNUSU9OX18pOworCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvdXNibGNkLmMgYi9kcml2ZXJzL3VzYi9taXNjL3VzYmxjZC5jCmluZGV4IDIwNzc3ZDAuLjdmNzAyMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvdXNibGNkLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy91c2JsY2QuYwpAQCAtNzgsNyArNzgsNyBAQAogCWludGVyZmFjZSA9IHVzYl9maW5kX2ludGVyZmFjZSgmbGNkX2RyaXZlciwgc3VibWlub3IpOwogCWlmICghaW50ZXJmYWNlKSB7CiAJCWVyciAoIlVTQkxDRDogJXMgLSBlcnJvciwgY2FuJ3QgZmluZCBkZXZpY2UgZm9yIG1pbm9yICVkIiwKLQkJICAgICBfX0ZVTkNUSU9OX18sIHN1Ym1pbm9yKTsKKwkJICAgICBfX2Z1bmNfXywgc3VibWlub3IpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTE4NSw3ICsxODUsNyBAQAogCXN0cnVjdCB1c2JfbGNkICpkZXY7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGV2ID0gKHN0cnVjdCB1c2JfbGNkICopdXJiLT5jb250ZXh0OworCWRldiA9IHVyYi0+Y29udGV4dDsKIAogCS8qIHN5bmMvYXN5bmMgdW5saW5rIGZhdWx0cyBhcmVuJ3QgZXJyb3JzICovCiAJaWYgKHN0YXR1cyAmJgpAQCAtMTkzLDcgKzE5Myw3IEBACiAJICAgICAgc3RhdHVzID09IC1FQ09OTlJFU0VUIHx8CiAgICAgICAgICAgICAgIHN0YXR1cyA9PSAtRVNIVVRET1dOKSkgewogCQlkYmcoIlVTQkxDRDogJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAl9CiAKIAkvKiBmcmVlIHVwIG91ciBhbGxvY2F0ZWQgYnVmZmVyICovCkBAIC0yNDgsNyArMjQ4LDcgQEAKIAkvKiBzZW5kIHRoZSBkYXRhIG91dCB0aGUgYnVsayBwb3J0ICovCiAJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfS0VSTkVMKTsKIAlpZiAocmV0dmFsKSB7Ci0JCWVycigiVVNCTENEOiAlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCWVycigiVVNCTENEOiAlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWQiLCBfX2Z1bmNfXywgcmV0dmFsKTsKIAkJZ290byBlcnJvcl91bmFuY2hvcjsKIAl9CiAJCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL3VzYnRlc3QuYyBiL2RyaXZlcnMvdXNiL21pc2MvdXNidGVzdC5jCmluZGV4IGI2YjViMmEuLmE1MTk4MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvdXNidGVzdC5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvdXNidGVzdC5jCkBAIC0yMDEsNyArMjAxLDcgQEAKIAogc3RhdGljIHZvaWQgc2ltcGxlX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0JY29tcGxldGUgKChzdHJ1Y3QgY29tcGxldGlvbiAqKSB1cmItPmNvbnRleHQpOworCWNvbXBsZXRlKHVyYi0+Y29udGV4dCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdXJiICpzaW1wbGVfYWxsb2NfdXJiICgKQEAgLTEwNDYsNyArMTA0Niw3IEBACiAJCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChzdGF0dXMpIHsKIAkJdXJiLT5zdGF0dXMgPSBzdGF0dXM7Ci0JCWNvbXBsZXRlICgoc3RydWN0IGNvbXBsZXRpb24gKikgdXJiLT5jb250ZXh0KTsKKwkJY29tcGxldGUodXJiLT5jb250ZXh0KTsKIAl9CiB9CiAKQEAgLTExMzYsNyArMTEzNiw3IEBACiAJCWRiZyAoImVwICUwMnggYm9ndXMgc3RhdHVzOiAlMDR4ICE9IDAiLCBlcCwgc3RhdHVzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXJldHZhbCA9IHNpbXBsZV9pbyAodXJiLCAxLCAwLCAwLCBfX0ZVTkNUSU9OX18pOworCXJldHZhbCA9IHNpbXBsZV9pbyAodXJiLCAxLCAwLCAwLCBfX2Z1bmNfXyk7CiAJaWYgKHJldHZhbCAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4gMDsKQEAgLTExNTgsNyArMTE1OCw3IEBACiAJCWRiZyAoImVwICUwMnggYm9ndXMgc3RhdHVzOiAlMDR4ICE9IDEiLCBlcCwgc3RhdHVzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXJldHZhbCA9IHNpbXBsZV9pbyAodXJiLCAxLCAwLCAtRVBJUEUsIF9fRlVOQ1RJT05fXyk7CisJcmV0dmFsID0gc2ltcGxlX2lvICh1cmIsIDEsIDAsIC1FUElQRSwgX19mdW5jX18pOwogCWlmIChyZXR2YWwgIT0gLUVQSVBFKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR2YWwgPSBzaW1wbGVfaW8gKHVyYiwgMSwgMCwgLUVQSVBFLCAidmVyaWZ5X3N0aWxsX2hhbHRlZCIpOwpAQCAtMTQwNCw3ICsxNDA0LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJbWF4cCA9IDB4N2ZmICYgbGUxNl90b19jcHUoZGVzYy0+d01heFBhY2tldFNpemUpOwogCW1heHAgKj0gMSArICgweDMgJiAobGUxNl90b19jcHUoZGVzYy0+d01heFBhY2tldFNpemUpID4+IDExKSk7Ci0JcGFja2V0cyA9IChieXRlcyArIG1heHAgLSAxKSAvIG1heHA7CisJcGFja2V0cyA9IERJVl9ST1VORF9VUChieXRlcywgbWF4cCk7CiAKIAl1cmIgPSB1c2JfYWxsb2NfdXJiIChwYWNrZXRzLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVyYikKQEAgLTE1NjQsNyArMTU2NCw4IEBACiAJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZGV2LT5sb2NrKSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAotCWlmIChpbnRmLT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgIT0gUE1fRVZFTlRfT04pIHsKKwkvKiBGSVhNRTogV2hhdCBpZiBhIHN5c3RlbSBzbGVlcCBzdGFydHMgd2hpbGUgYSB0ZXN0IGlzIHJ1bm5pbmc/ICovCisJaWYgKCFpbnRmLT5pc19hY3RpdmUpIHsKIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogCQlyZXR1cm4gLUVIT1NUVU5SRUFDSDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tb24vTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9tb24vTWFrZWZpbGUKaW5kZXggOTBjNTk1My4uMGY3NmVkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbW9uL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL21vbi9NYWtlZmlsZQpAQCAtMSw1ICsxLDUgQEAKICMKLSMgTWFrZWZpbGUgZm9yIFVTQiBDb3JlIGZpbGVzIGFuZCBmaWxlc3lzdGVtCisjIE1ha2VmaWxlIGZvciBVU0IgbW9uaXRvcgogIwogCiB1c2Jtb24tb2Jqcwk6PSBtb25fbWFpbi5vIG1vbl9zdGF0Lm8gbW9uX3RleHQubyBtb25fYmluLm8gbW9uX2RtYS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tb24vbW9uX2Jpbi5jIGIvZHJpdmVycy91c2IvbW9uL21vbl9iaW4uYwppbmRleCAxNzc0YmE1Li40OTE0NTUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tb24vbW9uX2Jpbi5jCisrKyBiL2RyaXZlcnMvdXNiL21vbi9tb25fYmluLmMKQEAgLTEwMjYsOCArMTAyNiw2IEBACiAJcmV0dXJuIG1hc2s7CiB9CiAKLSNpZiAwCi0KIC8qCiAgKiBvcGVuIGFuZCBjbG9zZToganVzdCBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IHRpbWVzIHRoZSBkZXZpY2UgaXMKICAqIG1hcHBlZCwgdG8gdXNlIHRoZSBwcm9wZXIgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb24uCkBAIC0xMDYzLDEzICsxMDYxLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBtb25fYmluX3ZtX29wcyA9IHsKK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgbW9uX2Jpbl92bV9vcHMgPSB7CiAJLm9wZW4gPSAgICAgbW9uX2Jpbl92bWFfb3BlbiwKIAkuY2xvc2UgPSAgICBtb25fYmluX3ZtYV9jbG9zZSwKIAkuZmF1bHQgPSAgICBtb25fYmluX3ZtYV9mYXVsdCwKIH07CiAKLWludCBtb25fYmluX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQorc3RhdGljIGludCBtb25fYmluX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCS8qIGRvbid0IGRvIGFueXRoaW5nIGhlcmU6ICJmYXVsdCIgd2lsbCBzZXQgdXAgcGFnZSB0YWJsZSBlbnRyaWVzICovCiAJdm1hLT52bV9vcHMgPSAmbW9uX2Jpbl92bV9vcHM7CkBAIC0xMDc5LDggKzEwNzcsNiBAQAogCXJldHVybiAwOwogfQogCi0jZW5kaWYgIC8qICAwICAqLwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtb25fZm9wc19iaW5hcnkgPSB7CiAJLm93bmVyID0JVEhJU19NT0RVTEUsCiAJLm9wZW4gPQkJbW9uX2Jpbl9vcGVuLApAQCAtMTA5MCw2ICsxMDg2LDcgQEAKIAkucG9sbCA9CQltb25fYmluX3BvbGwsCiAJLmlvY3RsID0JbW9uX2Jpbl9pb2N0bCwKIAkucmVsZWFzZSA9CW1vbl9iaW5fcmVsZWFzZSwKKwkubW1hcCA9CQltb25fYmluX21tYXAsCiB9OwogCiBzdGF0aWMgaW50IG1vbl9iaW5fd2FpdF9ldmVudChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IG1vbl9yZWFkZXJfYmluICpycCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21vbi9tb25fbWFpbi5jIGIvZHJpdmVycy91c2IvbW9uL21vbl9tYWluLmMKaW5kZXggYjM3MWZmZC4uNDQyZDgwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbW9uL21vbl9tYWluLmMKKysrIGIvZHJpdmVycy91c2IvbW9uL21vbl9tYWluLmMKQEAgLTEyOSw4ICsxMjksNyBAQAogCiAvKgogICovCi1zdGF0aWMgdm9pZCBtb25fYnVzX2NvbXBsZXRlKHN0cnVjdCBtb25fYnVzICptYnVzLCBzdHJ1Y3QgdXJiICp1cmIsCi0JCWludCBzdGF0dXMpCitzdGF0aWMgdm9pZCBtb25fYnVzX2NvbXBsZXRlKHN0cnVjdCBtb25fYnVzICptYnVzLCBzdHJ1Y3QgdXJiICp1cmIsIGludCBzdGF0dXMpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tb24vbW9uX3N0YXQuYyBiL2RyaXZlcnMvdXNiL21vbi9tb25fc3RhdC5jCmluZGV4IGY2ZDE0OTEuLmM3YTU5NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21vbi9tb25fc3RhdC5jCisrKyBiL2RyaXZlcnMvdXNiL21vbi9tb25fc3RhdC5jCkBAIC01OSw2ICs1OSw5IEBACiAKIHN0YXRpYyBpbnQgbW9uX3N0YXRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKKwlzdHJ1Y3Qgc25hcCAqc3AgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlrZnJlZShzcCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9LY29uZmlnIGIvZHJpdmVycy91c2Ivc2VyaWFsL0tjb25maWcKaW5kZXggYzFlNjVkZi4uMmNmZmVjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL0tjb25maWcKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL0tjb25maWcKQEAgLTIwLDggKzIwLDggQEAKIGlmIFVTQl9TRVJJQUwKIAogY29uZmlnIFVTQl9TRVJJQUxfQ09OU09MRQotCWJvb2wgIlVTQiBTZXJpYWwgQ29uc29sZSBkZXZpY2Ugc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUw9eSAmJiBFWFBFUklNRU5UQUwKKwlib29sICJVU0IgU2VyaWFsIENvbnNvbGUgZGV2aWNlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0JfU0VSSUFMPXkKIAktLS1oZWxwLS0tCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSwgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byB1c2UgYSBVU0IgdG8gc2VyaWFsCiAJICBjb252ZXJ0ZXIgcG9ydCBhcyB0aGUgc3lzdGVtIGNvbnNvbGUgKHRoZSBzeXN0ZW0gY29uc29sZSBpcyB0aGUKQEAgLTQ0LDEzICs0NCwxMSBAQAogCiBjb25maWcgVVNCX0VaVVNCCiAJYm9vbCAiRnVuY3Rpb25zIGZvciBsb2FkaW5nIGZpcm13YXJlIG9uIEVaVVNCIGNoaXBzIgotCWRlcGVuZHMgb24gVVNCX1NFUklBTAogCWhlbHAKIAkgICAgU2F5IFkgaGVyZSBpZiB5b3UgbmVlZCBFWlVTQiBkZXZpY2Ugc3VwcG9ydC4KIAogY29uZmlnIFVTQl9TRVJJQUxfR0VORVJJQwogCWJvb2wgIlVTQiBHZW5lcmljIFNlcmlhbCBEcml2ZXIiCi0JZGVwZW5kcyBvbiBVU0JfU0VSSUFMCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIGdlbmVyaWMgVVNCIHNlcmlhbCBkcml2ZXIuICBQbGVhc2UKIAkgIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi91c2IvdXNiLXNlcmlhbC50eHQ+IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uCkBAIC01OSw4ICs1Nyw3IEBACiAJICBwcm9wZXJseS4KIAogY29uZmlnIFVTQl9TRVJJQUxfQUlSQ0FCTEUKLQl0cmlzdGF0ZSAiVVNCIEFJUmNhYmxlIEJsdWV0b290aCBEb25nbGUgRHJpdmVyIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCX1NFUklBTCAmJiBFWFBFUklNRU5UQUwKKwl0cmlzdGF0ZSAiVVNCIEFJUmNhYmxlIEJsdWV0b290aCBEb25nbGUgRHJpdmVyIgogCWhlbHAKIAkgICAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgVVNCIEFJUmNhYmxlIEJsdWV0b290aCBEb25nbGUuCiAKQEAgLTY5LDcgKzY2LDYgQEAKIAogY29uZmlnIFVTQl9TRVJJQUxfQUlSUFJJTUUKIAl0cmlzdGF0ZSAiVVNCIEFpclByaW1lIENETUEgV2lyZWxlc3MgRHJpdmVyIgotCWRlcGVuZHMgb24gVVNCX1NFUklBTAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgQWlyUHJpbWUgQ0RNQSBXaXJlbGVzcyBQQyBjYXJkLgogCkBAIC03Nyw4ICs3Myw3IEBACiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWlycHJpbWUuCiAKIGNvbmZpZyBVU0JfU0VSSUFMX0FSSzMxMTYKLQl0cmlzdGF0ZSAiVVNCIEFSSyBNaWNybyAzMTE2IFVTQiBTZXJpYWwgRHJpdmVyIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCX1NFUklBTCAmJiBFWFBFUklNRU5UQUwKKwl0cmlzdGF0ZSAiVVNCIEFSSyBNaWNybyAzMTE2IFVTQiBTZXJpYWwgRHJpdmVyIgogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgQVJLIE1pY3JvIDMxMTYgVVNCIHRvIFNlcmlhbAogCSAgZGV2aWNlLgpAQCAtODgsNyArODMsNiBAQAogCiBjb25maWcgVVNCX1NFUklBTF9CRUxLSU4KIAl0cmlzdGF0ZSAiVVNCIEJlbGtpbiBhbmQgUGVyYWNvbSBTaW5nbGUgUG9ydCBTZXJpYWwgRHJpdmVyIgotCWRlcGVuZHMgb24gVVNCX1NFUklBTAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgQmVsa2luIFVTQiBTZXJpYWwgc2luZ2xlIHBvcnQKIAkgIGFkYXB0b3IgKEY1VTEwMyBpcyBvbmUgb2YgdGhlIG1vZGVsIG51bWJlcnMpIG9yIHRoZSBQZXJhY29tIHNpbmdsZQpAQCAtOTksNyArOTMsNiBAQAogCiBjb25maWcgVVNCX1NFUklBTF9DSDM0MQogCXRyaXN0YXRlICJVU0IgV2luY2hpcGhlYWQgQ0gzNDEgU2luZ2xlIFBvcnQgU2VyaWFsIERyaXZlciIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhIFdpbmNoaXBoZWFkIENIMzQxIHNpbmdsZSBwb3J0CiAJICBVU0IgdG8gc2VyaWFsIGFkYXB0ZXIuCkBAIC0xMDksNyArMTAyLDYgQEAKIAogY29uZmlnIFVTQl9TRVJJQUxfV0hJVEVIRUFUCiAJdHJpc3RhdGUgIlVTQiBDb25uZWN0VGVjaCBXaGl0ZUhFQVQgU2VyaWFsIERyaXZlciIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKIAlzZWxlY3QgVVNCX0VaVVNCCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYSBDb25uZWN0VGVjaCBXaGl0ZUhFQVQgNCBwb3J0CkBAIC0xMjAsNyArMTEyLDYgQEAKIAogY29uZmlnIFVTQl9TRVJJQUxfRElHSV9BQ0NFTEVQT1JUCiAJdHJpc3RhdGUgIlVTQiBEaWdpIEludGVybmF0aW9uYWwgQWNjZWxlUG9ydCBVU0IgU2VyaWFsIERyaXZlciIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBEaWdpIEFjY2VsZVBvcnQgVVNCIDIgb3IgNCBkZXZpY2VzLAogCSAgMiBwb3J0IChwbHVzIHBhcmFsbGVsIHBvcnQpIGFuZCA0IHBvcnQgVVNCIHNlcmlhbCBjb252ZXJ0ZXJzLiAgVGhlCkBAIC0xMzUsNyArMTI2LDYgQEAKIAogY29uZmlnIFVTQl9TRVJJQUxfQ1AyMTAxCiAJdHJpc3RhdGUgIlVTQiBDUDIxMDEgVUFSVCBCcmlkZ2UgQ29udHJvbGxlciIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwgJiYgRVhQRVJJTUVOVEFMCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYSBDUDIxMDEvQ1AyMTAyIGJhc2VkIFVTQiB0byBSUzIzMgogCSAgY29udmVydGVyLgpAQCAtMTQ1LDcgKzEzNSw2IEBACiAKIGNvbmZpZyBVU0JfU0VSSUFMX0NZUFJFU1NfTTgKIAl0cmlzdGF0ZSAiVVNCIEN5cHJlc3MgTTggVVNCIFNlcmlhbCBEcml2ZXIiCi0JZGVwZW5kcyBvbiBVU0JfU0VSSUFMICYmIEVYUEVSSU1FTlRBTAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgZGV2aWNlIHRoYXQgY29udGFpbnMgdGhlIEN5cHJlc3MKIAkgIFVTQiB0byBTZXJpYWwgbWljcm9jb250cm9sbGVyLCBzdWNoIGFzIHRoZSBEZUxvcm1lIEVhcnRobWF0ZSBHUFMuCkBAIC0xNjAsNyArMTQ5LDYgQEAKIAogY29uZmlnIFVTQl9TRVJJQUxfRU1QRUcKIAl0cmlzdGF0ZSAiVVNCIEVtcGVnIGVtcGVnLWNhciBNYXJrIEkvSUkgRHJpdmVyIgotCWRlcGVuZHMgb24gVVNCX1NFUklBTAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29ubmVjdCB0byB5b3VyIEVtcGVnIGVtcGVnLWNhciBNYXJrIEkvSUkKIAkgIG1wMyBwbGF5ZXIgdmlhIFVTQi4gIFRoZSBkcml2ZXIgdXNlcyBhIHNpbmdsZSB0dHlVU0J7MCwxLDIsLi4ufQpAQCAtMTcxLDggKzE1OSw3IEBACiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZW1wZWcuCiAKIGNvbmZpZyBVU0JfU0VSSUFMX0ZURElfU0lPCi0JdHJpc3RhdGUgIlVTQiBGVERJIFNpbmdsZSBQb3J0IFNlcmlhbCBEcml2ZXIgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBVU0JfU0VSSUFMICYmIEVYUEVSSU1FTlRBTAorCXRyaXN0YXRlICJVU0IgRlRESSBTaW5nbGUgUG9ydCBTZXJpYWwgRHJpdmVyIgogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgRlRESSBTSU8gc2luZ2xlIHBvcnQgVVNCIHRvIHNlcmlhbAogCSAgY29udmVydGVyIGRldmljZS4gVGhlIGltcGxlbWVudGF0aW9uIEkgaGF2ZSBpcyBjYWxsZWQgdGhlIFVTQy0xMDAwLgpAQCAtMTg2LDcgKzE3Myw2IEBACiAKIGNvbmZpZyBVU0JfU0VSSUFMX0ZVTlNPRlQKIAl0cmlzdGF0ZSAiVVNCIEZ1bmRhbWVudGFsIFNvZnR3YXJlIERvbmdsZSBEcml2ZXIiCi0JZGVwZW5kcyBvbiBVU0JfU0VSSUFMCiAJLS0taGVscC0tLQogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIEZ1bmRhbWVudGFsIFNvZnR3YXJlIGRvbmdsZS4KIApAQCAtMTk1LDcgKzE4MSw2IEBACiAKIGNvbmZpZyBVU0JfU0VSSUFMX1ZJU09SCiAJdHJpc3RhdGUgIlVTQiBIYW5kc3ByaW5nIFZpc29yIC8gUGFsbSBtNTB4IC8gU29ueSBDbGllIERyaXZlciIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgdG8geW91ciBIYW5kU3ByaW5nIFZpc29yLCBQYWxtCiAJICBtNTAwIG9yIG01MDUgdGhyb3VnaCBpdHMgVVNCIGRvY2tpbmcgc3RhdGlvbi4gU2VlCkBAIC0yMDcsNyArMTkyLDYgQEAKIAogY29uZmlnIFVTQl9TRVJJQUxfSVBBUQogCXRyaXN0YXRlICJVU0IgUG9ja2V0UEMgUERBIERyaXZlciIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgdG8geW91ciBDb21wYXEgaVBBUSwgSFAgSm9ybmFkYQogCSAgb3IgYW55IG90aGVyIFBEQSBydW5uaW5nIFdpbmRvd3MgQ0UgMy4wIG9yIFBvY2tldFBDIDIwMDIKQEAgLTIxOCw4ICsyMDIsNyBAQAogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGlwYXEuCiAKIGNvbmZpZyBVU0JfU0VSSUFMX0lSCi0JdHJpc3RhdGUgIlVTQiBJUiBEb25nbGUgU2VyaWFsIERyaXZlciAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwgJiYgRVhQRVJJTUVOVEFMCisJdHJpc3RhdGUgIlVTQiBJUiBEb25nbGUgU2VyaWFsIERyaXZlciIKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBzaW1wbGUgc2VyaWFsIHN1cHBvcnQgZm9yIFVTQiBJckRBCiAJICBkZXZpY2VzLiAgVGhpcyBpcyB1c2VmdWwgaWYgeW91IGRvIG5vdCB3YW50IHRvIHVzZSB0aGUgZnVsbCBJckRBCkBAIC0yMzAsNyArMjEzLDYgQEAKIAogY29uZmlnIFVTQl9TRVJJQUxfRURHRVBPUlQKIAl0cmlzdGF0ZSAiVVNCIEluc2lkZSBPdXQgRWRnZXBvcnQgU2VyaWFsIERyaXZlciIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhbnkgb2YgdGhlIGZvbGxvd2luZyBkZXZpY2VzIGZyb20KIAkgIEluc2lkZSBPdXQgTmV0d29ya3MgKERpZ2kpOgpAQCAtMjU2LDcgKzIzOCw2IEBACiAKIGNvbmZpZyBVU0JfU0VSSUFMX0VER0VQT1JUX1RJCiAJdHJpc3RhdGUgIlVTQiBJbnNpZGUgT3V0IEVkZ2Vwb3J0IFNlcmlhbCBEcml2ZXIgKFRJIGRldmljZXMpIgotCWRlcGVuZHMgb24gVVNCX1NFUklBTAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGFueSBvZiB0aGUgZGV2aWNlcyBmcm9tIEluc2lkZSBPdXQKIAkgIE5ldHdvcmtzIChEaWdpKSB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBpb19lZGdlcG9ydCBkcml2ZXIuCkBAIC0yNjcsNyArMjQ4LDYgQEAKIAogY29uZmlnIFVTQl9TRVJJQUxfR0FSTUlOCiAgICAgICAgdHJpc3RhdGUgIlVTQiBHYXJtaW4gR1BTIGRyaXZlciIKLSAgICAgICBkZXBlbmRzIG9uIFVTQl9TRVJJQUwKICAgICAgICBoZWxwCiAgICAgICAgICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgdG8geW91ciBHYXJtaW4gR1BTLgogICAgICAgICAgU2hvdWxkIHdvcmsgd2l0aCBtb3N0IEdhcm1pbiBHUFMgZGV2aWNlcyB3aGljaCBoYXZlIGEgbmF0aXZlIFVTQiBwb3J0LgpAQCAtMjc5LDggKzI1OSw3IEBACiAgICAgICAgICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ2FybWluX2dwcy4KIAogY29uZmlnIFVTQl9TRVJJQUxfSVBXCi0gICAgICAgIHRyaXN0YXRlICJVU0IgSVBXaXJlbGVzcyAoM0cgVU1UUyBUREQpIERyaXZlciAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwgJiYgRVhQRVJJTUVOVEFMCisgICAgICAgIHRyaXN0YXRlICJVU0IgSVBXaXJlbGVzcyAoM0cgVU1UUyBUREQpIERyaXZlciIKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhIElQV2lyZWxlc3MgVVNCIG1vZGVtIHN1Y2ggYXMKIAkgIHRoZSBvbmVzIHN1cHBsaWVkIGJ5IEF4aXR5M0cvU2VudGVjaCBTb3V0aCBBZnJpY2EuCkBAIC0yODksOCArMjY4LDcgQEAKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpcHcuCiAKIGNvbmZpZyBVU0JfU0VSSUFMX0lVVQotCXRyaXN0YXRlICJVU0IgSW5maW5pdHkgVVNCIFVubGltaXRlZCBQaG9lbml4IERyaXZlciAoRXhwZXJpbWVudGFsKSIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwgJiYgRVhQRVJJTUVOVEFMCisJdHJpc3RhdGUgIlVTQiBJbmZpbml0eSBVU0IgVW5saW1pdGVkIFBob2VuaXggRHJpdmVyIgogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgSVVVIGluIHBob2VuaXggbW9kZSBhbmQgZ2V0CiAJICBhbiBleHRyYSB0dHlVU0J4IGRldmljZS4gTW9yZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgb24KQEAgLTMwMSw3ICsyNzksNiBAQAogCiBjb25maWcgVVNCX1NFUklBTF9LRVlTUEFOX1BEQQogCXRyaXN0YXRlICJVU0IgS2V5c3BhbiBQREEgU2luZ2xlIFBvcnQgU2VyaWFsIERyaXZlciIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKIAlzZWxlY3QgVVNCX0VaVVNCCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYSBLZXlzcGFuIFBEQSBzaW5nbGUgcG9ydCBVU0IgdG8KQEAgLTMxMyw3ICsyOTAsNiBAQAogCiBjb25maWcgVVNCX1NFUklBTF9LRVlTUEFOCiAJdHJpc3RhdGUgIlVTQiBLZXlzcGFuIFVTQS14eHggU2VyaWFsIERyaXZlciIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKIAlzZWxlY3QgVVNCX0VaVVNCCiAJLS0taGVscC0tLQogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgS2V5c3BhbiBVU0IgdG8gc2VyaWFsIGNvbnZlcnRlcgpAQCAtNDA1LDggKzM4MSw3IEBACiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgZmlybXdhcmUgZm9yIHRoZSBVU0EtNDlXTEMgY29udmVydGVyLgogCiBjb25maWcgVVNCX1NFUklBTF9LTFNJCi0JdHJpc3RhdGUgIlVTQiBLTDVLVVNCMTA1IChQYWxtY29ubmVjdCkgRHJpdmVyIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCX1NFUklBTCAmJiBFWFBFUklNRU5UQUwKKwl0cmlzdGF0ZSAiVVNCIEtMNUtVU0IxMDUgKFBhbG1jb25uZWN0KSBEcml2ZXIiCiAJLS0taGVscC0tLQogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYSBLTDVLVVNCMTA1IC0gYmFzZWQgc2luZ2xlIHBvcnQKIAkgIHNlcmlhbCBhZGFwdGVyLiBUaGUgbW9zdCB3aWRlbHkga25vd24gLS0gYW5kIGN1cnJlbnRseSB0aGUgb25seQpAQCAtNDIyLDcgKzM5Nyw2IEBACiAKIGNvbmZpZyBVU0JfU0VSSUFMX0tPQklMX1NDVAogICAgICAgICB0cmlzdGF0ZSAiVVNCIEtPQklMIGNoaXBjYXJkIHJlYWRlciIKLSAgICAgICAgZGVwZW5kcyBvbiBVU0JfU0VSSUFMCiAgICAgICAgIC0tLWhlbHAtLS0KICAgICAgICAgICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBLT0JJTCBVU0IgY2hpcGNhcmQKICAgICAgICAgICByZWFkZXJzOgpAQCAtNDQwLDcgKzQxNCw2IEBACiAKIGNvbmZpZyBVU0JfU0VSSUFMX01DVF9VMjMyCiAJdHJpc3RhdGUgIlVTQiBNQ1QgU2luZ2xlIFBvcnQgU2VyaWFsIERyaXZlciIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhIFVTQiBTZXJpYWwgc2luZ2xlIHBvcnQgYWRhcHRlciBmcm9tCiAJICBNYWdpYyBDb250cm9sIFRlY2hub2xvZ3kgQ29ycC4gKFUyMzIgaXMgb25lIG9mIHRoZSBtb2RlbCBudW1iZXJzKS4KQEAgLTQ1Myw3ICs0MjYsNiBAQAogCiBjb25maWcgVVNCX1NFUklBTF9NT1M3NzIwCiAJdHJpc3RhdGUgIlVTQiBNb3NjaGlwIDc3MjAgU2VyaWFsIERyaXZlciIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBVU0IgU2VyaWFsIHNpbmdsZSBhbmQgZG91YmxlCiAJICBwb3J0IGFkYXB0ZXJzIGZyb20gTW9zY2hpcCBTZW1pY29uZHVjdG9yIFRlY2guCkBAIC00NjMsNyArNDM1LDYgQEAKIAogY29uZmlnIFVTQl9TRVJJQUxfTU9TNzg0MAogCXRyaXN0YXRlICJVU0IgTW9zY2hpcCA3ODQwLzc4MjAgVVNCIFNlcmlhbCBEcml2ZXIiCi0JZGVwZW5kcyBvbiBVU0JfU0VSSUFMCiAJLS0taGVscC0tLQogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYSBNQ1M3ODQwIFF1YWQtU2VyaWFsIG9yIE1DUzc4MjAKIAkgIER1YWwtU2VyaWFsIHBvcnQgZGV2aWNlIGZyb20gTW9zQ2hpcCBTZW1pY29uZHVjdG9yLgpAQCAtNDc4LDE0ICs0NDksMTIgQEAKIAogY29uZmlnIFVTQl9TRVJJQUxfTkFWTUFOCiAJdHJpc3RhdGUgIlVTQiBOYXZtYW4gR1BTIGRldmljZSIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKIAloZWxwCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBuYXZtYW4uCiAKIGNvbmZpZyBVU0JfU0VSSUFMX1BMMjMwMwogCXRyaXN0YXRlICJVU0IgUHJvbGlmaWMgMjMwMyBTaW5nbGUgUG9ydCBTZXJpYWwgRHJpdmVyIgotCWRlcGVuZHMgb24gVVNCX1NFUklBTAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBQTDIzMDMgVVNCIFNlcmlhbCBzaW5nbGUgcG9ydAogCSAgYWRhcHRlciBmcm9tIFByb2xpZmljLgpAQCAtNDk0LDggKzQ2Myw3IEBACiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcGwyMzAzLgogCiBjb25maWcgVVNCX1NFUklBTF9PVEk2ODU4Ci0JdHJpc3RhdGUgIlVTQiBPdXJzIFRlY2hub2xvZ3kgSW5jLiBPVGktNjg1OCBVU0IgVG8gUlMyMzIgQnJpZGdlIENvbnRyb2xsZXIgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBVU0JfU0VSSUFMCisJdHJpc3RhdGUgIlVTQiBPdXJzIFRlY2hub2xvZ3kgSW5jLiBPVGktNjg1OCBVU0IgVG8gUlMyMzIgQnJpZGdlIENvbnRyb2xsZXIiCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIE9UaS02ODU4IHNpbmdsZSBwb3J0IFVTQiB0byBzZXJpYWwKICAgICAgICAgICBjb252ZXJ0ZXIgZGV2aWNlLgpAQCAtNTAzLDkgKzQ3MSwxNyBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgb3RpNjg1OC4KIAorY29uZmlnIFVTQl9TRVJJQUxfU1BDUDhYNQorCXRyaXN0YXRlICJVU0IgU1BDUDh4NSBVU0IgVG8gU2VyaWFsIERyaXZlciIKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgc3BjcDh4NSBjb252ZXJ0ZXIgY2hpcC4gIFRoaXMgaXMKKwkgIGNvbW1vbmx5IGZvdW5kIGluIHNvbWUgWi1XYXZlIFVTQiBkZXZpY2VzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzcGNwOHg1LgorCiBjb25maWcgVVNCX1NFUklBTF9IUDRYCiAgICAgICAgIHRyaXN0YXRlICJVU0IgSFA0eCBDYWxjdWxhdG9ycyBzdXBwb3J0IgotICAgICAgICBkZXBlbmRzIG9uIFVTQl9TRVJJQUwKICAgICAgICAgaGVscAogICAgICAgICAgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGFuIEhld2xldHQtUGFja2FyZCA0eCBDYWxjdWxhdG9yLgogCkBAIC01MTMsOCArNDg5LDcgQEAKICAgICAgICAgICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaHA0eC4KIAogY29uZmlnIFVTQl9TRVJJQUxfU0FGRQotCXRyaXN0YXRlICJVU0IgU2FmZSBTZXJpYWwgKEVuY2Fwc3VsYXRlZCkgRHJpdmVyIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCX1NFUklBTCAmJiBFWFBFUklNRU5UQUwKKwl0cmlzdGF0ZSAiVVNCIFNhZmUgU2VyaWFsIChFbmNhcHN1bGF0ZWQpIERyaXZlciIKIAogY29uZmlnIFVTQl9TRVJJQUxfU0FGRV9QQURERUQKIAlib29sICJVU0IgU2VjdXJlIEVuY2Fwc3VsYXRlZCBEcml2ZXIgLSBQYWRkZWQiCkBAIC01MjIsNyArNDk3LDYgQEAKIAogY29uZmlnIFVTQl9TRVJJQUxfU0lFUlJBV0lSRUxFU1MKIAl0cmlzdGF0ZSAiVVNCIFNpZXJyYSBXaXJlbGVzcyBEcml2ZXIiCi0JZGVwZW5kcyBvbiBVU0JfU0VSSUFMCiAJaGVscAogCSAgU2F5IE0gaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYSBTaWVycmEgV2lyZWxlc3MgZGV2aWNlIChpZgogCSAgdXNpbmcgYW4gUEMgNTIyMCBvciBBQzU4MCBwbGVhc2UgdXNlIHRoZSBBaXJwcmltZSBkcml2ZXIKQEAgLTUzMyw3ICs1MDcsNiBAQAogCiBjb25maWcgVVNCX1NFUklBTF9USQogCXRyaXN0YXRlICJVU0IgVEkgMzQxMC81MDUyIFNlcmlhbCBEcml2ZXIiCi0JZGVwZW5kcyBvbiBVU0JfU0VSSUFMCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIFRJIFVTQiAzNDEwIG9yIDUwNTIKIAkgIHNlcmlhbCBkZXZpY2VzLgpAQCAtNTQyLDggKzUxNSw3IEBACiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdGlfdXNiXzM0MTBfNTA1Mi4KIAogY29uZmlnIFVTQl9TRVJJQUxfQ1lCRVJKQUNLCi0JdHJpc3RhdGUgIlVTQiBSRUlORVIgU0NUIGN5YmVySmFjayBwaW5wYWQvZS1jb20gY2hpcGNhcmQgcmVhZGVyIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCX1NFUklBTCAmJiBFWFBFUklNRU5UQUwKKwl0cmlzdGF0ZSAiVVNCIFJFSU5FUiBTQ1QgY3liZXJKYWNrIHBpbnBhZC9lLWNvbSBjaGlwY2FyZCByZWFkZXIiCiAJLS0taGVscC0tLQogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYSBjeWJlckphY2sgcGlucGFkL2UtY29tIFVTQiBjaGlwY2FyZAogCSAgcmVhZGVyLiBUaGlzIGlzIGFuIGludGVyZmFjZSB0byBJU08gNzgxNiBjb21wYXRpYmxlIGNvbnRhY3QtYmFzZWQKQEAgLTU1Niw3ICs1MjgsNiBAQAogCiBjb25maWcgVVNCX1NFUklBTF9YSVJDT00KIAl0cmlzdGF0ZSAiVVNCIFhpcmNvbSAvIEVudHJlZ3JhIFNpbmdsZSBQb3J0IFNlcmlhbCBEcml2ZXIiCi0JZGVwZW5kcyBvbiBVU0JfU0VSSUFMCiAJc2VsZWN0IFVTQl9FWlVTQgogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgWGlyY29tIG9yIEVudHJlZ3JhIHNpbmdsZSBwb3J0IFVTQiB0bwpAQCAtNTY4LDcgKzUzOSw2IEBACiAKIGNvbmZpZyBVU0JfU0VSSUFMX09QVElPTgogCXRyaXN0YXRlICJVU0IgZHJpdmVyIGZvciBHU00gYW5kIENETUEgbW9kZW1zIgotCWRlcGVuZHMgb24gVVNCX1NFUklBTAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBHU00gb3IgQ0RNQSBtb2RlbSB0aGF0J3MgY29ubmVjdGVkIHRvIFVTQi4KIApAQCAtNTg2LDggKzU1Niw3IEBACiAJICBpdCBtaWdodCBiZSBhY2Nlc3NpYmxlIHZpYSB0aGUgRlRESV9TSU8gZHJpdmVyLgogCiBjb25maWcgVVNCX1NFUklBTF9PTU5JTkVUCi0JdHJpc3RhdGUgIlVTQiBaeVhFTCBvbW5pLm5ldCBMQ0QgUGx1cyBEcml2ZXIgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBVU0JfU0VSSUFMICYmIEVYUEVSSU1FTlRBTAorCXRyaXN0YXRlICJVU0IgWnlYRUwgb21uaS5uZXQgTENEIFBsdXMgRHJpdmVyIgogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgWnlYRUwgb21uaS5uZXQgTENEIElTRE4gVEEuCiAKQEAgLTU5Niw3ICs1NjUsNiBAQAogCiBjb25maWcgVVNCX1NFUklBTF9ERUJVRwogCXRyaXN0YXRlICJVU0IgRGVidWdnaW5nIERldmljZSIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgVVNCIGRlYnVnZ2luZyBkZXZpY2UgdXNlZCB0byByZWNlaXZlCiAJICBkZWJ1Z2dpbmcgZGF0YSBmcm9tIGFub3RoZXIgbWFjaGluZS4gIFRoZSBtb3N0IGNvbW1vbiBvZiB0aGVzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL01ha2VmaWxlIGIvZHJpdmVycy91c2Ivc2VyaWFsL01ha2VmaWxlCmluZGV4IDBkYjEwOWEuLjc1Njg1OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvTWFrZWZpbGUKQEAgLTMwLDggKzMwLDggQEAKIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX0hQNFgpCQkJKz0gaHA0eC5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9JUEFRKQkJCSs9IGlwYXEubwogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfSVBXKQkJCSs9IGlwdy5vCi1vYmotJChDT05GSUdfVVNCX1NFUklBTF9JVVUpCQkJKz0gaXV1X3Bob2VuaXgubwogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfSVIpCQkJKz0gaXItdXNiLm8KK29iai0kKENPTkZJR19VU0JfU0VSSUFMX0lVVSkJCQkrPSBpdXVfcGhvZW5peC5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOKQkJKz0ga2V5c3Bhbi5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1BEQSkJCSs9IGtleXNwYW5fcGRhLm8KIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX0tMU0kpCQkJKz0ga2w1a3VzYjEwNS5vCkBAIC00Niw2ICs0Niw3IEBACiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9QTDIzMDMpCQkJKz0gcGwyMzAzLm8KIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX1NBRkUpCQkJKz0gc2FmZV9zZXJpYWwubwogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfU0lFUlJBV0lSRUxFU1MpCQkrPSBzaWVycmEubworb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfU1BDUDhYNSkJCSs9IHNwY3A4eDUubwogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfVEkpCQkJKz0gdGlfdXNiXzM0MTBfNTA1Mi5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9WSVNPUikJCQkrPSB2aXNvci5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9XSElURUhFQVQpCQkrPSB3aGl0ZWhlYXQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2FpcmNhYmxlLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYWlyY2FibGUuYwppbmRleCAxY2QyOWNkLi5hMjM4ODE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvYWlyY2FibGUuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYWlyY2FibGUuYwpAQCAtMjEwLDcgKzIxMCw3IEBACiAJc3RydWN0IGFpcmNhYmxlX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdW5zaWduZWQgY2hhciogYnVmOwogCXUxNiAqZGJ1ZjsKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCWlmIChwb3J0LT53cml0ZV91cmJfYnVzeSkKIAkJcmV0dXJuOwogCkBAIC0yMjAsNyArMjIwLDcgQEAKIAogCWJ1ZiA9IGt6YWxsb2MoY291bnQgKyBIQ0lfSEVBREVSX0xFTkdUSCwgR0ZQX0FUT01JQyk7CiAJaWYgKCFidWYpIHsKLQkJZXJyKCIlcy0ga3phbGxvYyglZCkgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXywKKwkJZXJyKCIlcy0ga3phbGxvYyglZCkgZmFpbGVkLiIsIF9fZnVuY19fLAogCQkgICAgY291bnQgKyBIQ0lfSEVBREVSX0xFTkdUSCk7CiAJCXJldHVybjsKIAl9CkBAIC0yMzYsNyArMjM2LDcgQEAKIAogCWtmcmVlKGJ1Zik7CiAJcG9ydC0+d3JpdGVfdXJiX2J1c3kgPSAxOwotCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLAorCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sCiAJCQkgICAgICBjb3VudCArIEhDSV9IRUFERVJfTEVOR1RILAogCQkJICAgICAgcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXIpOwogCXBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IGNvdW50ICsgSENJX0hFQURFUl9MRU5HVEg7CkBAIC0yNDYsNyArMjQ2LDcgQEAKIAlpZiAocmVzdWx0KSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwKIAkJCSIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWRcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQlfX2Z1bmNfXywgcmVzdWx0KTsKIAkJcG9ydC0+d3JpdGVfdXJiX2J1c3kgPSAwOwogCX0KIApAQCAtMjc1LDcgKzI3NSw3IEBACiAKIAlpZiAoIXR0eSkgewogCQlzY2hlZHVsZV93b3JrKCZwcml2LT5yeF93b3JrKTsKLQkJZXJyKCIlcyAtIE5vIHR0eSBhdmFpbGFibGUiLCBfX0ZVTkNUSU9OX18pOworCQllcnIoIiVzIC0gTm8gdHR5IGF2YWlsYWJsZSIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDsKIAl9CiAKQEAgLTI4Niw3ICsyODYsNyBAQAogCiAJdHR5X3ByZXBhcmVfZmxpcF9zdHJpbmcodHR5LCAmZGF0YSwgY291bnQpOwogCWlmICghZGF0YSl7Ci0JCWVycigiJXMtIGt6YWxsb2MoJWQpIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18sIGNvdW50KTsKKwkJZXJyKCIlcy0ga3phbGxvYyglZCkgZmFpbGVkLiIsIF9fZnVuY19fLCBjb3VudCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTMzMiw3ICszMzIsNyBAQAogCiAJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhaXJjYWJsZV9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcml2KXsKLQkJZXJyKCIlcy0ga21hbGxvYyglWmQpIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18sCisJCWVycigiJXMtIGttYWxsb2MoJVpkKSBmYWlsZWQuIiwgX19mdW5jX18sCiAJCQlzaXplb2Yoc3RydWN0IGFpcmNhYmxlX3ByaXZhdGUpKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMzY2LDcgKzM2Niw3IEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHNlcmlhbC0+cG9ydFswXTsKIAlzdHJ1Y3QgYWlyY2FibGVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlpZiAocHJpdikgewogCQlzZXJpYWxfYnVmX2ZyZWUocHJpdi0+dHhfYnVmKTsKQEAgLTM4OCwxMiArMzg4LDEyIEBACiAJc3RydWN0IGFpcmNhYmxlX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJaW50IHRlbXA7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCwgJWQgYnl0ZXMiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlciwgY291bnQpOworCWRiZygiJXMgLSBwb3J0ICVkLCAlZCBieXRlcyIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIGNvdW50KTsKIAotCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCBjb3VudCwgc291cmNlKTsKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLCBjb3VudCwgc291cmNlKTsKIAogCWlmICghY291bnQpewotCQlkYmcoIiVzIC0gd3JpdGUgcmVxdWVzdCBvZiAwIGJ5dGVzIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHdyaXRlIHJlcXVlc3Qgb2YgMCBieXRlcyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIGNvdW50OwogCX0KIApAQCAtNDE0LDcgKzQxNCw3IEBACiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCWludCByZXN1bHQ7CiAKLQlkYmcoIiVzIC0gdXJiIHN0YXR1czogJWQiLCBfX0ZVTkNUSU9OX18gLCBzdGF0dXMpOworCWRiZygiJXMgLSB1cmIgc3RhdHVzOiAlZCIsIF9fZnVuY19fICwgc3RhdHVzKTsKIAogCS8qIFRoaXMgaGFzIGJlZW4gdGFrZW4gZnJvbSBjeXByZXNzX204LmMgY3lwcmVzc193cml0ZV9pbnRfY2FsbGJhY2sgKi8KIAlzd2l0Y2ggKHN0YXR1cykgewpAQCAtNDI2LDIxICs0MjYsMjEgQEAKIAkJY2FzZSAtRVNIVVRET1dOOgogCQkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KIAkJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLAotCQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMDsKIAkJCXJldHVybjsKIAkJZGVmYXVsdDoKIAkJCS8qIGVycm9yIGluIHRoZSB1cmIsIHNvIHdlIGhhdmUgdG8gcmVzdWJtaXQgaXQgKi8KLQkJCWRiZygiJXMgLSBPdmVyZmxvdyBpbiB3cml0ZSIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gT3ZlcmZsb3cgaW4gd3JpdGUiLCBfX2Z1bmNfXyk7CiAJCQlkYmcoIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJCXBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IDE7CiAJCQlwb3J0LT53cml0ZV91cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwogCQkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+d3JpdGVfdXJiLCBHRlBfQVRPTUlDKTsKIAkJCWlmIChyZXN1bHQpCiAJCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwKIAkJCQkJIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkXG4iLAotCQkJCQlfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQkJCV9fZnVuY19fLCByZXN1bHQpOwogCQkJZWxzZQogCQkJCXJldHVybjsKIAl9CkBAIC00NjAsMTcgKzQ2MCwxNyBAQAogCXVuc2lnbmVkIGNoYXIgKnRlbXA7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmIChzdGF0dXMpIHsKLQkJZGJnKCIlcyAtIHVyYiBzdGF0dXMgPSAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGJnKCIlcyAtIHVyYiBzdGF0dXMgPSAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlpZiAoIXBvcnQtPm9wZW5fY291bnQpIHsKLQkJCWRiZygiJXMgLSBwb3J0IGlzIGNsb3NlZCwgZXhpdGluZy4iLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHBvcnQgaXMgY2xvc2VkLCBleGl0aW5nLiIsIF9fZnVuY19fKTsKIAkJCXJldHVybjsKIAkJfQogCQlpZiAoc3RhdHVzID09IC1FUFJPVE8pIHsKIAkJCWRiZygiJXMgLSBjYXVnaHQgLUVQUk9UTywgcmVzdWJtaXR0aW5nIHRoZSB1cmIiLAotCQkJICAgIF9fRlVOQ1RJT05fXyk7CisJCQkgICAgX19mdW5jX18pOwogCQkJdXNiX2ZpbGxfYnVsa191cmIocG9ydC0+cmVhZF91cmIsIHBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJCQkgIHVzYl9yY3ZidWxrcGlwZShwb3J0LT5zZXJpYWwtPmRldiwKIAkJCQkJICAJCSAgcG9ydC0+YnVsa19pbl9lbmRwb2ludEFkZHJlc3MpLApAQCAtNDgyLDE0ICs0ODIsMTQgQEAKIAkJCWlmIChyZXN1bHQpCiAJCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwKIAkJCQkJIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsCi0JCQkJCV9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCQkJX19mdW5jX18sIHJlc3VsdCk7CiAJCQlyZXR1cm47CiAJCX0KLQkJZGJnKCIlcyAtIHVuYWJsZSB0byBoYW5kbGUgdGhlIGVycm9yLCBleGl0aW5nLiIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSB1bmFibGUgdG8gaGFuZGxlIHRoZSBlcnJvciwgZXhpdGluZy4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLAogCQkJCXVyYi0+YWN0dWFsX2xlbmd0aCx1cmItPnRyYW5zZmVyX2J1ZmZlcik7CiAKIAl0dHkgPSBwb3J0LT50dHk7CkBAIC01MzgsNyArNTM4LDcgQEAKIAkJaWYgKHJlc3VsdCkKIAkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCiAJCQkJIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsCi0JCQkJX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJCV9fZnVuY19fLCByZXN1bHQpOwogCX0KIAogCXJldHVybjsKQEAgLTU1MCw3ICs1NTAsNyBAQAogCXN0cnVjdCBhaXJjYWJsZV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKIAlwcml2LT5yeF9mbGFncyB8PSBUSFJPVFRMRUQ7CkBAIC01NjQsNyArNTY0LDcgQEAKIAlpbnQgYWN0dWFsbHlfdGhyb3R0bGVkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKIAlhY3R1YWxseV90aHJvdHRsZWQgPSBwcml2LT5yeF9mbGFncyAmIEFDVFVBTExZX1RIUk9UVExFRDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9haXJwcmltZS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2FpcnByaW1lLmMKaW5kZXggZjE1NmRiYS4uNzI1YjZiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2FpcnByaW1lLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2FpcnByaW1lLmMKQEAgLTUzLDcgKzUzLDcgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCXN0cnVjdCBhaXJwcmltZV9wcml2YXRlICpwcml2OwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCWlmIChwb3J0LT5udW1iZXIgIT0gMCkKIAkJcmV0dXJuIDA7CkBAIC04MywxNCArODMsMTQgQEAKIAlpbnQgcmVzdWx0OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCWRiZygiJXMgLSBub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQotCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOworCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CiAKIAl0dHkgPSBwb3J0LT50dHk7CiAJaWYgKHR0eSAmJiB1cmItPmFjdHVhbF9sZW5ndGgpIHsKQEAgLTEwMSw3ICsxMDEsNyBAQAogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChyZXN1bHQpCiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQlfX2Z1bmNfXywgcmVzdWx0KTsKIAlyZXR1cm47CiB9CiAKQEAgLTExMiwxNCArMTEyLDE0IEBACiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyogZnJlZSB1cCB0aGUgdHJhbnNmZXIgYnVmZmVyLCBhcyB1c2JfZnJlZV91cmIoKSBkb2VzIG5vdCBkbyB0aGlzICovCiAJa2ZyZWUgKHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIAogCWlmIChzdGF0dXMpCiAJCWRiZygiJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCS0tcHJpdi0+b3V0c3RhbmRpbmdfdXJiczsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC0xMzYsNyArMTM2LDcgQEAKIAlpbnQgaTsKIAlpbnQgcmVzdWx0ID0gMDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAkvKiBpbml0aWFsaXplIG91ciBwcml2YXRlIGRhdGEgc3RydWN0dXJlIGlmIGl0IGlzbid0IGFscmVhZHkgY3JlYXRlZCAqLwogCWlmICghcHJpdikgewpAQCAtMTU3LDcgKzE1Nyw3IEBACiAJCWJ1ZmZlciA9IGttYWxsb2MoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwogCQlpZiAoIWJ1ZmZlcikgewogCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5LlxuIiwKLQkJCQlfX0ZVTkNUSU9OX18pOworCQkJCV9fZnVuY19fKTsKIAkJCXJlc3VsdCA9IC1FTk9NRU07CiAJCQlnb3RvIGVycm91dDsKIAkJfQpAQCAtMTY1LDcgKzE2NSw3IEBACiAJCWlmICghdXJiKSB7CiAJCQlrZnJlZShidWZmZXIpOwogCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBubyBtb3JlIHVyYnM/XG4iLAotCQkJCV9fRlVOQ1RJT05fXyk7CisJCQkJX19mdW5jX18pOwogCQkJcmVzdWx0ID0gLUVOT01FTTsKIAkJCWdvdG8gZXJyb3V0OwogCQl9CkBAIC0xODAsNyArMTgwLDcgQEAKIAkJCWtmcmVlKGJ1ZmZlcik7CiAJCQlkZXZfZXJyKCZwb3J0LT5kZXYsCiAJCQkJIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIgJWQgZm9yIHBvcnQgJWQsIGVycm9yICVkXG4iLAotCQkJCV9fRlVOQ1RJT05fXywgaSwgcG9ydC0+bnVtYmVyLCByZXN1bHQpOworCQkJCV9fZnVuY19fLCBpLCBwb3J0LT5udW1iZXIsIHJlc3VsdCk7CiAJCQlnb3RvIGVycm91dDsKIAkJfQogCQkvKiByZW1lbWJlciB0aGlzIHVyYiBzbyB3ZSBjYW4ga2lsbCBpdCB3aGVuIHRoZSBwb3J0IGlzIGNsb3NlZCAqLwpAQCAtMjEyLDcgKzIxMiw3IEBACiAJc3RydWN0IGFpcnByaW1lX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJaW50IGk7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJcHJpdi0+cnRzX3N0YXRlID0gMDsKIAlwcml2LT5kdHJfc3RhdGUgPSAwOwpAQCAtMjQyLDEyICsyNDIsMTIgQEAKIAl1bnNpZ25lZCBjaGFyICpidWZmZXI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgc3RhdHVzOwotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCWlmIChwcml2LT5vdXRzdGFuZGluZ191cmJzID4gTlVNX1dSSVRFX1VSQlMpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQlkYmcoIiVzIC0gd3JpdGUgbGltaXQgaGl0XG4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gd3JpdGUgbGltaXQgaGl0XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC0yNjQsNyArMjY0LDcgQEAKIAl9CiAJbWVtY3B5IChidWZmZXIsIGJ1ZiwgY291bnQpOwogCi0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIGNvdW50LCBidWZmZXIpOworCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sIGNvdW50LCBidWZmZXIpOwogCiAJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBzZXJpYWwtPmRldiwKIAkJCSAgdXNiX3NuZGJ1bGtwaXBlKHNlcmlhbC0+ZGV2LApAQCAtMjc3LDcgKzI3Nyw3IEBACiAJaWYgKHN0YXR1cykgewogCQlkZXZfZXJyKCZwb3J0LT5kZXYsCiAJCQkiJXMgLSB1c2Jfc3VibWl0X3VyYih3cml0ZSBidWxrKSBmYWlsZWQgd2l0aCBzdGF0dXMgPSAlZFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCV9fZnVuY19fLCBzdGF0dXMpOwogCQljb3VudCA9IHN0YXR1czsKIAkJa2ZyZWUgKGJ1ZmZlcik7CiAJfSBlbHNlIHsKQEAgLTMwNiw5ICszMDYsNiBAQAogCX0sCiAJLnVzYl9kcml2ZXIgPQkJJmFpcnByaW1lX2RyaXZlciwKIAkuaWRfdGFibGUgPQkJaWRfdGFibGUsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19pbiA9CQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19vdXQgPQkJTlVNX0RPTlRfQ0FSRSwKIAkub3BlbiA9CQkJYWlycHJpbWVfb3BlbiwKIAkuY2xvc2UgPQkJYWlycHJpbWVfY2xvc2UsCiAJLndyaXRlID0JCWFpcnByaW1lX3dyaXRlLApAQCAtMzMxLDcgKzMyOCw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhaXJwcmltZV9leGl0KHZvaWQpCiB7Ci0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCXVzYl9kZXJlZ2lzdGVyKCZhaXJwcmltZV9kcml2ZXIpOwogCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmYWlycHJpbWVfZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9hcmszMTE2LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYXJrMzExNi5jCmluZGV4IGZlMmJmZDYuLjU5OWFiMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9hcmszMTE2LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2FyazMxMTYuYwpAQCAtMTczLDcgKzE3Myw3IEBACiAKIAljb25maWcgPSAwOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJaWYgKCFwcml2LT50ZXJtaW9zX2luaXRpYWxpemVkKSB7CkBAIC0xOTIsNiArMTkyLDcgQEAKIAlidWYgPSBrbWFsbG9jKDEsIEdGUF9LRVJORUwpOwogCWlmICghYnVmKSB7CiAJCWRiZygiZXJyb3Iga21hbGxvYyIpOworCQkqcG9ydC0+dHR5LT50ZXJtaW9zID0gKm9sZF90ZXJtaW9zOwogCQlyZXR1cm47CiAJfQogCkBAIC0zMjMsNyArMzI0LDcgQEAKIAljaGFyICpidWY7CiAJaW50IHJlc3VsdCA9IDA7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJYnVmID0ga21hbGxvYygxLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikgewpAQCAtMzk1LDcgKzM5Niw3IEBACiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKLQkJZGJnKCIlcyBjbWQgMHglMDR4IG5vdCBzdXBwb3J0ZWQiLCBfX0ZVTkNUSU9OX18sIGNtZCk7CisJCWRiZygiJXMgY21kIDB4JTA0eCBub3Qgc3VwcG9ydGVkIiwgX19mdW5jX18sIGNtZCk7CiAJCWJyZWFrOwogCX0KIApAQCAtNDQ3LDkgKzQ0OCw2IEBACiAJfSwKIAkuaWRfdGFibGUgPQkJaWRfdGFibGUsCiAJLnVzYl9kcml2ZXIgPQkJJmFyazMxMTZfZHJpdmVyLAotCS5udW1faW50ZXJydXB0X2luID0JMSwKLQkubnVtX2J1bGtfaW4gPQkJMSwKLQkubnVtX2J1bGtfb3V0ID0JCTEsCiAJLm51bV9wb3J0cyA9CQkxLAogCS5hdHRhY2ggPQkJYXJrMzExNl9hdHRhY2gsCiAJLnNldF90ZXJtaW9zID0JCWFyazMxMTZfc2V0X3Rlcm1pb3MsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvYmVsa2luX3NhLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYmVsa2luX3NhLmMKaW5kZXggZGYwYTJiMy4uMGEzMjJmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2JlbGtpbl9zYS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9iZWxraW5fc2EuYwpAQCAtMTI4LDkgKzEyOCw2IEBACiAJLmRlc2NyaXB0aW9uID0JCSJCZWxraW4gLyBQZXJhY29tIC8gR29IdWJzIFVTQiBTZXJpYWwgQWRhcHRlciIsCiAJLnVzYl9kcml2ZXIgPQkJJmJlbGtpbl9kcml2ZXIsCiAJLmlkX3RhYmxlID0JCWlkX3RhYmxlX2NvbWJpbmVkLAotCS5udW1faW50ZXJydXB0X2luID0JMSwKLQkubnVtX2J1bGtfaW4gPQkJMSwKLQkubnVtX2J1bGtfb3V0ID0JCTEsCiAJLm51bV9wb3J0cyA9CQkxLAogCS5vcGVuID0JCQliZWxraW5fc2Ffb3BlbiwKIAkuY2xvc2UgPQkJYmVsa2luX3NhX2Nsb3NlLApAQCAtMTk4LDcgKzE5NSw3IEBACiAJc3RydWN0IGJlbGtpbl9zYV9wcml2YXRlICpwcml2OwogCWludCBpOwogCQotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIAogCS8qIHN0b3AgcmVhZHMgYW5kIHdyaXRlcyBvbiBhbGwgcG9ydHMgKi8KIAlmb3IgKGk9MDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKQEAgLTIxMyw3ICsyMTAsNyBAQAogewogCWludCByZXR2YWwgPSAwOwogCi0JZGJnKCIlcyBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLypTdGFydCByZWFkaW5nIGZyb20gdGhlIGRldmljZSovCiAJLyogVE9ETzogTG9vayBhdCBwb3NzaWJpbGl0eSBvZiBzdWJtaXR0aW5nIG11bHRpcGxlIFVSQnMgdG8gZGV2aWNlIHRvCkBAIC0yNDAsNyArMjM3LDcgQEAKIAogc3RhdGljIHZvaWQgYmVsa2luX3NhX2Nsb3NlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlkYmcoIiVzIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAkvKiBzaHV0ZG93biBvdXIgYnVsayByZWFkcyBhbmQgd3JpdGVzICovCiAJdXNiX2tpbGxfdXJiKHBvcnQtPndyaXRlX3VyYik7CkBAIC0yNTEsNyArMjQ4LDcgQEAKIAogc3RhdGljIHZvaWQgYmVsa2luX3NhX3JlYWRfaW50X2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IGJlbGtpbl9zYV9wcml2YXRlICpwcml2OwogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlpbnQgcmV0dmFsOwpAQCAtMjY3LDE1ICsyNjQsMTUgQEAKIAljYXNlIC1FU0hVVERPV046CiAJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCiAJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAlkZWZhdWx0OgogCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJZ290byBleGl0OwogCX0KIAotCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOworCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CiAKIAkvKiBIYW5kbGUga25vd24gaW50ZXJydXB0IGRhdGEgKi8KIAkvKiBpZ25vcmUgZGF0YVswXSBhbmQgZGF0YVsxXSAqLwpAQCAtMzM0LDcgKzMzMSw3IEBACiAJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJldHZhbCkKIAkJZXJyICgiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQgJWQiLAotCQkgICAgIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwkJICAgICBfX2Z1bmNfXywgcmV0dmFsKTsKIH0KIAogc3RhdGljIHZvaWQgYmVsa2luX3NhX3NldF90ZXJtaW9zIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQpAQCAtNDgxLDcgKzQ3OCw3IEBACiAJdW5zaWduZWQgbG9uZyBjb250cm9sX3N0YXRlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJY29udHJvbF9zdGF0ZSA9IHByaXYtPmNvbnRyb2xfc3RhdGU7CkBAIC01MDIsNyArNDk5LDcgQEAKIAlpbnQgcnRzID0gMDsKIAlpbnQgZHRyID0gMDsKIAkKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAljb250cm9sX3N0YXRlID0gcHJpdi0+Y29udHJvbF9zdGF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jaDM0MS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2NoMzQxLmMKaW5kZXggNDI1ODJkNC4uZDk0N2Q5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2NoMzQxLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2NoMzQxLmMKQEAgLTMxOCw5ICszMTgsNiBAQAogCX0sCiAJLmlkX3RhYmxlICAgICAgICAgPSBpZF90YWJsZSwKIAkudXNiX2RyaXZlciAgICAgICA9ICZjaDM0MV9kcml2ZXIsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPSBOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19pbiAgICAgID0gMSwKLQkubnVtX2J1bGtfb3V0ICAgICA9IDEsCiAJLm51bV9wb3J0cyAgICAgICAgPSAxLAogCS5vcGVuICAgICAgICAgICAgID0gY2gzNDFfb3BlbiwKIAkuc2V0X3Rlcm1pb3MgICAgICA9IGNoMzQxX3NldF90ZXJtaW9zLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2NvbnNvbGUuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jb25zb2xlLmMKaW5kZXggNjZjZTMwYy4uMjAxMTg0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2NvbnNvbGUuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY29uc29sZS5jCkBAIC02Nyw3ICs2Nyw3IEBACiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IE5VTEw7CiAJc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zID0gTlVMTCwgZHVtbXk7CiAKLQlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnICgiJXMiLCBfX2Z1bmNfXyk7CiAKIAlpZiAob3B0aW9ucykgewogCQliYXVkID0gc2ltcGxlX3N0cnRvdWwob3B0aW9ucywgTlVMTCwgMTApOwpAQCAtMjI1LDEwICsyMjUsMTAgQEAKIAlpZiAoY291bnQgPT0gMCkKIAkJcmV0dXJuOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQsICVkIGJ5dGUocykiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlciwgY291bnQpOworCWRiZygiJXMgLSBwb3J0ICVkLCAlZCBieXRlKHMpIiwgX19mdW5jX18sIHBvcnQtPm51bWJlciwgY291bnQpOwogCiAJaWYgKCFwb3J0LT5vcGVuX2NvdW50KSB7Ci0JCWRiZyAoIiVzIC0gcG9ydCBub3Qgb3BlbmVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnICgiJXMgLSBwb3J0IG5vdCBvcGVuZWQiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTI0OCw3ICsyNDgsNyBAQAogCQkJcmV0dmFsID0gc2VyaWFsLT50eXBlLT53cml0ZShwb3J0LCBidWYsIGkpOwogCQllbHNlCiAJCQlyZXR2YWwgPSB1c2Jfc2VyaWFsX2dlbmVyaWNfd3JpdGUocG9ydCwgYnVmLCBpKTsKLQkJZGJnKCIlcyAtIHJldHVybiB2YWx1ZSA6ICVkIiwgX19GVU5DVElPTl9fLCByZXR2YWwpOworCQlkYmcoIiVzIC0gcmV0dXJuIHZhbHVlIDogJWQiLCBfX2Z1bmNfXywgcmV0dmFsKTsKIAkJaWYgKGxmKSB7CiAJCQkvKiBhcHBlbmQgQ1IgYWZ0ZXIgTEYgKi8KIAkJCXVuc2lnbmVkIGNoYXIgY3IgPSAxMzsKQEAgLTI1Niw3ICsyNTYsNyBAQAogCQkJCXJldHZhbCA9IHNlcmlhbC0+dHlwZS0+d3JpdGUocG9ydCwgJmNyLCAxKTsKIAkJCWVsc2UKIAkJCQlyZXR2YWwgPSB1c2Jfc2VyaWFsX2dlbmVyaWNfd3JpdGUocG9ydCwgJmNyLCAxKTsKLQkJCWRiZygiJXMgLSByZXR1cm4gdmFsdWUgOiAlZCIsIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwkJCWRiZygiJXMgLSByZXR1cm4gdmFsdWUgOiAlZCIsIF9fZnVuY19fLCByZXR2YWwpOwogCQl9CiAJCWJ1ZiArPSBpOwogCQljb3VudCAtPSBpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2NwMjEwMS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2NwMjEwMS5jCmluZGV4IDMyNGJiNjEuLmRjMGVhMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jcDIxMDEuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3AyMTAxLmMKQEAgLTUzLDkgKzUzLDExIEBACiBzdGF0aWMgaW50IGRlYnVnOwogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGUgW10gPSB7CisJeyBVU0JfREVWSUNFKDB4MDQ4OSwgMHhFMDAwKSB9LCAvKiBQaXJlbGxpIEJyb2FkYmFuZCBTLnAuQSwgRFAtTDEwIFNJUC9HU00gTW9iaWxlICovCiAJeyBVU0JfREVWSUNFKDB4MDhlNiwgMHg1NTAxKSB9LCAvKiBHZW1hbHRvIFByb3gtUFUvQ1UgY29udGFjdGxlc3Mgc21hcnRjYXJkIHJlYWRlciAqLwogCXsgVVNCX0RFVklDRSgweDBGQ0YsIDB4MTAwMykgfSwgLyogRHluYXN0cmVhbSBBTlQgZGV2ZWxvcG1lbnQgYm9hcmQgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwRkNGLCAweDEwMDQpIH0sIC8qIER5bmFzdHJlYW0gQU5UMlVTQiAqLworCXsgVVNCX0RFVklDRSgweDBGQ0YsIDB4MTAwNikgfSwgLyogRHluYXN0cmVhbSBBTlQgZGV2ZWxvcG1lbnQgYm9hcmQgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMEE2LCAweEFBMjYpIH0sIC8qIEtub2NrLW9mZiBEQ1UtMTEgY2FibGUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMEFCLCAweDEwQzUpIH0sIC8qIFNpZW1lbnMgTUM2MCBDYWJsZSAqLwogCXsgVVNCX0RFVklDRSgweDEwQjUsIDB4QUM3MCkgfSwgLyogTm9raWEgQ0EtNDIgVVNCICovCkBAIC03MSw2ICs3Myw3IEBACiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4MTRBKSB9LCAvKiBXZXN0IE1vdW50YWluIFJhZGlvIFJJR2JsYXN0ZXIgUCZQICovCiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4MTRCKSB9LCAvKiBXZXN0IE1vdW50YWluIFJhZGlvIFJJR3RhbGsgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDgxNUUpIH0sIC8qIEhlbGljb21tIElQLUxpbmsgMTIyMC1EVk0gKi8KKwl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDgxQUMpIH0sIC8qIE1TRCBEYXNoIEhhd2sgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDgxQzgpIH0sIC8qIExpcG93c2t5IEluZHVzdHJpZSBFbGVrdHJvbmlrIEdtYkgsIEJhYnktSlRBRyAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODFFMikgfSwgLyogTGlwb3dza3kgSW5kdXN0cmllIEVsZWt0cm9uaWsgR21iSCwgQmFieS1MSU4gKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDgxRTcpIH0sIC8qIEFlcm9jb21tIFJhZGlvICovCkBAIC0xMDYsOSArMTA5LDYgQEAKIAl9LAogCS51c2JfZHJpdmVyCQk9ICZjcDIxMDFfZHJpdmVyLAogCS5pZF90YWJsZQkJPSBpZF90YWJsZSwKLQkubnVtX2ludGVycnVwdF9pbgk9IDAsCi0JLm51bV9idWxrX2luCQk9IE5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX291dAkJPSBOVU1fRE9OVF9DQVJFLAogCS5udW1fcG9ydHMJCT0gMSwKIAkub3BlbgkJCT0gY3AyMTAxX29wZW4sCiAJLmNsb3NlCQkJPSBjcDIxMDFfY2xvc2UsCkBAIC0xOTMsNyArMTkzLDcgQEAKIAogCWJ1ZiA9IGtjYWxsb2MobGVuZ3RoLCBzaXplb2YoX19sZTMyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWYpIHsKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5LlxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5LlxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTIxNCw3ICsyMTQsNyBAQAogCWlmIChyZXN1bHQgIT0gc2l6ZSkgewogCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIFVuYWJsZSB0byBzZW5kIGNvbmZpZyByZXF1ZXN0LCAiCiAJCQkJInJlcXVlc3Q9MHgleCBzaXplPSVkIHJlc3VsdD0lZFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHJlcXVlc3QsIHNpemUsIHJlc3VsdCk7CisJCQkJX19mdW5jX18sIHJlcXVlc3QsIHNpemUsIHJlc3VsdCk7CiAJCXJldHVybiAtRVBST1RPOwogCX0KIApAQCAtMjQwLDcgKzI0MCw3IEBACiAJYnVmID0ga21hbGxvYyhsZW5ndGggKiBzaXplb2YoX19sZTMyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWYpIHsKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5LlxuIiwKLQkJCQlfX0ZVTkNUSU9OX18pOworCQkJCV9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0yNjUsNyArMjY1LDcgQEAKIAlpZiAoKHNpemUgPiAyICYmIHJlc3VsdCAhPSBzaXplKSB8fCByZXN1bHQgPCAwKSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gVW5hYmxlIHRvIHNlbmQgcmVxdWVzdCwgIgogCQkJCSJyZXF1ZXN0PTB4JXggc2l6ZT0lZCByZXN1bHQ9JWRcbiIsCi0JCQkJX19GVU5DVElPTl9fLCByZXF1ZXN0LCBzaXplLCByZXN1bHQpOworCQkJCV9fZnVuY19fLCByZXF1ZXN0LCBzaXplLCByZXN1bHQpOwogCQlyZXR1cm4gLUVQUk9UTzsKIAl9CiAKQEAgLTI5MywxMSArMjkzLDExIEBACiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAlpbnQgcmVzdWx0OwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmIChjcDIxMDFfc2V0X2NvbmZpZ19zaW5nbGUocG9ydCwgQ1AyMTAxX1VBUlQsIFVBUlRfRU5BQkxFKSkgewogCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIFVuYWJsZSB0byBlbmFibGUgVUFSVFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18pOworCQkJCV9fZnVuY19fKTsKIAkJcmV0dXJuIC1FUFJPVE87CiAJfQogCkBAIC0zMTIsNyArMzEyLDcgQEAKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJlc3VsdCkgewogCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsICIKLQkJCQkiZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCQkiZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIApAQCAtMzI5LDcgKzMyOSw3IEBACiB7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoc2VyaWFsLT5kZXYpIHsKIAkJLyogc2h1dGRvd24gYW55IGJ1bGsgcmVhZHMgdGhhdCBtaWdodCBiZSBnb2luZyBvbiAqLwpAQCAtMzQyLDEwICszNDIsMTAgQEAKIAogc3RhdGljIHZvaWQgY3AyMTAxX2Nsb3NlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCiB7Ci0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCS8qIHNodXRkb3duIG91ciB1cmJzICovCi0JZGJnKCIlcyAtIHNodXR0aW5nIGRvd24gdXJicyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIHNodXR0aW5nIGRvd24gdXJicyIsIF9fZnVuY19fKTsKIAl1c2Jfa2lsbF91cmIocG9ydC0+d3JpdGVfdXJiKTsKIAl1c2Jfa2lsbF91cmIocG9ydC0+cmVhZF91cmIpOwogCkBAIC0zNjcsMTAgKzM2NywxMCBAQAogCWludCBiYXVkOwogCWludCBiaXRzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmICghcG9ydC0+dHR5IHx8ICFwb3J0LT50dHktPnRlcm1pb3MpIHsKLQkJZGJnKCIlcyAtIG5vIHR0eSBzdHJ1Y3R1cmVzIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIG5vIHR0eSBzdHJ1Y3R1cmVzIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC0zNzksNyArMzc5LDcgQEAKIAlpZiAoYmF1ZCkKIAkJYmF1ZCA9IEJBVURfUkFURV9HRU5fRlJFUSAvIGJhdWQ7CiAKLQlkYmcoIiVzIC0gYmF1ZCByYXRlID0gJWQiLCBfX0ZVTkNUSU9OX18sIGJhdWQpOworCWRiZygiJXMgLSBiYXVkIHJhdGUgPSAlZCIsIF9fZnVuY19fLCBiYXVkKTsKIAogCXR0eV9lbmNvZGVfYmF1ZF9yYXRlKHBvcnQtPnR0eSwgYmF1ZCwgYmF1ZCk7CiAJY2ZsYWcgPSBwb3J0LT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CkBAIC0zODgsMjQgKzM4OCwyNCBAQAogCWNmbGFnICY9IH5DU0laRTsKIAlzd2l0Y2goYml0cyAmIEJJVFNfREFUQV9NQVNLKSB7CiAJCWNhc2UgQklUU19EQVRBXzU6Ci0JCQlkYmcoIiVzIC0gZGF0YSBiaXRzID0gNSIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gZGF0YSBiaXRzID0gNSIsIF9fZnVuY19fKTsKIAkJCWNmbGFnIHw9IENTNTsKIAkJCWJyZWFrOwogCQljYXNlIEJJVFNfREFUQV82OgotCQkJZGJnKCIlcyAtIGRhdGEgYml0cyA9IDYiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIGRhdGEgYml0cyA9IDYiLCBfX2Z1bmNfXyk7CiAJCQljZmxhZyB8PSBDUzY7CiAJCQlicmVhazsKIAkJY2FzZSBCSVRTX0RBVEFfNzoKLQkJCWRiZygiJXMgLSBkYXRhIGJpdHMgPSA3IiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBkYXRhIGJpdHMgPSA3IiwgX19mdW5jX18pOwogCQkJY2ZsYWcgfD0gQ1M3OwogCQkJYnJlYWs7CiAJCWNhc2UgQklUU19EQVRBXzg6Ci0JCQlkYmcoIiVzIC0gZGF0YSBiaXRzID0gOCIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gZGF0YSBiaXRzID0gOCIsIF9fZnVuY19fKTsKIAkJCWNmbGFnIHw9IENTODsKIAkJCWJyZWFrOwogCQljYXNlIEJJVFNfREFUQV85OgogCQkJZGJnKCIlcyAtIGRhdGEgYml0cyA9IDkgKG5vdCBzdXBwb3J0ZWQsICIKLQkJCQkJInVzaW5nIDggZGF0YSBiaXRzKSIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCSJ1c2luZyA4IGRhdGEgYml0cykiLCBfX2Z1bmNfXyk7CiAJCQljZmxhZyB8PSBDUzg7CiAJCQliaXRzICY9IH5CSVRTX0RBVEFfTUFTSzsKIAkJCWJpdHMgfD0gQklUU19EQVRBXzg7CkBAIC00MTMsNyArNDEzLDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJZGJnKCIlcyAtIFVua25vd24gbnVtYmVyIG9mIGRhdGEgYml0cywgIgotCQkJCQkidXNpbmcgOCIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCSJ1c2luZyA4IiwgX19mdW5jX18pOwogCQkJY2ZsYWcgfD0gQ1M4OwogCQkJYml0cyAmPSB+QklUU19EQVRBX01BU0s7CiAJCQliaXRzIHw9IEJJVFNfREFUQV84OwpAQCAtNDIzLDM1ICs0MjMsMzUgQEAKIAogCXN3aXRjaChiaXRzICYgQklUU19QQVJJVFlfTUFTSykgewogCQljYXNlIEJJVFNfUEFSSVRZX05PTkU6Ci0JCQlkYmcoIiVzIC0gcGFyaXR5ID0gTk9ORSIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gcGFyaXR5ID0gTk9ORSIsIF9fZnVuY19fKTsKIAkJCWNmbGFnICY9IH5QQVJFTkI7CiAJCQlicmVhazsKIAkJY2FzZSBCSVRTX1BBUklUWV9PREQ6Ci0JCQlkYmcoIiVzIC0gcGFyaXR5ID0gT0REIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBwYXJpdHkgPSBPREQiLCBfX2Z1bmNfXyk7CiAJCQljZmxhZyB8PSAoUEFSRU5CfFBBUk9ERCk7CiAJCQlicmVhazsKIAkJY2FzZSBCSVRTX1BBUklUWV9FVkVOOgotCQkJZGJnKCIlcyAtIHBhcml0eSA9IEVWRU4iLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHBhcml0eSA9IEVWRU4iLCBfX2Z1bmNfXyk7CiAJCQljZmxhZyAmPSB+UEFST0REOwogCQkJY2ZsYWcgfD0gUEFSRU5COwogCQkJYnJlYWs7CiAJCWNhc2UgQklUU19QQVJJVFlfTUFSSzoKIAkJCWRiZygiJXMgLSBwYXJpdHkgPSBNQVJLIChub3Qgc3VwcG9ydGVkLCAiCi0JCQkJCSJkaXNhYmxpbmcgcGFyaXR5KSIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCSJkaXNhYmxpbmcgcGFyaXR5KSIsIF9fZnVuY19fKTsKIAkJCWNmbGFnICY9IH5QQVJFTkI7CiAJCQliaXRzICY9IH5CSVRTX1BBUklUWV9NQVNLOwogCQkJY3AyMTAxX3NldF9jb25maWcocG9ydCwgQ1AyMTAxX0JJVFMsICZiaXRzLCAyKTsKIAkJCWJyZWFrOwogCQljYXNlIEJJVFNfUEFSSVRZX1NQQUNFOgogCQkJZGJnKCIlcyAtIHBhcml0eSA9IFNQQUNFIChub3Qgc3VwcG9ydGVkLCAiCi0JCQkJCSJkaXNhYmxpbmcgcGFyaXR5KSIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCSJkaXNhYmxpbmcgcGFyaXR5KSIsIF9fZnVuY19fKTsKIAkJCWNmbGFnICY9IH5QQVJFTkI7CiAJCQliaXRzICY9IH5CSVRTX1BBUklUWV9NQVNLOwogCQkJY3AyMTAxX3NldF9jb25maWcocG9ydCwgQ1AyMTAxX0JJVFMsICZiaXRzLCAyKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJZGJnKCIlcyAtIFVua25vd24gcGFyaXR5IG1vZGUsICIKLQkJCQkJImRpc2FibGluZyBwYXJpdHkiLCBfX0ZVTkNUSU9OX18pOworCQkJCQkiZGlzYWJsaW5nIHBhcml0eSIsIF9fZnVuY19fKTsKIAkJCWNmbGFnICY9IH5QQVJFTkI7CiAJCQliaXRzICY9IH5CSVRTX1BBUklUWV9NQVNLOwogCQkJY3AyMTAxX3NldF9jb25maWcocG9ydCwgQ1AyMTAxX0JJVFMsICZiaXRzLCAyKTsKQEAgLTQ2MSwyMSArNDYxLDIxIEBACiAJY2ZsYWcgJj0gfkNTVE9QQjsKIAlzd2l0Y2goYml0cyAmIEJJVFNfU1RPUF9NQVNLKSB7CiAJCWNhc2UgQklUU19TVE9QXzE6Ci0JCQlkYmcoIiVzIC0gc3RvcCBiaXRzID0gMSIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gc3RvcCBiaXRzID0gMSIsIF9fZnVuY19fKTsKIAkJCWJyZWFrOwogCQljYXNlIEJJVFNfU1RPUF8xXzU6CiAJCQlkYmcoIiVzIC0gc3RvcCBiaXRzID0gMS41IChub3Qgc3VwcG9ydGVkLCAiCi0JCQkJCSJ1c2luZyAxIHN0b3AgYml0KSIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCSJ1c2luZyAxIHN0b3AgYml0KSIsIF9fZnVuY19fKTsKIAkJCWJpdHMgJj0gfkJJVFNfU1RPUF9NQVNLOwogCQkJY3AyMTAxX3NldF9jb25maWcocG9ydCwgQ1AyMTAxX0JJVFMsICZiaXRzLCAyKTsKIAkJCWJyZWFrOwogCQljYXNlIEJJVFNfU1RPUF8yOgotCQkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDIiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDIiLCBfX2Z1bmNfXyk7CiAJCQljZmxhZyB8PSBDU1RPUEI7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWRiZygiJXMgLSBVbmtub3duIG51bWJlciBvZiBzdG9wIGJpdHMsICIKLQkJCQkJInVzaW5nIDEgc3RvcCBiaXQiLCBfX0ZVTkNUSU9OX18pOworCQkJCQkidXNpbmcgMSBzdG9wIGJpdCIsIF9fZnVuY19fKTsKIAkJCWJpdHMgJj0gfkJJVFNfU1RPUF9NQVNLOwogCQkJY3AyMTAxX3NldF9jb25maWcocG9ydCwgQ1AyMTAxX0JJVFMsICZiaXRzLCAyKTsKIAkJCWJyZWFrOwpAQCAtNDgzLDEwICs0ODMsMTAgQEAKIAogCWNwMjEwMV9nZXRfY29uZmlnKHBvcnQsIENQMjEwMV9NT0RFTUNUTCwgbW9kZW1fY3RsLCAxNik7CiAJaWYgKG1vZGVtX2N0bFswXSAmIDB4MDAwOCkgewotCQlkYmcoIiVzIC0gZmxvdyBjb250cm9sID0gQ1JUU0NUUyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBmbG93IGNvbnRyb2wgPSBDUlRTQ1RTIiwgX19mdW5jX18pOwogCQljZmxhZyB8PSBDUlRTQ1RTOwogCX0gZWxzZSB7Ci0JCWRiZygiJXMgLSBmbG93IGNvbnRyb2wgPSBOT05FIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIGZsb3cgY29udHJvbCA9IE5PTkUiLCBfX2Z1bmNfXyk7CiAJCWNmbGFnICY9IH5DUlRTQ1RTOwogCX0KIApAQCAtNTAwLDEwICs1MDAsMTAgQEAKIAlpbnQgYmF1ZD0wLCBiaXRzOwogCXVuc2lnbmVkIGludCBtb2RlbV9jdGxbNF07CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKCFwb3J0LT50dHkgfHwgIXBvcnQtPnR0eS0+dGVybWlvcykgewotCQlkYmcoIiVzIC0gbm8gdHR5IHN0cnVjdHVyZXMiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gbm8gdHR5IHN0cnVjdHVyZXMiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAJcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICY9IH5DTVNQQVI7CkBAIC01NDIsNyArNTQyLDcgQEAKIAkJfQogCiAJCWlmIChiYXVkKSB7Ci0JCQlkYmcoIiVzIC0gU2V0dGluZyBiYXVkIHJhdGUgdG8gJWQgYmF1ZCIsIF9fRlVOQ1RJT05fXywKKwkJCWRiZygiJXMgLSBTZXR0aW5nIGJhdWQgcmF0ZSB0byAlZCBiYXVkIiwgX19mdW5jX18sCiAJCQkJCWJhdWQpOwogCQkJaWYgKGNwMjEwMV9zZXRfY29uZmlnX3NpbmdsZShwb3J0LCBDUDIxMDFfQkFVRFJBVEUsCiAJCQkJCQkoQkFVRF9SQVRFX0dFTl9GUkVRIC8gYmF1ZCkpKSB7CkBAIC01NjIsMjMgKzU2MiwyMyBAQAogCQlzd2l0Y2ggKGNmbGFnICYgQ1NJWkUpIHsKIAkJCWNhc2UgQ1M1OgogCQkJCWJpdHMgfD0gQklUU19EQVRBXzU7Ci0JCQkJZGJnKCIlcyAtIGRhdGEgYml0cyA9IDUiLCBfX0ZVTkNUSU9OX18pOworCQkJCWRiZygiJXMgLSBkYXRhIGJpdHMgPSA1IiwgX19mdW5jX18pOwogCQkJCWJyZWFrOwogCQkJY2FzZSBDUzY6CiAJCQkJYml0cyB8PSBCSVRTX0RBVEFfNjsKLQkJCQlkYmcoIiVzIC0gZGF0YSBiaXRzID0gNiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJZGJnKCIlcyAtIGRhdGEgYml0cyA9IDYiLCBfX2Z1bmNfXyk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIENTNzoKIAkJCQliaXRzIHw9IEJJVFNfREFUQV83OwotCQkJCWRiZygiJXMgLSBkYXRhIGJpdHMgPSA3IiwgX19GVU5DVElPTl9fKTsKKwkJCQlkYmcoIiVzIC0gZGF0YSBiaXRzID0gNyIsIF9fZnVuY19fKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgQ1M4OgogCQkJCWJpdHMgfD0gQklUU19EQVRBXzg7Ci0JCQkJZGJnKCIlcyAtIGRhdGEgYml0cyA9IDgiLCBfX0ZVTkNUSU9OX18pOworCQkJCWRiZygiJXMgLSBkYXRhIGJpdHMgPSA4IiwgX19mdW5jX18pOwogCQkJCWJyZWFrOwogCQkJLypjYXNlIENTOToKIAkJCSAJYml0cyB8PSBCSVRTX0RBVEFfOTsKLQkJCQlkYmcoIiVzIC0gZGF0YSBiaXRzID0gOSIsIF9fRlVOQ1RJT05fXyk7CisJCQkJZGJnKCIlcyAtIGRhdGEgYml0cyA9IDkiLCBfX2Z1bmNfXyk7CiAJCQkJYnJlYWs7Ki8KIAkJCWRlZmF1bHQ6CiAJCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiY3AyMTAxIGRyaXZlciBkb2VzIG5vdCAiCkBAIC01OTgsMTAgKzU5OCwxMCBAQAogCQlpZiAoY2ZsYWcgJiBQQVJFTkIpIHsKIAkJCWlmIChjZmxhZyAmIFBBUk9ERCkgewogCQkJCWJpdHMgfD0gQklUU19QQVJJVFlfT0REOwotCQkJCWRiZygiJXMgLSBwYXJpdHkgPSBPREQiLCBfX0ZVTkNUSU9OX18pOworCQkJCWRiZygiJXMgLSBwYXJpdHkgPSBPREQiLCBfX2Z1bmNfXyk7CiAJCQl9IGVsc2UgewogCQkJCWJpdHMgfD0gQklUU19QQVJJVFlfRVZFTjsKLQkJCQlkYmcoIiVzIC0gcGFyaXR5ID0gRVZFTiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJZGJnKCIlcyAtIHBhcml0eSA9IEVWRU4iLCBfX2Z1bmNfXyk7CiAJCQl9CiAJCX0KIAkJaWYgKGNwMjEwMV9zZXRfY29uZmlnKHBvcnQsIENQMjEwMV9CSVRTLCAmYml0cywgMikpCkBAIC02MTQsMTAgKzYxNCwxMCBAQAogCQliaXRzICY9IH5CSVRTX1NUT1BfTUFTSzsKIAkJaWYgKGNmbGFnICYgQ1NUT1BCKSB7CiAJCQliaXRzIHw9IEJJVFNfU1RPUF8yOwotCQkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDIiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDIiLCBfX2Z1bmNfXyk7CiAJCX0gZWxzZSB7CiAJCQliaXRzIHw9IEJJVFNfU1RPUF8xOwotCQkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDEiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDEiLCBfX2Z1bmNfXyk7CiAJCX0KIAkJaWYgKGNwMjEwMV9zZXRfY29uZmlnKHBvcnQsIENQMjEwMV9CSVRTLCAmYml0cywgMikpCiAJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICJOdW1iZXIgb2Ygc3RvcCBiaXRzIHJlcXVlc3RlZCAiCkBAIC02MjcsMjMgKzYyNywyMyBAQAogCWlmICgoY2ZsYWcgJiBDUlRTQ1RTKSAhPSAob2xkX2NmbGFnICYgQ1JUU0NUUykpIHsKIAkJY3AyMTAxX2dldF9jb25maWcocG9ydCwgQ1AyMTAxX01PREVNQ1RMLCBtb2RlbV9jdGwsIDE2KTsKIAkJZGJnKCIlcyAtIHJlYWQgbW9kZW0gY29udHJvbHMgPSAweCUuNHggMHglLjR4IDB4JS40eCAweCUuNHgiLAotCQkJCV9fRlVOQ1RJT05fXywgbW9kZW1fY3RsWzBdLCBtb2RlbV9jdGxbMV0sCisJCQkJX19mdW5jX18sIG1vZGVtX2N0bFswXSwgbW9kZW1fY3RsWzFdLAogCQkJCW1vZGVtX2N0bFsyXSwgbW9kZW1fY3RsWzNdKTsKIAogCQlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7CiAJCQltb2RlbV9jdGxbMF0gJj0gfjB4N0I7CiAJCQltb2RlbV9jdGxbMF0gfD0gMHgwOTsKIAkJCW1vZGVtX2N0bFsxXSA9IDB4ODA7Ci0JCQlkYmcoIiVzIC0gZmxvdyBjb250cm9sID0gQ1JUU0NUUyIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gZmxvdyBjb250cm9sID0gQ1JUU0NUUyIsIF9fZnVuY19fKTsKIAkJfSBlbHNlIHsKIAkJCW1vZGVtX2N0bFswXSAmPSB+MHg3QjsKIAkJCW1vZGVtX2N0bFswXSB8PSAweDAxOwogCQkJbW9kZW1fY3RsWzFdIHw9IDB4NDA7Ci0JCQlkYmcoIiVzIC0gZmxvdyBjb250cm9sID0gTk9ORSIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gZmxvdyBjb250cm9sID0gTk9ORSIsIF9fZnVuY19fKTsKIAkJfQogCiAJCWRiZygiJXMgLSB3cml0ZSBtb2RlbSBjb250cm9scyA9IDB4JS40eCAweCUuNHggMHglLjR4IDB4JS40eCIsCi0JCQkJX19GVU5DVElPTl9fLCBtb2RlbV9jdGxbMF0sIG1vZGVtX2N0bFsxXSwKKwkJCQlfX2Z1bmNfXywgbW9kZW1fY3RsWzBdLCBtb2RlbV9jdGxbMV0sCiAJCQkJbW9kZW1fY3RsWzJdLCBtb2RlbV9jdGxbM10pOwogCQljcDIxMDFfc2V0X2NvbmZpZyhwb3J0LCBDUDIxMDFfTU9ERU1DVEwsIG1vZGVtX2N0bCwgMTYpOwogCX0KQEAgLTY1NSw3ICs2NTUsNyBAQAogewogCWludCBjb250cm9sID0gMDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoc2V0ICYgVElPQ01fUlRTKSB7CiAJCWNvbnRyb2wgfD0gQ09OVFJPTF9SVFM7CkBAIC02NzQsNyArNjc0LDcgQEAKIAkJY29udHJvbCB8PSBDT05UUk9MX1dSSVRFX0RUUjsKIAl9CiAKLQlkYmcoIiVzIC0gY29udHJvbCA9IDB4JS40eCIsIF9fRlVOQ1RJT05fXywgY29udHJvbCk7CisJZGJnKCIlcyAtIGNvbnRyb2wgPSAweCUuNHgiLCBfX2Z1bmNfXywgY29udHJvbCk7CiAKIAlyZXR1cm4gY3AyMTAxX3NldF9jb25maWcocG9ydCwgQ1AyMTAxX0NPTlRST0wsICZjb250cm9sLCAyKTsKIApAQCAtNjg0LDcgKzY4NCw3IEBACiB7CiAJaW50IGNvbnRyb2wsIHJlc3VsdDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAljcDIxMDFfZ2V0X2NvbmZpZyhwb3J0LCBDUDIxMDFfQ09OVFJPTCwgJmNvbnRyb2wsIDEpOwogCkBAIC02OTUsNyArNjk1LDcgQEAKIAkJfCgoY29udHJvbCAmIENPTlRST0xfUklORyk/IFRJT0NNX1JJICA6IDApCiAJCXwoKGNvbnRyb2wgJiBDT05UUk9MX0RDRCkgPyBUSU9DTV9DRCAgOiAwKTsKIAotCWRiZygiJXMgLSBjb250cm9sID0gMHglLjJ4IiwgX19GVU5DVElPTl9fLCBjb250cm9sKTsKKwlkYmcoIiVzIC0gY29udHJvbCA9IDB4JS4yeCIsIF9fZnVuY19fLCBjb250cm9sKTsKIAogCXJldHVybiByZXN1bHQ7CiB9CkBAIC03MDQsMTIgKzcwNCwxMiBAQAogewogCWludCBzdGF0ZTsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJaWYgKGJyZWFrX3N0YXRlID09IDApCiAJCXN0YXRlID0gQlJFQUtfT0ZGOwogCWVsc2UKIAkJc3RhdGUgPSBCUkVBS19PTjsKLQlkYmcoIiVzIC0gdHVybmluZyBicmVhayAlcyIsIF9fRlVOQ1RJT05fXywKKwlkYmcoIiVzIC0gdHVybmluZyBicmVhayAlcyIsIF9fZnVuY19fLAogCQkJc3RhdGU9PUJSRUFLX09GRiA/ICJvZmYiIDogIm9uIik7CiAJY3AyMTAxX3NldF9jb25maWcocG9ydCwgQ1AyMTAxX0JSRUFLLCAmc3RhdGUsIDIpOwogfQpAQCAtNzI1LDcgKzcyNSw3IEBACiB7CiAJaW50IGk7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJLyogU3RvcCByZWFkcyBhbmQgd3JpdGVzIG9uIGFsbCBwb3J0cyAqLwogCWZvciAoaT0wOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7ICsraSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2N5YmVyamFjay5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2N5YmVyamFjay5jCmluZGV4IDhkOWIwNDUuLmMxNjRlMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jeWJlcmphY2suYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3liZXJqYWNrLmMKQEAgLTkwLDkgKzkwLDYgQEAKIAkuZGVzY3JpcHRpb24gPQkJIlJlaW5lciBTQ1QgQ3liZXJqYWNrIFVTQiBjYXJkIHJlYWRlciIsCiAJLnVzYl9kcml2ZXIgPSAJCSZjeWJlcmphY2tfZHJpdmVyLAogCS5pZF90YWJsZSA9CQlpZF90YWJsZSwKLQkubnVtX2ludGVycnVwdF9pbiA9CTEsCi0JLm51bV9idWxrX2luID0JCTEsCi0JLm51bV9idWxrX291dCA9CQkxLAogCS5udW1fcG9ydHMgPQkJMSwKIAkuYXR0YWNoID0JCWN5YmVyamFja19zdGFydHVwLAogCS5zaHV0ZG93biA9CQljeWJlcmphY2tfc2h1dGRvd24sCkBAIC0xMTksNyArMTE2LDcgQEAKIAlzdHJ1Y3QgY3liZXJqYWNrX3ByaXZhdGUgKnByaXY7CiAJaW50IGk7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJLyogYWxsb2NhdGUgdGhlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgKi8KIAlwcml2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGN5YmVyamFja19wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CkBAIC0xNDIsNyArMTM5LDcgQEAKIAkJCQkJR0ZQX0tFUk5FTCk7CiAJCWlmIChyZXN1bHQpCiAJCQllcnIoIiB1c2Jfc3VibWl0X3VyYihyZWFkIGludCkgZmFpbGVkIik7Ci0JCWRiZygiJXMgLSB1c2Jfc3VibWl0X3VyYihpbnQgdXJiKSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSB1c2Jfc3VibWl0X3VyYihpbnQgdXJiKSIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4oIDAgKTsKQEAgLTE1Miw5ICsxNDksOSBAQAogewogCWludCBpOwogCQotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKLQlmb3IgKGk9MDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7ICsraSkgewogCQl1c2Jfa2lsbF91cmIoc2VyaWFsLT5wb3J0W2ldLT5pbnRlcnJ1cHRfaW5fdXJiKTsKIAkJLyogTXkgc3BlY2lhbCBpdGVtcywgdGhlIHN0YW5kYXJkIHJvdXRpbmVzIGZyZWUgbXkgdXJicyAqLwogCQlrZnJlZSh1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0W2ldKSk7CkBAIC0xNjgsOSArMTY1LDkgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXN1bHQgPSAwOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAotCWRiZygiJXMgLSB1c2JfY2xlYXJfaGFsdCIsIF9fRlVOQ1RJT05fXyApOworCWRiZygiJXMgLSB1c2JfY2xlYXJfaGFsdCIsIF9fZnVuY19fICk7CiAJdXNiX2NsZWFyX2hhbHQocG9ydC0+c2VyaWFsLT5kZXYsIHBvcnQtPndyaXRlX3VyYi0+cGlwZSk7CiAKIAkvKiBmb3JjZSBsb3dfbGF0ZW5jeSBvbiBzbyB0aGF0IG91ciB0dHlfcHVzaCBhY3R1YWxseSBmb3JjZXMKQEAgLTE5MSw3ICsxODgsNyBAQAogCiBzdGF0aWMgdm9pZCBjeWJlcmphY2tfY2xvc2UgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQogewotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAocG9ydC0+c2VyaWFsLT5kZXYpIHsKIAkJLyogc2h1dGRvd24gYW55IGJ1bGsgcmVhZHMgdGhhdCBtaWdodCBiZSBnb2luZyBvbiAqLwpAQCAtMjA4LDE3ICsyMDUsMTcgQEAKIAlpbnQgcmVzdWx0OwogCWludCB3cmV4cGVjdGVkOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmIChjb3VudCA9PSAwKSB7Ci0JCWRiZygiJXMgLSB3cml0ZSByZXF1ZXN0IG9mIDAgYnl0ZXMiLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gKDApOworCQlkYmcoIiVzIC0gd3JpdGUgcmVxdWVzdCBvZiAwIGJ5dGVzIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKIAl9CiAKIAlzcGluX2xvY2tfYmgoJnBvcnQtPmxvY2spOwogCWlmIChwb3J0LT53cml0ZV91cmJfYnVzeSkgewogCQlzcGluX3VubG9ja19iaCgmcG9ydC0+bG9jayk7Ci0JCWRiZygiJXMgLSBhbHJlYWR5IHdyaXRpbmciLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gYWxyZWFkeSB3cml0aW5nIiwgX19mdW5jX18pOwogCQlyZXR1cm4gMDsKIAl9CiAJcG9ydC0+d3JpdGVfdXJiX2J1c3kgPSAxOwpAQCAtMjI2LDI0ICsyMjMsMjQgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKLQlpZiggKGNvdW50K3ByaXYtPndyZmlsbGVkKT5zaXplb2YocHJpdi0+d3JidWYpICkgeworCWlmKCAoY291bnQrcHJpdi0+d3JmaWxsZWQpID4gc2l6ZW9mKHByaXYtPndyYnVmKSApIHsKIAkJLyogVG8gbXVjaCBkYXRhIGZvciBidWZmZXIuIFJlc2V0IGJ1ZmZlci4gKi8KLQkJcHJpdi0+d3JmaWxsZWQ9MDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQlwcml2LT53cmZpbGxlZCA9IDA7CiAJCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMDsKLQkJcmV0dXJuICgwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKIAl9CiAKIAkvKiBDb3B5IGRhdGEgKi8KIAltZW1jcHkgKHByaXYtPndyYnVmK3ByaXYtPndyZmlsbGVkLCBidWYsIGNvdW50KTsKIAotCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCBjb3VudCwKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLCBjb3VudCwKIAkJcHJpdi0+d3JidWYrcHJpdi0+d3JmaWxsZWQpOwogCXByaXYtPndyZmlsbGVkICs9IGNvdW50OwogCiAJaWYoIHByaXYtPndyZmlsbGVkID49IDMgKSB7CiAJCXdyZXhwZWN0ZWQgPSAoKGludClwcml2LT53cmJ1ZlsyXTw8OCkrcHJpdi0+d3JidWZbMV0rMzsKLQkJZGJnKCIlcyAtIGV4cGVjdGVkIGRhdGE6ICVkIiwgX19GVU5DVElPTl9fLCB3cmV4cGVjdGVkKTsKKwkJZGJnKCIlcyAtIGV4cGVjdGVkIGRhdGE6ICVkIiwgX19mdW5jX18sIHdyZXhwZWN0ZWQpOwogCX0gZWxzZSB7CiAJCXdyZXhwZWN0ZWQgPSBzaXplb2YocHJpdi0+d3JidWYpOwogCX0KQEAgLTI1Miw3ICsyNDksNyBAQAogCQkvKiBXZSBoYXZlIGVub3VnaCBkYXRhIHRvIGJlZ2luIHRyYW5zbWlzc2lvbiAqLwogCQlpbnQgbGVuZ3RoOwogCi0JCWRiZygiJXMgLSB0cmFuc21pdHRpbmcgZGF0YSAoZnJhbWUgMSkiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gdHJhbnNtaXR0aW5nIGRhdGEgKGZyYW1lIDEpIiwgX19mdW5jX18pOwogCQlsZW5ndGggPSAod3JleHBlY3RlZCA+IHBvcnQtPmJ1bGtfb3V0X3NpemUpID8gcG9ydC0+YnVsa19vdXRfc2l6ZSA6IHdyZXhwZWN0ZWQ7CiAKIAkJbWVtY3B5IChwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlciwgcHJpdi0+d3JidWYsIGxlbmd0aCApOwpAQCAtMjcwLDIzICsyNjcsMjMgQEAKIAkJLyogc2VuZCB0aGUgZGF0YSBvdXQgdGhlIGJ1bGsgcG9ydCAqLwogCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT53cml0ZV91cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAocmVzdWx0KSB7Ci0JCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCWVycigiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCQkvKiBUaHJvdyBhd2F5IGRhdGEuIE5vIGJldHRlciBpZGVhIHdoYXQgdG8gZG8gd2l0aCBpdC4gKi8KLQkJCXByaXYtPndyZmlsbGVkPTA7Ci0JCQlwcml2LT53cnNlbnQ9MDsKKwkJCXByaXYtPndyZmlsbGVkID0gMDsKKwkJCXByaXYtPndyc2VudCA9IDA7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJCQlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7CiAJCQlyZXR1cm4gMDsKIAkJfQogCi0JCWRiZygiJXMgLSBwcml2LT53cnNlbnQ9JWQiLCBfX0ZVTkNUSU9OX18scHJpdi0+d3JzZW50KTsKLQkJZGJnKCIlcyAtIHByaXYtPndyZmlsbGVkPSVkIiwgX19GVU5DVElPTl9fLHByaXYtPndyZmlsbGVkKTsKKwkJZGJnKCIlcyAtIHByaXYtPndyc2VudD0lZCIsIF9fZnVuY19fLHByaXYtPndyc2VudCk7CisJCWRiZygiJXMgLSBwcml2LT53cmZpbGxlZD0lZCIsIF9fZnVuY19fLHByaXYtPndyZmlsbGVkKTsKIAogCQlpZiggcHJpdi0+d3JzZW50Pj1wcml2LT53cmZpbGxlZCApIHsKLQkJCWRiZygiJXMgLSBidWZmZXIgY2xlYW5lZCIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gYnVmZmVyIGNsZWFuZWQiLCBfX2Z1bmNfXyk7CiAJCQltZW1zZXQoIHByaXYtPndyYnVmLCAwLCBzaXplb2YocHJpdi0+d3JidWYpICk7Ci0JCQlwcml2LT53cmZpbGxlZD0wOwotCQkJcHJpdi0+d3JzZW50PTA7CisJCQlwcml2LT53cmZpbGxlZCA9IDA7CisJCQlwcml2LT53cnNlbnQgPSAwOwogCQl9CiAJfQogCkBAIC0yOTcsMjcgKzI5NCwyOCBAQAogCiBzdGF0aWMgaW50IGN5YmVyamFja193cml0ZV9yb29tKCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ICkKIHsKKwkvKiBGSVhNRTogLi4uLiAqLwogCXJldHVybiBDWUJFUkpBQ0tfTE9DQUxfQlVGX1NJWkU7CiB9CiAKIHN0YXRpYyB2b2lkIGN5YmVyamFja19yZWFkX2ludF9jYWxsYmFjayggc3RydWN0IHVyYiAqdXJiICkKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgY3liZXJqYWNrX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdW5zaWduZWQgY2hhciAqZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAlpbnQgcmVzdWx0OwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCS8qIHRoZSB1cmIgbWlnaHQgaGF2ZSBiZWVuIGtpbGxlZC4gKi8KIAlpZiAoc3RhdHVzKQogCQlyZXR1cm47CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOwogCiAJLyogUmVhY3Qgb25seSB0byBpbnRlcnJ1cHRzIHNpZ25hbGluZyBhIGJ1bGtfaW4gdHJhbnNmZXIgKi8KLQlpZiggKHVyYi0+YWN0dWFsX2xlbmd0aD09NCkgJiYgKGRhdGFbMF09PTB4MDEpICkgeworCWlmKCAodXJiLT5hY3R1YWxfbGVuZ3RoID09IDQpICYmIChkYXRhWzBdID09IDB4MDEpICkgewogCQlzaG9ydCBvbGRfcmR0b2RvOwogCiAJCS8qIFRoaXMgaXMgYSBhbm5vdW5jZW1lbnQgb2YgY29taW5nIGJ1bGtfaW5zLiAqLwpAQCAtMzM2LDcgKzMzNCw3IEBACiAJCS8qICIrPSIgaXMgcHJvYmFibHkgbW9yZSBmYXVsdCB0b2xsZXJhbnQgdGhhbiAiPSIgKi8KIAkJcHJpdi0+cmR0b2RvICs9IHNpemU7CiAKLQkJZGJnKCIlcyAtIHJkdG9kbzogJWQiLCBfX0ZVTkNUSU9OX18sIHByaXYtPnJkdG9kbyk7CisJCWRiZygiJXMgLSByZHRvZG86ICVkIiwgX19mdW5jX18sIHByaXYtPnJkdG9kbyk7CiAKIAkJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOwogCkBAIC0zNDQsOCArMzQyLDggQEAKIAkJCXBvcnQtPnJlYWRfdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAkJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKIAkJCWlmKCByZXN1bHQgKQotCQkJCWVycigiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKLQkJCWRiZygiJXMgLSB1c2Jfc3VibWl0X3VyYihyZWFkIHVyYikiLCBfX0ZVTkNUSU9OX18pOworCQkJCWVycigiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fZnVuY19fLCByZXN1bHQpOworCQkJZGJnKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHJlYWQgdXJiKSIsIF9fZnVuY19fKTsKIAkJfQogCX0KIApAQCAtMzU0LDEyICszNTIsMTIgQEAKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAocmVzdWx0KQogCQllcnIoIiB1c2Jfc3VibWl0X3VyYihyZWFkIGludCkgZmFpbGVkIik7Ci0JZGJnKCIlcyAtIHVzYl9zdWJtaXRfdXJiKGludCB1cmIpIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gdXNiX3N1Ym1pdF91cmIoaW50IHVyYikiLCBfX2Z1bmNfXyk7CiB9CiAKIHN0YXRpYyB2b2lkIGN5YmVyamFja19yZWFkX2J1bGtfY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgY3liZXJqYWNrX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CkBAIC0zNjcsMTggKzM2NSwxOCBAQAogCWludCByZXN1bHQ7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAotCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOworCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CiAJaWYgKHN0YXR1cykgewogCQlkYmcoIiVzIC0gbm9uemVybyByZWFkIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAoIXR0eSkgewotCQlkYmcoIiVzIC0gaWdub3Jpbmcgc2luY2UgZGV2aWNlIG5vdCBvcGVuXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gaWdub3Jpbmcgc2luY2UgZGV2aWNlIG5vdCBvcGVuXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCkgewpAQCAtMzk3LDMwICszOTUsMzAgQEAKIAogCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKIAotCWRiZygiJXMgLSByZHRvZG86ICVkIiwgX19GVU5DVElPTl9fLCB0b2RvKTsKKwlkYmcoIiVzIC0gcmR0b2RvOiAlZCIsIF9fZnVuY19fLCB0b2RvKTsKIAogCS8qIENvbnRpbnVlIHRvIHJlYWQgaWYgd2UgaGF2ZSBzdGlsbCB1cmJzIHRvIGRvLiAqLwogCWlmKCB0b2RvIC8qIHx8ICh1cmItPmFjdHVhbF9sZW5ndGg9PXBvcnQtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyZXNzKSovICkgewogCQlwb3J0LT5yZWFkX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJlc3VsdCkKLQkJCWVycigiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKLQkJZGJnKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHJlYWQgdXJiKSIsIF9fRlVOQ1RJT05fXyk7CisJCQllcnIoIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWQiLCBfX2Z1bmNfXywgcmVzdWx0KTsKKwkJZGJnKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHJlYWQgdXJiKSIsIF9fZnVuY19fKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIGN5YmVyamFja193cml0ZV9idWxrX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IGN5YmVyamFja19wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7CiAJaWYgKHN0YXR1cykgewogCQlkYmcoIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQzMCw3ICs0MjgsNyBAQAogCWlmKCBwcml2LT53cmZpbGxlZCApIHsKIAkJaW50IGxlbmd0aCwgYmxrc2l6ZSwgcmVzdWx0OwogCi0JCWRiZygiJXMgLSB0cmFuc21pdHRpbmcgZGF0YSAoZnJhbWUgbikiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gdHJhbnNtaXR0aW5nIGRhdGEgKGZyYW1lIG4pIiwgX19mdW5jX18pOwogCiAJCWxlbmd0aCA9ICgocHJpdi0+d3JmaWxsZWQgLSBwcml2LT53cnNlbnQpID4gcG9ydC0+YnVsa19vdXRfc2l6ZSkgPwogCQkJcG9ydC0+YnVsa19vdXRfc2l6ZSA6IChwcml2LT53cmZpbGxlZCAtIHByaXYtPndyc2VudCk7CkBAIC00NTEsMjMgKzQ0OSwyMyBAQAogCQkvKiBzZW5kIHRoZSBkYXRhIG91dCB0aGUgYnVsayBwb3J0ICovCiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPndyaXRlX3VyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChyZXN1bHQpIHsKLQkJCWVycigiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWQiLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAkJCS8qIFRocm93IGF3YXkgZGF0YS4gTm8gYmV0dGVyIGlkZWEgd2hhdCB0byBkbyB3aXRoIGl0LiAqLwotCQkJcHJpdi0+d3JmaWxsZWQ9MDsKLQkJCXByaXYtPndyc2VudD0wOworCQkJcHJpdi0+d3JmaWxsZWQgPSAwOworCQkJcHJpdi0+d3JzZW50ID0gMDsKIAkJCWdvdG8gZXhpdDsKIAkJfQogCi0JCWRiZygiJXMgLSBwcml2LT53cnNlbnQ9JWQiLCBfX0ZVTkNUSU9OX18scHJpdi0+d3JzZW50KTsKLQkJZGJnKCIlcyAtIHByaXYtPndyZmlsbGVkPSVkIiwgX19GVU5DVElPTl9fLHByaXYtPndyZmlsbGVkKTsKKwkJZGJnKCIlcyAtIHByaXYtPndyc2VudD0lZCIsIF9fZnVuY19fLHByaXYtPndyc2VudCk7CisJCWRiZygiJXMgLSBwcml2LT53cmZpbGxlZD0lZCIsIF9fZnVuY19fLHByaXYtPndyZmlsbGVkKTsKIAogCQlibGtzaXplID0gKChpbnQpcHJpdi0+d3JidWZbMl08PDgpK3ByaXYtPndyYnVmWzFdKzM7CiAKIAkJaWYoIChwcml2LT53cnNlbnQ+PXByaXYtPndyZmlsbGVkKSB8fCAocHJpdi0+d3JzZW50Pj1ibGtzaXplKSApIHsKLQkJCWRiZygiJXMgLSBidWZmZXIgY2xlYW5lZCIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gYnVmZmVyIGNsZWFuZWQiLCBfX2Z1bmNfXyk7CiAJCQltZW1zZXQoIHByaXYtPndyYnVmLCAwLCBzaXplb2YocHJpdi0+d3JidWYpICk7Ci0JCQlwcml2LT53cmZpbGxlZD0wOwotCQkJcHJpdi0+d3JzZW50PTA7CisJCQlwcml2LT53cmZpbGxlZCA9IDA7CisJCQlwcml2LT53cnNlbnQgPSAwOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvY3lwcmVzc19tOC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2N5cHJlc3NfbTguYwppbmRleCA3NzlkMDc4Li4zMjEyMTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvY3lwcmVzc19tOC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jeXByZXNzX204LmMKQEAgLTEyMiw2ICsxMjIsMTEgQEAKIAkubm9fZHluYW1pY19pZCA9IAkxLAogfTsKIAorZW51bSBwYWNrZXRfZm9ybWF0IHsKKwlwYWNrZXRfZm9ybWF0XzEsICAvKiBiMDpzdGF0dXMsIGIxOnBheWxvYWQgY291bnQgKi8KKwlwYWNrZXRfZm9ybWF0XzIgICAvKiBiMFs3OjNdOnN0YXR1cywgYjBbMjowXTpwYXlsb2FkIGNvdW50ICovCit9OworCiBzdHJ1Y3QgY3lwcmVzc19wcml2YXRlIHsKIAlzcGlubG9ja190IGxvY2s7CQkgICAvKiBwcml2YXRlIGxvY2sgKi8KIAlpbnQgY2hpcHR5cGU7CQkJICAgLyogaWRlbnRpZmllciBvZiBkZXZpY2UsIGZvciBxdWlya3MvZXRjICovCkBAIC0xMzksOCArMTQ0LDkgQEAKIAlfX3U4IGN1cnJlbnRfc3RhdHVzOwkgICAJICAgLyogcmVjZWl2ZWQgZnJvbSBsYXN0IHJlYWQgLSBpbmZvIG9uIGRzcixjdHMsY2QscmksZXRjICovCiAJX191OCBjdXJyZW50X2NvbmZpZzsJICAgCSAgIC8qIHN0b3JlcyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGJ5dGUgKi8KIAlfX3U4IHJ4X2ZsYWdzOwkJCSAgIC8qIHRocm90dGxpbmcgLSB1c2VkIGZyb20gd2hpdGVoZWF0L2Z0ZGlfc2lvICovCisJZW51bSBwYWNrZXRfZm9ybWF0IHBrdF9mbXQ7CSAgIC8qIGZvcm1hdCB0byB1c2UgZm9yIHBhY2tldCBzZW5kIC8gcmVjZWl2ZSAqLworCWludCBnZXRfY2ZnX3Vuc2FmZTsJCSAgIC8qIElmIHRydWUsIHRoZSBDWVBSRVNTX0dFVF9DT05GSUcgaXMgdW5zYWZlICovCiAJaW50IGJhdWRfcmF0ZTsJCQkgICAvKiBzdG9yZXMgY3VycmVudCBiYXVkIHJhdGUgaW4gaW50ZWdlciBmb3JtICovCi0JaW50IGNicl9tYXNrOwkJCSAgIC8qIHN0b3JlcyBjdXJyZW50IGJhdWQgcmF0ZSBpbiBtYXNrZWQgZm9ybSAqLwogCWludCBpc3Rocm90dGxlZDsJCSAgIC8qIGlmIHRocm90dGxlZCwgZGlzY2FyZCByZWFkcyAqLwogCXdhaXRfcXVldWVfaGVhZF90IGRlbHRhX21zcl93YWl0OyAgLyogdXNlZCBmb3IgVElPQ01JV0FJVCAqLwogCWNoYXIgcHJldl9zdGF0dXMsIGRpZmZfc3RhdHVzOwkgICAvKiB1c2VkIGZvciBUSU9DTUlXQUlUICovCkBAIC0xNzYsOSArMTgyLDYgQEAKIHN0YXRpYyB2b2lkIGN5cHJlc3Nfc2V0X2RlYWQJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKIHN0YXRpYyB2b2lkIGN5cHJlc3NfcmVhZF9pbnRfY2FsbGJhY2sJKHN0cnVjdCB1cmIgKnVyYik7CiBzdGF0aWMgdm9pZCBjeXByZXNzX3dyaXRlX2ludF9jYWxsYmFjawkoc3RydWN0IHVyYiAqdXJiKTsKLS8qIGJhdWQgaGVscGVyIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludAkgbWFza190b19yYXRlCQkodW5zaWduZWQgbWFzayk7Ci1zdGF0aWMgdW5zaWduZWQgIHJhdGVfdG9fbWFzawkJKGludCByYXRlKTsKIC8qIHdyaXRlIGJ1ZmZlciBmdW5jdGlvbnMgKi8KIHN0YXRpYyBzdHJ1Y3QgY3lwcmVzc19idWYgKmN5cHJlc3NfYnVmX2FsbG9jKHVuc2lnbmVkIGludCBzaXplKTsKIHN0YXRpYyB2b2lkIAkJICBjeXByZXNzX2J1Zl9mcmVlKHN0cnVjdCBjeXByZXNzX2J1ZiAqY2IpOwpAQCAtMTk3LDEwICsyMDAsNiBAQAogCS5kZXNjcmlwdGlvbiA9CQkJIkRlTG9ybWUgRWFydGhtYXRlIFVTQiIsCiAJLnVzYl9kcml2ZXIgPSAJCQkmY3lwcmVzc19kcml2ZXIsCiAJLmlkX3RhYmxlID0JCQlpZF90YWJsZV9lYXJ0aG1hdGUsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPSAJCTEsCi0JLm51bV9pbnRlcnJ1cHRfb3V0ID0JCTEsCi0JLm51bV9idWxrX2luID0JCQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19vdXQgPQkJCU5VTV9ET05UX0NBUkUsCiAJLm51bV9wb3J0cyA9CQkJMSwKIAkuYXR0YWNoID0JCQljeXByZXNzX2VhcnRobWF0ZV9zdGFydHVwLAogCS5zaHV0ZG93biA9CQkJY3lwcmVzc19zaHV0ZG93biwKQEAgLTIyNywxMCArMjI2LDYgQEAKIAkuZGVzY3JpcHRpb24gPQkJCSJISUQtPkNPTSBSUzIzMiBBZGFwdGVyIiwKIAkudXNiX2RyaXZlciA9IAkJCSZjeXByZXNzX2RyaXZlciwKIAkuaWRfdGFibGUgPQkJCWlkX3RhYmxlX2N5cGhpZGNvbXJzMjMyLAotCS5udW1faW50ZXJydXB0X2luID0JCTEsCi0JLm51bV9pbnRlcnJ1cHRfb3V0ID0JCTEsCi0JLm51bV9idWxrX2luID0JCQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19vdXQgPQkJCU5VTV9ET05UX0NBUkUsCiAJLm51bV9wb3J0cyA9CQkJMSwKIAkuYXR0YWNoID0JCQljeXByZXNzX2hpZGNvbV9zdGFydHVwLAogCS5zaHV0ZG93biA9CQkJY3lwcmVzc19zaHV0ZG93biwKQEAgLTI1NywxMCArMjUyLDYgQEAKIAkuZGVzY3JpcHRpb24gPQkJCSJOb2tpYSBDQS00MiBWMiBBZGFwdGVyIiwKIAkudXNiX2RyaXZlciA9IAkJCSZjeXByZXNzX2RyaXZlciwKIAkuaWRfdGFibGUgPQkJCWlkX3RhYmxlX25va2lhY2E0MnYyLAotCS5udW1faW50ZXJydXB0X2luID0JCTEsCi0JLm51bV9pbnRlcnJ1cHRfb3V0ID0JCTEsCi0JLm51bV9idWxrX2luID0JCQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19vdXQgPQkJCU5VTV9ET05UX0NBUkUsCiAJLm51bV9wb3J0cyA9CQkJMSwKIAkuYXR0YWNoID0JCQljeXByZXNzX2NhNDJ2Ml9zdGFydHVwLAogCS5zaHV0ZG93biA9CQkJY3lwcmVzc19zaHV0ZG93biwKQEAgLTI4NCwxNiArMjc1LDYyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAorc3RhdGljIGludCBhbmFseXplX2JhdWRfcmF0ZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzcGVlZF90IG5ld19yYXRlKQoreworCXN0cnVjdCBjeXByZXNzX3ByaXZhdGUgKnByaXY7CisJcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKworCS8qCisJICogVGhlIGdlbmVyYWwgcHVycG9zZSBmaXJtd2FyZSBmb3IgdGhlIEN5cHJlc3MgTTggYWxsb3dzIGZvcgorCSAqIGEgbWF4aW11bSBzcGVlZCBvZiA1NzYwMGJwcyAoSSBoYXZlIG5vIGlkZWEgd2hldGhlciBEZUxvcm1lCisJICogY2hvc2UgdG8gdXNlIHRoZSBnZW5lcmFsIHB1cnBvc2UgZmlybXdhcmUgb3Igbm90KSwgaWYgeW91CisJICogbmVlZCB0byBtb2RpZnkgdGhpcyBzcGVlZCBzZXR0aW5nIGZvciB5b3VyIG93biBwcm9qZWN0CisJICogcGxlYXNlIGFkZCB5b3VyIG93biBjaGlwdHlwZSBhbmQgbW9kaWZ5IHRoZSBjb2RlIGxpa2V3aXNlLgorCSAqIFRoZSBDeXByZXNzIEhJRC0+Q09NIGRldmljZSB3aWxsIHdvcmsgc3VjY2Vzc2Z1bGx5IHVwIHRvCisJICogMTE1MjAwYnBzIChidXQgdGhlIGFjdHVhbCB0aHJvdWdocHV0IGlzIGFyb3VuZCAza0JwcykuCisJICovCisJaWYgKHBvcnQtPnNlcmlhbC0+ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfTE9XKSB7CisJCS8qCisJCSAqIE1pa2UgSXNlbHkgPGlzZWx5QHBvYm94LmNvbT4gMi1GZWItMjAwODogVGhlCisJCSAqIEN5cHJlc3MgYXBwIG5vdGUgdGhhdCBkZXNjcmliZXMgdGhpcyBtZWNoYW5pc20KKwkJICogc3RhdGVzIHRoZSB0aGUgbG93LXNwZWVkIHBhcnQgY2FuJ3QgaGFuZGxlIG1vcmUKKwkJICogdGhhbiA4MDAgYnl0ZXMvc2VjLCBpbiB3aGljaCBjYXNlIDQ4MDAgYmF1ZCBpcyB0aGUKKwkJICogc2FmZXN0IHNwZWVkIGZvciBhIHBhcnQgbGlrZSB0aGF0LgorCQkgKi8KKwkJaWYgKG5ld19yYXRlID4gNDgwMCkgeworCQkJZGJnKCIlcyAtIGZhaWxlZCBzZXR0aW5nIGJhdWQgcmF0ZSwgZGV2aWNlIGluY2FwYWJsZSAiCisJCQkgICAgInNwZWVkICVkIiwgX19mdW5jX18sIG5ld19yYXRlKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlzd2l0Y2ggKHByaXYtPmNoaXB0eXBlKSB7CisJY2FzZSBDVF9FQVJUSE1BVEU6CisJCWlmIChuZXdfcmF0ZSA8PSA2MDApIHsKKwkJCS8qIDMwMCBhbmQgNjAwIGJhdWQgcmF0ZXMgYXJlIHN1cHBvcnRlZCB1bmRlcgorCQkJICogdGhlIGdlbmVyaWMgZmlybXdhcmUsIGJ1dCBhcmUgbm90IHVzZWQgd2l0aAorCQkJICogTk1FQSBhbmQgU2lSRiBwcm90b2NvbHMgKi8KKwkJCWRiZygiJXMgLSBmYWlsZWQgc2V0dGluZyBiYXVkIHJhdGUsIHVuc3VwcG9ydGVkIHNwZWVkICIKKwkJCSAgICAib2YgJWQgb24gRWFydGhtYXRlIEdQUyIsIF9fZnVuY19fLCBuZXdfcmF0ZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiBuZXdfcmF0ZTsKK30KKworCiAvKiBUaGlzIGZ1bmN0aW9uIGNhbiBlaXRoZXIgc2V0IG9yIHJldHJpZXZlIHRoZSBjdXJyZW50IHNlcmlhbCBsaW5lIHNldHRpbmdzICovCi1zdGF0aWMgaW50IGN5cHJlc3Nfc2VyaWFsX2NvbnRyb2wgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHVuc2lnbmVkIGJhdWRfbWFzaywgaW50IGRhdGFfYml0cywgaW50IHN0b3BfYml0cywKK3N0YXRpYyBpbnQgY3lwcmVzc19zZXJpYWxfY29udHJvbCAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3BlZWRfdCBiYXVkX3JhdGUsIGludCBkYXRhX2JpdHMsIGludCBzdG9wX2JpdHMsCiAJCQkJICAgaW50IHBhcml0eV9lbmFibGUsIGludCBwYXJpdHlfdHlwZSwgaW50IHJlc2V0LCBpbnQgY3lwcmVzc19yZXF1ZXN0X3R5cGUpCiB7CiAJaW50IG5ld19iYXVkcmF0ZSA9IDAsIHJldHZhbCA9IDAsIHRyaWVzID0gMDsKIAlzdHJ1Y3QgY3lwcmVzc19wcml2YXRlICpwcml2OwotCV9fdTggZmVhdHVyZV9idWZmZXJbOF07CisJX191OCBmZWF0dXJlX2J1ZmZlcls1XTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAkKIAlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCkBAIC0zMDIsNTggKzMzOSwyMyBAQAogCiAJc3dpdGNoKGN5cHJlc3NfcmVxdWVzdF90eXBlKSB7CiAJCWNhc2UgQ1lQUkVTU19TRVRfQ09ORklHOgotCi0JCQkvKgotCQkJICogVGhlIGdlbmVyYWwgcHVycG9zZSBmaXJtd2FyZSBmb3IgdGhlIEN5cHJlc3MgTTggYWxsb3dzIGZvciBhIG1heGltdW0gc3BlZWQKLSAJCQkgKiBvZiA1NzYwMGJwcyAoSSBoYXZlIG5vIGlkZWEgd2hldGhlciBEZUxvcm1lIGNob3NlIHRvIHVzZSB0aGUgZ2VuZXJhbCBwdXJwb3NlCi0JCQkgKiBmaXJtd2FyZSBvciBub3QpLCBpZiB5b3UgbmVlZCB0byBtb2RpZnkgdGhpcyBzcGVlZCBzZXR0aW5nIGZvciB5b3VyIG93bgotCQkJICogcHJvamVjdCBwbGVhc2UgYWRkIHlvdXIgb3duIGNoaXB0eXBlIGFuZCBtb2RpZnkgdGhlIGNvZGUgbGlrZXdpc2UuICBUaGUKLQkJCSAqIEN5cHJlc3MgSElELT5DT00gZGV2aWNlIHdpbGwgd29yayBzdWNjZXNzZnVsbHkgdXAgdG8gMTE1MjAwYnBzIChidXQgdGhlCi0JCQkgKiBhY3R1YWwgdGhyb3VnaHB1dCBpcyBhcm91bmQgM2tCcHMpLgotCQkJICovCi0JCQlpZiAoYmF1ZF9tYXNrICE9IHByaXYtPmNicl9tYXNrKSB7Ci0JCQkJZGJnKCIlcyAtIGJhdWQgcmF0ZSBpcyBjaGFuZ2luZyIsIF9fRlVOQ1RJT05fXyk7Ci0JCQkJaWYgKCBwcml2LT5jaGlwdHlwZSA9PSBDVF9FQVJUSE1BVEUgKSB7Ci0JCQkJCS8qIDMwMCBhbmQgNjAwIGJhdWQgcmF0ZXMgYXJlIHN1cHBvcnRlZCB1bmRlciB0aGUgZ2VuZXJpYyBmaXJtd2FyZSwKLQkJCQkJICogYnV0IGFyZSBub3QgdXNlZCB3aXRoIE5NRUEgYW5kIFNpUkYgcHJvdG9jb2xzICovCi0JCQkJCQotCQkJCQlpZiAoIChiYXVkX21hc2sgPT0gQjMwMCkgfHwgKGJhdWRfbWFzayA9PSBCNjAwKSApIHsKLQkJCQkJCWVycigiJXMgLSBmYWlsZWQgc2V0dGluZyBiYXVkIHJhdGUsIHVuc3VwcG9ydGVkIHNwZWVkIiwKLQkJCQkJCSAgICBfX0ZVTkNUSU9OX18pOwotCQkJCQkJbmV3X2JhdWRyYXRlID0gcHJpdi0+YmF1ZF9yYXRlOwotCQkJCQl9IGVsc2UgaWYgKCAobmV3X2JhdWRyYXRlID0gbWFza190b19yYXRlKGJhdWRfbWFzaykpID09IC0xKSB7Ci0JCQkJCQllcnIoIiVzIC0gZmFpbGVkIHNldHRpbmcgYmF1ZCByYXRlLCB1bnN1cHBvcnRlZCBzcGVlZCIsCi0JCQkJCQkgICAgX19GVU5DVElPTl9fKTsKLQkJCQkJCW5ld19iYXVkcmF0ZSA9IHByaXYtPmJhdWRfcmF0ZTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAocHJpdi0+Y2hpcHR5cGUgPT0gQ1RfQ1lQSElEQ09NKSB7Ci0JCQkJCWlmICggKG5ld19iYXVkcmF0ZSA9IG1hc2tfdG9fcmF0ZShiYXVkX21hc2spKSA9PSAtMSkgewotCQkJCQkJZXJyKCIlcyAtIGZhaWxlZCBzZXR0aW5nIGJhdWQgcmF0ZSwgdW5zdXBwb3J0ZWQgc3BlZWQiLAotCQkJCQkJICAgIF9fRlVOQ1RJT05fXyk7Ci0JCQkJCQluZXdfYmF1ZHJhdGUgPSBwcml2LT5iYXVkX3JhdGU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHByaXYtPmNoaXB0eXBlID09IENUX0NBNDJWMikgewotCQkJCQlpZiAoIChuZXdfYmF1ZHJhdGUgPSBtYXNrX3RvX3JhdGUoYmF1ZF9tYXNrKSkgPT0gLTEpIHsKLQkJCQkJCWVycigiJXMgLSBmYWlsZWQgc2V0dGluZyBiYXVkIHJhdGUsIHVuc3VwcG9ydGVkIHNwZWVkIiwKLQkJCQkJCSAgICBfX0ZVTkNUSU9OX18pOwotCQkJCQkJbmV3X2JhdWRyYXRlID0gcHJpdi0+YmF1ZF9yYXRlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChwcml2LT5jaGlwdHlwZSA9PSBDVF9HRU5FUklDKSB7Ci0JCQkJCWlmICggKG5ld19iYXVkcmF0ZSA9IG1hc2tfdG9fcmF0ZShiYXVkX21hc2spKSA9PSAtMSkgewotCQkJCQkJZXJyKCIlcyAtIGZhaWxlZCBzZXR0aW5nIGJhdWQgcmF0ZSwgdW5zdXBwb3J0ZWQgc3BlZWQiLAotCQkJCQkJICAgIF9fRlVOQ1RJT05fXyk7Ci0JCQkJCQluZXdfYmF1ZHJhdGUgPSBwcml2LT5iYXVkX3JhdGU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpbmZvKCIlcyAtIHBsZWFzZSBkZWZpbmUgeW91ciBjaGlwdHlwZSIsIF9fRlVOQ1RJT05fXyk7Ci0JCQkJCW5ld19iYXVkcmF0ZSA9IHByaXYtPmJhdWRfcmF0ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgeyAgLyogYmF1ZCByYXRlIG5vdCBjaGFuZ2luZywga2VlcCB0aGUgb2xkICovCisJCQluZXdfYmF1ZHJhdGUgPSBwcml2LT5iYXVkX3JhdGU7CisJCQkvKiAwIG1lYW5zICdIYW5nIHVwJyBzbyBkb2Vzbid0IGNoYW5nZSB0aGUgdHJ1ZSBiaXQgcmF0ZSAqLworCQkJaWYgKGJhdWRfcmF0ZSA9PSAwKQogCQkJCW5ld19iYXVkcmF0ZSA9IHByaXYtPmJhdWRfcmF0ZTsKKwkJCS8qIENoYW5nZSBvZiBzcGVlZCA/ICovCisJCQllbHNlIGlmIChiYXVkX3JhdGUgIT0gcHJpdi0+YmF1ZF9yYXRlKSB7CisJCQkJZGJnKCIlcyAtIGJhdWQgcmF0ZSBpcyBjaGFuZ2luZyIsIF9fZnVuY19fKTsKKwkJCQlyZXR2YWwgPSBhbmFseXplX2JhdWRfcmF0ZShwb3J0LCBiYXVkX3JhdGUpOworCQkJCWlmIChyZXR2YWwgPj0gIDApIHsKKwkJCQkJbmV3X2JhdWRyYXRlID0gcmV0dmFsOworCQkJCQlkYmcoIiVzIC0gTmV3IGJhdWQgcmF0ZSBzZXQgdG8gJWQiLAorCQkJCQkgICAgX19mdW5jX18sIG5ld19iYXVkcmF0ZSk7CisJCQkJfQogCQkJfQotCQkJZGJnKCIlcyAtIGJhdWQgcmF0ZSBpcyBiZWluZyBzZW50IGFzICVkIiwgX19GVU5DVElPTl9fLCBuZXdfYmF1ZHJhdGUpOworCQkJZGJnKCIlcyAtIGJhdWQgcmF0ZSBpcyBiZWluZyBzZW50IGFzICVkIiwgX19mdW5jX18sIG5ld19iYXVkcmF0ZSk7CiAJCQkKLQkJCW1lbXNldChmZWF0dXJlX2J1ZmZlciwgMCwgOCk7CisJCQltZW1zZXQoZmVhdHVyZV9idWZmZXIsIDAsIHNpemVvZihmZWF0dXJlX2J1ZmZlcikpOwogCQkJLyogZmlsbCB0aGUgZmVhdHVyZV9idWZmZXIgd2l0aCBuZXcgY29uZmlndXJhdGlvbiAqLwogCQkJKigodV9pbnQzMl90ICopZmVhdHVyZV9idWZmZXIpID0gbmV3X2JhdWRyYXRlOwogCkBAIC0zNjUsNDggKzM2Nyw2NSBAQAogCQkJLyogMSBiaXQgZ2FwICovCiAJCQlmZWF0dXJlX2J1ZmZlcls0XSB8PSAocmVzZXQgPDwgNyk7ICAgLyogYXNzaWduIHJlc2V0IGF0IGVuZCBvZiBieXRlLCAxIGJpdCBzcGFjZSAqLwogCQkJCQotCQkJZGJnKCIlcyAtIGRldmljZSBpcyBiZWluZyBzZW50IHRoaXMgZmVhdHVyZSByZXBvcnQ6IiwgX19GVU5DVElPTl9fKTsKLQkJCWRiZygiJXMgLSAlMDJYIC0gJTAyWCAtICUwMlggLSAlMDJYIC0gJTAyWCIsIF9fRlVOQ1RJT05fXywgZmVhdHVyZV9idWZmZXJbMF0sIGZlYXR1cmVfYnVmZmVyWzFdLAorCQkJZGJnKCIlcyAtIGRldmljZSBpcyBiZWluZyBzZW50IHRoaXMgZmVhdHVyZSByZXBvcnQ6IiwgX19mdW5jX18pOworCQkJZGJnKCIlcyAtICUwMlggLSAlMDJYIC0gJTAyWCAtICUwMlggLSAlMDJYIiwgX19mdW5jX18sIGZlYXR1cmVfYnVmZmVyWzBdLCBmZWF0dXJlX2J1ZmZlclsxXSwKIAkJICAgICAgICAgICAgZmVhdHVyZV9idWZmZXJbMl0sIGZlYXR1cmVfYnVmZmVyWzNdLCBmZWF0dXJlX2J1ZmZlcls0XSk7CiAJCQkKIAkJCWRvIHsKLQkJCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyAocG9ydC0+c2VyaWFsLT5kZXYsIHVzYl9zbmRjdHJscGlwZShwb3J0LT5zZXJpYWwtPmRldiwgMCksCi0JCQkJCSAgCSAgSElEX1JFUV9TRVRfUkVQT1JULCBVU0JfRElSX09VVCB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UgfCBVU0JfVFlQRV9DTEFTUywKLQkJCQkJCSAgCSAgMHgwMzAwLCAwLCBmZWF0dXJlX2J1ZmZlciwgOCwgNTAwKTsKKwkJCQlyZXR2YWwgPSB1c2JfY29udHJvbF9tc2cocG9ydC0+c2VyaWFsLT5kZXYsCisJCQkJCQl1c2Jfc25kY3RybHBpcGUocG9ydC0+c2VyaWFsLT5kZXYsIDApLAorCQkJCQkJSElEX1JFUV9TRVRfUkVQT1JULAorCQkJCQkJVVNCX0RJUl9PVVQgfCBVU0JfUkVDSVBfSU5URVJGQUNFIHwgVVNCX1RZUEVfQ0xBU1MsCisJCQkJCQkweDAzMDAsIDAsIGZlYXR1cmVfYnVmZmVyLAorCQkJCQkJc2l6ZW9mKGZlYXR1cmVfYnVmZmVyKSwgNTAwKTsKIAogCQkJCWlmICh0cmllcysrID49IDMpCiAJCQkJCWJyZWFrOwogCi0JCQl9IHdoaWxlIChyZXR2YWwgIT0gOCAmJiByZXR2YWwgIT0gLUVOT0RFVik7CisJCQl9IHdoaWxlIChyZXR2YWwgIT0gc2l6ZW9mKGZlYXR1cmVfYnVmZmVyKSAmJgorCQkJCSByZXR2YWwgIT0gLUVOT0RFVik7CiAKLQkJCWlmIChyZXR2YWwgIT0gOCkgewotCQkJCWVycigiJXMgLSBmYWlsZWQgc2VuZGluZyBzZXJpYWwgbGluZSBzZXR0aW5ncyAtICVkIiwgX19GVU5DVElPTl9fLCByZXR2YWwpOworCQkJaWYgKHJldHZhbCAhPSBzaXplb2YoZmVhdHVyZV9idWZmZXIpKSB7CisJCQkJZXJyKCIlcyAtIGZhaWxlZCBzZW5kaW5nIHNlcmlhbCBsaW5lIHNldHRpbmdzIC0gJWQiLCBfX2Z1bmNfXywgcmV0dmFsKTsKIAkJCQljeXByZXNzX3NldF9kZWFkKHBvcnQpOwogCQkJfSBlbHNlIHsKIAkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCQkJCXByaXYtPmJhdWRfcmF0ZSA9IG5ld19iYXVkcmF0ZTsKLQkJCQlwcml2LT5jYnJfbWFzayA9IGJhdWRfbWFzazsKIAkJCQlwcml2LT5jdXJyZW50X2NvbmZpZyA9IGZlYXR1cmVfYnVmZmVyWzRdOwogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJCQkvKiBJZiB3ZSBhc2tlZCBmb3IgYSBzcGVlZCBjaGFuZ2UgZW5jb2RlIGl0ICovCisJCQkJaWYgKGJhdWRfcmF0ZSkKKwkJCQkJdHR5X2VuY29kZV9iYXVkX3JhdGUocG9ydC0+dHR5LAorCQkJCQkJCW5ld19iYXVkcmF0ZSwgbmV3X2JhdWRyYXRlKTsKIAkJCX0KIAkJYnJlYWs7CiAJCWNhc2UgQ1lQUkVTU19HRVRfQ09ORklHOgotCQkJZGJnKCIlcyAtIHJldHJlaXZpbmcgc2VyaWFsIGxpbmUgc2V0dGluZ3MiLCBfX0ZVTkNUSU9OX18pOworCQkJaWYgKHByaXYtPmdldF9jZmdfdW5zYWZlKSB7CisJCQkJLyogTm90IGltcGxlbWVudGVkIGZvciB0aGlzIGRldmljZSwKKwkJCQkgICBhbmQgaWYgd2UgdHJ5IHRvIGRvIGl0IHdlJ3JlIGxpa2VseQorCQkJCSAgIHRvIGNyYXNoIHRoZSBoYXJkd2FyZS4gKi8KKwkJCQlyZXR1cm4gLUVOT1RUWTsKKwkJCX0KKwkJCWRiZygiJXMgLSByZXRyZWl2aW5nIHNlcmlhbCBsaW5lIHNldHRpbmdzIiwgX19mdW5jX18pOwogCQkJLyogc2V0IGluaXRpYWwgdmFsdWVzIGluIGZlYXR1cmUgYnVmZmVyICovCi0JCQltZW1zZXQoZmVhdHVyZV9idWZmZXIsIDAsIDgpOworCQkJbWVtc2V0KGZlYXR1cmVfYnVmZmVyLCAwLCBzaXplb2YoZmVhdHVyZV9idWZmZXIpKTsKIAogCQkJZG8gewotCQkJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnIChwb3J0LT5zZXJpYWwtPmRldiwgdXNiX3JjdmN0cmxwaXBlKHBvcnQtPnNlcmlhbC0+ZGV2LCAwKSwKLQkJCQkJCSAgSElEX1JFUV9HRVRfUkVQT1JULCBVU0JfRElSX0lOIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9UWVBFX0NMQVNTLAotCQkJCQkJCSAgMHgwMzAwLCAwLCBmZWF0dXJlX2J1ZmZlciwgOCwgNTAwKTsKLQkJCQkKKwkJCQlyZXR2YWwgPSB1c2JfY29udHJvbF9tc2cocG9ydC0+c2VyaWFsLT5kZXYsCisJCQkJCQl1c2JfcmN2Y3RybHBpcGUocG9ydC0+c2VyaWFsLT5kZXYsIDApLAorCQkJCQkJSElEX1JFUV9HRVRfUkVQT1JULAorCQkJCQkJVVNCX0RJUl9JTiB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UgfCBVU0JfVFlQRV9DTEFTUywKKwkJCQkJCTB4MDMwMCwgMCwgZmVhdHVyZV9idWZmZXIsCisJCQkJCQlzaXplb2YoZmVhdHVyZV9idWZmZXIpLCA1MDApOworCiAJCQkJaWYgKHRyaWVzKysgPj0gMykKIAkJCQkJYnJlYWs7CiAKLQkJCX0gd2hpbGUgKHJldHZhbCAhPSA1ICYmIHJldHZhbCAhPSAtRU5PREVWKTsKKwkJCX0gd2hpbGUgKHJldHZhbCAhPSBzaXplb2YoZmVhdHVyZV9idWZmZXIpICYmCisJCQkJIHJldHZhbCAhPSAtRU5PREVWKTsKIAotCQkJaWYgKHJldHZhbCAhPSA1KSB7Ci0JCQkJZXJyKCIlcyAtIGZhaWxlZCB0byByZXRyaWV2ZSBzZXJpYWwgbGluZSBzZXR0aW5ncyAtICVkIiwgX19GVU5DVElPTl9fLCByZXR2YWwpOworCQkJaWYgKHJldHZhbCAhPSBzaXplb2YoZmVhdHVyZV9idWZmZXIpKSB7CisJCQkJZXJyKCIlcyAtIGZhaWxlZCB0byByZXRyaWV2ZSBzZXJpYWwgbGluZSBzZXR0aW5ncyAtICVkIiwgX19mdW5jX18sIHJldHZhbCk7CiAJCQkJY3lwcmVzc19zZXRfZGVhZChwb3J0KTsKIAkJCQlyZXR1cm4gcmV0dmFsOwogCQkJfSBlbHNlIHsKQEAgLTQxNSw5ICs0MzQsNiBAQAogCQkJCS8qIHN0b3JlIHRoZSBjb25maWcgaW4gb25lIGJ5dGUsIGFuZCBsYXRlciB1c2UgYml0IG1hc2tzIHRvIGNoZWNrIHZhbHVlcyAqLwogCQkJCXByaXYtPmN1cnJlbnRfY29uZmlnID0gZmVhdHVyZV9idWZmZXJbNF07CiAJCQkJcHJpdi0+YmF1ZF9yYXRlID0gKigodV9pbnQzMl90ICopZmVhdHVyZV9idWZmZXIpOwotCQkJCQotCQkJCWlmICggKHByaXYtPmNicl9tYXNrID0gcmF0ZV90b19tYXNrKHByaXYtPmJhdWRfcmF0ZSkpID09IDB4NDApCi0JCQkJCWRiZygiJXMgLSBmYWlsZWQgc2V0dGluZyB0aGUgYmF1ZCBtYXNrIChub3QgZGVmaW5lZCkiLCBfX0ZVTkNUSU9OX18pOwogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAkJCX0KIAl9CkBAIC00NDcsNTEgKzQ2Myw2IEBACiB9CiAKIAotLyogZ2l2ZW4gYSBiYXVkIG1hc2ssIGl0IHdpbGwgcmV0dXJuIGludGVnZXIgYmF1ZCBvbiBzdWNjZXNzICovCi1zdGF0aWMgaW50IG1hc2tfdG9fcmF0ZSAodW5zaWduZWQgbWFzaykKLXsKLQlpbnQgcmF0ZTsKLQotCXN3aXRjaCAobWFzaykgewotCQljYXNlIEIwOiByYXRlID0gMDsgYnJlYWs7Ci0JCWNhc2UgQjMwMDogcmF0ZSA9IDMwMDsgYnJlYWs7Ci0JCWNhc2UgQjYwMDogcmF0ZSA9IDYwMDsgYnJlYWs7Ci0JCWNhc2UgQjEyMDA6IHJhdGUgPSAxMjAwOyBicmVhazsKLQkJY2FzZSBCMjQwMDogcmF0ZSA9IDI0MDA7IGJyZWFrOwotCQljYXNlIEI0ODAwOiByYXRlID0gNDgwMDsgYnJlYWs7Ci0JCWNhc2UgQjk2MDA6IHJhdGUgPSA5NjAwOyBicmVhazsKLQkJY2FzZSBCMTkyMDA6IHJhdGUgPSAxOTIwMDsgYnJlYWs7Ci0JCWNhc2UgQjM4NDAwOiByYXRlID0gMzg0MDA7IGJyZWFrOwotCQljYXNlIEI1NzYwMDogcmF0ZSA9IDU3NjAwOyBicmVhazsKLQkJY2FzZSBCMTE1MjAwOiByYXRlID0gMTE1MjAwOyBicmVhazsKLQkJZGVmYXVsdDogcmF0ZSA9IC0xOwotCX0KLQotCXJldHVybiByYXRlOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCByYXRlX3RvX21hc2sgKGludCByYXRlKQotewotCXVuc2lnbmVkIG1hc2s7Ci0KLQlzd2l0Y2ggKHJhdGUpIHsKLQkJY2FzZSAwOiBtYXNrID0gQjA7IGJyZWFrOwotCQljYXNlIDMwMDogbWFzayA9IEIzMDA7IGJyZWFrOwotCQljYXNlIDYwMDogbWFzayA9IEI2MDA7IGJyZWFrOwotCQljYXNlIDEyMDA6IG1hc2sgPSBCMTIwMDsgYnJlYWs7Ci0JCWNhc2UgMjQwMDogbWFzayA9IEIyNDAwOyBicmVhazsKLQkJY2FzZSA0ODAwOiBtYXNrID0gQjQ4MDA7IGJyZWFrOwotCQljYXNlIDk2MDA6IG1hc2sgPSBCOTYwMDsgYnJlYWs7Ci0JCWNhc2UgMTkyMDA6IG1hc2sgPSBCMTkyMDA7IGJyZWFrOwotCQljYXNlIDM4NDAwOiBtYXNrID0gQjM4NDAwOyBicmVhazsKLQkJY2FzZSA1NzYwMDogbWFzayA9IEI1NzYwMDsgYnJlYWs7Ci0JCWNhc2UgMTE1MjAwOiBtYXNrID0gQjExNTIwMDsgYnJlYWs7Ci0JCWRlZmF1bHQ6IG1hc2sgPSAweDQwOwotCX0KLQotCXJldHVybiBtYXNrOwotfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBDeXByZXNzIHNlcmlhbCBkcml2ZXIgZnVuY3Rpb25zCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC01MDIsNyArNDczLDcgQEAKIAlzdHJ1Y3QgY3lwcmVzc19wcml2YXRlICpwcml2OwogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSBzZXJpYWwtPnBvcnRbMF07CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mIChzdHJ1Y3QgY3lwcmVzc19wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcml2KQpAQCAtNTIzLDE3ICs0OTQsMjcgQEAKIAlwcml2LT5saW5lX2NvbnRyb2wgPSAwOwogCXByaXYtPnRlcm1pb3NfaW5pdGlhbGl6ZWQgPSAwOwogCXByaXYtPnJ4X2ZsYWdzID0gMDsKLQlwcml2LT5jYnJfbWFzayA9IEIzMDA7CisJLyogRGVmYXVsdCBwYWNrZXQgZm9ybWF0IHNldHRpbmcgaXMgZGV0ZXJtaW5lZCBieSBwYWNrZXQgc2l6ZS4KKwkgICBBbnl0aGluZyB3aXRoIGEgc2l6ZSBsYXJnZXIgdGhlbiA5IG11c3QgaGF2ZSBhIHNlcGFyYXRlCisJICAgY291bnQgZmllbGQgc2luY2UgdGhlIDMgYml0IGNvdW50IGZpZWxkIGlzIG90aGVyd2lzZSB0b28KKwkgICBzbWFsbC4gIE90aGVyd2lzZSB3ZSBjYW4gdXNlIHRoZSBzbGlnaHRseSBtb3JlIGNvbXBhY3QKKwkgICBmb3JtYXQuICBUaGlzIGlzIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgY3lwcmVzc19tOCBzZXJpYWwKKwkgICBjb252ZXJ0ZXIgYXBwIG5vdGUuICovCisJaWYgKHBvcnQtPmludGVycnVwdF9vdXRfc2l6ZSA+IDkpIHsKKwkJcHJpdi0+cGt0X2ZtdCA9IHBhY2tldF9mb3JtYXRfMTsKKwl9IGVsc2UgeworCQlwcml2LT5wa3RfZm10ID0gcGFja2V0X2Zvcm1hdF8yOworCX0KIAlpZiAoaW50ZXJ2YWwgPiAwKSB7CiAJCXByaXYtPndyaXRlX3VyYl9pbnRlcnZhbCA9IGludGVydmFsOwogCQlwcml2LT5yZWFkX3VyYl9pbnRlcnZhbCA9IGludGVydmFsOwogCQlkYmcoIiVzIC0gcG9ydCAlZCByZWFkICYgd3JpdGUgaW50ZXJ2YWxzIGZvcmNlZCB0byAlZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18scG9ydC0+bnVtYmVyLGludGVydmFsKTsKKwkJICAgIF9fZnVuY19fLHBvcnQtPm51bWJlcixpbnRlcnZhbCk7CiAJfSBlbHNlIHsKIAkJcHJpdi0+d3JpdGVfdXJiX2ludGVydmFsID0gcG9ydC0+aW50ZXJydXB0X291dF91cmItPmludGVydmFsOwogCQlwcml2LT5yZWFkX3VyYl9pbnRlcnZhbCA9IHBvcnQtPmludGVycnVwdF9pbl91cmItPmludGVydmFsOwogCQlkYmcoIiVzIC0gcG9ydCAlZCBpbnRlcnZhbHM6IHJlYWQ9JWQgd3JpdGU9JWQiLAotCQkgICAgX19GVU5DVElPTl9fLHBvcnQtPm51bWJlciwKKwkJICAgIF9fZnVuY19fLHBvcnQtPm51bWJlciwKIAkJICAgIHByaXYtPnJlYWRfdXJiX2ludGVydmFsLHByaXYtPndyaXRlX3VyYl9pbnRlcnZhbCk7CiAJfQogCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0LCBwcml2KTsKQEAgLTU0NSwxNyArNTI2LDMwIEBACiBzdGF0aWMgaW50IGN5cHJlc3NfZWFydGhtYXRlX3N0YXJ0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7CiAJc3RydWN0IGN5cHJlc3NfcHJpdmF0ZSAqcHJpdjsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gc2VyaWFsLT5wb3J0WzBdOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCWlmIChnZW5lcmljX3N0YXJ0dXAoc2VyaWFsKSkgewotCQlkYmcoIiVzIC0gRmFpbGVkIHNldHRpbmcgdXAgcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywKLQkJCQlzZXJpYWwtPnBvcnRbMF0tPm51bWJlcik7CisJCWRiZygiJXMgLSBGYWlsZWQgc2V0dGluZyB1cCBwb3J0ICVkIiwgX19mdW5jX18sCisJCQkJcG9ydC0+bnVtYmVyKTsKIAkJcmV0dXJuIDE7CiAJfQogCi0JcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0pOworCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJcHJpdi0+Y2hpcHR5cGUgPSBDVF9FQVJUSE1BVEU7CisJLyogQWxsIEVhcnRobWF0ZSBkZXZpY2VzIHVzZSB0aGUgc2VwYXJhdGVkLWNvdW50IHBhY2tldAorCSAgIGZvcm1hdCEgIElkaW90aWMuICovCisJcHJpdi0+cGt0X2ZtdCA9IHBhY2tldF9mb3JtYXRfMTsKKwlpZiAoc2VyaWFsLT5kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0ICE9IFBST0RVQ1RfSURfRUFSVEhNQVRFVVNCKSB7CisJCS8qIFRoZSBvbGQgb3JpZ2luYWwgVVNCIEVhcnRobWF0ZSBzZWVtZWQgYWJsZSB0bworCQkgICBoYW5kbGUgR0VUX0NPTkZJRyByZXF1ZXN0czsgZXZlcnl0aGluZyB0aGV5J3ZlCisJCSAgIHByb2R1Y2VkIHNpbmNlIHRoYXQgdGltZSBjcmFzaGVzIGlmIHRoaXMgY29tbWFuZCBpcworCQkgICBhdHRlbXB0ZWQgOi0oICovCisJCWRiZygiJXMgLSBNYXJraW5nIHRoaXMgZGV2aWNlIGFzIHVuc2FmZSBmb3IgR0VUX0NPTkZJRyAiCisJCSAgICAiY29tbWFuZHMiLCBfX2Z1bmNfXyk7CisJCXByaXYtPmdldF9jZmdfdW5zYWZlID0gITA7CisJfQogCiAJcmV0dXJuIDA7CiB9IC8qIGN5cHJlc3NfZWFydGhtYXRlX3N0YXJ0dXAgKi8KQEAgLTU2NSwxMCArNTU5LDEwIEBACiB7CiAJc3RydWN0IGN5cHJlc3NfcHJpdmF0ZSAqcHJpdjsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlpZiAoZ2VuZXJpY19zdGFydHVwKHNlcmlhbCkpIHsKLQkJZGJnKCIlcyAtIEZhaWxlZCBzZXR0aW5nIHVwIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgLSBGYWlsZWQgc2V0dGluZyB1cCBwb3J0ICVkIiwgX19mdW5jX18sCiAJCQkJc2VyaWFsLT5wb3J0WzBdLT5udW1iZXIpOwogCQlyZXR1cm4gMTsKIAl9CkBAIC01ODQsMTAgKzU3OCwxMCBAQAogewogCXN0cnVjdCBjeXByZXNzX3ByaXZhdGUgKnByaXY7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJaWYgKGdlbmVyaWNfc3RhcnR1cChzZXJpYWwpKSB7Ci0JCWRiZygiJXMgLSBGYWlsZWQgc2V0dGluZyB1cCBwb3J0ICVkIiwgX19GVU5DVElPTl9fLAorCQlkYmcoIiVzIC0gRmFpbGVkIHNldHRpbmcgdXAgcG9ydCAlZCIsIF9fZnVuY19fLAogCQkJCXNlcmlhbC0+cG9ydFswXS0+bnVtYmVyKTsKIAkJcmV0dXJuIDE7CiAJfQpAQCAtNjAzLDcgKzU5Nyw3IEBACiB7CiAJc3RydWN0IGN5cHJlc3NfcHJpdmF0ZSAqcHJpdjsKIAotCWRiZyAoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgc2VyaWFsLT5wb3J0WzBdLT5udW1iZXIpOworCWRiZyAoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBzZXJpYWwtPnBvcnRbMF0tPm51bWJlcik7CiAKIAkvKiBhbGwgb3BlbiBwb3J0cyBhcmUgY2xvc2VkIGF0IHRoaXMgcG9pbnQgKi8KIApAQCAtNjI0LDcgKzYxOCw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmVzdWx0ID0gMDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoIXByaXYtPmNvbW1faXNfb2spCiAJCXJldHVybiAtRUlPOwpAQCAtNjUyLDE2ICs2NDYsMTYgQEAKIAlyZXN1bHQgPSBjeXByZXNzX3dyaXRlKHBvcnQsIE5VTEwsIDApOwogCiAJaWYgKHJlc3VsdCkgewotCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzZXR0aW5nIHRoZSBjb250cm9sIGxpbmVzIC0gZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc2V0dGluZyB0aGUgY29udHJvbCBsaW5lcyAtIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9IGVsc2UKLQkJZGJnKCIlcyAtIHN1Y2Nlc3Mgc2V0dGluZyB0aGUgY29udHJvbCBsaW5lcyIsIF9fRlVOQ1RJT05fXyk7CQorCQlkYmcoIiVzIC0gc3VjY2VzcyBzZXR0aW5nIHRoZSBjb250cm9sIGxpbmVzIiwgX19mdW5jX18pOwogCiAJY3lwcmVzc19zZXRfdGVybWlvcyhwb3J0LCAmcHJpdi0+dG1wX3Rlcm1pb3MpOwogCiAJLyogc2V0dXAgdGhlIHBvcnQgYW5kIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgZGV2aWNlICovCiAJaWYoIXBvcnQtPmludGVycnVwdF9pbl91cmIpewotCQllcnIoIiVzIC0gaW50ZXJydXB0X2luX3VyYiBpcyBlbXB0eSEiLCBfX0ZVTkNUSU9OX18pOworCQllcnIoIiVzIC0gaW50ZXJydXB0X2luX3VyYiBpcyBlbXB0eSEiLCBfX2Z1bmNfXyk7CiAJCXJldHVybigtMSk7CiAJfQogCkBAIC02NzIsNyArNjY2LDcgQEAKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfS0VSTkVMKTsKIAogCWlmIChyZXN1bHQpewotCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCWN5cHJlc3Nfc2V0X2RlYWQocG9ydCk7CiAJfQogCkBAIC02ODgsNyArNjgyLDcgQEAKIAlsb25nIHRpbWVvdXQ7CiAJd2FpdF9xdWV1ZV90IHdhaXQ7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyogd2FpdCBmb3IgZGF0YSB0byBkcmFpbiBmcm9tIGJ1ZmZlciAqLwogCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOwpAQCAtNzI2LDcgKzcyMCw3IEBACiAJCXRpbWVvdXQgPSAyKkhaOwogCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0aW1lb3V0KTsKIAotCWRiZygiJXMgLSBzdG9wcGluZyB1cmJzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gc3RvcHBpbmcgdXJicyIsIF9fZnVuY19fKTsKIAl1c2Jfa2lsbF91cmIgKHBvcnQtPmludGVycnVwdF9pbl91cmIpOwogCXVzYl9raWxsX3VyYiAocG9ydC0+aW50ZXJydXB0X291dF91cmIpOwogCkBAIC03NTUsNyArNzQ5LDcgQEAKIAlzdHJ1Y3QgY3lwcmVzc19wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCi0JZGJnKCIlcyAtIHBvcnQgJWQsICVkIGJ5dGVzIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIGNvdW50KTsKKwlkYmcoIiVzIC0gcG9ydCAlZCwgJWQgYnl0ZXMiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCBjb3VudCk7CiAKIAkvKiBsaW5lIGNvbnRyb2wgY29tbWFuZHMsIHdoaWNoIG5lZWQgdG8gYmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHksCiAJICAgYXJlIG5vdCBwdXQgaW50byB0aGUgYnVmZmVyIGZvciBvYnZpb3VzIHJlYXNvbnMuCkBAIC03ODgsMTIgKzc4MiwxMiBAQAogCWlmICghcHJpdi0+Y29tbV9pc19vaykKIAkJcmV0dXJuOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7Ci0JZGJnKCIlcyAtIGludGVycnVwdCBvdXQgc2l6ZSBpcyAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+aW50ZXJydXB0X291dF9zaXplKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBpbnRlcnJ1cHQgb3V0IHNpemUgaXMgJWQiLCBfX2Z1bmNfXywgcG9ydC0+aW50ZXJydXB0X291dF9zaXplKTsKIAkKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCWlmIChwcml2LT53cml0ZV91cmJfaW5fdXNlKSB7Ci0JCWRiZygiJXMgLSBjYW4ndCB3cml0ZSwgdXJiIGluIHVzZSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBjYW4ndCB3cml0ZSwgdXJiIGluIHVzZSIsIF9fZnVuY19fKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCQlyZXR1cm47CiAJfQpAQCAtODAzLDIxICs3OTcsMTggQEAKIAltZW1zZXQocG9ydC0+aW50ZXJydXB0X291dF91cmItPnRyYW5zZmVyX2J1ZmZlciwgMCwgcG9ydC0+aW50ZXJydXB0X291dF9zaXplKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0Jc3dpdGNoIChwb3J0LT5pbnRlcnJ1cHRfb3V0X3NpemUpIHsKLQkJY2FzZSAzMjoKLQkJCS8qIHRoaXMgaXMgZm9yIHRoZSBDWTdDNjQwMTMuLi4gKi8KLQkJCW9mZnNldCA9IDI7Ci0JCQlwb3J0LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlclswXSA9IHByaXYtPmxpbmVfY29udHJvbDsKLQkJCWJyZWFrOwotCQljYXNlIDg6Ci0JCQkvKiB0aGlzIGlzIGZvciB0aGUgQ1k3QzYzNzQzLi4uICovCi0JCQlvZmZzZXQgPSAxOwotCQkJcG9ydC0+aW50ZXJydXB0X291dF9idWZmZXJbMF0gPSBwcml2LT5saW5lX2NvbnRyb2w7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWRiZygiJXMgLSB3cm9uZyBwYWNrZXQgc2l6ZSIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCQlyZXR1cm47CisJc3dpdGNoIChwcml2LT5wa3RfZm10KSB7CisJZGVmYXVsdDoKKwljYXNlIHBhY2tldF9mb3JtYXRfMToKKwkJLyogdGhpcyBpcyBmb3IgdGhlIENZN0M2NDAxMy4uLiAqLworCQlvZmZzZXQgPSAyOworCQlwb3J0LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlclswXSA9IHByaXYtPmxpbmVfY29udHJvbDsKKwkJYnJlYWs7CisJY2FzZSBwYWNrZXRfZm9ybWF0XzI6CisJCS8qIHRoaXMgaXMgZm9yIHRoZSBDWTdDNjM3NDMuLi4gKi8KKwkJb2Zmc2V0ID0gMTsKKwkJcG9ydC0+aW50ZXJydXB0X291dF9idWZmZXJbMF0gPSBwcml2LT5saW5lX2NvbnRyb2w7CisJCWJyZWFrOwogCX0KIAogCWlmIChwcml2LT5saW5lX2NvbnRyb2wgJiBDT05UUk9MX1JFU0VUKQpAQCAtODI1LDcgKzgxNiw3IEBACiAKIAlpZiAocHJpdi0+Y21kX2N0cmwpIHsKIAkJcHJpdi0+Y21kX2NvdW50Kys7Ci0JCWRiZygiJXMgLSBsaW5lIGNvbnRyb2wgY29tbWFuZCBiZWluZyBpc3N1ZWQiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gbGluZSBjb250cm9sIGNvbW1hbmQgYmVpbmcgaXNzdWVkIiwgX19mdW5jX18pOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJCWdvdG8gc2VuZDsKIAl9IGVsc2UKQEAgLTgzOCwxNSArODI5LDE2IEBACiAJCXJldHVybjsKIAl9CiAKLQlzd2l0Y2ggKHBvcnQtPmludGVycnVwdF9vdXRfc2l6ZSkgewotCQljYXNlIDMyOgotCQkJcG9ydC0+aW50ZXJydXB0X291dF9idWZmZXJbMV0gPSBjb3VudDsKLQkJCWJyZWFrOwotCQljYXNlIDg6Ci0JCQlwb3J0LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlclswXSB8PSBjb3VudDsKKwlzd2l0Y2ggKHByaXYtPnBrdF9mbXQpIHsKKwlkZWZhdWx0OgorCWNhc2UgcGFja2V0X2Zvcm1hdF8xOgorCQlwb3J0LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlclsxXSA9IGNvdW50OworCQlicmVhazsKKwljYXNlIHBhY2tldF9mb3JtYXRfMjoKKwkJcG9ydC0+aW50ZXJydXB0X291dF9idWZmZXJbMF0gfD0gY291bnQ7CiAJfQogCi0JZGJnKCIlcyAtIGNvdW50IGlzICVkIiwgX19GVU5DVElPTl9fLCBjb3VudCk7CisJZGJnKCIlcyAtIGNvdW50IGlzICVkIiwgX19mdW5jX18sIGNvdW50KTsKIAogc2VuZDoKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwpAQCAtODU2LDkgKzg0OCwxMCBAQAogCWlmIChwcml2LT5jbWRfY3RybCkKIAkJYWN0dWFsX3NpemUgPSAxOwogCWVsc2UKLQkJYWN0dWFsX3NpemUgPSBjb3VudCArIChwb3J0LT5pbnRlcnJ1cHRfb3V0X3NpemUgPT0gMzIgPyAyIDogMSk7Ci0JCi0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIHBvcnQtPmludGVycnVwdF9vdXRfc2l6ZSwKKwkJYWN0dWFsX3NpemUgPSBjb3VudCArCisJCQkgICAgICAocHJpdi0+cGt0X2ZtdCA9PSBwYWNrZXRfZm9ybWF0XzEgPyAyIDogMSk7CisKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLCBwb3J0LT5pbnRlcnJ1cHRfb3V0X3NpemUsCiAJCQkgICAgICBwb3J0LT5pbnRlcnJ1cHRfb3V0X3VyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIAogCXVzYl9maWxsX2ludF91cmIocG9ydC0+aW50ZXJydXB0X291dF91cmIsIHBvcnQtPnNlcmlhbC0+ZGV2LApAQCAtODY3LDcgKzg2MCw3IEBACiAJCWN5cHJlc3Nfd3JpdGVfaW50X2NhbGxiYWNrLCBwb3J0LCBwcml2LT53cml0ZV91cmJfaW50ZXJ2YWwpOwogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiIChwb3J0LT5pbnRlcnJ1cHRfb3V0X3VyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlc3VsdCkgewotCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkXG4iLCBfX2Z1bmNfXywKIAkJCXJlc3VsdCk7CiAJCXByaXYtPndyaXRlX3VyYl9pbl91c2UgPSAwOwogCQljeXByZXNzX3NldF9kZWFkKHBvcnQpOwpAQCAtODkxLDEzICs4ODQsMTMgQEAKIAlpbnQgcm9vbSA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCXJvb20gPSBjeXByZXNzX2J1Zl9zcGFjZV9hdmFpbChwcml2LT5idWYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAotCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19GVU5DVElPTl9fLCByb29tKTsKKwlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fZnVuY19fLCByb29tKTsKIAlyZXR1cm4gcm9vbTsKIH0KIApAQCAtOTA5LDcgKzkwMiw3IEBACiAJdW5zaWduZWQgaW50IHJlc3VsdCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAljb250cm9sID0gcHJpdi0+bGluZV9jb250cm9sOwpAQCAtOTIzLDcgKzkxNiw3IEBACiAJCXwgKChzdGF0dXMgJiBVQVJUX1JJKSAgICAgICAgID8gVElPQ01fUkkgIDogMCkKIAkJfCAoKHN0YXR1cyAmIFVBUlRfQ0QpICAgICAgICAgPyBUSU9DTV9DRCAgOiAwKTsKIAotCWRiZygiJXMgLSByZXN1bHQgPSAleCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwlkYmcoIiVzIC0gcmVzdWx0ID0gJXgiLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAogCXJldHVybiByZXN1bHQ7CiB9CkBAIC05MzUsNyArOTI4LDcgQEAKIAlzdHJ1Y3QgY3lwcmVzc19wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJaWYgKHNldCAmIFRJT0NNX1JUUykKQEAgLTk0Niw5ICs5MzksOSBAQAogCQlwcml2LT5saW5lX2NvbnRyb2wgJj0gfkNPTlRST0xfUlRTOwogCWlmIChjbGVhciAmIFRJT0NNX0RUUikKIAkJcHJpdi0+bGluZV9jb250cm9sICY9IH5DT05UUk9MX0RUUjsKKwlwcml2LT5jbWRfY3RybCA9IDE7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCi0JcHJpdi0+Y21kX2N0cmwgPSAxOwogCXJldHVybiBjeXByZXNzX3dyaXRlKHBvcnQsIE5VTEwsIDApOwogfQogCkBAIC05NTcsMjMgKzk1MCw5IEBACiB7CiAJc3RydWN0IGN5cHJlc3NfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAotCWRiZygiJXMgLSBwb3J0ICVkLCBjbWQgMHglLjR4IiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIGNtZCk7CisJZGJnKCIlcyAtIHBvcnQgJWQsIGNtZCAweCUuNHgiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCBjbWQpOwogCiAJc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBUSU9DR1NFUklBTDoKLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCBwb3J0LT50dHktPnRlcm1pb3MsIHNpemVvZihzdHJ1Y3Qga3Rlcm1pb3MpKSkgewotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJfQotCQkJcmV0dXJuICgwKTsKLQkJCWJyZWFrOwotCQljYXNlIFRJT0NTU0VSSUFMOgotCQkJaWYgKGNvcHlfZnJvbV91c2VyKHBvcnQtPnR0eS0+dGVybWlvcywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2Yoc3RydWN0IGt0ZXJtaW9zKSkpIHsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQkJCS8qIGhlcmUgd2UgbmVlZCB0byBjYWxsIGN5cHJlc3Nfc2V0X3Rlcm1pb3MgdG8gaW52b2tlIHRoZSBuZXcgc2V0dGluZ3MgKi8KLQkJCWN5cHJlc3Nfc2V0X3Rlcm1pb3MocG9ydCwgJnByaXYtPnRtcF90ZXJtaW9zKTsKLQkJCXJldHVybiAoMCk7Ci0JCQlicmVhazsKIAkJLyogVGhpcyBjb2RlIGNvbWVzIGZyb20gZHJpdmVycy9jaGFyL3NlcmlhbC5jIGFuZCBmdGRpX3Npby5jICovCiAJCWNhc2UgVElPQ01JV0FJVDoKIAkJCXdoaWxlIChwcml2ICE9IE5VTEwpIHsKQEAgLTEwMDksNyArOTg4LDcgQEAKIAkJCWJyZWFrOwogCX0KIAotCWRiZygiJXMgLSBhcmcgbm90IHN1cHBvcnRlZCAtIGl0IHdhcyAweCUwNHggLSBjaGVjayBpbmNsdWRlL2FzbS9pb2N0bHMuaCIsIF9fRlVOQ1RJT05fXywgY21kKTsKKwlkYmcoIiVzIC0gYXJnIG5vdCBzdXBwb3J0ZWQgLSBpdCB3YXMgMHglMDR4IC0gY2hlY2sgaW5jbHVkZS9hc20vaW9jdGxzLmgiLCBfX2Z1bmNfXywgY21kKTsKIAogCXJldHVybiAtRU5PSU9DVExDTUQ7CiB9IC8qIGN5cHJlc3NfaW9jdGwgKi8KQEAgLTEwMjEsMTggKzEwMDAsMTQgQEAKIAlzdHJ1Y3QgY3lwcmVzc19wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJaW50IGRhdGFfYml0cywgc3RvcF9iaXRzLCBwYXJpdHlfdHlwZSwgcGFyaXR5X2VuYWJsZTsKLQl1bnNpZ25lZCBjZmxhZywgaWZsYWcsIGJhdWRfbWFzazsKKwl1bnNpZ25lZCBjZmxhZywgaWZsYWc7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlfX3U4IG9sZGxpbmVzOwogCWludCBsaW5lY2hhbmdlID0gMDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAl0dHkgPSBwb3J0LT50dHk7Ci0JaWYgKCghdHR5KSB8fCAoIXR0eS0+dGVybWlvcykpIHsKLQkJZGJnKCIlcyAtIG5vIHR0eSBzdHJ1Y3R1cmVzIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuOwotCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJaWYgKCFwcml2LT50ZXJtaW9zX2luaXRpYWxpemVkKSB7CkBAIC0xMDQwLDQwICsxMDE1LDM3IEBACiAJCQkqKHR0eS0+dGVybWlvcykgPSB0dHlfc3RkX3Rlcm1pb3M7CiAJCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPSBCNDgwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfAogCQkJCUNMT0NBTDsKKwkJCXR0eS0+dGVybWlvcy0+Y19pc3BlZWQgPSA0ODAwOworCQkJdHR5LT50ZXJtaW9zLT5jX29zcGVlZCA9IDQ4MDA7CiAJCX0gZWxzZSBpZiAocHJpdi0+Y2hpcHR5cGUgPT0gQ1RfQ1lQSElEQ09NKSB7CiAJCQkqKHR0eS0+dGVybWlvcykgPSB0dHlfc3RkX3Rlcm1pb3M7CiAJCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPSBCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfAogCQkJCUNMT0NBTDsKKwkJCXR0eS0+dGVybWlvcy0+Y19pc3BlZWQgPSA5NjAwOworCQkJdHR5LT50ZXJtaW9zLT5jX29zcGVlZCA9IDk2MDA7CiAJCX0gZWxzZSBpZiAocHJpdi0+Y2hpcHR5cGUgPT0gQ1RfQ0E0MlYyKSB7CiAJCQkqKHR0eS0+dGVybWlvcykgPSB0dHlfc3RkX3Rlcm1pb3M7CiAJCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPSBCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfAogCQkJCUNMT0NBTDsKKwkJCXR0eS0+dGVybWlvcy0+Y19pc3BlZWQgPSA5NjAwOworCQkJdHR5LT50ZXJtaW9zLT5jX29zcGVlZCA9IDk2MDA7CiAJCX0KIAkJcHJpdi0+dGVybWlvc19pbml0aWFsaXplZCA9IDE7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAorCS8qIFVuc3VwcG9ydGVkIGZlYXR1cmVzIG5lZWQgY2xlYXJpbmcgKi8KKwl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJj0gfihDTVNQQVJ8Q1JUU0NUUyk7CisKIAljZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKIAlpZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19pZmxhZzsKIAogCS8qIGNoZWNrIGlmIHRoZXJlIGFyZSBuZXcgc2V0dGluZ3MgKi8KIAlpZiAob2xkX3Rlcm1pb3MpIHsKLQkJaWYgKChjZmxhZyAhPSBvbGRfdGVybWlvcy0+Y19jZmxhZykgfHwKLQkJCShSRUxFVkFOVF9JRkxBRyhpZmxhZykgIT0KLQkJCSBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpKSB7Ci0JCQlkYmcoIiVzIC0gYXR0ZW1wdGluZyB0byBzZXQgbmV3IHRlcm1pb3Mgc2V0dGluZ3MiLAotCQkJCQlfX0ZVTkNUSU9OX18pOwotCQkJLyogc2hvdWxkIG1ha2UgYSBjb3B5IG9mIHRoaXMgaW4gY2FzZSBzb21ldGhpbmcgZ29lcwotCQkJICogd3JvbmcgaW4gdGhlIGZ1bmN0aW9uLCB3ZSBjYW4gcmVzdG9yZSBpdCAqLwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJCXByaXYtPnRtcF90ZXJtaW9zID0gKih0dHktPnRlcm1pb3MpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQl9IGVsc2UgewotCQkJZGJnKCIlcyAtIG5vdGhpbmcgdG8gZG8sIGV4aXRpbmciLCBfX0ZVTkNUSU9OX18pOwotCQkJcmV0dXJuOwotCQl9Ci0JfSBlbHNlCi0JCXJldHVybjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJcHJpdi0+dG1wX3Rlcm1pb3MgPSAqKHR0eS0+dGVybWlvcyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwl9CiAKIAkvKiBzZXQgbnVtYmVyIG9mIGRhdGEgYml0cywgcGFyaXR5LCBzdG9wIGJpdHMgKi8KIAkvKiB3aGVuIHBhcml0eSBpcyBkaXNhYmxlZCB0aGUgcGFyaXR5IHR5cGUgYml0IGlzIGlnbm9yZWQgKi8KQEAgLTExMDQsNyArMTA3Niw3IEBACiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCWVycigiJXMgLSBDU0laRSB3YXMgc2V0LCBidXQgbm90IENTNS1DUzgiLAotCQkJCQkJX19GVU5DVElPTl9fKTsKKwkJCQkJCV9fZnVuY19fKTsKIAkJCQlkYXRhX2JpdHMgPSAzOwogCQl9CiAJfSBlbHNlCkBAIC0xMTE0LDU0ICsxMDg2LDE3IEBACiAJb2xkbGluZXMgPSBwcml2LT5saW5lX2NvbnRyb2w7CiAJaWYgKChjZmxhZyAmIENCQVVEKSA9PSBCMCkgewogCQkvKiBkcm9wIGR0ciBhbmQgcnRzICovCi0JCWRiZygiJXMgLSBkcm9wcGluZyB0aGUgbGluZXMsIGJhdWQgcmF0ZSAwYnBzIiwgX19GVU5DVElPTl9fKTsKLQkJYmF1ZF9tYXNrID0gQjA7CisJCWRiZygiJXMgLSBkcm9wcGluZyB0aGUgbGluZXMsIGJhdWQgcmF0ZSAwYnBzIiwgX19mdW5jX18pOwogCQlwcml2LT5saW5lX2NvbnRyb2wgJj0gfihDT05UUk9MX0RUUiB8IENPTlRST0xfUlRTKTsKLQl9IGVsc2UgewotCQliYXVkX21hc2sgPSAoY2ZsYWcgJiBDQkFVRCk7Ci0JCXN3aXRjaChiYXVkX21hc2spIHsKLQkJCWNhc2UgQjMwMDoKLQkJCQlkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDMwMGJwcyIsIF9fRlVOQ1RJT05fXyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEI2MDA6Ci0JCQkJZGJnKCIlcyAtIHNldHRpbmcgYmF1ZCA2MDBicHMiLCBfX0ZVTkNUSU9OX18pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCMTIwMDoKLQkJCQlkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDEyMDBicHMiLCBfX0ZVTkNUSU9OX18pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCMjQwMDoKLQkJCQlkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDI0MDBicHMiLCBfX0ZVTkNUSU9OX18pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCNDgwMDoKLQkJCQlkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDQ4MDBicHMiLCBfX0ZVTkNUSU9OX18pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCOTYwMDoKLQkJCQlkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDk2MDBicHMiLCBfX0ZVTkNUSU9OX18pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCMTkyMDA6Ci0JCQkJZGJnKCIlcyAtIHNldHRpbmcgYmF1ZCAxOTIwMGJwcyIsIF9fRlVOQ1RJT05fXyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEIzODQwMDoKLQkJCQlkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDM4NDAwYnBzIiwgX19GVU5DVElPTl9fKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQjU3NjAwOgotCQkJCWRiZygiJXMgLSBzZXR0aW5nIGJhdWQgNTc2MDBicHMiLCBfX0ZVTkNUSU9OX18pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCMTE1MjAwOgotCQkJCWRiZygiJXMgLSBzZXR0aW5nIGJhdWQgMTE1MjAwYnBzIiwgX19GVU5DVElPTl9fKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJZGJnKCIlcyAtIHVua25vd24gbWFza2VkIGJhdWQgcmF0ZSIsIF9fRlVOQ1RJT05fXyk7Ci0JCX0KKwl9IGVsc2UKIAkJcHJpdi0+bGluZV9jb250cm9sID0gKENPTlRST0xfRFRSIHwgQ09OVFJPTF9SVFMpOwotCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKIAlkYmcoIiVzIC0gc2VuZGluZyAlZCBzdG9wX2JpdHMsICVkIHBhcml0eV9lbmFibGUsICVkIHBhcml0eV90eXBlLCAiCi0JCQkiJWQgZGF0YV9iaXRzICgrNSkiLCBfX0ZVTkNUSU9OX18sIHN0b3BfYml0cywKKwkJCSIlZCBkYXRhX2JpdHMgKCs1KSIsIF9fZnVuY19fLCBzdG9wX2JpdHMsCiAJCQlwYXJpdHlfZW5hYmxlLCBwYXJpdHlfdHlwZSwgZGF0YV9iaXRzKTsKIAotCWN5cHJlc3Nfc2VyaWFsX2NvbnRyb2wocG9ydCwgYmF1ZF9tYXNrLCBkYXRhX2JpdHMsIHN0b3BfYml0cywKKwljeXByZXNzX3NlcmlhbF9jb250cm9sKHBvcnQsIHR0eV9nZXRfYmF1ZF9yYXRlKHR0eSksIGRhdGFfYml0cywgc3RvcF9iaXRzLAogCQkJcGFyaXR5X2VuYWJsZSwgcGFyaXR5X3R5cGUsIDAsIENZUFJFU1NfU0VUX0NPTkZJRyk7CiAKIAkvKiB3ZSBwZXJmb3JtIGEgQ1lQUkVTU19HRVRfQ09ORklHIHNvIHRoYXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgYXJlCkBAIC0xMjE5LDEzICsxMTU0LDEzIEBACiAJaW50IGNoYXJzID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAkKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCWNoYXJzID0gY3lwcmVzc19idWZfZGF0YV9hdmFpbChwcml2LT5idWYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAotCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19GVU5DVElPTl9fLCBjaGFycyk7CisJZGJnKCIlcyAtIHJldHVybnMgJWQiLCBfX2Z1bmNfXywgY2hhcnMpOwogCXJldHVybiBjaGFyczsKIH0KIApAQCAtMTIzNSw3ICsxMTcwLDcgQEAKIAlzdHJ1Y3QgY3lwcmVzc19wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAlwcml2LT5yeF9mbGFncyA9IFRIUk9UVExFRDsKQEAgLTEyNDksNyArMTE4NCw3IEBACiAJaW50IGFjdHVhbGx5X3Rocm90dGxlZCwgcmVzdWx0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAlhY3R1YWxseV90aHJvdHRsZWQgPSBwcml2LT5yeF9mbGFncyAmIEFDVFVBTExZX1RIUk9UVExFRDsKQEAgLTEyNjUsNyArMTIwMCw3IEBACiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAocmVzdWx0KSB7CiAJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCAiCi0JCQkJCSJlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJCQkiZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCQkJY3lwcmVzc19zZXRfZGVhZChwb3J0KTsKIAkJfQogCX0KQEAgLTEyNzQsNyArMTIwOSw3IEBACiAKIHN0YXRpYyB2b2lkIGN5cHJlc3NfcmVhZF9pbnRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCBjeXByZXNzX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CkBAIC0xMjg2LDcgKzEyMjEsNyBAQAogCWludCBpID0gMDsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3dpdGNoIChzdGF0dXMpIHsKIAljYXNlIDA6IC8qIHN1Y2Nlc3MgKi8KQEAgLTEzMDIsMTQgKzEyMzcsMTQgQEAKIAlkZWZhdWx0OgogCQkvKiBzb21ldGhpbmcgdWdseSBpcyBnb2luZyBvbi4uLiAqLwogCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCIlcyAtIHVuZXhwZWN0ZWQgbm9uemVybyByZWFkIHN0YXR1cyByZWNlaXZlZDogJWRcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQlfX2Z1bmNfXywgc3RhdHVzKTsKIAkJY3lwcmVzc19zZXRfZGVhZChwb3J0KTsKIAkJcmV0dXJuOwogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJaWYgKHByaXYtPnJ4X2ZsYWdzICYgVEhST1RUTEVEKSB7Ci0JCWRiZygiJXMgLSBub3cgdGhyb3R0bGluZyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBub3cgdGhyb3R0bGluZyIsIF9fZnVuY19fKTsKIAkJcHJpdi0+cnhfZmxhZ3MgfD0gQUNUVUFMTFlfVEhST1RUTEVEOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJCXJldHVybjsKQEAgLTEzMTgsNDggKzEyNTMsNDggQEAKIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAoIXR0eSkgewotCQlkYmcoIiVzIC0gYmFkIHR0eSBwb2ludGVyIC0gZXhpdGluZyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBiYWQgdHR5IHBvaW50ZXIgLSBleGl0aW5nIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlzd2l0Y2godXJiLT5hY3R1YWxfbGVuZ3RoKSB7Ci0JCWNhc2UgMzI6Ci0JCQkvKiBUaGlzIGlzIGZvciB0aGUgQ1k3QzY0MDEzLi4uICovCi0JCQlwcml2LT5jdXJyZW50X3N0YXR1cyA9IGRhdGFbMF0gJiAweEY4OwotCQkJYnl0ZXMgPSBkYXRhWzFdICsgMjsKLQkJCWkgPSAyOwotCQkJaWYgKGJ5dGVzID4gMikKLQkJCQloYXZlZGF0YSA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSA4OgotCQkJLyogVGhpcyBpcyBmb3IgdGhlIENZN0M2Mzc0My4uLiAqLwotCQkJcHJpdi0+Y3VycmVudF9zdGF0dXMgPSBkYXRhWzBdICYgMHhGODsKLQkJCWJ5dGVzID0gKGRhdGFbMF0gJiAweDA3KSArIDE7Ci0JCQlpID0gMTsKLQkJCWlmIChieXRlcyA+IDEpCi0JCQkJaGF2ZWRhdGEgPSAxOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlkYmcoIiVzIC0gd3JvbmcgcGFja2V0IHNpemUgLSByZWNlaXZlZCAlZCBieXRlcyIsCi0JCQkJCV9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJCWdvdG8gY29udGludWVfcmVhZDsKKwlyZXN1bHQgPSB1cmItPmFjdHVhbF9sZW5ndGg7CisJc3dpdGNoIChwcml2LT5wa3RfZm10KSB7CisJZGVmYXVsdDoKKwljYXNlIHBhY2tldF9mb3JtYXRfMToKKwkJLyogVGhpcyBpcyBmb3IgdGhlIENZN0M2NDAxMy4uLiAqLworCQlwcml2LT5jdXJyZW50X3N0YXR1cyA9IGRhdGFbMF0gJiAweEY4OworCQlieXRlcyA9IGRhdGFbMV0gKyAyOworCQlpID0gMjsKKwkJaWYgKGJ5dGVzID4gMikKKwkJCWhhdmVkYXRhID0gMTsKKwkJYnJlYWs7CisJY2FzZSBwYWNrZXRfZm9ybWF0XzI6CisJCS8qIFRoaXMgaXMgZm9yIHRoZSBDWTdDNjM3NDMuLi4gKi8KKwkJcHJpdi0+Y3VycmVudF9zdGF0dXMgPSBkYXRhWzBdICYgMHhGODsKKwkJYnl0ZXMgPSAoZGF0YVswXSAmIDB4MDcpICsgMTsKKwkJaSA9IDE7CisJCWlmIChieXRlcyA+IDEpCisJCQloYXZlZGF0YSA9IDE7CisJCWJyZWFrOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJaWYgKHJlc3VsdCA8IGJ5dGVzKSB7CisJCWRiZygiJXMgLSB3cm9uZyBwYWNrZXQgc2l6ZSAtIHJlY2VpdmVkICVkIGJ5dGVzIGJ1dCBwYWNrZXQgIgorCQkgICAgInNhaWQgJWQgYnl0ZXMiLCBfX2Z1bmNfXywgcmVzdWx0LCBieXRlcyk7CisJCWdvdG8gY29udGludWVfcmVhZDsKKwl9CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEgKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sCisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhIChkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sCiAJCQl1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAkvKiBjaGVjayB0byBzZWUgaWYgc3RhdHVzIGhhcyBjaGFuZ2VkICovCi0JaWYgKHByaXYgIT0gTlVMTCkgewotCQlpZiAocHJpdi0+Y3VycmVudF9zdGF0dXMgIT0gcHJpdi0+cHJldl9zdGF0dXMpIHsKLQkJCXByaXYtPmRpZmZfc3RhdHVzIHw9IHByaXYtPmN1cnJlbnRfc3RhdHVzIF4KLQkJCQlwcml2LT5wcmV2X3N0YXR1czsKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+ZGVsdGFfbXNyX3dhaXQpOwotCQkJcHJpdi0+cHJldl9zdGF0dXMgPSBwcml2LT5jdXJyZW50X3N0YXR1czsKLQkJfQorCWlmIChwcml2LT5jdXJyZW50X3N0YXR1cyAhPSBwcml2LT5wcmV2X3N0YXR1cykgeworCQlwcml2LT5kaWZmX3N0YXR1cyB8PSBwcml2LT5jdXJyZW50X3N0YXR1cyBeCisJCQlwcml2LT5wcmV2X3N0YXR1czsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5kZWx0YV9tc3Jfd2FpdCk7CisJCXByaXYtPnByZXZfc3RhdHVzID0gcHJpdi0+Y3VycmVudF9zdGF0dXM7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIApAQCAtMTM2Nyw3ICsxMzAyLDcgQEAKIAkgKiB0aG91Z2ggKi8KIAlpZiAodHR5ICYmICEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSAmJgogCQkJIShwcml2LT5jdXJyZW50X3N0YXR1cyAmIFVBUlRfQ0QpKSB7Ci0JCWRiZygiJXMgLSBjYWxsaW5nIGhhbmd1cCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBjYWxsaW5nIGhhbmd1cCIsIF9fZnVuY19fKTsKIAkJdHR5X2hhbmd1cCh0dHkpOwogCQlnb3RvIGNvbnRpbnVlX3JlYWQ7CiAJfQpAQCAtMTM4MCw3ICsxMzE1LDcgQEAKIAlpZiAocHJpdi0+Y3VycmVudF9zdGF0dXMgJiBDWVBfRVJST1IpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCQl0dHlfZmxhZyA9IFRUWV9QQVJJVFk7Ci0JCWRiZygiJXMgLSBQYXJpdHkgRXJyb3IgZGV0ZWN0ZWQiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gUGFyaXR5IEVycm9yIGRldGVjdGVkIiwgX19mdW5jX18pOwogCX0gZWxzZQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKQEAgLTE0MTQsNyArMTM0OSw3IEBACiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAocmVzdWx0KSB7CiAJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nICIKLQkJCQkJInJlYWQgdXJiLCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLAorCQkJCQkicmVhZCB1cmIsIGVycm9yICVkXG4iLCBfX2Z1bmNfXywKIAkJCQkJcmVzdWx0KTsKIAkJCWN5cHJlc3Nfc2V0X2RlYWQocG9ydCk7CiAJCX0KQEAgLTE0MjYsMTIgKzEzNjEsMTIgQEAKIAogc3RhdGljIHZvaWQgY3lwcmVzc193cml0ZV9pbnRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCBjeXByZXNzX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJaW50IHJlc3VsdDsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3dpdGNoIChzdGF0dXMpIHsKIAkJY2FzZSAwOgpAQCAtMTQ0Miw3ICsxMzc3LDcgQEAKIAkJY2FzZSAtRVNIVVRET1dOOgogCQkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KIAkJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLAotCQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJCXByaXYtPndyaXRlX3VyYl9pbl91c2UgPSAwOwogCQkJcmV0dXJuOwogCQljYXNlIC1FUElQRTogLyogbm8gYnJlYWsgbmVlZGVkOyBjbGVhciBoYWx0IGFuZCByZXN1Ym1pdCAqLwpAQCAtMTQ1MSwxOSArMTM4NiwxOSBAQAogCQkJdXNiX2NsZWFyX2hhbHQocG9ydC0+c2VyaWFsLT5kZXYsIDB4MDIpOwogCQkJLyogZXJyb3IgaW4gdGhlIHVyYiwgc28gd2UgaGF2ZSB0byByZXN1Ym1pdCBpdCAqLwogCQkJZGJnKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCQlwb3J0LT5pbnRlcnJ1cHRfb3V0X3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IDE7CiAJCQlwb3J0LT5pbnRlcnJ1cHRfb3V0X3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAJCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfb3V0X3VyYiwgR0ZQX0FUT01JQyk7CiAJCQlpZiAoIXJlc3VsdCkKIAkJCQlyZXR1cm47CiAJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWRcbiIsCi0JCQkJX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJCV9fZnVuY19fLCByZXN1bHQpOwogCQkJY3lwcmVzc19zZXRfZGVhZChwb3J0KTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwiJXMgLSB1bmV4cGVjdGVkIG5vbnplcm8gd3JpdGUgc3RhdHVzIHJlY2VpdmVkOiAlZFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQkJX19mdW5jX18sIHN0YXR1cyk7CiAJCQljeXByZXNzX3NldF9kZWFkKHBvcnQpOwogCQkJYnJlYWs7CiAJfQpAQCAtMTY2OCw3ICsxNjAzLDcgQEAKIHsKIAlpbnQgcmV0dmFsOwogCQotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAJCiAJcmV0dmFsID0gdXNiX3NlcmlhbF9yZWdpc3RlcigmY3lwcmVzc19lYXJ0aG1hdGVfZGV2aWNlKTsKIAlpZiAocmV0dmFsKQpAQCAtMTY5OSw3ICsxNjM0LDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGN5cHJlc3NfZXhpdCAodm9pZCkKIHsKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJdXNiX2RlcmVnaXN0ZXIgKCZjeXByZXNzX2RyaXZlcik7CiAJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyICgmY3lwcmVzc19lYXJ0aG1hdGVfZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9kaWdpX2FjY2VsZXBvcnQuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9kaWdpX2FjY2VsZXBvcnQuYwppbmRleCA1ZjljNmU0Li5kMTdkMTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZGlnaV9hY2NlbGVwb3J0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2RpZ2lfYWNjZWxlcG9ydC5jCkBAIC01MDgsOSArNTA4LDYgQEAKIAkuZGVzY3JpcHRpb24gPQkJCSJEaWdpIDIgcG9ydCBVU0IgYWRhcHRlciIsCiAJLnVzYl9kcml2ZXIgPSAJCQkmZGlnaV9kcml2ZXIsCiAJLmlkX3RhYmxlID0JCQlpZF90YWJsZV8yLAotCS5udW1faW50ZXJydXB0X2luID0JCTAsCi0JLm51bV9idWxrX2luID0JCQk0LAotCS5udW1fYnVsa19vdXQgPQkJCTQsCiAJLm51bV9wb3J0cyA9CQkJMywKIAkub3BlbiA9CQkJCWRpZ2lfb3BlbiwKIAkuY2xvc2UgPQkJCWRpZ2lfY2xvc2UsCkBAIC01MzgsOSArNTM1LDYgQEAKIAkuZGVzY3JpcHRpb24gPQkJCSJEaWdpIDQgcG9ydCBVU0IgYWRhcHRlciIsCiAJLnVzYl9kcml2ZXIgPSAJCQkmZGlnaV9kcml2ZXIsCiAJLmlkX3RhYmxlID0JCQlpZF90YWJsZV80LAotCS5udW1faW50ZXJydXB0X2luID0JCTAsCi0JLm51bV9idWxrX2luID0JCQk1LAotCS5udW1fYnVsa19vdXQgPQkJCTUsCiAJLm51bV9wb3J0cyA9CQkJNCwKIAkub3BlbiA9CQkJCWRpZ2lfb3BlbiwKIAkuY2xvc2UgPQkJCWRpZ2lfY2xvc2UsCkBAIC02NjUsNyArNjU5LDcgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb29iX3ByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOwogCWlmIChyZXQpCi0JCWVycigiJXM6IHVzYl9zdWJtaXRfdXJiIGZhaWxlZCwgcmV0PSVkIiwgX19GVU5DVElPTl9fLCByZXQpOworCQllcnIoIiVzOiB1c2Jfc3VibWl0X3VyYiBmYWlsZWQsIHJldD0lZCIsIF9fZnVuY19fLCByZXQpOwogCXJldHVybiByZXQ7CiAKIH0KQEAgLTc0Niw3ICs3NDAsNyBAQAogCiAJaWYgKHJldCkKIAkJZXJyKCIlczogdXNiX3N1Ym1pdF91cmIgZmFpbGVkLCByZXQ9JWQsIHBvcnQ9JWQiLAotCQkJX19GVU5DVElPTl9fLCByZXQsIHByaXYtPmRwX3BvcnRfbnVtKTsKKwkJCV9fZnVuY19fLCByZXQsIHByaXYtPmRwX3BvcnRfbnVtKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC04MTAsNyArODA0LDcgQEAKIAlzcGluX3VubG9jaygmcG9ydF9wcml2LT5kcF9wb3J0X2xvY2spOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9vYl9wcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKIAlpZiAocmV0KQotCQllcnIoIiVzOiB1c2Jfc3VibWl0X3VyYiBmYWlsZWQsIHJldD0lZCIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKwkJZXJyKCIlczogdXNiX3N1Ym1pdF91cmIgZmFpbGVkLCByZXQ9JWQiLCBfX2Z1bmNfXywgcmV0KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC05MDMsNyArODk3LDcgQEAKIAogCWlmIChyZXQpCiAJCWVycigiJXM6IHVzYl9zdWJtaXRfdXJiIGZhaWxlZCwgcmV0PSVkLCBwb3J0PSVkIiwKLQkJCV9fRlVOQ1RJT05fXywgcmV0LCBwcml2LT5kcF9wb3J0X251bSk7CisJCQlfX2Z1bmNfXywgcmV0LCBwcml2LT5kcF9wb3J0X251bSk7CiB9CiAKIApAQCAtMTExMyw3ICsxMTA3LDcgQEAKIAl1bnNpZ25lZCBpbnQgdmFsOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzOiBUT1A6IHBvcnQ9JWQiLCBfX0ZVTkNUSU9OX18sIHByaXYtPmRwX3BvcnRfbnVtKTsKKwlkYmcoIiVzOiBUT1A6IHBvcnQ9JWQiLCBfX2Z1bmNfXywgcHJpdi0+ZHBfcG9ydF9udW0pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOwogCXZhbCA9IHByaXYtPmRwX21vZGVtX3NpZ25hbHM7CkBAIC0xMTI5LDcgKzExMjMsNyBAQAogCXVuc2lnbmVkIGludCB2YWw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXM6IFRPUDogcG9ydD0lZCIsIF9fRlVOQ1RJT05fXywgcHJpdi0+ZHBfcG9ydF9udW0pOworCWRiZygiJXM6IFRPUDogcG9ydD0lZCIsIF9fZnVuY19fLCBwcml2LT5kcF9wb3J0X251bSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7CiAJdmFsID0gKHByaXYtPmRwX21vZGVtX3NpZ25hbHMgJiB+Y2xlYXIpIHwgc2V0OwpAQCAtMTIyNCw3ICsxMjE4LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKIAlpZiAocmV0IDwgMCkKIAkJZXJyKCIlczogdXNiX3N1Ym1pdF91cmIgZmFpbGVkLCByZXQ9JWQsIHBvcnQ9JWQiLAotCQkJX19GVU5DVElPTl9fLCByZXQsIHByaXYtPmRwX3BvcnRfbnVtKTsKKwkJCV9fZnVuY19fLCByZXQsIHByaXYtPmRwX3BvcnRfbnVtKTsKIAlkYmcoImRpZ2lfd3JpdGU6IHJldHVybmluZyAlZCIsIHJldCk7CiAJcmV0dXJuIHJldDsKIApAQCAtMTIzMyw3ICsxMjI3LDcgQEAKIHN0YXRpYyB2b2lkIGRpZ2lfd3JpdGVfYnVsa19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7CiAKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsOwogCXN0cnVjdCBkaWdpX3BvcnQgKnByaXY7CiAJc3RydWN0IGRpZ2lfc2VyaWFsICpzZXJpYWxfcHJpdjsKQEAgLTEyNDUsMTMgKzEyMzksMTMgQEAKIAkvKiBwb3J0IGFuZCBzZXJpYWwgc2FuaXR5IGNoZWNrICovCiAJaWYgKHBvcnQgPT0gTlVMTCB8fCAocHJpdj11c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCkpID09IE5VTEwpIHsKIAkJZXJyKCIlczogcG9ydCBvciBwb3J0LT5wcml2YXRlIGlzIE5VTEwsIHN0YXR1cz0lZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIAlzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAJaWYgKHNlcmlhbCA9PSBOVUxMIHx8IChzZXJpYWxfcHJpdj11c2JfZ2V0X3NlcmlhbF9kYXRhKHNlcmlhbCkpID09IE5VTEwpIHsKIAkJZXJyKCIlczogc2VyaWFsIG9yIHNlcmlhbC0+cHJpdmF0ZSBpcyBOVUxMLCBzdGF0dXM9JWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTEyOTIsNyArMTI4Niw3IEBACiAJc3Bpbl91bmxvY2soJnByaXYtPmRwX3BvcnRfbG9jayk7CiAJaWYgKHJldCkKIAkJZXJyKCIlczogdXNiX3N1Ym1pdF91cmIgZmFpbGVkLCByZXQ9JWQsIHBvcnQ9JWQiLAotCQkJX19GVU5DVElPTl9fLCByZXQsIHByaXYtPmRwX3BvcnRfbnVtKTsKKwkJCV9fZnVuY19fLCByZXQsIHByaXYtPmRwX3BvcnRfbnVtKTsKIH0KIAogc3RhdGljIGludCBkaWdpX3dyaXRlX3Jvb20oc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKQEAgLTE1MjEsNyArMTUxNSw3IEBACiAJCXBvcnQtPndyaXRlX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAJCWlmICgocmV0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9LRVJORUwpKSAhPSAwKSB7CiAJCQllcnIoIiVzOiB1c2Jfc3VibWl0X3VyYiBmYWlsZWQsIHJldD0lZCwgcG9ydD0lZCIsCi0JCQkJCV9fRlVOQ1RJT05fXywgcmV0LCBpKTsKKwkJCQkJX19mdW5jX18sIHJldCwgaSk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTE2MTEsNyArMTYwNSw3IEBACiAKIHN0YXRpYyB2b2lkIGRpZ2lfcmVhZF9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgZGlnaV9wb3J0ICpwcml2OwogCXN0cnVjdCBkaWdpX3NlcmlhbCAqc2VyaWFsX3ByaXY7CiAJaW50IHJldDsKQEAgLTE2MjIsMjAgKzE2MTYsMjAgQEAKIAkvKiBwb3J0IHNhbml0eSBjaGVjaywgZG8gbm90IHJlc3VibWl0IGlmIHBvcnQgaXMgbm90IHZhbGlkICovCiAJaWYgKHBvcnQgPT0gTlVMTCB8fCAocHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KSkgPT0gTlVMTCkgewogCQllcnIoIiVzOiBwb3J0IG9yIHBvcnQtPnByaXZhdGUgaXMgTlVMTCwgc3RhdHVzPSVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCWlmIChwb3J0LT5zZXJpYWwgPT0gTlVMTCB8fAogCQkoc2VyaWFsX3ByaXY9dXNiX2dldF9zZXJpYWxfZGF0YShwb3J0LT5zZXJpYWwpKSA9PSBOVUxMKSB7CiAJCWVycigiJXM6IHNlcmlhbCBpcyBiYWQgb3Igc2VyaWFsLT5wcml2YXRlIGlzIE5VTEwsIHN0YXR1cz0lZCIsCi0JCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQlfX2Z1bmNfXywgc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIGRvIG5vdCByZXN1Ym1pdCB1cmIgaWYgaXQgaGFzIGFueSBzdGF0dXMgZXJyb3IgKi8KIAlpZiAoc3RhdHVzKSB7CiAJCWVycigiJXM6IG5vbnplcm8gcmVhZCBidWxrIHN0YXR1czogc3RhdHVzPSVkLCBwb3J0PSVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzLCBwcml2LT5kcF9wb3J0X251bSk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzLCBwcml2LT5kcF9wb3J0X251bSk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE2NTIsNyArMTY0Niw3IEBACiAJdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAlpZiAoKHJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQykpICE9IDApIHsKIAkJZXJyKCIlczogZmFpbGVkIHJlc3VibWl0dGluZyB1cmIsIHJldD0lZCwgcG9ydD0lZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHJldCwgcHJpdi0+ZHBfcG9ydF9udW0pOworCQkgICAgX19mdW5jX18sIHJldCwgcHJpdi0+ZHBfcG9ydF9udW0pOwogCX0KIAogfQpAQCAtMTY3MCw3ICsxNjY0LDcgQEAKIHN0YXRpYyBpbnQgZGlnaV9yZWFkX2luYl9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7CiAKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcG9ydC0+dHR5OwogCXN0cnVjdCBkaWdpX3BvcnQgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJaW50IG9wY29kZSA9ICgodW5zaWduZWQgY2hhciAqKXVyYi0+dHJhbnNmZXJfYnVmZmVyKVswXTsKQEAgLTE2OTAsNyArMTY4NCw3IEBACiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCAhPSBsZW4gKyAyKSB7CiAgICAgIAkJZXJyKCIlczogSU5DT01QTEVURSBPUiBNVUxUSVBMRSBQQUNLRVQsIHVyYi0+c3RhdHVzPSVkLCAiCiAJCSAgICAicG9ydD0lZCwgb3Bjb2RlPSVkLCBsZW49JWQsIGFjdHVhbF9sZW5ndGg9JWQsICIKLQkJICAgICJzdGF0dXM9JWQiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cywgcHJpdi0+ZHBfcG9ydF9udW0sCisJCSAgICAic3RhdHVzPSVkIiwgX19mdW5jX18sIHN0YXR1cywgcHJpdi0+ZHBfcG9ydF9udW0sCiAJCSAgICBvcGNvZGUsIGxlbiwgdXJiLT5hY3R1YWxfbGVuZ3RoLCBwb3J0X3N0YXR1cyk7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0xNzM5LDkgKzE3MzMsOSBAQAogCXNwaW5fdW5sb2NrKCZwcml2LT5kcF9wb3J0X2xvY2spOwogCiAJaWYgKG9wY29kZSA9PSBESUdJX0NNRF9SRUNFSVZFX0RJU0FCTEUpCi0JCWRiZygiJXM6IGdvdCBSRUNFSVZFX0RJU0FCTEUiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzOiBnb3QgUkVDRUlWRV9ESVNBQkxFIiwgX19mdW5jX18pOwogCWVsc2UgaWYgKG9wY29kZSAhPSBESUdJX0NNRF9SRUNFSVZFX0RBVEEpCi0JCWRiZygiJXM6IHVua25vd24gb3Bjb2RlOiAlZCIsIF9fRlVOQ1RJT05fXywgb3Bjb2RlKTsKKwkJZGJnKCIlczogdW5rbm93biBvcGNvZGU6ICVkIiwgX19mdW5jX18sIG9wY29kZSk7CiAKIAlyZXR1cm4odGhyb3R0bGVkID8gMSA6IDApOwogCkBAIC0xNzYwLDcgKzE3NTQsNyBAQAogc3RhdGljIGludCBkaWdpX3JlYWRfb29iX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKIAotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAJc3RydWN0IGRpZ2lfcG9ydCAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlpbnQgb3Bjb2RlLCBsaW5lLCBzdGF0dXMsIHZhbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9lbXBlZy5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2VtcGVnLmMKaW5kZXggYTVjOGUxZS4uYzVlYzMwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2VtcGVnLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2VtcGVnLmMKQEAgLTExOCw5ICsxMTgsNiBAQAogCX0sCiAJLmlkX3RhYmxlID0JCWlkX3RhYmxlLAogCS51c2JfZHJpdmVyID0gCQkmZW1wZWdfZHJpdmVyLAotCS5udW1faW50ZXJydXB0X2luID0JMCwKLQkubnVtX2J1bGtfaW4gPQkJMSwKLQkubnVtX2J1bGtfb3V0ID0JCTEsCiAJLm51bV9wb3J0cyA9CQkxLAogCS5vcGVuID0JCQllbXBlZ19vcGVuLAogCS5jbG9zZSA9CQllbXBlZ19jbG9zZSwKQEAgLTE1Myw3ICsxNTAsNyBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAJaW50IHJlc3VsdCA9IDA7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyogRm9yY2UgZGVmYXVsdCB0ZXJtaW8gc2V0dGluZ3MgKi8KIAllbXBlZ19zZXRfdGVybWlvcyAocG9ydCwgTlVMTCkgOwpAQCAtMTc1LDcgKzE3Miw3IEBACiAJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9LRVJORUwpOwogCiAJaWYgKHJlc3VsdCkKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTE4Myw3ICsxODAsNyBAQAogCiBzdGF0aWMgdm9pZCBlbXBlZ19jbG9zZSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKiBmaWxwKQogewotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAkvKiBzaHV0ZG93biBvdXIgYnVsayByZWFkICovCiAJdXNiX2tpbGxfdXJiKHBvcnQtPnJlYWRfdXJiKTsKQEAgLTIwMyw3ICsyMDAsNyBAQAogCWludCBieXRlc19zZW50ID0gMDsKIAlpbnQgdHJhbnNmZXJfc2l6ZTsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAl3aGlsZSAoY291bnQgPiAwKSB7CiAKQEAgLTIyMiwxNCArMjE5LDE0IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZ3cml0ZV91cmJfcG9vbF9sb2NrLCBmbGFncyk7CiAKIAkJaWYgKHVyYiA9PSBOVUxMKSB7Ci0JCQlkYmcoIiVzIC0gbm8gbW9yZSBmcmVlIHVyYnMiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIG5vIG1vcmUgZnJlZSB1cmJzIiwgX19mdW5jX18pOwogCQkJZ290byBleGl0OwogCQl9CiAKIAkJaWYgKHVyYi0+dHJhbnNmZXJfYnVmZmVyID09IE5VTEwpIHsKIAkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0ga21hbGxvYyAoVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFLCBHRlBfQVRPTUlDKTsKIAkJCWlmICh1cmItPnRyYW5zZmVyX2J1ZmZlciA9PSBOVUxMKSB7Ci0JCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgbm8gbW9yZSBrZXJuZWwgbWVtb3J5Li4uXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIG5vIG1vcmUga2VybmVsIG1lbW9yeS4uLlxuIiwgX19mdW5jX18pOwogCQkJCWdvdG8gZXhpdDsKIAkJCX0KIAkJfQpAQCAtMjM4LDcgKzIzNSw3IEBACiAKIAkJbWVtY3B5ICh1cmItPnRyYW5zZmVyX2J1ZmZlciwgY3VycmVudF9wb3NpdGlvbiwgdHJhbnNmZXJfc2l6ZSk7CiAKLQkJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIHRyYW5zZmVyX3NpemUsIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgdHJhbnNmZXJfc2l6ZSwgdXJiLT50cmFuc2Zlcl9idWZmZXIpOwogCiAJCS8qIGJ1aWxkIHVwIG91ciB1cmIgKi8KIAkJdXNiX2ZpbGxfYnVsa191cmIgKApAQCAtMjU0LDcgKzI1MSw3IEBACiAJCS8qIHNlbmQgaXQgZG93biB0aGUgcGlwZSAqLwogCQlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAoc3RhdHVzKSB7Ci0JCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIHVzYl9zdWJtaXRfdXJiKHdyaXRlIGJ1bGspIGZhaWxlZCB3aXRoIHN0YXR1cyA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIHVzYl9zdWJtaXRfdXJiKHdyaXRlIGJ1bGspIGZhaWxlZCB3aXRoIHN0YXR1cyA9ICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJCWJ5dGVzX3NlbnQgPSBzdGF0dXM7CiAJCQlicmVhazsKIAkJfQpAQCAtMjc4LDcgKzI3NSw3IEBACiAJaW50IGk7CiAJaW50IHJvb20gPSAwOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlICgmd3JpdGVfdXJiX3Bvb2xfbG9jaywgZmxhZ3MpOwogCkBAIC0yOTEsNyArMjg4LDcgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZ3cml0ZV91cmJfcG9vbF9sb2NrLCBmbGFncyk7CiAKLQlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgcm9vbSk7CisJZGJnKCIlcyAtIHJldHVybnMgJWQiLCBfX2Z1bmNfXywgcm9vbSk7CiAKIAlyZXR1cm4gKHJvb20pOwogCkBAIC0zMDQsNyArMzAxLDcgQEAKIAlpbnQgaTsKIAlpbnQgY2hhcnMgPSAwOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlICgmd3JpdGVfdXJiX3Bvb2xfbG9jaywgZmxhZ3MpOwogCkBAIC0zMTcsNyArMzE0LDcgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZ3cml0ZV91cmJfcG9vbF9sb2NrLCBmbGFncyk7CiAKLQlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgY2hhcnMpOworCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19mdW5jX18sIGNoYXJzKTsKIAogCXJldHVybiAoY2hhcnMpOwogCkBAIC0zMjksMTEgKzMyNiwxMSBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmIChzdGF0dXMpIHsKIAkJZGJnKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCkBAIC0zNDMsMjEgKzM0MCwyMSBAQAogCiBzdGF0aWMgdm9pZCBlbXBlZ19yZWFkX2J1bGtfY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlpbnQgcmVzdWx0OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCWRiZygiJXMgLSBub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCi0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKIAogCXR0eSA9IHBvcnQtPnR0eTsKIApAQCAtMzgyLDcgKzM3OSw3IEBACiAJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOwogCiAJaWYgKHJlc3VsdCkKLQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwgIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwgIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCiAJcmV0dXJuOwogCkBAIC0zOTEsNyArMzg4LDcgQEAKIAogc3RhdGljIHZvaWQgZW1wZWdfdGhyb3R0bGUgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7Ci0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAl1c2Jfa2lsbF91cmIocG9ydC0+cmVhZF91cmIpOwogfQogCkBAIC00MDAsMTQgKzM5NywxNCBAQAogewogCWludCByZXN1bHQ7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJcG9ydC0+cmVhZF91cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwogCiAJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOwogCiAJaWYgKHJlc3VsdCkKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCiAJcmV0dXJuOwogfQpAQCAtNDE3LDE0ICs0MTQsMTQgQEAKIHsKIAlpbnQgcjsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlpZiAoc2VyaWFsLT5kZXYtPmFjdGNvbmZpZy0+ZGVzYy5iQ29uZmlndXJhdGlvblZhbHVlICE9IDEpIHsKIAkJZXJyKCJhY3RpdmUgY29uZmlnICMlZCAhPSAxID8/IiwKIAkJCXNlcmlhbC0+ZGV2LT5hY3Rjb25maWctPmRlc2MuYkNvbmZpZ3VyYXRpb25WYWx1ZSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQlkYmcoIiVzIC0gcmVzZXQgY29uZmlnIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gcmVzZXQgY29uZmlnIiwgX19mdW5jX18pOwogCXIgPSB1c2JfcmVzZXRfY29uZmlndXJhdGlvbiAoc2VyaWFsLT5kZXYpOwogCiAJLyogY29udGludWUgb24gd2l0aCBpbml0aWFsaXphdGlvbiAqLwpAQCAtNDM1LDEzICs0MzIsMTMgQEAKIAogc3RhdGljIHZvaWQgZW1wZWdfc2h1dGRvd24gKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7Ci0JZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZyAoIiVzIiwgX19mdW5jX18pOwogfQogCiAKIHN0YXRpYyBpbnQgZW1wZWdfaW9jdGwgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICogZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZGJnKCIlcyAtIHBvcnQgJWQsIGNtZCAweCUuNHgiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlciwgY21kKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCwgY21kIDB4JS40eCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIGNtZCk7CiAKIAlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogfQpAQCAtNDUwLDcgKzQ0Nyw3IEBACiBzdGF0aWMgdm9pZCBlbXBlZ19zZXRfdGVybWlvcyAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKIAlzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MgPSBwb3J0LT50dHktPnRlcm1pb3M7Ci0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCS8qCiAgICAgICAgICAqIFRoZSBlbXBlZy1jYXIgcGxheWVyIHdhbnRzIHRoZXNlIHBhcnRpY3VsYXIgdHR5IHNldHRpbmdzLgpAQCAtNTE3LDcgKzUxNCw3IEBACiAJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0ga21hbGxvYyAoVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmItPnRyYW5zZmVyX2J1ZmZlcikgewogCQkJZXJyKCIlcyAtIG91dCBvZiBtZW1vcnkgZm9yIHVyYiBidWZmZXJzLiIsIAotCQkJICAgIF9fRlVOQ1RJT05fXyk7CisJCQkgICAgX19mdW5jX18pOwogCQkJY29udGludWU7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZXp1c2IuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9lenVzYi5jCmluZGV4IDNmNjk4YmEuLmNjNGZiZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9lenVzYi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9lenVzYi5jCkBAIC0yNywxMyArMjcsMTMgQEAKIAogCS8qIGRiZygiZXp1c2Jfd3JpdGVtZW1vcnkgJXgsICVkIiwgYWRkcmVzcywgbGVuZ3RoKTsgKi8KIAlpZiAoIXNlcmlhbC0+ZGV2KSB7Ci0JCWVycigiJXMgLSBubyBwaHlzaWNhbCBkZXZpY2UgcHJlc2VudCwgZmFpbGluZy4iLCBfX0ZVTkNUSU9OX18pOworCQllcnIoIiVzIC0gbm8gcGh5c2ljYWwgZGV2aWNlIHByZXNlbnQsIGZhaWxpbmcuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAl0cmFuc2Zlcl9idWZmZXIgPSBrbWVtZHVwKGRhdGEsIGxlbmd0aCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0cmFuc2Zlcl9idWZmZXIpIHsKLQkJZGV2X2Vycigmc2VyaWFsLT5kZXYtPmRldiwgIiVzIC0ga21hbGxvYyglZCkgZmFpbGVkLlxuIiwgX19GVU5DVElPTl9fLCBsZW5ndGgpOworCQlkZXZfZXJyKCZzZXJpYWwtPmRldi0+ZGV2LCAiJXMgLSBrbWFsbG9jKCVkKSBmYWlsZWQuXG4iLCBfX2Z1bmNfXywgbGVuZ3RoKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyAoc2VyaWFsLT5kZXYsIHVzYl9zbmRjdHJscGlwZShzZXJpYWwtPmRldiwgMCksIGJSZXF1ZXN0LCAweDQwLCBhZGRyZXNzLCAwLCB0cmFuc2Zlcl9idWZmZXIsIGxlbmd0aCwgMzAwMCk7CkBAIC00NSwxMCArNDUsMTAgQEAKIHsKIAlpbnQgcmVzcG9uc2U7CiAKLQkvKiBkYmcoIiVzIC0gJWQiLCBfX0ZVTkNUSU9OX18sIHJlc2V0X2JpdCk7ICovCisJLyogZGJnKCIlcyAtICVkIiwgX19mdW5jX18sIHJlc2V0X2JpdCk7ICovCiAJcmVzcG9uc2UgPSBlenVzYl93cml0ZW1lbW9yeSAoc2VyaWFsLCBDUFVDU19SRUcsICZyZXNldF9iaXQsIDEsIDB4YTApOwogCWlmIChyZXNwb25zZSA8IDApCi0JCWRldl9lcnIoJnNlcmlhbC0+ZGV2LT5kZXYsICIlcy0gJWQgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc2V0X2JpdCk7CisJCWRldl9lcnIoJnNlcmlhbC0+ZGV2LT5kZXYsICIlcy0gJWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgcmVzZXRfYml0KTsKIAlyZXR1cm4gcmVzcG9uc2U7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKaW5kZXggM2FiYjNjOC4uMjNmNTFhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKQEAgLTQzOSw5ICs0MzksNiBAQAogCS5kZXNjcmlwdGlvbiA9CQkiRlRESSBVU0IgU2VyaWFsIERldmljZSIsCiAJLnVzYl9kcml2ZXIgPSAJCSZmdGRpX2RyaXZlciAsCiAJLmlkX3RhYmxlID0JCWlkX3RhYmxlX2NvbWJpbmVkLAotCS5udW1faW50ZXJydXB0X2luID0JMCwKLQkubnVtX2J1bGtfaW4gPQkJMSwKLQkubnVtX2J1bGtfb3V0ID0JCTEsCiAJLm51bV9wb3J0cyA9CQkxLAogCS5wcm9iZSA9CQlmdGRpX3Npb19wcm9iZSwKIAkucG9ydF9wcm9iZSA9CQlmdGRpX3Npb19wb3J0X3Byb2JlLApAQCAtNTI4LDE0ICs1MjUsMTMgQEAKIAlpbnQgcnY7CiAKIAlpZiAoKChzZXQgfCBjbGVhcikgJiAoVElPQ01fRFRSIHwgVElPQ01fUlRTKSkgPT0gMCkgewotCQlkYmcoIiVzIC0gRFRSfFJUUyBub3QgYmVpbmcgc2V0fGNsZWFyZWQiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gRFRSfFJUUyBub3QgYmVpbmcgc2V0fGNsZWFyZWQiLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwkvKiBubyBjaGFuZ2UgKi8KIAl9CiAKIAlidWYgPSBrbWFsbG9jKDEsIEdGUF9OT0lPKTsKLQlpZiAoIWJ1ZikgeworCWlmICghYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAljbGVhciAmPSB+c2V0OwkvKiAnc2V0JyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgJ2NsZWFyJyAqLwogCXVyYl92YWx1ZSA9IDA7CkBAIC01NTcsMTcgKzU1MywxOCBAQAogCWtmcmVlKGJ1Zik7CiAJaWYgKHJ2IDwgMCkgewogCQllcnIoIiVzIEVycm9yIGZyb20gTU9ERU1fQ1RSTCB1cmI6IERUUiAlcywgUlRTICVzIiwKLQkJCQlfX0ZVTkNUSU9OX18sCisJCQkJX19mdW5jX18sCiAJCQkJKHNldCAmIFRJT0NNX0RUUikgPyAiSElHSCIgOgogCQkJCShjbGVhciAmIFRJT0NNX0RUUikgPyAiTE9XIiA6ICJ1bmNoYW5nZWQiLAogCQkJCShzZXQgJiBUSU9DTV9SVFMpID8gIkhJR0giIDoKIAkJCQkoY2xlYXIgJiBUSU9DTV9SVFMpID8gIkxPVyIgOiAidW5jaGFuZ2VkIik7CiAJfSBlbHNlIHsKLQkJZGJnKCIlcyAtIERUUiAlcywgUlRTICVzIiwgX19GVU5DVElPTl9fLAorCQlkYmcoIiVzIC0gRFRSICVzLCBSVFMgJXMiLCBfX2Z1bmNfXywKIAkJCQkoc2V0ICYgVElPQ01fRFRSKSA/ICJISUdIIiA6CiAJCQkJKGNsZWFyICYgVElPQ01fRFRSKSA/ICJMT1ciIDogInVuY2hhbmdlZCIsCiAJCQkJKHNldCAmIFRJT0NNX1JUUykgPyAiSElHSCIgOgogCQkJCShjbGVhciAmIFRJT0NNX1JUUykgPyAiTE9XIiA6ICJ1bmNoYW5nZWQiKTsKKwkJLyogRklYTUU6IGxvY2tpbmcgb24gbGFzdF9kdHJfcnRzICovCiAJCXByaXYtPmxhc3RfZHRyX3J0cyA9IChwcml2LT5sYXN0X2R0cl9ydHMgJiB+Y2xlYXIpIHwgc2V0OwogCX0KIAlyZXR1cm4gcnY7CkBAIC02NDIsNyArNjM5LDcgQEAKIAkvKiAxLiBHZXQgdGhlIGJhdWQgcmF0ZSBmcm9tIHRoZSB0dHkgc2V0dGluZ3MsIHRoaXMgb2JzZXJ2ZXMgYWx0X3NwZWVkIGhhY2sgKi8KIAogCWJhdWQgPSB0dHlfZ2V0X2JhdWRfcmF0ZShwb3J0LT50dHkpOwotCWRiZygiJXMgLSB0dHlfZ2V0X2JhdWRfcmF0ZSByZXBvcnRzIHNwZWVkICVkIiwgX19GVU5DVElPTl9fLCBiYXVkKTsKKwlkYmcoIiVzIC0gdHR5X2dldF9iYXVkX3JhdGUgcmVwb3J0cyBzcGVlZCAlZCIsIF9fZnVuY19fLCBiYXVkKTsKIAogCS8qIDIuIE9ic2VydmUgYXN5bmMtY29tcGF0aWJsZSBjdXN0b21fZGl2aXNvciBoYWNrLCB1cGRhdGUgYmF1ZHJhdGUgaWYgbmVlZGVkICovCiAKQEAgLTY1MCw3ICs2NDcsNyBAQAogCSAgICAoKHByaXYtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9DVVNUKSAmJgogCSAgICAgKHByaXYtPmN1c3RvbV9kaXZpc29yKSkgewogCQliYXVkID0gcHJpdi0+YmF1ZF9iYXNlIC8gcHJpdi0+Y3VzdG9tX2Rpdmlzb3I7Ci0JCWRiZygiJXMgLSBjdXN0b20gZGl2aXNvciAlZCBzZXRzIGJhdWQgcmF0ZSB0byAlZCIsIF9fRlVOQ1RJT05fXywgcHJpdi0+Y3VzdG9tX2Rpdmlzb3IsIGJhdWQpOworCQlkYmcoIiVzIC0gY3VzdG9tIGRpdmlzb3IgJWQgc2V0cyBiYXVkIHJhdGUgdG8gJWQiLCBfX2Z1bmNfXywgcHJpdi0+Y3VzdG9tX2Rpdmlzb3IsIGJhdWQpOwogCX0KIAogCS8qIDMuIENvbnZlcnQgYmF1ZHJhdGUgdG8gZGV2aWNlLXNwZWNpZmljIGRpdmlzb3IgKi8KQEAgLTY3MSw3ICs2NjgsNyBAQAogCQljYXNlIDExNTIwMDogZGl2X3ZhbHVlID0gZnRkaV9zaW9fYjExNTIwMDsgYnJlYWs7CiAJCX0gLyogYmF1ZCAqLwogCQlpZiAoZGl2X3ZhbHVlID09IDApIHsKLQkJCWRiZygiJXMgLSBCYXVkcmF0ZSAoJWQpIHJlcXVlc3RlZCBpcyBub3Qgc3VwcG9ydGVkIiwgX19GVU5DVElPTl9fLCAgYmF1ZCk7CisJCQlkYmcoIiVzIC0gQmF1ZHJhdGUgKCVkKSByZXF1ZXN0ZWQgaXMgbm90IHN1cHBvcnRlZCIsIF9fZnVuY19fLCAgYmF1ZCk7CiAJCQlkaXZfdmFsdWUgPSBmdGRpX3Npb19iOTYwMDsKIAkJCWJhdWQgPSA5NjAwOwogCQkJZGl2X29rYXkgPSAwOwpAQCAtNjgxLDcgKzY3OCw3IEBACiAJCWlmIChiYXVkIDw9IDMwMDAwMDApIHsKIAkJCWRpdl92YWx1ZSA9IGZ0ZGlfMjMyYW1fYmF1ZF90b19kaXZpc29yKGJhdWQpOwogCQl9IGVsc2UgewotCSAgICAgICAgICAgICAgICBkYmcoIiVzIC0gQmF1ZCByYXRlIHRvbyBoaWdoISIsIF9fRlVOQ1RJT05fXyk7CisJICAgICAgICAgICAgICAgIGRiZygiJXMgLSBCYXVkIHJhdGUgdG9vIGhpZ2ghIiwgX19mdW5jX18pOwogCQkJYmF1ZCA9IDk2MDA7CiAJCQlkaXZfdmFsdWUgPSBmdGRpXzIzMmFtX2JhdWRfdG9fZGl2aXNvcig5NjAwKTsKIAkJCWRpdl9va2F5ID0gMDsKQEAgLTY5Myw3ICs2OTAsNyBAQAogCQlpZiAoYmF1ZCA8PSAzMDAwMDAwKSB7CiAJCQlkaXZfdmFsdWUgPSBmdGRpXzIzMmJtX2JhdWRfdG9fZGl2aXNvcihiYXVkKTsKIAkJfSBlbHNlIHsKLQkgICAgICAgICAgICAgICAgZGJnKCIlcyAtIEJhdWQgcmF0ZSB0b28gaGlnaCEiLCBfX0ZVTkNUSU9OX18pOworCSAgICAgICAgICAgICAgICBkYmcoIiVzIC0gQmF1ZCByYXRlIHRvbyBoaWdoISIsIF9fZnVuY19fKTsKIAkJCWRpdl92YWx1ZSA9IGZ0ZGlfMjMyYm1fYmF1ZF90b19kaXZpc29yKDk2MDApOwogCQkJZGl2X29rYXkgPSAwOwogCQkJYmF1ZCA9IDk2MDA7CkBAIC03MDMsNyArNzAwLDcgQEAKIAogCWlmIChkaXZfb2theSkgewogCQlkYmcoIiVzIC0gQmF1ZCByYXRlIHNldCB0byAlZCAoZGl2aXNvciAweCVsWCkgb24gY2hpcCAlcyIsCi0JCQlfX0ZVTkNUSU9OX18sIGJhdWQsICh1bnNpZ25lZCBsb25nKWRpdl92YWx1ZSwKKwkJCV9fZnVuY19fLCBiYXVkLCAodW5zaWduZWQgbG9uZylkaXZfdmFsdWUsCiAJCQlmdGRpX2NoaXBfbmFtZVtwcml2LT5jaGlwX3R5cGVdKTsKIAl9CiAKQEAgLTgwNCw3ICs4MDEsNyBAQAogCiAJdmVyc2lvbiA9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKTsKIAlpbnRlcmZhY2VzID0gdWRldi0+YWN0Y29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzOwotCWRiZygiJXM6IGJjZERldmljZSA9IDB4JXgsIGJOdW1JbnRlcmZhY2VzID0gJXUiLCBfX0ZVTkNUSU9OX18sCisJZGJnKCIlczogYmNkRGV2aWNlID0gMHgleCwgYk51bUludGVyZmFjZXMgPSAldSIsIF9fZnVuY19fLAogCQkJdmVyc2lvbiwgaW50ZXJmYWNlcyk7CiAJaWYgKGludGVyZmFjZXMgPiAxKSB7CiAJCWludCBpbnRlcjsKQEAgLTgyMiw3ICs4MTksNyBAQAogCQkgKiB0byAweDIwMCB3aGVuIGlTZXJpYWxOdW1iZXIgaXMgMC4gICovCiAJCWlmICh2ZXJzaW9uIDwgMHg1MDApIHsKIAkJCWRiZygiJXM6IHNvbWV0aGluZyBmaXNoeSAtIGJjZERldmljZSB0b28gbG93IGZvciBtdWx0aS1pbnRlcmZhY2UgZGV2aWNlIiwKLQkJCQkJX19GVU5DVElPTl9fKTsKKwkJCQkJX19mdW5jX18pOwogCQl9CiAJfSBlbHNlIGlmICh2ZXJzaW9uIDwgMHgyMDApIHsKIAkJLyogT2xkIGRldmljZS4gIEFzc3VtZSBpdHMgdGhlIG9yaWdpbmFsIFNJTy4gKi8KQEAgLTg2MCw3ICs4NTcsNyBAQAogCWludCBydiA9IDA7CiAKIAotCWRiZygiJXMiLF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsX19mdW5jX18pOwogCiAJcnYgPSB1c2JfY29udHJvbF9tc2codWRldiwKIAkJCSAgICAgdXNiX3JjdmN0cmxwaXBlKHVkZXYsIDApLApAQCAtODg3LDcgKzg4NCw3IEBACiAJaW50IHYgPSBzaW1wbGVfc3RydG91bCh2YWxidWYsIE5VTEwsIDEwKTsKIAlpbnQgcnYgPSAwOwogCi0JZGJnKCIlczogc2V0dGluZyBsYXRlbmN5IHRpbWVyID0gJWkiLCBfX0ZVTkNUSU9OX18sIHYpOworCWRiZygiJXM6IHNldHRpbmcgbGF0ZW5jeSB0aW1lciA9ICVpIiwgX19mdW5jX18sIHYpOwogCiAJcnYgPSB1c2JfY29udHJvbF9tc2codWRldiwKIAkJCSAgICAgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLApAQCAtOTE2LDcgKzkxMyw3IEBACiAJaW50IHYgPSBzaW1wbGVfc3RydG91bCh2YWxidWYsIE5VTEwsIDEwKTsKIAlpbnQgcnYgPSAwOwogCi0JZGJnKCIlczogc2V0dGluZyBldmVudCBjaGFyID0gJWkiLCBfX0ZVTkNUSU9OX18sIHYpOworCWRiZygiJXM6IHNldHRpbmcgZXZlbnQgY2hhciA9ICVpIiwgX19mdW5jX18sIHYpOwogCiAJcnYgPSB1c2JfY29udHJvbF9tc2codWRldiwKIAkJCSAgICAgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLApAQCAtOTQxLDcgKzkzOCw3IEBACiAJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlpbnQgcmV0dmFsID0gMDsKIAotCWRiZygiJXMiLF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsX19mdW5jX18pOwogCiAJLyogWFhYIEkndmUgbm8gaWRlYSBpZiB0aGUgb3JpZ2luYWwgU0lPIHN1cHBvcnRzIHRoZSBldmVudF9jaGFyCiAJICogc3lzZnMgcGFyYW1ldGVyLCBzbyBJJ20gcGxheWluZyBpdCBzYWZlLiAgKi8KQEAgLTk2Myw3ICs5NjAsNyBAQAogewogCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKLQlkYmcoIiVzIixfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLF9fZnVuY19fKTsKIAogCS8qIFhYWCBzZWUgY3JlYXRlX3N5c2ZzX2F0dHJzICovCiAJaWYgKHByaXYtPmNoaXBfdHlwZSAhPSBTSU8pIHsKQEAgLTEwMDUsMTEgKzEwMDIsMTEgQEAKIAlzdHJ1Y3QgZnRkaV9zaW9fcXVpcmsgKnF1aXJrID0gdXNiX2dldF9zZXJpYWxfZGF0YShwb3J0LT5zZXJpYWwpOwogCiAKLQlkYmcoIiVzIixfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLF9fZnVuY19fKTsKIAogCXByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZnRkaV9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcml2KXsKLQkJZXJyKCIlcy0ga21hbGxvYyglWmQpIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18sIHNpemVvZihzdHJ1Y3QgZnRkaV9wcml2YXRlKSk7CisJCWVycigiJXMtIGttYWxsb2MoJVpkKSBmYWlsZWQuIiwgX19mdW5jX18sIHNpemVvZihzdHJ1Y3QgZnRkaV9wcml2YXRlKSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTA1OCw3ICsxMDU1LDcgQEAKIC8qIENhbGxlZCBmcm9tIHVzYnNlcmlhbDpzZXJpYWxfcHJvYmUgKi8KIHN0YXRpYyB2b2lkIGZ0ZGlfVVNCX1VJUlRfc2V0dXAgKHN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYpCiB7Ci0JZGJnKCIlcyIsX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIixfX2Z1bmNfXyk7CiAKIAlwcml2LT5mbGFncyB8PSBBU1lOQ19TUERfQ1VTVDsKIAlwcml2LT5jdXN0b21fZGl2aXNvciA9IDc3OwpAQCAtMTA2OSw3ICsxMDY2LDcgQEAKICAqIGJhdWRyYXRlICgzODQwMCBnZXRzIG1hcHBlZCB0byAxMDAwMDApIGFuZCBSVFMtQ1RTIGVuYWJsZWQuICAqLwogc3RhdGljIHZvaWQgZnRkaV9IRV9USVJBMV9zZXR1cCAoc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdikKIHsKLQlkYmcoIiVzIixfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLF9fZnVuY19fKTsKIAogCXByaXYtPmZsYWdzIHw9IEFTWU5DX1NQRF9DVVNUOwogCXByaXYtPmN1c3RvbV9kaXZpc29yID0gMjQwOwpAQCAtMTA4Nyw3ICsxMDg0LDcgQEAKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHNlcmlhbC0+ZGV2OwogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBzZXJpYWwtPmludGVyZmFjZTsKIAotCWRiZygiJXMiLF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsX19mdW5jX18pOwogCiAJaWYgKGludGVyZmFjZSA9PSB1ZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVswXSkgewogCQlpbmZvKCJJZ25vcmluZyBzZXJpYWwgcG9ydCByZXNlcnZlZCBmb3IgSlRBRyIpOwpAQCAtMTEyMywxNCArMTEyMCwxNCBAQAogICovCiBzdGF0aWMgdm9pZCBmdGRpX3NodXRkb3duIChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQogewotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiB9CiAKIHN0YXRpYyBpbnQgZnRkaV9zaW9fcG9ydF9yZW1vdmUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCXJlbW92ZV9zeXNmc19hdHRycyhwb3J0KTsKIApAQCAtMTE1NSw3ICsxMTUyLDcgQEAKIAlpbnQgcmVzdWx0ID0gMDsKIAljaGFyIGJ1ZlsxXTsgLyogTmVlZGVkIGZvciB0aGUgdXNiX2NvbnRyb2xfbXNnIEkgdGhpbmsgKi8KIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOwogCXByaXYtPnR4X2J5dGVzID0gMDsKQEAgLTEyMDAsNyArMTE5Nyw3IEBACiAJCSAgICAgIGZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrLCBwb3J0KTsKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJlc3VsdCkKLQkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogCiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMTIyMiw3ICsxMjE5LDcgQEAKIAlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWNoYXIgYnVmWzFdOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCW11dGV4X2xvY2soJnBvcnQtPnNlcmlhbC0+ZGlzY19tdXRleCk7CiAJaWYgKGNfY2ZsYWcgJiBIVVBDTCAmJiAhcG9ydC0+c2VyaWFsLT5kaXNjb25uZWN0ZWQpewpAQCAtMTI2OSw3ICsxMjY2LDcgQEAKIAlpbnQgdHJhbnNmZXJfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyBwb3J0ICVkLCAlZCBieXRlcyIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjb3VudCk7CisJZGJnKCIlcyBwb3J0ICVkLCAlZCBieXRlcyIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIGNvdW50KTsKIAogCWlmIChjb3VudCA9PSAwKSB7CiAJCWRiZygid3JpdGUgcmVxdWVzdCBvZiAwIGJ5dGVzIik7CkBAIC0xMjc4LDcgKzEyNzUsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT50eF9sb2NrLCBmbGFncyk7CiAJaWYgKHByaXYtPnR4X291dHN0YW5kaW5nX3VyYnMgPiBVUkJfVVBQRVJfTElNSVQpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOwotCQlkYmcoIiVzIC0gd3JpdGUgbGltaXQgaGl0XG4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gd3JpdGUgbGltaXQgaGl0XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KIAlwcml2LT50eF9vdXRzdGFuZGluZ191cmJzKys7CkBAIC0xMjk4LDE0ICsxMjk1LDE0IEBACiAKIAlidWZmZXIgPSBrbWFsbG9jICh0cmFuc2Zlcl9zaXplLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWJ1ZmZlcikgewotCQllcnIoIiVzIHJhbiBvdXQgb2Yga2VybmVsIG1lbW9yeSBmb3IgdXJiIC4uLiIsIF9fRlVOQ1RJT05fXyk7CisJCWVycigiJXMgcmFuIG91dCBvZiBrZXJuZWwgbWVtb3J5IGZvciB1cmIgLi4uIiwgX19mdW5jX18pOwogCQljb3VudCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3Jfbm9fYnVmZmVyOwogCX0KIAogCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CiAJaWYgKCF1cmIpIHsKLQkJZXJyKCIlcyAtIG5vIG1vcmUgZnJlZSB1cmJzIiwgX19GVU5DVElPTl9fKTsKKwkJZXJyKCIlcyAtIG5vIG1vcmUgZnJlZSB1cmJzIiwgX19mdW5jX18pOwogCQljb3VudCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3Jfbm9fdXJiOwogCX0KQEAgLTEzMzcsNyArMTMzNCw3IEBACiAJCW1lbWNweSAoYnVmZmVyLCBidWYsIGNvdW50KTsKIAl9CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgdHJhbnNmZXJfc2l6ZSwgYnVmZmVyKTsKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLCB0cmFuc2Zlcl9zaXplLCBidWZmZXIpOwogCiAJLyogZmlsbCB0aGUgYnVmZmVyIGFuZCBzZW5kIGl0ICovCiAJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBwb3J0LT5zZXJpYWwtPmRldiwKQEAgLTEzNDcsNyArMTM0NCw3IEBACiAKIAlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChzdGF0dXMpIHsKLQkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWVycigiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCWNvdW50ID0gc3RhdHVzOwogCQlnb3RvIGVycm9yOwogCX0gZWxzZSB7CkBAIC0xMzYxLDcgKzEzNTgsNyBAQAogCSAqIHJlYWxseSBmcmVlIGl0IHdoZW4gaXQgaXMgZmluaXNoZWQgd2l0aCBpdCAqLwogCXVzYl9mcmVlX3VyYih1cmIpOwogCi0JZGJnKCIlcyB3cml0ZSByZXR1cm5pbmc6ICVkIiwgX19GVU5DVElPTl9fLCBjb3VudCk7CisJZGJnKCIlcyB3cml0ZSByZXR1cm5pbmc6ICVkIiwgX19mdW5jX18sIGNvdW50KTsKIAlyZXR1cm4gY291bnQ7CiBlcnJvcjoKIAl1c2JfZnJlZV91cmIodXJiKTsKQEAgLTEzODAsNyArMTM3Nyw3IEBACiBzdGF0aWMgdm9pZCBmdGRpX3dyaXRlX2J1bGtfY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXY7CiAJaW50IGRhdGFfb2Zmc2V0OyAgICAgICAvKiB3aWxsIGJlIDEgZm9yIHRoZSBTSU8gYW5kIDAgb3RoZXJ3aXNlICovCiAJdW5zaWduZWQgbG9uZyBjb3VudGJhY2s7CkBAIC0xMzg5LDcgKzEzODYsNyBAQAogCS8qIGZyZWUgdXAgdGhlIHRyYW5zZmVyIGJ1ZmZlciwgYXMgdXNiX2ZyZWVfdXJiKCkgZG9lcyBub3QgZG8gdGhpcyAqLwogCWtmcmVlICh1cmItPnRyYW5zZmVyX2J1ZmZlcik7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKHN0YXR1cykgewogCQlkYmcoIm5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgc3RhdHVzKTsKQEAgLTEzOTgsNyArMTM5NSw3IEBACiAKIAlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWlmICghcHJpdikgewotCQlkYmcoIiVzIC0gYmFkIHBvcnQgcHJpdmF0ZSBkYXRhIHBvaW50ZXIgLSBleGl0aW5nIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIGJhZCBwb3J0IHByaXZhdGUgZGF0YSBwb2ludGVyIC0gZXhpdGluZyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAkvKiBhY2NvdW50IGZvciB0cmFuc2ZlcnJlZCBkYXRhICovCkBAIC0xNDA2LDcgKzE0MDMsNyBAQAogCWRhdGFfb2Zmc2V0ID0gcHJpdi0+d3JpdGVfb2Zmc2V0OwogCWlmIChkYXRhX29mZnNldCA+IDApIHsKIAkJLyogU3VidHJhY3QgdGhlIGNvbnRyb2wgYnl0ZXMgKi8KLQkJY291bnRiYWNrIC09IChkYXRhX29mZnNldCAqICgoY291bnRiYWNrICsgKFBLVFNaIC0gMSkpIC8gUEtUU1opKTsKKwkJY291bnRiYWNrIC09IChkYXRhX29mZnNldCAqIERJVl9ST1VORF9VUChjb3VudGJhY2ssIFBLVFNaKSk7CiAJfQogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT50eF9sb2NrLCBmbGFncyk7CiAJLS1wcml2LT50eF9vdXRzdGFuZGluZ191cmJzOwpAQCAtMTQyMyw3ICsxNDIwLDcgQEAKIAlpbnQgcm9vbTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT50eF9sb2NrLCBmbGFncyk7CiAJaWYgKHByaXYtPnR4X291dHN0YW5kaW5nX3VyYnMgPCBVUkJfVVBQRVJfTElNSVQpIHsKQEAgLTE0NDcsMTMgKzE0NDQsMTMgQEAKIAlpbnQgYnVmZmVyZWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOwogCWJ1ZmZlcmVkID0gKGludClwcml2LT50eF9vdXRzdGFuZGluZ19ieXRlczsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLCBmbGFncyk7CiAJaWYgKGJ1ZmZlcmVkIDwgMCkgewotCQllcnIoIiVzIG91dHN0YW5kaW5nIHR4IGJ5dGVzIGlzIG5lZ2F0aXZlISIsIF9fRlVOQ1RJT05fXyk7CisJCWVycigiJXMgb3V0c3RhbmRpbmcgdHggYnl0ZXMgaXMgbmVnYXRpdmUhIiwgX19mdW5jX18pOwogCQlidWZmZXJlZCA9IDA7CiAJfQogCXJldHVybiBidWZmZXJlZDsKQEAgLTE0NjMsNyArMTQ2MCw3IEBACiAKIHN0YXRpYyB2b2lkIGZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7IC8qIGZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrICovCi0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2OwogCXVuc2lnbmVkIGxvbmcgY291bnRyZWFkOwpAQCAtMTQ3MSwzMCArMTQ2OCwzMCBAQAogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAogCWlmICh1cmItPm51bWJlcl9vZl9wYWNrZXRzID4gMCkgewotCQllcnIoIiVzIHRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggJWQgYWN0dWFsX2xlbmd0aCAlZCBudW1iZXIgb2YgcGFja2V0cyAlZCIsX19GVU5DVElPTl9fLAorCQllcnIoIiVzIHRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggJWQgYWN0dWFsX2xlbmd0aCAlZCBudW1iZXIgb2YgcGFja2V0cyAlZCIsX19mdW5jX18sCiAJCSAgICB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsIHVyYi0+YWN0dWFsX2xlbmd0aCwgdXJiLT5udW1iZXJfb2ZfcGFja2V0cyApOwotCQllcnIoIiVzIHRyYW5zZmVyX2ZsYWdzICV4ICIsIF9fRlVOQ1RJT05fXyx1cmItPnRyYW5zZmVyX2ZsYWdzICk7CisJCWVycigiJXMgdHJhbnNmZXJfZmxhZ3MgJXggIiwgX19mdW5jX18sdXJiLT50cmFuc2Zlcl9mbGFncyApOwogCX0KIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAocG9ydC0+b3Blbl9jb3VudCA8PSAwKQogCQlyZXR1cm47CiAKIAl0dHkgPSBwb3J0LT50dHk7CiAJaWYgKCF0dHkpIHsKLQkJZGJnKCIlcyAtIGJhZCB0dHkgcG9pbnRlciAtIGV4aXRpbmciLF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBiYWQgdHR5IHBvaW50ZXIgLSBleGl0aW5nIixfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKIAlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWlmICghcHJpdikgewotCQlkYmcoIiVzIC0gYmFkIHBvcnQgcHJpdmF0ZSBkYXRhIHBvaW50ZXIgLSBleGl0aW5nIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIGJhZCBwb3J0IHByaXZhdGUgZGF0YSBwb2ludGVyIC0gZXhpdGluZyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmICh1cmIgIT0gcG9ydC0+cmVhZF91cmIpIHsKLQkJZXJyKCIlcyAtIE5vdCBteSB1cmIhIiwgX19GVU5DVElPTl9fKTsKKwkJZXJyKCIlcyAtIE5vdCBteSB1cmIhIiwgX19mdW5jX18pOwogCX0KIAogCWlmIChzdGF0dXMpIHsKQEAgLTE1MDYsNyArMTUwMyw3IEBACiAKIAkvKiBjb3VudCBkYXRhIGJ5dGVzLCBidXQgbm90IHN0YXR1cyBieXRlcyAqLwogCWNvdW50cmVhZCA9IHVyYi0+YWN0dWFsX2xlbmd0aDsKLQljb3VudHJlYWQgLT0gMiAqICgoY291bnRyZWFkICsgKFBLVFNaIC0gMSkpIC8gUEtUU1opOworCWNvdW50cmVhZCAtPSAyICogRElWX1JPVU5EX1VQKGNvdW50cmVhZCwgUEtUU1opOwogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7CiAJcHJpdi0+cnhfYnl0ZXMgKz0gY291bnRyZWFkOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKQEAgLTE1MzIsMzkgKzE1MjksMzkgQEAKIAlpbnQgcGFja2V0X29mZnNldDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmIChwb3J0LT5vcGVuX2NvdW50IDw9IDApCiAJCXJldHVybjsKIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAoIXR0eSkgewotCQlkYmcoIiVzIC0gYmFkIHR0eSBwb2ludGVyIC0gZXhpdGluZyIsX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIGJhZCB0dHkgcG9pbnRlciAtIGV4aXRpbmciLF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAogCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJaWYgKCFwcml2KSB7Ci0JCWRiZygiJXMgLSBiYWQgcG9ydCBwcml2YXRlIGRhdGEgcG9pbnRlciAtIGV4aXRpbmciLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gYmFkIHBvcnQgcHJpdmF0ZSBkYXRhIHBvaW50ZXIgLSBleGl0aW5nIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCiAJdXJiID0gcG9ydC0+cmVhZF91cmI7CiAJaWYgKCF1cmIpIHsKLQkJZGJnKCIlcyAtIGJhZCByZWFkX3VyYiBwb2ludGVyIC0gZXhpdGluZyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBiYWQgcmVhZF91cmIgcG9pbnRlciAtIGV4aXRpbmciLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKIAlkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAKIAlpZiAocHJpdi0+cnhfcHJvY2Vzc2VkKSB7Ci0JCWRiZygiJXMgLSBhbHJlYWR5IHByb2Nlc3NlZDogJWQgYnl0ZXMsICVkIHJlbWFpbiIsIF9fRlVOQ1RJT05fXywKKwkJZGJnKCIlcyAtIGFscmVhZHkgcHJvY2Vzc2VkOiAlZCBieXRlcywgJWQgcmVtYWluIiwgX19mdW5jX18sCiAJCQkJcHJpdi0+cnhfcHJvY2Vzc2VkLAogCQkJCXVyYi0+YWN0dWFsX2xlbmd0aCAtIHByaXYtPnJ4X3Byb2Nlc3NlZCk7CiAJfSBlbHNlIHsKIAkJLyogVGhlIGZpcnN0IHR3byBieXRlcyBvZiBldmVyeSByZWFkIHBhY2tldCBhcmUgc3RhdHVzICovCiAJCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPiAyKSB7Ci0JCQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKKwkJCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CiAJCX0gZWxzZSB7CiAJCQlkYmcoIlN0YXR1cyBvbmx5OiAlMDNvbyAlMDNvbyIsZGF0YVswXSxkYXRhWzFdKTsKIAkJfQpAQCAtMTU5NCwxNyArMTU5MSwxNyBAQAogCiAJCWxlbmd0aCA9IG1pbihQS1RTWiwgdXJiLT5hY3R1YWxfbGVuZ3RoLXBhY2tldF9vZmZzZXQpLTI7CiAJCWlmIChsZW5ndGggPCAwKSB7Ci0JCQllcnIoIiVzIC0gYmFkIHBhY2tldCBsZW5ndGg6ICVkIiwgX19GVU5DVElPTl9fLCBsZW5ndGgrMik7CisJCQllcnIoIiVzIC0gYmFkIHBhY2tldCBsZW5ndGg6ICVkIiwgX19mdW5jX18sIGxlbmd0aCsyKTsKIAkJCWxlbmd0aCA9IDA7CiAJCX0KIAogCQlpZiAocHJpdi0+cnhfZmxhZ3MgJiBUSFJPVFRMRUQpIHsKLQkJCWRiZygiJXMgLSB0aHJvdHRsZWQiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHRocm90dGxlZCIsIF9fZnVuY19fKTsKIAkJCWJyZWFrOwogCQl9CiAJCWlmICh0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIGxlbmd0aCkgPCBsZW5ndGgpIHsKIAkJCS8qIGJyZWFrIG91dCAmIHdhaXQgZm9yIHRocm90dGxpbmcvdW50aHJvdHRsaW5nIHRvIGhhcHBlbiAqLwotCQkJZGJnKCIlcyAtIHJlY2VpdmUgcm9vbSBsb3ciLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHJlY2VpdmUgcm9vbSBsb3ciLCBfX2Z1bmNfXyk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0xNjcyLDcgKzE2NjksNyBAQAogCQkvKiBub3QgY29tcGxldGVseSBwcm9jZXNzZWQgLSByZWNvcmQgcHJvZ3Jlc3MgKi8KIAkJcHJpdi0+cnhfcHJvY2Vzc2VkID0gcGFja2V0X29mZnNldDsKIAkJZGJnKCIlcyAtIGluY29tcGxldGUsICVkIGJ5dGVzIHByb2Nlc3NlZCwgJWQgcmVtYWluIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHBhY2tldF9vZmZzZXQsCisJCQkJX19mdW5jX18sIHBhY2tldF9vZmZzZXQsCiAJCQkJdXJiLT5hY3R1YWxfbGVuZ3RoIC0gcGFja2V0X29mZnNldCk7CiAJCS8qIGNoZWNrIGlmIHdlIHdlcmUgdGhyb3R0bGVkIHdoaWxlIHByb2Nlc3NpbmcgKi8KIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKQEAgLTE2ODAsNyArMTY3Nyw3IEBACiAJCQlwcml2LT5yeF9mbGFncyB8PSBBQ1RVQUxMWV9USFJPVFRMRUQ7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7CiAJCQlkYmcoIiVzIC0gZGVmZXJyaW5nIHJlbWFpbmRlciB1bnRpbCB1bnRocm90dGxlZCIsCi0JCQkJCV9fRlVOQ1RJT05fXyk7CisJCQkJCV9fZnVuY19fKTsKIAkJCXJldHVybjsKIAkJfQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7CkBAIC0xNjg5LDcgKzE2ODYsNyBAQAogCQkJLyogZGVsYXkgcHJvY2Vzc2luZyBvZiByZW1haW5kZXIgKi8KIAkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+cnhfd29yaywgMSk7CiAJCX0gZWxzZSB7Ci0JCQlkYmcoIiVzIC0gcG9ydCBpcyBjbG9zZWQiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHBvcnQgaXMgY2xvc2VkIiwgX19mdW5jX18pOwogCQl9CiAJCXJldHVybjsKIAl9CkBAIC0xNzA3LDcgKzE3MDQsNyBAQAogCiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJlc3VsdCkKLQkJCWVycigiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCWVycigiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogCX0KIAogCXJldHVybjsKQEAgLTE3MzYsMTAgKzE3MzMsMTAgQEAKIAkJCSAgICBGVERJX1NJT19TRVRfREFUQV9SRVFVRVNUX1RZUEUsCiAJCQkgICAgdXJiX3ZhbHVlICwgcHJpdi0+aW50ZXJmYWNlLAogCQkJICAgIGJ1ZiwgMCwgV0RSX1RJTUVPVVQpIDwgMCkgewotCQllcnIoIiVzIEZBSUxFRCB0byBlbmFibGUvZGlzYWJsZSBicmVhayBzdGF0ZSAoc3RhdGUgd2FzICVkKSIsIF9fRlVOQ1RJT05fXyxicmVha19zdGF0ZSk7CisJCWVycigiJXMgRkFJTEVEIHRvIGVuYWJsZS9kaXNhYmxlIGJyZWFrIHN0YXRlIChzdGF0ZSB3YXMgJWQpIiwgX19mdW5jX18sYnJlYWtfc3RhdGUpOwogCX0KIAotCWRiZygiJXMgYnJlYWsgc3RhdGUgaXMgJWQgLSB1cmIgaXMgJWQiLCBfX0ZVTkNUSU9OX18sYnJlYWtfc3RhdGUsIHVyYl92YWx1ZSk7CisJZGJnKCIlcyBicmVhayBzdGF0ZSBpcyAlZCAtIHVyYiBpcyAlZCIsIF9fZnVuY19fLGJyZWFrX3N0YXRlLCB1cmJfdmFsdWUpOwogCiB9CiAKQEAgLTE3NjMsMTggKzE3NjAsMTggQEAKIAl1bnNpZ25lZCBjaGFyIHZzdG9wOwogCXVuc2lnbmVkIGNoYXIgdnN0YXJ0OwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCS8qIEZvcmNlIGJhdWQgcmF0ZSBpZiB0aGlzIGRldmljZSByZXF1aXJlcyBpdCwgdW5sZXNzIGl0IGlzIHNldCB0byBCMC4gKi8KIAlpZiAocHJpdi0+Zm9yY2VfYmF1ZCAmJiAoKHRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgIT0gQjApKSB7Ci0JCWRiZygiJXM6IGZvcmNpbmcgYmF1ZCByYXRlIGZvciB0aGlzIGRldmljZSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXM6IGZvcmNpbmcgYmF1ZCByYXRlIGZvciB0aGlzIGRldmljZSIsIF9fZnVuY19fKTsKIAkJdHR5X2VuY29kZV9iYXVkX3JhdGUocG9ydC0+dHR5LCBwcml2LT5mb3JjZV9iYXVkLAogCQkJCQlwcml2LT5mb3JjZV9iYXVkKTsKIAl9CiAKIAkvKiBGb3JjZSBSVFMtQ1RTIGlmIHRoaXMgZGV2aWNlIHJlcXVpcmVzIGl0LiAqLwogCWlmIChwcml2LT5mb3JjZV9ydHNjdHMpIHsKLQkJZGJnKCIlczogZm9yY2luZyBydHNjdHMgZm9yIHRoaXMgZGV2aWNlIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlczogZm9yY2luZyBydHNjdHMgZm9yIHRoaXMgZGV2aWNlIiwgX19mdW5jX18pOwogCQl0ZXJtaW9zLT5jX2NmbGFnIHw9IENSVFNDVFM7CiAJfQogCkBAIC0xODE4LDcgKzE4MTUsNyBAQAogCQkJICAgIEZURElfU0lPX1NFVF9EQVRBX1JFUVVFU1RfVFlQRSwKIAkJCSAgICB1cmJfdmFsdWUgLCBwcml2LT5pbnRlcmZhY2UsCiAJCQkgICAgYnVmLCAwLCBXRFJfU0hPUlRfVElNRU9VVCkgPCAwKSB7Ci0JCWVycigiJXMgRkFJTEVEIHRvIHNldCBkYXRhYml0cy9zdG9wYml0cy9wYXJpdHkiLCBfX0ZVTkNUSU9OX18pOworCQllcnIoIiVzIEZBSUxFRCB0byBzZXQgZGF0YWJpdHMvc3RvcGJpdHMvcGFyaXR5IiwgX19mdW5jX18pOwogCX0KIAogCS8qIE5vdyBkbyB0aGUgYmF1ZHJhdGUgKi8KQEAgLTE4MjksMTQgKzE4MjYsMTQgQEAKIAkJCQkgICAgRlRESV9TSU9fU0VUX0ZMT1dfQ1RSTF9SRVFVRVNUX1RZUEUsCiAJCQkJICAgIDAsIHByaXYtPmludGVyZmFjZSwKIAkJCQkgICAgYnVmLCAwLCBXRFJfVElNRU9VVCkgPCAwKSB7Ci0JCQllcnIoIiVzIGVycm9yIGZyb20gZGlzYWJsZSBmbG93Y29udHJvbCB1cmIiLCBfX0ZVTkNUSU9OX18pOworCQkJZXJyKCIlcyBlcnJvciBmcm9tIGRpc2FibGUgZmxvd2NvbnRyb2wgdXJiIiwgX19mdW5jX18pOwogCQl9CiAJCS8qIERyb3AgUlRTIGFuZCBEVFIgKi8KIAkJY2xlYXJfbWN0cmwocG9ydCwgVElPQ01fRFRSIHwgVElPQ01fUlRTKTsKIAl9IGVsc2UgewogCQkvKiBzZXQgdGhlIGJhdWRyYXRlIGRldGVybWluZWQgYmVmb3JlICovCiAJCWlmIChjaGFuZ2Vfc3BlZWQocG9ydCkpIHsKLQkJCWVycigiJXMgdXJiIGZhaWxlZCB0byBzZXQgYmF1ZHJhdGUiLCBfX0ZVTkNUSU9OX18pOworCQkJZXJyKCIlcyB1cmIgZmFpbGVkIHRvIHNldCBiYXVkcmF0ZSIsIF9fZnVuY19fKTsKIAkJfQogCQkvKiBFbnN1cmUgUlRTIGFuZCBEVFIgYXJlIHJhaXNlZCB3aGVuIGJhdWRyYXRlIGNoYW5nZWQgZnJvbSAwICovCiAJCWlmICghb2xkX3Rlcm1pb3MgfHwgKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpID09IEIwKSB7CkBAIC0xODQ3LDcgKzE4NDQsNyBAQAogCS8qIFNldCBmbG93IGNvbnRyb2wgKi8KIAkvKiBOb3RlIGRldmljZSBhbHNvIHN1cHBvcnRzIERUUi9DRCAodWdoKSBhbmQgWG9uL1hvZmYgaW4gaGFyZHdhcmUgKi8KIAlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7Ci0JCWRiZygiJXMgU2V0dGluZyB0byBDUlRTQ1RTIGZsb3cgY29udHJvbCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgU2V0dGluZyB0byBDUlRTQ1RTIGZsb3cgY29udHJvbCIsIF9fZnVuY19fKTsKIAkJaWYgKHVzYl9jb250cm9sX21zZyhkZXYsCiAJCQkJICAgIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAogCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1QsCkBAIC0xODY1LDcgKzE4NjIsNyBAQAogCQkgKiBpZiBJWE9GRiBpcyBub3Qgc2V0LCB0aGUgcHJlLXhvbi94b2ZmIGNvZGUgaXMgZXhlY3V0ZWQuCiAJCSovCiAJCWlmIChpZmxhZyAmIElYT0ZGKSB7Ci0JCQlkYmcoIiVzICByZXF1ZXN0IHRvIGVuYWJsZSB4b254b2ZmIGlmbGFnPSUwNHgiLF9fRlVOQ1RJT05fXyxpZmxhZyk7CisJCQlkYmcoIiVzICByZXF1ZXN0IHRvIGVuYWJsZSB4b254b2ZmIGlmbGFnPSUwNHgiLF9fZnVuY19fLGlmbGFnKTsKIAkJCS8vIFRyeSB0byBlbmFibGUgdGhlIFhPTi9YT0ZGIG9uIHRoZSBmdGRpX3NpbwogCQkJLy8gU2V0IHRoZSB2c3RhcnQgYW5kIHZzdG9wIC0tIGNvdWxkIGhhdmUgYmVlbiBkb25lIHVwIGFib3ZlIHdoZXJlCiAJCQkvLyBhIGxvdCBvZiBvdGhlciBkZXJlZmVyZW5jaW5nIGlzIGRvbmUgYnV0IHRoYXQgd291bGQgYmUgdmVyeQpAQCAtMTg4Niw3ICsxODgzLDcgQEAKIAkJfSBlbHNlIHsKIAkJCS8qIGVsc2UgY2xhdXNlIHRvIG9ubHkgcnVuIGlmIGNmYWcgISBDUlRTQ1RTIGFuZCBpZmxhZyAhIFhPRkYgKi8KIAkJCS8qIENIRUNLTUUgQXNzdW1pbmcgWE9OL1hPRkYgaGFuZGxlZCBieSB0dHkgc3RhY2sgLSBub3QgYnkgZGV2aWNlICovCi0JCQlkYmcoIiVzIFR1cm5pbmcgb2ZmIGhhcmR3YXJlIGZsb3cgY29udHJvbCIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIFR1cm5pbmcgb2ZmIGhhcmR3YXJlIGZsb3cgY29udHJvbCIsIF9fZnVuY19fKTsKIAkJCWlmICh1c2JfY29udHJvbF9tc2coZGV2LAogCQkJCQkgICAgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCiAJCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1QsCkBAIC0xOTA4LDcgKzE5MDUsNyBAQAogCXVuc2lnbmVkIGNoYXIgYnVmWzJdOwogCWludCByZXQ7CiAKLQlkYmcoIiVzIFRJT0NNR0VUIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIFRJT0NNR0VUIiwgX19mdW5jX18pOwogCXN3aXRjaCAocHJpdi0+Y2hpcF90eXBlKSB7CiAJY2FzZSBTSU86CiAJCS8qIFJlcXVlc3QgdGhlIHN0YXR1cyBmcm9tIHRoZSBkZXZpY2UgKi8KQEAgLTE5MTgsNyArMTkxNSw3IEBACiAJCQkJCSAgIEZURElfU0lPX0dFVF9NT0RFTV9TVEFUVVNfUkVRVUVTVF9UWVBFLAogCQkJCQkgICAwLCAwLAogCQkJCQkgICBidWYsIDEsIFdEUl9USU1FT1VUKSkgPCAwICkgewotCQkJZXJyKCIlcyBDb3VsZCBub3QgZ2V0IG1vZGVtIHN0YXR1cyBvZiBkZXZpY2UgLSBlcnI6ICVkIiwgX19GVU5DVElPTl9fLAorCQkJZXJyKCIlcyBDb3VsZCBub3QgZ2V0IG1vZGVtIHN0YXR1cyBvZiBkZXZpY2UgLSBlcnI6ICVkIiwgX19mdW5jX18sCiAJCQkgICAgcmV0KTsKIAkJCXJldHVybihyZXQpOwogCQl9CkBAIC0xOTM1LDcgKzE5MzIsNyBAQAogCQkJCQkgICBGVERJX1NJT19HRVRfTU9ERU1fU1RBVFVTX1JFUVVFU1RfVFlQRSwKIAkJCQkJICAgMCwgcHJpdi0+aW50ZXJmYWNlLAogCQkJCQkgICBidWYsIDIsIFdEUl9USU1FT1VUKSkgPCAwICkgewotCQkJZXJyKCIlcyBDb3VsZCBub3QgZ2V0IG1vZGVtIHN0YXR1cyBvZiBkZXZpY2UgLSBlcnI6ICVkIiwgX19GVU5DVElPTl9fLAorCQkJZXJyKCIlcyBDb3VsZCBub3QgZ2V0IG1vZGVtIHN0YXR1cyBvZiBkZXZpY2UgLSBlcnI6ICVkIiwgX19mdW5jX18sCiAJCQkgICAgcmV0KTsKIAkJCXJldHVybihyZXQpOwogCQl9CkBAIC0xOTU0LDcgKzE5NTEsNyBAQAogCiBzdGF0aWMgaW50IGZ0ZGlfdGlvY21zZXQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKiBmaWxlLCB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCiB7Ci0JZGJnKCIlcyBUSU9DTVNFVCIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyBUSU9DTVNFVCIsIF9fZnVuY19fKTsKIAlyZXR1cm4gdXBkYXRlX21jdHJsKHBvcnQsIHNldCwgY2xlYXIpOwogfQogCkBAIC0xOTYzLDcgKzE5NjAsNyBAQAogewogCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKLQlkYmcoIiVzIGNtZCAweCUwNHgiLCBfX0ZVTkNUSU9OX18sIGNtZCk7CisJZGJnKCIlcyBjbWQgMHglMDR4IiwgX19mdW5jX18sIGNtZCk7CiAKIAkvKiBCYXNlZCBvbiBjb2RlIGZyb20gYWNtLmMgYW5kIG90aGVycyAqLwogCXN3aXRjaCAoY21kKSB7CkBAIC0yMDIyLDcgKzIwMTksNyBAQAogCS8qIFRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IGFuIGVycm9yIC0gdHVybnMgb3V0IHRoZSBoaWdoZXIgbGF5ZXJzIHdpbGwgZG8KIAkgKiAgc29tZSBpb2N0bHMgaXRzZWxmIChzZWUgY29tbWVudCBhYm92ZSkKIAkgKi8KLQlkYmcoIiVzIGFyZyBub3Qgc3VwcG9ydGVkIC0gaXQgd2FzIDB4JTA0eCAtIGNoZWNrIC91c3IvaW5jbHVkZS9hc20vaW9jdGxzLmgiLCBfX0ZVTkNUSU9OX18sIGNtZCk7CisJZGJnKCIlcyBhcmcgbm90IHN1cHBvcnRlZCAtIGl0IHdhcyAweCUwNHggLSBjaGVjayAvdXNyL2luY2x1ZGUvYXNtL2lvY3Rscy5oIiwgX19mdW5jX18sIGNtZCk7CiAKIAlyZXR1cm4oLUVOT0lPQ1RMQ01EKTsKIH0gLyogZnRkaV9pb2N0bCAqLwpAQCAtMjAzMyw3ICsyMDMwLDcgQEAKIAlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKIAlwcml2LT5yeF9mbGFncyB8PSBUSFJPVFRMRUQ7CkBAIC0yMDQ3LDcgKzIwNDQsNyBAQAogCWludCBhY3R1YWxseV90aHJvdHRsZWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cnhfbG9jaywgZmxhZ3MpOwogCWFjdHVhbGx5X3Rocm90dGxlZCA9IHByaXYtPnJ4X2ZsYWdzICYgQUNUVUFMTFlfVEhST1RUTEVEOwpAQCAtMjA2Miw3ICsyMDU5LDcgQEAKIHsKIAlpbnQgcmV0dmFsOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAlpZiAodmVuZG9yID4gMCAmJiBwcm9kdWN0ID4gMCkgewogCQkvKiBBZGQgdXNlciBzcGVjaWZpZWQgVklEL1BJRCB0byByZXNlcnZlZCBlbGVtZW50IG9mIHRhYmxlLiAqLwogCQlpbnQgaTsKQEAgLTIwOTEsNyArMjA4OCw3IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgZnRkaV9leGl0ICh2b2lkKQogewogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCXVzYl9kZXJlZ2lzdGVyICgmZnRkaV9kcml2ZXIpOwogCXVzYl9zZXJpYWxfZGVyZWdpc3RlciAoJmZ0ZGlfc2lvX2RldmljZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnVuc29mdC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z1bnNvZnQuYwppbmRleCBiNTE5NGRjLi5lOGJhMmNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnVuc29mdC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdW5zb2Z0LmMKQEAgLTM5LDkgKzM5LDYgQEAKIAl9LAogCS5pZF90YWJsZSA9CQlpZF90YWJsZSwKIAkudXNiX2RyaXZlciA9IAkJJmZ1bnNvZnRfZHJpdmVyLAotCS5udW1faW50ZXJydXB0X2luID0JTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfaW4gPQkJTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfb3V0ID0JCU5VTV9ET05UX0NBUkUsCiAJLm51bV9wb3J0cyA9CQkxLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2dhcm1pbl9ncHMuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9nYXJtaW5fZ3BzLmMKaW5kZXggZDc0ZTQzZC4uOGNlNWE1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2dhcm1pbl9ncHMuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZ2FybWluX2dwcy5jCkBAIC0yODAsNyArMjgwLDcgQEAKIAlpZiAodHR5ICYmIGFjdHVhbF9sZW5ndGgpIHsKIAogCQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIAotCQkJCQlfX0ZVTkNUSU9OX18sIGFjdHVhbF9sZW5ndGgsIGRhdGEpOworCQkJCQlfX2Z1bmNfXywgYWN0dWFsX2xlbmd0aCwgZGF0YSk7CiAKIAkJdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBhY3R1YWxfbGVuZ3RoKTsKIAkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIGRhdGEsIGFjdHVhbF9sZW5ndGgpOwpAQCAtMzU1LDcgKzM1NSw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgZ2FybWluX3BhY2tldCAqcmVzdWx0ID0gTlVMTDsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwogCXdoaWxlICghbGlzdF9lbXB0eSgmZ2FybWluX2RhdGFfcC0+cGt0bGlzdCkpIHsKQEAgLTM3OSw3ICszNzksNyBAQAogCV9fdTggKnB0ciA9IHBrdDsKIAl1bnNpZ25lZCAgbCA9IDA7CiAKLQlkYmcoIiVzIC0gcGt0LWlkOiAweCVYLiIsIF9fRlVOQ1RJT05fXywgMHhGRiAmIHBrdF9pZCk7CisJZGJnKCIlcyAtIHBrdC1pZDogMHglWC4iLCBfX2Z1bmNfXywgMHhGRiAmIHBrdF9pZCk7CiAKIAkqcHRyKysgPSBETEU7CiAJKnB0cisrID0gQUNLOwpAQCAtNDI5LDExICs0MjksMTEgQEAKIAlpbnQgc2l6ZSA9IHJlY3BrdFsxXTsKIAogCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJmdhcm1pbl9kYXRhX3AtPnBvcnQtPmRldiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGNvdW50LUdTUF9JTklUSUFMX09GRlNFVCwgcmVjcGt0KTsKKwkJCSAgICAgICBfX2Z1bmNfXywgY291bnQtR1NQX0lOSVRJQUxfT0ZGU0VULCByZWNwa3QpOwogCiAJaWYgKHNpemUgIT0gKGNvdW50LUdTUF9JTklUSUFMX09GRlNFVC0zKSkgewogCQlkYmcoIiVzIC0gaW52YWxpZCBzaXplLCBleHBlY3RlZCAlZCBieXRlcywgZ290ICVkIiwKLQkJCV9fRlVOQ1RJT05fXywgc2l6ZSwgKGNvdW50LUdTUF9JTklUSUFMX09GRlNFVC0zKSk7CisJCQlfX2Z1bmNfXywgc2l6ZSwgKGNvdW50LUdTUF9JTklUSUFMX09GRlNFVC0zKSk7CiAJCXJldHVybiAtRUlOVlBLVDsKIAl9CiAKQEAgLTQ0Myw3ICs0NDMsNyBAQAogCS8vIHNhbml0eSBjaGVjaywgcmVtb3ZlIGFmdGVyIHRlc3QgLi4uCiAJaWYgKChfX3U4KikmKHVzYmRhdGFbM10pICE9IHJlY3BrdCkgewogCQlkYmcoIiVzIC0gcHRyIG1pc21hdGNoICVwIC0gJXAiLAotCQkJX19GVU5DVElPTl9fLCAmKHVzYmRhdGFbNF0pLCByZWNwa3QpOworCQkJX19mdW5jX18sICYodXNiZGF0YVs0XSksIHJlY3BrdCk7CiAJCXJldHVybiAtRUlOVlBLVDsKIAl9CiAKQEAgLTQ1NCw3ICs0NTQsNyBAQAogCiAJaWYgKCgweGZmICYgKGNrc3VtICsgKnJlY3BrdCkpICE9IDApIHsKIAkJZGJnKCIlcyAtIGludmFsaWQgY2hlY2tzdW0sIGV4cGVjdGVkICUwMngsIGdvdCAlMDJ4IiwKLQkJCV9fRlVOQ1RJT05fXywgMHhmZiAmIC1ja3N1bSwgMHhmZiAmICpyZWNwa3QpOworCQkJX19mdW5jX18sIDB4ZmYgJiAtY2tzdW0sIDB4ZmYgJiAqcmVjcGt0KTsKIAkJcmV0dXJuIC1FSU5WUEtUOwogCX0KIApAQCAtNTE5LDcgKzUxOSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwogCiAJZGJnKCIlcyAtIGRsZT0lZCBza2lwPSVkIHNpemU9JWQgY291bnQ9JWQiLAotCQlfX0ZVTkNUSU9OX18sIGRsZVNlZW4sIHNraXAsIHNpemUsIGNvdW50KTsKKwkJX19mdW5jX18sIGRsZVNlZW4sIHNraXAsIHNpemUsIGNvdW50KTsKIAogCWlmIChzaXplID09IDApIHsKIAkJc2l6ZSA9IEdTUF9JTklUSUFMX09GRlNFVDsKQEAgLTU3OCw3ICs1NzgsNyBAQAogCQl9CiAKIAkJaWYgKHNpemUgPj0gR1BTX0lOX0JVRlNJWikgewotCQkJZGJnKCIlcyAtIHBhY2tldCB0b28gbGFyZ2UuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBwYWNrZXQgdG9vIGxhcmdlLiIsIF9fZnVuY19fKTsKIAkJCXNraXAgPSAxOwogCQkJc2l6ZSA9IEdTUF9JTklUSUFMX09GRlNFVDsKIAkJCWRsZVNlZW4gPSAwOwpAQCAtNjM0LDcgKzYzNCw3IEBACiAJaW50IGk9MDsKIAlpbnQgazsKIAotCWRiZygiJXMgLSBzdGF0ZSAlZCAtICVkIGJ5dGVzLiIsIF9fRlVOQ1RJT05fXywKKwlkYmcoIiVzIC0gc3RhdGUgJWQgLSAlZCBieXRlcy4iLCBfX2Z1bmNfXywKIAkgICAgICAgICBnYXJtaW5fZGF0YV9wLT5zdGF0ZSwgY291bnQpOwogCiAJayA9IGdhcm1pbl9kYXRhX3AtPm91dHNpemU7CkBAIC02NTgsMTMgKzY1OCwxMyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlkYmcoIiVzIC0gJWQgYnl0ZXMgaW4gYnVmZmVyLCAlZCBieXRlcyBpbiBwa3QuIiwgX19GVU5DVElPTl9fLAorCWRiZygiJXMgLSAlZCBieXRlcyBpbiBidWZmZXIsICVkIGJ5dGVzIGluIHBrdC4iLCBfX2Z1bmNfXywKIAkgICAgICAgICBrLCBpKTsKIAogCS8qIGdhcm1pbl9kYXRhX3AtPm91dGJ1ZmZlciBub3cgY29udGFpbnMgYSBjb21wbGV0ZSBwYWNrZXQgKi8KIAogCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJmdhcm1pbl9kYXRhX3AtPnBvcnQtPmRldiwKLQkJICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaywgZ2FybWluX2RhdGFfcC0+b3V0YnVmZmVyKTsKKwkJICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBrLCBnYXJtaW5fZGF0YV9wLT5vdXRidWZmZXIpOwogCiAJZ2FybWluX2RhdGFfcC0+b3V0c2l6ZSA9IDA7CiAKQEAgLTc0OSw3ICs3NDksNyBAQAogCXN0cnVjdCBnYXJtaW5fcGFja2V0ICpwa3QgPSBOVUxMOwogCiAJd2hpbGUgKChwa3QgPSBwa3RfcG9wKGdhcm1pbl9kYXRhX3ApKSAhPSBOVUxMKSB7Ci0JCWRiZygiJXMgLSBuZXh0IHBrdDogJWQiLCBfX0ZVTkNUSU9OX18sIHBrdC0+c2VxKTsKKwkJZGJnKCIlcyAtIG5leHQgcGt0OiAlZCIsIF9fZnVuY19fLCBwa3QtPnNlcSk7CiAJCWlmIChnc3Bfc2VuZChnYXJtaW5fZGF0YV9wLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSkgPiAwKSB7CiAJCQlrZnJlZShwa3QpOwogCQkJcmV0dXJuOwpAQCAtNzk0LDcgKzc5NCw3IEBACiAJCWlmIChsZW4gPj0gR1BTX0lOX0JVRlNJWikgewogCQkJLyogc2VlbSB0byBiZSBhbiBpbnZhbGlkIHBhY2tldCwgaWdub3JlIHJlc3Qgb2YgaW5wdXQgKi8KIAkJCWRiZygiJXMgLSBwYWNrZXQgc2l6ZSB0b28gbGFyZ2U6ICVkIiwKLQkJCSAgICAgICAgX19GVU5DVElPTl9fLCBsZW4pOworCQkJICAgICAgICBfX2Z1bmNfXywgbGVuKTsKIAkJCWdhcm1pbl9kYXRhX3AtPmluc2l6ZSA9IDA7CiAJCQljb3VudCA9IDA7CiAJCQlyZXN1bHQgPSAtRUlOVlBLVDsKQEAgLTg3MywxMSArODczLDExIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwogCiAJdXNiX2tpbGxfdXJiIChwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiKTsKLQlkYmcoIiVzIC0gdXNiX3Jlc2V0X2RldmljZSIsIF9fRlVOQ1RJT05fXyApOworCWRiZygiJXMgLSB1c2JfcmVzZXRfZGV2aWNlIiwgX19mdW5jX18gKTsKIAlzdGF0dXMgPSB1c2JfcmVzZXRfZGV2aWNlKHBvcnQtPnNlcmlhbC0+ZGV2KTsKIAlpZiAoc3RhdHVzKQogCQlkYmcoIiVzIC0gdXNiX3Jlc2V0X2RldmljZSBmYWlsZWQ6ICVkIiwKLQkJCV9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCV9fZnVuY19fLCBzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTkyNiwxOCArOTI2LDE4IEBACiAJaWYgKHN0YXR1cyA9PSAwKSB7CiAJCXVzYl9raWxsX3VyYiAocG9ydC0+aW50ZXJydXB0X2luX3VyYik7CiAKLQkJZGJnKCIlcyAtIGFkZGluZyBpbnRlcnJ1cHQgaW5wdXQiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gYWRkaW5nIGludGVycnVwdCBpbnB1dCIsIF9fZnVuY19fKTsKIAkJcG9ydC0+aW50ZXJydXB0X2luX3VyYi0+ZGV2ID0gc2VyaWFsLT5kZXY7CiAJCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIsIEdGUF9LRVJORUwpOwogCQlpZiAoc3RhdHVzKQogCQkJZGV2X2Vycigmc2VyaWFsLT5kZXYtPmRldiwKIAkJCSAgICAgICAgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgaW50ZXJydXB0IHVyYiwiCiAJCQkJIiBlcnJvciAlZFxuIiwKLQkJCSAgICAgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJICAgICAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAl9CiAKIAlpZiAoc3RhdHVzID09IDApIHsKLQkJZGJnKCIlcyAtIHN0YXJ0aW5nIHNlc3Npb24gLi4uIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHN0YXJ0aW5nIHNlc3Npb24gLi4uIiwgX19mdW5jX18pOwogCQlnYXJtaW5fZGF0YV9wLT5zdGF0ZSA9IFNUQVRFX0FDVElWRTsKIAkJc3RhdHVzID0gZ2FybWluX3dyaXRlX2J1bGsocG9ydCwgR0FSTUlOX1NUQVJUX1NFU1NJT05fUkVRLAogCQkgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoR0FSTUlOX1NUQVJUX1NFU1NJT05fUkVRKSwKQEAgLTk3Niw3ICs5NzYsNyBAQAogCWludCBzdGF0dXMgPSAwOwogCXN0cnVjdCBnYXJtaW5fZGF0YSAqIGdhcm1pbl9kYXRhX3AgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyoKIAkgKiBGb3JjZSBsb3dfbGF0ZW5jeSBvbiBzbyB0aGF0IG91ciB0dHlfcHVzaCBhY3R1YWxseSBmb3JjZXMgdGhlIGRhdGEKQEAgLTEwMTMsNyArMTAxMyw3IEBACiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAlzdHJ1Y3QgZ2FybWluX2RhdGEgKiBnYXJtaW5fZGF0YV9wID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQgLSBtb2RlPSVkIHN0YXRlPSVkIGZsYWdzPTB4JVgiLCBfX0ZVTkNUSU9OX18sCisJZGJnKCIlcyAtIHBvcnQgJWQgLSBtb2RlPSVkIHN0YXRlPSVkIGZsYWdzPTB4JVgiLCBfX2Z1bmNfXywKIAkJcG9ydC0+bnVtYmVyLCBnYXJtaW5fZGF0YV9wLT5tb2RlLAogCQlnYXJtaW5fZGF0YV9wLT5zdGF0ZSwgZ2FybWluX2RhdGFfcC0+ZmxhZ3MpOwogCkBAIC0xMDQ2LDEzICsxMDQ2LDEzIEBACiBzdGF0aWMgdm9pZCBnYXJtaW5fd3JpdGVfYnVsa19jYWxsYmFjayAoc3RydWN0IHVyYiAqdXJiKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCiAJaWYgKHBvcnQpIHsKIAkJc3RydWN0IGdhcm1pbl9kYXRhICogZ2FybWluX2RhdGFfcCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAotCQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwkJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCQlpZiAoR0FSTUlOX0xBWUVSSURfQVBQTCA9PSBnZXRMYXllcklkKHVyYi0+dHJhbnNmZXJfYnVmZmVyKQogCQkgICAgJiYgKGdhcm1pbl9kYXRhX3AtPm1vZGUgPT0gTU9ERV9HQVJNSU5fU0VSSUFMKSkgIHsKQEAgLTEwNjEsNyArMTA2MSw3IEBACiAKIAkJaWYgKHN0YXR1cykgewogCQkJZGJnKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJCSAgICBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJCSAgICBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKIAkJCWdhcm1pbl9kYXRhX3AtPmZsYWdzIHw9IENMRUFSX0hBTFRfUkVRVUlSRUQ7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CkBAIC0xMDg4LDcgKzEwODgsNyBAQAogCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKIAlpbnQgc3RhdHVzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQsIHN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsCisJZGJnKCIlcyAtIHBvcnQgJWQsIHN0YXRlICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlciwKIAkJZ2FybWluX2RhdGFfcC0+c3RhdGUpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKQEAgLTExMTAsNyArMTExMCw3IEBACiAKIAltZW1jcHkgKGJ1ZmZlciwgYnVmLCBjb3VudCk7CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgY291bnQsIGJ1ZmZlcik7CisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgY291bnQsIGJ1ZmZlcik7CiAKIAl1c2JfZmlsbF9idWxrX3VyYiAodXJiLCBzZXJpYWwtPmRldiwKIAkJCSAJdXNiX3NuZGJ1bGtwaXBlIChzZXJpYWwtPmRldiwKQEAgLTExMzQsNyArMTEzNCw3IEBACiAJCWRldl9lcnIoJnBvcnQtPmRldiwKIAkJICAgICAgICAiJXMgLSB1c2Jfc3VibWl0X3VyYih3cml0ZSBidWxrKSAiCiAJCSAgICAgICAgImZhaWxlZCB3aXRoIHN0YXR1cyA9ICVkXG4iLAotCQkJCV9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCQlfX2Z1bmNfXywgc3RhdHVzKTsKIAkJY291bnQgPSBzdGF0dXM7CiAJfQogCkBAIC0xMTU0LDcgKzExNTQsNyBAQAogCXN0cnVjdCBnYXJtaW5fZGF0YSAqIGdhcm1pbl9kYXRhX3AgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJX19sZTMyICpwcml2cGt0ID0gKF9fbGUzMiAqKWdhcm1pbl9kYXRhX3AtPnByaXZwa3Q7CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgY291bnQsIGJ1Zik7CisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgY291bnQsIGJ1Zik7CiAKIAkvKiBjaGVjayBmb3Igb3VyIHByaXZhdGUgcGFja2V0cyAqLwogCWlmIChjb3VudCA+PSBHQVJNSU5fUEtUSERSX0xFTkdUSCkgewpAQCAtMTE3Miw3ICsxMTcyLDcgQEAKIAkJICAgICYmIEdBUk1JTl9MQVlFUklEX1BSSVZBVEUgPT0gZ2V0TGF5ZXJJZChnYXJtaW5fZGF0YV9wLT5wcml2cGt0KSkgewogCiAJCQlkYmcoIiVzIC0gcHJvY2Vzc2luZyBwcml2YXRlIHJlcXVlc3QgJWQiLAotCQkJCV9fRlVOQ1RJT05fXywgcGt0aWQpOworCQkJCV9fZnVuY19fLCBwa3RpZCk7CiAKIAkJCS8vIGRyb3AgYWxsIHVuZmluaXNoZWQgdHJhbnNmZXJzCiAJCQlnYXJtaW5fY2xlYXIoZ2FybWluX2RhdGFfcCk7CkBAIC0xMTg0LDcgKzExODQsNyBAQAogCQkJCQlyZXR1cm4gLUVJTlZQS1Q7CiAJCQkJZGVidWcgPSBfX2xlMzJfdG9fY3B1KHByaXZwa3RbM10pOwogCQkJCWRiZygiJXMgLSBkZWJ1ZyBsZXZlbCBzZXQgdG8gMHglWCIsCi0JCQkJCV9fRlVOQ1RJT05fXywgZGVidWcpOworCQkJCQlfX2Z1bmNfXywgZGVidWcpOwogCQkJCWJyZWFrOwogCiAJCQljYXNlIFBSSVZfUEtUSURfU0VUX01PREU6CkBAIC0xMTkyLDcgKzExOTIsNyBAQAogCQkJCQlyZXR1cm4gLUVJTlZQS1Q7CiAJCQkJZ2FybWluX2RhdGFfcC0+bW9kZSA9IF9fbGUzMl90b19jcHUocHJpdnBrdFszXSk7CiAJCQkJZGJnKCIlcyAtIG1vZGUgc2V0IHRvICVkIiwKLQkJCQkJX19GVU5DVElPTl9fLCBnYXJtaW5fZGF0YV9wLT5tb2RlKTsKKwkJCQkJX19mdW5jX18sIGdhcm1pbl9kYXRhX3AtPm1vZGUpOwogCQkJCWJyZWFrOwogCiAJCQljYXNlIFBSSVZfUEtUSURfSU5GT19SRVE6CkBAIC0xMjA4LDcgKzEyMDgsNyBAQAogCQkJCQlyZXR1cm4gLUVJTlZQS1Q7CiAJCQkJaW5pdGlhbF9tb2RlID0gX19sZTMyX3RvX2NwdShwcml2cGt0WzNdKTsKIAkJCQlkYmcoIiVzIC0gaW5pdGlhbF9tb2RlIHNldCB0byAlZCIsCi0JCQkJCV9fRlVOQ1RJT05fXywKKwkJCQkJX19mdW5jX18sCiAJCQkJCWdhcm1pbl9kYXRhX3AtPm1vZGUpOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMTI1NSw3ICsxMjU1LDcgQEAKIHsKIAlpZiAoZ2FybWluX2RhdGFfcC0+ZmxhZ3MgJiBGTEFHU19EUk9QX0RBVEEpIHsKIAkJLyogYWJvcnQtdHJhbnNmZXIgY21kIGlzIGFjdGljZSAqLwotCQlkYmcoIiVzIC0gcGt0IGRyb3BwZWQiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gcGt0IGRyb3BwZWQiLCBfX2Z1bmNfXyk7CiAJfSBlbHNlIGlmIChnYXJtaW5fZGF0YV9wLT5zdGF0ZSAhPSBTVEFURV9ESVNDT05ORUNURUQgJiYKIAkgICAgICAgICAgIGdhcm1pbl9kYXRhX3AtPnN0YXRlICE9IFNUQVRFX1JFU0VUICkgewogCkBAIC0xMjg2LDI4ICsxMjg2LDI4IEBACiBzdGF0aWMgdm9pZCBnYXJtaW5fcmVhZF9idWxrX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gIHBvcnQtPnNlcmlhbDsKIAlzdHJ1Y3QgZ2FybWluX2RhdGEgKiBnYXJtaW5fZGF0YV9wID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAJaW50IHJldHZhbDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoIXNlcmlhbCkgewotCQlkYmcoIiVzIC0gYmFkIHNlcmlhbCBwb2ludGVyLCBleGl0aW5nIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIGJhZCBzZXJpYWwgcG9pbnRlciwgZXhpdGluZyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmIChzdGF0dXMpIHsKIAkJZGJnKCIlcyAtIG5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAKIAl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIAotCQkJCV9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKKwkJCQlfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKIAogCWdhcm1pbl9yZWFkX3Byb2Nlc3MoZ2FybWluX2RhdGFfcCwgZGF0YSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIApAQCAtMTMyMCw3ICsxMzIwLDcgQEAKIAkJaWYgKHJldHZhbCkKIAkJCWRldl9lcnIoJnBvcnQtPmRldiwKIAkJCQkiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCQkJX19mdW5jX18sIHJldHZhbCk7CiAJfSBlbHNlIGlmICh1cmItPmFjdHVhbF9sZW5ndGggPiAwKSB7CiAJCS8qIENvbnRpbnVlIHRyeWluZyB0byByZWFkIHVudGlsIG5vdGhpbmcgbW9yZSBpcyByZWNlaXZlZCAgKi8KIAkJaWYgKDAgPT0gKGdhcm1pbl9kYXRhX3AtPmZsYWdzICYgRkxBR1NfVEhST1RUTEVEKSkgewpAQCAtMTMyOCwxMCArMTMyOCwxMCBAQAogCQkJaWYgKHJldHZhbCkKIAkJCQlkZXZfZXJyKCZwb3J0LT5kZXYsCiAJCQkJCSIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsICIKLQkJCQkJImVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCQkJCSJlcnJvciAlZFxuIiwgX19mdW5jX18sIHJldHZhbCk7CiAJCX0KIAl9IGVsc2UgewotCQlkYmcoIiVzIC0gZW5kIG9mIGJ1bGsgZGF0YSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBlbmQgb2YgYnVsayBkYXRhIiwgX19mdW5jX18pOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwogCQlnYXJtaW5fZGF0YV9wLT5mbGFncyAmPSB+RkxBR1NfQlVMS19JTl9BQ1RJVkU7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKQEAgLTEzNDQsNyArMTM0NCw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0dmFsOwotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAJc3RydWN0IGdhcm1pbl9kYXRhICogZ2FybWluX2RhdGFfcCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CkBAIC0xMzU5LDIyICsxMzU5LDIyIEBACiAJY2FzZSAtRVNIVVRET1dOOgogCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLwogCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwKLQkJCV9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCV9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgCisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywKIAkJCQl1cmItPmFjdHVhbF9sZW5ndGgsIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIAogCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPT0gc2l6ZW9mKEdBUk1JTl9CVUxLX0lOX0FWQUlMX1JFUExZKSAmJgogCSAgICAwID09IG1lbWNtcChkYXRhLCBHQVJNSU5fQlVMS19JTl9BVkFJTF9SRVBMWSwKIAkJICAgICAgICBzaXplb2YoR0FSTUlOX0JVTEtfSU5fQVZBSUxfUkVQTFkpKSkgewogCi0JCWRiZygiJXMgLSBidWxrIGRhdGEgYXZhaWxhYmxlLiIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBidWxrIGRhdGEgYXZhaWxhYmxlLiIsIF9fZnVuY19fKTsKIAogCQlpZiAoMCA9PSAoZ2FybWluX2RhdGFfcC0+ZmxhZ3MgJiBGTEFHU19CVUxLX0lOX0FDVElWRSkpIHsKIApAQCAtMTM4OSw3ICsxMzg5LDcgQEAKIAkJCWlmIChyZXR2YWwpIHsKIAkJCQlkZXZfZXJyKCZwb3J0LT5kZXYsCiAJCQkJCSIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCQkJX19mdW5jX18sIHJldHZhbCk7CiAJCQl9IGVsc2UgewogCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CiAJCQkJZ2FybWluX2RhdGFfcC0+ZmxhZ3MgfD0gRkxBR1NfQlVMS19JTl9BQ1RJVkU7CkBAIC0xNDE3LDE0ICsxNDE3LDE0IEBACiAJCQk9IF9fbGUzMl90b19jcHVwKChfX2xlMzIqKShkYXRhK0dBUk1JTl9QS1RIRFJfTEVOR1RIKSk7CiAKIAkJZGJnKCIlcyAtIHN0YXJ0LW9mLXNlc3Npb24gcmVwbHkgc2VlbiAtIHNlcmlhbCAldS4iLAotCQkJX19GVU5DVElPTl9fLCBnYXJtaW5fZGF0YV9wLT5zZXJpYWxfbnVtKTsKKwkJCV9fZnVuY19fLCBnYXJtaW5fZGF0YV9wLT5zZXJpYWxfbnVtKTsKIAl9CiAKIAlpZiAoZ2FybWluX2RhdGFfcC0+aWdub3JlUGt0cykgewogCQkvKiB0aGlzIHJlcGx5IGJlbG9uZ3MgdG8gYSByZXF1ZXN0IGdlbmVyYXRlZCBieSB0aGUgZHJpdmVyLAogCQkgICBpZ25vcmUgaXQuICovCiAJCWRiZygiJXMgLSBwa3QgaWdub3JlZCAoJWQpIiwKLQkJCV9fRlVOQ1RJT05fXywgZ2FybWluX2RhdGFfcC0+aWdub3JlUGt0cyk7CisJCQlfX2Z1bmNfXywgZ2FybWluX2RhdGFfcC0+aWdub3JlUGt0cyk7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CiAJCWdhcm1pbl9kYXRhX3AtPmlnbm9yZVBrdHMtLTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwpAQCAtMTQzNyw3ICsxNDM3LDcgQEAKIAlpZiAocmV0dmFsKQogCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAogCQkJIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiXG4iLAotCQkJX19GVU5DVElPTl9fLCByZXR2YWwpOworCQkJX19mdW5jX18sIHJldHZhbCk7CiB9CiAKIApAQCAtMTQ3Myw3ICsxNDczLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBnYXJtaW5fZGF0YSAqIGdhcm1pbl9kYXRhX3AgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCS8qIHNldCBmbGFnLCBkYXRhIHJlY2VpdmVkIHdpbGwgYmUgcHV0IGludG8gYSBxdWV1ZQogCSAgIGZvciBsYXRlciBwcm9jZXNzaW5nICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKQEAgLTE0ODgsNyArMTQ4OCw3IEBACiAJc3RydWN0IGdhcm1pbl9kYXRhICogZ2FybWluX2RhdGFfcCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlpbnQgc3RhdHVzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwogCWdhcm1pbl9kYXRhX3AtPmZsYWdzICY9IH5GTEFHU19USFJPVFRMRUQ7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwpAQCAtMTUwMyw3ICsxNTAzLDcgQEAKIAkJaWYgKHN0YXR1cykKIAkJCWRldl9lcnIoJnBvcnQtPmRldiwKIAkJCQkiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQkJX19mdW5jX18sIHN0YXR1cyk7CiAJfQogfQogCkBAIC0xNTMyLDExICsxNTMyLDExIEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHNlcmlhbC0+cG9ydFswXTsKIAlzdHJ1Y3QgZ2FybWluX2RhdGEgKiBnYXJtaW5fZGF0YV9wID0gTlVMTDsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlnYXJtaW5fZGF0YV9wID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGdhcm1pbl9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGdhcm1pbl9kYXRhX3AgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIE91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gT3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJaW5pdF90aW1lcigmZ2FybWluX2RhdGFfcC0+dGltZXIpOwpAQCAtMTU2MSw3ICsxNTYxLDcgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gc2VyaWFsLT5wb3J0WzBdOwogCXN0cnVjdCBnYXJtaW5fZGF0YSAqIGdhcm1pbl9kYXRhX3AgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJdXNiX2tpbGxfdXJiIChwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiKTsKIAlkZWxfdGltZXJfc3luYygmZ2FybWluX2RhdGFfcC0+dGltZXIpOwpAQCAtMTU3OSw5ICsxNTc5LDYgQEAKIAkuZGVzY3JpcHRpb24gICAgICAgICA9ICJHYXJtaW4gR1BTIHVzYi90dHkiLAogCS51c2JfZHJpdmVyICAgICAgICAgID0gJmdhcm1pbl9kcml2ZXIsCiAJLmlkX3RhYmxlICAgICAgICAgICAgPSBpZF90YWJsZSwKLQkubnVtX2ludGVycnVwdF9pbiAgICA9IDEsCi0JLm51bV9idWxrX2luICAgICAgICAgPSAxLAotCS5udW1fYnVsa19vdXQgICAgICAgID0gMSwKIAkubnVtX3BvcnRzICAgICAgICAgICA9IDEsCiAJLm9wZW4gICAgICAgICAgICAgICAgPSBnYXJtaW5fb3BlbiwKIAkuY2xvc2UgICAgICAgICAgICAgICA9IGdhcm1pbl9jbG9zZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9nZW5lcmljLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZ2VuZXJpYy5jCmluZGV4IDdjZmNlOWQuLjUzN2YxMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9nZW5lcmljLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2dlbmVyaWMuYwpAQCAtNjIsOSArNjIsNiBAQAogCX0sCiAJLmlkX3RhYmxlID0JCWdlbmVyaWNfZGV2aWNlX2lkcywKIAkudXNiX2RyaXZlciA9IAkJJmdlbmVyaWNfZHJpdmVyLAotCS5udW1faW50ZXJydXB0X2luID0JTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfaW4gPQkJTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfb3V0ID0JCU5VTV9ET05UX0NBUkUsCiAJLm51bV9wb3J0cyA9CQkxLAogCS5zaHV0ZG93biA9CQl1c2Jfc2VyaWFsX2dlbmVyaWNfc2h1dGRvd24sCiAJLnRocm90dGxlID0JCXVzYl9zZXJpYWxfZ2VuZXJpY190aHJvdHRsZSwKQEAgLTEyMSw3ICsxMTgsNyBAQAogCWludCByZXN1bHQgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyogZm9yY2UgbG93X2xhdGVuY3kgb24gc28gdGhhdCBvdXIgdHR5X3B1c2ggYWN0dWFsbHkgZm9yY2VzIHRoZSBkYXRhIHRocm91Z2gsIAogCSAgIG90aGVyd2lzZSBpdCBpcyBzY2hlZHVsZWQsIGFuZCB3aXRoIGhpZ2ggZGF0YSByYXRlcyAobGlrZSB3aXRoIE9IQ0kpIGRhdGEKQEAgLTE0OCw3ICsxNDUsNyBAQAogCQkJCSAgIHBvcnQpOwogCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CiAJCWlmIChyZXN1bHQpCi0JCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMTU5LDcgKzE1Niw3IEBACiB7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoc2VyaWFsLT5kZXYpIHsKIAkJLyogc2h1dGRvd24gYW55IGJ1bGsgcmVhZHMgdGhhdCBtaWdodCBiZSBnb2luZyBvbiAqLwpAQCAtMTk3LDcgKzE5NCw3IEBACiAKIHZvaWQgdXNiX3NlcmlhbF9nZW5lcmljX2Nsb3NlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCiB7Ci0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAlnZW5lcmljX2NsZWFudXAgKHBvcnQpOwogfQogCkBAIC0yMDcsMTAgKzIwNCwxMCBAQAogCWludCByZXN1bHQ7CiAJdW5zaWduZWQgY2hhciAqZGF0YTsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoY291bnQgPT0gMCkgewotCQlkYmcoIiVzIC0gd3JpdGUgcmVxdWVzdCBvZiAwIGJ5dGVzIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHdyaXRlIHJlcXVlc3Qgb2YgMCBieXRlcyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuICgwKTsKIAl9CiAKQEAgLTIyMCw3ICsyMTcsNyBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCQlpZiAocG9ydC0+d3JpdGVfdXJiX2J1c3kpIHsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJCWRiZygiJXMgLSBhbHJlYWR5IHdyaXRpbmciLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIGFscmVhZHkgd3JpdGluZyIsIF9fZnVuY19fKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMTsKQEAgLTIzMCw3ICsyMjcsNyBAQAogCiAJCW1lbWNweSAocG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXIsIGJ1ZiwgY291bnQpOwogCQlkYXRhID0gcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXI7Ci0JCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCBjb3VudCwgZGF0YSk7CisJCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sIGNvdW50LCBkYXRhKTsKIAogCQkvKiBzZXQgdXAgb3VyIHVyYiAqLwogCQl1c2JfZmlsbF9idWxrX3VyYiAocG9ydC0+d3JpdGVfdXJiLCBzZXJpYWwtPmRldiwKQEAgLTI0NSw3ICsyNDIsNyBAQAogCQlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDE7CiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPndyaXRlX3VyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChyZXN1bHQpIHsKLQkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAkJCS8qIGRvbid0IGhhdmUgdG8gZ3JhYiB0aGUgbG9jayBoZXJlLCBhcyB3ZSB3aWxsIHJldHJ5IGlmICE9IDAgKi8KIAkJCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMDsKIAkJfSBlbHNlCkBAIC0yNjMsMTUgKzI2MCwxNiBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAJaW50IHJvb20gPSAwOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAorCS8qIEZJWE1FOiBMb2NraW5nICovCiAJaWYgKHNlcmlhbC0+bnVtX2J1bGtfb3V0KSB7CiAJCWlmICghKHBvcnQtPndyaXRlX3VyYl9idXN5KSkKIAkJCXJvb20gPSBwb3J0LT5idWxrX291dF9zaXplOwogCX0KIAotCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19GVU5DVElPTl9fLCByb29tKTsKLQlyZXR1cm4gKHJvb20pOworCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19mdW5jX18sIHJvb20pOworCXJldHVybiByb29tOwogfQogCiBpbnQgdXNiX3NlcmlhbF9nZW5lcmljX2NoYXJzX2luX2J1ZmZlciAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKQEAgLTI3OSwxNCArMjc3LDE1IEBACiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAlpbnQgY2hhcnMgPSAwOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAorCS8qIEZJWE1FOiBMb2NraW5nICovCiAJaWYgKHNlcmlhbC0+bnVtX2J1bGtfb3V0KSB7CiAJCWlmIChwb3J0LT53cml0ZV91cmJfYnVzeSkKIAkJCWNoYXJzID0gcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOwogCX0KIAotCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19GVU5DVElPTl9fLCBjaGFycyk7CisJZGJnKCIlcyAtIHJldHVybnMgJWQiLCBfX2Z1bmNfXywgY2hhcnMpOwogCXJldHVybiAoY2hhcnMpOwogfQogCkBAIC0zMDgsNyArMzA3LDcgQEAKIAkJCSAgICAgdXNiX3NlcmlhbF9nZW5lcmljX3JlYWRfYnVsa19jYWxsYmFjayksIHBvcnQpOwogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgbWVtX2ZsYWdzKTsKIAlpZiAocmVzdWx0KQotCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogfQogCiAvKiBQdXNoIGRhdGEgdG8gdHR5IGxheWVyIGFuZCByZXN1Ym1pdCB0aGUgYnVsayByZWFkIFVSQiAqLwpAQCAtMzMyLDIwICszMzEsMjAgQEAKIAogdm9pZCB1c2Jfc2VyaWFsX2dlbmVyaWNfcmVhZF9idWxrX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJdW5zaWduZWQgY2hhciAqZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmICh1bmxpa2VseShzdGF0dXMgIT0gMCkpIHsKIAkJZGJnKCIlcyAtIG5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOwogCiAJLyogVGhyb3R0bGUgdGhlIGRldmljZSBpZiByZXF1ZXN0ZWQgYnkgdHR5ICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKQEAgLTM2MCwxOCArMzU5LDE3IEBACiAKIHZvaWQgdXNiX3NlcmlhbF9nZW5lcmljX3dyaXRlX2J1bGtfY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJcG9ydC0+d3JpdGVfdXJiX2J1c3kgPSAwOwogCWlmIChzdGF0dXMpIHsKIAkJZGJnKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQotCiAJdXNiX3NlcmlhbF9wb3J0X3NvZnRpbnQocG9ydCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1c2Jfc2VyaWFsX2dlbmVyaWNfd3JpdGVfYnVsa19jYWxsYmFjayk7CkBAIC0zODAsNyArMzc4LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCS8qIFNldCB0aGUgdGhyb3R0bGUgcmVxdWVzdCBmbGFnLiBJdCB3aWxsIGJlIHBpY2tlZCB1cAogCSAqIGJ5IHVzYl9zZXJpYWxfZ2VuZXJpY19yZWFkX2J1bGtfY2FsbGJhY2soKS4gKi8KQEAgLTM5NCw3ICszOTIsNyBAQAogCWludCB3YXNfdGhyb3R0bGVkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyogQ2xlYXIgdGhlIHRocm90dGxlIGZsYWdzICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKQEAgLTQxMiw3ICs0MTAsNyBAQAogewogCWludCBpOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCS8qIHN0b3AgcmVhZHMgYW5kIHdyaXRlcyBvbiBhbGwgcG9ydHMgKi8KIAlmb3IgKGk9MDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9ocDR4LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaHA0eC5jCmluZGV4IDZjNmViYWUuLjc1Yjg4YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9ocDR4LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2hwNHguYwpAQCAtNTAsOSArNTAsNiBAQAogCX0sCiAJLmlkX3RhYmxlID0JCWlkX3RhYmxlLAogCS51c2JfZHJpdmVyID0gCQkmaHA0OWdwX2RyaXZlciwKLQkubnVtX2ludGVycnVwdF9pbiA9CU5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX2luID0JCU5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX291dCA9CQlOVU1fRE9OVF9DQVJFLAogCS5udW1fcG9ydHMgPQkJMSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pb19lZGdlcG9ydC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lvX2VkZ2Vwb3J0LmMKaW5kZXggMzQyOGNjYy4uY2UyZTQ4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2lvX2VkZ2Vwb3J0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lvX2VkZ2Vwb3J0LmMKQEAgLTM3MSw3ICszNzEsNyBAQAogCXN0cnVjdCB1c2Jfc3RyaW5nX2Rlc2NyaXB0b3IgU3RyaW5nRGVzYzsKIAlzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yICpwU3RyaW5nRGVzYzsKIAotCWRiZygiJXMgLSBVU0IgU3RyaW5nIElEID0gJWQiLCBfX0ZVTkNUSU9OX18sIElkICk7CisJZGJnKCIlcyAtIFVTQiBTdHJpbmcgSUQgPSAlZCIsIF9fZnVuY19fLCBJZCApOwogCiAJaWYgKCF1c2JfZ2V0X2Rlc2NyaXB0b3IoZGV2LCBVU0JfRFRfU1RSSU5HLCBJZCwgJlN0cmluZ0Rlc2MsIHNpemVvZihTdHJpbmdEZXNjKSkpIHsKIAkJcmV0dXJuIDA7CkBAIC0zOTEsNyArMzkxLDcgQEAKIAl1bmljb2RlX3RvX2FzY2lpKHN0cmluZywgYnVmbGVuLCBwU3RyaW5nRGVzYy0+d0RhdGEsIHBTdHJpbmdEZXNjLT5iTGVuZ3RoLzIpOwogCiAJa2ZyZWUocFN0cmluZ0Rlc2MpOwotCWRiZygiJXMgLSBVU0IgU3RyaW5nICVzIiwgX19GVU5DVElPTl9fLCBzdHJpbmcpOworCWRiZygiJXMgLSBVU0IgU3RyaW5nICVzIiwgX19mdW5jX18sIHN0cmluZyk7CiAJcmV0dXJuIHN0cmxlbihzdHJpbmcpOwogfQogCkBAIC00MDcsNyArNDA3LDcgQEAKIAlzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yIFN0cmluZ0Rlc2M7CiAJc3RydWN0IHVzYl9zdHJpbmdfZGVzY3JpcHRvciAqcFN0cmluZ0Rlc2M7CiAKLQlkYmcoIiVzIC0gVVNCIFN0cmluZyBJRCA9ICVkIiwgX19GVU5DVElPTl9fLCBJZCApOworCWRiZygiJXMgLSBVU0IgU3RyaW5nIElEID0gJWQiLCBfX2Z1bmNfXywgSWQgKTsKIAogCWlmICghdXNiX2dldF9kZXNjcmlwdG9yKGRldiwgVVNCX0RUX1NUUklORywgSWQsICZTdHJpbmdEZXNjLCBzaXplb2YoU3RyaW5nRGVzYykpKSB7CiAJCXJldHVybiAwOwpAQCAtNTM3LDcgKzUzNyw3IEBACiAJCQkJIHNpemVvZihzdHJ1Y3QgZWRnZV9jb21wYXRpYmlsaXR5X2Rlc2NyaXB0b3IpLAogCQkJCSAzMDApOwogCi0JZGJnKCIlcyByZXN1bHQgPSAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwlkYmcoIiVzIHJlc3VsdCA9ICVkIiwgX19mdW5jX18sIHJlc3VsdCk7CiAKIAlpZiAocmVzdWx0ID4gMCkgewogCQllcC0+aXNfZXBpYyA9IDE7CkBAIC01ODksNyArNTg5LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkIGVkZ2VfaW50ZXJydXB0X2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IGVkZ2Vwb3J0X3NlcmlhbAkqZWRnZV9zZXJpYWwgPSAoc3RydWN0IGVkZ2Vwb3J0X3NlcmlhbCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgZWRnZXBvcnRfc2VyaWFsCSplZGdlX3NlcmlhbCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgZWRnZXBvcnRfcG9ydCAqZWRnZV9wb3J0OwogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CiAJdW5zaWduZWQgY2hhciAqZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwpAQCAtNjAxLDcgKzYwMSw3IEBACiAJaW50IHJlc3VsdDsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJc3dpdGNoIChzdGF0dXMpIHsKIAljYXNlIDA6CkBAIC02MTIsMzUgKzYxMiwzNSBAQAogCWNhc2UgLUVTSFVURE9XTjoKIAkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KIAkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJcmV0dXJuOwogCWRlZmF1bHQ6CiAJCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJLy8gcHJvY2VzcyB0aGlzIGludGVycnVwdC1yZWFkIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIHBvcnRzIG9wZW4KIAlpZiAobGVuZ3RoKSB7Ci0JCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJmVkZ2Vfc2VyaWFsLT5zZXJpYWwtPmRldi0+ZGV2LCBfX0ZVTkNUSU9OX18sIGxlbmd0aCwgZGF0YSk7CisJCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJmVkZ2Vfc2VyaWFsLT5zZXJpYWwtPmRldi0+ZGV2LCBfX2Z1bmNfXywgbGVuZ3RoLCBkYXRhKTsKIAogCQlpZiAobGVuZ3RoID4gMSkgewogCQkJYnl0ZXNfYXZhaWwgPSBkYXRhWzBdIHwgKGRhdGFbMV0gPDwgOCk7CiAJCQlpZiAoYnl0ZXNfYXZhaWwpIHsKIAkJCQlzcGluX2xvY2soJmVkZ2Vfc2VyaWFsLT5lc19sb2NrKTsKIAkJCQllZGdlX3NlcmlhbC0+cnhCeXRlc0F2YWlsICs9IGJ5dGVzX2F2YWlsOwotCQkJCWRiZygiJXMgLSBieXRlc19hdmFpbD0lZCwgcnhCeXRlc0F2YWlsPSVkLCByZWFkX2luX3Byb2dyZXNzPSVkIiwgX19GVU5DVElPTl9fLCBieXRlc19hdmFpbCwgZWRnZV9zZXJpYWwtPnJ4Qnl0ZXNBdmFpbCwgZWRnZV9zZXJpYWwtPnJlYWRfaW5fcHJvZ3Jlc3MpOworCQkJCWRiZygiJXMgLSBieXRlc19hdmFpbD0lZCwgcnhCeXRlc0F2YWlsPSVkLCByZWFkX2luX3Byb2dyZXNzPSVkIiwgX19mdW5jX18sIGJ5dGVzX2F2YWlsLCBlZGdlX3NlcmlhbC0+cnhCeXRlc0F2YWlsLCBlZGdlX3NlcmlhbC0+cmVhZF9pbl9wcm9ncmVzcyk7CiAKIAkJCQlpZiAoZWRnZV9zZXJpYWwtPnJ4Qnl0ZXNBdmFpbCA+IDAgJiYKIAkJCQkgICAgIWVkZ2Vfc2VyaWFsLT5yZWFkX2luX3Byb2dyZXNzKSB7Ci0JCQkJCWRiZygiJXMgLSBwb3N0aW5nIGEgcmVhZCIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCWRiZygiJXMgLSBwb3N0aW5nIGEgcmVhZCIsIF9fZnVuY19fKTsKIAkJCQkJZWRnZV9zZXJpYWwtPnJlYWRfaW5fcHJvZ3Jlc3MgPSB0cnVlOwogCiAJCQkJCS8qIHdlIGhhdmUgcGVuZGluZyBieXRlcyBvbiB0aGUgYnVsayBpbiBwaXBlLCBzZW5kIGEgcmVxdWVzdCAqLwogCQkJCQllZGdlX3NlcmlhbC0+cmVhZF91cmItPmRldiA9IGVkZ2Vfc2VyaWFsLT5zZXJpYWwtPmRldjsKIAkJCQkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIoZWRnZV9zZXJpYWwtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKIAkJCQkJaWYgKHJlc3VsdCkgewotCQkJCQkJZGV2X2VycigmZWRnZV9zZXJpYWwtPnNlcmlhbC0+ZGV2LT5kZXYsICIlcyAtIHVzYl9zdWJtaXRfdXJiKHJlYWQgYnVsaykgZmFpbGVkIHdpdGggcmVzdWx0ID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCQkJCWRldl9lcnIoJmVkZ2Vfc2VyaWFsLT5zZXJpYWwtPmRldi0+ZGV2LCAiJXMgLSB1c2Jfc3VibWl0X3VyYihyZWFkIGJ1bGspIGZhaWxlZCB3aXRoIHJlc3VsdCA9ICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAkJCQkJCWVkZ2Vfc2VyaWFsLT5yZWFkX2luX3Byb2dyZXNzID0gZmFsc2U7CiAJCQkJCX0KIAkJCQl9CkBAIC02NTksNyArNjU5LDcgQEAKIAkJCQkJc3Bpbl9sb2NrKCZlZGdlX3BvcnQtPmVwX2xvY2spOwogCQkJCQllZGdlX3BvcnQtPnR4Q3JlZGl0cyArPSB0eENyZWRpdHM7CiAJCQkJCXNwaW5fdW5sb2NrKCZlZGdlX3BvcnQtPmVwX2xvY2spOwotCQkJCQlkYmcoIiVzIC0gdHhjcmVkaXRzIGZvciBwb3J0JWQgPSAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydE51bWJlciwgZWRnZV9wb3J0LT50eENyZWRpdHMpOworCQkJCQlkYmcoIiVzIC0gdHhjcmVkaXRzIGZvciBwb3J0JWQgPSAlZCIsIF9fZnVuY19fLCBwb3J0TnVtYmVyLCBlZGdlX3BvcnQtPnR4Q3JlZGl0cyk7CiAKIAkJCQkJLyogdGVsbCB0aGUgdHR5IGRyaXZlciB0aGF0IHNvbWV0aGluZyBoYXMgY2hhbmdlZCAqLwogCQkJCQlpZiAoZWRnZV9wb3J0LT5wb3J0LT50dHkpCkBAIC02NzcsNyArNjc3LDcgQEAKIGV4aXQ6CiAJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlc3VsdCkgewotCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSBFcnJvciAlZCBzdWJtaXR0aW5nIGNvbnRyb2wgdXJiXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsICIlcyAtIEVycm9yICVkIHN1Ym1pdHRpbmcgY29udHJvbCB1cmJcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCX0KIH0KIApAQCAtNjg5LDQ5ICs2ODksNDkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkIGVkZ2VfYnVsa19pbl9jYWxsYmFjayAoc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCBlZGdlcG9ydF9zZXJpYWwJKmVkZ2Vfc2VyaWFsID0gKHN0cnVjdCBlZGdlcG9ydF9zZXJpYWwgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IGVkZ2Vwb3J0X3NlcmlhbAkqZWRnZV9zZXJpYWwgPSB1cmItPmNvbnRleHQ7CiAJdW5zaWduZWQgY2hhcgkJKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlpbnQJCQlyZXR2YWw7CiAJX191MTYJCQlyYXdfZGF0YV9sZW5ndGg7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCWlmIChzdGF0dXMpIHsKIAkJZGJnKCIlcyAtIG5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCWVkZ2Vfc2VyaWFsLT5yZWFkX2luX3Byb2dyZXNzID0gZmFsc2U7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID09IDApIHsKLQkJZGJnKCIlcyAtIHJlYWQgYnVsayBjYWxsYmFjayB3aXRoIG5vIGRhdGEiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gcmVhZCBidWxrIGNhbGxiYWNrIHdpdGggbm8gZGF0YSIsIF9fZnVuY19fKTsKIAkJZWRnZV9zZXJpYWwtPnJlYWRfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKIAkJcmV0dXJuOwogCX0KIAogCXJhd19kYXRhX2xlbmd0aCA9IHVyYi0+YWN0dWFsX2xlbmd0aDsKIAotCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJmVkZ2Vfc2VyaWFsLT5zZXJpYWwtPmRldi0+ZGV2LCBfX0ZVTkNUSU9OX18sIHJhd19kYXRhX2xlbmd0aCwgZGF0YSk7CisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmZWRnZV9zZXJpYWwtPnNlcmlhbC0+ZGV2LT5kZXYsIF9fZnVuY19fLCByYXdfZGF0YV9sZW5ndGgsIGRhdGEpOwogCiAJc3Bpbl9sb2NrKCZlZGdlX3NlcmlhbC0+ZXNfbG9jayk7CiAKIAkvKiBkZWNyZW1lbnQgb3VyIHJ4Qnl0ZXMgYXZhaWxhYmxlIGJ5IHRoZSBudW1iZXIgdGhhdCB3ZSBqdXN0IGdvdCAqLwogCWVkZ2Vfc2VyaWFsLT5yeEJ5dGVzQXZhaWwgLT0gcmF3X2RhdGFfbGVuZ3RoOwogCi0JZGJnKCIlcyAtIFJlY2VpdmVkID0gJWQsIHJ4Qnl0ZXNBdmFpbCAlZCIsIF9fRlVOQ1RJT05fXywgcmF3X2RhdGFfbGVuZ3RoLCBlZGdlX3NlcmlhbC0+cnhCeXRlc0F2YWlsKTsKKwlkYmcoIiVzIC0gUmVjZWl2ZWQgPSAlZCwgcnhCeXRlc0F2YWlsICVkIiwgX19mdW5jX18sIHJhd19kYXRhX2xlbmd0aCwgZWRnZV9zZXJpYWwtPnJ4Qnl0ZXNBdmFpbCk7CiAKIAlwcm9jZXNzX3JjdmRfZGF0YSAoZWRnZV9zZXJpYWwsIGRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAKIAkvKiBjaGVjayB0byBzZWUgaWYgdGhlcmUncyBhbnkgbW9yZSBkYXRhIGZvciB1cyB0byByZWFkICovCiAJaWYgKGVkZ2Vfc2VyaWFsLT5yeEJ5dGVzQXZhaWwgPiAwKSB7Ci0JCWRiZygiJXMgLSBwb3N0aW5nIGEgcmVhZCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBwb3N0aW5nIGEgcmVhZCIsIF9fZnVuY19fKTsKIAkJZWRnZV9zZXJpYWwtPnJlYWRfdXJiLT5kZXYgPSBlZGdlX3NlcmlhbC0+c2VyaWFsLT5kZXY7CiAJCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKGVkZ2Vfc2VyaWFsLT5yZWFkX3VyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChyZXR2YWwpIHsKIAkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCiAJCQkJIiVzIC0gdXNiX3N1Ym1pdF91cmIocmVhZCBidWxrKSBmYWlsZWQsICIKLQkJCQkicmV0dmFsID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwkJCQkicmV0dmFsID0gJWRcbiIsIF9fZnVuY19fLCByZXR2YWwpOwogCQkJZWRnZV9zZXJpYWwtPnJlYWRfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfQogCX0gZWxzZSB7CkBAIC03NDksMTUgKzc0OSwxNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQgZWRnZV9idWxrX291dF9kYXRhX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IGVkZ2Vwb3J0X3BvcnQgKmVkZ2VfcG9ydCA9IChzdHJ1Y3QgZWRnZXBvcnRfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgZWRnZXBvcnRfcG9ydCAqZWRnZV9wb3J0ID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCWlmIChzdGF0dXMpIHsKIAkJZGJnKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCX0KIAogCXR0eSA9IGVkZ2VfcG9ydC0+cG9ydC0+dHR5OwpAQCAtNzgyLDE0ICs3ODIsMTQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkIGVkZ2VfYnVsa19vdXRfY21kX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IGVkZ2Vwb3J0X3BvcnQgKmVkZ2VfcG9ydCA9IChzdHJ1Y3QgZWRnZXBvcnRfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgZWRnZXBvcnRfcG9ydCAqZWRnZV9wb3J0ID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCWF0b21pY19kZWMoJkNtZFVyYnMpOwotCWRiZygiJXMgLSBGUkVFIFVSQiAlcCAob3V0c3RhbmRpbmcgJWQpIiwgX19GVU5DVElPTl9fLCB1cmIsIGF0b21pY19yZWFkKCZDbWRVcmJzKSk7CisJZGJnKCIlcyAtIEZSRUUgVVJCICVwIChvdXRzdGFuZGluZyAlZCkiLCBfX2Z1bmNfXywgdXJiLCBhdG9taWNfcmVhZCgmQ21kVXJicykpOwogCiAKIAkvKiBjbGVhbiB1cCB0aGUgdHJhbnNmZXIgYnVmZmVyICovCkBAIC03OTksNyArNzk5LDcgQEAKIAl1c2JfZnJlZV91cmIgKHVyYik7CiAKIAlpZiAoc3RhdHVzKSB7Ci0JCWRiZygiJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGJnKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTgzMyw3ICs4MzMsNyBAQAogCXN0cnVjdCBlZGdlcG9ydF9zZXJpYWwgKmVkZ2Vfc2VyaWFsOwogCWludCByZXNwb25zZTsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoZWRnZV9wb3J0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtODgzLDcgKzg4Myw3IEBACiAJCSAqIHRoaXMgaW50ZXJydXB0IHdpbGwgY29udGludWUgYXMgbG9uZyBhcyB0aGUgZWRnZXBvcnQgaXMgY29ubmVjdGVkICovCiAJCXJlc3BvbnNlID0gdXNiX3N1Ym1pdF91cmIgKGVkZ2Vfc2VyaWFsLT5pbnRlcnJ1cHRfcmVhZF91cmIsIEdGUF9LRVJORUwpOwogCQlpZiAocmVzcG9uc2UpIHsKLQkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyBjb250cm9sIHVyYlxuIiwgX19GVU5DVElPTl9fLCByZXNwb25zZSk7CisJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIEVycm9yICVkIHN1Ym1pdHRpbmcgY29udHJvbCB1cmJcbiIsIF9fZnVuY19fLCByZXNwb25zZSk7CiAJCX0KIAl9CiAJCkBAIC05MDcsNyArOTA3LDcgQEAKIAlyZXNwb25zZSA9IHNlbmRfaW9zcF9leHRfY21kIChlZGdlX3BvcnQsIElPU1BfQ01EX09QRU5fUE9SVCwgMCk7CiAKIAlpZiAocmVzcG9uc2UgPCAwKSB7Ci0JCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZXJyb3Igc2VuZGluZyBvcGVuIHBvcnQgY29tbWFuZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBlcnJvciBzZW5kaW5nIG9wZW4gcG9ydCBjb21tYW5kXG4iLCBfX2Z1bmNfXyk7CiAJCWVkZ2VfcG9ydC0+b3BlblBlbmRpbmcgPSBmYWxzZTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtOTE3LDcgKzkxNyw3IEBACiAKIAlpZiAoIWVkZ2VfcG9ydC0+b3BlbikgewogCQkvKiBvcGVuIHRpbWVkIG91dCAqLwotCQlkYmcoIiVzIC0gb3BlbiB0aW1lZG91dCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBvcGVuIHRpbWVkb3V0IiwgX19mdW5jX18pOwogCQllZGdlX3BvcnQtPm9wZW5QZW5kaW5nID0gZmFsc2U7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTkzMCw3ICs5MzAsNyBAQAogCWVkZ2VfcG9ydC0+dHhmaWZvLmZpZm8JPSBrbWFsbG9jIChlZGdlX3BvcnQtPm1heFR4Q3JlZGl0cywgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIWVkZ2VfcG9ydC0+dHhmaWZvLmZpZm8pIHsKLQkJZGJnKCIlcyAtIG5vIG1lbW9yeSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBubyBtZW1vcnkiLCBfX2Z1bmNfXyk7CiAJCWVkZ2VfY2xvc2UgKHBvcnQsIGZpbHApOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC05NDAsMTQgKzk0MCwxNCBAQAogCWVkZ2VfcG9ydC0+d3JpdGVfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKIAogCWlmICghZWRnZV9wb3J0LT53cml0ZV91cmIpIHsKLQkJZGJnKCIlcyAtIG5vIG1lbW9yeSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBubyBtZW1vcnkiLCBfX2Z1bmNfXyk7CiAJCWVkZ2VfY2xvc2UgKHBvcnQsIGZpbHApOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlkYmcoIiVzKCVkKSAtIEluaXRpYWxpemUgVFggZmlmbyB0byAlZCBieXRlcyIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBlZGdlX3BvcnQtPm1heFR4Q3JlZGl0cyk7CisJZGJnKCIlcyglZCkgLSBJbml0aWFsaXplIFRYIGZpZm8gdG8gJWQgYnl0ZXMiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCBlZGdlX3BvcnQtPm1heFR4Q3JlZGl0cyk7CiAKLQlkYmcoIiVzIGV4aXRlZCIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyBleGl0ZWQiLCBfX2Z1bmNfXyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTk3NiwxMSArOTc2LDExIEBACiAKIAkJLy8gRGlkIHdlIGdldCBvdXIgQ2hhc2UgcmVzcG9uc2UKIAkJaWYgKCFlZGdlX3BvcnQtPmNoYXNlUmVzcG9uc2VQZW5kaW5nKSB7Ci0JCQlkYmcoIiVzIC0gR290IENoYXNlIFJlc3BvbnNlIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBHb3QgQ2hhc2UgUmVzcG9uc2UiLCBfX2Z1bmNfXyk7CiAKIAkJCS8vIGRpZCB3ZSBnZXQgYWxsIG9mIG91ciBjcmVkaXQgYmFjaz8KIAkJCWlmIChlZGdlX3BvcnQtPnR4Q3JlZGl0cyA9PSBlZGdlX3BvcnQtPm1heFR4Q3JlZGl0cyApIHsKLQkJCQlkYmcoIiVzIC0gR290IGFsbCBjcmVkaXRzIiwgX19GVU5DVElPTl9fKTsKKwkJCQlkYmcoIiVzIC0gR290IGFsbCBjcmVkaXRzIiwgX19mdW5jX18pOwogCQkJCXJldHVybjsKIAkJCX0KIAkJfQpAQCAtOTk1LDEyICs5OTUsMTIgQEAKIAkJCWxvb3AtLTsKIAkJCWlmIChsb29wID09IDApIHsKIAkJCQllZGdlX3BvcnQtPmNoYXNlUmVzcG9uc2VQZW5kaW5nID0gZmFsc2U7Ci0JCQkJZGJnKCIlcyAtIENoYXNlIFRJTUVPVVQiLCBfX0ZVTkNUSU9OX18pOworCQkJCWRiZygiJXMgLSBDaGFzZSBUSU1FT1VUIiwgX19mdW5jX18pOwogCQkJCXJldHVybjsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCS8vIFJlc2V0IHRpbWVvdXQgdmFsdWUgYmFjayB0byAxMCBzZWNvbmRzCi0JCQlkYmcoIiVzIC0gTGFzdCAlZCwgQ3VycmVudCAlZCIsIF9fRlVOQ1RJT05fXywgbGFzdENyZWRpdHMsIGVkZ2VfcG9ydC0+dHhDcmVkaXRzKTsKKwkJCWRiZygiJXMgLSBMYXN0ICVkLCBDdXJyZW50ICVkIiwgX19mdW5jX18sIGxhc3RDcmVkaXRzLCBlZGdlX3BvcnQtPnR4Q3JlZGl0cyk7CiAJCQlsb29wID0gMTA7CiAJCX0KIAl9CkBAIC0xMDMxLDcgKzEwMzEsNyBAQAogCiAJCS8vIElzIHRoZSBFZGdlcG9ydCBCdWZmZXIgZW1wdHk/CiAJCWlmIChsYXN0Q291bnQgPT0gMCkgewotCQkJZGJnKCIlcyAtIFRYIEJ1ZmZlciBFbXB0eSIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gVFggQnVmZmVyIEVtcHR5IiwgX19mdW5jX18pOwogCQkJcmV0dXJuOwogCQl9CiAKQEAgLTEwNDAsMTMgKzEwNDAsMTMgQEAKIAkJc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKIAkJZmluaXNoX3dhaXQoJmVkZ2VfcG9ydC0+d2FpdF9jaGFzZSwgJndhaXQpOwogCi0JCWRiZygiJXMgd2FpdCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgd2FpdCIsIF9fZnVuY19fKTsKIAogCQlpZiAobGFzdENvdW50ID09IGZpZm8tPmNvdW50KSB7CiAJCQkvLyBObyBhY3Rpdml0eS4uIGNvdW50IGRvd24uCiAJCQlsb29wLS07CiAJCQlpZiAobG9vcCA9PSAwKSB7Ci0JCQkJZGJnKCIlcyAtIFRJTUVPVVQiLCBfX0ZVTkNUSU9OX18pOworCQkJCWRiZygiJXMgLSBUSU1FT1VUIiwgX19mdW5jX18pOwogCQkJCXJldHVybjsKIAkJCX0KIAkJfSBlbHNlIHsKQEAgLTEwNjcsNyArMTA2Nyw3IEBACiAJc3RydWN0IGVkZ2Vwb3J0X3BvcnQgKmVkZ2VfcG9ydDsKIAlpbnQgc3RhdHVzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAkJCSAKIAllZGdlX3NlcmlhbCA9IHVzYl9nZXRfc2VyaWFsX2RhdGEocG9ydC0+c2VyaWFsKTsKIAllZGdlX3BvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CkBAIC0xMDg1LDcgKzEwODUsNyBAQAogCQkvKiBmbHVzaCBhbmQgY2hhc2UgKi8KIAkJZWRnZV9wb3J0LT5jaGFzZVJlc3BvbnNlUGVuZGluZyA9IHRydWU7CiAKLQkJZGJnKCIlcyAtIFNlbmRpbmcgSU9TUF9DTURfQ0hBU0VfUE9SVCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBTZW5kaW5nIElPU1BfQ01EX0NIQVNFX1BPUlQiLCBfX2Z1bmNfXyk7CiAJCXN0YXR1cyA9IHNlbmRfaW9zcF9leHRfY21kIChlZGdlX3BvcnQsIElPU1BfQ01EX0NIQVNFX1BPUlQsIDApOwogCQlpZiAoc3RhdHVzID09IDApIHsKIAkJCS8vIGJsb2NrIHVudGlsIGNoYXNlIGZpbmlzaGVkCkBAIC0xMDk5LDcgKzEwOTksNyBAQAogCSAgICAoKGVkZ2Vfc2VyaWFsLT5pc19lcGljKSAmJgogCSAgICAgKGVkZ2Vfc2VyaWFsLT5lcGljX2Rlc2NyaXB0b3IuU3VwcG9ydHMuSU9TUENsb3NlKSkpIHsKIAkgICAgICAgLyogY2xvc2UgdGhlIHBvcnQgKi8KLQkJZGJnKCIlcyAtIFNlbmRpbmcgSU9TUF9DTURfQ0xPU0VfUE9SVCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBTZW5kaW5nIElPU1BfQ01EX0NMT1NFX1BPUlQiLCBfX2Z1bmNfXyk7CiAJCXNlbmRfaW9zcF9leHRfY21kIChlZGdlX3BvcnQsIElPU1BfQ01EX0NMT1NFX1BPUlQsIDApOwogCX0KIApAQCAtMTExOSw3ICsxMTE5LDcgQEAKIAlrZnJlZShlZGdlX3BvcnQtPnR4Zmlmby5maWZvKTsKIAllZGdlX3BvcnQtPnR4Zmlmby5maWZvID0gTlVMTDsKIAotCWRiZygiJXMgZXhpdGVkIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIGV4aXRlZCIsIF9fZnVuY19fKTsKIH0gICAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMTM5LDcgKzExMzksNyBAQAogCWludCBzZWNvbmRoYWxmOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKGVkZ2VfcG9ydCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTExNTIsMTIgKzExNTIsMTIgQEAKIAkvLyBjYWxjdWxhdGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHB1dCBpbiBmaWZvCiAJY29weVNpemUgPSBtaW4gKCh1bnNpZ25lZCBpbnQpY291bnQsIChlZGdlX3BvcnQtPnR4Q3JlZGl0cyAtIGZpZm8tPmNvdW50KSk7CiAKLQlkYmcoIiVzKCVkKSBvZiAlZCBieXRlKHMpIEZpZm8gcm9vbSAgJWQgLS0gd2lsbCBjb3B5ICVkIGJ5dGVzIiwgX19GVU5DVElPTl9fLCAKKwlkYmcoIiVzKCVkKSBvZiAlZCBieXRlKHMpIEZpZm8gcm9vbSAgJWQgLS0gd2lsbCBjb3B5ICVkIGJ5dGVzIiwgX19mdW5jX18sCiAJICAgIHBvcnQtPm51bWJlciwgY291bnQsIGVkZ2VfcG9ydC0+dHhDcmVkaXRzIC0gZmlmby0+Y291bnQsIGNvcHlTaXplKTsKIAogCS8qIGNhdGNoIHdyaXRlcyBvZiAwIGJ5dGVzIHdoaWNoIHRoZSB0dHkgZHJpdmVyIGxpa2VzIHRvIGdpdmUgdXMsIGFuZCB3aGVuIHR4Q3JlZGl0cyBpcyBlbXB0eSAqLwogCWlmIChjb3B5U2l6ZSA9PSAwKSB7Ci0JCWRiZygiJXMgLSBjb3B5U2l6ZSA9IFplcm8iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gY29weVNpemUgPSBaZXJvIiwgX19mdW5jX18pOwogCQlnb3RvIGZpbmlzaF93cml0ZTsKIAl9CiAKQEAgLTExNjksMTEgKzExNjksMTEgQEAKIAogCWJ5dGVzbGVmdCA9IGZpZm8tPnNpemUgLSBmaWZvLT5oZWFkOwogCWZpcnN0aGFsZiA9IG1pbiAoYnl0ZXNsZWZ0LCBjb3B5U2l6ZSk7Ci0JZGJnKCIlcyAtIGNvcHkgJWQgYnl0ZXMgb2YgJWQgaW50byBmaWZvICIsIF9fRlVOQ1RJT05fXywgZmlyc3RoYWxmLCBieXRlc2xlZnQpOworCWRiZygiJXMgLSBjb3B5ICVkIGJ5dGVzIG9mICVkIGludG8gZmlmbyAiLCBfX2Z1bmNfXywgZmlyc3RoYWxmLCBieXRlc2xlZnQpOwogCiAJLyogbm93IGNvcHkgb3VyIGRhdGEgKi8KIAltZW1jcHkoJmZpZm8tPmZpZm9bZmlmby0+aGVhZF0sIGRhdGEsIGZpcnN0aGFsZik7Ci0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIGZpcnN0aGFsZiwgJmZpZm8tPmZpZm9bZmlmby0+aGVhZF0pOworCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sIGZpcnN0aGFsZiwgJmZpZm8tPmZpZm9bZmlmby0+aGVhZF0pOwogCiAJLy8gdXBkYXRlIHRoZSBpbmRleCBhbmQgc2l6ZQogCWZpZm8tPmhlYWQgICs9IGZpcnN0aGFsZjsKQEAgLTExODcsOSArMTE4Nyw5IEBACiAJc2Vjb25kaGFsZiA9IGNvcHlTaXplLWZpcnN0aGFsZjsKIAogCWlmIChzZWNvbmRoYWxmKSB7Ci0JCWRiZygiJXMgLSBjb3B5IHJlc3Qgb2YgZGF0YSAlZCIsIF9fRlVOQ1RJT05fXywgc2Vjb25kaGFsZik7CisJCWRiZygiJXMgLSBjb3B5IHJlc3Qgb2YgZGF0YSAlZCIsIF9fZnVuY19fLCBzZWNvbmRoYWxmKTsKIAkJbWVtY3B5KCZmaWZvLT5maWZvW2ZpZm8tPmhlYWRdLCAmZGF0YVtmaXJzdGhhbGZdLCBzZWNvbmRoYWxmKTsKLQkJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIHNlY29uZGhhbGYsICZmaWZvLT5maWZvW2ZpZm8tPmhlYWRdKTsKKwkJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgc2Vjb25kaGFsZiwgJmZpZm8tPmZpZm9bZmlmby0+aGVhZF0pOwogCQkvLyB1cGRhdGUgdGhlIGluZGV4IGFuZCBzaXplCiAJCWZpZm8tPmNvdW50ICs9IHNlY29uZGhhbGY7CiAJCWZpZm8tPmhlYWQgICs9IHNlY29uZGhhbGY7CkBAIC0xMjAxLDcgKzEyMDEsNyBAQAogCiAJc2VuZF9tb3JlX3BvcnRfZGF0YSgoc3RydWN0IGVkZ2Vwb3J0X3NlcmlhbCAqKXVzYl9nZXRfc2VyaWFsX2RhdGEocG9ydC0+c2VyaWFsKSwgZWRnZV9wb3J0KTsKIAotCWRiZygiJXMgd3JvdGUgJWQgYnl0ZShzKSBUeENyZWRpdHMgJWQsIEZpZm8gJWQiLCBfX0ZVTkNUSU9OX18sIGNvcHlTaXplLCBlZGdlX3BvcnQtPnR4Q3JlZGl0cywgZmlmby0+Y291bnQpOworCWRiZygiJXMgd3JvdGUgJWQgYnl0ZShzKSBUeENyZWRpdHMgJWQsIEZpZm8gJWQiLCBfX2Z1bmNfXywgY29weVNpemUsIGVkZ2VfcG9ydC0+dHhDcmVkaXRzLCBmaWZvLT5jb3VudCk7CiAKIAlyZXR1cm4gY29weVNpemU7ICAgCiB9CkBAIC0xMjMyLDE0ICsxMjMyLDE0IEBACiAJaW50CQlzZWNvbmRoYWxmOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAKLQlkYmcoIiVzKCVkKSIsIF9fRlVOQ1RJT05fXywgZWRnZV9wb3J0LT5wb3J0LT5udW1iZXIpOworCWRiZygiJXMoJWQpIiwgX19mdW5jX18sIGVkZ2VfcG9ydC0+cG9ydC0+bnVtYmVyKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZlZGdlX3BvcnQtPmVwX2xvY2ssIGZsYWdzKTsKIAogCWlmIChlZGdlX3BvcnQtPndyaXRlX2luX3Byb2dyZXNzIHx8CiAJICAgICFlZGdlX3BvcnQtPm9wZW4gICAgICAgICAgICAgfHwKIAkgICAgKGZpZm8tPmNvdW50ID09IDApKSB7Ci0JCWRiZygiJXMoJWQpIEVYSVQgLSBmaWZvICVkLCBQZW5kaW5nV3JpdGUgPSAlZCIsIF9fRlVOQ1RJT05fXywgZWRnZV9wb3J0LT5wb3J0LT5udW1iZXIsIGZpZm8tPmNvdW50LCBlZGdlX3BvcnQtPndyaXRlX2luX3Byb2dyZXNzKTsKKwkJZGJnKCIlcyglZCkgRVhJVCAtIGZpZm8gJWQsIFBlbmRpbmdXcml0ZSA9ICVkIiwgX19mdW5jX18sIGVkZ2VfcG9ydC0+cG9ydC0+bnVtYmVyLCBmaWZvLT5jb3VudCwgZWRnZV9wb3J0LT53cml0ZV9pbl9wcm9ncmVzcyk7CiAJCWdvdG8gZXhpdF9zZW5kOwogCX0KIApAQCAtMTI1MSw3ICsxMjUxLDcgQEAKIAkvLwlpdCdzIGJldHRlciB0byB3YWl0IGZvciBtb3JlIGNyZWRpdHMgc28gd2UgY2FuIGRvIGEgbGFyZ2VyCiAJLy8Jd3JpdGUuCiAJaWYgKGVkZ2VfcG9ydC0+dHhDcmVkaXRzIDwgRURHRV9GV19HRVRfVFhfQ1JFRElUU19TRU5EX1RIUkVTSE9MRChlZGdlX3BvcnQtPm1heFR4Q3JlZGl0cyxFREdFX0ZXX0JVTEtfTUFYX1BBQ0tFVF9TSVpFKSkgewotCQlkYmcoIiVzKCVkKSBOb3QgZW5vdWdoIGNyZWRpdCAtIGZpZm8gJWQgVHhDcmVkaXQgJWQiLCBfX0ZVTkNUSU9OX18sIGVkZ2VfcG9ydC0+cG9ydC0+bnVtYmVyLCBmaWZvLT5jb3VudCwgZWRnZV9wb3J0LT50eENyZWRpdHMgKTsKKwkJZGJnKCIlcyglZCkgTm90IGVub3VnaCBjcmVkaXQgLSBmaWZvICVkIFR4Q3JlZGl0ICVkIiwgX19mdW5jX18sIGVkZ2VfcG9ydC0+cG9ydC0+bnVtYmVyLCBmaWZvLT5jb3VudCwgZWRnZV9wb3J0LT50eENyZWRpdHMgKTsKIAkJZ290byBleGl0X3NlbmQ7CiAJfQogCkBAIC0xMjY5LDcgKzEyNjksNyBAQAogCWNvdW50ID0gZmlmby0+Y291bnQ7CiAJYnVmZmVyID0ga21hbGxvYyAoY291bnQrMiwgR0ZQX0FUT01JQyk7CiAJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmVkZ2VfcG9ydC0+cG9ydC0+ZGV2LCAiJXMgLSBubyBtb3JlIGtlcm5lbCBtZW1vcnkuLi5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRldl9lcnIoJmVkZ2VfcG9ydC0+cG9ydC0+ZGV2LCAiJXMgLSBubyBtb3JlIGtlcm5lbCBtZW1vcnkuLi5cbiIsIF9fZnVuY19fKTsKIAkJZWRnZV9wb3J0LT53cml0ZV9pbl9wcm9ncmVzcyA9IGZhbHNlOwogCQlnb3RvIGV4aXRfc2VuZDsKIAl9CkBAIC0xMjk0LDcgKzEyOTQsNyBAQAogCX0KIAogCWlmIChjb3VudCkKLQkJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmZWRnZV9wb3J0LT5wb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgY291bnQsICZidWZmZXJbMl0pOworCQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZlZGdlX3BvcnQtPnBvcnQtPmRldiwgX19mdW5jX18sIGNvdW50LCAmYnVmZmVyWzJdKTsKIAogCS8qIGZpbGwgdXAgdGhlIHVyYiB3aXRoIGFsbCBvZiBvdXIgZGF0YSBhbmQgc3VibWl0IGl0ICovCiAJdXNiX2ZpbGxfYnVsa191cmIgKHVyYiwgZWRnZV9zZXJpYWwtPnNlcmlhbC0+ZGV2LCAKQEAgLTEzMDksMTQgKzEzMDksMTQgQEAKIAlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChzdGF0dXMpIHsKIAkJLyogc29tZXRoaW5nIHdlbnQgd3JvbmcgKi8KLQkJZGV2X2VycigmZWRnZV9wb3J0LT5wb3J0LT5kZXYsICIlcyAtIHVzYl9zdWJtaXRfdXJiKHdyaXRlIGJ1bGspIGZhaWxlZCwgc3RhdHVzID0gJWQsIGRhdGEgbG9zdFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkZXZfZXJyKCZlZGdlX3BvcnQtPnBvcnQtPmRldiwgIiVzIC0gdXNiX3N1Ym1pdF91cmIod3JpdGUgYnVsaykgZmFpbGVkLCBzdGF0dXMgPSAlZCwgZGF0YSBsb3N0XG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJZWRnZV9wb3J0LT53cml0ZV9pbl9wcm9ncmVzcyA9IGZhbHNlOwogCiAJCS8qIHJldmVydCB0aGUgY3JlZGl0cyBhcyBzb21ldGhpbmcgYmFkIGhhcHBlbmVkLiAqLwogCQllZGdlX3BvcnQtPnR4Q3JlZGl0cyArPSBjb3VudDsKIAkJZWRnZV9wb3J0LT5pY291bnQudHggLT0gY291bnQ7CiAJfQotCWRiZygiJXMgd3JvdGUgJWQgYnl0ZShzKSBUeENyZWRpdCAlZCwgRmlmbyAlZCIsIF9fRlVOQ1RJT05fXywgY291bnQsIGVkZ2VfcG9ydC0+dHhDcmVkaXRzLCBmaWZvLT5jb3VudCk7CisJZGJnKCIlcyB3cm90ZSAlZCBieXRlKHMpIFR4Q3JlZGl0ICVkLCBGaWZvICVkIiwgX19mdW5jX18sIGNvdW50LCBlZGdlX3BvcnQtPnR4Q3JlZGl0cywgZmlmby0+Y291bnQpOwogCiBleGl0X3NlbmQ6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRnZV9wb3J0LT5lcF9sb2NrLCBmbGFncyk7CkBAIC0xMzM3LDE3ICsxMzM3LDE3IEBACiAJaW50IHJvb207CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlpZiAoZWRnZV9wb3J0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCWlmIChlZGdlX3BvcnQtPmNsb3NlUGVuZGluZykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKCFlZGdlX3BvcnQtPm9wZW4pIHsKLQkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuZWQiLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTM1Niw3ICsxMzU2LDcgQEAKIAlyb29tID0gZWRnZV9wb3J0LT50eENyZWRpdHMgLSBlZGdlX3BvcnQtPnR4Zmlmby5jb3VudDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZGdlX3BvcnQtPmVwX2xvY2ssIGZsYWdzKTsKIAotCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19GVU5DVElPTl9fLCByb29tKTsKKwlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fZnVuY19fLCByb29tKTsKIAlyZXR1cm4gcm9vbTsKIH0KIApAQCAtMTM3Niw3ICsxMzc2LDcgQEAKIAlpbnQgbnVtX2NoYXJzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJaWYgKGVkZ2VfcG9ydCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTEzODQsNyArMTM4NCw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKCFlZGdlX3BvcnQtPm9wZW4pIHsKLQkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuZWQiLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTM5Miw3ICsxMzkyLDcgQEAKIAludW1fY2hhcnMgPSBlZGdlX3BvcnQtPm1heFR4Q3JlZGl0cyAtIGVkZ2VfcG9ydC0+dHhDcmVkaXRzICsgZWRnZV9wb3J0LT50eGZpZm8uY291bnQ7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRnZV9wb3J0LT5lcF9sb2NrLCBmbGFncyk7CiAJaWYgKG51bV9jaGFycykgewotCQlkYmcoIiVzKHBvcnQgJWQpIC0gcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBudW1fY2hhcnMpOworCQlkYmcoIiVzKHBvcnQgJWQpIC0gcmV0dXJucyAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIG51bV9jaGFycyk7CiAJfQogCiAJcmV0dXJuIG51bV9jaGFyczsKQEAgLTE0MTAsMTkgKzE0MTAsMTkgQEAKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCWludCBzdGF0dXM7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKGVkZ2VfcG9ydCA9PSBOVUxMKQogCQlyZXR1cm47CiAKIAlpZiAoIWVkZ2VfcG9ydC0+b3BlbikgewotCQlkYmcoIiVzIC0gcG9ydCBub3Qgb3BlbmVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAoIXR0eSkgewotCQlkYmcgKCIlcyAtIG5vIHR0eSBhdmFpbGFibGUiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcgKCIlcyAtIG5vIHR0eSBhdmFpbGFibGUiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE0NTksMTkgKzE0NTksMTkgQEAKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCWludCBzdGF0dXM7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKGVkZ2VfcG9ydCA9PSBOVUxMKQogCQlyZXR1cm47CiAKIAlpZiAoIWVkZ2VfcG9ydC0+b3BlbikgewotCQlkYmcoIiVzIC0gcG9ydCBub3Qgb3BlbmVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAoIXR0eSkgewotCQlkYmcgKCIlcyAtIG5vIHR0eSBhdmFpbGFibGUiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcgKCIlcyAtIG5vIHR0eSBhdmFpbGFibGUiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE1MDksMTggKzE1MDksMTggQEAKIAl1bnNpZ25lZCBpbnQgY2ZsYWc7CiAKIAljZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKLQlkYmcoIiVzIC0gY2xmYWcgJTA4eCBpZmxhZyAlMDh4IiwgX19GVU5DVElPTl9fLCAKKwlkYmcoIiVzIC0gY2xmYWcgJTA4eCBpZmxhZyAlMDh4IiwgX19mdW5jX18sCiAJICAgIHR0eS0+dGVybWlvcy0+Y19jZmxhZywgdHR5LT50ZXJtaW9zLT5jX2lmbGFnKTsKLQlkYmcoIiVzIC0gb2xkIGNsZmFnICUwOHggb2xkIGlmbGFnICUwOHgiLCBfX0ZVTkNUSU9OX18sCisJZGJnKCIlcyAtIG9sZCBjbGZhZyAlMDh4IG9sZCBpZmxhZyAlMDh4IiwgX19mdW5jX18sCiAJICAgIG9sZF90ZXJtaW9zLT5jX2NmbGFnLCBvbGRfdGVybWlvcy0+Y19pZmxhZyk7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKGVkZ2VfcG9ydCA9PSBOVUxMKQogCQlyZXR1cm47CiAKIAlpZiAoIWVkZ2VfcG9ydC0+b3BlbikgewotCQlkYmcoIiVzIC0gcG9ydCBub3Qgb3BlbmVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTU0OSw3ICsxNTQ5LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZWRnZV9wb3J0LT5lcF9sb2NrLCBmbGFncyk7CiAJaWYgKGVkZ2VfcG9ydC0+bWF4VHhDcmVkaXRzID09IGVkZ2VfcG9ydC0+dHhDcmVkaXRzICYmCiAJICAgIGVkZ2VfcG9ydC0+dHhmaWZvLmNvdW50ID09IDApIHsKLQkJZGJnKCIlcyAtLSBFbXB0eSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLS0gRW1wdHkiLCBfX2Z1bmNfXyk7CiAJCXJlc3VsdCA9IFRJT0NTRVJfVEVNVDsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRnZV9wb3J0LT5lcF9sb2NrLCBmbGFncyk7CkBAIC0xNTY5LDcgKzE1NjksNyBAQAogCiAJcmVzdWx0ID0gdHR5LT5yZWFkX2NudDsKIAotCWRiZygiJXMoJWQpID0gJWQiLCBfX0ZVTkNUSU9OX18sICBlZGdlX3BvcnQtPnBvcnQtPm51bWJlciwgcmVzdWx0KTsKKwlkYmcoIiVzKCVkKSA9ICVkIiwgX19mdW5jX18sICBlZGdlX3BvcnQtPnBvcnQtPm51bWJlciwgcmVzdWx0KTsKIAlpZiAoY29weV90b191c2VyKHZhbHVlLCAmcmVzdWx0LCBzaXplb2YoaW50KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCS8vcmV0dXJuIDA7CkBAIC0xNTgxLDcgKzE1ODEsNyBAQAogCXN0cnVjdCBlZGdlcG9ydF9wb3J0ICplZGdlX3BvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdW5zaWduZWQgaW50IG1jcjsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAltY3IgPSBlZGdlX3BvcnQtPnNoYWRvd01DUjsKIAlpZiAoc2V0ICYgVElPQ01fUlRTKQpAQCAtMTYxMiw3ICsxNjEyLDcgQEAKIAl1bnNpZ25lZCBpbnQgbXNyOwogCXVuc2lnbmVkIGludCBtY3I7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJbXNyID0gZWRnZV9wb3J0LT5zaGFkb3dNU1I7CiAJbWNyID0gZWRnZV9wb3J0LT5zaGFkb3dNQ1I7CkBAIC0xNjI0LDcgKzE2MjQsNyBAQAogCQkgIHwgKChtc3IgJiBFREdFUE9SVF9NU1JfRFNSKQk/IFRJT0NNX0RTUjogMCk7ICAvKiAweDEwMCAqLwogCiAKLQlkYmcoIiVzIC0tICV4IiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCWRiZygiJXMgLS0gJXgiLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0xNjcwLDMwICsxNjcwLDMwIEBACiAJc3RydWN0IGFzeW5jX2ljb3VudCBjcHJldjsKIAlzdHJ1Y3Qgc2VyaWFsX2ljb3VudGVyX3N0cnVjdCBpY291bnQ7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCwgY21kID0gMHgleCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjbWQpOworCWRiZygiJXMgLSBwb3J0ICVkLCBjbWQgPSAweCV4IiwgX19mdW5jX18sIHBvcnQtPm51bWJlciwgY21kKTsKIAogCXN3aXRjaCAoY21kKSB7CiAJCS8vIHJldHVybiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlCiAJCWNhc2UgVElPQ0lOUToKLQkJCWRiZygiJXMgKCVkKSBUSU9DSU5RIiwgX19GVU5DVElPTl9fLCAgcG9ydC0+bnVtYmVyKTsKKwkJCWRiZygiJXMgKCVkKSBUSU9DSU5RIiwgX19mdW5jX18sICBwb3J0LT5udW1iZXIpOwogCQkJcmV0dXJuIGdldF9udW1iZXJfYnl0ZXNfYXZhaWwoZWRnZV9wb3J0LCAodW5zaWduZWQgaW50IF9fdXNlciAqKSBhcmcpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBUSU9DU0VSR0VUTFNSOgotCQkJZGJnKCIlcyAoJWQpIFRJT0NTRVJHRVRMU1IiLCBfX0ZVTkNUSU9OX18sICBwb3J0LT5udW1iZXIpOworCQkJZGJnKCIlcyAoJWQpIFRJT0NTRVJHRVRMU1IiLCBfX2Z1bmNfXywgIHBvcnQtPm51bWJlcik7CiAJCQlyZXR1cm4gZ2V0X2xzcl9pbmZvKGVkZ2VfcG9ydCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKikgYXJnKTsKIAkJCXJldHVybiAwOwogCiAJCWNhc2UgVElPQ0dTRVJJQUw6Ci0JCQlkYmcoIiVzICglZCkgVElPQ0dTRVJJQUwiLCBfX0ZVTkNUSU9OX18sICBwb3J0LT5udW1iZXIpOworCQkJZGJnKCIlcyAoJWQpIFRJT0NHU0VSSUFMIiwgX19mdW5jX18sICBwb3J0LT5udW1iZXIpOwogCQkJcmV0dXJuIGdldF9zZXJpYWxfaW5mbyhlZGdlX3BvcnQsIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKikgYXJnKTsKIAogCQljYXNlIFRJT0NTU0VSSUFMOgotCQkJZGJnKCIlcyAoJWQpIFRJT0NTU0VSSUFMIiwgX19GVU5DVElPTl9fLCAgcG9ydC0+bnVtYmVyKTsKKwkJCWRiZygiJXMgKCVkKSBUSU9DU1NFUklBTCIsIF9fZnVuY19fLCAgcG9ydC0+bnVtYmVyKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgVElPQ01JV0FJVDoKLQkJCWRiZygiJXMgKCVkKSBUSU9DTUlXQUlUIiwgX19GVU5DVElPTl9fLCAgcG9ydC0+bnVtYmVyKTsKKwkJCWRiZygiJXMgKCVkKSBUSU9DTUlXQUlUIiwgX19mdW5jX18sICBwb3J0LT5udW1iZXIpOwogCQkJY3ByZXYgPSBlZGdlX3BvcnQtPmljb3VudDsKIAkJCXdoaWxlICgxKSB7CiAJCQkJcHJlcGFyZV90b193YWl0KCZlZGdlX3BvcnQtPmRlbHRhX21zcl93YWl0LCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKQEAgLTE3MzIsNyArMTczMiw3IEBACiAJCQlpY291bnQuYnJrID0gY25vdy5icms7CiAJCQlpY291bnQuYnVmX292ZXJydW4gPSBjbm93LmJ1Zl9vdmVycnVuOwogCi0JCQlkYmcoIiVzICglZCkgVElPQ0dJQ09VTlQgUlg9JWQsIFRYPSVkIiwgX19GVU5DVElPTl9fLCAgcG9ydC0+bnVtYmVyLCBpY291bnQucngsIGljb3VudC50eCApOworCQkJZGJnKCIlcyAoJWQpIFRJT0NHSUNPVU5UIFJYPSVkLCBUWD0lZCIsIF9fZnVuY19fLCAgcG9ydC0+bnVtYmVyLCBpY291bnQucngsIGljb3VudC50eCApOwogCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpY291bnQsIHNpemVvZihpY291bnQpKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCXJldHVybiAwOwpAQCAtMTc1OCw3ICsxNzU4LDcgQEAKIAkJLyogZmx1c2ggYW5kIGNoYXNlICovCiAJCWVkZ2VfcG9ydC0+Y2hhc2VSZXNwb25zZVBlbmRpbmcgPSB0cnVlOwogCi0JCWRiZygiJXMgLSBTZW5kaW5nIElPU1BfQ01EX0NIQVNFX1BPUlQiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gU2VuZGluZyBJT1NQX0NNRF9DSEFTRV9QT1JUIiwgX19mdW5jX18pOwogCQlzdGF0dXMgPSBzZW5kX2lvc3BfZXh0X2NtZCAoZWRnZV9wb3J0LCBJT1NQX0NNRF9DSEFTRV9QT1JULCAwKTsKIAkJaWYgKHN0YXR1cyA9PSAwKSB7CiAJCQkvLyBibG9jayB1bnRpbCBjaGFzZSBmaW5pc2hlZApAQCAtMTc3MiwxNCArMTc3MiwxNCBAQAogCSAgICAoKGVkZ2Vfc2VyaWFsLT5pc19lcGljKSAmJgogCSAgICAgKGVkZ2Vfc2VyaWFsLT5lcGljX2Rlc2NyaXB0b3IuU3VwcG9ydHMuSU9TUFNldENsckJyZWFrKSkpIHsKIAkJaWYgKGJyZWFrX3N0YXRlID09IC0xKSB7Ci0JCQlkYmcoIiVzIC0gU2VuZGluZyBJT1NQX0NNRF9TRVRfQlJFQUsiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIFNlbmRpbmcgSU9TUF9DTURfU0VUX0JSRUFLIiwgX19mdW5jX18pOwogCQkJc3RhdHVzID0gc2VuZF9pb3NwX2V4dF9jbWQgKGVkZ2VfcG9ydCwgSU9TUF9DTURfU0VUX0JSRUFLLCAwKTsKIAkJfSBlbHNlIHsKLQkJCWRiZygiJXMgLSBTZW5kaW5nIElPU1BfQ01EX0NMRUFSX0JSRUFLIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBTZW5kaW5nIElPU1BfQ01EX0NMRUFSX0JSRUFLIiwgX19mdW5jX18pOwogCQkJc3RhdHVzID0gc2VuZF9pb3NwX2V4dF9jbWQgKGVkZ2VfcG9ydCwgSU9TUF9DTURfQ0xFQVJfQlJFQUssIDApOwogCQl9CiAJCWlmIChzdGF0dXMpIHsKLQkJCWRiZygiJXMgLSBlcnJvciBzZW5kaW5nIGJyZWFrIHNldC9jbGVhciBjb21tYW5kLiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gZXJyb3Igc2VuZGluZyBicmVhayBzZXQvY2xlYXIgY29tbWFuZC4iLCBfX2Z1bmNfXyk7CiAJCX0KIAl9CiAKQEAgLTE3OTksMTQgKzE3OTksMTQgQEAKIAlfX3UxNiBsYXN0QnVmZmVyTGVuZ3RoOwogCV9fdTE2IHJ4TGVuOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCWxhc3RCdWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGggKyAxOwogCiAJd2hpbGUgKGJ1ZmZlckxlbmd0aCA+IDApIHsKIAkJLyogZmFpbHNhZmUgaW5jYXNlIHdlIGdldCBhIG1lc3NhZ2UgdGhhdCB3ZSBkb24ndCB1bmRlcnN0YW5kICovCiAJCWlmIChsYXN0QnVmZmVyTGVuZ3RoID09IGJ1ZmZlckxlbmd0aCkgewotCQkJZGJnKCIlcyAtIHN0dWNrIGluIGxvb3AsIGV4aXRpbmcgaXQuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBzdHVjayBpbiBsb29wLCBleGl0aW5nIGl0LiIsIF9fZnVuY19fKTsKIAkJCWJyZWFrOwogCQl9CiAJCWxhc3RCdWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CkBAIC0xODI4LDcgKzE4MjgsNyBAQAogCQkJCSsrYnVmZmVyOwogCQkJCS0tYnVmZmVyTGVuZ3RoOwogCi0JCQkJZGJnKCIlcyAtIEhkcjE9JTAyWCBIZHIyPSUwMlgiLCBfX0ZVTkNUSU9OX18sIGVkZ2Vfc2VyaWFsLT5yeEhlYWRlcjEsIGVkZ2Vfc2VyaWFsLT5yeEhlYWRlcjIpOworCQkJCWRiZygiJXMgLSBIZHIxPSUwMlggSGRyMj0lMDJYIiwgX19mdW5jX18sIGVkZ2Vfc2VyaWFsLT5yeEhlYWRlcjEsIGVkZ2Vfc2VyaWFsLT5yeEhlYWRlcjIpOwogCiAJCQkJLy8gUHJvY2VzcyBkZXBlbmRpbmcgb24gd2hldGhlciB0aGlzIGhlYWRlciBpcwogCQkJCS8vIGRhdGEgb3Igc3RhdHVzCkBAIC0xODU4LDcgKzE4NTgsNyBAQAogCQkJCQllZGdlX3NlcmlhbC0+cnhQb3J0ID0gSU9TUF9HRVRfSERSX1BPUlQoZWRnZV9zZXJpYWwtPnJ4SGVhZGVyMSk7CiAJCQkJCWVkZ2Vfc2VyaWFsLT5yeEJ5dGVzUmVtYWluaW5nID0gSU9TUF9HRVRfSERSX0RBVEFfTEVOKGVkZ2Vfc2VyaWFsLT5yeEhlYWRlcjEsIGVkZ2Vfc2VyaWFsLT5yeEhlYWRlcjIpOwogCi0JCQkJCWRiZygiJXMgLSBEYXRhIGZvciBQb3J0ICV1IExlbiAldSIsIF9fRlVOQ1RJT05fXywgZWRnZV9zZXJpYWwtPnJ4UG9ydCwgZWRnZV9zZXJpYWwtPnJ4Qnl0ZXNSZW1haW5pbmcpOworCQkJCQlkYmcoIiVzIC0gRGF0YSBmb3IgUG9ydCAldSBMZW4gJXUiLCBfX2Z1bmNfXywgZWRnZV9zZXJpYWwtPnJ4UG9ydCwgZWRnZV9zZXJpYWwtPnJ4Qnl0ZXNSZW1haW5pbmcpOwogCiAJCQkJCS8vQVNTRVJUKCBEZXZFeHQtPlJ4UG9ydCA8IERldkV4dC0+TnVtUG9ydHMgKTsKIAkJCQkJLy9BU1NFUlQoIERldkV4dC0+UnhCeXRlc1JlbWFpbmluZyA8IElPU1BfTUFYX0RBVEFfTEVOR1RIICk7CkBAIC0xODkxLDcgKzE4OTEsNyBAQAogCQkJCQlpZiAoZWRnZV9wb3J0LT5vcGVuKSB7CiAJCQkJCQl0dHkgPSBlZGdlX3BvcnQtPnBvcnQtPnR0eTsKIAkJCQkJCWlmICh0dHkpIHsKLQkJCQkJCQlkYmcoIiVzIC0gU2VuZGluZyAlZCBieXRlcyB0byBUVFkgZm9yIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHJ4TGVuLCBlZGdlX3NlcmlhbC0+cnhQb3J0KTsKKwkJCQkJCQlkYmcoIiVzIC0gU2VuZGluZyAlZCBieXRlcyB0byBUVFkgZm9yIHBvcnQgJWQiLCBfX2Z1bmNfXywgcnhMZW4sIGVkZ2Vfc2VyaWFsLT5yeFBvcnQpOwogCQkJCQkJCWVkZ2VfdHR5X3JlY3YoJmVkZ2Vfc2VyaWFsLT5zZXJpYWwtPmRldi0+ZGV2LCB0dHksIGJ1ZmZlciwgcnhMZW4pOwogCQkJCQkJfQogCQkJCQkJZWRnZV9wb3J0LT5pY291bnQucnggKz0gcnhMZW47CkBAIC0xOTMwLDE3ICsxOTMwLDE3IEBACiAJcG9ydCA9IGVkZ2Vfc2VyaWFsLT5zZXJpYWwtPnBvcnRbZWRnZV9zZXJpYWwtPnJ4UG9ydF07CiAJZWRnZV9wb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWlmIChlZGdlX3BvcnQgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZlZGdlX3NlcmlhbC0+c2VyaWFsLT5kZXYtPmRldiwgIiVzIC0gZWRnZV9wb3J0ID09IE5VTEwgZm9yIHBvcnQgJWRcbiIsIF9fRlVOQ1RJT05fXywgZWRnZV9zZXJpYWwtPnJ4UG9ydCk7CisJCWRldl9lcnIoJmVkZ2Vfc2VyaWFsLT5zZXJpYWwtPmRldi0+ZGV2LCAiJXMgLSBlZGdlX3BvcnQgPT0gTlVMTCBmb3IgcG9ydCAlZFxuIiwgX19mdW5jX18sIGVkZ2Vfc2VyaWFsLT5yeFBvcnQpOwogCQlyZXR1cm47CiAJfQogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIGVkZ2Vfc2VyaWFsLT5yeFBvcnQpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIGVkZ2Vfc2VyaWFsLT5yeFBvcnQpOwogCiAJaWYgKGNvZGUgPT0gSU9TUF9FWFRfU1RBVFVTKSB7CiAJCXN3aXRjaCAoYnl0ZTIpIHsKIAkJCWNhc2UgSU9TUF9FWFRfU1RBVFVTX0NIQVNFX1JTUDoKIAkJCQkvLyB3ZSB3YW50IHRvIGRvIEVYVCBzdGF0dXMgcmVnYXJkbGVzcyBvZiBwb3J0IG9wZW4vY2xvc2VkIAotCQkJCWRiZygiJXMgLSBQb3J0ICV1IEVYVCBDSEFTRV9SU1AgRGF0YSA9ICUwMngiLCBfX0ZVTkNUSU9OX18sIGVkZ2Vfc2VyaWFsLT5yeFBvcnQsIGJ5dGUzICk7CisJCQkJZGJnKCIlcyAtIFBvcnQgJXUgRVhUIENIQVNFX1JTUCBEYXRhID0gJTAyeCIsIF9fZnVuY19fLCBlZGdlX3NlcmlhbC0+cnhQb3J0LCBieXRlMyApOwogCQkJCS8vIEN1cnJlbnRseSwgdGhlIG9ubHkgRVhUX1NUQVRVUyBpcyBDaGFzZSwgc28gcHJvY2VzcyBoZXJlIGluc3RlYWQgb2Ygb25lIG1vcmUgY2FsbAogCQkJCS8vIHRvIG9uZSBtb3JlIHN1YnJvdXRpbmUuIElmL3doZW4gbW9yZSBFWFRfU1RBVFVTLCB0aGVyZSdsbCBiZSBtb3JlIHdvcmsgdG8gZG8uCiAJCQkJLy8gQWxzbywgd2UgY3VycmVudGx5IGNsZWFyIGZsYWcgYW5kIGNsb3NlIHRoZSBwb3J0IHJlZ2FyZGxlc3Mgb2YgY29udGVudCBvZiBhYm92ZSdzIEJ5dGUzLgpAQCAtMTk1MSw3ICsxOTUxLDcgQEAKIAkJCQlyZXR1cm47CiAKIAkJCWNhc2UgSU9TUF9FWFRfU1RBVFVTX1JYX0NIRUNLX1JTUDoKLQkJCQlkYmcoIiVzID09PT09PT09PT0gUG9ydCAldSBDSEVDS19SU1AgU2VxdWVuY2UgPSAlMDJ4ID09PT09PT09PT09PT1cbiIsIF9fRlVOQ1RJT05fXywgZWRnZV9zZXJpYWwtPnJ4UG9ydCwgYnl0ZTMgKTsKKwkJCQlkYmcoIiVzID09PT09PT09PT0gUG9ydCAldSBDSEVDS19SU1AgU2VxdWVuY2UgPSAlMDJ4ID09PT09PT09PT09PT1cbiIsIF9fZnVuY19fLCBlZGdlX3NlcmlhbC0+cnhQb3J0LCBieXRlMyApOwogCQkJCS8vUG9ydC0+UnhDaGVja1JzcCA9IHRydWU7CiAJCQkJcmV0dXJuOwogCQl9CkBAIC0xOTYwLDcgKzE5NjAsNyBAQAogCWlmIChjb2RlID09IElPU1BfU1RBVFVTX09QRU5fUlNQKSB7CiAJCWVkZ2VfcG9ydC0+dHhDcmVkaXRzID0gR0VUX1RYX0JVRkZFUl9TSVpFKGJ5dGUzKTsKIAkJZWRnZV9wb3J0LT5tYXhUeENyZWRpdHMgPSBlZGdlX3BvcnQtPnR4Q3JlZGl0czsKLQkJZGJnKCIlcyAtIFBvcnQgJXUgT3BlbiBSZXNwb25zZSBJbml0YWwgTVNSID0gJTAyeCBUeEJ1ZmZlclNpemUgPSAlZCIsIF9fRlVOQ1RJT05fXywgZWRnZV9zZXJpYWwtPnJ4UG9ydCwgYnl0ZTIsIGVkZ2VfcG9ydC0+dHhDcmVkaXRzKTsKKwkJZGJnKCIlcyAtIFBvcnQgJXUgT3BlbiBSZXNwb25zZSBJbml0YWwgTVNSID0gJTAyeCBUeEJ1ZmZlclNpemUgPSAlZCIsIF9fZnVuY19fLCBlZGdlX3NlcmlhbC0+cnhQb3J0LCBieXRlMiwgZWRnZV9wb3J0LT50eENyZWRpdHMpOwogCQloYW5kbGVfbmV3X21zciAoZWRnZV9wb3J0LCBieXRlMik7CiAKIAkJLyogc2VuZCB0aGUgY3VycmVudCBsaW5lIHNldHRpbmdzIHRvIHRoZSBwb3J0IHNvIHdlIGFyZSBpbiBzeW5jIHdpdGggYW55IGZ1cnRoZXIgdGVybWlvcyBjYWxscyAqLwpAQCAtMTk4NCwyMyArMTk4NCwyMyBAQAogCXN3aXRjaCAoY29kZSkgewogCQkvLyBOb3QgY3VycmVudGx5IHNlbnQgYnkgRWRnZXBvcnQKIAkJY2FzZSBJT1NQX1NUQVRVU19MU1I6Ci0JCQlkYmcoIiVzIC0gUG9ydCAldSBMU1IgU3RhdHVzID0gJTAyeCIsIF9fRlVOQ1RJT05fXywgZWRnZV9zZXJpYWwtPnJ4UG9ydCwgYnl0ZTIpOworCQkJZGJnKCIlcyAtIFBvcnQgJXUgTFNSIFN0YXR1cyA9ICUwMngiLCBfX2Z1bmNfXywgZWRnZV9zZXJpYWwtPnJ4UG9ydCwgYnl0ZTIpOwogCQkJaGFuZGxlX25ld19sc3IoZWRnZV9wb3J0LCBmYWxzZSwgYnl0ZTIsIDApOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBJT1NQX1NUQVRVU19MU1JfREFUQToKLQkJCWRiZygiJXMgLSBQb3J0ICV1IExTUiBTdGF0dXMgPSAlMDJ4LCBEYXRhID0gJTAyeCIsIF9fRlVOQ1RJT05fXywgZWRnZV9zZXJpYWwtPnJ4UG9ydCwgYnl0ZTIsIGJ5dGUzKTsKKwkJCWRiZygiJXMgLSBQb3J0ICV1IExTUiBTdGF0dXMgPSAlMDJ4LCBEYXRhID0gJTAyeCIsIF9fZnVuY19fLCBlZGdlX3NlcmlhbC0+cnhQb3J0LCBieXRlMiwgYnl0ZTMpOwogCQkJLy8gYnl0ZTIgaXMgTFNSIFJlZ2lzdGVyCiAJCQkvLyBieXRlMyBpcyBicm9rZW4gZGF0YSBieXRlCiAJCQloYW5kbGVfbmV3X2xzcihlZGdlX3BvcnQsIHRydWUsIGJ5dGUyLCBieXRlMyk7CiAJCQlicmVhazsKIAkJCS8vCiAJCQkvLwljYXNlIElPU1BfRVhUXzRfU1RBVFVTOgotCQkJLy8JCWRiZygiJXMgLSBQb3J0ICV1IExTUiBTdGF0dXMgPSAlMDJ4IERhdGEgPSAlMDJ4IiwgX19GVU5DVElPTl9fLCBlZGdlX3NlcmlhbC0+cnhQb3J0LCBieXRlMiwgYnl0ZTMpOworCQkJLy8JCWRiZygiJXMgLSBQb3J0ICV1IExTUiBTdGF0dXMgPSAlMDJ4IERhdGEgPSAlMDJ4IiwgX19mdW5jX18sIGVkZ2Vfc2VyaWFsLT5yeFBvcnQsIGJ5dGUyLCBieXRlMyk7CiAJCQkvLwkJYnJlYWs7CiAJCQkvLwogCQljYXNlIElPU1BfU1RBVFVTX01TUjoKLQkJCWRiZygiJXMgLSBQb3J0ICV1IE1TUiBTdGF0dXMgPSAlMDJ4IiwgX19GVU5DVElPTl9fLCBlZGdlX3NlcmlhbC0+cnhQb3J0LCBieXRlMik7CisJCQlkYmcoIiVzIC0gUG9ydCAldSBNU1IgU3RhdHVzID0gJTAyeCIsIF9fZnVuY19fLCBlZGdlX3NlcmlhbC0+cnhQb3J0LCBieXRlMik7CiAKIAkJCS8vIFByb2Nlc3MgdGhpcyBuZXcgbW9kZW0gc3RhdHVzIGFuZCBnZW5lcmF0ZSBhcHByb3ByaWF0ZQogCQkJLy8gZXZlbnRzLCBldGMsIGJhc2VkIG9uIHRoZSBuZXcgc3RhdHVzLiBUaGlzIHJvdXRpbmUKQEAgLTIwMDksNyArMjAwOSw3IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJZGJnKCIlcyAtIFVucmVjb2duaXplZCBJT1NQIHN0YXR1cyBjb2RlICV1XG4iLCBfX0ZVTkNUSU9OX18sIGNvZGUpOworCQkJZGJnKCIlcyAtIFVucmVjb2duaXplZCBJT1NQIHN0YXR1cyBjb2RlICV1XG4iLCBfX2Z1bmNfXywgY29kZSk7CiAJCQlicmVhazsKIAl9CiAKQEAgLTIwMjksNyArMjAyOSw3IEBACiAJCWNudCA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgbGVuZ3RoKTsKIAkJaWYgKGNudCA8IGxlbmd0aCkgewogCQkJZGV2X2VycihkZXYsICIlcyAtIGRyb3BwaW5nIGRhdGEsICVkIGJ5dGVzIGxvc3RcbiIsCi0JCQkJCV9fRlVOQ1RJT05fXywgbGVuZ3RoIC0gY250KTsKKwkJCQkJX19mdW5jX18sIGxlbmd0aCAtIGNudCk7CiAJCQlpZihjbnQgPT0gMCkKIAkJCQlicmVhazsKIAkJfQpAQCAtMjA1MCw3ICsyMDUwLDcgQEAKIHsKIAlzdHJ1Y3QgIGFzeW5jX2ljb3VudCAqaWNvdW50OwogCi0JZGJnKCIlcyAlMDJ4IiwgX19GVU5DVElPTl9fLCBuZXdNc3IpOworCWRiZygiJXMgJTAyeCIsIF9fZnVuY19fLCBuZXdNc3IpOwogCiAJaWYgKG5ld01zciAmIChFREdFUE9SVF9NU1JfREVMVEFfQ1RTIHwgRURHRVBPUlRfTVNSX0RFTFRBX0RTUiB8IEVER0VQT1JUX01TUl9ERUxUQV9SSSB8IEVER0VQT1JUX01TUl9ERUxUQV9DRCkpIHsKIAkJaWNvdW50ID0gJmVkZ2VfcG9ydC0+aWNvdW50OwpAQCAtMjA4Nyw3ICsyMDg3LDcgQEAKIAlfX3U4ICAgIG5ld0xzciA9IChfX3U4KShsc3IgJiAoX191OCkoTFNSX09WRVJfRVJSIHwgTFNSX1BBUl9FUlIgfCBMU1JfRlJNX0VSUiB8IExTUl9CUkVBSykpOwogCXN0cnVjdCAgYXN5bmNfaWNvdW50ICppY291bnQ7CiAKLQlkYmcoIiVzIC0gJTAyeCIsIF9fRlVOQ1RJT05fXywgbmV3THNyKTsKKwlkYmcoIiVzIC0gJTAyeCIsIF9fZnVuY19fLCBuZXdMc3IpOwogCiAJZWRnZV9wb3J0LT5zaGFkb3dMU1IgPSBsc3I7CiAKQEAgLTIxMzYsMTEgKzIxMzYsMTEgQEAKIAlfX3UxNiBjdXJyZW50X2xlbmd0aDsKIAl1bnNpZ25lZCBjaGFyICp0cmFuc2Zlcl9idWZmZXI7CiAKLQlkYmcoIiVzIC0gJXgsICV4LCAlZCIsIF9fRlVOQ1RJT05fXywgZXh0QWRkciwgYWRkciwgbGVuZ3RoKTsKKwlkYmcoIiVzIC0gJXgsICV4LCAlZCIsIF9fZnVuY19fLCBleHRBZGRyLCBhZGRyLCBsZW5ndGgpOwogCiAJdHJhbnNmZXJfYnVmZmVyID0gIGttYWxsb2MgKDY0LCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRyYW5zZmVyX2J1ZmZlcikgewotCQlkZXZfZXJyKCZzZXJpYWwtPmRldi0+ZGV2LCAiJXMgLSBrbWFsbG9jKCVkKSBmYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18sIDY0KTsKKwkJZGV2X2Vycigmc2VyaWFsLT5kZXYtPmRldiwgIiVzIC0ga21hbGxvYyglZCkgZmFpbGVkLlxuIiwgX19mdW5jX18sIDY0KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0yMTUyLDcgKzIxNTIsNyBAQAogCQl9IGVsc2UgewogCQkJY3VycmVudF9sZW5ndGggPSBsZW5ndGg7CiAJCX0KLS8vCQlkYmcoIiVzIC0gd3JpdGluZyAleCwgJXgsICVkIiwgX19GVU5DVElPTl9fLCBleHRBZGRyLCBhZGRyLCBjdXJyZW50X2xlbmd0aCk7CisvLwkJZGJnKCIlcyAtIHdyaXRpbmcgJXgsICV4LCAlZCIsIF9fZnVuY19fLCBleHRBZGRyLCBhZGRyLCBjdXJyZW50X2xlbmd0aCk7CiAJCW1lbWNweSAodHJhbnNmZXJfYnVmZmVyLCBkYXRhLCBjdXJyZW50X2xlbmd0aCk7CiAJCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyAoc2VyaWFsLT5kZXYsIHVzYl9zbmRjdHJscGlwZShzZXJpYWwtPmRldiwgMCksIFVTQl9SRVFVRVNUX0lPTl9XUklURV9SQU0sIAogCQkJCQkgIDB4NDAsIGFkZHIsIGV4dEFkZHIsIHRyYW5zZmVyX2J1ZmZlciwgY3VycmVudF9sZW5ndGgsIDMwMCk7CkBAIC0yMTgxLDExICsyMTgxLDExIEBACiAJX191MTYgY3VycmVudF9sZW5ndGg7CiAJdW5zaWduZWQgY2hhciAqdHJhbnNmZXJfYnVmZmVyOwogCi0vLwlkYmcoIiVzIC0gJXgsICV4LCAlZCIsIF9fRlVOQ1RJT05fXywgZXh0QWRkciwgYWRkciwgbGVuZ3RoKTsKKy8vCWRiZygiJXMgLSAleCwgJXgsICVkIiwgX19mdW5jX18sIGV4dEFkZHIsIGFkZHIsIGxlbmd0aCk7CiAKIAl0cmFuc2Zlcl9idWZmZXIgPSAga21hbGxvYyAoNjQsIEdGUF9LRVJORUwpOwogCWlmICghdHJhbnNmZXJfYnVmZmVyKSB7Ci0JCWRldl9lcnIoJnNlcmlhbC0+ZGV2LT5kZXYsICIlcyAtIGttYWxsb2MoJWQpIGZhaWxlZC5cbiIsIF9fRlVOQ1RJT05fXywgNjQpOworCQlkZXZfZXJyKCZzZXJpYWwtPmRldi0+ZGV2LCAiJXMgLSBrbWFsbG9jKCVkKSBmYWlsZWQuXG4iLCBfX2Z1bmNfXywgNjQpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTIxOTcsNyArMjE5Nyw3IEBACiAJCX0gZWxzZSB7CiAJCQljdXJyZW50X2xlbmd0aCA9IGxlbmd0aDsKIAkJfQotLy8JCWRiZygiJXMgLSB3cml0aW5nICV4LCAleCwgJWQiLCBfX0ZVTkNUSU9OX18sIGV4dEFkZHIsIGFkZHIsIGN1cnJlbnRfbGVuZ3RoKTsKKy8vCQlkYmcoIiVzIC0gd3JpdGluZyAleCwgJXgsICVkIiwgX19mdW5jX18sIGV4dEFkZHIsIGFkZHIsIGN1cnJlbnRfbGVuZ3RoKTsKIAkJbWVtY3B5ICh0cmFuc2Zlcl9idWZmZXIsIGRhdGEsIGN1cnJlbnRfbGVuZ3RoKTsKIAkJcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnIChzZXJpYWwtPmRldiwgdXNiX3NuZGN0cmxwaXBlKHNlcmlhbC0+ZGV2LCAwKSwgVVNCX1JFUVVFU1RfSU9OX1dSSVRFX1JPTSwgCiAJCQkJCSAgMHg0MCwgYWRkciwgZXh0QWRkciwgdHJhbnNmZXJfYnVmZmVyLCBjdXJyZW50X2xlbmd0aCwgMzAwKTsKQEAgLTIyMjYsMTEgKzIyMjYsMTEgQEAKIAlfX3UxNiBjdXJyZW50X2xlbmd0aDsKIAl1bnNpZ25lZCBjaGFyICp0cmFuc2Zlcl9idWZmZXI7CiAKLQlkYmcoIiVzIC0gJXgsICV4LCAlZCIsIF9fRlVOQ1RJT05fXywgZXh0QWRkciwgYWRkciwgbGVuZ3RoKTsKKwlkYmcoIiVzIC0gJXgsICV4LCAlZCIsIF9fZnVuY19fLCBleHRBZGRyLCBhZGRyLCBsZW5ndGgpOwogCiAJdHJhbnNmZXJfYnVmZmVyID0gIGttYWxsb2MgKDY0LCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRyYW5zZmVyX2J1ZmZlcikgewotCQlkZXZfZXJyKCZzZXJpYWwtPmRldi0+ZGV2LCAiJXMgLSBrbWFsbG9jKCVkKSBmYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18sIDY0KTsKKwkJZGV2X2Vycigmc2VyaWFsLT5kZXYtPmRldiwgIiVzIC0ga21hbGxvYyglZCkgZmFpbGVkLlxuIiwgX19mdW5jX18sIDY0KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0yMjQyLDcgKzIyNDIsNyBAQAogCQl9IGVsc2UgewogCQkJY3VycmVudF9sZW5ndGggPSBsZW5ndGg7CiAJCX0KLS8vCQlkYmcoIiVzIC0gJXgsICV4LCAlZCIsIF9fRlVOQ1RJT05fXywgZXh0QWRkciwgYWRkciwgY3VycmVudF9sZW5ndGgpOworLy8JCWRiZygiJXMgLSAleCwgJXgsICVkIiwgX19mdW5jX18sIGV4dEFkZHIsIGFkZHIsIGN1cnJlbnRfbGVuZ3RoKTsKIAkJcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnIChzZXJpYWwtPmRldiwgdXNiX3JjdmN0cmxwaXBlKHNlcmlhbC0+ZGV2LCAwKSwgVVNCX1JFUVVFU1RfSU9OX1JFQURfUk9NLCAKIAkJCQkJICAweEMwLCBhZGRyLCBleHRBZGRyLCB0cmFuc2Zlcl9idWZmZXIsIGN1cnJlbnRfbGVuZ3RoLCAzMDApOwogCQlpZiAocmVzdWx0IDwgMCkKQEAgLTIyNjksMTEgKzIyNjksMTEgQEAKIAlpbnQgICAgICAgICAgICAgbGVuZ3RoID0gMDsKIAlpbnQgICAgICAgICAgICAgc3RhdHVzID0gMDsKIAotCWRiZygiJXMgLSAlZCwgJWQiLCBfX0ZVTkNUSU9OX18sIGNvbW1hbmQsIHBhcmFtKTsKKwlkYmcoIiVzIC0gJWQsICVkIiwgX19mdW5jX18sIGNvbW1hbmQsIHBhcmFtKTsKIAogCWJ1ZmZlciA9ICBrbWFsbG9jICgxMCwgR0ZQX0FUT01JQyk7CiAJaWYgKCFidWZmZXIpIHsKLQkJZGV2X2VycigmZWRnZV9wb3J0LT5wb3J0LT5kZXYsICIlcyAtIGttYWxsb2MoJWQpIGZhaWxlZC5cbiIsIF9fRlVOQ1RJT05fXywgMTApOworCQlkZXZfZXJyKCZlZGdlX3BvcnQtPnBvcnQtPmRldiwgIiVzIC0ga21hbGxvYyglZCkgZmFpbGVkLlxuIiwgX19mdW5jX18sIDEwKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0yMzA0LDcgKzIzMDQsNyBAQAogCXN0cnVjdCB1cmIgKnVyYjsKIAlpbnQgdGltZW91dDsKIAotCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJmVkZ2VfcG9ydC0+cG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIGxlbmd0aCwgYnVmZmVyKTsKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZlZGdlX3BvcnQtPnBvcnQtPmRldiwgX19mdW5jX18sIGxlbmd0aCwgYnVmZmVyKTsKIAogCS8qIEFsbG9jYXRlIG91ciBuZXh0IHVyYiAqLwogCXVyYiA9IHVzYl9hbGxvY191cmIgKDAsIEdGUF9BVE9NSUMpOwpAQCAtMjMxMiw3ICsyMzEyLDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlhdG9taWNfaW5jKCZDbWRVcmJzKTsKLQlkYmcoIiVzIC0gQUxMT0NBVEUgVVJCICVwIChvdXRzdGFuZGluZyAlZCkiLCBfX0ZVTkNUSU9OX18sIHVyYiwgYXRvbWljX3JlYWQoJkNtZFVyYnMpKTsKKwlkYmcoIiVzIC0gQUxMT0NBVEUgVVJCICVwIChvdXRzdGFuZGluZyAlZCkiLCBfX2Z1bmNfXywgdXJiLCBhdG9taWNfcmVhZCgmQ21kVXJicykpOwogCiAJdXNiX2ZpbGxfYnVsa191cmIgKHVyYiwgZWRnZV9zZXJpYWwtPnNlcmlhbC0+ZGV2LCAKIAkJICAgICAgIHVzYl9zbmRidWxrcGlwZShlZGdlX3NlcmlhbC0+c2VyaWFsLT5kZXYsIGVkZ2Vfc2VyaWFsLT5idWxrX291dF9lbmRwb2ludCksCkBAIC0yMzIzLDcgKzIzMjMsNyBAQAogCiAJaWYgKHN0YXR1cykgewogCQkvKiBzb21ldGhpbmcgd2VudCB3cm9uZyAqLwotCQlkZXZfZXJyKCZlZGdlX3BvcnQtPnBvcnQtPmRldiwgIiVzIC0gdXNiX3N1Ym1pdF91cmIod3JpdGUgY29tbWFuZCkgZmFpbGVkLCBzdGF0dXMgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkZXZfZXJyKCZlZGdlX3BvcnQtPnBvcnQtPmRldiwgIiVzIC0gdXNiX3N1Ym1pdF91cmIod3JpdGUgY29tbWFuZCkgZmFpbGVkLCBzdGF0dXMgPSAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCXVzYl9raWxsX3VyYih1cmIpOwogCQl1c2JfZnJlZV91cmIodXJiKTsKIAkJYXRvbWljX2RlYygmQ21kVXJicyk7CkBAIC0yMzM3LDcgKzIzMzcsNyBAQAogCiAJaWYgKGVkZ2VfcG9ydC0+Y29tbWFuZFBlbmRpbmcpIHsKIAkJLyogY29tbWFuZCB0aW1lZCBvdXQgKi8KLQkJZGJnKCIlcyAtIGNvbW1hbmQgdGltZWQgb3V0IiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIGNvbW1hbmQgdGltZWQgb3V0IiwgX19mdW5jX18pOwogCQlzdGF0dXMgPSAtRUlOVkFMOwogCX0KICNlbmRpZgpAQCAtMjM2NywxOCArMjM2NywxOCBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlkYmcoIiVzIC0gcG9ydCA9ICVkLCBiYXVkID0gJWQiLCBfX0ZVTkNUSU9OX18sIGVkZ2VfcG9ydC0+cG9ydC0+bnVtYmVyLCBiYXVkUmF0ZSk7CisJZGJnKCIlcyAtIHBvcnQgPSAlZCwgYmF1ZCA9ICVkIiwgX19mdW5jX18sIGVkZ2VfcG9ydC0+cG9ydC0+bnVtYmVyLCBiYXVkUmF0ZSk7CiAKIAlzdGF0dXMgPSBjYWxjX2JhdWRfcmF0ZV9kaXZpc29yIChiYXVkUmF0ZSwgJmRpdmlzb3IpOwogCWlmIChzdGF0dXMpIHsKLQkJZGV2X2VycigmZWRnZV9wb3J0LT5wb3J0LT5kZXYsICIlcyAtIGJhZCBiYXVkIHJhdGVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRldl9lcnIoJmVkZ2VfcG9ydC0+cG9ydC0+ZGV2LCAiJXMgLSBiYWQgYmF1ZCByYXRlXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCiAJLy8gQWxsb2MgbWVtb3J5IGZvciB0aGUgc3RyaW5nIG9mIGNvbW1hbmRzLgogCWNtZEJ1ZmZlciA9ICBrbWFsbG9jICgweDEwMCwgR0ZQX0FUT01JQyk7CiAJaWYgKCFjbWRCdWZmZXIpIHsKLQkJZGV2X2VycigmZWRnZV9wb3J0LT5wb3J0LT5kZXYsICIlcyAtIGttYWxsb2MoJWQpIGZhaWxlZC5cbiIsIF9fRlVOQ1RJT05fXywgMHgxMDApOworCQlkZXZfZXJyKCZlZGdlX3BvcnQtPnBvcnQtPmRldiwgIiVzIC0ga21hbGxvYyglZCkgZmFpbGVkLlxuIiwgX19mdW5jX18sIDB4MTAwKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWN1cnJDbWQgPSBjbWRCdWZmZXI7CkBAIC0yNDE0LDcgKzI0MTQsNyBAQAogCV9fdTE2IGN1c3RvbTsKIAogCi0JZGJnKCIlcyAtICVkIiwgX19GVU5DVElPTl9fLCBiYXVkcmF0ZSk7CisJZGJnKCIlcyAtICVkIiwgX19mdW5jX18sIGJhdWRyYXRlKTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRpdmlzb3JfdGFibGUpOyBpKyspIHsKIAkJaWYgKCBkaXZpc29yX3RhYmxlW2ldLkJhdWRSYXRlID09IGJhdWRyYXRlICkgewpAQCAtMjQzMiw3ICsyNDMyLDcgQEAKIAogCQkqZGl2aXNvciA9IGN1c3RvbTsKIAotCQlkYmcoIiVzIC0gQmF1ZCAlZCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGJhdWRyYXRlLCBjdXN0b20pOworCQlkYmcoIiVzIC0gQmF1ZCAlZCA9ICVkXG4iLCBfX2Z1bmNfXywgYmF1ZHJhdGUsIGN1c3RvbSk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMjQ1Miw3ICsyNDUyLDcgQEAKIAl1bnNpZ25lZCBsb25nIGNtZExlbiA9IDA7CiAJaW50IHN0YXR1czsKIAotCWRiZygiJXMgLSB3cml0ZSB0byAlcyByZWdpc3RlciAweCUwMngiLCAocmVnTnVtID09IE1DUikgPyAiTUNSIiA6ICJMQ1IiLCBfX0ZVTkNUSU9OX18sIHJlZ1ZhbHVlKTsKKwlkYmcoIiVzIC0gd3JpdGUgdG8gJXMgcmVnaXN0ZXIgMHglMDJ4IiwgKHJlZ051bSA9PSBNQ1IpID8gIk1DUiIgOiAiTENSIiwgX19mdW5jX18sIHJlZ1ZhbHVlKTsKIAogCWlmIChlZGdlX3NlcmlhbC0+aXNfZXBpYyAmJgogCSAgICAhZWRnZV9zZXJpYWwtPmVwaWNfZGVzY3JpcHRvci5TdXBwb3J0cy5JT1NQV3JpdGVNQ1IgJiYKQEAgLTI1MTMsMjkgKzI1MTMsMjkgQEAKIAlfX3U4IHR4RmxvdzsKIAlpbnQgc3RhdHVzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIGVkZ2VfcG9ydC0+cG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBlZGdlX3BvcnQtPnBvcnQtPm51bWJlcik7CiAKIAlpZiAoIWVkZ2VfcG9ydC0+b3BlbiAmJgogCSAgICAhZWRnZV9wb3J0LT5vcGVuUGVuZGluZykgewotCQlkYmcoIiVzIC0gcG9ydCBub3Qgb3BlbmVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAogCXR0eSA9IGVkZ2VfcG9ydC0+cG9ydC0+dHR5OwogCWlmICgoIXR0eSkgfHwKIAkgICAgKCF0dHktPnRlcm1pb3MpKSB7Ci0JCWRiZygiJXMgLSBubyB0dHkgc3RydWN0dXJlcyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBubyB0dHkgc3RydWN0dXJlcyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAogCWNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOwogCiAJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7Ci0JCWNhc2UgQ1M1OiAgIGxEYXRhID0gTENSX0JJVFNfNTsgbWFzayA9IDB4MWY7ICAgIGRiZygiJXMgLSBkYXRhIGJpdHMgPSA1IiwgX19GVU5DVElPTl9fKTsgICBicmVhazsKLQkJY2FzZSBDUzY6ICAgbERhdGEgPSBMQ1JfQklUU182OyBtYXNrID0gMHgzZjsgICAgZGJnKCIlcyAtIGRhdGEgYml0cyA9IDYiLCBfX0ZVTkNUSU9OX18pOyAgIGJyZWFrOwotCQljYXNlIENTNzogICBsRGF0YSA9IExDUl9CSVRTXzc7IG1hc2sgPSAweDdmOyAgICBkYmcoIiVzIC0gZGF0YSBiaXRzID0gNyIsIF9fRlVOQ1RJT05fXyk7ICAgYnJlYWs7CisJCWNhc2UgQ1M1OiAgIGxEYXRhID0gTENSX0JJVFNfNTsgbWFzayA9IDB4MWY7ICAgIGRiZygiJXMgLSBkYXRhIGJpdHMgPSA1IiwgX19mdW5jX18pOyAgIGJyZWFrOworCQljYXNlIENTNjogICBsRGF0YSA9IExDUl9CSVRTXzY7IG1hc2sgPSAweDNmOyAgICBkYmcoIiVzIC0gZGF0YSBiaXRzID0gNiIsIF9fZnVuY19fKTsgICBicmVhazsKKwkJY2FzZSBDUzc6ICAgbERhdGEgPSBMQ1JfQklUU183OyBtYXNrID0gMHg3ZjsgICAgZGJnKCIlcyAtIGRhdGEgYml0cyA9IDciLCBfX2Z1bmNfXyk7ICAgYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCWNhc2UgQ1M4OiAgIGxEYXRhID0gTENSX0JJVFNfODsgICAgICAgICAgICAgICAgIGRiZygiJXMgLSBkYXRhIGJpdHMgPSA4IiwgX19GVU5DVElPTl9fKTsgICBicmVhazsKKwkJY2FzZSBDUzg6ICAgbERhdGEgPSBMQ1JfQklUU184OyAgICAgICAgICAgICAgICAgZGJnKCIlcyAtIGRhdGEgYml0cyA9IDgiLCBfX2Z1bmNfXyk7ICAgYnJlYWs7CiAJfQogCiAJbFBhcml0eSA9IExDUl9QQVJfTk9ORTsKQEAgLTI1NDMsMjggKzI1NDMsMjggQEAKIAkJaWYgKGNmbGFnICYgQ01TUEFSKSB7CiAJCQlpZiAoY2ZsYWcgJiBQQVJPREQpIHsKIAkJCQlsUGFyaXR5ID0gTENSX1BBUl9NQVJLOwotCQkJCWRiZygiJXMgLSBwYXJpdHkgPSBtYXJrIiwgX19GVU5DVElPTl9fKTsKKwkJCQlkYmcoIiVzIC0gcGFyaXR5ID0gbWFyayIsIF9fZnVuY19fKTsKIAkJCX0gZWxzZSB7CiAJCQkJbFBhcml0eSA9IExDUl9QQVJfU1BBQ0U7Ci0JCQkJZGJnKCIlcyAtIHBhcml0eSA9IHNwYWNlIiwgX19GVU5DVElPTl9fKTsKKwkJCQlkYmcoIiVzIC0gcGFyaXR5ID0gc3BhY2UiLCBfX2Z1bmNfXyk7CiAJCQl9CiAJCX0gZWxzZSBpZiAoY2ZsYWcgJiBQQVJPREQpIHsKIAkJCWxQYXJpdHkgPSBMQ1JfUEFSX09ERDsKLQkJCWRiZygiJXMgLSBwYXJpdHkgPSBvZGQiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHBhcml0eSA9IG9kZCIsIF9fZnVuY19fKTsKIAkJfSBlbHNlIHsKIAkJCWxQYXJpdHkgPSBMQ1JfUEFSX0VWRU47Ci0JCQlkYmcoIiVzIC0gcGFyaXR5ID0gZXZlbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gcGFyaXR5ID0gZXZlbiIsIF9fZnVuY19fKTsKIAkJfQogCX0gZWxzZSB7Ci0JCWRiZygiJXMgLSBwYXJpdHkgPSBub25lIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHBhcml0eSA9IG5vbmUiLCBfX2Z1bmNfXyk7CiAJfQogCiAJaWYgKGNmbGFnICYgQ1NUT1BCKSB7CiAJCWxTdG9wID0gTENSX1NUT1BfMjsKLQkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDIiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gc3RvcCBiaXRzID0gMiIsIF9fZnVuY19fKTsKIAl9IGVsc2UgewogCQlsU3RvcCA9IExDUl9TVE9QXzE7Ci0JCWRiZygiJXMgLSBzdG9wIGJpdHMgPSAxIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDEiLCBfX2Z1bmNfXyk7CiAJfQogCiAJLyogZmlndXJlIG91dCB0aGUgZmxvdyBjb250cm9sIHNldHRpbmdzICovCkBAIC0yNTcyLDkgKzI1NzIsOSBAQAogCWlmIChjZmxhZyAmIENSVFNDVFMpIHsKIAkJcnhGbG93IHw9IElPU1BfUlhfRkxPV19SVFM7CiAJCXR4RmxvdyB8PSBJT1NQX1RYX0ZMT1dfQ1RTOwotCQlkYmcoIiVzIC0gUlRTL0NUUyBpcyBlbmFibGVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIFJUUy9DVFMgaXMgZW5hYmxlZCIsIF9fZnVuY19fKTsKIAl9IGVsc2UgewotCQlkYmcoIiVzIC0gUlRTL0NUUyBpcyBkaXNhYmxlZCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBSVFMvQ1RTIGlzIGRpc2FibGVkIiwgX19mdW5jX18pOwogCX0KIAogCS8qIGlmIHdlIGFyZSBpbXBsZW1lbnRpbmcgWE9OL1hPRkYsIHNldCB0aGUgc3RhcnQgYW5kIHN0b3AgY2hhcmFjdGVyIGluIHRoZSBkZXZpY2UgKi8KQEAgLTI1OTIsMTcgKzI1OTIsMTcgQEAKIAkJLyogaWYgd2UgYXJlIGltcGxlbWVudGluZyBJTkJPVU5EIFhPTi9YT0ZGICovCiAJCWlmIChJX0lYT0ZGKHR0eSkpIHsKIAkJCXJ4RmxvdyB8PSBJT1NQX1JYX0ZMT1dfWE9OX1hPRkY7Ci0JCQlkYmcoIiVzIC0gSU5CT1VORCBYT04vWE9GRiBpcyBlbmFibGVkLCBYT04gPSAlMngsIFhPRkYgPSAlMngiLCBfX0ZVTkNUSU9OX18sIHN0YXJ0X2NoYXIsIHN0b3BfY2hhcik7CisJCQlkYmcoIiVzIC0gSU5CT1VORCBYT04vWE9GRiBpcyBlbmFibGVkLCBYT04gPSAlMngsIFhPRkYgPSAlMngiLCBfX2Z1bmNfXywgc3RhcnRfY2hhciwgc3RvcF9jaGFyKTsKIAkJfSBlbHNlIHsKLQkJCWRiZygiJXMgLSBJTkJPVU5EIFhPTi9YT0ZGIGlzIGRpc2FibGVkIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBJTkJPVU5EIFhPTi9YT0ZGIGlzIGRpc2FibGVkIiwgX19mdW5jX18pOwogCQl9CiAKIAkJLyogaWYgd2UgYXJlIGltcGxlbWVudGluZyBPVVRCT1VORCBYT04vWE9GRiAqLwogCQlpZiAoSV9JWE9OKHR0eSkpIHsKIAkJCXR4RmxvdyB8PSBJT1NQX1RYX0ZMT1dfWE9OX1hPRkY7Ci0JCQlkYmcoIiVzIC0gT1VUQk9VTkQgWE9OL1hPRkYgaXMgZW5hYmxlZCwgWE9OID0gJTJ4LCBYT0ZGID0gJTJ4IiwgX19GVU5DVElPTl9fLCBzdGFydF9jaGFyLCBzdG9wX2NoYXIpOworCQkJZGJnKCIlcyAtIE9VVEJPVU5EIFhPTi9YT0ZGIGlzIGVuYWJsZWQsIFhPTiA9ICUyeCwgWE9GRiA9ICUyeCIsIF9fZnVuY19fLCBzdGFydF9jaGFyLCBzdG9wX2NoYXIpOwogCQl9IGVsc2UgewotCQkJZGJnKCIlcyAtIE9VVEJPVU5EIFhPTi9YT0ZGIGlzIGRpc2FibGVkIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBPVVRCT1VORCBYT04vWE9GRiBpcyBkaXNhYmxlZCIsIF9fZnVuY19fKTsKIAkJfQogCX0KIApAQCAtMjY0NSw3ICsyNjQ1LDcgQEAKIAkJYmF1ZCA9IDk2MDA7CiAJfQogCi0JZGJnKCIlcyAtIGJhdWQgcmF0ZSA9ICVkIiwgX19GVU5DVElPTl9fLCBiYXVkKTsKKwlkYmcoIiVzIC0gYmF1ZCByYXRlID0gJWQiLCBfX2Z1bmNfXywgYmF1ZCk7CiAJc3RhdHVzID0gc2VuZF9jbWRfd3JpdGVfYmF1ZF9yYXRlIChlZGdlX3BvcnQsIGJhdWQpOwogCWlmIChzdGF0dXMgPT0gLTEpIHsKIAkJLyogU3BlZWQgY2hhbmdlIHdhcyBub3QgcG9zc2libGUgLSBwdXQgYmFjayB0aGUgb2xkIHNwZWVkICovCkBAIC0yODQzLDcgKzI4NDMsNyBAQAogCS8qIGNyZWF0ZSBvdXIgcHJpdmF0ZSBzZXJpYWwgc3RydWN0dXJlICovCiAJZWRnZV9zZXJpYWwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZWRnZXBvcnRfc2VyaWFsKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGVkZ2Vfc2VyaWFsID09IE5VTEwpIHsKLQkJZGV2X2Vycigmc2VyaWFsLT5kZXYtPmRldiwgIiVzIC0gT3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2Vycigmc2VyaWFsLT5kZXYtPmRldiwgIiVzIC0gT3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJc3Bpbl9sb2NrX2luaXQoJmVkZ2Vfc2VyaWFsLT5lc19sb2NrKTsKQEAgLTI4ODUsMTkgKzI4ODUsMTkgQEAKIAkJCSBzZXJpYWwtPm51bV9wb3J0cyk7CiAJfQogCi0JZGJnKCIlcyAtIHRpbWUgMSAlbGQiLCBfX0ZVTkNUSU9OX18sIGppZmZpZXMpOworCWRiZygiJXMgLSB0aW1lIDEgJWxkIiwgX19mdW5jX18sIGppZmZpZXMpOwogCiAJLyogSWYgbm90IGFuIEVQaUMgZGV2aWNlICovCiAJaWYgKCFlZGdlX3NlcmlhbC0+aXNfZXBpYykgewogCQkvKiBub3cgbG9hZCB0aGUgYXBwbGljYXRpb24gZmlybXdhcmUgaW50byB0aGlzIGRldmljZSAqLwogCQlsb2FkX2FwcGxpY2F0aW9uX2Zpcm13YXJlIChlZGdlX3NlcmlhbCk7CiAKLQkJZGJnKCIlcyAtIHRpbWUgMiAlbGQiLCBfX0ZVTkNUSU9OX18sIGppZmZpZXMpOworCQlkYmcoIiVzIC0gdGltZSAyICVsZCIsIF9fZnVuY19fLCBqaWZmaWVzKTsKIAogCQkvKiBDaGVjayBjdXJyZW50IEVkZ2Vwb3J0IEVFUFJPTSBhbmQgdXBkYXRlIGlmIG5lY2Vzc2FyeSAqLwogCQl1cGRhdGVfZWRnZXBvcnRfRTJQUk9NIChlZGdlX3NlcmlhbCk7CiAKLQkJZGJnKCIlcyAtIHRpbWUgMyAlbGQiLCBfX0ZVTkNUSU9OX18sIGppZmZpZXMpOworCQlkYmcoIiVzIC0gdGltZSAzICVsZCIsIF9fZnVuY19fLCBqaWZmaWVzKTsKIAogCQkvKiBzZXQgdGhlIGNvbmZpZ3VyYXRpb24gdG8gdXNlICMxICovCiAvLwkJZGJnKCJzZXRfY29uZmlndXJhdGlvbiAxIik7CkBAIC0yOTExLDcgKzI5MTEsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgKytpKSB7CiAJCWVkZ2VfcG9ydCA9IGttYWxsb2MgKHNpemVvZihzdHJ1Y3QgZWRnZXBvcnRfcG9ydCksIEdGUF9LRVJORUwpOwogCQlpZiAoZWRnZV9wb3J0ID09IE5VTEwpIHsKLQkJCWRldl9lcnIoJnNlcmlhbC0+ZGV2LT5kZXYsICIlcyAtIE91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkZXZfZXJyKCZzZXJpYWwtPmRldi0+ZGV2LCAiJXMgLSBPdXQgb2YgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CiAJCQlmb3IgKGogPSAwOyBqIDwgaTsgKytqKSB7CiAJCQkJa2ZyZWUgKHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbal0pKTsKIAkJCQl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0W2pdLCAgTlVMTCk7CkBAIC0zMDE3LDcgKzMwMTcsNyBAQAogCQkgKiBjb250aW51ZSBhcyBsb25nIGFzIHRoZSBlZGdlcG9ydCBpcyBjb25uZWN0ZWQgKi8KIAkJcmVzcG9uc2UgPSB1c2Jfc3VibWl0X3VyYihlZGdlX3NlcmlhbC0+aW50ZXJydXB0X3JlYWRfdXJiLCBHRlBfS0VSTkVMKTsKIAkJaWYgKHJlc3BvbnNlKQotCQkJZXJyKCIlcyAtIEVycm9yICVkIHN1Ym1pdHRpbmcgY29udHJvbCB1cmIiLCBfX0ZVTkNUSU9OX18sIHJlc3BvbnNlKTsKKwkJCWVycigiJXMgLSBFcnJvciAlZCBzdWJtaXR0aW5nIGNvbnRyb2wgdXJiIiwgX19mdW5jX18sIHJlc3BvbnNlKTsKIAl9CiAJcmV0dXJuIHJlc3BvbnNlOwogfQpAQCAtMzAzMiw3ICszMDMyLDcgQEAKIAlzdHJ1Y3QgZWRnZXBvcnRfc2VyaWFsICplZGdlX3NlcmlhbCA9IHVzYl9nZXRfc2VyaWFsX2RhdGEoc2VyaWFsKTsKIAlpbnQgaTsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAkvKiBzdG9wIHJlYWRzIGFuZCB3cml0ZXMgb24gYWxsIHBvcnRzICovCiAJZm9yIChpPTA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgKytpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvaW9fdGFibGVzLmggYi9kcml2ZXJzL3VzYi9zZXJpYWwvaW9fdGFibGVzLmgKaW5kZXggNmQzMDA4Ny4uMmVjODU4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2lvX3RhYmxlcy5oCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pb190YWJsZXMuaApAQCAtMTExLDkgKzExMSw2IEBACiAJLmRlc2NyaXB0aW9uCQk9ICJFZGdlcG9ydCAyIHBvcnQgYWRhcHRlciIsCiAJLnVzYl9kcml2ZXIJCT0gJmlvX2RyaXZlciwKIAkuaWRfdGFibGUJCT0gZWRnZXBvcnRfMnBvcnRfaWRfdGFibGUsCi0JLm51bV9pbnRlcnJ1cHRfaW4JPSAxLAotCS5udW1fYnVsa19pbgkJPSAxLAotCS5udW1fYnVsa19vdXQJCT0gMSwKIAkubnVtX3BvcnRzCQk9IDIsCiAJLm9wZW4JCQk9IGVkZ2Vfb3BlbiwKIAkuY2xvc2UJCQk9IGVkZ2VfY2xvc2UsCkBAIC0xNDIsOSArMTM5LDYgQEAKIAkuZGVzY3JpcHRpb24JCT0gIkVkZ2Vwb3J0IDQgcG9ydCBhZGFwdGVyIiwKIAkudXNiX2RyaXZlcgkJPSAmaW9fZHJpdmVyLAogCS5pZF90YWJsZQkJPSBlZGdlcG9ydF80cG9ydF9pZF90YWJsZSwKLQkubnVtX2ludGVycnVwdF9pbgk9IDEsCi0JLm51bV9idWxrX2luCQk9IDEsCi0JLm51bV9idWxrX291dAkJPSAxLAogCS5udW1fcG9ydHMJCT0gNCwKIAkub3BlbgkJCT0gZWRnZV9vcGVuLAogCS5jbG9zZQkJCT0gZWRnZV9jbG9zZSwKQEAgLTE3Myw5ICsxNjcsNiBAQAogCS5kZXNjcmlwdGlvbgkJPSAiRWRnZXBvcnQgOCBwb3J0IGFkYXB0ZXIiLAogCS51c2JfZHJpdmVyCQk9ICZpb19kcml2ZXIsCiAJLmlkX3RhYmxlCQk9IGVkZ2Vwb3J0Xzhwb3J0X2lkX3RhYmxlLAotCS5udW1faW50ZXJydXB0X2luCT0gMSwKLQkubnVtX2J1bGtfaW4JCT0gMSwKLQkubnVtX2J1bGtfb3V0CQk9IDEsCiAJLm51bV9wb3J0cwkJPSA4LAogCS5vcGVuCQkJPSBlZGdlX29wZW4sCiAJLmNsb3NlCQkJPSBlZGdlX2Nsb3NlLApAQCAtMjAzLDkgKzE5NCw2IEBACiAJfSwKIAkuZGVzY3JpcHRpb24JCT0gIkVQaUMgZGV2aWNlIiwKIAkuaWRfdGFibGUJCT0gRXBpY19wb3J0X2lkX3RhYmxlLAotCS5udW1faW50ZXJydXB0X2luCT0gMSwKLQkubnVtX2J1bGtfaW4JCT0gMSwKLQkubnVtX2J1bGtfb3V0CQk9IDEsCiAJLm51bV9wb3J0cwkJPSAxLAogCS5vcGVuCQkJPSBlZGdlX29wZW4sCiAJLmNsb3NlCQkJPSBlZGdlX2Nsb3NlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2lvX3RpLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaW9fdGkuYwppbmRleCBlNWVhNWVmLi4wNWU0ZmE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvaW9fdGkuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaW9fdGkuYwpAQCAtMjkwLDcgKzI5MCw3IEBACiAJCXJldHVybiBzdGF0dXM7CiAJaWYgKHN0YXR1cyAhPSBzaXplKSB7CiAJCWRiZyAoIiVzIC0gd2FudGVkIHRvIHdyaXRlICVkLCBidXQgb25seSB3cm90ZSAlZCIsCi0JCSAgICAgX19GVU5DVElPTl9fLCBzaXplLCBzdGF0dXMpOworCQkgICAgIF9fZnVuY19fLCBzaXplLCBzdGF0dXMpOwogCQlyZXR1cm4gLUVDT01NOwogCX0KIAlyZXR1cm4gMDsKQEAgLTMyMCw3ICszMjAsNyBAQAogCQlyZXR1cm4gc3RhdHVzOwogCWlmIChzdGF0dXMgIT0gc2l6ZSkgewogCQlkYmcgKCIlcyAtIHdhbnRlZCB0byB3cml0ZSAlZCwgYnV0IG9ubHkgd3JvdGUgJWQiLAotCQkgICAgIF9fRlVOQ1RJT05fXywgc2l6ZSwgc3RhdHVzKTsKKwkJICAgICBfX2Z1bmNfXywgc2l6ZSwgc3RhdHVzKTsKIAkJcmV0dXJuIC1FQ09NTTsKIAl9CiAJcmV0dXJuIDA7CkBAIC0zNDQsNyArMzQ0LDcgQEAKIHsKIAlpbnQgcG9ydF9udW1iZXIgPSBwb3J0LT5udW1iZXIgLSBwb3J0LT5zZXJpYWwtPm1pbm9yOwogCi0JZGJnICgiJXMgLSBwb3J0ICVkLCBtYXNrICV4IiwgX19GVU5DVElPTl9fLCBwb3J0X251bWJlciwgbWFzayk7CisJZGJnICgiJXMgLSBwb3J0ICVkLCBtYXNrICV4IiwgX19mdW5jX18sIHBvcnRfbnVtYmVyLCBtYXNrKTsKIAogCXJldHVybiBUSVdyaXRlQ29tbWFuZFN5bmMgKHBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJCQlVTVBDX1BVUkdFX1BPUlQsCkBAIC0zNjksNyArMzY5LDcgQEAKIAlfX3U4IHJlYWRfbGVuZ3RoOwogCV9fYmUxNiBiZV9zdGFydF9hZGRyZXNzOwogCQotCWRiZyAoIiVzIC0gQCAleCBmb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXJ0X2FkZHJlc3MsIGxlbmd0aCk7CisJZGJnICgiJXMgLSBAICV4IGZvciAlZCIsIF9fZnVuY19fLCBzdGFydF9hZGRyZXNzLCBsZW5ndGgpOwogCiAJLyogUmVhZCBpbiBibG9ja3Mgb2YgNjQgYnl0ZXMKIAkgKiAoVEkgZmlybXdhcmUgY2FuJ3QgaGFuZGxlIG1vcmUgdGhhbiA2NCBieXRlIHJlYWRzKQpAQCAtMzgxLDcgKzM4MSw3IEBACiAJCQlyZWFkX2xlbmd0aCA9IChfX3U4KWxlbmd0aDsKIAogCQlpZiAocmVhZF9sZW5ndGggPiAxKSB7Ci0JCQlkYmcgKCIlcyAtIEAgJXggZm9yICVkIiwgX19GVU5DVElPTl9fLCAKKwkJCWRiZyAoIiVzIC0gQCAleCBmb3IgJWQiLCBfX2Z1bmNfXywKIAkJCSAgICAgc3RhcnRfYWRkcmVzcywgcmVhZF9sZW5ndGgpOwogCQl9CiAJCWJlX3N0YXJ0X2FkZHJlc3MgPSBjcHVfdG9fYmUxNiAoc3RhcnRfYWRkcmVzcyk7CkBAIC0zOTMsMTIgKzM5MywxMiBAQAogCQkJCQkJICByZWFkX2xlbmd0aCk7CS8vIFRyYW5zZmVyQnVmZmVyTGVuZ3RoCiAKIAkJaWYgKHN0YXR1cykgewotCQkJZGJnICgiJXMgLSBFUlJPUiAleCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCWRiZyAoIiVzIC0gRVJST1IgJXgiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJCXJldHVybiBzdGF0dXM7CiAJCX0KIAogCQlpZiAocmVhZF9sZW5ndGggPiAxKSB7Ci0JCQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZkZXYtPmRldiwgX19GVU5DVElPTl9fLAorCQkJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmZGV2LT5kZXYsIF9fZnVuY19fLAogCQkJCQkgICAgICByZWFkX2xlbmd0aCwgYnVmZmVyKTsKIAkJfQogCkBAIC00MzQsMTMgKzQzNCwxMyBAQAogCQkJCQkmYnVmZmVyW2ldLAkJCS8vIFRyYW5zZmVyQnVmZmVyCiAJCQkJCTB4MDEpOwkJCQkvLyBUcmFuc2ZlckJ1ZmZlckxlbmd0aAogCQlpZiAoc3RhdHVzKSB7Ci0JCQlkYmcgKCIlcyAtIEVSUk9SICV4IiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJZGJnICgiJXMgLSBFUlJPUiAleCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQkJcmV0dXJuIHN0YXR1czsKIAkJfQogCX0KIAotCWRiZyAoIiVzIC0gc3RhcnRfYWRkcmVzcyA9ICV4LCBsZW5ndGggPSAlZCIsIF9fRlVOQ1RJT05fXywgc3RhcnRfYWRkcmVzcywgbGVuZ3RoKTsKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZzZXJpYWwtPnNlcmlhbC0+ZGV2LT5kZXYsIF9fRlVOQ1RJT05fXywgbGVuZ3RoLCBidWZmZXIpOworCWRiZyAoIiVzIC0gc3RhcnRfYWRkcmVzcyA9ICV4LCBsZW5ndGggPSAlZCIsIF9fZnVuY19fLCBzdGFydF9hZGRyZXNzLCBsZW5ndGgpOworCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnNlcmlhbC0+c2VyaWFsLT5kZXYtPmRldiwgX19mdW5jX18sIGxlbmd0aCwgYnVmZmVyKTsKIAogCXNlcmlhbC0+VGlSZWFkSTJDID0gMTsKIApAQCAtNDcyLDggKzQ3Miw4IEBACiAJCQlyZXR1cm4gc3RhdHVzOwogCX0KIAotICAJZGJnICgiJXMgLSBzdGFydF9zZGRyID0gJXgsIGxlbmd0aCA9ICVkIiwgX19GVU5DVElPTl9fLCBzdGFydF9hZGRyZXNzLCBsZW5ndGgpOwotCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnNlcmlhbC0+c2VyaWFsLT5kZXYtPmRldiwgX19GVU5DVElPTl9fLCBsZW5ndGgsIGJ1ZmZlcik7CisgIAlkYmcgKCIlcyAtIHN0YXJ0X3NkZHIgPSAleCwgbGVuZ3RoID0gJWQiLCBfX2Z1bmNfXywgc3RhcnRfYWRkcmVzcywgbGVuZ3RoKTsKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZzZXJpYWwtPnNlcmlhbC0+ZGV2LT5kZXYsIF9fZnVuY19fLCBsZW5ndGgsIGJ1ZmZlcik7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNDk0LDggKzQ5NCw4IEBACiAJaWYgKHdyaXRlX2xlbmd0aCA+IGxlbmd0aCkKIAkJd3JpdGVfbGVuZ3RoID0gbGVuZ3RoOwogCi0JZGJnICgiJXMgLSBCeXRlc0luRmlyc3RQYWdlIEFkZHIgPSAleCwgbGVuZ3RoID0gJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXJ0X2FkZHJlc3MsIHdyaXRlX2xlbmd0aCk7Ci0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmc2VyaWFsLT5zZXJpYWwtPmRldi0+ZGV2LCBfX0ZVTkNUSU9OX18sIHdyaXRlX2xlbmd0aCwgYnVmZmVyKTsKKwlkYmcgKCIlcyAtIEJ5dGVzSW5GaXJzdFBhZ2UgQWRkciA9ICV4LCBsZW5ndGggPSAlZCIsIF9fZnVuY19fLCBzdGFydF9hZGRyZXNzLCB3cml0ZV9sZW5ndGgpOworCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnNlcmlhbC0+c2VyaWFsLT5kZXYtPmRldiwgX19mdW5jX18sIHdyaXRlX2xlbmd0aCwgYnVmZmVyKTsKIAogCS8qIFdyaXRlIGZpcnN0IHBhZ2UgKi8KIAliZV9zdGFydF9hZGRyZXNzID0gY3B1X3RvX2JlMTYgKHN0YXJ0X2FkZHJlc3MpOwpAQCAtNTA2LDcgKzUwNiw3IEBACiAJCQkJCWJ1ZmZlciwJCQkvLyBUcmFuc2ZlckJ1ZmZlcgogCQkJCQl3cml0ZV9sZW5ndGgpOwogCWlmIChzdGF0dXMpIHsKLQkJZGJnICgiJXMgLSBFUlJPUiAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGJnICgiJXMgLSBFUlJPUiAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KIApAQCAtNTIxLDggKzUyMSw4IEBACiAJCWVsc2UKIAkJCXdyaXRlX2xlbmd0aCA9IGxlbmd0aDsKIAotCQlkYmcgKCIlcyAtIFBhZ2UgV3JpdGUgQWRkciA9ICV4LCBsZW5ndGggPSAlZCIsIF9fRlVOQ1RJT05fXywgc3RhcnRfYWRkcmVzcywgd3JpdGVfbGVuZ3RoKTsKLQkJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmc2VyaWFsLT5zZXJpYWwtPmRldi0+ZGV2LCBfX0ZVTkNUSU9OX18sIHdyaXRlX2xlbmd0aCwgYnVmZmVyKTsKKwkJZGJnICgiJXMgLSBQYWdlIFdyaXRlIEFkZHIgPSAleCwgbGVuZ3RoID0gJWQiLCBfX2Z1bmNfXywgc3RhcnRfYWRkcmVzcywgd3JpdGVfbGVuZ3RoKTsKKwkJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmc2VyaWFsLT5zZXJpYWwtPmRldi0+ZGV2LCBfX2Z1bmNfXywgd3JpdGVfbGVuZ3RoLCBidWZmZXIpOwogCiAJCS8qIFdyaXRlIG5leHQgcGFnZSAqLwogCQliZV9zdGFydF9hZGRyZXNzID0gY3B1X3RvX2JlMTYgKHN0YXJ0X2FkZHJlc3MpOwpAQCAtNTMzLDcgKzUzMyw3IEBACiAJCQkJCQlidWZmZXIsCSAgCQkvLyBUcmFuc2ZlckJ1ZmZlcgogCQkJCQkJd3JpdGVfbGVuZ3RoKTsJCS8vIFRyYW5zZmVyQnVmZmVyTGVuZ3RoCiAJCWlmIChzdGF0dXMpIHsKLQkJCWRldl9lcnIgKCZzZXJpYWwtPnNlcmlhbC0+ZGV2LT5kZXYsICIlcyAtIEVSUk9SICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQlkZXZfZXJyICgmc2VyaWFsLT5zZXJpYWwtPmRldi0+ZGV2LCAiJXMgLSBFUlJPUiAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCQlyZXR1cm4gc3RhdHVzOwogCQl9CiAJCQpAQCAtNTU5LDcgKzU1OSw3IEBACiAKIAlvZWRiID0ga21hbGxvYyAoc2l6ZW9mICgqIG9lZGIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW9lZGIpIHsKLQkJZGV2X2VyciAoJnBvcnQtPnBvcnQtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VyciAoJnBvcnQtPnBvcnQtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTU3OSw3ICs1NzksNyBAQAogCWlmIChzdGF0dXMpCiAJCWdvdG8gZXhpdF9pc190eF9hY3RpdmU7CiAKLQlkYmcgKCIlcyAtIFhCeXRlQ291bnQgICAgMHglWCIsIF9fRlVOQ1RJT05fXywgb2VkYi0+WEJ5dGVDb3VudCk7CisJZGJnICgiJXMgLSBYQnl0ZUNvdW50ICAgIDB4JVgiLCBfX2Z1bmNfXywgb2VkYi0+WEJ5dGVDb3VudCk7CiAKIAkvKiBhbmQgdGhlIExTUiAqLwogCXN0YXR1cyA9IFRJUmVhZFJhbSAocG9ydC0+cG9ydC0+c2VyaWFsLT5kZXYsIApAQCAtNTg5LDcgKzU4OSw3IEBACiAKIAlpZiAoc3RhdHVzKQogCQlnb3RvIGV4aXRfaXNfdHhfYWN0aXZlOwotCWRiZyAoIiVzIC0gTFNSID0gMHglWCIsIF9fRlVOQ1RJT05fXywgKmxzcik7CisJZGJnICgiJXMgLSBMU1IgPSAweCVYIiwgX19mdW5jX18sICpsc3IpOwogCQogCS8qIElmIGVpdGhlciBidWZmZXIgaGFzIGRhdGEgb3Igd2UgYXJlIHRyYW5zbWl0dGluZyB0aGVuIHJldHVybiBUUlVFICovCiAJaWYgKChvZWRiLT5YQnl0ZUNvdW50ICYgMHg4MCApICE9IDAgKQpAQCAtNjAwLDcgKzYwMCw3IEBACiAKIAkvKiBXZSByZXR1cm4gTm90IEFjdGl2ZSBpZiB3ZSBnZXQgYW55IGtpbmQgb2YgZXJyb3IgKi8KIGV4aXRfaXNfdHhfYWN0aXZlOgotCWRiZyAoIiVzIC0gcmV0dXJuICVkIiwgX19GVU5DVElPTl9fLCBieXRlc19sZWZ0ICk7CisJZGJnICgiJXMgLSByZXR1cm4gJWQiLCBfX2Z1bmNfXywgYnl0ZXNfbGVmdCApOwogCiAJa2ZyZWUobHNyKTsKIAlrZnJlZShvZWRiKTsKQEAgLTY1NCw3ICs2NTQsNyBAQAogCS8qIChUSUlzVHhBY3RpdmUgZG9lc24ndCBzZWVtIHRvIHdhaXQgZm9yIHRoZSBsYXN0IGJ5dGUpICovCiAJaWYgKChiYXVkX3JhdGU9cG9ydC0+YmF1ZF9yYXRlKSA9PSAwKQogCQliYXVkX3JhdGUgPSA1MDsKLQltc2xlZXAobWF4KDEsKDEwMDAwK2JhdWRfcmF0ZS0xKS9iYXVkX3JhdGUpKTsKKwltc2xlZXAobWF4KDEsIERJVl9ST1VORF9VUCgxMDAwMCwgYmF1ZF9yYXRlKSkpOwogfQogCiBzdGF0aWMgaW50IFRJQ2hvb3NlQ29uZmlndXJhdGlvbiAoc3RydWN0IHVzYl9kZXZpY2UgKmRldikKQEAgLTY2NCwxMSArNjY0LDExIEBACiAJLy8gd2Ugd2FudC4gSG93ZXZlciwgd2UganVzdCBzdXBwb3J0IG9uZSBjb25maWcgYXQgdGhpcyBwb2ludCwKIAkvLyBjb25maWd1cmF0aW9uICMgMSwgd2hpY2ggaXMgQ29uZmlnIERlc2NyaXB0b3IgMC4KIAotCWRiZyAoIiVzIC0gTnVtYmVyIG9mIEludGVyZmFjZXMgPSAlZCIsIF9fRlVOQ1RJT05fXywgZGV2LT5jb25maWctPmRlc2MuYk51bUludGVyZmFjZXMpOwotCWRiZyAoIiVzIC0gTUFYIFBvd2VyICAgICAgICAgICAgPSAlZCIsIF9fRlVOQ1RJT05fXywgZGV2LT5jb25maWctPmRlc2MuYk1heFBvd2VyKjIpOworCWRiZyAoIiVzIC0gTnVtYmVyIG9mIEludGVyZmFjZXMgPSAlZCIsIF9fZnVuY19fLCBkZXYtPmNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlcyk7CisJZGJnICgiJXMgLSBNQVggUG93ZXIgICAgICAgICAgICA9ICVkIiwgX19mdW5jX18sIGRldi0+Y29uZmlnLT5kZXNjLmJNYXhQb3dlcioyKTsKIAogCWlmIChkZXYtPmNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlcyAhPSAxKSB7Ci0JCWRldl9lcnIgKCZkZXYtPmRldiwgIiVzIC0gYk51bUludGVyZmFjZXMgaXMgbm90IDEsIEVSUk9SIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VyciAoJmRldi0+ZGV2LCAiJXMgLSBiTnVtSW50ZXJmYWNlcyBpcyBub3QgMSwgRVJST1IhXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtNzUxLDcgKzc1MSw3IEBACiAJCWNzID0gKF9fdTgpKGNzICsgYnVmZmVyW2ldKTsKIAl9CiAJaWYgKGNzICE9IHJvbV9kZXNjLT5DaGVja1N1bSkgewotCQlkYmcgKCIlcyAtIE1pc21hdGNoICV4IC0gJXgiLCBfX0ZVTkNUSU9OX18sIHJvbV9kZXNjLT5DaGVja1N1bSwgY3MpOworCQlkYmcgKCIlcyAtIE1pc21hdGNoICV4IC0gJXgiLCBfX2Z1bmNfXywgcm9tX2Rlc2MtPkNoZWNrU3VtLCBjcyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZXR1cm4gMDsKQEAgLTc2OSwxMiArNzY5LDEyIEBACiAKIAlyb21fZGVzYyA9IGttYWxsb2MgKHNpemVvZiAoKnJvbV9kZXNjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyb21fZGVzYykgewotCQlkZXZfZXJyIChkZXYsICIlcyAtIG91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRldl9lcnIgKGRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJYnVmZmVyID0ga21hbGxvYyAoVElfTUFYX0kyQ19TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZmZlcikgewotCQlkZXZfZXJyIChkZXYsICIlcyAtIG91dCBvZiBtZW1vcnkgd2hlbiBhbGxvY2F0aW5nIGJ1ZmZlclxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VyciAoZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5IHdoZW4gYWxsb2NhdGluZyBidWZmZXJcbiIsIF9fZnVuY19fKTsKIAkJa2ZyZWUgKHJvbV9kZXNjKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtNzg1LDcgKzc4NSw3IEBACiAJCWdvdG8gRXhpdFRpVmFsaWRhdGVJMmNJbWFnZTsgCiAKIAlpZiAoKmJ1ZmZlciAhPSBVTVA1MTUyICYmICpidWZmZXIgIT0gVU1QMzQxMCkgewotCQlkZXZfZXJyIChkZXYsICIlcyAtIGludmFsaWQgYnVmZmVyIHNpZ25hdHVyZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VyciAoZGV2LCAiJXMgLSBpbnZhbGlkIGJ1ZmZlciBzaWduYXR1cmVcbiIsIF9fZnVuY19fKTsKIAkJc3RhdHVzID0gLUVOT0RFVjsKIAkJZ290byBFeGl0VGlWYWxpZGF0ZUkyY0ltYWdlOwogCX0KQEAgLTgwMSwxMSArODAxLDExIEBACiAKIAkJaWYgKChzdGFydF9hZGRyZXNzICsgc2l6ZW9mKHN0cnVjdCB0aV9pMmNfZGVzYykgKyByb21fZGVzYy0+U2l6ZSkgPiBUSV9NQVhfSTJDX1NJWkUpIHsKIAkJCXN0YXR1cyA9IC1FTk9ERVY7Ci0JCQlkYmcgKCIlcyAtIHN0cnVjdHVyZSB0b28gYmlnLCBlcnJvcmluZyBvdXQuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZyAoIiVzIC0gc3RydWN0dXJlIHRvbyBiaWcsIGVycm9yaW5nIG91dC4iLCBfX2Z1bmNfXyk7CiAJCQlicmVhazsKIAkJfQogCi0JCWRiZyAoIiVzIFR5cGUgPSAweCV4IiwgX19GVU5DVElPTl9fLCByb21fZGVzYy0+VHlwZSk7CisJCWRiZyAoIiVzIFR5cGUgPSAweCV4IiwgX19mdW5jX18sIHJvbV9kZXNjLT5UeXBlKTsKIAogCQkvLyBTa2lwIHR5cGUgMiByZWNvcmQKIAkJdHR5cGUgPSByb21fZGVzYy0+VHlwZSAmIDB4MGY7CkBAIC04NDUsMTMgKzg0NSwxMyBAQAogCiAJcm9tX2Rlc2MgPSBrbWFsbG9jIChzaXplb2YgKCpyb21fZGVzYyksIEdGUF9LRVJORUwpOwogCWlmICghcm9tX2Rlc2MpIHsKLQkJZGV2X2VyciAoJnNlcmlhbC0+c2VyaWFsLT5kZXYtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VyciAoJnNlcmlhbC0+c2VyaWFsLT5kZXYtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJc3RhcnRfYWRkcmVzcyA9IFRJR2V0RGVzY3JpcHRvckFkZHJlc3MgKHNlcmlhbCwgSTJDX0RFU0NfVFlQRV9JT04sIHJvbV9kZXNjKTsKIAogCWlmICghc3RhcnRfYWRkcmVzcykgewotCQlkYmcgKCIlcyAtIEVkZ2UgRGVzY3JpcHRvciBub3QgZm91bmQgaW4gSTJDIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnICgiJXMgLSBFZGdlIERlc2NyaXB0b3Igbm90IGZvdW5kIGluIEkyQyIsIF9fZnVuY19fKTsKIAkJc3RhdHVzID0gLUVOT0RFVjsKIAkJZ290byBleGl0OwogCX0KQEAgLTg2NywxMiArODY3LDEyIEBACiAJc3RhdHVzID0gVmFsaWRDaGVja3N1bShyb21fZGVzYywgYnVmZmVyKTsKIAkKIAlkZXNjID0gKHN0cnVjdCBlZGdlX3RpX21hbnVmX2Rlc2NyaXB0b3IgKilidWZmZXI7Ci0JZGJnICggIiVzIC0gSW9uQ29uZmlnICAgICAgMHgleCIsIF9fRlVOQ1RJT05fXywgZGVzYy0+SW9uQ29uZmlnIAkpOwotCWRiZyAoICIlcyAtIFZlcnNpb24gICAgICAgICAgJWQiLCBfX0ZVTkNUSU9OX18sIGRlc2MtPlZlcnNpb24JICAJKTsKLQlkYmcgKCAiJXMgLSBDcHUvQm9hcmQgICAgICAweCV4IiwgX19GVU5DVElPTl9fLCBkZXNjLT5DcHVSZXZfQm9hcmRSZXYJKTsKLQlkYmcgKCAiJXMgLSBOdW1Qb3J0cyAgICAgICAgICVkIiwgX19GVU5DVElPTl9fLCBkZXNjLT5OdW1Qb3J0cyAgCSk7CQotCWRiZyAoICIlcyAtIE51bVZpcnR1YWxQb3J0cyAgJWQiLCBfX0ZVTkNUSU9OX18sIGRlc2MtPk51bVZpcnR1YWxQb3J0cwkpOwkKLQlkYmcgKCAiJXMgLSBUb3RhbFBvcnRzICAgICAgICVkIiwgX19GVU5DVElPTl9fLCBkZXNjLT5Ub3RhbFBvcnRzICAJKTsJCisJZGJnICggIiVzIC0gSW9uQ29uZmlnICAgICAgMHgleCIsIF9fZnVuY19fLCBkZXNjLT5Jb25Db25maWcgCSk7CisJZGJnICggIiVzIC0gVmVyc2lvbiAgICAgICAgICAlZCIsIF9fZnVuY19fLCBkZXNjLT5WZXJzaW9uCSAgCSk7CisJZGJnICggIiVzIC0gQ3B1L0JvYXJkICAgICAgMHgleCIsIF9fZnVuY19fLCBkZXNjLT5DcHVSZXZfQm9hcmRSZXYJKTsKKwlkYmcgKCAiJXMgLSBOdW1Qb3J0cyAgICAgICAgICVkIiwgX19mdW5jX18sIGRlc2MtPk51bVBvcnRzICAJKTsKKwlkYmcgKCAiJXMgLSBOdW1WaXJ0dWFsUG9ydHMgICVkIiwgX19mdW5jX18sIGRlc2MtPk51bVZpcnR1YWxQb3J0cwkpOworCWRiZyAoICIlcyAtIFRvdGFsUG9ydHMgICAgICAgJWQiLCBfX2Z1bmNfXywgZGVzYy0+VG90YWxQb3J0cyAgCSk7CiAKIGV4aXQ6CiAJa2ZyZWUgKHJvbV9kZXNjKTsKQEAgLTkwMiw3ICs5MDIsNyBAQAogCiAJYnVmZmVyID0ga21hbGxvYyAoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghYnVmZmVyKSB7Ci0JCWRldl9lcnIgKGRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VyciAoZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAkKQEAgLTk1NSwxMSArOTU1LDExIEBACiAJCQkJCSZkYXRhLAkJCQkvLyBUcmFuc2ZlckJ1ZmZlcgogCQkJCQkweDAxKTsJCQkJLy8gVHJhbnNmZXJCdWZmZXJMZW5ndGgKIAlpZiAoc3RhdHVzKQotCQlkYmcgKCIlcyAtIHJlYWQgMiBzdGF0dXMgZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGJnICgiJXMgLSByZWFkIDIgc3RhdHVzIGVycm9yID0gJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAllbHNlCi0JCWRiZyAoIiVzIC0gcmVhZCAyIGRhdGEgPSAweCV4IiwgX19GVU5DVElPTl9fLCBkYXRhKTsKKwkJZGJnICgiJXMgLSByZWFkIDIgZGF0YSA9IDB4JXgiLCBfX2Z1bmNfXywgZGF0YSk7CiAJaWYgKCghc3RhdHVzKSAmJiAoZGF0YSA9PSBVTVA1MTUyIHx8IGRhdGEgPT0gVU1QMzQxMCkpIHsKLQkJZGJnICgiJXMgLSBST01fVFlQRV9JSSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZyAoIiVzIC0gUk9NX1RZUEVfSUkiLCBfX2Z1bmNfXyk7CiAJCXNlcmlhbC0+VElfSTJDX1R5cGUgPSBEVEtfQUREUl9TUEFDRV9JMkNfVFlQRV9JSTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtOTcyLDE2ICs5NzIsMTYgQEAKIAkJCQkJJmRhdGEsCQkJCS8vIFRyYW5zZmVyQnVmZmVyCiAJCQkJCTB4MDEpOwkJCQkvLyBUcmFuc2ZlckJ1ZmZlckxlbmd0aAogCWlmIChzdGF0dXMpCi0JCWRiZyAoIiVzIC0gcmVhZCAzIHN0YXR1cyBlcnJvciA9ICVkIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkYmcgKCIlcyAtIHJlYWQgMyBzdGF0dXMgZXJyb3IgPSAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCWVsc2UKLQkJZGJnICgiJXMgLSByZWFkIDIgZGF0YSA9IDB4JXgiLCBfX0ZVTkNUSU9OX18sIGRhdGEpOworCQlkYmcgKCIlcyAtIHJlYWQgMiBkYXRhID0gMHgleCIsIF9fZnVuY19fLCBkYXRhKTsKIAlpZiAoKCFzdGF0dXMpICYmIChkYXRhID09IFVNUDUxNTIgfHwgZGF0YSA9PSBVTVAzNDEwKSkgewotCQlkYmcgKCIlcyAtIFJPTV9UWVBFX0lJSSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZyAoIiVzIC0gUk9NX1RZUEVfSUlJIiwgX19mdW5jX18pOwogCQlzZXJpYWwtPlRJX0kyQ19UeXBlID0gRFRLX0FERFJfU1BBQ0VfSTJDX1RZUEVfSUlJOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlkYmcgKCIlcyAtIFVua25vd24iLCBfX0ZVTkNUSU9OX18pOworCWRiZyAoIiVzIC0gVW5rbm93biIsIF9fZnVuY19fKTsKIAlzZXJpYWwtPlRJX0kyQ19UeXBlID0gRFRLX0FERFJfU1BBQ0VfSTJDX1RZUEVfSUk7CiAJcmV0dXJuIC1FTk9ERVY7CiB9CkBAIC0xMDYzLDcgKzEwNjMsNyBAQAogCiAJaW50ZXJmYWNlID0gJnNlcmlhbC0+c2VyaWFsLT5pbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nLT5kZXNjOwogCWlmICghaW50ZXJmYWNlKSB7Ci0JCWRldl9lcnIgKGRldiwgIiVzIC0gbm8gaW50ZXJmYWNlIHNldCwgZXJyb3IhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkZXZfZXJyIChkZXYsICIlcyAtIG5vIGludGVyZmFjZSBzZXQsIGVycm9yIVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTEwODYsMTIgKzEwODYsMTEgQEAKIAlpZiAoc2VyaWFsLT5wcm9kdWN0X2luZm8uVGlNb2RlID09IFRJX01PREVfRE9XTkxPQUQpIHsKIAkJc3RydWN0IHRpX2kyY19kZXNjICpyb21fZGVzYzsKIAotCQlkYmcgKCIlcyAtIDw8PDw8PDw8PDw8PDw8PFJVTk5JTkcgSU4gRE9XTkxPQUQgTU9ERT4+Pj4+Pj4+Pj4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gUlVOTklORyBJTiBET1dOTE9BRCBNT0RFIiwgX19mdW5jX18pOwogCiAJCXN0YXR1cyA9IFRpVmFsaWRhdGVJMmNJbWFnZSAoc2VyaWFsKTsKIAkJaWYgKHN0YXR1cykgewotCQkJZGJnICgiJXMgLSA8PDw8PDw8PDw8PDw8PDxET1dOTE9BRCBNT0RFIC0tIEJBRCBJMkMgPj4+Pj4+Pj4+PiIsCi0JCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gRE9XTkxPQUQgTU9ERSAtLSBCQUQgSTJDIiwgX19mdW5jX18pOwogCQkJcmV0dXJuIHN0YXR1czsKIAkJfQogCQkKQEAgLTExMDAsNyArMTA5OSw3IEBACiAJCSAqLwogCQl0aV9tYW51Zl9kZXNjID0ga21hbGxvYyAoc2l6ZW9mICgqdGlfbWFudWZfZGVzYyksIEdGUF9LRVJORUwpOwogCQlpZiAoIXRpX21hbnVmX2Rlc2MpIHsKLQkJCWRldl9lcnIgKGRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeS5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkZXZfZXJyIChkZXYsICIlcyAtIG91dCBvZiBtZW1vcnkuXG4iLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQlzdGF0dXMgPSBUSVJlYWRNYW51ZkRlc2NyaXB0b3IgKHNlcmlhbCwgKF9fdTggKil0aV9tYW51Zl9kZXNjKTsKQEAgLTExMTEsNyArMTExMCw3IEBACiAKIAkJLy8gQ2hlY2sgdmVyc2lvbiBudW1iZXIgb2YgSU9OIGRlc2NyaXB0b3IKIAkJaWYgKCFpZ25vcmVfY3B1X3JldiAmJiBUSV9HRVRfQ1BVX1JFVklTSU9OKHRpX21hbnVmX2Rlc2MtPkNwdVJldl9Cb2FyZFJldikgPCAyKSB7Ci0JCQlkYmcgKCAiJXMgLSBXcm9uZyBDUFUgUmV2ICVkIChNdXN0IGJlIDIpIiwgX19GVU5DVElPTl9fLCAKKwkJCWRiZyAoICIlcyAtIFdyb25nIENQVSBSZXYgJWQgKE11c3QgYmUgMikiLCBfX2Z1bmNfXywKIAkJCSAgICAgVElfR0VUX0NQVV9SRVZJU0lPTih0aV9tYW51Zl9kZXNjLT5DcHVSZXZfQm9hcmRSZXYpKTsKIAkJCWtmcmVlICh0aV9tYW51Zl9kZXNjKTsKIAkJICAgCXJldHVybiAtRUlOVkFMOwpAQCAtMTExOSw3ICsxMTE4LDcgQEAKIAogCQlyb21fZGVzYyA9IGttYWxsb2MgKHNpemVvZiAoKnJvbV9kZXNjKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghcm9tX2Rlc2MpIHsKLQkJCWRldl9lcnIgKGRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeS5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkZXZfZXJyIChkZXYsICIlcyAtIG91dCBvZiBtZW1vcnkuXG4iLCBfX2Z1bmNfXyk7CiAJCQlrZnJlZSAodGlfbWFudWZfZGVzYyk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMTEyOSwxMSArMTEyOCwxMSBAQAogCQkJc3RydWN0IHRpX2kyY19maXJtd2FyZV9yZWMgKmZpcm13YXJlX3ZlcnNpb247CiAJCQlfX3U4IHJlY29yZDsKIAotCQkJZGJnICgiJXMgLSBGb3VuZCBUeXBlIEZJUk1XQVJFIChUeXBlIDIpIHJlY29yZCIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcgKCIlcyAtIEZvdW5kIFR5cGUgRklSTVdBUkUgKFR5cGUgMikgcmVjb3JkIiwgX19mdW5jX18pOwogCiAJCQlmaXJtd2FyZV92ZXJzaW9uID0ga21hbGxvYyAoc2l6ZW9mICgqZmlybXdhcmVfdmVyc2lvbiksIEdGUF9LRVJORUwpOwogCQkJaWYgKCFmaXJtd2FyZV92ZXJzaW9uKSB7Ci0JCQkJZGV2X2VyciAoZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5LlxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQlkZXZfZXJyIChkZXYsICIlcyAtIG91dCBvZiBtZW1vcnkuXG4iLCBfX2Z1bmNfXyk7CiAJCQkJa2ZyZWUgKHJvbV9kZXNjKTsKIAkJCQlrZnJlZSAodGlfbWFudWZfZGVzYyk7CiAJCQkJcmV0dXJuIC1FTk9NRU07CkBAIC0xMTU5LDcgKzExNTgsNyBAQAogCQkJCQkgICAoT3BlcmF0aW9uYWxDb2RlSW1hZ2VWZXJzaW9uLk1pbm9yVmVyc2lvbik7CiAKIAkJCWRiZyAoIiVzIC0gPj4+RmlybXdhcmUgVmVyc2lvbnMgRGV2aWNlICVkLiVkICBEcml2ZXIgJWQuJWQiLAotCQkJICAgICBfX0ZVTkNUSU9OX18sCisJCQkgICAgIF9fZnVuY19fLAogCQkJICAgICBmaXJtd2FyZV92ZXJzaW9uLT5WZXJfTWFqb3IsCiAJCQkgICAgIGZpcm13YXJlX3ZlcnNpb24tPlZlcl9NaW5vciwKIAkJCSAgICAgT3BlcmF0aW9uYWxDb2RlSW1hZ2VWZXJzaW9uLk1ham9yVmVyc2lvbiwKQEAgLTExNjgsNyArMTE2Nyw3IEBACiAJCQkvLyBDaGVjayBpZiB3ZSBoYXZlIGFuIG9sZCB2ZXJzaW9uIGluIHRoZSBJMkMgYW5kIHVwZGF0ZSBpZiBuZWNlc3NhcnkKIAkJCWlmIChkb3dubG9hZF9jdXJfdmVyICE9IGRvd25sb2FkX25ld192ZXIpIHsKIAkJCQlkYmcgKCIlcyAtIFVwZGF0ZSBJMkMgRG93bmxvYWQgZnJvbSAlZC4lZCB0byAlZC4lZCIsCi0JCQkJICAgICBfX0ZVTkNUSU9OX18sCisJCQkJICAgICBfX2Z1bmNfXywKIAkJCQkgICAgIGZpcm13YXJlX3ZlcnNpb24tPlZlcl9NYWpvciwKIAkJCQkgICAgIGZpcm13YXJlX3ZlcnNpb24tPlZlcl9NaW5vciwKIAkJCQkgICAgIE9wZXJhdGlvbmFsQ29kZUltYWdlVmVyc2lvbi5NYWpvclZlcnNpb24sCkBAIC0xMjEwLDE0ICsxMjA5LDE0IEBACiAJCQkJfQogCiAJCQkJaWYgKHJlY29yZCAhPSBJMkNfREVTQ19UWVBFX0ZJUk1XQVJFX0JMQU5LKSB7Ci0JCQkJCWRldl9lcnIgKGRldiwgIiVzIC0gZXJyb3IgcmVzZXR0aW5nIGRldmljZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQkJZGV2X2VyciAoZGV2LCAiJXMgLSBlcnJvciByZXNldHRpbmcgZGV2aWNlXG4iLCBfX2Z1bmNfXyk7CiAJCQkJCWtmcmVlIChmaXJtd2FyZV92ZXJzaW9uKTsKIAkJCQkJa2ZyZWUgKHJvbV9kZXNjKTsKIAkJCQkJa2ZyZWUgKHRpX21hbnVmX2Rlc2MpOwogCQkJCQlyZXR1cm4gLUVOT0RFVjsKIAkJCQl9CiAKLQkJCQlkYmcgKCIlcyAtIEhBUkRXQVJFIFJFU0VUIiwgX19GVU5DVElPTl9fKTsKKwkJCQlkYmcgKCIlcyAtIEhBUkRXQVJFIFJFU0VUIiwgX19mdW5jX18pOwogCiAJCQkJLy8gUmVzZXQgVU1QIC0tIEJhY2sgdG8gQk9PVCBNT0RFCiAJCQkJc3RhdHVzID0gVElTZW5kVmVuZG9yUmVxdWVzdFN5bmMgKHNlcmlhbC0+c2VyaWFsLT5kZXYsCkBAIC0xMjI3LDcgKzEyMjYsNyBAQAogCQkJCQkJCQlOVUxMLAkJCS8vIFRyYW5zZmVyQnVmZmVyCiAJCQkJCQkJCTApOwkJCS8vIFRyYW5zZmVyQnVmZmVyTGVuZ3RoCiAKLQkJCQlkYmcgKCAiJXMgLSBIQVJEV0FSRSBSRVNFVCByZXR1cm4gJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQkJZGJnICggIiVzIC0gSEFSRFdBUkUgUkVTRVQgcmV0dXJuICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAKIAkJCQkvKiByZXR1cm4gYW4gZXJyb3Igb24gcHVycG9zZS4gKi8KIAkJCQlrZnJlZSAoZmlybXdhcmVfdmVyc2lvbik7CkBAIC0xMjQ1LDcgKzEyNDQsNyBAQAogCiAJCQloZWFkZXIgID0ga21hbGxvYyAoSEVBREVSX1NJWkUsIEdGUF9LRVJORUwpOwogCQkJaWYgKCFoZWFkZXIpIHsKLQkJCQlkZXZfZXJyIChkZXYsICIlcyAtIG91dCBvZiBtZW1vcnkuXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCWRldl9lcnIgKGRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeS5cbiIsIF9fZnVuY19fKTsKIAkJCQlrZnJlZSAocm9tX2Rlc2MpOwogCQkJCWtmcmVlICh0aV9tYW51Zl9kZXNjKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKQEAgLTEyNTMsMTQgKzEyNTIsMTQgQEAKIAkJCQkKIAkJCXZoZWFkZXIgPSBrbWFsbG9jIChIRUFERVJfU0laRSwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIXZoZWFkZXIpIHsKLQkJCQlkZXZfZXJyIChkZXYsICIlcyAtIG91dCBvZiBtZW1vcnkuXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCWRldl9lcnIgKGRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeS5cbiIsIF9fZnVuY19fKTsKIAkJCQlrZnJlZSAoaGVhZGVyKTsKIAkJCQlrZnJlZSAocm9tX2Rlc2MpOwogCQkJCWtmcmVlICh0aV9tYW51Zl9kZXNjKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIAkJCQotCQkJZGJnICgiJXMgLSBGb3VuZCBUeXBlIEJMQU5LIEZJUk1XQVJFIChUeXBlIEYyKSByZWNvcmQiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnICgiJXMgLSBGb3VuZCBUeXBlIEJMQU5LIEZJUk1XQVJFIChUeXBlIEYyKSByZWNvcmQiLCBfX2Z1bmNfXyk7CiAKIAkJCS8vIEluIG9yZGVyIHRvIHVwZGF0ZSB0aGUgSTJDIGZpcm13YXJlIHdlIG11c3QgY2hhbmdlIHRoZSB0eXBlIDIgcmVjb3JkIHRvIHR5cGUgMHhGMi4KIAkJCS8vIFRoaXMgd2lsbCBmb3JjZSB0aGUgVU1QIHRvIGNvbWUgdXAgaW4gQm9vdCBNb2RlLiAgVGhlbiB3aGlsZSBpbiBib290IG1vZGUsIHRoZSBkcml2ZXIgCkBAIC0xMjk4LDcgKzEyOTcsNyBAQAogCQkJCQkJdmhlYWRlcik7CiAKIAkJCWlmIChzdGF0dXMpIHsKLQkJCQlkYmcgKCIlcyAtIGNhbid0IHJlYWQgaGVhZGVyIGJhY2siLCBfX0ZVTkNUSU9OX18pOworCQkJCWRiZyAoIiVzIC0gY2FuJ3QgcmVhZCBoZWFkZXIgYmFjayIsIF9fZnVuY19fKTsKIAkJCQlrZnJlZSAodmhlYWRlcik7CiAJCQkJa2ZyZWUgKGhlYWRlcik7CiAJCQkJa2ZyZWUgKHJvbV9kZXNjKTsKQEAgLTEzMDYsNyArMTMwNSw3IEBACiAJCQkJcmV0dXJuIHN0YXR1czsKIAkJCX0KIAkJCWlmIChtZW1jbXAodmhlYWRlciwgaGVhZGVyLCBIRUFERVJfU0laRSkpIHsKLQkJCQlkYmcgKCIlcyAtIHdyaXRlIGRvd25sb2FkIHJlY29yZCBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworCQkJCWRiZyAoIiVzIC0gd3JpdGUgZG93bmxvYWQgcmVjb3JkIGZhaWxlZCIsIF9fZnVuY19fKTsKIAkJCQlrZnJlZSAodmhlYWRlcik7CiAJCQkJa2ZyZWUgKGhlYWRlcik7CiAJCQkJa2ZyZWUgKHJvbV9kZXNjKTsKQEAgLTEzMTcsNyArMTMxNiw3IEBACiAJCQlrZnJlZSAodmhlYWRlcik7CiAJCQlrZnJlZSAoaGVhZGVyKTsKIAotCQkJZGJnICgiJXMgLSBTdGFydCBmaXJtd2FyZSB1cGRhdGUiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnICgiJXMgLSBTdGFydCBmaXJtd2FyZSB1cGRhdGUiLCBfX2Z1bmNfXyk7CiAKIAkJCS8vIFRlbGwgZmlybXdhcmUgdG8gY29weSBkb3dubG9hZCBpbWFnZSBpbnRvIEkyQyAKIAkJCXN0YXR1cyA9IFRJU2VuZFZlbmRvclJlcXVlc3RTeW5jIChzZXJpYWwtPnNlcmlhbC0+ZGV2LApAQCAtMTMyNyw5ICsxMzI2LDkgQEAKIAkJCQkJCU5VTEwsCQkJLy8gVHJhbnNmZXJCdWZmZXIKIAkJCQkJCTApOwkJCS8vIFRyYW5zZmVyQnVmZmVyTGVuZ3RoCiAKLQkJICAJZGJnICgiJXMgLSBVcGRhdGUgY29tcGxldGUgMHgleCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAJZGJnICgiJXMgLSBVcGRhdGUgY29tcGxldGUgMHgleCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQkJaWYgKHN0YXR1cykgewotCQkJCWRldl9lcnIgKGRldiwgIiVzIC0gVU1QQ19DT1BZX0ROTERfVE9fSTJDIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQlkZXZfZXJyIChkZXYsICIlcyAtIFVNUENfQ09QWV9ETkxEX1RPX0kyQyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKIAkJCQlrZnJlZSAocm9tX2Rlc2MpOwogCQkJCWtmcmVlICh0aV9tYW51Zl9kZXNjKTsKIAkJCQlyZXR1cm4gc3RhdHVzOwpAQCAtMTM0NSw4ICsxMzQ0LDcgQEAKIAkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogQm9vdCBNb2RlICovCiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCWRiZyAoIiVzIC0gPDw8PDw8PDw8PDw8PDw8UlVOTklORyBJTiBCT09UIE1PREU+Pj4+Pj4+Pj4+Pj4+Pj4iLAotCSAgICAgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gUlVOTklORyBJTiBCT09UIE1PREUiLCBfX2Z1bmNfXyk7CiAKIAkvLyBDb25maWd1cmUgdGhlIFRJIGRldmljZSBzbyB3ZSBjYW4gdXNlIHRoZSBCVUxLIHBpcGVzIGZvciBkb3dubG9hZAogCXN0YXR1cyA9IFRJQ29uZmlndXJlQm9vdERldmljZSAoc2VyaWFsLT5zZXJpYWwtPmRldik7CkBAIC0xMzU0LDcgKzEzNTIsNyBAQAogCQlyZXR1cm4gc3RhdHVzOwogCiAJaWYgKGxlMTZfdG9fY3B1KHNlcmlhbC0+c2VyaWFsLT5kZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpICE9IFVTQl9WRU5ET1JfSURfSU9OKSB7Ci0JCWRiZyAoIiVzIC0gVklEID0gMHgleCIsIF9fRlVOQ1RJT05fXywKKwkJZGJnICgiJXMgLSBWSUQgPSAweCV4IiwgX19mdW5jX18sCiAJCSAgICAgbGUxNl90b19jcHUoc2VyaWFsLT5zZXJpYWwtPmRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcikpOwogCQlzZXJpYWwtPlRJX0kyQ19UeXBlID0gRFRLX0FERFJfU1BBQ0VfSTJDX1RZUEVfSUk7CiAJCWdvdG8gU3RheUluQm9vdE1vZGU7CkBAIC0xMzY4LDcgKzEzNjYsNyBAQAogCiAJLy8gUmVnaXN0cnkgdmFyaWFibGUgc2V0PwogCWlmIChUSVN0YXlJbkJvb3RNb2RlKSB7Ci0JCWRiZyAoIiVzIC0gVElTdGF5SW5Cb290TW9kZSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZyAoIiVzIC0gVElTdGF5SW5Cb290TW9kZSIsIF9fZnVuY19fKTsKIAkJZ290byBTdGF5SW5Cb290TW9kZTsKIAl9CiAKQEAgLTEzODUsNyArMTM4Myw3IEBACiAJCSAqLwogCQl0aV9tYW51Zl9kZXNjID0ga21hbGxvYyAoc2l6ZW9mICgqdGlfbWFudWZfZGVzYyksIEdGUF9LRVJORUwpOwogCQlpZiAoIXRpX21hbnVmX2Rlc2MpIHsKLQkJCWRldl9lcnIgKGRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeS5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkZXZfZXJyIChkZXYsICIlcyAtIG91dCBvZiBtZW1vcnkuXG4iLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQlzdGF0dXMgPSBUSVJlYWRNYW51ZkRlc2NyaXB0b3IgKHNlcmlhbCwgKF9fdTggKil0aV9tYW51Zl9kZXNjKTsKQEAgLTEzOTYsNyArMTM5NCw3IEBACiAKIAkJLy8gQ2hlY2sgZm9yIHZlcnNpb24gMgogCQlpZiAoIWlnbm9yZV9jcHVfcmV2ICYmIFRJX0dFVF9DUFVfUkVWSVNJT04odGlfbWFudWZfZGVzYy0+Q3B1UmV2X0JvYXJkUmV2KSA8IDIpIHsKLQkJCWRiZyAoIiVzIC0gV3JvbmcgQ1BVIFJldiAlZCAoTXVzdCBiZSAyKSIsIF9fRlVOQ1RJT05fXywKKwkJCWRiZyAoIiVzIC0gV3JvbmcgQ1BVIFJldiAlZCAoTXVzdCBiZSAyKSIsIF9fZnVuY19fLAogCQkJICAgICBUSV9HRVRfQ1BVX1JFVklTSU9OKHRpX21hbnVmX2Rlc2MtPkNwdVJldl9Cb2FyZFJldikpOwogCQkJa2ZyZWUgKHRpX21hbnVmX2Rlc2MpOwogCQkJZ290byBTdGF5SW5Cb290TW9kZTsKQEAgLTE0MjAsNyArMTQxOCw3IEBACiAJCWJ1ZmZlcl9zaXplID0gKCgoMTAyNCAqIDE2KSAtIDUxMikgKyBzaXplb2Yoc3RydWN0IHRpX2kyY19pbWFnZV9oZWFkZXIpKTsKIAkJYnVmZmVyID0ga21hbGxvYyAoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwogCQlpZiAoIWJ1ZmZlcikgewotCQkJZGV2X2VyciAoZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX0ZVTkNUSU9OX18pOworCQkJZGV2X2VyciAoZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQkKQEAgLTE0NDAsMjAgKzE0MzgsMjAgQEAKIAkJaGVhZGVyLT5DaGVja1N1bSA9IGNzOwogCiAJCS8vIERvd25sb2FkIHRoZSBvcGVyYXRpb25hbCBjb2RlIAotCQlkYmcgKCIlcyAtIERvd25sb2FkaW5nIG9wZXJhdGlvbmFsIGNvZGUgaW1hZ2UgKFRJIFVNUCkiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcgKCIlcyAtIERvd25sb2FkaW5nIG9wZXJhdGlvbmFsIGNvZGUgaW1hZ2UgKFRJIFVNUCkiLCBfX2Z1bmNfXyk7CiAJCXN0YXR1cyA9IFRJRG93bmxvYWRDb2RlSW1hZ2UgKHNlcmlhbCwgYnVmZmVyLCBidWZmZXJfc2l6ZSk7CiAKIAkJa2ZyZWUgKGJ1ZmZlcik7CiAKIAkJaWYgKHN0YXR1cykgewotCSAgCQlkYmcgKCIlcyAtIEVycm9yIGRvd25sb2FkaW5nIG9wZXJhdGlvbmFsIGNvZGUgaW1hZ2UiLCBfX0ZVTkNUSU9OX18pOworCSAgCQlkYmcgKCIlcyAtIEVycm9yIGRvd25sb2FkaW5nIG9wZXJhdGlvbmFsIGNvZGUgaW1hZ2UiLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gc3RhdHVzOwogCQl9CiAKIAkJLy8gRGV2aWNlIHdpbGwgcmVib290CiAJCXNlcmlhbC0+cHJvZHVjdF9pbmZvLlRpTW9kZSA9IFRJX01PREVfVFJBTlNJVElPTklORzsKIAotICAJCWRiZyAoIiVzIC0gRG93bmxvYWQgc3VjY2Vzc2Z1bCAtLSBEZXZpY2UgcmVib290aW5nLi4uIiwgX19GVU5DVElPTl9fKTsKKyAgCQlkYmcgKCIlcyAtIERvd25sb2FkIHN1Y2Nlc3NmdWwgLS0gRGV2aWNlIHJlYm9vdGluZy4uLiIsIF9fZnVuY19fKTsKIAogCQkvKiByZXR1cm4gYW4gZXJyb3Igb24gcHVycG9zZSAqLwogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTE0NjEsNyArMTQ1OSw3IEBACiAKIFN0YXlJbkJvb3RNb2RlOgogCS8vIEVwcm9tIGlzIGludmFsaWQgb3IgYmxhbmsgc3RheSBpbiBib290IG1vZGUKLQlkYmcgKCIlcyAtIDw8PDw8PDw8PDw8PDw8PFNUQVlJTkcgSU4gQk9PVCBNT0RFPj4+Pj4+Pj4+Pj4+IiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gU1RBWUlORyBJTiBCT09UIE1PREUiLCBfX2Z1bmNfXyk7CiAJc2VyaWFsLT5wcm9kdWN0X2luZm8uVGlNb2RlID0gVElfTU9ERV9CT09UOwogCiAJcmV0dXJuIDA7CkBAIC0xNDcyLDcgKzE0NzAsNyBAQAogewogCWludCBwb3J0X251bWJlciA9IHBvcnQtPnBvcnQtPm51bWJlciAtIHBvcnQtPnBvcnQtPnNlcmlhbC0+bWlub3I7CiAKLQlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnICgiJXMiLCBfX2Z1bmNfXyk7CiAJcG9ydC0+c2hhZG93X21jciB8PSBNQ1JfRFRSOwogCiAJcmV0dXJuIFRJV3JpdGVDb21tYW5kU3luYyAocG9ydC0+cG9ydC0+c2VyaWFsLT5kZXYsCkBAIC0xNDg3LDcgKzE0ODUsNyBAQAogewogCWludCBwb3J0X251bWJlciA9IHBvcnQtPnBvcnQtPm51bWJlciAtIHBvcnQtPnBvcnQtPnNlcmlhbC0+bWlub3I7CiAKLQlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnICgiJXMiLCBfX2Z1bmNfXyk7CiAJcG9ydC0+c2hhZG93X21jciAmPSB+TUNSX0RUUjsKIAogCXJldHVybiBUSVdyaXRlQ29tbWFuZFN5bmMgKHBvcnQtPnBvcnQtPnNlcmlhbC0+ZGV2LApAQCAtMTUwMiw3ICsxNTAwLDcgQEAKIHsKIAlpbnQgcG9ydF9udW1iZXIgPSBwb3J0LT5wb3J0LT5udW1iZXIgLSBwb3J0LT5wb3J0LT5zZXJpYWwtPm1pbm9yOwogCi0JZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZyAoIiVzIiwgX19mdW5jX18pOwogCXBvcnQtPnNoYWRvd19tY3IgfD0gTUNSX1JUUzsKIAogCXJldHVybiBUSVdyaXRlQ29tbWFuZFN5bmMgKHBvcnQtPnBvcnQtPnNlcmlhbC0+ZGV2LApAQCAtMTUxNyw3ICsxNTE1LDcgQEAKIHsKIAlpbnQgcG9ydF9udW1iZXIgPSBwb3J0LT5wb3J0LT5udW1iZXIgLSBwb3J0LT5wb3J0LT5zZXJpYWwtPm1pbm9yOwogCi0JZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZyAoIiVzIiwgX19mdW5jX18pOwogCXBvcnQtPnNoYWRvd19tY3IgJj0gfk1DUl9SVFM7CiAKIAlyZXR1cm4gVElXcml0ZUNvbW1hbmRTeW5jIChwb3J0LT5wb3J0LT5zZXJpYWwtPmRldiwKQEAgLTE1MzIsNyArMTUzMCw3IEBACiB7CiAJaW50IHBvcnRfbnVtYmVyID0gcG9ydC0+cG9ydC0+bnVtYmVyIC0gcG9ydC0+cG9ydC0+c2VyaWFsLT5taW5vcjsKIAotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIAogCXJldHVybiBUSVdyaXRlQ29tbWFuZFN5bmMgKHBvcnQtPnBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJCVVNUENfU0VUX0NMUl9MT09QQkFDSywKQEAgLTE1NDYsNyArMTU0NCw3IEBACiB7CiAJaW50IHBvcnRfbnVtYmVyID0gcG9ydC0+cG9ydC0+bnVtYmVyIC0gcG9ydC0+cG9ydC0+c2VyaWFsLT5taW5vcjsKIAotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIAogCXJldHVybiBUSVdyaXRlQ29tbWFuZFN5bmMgKHBvcnQtPnBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJCVVNUENfU0VUX0NMUl9MT09QQkFDSywKQEAgLTE1NjAsNyArMTU1OCw3IEBACiB7CiAJaW50IHBvcnRfbnVtYmVyID0gcG9ydC0+cG9ydC0+bnVtYmVyIC0gcG9ydC0+cG9ydC0+c2VyaWFsLT5taW5vcjsKIAotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIAogCXJldHVybiBUSVdyaXRlQ29tbWFuZFN5bmMgKHBvcnQtPnBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJCVVNUENfU0VUX0NMUl9CUkVBSywKQEAgLTE1NzQsNyArMTU3Miw3IEBACiB7CiAJaW50IHBvcnRfbnVtYmVyID0gcG9ydC0+cG9ydC0+bnVtYmVyIC0gcG9ydC0+cG9ydC0+c2VyaWFsLT5taW5vcjsKIAotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIAogCXJldHVybiBUSVdyaXRlQ29tbWFuZFN5bmMgKHBvcnQtPnBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJCVVNUENfU0VUX0NMUl9CUkVBSywKQEAgLTE1ODgsNyArMTU4Niw3IEBACiB7CiAJaW50IHN0YXR1cyA9IDA7CiAKLQlkYmcgKCIlcyAtICV4IiwgX19GVU5DVElPTl9fLCBtY3IpOworCWRiZyAoIiVzIC0gJXgiLCBfX2Z1bmNfXywgbWNyKTsKIAogCWlmIChtY3IgJiBNQ1JfRFRSKQogCQlzdGF0dXMgPSBUSVNldER0ciAocG9ydCk7CkBAIC0xNjQyLDcgKzE2NDAsNyBAQAogCXN0cnVjdCBhc3luY19pY291bnQgKmljb3VudDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCi0JZGJnICgiJXMgLSAlMDJ4IiwgX19GVU5DVElPTl9fLCBtc3IpOworCWRiZyAoIiVzIC0gJTAyeCIsIF9fZnVuY19fLCBtc3IpOwogCiAJaWYgKG1zciAmIChFREdFUE9SVF9NU1JfREVMVEFfQ1RTIHwgRURHRVBPUlRfTVNSX0RFTFRBX0RTUiB8IEVER0VQT1JUX01TUl9ERUxUQV9SSSB8IEVER0VQT1JUX01TUl9ERUxUQV9DRCkpIHsKIAkJaWNvdW50ID0gJmVkZ2VfcG9ydC0+aWNvdW50OwpAQCAtMTY4MSw3ICsxNjc5LDcgQEAKIAlzdHJ1Y3QgYXN5bmNfaWNvdW50ICppY291bnQ7CiAJX191OCBuZXdfbHNyID0gKF9fdTgpKGxzciAmIChfX3U4KShMU1JfT1ZFUl9FUlIgfCBMU1JfUEFSX0VSUiB8IExTUl9GUk1fRVJSIHwgTFNSX0JSRUFLKSk7CiAKLQlkYmcgKCIlcyAtICUwMngiLCBfX0ZVTkNUSU9OX18sIG5ld19sc3IpOworCWRiZyAoIiVzIC0gJTAyeCIsIF9fZnVuY19fLCBuZXdfbHNyKTsKIAogCWVkZ2VfcG9ydC0+c2hhZG93X2xzciA9IGxzcjsKIApAQCAtMTcxMiw3ICsxNzEwLDcgQEAKIAogc3RhdGljIHZvaWQgZWRnZV9pbnRlcnJ1cHRfY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgZWRnZXBvcnRfc2VyaWFsICplZGdlX3NlcmlhbCA9IChzdHJ1Y3QgZWRnZXBvcnRfc2VyaWFsICopdXJiLT5jb250ZXh0OworCXN0cnVjdCBlZGdlcG9ydF9zZXJpYWwgKmVkZ2Vfc2VyaWFsID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CiAJc3RydWN0IGVkZ2Vwb3J0X3BvcnQgKmVkZ2VfcG9ydDsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CkBAIC0xNzI0LDcgKzE3MjIsNyBAQAogCV9fdTggbXNyOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlzd2l0Y2ggKHN0YXR1cykgewogCWNhc2UgMDoKQEAgLTE3MzUsMzQgKzE3MzMsMzQgQEAKIAljYXNlIC1FU0hVVERPV046CiAJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCiAJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICIKLQkJCSIlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJIiVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJZ290byBleGl0OwogCX0KIAogCWlmICghbGVuZ3RoKSB7Ci0JCWRiZyAoIiVzIC0gbm8gZGF0YSBpbiB1cmIiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcgKCIlcyAtIG5vIGRhdGEgaW4gdXJiIiwgX19mdW5jX18pOwogCQlnb3RvIGV4aXQ7CiAJfQogCQkKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZlZGdlX3NlcmlhbC0+c2VyaWFsLT5kZXYtPmRldiwgX19GVU5DVElPTl9fLCBsZW5ndGgsIGRhdGEpOworCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJmVkZ2Vfc2VyaWFsLT5zZXJpYWwtPmRldi0+ZGV2LCBfX2Z1bmNfXywgbGVuZ3RoLCBkYXRhKTsKIAkJCiAJaWYgKGxlbmd0aCAhPSAyKSB7Ci0JCWRiZyAoIiVzIC0gZXhwZWN0aW5nIHBhY2tldCBvZiBzaXplIDIsIGdvdCAlZCIsIF9fRlVOQ1RJT05fXywgbGVuZ3RoKTsKKwkJZGJnICgiJXMgLSBleHBlY3RpbmcgcGFja2V0IG9mIHNpemUgMiwgZ290ICVkIiwgX19mdW5jX18sIGxlbmd0aCk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlwb3J0X251bWJlciA9IFRJVU1QX0dFVF9QT1JUX0ZST01fQ09ERSAoZGF0YVswXSk7CiAJZnVuY3Rpb24gICAgPSBUSVVNUF9HRVRfRlVOQ19GUk9NX0NPREUgKGRhdGFbMF0pOwogCWRiZyAoIiVzIC0gcG9ydF9udW1iZXIgJWQsIGZ1bmN0aW9uICVkLCBpbmZvIDB4JXgiLAotCSAgICAgX19GVU5DVElPTl9fLCBwb3J0X251bWJlciwgZnVuY3Rpb24sIGRhdGFbMV0pOworCSAgICAgX19mdW5jX18sIHBvcnRfbnVtYmVyLCBmdW5jdGlvbiwgZGF0YVsxXSk7CiAJcG9ydCA9IGVkZ2Vfc2VyaWFsLT5zZXJpYWwtPnBvcnRbcG9ydF9udW1iZXJdOwogCWVkZ2VfcG9ydCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlpZiAoIWVkZ2VfcG9ydCkgewotCQlkYmcgKCIlcyAtIGVkZ2VfcG9ydCBub3QgZm91bmQiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcgKCIlcyAtIGVkZ2VfcG9ydCBub3QgZm91bmQiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAJc3dpdGNoIChmdW5jdGlvbikgewpAQCAtMTc3MSwxMiArMTc2OSwxMiBAQAogCQlpZiAobHNyICYgVU1QX1VBUlRfTFNSX0RBVEFfTUFTSykgewogCQkJLyogU2F2ZSB0aGUgTFNSIGV2ZW50IGZvciBidWxrIHJlYWQgY29tcGxldGlvbiByb3V0aW5lICovCiAJCQlkYmcgKCIlcyAtIExTUiBFdmVudCBQb3J0ICV1IExTUiBTdGF0dXMgPSAlMDJ4IiwKLQkJCSAgICAgX19GVU5DVElPTl9fLCBwb3J0X251bWJlciwgbHNyKTsKKwkJCSAgICAgX19mdW5jX18sIHBvcnRfbnVtYmVyLCBsc3IpOwogCQkJZWRnZV9wb3J0LT5sc3JfZXZlbnQgPSAxOwogCQkJZWRnZV9wb3J0LT5sc3JfbWFzayA9IGxzcjsKIAkJfSBlbHNlIHsKIAkJCWRiZyAoIiVzIC0gPT09PT0gUG9ydCAlZCBMU1IgU3RhdHVzID0gJTAyeCA9PT09PT0iLAotCQkJICAgICBfX0ZVTkNUSU9OX18sIHBvcnRfbnVtYmVyLCBsc3IpOworCQkJICAgICBfX2Z1bmNfXywgcG9ydF9udW1iZXIsIGxzcik7CiAJCQloYW5kbGVfbmV3X2xzciAoZWRnZV9wb3J0LCAwLCBsc3IsIDApOwogCQl9CiAJCWJyZWFrOwpAQCAtMTc4NSwxMyArMTc4MywxMyBAQAogCQkvKiBDb3B5IE1TUiBmcm9tIFVNUCAqLwogCQltc3IgPSBkYXRhWzFdOwogCQlkYmcgKCIlcyAtID09PT09IFBvcnQgJXUgTVNSIFN0YXR1cyA9ICUwMnggPT09PT09XG4iLAotCQkgICAgIF9fRlVOQ1RJT05fXywgcG9ydF9udW1iZXIsIG1zcik7CisJCSAgICAgX19mdW5jX18sIHBvcnRfbnVtYmVyLCBtc3IpOwogCQloYW5kbGVfbmV3X21zciAoZWRnZV9wb3J0LCBtc3IpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CiAJCWRldl9lcnIgKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSBVbmtub3duIEludGVycnVwdCBjb2RlIGZyb20gVU1QICV4XG4iLAotCQkJIF9fRlVOQ1RJT05fXywgZGF0YVsxXSk7CisJCQkgX19mdW5jX18sIGRhdGFbMV0pOwogCQlicmVhazsKIAkJCiAJfQpAQCAtMTgwMCwxOSArMTc5OCwxOSBAQAogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChyZXR2YWwpCiAJCWRldl9lcnIgKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQgJWRcbiIsCi0JCQkgX19GVU5DVElPTl9fLCByZXR2YWwpOworCQkJIF9fZnVuY19fLCByZXR2YWwpOwogfQogCiBzdGF0aWMgdm9pZCBlZGdlX2J1bGtfaW5fY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgZWRnZXBvcnRfcG9ydCAqZWRnZV9wb3J0ID0gKHN0cnVjdCBlZGdlcG9ydF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCBlZGdlcG9ydF9wb3J0ICplZGdlX3BvcnQgPSB1cmItPmNvbnRleHQ7CiAJdW5zaWduZWQgY2hhciAqZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJaW50IHJldHZhbCA9IDA7CiAJaW50IHBvcnRfbnVtYmVyOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlzd2l0Y2ggKHN0YXR1cykgewogCWNhc2UgMDoKQEAgLTE4MjMsMTggKzE4MjEsMTggQEAKIAljYXNlIC1FU0hVVERPV046CiAJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCiAJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAlkZWZhdWx0OgogCQlkZXZfZXJyICgmdXJiLT5kZXYtPmRldiwiJXMgLSBub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkXG4iLAotCQkgICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAl9CiAKIAlpZiAoc3RhdHVzID09IC1FUElQRSkKIAkJZ290byBleGl0OwogCiAJaWYgKHN0YXR1cykgewotCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCIlcyAtIHN0b3BwaW5nIHJlYWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCIlcyAtIHN0b3BwaW5nIHJlYWQhXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE4NDMsNyArMTg0MSw3IEBACiAJaWYgKGVkZ2VfcG9ydC0+bHNyX2V2ZW50KSB7CiAJCWVkZ2VfcG9ydC0+bHNyX2V2ZW50ID0gMDsKIAkJZGJnICgiJXMgPT09PT0gUG9ydCAldSBMU1IgU3RhdHVzID0gJTAyeCwgRGF0YSA9ICUwMnggPT09PT09IiwKLQkJICAgICBfX0ZVTkNUSU9OX18sIHBvcnRfbnVtYmVyLCBlZGdlX3BvcnQtPmxzcl9tYXNrLCAqZGF0YSk7CisJCSAgICAgX19mdW5jX18sIHBvcnRfbnVtYmVyLCBlZGdlX3BvcnQtPmxzcl9tYXNrLCAqZGF0YSk7CiAJCWhhbmRsZV9uZXdfbHNyIChlZGdlX3BvcnQsIDEsIGVkZ2VfcG9ydC0+bHNyX21hc2ssICpkYXRhKTsKIAkJLyogQWRqdXN0IGJ1ZmZlciBsZW5ndGgvcG9pbnRlciAqLwogCQktLXVyYi0+YWN0dWFsX2xlbmd0aDsKQEAgLTE4NTIsMTAgKzE4NTAsMTAgQEAKIAogCXR0eSA9IGVkZ2VfcG9ydC0+cG9ydC0+dHR5OwogCWlmICh0dHkgJiYgdXJiLT5hY3R1YWxfbGVuZ3RoKSB7Ci0JCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJmVkZ2VfcG9ydC0+cG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CisJCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJmVkZ2VfcG9ydC0+cG9ydC0+ZGV2LCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKIAogCQlpZiAoZWRnZV9wb3J0LT5jbG9zZV9wZW5kaW5nKSB7Ci0JCQlkYmcgKCIlcyAtIGNsb3NlIGlzIHBlbmRpbmcsIGRyb3BwaW5nIGRhdGEgb24gdGhlIGZsb29yLiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcgKCIlcyAtIGNsb3NlIGlzIHBlbmRpbmcsIGRyb3BwaW5nIGRhdGEgb24gdGhlIGZsb29yLiIsIF9fZnVuY19fKTsKIAkJfSBlbHNlIHsKIAkJCWVkZ2VfdHR5X3JlY3YoJmVkZ2VfcG9ydC0+cG9ydC0+ZGV2LCB0dHksIGRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCX0KQEAgLTE4NzQsNyArMTg3Miw3IEBACiAJc3Bpbl91bmxvY2soJmVkZ2VfcG9ydC0+ZXBfbG9jayk7CiAJaWYgKHJldHZhbCkKIAkJZGV2X2VyciAoJnVyYi0+ZGV2LT5kZXYsICIlcyAtIHVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHJlc3VsdCAlZFxuIiwKLQkJCSBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCQkgX19mdW5jX18sIHJldHZhbCk7CiB9CiAKIHN0YXRpYyB2b2lkIGVkZ2VfdHR5X3JlY3Yoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuZ3RoKQpAQCAtMTg4NSw3ICsxODgzLDcgQEAKIAkJY250ID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBsZW5ndGgpOwogCQlpZiAoY250IDwgbGVuZ3RoKSB7CiAJCQlkZXZfZXJyKGRldiwgIiVzIC0gZHJvcHBpbmcgZGF0YSwgJWQgYnl0ZXMgbG9zdFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIGxlbmd0aCAtIGNudCk7CisJCQkJX19mdW5jX18sIGxlbmd0aCAtIGNudCk7CiAJCQlpZihjbnQgPT0gMCkKIAkJCQlicmVhazsKIAkJfQpAQCAtMTg5OSwxMSArMTg5NywxMSBAQAogCiBzdGF0aWMgdm9pZCBlZGdlX2J1bGtfb3V0X2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IGVkZ2Vwb3J0X3BvcnQgKmVkZ2VfcG9ydCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcgKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnICgiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAllZGdlX3BvcnQtPmVwX3dyaXRlX3VyYl9pbl91c2UgPSAwOwogCkBAIC0xOTE2LDExICsxOTE0LDExIEBACiAJY2FzZSAtRVNIVVRET1dOOgogCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLwogCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwgIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyAiCi0JCQkicmVjZWl2ZWQ6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQkicmVjZWl2ZWQ6ICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAl9CiAKIAkvKiBzZW5kIGFueSBidWZmZXJlZCBkYXRhICovCkBAIC0xOTM4LDEzICsxOTM2LDEyIEBACiAJdTE2IG9wZW5fc2V0dGluZ3M7CiAJdTggdHJhbnNhY3Rpb25fdGltZW91dDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoZWRnZV9wb3J0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKHBvcnQtPnR0eSkKLQkJcG9ydC0+dHR5LT5sb3dfbGF0ZW5jeSA9IGxvd19sYXRlbmN5OworCXBvcnQtPnR0eS0+bG93X2xhdGVuY3kgPSBsb3dfbGF0ZW5jeTsKIAogCXBvcnRfbnVtYmVyID0gcG9ydC0+bnVtYmVyIC0gcG9ydC0+c2VyaWFsLT5taW5vcjsKIAlzd2l0Y2ggKHBvcnRfbnVtYmVyKSB7CkBAIC0xOTYyLDcgKzE5NTksNyBAQAogCX0KIAogCWRiZyAoIiVzIC0gcG9ydF9udW1iZXIgPSAlZCwgdWFydF9iYXNlID0gJTA0eCwgZG1hX2FkZHJlc3MgPSAlMDR4IiwKLQkgICAgIF9fRlVOQ1RJT05fXywgcG9ydF9udW1iZXIsIGVkZ2VfcG9ydC0+dWFydF9iYXNlLCBlZGdlX3BvcnQtPmRtYV9hZGRyZXNzKTsKKwkgICAgIF9fZnVuY19fLCBwb3J0X251bWJlciwgZWRnZV9wb3J0LT51YXJ0X2Jhc2UsIGVkZ2VfcG9ydC0+ZG1hX2FkZHJlc3MpOwogCiAJZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAKQEAgLTE5NzMsNyArMTk3MCw3IEBACiAJc3RhdHVzID0gVElDbGVhckxvb3BCYWNrIChlZGdlX3BvcnQpOwogCWlmIChzdGF0dXMpIHsKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCIlcyAtIGNhbm5vdCBzZW5kIGNsZWFyIGxvb3BiYWNrIGNvbW1hbmQsICVkXG4iLAotCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCQpAQCAtMTk5Miw3ICsxOTg5LDcgQEAKIAkJCSAgICAgVU1QX1BJUEVfVFJBTlNfVElNRU9VVF9FTkEgfCAKIAkJCSAgICAgKHRyYW5zYWN0aW9uX3RpbWVvdXQgPDwgMikpOwogCi0JZGJnICgiJXMgLSBTZW5kaW5nIFVNUENfT1BFTl9QT1JUIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyAtIFNlbmRpbmcgVU1QQ19PUEVOX1BPUlQiLCBfX2Z1bmNfXyk7CiAKIAkvKiBUZWxsIFRJIHRvIG9wZW4gYW5kIHN0YXJ0IHRoZSBwb3J0ICovCiAJc3RhdHVzID0gVElXcml0ZUNvbW1hbmRTeW5jIChkZXYsCkBAIC0yMDAyLDcgKzE5OTksNyBAQAogCQkJCQlOVUxMLAogCQkJCQkwKTsKIAlpZiAoc3RhdHVzKSB7Ci0JCWRldl9lcnIoJnBvcnQtPmRldiwiJXMgLSBjYW5ub3Qgc2VuZCBvcGVuIGNvbW1hbmQsICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRldl9lcnIoJnBvcnQtPmRldiwiJXMgLSBjYW5ub3Qgc2VuZCBvcGVuIGNvbW1hbmQsICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9CiAKQEAgLTIwMTQsMTQgKzIwMTEsMTQgQEAKIAkJCQkJTlVMTCwKIAkJCQkJMCk7CiAJaWYgKHN0YXR1cykgewotCQlkZXZfZXJyKCZwb3J0LT5kZXYsIiVzIC0gY2Fubm90IHNlbmQgc3RhcnQgRE1BIGNvbW1hbmQsICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRldl9lcnIoJnBvcnQtPmRldiwiJXMgLSBjYW5ub3Qgc2VuZCBzdGFydCBETUEgY29tbWFuZCwgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAogCS8qIENsZWFyIFRYIGFuZCBSWCBidWZmZXJzIGluIFVNUCAqLwogCXN0YXR1cyA9IFRJUHVyZ2VEYXRhU3luYyAocG9ydCwgVU1QX1BPUlRfRElSX09VVCB8IFVNUF9QT1JUX0RJUl9JTik7CiAJaWYgKHN0YXR1cykgewotCQlkZXZfZXJyKCZwb3J0LT5kZXYsIiVzIC0gY2Fubm90IHNlbmQgY2xlYXIgYnVmZmVycyBjb21tYW5kLCAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkZXZfZXJyKCZwb3J0LT5kZXYsIiVzIC0gY2Fubm90IHNlbmQgY2xlYXIgYnVmZmVycyBjb21tYW5kLCAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCkBAIC0yMDMzLDcgKzIwMzAsNyBAQAogCQkJCQkmZWRnZV9wb3J0LT5zaGFkb3dfbXNyLAkJCS8vIFRyYW5zZmVyQnVmZmVyCiAJCQkJCTEpOwkJCQkJLy8gVHJhbnNmZXJCdWZmZXJMZW5ndGgKIAlpZiAoc3RhdHVzKSB7Ci0gCQlkZXZfZXJyKCZwb3J0LT5kZXYsIiVzIC0gY2Fubm90IHNlbmQgcmVhZCBNU1IgY29tbWFuZCwgJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKyAJCWRldl9lcnIoJnBvcnQtPmRldiwiJXMgLSBjYW5ub3Qgc2VuZCByZWFkIE1TUiBjb21tYW5kLCAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCkBAIC0yMDUwLDcgKzIwNDcsNyBAQAogCQkvKiB3ZSBhcmUgdGhlIGZpcnN0IHBvcnQgdG8gYmUgb3BlbmVkLCBsZXQncyBwb3N0IHRoZSBpbnRlcnJ1cHQgdXJiICovCiAJCXVyYiA9IGVkZ2Vfc2VyaWFsLT5zZXJpYWwtPnBvcnRbMF0tPmludGVycnVwdF9pbl91cmI7CiAJCWlmICghdXJiKSB7Ci0JCQlkZXZfZXJyICgmcG9ydC0+ZGV2LCAiJXMgLSBubyBpbnRlcnJ1cHQgdXJiIHByZXNlbnQsIGV4aXRpbmdcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkZXZfZXJyICgmcG9ydC0+ZGV2LCAiJXMgLSBubyBpbnRlcnJ1cHQgdXJiIHByZXNlbnQsIGV4aXRpbmdcbiIsIF9fZnVuY19fKTsKIAkJCXN0YXR1cyA9IC1FSU5WQUw7CiAJCQlnb3RvIHJlbGVhc2VfZXNfbG9jazsKIAkJfQpAQCAtMjA1OSw3ICsyMDU2LDcgQEAKIAkJdXJiLT5kZXYgPSBkZXY7CiAJCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9LRVJORUwpOwogCQlpZiAoc3RhdHVzKSB7Ci0JCQlkZXZfZXJyICgmcG9ydC0+ZGV2LCAiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCB2YWx1ZSAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJZGV2X2VyciAoJnBvcnQtPmRldiwgIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggdmFsdWUgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQkJZ290byByZWxlYXNlX2VzX2xvY2s7CiAJCX0KIAl9CkBAIC0yMDc0LDcgKzIwNzEsNyBAQAogCS8qIHN0YXJ0IHVwIG91ciBidWxrIHJlYWQgdXJiICovCiAJdXJiID0gcG9ydC0+cmVhZF91cmI7CiAJaWYgKCF1cmIpIHsKLQkJZGV2X2VyciAoJnBvcnQtPmRldiwgIiVzIC0gbm8gcmVhZCB1cmIgcHJlc2VudCwgZXhpdGluZ1xuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VyciAoJnBvcnQtPmRldiwgIiVzIC0gbm8gcmVhZCB1cmIgcHJlc2VudCwgZXhpdGluZ1xuIiwgX19mdW5jX18pOwogCQlzdGF0dXMgPSAtRUlOVkFMOwogCQlnb3RvIHVubGlua19pbnRfdXJiOwogCX0KQEAgLTIwODQsMTMgKzIwODEsMTMgQEAKIAl1cmItPmRldiA9IGRldjsKIAlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYiAodXJiLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3RhdHVzKSB7Ci0JCWRldl9lcnIgKCZwb3J0LT5kZXYsICIlcyAtIHJlYWQgYnVsayB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCB2YWx1ZSAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkZXZfZXJyICgmcG9ydC0+ZGV2LCAiJXMgLSByZWFkIGJ1bGsgdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggdmFsdWUgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlnb3RvIHVubGlua19pbnRfdXJiOwogCX0KIAogCSsrZWRnZV9zZXJpYWwtPm51bV9wb3J0c19vcGVuOwogCi0JZGJnKCIlcyAtIGV4aXRlZCIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIGV4aXRlZCIsIF9fZnVuY19fKTsKIAogCWdvdG8gcmVsZWFzZV9lc19sb2NrOwogCkBAIC0yMTA5LDcgKzIxMDYsNyBAQAogCWludCBwb3J0X251bWJlcjsKIAlpbnQgc3RhdHVzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAkJCSAKIAllZGdlX3NlcmlhbCA9IHVzYl9nZXRfc2VyaWFsX2RhdGEocG9ydC0+c2VyaWFsKTsKIAllZGdlX3BvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CkBAIC0yMTI5LDcgKzIxMjYsNyBAQAogCiAJLyogYXNzdW1pbmcgd2UgY2FuIHN0aWxsIHRhbGsgdG8gdGhlIGRldmljZSwKIAkgKiBzZW5kIGEgY2xvc2UgcG9ydCBjb21tYW5kIHRvIGl0ICovCi0JZGJnKCIlcyAtIHNlbmQgdW1wY19jbG9zZV9wb3J0IiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gc2VuZCB1bXBjX2Nsb3NlX3BvcnQiLCBfX2Z1bmNfXyk7CiAJcG9ydF9udW1iZXIgPSBwb3J0LT5udW1iZXIgLSBwb3J0LT5zZXJpYWwtPm1pbm9yOwogCXN0YXR1cyA9IFRJV3JpdGVDb21tYW5kU3luYyAocG9ydC0+c2VyaWFsLT5kZXYsCiAJCQkJICAgICBVTVBDX0NMT1NFX1BPUlQsCkBAIC0yMTQ3LDcgKzIxNDQsNyBAQAogCW11dGV4X3VubG9jaygmZWRnZV9zZXJpYWwtPmVzX2xvY2spOwogCWVkZ2VfcG9ydC0+Y2xvc2VfcGVuZGluZyA9IDA7CiAKLQlkYmcoIiVzIC0gZXhpdGVkIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gZXhpdGVkIiwgX19mdW5jX18pOwogfQogCiBzdGF0aWMgaW50IGVkZ2Vfd3JpdGUgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBjb3VudCkKQEAgLTIxNTUsMTAgKzIxNTIsMTAgQEAKIAlzdHJ1Y3QgZWRnZXBvcnRfcG9ydCAqZWRnZV9wb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKGNvdW50ID09IDApIHsKLQkJZGJnKCIlcyAtIHdyaXRlIHJlcXVlc3Qgb2YgMCBieXRlcyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSB3cml0ZSByZXF1ZXN0IG9mIDAgYnl0ZXMiLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMjE4NCw3ICsyMTgxLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmVkZ2VfcG9ydC0+ZXBfbG9jaywgZmxhZ3MpOwogCkBAIC0yMjA2LDcgKzIyMDMsNyBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRnZV9wb3J0LT5lcF9sb2NrLCBmbGFncyk7CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgY291bnQsIHBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLCBjb3VudCwgcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXIpOwogCiAJLyogc2V0IHVwIG91ciB1cmIgKi8KIAl1c2JfZmlsbF9idWxrX3VyYiAocG9ydC0+d3JpdGVfdXJiLCBwb3J0LT5zZXJpYWwtPmRldiwKQEAgLTIyMTksNyArMjIxNiw3IEBACiAJLyogc2VuZCB0aGUgZGF0YSBvdXQgdGhlIGJ1bGsgcG9ydCAqLwogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPndyaXRlX3VyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlc3VsdCkgewotCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAkJZWRnZV9wb3J0LT5lcF93cml0ZV91cmJfaW5fdXNlID0gMDsKIAkJLy8gVE9ETzogcmVzY2hlZHVsZSBlZGdlX3NlbmQKIAl9IGVsc2UgewpAQCAtMjI0MCw3ICsyMjM3LDcgQEAKIAlpbnQgcm9vbSA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoZWRnZV9wb3J0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMjI1MSw3ICsyMjQ4LDcgQEAKIAlyb29tID0gZWRnZV9idWZfc3BhY2VfYXZhaWwoZWRnZV9wb3J0LT5lcF9vdXRfYnVmKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZGdlX3BvcnQtPmVwX2xvY2ssIGZsYWdzKTsKIAotCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19GVU5DVElPTl9fLCByb29tKTsKKwlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fZnVuY19fLCByb29tKTsKIAlyZXR1cm4gcm9vbTsKIH0KIApAQCAtMjI2MSw3ICsyMjU4LDcgQEAKIAlpbnQgY2hhcnMgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKGVkZ2VfcG9ydCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTIyNzIsNyArMjI2OSw3IEBACiAJY2hhcnMgPSBlZGdlX2J1Zl9kYXRhX2F2YWlsKGVkZ2VfcG9ydC0+ZXBfb3V0X2J1Zik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRnZV9wb3J0LT5lcF9sb2NrLCBmbGFncyk7CiAKLQlkYmcgKCIlcyAtIHJldHVybnMgJWQiLCBfX0ZVTkNUSU9OX18sIGNoYXJzKTsKKwlkYmcgKCIlcyAtIHJldHVybnMgJWQiLCBfX2Z1bmNfXywgY2hhcnMpOwogCXJldHVybiBjaGFyczsKIH0KIApAQCAtMjI4MiwxNCArMjI3OSwxNCBAQAogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJaW50IHN0YXR1czsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoZWRnZV9wb3J0ID09IE5VTEwpCiAJCXJldHVybjsKIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAoIXR0eSkgewotCQlkYmcgKCIlcyAtIG5vIHR0eSBhdmFpbGFibGUiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcgKCIlcyAtIG5vIHR0eSBhdmFpbGFibGUiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIyOTgsNyArMjI5NSw3IEBACiAJCXVuc2lnbmVkIGNoYXIgc3RvcF9jaGFyID0gU1RPUF9DSEFSKHR0eSk7CiAJCXN0YXR1cyA9IGVkZ2Vfd3JpdGUgKHBvcnQsICZzdG9wX2NoYXIsIDEpOwogCQlpZiAoc3RhdHVzIDw9IDApIHsKLQkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHRvIHdyaXRlIHN0b3AgY2hhcmFjdGVyLCAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgdG8gd3JpdGUgc3RvcCBjaGFyYWN0ZXIsICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJfQogCX0KIApAQCAtMjMxNSwxNCArMjMxMiwxNCBAQAogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJaW50IHN0YXR1czsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoZWRnZV9wb3J0ID09IE5VTEwpCiAJCXJldHVybjsKIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAoIXR0eSkgewotCQlkYmcgKCIlcyAtIG5vIHR0eSBhdmFpbGFibGUiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcgKCIlcyAtIG5vIHR0eSBhdmFpbGFibGUiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIzMzEsNyArMjMyOCw3IEBACiAJCXVuc2lnbmVkIGNoYXIgc3RhcnRfY2hhciA9IFNUQVJUX0NIQVIodHR5KTsKIAkJc3RhdHVzID0gZWRnZV93cml0ZSAocG9ydCwgJnN0YXJ0X2NoYXIsIDEpOwogCQlpZiAoc3RhdHVzIDw9IDApIHsKLQkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHRvIHdyaXRlIHN0YXJ0IGNoYXJhY3RlciwgJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHRvIHdyaXRlIHN0YXJ0IGNoYXJhY3RlciwgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQl9CiAJfQogCkBAIC0yMzQwLDcgKzIzMzcsNyBAQAogCWlmIChDX0NSVFNDVFModHR5KSkgewogCQlzdGF0dXMgPSByZXN0YXJ0X3JlYWQoZWRnZV9wb3J0KTsKIAkJaWYgKHN0YXR1cykKLQkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gcmVhZCBidWxrIHVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHZhbHVlICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIHJlYWQgYnVsayB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCB2YWx1ZSAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJfQogCiB9CkBAIC0yMzkwLDEzICsyMzg3LDEzIEBACiAJaW50IHN0YXR1czsKIAlpbnQgcG9ydF9udW1iZXIgPSBlZGdlX3BvcnQtPnBvcnQtPm51bWJlciAtIGVkZ2VfcG9ydC0+cG9ydC0+c2VyaWFsLT5taW5vcjsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBlZGdlX3BvcnQtPnBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgZWRnZV9wb3J0LT5wb3J0LT5udW1iZXIpOwogCiAJdHR5ID0gZWRnZV9wb3J0LT5wb3J0LT50dHk7CiAKIAljb25maWcgPSBrbWFsbG9jIChzaXplb2YgKCpjb25maWcpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNvbmZpZykgewotCQlkZXZfZXJyICgmZWRnZV9wb3J0LT5wb3J0LT5kZXYsICIlcyAtIG91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRldl9lcnIgKCZlZGdlX3BvcnQtPnBvcnQtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC0yNDEyLDIwICsyNDA5LDIwIEBACiAJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7CiAJCWNhc2UgQ1M1OgogCQkJICAgIGNvbmZpZy0+YkRhdGFCaXRzID0gVU1QX1VBUlRfQ0hBUjVCSVRTOwotCQkJICAgIGRiZyAoIiVzIC0gZGF0YSBiaXRzID0gNSIsIF9fRlVOQ1RJT05fXyk7CisJCQkgICAgZGJnICgiJXMgLSBkYXRhIGJpdHMgPSA1IiwgX19mdW5jX18pOwogCQkJICAgIGJyZWFrOwogCQljYXNlIENTNjoKIAkJCSAgICBjb25maWctPmJEYXRhQml0cyA9IFVNUF9VQVJUX0NIQVI2QklUUzsKLQkJCSAgICBkYmcgKCIlcyAtIGRhdGEgYml0cyA9IDYiLCBfX0ZVTkNUSU9OX18pOworCQkJICAgIGRiZyAoIiVzIC0gZGF0YSBiaXRzID0gNiIsIF9fZnVuY19fKTsKIAkJCSAgICBicmVhazsKIAkJY2FzZSBDUzc6CiAJCQkgICAgY29uZmlnLT5iRGF0YUJpdHMgPSBVTVBfVUFSVF9DSEFSN0JJVFM7Ci0JCQkgICAgZGJnICgiJXMgLSBkYXRhIGJpdHMgPSA3IiwgX19GVU5DVElPTl9fKTsKKwkJCSAgICBkYmcgKCIlcyAtIGRhdGEgYml0cyA9IDciLCBfX2Z1bmNfXyk7CiAJCQkgICAgYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCWNhc2UgQ1M4OgogCQkJICAgIGNvbmZpZy0+YkRhdGFCaXRzID0gVU1QX1VBUlRfQ0hBUjhCSVRTOwotCQkJICAgIGRiZyAoIiVzIC0gZGF0YSBiaXRzID0gOCIsIF9fRlVOQ1RJT05fXyk7CisJCQkgICAgZGJnICgiJXMgLSBkYXRhIGJpdHMgPSA4IiwgX19mdW5jX18pOwogCQkJICAgIGJyZWFrOwogCX0KIApAQCAtMjQzMywzMiArMjQzMCwzMiBAQAogCQlpZiAoY2ZsYWcgJiBQQVJPREQpIHsKIAkJCWNvbmZpZy0+d0ZsYWdzIHw9IFVNUF9NQVNLX1VBUlRfRkxBR1NfUEFSSVRZOwogCQkJY29uZmlnLT5iUGFyaXR5ID0gVU1QX1VBUlRfT0REUEFSSVRZOwotCQkJZGJnKCIlcyAtIHBhcml0eSA9IG9kZCIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gcGFyaXR5ID0gb2RkIiwgX19mdW5jX18pOwogCQl9IGVsc2UgewogCQkJY29uZmlnLT53RmxhZ3MgfD0gVU1QX01BU0tfVUFSVF9GTEFHU19QQVJJVFk7CiAJCQljb25maWctPmJQYXJpdHkgPSBVTVBfVUFSVF9FVkVOUEFSSVRZOwotCQkJZGJnKCIlcyAtIHBhcml0eSA9IGV2ZW4iLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHBhcml0eSA9IGV2ZW4iLCBfX2Z1bmNfXyk7CiAJCX0KIAl9IGVsc2UgewogCQljb25maWctPmJQYXJpdHkgPSBVTVBfVUFSVF9OT1BBUklUWTsgCQotCQlkYmcoIiVzIC0gcGFyaXR5ID0gbm9uZSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBwYXJpdHkgPSBub25lIiwgX19mdW5jX18pOwogCX0KIAogCWlmIChjZmxhZyAmIENTVE9QQikgewogCQljb25maWctPmJTdG9wQml0cyA9IFVNUF9VQVJUX1NUT1BCSVQyOwotCQlkYmcoIiVzIC0gc3RvcCBiaXRzID0gMiIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBzdG9wIGJpdHMgPSAyIiwgX19mdW5jX18pOwogCX0gZWxzZSB7CiAJCWNvbmZpZy0+YlN0b3BCaXRzID0gVU1QX1VBUlRfU1RPUEJJVDE7Ci0JCWRiZygiJXMgLSBzdG9wIGJpdHMgPSAxIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDEiLCBfX2Z1bmNfXyk7CiAJfQogCiAJLyogZmlndXJlIG91dCB0aGUgZmxvdyBjb250cm9sIHNldHRpbmdzICovCiAJaWYgKGNmbGFnICYgQ1JUU0NUUykgewogCQljb25maWctPndGbGFncyB8PSBVTVBfTUFTS19VQVJUX0ZMQUdTX09VVF9YX0NUU19GTE9XOwogCQljb25maWctPndGbGFncyB8PSBVTVBfTUFTS19VQVJUX0ZMQUdTX1JUU19GTE9XOwotCQlkYmcoIiVzIC0gUlRTL0NUUyBpcyBlbmFibGVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIFJUUy9DVFMgaXMgZW5hYmxlZCIsIF9fZnVuY19fKTsKIAl9IGVsc2UgewotCQlkYmcoIiVzIC0gUlRTL0NUUyBpcyBkaXNhYmxlZCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBSVFMvQ1RTIGlzIGRpc2FibGVkIiwgX19mdW5jX18pOwogCQl0dHktPmh3X3N0b3BwZWQgPSAwOwogCQlyZXN0YXJ0X3JlYWQoZWRnZV9wb3J0KTsKIAl9CkBAIC0yNDcyLDE4ICsyNDY5LDE4IEBACiAJCWlmIChJX0lYT0ZGKHR0eSkpIHsKIAkJCWNvbmZpZy0+d0ZsYWdzIHw9IFVNUF9NQVNLX1VBUlRfRkxBR1NfSU5fWDsKIAkJCWRiZyAoIiVzIC0gSU5CT1VORCBYT04vWE9GRiBpcyBlbmFibGVkLCBYT04gPSAlMngsIFhPRkYgPSAlMngiLAotCQkJICAgICBfX0ZVTkNUSU9OX18sIGNvbmZpZy0+Y1hvbiwgY29uZmlnLT5jWG9mZik7CisJCQkgICAgIF9fZnVuY19fLCBjb25maWctPmNYb24sIGNvbmZpZy0+Y1hvZmYpOwogCQl9IGVsc2UgewotCQkJZGJnICgiJXMgLSBJTkJPVU5EIFhPTi9YT0ZGIGlzIGRpc2FibGVkIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZyAoIiVzIC0gSU5CT1VORCBYT04vWE9GRiBpcyBkaXNhYmxlZCIsIF9fZnVuY19fKTsKIAkJfQogCiAJCS8qIGlmIHdlIGFyZSBpbXBsZW1lbnRpbmcgT1VUQk9VTkQgWE9OL1hPRkYgKi8KIAkJaWYgKElfSVhPTih0dHkpKSB7CiAJCQljb25maWctPndGbGFncyB8PSBVTVBfTUFTS19VQVJUX0ZMQUdTX09VVF9YOwogCQkJZGJnICgiJXMgLSBPVVRCT1VORCBYT04vWE9GRiBpcyBlbmFibGVkLCBYT04gPSAlMngsIFhPRkYgPSAlMngiLAotCQkJICAgICBfX0ZVTkNUSU9OX18sIGNvbmZpZy0+Y1hvbiwgY29uZmlnLT5jWG9mZik7CisJCQkgICAgIF9fZnVuY19fLCBjb25maWctPmNYb24sIGNvbmZpZy0+Y1hvZmYpOwogCQl9IGVsc2UgewotCQkJZGJnICgiJXMgLSBPVVRCT1VORCBYT04vWE9GRiBpcyBkaXNhYmxlZCIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcgKCIlcyAtIE9VVEJPVU5EIFhPTi9YT0ZGIGlzIGRpc2FibGVkIiwgX19mdW5jX18pOwogCQl9CiAJfQogCkBAIC0yNTAyLDcgKzI0OTksNyBAQAogCiAJLyogRklYTUU6IFJlY29tcHV0ZSBhY3R1YWwgYmF1ZCBmcm9tIGRpdmlzb3IgaGVyZSAqLwogCi0JZGJnICgiJXMgLSBiYXVkIHJhdGUgPSAlZCwgd0JhdWRSYXRlID0gJWQiLCBfX0ZVTkNUSU9OX18sIGJhdWQsIGNvbmZpZy0+d0JhdWRSYXRlKTsKKwlkYmcgKCIlcyAtIGJhdWQgcmF0ZSA9ICVkLCB3QmF1ZFJhdGUgPSAlZCIsIF9fZnVuY19fLCBiYXVkLCBjb25maWctPndCYXVkUmF0ZSk7CiAKIAlkYmcgKCJ3QmF1ZFJhdGU6ICAgJWQiLCAoaW50KSg0NjE1NTBMIC8gY29uZmlnLT53QmF1ZFJhdGUpKTsKIAlkYmcgKCJ3RmxhZ3M6ICAgIDB4JXgiLCBjb25maWctPndGbGFncyk7CkBAIC0yNTI1LDcgKzI1MjIsNyBAQAogCQkJCXNpemVvZigqY29uZmlnKSk7CiAJaWYgKHN0YXR1cykgewogCQlkYmcgKCIlcyAtIGVycm9yICVkIHdoZW4gdHJ5aW5nIHRvIHdyaXRlIGNvbmZpZyB0byBkZXZpY2UiLAotCQkgICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAl9CiAKIAlrZnJlZSAoY29uZmlnKTsKQEAgLTI1NDEsMTIgKzI1MzgsMTIgQEAKIAogCWNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOwogCi0JZGJnKCIlcyAtIGNsZmFnICUwOHggaWZsYWcgJTA4eCIsIF9fRlVOQ1RJT05fXywgCisJZGJnKCIlcyAtIGNsZmFnICUwOHggaWZsYWcgJTA4eCIsIF9fZnVuY19fLAogCSAgICB0dHktPnRlcm1pb3MtPmNfY2ZsYWcsIHR0eS0+dGVybWlvcy0+Y19pZmxhZyk7Ci0JZGJnKCIlcyAtIG9sZCBjbGZhZyAlMDh4IG9sZCBpZmxhZyAlMDh4IiwgX19GVU5DVElPTl9fLAorCWRiZygiJXMgLSBvbGQgY2xmYWcgJTA4eCBvbGQgaWZsYWcgJTA4eCIsIF9fZnVuY19fLAogCSAgICBvbGRfdGVybWlvcy0+Y19jZmxhZywgb2xkX3Rlcm1pb3MtPmNfaWZsYWcpOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmIChlZGdlX3BvcnQgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtMjU2MSw5ICsyNTU4LDExIEBACiB7CiAJc3RydWN0IGVkZ2Vwb3J0X3BvcnQgKmVkZ2VfcG9ydCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAl1bnNpZ25lZCBpbnQgbWNyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVkZ2VfcG9ydC0+ZXBfbG9jaywgZmxhZ3MpOwogCW1jciA9IGVkZ2VfcG9ydC0+c2hhZG93X21jcjsKIAlpZiAoc2V0ICYgVElPQ01fUlRTKQogCQltY3IgfD0gTUNSX1JUUzsKQEAgLTI1ODAsNiArMjU3OSw3IEBACiAJCW1jciAmPSB+TUNSX0xPT1BCQUNLOwogCiAJZWRnZV9wb3J0LT5zaGFkb3dfbWNyID0gbWNyOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkZ2VfcG9ydC0+ZXBfbG9jaywgZmxhZ3MpOwogCiAJVElSZXN0b3JlTUNSIChlZGdlX3BvcnQsIG1jcik7CiAKQEAgLTI1OTIsOCArMjU5MiwxMSBAQAogCXVuc2lnbmVkIGludCByZXN1bHQgPSAwOwogCXVuc2lnbmVkIGludCBtc3I7CiAJdW5zaWduZWQgaW50IG1jcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlZGdlX3BvcnQtPmVwX2xvY2ssIGZsYWdzKTsKIAogCW1zciA9IGVkZ2VfcG9ydC0+c2hhZG93X21zcjsKIAltY3IgPSBlZGdlX3BvcnQtPnNoYWRvd19tY3I7CkBAIC0yNjA1LDcgKzI2MDgsOCBAQAogCQkgIHwgKChtc3IgJiBFREdFUE9SVF9NU1JfRFNSKQk/IFRJT0NNX0RTUjogMCk7ICAvKiAweDEwMCAqLwogCiAKLQlkYmcoIiVzIC0tICV4IiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCWRiZygiJXMgLS0gJXgiLCBfX2Z1bmNfXywgcmVzdWx0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZGdlX3BvcnQtPmVwX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0yNjQ0LDMwICsyNjQ4LDMwIEBACiAJc3RydWN0IGFzeW5jX2ljb3VudCBjbm93OwogCXN0cnVjdCBhc3luY19pY291bnQgY3ByZXY7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCwgY21kID0gMHgleCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjbWQpOworCWRiZygiJXMgLSBwb3J0ICVkLCBjbWQgPSAweCV4IiwgX19mdW5jX18sIHBvcnQtPm51bWJlciwgY21kKTsKIAogCXN3aXRjaCAoY21kKSB7CiAJCWNhc2UgVElPQ0lOUToKLQkJCWRiZygiJXMgLSAoJWQpIFRJT0NJTlEiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJCQlkYmcoIiVzIC0gKCVkKSBUSU9DSU5RIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAvLwkJCXJldHVybiBnZXRfbnVtYmVyX2J5dGVzX2F2YWlsKGVkZ2VfcG9ydCwgKHVuc2lnbmVkIGludCAqKSBhcmcpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBUSU9DU0VSR0VUTFNSOgotCQkJZGJnKCIlcyAtICglZCkgVElPQ1NFUkdFVExTUiIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwkJCWRiZygiJXMgLSAoJWQpIFRJT0NTRVJHRVRMU1IiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIC8vCQkJcmV0dXJuIGdldF9sc3JfaW5mbyhlZGdlX3BvcnQsICh1bnNpZ25lZCBpbnQgKikgYXJnKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgVElPQ0dTRVJJQUw6Ci0JCQlkYmcoIiVzIC0gKCVkKSBUSU9DR1NFUklBTCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwkJCWRiZygiJXMgLSAoJWQpIFRJT0NHU0VSSUFMIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJCQlyZXR1cm4gZ2V0X3NlcmlhbF9pbmZvKGVkZ2VfcG9ydCwgKHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqKSBhcmcpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBUSU9DU1NFUklBTDoKLQkJCWRiZygiJXMgLSAoJWQpIFRJT0NTU0VSSUFMIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCQkJZGJnKCIlcyAtICglZCkgVElPQ1NTRVJJQUwiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgVElPQ01JV0FJVDoKLQkJCWRiZygiJXMgLSAoJWQpIFRJT0NNSVdBSVQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJCQlkYmcoIiVzIC0gKCVkKSBUSU9DTUlXQUlUIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJCQljcHJldiA9IGVkZ2VfcG9ydC0+aWNvdW50OwogCQkJd2hpbGUgKDEpIHsKIAkJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZlZGdlX3BvcnQtPmRlbHRhX21zcl93YWl0KTsKQEAgLTI2OTAsNyArMjY5NCw3IEBACiAJCQlicmVhazsKIAogCQljYXNlIFRJT0NHSUNPVU5UOgotCQkJZGJnICgiJXMgLSAoJWQpIFRJT0NHSUNPVU5UIFJYPSVkLCBUWD0lZCIsIF9fRlVOQ1RJT05fXywKKwkJCWRiZyAoIiVzIC0gKCVkKSBUSU9DR0lDT1VOVCBSWD0lZCwgVFg9JWQiLCBfX2Z1bmNfXywKIAkJCSAgICAgcG9ydC0+bnVtYmVyLCBlZGdlX3BvcnQtPmljb3VudC5yeCwgZWRnZV9wb3J0LT5pY291bnQudHgpOwogCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZlZGdlX3BvcnQtPmljb3VudCwgc2l6ZW9mKGVkZ2VfcG9ydC0+aWNvdW50KSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0yNzA1LDcgKzI3MDksNyBAQAogCXN0cnVjdCBlZGdlcG9ydF9wb3J0ICplZGdlX3BvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJaW50IHN0YXR1czsKIAotCWRiZyAoIiVzIC0gc3RhdGUgPSAlZCIsIF9fRlVOQ1RJT05fXywgYnJlYWtfc3RhdGUpOworCWRiZyAoIiVzIC0gc3RhdGUgPSAlZCIsIF9fZnVuY19fLCBicmVha19zdGF0ZSk7CiAKIAkvKiBjaGFzZSB0aGUgcG9ydCBjbG9zZSAqLwogCVRJQ2hhc2VQb3J0IChlZGdlX3BvcnQsIDAsIDApOwpAQCAtMjcxNyw3ICsyNzIxLDcgQEAKIAl9CiAJaWYgKHN0YXR1cykgewogCQlkYmcgKCIlcyAtIGVycm9yICVkIHNlbmRpbmcgYnJlYWsgc2V0L2NsZWFyIGNvbW1hbmQuIiwKLQkJICAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCSAgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJfQogfQogCkBAIC0yNzM0LDcgKzI3MzgsNyBAQAogCS8qIGNyZWF0ZSBvdXIgcHJpdmF0ZSBzZXJpYWwgc3RydWN0dXJlICovCiAJZWRnZV9zZXJpYWwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZWRnZXBvcnRfc2VyaWFsKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGVkZ2Vfc2VyaWFsID09IE5VTEwpIHsKLQkJZGV2X2Vycigmc2VyaWFsLT5kZXYtPmRldiwgIiVzIC0gT3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2Vycigmc2VyaWFsLT5kZXYtPmRldiwgIiVzIC0gT3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJbXV0ZXhfaW5pdCgmZWRnZV9zZXJpYWwtPmVzX2xvY2spOwpAQCAtMjc1MSwxMyArMjc1NSwxMyBAQAogCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgKytpKSB7CiAJCWVkZ2VfcG9ydCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBlZGdlcG9ydF9wb3J0KSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChlZGdlX3BvcnQgPT0gTlVMTCkgewotCQkJZGV2X2Vycigmc2VyaWFsLT5kZXYtPmRldiwgIiVzIC0gT3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRldl9lcnIoJnNlcmlhbC0+ZGV2LT5kZXYsICIlcyAtIE91dCBvZiBtZW1vcnlcbiIsIF9fZnVuY19fKTsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCQlzcGluX2xvY2tfaW5pdCgmZWRnZV9wb3J0LT5lcF9sb2NrKTsKIAkJZWRnZV9wb3J0LT5lcF9vdXRfYnVmID0gZWRnZV9idWZfYWxsb2MoRURHRV9PVVRfQlVGX1NJWkUpOwogCQlpZiAoZWRnZV9wb3J0LT5lcF9vdXRfYnVmID09IE5VTEwpIHsKLQkJCWRldl9lcnIoJnNlcmlhbC0+ZGV2LT5kZXYsICIlcyAtIE91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkZXZfZXJyKCZzZXJpYWwtPmRldi0+ZGV2LCAiJXMgLSBPdXQgb2YgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CiAJCQlrZnJlZShlZGdlX3BvcnQpOwogCQkJZ290byBjbGVhbnVwOwogCQl9CkBAIC0yNzg2LDcgKzI3OTAsNyBAQAogCWludCBpOwogCXN0cnVjdCBlZGdlcG9ydF9wb3J0ICplZGdlX3BvcnQ7CiAKLQlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnICgiJXMiLCBfX2Z1bmNfXyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7ICsraSkgewogCQllZGdlX3BvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0W2ldKTsKQEAgLTI4MTgsMTIgKzI4MjIsMTIgQEAKIAlzdHJ1Y3QgZWRnZXBvcnRfcG9ydCAqZWRnZV9wb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGludCB2ID0gc2ltcGxlX3N0cnRvdWwodmFsYnVmLCBOVUxMLCAwKTsKIAotCWRiZygiJXM6IHNldHRpbmcgdWFydF9tb2RlID0gJWQiLCBfX0ZVTkNUSU9OX18sIHYpOworCWRiZygiJXM6IHNldHRpbmcgdWFydF9tb2RlID0gJWQiLCBfX2Z1bmNfXywgdik7CiAKIAlpZiAodiA8IDI1NikKIAkJZWRnZV9wb3J0LT5iVWFydE1vZGUgPSB2OwogCWVsc2UKLQkJZGV2X2VycihkZXYsICIlcyAtIHVhcnRfbW9kZSAlZCBpcyBpbnZhbGlkXG4iLCBfX0ZVTkNUSU9OX18sIHYpOworCQlkZXZfZXJyKGRldiwgIiVzIC0gdWFydF9tb2RlICVkIGlzIGludmFsaWRcbiIsIF9fZnVuY19fLCB2KTsKIAogCXJldHVybiBjb3VudDsKIH0KQEAgLTMwMjgsOSArMzAzMiw2IEBACiAJLmRlc2NyaXB0aW9uCQk9ICJFZGdlcG9ydCBUSSAxIHBvcnQgYWRhcHRlciIsCiAJLnVzYl9kcml2ZXIJCT0gJmlvX2RyaXZlciwKIAkuaWRfdGFibGUJCT0gZWRnZXBvcnRfMXBvcnRfaWRfdGFibGUsCi0JLm51bV9pbnRlcnJ1cHRfaW4JPSAxLAotCS5udW1fYnVsa19pbgkJPSAxLAotCS5udW1fYnVsa19vdXQJCT0gMSwKIAkubnVtX3BvcnRzCQk9IDEsCiAJLm9wZW4JCQk9IGVkZ2Vfb3BlbiwKIAkuY2xvc2UJCQk9IGVkZ2VfY2xvc2UsCkBAIC0zMDYwLDkgKzMwNjEsNiBAQAogCS5kZXNjcmlwdGlvbgkJPSAiRWRnZXBvcnQgVEkgMiBwb3J0IGFkYXB0ZXIiLAogCS51c2JfZHJpdmVyCQk9ICZpb19kcml2ZXIsCiAJLmlkX3RhYmxlCQk9IGVkZ2Vwb3J0XzJwb3J0X2lkX3RhYmxlLAotCS5udW1faW50ZXJydXB0X2luCT0gMSwKLQkubnVtX2J1bGtfaW4JCT0gMiwKLQkubnVtX2J1bGtfb3V0CQk9IDIsCiAJLm51bV9wb3J0cwkJPSAyLAogCS5vcGVuCQkJPSBlZGdlX29wZW4sCiAJLmNsb3NlCQkJPSBlZGdlX2Nsb3NlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2lwYXEuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pcGFxLmMKaW5kZXggOWIzOGEwOC4uZWE5MjRkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2lwYXEuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXBhcS5jCkBAIC01NzAsMTAgKzU3MCw3IEBACiAJLmRlc2NyaXB0aW9uID0JCSJQb2NrZXRQQyBQREEiLAogCS51c2JfZHJpdmVyID0gCQkmaXBhcV9kcml2ZXIsCiAJLmlkX3RhYmxlID0JCWlwYXFfaWRfdGFibGUsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19pbiA9CQkxLAotCS5udW1fYnVsa19vdXQgPQkJMSwKLQkubnVtX3BvcnRzID0JCTEsCisJLm51bV9wb3J0cyA9CQkyLAogCS5vcGVuID0JCQlpcGFxX29wZW4sCiAJLmNsb3NlID0JCWlwYXFfY2xvc2UsCiAJLmF0dGFjaCA9CQlpcGFxX3N0YXJ0dXAsCkBAIC01OTcsMTMgKzU5NCwxMyBAQAogCWludAkJCWksIHJlc3VsdCA9IDA7CiAJaW50CQkJcmV0cmllcyA9IGNvbm5lY3RfcmV0cmllczsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlieXRlc19pbiA9IDA7CiAJYnl0ZXNfb3V0ID0gMDsKIAlwcml2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwYXFfcHJpdmF0ZSksIEdGUF9LRVJORUwpOwogCWlmIChwcml2ID09IE5VTEwpIHsKLQkJZXJyKCIlcyAtIE91dCBvZiBtZW1vcnkiLCBfX0ZVTkNUSU9OX18pOworCQllcnIoIiVzIC0gT3V0IG9mIG1lbW9yeSIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0LCBwcml2KTsKQEAgLTY4Miw3ICs2NzksNyBAQAogCX0KIAogCWlmICghcmV0cmllcyAmJiByZXN1bHQpIHsKLQkJZXJyKCIlcyAtIGZhaWxlZCBkb2luZyBjb250cm9sIHVyYiwgZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sCisJCWVycigiJXMgLSBmYWlsZWQgZG9pbmcgY29udHJvbCB1cmIsIGVycm9yICVkIiwgX19mdW5jX18sCiAJCSAgICByZXN1bHQpOwogCQlnb3RvIGVycm9yOwogCX0KQEAgLTY5NSw3ICs2OTIsNyBAQAogCiAJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9LRVJORUwpOwogCWlmIChyZXN1bHQpIHsKLQkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogCQlnb3RvIGVycm9yOwogCX0KIApAQCAtNzAzLDcgKzcwMCw3IEBACiAKIGVub21lbToKIAlyZXN1bHQgPSAtRU5PTUVNOwotCWVycigiJXMgLSBPdXQgb2YgbWVtb3J5IiwgX19GVU5DVElPTl9fKTsKKwllcnIoIiVzIC0gT3V0IG9mIG1lbW9yeSIsIF9fZnVuY19fKTsKIGVycm9yOgogCWlwYXFfZGVzdHJveV9saXN0cyhwb3J0KTsKIAlrZnJlZShwcml2KTsKQEAgLTcxNSw3ICs3MTIsNyBAQAogewogCXN0cnVjdCBpcGFxX3ByaXZhdGUJKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCQkJIAogCS8qCiAJICogc2h1dCBkb3duIGJ1bGsgcmVhZCBhbmQgd3JpdGUKQEAgLTczMiwyMSArNzI5LDIxIEBACiAKIHN0YXRpYyB2b2lkIGlwYXFfcmVhZF9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0CSpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydAkqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OwogCXVuc2lnbmVkIGNoYXIJCSpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJaW50CQkJcmVzdWx0OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCWRiZygiJXMgLSBub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCi0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAodHR5ICYmIHVyYi0+YWN0dWFsX2xlbmd0aCkgewpAQCAtNzYzLDcgKzc2MCw3IEBACiAJCSAgICAgIGlwYXFfcmVhZF9idWxrX2NhbGxiYWNrLCBwb3J0KTsKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlc3VsdCkKLQkJZXJyKCIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQllcnIoIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWQiLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAlyZXR1cm47CiB9CiAKQEAgLTc3NCw3ICs3NzEsNyBAQAogCWludAkJCWJ5dGVzX3NlbnQgPSAwOwogCWludAkJCXRyYW5zZmVyX3NpemU7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJd2hpbGUgKGNvdW50ID4gMCkgewogCQl0cmFuc2Zlcl9zaXplID0gbWluKGNvdW50LCBQQUNLRVRfU0laRSk7CkBAIC03OTksNyArNzk2LDcgQEAKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAogCWlmIChwcml2LT5mcmVlX2xlbiA8PSAwKSB7Ci0JCWRiZygiJXMgLSB3ZSdyZSBzdHVmZmVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHdlJ3JlIHN0dWZmZWQiLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KIApAQCAtODExLDEyICs4MDgsMTIgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd3JpdGVfbGlzdF9sb2NrLCBmbGFncyk7CiAJaWYgKHBrdCA9PSBOVUxMKSB7Ci0JCWRiZygiJXMgLSB3ZSdyZSBzdHVmZmVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHdlJ3JlIHN0dWZmZWQiLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KIAogCW1lbWNweShwa3QtPmRhdGEsIGJ1ZiwgY291bnQpOwotCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCBjb3VudCwgcGt0LT5kYXRhKTsKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLCBjb3VudCwgcGt0LT5kYXRhKTsKIAogCXBrdC0+bGVuID0gY291bnQ7CiAJcGt0LT53cml0dGVuID0gMDsKQEAgLTgyOSw3ICs4MjYsNyBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3cml0ZV9saXN0X2xvY2ssIGZsYWdzKTsKIAkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+d3JpdGVfdXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJlc3VsdCkgewotCQkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogCQl9CiAJfSBlbHNlIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd3JpdGVfbGlzdF9sb2NrLCBmbGFncyk7CkBAIC04NzIsMTcgKzg2OSwxNyBAQAogCiBzdGF0aWMgdm9pZCBpcGFxX3dyaXRlX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQJKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0CSpwb3J0ID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCBpcGFxX3ByaXZhdGUJKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAJaW50CQkJcmVzdWx0OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCWRiZygiJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtODkyLDcgKzg4OSw3IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndyaXRlX2xpc3RfbG9jaywgZmxhZ3MpOwogCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT53cml0ZV91cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAocmVzdWx0KSB7Ci0JCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCWVycigiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCX0KIAl9IGVsc2UgewogCQlwcml2LT5hY3RpdmUgPSAwOwpAQCAtOTA2LDcgKzkwMyw3IEBACiB7CiAJc3RydWN0IGlwYXFfcHJpdmF0ZQkqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAotCWRiZygiJXMgLSBmcmVlbGVuICVkIiwgX19GVU5DVElPTl9fLCBwcml2LT5mcmVlX2xlbik7CisJZGJnKCIlcyAtIGZyZWVsZW4gJWQiLCBfX2Z1bmNfXywgcHJpdi0+ZnJlZV9sZW4pOwogCXJldHVybiBwcml2LT5mcmVlX2xlbjsKIH0KIApAQCAtOTE0LDcgKzkxMSw3IEBACiB7CiAJc3RydWN0IGlwYXFfcHJpdmF0ZQkqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAotCWRiZygiJXMgLSBxdWV1ZWxlbiAlZCIsIF9fRlVOQ1RJT05fXywgcHJpdi0+cXVldWVfbGVuKTsKKwlkYmcoIiVzIC0gcXVldWVsZW4gJWQiLCBfX2Z1bmNfXywgcHJpdi0+cXVldWVfbGVuKTsKIAlyZXR1cm4gcHJpdi0+cXVldWVfbGVuOwogfQogCkBAIC05MzYsNyArOTMzLDcgQEAKIAogc3RhdGljIGludCBpcGFxX3N0YXJ0dXAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKIHsKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCWlmIChzZXJpYWwtPmRldi0+YWN0Y29uZmlnLT5kZXNjLmJDb25maWd1cmF0aW9uVmFsdWUgIT0gMSkgewogCQllcnIoImFjdGl2ZSBjb25maWcgIyVkICE9IDEgPz8iLAogCQkJc2VyaWFsLT5kZXYtPmFjdGNvbmZpZy0+ZGVzYy5iQ29uZmlndXJhdGlvblZhbHVlKTsKQEAgLTk0Nyw3ICs5NDQsNyBAQAogCiBzdGF0aWMgdm9pZCBpcGFxX3NodXRkb3duKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7Ci0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgaXBhcV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXB3LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXB3LmMKaW5kZXggY2JlNTUzMC4uYmM4NWNhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2lwdy5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pcHcuYwpAQCAtMTY5LDE1ICsxNjksMTUgQEAKIAlpbnQgcmVzdWx0OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCWRiZygiJXMgLSBub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCi0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAodHR5ICYmIHVyYi0+YWN0dWFsX2xlbmd0aCkgewpAQCAtMTk1LDcgKzE5NSw3IEBACiAJCQkgICBpcHdfcmVhZF9idWxrX2NhbGxiYWNrLCBwb3J0KTsKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlc3VsdCkKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAlyZXR1cm47CiB9CiAKQEAgLTIwNiw3ICsyMDYsNyBAQAogCXU4ICpidWZfZmxvd19pbml0OwogCWludCByZXN1bHQ7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJYnVmX2Zsb3dfaW5pdCA9IGttZW1kdXAoYnVmX2Zsb3dfc3RhdGljLCAxNiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWZfZmxvd19pbml0KQpAQCAtMjE3LDcgKzIxNyw3IEBACiAKIAkvKiAtLTE6IFRlbGwgdGhlIG1vZGVtIHRvIGluaXRpYWxpemUgKHdlIHRoaW5rKSBGcm9tIHNuaWZmcyB0aGlzIGlzIGFsd2F5cyB0aGUKIAkgKiBmaXJzdCB0aGluZyB0aGF0IGdldHMgc2VudCB0byB0aGUgbW9kZW0gZHVyaW5nIG9wZW5pbmcgb2YgdGhlIGRldmljZSAqLwotCWRiZygiJXM6IFNlbmRpbmcgU0lPX0lOSVQgKHdlIGd1ZXNzKSIsX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzOiBTZW5kaW5nIFNJT19JTklUICh3ZSBndWVzcykiLF9fZnVuY19fKTsKIAlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LDApLAogCQkJCSBJUFdfU0lPX0lOSVQsCiAJCQkJIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UgfCBVU0JfRElSX09VVCwKQEAgLTIzNCw3ICsyMzQsNyBAQAogCXVzYl9jbGVhcl9oYWx0KGRldiwgdXNiX3NuZGJ1bGtwaXBlKGRldiwgcG9ydC0+YnVsa19vdXRfZW5kcG9pbnRBZGRyZXNzKSk7CiAKIAkvKi0tMjogU3RhcnQgcmVhZGluZyBmcm9tIHRoZSBkZXZpY2UgKi8JCi0JZGJnKCIlczogc2V0dGluZyB1cCBidWxrIHJlYWQgY2FsbGJhY2siLF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlczogc2V0dGluZyB1cCBidWxrIHJlYWQgY2FsbGJhY2siLF9fZnVuY19fKTsKIAl1c2JfZmlsbF9idWxrX3VyYihwb3J0LT5yZWFkX3VyYiwgZGV2LAogCQkJICB1c2JfcmN2YnVsa3BpcGUoZGV2LCBwb3J0LT5idWxrX2luX2VuZHBvaW50QWRkcmVzcyksCiAJCQkgIHBvcnQtPmJ1bGtfaW5fYnVmZmVyLApAQCAtMjQyLDEwICsyNDIsMTAgQEAKIAkJCSAgaXB3X3JlYWRfYnVsa19jYWxsYmFjaywgcG9ydCk7CiAJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9LRVJORUwpOwogCWlmIChyZXN1bHQgPCAwKQotCQlkYmcoIiVzIC0gdXNiX3N1Ym1pdF91cmIocmVhZCBidWxrKSBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCWRiZygiJXMgLSB1c2Jfc3VibWl0X3VyYihyZWFkIGJ1bGspIGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogCiAJLyotLTM6IFRlbGwgdGhlIG1vZGVtIHRvIG9wZW4gdGhlIGZsb29kZ2F0ZXMgb24gdGhlIHJ4IGJ1bGsgY2hhbm5lbCAqLwotCWRiZygiJXM6YXNraW5nIG1vZGVtIGZvciBSeFJlYWQgKFJYQlVMS19PTikiLF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlczphc2tpbmcgbW9kZW0gZm9yIFJ4UmVhZCAoUlhCVUxLX09OKSIsX19mdW5jX18pOwogCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAogCQkJCSBJUFdfU0lPX1JYQ1RMLAogCQkJCSBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfSU5URVJGQUNFIHwgVVNCX0RJUl9PVVQsCkBAIC0yNTgsNyArMjU4LDcgQEAKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCAiRW5hYmxpbmcgYnVsayBSeFJlYWQgZmFpbGVkIChlcnJvciA9ICVkKVxuIiwgcmVzdWx0KTsKIAogCS8qLS00OiBzZXR1cCB0aGUgaW5pdGlhbCBmbG93Y29udHJvbCAqLwotCWRiZygiJXM6c2V0dGluZyBpbml0IGZsb3djb250cm9sICglcykiLF9fRlVOQ1RJT05fXyxidWZfZmxvd19pbml0KTsKKwlkYmcoIiVzOnNldHRpbmcgaW5pdCBmbG93Y29udHJvbCAoJXMpIixfX2Z1bmNfXyxidWZfZmxvd19pbml0KTsKIAlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKIAkJCQkgSVBXX1NJT19IQU5ERkxPVywKIAkJCQkgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9ESVJfT1VULApAQCAtMjcyLDcgKzI3Miw3IEBACiAKIAogCS8qLS01OiByYWlzZSB0aGUgZHRyICovCi0JZGJnKCIlczpyYWlzaW5nIGR0ciIsX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzOnJhaXNpbmcgZHRyIixfX2Z1bmNfXyk7CiAJcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCiAJCQkJIElQV19TSU9fU0VUX1BJTiwKIAkJCQkgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9ESVJfT1VULApAQCAtMjg1LDcgKzI4NSw3IEBACiAJCWRldl9lcnIoJnBvcnQtPmRldiwgInNldHRpbmcgZHRyIGZhaWxlZCAoZXJyb3IgPSAlZClcbiIsIHJlc3VsdCk7CiAKIAkvKi0tNjogcmFpc2UgdGhlIHJ0cyAqLwotCWRiZygiJXM6cmFpc2luZyBydHMiLF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlczpyYWlzaW5nIHJ0cyIsX19mdW5jX18pOwogCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAogCQkJCSBJUFdfU0lPX1NFVF9QSU4sCiAJCQkJIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UgfCBVU0JfRElSX09VVCwKQEAgLTMwNywxMiArMzA3LDEyIEBACiAJaW50IHJlc3VsdDsKIAogCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKSB7Ci0JCWRiZygiJXM6IHR0eV9odW5nX3VwX3AgLi4uIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlczogdHR5X2h1bmdfdXBfcCAuLi4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKIAkvKi0tMTogZHJvcCB0aGUgZHRyICovCi0JZGJnKCIlczpkcm9wcGluZyBkdHIiLF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlczpkcm9wcGluZyBkdHIiLF9fZnVuY19fKTsKIAlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKIAkJCQkgSVBXX1NJT19TRVRfUElOLAogCQkJCSBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfSU5URVJGQUNFIHwgVVNCX0RJUl9PVVQsCkBAIC0zMjUsNyArMzI1LDcgQEAKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCAiZHJvcHBpbmcgZHRyIGZhaWxlZCAoZXJyb3IgPSAlZClcbiIsIHJlc3VsdCk7CiAKIAkvKi0tMjogZHJvcCB0aGUgcnRzICovCi0JZGJnKCIlczpkcm9wcGluZyBydHMiLF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlczpkcm9wcGluZyBydHMiLF9fZnVuY19fKTsKIAlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKIAkJCQkgSVBXX1NJT19TRVRfUElOLCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfSU5URVJGQUNFIHwgVVNCX0RJUl9PVVQsCiAJCQkJIElQV19QSU5fQ0xSUlRTLApAQCAtMzM4LDcgKzMzOCw3IEBACiAKIAogCS8qLS0zOiBwdXJnZSAqLwotCWRiZygiJXM6c2VuZGluZyBwdXJnZSIsX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzOnNlbmRpbmcgcHVyZ2UiLF9fZnVuY19fKTsKIAlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKIAkJCQkgSVBXX1NJT19QVVJHRSwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9ESVJfT1VULAogCQkJCSAweDAzLApAQCAtMzczLDEzICszNzMsMTMgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7CiAKIAlpZiAoc3RhdHVzKQogCQlkYmcoIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAKIAl1c2Jfc2VyaWFsX3BvcnRfc29mdGludChwb3J0KTsKIH0KQEAgLTM4OSwxOCArMzg5LDE4IEBACiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwogCWludCByZXQ7CiAKLQlkYmcoIiVzOiBUT1A6IGNvdW50PSVkLCBpbl9pbnRlcnJ1cHQ9JWxkIiwgX19GVU5DVElPTl9fLAorCWRiZygiJXM6IFRPUDogY291bnQ9JWQsIGluX2ludGVycnVwdD0lbGQiLCBfX2Z1bmNfXywKIAkJY291bnQsIGluX2ludGVycnVwdCgpICk7CiAKIAlpZiAoY291bnQgPT0gMCkgewotCQlkYmcoIiVzIC0gd3JpdGUgcmVxdWVzdCBvZiAwIGJ5dGVzIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHdyaXRlIHJlcXVlc3Qgb2YgMCBieXRlcyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJc3Bpbl9sb2NrX2JoKCZwb3J0LT5sb2NrKTsKIAlpZiAocG9ydC0+d3JpdGVfdXJiX2J1c3kpIHsKIAkJc3Bpbl91bmxvY2tfYmgoJnBvcnQtPmxvY2spOwotCQlkYmcoIiVzIC0gYWxyZWFkeSB3cml0aW5nIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIGFscmVhZHkgd3JpdGluZyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMTsKQEAgLTQwOSw3ICs0MDksNyBAQAogCWNvdW50ID0gbWluKGNvdW50LCBwb3J0LT5idWxrX291dF9zaXplKTsKIAltZW1jcHkocG9ydC0+YnVsa19vdXRfYnVmZmVyLCBidWYsIGNvdW50KTsKIAotCWRiZygiJXMgY291bnQgbm93OiVkIiwgX19GVU5DVElPTl9fLCBjb3VudCk7CisJZGJnKCIlcyBjb3VudCBub3c6JWQiLCBfX2Z1bmNfXywgY291bnQpOwogCiAJdXNiX2ZpbGxfYnVsa191cmIocG9ydC0+d3JpdGVfdXJiLCBkZXYsCiAJCQkgIHVzYl9zbmRidWxrcGlwZShkZXYsIHBvcnQtPmJ1bGtfb3V0X2VuZHBvaW50QWRkcmVzcyksCkBAIC00MjEsMTEgKzQyMSwxMSBAQAogCXJldCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPndyaXRlX3VyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMDsKLQkJZGJnKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHdyaXRlIGJ1bGspIGZhaWxlZCB3aXRoIGVycm9yID0gJWQiLCBfX0ZVTkNUSU9OX18sIHJldCk7CisJCWRiZygiJXMgLSB1c2Jfc3VibWl0X3VyYih3cml0ZSBidWxrKSBmYWlsZWQgd2l0aCBlcnJvciA9ICVkIiwgX19mdW5jX18sIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JZGJnKCIlcyByZXR1cm5pbmcgJWQiLCBfX0ZVTkNUSU9OX18sIGNvdW50KTsKKwlkYmcoIiVzIHJldHVybmluZyAlZCIsIF9fZnVuY19fLCBjb3VudCk7CiAJcmV0dXJuIGNvdW50OwogfSAKIApAQCAtNDQ4LDkgKzQ0OCw2IEBACiAJLmRlc2NyaXB0aW9uID0JCSJJUFdpcmVsZXNzIGNvbnZlcnRlciIsCiAJLnVzYl9kcml2ZXIgPSAJCSZ1c2JfaXB3X2RyaXZlciwKIAkuaWRfdGFibGUgPQkJdXNiX2lwd19pZHMsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19pbiA9CQkxLAotCS5udW1fYnVsa19vdXQgPQkJMSwKIAkubnVtX3BvcnRzID0JCTEsCiAJLm9wZW4gPQkJCWlwd19vcGVuLAogCS5jbG9zZSA9CQlpcHdfY2xvc2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXItdXNiLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXItdXNiLmMKaW5kZXggNmI4MDNhYi4uMDA0ZDU3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2lyLXVzYi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pci11c2IuYwpAQCAtMTQ1LDkgKzE0NSw2IEBACiAJLmRlc2NyaXB0aW9uID0JCSJJUiBEb25nbGUiLAogCS51c2JfZHJpdmVyID0gCQkmaXJfZHJpdmVyLAogCS5pZF90YWJsZSA9CQlpZF90YWJsZSwKLQkubnVtX2ludGVycnVwdF9pbiA9CTEsCi0JLm51bV9idWxrX2luID0JCTEsCi0JLm51bV9idWxrX291dCA9CQkxLAogCS5udW1fcG9ydHMgPQkJMSwKIAkuc2V0X3Rlcm1pb3MgPQkJaXJfc2V0X3Rlcm1pb3MsCiAJLmF0dGFjaCA9CQlpcl9zdGFydHVwLApAQCAtMTk4LDE2ICsxOTUsMTYgQEAKIAkJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UsCiAJCQkwLCBpZm51bSwgZGVzYywgc2l6ZW9mKCpkZXNjKSwgMTAwMCk7CiAJCi0JZGJnKCIlcyAtICByZXQ9JWQiLCBfX0ZVTkNUSU9OX18sIHJldCk7CisJZGJnKCIlcyAtICByZXQ9JWQiLCBfX2Z1bmNfXywgcmV0KTsKIAlpZiAocmV0IDwgc2l6ZW9mKCpkZXNjKSkgewogCQlkYmcoIiVzIC0gY2xhc3MgZGVzY3JpcHRvciByZWFkICVzICglZCkiLAotCQkJCV9fRlVOQ1RJT05fXywgCisJCQkJX19mdW5jX18sCiAJCQkJKHJldDwwKSA/ICJmYWlsZWQiIDogInRvbyBzaG9ydCIsCiAJCQkJcmV0KTsKIAkJZ290byBlcnJvcjsKIAl9CiAJaWYgKGRlc2MtPmJEZXNjcmlwdG9yVHlwZSAhPSBVU0JfRFRfSVJEQSkgewotCQlkYmcoIiVzIC0gYmFkIGNsYXNzIGRlc2NyaXB0b3IgdHlwZSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBiYWQgY2xhc3MgZGVzY3JpcHRvciB0eXBlIiwgX19mdW5jX18pOwogCQlnb3RvIGVycm9yOwogCX0KIAkKQEAgLTI1MSw3ICsyNDgsNyBAQAogCX0KIAogCWRiZyAoIiVzIC0gQmF1ZCByYXRlcyBzdXBwb3J0ZWQ6JXMlcyVzJXMlcyVzJXMlcyVzIiwKLQkJX19GVU5DVElPTl9fLAorCQlfX2Z1bmNfXywKIAkJKGlyZGFfZGVzYy0+d0JhdWRSYXRlICYgMHgwMDAxKSA/ICIgMjQwMCIgICAgOiAiIiwKIAkJKGlyZGFfZGVzYy0+d0JhdWRSYXRlICYgMHgwMDAyKSA/ICIgOTYwMCIgICAgOiAiIiwKIAkJKGlyZGFfZGVzYy0+d0JhdWRSYXRlICYgMHgwMDA0KSA/ICIgMTkyMDAiICAgOiAiIiwKQEAgLTI4NCwxMyArMjgxLDEzIEBACiAJY2hhciAqYnVmZmVyOwogCWludCByZXN1bHQgPSAwOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmIChidWZmZXJfc2l6ZSkgewogCQkvKiBvdmVycmlkZSB0aGUgZGVmYXVsdCBidWZmZXIgc2l6ZXMgKi8KIAkJYnVmZmVyID0ga21hbGxvYyAoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwogCQlpZiAoIWJ1ZmZlcikgewotCQkJZGV2X2VyciAoJnBvcnQtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeS5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkZXZfZXJyICgmcG9ydC0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5LlxuIiwgX19mdW5jX18pOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJa2ZyZWUgKHBvcnQtPnJlYWRfdXJiLT50cmFuc2Zlcl9idWZmZXIpOwpAQCAtMjk5LDcgKzI5Niw3IEBACiAKIAkJYnVmZmVyID0ga21hbGxvYyAoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwogCQlpZiAoIWJ1ZmZlcikgewotCQkJZGV2X2VyciAoJnBvcnQtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeS5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkZXZfZXJyICgmcG9ydC0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5LlxuIiwgX19mdW5jX18pOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJa2ZyZWUgKHBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyKTsKQEAgLTMxOSwxNCArMzE2LDE0IEBACiAJCXBvcnQpOwogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfS0VSTkVMKTsKIAlpZiAocmVzdWx0KQotCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgdm9pZCBpcl9jbG9zZSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKiBmaWxwKQogewotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJCQkgCiAJLyogc2h1dGRvd24gb3VyIGJ1bGsgcmVhZCAqLwogCXVzYl9raWxsX3VyYihwb3J0LT5yZWFkX3VyYik7CkBAIC0zMzgsMTAgKzMzNSwxMCBAQAogCWludCByZXN1bHQ7CiAJaW50IHRyYW5zZmVyX3NpemU7CiAKLQlkYmcoIiVzIC0gcG9ydCA9ICVkLCBjb3VudCA9ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIGNvdW50KTsKKwlkYmcoIiVzIC0gcG9ydCA9ICVkLCBjb3VudCA9ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlciwgY291bnQpOwogCiAJaWYgKCFwb3J0LT50dHkpIHsKLQkJZGV2X2VyciAoJnBvcnQtPmRldiwgIiVzIC0gbm8gdHR5Pz8/XG4iLCBfX0ZVTkNUSU9OX18pOworCQlkZXZfZXJyICgmcG9ydC0+ZGV2LCAiJXMgLSBubyB0dHk/Pz9cbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0zNTEsNyArMzQ4LDcgQEAKIAlzcGluX2xvY2tfYmgoJnBvcnQtPmxvY2spOwogCWlmIChwb3J0LT53cml0ZV91cmJfYnVzeSkgewogCQlzcGluX3VubG9ja19iaCgmcG9ydC0+bG9jayk7Ci0JCWRiZygiJXMgLSBhbHJlYWR5IHdyaXRpbmciLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gYWxyZWFkeSB3cml0aW5nIiwgX19mdW5jX18pOwogCQlyZXR1cm4gMDsKIAl9CiAJcG9ydC0+d3JpdGVfdXJiX2J1c3kgPSAxOwpAQCAtMzg3LDcgKzM4NCw3IEBACiAJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIgKHBvcnQtPndyaXRlX3VyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlc3VsdCkgewogCQlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7Ci0JCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCX0gZWxzZQogCQlyZXN1bHQgPSB0cmFuc2Zlcl9zaXplOwogCkBAIC0zOTYsMjIgKzM5MywyMiBAQAogCiBzdGF0aWMgdm9pZCBpcl93cml0ZV9idWxrX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMDsKIAlpZiAoc3RhdHVzKSB7CiAJCWRiZygiJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIAogCXVzYl9zZXJpYWxfZGVidWdfZGF0YSAoCiAJCWRlYnVnLAogCQkmcG9ydC0+ZGV2LAotCQlfX0ZVTkNUSU9OX18sCisJCV9fZnVuY19fLAogCQl1cmItPmFjdHVhbF9sZW5ndGgsCiAJCXVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIApAQCAtNDIwLDE2ICs0MTcsMTYgQEAKIAogc3RhdGljIHZvaWQgaXJfcmVhZF9idWxrX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJaW50IHJlc3VsdDsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKCFwb3J0LT5vcGVuX2NvdW50KSB7Ci0JCWRiZygiJXMgLSBwb3J0IGNsb3NlZC4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gcG9ydCBjbG9zZWQuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC00NDcsNyArNDQ0LDcgQEAKIAkJCXVzYl9zZXJpYWxfZGVidWdfZGF0YSAoCiAJCQkJZGVidWcsCiAJCQkJJnBvcnQtPmRldiwKLQkJCQlfX0ZVTkNUSU9OX18sCisJCQkJX19mdW5jX18sCiAJCQkJdXJiLT5hY3R1YWxfbGVuZ3RoLAogCQkJCWRhdGEpOwogCkBAIC00ODAsMTMgKzQ3NywxMyBAQAogCQkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOwogCQkJaWYgKHJlc3VsdCkKIAkJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLAotCQkJCQlfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQkJCV9fZnVuY19fLCByZXN1bHQpOwogCiAJCQlicmVhayA7CiAKIAkJZGVmYXVsdDoKIAkJCWRiZygiJXMgLSBub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJCQlfX0ZVTkNUSU9OX18sIAorCQkJCV9fZnVuY19fLAogCQkJCXN0YXR1cyk7CiAJCQlicmVhayA7CiAKQEAgLTUwMiw3ICs0OTksNyBAQAogCXNwZWVkX3QgYmF1ZDsKIAlpbnQgaXJfYmF1ZDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUocG9ydC0+dHR5KTsKIApAQCAtNTU0LDcgKzU1MSw3IEBACiAKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYiAocG9ydC0+d3JpdGVfdXJiLCBHRlBfS0VSTkVMKTsKIAlpZiAocmVzdWx0KQotCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAogCS8qIE9ubHkgc3BlZWQgY2hhbmdlcyBhcmUgc3VwcG9ydGVkICovCiAJdHR5X3Rlcm1pb3NfY29weV9odyhwb3J0LT50dHktPnRlcm1pb3MsIG9sZF90ZXJtaW9zKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pdXVfcGhvZW5peC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2l1dV9waG9lbml4LmMKaW5kZXggZmRlMTg4ZS4uOGEyMTc2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2l1dV9waG9lbml4LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2l1dV9waG9lbml4LmMKQEAgLTk4LDEwICs5OCwxMCBAQAogCXByaXYtPndyaXRlYnVmID0ga3phbGxvYygyNTYsIEdGUF9LRVJORUwpOwogCWlmICghcHJpdi0+YnVmIHx8ICFwcml2LT5kYmdidWYgfHwgIXByaXYtPndyaXRlYnVmKSB7CiAJCWl1dV9mcmVlX2J1Zihwcml2KTsKLQkJZGJnKCIlcyBwcm9ibGVtIGFsbG9jYXRpb24gYnVmZmVyIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyBwcm9ibGVtIGFsbG9jYXRpb24gYnVmZmVyIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JZGJnKCIlcyAtIFByaXZhdGVzIGJ1ZmZlcnMgYWxsb2NhdGlvbiBzdWNjZXNzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gUHJpdmF0ZXMgYnVmZmVycyBhbGxvY2F0aW9uIHN1Y2Nlc3MiLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwOSw3ICsxMDksNyBAQAogewogCXN0cnVjdCBpdXVfcHJpdmF0ZSAqcHJpdjsKIAlwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGl1dV9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JZGJnKCIlcy0gcHJpdiBhbGxvY2F0aW9uIHN1Y2Nlc3MiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMtIHByaXYgYWxsb2NhdGlvbiBzdWNjZXNzIiwgX19mdW5jX18pOwogCWlmICghcHJpdikKIAkJcmV0dXJuIC1FTk9NRU07CiAJaWYgKGl1dV9hbGxvY19idWYocHJpdikpIHsKQEAgLTEzMCwxNyArMTMwLDE3IEBACiAJaWYgKCFwb3J0KQogCQlyZXR1cm47CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJaWYgKHByaXYpIHsKIAkJaXV1X2ZyZWVfYnVmKHByaXYpOwotCQlkYmcoIiVzIC0gSSB3aWxsIGZyZWUgYWxsIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIEkgd2lsbCBmcmVlIGFsbCIsIF9fZnVuY19fKTsKIAkJdXNiX3NldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQsIE5VTEwpOwogCi0JCWRiZygiJXMgLSBwcml2IGlzIG5vdCBhbnltb3JlIGluIHBvcnQgc3RydWN0dXJlIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHByaXYgaXMgbm90IGFueW1vcmUgaW4gcG9ydCBzdHJ1Y3R1cmUiLCBfX2Z1bmNfXyk7CiAJCWtmcmVlKHByaXYpOwogCi0JCWRiZygiJXMgcHJpdiBpcyBub3cga2ZyZWUiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIHByaXYgaXMgbm93IGtmcmVlIiwgX19mdW5jX18pOwogCX0KIH0KIApAQCAtMTQ4LDIwICsxNDgsMjEgQEAKIAkJCXVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKIHsKIAlzdHJ1Y3QgaXV1X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKLQl0dHkgPSBwb3J0LT50dHk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMgKCVkKSBtc2cgOiBTRVQgPSAweCUwNHgsIENMRUFSID0gMHglMDR4ICIsIF9fRlVOQ1RJT05fXywKKwkvKiBGSVhNRTogbG9ja2luZyBvbiB0aW9tc3RhdHVzICovCisJZGJnKCIlcyAoJWQpIG1zZyA6IFNFVCA9IDB4JTA0eCwgQ0xFQVIgPSAweCUwNHggIiwgX19mdW5jX18sCiAJICAgIHBvcnQtPm51bWJlciwgc2V0LCBjbGVhcik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCWlmIChzZXQgJiBUSU9DTV9SVFMpCiAJCXByaXYtPnRpb3N0YXR1cyA9IFRJT0NNX1JUUzsKIAogCWlmICghKHNldCAmIFRJT0NNX1JUUykgJiYgcHJpdi0+dGlvc3RhdHVzID09IFRJT0NNX1JUUykgewotCQlkYmcoIiVzIFRJT0NNU0VUIFJFU0VUIGNhbGxlZCAhISEiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIFRJT0NNU0VUIFJFU0VUIGNhbGxlZCAhISEiLCBfX2Z1bmNfXyk7CiAJCXByaXYtPnJlc2V0ID0gMTsKLQkJcmV0dXJuIDA7CiAJfQotCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQogCkBAIC0xNzMsMTcgKzE3NCwyNCBAQAogc3RhdGljIGludCBpdXVfdGlvY21nZXQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGl1dV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwotCXJldHVybiBwcml2LT50aW9zdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXJjID0gcHJpdi0+dGlvc3RhdHVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByYzsKIH0KIAogc3RhdGljIHZvaWQgaXV1X3J4Y21kKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlpbnQgcmVzdWx0OwotCWRiZygiJXMgLSBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIGVudGVyIiwgX19mdW5jX18pOwogCiAJaWYgKHVyYi0+c3RhdHVzKSB7Ci0JCWRiZygiJXMgLSB1cmItPnN0YXR1cyA9ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCWRiZygiJXMgLSB1cmItPnN0YXR1cyA9ICVkIiwgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKIAkJLyogZXJyb3Igc3RvcCBhbGwgKi8KIAkJcmV0dXJuOwogCX0KQEAgLTIwMyw3ICsyMTEsNyBAQAogCXN0cnVjdCBpdXVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlpbnQgcmVzdWx0OwogCWNoYXIgKmJ1Zl9wdHIgPSBwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcjsKLQlkYmcoIiVzIC0gZW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSBlbnRlciIsIF9fZnVuY19fKTsKIAogCS8qIFByZXBhcmUgdGhlIHJlc2V0IHNlcXVlbmNlICovCiAKQEAgLTIzMiwxOSArMjQwLDE5IEBACiAgKi8KIHN0YXRpYyB2b2lkIGl1dV91cGRhdGVfc3RhdHVzX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgaXV1X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdTggKnN0OwotCWRiZygiJXMgLSBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIGVudGVyIiwgX19mdW5jX18pOwogCiAJaWYgKHVyYi0+c3RhdHVzKSB7Ci0JCWRiZygiJXMgLSB1cmItPnN0YXR1cyA9ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCWRiZygiJXMgLSB1cmItPnN0YXR1cyA9ICVkIiwgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKIAkJLyogZXJyb3Igc3RvcCBhbGwgKi8KIAkJcmV0dXJuOwogCX0KIAogCXN0ID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7Ci0JZGJnKCIlcyAtIGVudGVyIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gZW50ZXIiLCBfX2Z1bmNfXyk7CiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA9PSAxKSB7CiAJCXN3aXRjaCAoc3RbMF0pIHsKIAkJY2FzZSAweDE6CkBAIC0yNjIsMTEgKzI3MCwxMSBAQAogCiBzdGF0aWMgdm9pZCBpdXVfc3RhdHVzX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlpbnQgcmVzdWx0OwotCWRiZygiJXMgLSBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIGVudGVyIiwgX19mdW5jX18pOwogCi0JZGJnKCIlcyAtIHVyYi0+c3RhdHVzID0gJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwlkYmcoIiVzIC0gdXJiLT5zdGF0dXMgPSAlZCIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CiAJdXNiX2ZpbGxfYnVsa191cmIocG9ydC0+cmVhZF91cmIsIHBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJICB1c2JfcmN2YnVsa3BpcGUocG9ydC0+c2VyaWFsLT5kZXYsCiAJCQkJCSAgcG9ydC0+YnVsa19pbl9lbmRwb2ludEFkZHJlc3MpLApAQCAtMjc5LDcgKzI4Nyw3IEBACiB7CiAJaW50IHJlc3VsdDsKIAotCWRiZygiJXMgLSBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIGVudGVyIiwgX19mdW5jX18pOwogCiAJbWVtc2V0KHBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyLCBJVVVfR0VUX1NUQVRFX1JFR0lTVEVSLCAxKTsKIAl1c2JfZmlsbF9idWxrX3VyYihwb3J0LT53cml0ZV91cmIsIHBvcnQtPnNlcmlhbC0+ZGV2LApAQCAtMjk4LDcgKzMwNiw3IEBACiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAlpbnQgYWN0dWFsID0gMDsKIAotCWRiZygiJXMgLSBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIGVudGVyIiwgX19mdW5jX18pOwogCiAJLyogc2VuZCB0aGUgZGF0YSBvdXQgdGhlIGJ1bGsgcG9ydCAqLwogCkBAIC0zMDksOSArMzE3LDkgQEAKIAkJCSBjb3VudCwgJmFjdHVhbCwgSFogKiAxKTsKIAogCWlmIChzdGF0dXMgIT0gSVVVX09QRVJBVElPTl9PSykgewotCQlkYmcoIiVzIC0gZXJyb3IgPSAlMngiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRiZygiJXMgLSBlcnJvciA9ICUyeCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCX0gZWxzZSB7Ci0JCWRiZygiJXMgLSB3cml0ZSBPSyAhIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHdyaXRlIE9LICEiLCBfX2Z1bmNfXyk7CiAJfQogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0zMjIsNyArMzMwLDcgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCWludCBhY3R1YWwgPSAwOwogCi0JZGJnKCIlcyAtIGVudGVyIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gZW50ZXIiLCBfX2Z1bmNfXyk7CiAKIAkvKiBzZW5kIHRoZSBkYXRhIG91dCB0aGUgYnVsayBwb3J0ICovCiAKQEAgLTMzMyw5ICszNDEsOSBAQAogCQkJIGNvdW50LCAmYWN0dWFsLCBIWiAqIDEpOwogCiAJaWYgKHN0YXR1cyAhPSBJVVVfT1BFUkFUSU9OX09LKSB7Ci0JCWRiZygiJXMgLSBlcnJvciA9ICUyeCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGJnKCIlcyAtIGVycm9yID0gJTJ4IiwgX19mdW5jX18sIHN0YXR1cyk7CiAJfSBlbHNlIHsKLQkJZGJnKCIlcyAtIHJlYWQgT0sgISIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSByZWFkIE9LICEiLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHN0YXR1czsKQEAgLTM1MCw3ICszNTgsNyBAQAogCWlmICghYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWRiZygiJXMgLSBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIGVudGVyIiwgX19mdW5jX18pOwogCiAJYnVmWzBdID0gSVVVX1NFVF9MRUQ7CiAJYnVmWzFdID0gUiAmIDB4RkY7CkBAIC0zNjMsOSArMzcxLDkgQEAKIAlzdGF0dXMgPSBidWxrX2ltbWVkaWF0ZShwb3J0LCBidWYsIDgpOwogCWtmcmVlKGJ1Zik7CiAJaWYgKHN0YXR1cyAhPSBJVVVfT1BFUkFUSU9OX09LKQotCQlkYmcoIiVzIC0gbGVkIGVycm9yIHN0YXR1cyA9ICUyeCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGJnKCIlcyAtIGxlZCBlcnJvciBzdGF0dXMgPSAlMngiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAllbHNlCi0JCWRiZygiJXMgLSBsZWQgT0sgISIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBsZWQgT0sgISIsIF9fZnVuY19fKTsKIAlyZXR1cm4gSVVVX09QRVJBVElPTl9PSzsKIH0KIApAQCAtMzg0LDcgKzM5Miw3IEBACiAKIHN0YXRpYyB2b2lkIGl1dV9sZWRfYWN0aXZpdHlfb24oc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogCWludCByZXN1bHQ7CiAJY2hhciAqYnVmX3B0ciA9IHBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyOwogCSpidWZfcHRyKysgPSBJVVVfU0VUX0xFRDsKQEAgLTQwNSw3ICs0MTMsNyBAQAogCiBzdGF0aWMgdm9pZCBpdXVfbGVkX2FjdGl2aXR5X29mZihzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJaW50IHJlc3VsdDsKIAljaGFyICpidWZfcHRyID0gcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJaWYgKHhtYXMgPT0gMSkgewpAQCAtNDQzLDcgKzQ1MSw3IEBACiAJdW5zaWduZWQgaW50IFAyID0gMDsKIAlpbnQgZnJxID0gKGludClkd0ZycTsKIAotCWRiZygiJXMgLSBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIGVudGVyIiwgX19mdW5jX18pOwogCiAJaWYgKGZycSA9PSAwKSB7CiAJCXByaXYtPmJ1ZltDb3VudCsrXSA9IElVVV9VQVJUX1dSSVRFX0kyQzsKQEAgLTQ1Myw3ICs0NjEsNyBAQAogCiAJCXN0YXR1cyA9IGJ1bGtfaW1tZWRpYXRlKHBvcnQsICh1OCAqKSBwcml2LT5idWYsIENvdW50KTsKIAkJaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCQlkYmcoIiVzIC0gd3JpdGUgZXJyb3IgIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSB3cml0ZSBlcnJvciAiLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gc3RhdHVzOwogCQl9CiAJfSBlbHNlIGlmIChmcnEgPT0gMzU3OTAwMCkgewpAQCAtNTYyLDcgKzU3MCw3IEBACiAKIAlzdGF0dXMgPSBidWxrX2ltbWVkaWF0ZShwb3J0LCAodTggKikgcHJpdi0+YnVmLCBDb3VudCk7CiAJaWYgKHN0YXR1cyAhPSBJVVVfT1BFUkFUSU9OX09LKQotCQlkYmcoIiVzIC0gd3JpdGUgZXJyb3IgIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHdyaXRlIGVycm9yICIsIF9fZnVuY19fKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC01NzMsNyArNTgxLDcgQEAKIAl1OCByeGNtZCA9IElVVV9VQVJUX1JYOwogCXN0cnVjdCBpdXVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAotCWRiZygiJXMgLSBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIGVudGVyIiwgX19mdW5jX18pOwogCiAJaWYgKGl1dV9sZWQocG9ydCwgMHhGMDAwLCAwLCAwLCAweEZGKSA8IDApCiAJCXJldHVybiAtRUlPOwpAQCAtNTgxLDUwICs1ODksNTAgQEAKIAlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAJCXN0YXR1cyA9IGJ1bGtfaW1tZWRpYXRlKHBvcnQsICZyeGNtZCwgMSk7CiAJCWlmIChzdGF0dXMgIT0gSVVVX09QRVJBVElPTl9PSykgewotCQkJZGJnKCIlcyAtIHVhcnRfZmx1c2hfd3JpdGUgZXJyb3IiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHVhcnRfZmx1c2hfd3JpdGUgZXJyb3IiLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gc3RhdHVzOwogCQl9CiAKIAkJc3RhdHVzID0gcmVhZF9pbW1lZGlhdGUocG9ydCwgJnByaXYtPmxlbiwgMSk7CiAJCWlmIChzdGF0dXMgIT0gSVVVX09QRVJBVElPTl9PSykgewotCQkJZGJnKCIlcyAtIHVhcnRfZmx1c2hfcmVhZCBlcnJvciIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gdWFydF9mbHVzaF9yZWFkIGVycm9yIiwgX19mdW5jX18pOwogCQkJcmV0dXJuIHN0YXR1czsKIAkJfQogCiAJCWlmIChwcml2LT5sZW4gPiAwKSB7Ci0JCQlkYmcoIiVzIC0gdWFydF9mbHVzaCBkYXRhbGVuIGlzIDogJWkgIiwgX19GVU5DVElPTl9fLAorCQkJZGJnKCIlcyAtIHVhcnRfZmx1c2ggZGF0YWxlbiBpcyA6ICVpICIsIF9fZnVuY19fLAogCQkJICAgIHByaXYtPmxlbik7CiAJCQlzdGF0dXMgPSByZWFkX2ltbWVkaWF0ZShwb3J0LCBwcml2LT5idWYsIHByaXYtPmxlbik7CiAJCQlpZiAoc3RhdHVzICE9IElVVV9PUEVSQVRJT05fT0spIHsKLQkJCQlkYmcoIiVzIC0gdWFydF9mbHVzaF9yZWFkIGVycm9yIiwgX19GVU5DVElPTl9fKTsKKwkJCQlkYmcoIiVzIC0gdWFydF9mbHVzaF9yZWFkIGVycm9yIiwgX19mdW5jX18pOwogCQkJCXJldHVybiBzdGF0dXM7CiAJCQl9CiAJCX0KIAl9Ci0JZGJnKCIlcyAtIHVhcnRfZmx1c2hfcmVhZCBPSyEiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSB1YXJ0X2ZsdXNoX3JlYWQgT0shIiwgX19mdW5jX18pOwogCWl1dV9sZWQocG9ydCwgMCwgMHhGMDAwLCAwLCAweEZGKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0aWMgdm9pZCByZWFkX2J1Zl9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJdW5zaWduZWQgY2hhciAqZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7Ci0JZGJnKCIlcyAtIHVyYi0+c3RhdHVzID0gJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwlkYmcoIiVzIC0gdXJiLT5zdGF0dXMgPSAlZCIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CiAKIAlpZiAodXJiLT5zdGF0dXMpIHsKLQkJZGJnKCIlcyAtIHVyYi0+c3RhdHVzID0gJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJZGJnKCIlcyAtIHVyYi0+c3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwogCQlpZiAodXJiLT5zdGF0dXMgPT0gLUVQUk9UTykgewogCQkJLyogcmVzY2hlZHVsZSBuZWVkZWQgKi8KIAkJfQogCQlyZXR1cm47CiAJfQogCi0JZGJnKCIlcyAtICVpIGNoYXJzIHRvIHdyaXRlIiwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCWRiZygiJXMgLSAlaSBjaGFycyB0byB3cml0ZSIsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAoZGF0YSA9PSBOVUxMKQotCQlkYmcoIiVzIC0gZGF0YSBpcyBOVUxMICEhISIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBkYXRhIGlzIE5VTEwgISEhIiwgX19mdW5jX18pOwogCWlmICh0dHkgJiYgdXJiLT5hY3R1YWxfbGVuZ3RoICYmIGRhdGEpIHsKIAkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIGRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CkBAIC02MzksNyArNjQ3LDcgQEAKIAlpbnQgcmVzdWx0OwogCWludCBpOwogCWNoYXIgKmJ1Zl9wdHIgPSBwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcjsKLQlkYmcoIiVzIC0gZW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSBlbnRlciIsIF9fZnVuY19fKTsKIAogCSpidWZfcHRyKysgPSBJVVVfVUFSVF9FU0M7CiAJKmJ1Zl9wdHIrKyA9IElVVV9VQVJUX1RYOwpAQCAtNjUyLDcgKzY2MCw3IEBACiAJCQlzcHJpbnRmKHByaXYtPmRiZ2J1ZiArIGkqMiAsCiAJCQkJIiUwMlgiLCBwcml2LT53cml0ZWJ1ZltpXSk7CiAJCXByaXYtPmRiZ2J1Zltwcml2LT53cml0ZWxlbitpKjJdID0gMDsKLQkJZGJnKCIlcyAtIHdyaXRpbmcgJWkgY2hhcnMgOiAlcyIsIF9fRlVOQ1RJT05fXywKKwkJZGJnKCIlcyAtIHdyaXRpbmcgJWkgY2hhcnMgOiAlcyIsIF9fZnVuY19fLAogCQkgICAgcHJpdi0+d3JpdGVsZW4sIHByaXYtPmRiZ2J1Zik7CiAJfQogCXVzYl9maWxsX2J1bGtfdXJiKHBvcnQtPndyaXRlX3VyYiwgcG9ydC0+c2VyaWFsLT5kZXYsCkBAIC02NzEsNyArNjc5LDcgQEAKIHN0YXRpYyBpbnQgaXV1X3JlYWRfYnVmKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGludCBsZW4pCiB7CiAJaW50IHJlc3VsdDsKLQlkYmcoIiVzIC0gZW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSBlbnRlciIsIF9fZnVuY19fKTsKIAogCXVzYl9maWxsX2J1bGtfdXJiKHBvcnQtPnJlYWRfdXJiLCBwb3J0LT5zZXJpYWwtPmRldiwKIAkJCSAgdXNiX3JjdmJ1bGtwaXBlKHBvcnQtPnNlcmlhbC0+ZGV2LApAQCAtNjg0LDcgKzY5Miw3IEBACiAKIHN0YXRpYyB2b2lkIGl1dV91YXJ0X3JlYWRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCBpdXVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAJaW50IHN0YXR1czsKQEAgLTY5MywyMSArNzAxLDIxIEBACiAJdW5zaWduZWQgY2hhciAqZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCXByaXYtPnBvbGwrKzsKIAotCWRiZygiJXMgLSBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIGVudGVyIiwgX19mdW5jX18pOwogCiAJaWYgKHVyYi0+c3RhdHVzKSB7Ci0JCWRiZygiJXMgLSB1cmItPnN0YXR1cyA9ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCWRiZygiJXMgLSB1cmItPnN0YXR1cyA9ICVkIiwgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKIAkJLyogZXJyb3Igc3RvcCBhbGwgKi8KIAkJcmV0dXJuOwogCX0KIAlpZiAoZGF0YSA9PSBOVUxMKQotCQlkYmcoIiVzIC0gZGF0YSBpcyBOVUxMICEhISIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBkYXRhIGlzIE5VTEwgISEhIiwgX19mdW5jX18pOwogCiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA9PSAxICAmJiBkYXRhICE9IE5VTEwpCiAJCWxlbiA9IChpbnQpIGRhdGFbMF07CiAKIAlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID4gMSkgewotCQlkYmcoIiVzIC0gdXJiLT5hY3R1YWxfbGVuZ3RoID0gJWkiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgLSB1cmItPmFjdHVhbF9sZW5ndGggPSAlaSIsIF9fZnVuY19fLAogCQkgICAgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJZXJyb3IgPSAxOwogCQlyZXR1cm47CkBAIC03MTYsNyArNzI0LDcgQEAKIAogCWlmIChsZW4gPiAwICYmIGVycm9yID09IDApIHsKIAkJZGJnKCIlcyAtIGNhbGwgcmVhZCBidWYgLSBsZW4gdG8gcmVhZCBpcyAlaSAiLAotCQkJX19GVU5DVElPTl9fLCBsZW4pOworCQkJX19mdW5jX18sIGxlbik7CiAJCXN0YXR1cyA9IGl1dV9yZWFkX2J1Zihwb3J0LCBsZW4pOwogCQlyZXR1cm47CiAJfQpAQCAtNzQyLDcgKzc1MCw3IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAkvKiBpZiBub3RoaW5nIHRvIHdyaXRlIGNhbGwgYWdhaW4gcnhjbWQgKi8KLQlkYmcoIiVzIC0gcnhjbWQgcmVjYWxsIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gcnhjbWQgcmVjYWxsIiwgX19mdW5jX18pOwogCWl1dV9sZWRfYWN0aXZpdHlfb2ZmKHVyYik7CiAJcmV0dXJuOwogfQpAQCAtNzUyLDcgKzc2MCw3IEBACiB7CiAJc3RydWN0IGl1dV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGludCBmbGFnczsKLQlkYmcoIiVzIC0gZW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSBlbnRlciIsIF9fZnVuY19fKTsKIAogCWlmIChjb3VudCA+IDI1NikKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC03NzMsMTQgKzc4MSwxNCBAQAogCiBzdGF0aWMgdm9pZCByZWFkX3J4Y21kX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlpbnQgcmVzdWx0OwotCWRiZygiJXMgLSBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIGVudGVyIiwgX19mdW5jX18pOwogCi0JZGJnKCIlcyAtIHVyYi0+c3RhdHVzID0gJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwlkYmcoIiVzIC0gdXJiLT5zdGF0dXMgPSAlZCIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CiAKIAlpZiAodXJiLT5zdGF0dXMpIHsKLQkJZGJnKCIlcyAtIHVyYi0+c3RhdHVzID0gJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJZGJnKCIlcyAtIHVyYi0+c3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwogCQkvKiBlcnJvciBzdG9wIGFsbCAqLwogCQlyZXR1cm47CiAJfQpAQCAtNzkxLDcgKzc5OSw3IEBACiAJCQkgIHBvcnQtPnJlYWRfdXJiLT50cmFuc2Zlcl9idWZmZXIsIDI1NiwKIAkJCSAgaXV1X3VhcnRfcmVhZF9jYWxsYmFjaywgcG9ydCk7CiAJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOwotCWRiZygiJXMgLSBzdWJtaXQgcmVzdWx0ID0gJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJZGJnKCIlcyAtIHN1Ym1pdCByZXN1bHQgPSAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogCXJldHVybjsKIH0KIApAQCAtODEyLDEzICs4MjAsMTMgQEAKIAogCXN0YXR1cyA9IGJ1bGtfaW1tZWRpYXRlKHBvcnQsIGJ1ZiwgNCk7CiAJaWYgKHN0YXR1cyAhPSBJVVVfT1BFUkFUSU9OX09LKSB7Ci0JCWRiZygiJXMgLSB1YXJ0X29uIGVycm9yIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHVhcnRfb24gZXJyb3IiLCBfX2Z1bmNfXyk7CiAJCWdvdG8gdWFydF9lbmFibGVfZmFpbGVkOwogCX0KIAkvKiAgaXV1X3Jlc2V0KCkgdGhlIGNhcmQgYWZ0ZXIgaXV1X3VhcnRfb24oKSAqLwogCXN0YXR1cyA9IGl1dV91YXJ0X2ZsdXNoKHBvcnQpOwogCWlmIChzdGF0dXMgIT0gSVVVX09QRVJBVElPTl9PSykKLQkJZGJnKCIlcyAtIHVhcnRfZmx1c2ggZXJyb3IiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gdWFydF9mbHVzaCBlcnJvciIsIF9fZnVuY19fKTsKIHVhcnRfZW5hYmxlX2ZhaWxlZDoKIAlrZnJlZShidWYpOwogCXJldHVybiBzdGF0dXM7CkBAIC04MzYsNyArODQ0LDcgQEAKIAogCXN0YXR1cyA9IGJ1bGtfaW1tZWRpYXRlKHBvcnQsIGJ1ZiwgMSk7CiAJaWYgKHN0YXR1cyAhPSBJVVVfT1BFUkFUSU9OX09LKQotCQlkYmcoIiVzIC0gdWFydF9vZmYgZXJyb3IiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gdWFydF9vZmYgZXJyb3IiLCBfX2Z1bmNfXyk7CiAKIAlrZnJlZShidWYpOwogCXJldHVybiBzdGF0dXM7CkBAIC05MzAsNyArOTM4LDcgQEAKIAogCXN0YXR1cyA9IGJ1bGtfaW1tZWRpYXRlKHBvcnQsIGRhdGFvdXQsIERhdGFDb3VudCk7CiAJaWYgKHN0YXR1cyAhPSBJVVVfT1BFUkFUSU9OX09LKQotCQlkYmcoIiVzIC0gdWFydF9vZmYgZXJyb3IiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gdWFydF9vZmYgZXJyb3IiLCBfX2Z1bmNfXyk7CiAJa2ZyZWUoZGF0YW91dCk7CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTk1Miw3ICs5NjAsNyBAQAogCWlmICghc2VyaWFsKQogCQlyZXR1cm47CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaXV1X3VhcnRfb2ZmKHBvcnQpOwogCWlmIChzZXJpYWwtPmRldikgewpAQCAtOTY5LDcgKzk3Nyw3IEBACiAJCX0KIAkJLyogZnJlZSB3cml0ZWJ1ZiAqLwogCQkvKiBzaHV0ZG93biBvdXIgdXJicyAqLwotCQlkYmcoIiVzIC0gc2h1dHRpbmcgZG93biB1cmJzIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHNodXR0aW5nIGRvd24gdXJicyIsIF9fZnVuY19fKTsKIAkJdXNiX2tpbGxfdXJiKHBvcnQtPndyaXRlX3VyYik7CiAJCXVzYl9raWxsX3VyYihwb3J0LT5yZWFkX3VyYik7CiAJCXVzYl9raWxsX3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiKTsKQEAgLTk5MCw3ICs5OTgsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGl1dV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCi0JZGJnKCIlcyAtICBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSAgcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCXVzYl9jbGVhcl9oYWx0KHNlcmlhbC0+ZGV2LCBwb3J0LT53cml0ZV91cmItPnBpcGUpOwogCXVzYl9jbGVhcl9oYWx0KHNlcmlhbC0+ZGV2LCBwb3J0LT5yZWFkX3VyYi0+cGlwZSk7CiAKQEAgLTExMjcsNyArMTEzNSw3IEBACiAKIAlpdXVfdWFydF9mbHVzaChwb3J0KTsKIAotCWRiZygiJXMgLSBpbml0aWFsaXphdGlvbiBkb25lIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gaW5pdGlhbGl6YXRpb24gZG9uZSIsIF9fZnVuY19fKTsKIAogCW1lbXNldChwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlciwgSVVVX1VBUlRfUlgsIDEpOwogCXVzYl9maWxsX2J1bGtfdXJiKHBvcnQtPndyaXRlX3VyYiwgcG9ydC0+c2VyaWFsLT5kZXYsCkBAIC0xMTM5LDExICsxMTQ3LDExIEBACiAKIAlpZiAocmVzdWx0KSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIgotCQkJIiBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJIiBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCWl1dV9jbG9zZShwb3J0LCBOVUxMKTsKIAkJcmV0dXJuIC1FUFJPVE87CiAJfSBlbHNlIHsKLQkJZGJnKCIlcyAtIHJ4Y21kIE9LIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHJ4Y21kIE9LIiwgX19mdW5jX18pOwogCX0KIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMTE1NCw5ICsxMTYyLDYgQEAKIAkJICAgLm5hbWUgPSAiaXV1X3Bob2VuaXgiLAogCQkgICB9LAogCS5pZF90YWJsZSA9IGlkX3RhYmxlLAotCS5udW1faW50ZXJydXB0X2luID0gTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfaW4gPSAxLAotCS5udW1fYnVsa19vdXQgPSAxLAogCS5udW1fcG9ydHMgPSAxLAogCS5vcGVuID0gaXV1X29wZW4sCiAJLmNsb3NlID0gaXV1X2Nsb3NlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW4uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuLmMKaW5kZXggZWE3YmJhNi4uM2RmOGE2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW4uYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbi5jCkBAIC0yNDQsMTMgKzI0NCwxMyBAQAogCiBzdGF0aWMgdm9pZCBrZXlzcGFuX3J4X3Rocm90dGxlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiB9CiAKIAogc3RhdGljIHZvaWQga2V5c3Bhbl9yeF91bnRocm90dGxlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiB9CiAKIApAQCAtMjU4LDcgKzI1OCw3IEBACiB7CiAJc3RydWN0IGtleXNwYW5fcG9ydF9wcml2YXRlIAkqcF9wcml2OwogCi0gCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworIAlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJcF9wcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCkBAIC0yODAsNyArMjgwLDcgQEAKIAl1bnNpZ25lZCBpbnQgCQkJY2ZsYWc7CiAJc3RydWN0IHR0eV9zdHJ1Y3QJCSp0dHkgPSBwb3J0LT50dHk7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsgCisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCXBfcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlkX2RldGFpbHMgPSBwX3ByaXYtPmRldmljZV9kZXRhaWxzOwpAQCAtMzc3LDcgKzM3Nyw3IEBACiAJfQogCQogCWRiZygiJXMgLSBmb3IgcG9ydCAlZCAoJWQgY2hhcnMpLCBmbGlwPSVkIiwKLQkgICAgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIGNvdW50LCBwX3ByaXYtPm91dF9mbGlwKTsKKwkgICAgX19mdW5jX18sIHBvcnQtPm51bWJlciwgY291bnQsIHBfcHJpdi0+b3V0X2ZsaXApOwogCiAJZm9yIChsZWZ0ID0gY291bnQ7IGxlZnQgPiAwOyBsZWZ0IC09IHRvZG8pIHsKIAkJdG9kbyA9IGxlZnQ7CkBAIC0zODksMTEgKzM4OSwxMSBAQAogCQkvKiBDaGVjayB3ZSBoYXZlIGEgdmFsaWQgdXJiL2VuZHBvaW50IGJlZm9yZSB3ZSB1c2UgaXQuLi4gKi8KIAkJaWYgKCh0aGlzX3VyYiA9IHBfcHJpdi0+b3V0X3VyYnNbZmxpcF0pID09IE5VTEwpIHsKIAkJCS8qIG5vIGJ1bGsgb3V0LCBzbyByZXR1cm4gMCBieXRlcyB3cml0dGVuICovCi0JCQlkYmcoIiVzIC0gbm8gb3V0cHV0IHVyYiA6KCIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gbm8gb3V0cHV0IHVyYiA6KCIsIF9fZnVuY19fKTsKIAkJCXJldHVybiBjb3VudDsKIAkJfQogCi0JCWRiZygiJXMgLSBlbmRwb2ludCAlZCBmbGlwICVkIiwgX19GVU5DVElPTl9fLCB1c2JfcGlwZWVuZHBvaW50KHRoaXNfdXJiLT5waXBlKSwgZmxpcCk7CisJCWRiZygiJXMgLSBlbmRwb2ludCAlZCBmbGlwICVkIiwgX19mdW5jX18sIHVzYl9waXBlZW5kcG9pbnQodGhpc191cmItPnBpcGUpLCBmbGlwKTsKIAogCQlpZiAodGhpc191cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKIAkJCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBwX3ByaXYtPnR4X3N0YXJ0X3RpbWVbZmxpcF0gKyAxMCAqIEhaKSkKQEAgLTQzNSwxNyArNDM1LDE3IEBACiAJdW5zaWduZWQgY2hhciAJCSpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOyAKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIAogCWVuZHBvaW50ID0gdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpOwogCiAJaWYgKHN0YXR1cykgewogCQlkYmcoIiVzIC0gbm9uemVybyBzdGF0dXM6ICV4IG9uIGVuZHBvaW50ICVkLiIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cywgZW5kcG9pbnQpOworCQkgICAgX19mdW5jX18sIHN0YXR1cywgZW5kcG9pbnQpOwogCQlyZXR1cm47CiAJfQogCi0JcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHVyYi0+Y29udGV4dDsKKwlwb3J0ID0gIHVyYi0+Y29udGV4dDsKIAl0dHkgPSBwb3J0LT50dHk7CiAJaWYgKHR0eSAmJiB1cmItPmFjdHVhbF9sZW5ndGgpIHsKIAkJLyogMHg4MCBiaXQgaXMgZXJyb3IgZmxhZyAqLwpAQCAtNDU5LDcgKzQ1OSw3IEBACiAJCQl9CiAJCX0gZWxzZSB7CiAJCQkvKiBzb21lIGJ5dGVzIGhhZCBlcnJvcnMsIGV2ZXJ5IGJ5dGUgaGFzIHN0YXR1cyAqLwotCQkJZGJnKCIlcyAtIFJYIGVycm9yISEhISIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gUlggZXJyb3IhISEhIiwgX19mdW5jX18pOwogCQkJZm9yIChpID0gMDsgaSArIDEgPCB1cmItPmFjdHVhbF9sZW5ndGg7IGkgKz0gMikgewogCQkJCWludCBzdGF0ID0gZGF0YVtpXSwgZmxhZyA9IDA7CiAJCQkJaWYgKHN0YXQgJiBSWEVSUk9SX09WRVJSVU4pCkBAIC00NzksNyArNDc5LDcgQEAKIAl1cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwogCWlmIChwb3J0LT5vcGVuX2NvdW50KQogCQlpZiAoKGVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQykpICE9IDApIHsKLQkJCWRiZygiJXMgLSByZXN1Ym1pdCByZWFkIHVyYiBmYWlsZWQuICglZCkiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQlkYmcoIiVzIC0gcmVzdWJtaXQgcmVhZCB1cmIgZmFpbGVkLiAoJWQpIiwgX19mdW5jX18sIGVycik7CiAJCX0KIAlyZXR1cm47CiB9CkBAIC00OTAsOSArNDkwLDkgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0OwogCXN0cnVjdCBrZXlzcGFuX3BvcnRfcHJpdmF0ZSAqcF9wcml2OwogCi0JcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHVyYi0+Y29udGV4dDsKKwlwb3J0ID0gIHVyYi0+Y29udGV4dDsKIAlwX3ByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Ci0JZGJnICgiJXMgLSB1cmIgJWQiLCBfX0ZVTkNUSU9OX18sIHVyYiA9PSBwX3ByaXYtPm91dF91cmJzWzFdKTsgCisJZGJnICgiJXMgLSB1cmIgJWQiLCBfX2Z1bmNfXywgdXJiID09IHBfcHJpdi0+b3V0X3VyYnNbMV0pOwogCiAJaWYgKHBvcnQtPm9wZW5fY291bnQpCiAJCXVzYl9zZXJpYWxfcG9ydF9zb2Z0aW50KHBvcnQpOwpAQCAtNTAwLDcgKzUwMCw3IEBACiAKIHN0YXRpYyB2b2lkCXVzYTI2X2luYWNrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7IAorCWRiZyAoIiVzIiwgX19mdW5jX18pOwogCQogfQogCkBAIC01MDksMTEgKzUwOSwxMSBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CiAJc3RydWN0IGtleXNwYW5fcG9ydF9wcml2YXRlICpwX3ByaXY7CiAKLQlwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdXJiLT5jb250ZXh0OworCXBvcnQgPSAgdXJiLT5jb250ZXh0OwogCXBfcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAogCWlmIChwX3ByaXYtPnJlc2VuZF9jb250KSB7Ci0JCWRiZyAoIiVzIC0gc2VuZGluZyBzZXR1cCIsIF9fRlVOQ1RJT05fXyk7IAorCQlkYmcgKCIlcyAtIHNlbmRpbmcgc2V0dXAiLCBfX2Z1bmNfXyk7CiAJCWtleXNwYW5fdXNhMjZfc2VuZF9zZXR1cChwb3J0LT5zZXJpYWwsIHBvcnQsIHBfcHJpdi0+cmVzZW5kX2NvbnQgLSAxKTsKIAl9CiB9CkBAIC01MjgsMTQgKzUyOCwxNCBAQAogCWludCBvbGRfZGNkX3N0YXRlLCBlcnI7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0Jc2VyaWFsID0gKHN0cnVjdCB1c2Jfc2VyaWFsICopIHVyYi0+Y29udGV4dDsKKwlzZXJpYWwgPSAgdXJiLT5jb250ZXh0OwogCiAJaWYgKHN0YXR1cykgewotCQlkYmcoIiVzIC0gbm9uemVybyBzdGF0dXM6ICV4IiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkYmcoIiVzIC0gbm9uemVybyBzdGF0dXM6ICV4IiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCAhPSA5KSB7Ci0JCWRiZygiJXMgLSAlZCBieXRlIHJlcG9ydD8/IiwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQlkYmcoIiVzIC0gJWQgYnl0ZSByZXBvcnQ/PyIsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC01NDMsNyArNTQzLDcgQEAKIAogI2lmIDAKIAlkYmcoIiVzIC0gcG9ydCBzdGF0dXM6IHBvcnQgJWQgY3RzICVkIGRjZCAlZCBkc3IgJWQgcmkgJWQgdG9mZiAlZCB0eG9mZiAlZCByeGVuICVkIGNyICVkIiwKLQkgICAgX19GVU5DVElPTl9fLCBtc2ctPnBvcnQsIG1zZy0+aHNraWFfY3RzLCBtc2ctPmdwaWFfZGNkLCBtc2ctPmRzciwgbXNnLT5yaSwgbXNnLT5fdHhPZmYsCisJICAgIF9fZnVuY19fLCBtc2ctPnBvcnQsIG1zZy0+aHNraWFfY3RzLCBtc2ctPmdwaWFfZGNkLCBtc2ctPmRzciwgbXNnLT5yaSwgbXNnLT5fdHhPZmYsCiAJICAgIG1zZy0+X3R4WG9mZiwgbXNnLT5yeEVuYWJsZWQsIG1zZy0+Y29udHJvbFJlc3BvbnNlKTsKICNlbmRpZgogCkBAIC01NTIsNyArNTUyLDcgQEAKIAogCS8qIENoZWNrIHBvcnQgbnVtYmVyIGZyb20gbWVzc2FnZSBhbmQgcmV0cmlldmUgcHJpdmF0ZSBkYXRhICovCQogCWlmIChtc2ctPnBvcnQgPj0gc2VyaWFsLT5udW1fcG9ydHMpIHsKLQkJZGJnICgiJXMgLSBVbmV4cGVjdGVkIHBvcnQgbnVtYmVyICVkIiwgX19GVU5DVElPTl9fLCBtc2ctPnBvcnQpOworCQlkYmcgKCIlcyAtIFVuZXhwZWN0ZWQgcG9ydCBudW1iZXIgJWQiLCBfX2Z1bmNfXywgbXNnLT5wb3J0KTsKIAkJZ290byBleGl0OwogCX0KIAlwb3J0ID0gc2VyaWFsLT5wb3J0W21zZy0+cG9ydF07CkBAIC01NzYsMTQgKzU3NiwxNCBAQAogCS8qIFJlc3VibWl0IHVyYiBzbyB3ZSBjb250aW51ZSByZWNlaXZpbmcgKi8KIAl1cmItPmRldiA9IHNlcmlhbC0+ZGV2OwogCWlmICgoZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKSkgIT0gMCkgewotCQlkYmcoIiVzIC0gcmVzdWJtaXQgcmVhZCB1cmIgZmFpbGVkLiAoJWQpIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQlkYmcoIiVzIC0gcmVzdWJtaXQgcmVhZCB1cmIgZmFpbGVkLiAoJWQpIiwgX19mdW5jX18sIGVycik7CiAJfQogZXhpdDogOwogfQogCiBzdGF0aWMgdm9pZAl1c2EyNl9nbG9jb250X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnICgiJXMiLCBfX2Z1bmNfXyk7CiAJCiB9CiAKQEAgLTU5Nyw5ICs1OTcsOSBAQAogCXN0cnVjdCBrZXlzcGFuX3BvcnRfcHJpdmF0ZSAgICAgICAgICAgICAqcF9wcml2OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIAotCXBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKSB1cmItPmNvbnRleHQ7CisJcG9ydCA9ICB1cmItPmNvbnRleHQ7CiAJcF9wcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIApAQCAtNjA5LDExICs2MDksMTEgQEAKIAlkbyB7CiAJCWlmIChzdGF0dXMpIHsKIAkJCWRiZygiJXMgLSBub256ZXJvIHN0YXR1czogJXggb24gZW5kcG9pbnQgJWQuIiwKLQkJCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cywgdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpKTsKKwkJCSAgICBfX2Z1bmNfXywgc3RhdHVzLCB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSkpOwogCQkJcmV0dXJuOwogCQl9CiAKLQkJcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHVyYi0+Y29udGV4dDsKKwkJcG9ydCA9ICB1cmItPmNvbnRleHQ7CiAJCXBfcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAkJZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCkBAIC02MjksNyArNjI5LDcgQEAKIAkJdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAkJaWYgKHBvcnQtPm9wZW5fY291bnQpCiAJCQlpZiAoKGVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQykpICE9IDApIHsKLQkJCQlkYmcoIiVzIC0gcmVzdWJtaXQgcmVhZCB1cmIgZmFpbGVkLiAoJWQpIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQkJCWRiZygiJXMgLSByZXN1Ym1pdCByZWFkIHVyYiBmYWlsZWQuICglZCkiLCBfX2Z1bmNfXywgZXJyKTsKIAkJCX0KIAkJcF9wcml2LT5pbl9mbGlwIF49IDE7CiAKQEAgLTYzOSw3ICs2MzksNyBAQAogCiBzdGF0aWMgdm9pZAl1c2EyOF9pbmFja19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0JZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZyAoIiVzIiwgX19mdW5jX18pOwogfQogCiBzdGF0aWMgdm9pZAl1c2EyOF9vdXRjb250X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKQEAgLTY0NywxMSArNjQ3LDExIEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKIAlzdHJ1Y3Qga2V5c3Bhbl9wb3J0X3ByaXZhdGUgKnBfcHJpdjsKIAotCXBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKSB1cmItPmNvbnRleHQ7CisJcG9ydCA9ICB1cmItPmNvbnRleHQ7CiAJcF9wcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCiAJaWYgKHBfcHJpdi0+cmVzZW5kX2NvbnQpIHsKLQkJZGJnICgiJXMgLSBzZW5kaW5nIHNldHVwIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnICgiJXMgLSBzZW5kaW5nIHNldHVwIiwgX19mdW5jX18pOwogCQlrZXlzcGFuX3VzYTI4X3NlbmRfc2V0dXAocG9ydC0+c2VyaWFsLCBwb3J0LCBwX3ByaXYtPnJlc2VuZF9jb250IC0gMSk7CiAJfQogfQpAQCAtNjY3LDE5ICs2NjcsMTkgQEAKIAlpbnQgb2xkX2RjZF9zdGF0ZTsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlzZXJpYWwgPSAoc3RydWN0IHVzYl9zZXJpYWwgKikgdXJiLT5jb250ZXh0OworCXNlcmlhbCA9ICB1cmItPmNvbnRleHQ7CiAKIAlpZiAoc3RhdHVzKSB7Ci0JCWRiZygiJXMgLSBub256ZXJvIHN0YXR1czogJXgiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRiZygiJXMgLSBub256ZXJvIHN0YXR1czogJXgiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmICh1cmItPmFjdHVhbF9sZW5ndGggIT0gc2l6ZW9mKHN0cnVjdCBrZXlzcGFuX3VzYTI4X3BvcnRTdGF0dXNNZXNzYWdlKSkgewotCQlkYmcoIiVzIC0gYmFkIGxlbmd0aCAlZCIsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJZGJnKCIlcyAtIGJhZCBsZW5ndGggJWQiLCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJZ290byBleGl0OwogCX0KIAotCS8qZGJnKCIlcyAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCIsIF9fRlVOQ1RJT05fXworCS8qZGJnKCIlcyAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCIsIF9fZnVuY19fCiAJICAgIGRhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0sIGRhdGFbM10sIGRhdGFbNF0sIGRhdGFbNV0sCiAJICAgIGRhdGFbNl0sIGRhdGFbN10sIGRhdGFbOF0sIGRhdGFbOV0sIGRhdGFbMTBdLCBkYXRhWzExXSk7Ki8KIAkKQEAgLTY4OSw3ICs2ODksNyBAQAogCiAJCS8qIENoZWNrIHBvcnQgbnVtYmVyIGZyb20gbWVzc2FnZSBhbmQgcmV0cmlldmUgcHJpdmF0ZSBkYXRhICovCQogCWlmIChtc2ctPnBvcnQgPj0gc2VyaWFsLT5udW1fcG9ydHMpIHsKLQkJZGJnICgiJXMgLSBVbmV4cGVjdGVkIHBvcnQgbnVtYmVyICVkIiwgX19GVU5DVElPTl9fLCBtc2ctPnBvcnQpOworCQlkYmcgKCIlcyAtIFVuZXhwZWN0ZWQgcG9ydCBudW1iZXIgJWQiLCBfX2Z1bmNfXywgbXNnLT5wb3J0KTsKIAkJZ290byBleGl0OwogCX0KIAlwb3J0ID0gc2VyaWFsLT5wb3J0W21zZy0+cG9ydF07CkBAIC03MTMsMTQgKzcxMywxNCBAQAogCQkvKiBSZXN1Ym1pdCB1cmIgc28gd2UgY29udGludWUgcmVjZWl2aW5nICovCiAJdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKIAlpZiAoKGVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQykpICE9IDApIHsKLQkJZGJnKCIlcyAtIHJlc3VibWl0IHJlYWQgdXJiIGZhaWxlZC4gKCVkKSIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJZGJnKCIlcyAtIHJlc3VibWl0IHJlYWQgdXJiIGZhaWxlZC4gKCVkKSIsIF9fZnVuY19fLCBlcnIpOwogCX0KIGV4aXQ6IDsKIH0KIAogc3RhdGljIHZvaWQJdXNhMjhfZ2xvY29udF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0JZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZyAoIiVzIiwgX19mdW5jX18pOwogfQogCiAKQEAgLTczMSwxNSArNzMxLDE1IEBACiAJc3RydWN0IGtleXNwYW5fcG9ydF9wcml2YXRlICpwX3ByaXY7CiAJaW50IGk7CiAKLQlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnICgiJXMiLCBfX2Z1bmNfXyk7CiAKLQlzZXJpYWwgPSAoc3RydWN0IHVzYl9zZXJpYWwgKikgdXJiLT5jb250ZXh0OworCXNlcmlhbCA9ICB1cmItPmNvbnRleHQ7CiAJZm9yIChpID0gMDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKIAkJcG9ydCA9IHNlcmlhbC0+cG9ydFtpXTsKIAkJcF9wcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCiAJCWlmIChwX3ByaXYtPnJlc2VuZF9jb250KSB7Ci0JCQlkYmcgKCIlcyAtIHNlbmRpbmcgc2V0dXAiLCBfX0ZVTkNUSU9OX18pOyAKKwkJCWRiZyAoIiVzIC0gc2VuZGluZyBzZXR1cCIsIF9fZnVuY19fKTsKIAkJCWtleXNwYW5fdXNhNDlfc2VuZF9zZXR1cChzZXJpYWwsIHBvcnQsIHBfcHJpdi0+cmVzZW5kX2NvbnQgLSAxKTsKIAkJCWJyZWFrOwogCQl9CkBAIC03NTksMjEgKzc1OSwyMSBAQAogCWludCBvbGRfZGNkX3N0YXRlOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIAotCXNlcmlhbCA9IChzdHJ1Y3QgdXNiX3NlcmlhbCAqKSB1cmItPmNvbnRleHQ7CisJc2VyaWFsID0gIHVyYi0+Y29udGV4dDsKIAogCWlmIChzdGF0dXMpIHsKLQkJZGJnKCIlcyAtIG5vbnplcm8gc3RhdHVzOiAleCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGJnKCIlcyAtIG5vbnplcm8gc3RhdHVzOiAleCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCAhPSBzaXplb2Yoc3RydWN0IGtleXNwYW5fdXNhNDlfcG9ydFN0YXR1c01lc3NhZ2UpKSB7Ci0JCWRiZygiJXMgLSBiYWQgbGVuZ3RoICVkIiwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQlkYmcoIiVzIC0gYmFkIGxlbmd0aCAlZCIsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQlnb3RvIGV4aXQ7CiAJfQogCi0JLypkYmcoIiAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCIsIF9fRlVOQ1RJT05fXywgCisJLypkYmcoIiAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCIsIF9fZnVuY19fLAogCSAgICBkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzNdLCBkYXRhWzRdLCBkYXRhWzVdLAogCSAgICBkYXRhWzZdLCBkYXRhWzddLCBkYXRhWzhdLCBkYXRhWzldLCBkYXRhWzEwXSk7Ki8KIAkKQEAgLTc4Miw3ICs3ODIsNyBAQAogCiAJCS8qIENoZWNrIHBvcnQgbnVtYmVyIGZyb20gbWVzc2FnZSBhbmQgcmV0cmlldmUgcHJpdmF0ZSBkYXRhICovCQogCWlmIChtc2ctPnBvcnROdW1iZXIgPj0gc2VyaWFsLT5udW1fcG9ydHMpIHsKLQkJZGJnICgiJXMgLSBVbmV4cGVjdGVkIHBvcnQgbnVtYmVyICVkIiwgX19GVU5DVElPTl9fLCBtc2ctPnBvcnROdW1iZXIpOworCQlkYmcgKCIlcyAtIFVuZXhwZWN0ZWQgcG9ydCBudW1iZXIgJWQiLCBfX2Z1bmNfXywgbXNnLT5wb3J0TnVtYmVyKTsKIAkJZ290byBleGl0OwogCX0KIAlwb3J0ID0gc2VyaWFsLT5wb3J0W21zZy0+cG9ydE51bWJlcl07CkBAIC04MDcsMTQgKzgwNywxNCBAQAogCXVyYi0+ZGV2ID0gc2VyaWFsLT5kZXY7CiAKIAlpZiAoKGVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQykpICE9IDApIHsKLQkJZGJnKCIlcyAtIHJlc3VibWl0IHJlYWQgdXJiIGZhaWxlZC4gKCVkKSIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJZGJnKCIlcyAtIHJlc3VibWl0IHJlYWQgdXJiIGZhaWxlZC4gKCVkKSIsIF9fZnVuY19fLCBlcnIpOwogCX0KIGV4aXQ6CTsKIH0KIAogc3RhdGljIHZvaWQJdXNhNDlfaW5hY2tfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIH0KIAogc3RhdGljIHZvaWQJdXNhNDlfaW5kYXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQpAQCAtODI2LDE3ICs4MjYsMTcgQEAKIAl1bnNpZ25lZCBjaGFyIAkJKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnICgiJXMiLCBfX2Z1bmNfXyk7CiAKIAllbmRwb2ludCA9IHVzYl9waXBlZW5kcG9pbnQodXJiLT5waXBlKTsKIAogCWlmIChzdGF0dXMpIHsKLQkJZGJnKCIlcyAtIG5vbnplcm8gc3RhdHVzOiAleCBvbiBlbmRwb2ludCAlZC4iLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgLSBub256ZXJvIHN0YXR1czogJXggb24gZW5kcG9pbnQgJWQuIiwgX19mdW5jX18sCiAJCSAgICBzdGF0dXMsIGVuZHBvaW50KTsKIAkJcmV0dXJuOwogCX0KIAotCXBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKSB1cmItPmNvbnRleHQ7CisJcG9ydCA9ICB1cmItPmNvbnRleHQ7CiAJdHR5ID0gcG9ydC0+dHR5OwogCWlmICh0dHkgJiYgdXJiLT5hY3R1YWxfbGVuZ3RoKSB7CiAJCS8qIDB4ODAgYml0IGlzIGVycm9yIGZsYWcgKi8KQEAgLTg2Niw3ICs4NjYsNyBAQAogCXVyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAJaWYgKHBvcnQtPm9wZW5fY291bnQpCiAJCWlmICgoZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKSkgIT0gMCkgewotCQkJZGJnKCIlcyAtIHJlc3VibWl0IHJlYWQgdXJiIGZhaWxlZC4gKCVkKSIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJCWRiZygiJXMgLSByZXN1Ym1pdCByZWFkIHVyYiBmYWlsZWQuICglZCkiLCBfX2Z1bmNfXywgZXJyKTsKIAkJfQogfQogCkBAIC04NzksMTIgKzg3OSwxMiBAQAogCXVuc2lnbmVkIGNoYXIgCQkqZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIAogCXNlcmlhbCA9IHVyYi0+Y29udGV4dDsKIAogCWlmIChzdGF0dXMpIHsKLQkJZGJnKCIlcyAtIG5vbnplcm8gc3RhdHVzOiAleCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGJnKCIlcyAtIG5vbnplcm8gc3RhdHVzOiAleCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCkBAIC04OTgsNyArODk4LDcgQEAKIAkJCS8qIENoZWNrIHBvcnQgbnVtYmVyIGZyb20gbWVzc2FnZSovCiAJCQlpZiAoZGF0YVtpXSA+PSBzZXJpYWwtPm51bV9wb3J0cykgewogCQkJCWRiZyAoIiVzIC0gVW5leHBlY3RlZCBwb3J0IG51bWJlciAlZCIsCi0JCQkJCV9fRlVOQ1RJT05fXywgZGF0YVtpXSk7CisJCQkJCV9fZnVuY19fLCBkYXRhW2ldKTsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCQlwb3J0ID0gc2VyaWFsLT5wb3J0W2RhdGFbaSsrXV07CkBAIC05NDQsMTMgKzk0NCwxMyBAQAogCiAJZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAoZXJyICE9IDApCi0JCWRiZygiJXMgLSByZXN1Ym1pdCByZWFkIHVyYiBmYWlsZWQuICglZCkiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCWRiZygiJXMgLSByZXN1Ym1pdCByZWFkIHVyYiBmYWlsZWQuICglZCkiLCBfX2Z1bmNfXywgZXJyKTsKIH0KIAogLyogbm90IHVzZWQsIHVzYS00OSBkb2Vzbid0IGhhdmUgcGVyLXBvcnQgY29udHJvbCBlbmRwb2ludHMgKi8KIHN0YXRpYyB2b2lkIHVzYTQ5X291dGNvbnRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIH0KIAogc3RhdGljIHZvaWQgdXNhOTBfaW5kYXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQpAQCAtOTYzLDE3ICs5NjMsMTcgQEAKIAl1bnNpZ25lZCBjaGFyIAkJKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7IAorCWRiZyAoIiVzIiwgX19mdW5jX18pOwogCiAJZW5kcG9pbnQgPSB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSk7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCWRiZygiJXMgLSBub256ZXJvIHN0YXR1czogJXggb24gZW5kcG9pbnQgJWQuIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzLCBlbmRwb2ludCk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzLCBlbmRwb2ludCk7CiAJCXJldHVybjsKIAl9CiAKLQlwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdXJiLT5jb250ZXh0OworCXBvcnQgPSAgdXJiLT5jb250ZXh0OwogCXBfcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAogCXR0eSA9IHBvcnQtPnR0eTsKQEAgLTEwMDAsNyArMTAwMCw3IEBACiAJCQl9IAogCQkJZWxzZSB7CiAJCQkvKiBzb21lIGJ5dGVzIGhhZCBlcnJvcnMsIGV2ZXJ5IGJ5dGUgaGFzIHN0YXR1cyAqLwotCQkJCWRiZygiJXMgLSBSWCBlcnJvciEhISEiLCBfX0ZVTkNUSU9OX18pOworCQkJCWRiZygiJXMgLSBSWCBlcnJvciEhISEiLCBfX2Z1bmNfXyk7CiAJCQkJZm9yIChpID0gMDsgaSArIDEgPCB1cmItPmFjdHVhbF9sZW5ndGg7IGkgKz0gMikgewogCQkJCQlpbnQgc3RhdCA9IGRhdGFbaV0sIGZsYWcgPSAwOwogCQkJCQlpZiAoc3RhdCAmIFJYRVJST1JfT1ZFUlJVTikKQEAgLTEwMjEsNyArMTAyMSw3IEBACiAJdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAlpZiAocG9ydC0+b3Blbl9jb3VudCkKIAkJaWYgKChlcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpKSAhPSAwKSB7Ci0JCQlkYmcoIiVzIC0gcmVzdWJtaXQgcmVhZCB1cmIgZmFpbGVkLiAoJWQpIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQkJZGJnKCIlcyAtIHJlc3VibWl0IHJlYWQgdXJiIGZhaWxlZC4gKCVkKSIsIF9fZnVuY19fLCBlcnIpOwogCQl9CiAJcmV0dXJuOwogfQpAQCAtMTAzNywxNCArMTAzNywxNCBAQAogCWludCBvbGRfZGNkX3N0YXRlLCBlcnI7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0Jc2VyaWFsID0gKHN0cnVjdCB1c2Jfc2VyaWFsICopIHVyYi0+Y29udGV4dDsKKwlzZXJpYWwgPSAgdXJiLT5jb250ZXh0OwogCiAJaWYgKHN0YXR1cykgewotCQlkYmcoIiVzIC0gbm9uemVybyBzdGF0dXM6ICV4IiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkYmcoIiVzIC0gbm9uemVybyBzdGF0dXM6ICV4IiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA8IDE0KSB7Ci0JCWRiZygiJXMgLSAlZCBieXRlIHJlcG9ydD8/IiwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQlkYmcoIiVzIC0gJWQgYnl0ZSByZXBvcnQ/PyIsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0xMDczLDcgKzEwNzMsNyBAQAogCS8qIFJlc3VibWl0IHVyYiBzbyB3ZSBjb250aW51ZSByZWNlaXZpbmcgKi8KIAl1cmItPmRldiA9IHNlcmlhbC0+ZGV2OwogCWlmICgoZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKSkgIT0gMCkgewotCQlkYmcoIiVzIC0gcmVzdWJtaXQgcmVhZCB1cmIgZmFpbGVkLiAoJWQpIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQlkYmcoIiVzIC0gcmVzdWJtaXQgcmVhZCB1cmIgZmFpbGVkLiAoJWQpIiwgX19mdW5jX18sIGVycik7CiAJfQogZXhpdDoKIAk7CkBAIC0xMDg0LDExICsxMDg0LDExIEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKIAlzdHJ1Y3Qga2V5c3Bhbl9wb3J0X3ByaXZhdGUgKnBfcHJpdjsKIAotCXBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKSB1cmItPmNvbnRleHQ7CisJcG9ydCA9ICB1cmItPmNvbnRleHQ7CiAJcF9wcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCiAJaWYgKHBfcHJpdi0+cmVzZW5kX2NvbnQpIHsKLQkJZGJnICgiJXMgLSBzZW5kaW5nIHNldHVwIiwgX19GVU5DVElPTl9fKTsgCisJCWRiZyAoIiVzIC0gc2VuZGluZyBzZXR1cCIsIF9fZnVuY19fKTsKIAkJa2V5c3Bhbl91c2E5MF9zZW5kX3NldHVwKHBvcnQtPnNlcmlhbCwgcG9ydCwgcF9wcml2LT5yZXNlbmRfY29udCAtIDEpOwogCX0KIH0KQEAgLTExMDUsMTcgKzExMDUsMTcgQEAKIAlpbnQgb2xkX2RjZF9zdGF0ZTsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnICgiJXMiLCBfX2Z1bmNfXyk7CiAKIAlzZXJpYWwgPSB1cmItPmNvbnRleHQ7CiAKIAlpZiAoc3RhdHVzKSB7Ci0JCWRiZygiJXMgLSBub256ZXJvIHN0YXR1czogJXgiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRiZygiJXMgLSBub256ZXJvIHN0YXR1czogJXgiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmICh1cmItPmFjdHVhbF9sZW5ndGggIT0gc2l6ZW9mKHN0cnVjdCBrZXlzcGFuX3VzYTY3X3BvcnRTdGF0dXNNZXNzYWdlKSkgewotCQlkYmcoIiVzIC0gYmFkIGxlbmd0aCAlZCIsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJZGJnKCIlcyAtIGJhZCBsZW5ndGggJWQiLCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTEyNSw3ICsxMTI1LDcgQEAKIAogCS8qIENoZWNrIHBvcnQgbnVtYmVyIGZyb20gbWVzc2FnZSBhbmQgcmV0cmlldmUgcHJpdmF0ZSBkYXRhICovCiAJaWYgKG1zZy0+cG9ydCA+PSBzZXJpYWwtPm51bV9wb3J0cykgewotCQlkYmcgKCIlcyAtIFVuZXhwZWN0ZWQgcG9ydCBudW1iZXIgJWQiLCBfX0ZVTkNUSU9OX18sIG1zZy0+cG9ydCk7CisJCWRiZyAoIiVzIC0gVW5leHBlY3RlZCBwb3J0IG51bWJlciAlZCIsIF9fZnVuY19fLCBtc2ctPnBvcnQpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMTQ5LDcgKzExNDksNyBAQAogCXVyYi0+ZGV2ID0gc2VyaWFsLT5kZXY7CiAJZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAoZXJyICE9IDApCi0JCWRiZygiJXMgLSByZXN1Ym1pdCByZWFkIHVyYiBmYWlsZWQuICglZCkiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCWRiZygiJXMgLSByZXN1Ym1pdCByZWFkIHVyYiBmYWlsZWQuICglZCkiLCBfX2Z1bmNfXywgZXJyKTsKIH0KIAogc3RhdGljIHZvaWQgdXNhNjdfZ2xvY29udF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCkBAIC0xMTU5LDcgKzExNTksNyBAQAogCXN0cnVjdCBrZXlzcGFuX3BvcnRfcHJpdmF0ZSAqcF9wcml2OwogCWludCBpOwogCi0JZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZyAoIiVzIiwgX19mdW5jX18pOwogCiAJc2VyaWFsID0gdXJiLT5jb250ZXh0OwogCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgKytpKSB7CkBAIC0xMTY3LDcgKzExNjcsNyBAQAogCQlwX3ByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKIAkJaWYgKHBfcHJpdi0+cmVzZW5kX2NvbnQpIHsKLQkJCWRiZyAoIiVzIC0gc2VuZGluZyBzZXR1cCIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcgKCIlcyAtIHNlbmRpbmcgc2V0dXAiLCBfX2Z1bmNfXyk7CiAJCQlrZXlzcGFuX3VzYTY3X3NlbmRfc2V0dXAoc2VyaWFsLCBwb3J0LAogCQkJCQkJcF9wcml2LT5yZXNlbmRfY29udCAtIDEpOwogCQkJYnJlYWs7CkBAIC0xMTgzLDEwICsxMTgzLDExIEBACiAJaW50CQkJCWRhdGFfbGVuOwogCXN0cnVjdCB1cmIJCQkqdGhpc191cmI7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCXBfcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlkX2RldGFpbHMgPSBwX3ByaXYtPmRldmljZV9kZXRhaWxzOwogCisJLyogRklYTUU6IGxvY2tpbmcgKi8KIAlpZiAoZF9kZXRhaWxzLT5tc2dfZm9ybWF0ID09IG1zZ191c2E5MCkKICAgIAkJZGF0YV9sZW4gPSA2NDsKIAllbHNlCkBAIC0xMjAzLDEzICsxMjA0LDEzIEBACiAJCQlpZiAodGhpc191cmItPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MpCiAJCQkJcmV0dXJuIChkYXRhX2xlbik7CiAJfQotCXJldHVybiAoMCk7CisJcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIGludCBrZXlzcGFuX2NoYXJzX2luX2J1ZmZlciAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKLQlyZXR1cm4gKDApOworCXJldHVybiAwOwogfQogCiAKQEAgLTEyMjgsNyArMTIyOSw3IEBACiAJcF9wcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWRfZGV0YWlscyA9IHBfcHJpdi0+ZGV2aWNlX2RldGFpbHM7CiAKLQlkYmcoIiVzIC0gcG9ydCVkLiIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCVkLiIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyogU2V0IHNvbWUgc2FuZSBkZWZhdWx0cyAqLwogCXBfcHJpdi0+cnRzX3N0YXRlID0gMTsKQEAgLTEyNTMsNyArMTI1NCw3IEBACiAJCXVzYl9jbGVhcl9oYWx0KHVyYi0+ZGV2LCB1cmItPnBpcGUpOwogCiAJCWlmICgoZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfS0VSTkVMKSkgIT0gMCkgewotCQkJZGJnKCIlcyAtIHN1Ym1pdCB1cmIgJWQgZmFpbGVkICglZCkiLCBfX0ZVTkNUSU9OX18sIGksIGVycik7CisJCQlkYmcoIiVzIC0gc3VibWl0IHVyYiAlZCBmYWlsZWQgKCVkKSIsIF9fZnVuY19fLCBpLCBlcnIpOwogCQl9CiAJfQogCkBAIC0xMjg5LDcgKzEyOTAsNyBAQAogCS8vbWRlbGF5KDEwMCk7CiAJLy9rZXlzcGFuX3NldF90ZXJtaW9zKHBvcnQsIE5VTEwpOwogCi0JcmV0dXJuICgwKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHN0b3BfdXJiKHN0cnVjdCB1cmIgKnVyYikKQEAgLTEzMDUsNyArMTMwNiw3IEBACiAJc3RydWN0IGtleXNwYW5fc2VyaWFsX3ByaXZhdGUgCSpzX3ByaXY7CiAJc3RydWN0IGtleXNwYW5fcG9ydF9wcml2YXRlIAkqcF9wcml2OwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAlzX3ByaXYgPSB1c2JfZ2V0X3NlcmlhbF9kYXRhKHNlcmlhbCk7CiAJcF9wcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCQpAQCAtMTMyMCw3ICsxMzIxLDcgQEAKIAl9CiAKIAkvKndoaWxlIChwX3ByaXYtPm91dGNvbnRfdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSB7Ci0JCWRiZygiJXMgLSB1cmIgaW4gcHJvZ3Jlc3MiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gdXJiIGluIHByb2dyZXNzIiwgX19mdW5jX18pOwogCX0qLwogCiAJcF9wcml2LT5vdXRfZmxpcCA9IDA7CkBAIC0xNDg0LDEwICsxNDg1LDEwIEBACiAJaWYgKGVuZHBvaW50ID09IC0xKQogCQlyZXR1cm4gTlVMTDsJCS8qIGVuZHBvaW50IG5vdCBuZWVkZWQgKi8KIAotCWRiZyAoIiVzIC0gYWxsb2MgZm9yIGVuZHBvaW50ICVkLiIsIF9fRlVOQ1RJT05fXywgZW5kcG9pbnQpOworCWRiZyAoIiVzIC0gYWxsb2MgZm9yIGVuZHBvaW50ICVkLiIsIF9fZnVuY19fLCBlbmRwb2ludCk7CiAJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsJCS8qIE5vIElTTyAqLwogCWlmICh1cmIgPT0gTlVMTCkgewotCQlkYmcgKCIlcyAtIGFsbG9jIGZvciBlbmRwb2ludCAlZCBmYWlsZWQuIiwgX19GVU5DVElPTl9fLCBlbmRwb2ludCk7CisJCWRiZyAoIiVzIC0gYWxsb2MgZm9yIGVuZHBvaW50ICVkIGZhaWxlZC4iLCBfX2Z1bmNfXywgZW5kcG9pbnQpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTE1ODgsNyArMTU4OSw3IEBACiAJc3RydWN0IGNhbGxiYWNrcwkJKmNiYWNrOwogCWludAkJCQllbmRwOwogCi0JZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZyAoIiVzIiwgX19mdW5jX18pOwogCiAJc19wcml2ID0gdXNiX2dldF9zZXJpYWxfZGF0YShzZXJpYWwpOwogCWRfZGV0YWlscyA9IHNfcHJpdi0+ZGV2aWNlX2RldGFpbHM7CkBAIC0xNjYyLDcgKzE2NjMsNyBAQAogCQlkaXYsCS8qIGRpdmlzb3IgKi8JCiAJCWNudDsJLyogaW52ZXJzZSBvZiBkaXZpc29yIChwcm9ncmFtbWVkIGludG8gODA1MSkgKi8KIAkJCi0JZGJnICgiJXMgLSAlZC4iLCBfX0ZVTkNUSU9OX18sIGJhdWRfcmF0ZSk7CisJZGJnICgiJXMgLSAlZC4iLCBfX2Z1bmNfXywgYmF1ZF9yYXRlKTsKIAogCQkvKiBwcmV2ZW50IGRpdmlkZSBieSB6ZXJvLi4uICAqLwogCWlmKCAoYjE2ID0gKGJhdWRfcmF0ZSAqIDE2TCkpID09IDApIHsKQEAgLTE2OTUsNyArMTY5Niw3IEBACiAJCSpyYXRlX2hpID0gKHU4KSAoKGNudCA+PiA4KSAmIDB4ZmYpOwogCX0KIAlpZiAocmF0ZV9sb3cgJiYgcmF0ZV9oaSkgewotCQlkYmcgKCIlcyAtICVkICUwMnggJTAyeC4iLCBfX0ZVTkNUSU9OX18sIGJhdWRfcmF0ZSwgKnJhdGVfaGksICpyYXRlX2xvdyk7CisJCWRiZyAoIiVzIC0gJWQgJTAyeCAlMDJ4LiIsIF9fZnVuY19fLCBiYXVkX3JhdGUsICpyYXRlX2hpLCAqcmF0ZV9sb3cpOwogCX0KIAkKIAlyZXR1cm4gKEtFWVNQQU5fQkFVRF9SQVRFX09LKTsKQEAgLTE3MDgsNyArMTcwOSw3IEBACiAJdTMyIAliMTYsCS8qIGJhdWQgcmF0ZSB0aW1lcyAxNiAoYWN0dWFsIHJhdGUgdXNlZCBpbnRlcm5hbGx5KSAqLwogCQkJZGl2OwkvKiBkaXZpc29yICovCQogCQkKLQlkYmcgKCIlcyAtICVkLiIsIF9fRlVOQ1RJT05fXywgYmF1ZF9yYXRlKTsKKwlkYmcgKCIlcyAtICVkLiIsIF9fZnVuY19fLCBiYXVkX3JhdGUpOwogCiAJCS8qIHByZXZlbnQgZGl2aWRlIGJ5IHplcm8uLi4gICovCiAJaWYoIChiMTYgPSAoYmF1ZF9yYXRlICogMTZMKSkgPT0gMCkgCkBAIC0xNzMxLDcgKzE3MzIsNyBAQAogCQkqcmF0ZV9oaSA9ICh1OCkgKChkaXYgPj4gOCkgJiAweGZmKTsKIAkKIAlpZiAocmF0ZV9sb3cgJiYgcmF0ZV9oaSkgCi0JCWRiZyAoIiVzIC0gJWQgJTAyeCAlMDJ4LiIsIF9fRlVOQ1RJT05fXywgYmF1ZF9yYXRlLCAqcmF0ZV9oaSwgKnJhdGVfbG93KTsKKwkJZGJnICgiJXMgLSAlZCAlMDJ4ICUwMnguIiwgX19mdW5jX18sIGJhdWRfcmF0ZSwgKnJhdGVfaGksICpyYXRlX2xvdyk7CiAJCiAJcmV0dXJuIChLRVlTUEFOX0JBVURfUkFURV9PSyk7CiB9CkBAIC0xNzQ4LDcgKzE3NDksNyBAQAogCXU4CWJlc3RfcHJlc2NhbGVyOwogCWludAlpOwogCi0JZGJnICgiJXMgLSAlZC4iLCBfX0ZVTkNUSU9OX18sIGJhdWRfcmF0ZSk7CisJZGJnICgiJXMgLSAlZC4iLCBfX2Z1bmNfXywgYmF1ZF9yYXRlKTsKIAogCQkvKiBwcmV2ZW50IGRpdmlkZSBieSB6ZXJvICovCiAJaWYoIChiMTYgPSBiYXVkX3JhdGUgKiAxNkwpID09IDApIHsKQEAgLTE3OTYsNyArMTc5Nyw3IEBACiAJfQogCWlmIChwcmVzY2FsZXIpIHsKIAkJKnByZXNjYWxlciA9IGJlc3RfcHJlc2NhbGVyOwotCQkvKiAgZGJnKCIlcyAtICVkICVkIiwgX19GVU5DVElPTl9fLCAqcHJlc2NhbGVyLCBkaXYpOyAqLworCQkvKiAgZGJnKCIlcyAtICVkICVkIiwgX19mdW5jX18sICpwcmVzY2FsZXIsIGRpdik7ICovCiAJfQogCXJldHVybiAoS0VZU1BBTl9CQVVEX1JBVEVfT0spOwogfQpAQCAtMTgwOSw3ICsxODEwLDcgQEAKIAkJZGl2LAkvKiBkaXZpc29yICovCQogCQljbnQ7CS8qIGludmVyc2Ugb2YgZGl2aXNvciAocHJvZ3JhbW1lZCBpbnRvIDgwNTEpICovCiAKLQlkYmcgKCIlcyAtICVkLiIsIF9fRlVOQ1RJT05fXywgYmF1ZF9yYXRlKTsKKwlkYmcgKCIlcyAtICVkLiIsIF9fZnVuY19fLCBiYXVkX3JhdGUpOwogCiAJCS8qIHByZXZlbnQgZGl2aWRlIGJ5IHplcm8gKi8KIAlpZiAoKGIxNiA9IGJhdWRfcmF0ZSAqIDE2TCkgPT0gMCkKQEAgLTE4NDgsNyArMTg0OSw3IEBACiAJaWYgKHJhdGVfaGkpIHsKIAkJKnJhdGVfaGkgPSAodTgpICgoY250ID4+IDgpICYgMHhmZik7CiAJfQotCWRiZyAoIiVzIC0gJWQgT0suIiwgX19GVU5DVElPTl9fLCBiYXVkX3JhdGUpOworCWRiZyAoIiVzIC0gJWQgT0suIiwgX19mdW5jX18sIGJhdWRfcmF0ZSk7CiAJcmV0dXJuIChLRVlTUEFOX0JBVURfUkFURV9PSyk7CiB9CiAKQEAgLTE4NjQsNyArMTg2NSw3IEBACiAJc3RydWN0IHVyYgkJCQkqdGhpc191cmI7CiAJaW50IAkJCQkJZGV2aWNlX3BvcnQsIGVycjsKIAotCWRiZyAoIiVzIHJlc2V0PSVkIiwgX19GVU5DVElPTl9fLCByZXNldF9wb3J0KTsgCisJZGJnICgiJXMgcmVzZXQ9JWQiLCBfX2Z1bmNfXywgcmVzZXRfcG9ydCk7CiAKIAlzX3ByaXYgPSB1c2JfZ2V0X3NlcmlhbF9kYXRhKHNlcmlhbCk7CiAJcF9wcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwpAQCAtMTg3NCwxMSArMTg3NSwxMSBAQAogCW91dGNvbnRfdXJiID0gZF9kZXRhaWxzLT5vdXRjb250X2VuZHBvaW50c1twb3J0LT5udW1iZXJdOwogCXRoaXNfdXJiID0gcF9wcml2LT5vdXRjb250X3VyYjsKIAotCWRiZygiJXMgLSBlbmRwb2ludCAlZCIsIF9fRlVOQ1RJT05fXywgdXNiX3BpcGVlbmRwb2ludCh0aGlzX3VyYi0+cGlwZSkpOworCWRiZygiJXMgLSBlbmRwb2ludCAlZCIsIF9fZnVuY19fLCB1c2JfcGlwZWVuZHBvaW50KHRoaXNfdXJiLT5waXBlKSk7CiAKIAkJLyogTWFrZSBzdXJlIHdlIGhhdmUgYW4gdXJiIHRoZW4gc2VuZCB0aGUgbWVzc2FnZSAqLwogCWlmICh0aGlzX3VyYiA9PSBOVUxMKSB7Ci0JCWRiZygiJXMgLSBvb3BzIG5vIHVyYi4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gb29wcyBubyB1cmIuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0xODg3LDcgKzE4ODgsNyBAQAogCWlmICgocmVzZXRfcG9ydCArIDEpID4gcF9wcml2LT5yZXNlbmRfY29udCkKIAkJcF9wcml2LT5yZXNlbmRfY29udCA9IHJlc2V0X3BvcnQgKyAxOwogCWlmICh0aGlzX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykgewotCQkvKiAgZGJnICgiJXMgLSBhbHJlYWR5IHdyaXRpbmciLCBfX0ZVTkNUSU9OX18pOyAqLworCQkvKiAgZGJnICgiJXMgLSBhbHJlYWR5IHdyaXRpbmciLCBfX2Z1bmNfXyk7ICovCiAJCW1kZWxheSg1KTsKIAkJcmV0dXJuKC0xKTsKIAl9CkBAIC0xOTAxLDcgKzE5MDIsNyBAQAogCQlpZiAoZF9kZXRhaWxzLT5jYWxjdWxhdGVfYmF1ZF9yYXRlCiAJCSAgICAocF9wcml2LT5iYXVkLCBkX2RldGFpbHMtPmJhdWRjbGssICZtc2cuYmF1ZEhpLAogCQkgICAgICZtc2cuYmF1ZExvLCAmbXNnLnByZXNjYWxlciwgZGV2aWNlX3BvcnQpID09IEtFWVNQQU5fSU5WQUxJRF9CQVVEX1JBVEUgKSB7Ci0JCQlkYmcoIiVzIC0gSW52YWxpZCBiYXVkIHJhdGUgJWQgcmVxdWVzdGVkLCB1c2luZyA5NjAwLiIsIF9fRlVOQ1RJT05fXywKKwkJCWRiZygiJXMgLSBJbnZhbGlkIGJhdWQgcmF0ZSAlZCByZXF1ZXN0ZWQsIHVzaW5nIDk2MDAuIiwgX19mdW5jX18sCiAJCQkgICAgcF9wcml2LT5iYXVkKTsKIAkJCW1zZy5iYXVkTG8gPSAwOwogCQkJbXNnLmJhdWRIaSA9IDEyNTsJLyogVmFsdWVzIGZvciA5NjAwIGJhdWQgKi8KQEAgLTE5OTYsMTcgKzE5OTcsMTcgQEAKIAogCXRoaXNfdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKIAlpZiAoKGVyciA9IHVzYl9zdWJtaXRfdXJiKHRoaXNfdXJiLCBHRlBfQVRPTUlDKSkgIT0gMCkgewotCQlkYmcoIiVzIC0gdXNiX3N1Ym1pdF91cmIoc2V0dXApIGZhaWxlZCAoJWQpIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQlkYmcoIiVzIC0gdXNiX3N1Ym1pdF91cmIoc2V0dXApIGZhaWxlZCAoJWQpIiwgX19mdW5jX18sIGVycik7CiAJfQogI2lmIDAKIAllbHNlIHsKLQkJZGJnKCIlcyAtIHVzYl9zdWJtaXRfdXJiKCVkKSBPSyAlZCBieXRlcyAoZW5kICVkKSIsIF9fRlVOQ1RJT05fXworCQlkYmcoIiVzIC0gdXNiX3N1Ym1pdF91cmIoJWQpIE9LICVkIGJ5dGVzIChlbmQgJWQpIiwgX19mdW5jX18KIAkJICAgIG91dGNvbnRfdXJiLCB0aGlzX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKIAkJICAgIHVzYl9waXBlZW5kcG9pbnQodGhpc191cmItPnBpcGUpKTsKIAl9CiAjZW5kaWYKIAotCXJldHVybiAoMCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQga2V5c3Bhbl91c2EyOF9zZW5kX3NldHVwKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsCkBAIC0yMDIwLDcgKzIwMjEsNyBAQAogCXN0cnVjdCB1cmIJCQkJKnRoaXNfdXJiOwogCWludCAJCQkJCWRldmljZV9wb3J0LCBlcnI7CiAKLQlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnICgiJXMiLCBfX2Z1bmNfXyk7CiAKIAlzX3ByaXYgPSB1c2JfZ2V0X3NlcmlhbF9kYXRhKHNlcmlhbCk7CiAJcF9wcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwpAQCAtMjAyOSw3ICsyMDMwLDcgQEAKIAogCS8qIG9ubHkgZG8gc29tZXRoaW5nIGlmIHdlIGhhdmUgYSBidWxrIG91dCBlbmRwb2ludCAqLwogCWlmICgodGhpc191cmIgPSBwX3ByaXYtPm91dGNvbnRfdXJiKSA9PSBOVUxMKSB7Ci0JCWRiZygiJXMgLSBvb3BzIG5vIHVyYi4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gb29wcyBubyB1cmIuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0yMDM4LDcgKzIwMzksNyBAQAogCWlmICgocmVzZXRfcG9ydCArIDEpID4gcF9wcml2LT5yZXNlbmRfY29udCkKIAkJcF9wcml2LT5yZXNlbmRfY29udCA9IHJlc2V0X3BvcnQgKyAxOwogCWlmICh0aGlzX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykgewotCQlkYmcgKCIlcyBhbHJlYWR5IHdyaXRpbmciLCBfX0ZVTkNUSU9OX18pOworCQlkYmcgKCIlcyBhbHJlYWR5IHdyaXRpbmciLCBfX2Z1bmNfXyk7CiAJCW1kZWxheSg1KTsKIAkJcmV0dXJuKC0xKTsKIAl9CkBAIC0yMDQ4LDcgKzIwNDksNyBAQAogCW1zZy5zZXRCYXVkUmF0ZSA9IDE7CiAJaWYgKGRfZGV0YWlscy0+Y2FsY3VsYXRlX2JhdWRfcmF0ZShwX3ByaXYtPmJhdWQsIGRfZGV0YWlscy0+YmF1ZGNsaywKIAkJJm1zZy5iYXVkSGksICZtc2cuYmF1ZExvLCBOVUxMLCBkZXZpY2VfcG9ydCkgPT0gS0VZU1BBTl9JTlZBTElEX0JBVURfUkFURSApIHsKLQkJZGJnKCIlcyAtIEludmFsaWQgYmF1ZCByYXRlIHJlcXVlc3RlZCAlZC4iLCBfX0ZVTkNUSU9OX18sIHBfcHJpdi0+YmF1ZCk7CisJCWRiZygiJXMgLSBJbnZhbGlkIGJhdWQgcmF0ZSByZXF1ZXN0ZWQgJWQuIiwgX19mdW5jX18sIHBfcHJpdi0+YmF1ZCk7CiAJCW1zZy5iYXVkTG8gPSAweGZmOwogCQltc2cuYmF1ZEhpID0gMHhiMjsJLyogVmFsdWVzIGZvciA5NjAwIGJhdWQgKi8KIAl9CkBAIC0yMTIyLDE2ICsyMTIzLDE2IEBACiAKIAl0aGlzX3VyYi0+ZGV2ID0gc2VyaWFsLT5kZXY7CiAJaWYgKChlcnIgPSB1c2Jfc3VibWl0X3VyYih0aGlzX3VyYiwgR0ZQX0FUT01JQykpICE9IDApIHsKLQkJZGJnKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHNldHVwKSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gdXNiX3N1Ym1pdF91cmIoc2V0dXApIGZhaWxlZCIsIF9fZnVuY19fKTsKIAl9CiAjaWYgMAogCWVsc2UgewotCQlkYmcoIiVzIC0gdXNiX3N1Ym1pdF91cmIoc2V0dXApIE9LICVkIGJ5dGVzIiwgX19GVU5DVElPTl9fLAorCQlkYmcoIiVzIC0gdXNiX3N1Ym1pdF91cmIoc2V0dXApIE9LICVkIGJ5dGVzIiwgX19mdW5jX18sCiAJCSAgICB0aGlzX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCk7CiAJfQogI2VuZGlmCiAKLQlyZXR1cm4gKDApOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGtleXNwYW5fdXNhNDlfc2VuZF9zZXR1cChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsLApAQCAtMjE0Niw3ICsyMTQ3LDcgQEAKIAlzdHJ1Y3QgdXJiCQkJCSp0aGlzX3VyYjsKIAlpbnQgCQkJCQllcnIsIGRldmljZV9wb3J0OwogCi0JZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZyAoIiVzIiwgX19mdW5jX18pOwogCiAJc19wcml2ID0gdXNiX2dldF9zZXJpYWxfZGF0YShzZXJpYWwpOwogCXBfcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKQEAgLTIxNTcsMTEgKzIxNTgsMTEgQEAKIAkvKiBXb3JrIG91dCB3aGljaCBwb3J0IHdpdGhpbiB0aGUgZGV2aWNlIGlzIGJlaW5nIHNldHVwICovCiAJZGV2aWNlX3BvcnQgPSBwb3J0LT5udW1iZXIgLSBwb3J0LT5zZXJpYWwtPm1pbm9yOwogCi0JZGJnKCIlcyAtIGVuZHBvaW50ICVkIHBvcnQgJWQgKCVkKSIsX19GVU5DVElPTl9fLCB1c2JfcGlwZWVuZHBvaW50KHRoaXNfdXJiLT5waXBlKSwgcG9ydC0+bnVtYmVyLCBkZXZpY2VfcG9ydCk7CisJZGJnKCIlcyAtIGVuZHBvaW50ICVkIHBvcnQgJWQgKCVkKSIsX19mdW5jX18sIHVzYl9waXBlZW5kcG9pbnQodGhpc191cmItPnBpcGUpLCBwb3J0LT5udW1iZXIsIGRldmljZV9wb3J0KTsKIAogCQkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhbiB1cmIgdGhlbiBzZW5kIHRoZSBtZXNzYWdlICovCiAJaWYgKHRoaXNfdXJiID09IE5VTEwpIHsKLQkJZGJnKCIlcyAtIG9vcHMgbm8gdXJiIGZvciBwb3J0ICVkLiIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwkJZGJnKCIlcyAtIG9vcHMgbm8gdXJiIGZvciBwb3J0ICVkLiIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0yMTcxLDcgKzIxNzIsNyBAQAogCQlwX3ByaXYtPnJlc2VuZF9jb250ID0gcmVzZXRfcG9ydCArIDE7CiAKIAlpZiAodGhpc191cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKLQkJLyogIGRiZyAoIiVzIC0gYWxyZWFkeSB3cml0aW5nIiwgX19GVU5DVElPTl9fKTsgKi8KKwkJLyogIGRiZyAoIiVzIC0gYWxyZWFkeSB3cml0aW5nIiwgX19mdW5jX18pOyAqLwogCQltZGVsYXkoNSk7CiAJCXJldHVybigtMSk7CiAJfQpAQCAtMjE4OCw3ICsyMTg5LDcgQEAKIAkJaWYgKGRfZGV0YWlscy0+Y2FsY3VsYXRlX2JhdWRfcmF0ZQogCQkgICAgKHBfcHJpdi0+YmF1ZCwgZF9kZXRhaWxzLT5iYXVkY2xrLCAmbXNnLmJhdWRIaSwKIAkJICAgICAmbXNnLmJhdWRMbywgJm1zZy5wcmVzY2FsZXIsIGRldmljZV9wb3J0KSA9PSBLRVlTUEFOX0lOVkFMSURfQkFVRF9SQVRFICkgewotCQkJZGJnKCIlcyAtIEludmFsaWQgYmF1ZCByYXRlICVkIHJlcXVlc3RlZCwgdXNpbmcgOTYwMC4iLCBfX0ZVTkNUSU9OX18sCisJCQlkYmcoIiVzIC0gSW52YWxpZCBiYXVkIHJhdGUgJWQgcmVxdWVzdGVkLCB1c2luZyA5NjAwLiIsIF9fZnVuY19fLAogCQkJICAgIHBfcHJpdi0+YmF1ZCk7CiAJCQltc2cuYmF1ZExvID0gMDsKIAkJCW1zZy5iYXVkSGkgPSAxMjU7CS8qIFZhbHVlcyBmb3IgOTYwMCBiYXVkICovCkBAIC0yMzA3LDE3ICsyMzA4LDE3IEBACiAJCXRoaXNfdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKIAl9CiAJaWYgKChlcnIgPSB1c2Jfc3VibWl0X3VyYih0aGlzX3VyYiwgR0ZQX0FUT01JQykpICE9IDApIHsKLQkJZGJnKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHNldHVwKSBmYWlsZWQgKCVkKSIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJZGJnKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHNldHVwKSBmYWlsZWQgKCVkKSIsIF9fZnVuY19fLCBlcnIpOwogCX0KICNpZiAwCiAJZWxzZSB7Ci0JCWRiZygiJXMgLSB1c2Jfc3VibWl0X3VyYiglZCkgT0sgJWQgYnl0ZXMgKGVuZCAlZCkiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgLSB1c2Jfc3VibWl0X3VyYiglZCkgT0sgJWQgYnl0ZXMgKGVuZCAlZCkiLCBfX2Z1bmNfXywKIAkJCSAgIG91dGNvbnRfdXJiLCB0aGlzX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKIAkJCSAgIHVzYl9waXBlZW5kcG9pbnQodGhpc191cmItPnBpcGUpKTsKIAl9CiAjZW5kaWYKIAotCXJldHVybiAoMCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQga2V5c3Bhbl91c2E5MF9zZW5kX3NldHVwKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsCkBAIC0yMzMyLDcgKzIzMzMsNyBAQAogCWludCAJCQkJCWVycjsKIAl1OAkJCQkJCXByZXNjYWxlcjsKIAotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIAogCXNfcHJpdiA9IHVzYl9nZXRfc2VyaWFsX2RhdGEoc2VyaWFsKTsKIAlwX3ByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CkBAIC0yMzQwLDcgKzIzNDEsNyBAQAogCiAJLyogb25seSBkbyBzb21ldGhpbmcgaWYgd2UgaGF2ZSBhIGJ1bGsgb3V0IGVuZHBvaW50ICovCiAJaWYgKCh0aGlzX3VyYiA9IHBfcHJpdi0+b3V0Y29udF91cmIpID09IE5VTEwpIHsKLQkJZGJnKCIlcyAtIG9vcHMgbm8gdXJiLiIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBvb3BzIG5vIHVyYi4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTIzNDksNyArMjM1MCw3IEBACiAJaWYgKChyZXNldF9wb3J0ICsgMSkgPiBwX3ByaXYtPnJlc2VuZF9jb250KQogCQlwX3ByaXYtPnJlc2VuZF9jb250ID0gcmVzZXRfcG9ydCArIDE7CiAJaWYgKHRoaXNfdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSB7Ci0JCWRiZyAoIiVzIGFscmVhZHkgd3JpdGluZyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZyAoIiVzIGFscmVhZHkgd3JpdGluZyIsIF9fZnVuY19fKTsKIAkJbWRlbGF5KDUpOwogCQlyZXR1cm4oLTEpOwogCX0KQEAgLTIzNjMsNyArMjM2NCw3IEBACiAJCWlmIChkX2RldGFpbHMtPmNhbGN1bGF0ZV9iYXVkX3JhdGUKIAkJICAgIChwX3ByaXYtPmJhdWQsIGRfZGV0YWlscy0+YmF1ZGNsaywgJm1zZy5iYXVkSGksCiAJCSAgICAgJm1zZy5iYXVkTG8sICZwcmVzY2FsZXIsIDApID09IEtFWVNQQU5fSU5WQUxJRF9CQVVEX1JBVEUgKSB7Ci0JCQlkYmcoIiVzIC0gSW52YWxpZCBiYXVkIHJhdGUgJWQgcmVxdWVzdGVkLCB1c2luZyA5NjAwLiIsIF9fRlVOQ1RJT05fXywKKwkJCWRiZygiJXMgLSBJbnZhbGlkIGJhdWQgcmF0ZSAlZCByZXF1ZXN0ZWQsIHVzaW5nIDk2MDAuIiwgX19mdW5jX18sCiAJCQkgICAgcF9wcml2LT5iYXVkKTsKIAkJCXBfcHJpdi0+YmF1ZCA9IDk2MDA7CiAJCQlkX2RldGFpbHMtPmNhbGN1bGF0ZV9iYXVkX3JhdGUgKHBfcHJpdi0+YmF1ZCwgZF9kZXRhaWxzLT5iYXVkY2xrLCAKQEAgLTI0NTMsOSArMjQ1NCw5IEBACiAKIAl0aGlzX3VyYi0+ZGV2ID0gc2VyaWFsLT5kZXY7CiAJaWYgKChlcnIgPSB1c2Jfc3VibWl0X3VyYih0aGlzX3VyYiwgR0ZQX0FUT01JQykpICE9IDApIHsKLQkJZGJnKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHNldHVwKSBmYWlsZWQgKCVkKSIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJZGJnKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHNldHVwKSBmYWlsZWQgKCVkKSIsIF9fZnVuY19fLCBlcnIpOwogCX0KLQlyZXR1cm4gKDApOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGtleXNwYW5fdXNhNjdfc2VuZF9zZXR1cChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsLApAQCAtMjQ2OSw3ICsyNDcwLDcgQEAKIAlzdHJ1Y3QgdXJiCQkJCSp0aGlzX3VyYjsKIAlpbnQgCQkJCQllcnIsIGRldmljZV9wb3J0OwogCi0JZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZyAoIiVzIiwgX19mdW5jX18pOwogCiAJc19wcml2ID0gdXNiX2dldF9zZXJpYWxfZGF0YShzZXJpYWwpOwogCXBfcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKQEAgLTI0ODIsNyArMjQ4Myw3IEBACiAKIAkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhbiB1cmIgdGhlbiBzZW5kIHRoZSBtZXNzYWdlICovCiAJaWYgKHRoaXNfdXJiID09IE5VTEwpIHsKLQkJZGJnKCIlcyAtIG9vcHMgbm8gdXJiIGZvciBwb3J0ICVkLiIsIF9fRlVOQ1RJT05fXywKKwkJZGJnKCIlcyAtIG9vcHMgbm8gdXJiIGZvciBwb3J0ICVkLiIsIF9fZnVuY19fLAogCQkJcG9ydC0+bnVtYmVyKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTI0OTIsNyArMjQ5Myw3IEBACiAJaWYgKChyZXNldF9wb3J0ICsgMSkgPiBwX3ByaXYtPnJlc2VuZF9jb250KQogCQlwX3ByaXYtPnJlc2VuZF9jb250ID0gcmVzZXRfcG9ydCArIDE7CiAJaWYgKHRoaXNfdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSB7Ci0JCS8qICBkYmcgKCIlcyAtIGFscmVhZHkgd3JpdGluZyIsIF9fRlVOQ1RJT05fXyk7ICovCisJCS8qICBkYmcgKCIlcyAtIGFscmVhZHkgd3JpdGluZyIsIF9fZnVuY19fKTsgKi8KIAkJbWRlbGF5KDUpOwogCQlyZXR1cm4oLTEpOwogCX0KQEAgLTI1MDgsNyArMjUwOSw3IEBACiAJCWlmIChkX2RldGFpbHMtPmNhbGN1bGF0ZV9iYXVkX3JhdGUKIAkJICAgIChwX3ByaXYtPmJhdWQsIGRfZGV0YWlscy0+YmF1ZGNsaywgJm1zZy5iYXVkSGksCiAJCSAgICAgJm1zZy5iYXVkTG8sICZtc2cucHJlc2NhbGVyLCBkZXZpY2VfcG9ydCkgPT0gS0VZU1BBTl9JTlZBTElEX0JBVURfUkFURSApIHsKLQkJCWRiZygiJXMgLSBJbnZhbGlkIGJhdWQgcmF0ZSAlZCByZXF1ZXN0ZWQsIHVzaW5nIDk2MDAuIiwgX19GVU5DVElPTl9fLAorCQkJZGJnKCIlcyAtIEludmFsaWQgYmF1ZCByYXRlICVkIHJlcXVlc3RlZCwgdXNpbmcgOTYwMC4iLCBfX2Z1bmNfXywKIAkJCSAgICBwX3ByaXYtPmJhdWQpOwogCQkJbXNnLmJhdWRMbyA9IDA7CiAJCQltc2cuYmF1ZEhpID0gMTI1OwkvKiBWYWx1ZXMgZm9yIDk2MDAgYmF1ZCAqLwpAQCAtMjYwMSw5ICsyNjAyLDkgQEAKIAogCWVyciA9IHVzYl9zdWJtaXRfdXJiKHRoaXNfdXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAoZXJyICE9IDApCi0JCWRiZygiJXMgLSB1c2Jfc3VibWl0X3VyYihzZXR1cCkgZmFpbGVkICglZCkiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgLSB1c2Jfc3VibWl0X3VyYihzZXR1cCkgZmFpbGVkICglZCkiLCBfX2Z1bmNfXywKIAkJCQllcnIpOwotCXJldHVybiAoMCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGtleXNwYW5fc2VuZF9zZXR1cChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBpbnQgcmVzZXRfcG9ydCkKQEAgLTI2MTIsNyArMjYxMyw3IEBACiAJc3RydWN0IGtleXNwYW5fc2VyaWFsX3ByaXZhdGUgKnNfcHJpdjsKIAljb25zdCBzdHJ1Y3Qga2V5c3Bhbl9kZXZpY2VfZGV0YWlscyAqZF9kZXRhaWxzOwogCi0JZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZyAoIiVzIiwgX19mdW5jX18pOwogCiAJc19wcml2ID0gdXNiX2dldF9zZXJpYWxfZGF0YShzZXJpYWwpOwogCWRfZGV0YWlscyA9IHNfcHJpdi0+ZGV2aWNlX2RldGFpbHM7CkBAIC0yNjQ3LDIwICsyNjQ4LDIwIEBACiAJc3RydWN0IGtleXNwYW5fcG9ydF9wcml2YXRlCSpwX3ByaXY7CiAJY29uc3Qgc3RydWN0IGtleXNwYW5fZGV2aWNlX2RldGFpbHMJKmRfZGV0YWlsczsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlmb3IgKGkgPSAwOyAoZF9kZXRhaWxzID0ga2V5c3Bhbl9kZXZpY2VzW2ldKSAhPSBOVUxMOyArK2kpCiAJCWlmIChkX2RldGFpbHMtPnByb2R1Y3RfaWQgPT0gbGUxNl90b19jcHUoc2VyaWFsLT5kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSkKIAkJCWJyZWFrOwogCWlmIChkX2RldGFpbHMgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZzZXJpYWwtPmRldi0+ZGV2LCAiJXMgLSB1bmtub3duIHByb2R1Y3QgaWQgJXhcbiIsIF9fRlVOQ1RJT05fXywgbGUxNl90b19jcHUoc2VyaWFsLT5kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSk7CisJCWRldl9lcnIoJnNlcmlhbC0+ZGV2LT5kZXYsICIlcyAtIHVua25vd24gcHJvZHVjdCBpZCAleFxuIiwgX19mdW5jX18sIGxlMTZfdG9fY3B1KHNlcmlhbC0+ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOwogCQlyZXR1cm4gMTsKIAl9CiAKIAkvKiBTZXR1cCBwcml2YXRlIGRhdGEgZm9yIHNlcmlhbCBkcml2ZXIgKi8KIAlzX3ByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga2V5c3Bhbl9zZXJpYWxfcHJpdmF0ZSksIEdGUF9LRVJORUwpOwogCWlmICghc19wcml2KSB7Ci0JCWRiZygiJXMgLSBrbWFsbG9jIGZvciBrZXlzcGFuX3NlcmlhbF9wcml2YXRlIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0ga21hbGxvYyBmb3Iga2V5c3Bhbl9zZXJpYWxfcHJpdmF0ZSBmYWlsZWQuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTI2NzIsNyArMjY3Myw3IEBACiAJCXBvcnQgPSBzZXJpYWwtPnBvcnRbaV07CiAJCXBfcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrZXlzcGFuX3BvcnRfcHJpdmF0ZSksIEdGUF9LRVJORUwpOwogCQlpZiAoIXBfcHJpdikgewotCQkJZGJnKCIlcyAtIGttYWxsb2MgZm9yIGtleXNwYW5fcG9ydF9wcml2YXRlICglZCkgZmFpbGVkIS4iLCBfX0ZVTkNUSU9OX18sIGkpOworCQkJZGJnKCIlcyAtIGttYWxsb2MgZm9yIGtleXNwYW5fcG9ydF9wcml2YXRlICglZCkgZmFpbGVkIS4iLCBfX2Z1bmNfXywgaSk7CiAJCQlyZXR1cm4gKDEpOwogCQl9CiAJCXBfcHJpdi0+ZGV2aWNlX2RldGFpbHMgPSBkX2RldGFpbHM7CkBAIC0yNjg1LDE4ICsyNjg2LDE4IEBACiAJCXNfcHJpdi0+aW5zdGF0X3VyYi0+ZGV2ID0gc2VyaWFsLT5kZXY7CiAJCWVyciA9IHVzYl9zdWJtaXRfdXJiKHNfcHJpdi0+aW5zdGF0X3VyYiwgR0ZQX0tFUk5FTCk7CiAJCWlmIChlcnIgIT0gMCkKLQkJCWRiZygiJXMgLSBzdWJtaXQgaW5zdGF0IHVyYiBmYWlsZWQgJWQiLCBfX0ZVTkNUSU9OX18sCisJCQlkYmcoIiVzIC0gc3VibWl0IGluc3RhdCB1cmIgZmFpbGVkICVkIiwgX19mdW5jX18sCiAJCQkJZXJyKTsKIAl9CiAJaWYgKHNfcHJpdi0+aW5kYXRfdXJiICE9IE5VTEwpIHsKIAkJc19wcml2LT5pbmRhdF91cmItPmRldiA9IHNlcmlhbC0+ZGV2OwogCQllcnIgPSB1c2Jfc3VibWl0X3VyYihzX3ByaXYtPmluZGF0X3VyYiwgR0ZQX0tFUk5FTCk7CiAJCWlmIChlcnIgIT0gMCkKLQkJCWRiZygiJXMgLSBzdWJtaXQgaW5kYXQgdXJiIGZhaWxlZCAlZCIsIF9fRlVOQ1RJT05fXywKKwkJCWRiZygiJXMgLSBzdWJtaXQgaW5kYXQgdXJiIGZhaWxlZCAlZCIsIF9fZnVuY19fLAogCQkJCWVycik7CiAJfQogCQkJCi0JcmV0dXJuICgwKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQga2V5c3Bhbl9zaHV0ZG93biAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKQEAgLTI3MDYsNyArMjcwNyw3IEBACiAJc3RydWN0IGtleXNwYW5fc2VyaWFsX3ByaXZhdGUgCSpzX3ByaXY7CiAJc3RydWN0IGtleXNwYW5fcG9ydF9wcml2YXRlCSpwX3ByaXY7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJc19wcml2ID0gdXNiX2dldF9zZXJpYWxfZGF0YShzZXJpYWwpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbi5oIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW4uaAppbmRleCA3NGNlOGJjLi44ZDZlZDAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbi5oCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuLmgKQEAgLTYzNiwxMCArNjM2LDYgQEAKIAl9LAogCS5kZXNjcmlwdGlvbgkJPSAiS2V5c3BhbiAtICh3aXRob3V0IGZpcm13YXJlKSIsCiAJLmlkX3RhYmxlCQk9IGtleXNwYW5fcHJlX2lkcywKLQkubnVtX2ludGVycnVwdF9pbgk9IE5VTV9ET05UX0NBUkUsCi0JLm51bV9pbnRlcnJ1cHRfb3V0CT0gTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfaW4JCT0gTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfb3V0CQk9IE5VTV9ET05UX0NBUkUsCiAJLm51bV9wb3J0cwkJPSAxLAogCS5hdHRhY2gJCQk9IGtleXNwYW5fZmFrZV9zdGFydHVwLAogfTsKQEAgLTY1MSwxMCArNjQ3LDYgQEAKIAl9LAogCS5kZXNjcmlwdGlvbgkJPSAiS2V5c3BhbiAxIHBvcnQgYWRhcHRlciIsCiAJLmlkX3RhYmxlCQk9IGtleXNwYW5fMXBvcnRfaWRzLAotCS5udW1faW50ZXJydXB0X2luCT0gTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2ludGVycnVwdF9vdXQJPSBOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19pbgkJPSBOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19vdXQJCT0gTlVNX0RPTlRfQ0FSRSwKIAkubnVtX3BvcnRzCQk9IDEsCiAJLm9wZW4JCQk9IGtleXNwYW5fb3BlbiwKIAkuY2xvc2UJCQk9IGtleXNwYW5fY2xvc2UsCkBAIC02NzksMTAgKzY3MSw2IEBACiAJfSwKIAkuZGVzY3JpcHRpb24JCT0gIktleXNwYW4gMiBwb3J0IGFkYXB0ZXIiLAogCS5pZF90YWJsZQkJPSBrZXlzcGFuXzJwb3J0X2lkcywKLQkubnVtX2ludGVycnVwdF9pbgk9IE5VTV9ET05UX0NBUkUsCi0JLm51bV9pbnRlcnJ1cHRfb3V0CT0gTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfaW4JCT0gTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfb3V0CQk9IE5VTV9ET05UX0NBUkUsCiAJLm51bV9wb3J0cwkJPSAyLAogCS5vcGVuCQkJPSBrZXlzcGFuX29wZW4sCiAJLmNsb3NlCQkJPSBrZXlzcGFuX2Nsb3NlLApAQCAtNzA3LDEwICs2OTUsNiBAQAogCX0sCiAJLmRlc2NyaXB0aW9uCQk9ICJLZXlzcGFuIDQgcG9ydCBhZGFwdGVyIiwKIAkuaWRfdGFibGUJCT0ga2V5c3Bhbl80cG9ydF9pZHMsCi0JLm51bV9pbnRlcnJ1cHRfaW4JPSBOVU1fRE9OVF9DQVJFLAotCS5udW1faW50ZXJydXB0X291dAk9IE5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX2luCQk9IE5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX291dAkJPSBOVU1fRE9OVF9DQVJFLAogCS5udW1fcG9ydHMJCT0gNCwKIAkub3BlbgkJCT0ga2V5c3Bhbl9vcGVuLAogCS5jbG9zZQkJCT0ga2V5c3Bhbl9jbG9zZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuX3BkYS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKaW5kZXggYjFmYTVhMy4uZmY1NDIwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKQEAgLTIwOCwxMyArMjA4LDEzIEBACiAJCQkJIDIwMDApOwogCWlmIChyZXN1bHQgPCAwKQogCQlkYmcoIiVzIC0gZXJyb3IgJWQgZnJvbSB1c2JfY29udHJvbF9tc2ciLCAKLQkJICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJICAgIF9fZnVuY19fLCByZXN1bHQpOwogfQogCiAKIHN0YXRpYyB2b2lkIGtleXNwYW5fcGRhX3J4X2ludGVycnVwdCAoc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogICAgICAgIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcG9ydC0+dHR5OwogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlpbnQgaTsKQEAgLTIzMiwxMSArMjMyLDExIEBACiAJY2FzZSAtRVNIVVRET1dOOgogCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLwogCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTI3NCw3ICsyNzQsNyBAQAogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChyZXR2YWwpCiAJCWVyciAoIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0ICVkIiwKLQkJICAgICBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCSAgICAgX19mdW5jX18sIHJldHZhbCk7CiB9CiAKIApAQCAtMzU4LDcgKzM1OCw3IEBACiAJCQkJdmFsdWUsIDAsIE5VTEwsIDAsIDIwMDApOwogCWlmIChyZXN1bHQgPCAwKQogCQlkYmcoIiVzIC0gZXJyb3IgJWQgZnJvbSB1c2JfY29udHJvbF9tc2ciLCAKLQkJICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJICAgIF9fZnVuY19fLCByZXN1bHQpOwogCS8qIHRoZXJlIGlzIHNvbWV0aGluZyBmdW5reSBhYm91dCB0aGlzLi4gdGhlIFRDU0JSSyB0aGF0ICdjdScgcGVyZm9ybXMKIAkgICBvdWdodCB0byB0cmFuc2xhdGUgaW50byBhIGJyZWFrX2N0bCgtMSksYnJlYWtfY3RsKDApIHBhaXIgSFovNAogCSAgIHNlY29uZHMgYXBhcnQsIGJ1dCBpdCBmZWVscyBsaWtlIHRoZSBicmVhayBzZW50IGlzbid0IGFzIGxvbmcgYXMgaXQKQEAgLTYwOCw3ICs2MDgsNyBAQAogCiBzdGF0aWMgdm9pZCBrZXlzcGFuX3BkYV93cml0ZV9idWxrX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IGtleXNwYW5fcGRhX3ByaXZhdGUgKnByaXY7CiAKIAlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7CkBAIC02MzYsMTQgKzYzNiwxOSBAQAogc3RhdGljIGludCBrZXlzcGFuX3BkYV9jaGFyc19pbl9idWZmZXIgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IGtleXNwYW5fcGRhX3ByaXZhdGUgKnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKIAogCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKIAkvKiB3aGVuIHRocm90dGxlZCwgcmV0dXJuIGF0IGxlYXN0IFdBS0VVUF9DSEFSUyB0byB0ZWxsIHNlbGVjdCgpICh2aWEKIAkgICBuX3R0eS5jOm5vcm1hbF9wb2xsKCkgKSB0aGF0IHdlJ3JlIG5vdCB3cml0ZWFibGUuICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCWlmIChwb3J0LT53cml0ZV91cmJfYnVzeSB8fCBwcml2LT50eF90aHJvdHRsZWQpCi0JCXJldHVybiAyNTY7Ci0JcmV0dXJuIDA7CisJCXJldCA9IDI1NjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKIH0KIAogCkBAIC02NjUsMTEgKzY3MCwxMSBAQAogCQkJICAgICAxLAogCQkJICAgICAyMDAwKTsKIAlpZiAocmMgPCAwKSB7Ci0JCWRiZygiJXMgLSByb29tcXVlcnkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHJvb21xdWVyeSBmYWlsZWQiLCBfX2Z1bmNfXyk7CiAJCWdvdG8gZXJyb3I7CiAJfQogCWlmIChyYyA9PSAwKSB7Ci0JCWRiZygiJXMgLSByb29tcXVlcnkgcmV0dXJuZWQgMCBieXRlcyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSByb29tcXVlcnkgcmV0dXJuZWQgMCBieXRlcyIsIF9fZnVuY19fKTsKIAkJcmMgPSAtRUlPOwogCQlnb3RvIGVycm9yOwogCX0KQEAgLTY4OCw3ICs2OTMsNyBAQAogCXBvcnQtPmludGVycnVwdF9pbl91cmItPmRldiA9IHNlcmlhbC0+ZGV2OwogCXJjID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJjKSB7Ci0JCWRiZygiJXMgLSB1c2Jfc3VibWl0X3VyYihyZWFkIGludCkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHJlYWQgaW50KSBmYWlsZWQiLCBfX2Z1bmNfXyk7CiAJCWdvdG8gZXJyb3I7CiAJfQogCkBAIC03MzIsNyArNzM3LDcgQEAKIAkJcmVjb3JkID0gJnhpcmNvbV9wZ3NfZmlybXdhcmVbMF07CiAjZW5kaWYKIAlpZiAocmVjb3JkID09IE5VTEwpIHsKLQkJZXJyKCIlczogdW5rbm93biB2ZW5kb3IsIGFib3J0aW5nLiIsIF9fRlVOQ1RJT05fXyk7CisJCWVycigiJXM6IHVua25vd24gdmVuZG9yLCBhYm9ydGluZy4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtNzc5LDcgKzc4NCw3IEBACiAKIHN0YXRpYyB2b2lkIGtleXNwYW5fcGRhX3NodXRkb3duIChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQogewotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAJCiAJa2ZyZWUodXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFswXSkpOwogfQpAQCAtNzkzLDkgKzc5OCw2IEBACiAJLmRlc2NyaXB0aW9uID0JCSJLZXlzcGFuIFBEQSAtIChwcmVyZW51bWVyYXRpb24pIiwKIAkudXNiX2RyaXZlciA9IAkJJmtleXNwYW5fcGRhX2RyaXZlciwKIAkuaWRfdGFibGUgPQkJaWRfdGFibGVfZmFrZSwKLQkubnVtX2ludGVycnVwdF9pbiA9CU5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX2luID0JCU5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX291dCA9CQlOVU1fRE9OVF9DQVJFLAogCS5udW1fcG9ydHMgPQkJMSwKIAkuYXR0YWNoID0JCWtleXNwYW5fcGRhX2Zha2Vfc3RhcnR1cCwKIH07CkBAIC04MTAsOSArODEyLDYgQEAKIAkuZGVzY3JpcHRpb24gPQkJIlhpcmNvbSAvIEVudHJlZ3JhIFBHUyAtIChwcmVyZW51bWVyYXRpb24pIiwKIAkudXNiX2RyaXZlciA9IAkJJmtleXNwYW5fcGRhX2RyaXZlciwKIAkuaWRfdGFibGUgPQkJaWRfdGFibGVfZmFrZV94aXJjb20sCi0JLm51bV9pbnRlcnJ1cHRfaW4gPQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19pbiA9CQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19vdXQgPQkJTlVNX0RPTlRfQ0FSRSwKIAkubnVtX3BvcnRzID0JCTEsCiAJLmF0dGFjaCA9CQlrZXlzcGFuX3BkYV9mYWtlX3N0YXJ0dXAsCiB9OwpAQCAtODI2LDkgKzgyNSw2IEBACiAJLmRlc2NyaXB0aW9uID0JCSJLZXlzcGFuIFBEQSIsCiAJLnVzYl9kcml2ZXIgPSAJCSZrZXlzcGFuX3BkYV9kcml2ZXIsCiAJLmlkX3RhYmxlID0JCWlkX3RhYmxlX3N0ZCwKLQkubnVtX2ludGVycnVwdF9pbiA9CTEsCi0JLm51bV9idWxrX2luID0JCTAsCi0JLm51bV9idWxrX291dCA9CQkxLAogCS5udW1fcG9ydHMgPQkJMSwKIAkub3BlbiA9CQkJa2V5c3Bhbl9wZGFfb3BlbiwKIAkuY2xvc2UgPQkJa2V5c3Bhbl9wZGFfY2xvc2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwva2w1a3VzYjEwNS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tsNWt1c2IxMDUuYwppbmRleCA1NTczNmRmLi5iMzk1YWM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwva2w1a3VzYjEwNS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rbDVrdXNiMTA1LmMKQEAgLTEyNiw5ICsxMjYsNiBAQAogCS5kZXNjcmlwdGlvbiA9CSAgICAgIktMNUtVU0IxMDVEIC8gUGFsbUNvbm5lY3QiLAogCS51c2JfZHJpdmVyID0JICAgICAma2w1a3VzYjEwNWRfZHJpdmVyLAogCS5pZF90YWJsZSA9CSAgICAgaWRfdGFibGUsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPSAgMSwKLQkubnVtX2J1bGtfaW4gPQkgICAgIDEsCi0JLm51bV9idWxrX291dCA9CSAgICAgMSwKIAkubnVtX3BvcnRzID0JICAgICAxLAogCS5vcGVuID0JCSAgICAga2xzaV8xMDVfb3BlbiwKIAkuY2xvc2UgPQkgICAgIGtsc2lfMTA1X2Nsb3NlLApAQCAtMTk0LDcgKzE5MSw3IEBACiAJaWYgKHJjIDwgMCkKIAkJZXJyKCJDaGFuZ2UgcG9ydCBzZXR0aW5ncyBmYWlsZWQgKGVycm9yID0gJWQpIiwgcmMpOwogCWluZm8oIiVzIC0gJWQgYnl0ZSBibG9jaywgYmF1ZHJhdGUgJXgsIGRhdGFiaXRzICVkLCB1MSAlZCwgdTIgJWQiLAotCSAgICBfX0ZVTkNUSU9OX18sCisJICAgIF9fZnVuY19fLAogCSAgICBzZXR0aW5ncy0+cGt0bGVuLAogCSAgICBzZXR0aW5ncy0+YmF1ZHJhdGUsIHNldHRpbmdzLT5kYXRhYml0cywKIAkgICAgc2V0dGluZ3MtPnVua25vd24xLCBzZXR0aW5ncy0+dW5rbm93bjIpOwpAQCAtMjI1LDcgKzIyMiw3IEBACiAJX191OCBzdGF0dXNfYnVmW0tMU0lfU1RBVFVTQlVGX0xFTl0gPSB7IC0xLC0xfTsKIAlfX3UxNiBzdGF0dXM7CiAKLQlpbmZvKCIlcyAtIHNlbmRpbmcgU0lPIFBvbGwgcmVxdWVzdCIsIF9fRlVOQ1RJT05fXyk7CisJaW5mbygiJXMgLSBzZW5kaW5nIFNJTyBQb2xsIHJlcXVlc3QiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJjID0gdXNiX2NvbnRyb2xfbXNnKHBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJICAgICB1c2JfcmN2Y3RybHBpcGUocG9ydC0+c2VyaWFsLT5kZXYsIDApLAogCQkJICAgICBLTDVLVVNCMTA1QV9TSU9fUE9MTCwKQEAgLTI0MCw3ICsyMzcsNyBAQAogCWVsc2UgewogCQlzdGF0dXMgPSBsZTE2X3RvX2NwdSgqKHUxNiAqKXN0YXR1c19idWYpOwogCi0JCWluZm8oIiVzIC0gcmVhZCBzdGF0dXMgJXggJXgiLCBfX0ZVTkNUSU9OX18sCisJCWluZm8oIiVzIC0gcmVhZCBzdGF0dXMgJXggJXgiLCBfX2Z1bmNfXywKIAkJICAgICBzdGF0dXNfYnVmWzBdLCBzdGF0dXNfYnVmWzFdKTsKIAogCQkqbGluZV9zdGF0ZV9wID0ga2xzaV8xMDVfc3RhdHVzMmxpbmVzdGF0ZShzdGF0dXMpOwpAQCAtMjY4LDcgKzI2NSw3IEBACiAJCXByaXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qga2xzaV8xMDVfcHJpdmF0ZSksCiAJCQkJCQkgICBHRlBfS0VSTkVMKTsKIAkJaWYgKCFwcml2KSB7Ci0JCQlkYmcoIiVza21hbGxvYyBmb3Iga2xzaV8xMDVfcHJpdmF0ZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXNrbWFsbG9jIGZvciBrbHNpXzEwNV9wcml2YXRlIGZhaWxlZC4iLCBfX2Z1bmNfXyk7CiAJCQlpLS07CiAJCQlnb3RvIGVycl9jbGVhbnVwOwogCQl9CkBAIC0yOTgsNyArMjk1LDcgQEAKIAkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0ga21hbGxvYyAoVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFLAogCQkJCQkJCUdGUF9LRVJORUwpOwogCQkJaWYgKCF1cmItPnRyYW5zZmVyX2J1ZmZlcikgewotCQkJCWVycigiJXMgLSBvdXQgb2YgbWVtb3J5IGZvciB1cmIgYnVmZmVycy4iLCBfX0ZVTkNUSU9OX18pOworCQkJCWVycigiJXMgLSBvdXQgb2YgbWVtb3J5IGZvciB1cmIgYnVmZmVycy4iLCBfX2Z1bmNfXyk7CiAJCQkJZ290byBlcnJfY2xlYW51cDsKIAkJCX0KIAkJfQpAQCAtMzI4LDcgKzMyNSw3IEBACiB7CiAJaW50IGk7CiAJCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCS8qIHN0b3AgcmVhZHMgYW5kIHdyaXRlcyBvbiBhbGwgcG9ydHMgKi8KIAlmb3IgKGk9MDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKQEAgLTM3Myw3ICszNzAsNyBAQAogCXN0cnVjdCBrbHNpXzEwNV9wb3J0X3NldHRpbmdzIGNmZzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyogZm9yY2UgbG93X2xhdGVuY3kgb24gc28gdGhhdCBvdXIgdHR5X3B1c2ggYWN0dWFsbHkgZm9yY2VzCiAJICogdGhlIGRhdGEgdGhyb3VnaApAQCAtNDE5LDcgKzQxNiw3IEBACiAKIAlyYyA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfS0VSTkVMKTsKIAlpZiAocmMpIHsKLQkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmMpOworCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkIiwgX19mdW5jX18sIHJjKTsKIAkJcmV0dmFsID0gcmM7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC00MzcsMTQgKzQzNCwxNCBAQAogCQllcnIoIkVuYWJsaW5nIHJlYWQgZmFpbGVkIChlcnJvciA9ICVkKSIsIHJjKTsKIAkJcmV0dmFsID0gcmM7CiAJfSBlbHNlIAotCQlkYmcoIiVzIC0gZW5hYmxlZCByZWFkaW5nIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIGVuYWJsZWQgcmVhZGluZyIsIF9fZnVuY19fKTsKIAogCXJjID0ga2xzaV8xMDVfZ2V0X2xpbmVfc3RhdGUocG9ydCwgJmxpbmVfc3RhdGUpOwogCWlmIChyYyA+PSAwKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlICgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCQlwcml2LT5saW5lX3N0YXRlID0gbGluZV9zdGF0ZTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJZGJnKCIlcyAtIHJlYWQgbGluZSBzdGF0ZSAweCVseCIsIF9fRlVOQ1RJT05fXywgbGluZV9zdGF0ZSk7CisJCWRiZygiJXMgLSByZWFkIGxpbmUgc3RhdGUgMHglbHgiLCBfX2Z1bmNfXywgbGluZV9zdGF0ZSk7CiAJCXJldHZhbCA9IDA7CiAJfSBlbHNlCiAJCXJldHZhbCA9IHJjOwpAQCAtNDU5LDcgKzQ1Niw3IEBACiAJc3RydWN0IGtsc2lfMTA1X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJaW50IHJjOwogCi0JZGJnKCIlcyBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJbXV0ZXhfbG9jaygmcG9ydC0+c2VyaWFsLT5kaXNjX211dGV4KTsKIAlpZiAoIXBvcnQtPnNlcmlhbC0+ZGlzY29ubmVjdGVkKSB7CkBAIC01MDIsNyArNDk5LDcgQEAKIAlpbnQgcmVzdWx0LCBzaXplOwogCWludCBieXRlc19zZW50PTA7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJd2hpbGUgKGNvdW50ID4gMCkgewogCQkvKiB0cnkgdG8gZmluZCBhIGZyZWUgdXJiICh3cml0ZSAwIGJ5dGVzIGlmIG5vbmUpICovCkBAIC01MTQsMjEgKzUxMSwyMSBAQAogCQlmb3IgKGk9MDsgaTxOVU1fVVJCUzsgaSsrKSB7CiAJCQlpZiAocHJpdi0+d3JpdGVfdXJiX3Bvb2xbaV0tPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MpIHsKIAkJCQl1cmIgPSBwcml2LT53cml0ZV91cmJfcG9vbFtpXTsKLQkJCQlkYmcoIiVzIC0gdXNpbmcgcG9vbCBVUkIgJWQiLCBfX0ZVTkNUSU9OX18sIGkpOworCQkJCWRiZygiJXMgLSB1c2luZyBwb29sIFVSQiAlZCIsIF9fZnVuY19fLCBpKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCiAJCWlmICh1cmI9PU5VTEwpIHsKLQkJCWRiZygiJXMgLSBubyBtb3JlIGZyZWUgdXJicyIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gbm8gbW9yZSBmcmVlIHVyYnMiLCBfX2Z1bmNfXyk7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAogCQlpZiAodXJiLT50cmFuc2Zlcl9idWZmZXIgPT0gTlVMTCkgewogCQkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBrbWFsbG9jIChVUkJfVFJBTlNGRVJfQlVGRkVSX1NJWkUsIEdGUF9BVE9NSUMpOwogCQkJaWYgKHVyYi0+dHJhbnNmZXJfYnVmZmVyID09IE5VTEwpIHsKLQkJCQllcnIoIiVzIC0gbm8gbW9yZSBrZXJuZWwgbWVtb3J5Li4uIiwgX19GVU5DVElPTl9fKTsKKwkJCQllcnIoIiVzIC0gbm8gbW9yZSBrZXJuZWwgbWVtb3J5Li4uIiwgX19mdW5jX18pOwogCQkJCWdvdG8gZXhpdDsKIAkJCX0KIAkJfQpAQCAtNTU0LDcgKzU1MSw3IEBACiAJCS8qIHNlbmQgdGhlIGRhdGEgb3V0IHRoZSBidWxrIHBvcnQgKi8KIAkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJlc3VsdCkgewotCQkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogCQkJZ290byBleGl0OwogCQl9CiAJCWJ1ZiArPSBzaXplOwpAQCAtNTcwLDEzICs1NjcsMTMgQEAKIAogc3RhdGljIHZvaWQga2xzaV8xMDVfd3JpdGVfYnVsa19jYWxsYmFjayAoIHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKHN0YXR1cykgewotCQlkYmcoIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fZnVuY19fLAogCQkgICAgc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KQEAgLTYwMyw3ICs2MDAsNyBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAotCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19GVU5DVElPTl9fLCBjaGFycyk7CisJZGJnKCIlcyAtIHJldHVybnMgJWQiLCBfX2Z1bmNfXywgY2hhcnMpOwogCXJldHVybiAoY2hhcnMpOwogfQogCkBAIC02MjMsNyArNjIwLDcgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKLQlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgcm9vbSk7CisJZGJnKCIlcyAtIHJldHVybnMgJWQiLCBfX2Z1bmNfXywgcm9vbSk7CiAJcmV0dXJuIChyb29tKTsKIH0KIApAQCAtNjMxLDE4ICs2MjgsMTggQEAKIAogc3RhdGljIHZvaWQga2xzaV8xMDVfcmVhZF9idWxrX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IGtsc2lfMTA1X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJaW50IHJjOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAkvKiBUaGUgdXJiIG1pZ2h0IGhhdmUgYmVlbiBraWxsZWQuICovCiAJaWYgKHN0YXR1cykgewotCQlkYmcoIiVzIC0gbm9uemVybyByZWFkIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fRlVOQ1RJT05fXywKKwkJZGJnKCIlcyAtIG5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX2Z1bmNfXywKIAkJICAgIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CkBAIC02NTIsMTIgKzY0OSwxMiBAQAogCSAqLwogCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPT0gMCkgewogCQkvKiBlbXB0eSB1cmJzIHNlZW0gdG8gaGFwcGVuLCB3ZSBpZ25vcmUgdGhlbSAqLwotCQkvKiBkYmcoIiVzIC0gZW10cHkgVVJCIiwgX19GVU5DVElPTl9fKTsgKi8KKwkJLyogZGJnKCIlcyAtIGVtdHB5IFVSQiIsIF9fZnVuY19fKTsgKi8KIAkgICAgICAgOwogCX0gZWxzZSBpZiAodXJiLT5hY3R1YWxfbGVuZ3RoIDw9IDIpIHsKLQkJZGJnKCIlcyAtIHNpemUgJWQgVVJCIG5vdCB1bmRlcnN0b29kIiwgX19GVU5DVElPTl9fLAorCQlkYmcoIiVzIC0gc2l6ZSAlZCBVUkIgbm90IHVuZGVyc3Rvb2QiLCBfX2Z1bmNfXywKIAkJICAgIHVyYi0+YWN0dWFsX2xlbmd0aCk7Ci0JCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLAorCQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLAogCQkJCSAgICAgIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CiAJfSBlbHNlIHsKIAkJaW50IGJ5dGVzX3NlbnQgPSAoKF9fdTggKikgZGF0YSlbMF0gKwpAQCAtNjY5LDEyICs2NjYsMTIgQEAKIAkJICogaW50ZXJtaXhlZCB0dHlfZmxpcF9idWZmZXJfcHVzaCgpcwogCQkgKiBGSVhNRQogCQkgKi8gCi0JCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLAorCQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLAogCQkJCSAgICAgIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CiAKIAkJaWYgKGJ5dGVzX3NlbnQgKyAyID4gdXJiLT5hY3R1YWxfbGVuZ3RoKSB7CiAJCQlkYmcoIiVzIC0gdHJ5aW5nIHRvIHJlYWQgbW9yZSBkYXRhIHRoYW4gYXZhaWxhYmxlIgotCQkJICAgICIgKCVkIHZzLiAlZCkiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgIiAoJWQgdnMuICVkKSIsIF9fZnVuY19fLAogCQkJICAgIGJ5dGVzX3NlbnQrMiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJCS8qIGNhcCBhdCBpbXBsaWVkIGxpbWl0ICovCiAJCQlieXRlc19zZW50ID0gdXJiLT5hY3R1YWxfbGVuZ3RoIC0gMjsKQEAgLTY5Nyw3ICs2OTQsNyBAQAogCQkgICAgICBwb3J0KTsKIAlyYyA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAocmMpCi0JCWVycigiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmMpOworCQllcnIoIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWQiLCBfX2Z1bmNfXywgcmMpOwogfSAvKiBrbHNpXzEwNV9yZWFkX2J1bGtfY2FsbGJhY2sgKi8KIAogCkBAIC03MDUsMTIgKzcwMiwxNCBAQAogCQkJCSAgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKIAlzdHJ1Y3Qga2xzaV8xMDVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKLQl1bnNpZ25lZCBpbnQgaWZsYWcgPSBwb3J0LT50dHktPnRlcm1pb3MtPmNfaWZsYWc7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPnR0eTsKKwl1bnNpZ25lZCBpbnQgaWZsYWcgPSB0dHktPnRlcm1pb3MtPmNfaWZsYWc7CiAJdW5zaWduZWQgaW50IG9sZF9pZmxhZyA9IG9sZF90ZXJtaW9zLT5jX2lmbGFnOwotCXVuc2lnbmVkIGludCBjZmxhZyA9IHBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKwl1bnNpZ25lZCBpbnQgY2ZsYWcgPSB0dHktPnRlcm1pb3MtPmNfY2ZsYWc7CiAJdW5zaWduZWQgaW50IG9sZF9jZmxhZyA9IG9sZF90ZXJtaW9zLT5jX2NmbGFnOwogCXN0cnVjdCBrbHNpXzEwNV9wb3J0X3NldHRpbmdzIGNmZzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwZWVkX3QgYmF1ZDsKIAkKIAkvKiBsb2NrIHdoaWxlIHdlIGFyZSBtb2RpZnlpbmcgdGhlIHNldHRpbmdzICovCiAJc3Bpbl9sb2NrX2lycXNhdmUgKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC03MTgsMTAgKzcxNywxMiBAQAogCS8qCiAJICogVXBkYXRlIGJhdWQgcmF0ZQogCSAqLworCWJhdWQgPSB0dHlfZ2V0X2JhdWRfcmF0ZSh0dHkpOworCiAJaWYoIChjZmxhZyAmIENCQVVEKSAhPSAob2xkX2NmbGFnICYgQ0JBVUQpICkgewogCSAgICAgICAgLyogcmVhc3NlcnQgRFRSIGFuZCAobWF5YmUpIFJUUyBvbiB0cmFuc2l0aW9uIGZyb20gQjAgKi8KIAkJaWYoIChvbGRfY2ZsYWcgJiBDQkFVRCkgPT0gQjAgKSB7Ci0JCQlkYmcoIiVzOiBiYXVkIHdhcyBCMCIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzOiBiYXVkIHdhcyBCMCIsIF9fZnVuY19fKTsKICNpZiAwCiAJCQlwcml2LT5jb250cm9sX3N0YXRlIHw9IFRJT0NNX0RUUjsKIAkJCS8qIGRvbid0IHNldCBSVFMgaWYgdXNpbmcgaGFyZHdhcmUgZmxvdyBjb250cm9sICovCkBAIC03MzEsOCArNzMyLDggQEAKIAkJCW1jdF91MjMyX3NldF9tb2RlbV9jdHJsKHNlcmlhbCwgcHJpdi0+Y29udHJvbF9zdGF0ZSk7CiAjZW5kaWYKIAkJfQotCQkKLQkJc3dpdGNoKHR0eV9nZXRfYmF1ZF9yYXRlKHBvcnQtPnR0eSkpIHsKKwl9CisJc3dpdGNoKGJhdWQpIHsKIAkJY2FzZSAwOiAvKiBoYW5kbGVkIGJlbG93ICovCiAJCQlicmVhazsKIAkJY2FzZSAxMjAwOgpAQCAtNzYwLDM1ICs3NjEsMzYgQEAKIAkJCXByaXYtPmNmZy5iYXVkcmF0ZSA9IGtsNWt1c2IxMDVhX3Npb19iMTE1MjAwOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQllcnIoIktMU0kgVVNCLT5TZXJpYWwgY29udmVydGVyOiIKKwkJCWRiZygiS0xTSSBVU0ItPlNlcmlhbCBjb252ZXJ0ZXI6IgogCQkJICAgICIgdW5zdXBwb3J0ZWQgYmF1ZHJhdGUgcmVxdWVzdCwgdXNpbmcgZGVmYXVsdCIKIAkJCSAgICAiIG9mIDk2MDAiKTsKIAkJCXByaXYtPmNmZy5iYXVkcmF0ZSA9IGtsNWt1c2IxMDVhX3Npb19iOTYwMDsKKwkJCWJhdWQgPSA5NjAwOwogCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKChjZmxhZyAmIENCQVVEKSA9PSBCMCApIHsKLQkJCWRiZygiJXM6IGJhdWQgaXMgQjAiLCBfX0ZVTkNUSU9OX18pOwotCQkJLyogRHJvcCBSVFMgYW5kIERUUiAqLwotCQkJLyogbWF5YmUgdGhpcyBzaG91bGQgYmUgc2ltdWxhdGVkIGJ5IHNlbmRpbmcgcmVhZAotCQkJICogZGlzYWJsZSBhbmQgcmVhZCBlbmFibGUgbWVzc2FnZXM/Ci0JCQkgKi8KLQkJCTsKLSNpZiAwCi0JCQlwcml2LT5jb250cm9sX3N0YXRlICY9IH4oVElPQ01fRFRSIHwgVElPQ01fUlRTKTsKLSAgICAgICAgCQltY3RfdTIzMl9zZXRfbW9kZW1fY3RybChzZXJpYWwsIHByaXYtPmNvbnRyb2xfc3RhdGUpOwotI2VuZGlmCi0JCX0KIAl9CisJaWYgKChjZmxhZyAmIENCQVVEKSA9PSBCMCApIHsKKwkJZGJnKCIlczogYmF1ZCBpcyBCMCIsIF9fZnVuY19fKTsKKwkJLyogRHJvcCBSVFMgYW5kIERUUiAqLworCQkvKiBtYXliZSB0aGlzIHNob3VsZCBiZSBzaW11bGF0ZWQgYnkgc2VuZGluZyByZWFkCisJCSAqIGRpc2FibGUgYW5kIHJlYWQgZW5hYmxlIG1lc3NhZ2VzPworCQkgKi8KKwkJOworI2lmIDAKKwkJcHJpdi0+Y29udHJvbF9zdGF0ZSAmPSB+KFRJT0NNX0RUUiB8IFRJT0NNX1JUUyk7CisgICAgICAgCQltY3RfdTIzMl9zZXRfbW9kZW1fY3RybChzZXJpYWwsIHByaXYtPmNvbnRyb2xfc3RhdGUpOworI2VuZGlmCisJfQorCXR0eV9lbmNvZGVfYmF1ZF9yYXRlKHR0eSwgYmF1ZCwgYmF1ZCk7CiAKIAlpZiAoKGNmbGFnICYgQ1NJWkUpICE9IChvbGRfY2ZsYWcgJiBDU0laRSkpIHsKIAkJLyogc2V0IHRoZSBudW1iZXIgb2YgZGF0YSBiaXRzICovCiAJCXN3aXRjaCAoY2ZsYWcgJiBDU0laRSkgewogCQljYXNlIENTNToKLQkJCWRiZygiJXMgLSA1IGJpdHMvYnl0ZSBub3Qgc3VwcG9ydGVkIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSA1IGJpdHMvYnl0ZSBub3Qgc3VwcG9ydGVkIiwgX19mdW5jX18pOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAkJCXJldHVybiA7CiAJCWNhc2UgQ1M2OgotCQkJZGJnKCIlcyAtIDYgYml0cy9ieXRlIG5vdCBzdXBwb3J0ZWQiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIDYgYml0cy9ieXRlIG5vdCBzdXBwb3J0ZWQiLCBfX2Z1bmNfXyk7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCQkJcmV0dXJuIDsKIAkJY2FzZSBDUzc6CkBAIC04MTAsNiArODEyLDggQEAKIAlpZiAoKGNmbGFnICYgKFBBUkVOQnxQQVJPREQpKSAhPSAob2xkX2NmbGFnICYgKFBBUkVOQnxQQVJPREQpKQogCSAgICB8fCAoY2ZsYWcgJiBDU1RPUEIpICE9IChvbGRfY2ZsYWcgJiBDU1RPUEIpICkgewogCQkKKwkJLyogTm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgKi8KKwkJdHR5LT50ZXJtaW9zLT5jX2NmbGFnICY9IH4oUEFSRU5CfFBBUk9ERHxDU1RPUEIpOwogI2lmIDAKIAkJcHJpdi0+bGFzdF9sY3IgPSAwOwogCkBAIC04MzcsNiArODQxLDggQEAKIAkgICAgfHwgKGlmbGFnICYgSVhPTikgIT0gKG9sZF9pZmxhZyAmIElYT04pCiAJICAgIHx8ICAoY2ZsYWcgJiBDUlRTQ1RTKSAhPSAob2xkX2NmbGFnICYgQ1JUU0NUUykgKSB7CiAJCQorCQkvKiBOb3QgY3VycmVudGx5IHN1cHBvcnRlZCAqLworCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJj0gfkNSVFNDVFM7CiAJCS8qIERyb3AgRFRSL1JUUyBpZiBubyBmbG93IGNvbnRyb2wgb3RoZXJ3aXNlIGFzc2VydCAqLwogI2lmIDAKIAkJaWYgKChpZmxhZyAmIElYT0ZGKSB8fCAoaWZsYWcgJiBJWE9OKSB8fCAoY2ZsYWcgJiBDUlRTQ1RTKSApCkBAIC04NjIsNyArODY4LDcgQEAKIAlzdHJ1Y3QgbWN0X3UyMzJfcHJpdmF0ZSAqcHJpdiA9IChzdHJ1Y3QgbWN0X3UyMzJfcHJpdmF0ZSAqKXBvcnQtPnByaXZhdGU7CiAJdW5zaWduZWQgY2hhciBsY3IgPSBwcml2LT5sYXN0X2xjcjsKIAotCWRiZygiJXNzdGF0ZT0lZCIsIF9fRlVOQ1RJT05fXywgYnJlYWtfc3RhdGUpOworCWRiZygiJXNzdGF0ZT0lZCIsIF9fZnVuY19fLCBicmVha19zdGF0ZSk7CiAKIAlpZiAoYnJlYWtfc3RhdGUpCiAJCWxjciB8PSBNQ1RfVTIzMl9TRVRfQlJFQUs7CkBAIC04NzcsNyArODgzLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByYzsKIAl1bnNpZ25lZCBsb25nIGxpbmVfc3RhdGU7Ci0JZGJnKCIlcyAtIHJlcXVlc3QsIGp1c3QgZ3Vlc3NpbmciLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSByZXF1ZXN0LCBqdXN0IGd1ZXNzaW5nIiwgX19mdW5jX18pOwogCiAJcmMgPSBrbHNpXzEwNV9nZXRfbGluZV9zdGF0ZShwb3J0LCAmbGluZV9zdGF0ZSk7CiAJaWYgKHJjIDwgMCkgewpAQCAtODg5LDcgKzg5NSw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUgKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJcHJpdi0+bGluZV9zdGF0ZSA9IGxpbmVfc3RhdGU7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlkYmcoIiVzIC0gcmVhZCBsaW5lIHN0YXRlIDB4JWx4IiwgX19GVU5DVElPTl9fLCBsaW5lX3N0YXRlKTsKKwlkYmcoIiVzIC0gcmVhZCBsaW5lIHN0YXRlIDB4JWx4IiwgX19mdW5jX18sIGxpbmVfc3RhdGUpOwogCXJldHVybiAoaW50KWxpbmVfc3RhdGU7CiB9CiAKQEAgLTg5OCw3ICs5MDQsNyBAQAogewogCWludCByZXR2YWwgPSAtRUlOVkFMOwogCQotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIC8qIGlmIHRoaXMgZXZlciBnZXRzIGltcGxlbWVudGVkLCBpdCBzaG91bGQgYmUgZG9uZSBzb21ldGhpbmcgbGlrZSB0aGlzOgogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CkBAIC05MjQsNyArOTMwLDcgQEAKIAogc3RhdGljIHZvaWQga2xzaV8xMDVfdGhyb3R0bGUgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7Ci0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAl1c2Jfa2lsbF91cmIocG9ydC0+cmVhZF91cmIpOwogfQogCkBAIC05MzIsMTIgKzkzOCwxMiBAQAogewogCWludCByZXN1bHQ7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJcG9ydC0+cmVhZF91cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAocmVzdWx0KQotCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkIiwgX19GVU5DVElPTl9fLAorCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkIiwgX19mdW5jX18sCiAJCSAgICByZXN1bHQpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwva29iaWxfc2N0LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwva29iaWxfc2N0LmMKaW5kZXggMTdiM2JhZS4uNjkzZjAwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2tvYmlsX3NjdC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rb2JpbF9zY3QuYwpAQCAtMTEzLDEwICsxMTMsNiBAQAogCS5kZXNjcmlwdGlvbiA9CQkiS09CSUwgVVNCIHNtYXJ0IGNhcmQgdGVybWluYWwiLAogCS51c2JfZHJpdmVyID0gCQkma29iaWxfZHJpdmVyLAogCS5pZF90YWJsZSA9CQlpZF90YWJsZSwKLQkubnVtX2ludGVycnVwdF9pbiA9CU5VTV9ET05UX0NBUkUsCi0JLm51bV9pbnRlcnJ1cHRfb3V0ID0gCU5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX2luID0JCTAsCi0JLm51bV9idWxrX291dCA9CQkwLAogCS5udW1fcG9ydHMgPQkJMSwKIAkuYXR0YWNoID0JCWtvYmlsX3N0YXJ0dXAsCiAJLnNodXRkb3duID0JCWtvYmlsX3NodXRkb3duLApAQCAtMTM5LDcgKzEzNSw2IEBACiAJaW50IGZpbGxlZDsgIC8vIGluZGV4IG9mIHRoZSBsYXN0IGNoYXIgaW4gYnVmCiAJaW50IGN1cl9wb3M7IC8vIGluZGV4IG9mIHRoZSBuZXh0IGNoYXIgdG8gc2VuZCBpbiBidWYKIAlfX3UxNiBkZXZpY2VfdHlwZTsKLQlpbnQgbGluZV9zdGF0ZTsKIH07CiAKIApAQCAtMTYxLDcgKzE1Niw2IEBACiAJcHJpdi0+ZmlsbGVkID0gMDsKIAlwcml2LT5jdXJfcG9zID0gMDsKIAlwcml2LT5kZXZpY2VfdHlwZSA9IGxlMTZfdG9fY3B1KHNlcmlhbC0+ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7Ci0JcHJpdi0+bGluZV9zdGF0ZSA9IDA7CiAKIAlzd2l0Y2ggKHByaXYtPmRldmljZV90eXBlKXsKIAljYXNlIEtPQklMX0FEQVBURVJfQl9QUk9EVUNUX0lEOgpAQCAtMTg5LDExICsxODMsMTEgQEAKICAJZm9yIChpID0gMDsgaSA8IGFsdHNldHRpbmctPmRlc2MuYk51bUVuZHBvaW50czsgaSsrKSB7CiAJCWVuZHBvaW50ID0gJmFsdHNldHRpbmctPmVuZHBvaW50W2ldOwogCQlpZiAodXNiX2VuZHBvaW50X2lzX2ludF9vdXQoJmVuZHBvaW50LT5kZXNjKSkgewotCQkgCWRiZygiJXMgRm91bmQgaW50ZXJydXB0IG91dCBlbmRwb2ludC4gQWRkcmVzczogJWQiLCBfX0ZVTkNUSU9OX18sIGVuZHBvaW50LT5kZXNjLmJFbmRwb2ludEFkZHJlc3MpOworCQkgCWRiZygiJXMgRm91bmQgaW50ZXJydXB0IG91dCBlbmRwb2ludC4gQWRkcmVzczogJWQiLCBfX2Z1bmNfXywgZW5kcG9pbnQtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyk7CiAJCSAJcHJpdi0+d3JpdGVfaW50X2VuZHBvaW50X2FkZHJlc3MgPSBlbmRwb2ludC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzOwogIAkJfQogCQlpZiAodXNiX2VuZHBvaW50X2lzX2ludF9pbigmZW5kcG9pbnQtPmRlc2MpKSB7Ci0JCSAJZGJnKCIlcyBGb3VuZCBpbnRlcnJ1cHQgaW4gIGVuZHBvaW50LiBBZGRyZXNzOiAlZCIsIF9fRlVOQ1RJT05fXywgZW5kcG9pbnQtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyk7CisJCSAJZGJnKCIlcyBGb3VuZCBpbnRlcnJ1cHQgaW4gIGVuZHBvaW50LiBBZGRyZXNzOiAlZCIsIF9fZnVuY19fLCBlbmRwb2ludC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzKTsKIAkJIAlwcml2LT5yZWFkX2ludF9lbmRwb2ludF9hZGRyZXNzID0gZW5kcG9pbnQtPmRlc2MuYkVuZHBvaW50QWRkcmVzczsKIAkgCX0KIAl9CkBAIC0yMDQsNyArMTk4LDcgQEAKIHN0YXRpYyB2b2lkIGtvYmlsX3NodXRkb3duIChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQogewogCWludCBpOwotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBzZXJpYWwtPnBvcnRbMF0tPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgc2VyaWFsLT5wb3J0WzBdLT5udW1iZXIpOwogCiAJZm9yIChpPTA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgKytpKSB7CiAJCXdoaWxlIChzZXJpYWwtPnBvcnRbaV0tPm9wZW5fY291bnQgPiAwKSB7CkBAIC0yMjQsOSArMjE4LDggQEAKIAlpbnQgdHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IDg7CiAJaW50IHdyaXRlX3VyYl90cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gODsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKLQlwcml2LT5saW5lX3N0YXRlID0gMDsKIAogCS8vIHNvbWVvbmUgc2V0cyB0aGUgZGV2IHRvIDAgaWYgdGhlIGNsb3NlIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQKIAlwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKQEAgLTI1MiwxMCArMjQ1LDEwIEBACiAJCiAJLy8gYWxsb2NhdGUgd3JpdGVfdXJiCiAJaWYgKCFwb3J0LT53cml0ZV91cmIpIHsgCi0JCWRiZygiJXMgLSBwb3J0ICVkICBBbGxvY2F0aW5nIHBvcnQtPndyaXRlX3VyYiIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwkJZGJnKCIlcyAtIHBvcnQgJWQgIEFsbG9jYXRpbmcgcG9ydC0+d3JpdGVfdXJiIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJCXBvcnQtPndyaXRlX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7ICAKIAkJaWYgKCFwb3J0LT53cml0ZV91cmIpIHsKLQkJCWRiZygiJXMgLSBwb3J0ICVkIHVzYl9hbGxvY191cmIgZmFpbGVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCQkJZGJnKCIlcyAtIHBvcnQgJWQgdXNiX2FsbG9jX3VyYiBmYWlsZWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAkJCWtmcmVlKHRyYW5zZmVyX2J1ZmZlcik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMjgxLDcgKzI3NCw3IEBACiAJCQkJICB0cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAogCQkJCSAgS09CSUxfVElNRU9VVAogCQkpOwotCWRiZygiJXMgLSBwb3J0ICVkIFNlbmQgZ2V0X0hXX3ZlcnNpb24gVVJCIHJldHVybnM6ICVpIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIHJlc3VsdCk7CisJZGJnKCIlcyAtIHBvcnQgJWQgU2VuZCBnZXRfSFdfdmVyc2lvbiBVUkIgcmV0dXJuczogJWkiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCByZXN1bHQpOwogCWRiZygiSGFyd2FyZSB2ZXJzaW9uOiAlaS4laS4laSIsIHRyYW5zZmVyX2J1ZmZlclswXSwgdHJhbnNmZXJfYnVmZmVyWzFdLCB0cmFuc2Zlcl9idWZmZXJbMl0gKTsKIAkKIAkvLyBnZXQgZmlybXdhcmUgdmVyc2lvbgpAQCAtMjk1LDcgKzI4OCw3IEBACiAJCQkJICB0cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAogCQkJCSAgS09CSUxfVElNRU9VVAogCQkpOwotCWRiZygiJXMgLSBwb3J0ICVkIFNlbmQgZ2V0X0ZXX3ZlcnNpb24gVVJCIHJldHVybnM6ICVpIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIHJlc3VsdCk7CisJZGJnKCIlcyAtIHBvcnQgJWQgU2VuZCBnZXRfRldfdmVyc2lvbiBVUkIgcmV0dXJuczogJWkiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCByZXN1bHQpOwogCWRiZygiRmlybXdhcmUgdmVyc2lvbjogJWkuJWkuJWkiLCB0cmFuc2Zlcl9idWZmZXJbMF0sIHRyYW5zZmVyX2J1ZmZlclsxXSwgdHJhbnNmZXJfYnVmZmVyWzJdICk7CiAKIAlpZiAocHJpdi0+ZGV2aWNlX3R5cGUgPT0gS09CSUxfQURBUFRFUl9CX1BST0RVQ1RfSUQgfHwgcHJpdi0+ZGV2aWNlX3R5cGUgPT0gS09CSUxfQURBUFRFUl9LX1BST0RVQ1RfSUQpIHsKQEAgLTMxMCw3ICszMDMsNyBAQAogCQkJCQkgIDAsCiAJCQkJCSAgS09CSUxfVElNRU9VVAogCQkJKTsKLQkJZGJnKCIlcyAtIHBvcnQgJWQgU2VuZCBzZXRfYmF1ZHJhdGUgVVJCIHJldHVybnM6ICVpIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIHJlc3VsdCk7CisJCWRiZygiJXMgLSBwb3J0ICVkIFNlbmQgc2V0X2JhdWRyYXRlIFVSQiByZXR1cm5zOiAlaSIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIHJlc3VsdCk7CiAJCQogCQkvLyByZXNldCBhbGwgcXVldWVzCiAJCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyggcG9ydC0+c2VyaWFsLT5kZXYsIApAQCAtMzIzLDEzICszMTYsMTMgQEAKIAkJCQkJICAwLAogCQkJCQkgIEtPQklMX1RJTUVPVVQKIAkJCSk7Ci0JCWRiZygiJXMgLSBwb3J0ICVkIFNlbmQgcmVzZXRfYWxsX3F1ZXVlcyBVUkIgcmV0dXJuczogJWkiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlciwgcmVzdWx0KTsKKwkJZGJnKCIlcyAtIHBvcnQgJWQgU2VuZCByZXNldF9hbGxfcXVldWVzIFVSQiByZXR1cm5zOiAlaSIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIHJlc3VsdCk7CiAJfQogCWlmIChwcml2LT5kZXZpY2VfdHlwZSA9PSBLT0JJTF9VU0JUV0lOX1BST0RVQ1RfSUQgfHwgcHJpdi0+ZGV2aWNlX3R5cGUgPT0gS09CSUxfQURBUFRFUl9CX1BST0RVQ1RfSUQgfHwKIAkgICAgcHJpdi0+ZGV2aWNlX3R5cGUgPT0gS09CSUxfS0FBTl9TSU1fUFJPRFVDVF9JRCkgewogCQkvLyBzdGFydCByZWFkaW5nIChBZGFwdGVyIEIgJ2NhdXNlIFBOUCBzdHJpbmcpCiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKCBwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfQVRPTUlDICApOyAKLQkJZGJnKCIlcyAtIHBvcnQgJWQgU2VuZCByZWFkIFVSQiByZXR1cm5zOiAlaSIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCByZXN1bHQpOworCQlkYmcoIiVzIC0gcG9ydCAlZCBTZW5kIHJlYWQgVVJCIHJldHVybnM6ICVpIiwgX19mdW5jX18sIHBvcnQtPm51bWJlciwgcmVzdWx0KTsKIAl9CiAKIAlrZnJlZSh0cmFuc2Zlcl9idWZmZXIpOwpAQCAtMzM5LDcgKzMzMiw3IEBACiAKIHN0YXRpYyB2b2lkIGtvYmlsX2Nsb3NlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKHBvcnQtPndyaXRlX3VyYikgewogCQl1c2Jfa2lsbF91cmIocG9ydC0+d3JpdGVfdXJiKTsKQEAgLTM1OSwxMSArMzUyLDExIEBACiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogLy8JY2hhciAqZGJnX2RhdGE7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKHN0YXR1cykgewogCQlkYmcoIiVzIC0gcG9ydCAlZCBSZWFkIGludCBzdGF0dXMgbm90IHplcm86ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHBvcnQtPm51bWJlciwgc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzkzLDcgKzM4Niw3IEBACiAJcG9ydC0+aW50ZXJydXB0X2luX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfQVRPTUlDKTsKLQlkYmcoIiVzIC0gcG9ydCAlZCBTZW5kIHJlYWQgVVJCIHJldHVybnM6ICVpIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIHJlc3VsdCk7CisJZGJnKCIlcyAtIHBvcnQgJWQgU2VuZCByZWFkIFVSQiByZXR1cm5zOiAlaSIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIHJlc3VsdCk7CiB9CiAKIApAQCAtNDExLDIxICs0MDQsMjEgQEAKIAlzdHJ1Y3Qga29iaWxfcHJpdmF0ZSAqIHByaXY7CiAKIAlpZiAoY291bnQgPT0gMCkgewotCQlkYmcoIiVzIC0gcG9ydCAlZCB3cml0ZSByZXF1ZXN0IG9mIDAgYnl0ZXMiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJCWRiZygiJXMgLSBwb3J0ICVkIHdyaXRlIHJlcXVlc3Qgb2YgMCBieXRlcyIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCiAJaWYgKGNvdW50ID4gKEtPQklMX0JVRl9MRU5HVEggLSBwcml2LT5maWxsZWQpKSB7Ci0JCWRiZygiJXMgLSBwb3J0ICVkIEVycm9yOiB3cml0ZSByZXF1ZXN0IGJpZ2dlciB0aGFuIGJ1ZmZlciBzaXplIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCQlkYmcoIiVzIC0gcG9ydCAlZCBFcnJvcjogd3JpdGUgcmVxdWVzdCBiaWdnZXIgdGhhbiBidWZmZXIgc2l6ZSIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAkvLyBDb3B5IGRhdGEgdG8gYnVmZmVyCiAJbWVtY3B5IChwcml2LT5idWYgKyBwcml2LT5maWxsZWQsIGJ1ZiwgY291bnQpOwogCi0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIGNvdW50LCBwcml2LT5idWYgKyBwcml2LT5maWxsZWQpOworCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sIGNvdW50LCBwcml2LT5idWYgKyBwcml2LT5maWxsZWQpOwogCiAJcHJpdi0+ZmlsbGVkID0gcHJpdi0+ZmlsbGVkICsgY291bnQ7CiAKQEAgLTQ1Nyw3ICs0NTAsNyBAQAogCiAJCQlwcml2LT5jdXJfcG9zID0gcHJpdi0+Y3VyX3BvcyArIGxlbmd0aDsKIAkJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKCBwb3J0LT53cml0ZV91cmIsIEdGUF9OT0lPICk7Ci0JCQlkYmcoIiVzIC0gcG9ydCAlZCBTZW5kIHdyaXRlIFVSQiByZXR1cm5zOiAlaSIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCByZXN1bHQpOworCQkJZGJnKCIlcyAtIHBvcnQgJWQgU2VuZCB3cml0ZSBVUkIgcmV0dXJuczogJWkiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCByZXN1bHQpOwogCQkJdG9kbyA9IHByaXYtPmZpbGxlZCAtIHByaXYtPmN1cl9wb3M7CiAKIAkJCWlmICh0b2RvID4gMCkgewpAQCAtNDc4LDcgKzQ3MSw3IEBACiAJCQlwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAkJCQogCQkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIoIHBvcnQtPmludGVycnVwdF9pbl91cmIsIEdGUF9OT0lPICk7IAotCQkJZGJnKCIlcyAtIHBvcnQgJWQgU2VuZCByZWFkIFVSQiByZXR1cm5zOiAlaSIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCByZXN1bHQpOworCQkJZGJnKCIlcyAtIHBvcnQgJWQgU2VuZCByZWFkIFVSQiByZXR1cm5zOiAlaSIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIHJlc3VsdCk7CiAJCX0KIAl9CiAJcmV0dXJuIGNvdW50OwpAQCAtNDg3LDcgKzQ4MCw3IEBACiAKIHN0YXRpYyBpbnQga29iaWxfd3JpdGVfcm9vbSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKLQkvL2RiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCS8vZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAlyZXR1cm4gODsKIH0KIApAQCAtNTIyLDE2ICs1MTUsMTMgQEAKIAkJCQkgIEtPQklMX1RJTUVPVVQpOwogCiAJZGJnKCIlcyAtIHBvcnQgJWQgU2VuZCBnZXRfc3RhdHVzX2xpbmVfc3RhdGUgVVJCIHJldHVybnM6ICVpLiBTdGF0dXNsaW5lOiAlMDJ4IiwgCi0JICAgIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCByZXN1bHQsIHRyYW5zZmVyX2J1ZmZlclswXSk7CisJICAgIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIHJlc3VsdCwgdHJhbnNmZXJfYnVmZmVyWzBdKTsKIAotCWlmICgodHJhbnNmZXJfYnVmZmVyWzBdICYgU1VTQkNSX0dTTF9EU1IpICE9IDApIHsKLQkJcHJpdi0+bGluZV9zdGF0ZSB8PSBUSU9DTV9EU1I7Ci0JfSBlbHNlIHsKLQkJcHJpdi0+bGluZV9zdGF0ZSAmPSB+VElPQ01fRFNSOyAKLQl9Ci0KKwlyZXN1bHQgPSAwOworCWlmICgodHJhbnNmZXJfYnVmZmVyWzBdICYgU1VTQkNSX0dTTF9EU1IpICE9IDApCisJCXJlc3VsdCA9IFRJT0NNX0RTUjsKIAlrZnJlZSh0cmFuc2Zlcl9idWZmZXIpOwotCXJldHVybiBwcml2LT5saW5lX3N0YXRlOworCXJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBpbnQgIGtvYmlsX3Rpb2Ntc2V0KHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlLApAQCAtNTQ0LDYgKzUzNCw3IEBACiAJdW5zaWduZWQgY2hhciAqdHJhbnNmZXJfYnVmZmVyOwogCWludCB0cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gODsKIAorCS8qIEZJWE1FOiBsb2NraW5nID8gKi8KIAlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWlmICgocHJpdi0+ZGV2aWNlX3R5cGUgPT0gS09CSUxfVVNCVFdJTl9QUk9EVUNUX0lEKSB8fCAocHJpdi0+ZGV2aWNlX3R5cGUgPT0gS09CSUxfS0FBTl9TSU1fUFJPRFVDVF9JRCkpIHsKIAkJLy8gVGhpcyBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IGlvY3RsIGNhbGxzCkBAIC01NjcsOSArNTU4LDkgQEAKIAogCWlmIChwcml2LT5kZXZpY2VfdHlwZSA9PSBLT0JJTF9BREFQVEVSX0JfUFJPRFVDVF9JRCkgewogCQlpZiAoZHRyICE9IDApCi0JCQlkYmcoIiVzIC0gcG9ydCAlZCBTZXR0aW5nIERUUiIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwkJCWRiZygiJXMgLSBwb3J0ICVkIFNldHRpbmcgRFRSIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJCWVsc2UKLQkJCWRiZygiJXMgLSBwb3J0ICVkIENsZWFyaW5nIERUUiIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwkJCWRiZygiJXMgLSBwb3J0ICVkIENsZWFyaW5nIERUUiIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCQlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coIHBvcnQtPnNlcmlhbC0+ZGV2LCAKIAkJCQkJICB1c2JfcmN2Y3RybHBpcGUocG9ydC0+c2VyaWFsLT5kZXYsIDAgKSwgCiAJCQkJCSAgU1VTQkNSZXF1ZXN0X1NldFN0YXR1c0xpbmVzT3JRdWV1ZXMsCkBAIC01ODEsOSArNTcyLDkgQEAKIAkJCQkJICBLT0JJTF9USU1FT1VUKTsKIAl9IGVsc2UgewogCQlpZiAocnRzICE9IDApCi0JCQlkYmcoIiVzIC0gcG9ydCAlZCBTZXR0aW5nIFJUUyIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwkJCWRiZygiJXMgLSBwb3J0ICVkIFNldHRpbmcgUlRTIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJCWVsc2UKLQkJCWRiZygiJXMgLSBwb3J0ICVkIENsZWFyaW5nIFJUUyIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwkJCWRiZygiJXMgLSBwb3J0ICVkIENsZWFyaW5nIFJUUyIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCQlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coIHBvcnQtPnNlcmlhbC0+ZGV2LCAKIAkJCQkJICB1c2JfcmN2Y3RybHBpcGUocG9ydC0+c2VyaWFsLT5kZXYsIDAgKSwgCiAJCQkJCSAgU1VTQkNSZXF1ZXN0X1NldFN0YXR1c0xpbmVzT3JRdWV1ZXMsCkBAIC01OTQsNyArNTg1LDcgQEAKIAkJCQkJICAwLAogCQkJCQkgIEtPQklMX1RJTUVPVVQpOwogCX0KLQlkYmcoIiVzIC0gcG9ydCAlZCBTZW5kIHNldF9zdGF0dXNfbGluZSBVUkIgcmV0dXJuczogJWkiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlciwgcmVzdWx0KTsKKwlkYmcoIiVzIC0gcG9ydCAlZCBTZW5kIHNldF9zdGF0dXNfbGluZSBVUkIgcmV0dXJuczogJWkiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCByZXN1bHQpOwogCWtmcmVlKHRyYW5zZmVyX2J1ZmZlcik7CiAJcmV0dXJuIChyZXN1bHQgPCAwKSA/IHJlc3VsdCA6IDA7CiB9CkBAIC02ODcsNyArNjc4LDcgQEAKIAkJCQkJICBLT0JJTF9USU1FT1VUCiAJCQkpOwogCQkKLQkJZGJnKCIlcyAtIHBvcnQgJWQgU2VuZCByZXNldF9hbGxfcXVldWVzIChGTFVTSCkgVVJCIHJldHVybnM6ICVpIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIHJlc3VsdCk7CisJCWRiZygiJXMgLSBwb3J0ICVkIFNlbmQgcmVzZXRfYWxsX3F1ZXVlcyAoRkxVU0gpIFVSQiByZXR1cm5zOiAlaSIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIHJlc3VsdCk7CiAJCWtmcmVlKHRyYW5zZmVyX2J1ZmZlcik7CiAJCXJldHVybiAocmVzdWx0IDwgMCkgPyAtRUZBVUxUIDogMDsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL21jdF91MjMyLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbWN0X3UyMzIuYwppbmRleCBmYzFjZWE0Li41ZmMyY2VmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvbWN0X3UyMzIuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbWN0X3UyMzIuYwpAQCAtMTQzLDkgKzE0Myw2IEBACiAJLmRlc2NyaXB0aW9uID0JICAgICAiTUNUIFUyMzIiLAogCS51c2JfZHJpdmVyID0gCSAgICAgJm1jdF91MjMyX2RyaXZlciwKIAkuaWRfdGFibGUgPQkgICAgIGlkX3RhYmxlX2NvbWJpbmVkLAotCS5udW1faW50ZXJydXB0X2luID0gIDIsCi0JLm51bV9idWxrX2luID0JICAgICAwLAotCS5udW1fYnVsa19vdXQgPQkgICAgIDEsCiAJLm51bV9wb3J0cyA9CSAgICAgMSwKIAkub3BlbiA9CQkgICAgIG1jdF91MjMyX29wZW4sCiAJLmNsb3NlID0JICAgICBtY3RfdTIzMl9jbG9zZSwKQEAgLTQwMiw3ICszOTksNyBAQAogCXN0cnVjdCBtY3RfdTIzMl9wcml2YXRlICpwcml2OwogCWludCBpOwogCQotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlmb3IgKGk9MDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKIAkJLyogTXkgc3BlY2lhbCBpdGVtcywgdGhlIHN0YW5kYXJkIHJvdXRpbmVzIGZyZWUgbXkgdXJicyAqLwpAQCAtNDI0LDcgKzQyMSw3IEBACiAJdW5zaWduZWQgY2hhciBsYXN0X2xjcjsKIAl1bnNpZ25lZCBjaGFyIGxhc3RfbXNyOwogCi0JZGJnKCIlcyBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyogQ29tcGVuc2F0ZSBmb3IgYSBoYXJkd2FyZSBidWc6IGFsdGhvdWdoIHRoZSBTaXRlY29tIFUyMzItUDI1CiAJICogZGV2aWNlIHJlcG9ydHMgYSBtYXhpbXVtIG91dHB1dCBwYWNrZXQgc2l6ZSBvZiAzMiBieXRlcywKQEAgLTQ4OSw3ICs0ODYsNyBAQAogCXVuc2lnbmVkIGludCBjX2NmbGFnOwogCXVuc2lnbmVkIGludCBjb250cm9sX3N0YXRlOwogCXN0cnVjdCBtY3RfdTIzMl9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwotCWRiZygiJXMgcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogICAgCWlmIChwb3J0LT50dHkpIHsKIAkJY19jZmxhZyA9IHBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKQEAgLTUxNyw3ICs1MTQsNyBAQAogCiBzdGF0aWMgdm9pZCBtY3RfdTIzMl9yZWFkX2ludF9jYWxsYmFjayAoc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCBtY3RfdTIzMl9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKQEAgLTUzNSwyMSArNTMyLDIxIEBACiAJY2FzZSAtRVNIVVRET1dOOgogCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLwogCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlpZiAoIXNlcmlhbCkgewotCQlkYmcoIiVzIC0gYmFkIHNlcmlhbCBwb2ludGVyLCBleGl0aW5nIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIGJhZCBzZXJpYWwgcG9pbnRlciwgZXhpdGluZyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAotICAgICAgICBkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKKyAgICAgICAgZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOwogCiAJLyoKIAkgKiBXb3JrLWEtcm91bmQ6IGhhbmRsZSB0aGUgJ3VzdWFsJyBidWxrLWluIHBpcGUgaGVyZQpAQCAtNjA2LDcgKzYwMyw3IEBACiAJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJldHZhbCkKIAkJZXJyICgiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQgJWQiLAotCQkgICAgIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwkJICAgICBfX2Z1bmNfXywgcmV0dmFsKTsKIH0gLyogbWN0X3UyMzJfcmVhZF9pbnRfY2FsbGJhY2sgKi8KIAogc3RhdGljIHZvaWQgbWN0X3UyMzJfc2V0X3Rlcm1pb3MgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCkBAIC02MzYsNyArNjMzLDcgQEAKIAogICAgICAgICAvKiByZWFzc2VydCBEVFIgYW5kIFJUUyBvbiB0cmFuc2l0aW9uIGZyb20gQjAgKi8KIAlpZiAoKG9sZF9jZmxhZyAmIENCQVVEKSA9PSBCMCkgewotCQlkYmcoIiVzOiBiYXVkIHdhcyBCMCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXM6IGJhdWQgd2FzIEIwIiwgX19mdW5jX18pOwogCQljb250cm9sX3N0YXRlIHw9IFRJT0NNX0RUUiB8IFRJT0NNX1JUUzsKIAkJbWN0X3UyMzJfc2V0X21vZGVtX2N0cmwoc2VyaWFsLCBjb250cm9sX3N0YXRlKTsKIAl9CkBAIC02NDQsNyArNjQxLDcgQEAKIAltY3RfdTIzMl9zZXRfYmF1ZF9yYXRlKHNlcmlhbCwgcG9ydCwgdHR5X2dldF9iYXVkX3JhdGUocG9ydC0+dHR5KSk7CiAKIAlpZiAoKGNmbGFnICYgQ0JBVUQpID09IEIwICkgewotCQlkYmcoIiVzOiBiYXVkIGlzIEIwIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlczogYmF1ZCBpcyBCMCIsIF9fZnVuY19fKTsKIAkJLyogRHJvcCBSVFMgYW5kIERUUiAqLwogCQljb250cm9sX3N0YXRlICY9IH4oVElPQ01fRFRSIHwgVElPQ01fUlRTKTsKICAgICAgICAJCW1jdF91MjMyX3NldF9tb2RlbV9jdHJsKHNlcmlhbCwgY29udHJvbF9zdGF0ZSk7CkBAIC02OTksNyArNjk2LDcgQEAKIAl1bnNpZ25lZCBjaGFyIGxjcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlc3N0YXRlPSVkIiwgX19GVU5DVElPTl9fLCBicmVha19zdGF0ZSk7CisJZGJnKCIlc3N0YXRlPSVkIiwgX19mdW5jX18sIGJyZWFrX3N0YXRlKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJbGNyID0gcHJpdi0+bGFzdF9sY3I7CkBAIC03MTgsNyArNzE1LDcgQEAKIAl1bnNpZ25lZCBpbnQgY29udHJvbF9zdGF0ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCWNvbnRyb2xfc3RhdGUgPSBwcml2LT5jb250cm9sX3N0YXRlOwpAQCAtNzM1LDcgKzczMiw3IEBACiAJdW5zaWduZWQgaW50IGNvbnRyb2xfc3RhdGU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAljb250cm9sX3N0YXRlID0gcHJpdi0+Y29udHJvbF9zdGF0ZTsKQEAgLTc1Nyw3ICs3NTQsNyBAQAogc3RhdGljIGludCBtY3RfdTIzMl9pb2N0bCAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKiBmaWxlLAogCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZGJnKCIlc2NtZD0weCV4IiwgX19GVU5DVElPTl9fLCBjbWQpOworCWRiZygiJXNjbWQ9MHgleCIsIF9fZnVuY19fLCBjbWQpOwogCiAJLyogQmFzZWQgb24gY29kZSBmcm9tIGFjbS5jIGFuZCBvdGhlcnMgKi8KIAlzd2l0Y2ggKGNtZCkgewpAQCAtNzcyLDcgKzc2OSw3IEBACiAJCXJldHVybiAwOwogCiAJZGVmYXVsdDoKLQkJZGJnKCIlczogYXJnIG5vdCBzdXBwb3J0ZWQgLSAweCUwNHgiLCBfX0ZVTkNUSU9OX18sY21kKTsKKwkJZGJnKCIlczogYXJnIG5vdCBzdXBwb3J0ZWQgLSAweCUwNHgiLCBfX2Z1bmNfXyxjbWQpOwogCQlyZXR1cm4oLUVOT0lPQ1RMQ01EKTsKIAkJYnJlYWs7CiAJfQpAQCAtNzg3LDcgKzc4NCw3IEBACiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAogCXR0eSA9IHBvcnQtPnR0eTsKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAlwcml2LT5yeF9mbGFncyB8PSBUSFJPVFRMRUQ7CkBAIC04MDksNyArODA2LDcgQEAKIAl1bnNpZ25lZCBpbnQgY29udHJvbF9zdGF0ZTsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL21vczc3MjAuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3NzIwLmMKaW5kZXggNDBmM2EwMS4uNTBmMWZlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL21vczc3MjAuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzcyMC5jCkBAIC0xMTgsMTEgKzExOCwxMSBAQAogCWNhc2UgLUVOT0VOVDoKIAljYXNlIC1FU0hVVERPV046CiAJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCi0JCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLCBfX2Z1bmNfXywKIAkJICAgIHN0YXR1cyk7CiAJCXJldHVybjsKIAlkZWZhdWx0OgotCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fRlVOQ1RJT05fXywKKwkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX2Z1bmNfXywKIAkJICAgIHN0YXR1cyk7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC0xODMsNyArMTgzLDcgQEAKIAlpZiAocmVzdWx0KQogCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAogCQkJIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyBjb250cm9sIHVyYlxuIiwKLQkJCV9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCV9fZnVuY19fLCByZXN1bHQpOwogCXJldHVybjsKIH0KIApAQCAtMjE0LDcgKzIxNCw3IEBACiAKIAlwb3J0ID0gbW9zNzcyMF9wb3J0LT5wb3J0OwogCi0JZGJnKCJFbnRlcmluZy4uLiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIkVudGVyaW5nLi4uJXMiLCBfX2Z1bmNfXyk7CiAKIAlkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAKQEAgLTM2Miw3ICszNjIsNyBAQAogCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IGttYWxsb2MoVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFLAogCQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CiAJCWlmICghdXJiLT50cmFuc2Zlcl9idWZmZXIpIHsKLQkJCWVycigiJXMtb3V0IG9mIG1lbW9yeSBmb3IgdXJiIGJ1ZmZlcnMuIiwgX19GVU5DVElPTl9fKTsKKwkJCWVycigiJXMtb3V0IG9mIG1lbW9yeSBmb3IgdXJiIGJ1ZmZlcnMuIiwgX19mdW5jX18pOwogCQkJdXNiX2ZyZWVfdXJiKG1vczc3MjBfcG9ydC0+d3JpdGVfdXJiX3Bvb2xbal0pOwogCQkJbW9zNzcyMF9wb3J0LT53cml0ZV91cmJfcG9vbFtqXSA9IE5VTEw7CiAJCQljb250aW51ZTsKQEAgLTQ3OSw3ICs0NzksNyBAQAogCQlpZiAocmVzcG9uc2UpCiAJCQlkZXZfZXJyKCZwb3J0LT5kZXYsCiAJCQkJIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyBjb250cm9sIHVyYlxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHJlc3BvbnNlKTsKKwkJCQlfX2Z1bmNfXywgcmVzcG9uc2UpOwogCX0KIAogCS8qIHNldCB1cCBvdXIgYnVsayBpbiB1cmIgKi8KQEAgLTQ5Miw3ICs0OTIsNyBAQAogCXJlc3BvbnNlID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9LRVJORUwpOwogCWlmIChyZXNwb25zZSkKIAkJZGV2X2VycigmcG9ydC0+ZGV2LAotCQkJIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyByZWFkIHVyYlxuIiwgX19GVU5DVElPTl9fLCByZXNwb25zZSk7CisJCQkiJXMgLSBFcnJvciAlZCBzdWJtaXR0aW5nIHJlYWQgdXJiXG4iLCBfX2Z1bmNfXywgcmVzcG9uc2UpOwogCiAJLyogaW5pdGlhbGl6ZSBvdXIgaWNvdW50IHN0cnVjdHVyZSAqLwogCW1lbXNldCgmKG1vczc3MjBfcG9ydC0+aWNvdW50KSwgMHgwMCwgc2l6ZW9mKG1vczc3MjBfcG9ydC0+aWNvdW50KSk7CkBAIC01MjEsMTEgKzUyMSwxMSBAQAogCWludCBjaGFycyA9IDA7CiAJc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzcyMF9wb3J0OwogCi0JZGJnKCIlczplbnRlcmluZyAuLi4uLi4uLi4uLiIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlczplbnRlcmluZyAuLi4uLi4uLi4uLiIsIF9fZnVuY19fKTsKIAogCW1vczc3MjBfcG9ydCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlpZiAobW9zNzcyMF9wb3J0ID09IE5VTEwpIHsKLQkJZGJnKCIlczpsZWF2aW5nIC4uLi4uLi4uLi4uIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlczpsZWF2aW5nIC4uLi4uLi4uLi4uIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTUzMyw3ICs1MzMsNyBAQAogCQlpZiAobW9zNzcyMF9wb3J0LT53cml0ZV91cmJfcG9vbFtpXSAmJiBtb3M3NzIwX3BvcnQtPndyaXRlX3VyYl9wb29sW2ldLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKQogCQkJY2hhcnMgKz0gVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFOwogCX0KLQlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgY2hhcnMpOworCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19mdW5jX18sIGNoYXJzKTsKIAlyZXR1cm4gY2hhcnM7CiB9CiAKQEAgLTU4NSw3ICs1ODUsNyBAQAogCW11dGV4X3VubG9jaygmc2VyaWFsLT5kaXNjX211dGV4KTsKIAltb3M3NzIwX3BvcnQtPm9wZW4gPSAwOwogCi0JZGJnKCJMZWF2aW5nICVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIkxlYXZpbmcgJXMiLCBfX2Z1bmNfXyk7CiB9CiAKIHN0YXRpYyB2b2lkIG1vczc3MjBfYnJlYWsoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlKQpAQCAtNTk0LDcgKzU5NCw3IEBACiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbDsKIAlzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3NzIwX3BvcnQ7CiAKLQlkYmcoIkVudGVyaW5nICVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIkVudGVyaW5nICVzIiwgX19mdW5jX18pOwogCiAJc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCkBAIC02MjcsMjAgKzYyNywyMSBAQAogCWludCByb29tID0gMDsKIAlpbnQgaTsKIAotCWRiZygiJXM6ZW50ZXJpbmcgLi4uLi4uLi4uLi4iLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXM6ZW50ZXJpbmcgLi4uLi4uLi4uLi4iLCBfX2Z1bmNfXyk7CiAKIAltb3M3NzIwX3BvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJaWYgKG1vczc3MjBfcG9ydCA9PSBOVUxMKSB7Ci0JCWRiZygiJXM6bGVhdmluZyAuLi4uLi4uLi4uLiIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXM6bGVhdmluZyAuLi4uLi4uLi4uLiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCisJLyogRklYTUU6IExvY2tpbmcgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTlVNX1VSQlM7ICsraSkgewogCQlpZiAobW9zNzcyMF9wb3J0LT53cml0ZV91cmJfcG9vbFtpXSAmJiBtb3M3NzIwX3BvcnQtPndyaXRlX3VyYl9wb29sW2ldLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKQogCQkJcm9vbSArPSBVUkJfVFJBTlNGRVJfQlVGRkVSX1NJWkU7CiAJfQogCi0JZGJnKCIlcyAtIHJldHVybnMgJWQiLCBfX0ZVTkNUSU9OX18sIHJvb20pOworCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19mdW5jX18sIHJvb20pOwogCXJldHVybiByb29tOwogfQogCkBAIC02NTcsNyArNjU4LDcgQEAKIAlzdHJ1Y3QgdXJiICAgICp1cmI7CiAJY29uc3QgdW5zaWduZWQgY2hhciAqY3VycmVudF9wb3NpdGlvbiA9IGRhdGE7CiAKLQlkYmcoIiVzOmVudGVyaW5nIC4uLi4uLi4uLi4uIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzOmVudGVyaW5nIC4uLi4uLi4uLi4uIiwgX19mdW5jX18pOwogCiAJc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCkBAIC02NzksNyArNjgwLDcgQEAKIAl9CiAKIAlpZiAodXJiID09IE5VTEwpIHsKLQkJZGJnKCIlcyAtIG5vIG1vcmUgZnJlZSB1cmJzIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIG5vIG1vcmUgZnJlZSB1cmJzIiwgX19mdW5jX18pOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC02ODcsMTQgKzY4OCwxNCBAQAogCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IGttYWxsb2MoVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFLAogCQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CiAJCWlmICh1cmItPnRyYW5zZmVyX2J1ZmZlciA9PSBOVUxMKSB7Ci0JCQllcnIoIiVzIG5vIG1vcmUga2VybmVsIG1lbW9yeS4uLiIsIF9fRlVOQ1RJT05fXyk7CisJCQllcnIoIiVzIG5vIG1vcmUga2VybmVsIG1lbW9yeS4uLiIsIF9fZnVuY19fKTsKIAkJCWdvdG8gZXhpdDsKIAkJfQogCX0KIAl0cmFuc2Zlcl9zaXplID0gbWluIChjb3VudCwgVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFKTsKIAogCW1lbWNweSh1cmItPnRyYW5zZmVyX2J1ZmZlciwgY3VycmVudF9wb3NpdGlvbiwgdHJhbnNmZXJfc2l6ZSk7Ci0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIHRyYW5zZmVyX3NpemUsCisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgdHJhbnNmZXJfc2l6ZSwKIAkJCSAgICAgIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIAogCS8qIGZpbGwgdXJiIHdpdGggZGF0YSBhbmQgc3VibWl0ICAqLwpAQCAtNzA4LDcgKzcwOSw3IEBACiAJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLEdGUF9BVE9NSUMpOwogCWlmIChzdGF0dXMpIHsKIAkJZXJyKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHdyaXRlIGJ1bGspIGZhaWxlZCB3aXRoIHN0YXR1cyA9ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlieXRlc19zZW50ID0gc3RhdHVzOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtNzI0LDcgKzcyNSw3IEBACiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAlpbnQgc3RhdHVzOwogCi0JZGJnKCIlcy0gcG9ydCAlZFxuIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMtIHBvcnQgJWRcbiIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJbW9zNzcyMF9wb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCkBAIC03MzYsMTEgKzczNywxMSBAQAogCQlyZXR1cm47CiAJfQogCi0JZGJnKCIlczogRW50ZXJpbmcgLi4uLi4uLi4uLiIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlczogRW50ZXJpbmcgLi4uLi4uLi4uLiIsIF9fZnVuY19fKTsKIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAoIXR0eSkgewotCQlkYmcoIiVzIC0gbm8gdHR5IGF2YWlsYWJsZSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBubyB0dHkgYXZhaWxhYmxlIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC03NzMsMTUgKzc3NCwxNSBAQAogCQlyZXR1cm47CiAKIAlpZiAoIW1vczc3MjBfcG9ydC0+b3BlbikgewotCQlkYmcoIiVzIC0gcG9ydCBub3Qgb3BlbmVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAotCWRiZygiJXM6IEVudGVyaW5nIC4uLi4uLi4uLi4iLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXM6IEVudGVyaW5nIC4uLi4uLi4uLi4iLCBfX2Z1bmNfXyk7CiAKIAl0dHkgPSBwb3J0LT50dHk7CiAJaWYgKCF0dHkpIHsKLQkJZGJnKCIlcyAtIG5vIHR0eSBhdmFpbGFibGUiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gbm8gdHR5IGF2YWlsYWJsZSIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtOTIyLDcgKzkyMyw3IEBACiAJX191MTYgcm91bmQ7CiAKIAotCWRiZygiJXMgLSAlZCIsIF9fRlVOQ1RJT05fXywgYmF1ZHJhdGUpOworCWRiZygiJXMgLSAlZCIsIF9fZnVuY19fLCBiYXVkcmF0ZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkaXZpc29yX3RhYmxlKTsgaSsrKSB7CiAJCWlmIChkaXZpc29yX3RhYmxlW2ldLmJhdWRyYXRlID09IGJhdWRyYXRlKSB7CkBAIC05NzMsMTUgKzk3NCwxNSBAQAogCXBvcnQgPSBtb3M3NzIwX3BvcnQtPnBvcnQ7CiAJc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCi0JZGJnKCIlczogRW50ZXJpbmcgLi4uLi4uLi4uLiIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlczogRW50ZXJpbmcgLi4uLi4uLi4uLiIsIF9fZnVuY19fKTsKIAogCW51bWJlciA9IHBvcnQtPm51bWJlciAtIHBvcnQtPnNlcmlhbC0+bWlub3I7Ci0JZGJnKCIlcyAtIHBvcnQgPSAlZCwgYmF1ZCA9ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIGJhdWRyYXRlKTsKKwlkYmcoIiVzIC0gcG9ydCA9ICVkLCBiYXVkID0gJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCBiYXVkcmF0ZSk7CiAKICAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBEaXZpc29yICovCiAJc3RhdHVzID0gY2FsY19iYXVkX3JhdGVfZGl2aXNvcihiYXVkcmF0ZSwgJmRpdmlzb3IpOwogCWlmIChzdGF0dXMpIHsKLQkJZXJyKCIlcyAtIGJhZCBiYXVkIHJhdGUiLCBfX0ZVTkNUSU9OX18pOworCQllcnIoIiVzIC0gYmFkIGJhdWQgcmF0ZSIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9CiAKQEAgLTEwMzQsMTYgKzEwMzUsMTYgQEAKIAlzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAJcG9ydF9udW1iZXIgPSBwb3J0LT5udW1iZXIgLSBwb3J0LT5zZXJpYWwtPm1pbm9yOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmICghbW9zNzcyMF9wb3J0LT5vcGVuKSB7Ci0JCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuZWQiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gcG9ydCBub3Qgb3BlbmVkIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCiAJdHR5ID0gbW9zNzcyMF9wb3J0LT5wb3J0LT50dHk7CiAKLQlkYmcoIiVzOiBFbnRlcmluZyAuLi4uLi4uLi4uIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzOiBFbnRlcmluZyAuLi4uLi4uLi4uIiwgX19mdW5jX18pOwogCiAJbERhdGEgPSBVQVJUX0xDUl9XTEVOODsKIAlsU3RvcCA9IDB4MDA7CS8qIDEgc3RvcCBiaXQgKi8KQEAgLTEwNzgsMTQgKzEwNzksMTQgQEAKIAlpZiAoY2ZsYWcgJiBQQVJFTkIpIHsKIAkJaWYgKGNmbGFnICYgUEFST0REKSB7CiAJCQlsUGFyaXR5ID0gVUFSVF9MQ1JfUEFSSVRZOwotCQkJZGJnKCIlcyAtIHBhcml0eSA9IG9kZCIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gcGFyaXR5ID0gb2RkIiwgX19mdW5jX18pOwogCQl9IGVsc2UgewogCQkJbFBhcml0eSA9IChVQVJUX0xDUl9FUEFSIHwgVUFSVF9MQ1JfUEFSSVRZKTsKLQkJCWRiZygiJXMgLSBwYXJpdHkgPSBldmVuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBwYXJpdHkgPSBldmVuIiwgX19mdW5jX18pOwogCQl9CiAKIAl9IGVsc2UgewotCQlkYmcoIiVzIC0gcGFyaXR5ID0gbm9uZSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBwYXJpdHkgPSBub25lIiwgX19mdW5jX18pOwogCX0KIAogCWlmIChjZmxhZyAmIENNU1BBUikKQEAgLTEwOTQsMTAgKzEwOTUsMTAgQEAKIAkvKiBDaGFuZ2UgdGhlIFN0b3AgYml0ICovCiAJaWYgKGNmbGFnICYgQ1NUT1BCKSB7CiAJCWxTdG9wID0gVUFSVF9MQ1JfU1RPUDsKLQkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDIiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gc3RvcCBiaXRzID0gMiIsIF9fZnVuY19fKTsKIAl9IGVsc2UgewogCQlsU3RvcCA9IDB4MDA7Ci0JCWRiZygiJXMgLSBzdG9wIGJpdHMgPSAxIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDEiLCBfX2Z1bmNfXyk7CiAJfQogCiAjZGVmaW5lIExDUl9CSVRTX01BU0sJCTB4MDMJLyogTWFzayBmb3IgYml0cy9jaGFyIGZpZWxkICovCkBAIC0xMTcxLDcgKzExNzIsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JZGJnKCIlcyAtIGJhdWQgcmF0ZSA9ICVkIiwgX19GVU5DVElPTl9fLCBiYXVkKTsKKwlkYmcoIiVzIC0gYmF1ZCByYXRlID0gJWQiLCBfX2Z1bmNfXywgYmF1ZCk7CiAJc3RhdHVzID0gc2VuZF9jbWRfd3JpdGVfYmF1ZF9yYXRlKG1vczc3MjBfcG9ydCwgYmF1ZCk7CiAJLyogRklYTUU6IG5lZWRzIHRvIHdyaXRlIGFjdHVhbCByZXN1bHRpbmcgYmF1ZCBiYWNrIG5vdCBqdXN0CiAJICAgYmxpbmRseSBkbyBzbyAqLwpAQCAtMTIxNyw3ICsxMjE4LDcgQEAKIAogCiAJaWYgKCFtb3M3NzIwX3BvcnQtPm9wZW4pIHsKLQkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuZWQiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTEyMjUsMTUgKzEyMjYsMTUgQEAKIAogCWNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOwogCi0JZGJnKCIlcyAtIGNmbGFnICUwOHggaWZsYWcgJTA4eCIsIF9fRlVOQ1RJT05fXywKKwlkYmcoIiVzIC0gY2ZsYWcgJTA4eCBpZmxhZyAlMDh4IiwgX19mdW5jX18sCiAJICAgIHR0eS0+dGVybWlvcy0+Y19jZmxhZywKIAkgICAgUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKSk7CiAKLQlkYmcoIiVzIC0gb2xkIGNmbGFnICUwOHggb2xkIGlmbGFnICUwOHgiLCBfX0ZVTkNUSU9OX18sCisJZGJnKCIlcyAtIG9sZCBjZmxhZyAlMDh4IG9sZCBpZmxhZyAlMDh4IiwgX19mdW5jX18sCiAJICAgIG9sZF90ZXJtaW9zLT5jX2NmbGFnLAogCSAgICBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCS8qIGNoYW5nZSB0aGUgcG9ydCBzZXR0aW5ncyB0byB0aGUgbmV3IG9uZXMgc3BlY2lmaWVkICovCiAJY2hhbmdlX3BvcnRfc2V0dGluZ3MobW9zNzcyMF9wb3J0LCBvbGRfdGVybWlvcyk7CkBAIC0xMjcxLDcgKzEyNzIsNyBAQAogCiAJY291bnQgPSBtb3M3NzIwX2NoYXJzX2luX2J1ZmZlcihtb3M3NzIwX3BvcnQtPnBvcnQpOwogCWlmIChjb3VudCA9PSAwKSB7Ci0JCWRiZygiJXMgLS0gRW1wdHkiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0tIEVtcHR5IiwgX19mdW5jX18pOwogCQlyZXN1bHQgPSBUSU9DU0VSX1RFTVQ7CiAJfQogCkBAIC0xMjk2LDcgKzEyOTcsNyBAQAogCiAJcmVzdWx0ID0gdHR5LT5yZWFkX2NudDsKIAotCWRiZygiJXMoJWQpID0gJWQiLCBfX0ZVTkNUSU9OX18sICBtb3M3NzIwX3BvcnQtPnBvcnQtPm51bWJlciwgcmVzdWx0KTsKKwlkYmcoIiVzKCVkKSA9ICVkIiwgX19mdW5jX18sICBtb3M3NzIwX3BvcnQtPnBvcnQtPm51bWJlciwgcmVzdWx0KTsKIAlpZiAoY29weV90b191c2VyKHZhbHVlLCAmcmVzdWx0LCBzaXplb2YoaW50KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCkBAIC0xMzc0LDcgKzEzNzUsNyBAQAogCQkgIHwgKChtc3IgJiBVQVJUX01TUl9EU1IpCT8gVElPQ01fRFNSOiAwKTsgIC8qIDB4MTAwICovCiAKIAotCWRiZygiJXMgLS0gJXgiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJZGJnKCIlcyAtLSAleCIsIF9fZnVuY19fLCByZXN1bHQpOwogCiAJaWYgKGNvcHlfdG9fdXNlcih2YWx1ZSwgJnJlc3VsdCwgc2l6ZW9mKGludCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTE0MTgsNDUgKzE0MTksNDUgQEAKIAlpZiAobW9zNzcyMF9wb3J0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQsIGNtZCA9IDB4JXgiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlciwgY21kKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCwgY21kID0gMHgleCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIGNtZCk7CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgVElPQ0lOUToKIAkJLyogcmV0dXJuIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgKi8KLQkJZGJnKCIlcyAoJWQpIFRJT0NJTlEiLCBfX0ZVTkNUSU9OX18sICBwb3J0LT5udW1iZXIpOworCQlkYmcoIiVzICglZCkgVElPQ0lOUSIsIF9fZnVuY19fLCAgcG9ydC0+bnVtYmVyKTsKIAkJcmV0dXJuIGdldF9udW1iZXJfYnl0ZXNfYXZhaWwobW9zNzcyMF9wb3J0LAogCQkJCQkgICAgICAodW5zaWduZWQgaW50IF9fdXNlciAqKWFyZyk7CiAJCWJyZWFrOwogCiAJY2FzZSBUSU9DU0VSR0VUTFNSOgotCQlkYmcoIiVzICglZCkgVElPQ1NFUkdFVExTUiIsIF9fRlVOQ1RJT05fXywgIHBvcnQtPm51bWJlcik7CisJCWRiZygiJXMgKCVkKSBUSU9DU0VSR0VUTFNSIiwgX19mdW5jX18sICBwb3J0LT5udW1iZXIpOwogCQlyZXR1cm4gZ2V0X2xzcl9pbmZvKG1vczc3MjBfcG9ydCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilhcmcpOwogCQlyZXR1cm4gMDsKIAogCWNhc2UgVElPQ01CSVM6CiAJY2FzZSBUSU9DTUJJQzoKIAljYXNlIFRJT0NNU0VUOgotCQlkYmcoIiVzICglZCkgVElPQ01TRVQvVElPQ01CSUMvVElPQ01TRVQiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgKCVkKSBUSU9DTVNFVC9USU9DTUJJQy9USU9DTVNFVCIsIF9fZnVuY19fLAogCQkgICAgcG9ydC0+bnVtYmVyKTsKIAkJcmV0dXJuIHNldF9tb2RlbV9pbmZvKG1vczc3MjBfcG9ydCwgY21kLAogCQkJCSAgICAgICh1bnNpZ25lZCBpbnQgX191c2VyICopYXJnKTsKIAogCWNhc2UgVElPQ01HRVQ6Ci0JCWRiZygiJXMgKCVkKSBUSU9DTUdFVCIsIF9fRlVOQ1RJT05fXywgIHBvcnQtPm51bWJlcik7CisJCWRiZygiJXMgKCVkKSBUSU9DTUdFVCIsIF9fZnVuY19fLCAgcG9ydC0+bnVtYmVyKTsKIAkJcmV0dXJuIGdldF9tb2RlbV9pbmZvKG1vczc3MjBfcG9ydCwKIAkJCQkgICAgICAodW5zaWduZWQgaW50IF9fdXNlciAqKWFyZyk7CiAKIAljYXNlIFRJT0NHU0VSSUFMOgotCQlkYmcoIiVzICglZCkgVElPQ0dTRVJJQUwiLCBfX0ZVTkNUSU9OX18sICBwb3J0LT5udW1iZXIpOworCQlkYmcoIiVzICglZCkgVElPQ0dTRVJJQUwiLCBfX2Z1bmNfXywgIHBvcnQtPm51bWJlcik7CiAJCXJldHVybiBnZXRfc2VyaWFsX2luZm8obW9zNzcyMF9wb3J0LAogCQkJCSAgICAgICAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICopYXJnKTsKIAogCWNhc2UgVElPQ1NTRVJJQUw6Ci0JCWRiZygiJXMgKCVkKSBUSU9DU1NFUklBTCIsIF9fRlVOQ1RJT05fXywgIHBvcnQtPm51bWJlcik7CisJCWRiZygiJXMgKCVkKSBUSU9DU1NFUklBTCIsIF9fZnVuY19fLCAgcG9ydC0+bnVtYmVyKTsKIAkJYnJlYWs7CiAKIAljYXNlIFRJT0NNSVdBSVQ6Ci0JCWRiZygiJXMgKCVkKSBUSU9DTUlXQUlUIiwgX19GVU5DVElPTl9fLCAgcG9ydC0+bnVtYmVyKTsKKwkJZGJnKCIlcyAoJWQpIFRJT0NNSVdBSVQiLCBfX2Z1bmNfXywgIHBvcnQtPm51bWJlcik7CiAJCWNwcmV2ID0gbW9zNzcyMF9wb3J0LT5pY291bnQ7CiAJCXdoaWxlICgxKSB7CiAJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCkBAIC0xNDkwLDcgKzE0OTEsNyBAQAogCQlpY291bnQuYnJrID0gY25vdy5icms7CiAJCWljb3VudC5idWZfb3ZlcnJ1biA9IGNub3cuYnVmX292ZXJydW47CiAKLQkJZGJnKCIlcyAoJWQpIFRJT0NHSUNPVU5UIFJYPSVkLCBUWD0lZCIsIF9fRlVOQ1RJT05fXywKKwkJZGJnKCIlcyAoJWQpIFRJT0NHSUNPVU5UIFJYPSVkLCBUWD0lZCIsIF9fZnVuY19fLAogCQkgICAgcG9ydC0+bnVtYmVyLCBpY291bnQucngsIGljb3VudC50eCApOwogCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmljb3VudCwgc2l6ZW9mKGljb3VudCkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0xNTA4LDcgKzE1MDksNyBAQAogCWludCBpOwogCWNoYXIgZGF0YTsKIAotCWRiZygiJXM6IEVudGVyaW5nIC4uLi4uLi4uLi4iLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXM6IEVudGVyaW5nIC4uLi4uLi4uLi4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAoIXNlcmlhbCkgewogCQlkYmcoIkludmFsaWQgSGFuZGxlciIpOwpAQCAtMTUyMCw3ICsxNTIxLDcgQEAKIAkvKiBjcmVhdGUgb3VyIHByaXZhdGUgc2VyaWFsIHN0cnVjdHVyZSAqLwogCW1vczc3MjBfc2VyaWFsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1vc2NoaXBfc2VyaWFsKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKG1vczc3MjBfc2VyaWFsID09IE5VTEwpIHsKLQkJZXJyKCIlcyAtIE91dCBvZiBtZW1vcnkiLCBfX0ZVTkNUSU9OX18pOworCQllcnIoIiVzIC0gT3V0IG9mIG1lbW9yeSIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xNTMzLDcgKzE1MzQsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgKytpKSB7CiAJCW1vczc3MjBfcG9ydCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtb3NjaGlwX3BvcnQpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKG1vczc3MjBfcG9ydCA9PSBOVUxMKSB7Ci0JCQllcnIoIiVzIC0gT3V0IG9mIG1lbW9yeSIsIF9fRlVOQ1RJT05fXyk7CisJCQllcnIoIiVzIC0gT3V0IG9mIG1lbW9yeSIsIF9fZnVuY19fKTsKIAkJCXVzYl9zZXRfc2VyaWFsX2RhdGEoc2VyaWFsLCBOVUxMKTsKIAkJCWtmcmVlKG1vczc3MjBfc2VyaWFsKTsKIAkJCXJldHVybiAtRU5PTUVNOwpAQCAtMTU5Niw5ICsxNTk3LDYgQEAKIAkuZGVzY3JpcHRpb24JCT0gIk1vc2NoaXAgMiBwb3J0IGFkYXB0ZXIiLAogCS51c2JfZHJpdmVyCQk9ICZ1c2JfZHJpdmVyLAogCS5pZF90YWJsZQkJPSBtb3NjaGlwX3BvcnRfaWRfdGFibGUsCi0JLm51bV9pbnRlcnJ1cHRfaW4JPSAxLAotCS5udW1fYnVsa19pbgkJPSAyLAotCS5udW1fYnVsa19vdXQJCT0gMiwKIAkubnVtX3BvcnRzCQk9IDIsCiAJLm9wZW4JCQk9IG1vczc3MjBfb3BlbiwKIAkuY2xvc2UJCQk9IG1vczc3MjBfY2xvc2UsCkBAIC0xNjIwLDcgKzE2MTgsNyBAQAogewogCWludCByZXR2YWw7CiAKLQlkYmcoIiVzOiBFbnRlcmluZyAuLi4uLi4uLi4uIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzOiBFbnRlcmluZyAuLi4uLi4uLi4uIiwgX19mdW5jX18pOwogCiAJLyogUmVnaXN0ZXIgd2l0aCB0aGUgdXNiIHNlcmlhbCAqLwogCXJldHZhbCA9IHVzYl9zZXJpYWxfcmVnaXN0ZXIoJm1vc2NoaXA3NzIwXzJwb3J0X2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYwppbmRleCBhZWViOWNiLi42YmNiODJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMKQEAgLTQwMyw3ICs0MDMsNyBAQAogewogCXN0cnVjdCBhc3luY19pY291bnQgKmljb3VudDsKIAotCWRiZygiJXMgLSAlMDJ4IiwgX19GVU5DVElPTl9fLCBuZXdfbHNyKTsKKwlkYmcoIiVzIC0gJTAyeCIsIF9fZnVuY19fLCBuZXdfbHNyKTsKIAogCWlmIChuZXdfbHNyICYgU0VSSUFMX0xTUl9CSSkgewogCQkvLwpAQCAtNDQ5LDcgKzQ0OSw3IEBACiAJaW50IHJlc3VsdCA9IDA7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JbW9zNzg0MF9wb3J0ID0gKHN0cnVjdCBtb3NjaGlwX3BvcnQgKil1cmItPmNvbnRleHQ7CisJbW9zNzg0MF9wb3J0ID0gdXJiLT5jb250ZXh0OwogCiAJc3dpdGNoIChzdGF0dXMpIHsKIAljYXNlIDA6CkBAIC00NTksMjEgKzQ1OSwyMSBAQAogCWNhc2UgLUVOT0VOVDoKIAljYXNlIC1FU0hVVERPV046CiAJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCi0JCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLCBfX2Z1bmNfXywKIAkJICAgIHN0YXR1cyk7CiAJCXJldHVybjsKIAlkZWZhdWx0OgotCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fRlVOQ1RJT05fXywKKwkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX2Z1bmNfXywKIAkJICAgIHN0YXR1cyk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKLQlkYmcoIiVzIHVyYiBidWZmZXIgc2l6ZSBpcyAlZFxuIiwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgpOwotCWRiZygiJXMgbW9zNzg0MF9wb3J0LT5Nc3JMc3IgaXMgJWQgcG9ydCAlZFxuIiwgX19GVU5DVElPTl9fLAorCWRiZygiJXMgdXJiIGJ1ZmZlciBzaXplIGlzICVkXG4iLCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwlkYmcoIiVzIG1vczc4NDBfcG9ydC0+TXNyTHNyIGlzICVkIHBvcnQgJWRcbiIsIF9fZnVuY19fLAogCSAgICBtb3M3ODQwX3BvcnQtPk1zckxzciwgbW9zNzg0MF9wb3J0LT5wb3J0X251bSk7CiAJZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCXJlZ3ZhbCA9IChfX3U4KSBkYXRhWzBdOwotCWRiZygiJXMgZGF0YSBpcyAleFxuIiwgX19GVU5DVElPTl9fLCByZWd2YWwpOworCWRiZygiJXMgZGF0YSBpcyAleFxuIiwgX19mdW5jX18sIHJlZ3ZhbCk7CiAJaWYgKG1vczc4NDBfcG9ydC0+TXNyTHNyID09IDApCiAJCW1vczc4NDBfaGFuZGxlX25ld19tc3IobW9zNzg0MF9wb3J0LCByZWd2YWwpOwogCWVsc2UgaWYgKG1vczc4NDBfcG9ydC0+TXNyTHNyID09IDEpCkBAIC00ODcsNyArNDg3LDcgQEAKIAlpZiAocmVzdWx0KSB7CiAJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCiAJCQkiJXMgLSBFcnJvciAlZCBzdWJtaXR0aW5nIGludGVycnVwdCB1cmJcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQlfX2Z1bmNfXywgcmVzdWx0KTsKIAl9CiB9CiAKQEAgLTU0MiwxMSArNTQyLDExIEBACiAJY2FzZSAtRU5PRU5UOgogCWNhc2UgLUVTSFVURE9XTjoKIAkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KLQkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsIF9fRlVOQ1RJT05fXywKKwkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsIF9fZnVuY19fLAogCQkgICAgc3RhdHVzKTsKIAkJcmV0dXJuOwogCWRlZmF1bHQ6Ci0JCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19GVU5DVElPTl9fLAorCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fZnVuY19fLAogCQkgICAgc3RhdHVzKTsKIAkJZ290byBleGl0OwogCX0KQEAgLTU1NCw3ICs1NTQsNyBAQAogCWxlbmd0aCA9IHVyYi0+YWN0dWFsX2xlbmd0aDsKIAlkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAKLQlzZXJpYWwgPSAoc3RydWN0IHVzYl9zZXJpYWwgKil1cmItPmNvbnRleHQ7CisJc2VyaWFsID0gdXJiLT5jb250ZXh0OwogCiAJLyogTW9zY2hpcCBnZXQgNSBieXRlcwogCSAqIEJ5dGUgMSBJSVIgUG9ydCAxIChwb3J0Lm51bWJlciBpcyAwKQpAQCAtNjE0LDcgKzYxNCw3IEBACiAJaWYgKHJlc3VsdCkgewogCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAogCQkJIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiXG4iLAotCQkJX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJX19mdW5jX18sIHJlc3VsdCk7CiAJfQogfQogCkBAIC02ODUsMTkgKzY4NSwxOSBAQAogCQlyZXR1cm47CiAJfQogCi0JbW9zNzg0MF9wb3J0ID0gKHN0cnVjdCBtb3NjaGlwX3BvcnQgKil1cmItPmNvbnRleHQ7CisJbW9zNzg0MF9wb3J0ID0gdXJiLT5jb250ZXh0OwogCWlmICghbW9zNzg0MF9wb3J0KSB7CiAJCWRiZygiJXMiLCAiTlVMTCBtb3M3ODQwX3BvcnQgcG9pbnRlciBcbiIpOwogCQlyZXR1cm47CiAJfQogCiAJcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopbW9zNzg0MF9wb3J0LT5wb3J0OwotCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19GVU5DVElPTl9fKSkgeworCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19mdW5jX18pKSB7CiAJCWRiZygiJXMiLCAiUG9ydCBQYXJhbm9pYSBmYWlsZWQgXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCXNlcmlhbCA9IG1vczc4NDBfZ2V0X3VzYl9zZXJpYWwocG9ydCwgX19GVU5DVElPTl9fKTsKKwlzZXJpYWwgPSBtb3M3ODQwX2dldF91c2Jfc2VyaWFsKHBvcnQsIF9fZnVuY19fKTsKIAlpZiAoIXNlcmlhbCkgewogCQlkYmcoIiVzXG4iLCAiQmFkIHNlcmlhbCBwb2ludGVyICIpOwogCQlyZXR1cm47CkBAIC03NTIsNyArNzUyLDcgQEAKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAJaW50IGk7CiAKLQltb3M3ODQwX3BvcnQgPSAoc3RydWN0IG1vc2NoaXBfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwltb3M3ODQwX3BvcnQgPSB1cmItPmNvbnRleHQ7CiAJc3Bpbl9sb2NrKCZtb3M3ODQwX3BvcnQtPnBvb2xfbG9jayk7CiAJZm9yIChpID0gMDsgaSA8IE5VTV9VUkJTOyBpKyspIHsKIAkJaWYgKHVyYiA9PSBtb3M3ODQwX3BvcnQtPndyaXRlX3VyYl9wb29sW2ldKSB7CkBAIC03NjcsNyArNzY3LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2sobW9zNzg0MF9wb3J0LT5wb3J0LCBfX0ZVTkNUSU9OX18pKSB7CisJaWYgKG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhtb3M3ODQwX3BvcnQtPnBvcnQsIF9fZnVuY19fKSkgewogCQlkYmcoIiVzIiwgIlBvcnQgUGFyYW5vaWEgZmFpbGVkIFxuIik7CiAJCXJldHVybjsKIAl9CkBAIC04MTUsMTQgKzgxNSwxNCBAQAogCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc4NDBfcG9ydDsKIAlzdHJ1Y3QgbW9zY2hpcF9wb3J0ICpwb3J0MDsKIAotCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19GVU5DVElPTl9fKSkgeworCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19mdW5jX18pKSB7CiAJCWRiZygiJXMiLCAiUG9ydCBQYXJhbm9pYSBmYWlsZWQgXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCi0JaWYgKG1vczc4NDBfc2VyaWFsX3BhcmFub2lhX2NoZWNrKHNlcmlhbCwgX19GVU5DVElPTl9fKSkgeworCWlmIChtb3M3ODQwX3NlcmlhbF9wYXJhbm9pYV9jaGVjayhzZXJpYWwsIF9fZnVuY19fKSkgewogCQlkYmcoIiVzIiwgIlNlcmlhbCBQYXJhbm9pYSBmYWlsZWQgXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtODUxLDcgKzg1MSw3IEBACiAJCWlmICghdXJiLT50cmFuc2Zlcl9idWZmZXIpIHsKIAkJCXVzYl9mcmVlX3VyYih1cmIpOwogCQkJbW9zNzg0MF9wb3J0LT53cml0ZV91cmJfcG9vbFtqXSA9IE5VTEw7Ci0JCQllcnIoIiVzLW91dCBvZiBtZW1vcnkgZm9yIHVyYiBidWZmZXJzLiIsIF9fRlVOQ1RJT05fXyk7CisJCQllcnIoIiVzLW91dCBvZiBtZW1vcnkgZm9yIHVyYiBidWZmZXJzLiIsIF9fZnVuY19fKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJfQpAQCAtMTAzOSw3ICsxMDM5LDcgQEAKIAkJCQkJICAgR0ZQX0tFUk5FTCk7CiAJCQlpZiAocmVzcG9uc2UpIHsKIAkJCQllcnIoIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiIiwKLQkJCQkgICAgX19GVU5DVElPTl9fLCByZXNwb25zZSk7CisJCQkJICAgIF9fZnVuY19fLCByZXNwb25zZSk7CiAJCQl9CiAKIAkJfQpAQCAtMTA3Miw3ICsxMDcyLDcgQEAKIAkgICAgcG9ydC0+YnVsa19pbl9lbmRwb2ludEFkZHJlc3MpOwogCXJlc3BvbnNlID0gdXNiX3N1Ym1pdF91cmIobW9zNzg0MF9wb3J0LT5yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJlc3BvbnNlKSB7Ci0JCWVycigiJXMgLSBFcnJvciAlZCBzdWJtaXR0aW5nIGNvbnRyb2wgdXJiIiwgX19GVU5DVElPTl9fLAorCQllcnIoIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyBjb250cm9sIHVyYiIsIF9fZnVuY19fLAogCQkgICAgcmVzcG9uc2UpOwogCX0KIApAQCAtMTExNiw3ICsxMTE2LDcgQEAKIAogCWRiZygiJXMgXG4iLCAiIG1vczc4NDBfY2hhcnNfaW5fYnVmZmVyOmVudGVyaW5nIC4uLi4uLi4uLi4uIik7CiAKLQlpZiAobW9zNzg0MF9wb3J0X3BhcmFub2lhX2NoZWNrKHBvcnQsIF9fRlVOQ1RJT05fXykpIHsKKwlpZiAobW9zNzg0MF9wb3J0X3BhcmFub2lhX2NoZWNrKHBvcnQsIF9fZnVuY19fKSkgewogCQlkYmcoIiVzIiwgIkludmFsaWQgcG9ydCBcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMTEzNCw3ICsxMTM0LDcgQEAKIAkJfQogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb3M3ODQwX3BvcnQtPnBvb2xfbG9jayxmbGFncyk7Ci0JZGJnKCIlcyAtIHJldHVybnMgJWQiLCBfX0ZVTkNUSU9OX18sIGNoYXJzKTsKKwlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fZnVuY19fLCBjaGFycyk7CiAJcmV0dXJuIGNoYXJzOwogCiB9CkBAIC0xMTcxLDcgKzExNzEsNyBAQAogCQkvKiBObyBhY3Rpdml0eS4uIGNvdW50IGRvd24gc2VjdGlvbiAqLwogCQl3YWl0LS07CiAJCWlmICh3YWl0ID09IDApIHsKLQkJCWRiZygiJXMgLSBUSU1FT1VUIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBUSU1FT1VUIiwgX19mdW5jX18pOwogCQkJcmV0dXJuOwogCQl9IGVsc2UgewogCQkJLyogUmVzZXQgdGltZW91dCB2YWx1ZSBiYWNrIHRvIHNlY29uZHMgKi8KQEAgLTExOTUsMTIgKzExOTUsMTIgQEAKIAogCWRiZygiJXNcbiIsICJtb3M3ODQwX2Nsb3NlOmVudGVyaW5nLi4uIik7CiAKLQlpZiAobW9zNzg0MF9wb3J0X3BhcmFub2lhX2NoZWNrKHBvcnQsIF9fRlVOQ1RJT05fXykpIHsKKwlpZiAobW9zNzg0MF9wb3J0X3BhcmFub2lhX2NoZWNrKHBvcnQsIF9fZnVuY19fKSkgewogCQlkYmcoIiVzIiwgIlBvcnQgUGFyYW5vaWEgZmFpbGVkIFxuIik7CiAJCXJldHVybjsKIAl9CiAKLQlzZXJpYWwgPSBtb3M3ODQwX2dldF91c2Jfc2VyaWFsKHBvcnQsIF9fRlVOQ1RJT05fXyk7CisJc2VyaWFsID0gbW9zNzg0MF9nZXRfdXNiX3NlcmlhbChwb3J0LCBfX2Z1bmNfXyk7CiAJaWYgKCFzZXJpYWwpIHsKIAkJZGJnKCIlcyIsICJTZXJpYWwgUGFyYW5vaWEgZmFpbGVkIFxuIik7CiAJCXJldHVybjsKQEAgLTEzMTQsNyArMTMxNCw3IEBACiAJCS8qIE5vIGFjdGl2aXR5Li4gY291bnQgZG93biBzZWN0aW9uICovCiAJCXdhaXQtLTsKIAkJaWYgKHdhaXQgPT0gMCkgewotCQkJZGJnKCIlcyAtIFRJTUVPVVQiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIFRJTUVPVVQiLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm47CiAJCX0gZWxzZSB7CiAJCQkvKiBSZXNldCB0aW1lb3V0IHZhbHVlIGJhY2sgdG8gc2Vjb25kcyAqLwpAQCAtMTMzNywxMiArMTMzNywxMiBAQAogCWRiZygiJXMgXG4iLCAiRW50ZXJpbmcgLi4uLi4uLi4uLi4iKTsKIAlkYmcoIm1vczc4NDBfYnJlYWs6IFN0YXJ0XG4iKTsKIAotCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19GVU5DVElPTl9fKSkgeworCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19mdW5jX18pKSB7CiAJCWRiZygiJXMiLCAiUG9ydCBQYXJhbm9pYSBmYWlsZWQgXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCXNlcmlhbCA9IG1vczc4NDBfZ2V0X3VzYl9zZXJpYWwocG9ydCwgX19GVU5DVElPTl9fKTsKKwlzZXJpYWwgPSBtb3M3ODQwX2dldF91c2Jfc2VyaWFsKHBvcnQsIF9fZnVuY19fKTsKIAlpZiAoIXNlcmlhbCkgewogCQlkYmcoIiVzIiwgIlNlcmlhbCBQYXJhbm9pYSBmYWlsZWQgXG4iKTsKIAkJcmV0dXJuOwpAQCAtMTM5Miw3ICsxMzkyLDcgQEAKIAogCWRiZygiJXMgXG4iLCAiIG1vczc4NDBfd3JpdGVfcm9vbTplbnRlcmluZyAuLi4uLi4uLi4uLiIpOwogCi0JaWYgKG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhwb3J0LCBfX0ZVTkNUSU9OX18pKSB7CisJaWYgKG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhwb3J0LCBfX2Z1bmNfXykpIHsKIAkJZGJnKCIlcyIsICJJbnZhbGlkIHBvcnQgXG4iKTsKIAkJZGJnKCIlcyBcbiIsICIgbW9zNzg0MF93cml0ZV9yb29tOmxlYXZpbmcgLi4uLi4uLi4uLi4iKTsKIAkJcmV0dXJuIC0xOwpAQCAtMTQxMyw3ICsxNDEzLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb3M3ODQwX3BvcnQtPnBvb2xfbG9jaywgZmxhZ3MpOwogCiAJcm9vbSA9IChyb29tID09IDApID8gMCA6IHJvb20gLSBVUkJfVFJBTlNGRVJfQlVGRkVSX1NJWkUgKyAxOwotCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19GVU5DVElPTl9fLCByb29tKTsKKwlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fZnVuY19fLCByb29tKTsKIAlyZXR1cm4gcm9vbTsKIAogfQpAQCAtMTQ4MCwxMyArMTQ4MCwxMyBAQAogCXN0YXR1cyA9IG1vczc4NDBfc2V0X3VhcnRfcmVnKHBvcnQsIExJTkVfQ09OVFJPTF9SRUdJU1RFUiwgRGF0YSk7CiAjZW5kaWYKIAotCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19GVU5DVElPTl9fKSkgeworCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19mdW5jX18pKSB7CiAJCWRiZygiJXMiLCAiUG9ydCBQYXJhbm9pYSBmYWlsZWQgXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCXNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKLQlpZiAobW9zNzg0MF9zZXJpYWxfcGFyYW5vaWFfY2hlY2soc2VyaWFsLCBfX0ZVTkNUSU9OX18pKSB7CisJaWYgKG1vczc4NDBfc2VyaWFsX3BhcmFub2lhX2NoZWNrKHNlcmlhbCwgX19mdW5jX18pKSB7CiAJCWRiZygiJXMiLCAiU2VyaWFsIFBhcmFub2lhIGZhaWxlZCBcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMTUxMiw3ICsxNTEyLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb3M3ODQwX3BvcnQtPnBvb2xfbG9jaywgZmxhZ3MpOwogCiAJaWYgKHVyYiA9PSBOVUxMKSB7Ci0JCWRiZygiJXMgLSBubyBtb3JlIGZyZWUgdXJicyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBubyBtb3JlIGZyZWUgdXJicyIsIF9fZnVuY19fKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMTUyMSw3ICsxNTIxLDcgQEAKIAkJICAgIGttYWxsb2MoVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKIAogCQlpZiAodXJiLT50cmFuc2Zlcl9idWZmZXIgPT0gTlVMTCkgewotCQkJZXJyKCIlcyBubyBtb3JlIGtlcm5lbCBtZW1vcnkuLi4iLCBfX0ZVTkNUSU9OX18pOworCQkJZXJyKCIlcyBubyBtb3JlIGtlcm5lbCBtZW1vcnkuLi4iLCBfX2Z1bmNfXyk7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAl9CkBAIC0xNTQ3LDcgKzE1NDcsNyBAQAogCWlmIChzdGF0dXMpIHsKIAkJbW9zNzg0MF9wb3J0LT5idXN5W2ldID0gMDsKIAkJZXJyKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHdyaXRlIGJ1bGspIGZhaWxlZCB3aXRoIHN0YXR1cyA9ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlieXRlc19zZW50ID0gc3RhdHVzOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtMTU3Myw3ICsxNTczLDcgQEAKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCWludCBzdGF0dXM7CiAKLQlpZiAobW9zNzg0MF9wb3J0X3BhcmFub2lhX2NoZWNrKHBvcnQsIF9fRlVOQ1RJT05fXykpIHsKKwlpZiAobW9zNzg0MF9wb3J0X3BhcmFub2lhX2NoZWNrKHBvcnQsIF9fZnVuY19fKSkgewogCQlkYmcoIiVzIiwgIkludmFsaWQgcG9ydCBcbiIpOwogCQlyZXR1cm47CiAJfQpAQCAtMTU5NCw3ICsxNTk0LDcgQEAKIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAoIXR0eSkgewotCQlkYmcoIiVzIC0gbm8gdHR5IGF2YWlsYWJsZSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBubyB0dHkgYXZhaWxhYmxlIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC0xNjM0LDcgKzE2MzQsNyBAQAogCWludCBzdGF0dXM7CiAJc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzg0MF9wb3J0ID0gbW9zNzg0MF9nZXRfcG9ydF9wcml2YXRlKHBvcnQpOwogCi0JaWYgKG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhwb3J0LCBfX0ZVTkNUSU9OX18pKSB7CisJaWYgKG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhwb3J0LCBfX2Z1bmNfXykpIHsKIAkJZGJnKCIlcyIsICJJbnZhbGlkIHBvcnQgXG4iKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE2NDMsNyArMTY0Myw3IEBACiAJCXJldHVybjsKIAogCWlmICghbW9zNzg0MF9wb3J0LT5vcGVuKSB7Ci0JCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuZWQiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gcG9ydCBub3Qgb3BlbmVkIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC0xNjUxLDcgKzE2NTEsNyBAQAogCiAJdHR5ID0gcG9ydC0+dHR5OwogCWlmICghdHR5KSB7Ci0JCWRiZygiJXMgLSBubyB0dHkgYXZhaWxhYmxlIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIG5vIHR0eSBhdmFpbGFibGUiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE2ODgsNyArMTY4OCw3IEBACiAJaW50IHN0YXR1cyA9IDA7CiAJbW9zNzg0MF9wb3J0ID0gbW9zNzg0MF9nZXRfcG9ydF9wcml2YXRlKHBvcnQpOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmIChtb3M3ODQwX3BvcnQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0xNzAzLDcgKzE3MDMsNyBAQAogCSAgICB8ICgobXNyICYgTU9TNzg0MF9NU1JfUkkpID8gVElPQ01fUkkgOiAwKQogCSAgICB8ICgobXNyICYgTU9TNzg0MF9NU1JfRFNSKSA/IFRJT0NNX0RTUiA6IDApOwogCi0JZGJnKCIlcyAtIDB4JTA0WCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwlkYmcoIiVzIC0gMHglMDRYIiwgX19mdW5jX18sIHJlc3VsdCk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMTcxNSwxMyArMTcxNSwxNCBAQAogCXVuc2lnbmVkIGludCBtY3I7CiAJdW5zaWduZWQgaW50IHN0YXR1czsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAltb3M3ODQwX3BvcnQgPSBtb3M3ODQwX2dldF9wb3J0X3ByaXZhdGUocG9ydCk7CiAKIAlpZiAobW9zNzg0MF9wb3J0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCisJLyogRklYTUU6IFdoYXQgbG9ja3MgdGhlIHBvcnQgcmVnaXN0ZXJzID8gKi8KIAltY3IgPSBtb3M3ODQwX3BvcnQtPnNoYWRvd01DUjsKIAlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpCiAJCW1jciAmPSB+TUNSX1JUUzsKQEAgLTE3NTgsNyArMTc1OSw3IEBACiAJCQkJCSAgX191MTYgKiBjbGtfc2VsX3ZhbCkKIHsKIAotCWRiZygiJXMgLSAlZCIsIF9fRlVOQ1RJT05fXywgYmF1ZFJhdGUpOworCWRiZygiJXMgLSAlZCIsIF9fZnVuY19fLCBiYXVkUmF0ZSk7CiAKIAlpZiAoYmF1ZFJhdGUgPD0gMTE1MjAwKSB7CiAJCSpkaXZpc29yID0gMTE1MjAwIC8gYmF1ZFJhdGU7CkBAIC0xODQxLDEyICsxODQyLDEyIEBACiAJCXJldHVybiAtMTsKIAogCXBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKW1vczc4NDBfcG9ydC0+cG9ydDsKLQlpZiAobW9zNzg0MF9wb3J0X3BhcmFub2lhX2NoZWNrKHBvcnQsIF9fRlVOQ1RJT05fXykpIHsKKwlpZiAobW9zNzg0MF9wb3J0X3BhcmFub2lhX2NoZWNrKHBvcnQsIF9fZnVuY19fKSkgewogCQlkYmcoIiVzIiwgIkludmFsaWQgcG9ydCBcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JaWYgKG1vczc4NDBfc2VyaWFsX3BhcmFub2lhX2NoZWNrKHBvcnQtPnNlcmlhbCwgX19GVU5DVElPTl9fKSkgeworCWlmIChtb3M3ODQwX3NlcmlhbF9wYXJhbm9pYV9jaGVjayhwb3J0LT5zZXJpYWwsIF9fZnVuY19fKSkgewogCQlkYmcoIiVzIiwgIkludmFsaWQgU2VyaWFsIFxuIik7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0xODU1LDcgKzE4NTYsNyBAQAogCiAJbnVtYmVyID0gbW9zNzg0MF9wb3J0LT5wb3J0LT5udW1iZXIgLSBtb3M3ODQwX3BvcnQtPnBvcnQtPnNlcmlhbC0+bWlub3I7CiAKLQlkYmcoIiVzIC0gcG9ydCA9ICVkLCBiYXVkID0gJWQiLCBfX0ZVTkNUSU9OX18sCisJZGJnKCIlcyAtIHBvcnQgPSAlZCwgYmF1ZCA9ICVkIiwgX19mdW5jX18sCiAJICAgIG1vczc4NDBfcG9ydC0+cG9ydC0+bnVtYmVyLCBiYXVkUmF0ZSk7CiAJLy9yZXNldCBjbGtfdWFydF9zZWwgaW4gc3ByZWdPZmZzZXQKIAlpZiAoYmF1ZFJhdGUgPiAxMTUyMDApIHsKQEAgLTE5MTUsNyArMTkxNiw3IEBACiAJCS8qIENhbGN1bGF0ZSB0aGUgRGl2aXNvciAqLwogCiAJCWlmIChzdGF0dXMpIHsKLQkJCWVycigiJXMgLSBiYWQgYmF1ZCByYXRlIiwgX19GVU5DVElPTl9fKTsKKwkJCWVycigiJXMgLSBiYWQgYmF1ZCByYXRlIiwgX19mdW5jX18pOwogCQkJZGJnKCIlc1xuIiwgImJhZCBiYXVkIHJhdGUiKTsKIAkJCXJldHVybiBzdGF0dXM7CiAJCX0KQEAgLTE5NjksMjIgKzE5NzAsMjIgQEAKIAogCXBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKW1vczc4NDBfcG9ydC0+cG9ydDsKIAotCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19GVU5DVElPTl9fKSkgeworCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19mdW5jX18pKSB7CiAJCWRiZygiJXMiLCAiSW52YWxpZCBwb3J0IFxuIik7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAobW9zNzg0MF9zZXJpYWxfcGFyYW5vaWFfY2hlY2socG9ydC0+c2VyaWFsLCBfX0ZVTkNUSU9OX18pKSB7CisJaWYgKG1vczc4NDBfc2VyaWFsX3BhcmFub2lhX2NoZWNrKHBvcnQtPnNlcmlhbCwgX19mdW5jX18pKSB7CiAJCWRiZygiJXMiLCAiSW52YWxpZCBTZXJpYWwgXG4iKTsKIAkJcmV0dXJuOwogCX0KIAogCXNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBtb3M3ODQwX3BvcnQtPnBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgbW9zNzg0MF9wb3J0LT5wb3J0LT5udW1iZXIpOwogCiAJaWYgKCFtb3M3ODQwX3BvcnQtPm9wZW4pIHsKLQkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuZWQiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIwMjMsMTQgKzIwMjQsMTQgQEAKIAlpZiAoY2ZsYWcgJiBQQVJFTkIpIHsKIAkJaWYgKGNmbGFnICYgUEFST0REKSB7CiAJCQlsUGFyaXR5ID0gTENSX1BBUl9PREQ7Ci0JCQlkYmcoIiVzIC0gcGFyaXR5ID0gb2RkIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBwYXJpdHkgPSBvZGQiLCBfX2Z1bmNfXyk7CiAJCX0gZWxzZSB7CiAJCQlsUGFyaXR5ID0gTENSX1BBUl9FVkVOOwotCQkJZGJnKCIlcyAtIHBhcml0eSA9IGV2ZW4iLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHBhcml0eSA9IGV2ZW4iLCBfX2Z1bmNfXyk7CiAJCX0KIAogCX0gZWxzZSB7Ci0JCWRiZygiJXMgLSBwYXJpdHkgPSBub25lIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHBhcml0eSA9IG5vbmUiLCBfX2Z1bmNfXyk7CiAJfQogCiAJaWYgKGNmbGFnICYgQ01TUEFSKSB7CkBAIC0yMDQwLDEwICsyMDQxLDEwIEBACiAJLyogQ2hhbmdlIHRoZSBTdG9wIGJpdCAqLwogCWlmIChjZmxhZyAmIENTVE9QQikgewogCQlsU3RvcCA9IExDUl9TVE9QXzI7Ci0JCWRiZygiJXMgLSBzdG9wIGJpdHMgPSAyIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDIiLCBfX2Z1bmNfXyk7CiAJfSBlbHNlIHsKIAkJbFN0b3AgPSBMQ1JfU1RPUF8xOwotCQlkYmcoIiVzIC0gc3RvcCBiaXRzID0gMSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBzdG9wIGJpdHMgPSAxIiwgX19mdW5jX18pOwogCX0KIAogCS8qIFVwZGF0ZSB0aGUgTENSIHdpdGggdGhlIGNvcnJlY3QgdmFsdWUgKi8KQEAgLTIxMDAsNyArMjEwMSw3IEBACiAJCWJhdWQgPSA5NjAwOwogCX0KIAotCWRiZygiJXMgLSBiYXVkIHJhdGUgPSAlZCIsIF9fRlVOQ1RJT05fXywgYmF1ZCk7CisJZGJnKCIlcyAtIGJhdWQgcmF0ZSA9ICVkIiwgX19mdW5jX18sIGJhdWQpOwogCXN0YXR1cyA9IG1vczc4NDBfc2VuZF9jbWRfd3JpdGVfYmF1ZF9yYXRlKG1vczc4NDBfcG9ydCwgYmF1ZCk7CiAKIAkvKiBFbmFibGUgSW50ZXJydXB0cyAqLwpAQCAtMjE0MCwxNCArMjE0MSwxNCBAQAogCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc4NDBfcG9ydDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCWRiZygibW9zNzg0MF9zZXRfdGVybWlvczogU1RBUlRcbiIpOwotCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19GVU5DVElPTl9fKSkgeworCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19mdW5jX18pKSB7CiAJCWRiZygiJXMiLCAiSW52YWxpZCBwb3J0IFxuIik7CiAJCXJldHVybjsKIAl9CiAKIAlzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAKLQlpZiAobW9zNzg0MF9zZXJpYWxfcGFyYW5vaWFfY2hlY2soc2VyaWFsLCBfX0ZVTkNUSU9OX18pKSB7CisJaWYgKG1vczc4NDBfc2VyaWFsX3BhcmFub2lhX2NoZWNrKHNlcmlhbCwgX19mdW5jX18pKSB7CiAJCWRiZygiJXMiLCAiSW52YWxpZCBTZXJpYWwgXG4iKTsKIAkJcmV0dXJuOwogCX0KQEAgLTIxNjAsNyArMjE2MSw3IEBACiAJdHR5ID0gcG9ydC0+dHR5OwogCiAJaWYgKCFtb3M3ODQwX3BvcnQtPm9wZW4pIHsKLQkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuZWQiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIxNjgsMTEgKzIxNjksMTEgQEAKIAogCWNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOwogCi0JZGJnKCIlcyAtIGNsZmFnICUwOHggaWZsYWcgJTA4eCIsIF9fRlVOQ1RJT05fXywKKwlkYmcoIiVzIC0gY2xmYWcgJTA4eCBpZmxhZyAlMDh4IiwgX19mdW5jX18sCiAJICAgIHR0eS0+dGVybWlvcy0+Y19jZmxhZywgUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKSk7Ci0JZGJnKCIlcyAtIG9sZCBjbGZhZyAlMDh4IG9sZCBpZmxhZyAlMDh4IiwgX19GVU5DVElPTl9fLAorCWRiZygiJXMgLSBvbGQgY2xmYWcgJTA4eCBvbGQgaWZsYWcgJTA4eCIsIF9fZnVuY19fLAogCSAgICBvbGRfdGVybWlvcy0+Y19jZmxhZywgUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKTsKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyogY2hhbmdlIHRoZSBwb3J0IHNldHRpbmdzIHRvIHRoZSBuZXcgb25lcyBzcGVjaWZpZWQgKi8KIApAQCAtMjIxMyw3ICsyMjE0LDcgQEAKIAogCWNvdW50ID0gbW9zNzg0MF9jaGFyc19pbl9idWZmZXIobW9zNzg0MF9wb3J0LT5wb3J0KTsKIAlpZiAoY291bnQgPT0gMCkgewotCQlkYmcoIiVzIC0tIEVtcHR5IiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtLSBFbXB0eSIsIF9fZnVuY19fKTsKIAkJcmVzdWx0ID0gVElPQ1NFUl9URU1UOwogCX0KIApAQCAtMjI0MCw3ICsyMjQxLDcgQEAKIAkJcmV0dXJuIC0xOwogCiAJcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopbW9zNzg0MF9wb3J0LT5wb3J0OwotCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19GVU5DVElPTl9fKSkgeworCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19mdW5jX18pKSB7CiAJCWRiZygiJXMiLCAiSW52YWxpZCBwb3J0IFxuIik7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0yMzE0LDcgKzIzMTUsNyBAQAogCSAgICB8KChtc3IgJiBNT1M3ODQwX01TUl9SSSkgPyBUSU9DTV9SSSA6IDApCS8qIDB4MDgwICovCiAJICAgIHwoKG1zciAmIE1PUzc4NDBfTVNSX0RTUikgPyBUSU9DTV9EU1IgOiAwKTsJLyogMHgxMDAgKi8KIAotCWRiZygiJXMgLS0gJXgiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJZGJnKCIlcyAtLSAleCIsIF9fZnVuY19fLCByZXN1bHQpOwogCiAJaWYgKGNvcHlfdG9fdXNlcih2YWx1ZSwgJnJlc3VsdCwgc2l6ZW9mKGludCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTIzNzEsNyArMjM3Miw3IEBACiAJc3RydWN0IHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgaWNvdW50OwogCWludCBtb3NyZXQgPSAwOwogCi0JaWYgKG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhwb3J0LCBfX0ZVTkNUSU9OX18pKSB7CisJaWYgKG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhwb3J0LCBfX2Z1bmNfXykpIHsKIAkJZGJnKCIlcyIsICJJbnZhbGlkIHBvcnQgXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTIzODMsMzkgKzIzODQsMzkgQEAKIAogCXR0eSA9IG1vczc4NDBfcG9ydC0+cG9ydC0+dHR5OwogCi0JZGJnKCIlcyAtIHBvcnQgJWQsIGNtZCA9IDB4JXgiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlciwgY21kKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCwgY21kID0gMHgleCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIGNtZCk7CiAKIAlzd2l0Y2ggKGNtZCkgewogCQkvKiByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSAqLwogCiAJY2FzZSBUSU9DU0VSR0VUTFNSOgotCQlkYmcoIiVzICglZCkgVElPQ1NFUkdFVExTUiIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwkJZGJnKCIlcyAoJWQpIFRJT0NTRVJHRVRMU1IiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAkJcmV0dXJuIG1vczc4NDBfZ2V0X2xzcl9pbmZvKG1vczc4NDBfcG9ydCwgYXJncCk7CiAJCXJldHVybiAwOwogCiAJY2FzZSBUSU9DTUJJUzoKIAljYXNlIFRJT0NNQklDOgogCWNhc2UgVElPQ01TRVQ6Ci0JCWRiZygiJXMgKCVkKSBUSU9DTVNFVC9USU9DTUJJQy9USU9DTVNFVCIsIF9fRlVOQ1RJT05fXywKKwkJZGJnKCIlcyAoJWQpIFRJT0NNU0VUL1RJT0NNQklDL1RJT0NNU0VUIiwgX19mdW5jX18sCiAJCSAgICBwb3J0LT5udW1iZXIpOwogCQltb3NyZXQgPQogCQkgICAgbW9zNzg0MF9zZXRfbW9kZW1faW5mbyhtb3M3ODQwX3BvcnQsIGNtZCwgYXJncCk7CiAJCXJldHVybiBtb3NyZXQ7CiAKIAljYXNlIFRJT0NNR0VUOgotCQlkYmcoIiVzICglZCkgVElPQ01HRVQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJCWRiZygiJXMgKCVkKSBUSU9DTUdFVCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCQlyZXR1cm4gbW9zNzg0MF9nZXRfbW9kZW1faW5mbyhtb3M3ODQwX3BvcnQsIGFyZ3ApOwogCiAJY2FzZSBUSU9DR1NFUklBTDoKLQkJZGJnKCIlcyAoJWQpIFRJT0NHU0VSSUFMIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCQlkYmcoIiVzICglZCkgVElPQ0dTRVJJQUwiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAkJcmV0dXJuIG1vczc4NDBfZ2V0X3NlcmlhbF9pbmZvKG1vczc4NDBfcG9ydCwgYXJncCk7CiAKIAljYXNlIFRJT0NTU0VSSUFMOgotCQlkYmcoIiVzICglZCkgVElPQ1NTRVJJQUwiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJCWRiZygiJXMgKCVkKSBUSU9DU1NFUklBTCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCQlicmVhazsKIAogCWNhc2UgVElPQ01JV0FJVDoKLQkJZGJnKCIlcyAoJWQpIFRJT0NNSVdBSVQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJCWRiZygiJXMgKCVkKSBUSU9DTUlXQUlUIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJCWNwcmV2ID0gbW9zNzg0MF9wb3J0LT5pY291bnQ7CiAJCXdoaWxlICgxKSB7CiAJCQkvL2ludGVycnVwdGlibGVfc2xlZXBfb24oJm1vczc4NDBfcG9ydC0+ZGVsdGFfbXNyX3dhaXQpOwpAQCAtMjQ1OCw3ICsyNDU5LDcgQEAKIAkJaWNvdW50LmJyayA9IGNub3cuYnJrOwogCQlpY291bnQuYnVmX292ZXJydW4gPSBjbm93LmJ1Zl9vdmVycnVuOwogCi0JCWRiZygiJXMgKCVkKSBUSU9DR0lDT1VOVCBSWD0lZCwgVFg9JWQiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgKCVkKSBUSU9DR0lDT1VOVCBSWD0lZCwgVFg9JWQiLCBfX2Z1bmNfXywKIAkJICAgIHBvcnQtPm51bWJlciwgaWNvdW50LnJ4LCBpY291bnQudHgpOwogCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZpY291bnQsIHNpemVvZihpY291bnQpKSkKIAkJCXJldHVybiAtRUZBVUxUOwpAQCAtMjUyMSw3ICsyNTIyLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7ICsraSkgewogCQltb3M3ODQwX3BvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbW9zY2hpcF9wb3J0KSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChtb3M3ODQwX3BvcnQgPT0gTlVMTCkgewotCQkJZXJyKCIlcyAtIE91dCBvZiBtZW1vcnkiLCBfX0ZVTkNUSU9OX18pOworCQkJZXJyKCIlcyAtIE91dCBvZiBtZW1vcnkiLCBfX2Z1bmNfXyk7CiAJCQlzdGF0dXMgPSAtRU5PTUVNOwogCQkJaS0tOyAvKiBkb24ndCBmb2xsb3cgTlVMTCBwb2ludGVyIGNsZWFuaW5nIHVwICovCiAJCQlnb3RvIGVycm9yOwpAQCAtMjc5OSwxMiArMjgwMCw3IEBACiAJLmRlc2NyaXB0aW9uID0gRFJJVkVSX0RFU0MsCiAJLnVzYl9kcml2ZXIgPSAmaW9fZHJpdmVyLAogCS5pZF90YWJsZSA9IG1vc2NoaXBfcG9ydF9pZF90YWJsZSwKLQkubnVtX2ludGVycnVwdF9pbiA9IDEsCS8vTlVNX0RPTlRfQ0FSRSwvLzEsCi0jaWZkZWYgY2hlY2sKLQkubnVtX2J1bGtfaW4gPSA0LAotCS5udW1fYnVsa19vdXQgPSA0LAogCS5udW1fcG9ydHMgPSA0LAotI2VuZGlmCiAJLm9wZW4gPSBtb3M3ODQwX29wZW4sCiAJLmNsb3NlID0gbW9zNzg0MF9jbG9zZSwKIAkud3JpdGUgPSBtb3M3ODQwX3dyaXRlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL25hdm1hbi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL25hdm1hbi5jCmluZGV4IDdmMzM3YzkuLjQzYzg4OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9uYXZtYW4uYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbmF2bWFuLmMKQEAgLTYsNiArNiwxMCBAQAogICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAqCXZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUT0RPOgorICoJQWRkIHRlcm1pb3MgbWV0aG9kIHRoYXQgdXNlcyBjb3B5X2h3IGJ1dCBhbHNvIGtpbGxzIGFsbCBlY2hvCisgKglmbGFncyBhcyB0aGUgbmF2bWFuIGlzIHJ4IG9ubHkgc28gY2Fubm90IGVjaG8uCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtNDksMTUgKzUzLDE1IEBACiAJY2FzZSAtRVNIVVRET1dOOgogCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLwogCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLAogCQkJICAgICAgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKIAogCXR0eSA9IHBvcnQtPnR0eTsKQEAgLTcyLDI5ICs3NiwyOSBAQAogCWlmIChyZXN1bHQpCiAJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCiAJCQkiJXMgLSBFcnJvciAlZCBzdWJtaXR0aW5nIGludGVycnVwdCB1cmJcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQlfX2Z1bmNfXywgcmVzdWx0KTsKIH0KIAogc3RhdGljIGludCBuYXZtYW5fb3BlbihzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAocG9ydC0+aW50ZXJydXB0X2luX3VyYikgewotCQlkYmcoIiVzIC0gYWRkaW5nIGludGVycnVwdCBpbnB1dCBmb3IgdHJlbyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBhZGRpbmcgaW50ZXJydXB0IGlucHV0IGZvciB0cmVvIiwgX19mdW5jX18pOwogCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfS0VSTkVMKTsKIAkJaWYgKHJlc3VsdCkKIAkJCWRldl9lcnIoJnBvcnQtPmRldiwKIAkJCQkiJXMgLSBmYWlsZWQgc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiLCBlcnJvciAlZFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQkJX19mdW5jX18sIHJlc3VsdCk7CiAJfQogCXJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyB2b2lkIG5hdm1hbl9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJdXNiX2tpbGxfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIpOwogfQpAQCAtMTAyLDE2ICsxMDYsMTIgQEAKIHN0YXRpYyBpbnQgbmF2bWFuX3dyaXRlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCiAJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKIHsKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyoKIAkgKiBUaGlzIGRldmljZSBjYW4ndCB3cml0ZSBhbnkgZGF0YSwgb25seSByZWFkIGZyb20gdGhlIGRldmljZQotCSAqIHNvIHdlIGp1c3Qgc2lsZW50bHkgZWF0IGFsbCBkYXRhIHNlbnQgdG8gdXMgYW5kIHNheSBpdCB3YXMKLQkgKiBzdWNjZXNzZnVsbHkgc2VudC4KLQkgKiBFdmlsLCBJIGtub3csIGJ1dCBkbyB5b3UgaGF2ZSBhIGJldHRlciBpZGVhPwogCSAqLwotCi0JcmV0dXJuIGNvdW50OworCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIAogc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsX2RyaXZlciBuYXZtYW5fZGV2aWNlID0gewpAQCAtMTIxLDkgKzEyMSw2IEBACiAJfSwKIAkuaWRfdGFibGUgPQkJaWRfdGFibGUsCiAJLnVzYl9kcml2ZXIgPQkJJm5hdm1hbl9kcml2ZXIsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19pbiA9CQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19vdXQgPQkJTlVNX0RPTlRfQ0FSRSwKIAkubnVtX3BvcnRzID0JCTEsCiAJLm9wZW4gPQkJCW5hdm1hbl9vcGVuLAogCS5jbG9zZSA9IAkJbmF2bWFuX2Nsb3NlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL29tbmluZXQuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vbW5pbmV0LmMKaW5kZXggZWU5NGQ5Ni4uN2I3NDIyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL29tbmluZXQuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb21uaW5ldC5jCkBAIC05NSw5ICs5NSw2IEBACiAJLmRlc2NyaXB0aW9uID0JCSJaeVhFTCAtIG9tbmkubmV0IGxjZCBwbHVzIHVzYiIsCiAJLnVzYl9kcml2ZXIgPQkJJm9tbmluZXRfZHJpdmVyLAogCS5pZF90YWJsZSA9CQlpZF90YWJsZSwKLQkubnVtX2ludGVycnVwdF9pbiA9CTEsCi0JLm51bV9idWxrX2luID0JCTEsCi0JLm51bV9idWxrX291dCA9CQkyLAogCS5udW1fcG9ydHMgPQkJMSwKIAkuYXR0YWNoID0JCW9tbmluZXRfYXR0YWNoLAogCS5vcGVuID0JCQlvbW5pbmV0X29wZW4sCkBAIC0xNTMsNyArMTUwLDcgQEAKIAogCW9kID0ga21hbGxvYyggc2l6ZW9mKHN0cnVjdCBvbW5pbmV0X2RhdGEpLCBHRlBfS0VSTkVMICk7CiAJaWYoICFvZCApIHsKLQkJZXJyKCIlcy0ga21hbGxvYyglWmQpIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18sIHNpemVvZihzdHJ1Y3Qgb21uaW5ldF9kYXRhKSk7CisJCWVycigiJXMtIGttYWxsb2MoJVpkKSBmYWlsZWQuIiwgX19mdW5jX18sIHNpemVvZihzdHJ1Y3Qgb21uaW5ldF9kYXRhKSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCwgb2QpOwpAQCAtMTY2LDcgKzE2Myw3IEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydAkqd3BvcnQ7CiAJaW50CQkJcmVzdWx0ID0gMDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAl3cG9ydCA9IHNlcmlhbC0+cG9ydFsxXTsKIAl3cG9ydC0+dHR5ID0gcG9ydC0+dHR5OwpAQCAtMTc4LDcgKzE3NSw3IEBACiAJCSAgICAgIG9tbmluZXRfcmVhZF9idWxrX2NhbGxiYWNrLCBwb3J0KTsKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJlc3VsdCkgewotCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJfQogCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTE4Niw3ICsxODMsNyBAQAogCiBzdGF0aWMgdm9pZCBvbW5pbmV0X2Nsb3NlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCiB7Ci0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAl1c2Jfa2lsbF91cmIocG9ydC0+cmVhZF91cmIpOwogfQogCkBAIC0xOTcsMTggKzE5NCwxOCBAQAogCiBzdGF0aWMgdm9pZCBvbW5pbmV0X3JlYWRfYnVsa19jYWxsYmFjayAoc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgCSpwb3J0IAk9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgCSpwb3J0IAk9IHVyYi0+Y29udGV4dDsKIAl1bnNpZ25lZCBjaGFyIAkJKmRhdGEgCT0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJc3RydWN0IG9tbmluZXRfaGVhZGVyIAkqaGVhZGVyID0gKHN0cnVjdCBvbW5pbmV0X2hlYWRlciAqKSAmZGF0YVswXTsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAJaW50IGk7CiAJaW50IHJlc3VsdDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCWRiZygiJXMgLSBub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCkBAIC0yMzYsNyArMjMzLDcgQEAKIAkJICAgICAgb21uaW5ldF9yZWFkX2J1bGtfY2FsbGJhY2ssIHBvcnQpOwogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlc3VsdCkKLQkJZXJyKCIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQllcnIoIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWQiLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAogCXJldHVybjsKIH0KQEAgLTI1MSwxNyArMjQ4LDE3IEBACiAKIAlpbnQJCQlyZXN1bHQ7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKGNvdW50ID09IDApIHsKLQkJZGJnKCIlcyAtIHdyaXRlIHJlcXVlc3Qgb2YgMCBieXRlcyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSB3cml0ZSByZXF1ZXN0IG9mIDAgYnl0ZXMiLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAoMCk7CiAJfQogCiAJc3Bpbl9sb2NrX2JoKCZ3cG9ydC0+bG9jayk7CiAJaWYgKHdwb3J0LT53cml0ZV91cmJfYnVzeSkgewogCQlzcGluX3VubG9ja19iaCgmd3BvcnQtPmxvY2spOwotCQlkYmcoIiVzIC0gYWxyZWFkeSB3cml0aW5nIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIGFscmVhZHkgd3JpdGluZyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogCXdwb3J0LT53cml0ZV91cmJfYnVzeSA9IDE7CkBAIC0yNzEsNyArMjY4LDcgQEAKIAogCW1lbWNweSAod3BvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyICsgT01OSU5FVF9EQVRBT0ZGU0VULCBidWYsIGNvdW50KTsKIAotCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCBjb3VudCwgd3BvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLCBjb3VudCwgd3BvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIAogCWhlYWRlci0+b2hfc2VxIAk9IG9kLT5vZF9vdXRzZXErKzsKIAloZWFkZXItPm9oX2xlbiAJPSBjb3VudDsKQEAgLTI4NSw3ICsyODIsNyBAQAogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHdwb3J0LT53cml0ZV91cmIsIEdGUF9BVE9NSUMpOwogCWlmIChyZXN1bHQpIHsKIAkJd3BvcnQtPndyaXRlX3VyYl9idXN5ID0gMDsKLQkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCWVycigiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJfSBlbHNlCiAJCXJlc3VsdCA9IGNvdW50OwogCkBAIC0yOTgsMTIgKzI5NSwxMyBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsIAkqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgCSp3cG9ydCAJPSBzZXJpYWwtPnBvcnRbMV07CiAKLQlpbnQgcm9vbSA9IDA7IC8vIERlZmF1bHQ6IG5vIHJvb20KKwlpbnQgcm9vbSA9IDA7IC8qIERlZmF1bHQ6IG5vIHJvb20gKi8KIAorCS8qIEZJWE1FOiBubyBjb25zaXN0ZW50IGxvY2tpbmcgZm9yIHdyaXRlX3VyYl9idXN5ICovCiAJaWYgKHdwb3J0LT53cml0ZV91cmJfYnVzeSkKIAkJcm9vbSA9IHdwb3J0LT5idWxrX291dF9zaXplIC0gT01OSU5FVF9IRUFERVJMRU47CiAKLQlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgcm9vbSk7CisJZGJnKCIlcyAtIHJldHVybnMgJWQiLCBfX2Z1bmNfXywgcm9vbSk7CiAKIAlyZXR1cm4gKHJvb20pOwogfQpAQCAtMzExLDE1ICszMDksMTUgQEAKIHN0YXRpYyB2b2lkIG9tbmluZXRfd3JpdGVfYnVsa19jYWxsYmFjayAoc3RydWN0IHVyYiAqdXJiKQogewogLyoJc3RydWN0IG9tbmluZXRfaGVhZGVyCSpoZWFkZXIgPSAoc3RydWN0IG9tbmluZXRfaGVhZGVyICAqKSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsgKi8KLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0IAkqcG9ydCAgID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgCSpwb3J0ICAgPSAgdXJiLT5jb250ZXh0OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiJXMgLSBwb3J0ICUweFxuIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICUweFxuIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7CiAJaWYgKHN0YXR1cykgewogCQlkYmcoIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTMzMSw3ICszMjksNyBAQAogewogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKndwb3J0ID0gc2VyaWFsLT5wb3J0WzFdOwogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSBzZXJpYWwtPnBvcnRbMF07Ci0JZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZyAoIiVzIiwgX19mdW5jX18pOwogCiAJdXNiX2tpbGxfdXJiKHdwb3J0LT53cml0ZV91cmIpOwogCWtmcmVlKHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKaW5kZXggZDEwMTAyNS4uZTRiZTJkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYwpAQCAtMjgsNyArMjgsNyBAQAogICBkZXZpY2UgZmVhdHVyZXMuCiAqLwogCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MC43LjEiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MC43LjIiCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IgIk1hdHRoaWFzIFVybGljaHMgPHNtdXJmQHNtdXJmLm5vcmlzLmRlPiIKICNkZWZpbmUgRFJJVkVSX0RFU0MgIlVTQiBEcml2ZXIgZm9yIEdTTSBtb2RlbXMiCiAKQEAgLTMyNSw5ICszMjUsNiBAQAogCS5kZXNjcmlwdGlvbiAgICAgICA9ICJHU00gbW9kZW0gKDEtcG9ydCkiLAogCS51c2JfZHJpdmVyICAgICAgICA9ICZvcHRpb25fZHJpdmVyLAogCS5pZF90YWJsZSAgICAgICAgICA9IG9wdGlvbl9pZHMsCi0JLm51bV9pbnRlcnJ1cHRfaW4gID0gTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfaW4gICAgICAgPSBOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19vdXQgICAgICA9IE5VTV9ET05UX0NBUkUsCiAJLm51bV9wb3J0cyAgICAgICAgID0gMSwKIAkub3BlbiAgICAgICAgICAgICAgPSBvcHRpb25fb3BlbiwKIAkuY2xvc2UgICAgICAgICAgICAgPSBvcHRpb25fY2xvc2UsCkBAIC00MTEsMjQgKzQwOCwyNCBAQAogCiBzdGF0aWMgdm9pZCBvcHRpb25fcnhfdGhyb3R0bGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogfQogCiBzdGF0aWMgdm9pZCBvcHRpb25fcnhfdW50aHJvdHRsZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiB9CiAKIHN0YXRpYyB2b2lkIG9wdGlvbl9icmVha19jdGwoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlKQogewogCS8qIFVuZm9ydHVuYXRlbHksIEkgZG9uJ3Qga25vdyBob3cgdG8gc2VuZCBhIGJyZWFrICovCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIH0KIAogc3RhdGljIHZvaWQgb3B0aW9uX3NldF90ZXJtaW9zKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCiAJCQlzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQogewotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAJLyogRG9lc24ndCBzdXBwb3J0IG9wdGlvbiBzZXR0aW5nICovCiAJdHR5X3Rlcm1pb3NfY29weV9odyhwb3J0LT50dHktPnRlcm1pb3MsIG9sZF90ZXJtaW9zKTsKIAlvcHRpb25fc2VuZF9zZXR1cChwb3J0KTsKQEAgLTQ1OCw2ICs0NTUsNyBAQAogCiAJcG9ydGRhdGEgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKKwkvKiBGSVhNRTogd2hhdCBsb2NrcyBwb3J0ZGF0YSBmaWVsZHMgPyAqLwogCWlmIChzZXQgJiBUSU9DTV9SVFMpCiAJCXBvcnRkYXRhLT5ydHNfc3RhdGUgPSAxOwogCWlmIChzZXQgJiBUSU9DTV9EVFIpCkBAIC00ODgsNyArNDg2LDcgQEAKIAogCXBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCi0JZGJnKCIlczogd3JpdGUgKCVkIGNoYXJzKSIsIF9fRlVOQ1RJT05fXywgY291bnQpOworCWRiZygiJXM6IHdyaXRlICglZCBjaGFycykiLCBfX2Z1bmNfXywgY291bnQpOwogCiAJaSA9IDA7CiAJbGVmdCA9IGNvdW50OwpAQCAtNTA5LDcgKzUwNyw3IEBACiAJCQlkYmcoInVzYl93cml0ZSAlcCBmYWlsZWQgKGVycj0lZCkiLAogCQkJCXRoaXNfdXJiLCB0aGlzX3VyYi0+c3RhdHVzKTsKIAotCQlkYmcoIiVzOiBlbmRwb2ludCAlZCBidWYgJWQiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXM6IGVuZHBvaW50ICVkIGJ1ZiAlZCIsIF9fZnVuY19fLAogCQkJdXNiX3BpcGVlbmRwb2ludCh0aGlzX3VyYi0+cGlwZSksIGkpOwogCiAJCS8qIHNlbmQgdGhlIGRhdGEgKi8KQEAgLTUzMSw3ICs1MjksNyBAQAogCX0KIAogCWNvdW50IC09IGxlZnQ7Ci0JZGJnKCIlczogd3JvdGUgKGRpZCAlZCkiLCBfX0ZVTkNUSU9OX18sIGNvdW50KTsKKwlkYmcoIiVzOiB3cm90ZSAoZGlkICVkKSIsIF9fZnVuY19fLCBjb3VudCk7CiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC01NDQsMTQgKzU0MiwxNCBAQAogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcoIiVzOiAlcCIsIF9fRlVOQ1RJT05fXywgdXJiKTsKKwlkYmcoIiVzOiAlcCIsIF9fZnVuY19fLCB1cmIpOwogCiAJZW5kcG9pbnQgPSB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSk7Ci0JcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHVyYi0+Y29udGV4dDsKKwlwb3J0ID0gIHVyYi0+Y29udGV4dDsKIAogCWlmIChzdGF0dXMpIHsKIAkJZGJnKCIlczogbm9uemVybyBzdGF0dXM6ICVkIG9uIGVuZHBvaW50ICUwMnguIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzLCBlbmRwb2ludCk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzLCBlbmRwb2ludCk7CiAJfSBlbHNlIHsKIAkJdHR5ID0gcG9ydC0+dHR5OwogCQlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoKSB7CkBAIC01NTksNyArNTU3LDcgQEAKIAkJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBkYXRhLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKIAkJfSBlbHNlIHsKLQkJCWRiZygiJXM6IGVtcHR5IHJlYWQgdXJiIHJlY2VpdmVkIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXM6IGVtcHR5IHJlYWQgdXJiIHJlY2VpdmVkIiwgX19mdW5jX18pOwogCQl9CiAKIAkJLyogUmVzdWJtaXQgdXJiIHNvIHdlIGNvbnRpbnVlIHJlY2VpdmluZyAqLwpAQCAtNTY3LDcgKzU2NSw3IEBACiAJCQllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCQkJaWYgKGVycikKIAkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZXN1Ym1pdCByZWFkIHVyYiBmYWlsZWQuICIKLQkJCQkJIiglZCkiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQkJCSIoJWQpIiwgX19mdW5jX18sIGVycik7CiAJCX0KIAl9CiAJcmV0dXJuOwpAQCAtNTc5LDkgKzU3Nyw5IEBACiAJc3RydWN0IG9wdGlvbl9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhOwogCWludCBpOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAotCXBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKSB1cmItPmNvbnRleHQ7CisJcG9ydCA9ICB1cmItPmNvbnRleHQ7CiAKIAl1c2Jfc2VyaWFsX3BvcnRfc29mdGludChwb3J0KTsKIApAQCAtNTk5LDE5ICs1OTcsMTkgQEAKIHsKIAlpbnQgZXJyOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAgdXJiLT5jb250ZXh0OwogCXN0cnVjdCBvcHRpb25fcG9ydF9wcml2YXRlICpwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7Ci0JZGJnKCIlczogdXJiICVwIHBvcnQgJXAgaGFzIGRhdGEgJXAiLCBfX0ZVTkNUSU9OX18sdXJiLHBvcnQscG9ydGRhdGEpOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CisJZGJnKCIlczogdXJiICVwIHBvcnQgJXAgaGFzIGRhdGEgJXAiLCBfX2Z1bmNfXyx1cmIscG9ydCxwb3J0ZGF0YSk7CiAKIAlpZiAoc3RhdHVzID09IDApIHsKIAkJc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqcmVxX3BrdCA9CiAJCQkJKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKil1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAogCQlpZiAoIXJlcV9wa3QpIHsKLQkJCWRiZygiJXM6IE5VTEwgcmVxX3BrdFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXM6IE5VTEwgcmVxX3BrdFxuIiwgX19mdW5jX18pOwogCQkJcmV0dXJuOwogCQl9CiAJCWlmICgocmVxX3BrdC0+YlJlcXVlc3RUeXBlID09IDB4QTEpICYmCkBAIC02MjEsNyArNjE5LDcgQEAKIAkJCQkJdXJiLT50cmFuc2Zlcl9idWZmZXIgKwogCQkJCQlzaXplb2Yoc3RydWN0IHVzYl9jdHJscmVxdWVzdCkpOwogCi0JCQlkYmcoIiVzOiBzaWduYWwgeCV4IiwgX19GVU5DVElPTl9fLCBzaWduYWxzKTsKKwkJCWRiZygiJXM6IHNpZ25hbCB4JXgiLCBfX2Z1bmNfXywgc2lnbmFscyk7CiAKIAkJCW9sZF9kY2Rfc3RhdGUgPSBwb3J0ZGF0YS0+ZGNkX3N0YXRlOwogCQkJcG9ydGRhdGEtPmN0c19zdGF0ZSA9IDE7CkBAIC02MzMsMTEgKzYzMSwxMSBAQAogCQkJCQlvbGRfZGNkX3N0YXRlICYmICFwb3J0ZGF0YS0+ZGNkX3N0YXRlKQogCQkJCXR0eV9oYW5ndXAocG9ydC0+dHR5KTsKIAkJfSBlbHNlIHsKLQkJCWRiZygiJXM6IHR5cGUgJXggcmVxICV4IiwgX19GVU5DVElPTl9fLAorCQkJZGJnKCIlczogdHlwZSAleCByZXEgJXgiLCBfX2Z1bmNfXywKIAkJCQlyZXFfcGt0LT5iUmVxdWVzdFR5cGUscmVxX3BrdC0+YlJlcXVlc3QpOwogCQl9CiAJfSBlbHNlCi0JCWRiZygiJXM6IGVycm9yICVkIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkYmcoIiVzOiBlcnJvciAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCiAJLyogUmVzdWJtaXQgdXJiIHNvIHdlIGNvbnRpbnVlIHJlY2VpdmluZyBJUlEgZGF0YSAqLwogCWlmIChzdGF0dXMgIT0gLUVTSFVURE9XTikgewpAQCAtNjQ1LDcgKzY0Myw3IEBACiAJCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChlcnIpCiAJCQlkYmcoIiVzOiByZXN1Ym1pdCBpbnRyIHVyYiBmYWlsZWQuICglZCkiLAotCQkJCV9fRlVOQ1RJT05fXywgZXJyKTsKKwkJCQlfX2Z1bmNfXywgZXJyKTsKIAl9CiB9CiAKQEAgLTY1OCwxMyArNjU2LDE0IEBACiAKIAlwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAorCiAJZm9yIChpPTA7IGkgPCBOX09VVF9VUkI7IGkrKykgewogCQl0aGlzX3VyYiA9IHBvcnRkYXRhLT5vdXRfdXJic1tpXTsKIAkJaWYgKHRoaXNfdXJiICYmICF0ZXN0X2JpdChpLCAmcG9ydGRhdGEtPm91dF9idXN5KSkKIAkJCWRhdGFfbGVuICs9IE9VVF9CVUZMRU47CiAJfQogCi0JZGJnKCIlczogJWQiLCBfX0ZVTkNUSU9OX18sIGRhdGFfbGVuKTsKKwlkYmcoIiVzOiAlZCIsIF9fZnVuY19fLCBkYXRhX2xlbik7CiAJcmV0dXJuIGRhdGFfbGVuOwogfQogCkBAIC02NzksMTAgKzY3OCwxMiBAQAogCiAJZm9yIChpPTA7IGkgPCBOX09VVF9VUkI7IGkrKykgewogCQl0aGlzX3VyYiA9IHBvcnRkYXRhLT5vdXRfdXJic1tpXTsKKwkJLyogRklYTUU6IFRoaXMgbG9ja2luZyBpcyBpbnN1ZmZpY2llbnQgYXMgdGhpc191cmIgbWF5CisJCSAgIGdvIHVudXNlZCBkdXJpbmcgdGhlIHRlc3QgKi8KIAkJaWYgKHRoaXNfdXJiICYmIHRlc3RfYml0KGksICZwb3J0ZGF0YS0+b3V0X2J1c3kpKQogCQkJZGF0YV9sZW4gKz0gdGhpc191cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGg7CiAJfQotCWRiZygiJXM6ICVkIiwgX19GVU5DVElPTl9fLCBkYXRhX2xlbik7CisJZGJnKCIlczogJWQiLCBfX2Z1bmNfXywgZGF0YV9sZW4pOwogCXJldHVybiBkYXRhX2xlbjsKIH0KIApAQCAtNjk1LDcgKzY5Niw3IEBACiAKIAlwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAkvKiBTZXQgc29tZSBzYW5lIGRlZmF1bHRzICovCiAJcG9ydGRhdGEtPnJ0c19zdGF0ZSA9IDE7CkBAIC03MDcsNyArNzA4LDcgQEAKIAkJaWYgKCEgdXJiKQogCQkJY29udGludWU7CiAJCWlmICh1cmItPmRldiAhPSBzZXJpYWwtPmRldikgewotCQkJZGJnKCIlczogZGV2ICVwICE9ICVwIiwgX19GVU5DVElPTl9fLAorCQkJZGJnKCIlczogZGV2ICVwICE9ICVwIiwgX19mdW5jX18sCiAJCQkJdXJiLT5kZXYsIHNlcmlhbC0+ZGV2KTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC03MjEsNyArNzIyLDcgQEAKIAkJZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfS0VSTkVMKTsKIAkJaWYgKGVycikgewogCQkJZGJnKCIlczogc3VibWl0IHVyYiAlZCBmYWlsZWQgKCVkKSAlZCIsCi0JCQkJX19GVU5DVElPTl9fLCBpLCBlcnIsCisJCQkJX19mdW5jX18sIGksIGVyciwKIAkJCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOwogCQl9CiAJfQpAQCAtNzQ5LDcgKzc1MCw3IEBACiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAlzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCXBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCiAJcG9ydGRhdGEtPnJ0c19zdGF0ZSA9IDA7CkBAIC03ODIsNyArNzgzLDcgQEAKIAogCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CQkvKiBObyBJU08gKi8KIAlpZiAodXJiID09IE5VTEwpIHsKLQkJZGJnKCIlczogYWxsb2MgZm9yIGVuZHBvaW50ICVkIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18sIGVuZHBvaW50KTsKKwkJZGJnKCIlczogYWxsb2MgZm9yIGVuZHBvaW50ICVkIGZhaWxlZC4iLCBfX2Z1bmNfXywgZW5kcG9pbnQpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTgwMSw3ICs4MDIsNyBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CiAJc3RydWN0IG9wdGlvbl9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgaSsrKSB7CiAJCXBvcnQgPSBzZXJpYWwtPnBvcnRbaV07CkBAIC04MjMsMTUgKzgyNCwxOCBAQAogCX0KIH0KIAorCisvKiogc2VuZCBSVFMvRFRSIHN0YXRlIHRvIHRoZSBwb3J0LgorICoKKyAqIFRoaXMgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyBTRVRfQ09OVFJPTF9MSU5FX1NUQVRFIGZyb20gdGhlIFBTVE4KKyAqIENEQy4KKyovCiBzdGF0aWMgaW50IG9wdGlvbl9zZW5kX3NldHVwKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAlzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7Ci0KLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKLQotCWlmIChwb3J0LT5udW1iZXIgIT0gMCkKLQkJcmV0dXJuIDA7CisJaW50IGlmTnVtID0gc2VyaWFsLT5pbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCXBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCkBAIC04NDQsNyArODQ4LDcgQEAKIAogCQlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKHNlcmlhbC0+ZGV2LAogCQkJCXVzYl9yY3ZjdHJscGlwZShzZXJpYWwtPmRldiwgMCksCi0JCQkJMHgyMiwweDIxLHZhbCwwLE5VTEwsMCxVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CisJCQkJMHgyMiwweDIxLHZhbCxpZk51bSxOVUxMLDAsVVNCX0NUUkxfU0VUX1RJTUVPVVQpOwogCX0KIAogCXJldHVybiAwOwpAQCAtODU3LDcgKzg2MSw3IEBACiAJc3RydWN0IG9wdGlvbl9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhOwogCXU4ICpidWZmZXI7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJLyogTm93IHNldHVwIHBlciBwb3J0IHByaXZhdGUgZGF0YSAqLwogCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgaSsrKSB7CkBAIC04NjUsNyArODY5LDcgQEAKIAkJcG9ydGRhdGEgPSBremFsbG9jKHNpemVvZigqcG9ydGRhdGEpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFwb3J0ZGF0YSkgewogCQkJZGJnKCIlczoga21hbGxvYyBmb3Igb3B0aW9uX3BvcnRfcHJpdmF0ZSAoJWQpIGZhaWxlZCEuIiwKLQkJCQkJX19GVU5DVElPTl9fLCBpKTsKKwkJCQkJX19mdW5jX18sIGkpOwogCQkJcmV0dXJuICgxKTsKIAkJfQogCkBAIC04OTAsNyArODk0LDcgQEAKIAkJZXJyID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0tFUk5FTCk7CiAJCWlmIChlcnIpCiAJCQlkYmcoIiVzOiBzdWJtaXQgaXJxX2luIHVyYiBmYWlsZWQgJWQiLAotCQkJCV9fRlVOQ1RJT05fXywgZXJyKTsKKwkJCQlfX2Z1bmNfXywgZXJyKTsKIAl9CiAKIAlvcHRpb25fc2V0dXBfdXJicyhzZXJpYWwpOwpAQCAtOTE0LDcgKzkxOCw3IEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKIAlzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJLyogU3RvcCByZWFkaW5nL3dyaXRpbmcgdXJicyAqLwogCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgKytpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3RpNjg1OC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL290aTY4NTguYwppbmRleCBhMzg0N2Q2Li5kOTJiYjY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3RpNjg1OC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vdGk2ODU4LmMKQEAgLTE3OSw5ICsxNzksNiBAQAogCQkubmFtZSA9CQkib3RpNjg1OCIsCiAJfSwKIAkuaWRfdGFibGUgPQkJaWRfdGFibGUsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPQkxLAotCS5udW1fYnVsa19pbiA9CQkxLAotCS5udW1fYnVsa19vdXQgPQkJMSwKIAkubnVtX3BvcnRzID0JCTEsCiAJLm9wZW4gPQkJCW90aTY4NThfb3BlbiwKIAkuY2xvc2UgPQkJb3RpNjg1OF9jbG9zZSwKQEAgLTIzOCwxMCArMjM1LDEwIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmVzdWx0OwogCi0JZGJnKCIlcyhwb3J0ID0gJWQpIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMocG9ydCA9ICVkKSIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKChuZXdfc2V0dXAgPSBrbWFsbG9jKE9USTY4NThfQ1RSTF9QS1RfU0laRSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMoKTogb3V0IG9mIG1lbW9yeSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzKCk6IG91dCBvZiBtZW1vcnkhXG4iLCBfX2Z1bmNfXyk7CiAJCS8qIHdlIHdpbGwgdHJ5IGFnYWluICovCiAJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+ZGVsYXllZF9zZXR1cF93b3JrLCBtc2Vjc190b19qaWZmaWVzKDIpKTsKIAkJcmV0dXJuOwpAQCAtMjU2LDcgKzI1Myw3IEBACiAJCQkJMTAwKTsKIAogCWlmIChyZXN1bHQgIT0gT1RJNjg1OF9DVFJMX1BLVF9TSVpFKSB7Ci0JCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzKCk6IGVycm9yIHJlYWRpbmcgc3RhdHVzXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcygpOiBlcnJvciByZWFkaW5nIHN0YXR1c1xuIiwgX19mdW5jX18pOwogCQlrZnJlZShuZXdfc2V0dXApOwogCQkvKiB3ZSB3aWxsIHRyeSBhZ2FpbiAqLwogCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnByaXYtPmRlbGF5ZWRfc2V0dXBfd29yaywgbXNlY3NfdG9famlmZmllcygyKSk7CkBAIC0yODksMTIgKzI4NiwxMiBAQAogCXByaXYtPnNldHVwX2RvbmUgPSAxOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAotCWRiZygiJXMoKTogc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzKCk6IHN1Ym1pdHRpbmcgaW50ZXJydXB0IHVyYiIsIF9fZnVuY19fKTsKIAlwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAocmVzdWx0ICE9IDApIHsKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMoKTogdXNiX3N1Ym1pdF91cmIoKSBmYWlsZWQiCi0JCQkJIiB3aXRoIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQkJIiB3aXRoIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAl9CiB9CiAKQEAgLTMwNiw3ICszMDMsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgY2hhciBhbGxvdzsKIAotCWRiZygiJXMocG9ydCA9ICVkKSIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzKHBvcnQgPSAlZCkiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJaWYgKHByaXYtPmZsYWdzLndyaXRlX3VyYl9pbl91c2UpIHsKQEAgLTMzNCwxMiArMzMxLDEyIEBACiAJaWYgKGNvdW50ID09IDApIHsKIAkJcHJpdi0+ZmxhZ3Mud3JpdGVfdXJiX2luX3VzZSA9IDA7CiAKLQkJZGJnKCIlcygpOiBzdWJtaXR0aW5nIGludGVycnVwdCB1cmIiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzKCk6IHN1Ym1pdHRpbmcgaW50ZXJydXB0IHVyYiIsIF9fZnVuY19fKTsKIAkJcG9ydC0+aW50ZXJydXB0X2luX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAocmVzdWx0ICE9IDApIHsKIAkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzKCk6IHVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkIgotCQkJCSIgd2l0aCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJCSIgd2l0aCBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCX0KIAkJcmV0dXJuOwogCX0KQEAgLTM1Myw3ICszNTAsNyBAQAogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPndyaXRlX3VyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlc3VsdCAhPSAwKSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzKCk6IHVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkIgotCQkJICAgICAgICIgd2l0aCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJICAgICAgICIgd2l0aCBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCXByaXYtPmZsYWdzLndyaXRlX3VyYl9pbl91c2UgPSAwOwogCX0KIApAQCAtNDA0LDcgKzQwMSw3IEBACiAJc3RydWN0IG90aTY4NThfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyhwb3J0ID0gJWQsIGNvdW50ID0gJWQpIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIGNvdW50KTsKKwlkYmcoIiVzKHBvcnQgPSAlZCwgY291bnQgPSAlZCkiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCBjb3VudCk7CiAKIAlpZiAoIWNvdW50KQogCQlyZXR1cm4gY291bnQ7CkBAIC00MjIsNyArNDE5LDcgQEAKIAlpbnQgcm9vbSA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMocG9ydCA9ICVkKSIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzKHBvcnQgPSAlZCkiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJcm9vbSA9IG90aTY4NThfYnVmX3NwYWNlX2F2YWlsKHByaXYtPmJ1Zik7CkBAIC00MzcsNyArNDM0LDcgQEAKIAlpbnQgY2hhcnMgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzKHBvcnQgPSAlZCkiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyhwb3J0ID0gJWQpIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCWNoYXJzID0gb3RpNjg1OF9idWZfZGF0YV9hdmFpbChwcml2LT5idWYpOwpAQCAtNDU2LDEwICs0NTMsMTAgQEAKIAl1MTYgZGl2aXNvcjsKIAlpbnQgYnI7CiAKLQlkYmcoIiVzKHBvcnQgPSAlZCkiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyhwb3J0ID0gJWQpIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoIXBvcnQtPnR0eSB8fCAhcG9ydC0+dHR5LT50ZXJtaW9zKSB7Ci0JCWRiZygiJXMoKTogbm8gdHR5IHN0cnVjdHVyZXMiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzKCk6IG5vIHR0eSBzdHJ1Y3R1cmVzIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC01NzUsNyArNTcyLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXN1bHQ7CiAKLQlkYmcoIiVzKHBvcnQgPSAlZCkiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyhwb3J0ID0gJWQpIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAl1c2JfY2xlYXJfaGFsdChzZXJpYWwtPmRldiwgcG9ydC0+d3JpdGVfdXJiLT5waXBlKTsKIAl1c2JfY2xlYXJfaGFsdChzZXJpYWwtPmRldiwgcG9ydC0+cmVhZF91cmItPnBpcGUpOwpAQCAtNTg0LDcgKzU4MSw3IEBACiAJCXJldHVybiAwOwogCiAJaWYgKChidWYgPSBrbWFsbG9jKE9USTY4NThfQ1RSTF9QS1RfU0laRSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMoKTogb3V0IG9mIG1lbW9yeSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzKCk6IG91dCBvZiBtZW1vcnkhXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtNjEzLDEyICs2MTAsMTIgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJa2ZyZWUoYnVmKTsKIAotCWRiZygiJXMoKTogc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzKCk6IHN1Ym1pdHRpbmcgaW50ZXJydXB0IHVyYiIsIF9fZnVuY19fKTsKIAlwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfS0VSTkVMKTsKIAlpZiAocmVzdWx0ICE9IDApIHsKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMoKTogdXNiX3N1Ym1pdF91cmIoKSBmYWlsZWQiCi0JCQkgICAgICAgIiB3aXRoIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQkgICAgICAgIiB3aXRoIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAkJb3RpNjg1OF9jbG9zZShwb3J0LCBOVUxMKTsKIAkJcmV0dXJuIC1FUFJPVE87CiAJfQpAQCAtNjM3LDE0ICs2MzQsMTQgQEAKIAlsb25nIHRpbWVvdXQ7CiAJd2FpdF9xdWV1ZV90IHdhaXQ7CiAKLQlkYmcoIiVzKHBvcnQgPSAlZCkiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyhwb3J0ID0gJWQpIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAkvKiB3YWl0IGZvciBkYXRhIHRvIGRyYWluIGZyb20gdGhlIGJ1ZmZlciAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJdGltZW91dCA9IDMwICogSFo7CS8qIFBMMjMwM19DTE9TSU5HX1dBSVQgKi8KIAlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CiAJYWRkX3dhaXRfcXVldWUoJnBvcnQtPnR0eS0+d3JpdGVfd2FpdCwgJndhaXQpOwotCWRiZygiJXMoKTogZW50ZXJpbmcgd2FpdCBsb29wIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzKCk6IGVudGVyaW5nIHdhaXQgbG9vcCIsIF9fZnVuY19fKTsKIAlmb3IgKDs7KSB7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCWlmIChvdGk2ODU4X2J1Zl9kYXRhX2F2YWlsKHByaXYtPmJ1ZikgPT0gMApAQCAtNjU3LDcgKzY1NCw3IEBACiAJfQogCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJcmVtb3ZlX3dhaXRfcXVldWUoJnBvcnQtPnR0eS0+d3JpdGVfd2FpdCwgJndhaXQpOwotCWRiZygiJXMoKTogYWZ0ZXIgd2FpdCBsb29wIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzKCk6IGFmdGVyIHdhaXQgbG9vcCIsIF9fZnVuY19fKTsKIAogCS8qIGNsZWFyIG91dCBhbnkgcmVtYWluaW5nIGRhdGEgaW4gdGhlIGJ1ZmZlciAqLwogCW90aTY4NThfYnVmX2NsZWFyKHByaXYtPmJ1Zik7CkBAIC02NzgsNyArNjc1LDcgQEAKIAkqLwogCQl0aW1lb3V0ID0gMipIWjsKIAlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZW91dCk7Ci0JZGJnKCIlcygpOiBhZnRlciBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoKSIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcygpOiBhZnRlciBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoKSIsIF9fZnVuY19fKTsKIAogCS8qIGNhbmNlbCBzY2hlZHVsZWQgc2V0dXAgKi8KIAljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kZWxheWVkX3NldHVwX3dvcmspOwpAQCAtNjg2LDcgKzY4Myw3IEBACiAJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAogCS8qIHNodXRkb3duIG91ciB1cmJzICovCi0JZGJnKCIlcygpOiBzaHV0dGluZyBkb3duIHVyYnMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMoKTogc2h1dHRpbmcgZG93biB1cmJzIiwgX19mdW5jX18pOwogCXVzYl9raWxsX3VyYihwb3J0LT53cml0ZV91cmIpOwogCXVzYl9raWxsX3VyYihwb3J0LT5yZWFkX3VyYik7CiAJdXNiX2tpbGxfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIpOwpAQCAtNzA5LDcgKzcwNiw3IEBACiAJdTggY29udHJvbDsKIAogCWRiZygiJXMocG9ydCA9ICVkLCBzZXQgPSAweCUwOHgsIGNsZWFyID0gMHglMDh4KSIsCi0JCQkJX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIHNldCwgY2xlYXIpOworCQkJCV9fZnVuY19fLCBwb3J0LT5udW1iZXIsIHNldCwgY2xlYXIpOwogCiAJaWYgKCF1c2JfZ2V0X2ludGZkYXRhKHBvcnQtPnNlcmlhbC0+aW50ZXJmYWNlKSkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC03NDEsNyArNzM4LDcgQEAKIAl1bnNpZ25lZCBwaW5fc3RhdGU7CiAJdW5zaWduZWQgcmVzdWx0ID0gMDsKIAotCWRiZygiJXMocG9ydCA9ICVkKSIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzKHBvcnQgPSAlZCkiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmICghdXNiX2dldF9pbnRmZGF0YShwb3J0LT5zZXJpYWwtPmludGVyZmFjZSkpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtNzY0LDcgKzc2MSw3IEBACiAJaWYgKChwaW5fc3RhdGUgJiBQSU5fRENEKSAhPSAwKQogCQlyZXN1bHQgfD0gVElPQ01fQ0Q7CiAKLQlkYmcoIiVzKCkgPSAweCUwOHgiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJZGJnKCIlcygpID0gMHglMDh4IiwgX19mdW5jX18sIHJlc3VsdCk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtODExLDEzICs4MDgsOSBAQAogCXVuc2lnbmVkIGludCB4OwogCiAJZGJnKCIlcyhwb3J0ID0gJWQsIGNtZCA9IDB4JTA0eCwgYXJnID0gMHglMDhseCkiLAotCQkJCV9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjbWQsIGFyZyk7CisJCQkJX19mdW5jX18sIHBvcnQtPm51bWJlciwgY21kLCBhcmcpOwogCiAJc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBUQ0ZMU0g6Ci0JCQkvKiBGSVhNRSAqLwotCQkJcmV0dXJuIDA7Ci0KIAkJY2FzZSBUSU9DTUJJUzoKIAkJCWlmIChjb3B5X2Zyb21fdXNlcigmeCwgdXNlcl9hcmcsIHNpemVvZih4KSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC04MjksMTEgKzgyMiwxMSBAQAogCQkJcmV0dXJuIG90aTY4NThfdGlvY21zZXQocG9ydCwgTlVMTCwgMCwgeCk7CiAKIAkJY2FzZSBUSU9DTUlXQUlUOgotCQkJZGJnKCIlcygpOiBUSU9DTUlXQUlUIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMoKTogVElPQ01JV0FJVCIsIF9fZnVuY19fKTsKIAkJCXJldHVybiB3YWl0X21vZGVtX2luZm8ocG9ydCwgYXJnKTsKIAogCQlkZWZhdWx0OgotCQkJZGJnKCIlcygpOiAweCUwNHggbm90IHN1cHBvcnRlZCIsIF9fRlVOQ1RJT05fXywgY21kKTsKKwkJCWRiZygiJXMoKTogMHglMDR4IG5vdCBzdXBwb3J0ZWQiLCBfX2Z1bmNfXywgY21kKTsKIAkJCWJyZWFrOwogCX0KIApAQCAtODQ0LDEwICs4MzcsMTAgQEAKIHsKIAlpbnQgc3RhdGU7CiAKLQlkYmcoIiVzKHBvcnQgPSAlZCkiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyhwb3J0ID0gJWQpIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlzdGF0ZSA9IChicmVha19zdGF0ZSA9PSAwKSA/IDAgOiAxOwotCWRiZygiJXMoKTogdHVybmluZyBicmVhayAlcyIsIF9fRlVOQ1RJT05fXywgc3RhdGUgPyAib24iIDogIm9mZiIpOworCWRiZygiJXMoKTogdHVybmluZyBicmVhayAlcyIsIF9fZnVuY19fLCBzdGF0ZSA/ICJvbiIgOiAib2ZmIik7CiAKIAkvKiBGSVhNRSAqLwogLyoKQEAgLTg1NSw3ICs4NDgsNyBAQAogCQkJCSAgQlJFQUtfUkVRVUVTVCwgQlJFQUtfUkVRVUVTVF9UWVBFLCBzdGF0ZSwKIAkJCQkgIDAsIE5VTEwsIDAsIDEwMCk7CiAJaWYgKHJlc3VsdCAhPSAwKQotCQlkYmcoIiVzKCk6IGVycm9yIHNlbmRpbmcgYnJlYWsiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzKCk6IGVycm9yIHNlbmRpbmcgYnJlYWsiLCBfX2Z1bmNfXyk7CiAgKi8KIH0KIApAQCAtODY0LDcgKzg1Nyw3IEBACiAJc3RydWN0IG90aTY4NThfcHJpdmF0ZSAqcHJpdjsKIAlpbnQgaTsKIAotCWRiZygiJXMoKSIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcygpIiwgX19mdW5jX18pOwogCiAJZm9yIChpID0gMDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKIAkJcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbaV0pOwpAQCAtODc4LDEzICs4NzEsMTMgQEAKIAogc3RhdGljIHZvaWQgb3RpNjg1OF9yZWFkX2ludF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gIHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3Qgb3RpNjg1OF9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWludCB0cmFuc2llbnQgPSAwLCBjYW5fcmVjdiA9IDAsIHJlc3VibWl0ID0gMTsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKIAlkYmcoIiVzKHBvcnQgPSAlZCwgc3RhdHVzID0gJWQpIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlciwgc3RhdHVzKTsKKwkJCQlfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCBzdGF0dXMpOwogCiAJc3dpdGNoIChzdGF0dXMpIHsKIAljYXNlIDA6CkBAIC04OTUsMTEgKzg4OCwxMSBAQAogCWNhc2UgLUVTSFVURE9XTjoKIAkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KIAkJZGJnKCIlcygpOiB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLAotCQkJCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQkJCV9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJZGJnKCIlcygpOiBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJCQlfX2Z1bmNfXywgc3RhdHVzKTsKIAkJYnJlYWs7CiAJfQogCkBAIC05MTYsNyArOTA5LDcgQEAKIAkJCQkJcHJpdi0+c2V0dXBfZG9uZSA9IDA7CiAJCQkJCXJlc3VibWl0ID0gMDsKIAkJCQkJZGJnKCIlcygpOiBzY2hlZHVsaW5nIHNldHVwX2xpbmUoKSIsCi0JCQkJCSAgICBfX0ZVTkNUSU9OX18pOworCQkJCQkgICAgX19mdW5jX18pOwogCQkJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnByaXYtPmRlbGF5ZWRfc2V0dXBfd29yaywgMCk7CiAJCQkJfQogCQkJfQpAQCAtOTMxLDcgKzkyNCw3IEBACiAJCQkJCXByaXYtPnNldHVwX2RvbmUgPSAwOwogCQkJCQlyZXN1Ym1pdCA9IDA7CiAJCQkJCWRiZygiJXMoKTogc2NoZWR1bGluZyBzZXR1cF9saW5lKCkiLAotCQkJCQkgICAgX19GVU5DVElPTl9fKTsKKwkJCQkJICAgIF9fZnVuY19fKTsKIAkJCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwcml2LT5kZWxheWVkX3NldHVwX3dvcmssIDApOwogCQkJCX0KIAkJCX0KQEAgLTk2MCw3ICs5NTMsNyBAQAogCQlpZiAocmVzdWx0ICE9IDApIHsKIAkJCXByaXYtPmZsYWdzLnJlYWRfdXJiX2luX3VzZSA9IDA7CiAJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcygpOiB1c2Jfc3VibWl0X3VyYigpIGZhaWxlZCwiCi0JCQkJCSIgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCQkJIiBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCX0gZWxzZSB7CiAJCQlyZXN1Ym1pdCA9IDA7CiAJCX0KQEAgLTk3OSwyMCArOTcyLDIwIEBACiAJaWYgKHJlc3VibWl0KSB7CiAJCWludCByZXN1bHQ7CiAKLS8vCQlkYmcoIiVzKCk6IHN1Ym1pdHRpbmcgaW50ZXJydXB0IHVyYiIsIF9fRlVOQ1RJT05fXyk7CisvLwkJZGJnKCIlcygpOiBzdWJtaXR0aW5nIGludGVycnVwdCB1cmIiLCBfX2Z1bmNfXyk7CiAJCXVyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChyZXN1bHQgIT0gMCkgewogCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwKIAkJCQkJIiVzKCk6IHVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkIHdpdGgiCi0JCQkJCSIgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCQkJIiBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCX0KIAl9CiB9CiAKIHN0YXRpYyB2b2lkIG90aTY4NThfcmVhZF9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAgdXJiLT5jb250ZXh0OwogCXN0cnVjdCBvdGk2ODU4X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CkBAIC0xMDAxLDcgKzk5NCw3IEBACiAJaW50IHJlc3VsdDsKIAogCWRiZygiJXMocG9ydCA9ICVkLCBzdGF0dXMgPSAlZCkiLAotCQkJCV9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBzdGF0dXMpOworCQkJCV9fZnVuY19fLCBwb3J0LT5udW1iZXIsIHN0YXR1cyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCXByaXYtPmZsYWdzLnJlYWRfdXJiX2luX3VzZSA9IDA7CkBAIC0xMDA5LDIwICsxMDAyLDIwIEBACiAKIAlpZiAoc3RhdHVzICE9IDApIHsKIAkJaWYgKCFwb3J0LT5vcGVuX2NvdW50KSB7Ci0JCQlkYmcoIiVzKCk6IHBvcnQgaXMgY2xvc2VkLCBleGl0aW5nIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMoKTogcG9ydCBpcyBjbG9zZWQsIGV4aXRpbmciLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm47CiAJCX0KIAkJLyoKIAkJaWYgKHN0YXR1cyA9PSAtRVBST1RPKSB7CiAJCQkvLyBQTDIzMDMgbXlzdGVyaW91c2x5IGZhaWxzIHdpdGggLUVQUk9UTyByZXNjaGVkdWxlIHRoZSByZWFkCi0JCQlkYmcoIiVzIC0gY2F1Z2h0IC1FUFJPVE8sIHJlc3VibWl0dGluZyB0aGUgdXJiIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBjYXVnaHQgLUVQUk9UTywgcmVzdWJtaXR0aW5nIHRoZSB1cmIiLCBfX2Z1bmNfXyk7CiAJCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCQkJaWYgKHJlc3VsdCkKLQkJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsICIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAkJCXJldHVybjsKIAkJfQogCQkqLwotCQlkYmcoIiVzKCk6IHVuYWJsZSB0byBoYW5kbGUgdGhlIGVycm9yLCBleGl0aW5nIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcygpOiB1bmFibGUgdG8gaGFuZGxlIHRoZSBlcnJvciwgZXhpdGluZyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTAzOCwyMCArMTAzMSwyMCBAQAogCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJlc3VsdCAhPSAwKSB7CiAJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcygpOiB1c2Jfc3VibWl0X3VyYigpIGZhaWxlZCwiCi0JCQkJCSIgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCQkJIiBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCX0KIAl9CiB9CiAKIHN0YXRpYyB2b2lkIG90aTY4NThfd3JpdGVfYnVsa19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gIHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3Qgb3RpNjg1OF9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAlpbnQgcmVzdWx0OwogCiAJZGJnKCIlcyhwb3J0ID0gJWQsIHN0YXR1cyA9ICVkKSIsCi0JCQkJX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIHN0YXR1cyk7CisJCQkJX19mdW5jX18sIHBvcnQtPm51bWJlciwgc3RhdHVzKTsKIAogCXN3aXRjaCAoc3RhdHVzKSB7CiAJY2FzZSAwOgpAQCAtMTA2MiwyMSArMTA1NSwyMSBAQAogCWNhc2UgLUVTSFVURE9XTjoKIAkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KIAkJZGJnKCIlcygpOiB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLAotCQkJCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQkJCV9fZnVuY19fLCBzdGF0dXMpOwogCQlwcml2LT5mbGFncy53cml0ZV91cmJfaW5fdXNlID0gMDsKIAkJcmV0dXJuOwogCWRlZmF1bHQ6CiAJCS8qIGVycm9yIGluIHRoZSB1cmIsIHNvIHdlIGhhdmUgdG8gcmVzdWJtaXQgaXQgKi8KIAkJZGJnKCIlcygpOiBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCQkJCV9fRlVOQ1RJT05fXywgc3RhdHVzKTsKLQkJZGJnKCIlcygpOiBvdmVyZmxvdyBpbiB3cml0ZSIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCV9fZnVuY19fLCBzdGF0dXMpOworCQlkYmcoIiVzKCk6IG92ZXJmbG93IGluIHdyaXRlIiwgX19mdW5jX18pOwogCiAJCXBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IDE7CiAJCXBvcnQtPndyaXRlX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPndyaXRlX3VyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChyZXN1bHQpIHsKIAkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzKCk6IHVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkLCIKLQkJCQkJIiBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJCQkiIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAkJfSBlbHNlIHsKIAkJCXJldHVybjsKIAkJfQpAQCAtMTA4NiwxMSArMTA3OSwxMSBAQAogCiAJLy8gc2NoZWR1bGUgdGhlIGludGVycnVwdCB1cmIgaWYgd2UgYXJlIHN0aWxsIG9wZW4gKi8KIAlwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKLQlkYmcoIiVzKCk6IHN1Ym1pdHRpbmcgaW50ZXJydXB0IHVyYiIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcygpOiBzdWJtaXR0aW5nIGludGVycnVwdCB1cmIiLCBfX2Z1bmNfXyk7CiAJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlc3VsdCAhPSAwKSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzKCk6IGZhaWxlZCBzdWJtaXR0aW5nIGludCB1cmIsIgotCQkJCQkiIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQkJCSIgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5jCmluZGV4IDJhZjc3ODUuLmM2MDVmYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmMKQEAgLTQxMCw3ICs0MTAsNyBAQAogCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAogCQkJCSBTRVRfQ09OVFJPTF9SRVFVRVNULCBTRVRfQ09OVFJPTF9SRVFVRVNUX1RZUEUsCiAJCQkJIHZhbHVlLCAwLCBOVUxMLCAwLCAxMDApOwotCWRiZygiJXMgLSB2YWx1ZSA9ICVkLCByZXR2YWwgPSAlZCIsIF9fRlVOQ1RJT05fXywgdmFsdWUsIHJldHZhbCk7CisJZGJnKCIlcyAtIHZhbHVlID0gJWQsIHJldHZhbCA9ICVkIiwgX19mdW5jX18sIHZhbHVlLCByZXR2YWwpOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTQyMCw3ICs0MjAsNyBAQAogCXN0cnVjdCBwbDIzMDNfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKQEAgLTQ0MSw3ICs0NDEsNyBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCi0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIGNvdW50LAorCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sIGNvdW50LAogCQkJICAgICAgcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXIpOwogCiAJcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gY291bnQ7CkBAIC00NDksNyArNDQ5LDcgQEAKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT53cml0ZV91cmIsIEdGUF9BVE9NSUMpOwogCWlmIChyZXN1bHQpIHsKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIgotCQkJIiBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJIiBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCXByaXYtPndyaXRlX3VyYl9pbl91c2UgPSAwOwogCQkvLyBUT0RPOiByZXNjaGVkdWxlIHBsMjMwM19zZW5kCiAJfQpAQCAtNDYzLDcgKzQ2Myw3IEBACiAJc3RydWN0IHBsMjMwM19wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCwgJWQgYnl0ZXMiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlciwgY291bnQpOworCWRiZygiJXMgLSBwb3J0ICVkLCAlZCBieXRlcyIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIGNvdW50KTsKIAogCWlmICghY291bnQpCiAJCXJldHVybiBjb3VudDsKQEAgLTQ4MywxMyArNDgzLDEzIEBACiAJaW50IHJvb20gPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAlyb29tID0gcGwyMzAzX2J1Zl9zcGFjZV9hdmFpbChwcml2LT5idWYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAotCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19GVU5DVElPTl9fLCByb29tKTsKKwlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fZnVuY19fLCByb29tKTsKIAlyZXR1cm4gcm9vbTsKIH0KIApAQCAtNDk5LDEzICs0OTksMTMgQEAKIAlpbnQgY2hhcnMgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAljaGFycyA9IHBsMjMwM19idWZfZGF0YV9hdmFpbChwcml2LT5idWYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAotCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19GVU5DVElPTl9fLCBjaGFycyk7CisJZGJnKCIlcyAtIHJldHVybnMgJWQiLCBfX2Z1bmNfXywgY2hhcnMpOwogCXJldHVybiBjaGFyczsKIH0KIApAQCAtNTIxLDcgKzUyMSw3IEBACiAJaW50IGk7CiAJdTggY29udHJvbDsKIAotCWRiZygiJXMgLSAgcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJaWYgKCFwcml2LT50ZXJtaW9zX2luaXRpYWxpemVkKSB7CkBAIC01NDUsNyArNTQ1LDkgQEAKIAogCWJ1ZiA9IGt6YWxsb2MoNywgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWYpIHsKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5LlxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5LlxuIiwgX19mdW5jX18pOworCQkvKiBSZXBvcnQgYmFjayBubyBjaGFuZ2Ugb2NjdXJyZWQgKi8KKwkJKnBvcnQtPnR0eS0+dGVybWlvcyA9ICpvbGRfdGVybWlvczsKIAkJcmV0dXJuOwogCX0KIApAQCAtNTYzLDExICs1NjUsMTEgQEAKIAkJCWRlZmF1bHQ6CiAJCQljYXNlIENTODoJYnVmWzZdID0gODsJYnJlYWs7CiAJCX0KLQkJZGJnKCIlcyAtIGRhdGEgYml0cyA9ICVkIiwgX19GVU5DVElPTl9fLCBidWZbNl0pOworCQlkYmcoIiVzIC0gZGF0YSBiaXRzID0gJWQiLCBfX2Z1bmNfXywgYnVmWzZdKTsKIAl9CiAKIAliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUocG9ydC0+dHR5KTs7Ci0JZGJnKCIlcyAtIGJhdWQgPSAlZCIsIF9fRlVOQ1RJT05fXywgYmF1ZCk7CisJZGJnKCIlcyAtIGJhdWQgPSAlZCIsIF9fZnVuY19fLCBiYXVkKTsKIAlpZiAoYmF1ZCkgewogCQlidWZbMF0gPSBiYXVkICYgMHhmZjsKIAkJYnVmWzFdID0gKGJhdWQgPj4gOCkgJiAweGZmOwpAQCAtNTgwLDEwICs1ODIsMTAgQEAKIAkvKiBGb3IgcmVmZXJlbmNlIGJ1Zls0XT0yIGlzIDIgc3RvcCBiaXRzICovCiAJaWYgKGNmbGFnICYgQ1NUT1BCKSB7CiAJCWJ1Zls0XSA9IDI7Ci0JCWRiZygiJXMgLSBzdG9wIGJpdHMgPSAyIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDIiLCBfX2Z1bmNfXyk7CiAJfSBlbHNlIHsKIAkJYnVmWzRdID0gMDsKLQkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDEiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gc3RvcCBiaXRzID0gMSIsIF9fZnVuY19fKTsKIAl9CiAKIAlpZiAoY2ZsYWcgJiBQQVJFTkIpIHsKQEAgLTU5NCwxNCArNTk2LDE0IEBACiAJCS8qIEZvciByZWZlcmVuY2UgYnVmWzVdPTQgaXMgc3BhY2UgcGFyaXR5ICovCiAJCWlmIChjZmxhZyAmIFBBUk9ERCkgewogCQkJYnVmWzVdID0gMTsKLQkJCWRiZygiJXMgLSBwYXJpdHkgPSBvZGQiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHBhcml0eSA9IG9kZCIsIF9fZnVuY19fKTsKIAkJfSBlbHNlIHsKIAkJCWJ1Zls1XSA9IDI7Ci0JCQlkYmcoIiVzIC0gcGFyaXR5ID0gZXZlbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gcGFyaXR5ID0gZXZlbiIsIF9fZnVuY19fKTsKIAkJfQogCX0gZWxzZSB7CiAJCWJ1Zls1XSA9IDA7Ci0JCWRiZygiJXMgLSBwYXJpdHkgPSBub25lIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHBhcml0eSA9IG5vbmUiLCBfX2Z1bmNfXyk7CiAJfQogCiAJaSA9IHVzYl9jb250cm9sX21zZyhzZXJpYWwtPmRldiwgdXNiX3NuZGN0cmxwaXBlKHNlcmlhbC0+ZGV2LCAwKSwKQEAgLTY1Nyw3ICs2NTksNyBAQAogCWxvbmcgdGltZW91dDsKIAl3YWl0X3F1ZXVlX3Qgd2FpdDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAkvKiB3YWl0IGZvciBkYXRhIHRvIGRyYWluIGZyb20gdGhlIGJ1ZmZlciAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC02OTUsNyArNjk3LDcgQEAKIAlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZW91dCk7CiAKIAkvKiBzaHV0ZG93biBvdXIgdXJicyAqLwotCWRiZygiJXMgLSBzaHV0dGluZyBkb3duIHVyYnMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSBzaHV0dGluZyBkb3duIHVyYnMiLCBfX2Z1bmNfXyk7CiAJdXNiX2tpbGxfdXJiKHBvcnQtPndyaXRlX3VyYik7CiAJdXNiX2tpbGxfdXJiKHBvcnQtPnJlYWRfdXJiKTsKIAl1c2Jfa2lsbF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYik7CkBAIC03MTksNyArNzIxLDcgQEAKIAlzdHJ1Y3QgcGwyMzAzX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJaW50IHJlc3VsdDsKIAotCWRiZygiJXMgLSAgcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmIChwcml2LT50eXBlICE9IEhYKSB7CiAJCXVzYl9jbGVhcl9oYWx0KHNlcmlhbC0+ZGV2LCBwb3J0LT53cml0ZV91cmItPnBpcGUpOwpAQCAtNzM3LDIyICs3MzksMjIgQEAKIAogCS8vRklYTUU6IG5lZWQgdG8gYXNzZXJ0IFJUUyBhbmQgRFRSIGlmIENSVFNDVFMgb2ZmCiAKLQlkYmcoIiVzIC0gc3VibWl0dGluZyByZWFkIHVyYiIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIHN1Ym1pdHRpbmcgcmVhZCB1cmIiLCBfX2Z1bmNfXyk7CiAJcG9ydC0+cmVhZF91cmItPmRldiA9IHNlcmlhbC0+ZGV2OwogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfS0VSTkVMKTsKIAlpZiAocmVzdWx0KSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIgotCQkJIiBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJIiBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCXBsMjMwM19jbG9zZShwb3J0LCBOVUxMKTsKIAkJcmV0dXJuIC1FUFJPVE87CiAJfQogCi0JZGJnKCIlcyAtIHN1Ym1pdHRpbmcgaW50ZXJydXB0IHVyYiIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIHN1Ym1pdHRpbmcgaW50ZXJydXB0IHVyYiIsIF9fZnVuY19fKTsKIAlwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfS0VSTkVMKTsKIAlpZiAocmVzdWx0KSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgaW50ZXJydXB0IHVyYiwiCi0JCQkiIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQkiIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAkJcGwyMzAzX2Nsb3NlKHBvcnQsIE5VTEwpOwogCQlyZXR1cm4gLUVQUk9UTzsKIAl9CkBAIC03OTIsNyArNzk0LDcgQEAKIAl1bnNpZ25lZCBpbnQgc3RhdHVzOwogCXVuc2lnbmVkIGludCByZXN1bHQ7CiAKLQlkYmcoIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAoJWQpIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoIXVzYl9nZXRfaW50ZmRhdGEocG9ydC0+c2VyaWFsLT5pbnRlcmZhY2UpKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTgwOSw3ICs4MTEsNyBAQAogCQkgIHwgKChzdGF0dXMgJiBVQVJUX1JJTkcpCT8gVElPQ01fUkkgIDogMCkKIAkJICB8ICgoc3RhdHVzICYgVUFSVF9EQ0QpCT8gVElPQ01fQ0QgIDogMCk7CiAKLQlkYmcoIiVzIC0gcmVzdWx0ID0gJXgiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJZGJnKCIlcyAtIHJlc3VsdCA9ICV4IiwgX19mdW5jX18sIHJlc3VsdCk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtODUzLDE1ICs4NTUsMTUgQEAKIHN0YXRpYyBpbnQgcGwyMzAzX2lvY3RsKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZGJnKCIlcyAoJWQpIGNtZCA9IDB4JTA0eCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjbWQpOworCWRiZygiJXMgKCVkKSBjbWQgPSAweCUwNHgiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCBjbWQpOwogCiAJc3dpdGNoIChjbWQpIHsKIAkJY2FzZSBUSU9DTUlXQUlUOgotCQkJZGJnKCIlcyAoJWQpIFRJT0NNSVdBSVQiLCBfX0ZVTkNUSU9OX18sICBwb3J0LT5udW1iZXIpOworCQkJZGJnKCIlcyAoJWQpIFRJT0NNSVdBSVQiLCBfX2Z1bmNfXywgIHBvcnQtPm51bWJlcik7CiAJCQlyZXR1cm4gd2FpdF9tb2RlbV9pbmZvKHBvcnQsIGFyZyk7CiAKIAkJZGVmYXVsdDoKLQkJCWRiZygiJXMgbm90IHN1cHBvcnRlZCA9IDB4JTA0eCIsIF9fRlVOQ1RJT05fXywgY21kKTsKKwkJCWRiZygiJXMgbm90IHN1cHBvcnRlZCA9IDB4JTA0eCIsIF9fZnVuY19fLCBjbWQpOwogCQkJYnJlYWs7CiAJfQogCkBAIC04NzQsMTkgKzg3NiwxOSBAQAogCXUxNiBzdGF0ZTsKIAlpbnQgcmVzdWx0OwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmIChicmVha19zdGF0ZSA9PSAwKQogCQlzdGF0ZSA9IEJSRUFLX09GRjsKIAllbHNlCiAJCXN0YXRlID0gQlJFQUtfT047Ci0JZGJnKCIlcyAtIHR1cm5pbmcgYnJlYWsgJXMiLCBfX0ZVTkNUSU9OX18sIHN0YXRlPT1CUkVBS19PRkYgPyAib2ZmIiA6ICJvbiIpOworCWRiZygiJXMgLSB0dXJuaW5nIGJyZWFrICVzIiwgX19mdW5jX18sIHN0YXRlPT1CUkVBS19PRkYgPyAib2ZmIiA6ICJvbiIpOwogCiAJcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnKHNlcmlhbC0+ZGV2LCB1c2Jfc25kY3RybHBpcGUoc2VyaWFsLT5kZXYsIDApLAogCQkJCSBCUkVBS19SRVFVRVNULCBCUkVBS19SRVFVRVNUX1RZUEUsIHN0YXRlLAogCQkJCSAwLCBOVUxMLCAwLCAxMDApOwogCWlmIChyZXN1bHQpCi0JCWRiZygiJXMgLSBlcnJvciBzZW5kaW5nIGJyZWFrID0gJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCWRiZygiJXMgLSBlcnJvciBzZW5kaW5nIGJyZWFrID0gJWQiLCBfX2Z1bmNfXywgcmVzdWx0KTsKIH0KIAogc3RhdGljIHZvaWQgcGwyMzAzX3NodXRkb3duKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCkBAIC04OTQsNyArODk2LDcgQEAKIAlpbnQgaTsKIAlzdHJ1Y3QgcGwyMzAzX3ByaXZhdGUgKnByaXY7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJZm9yIChpID0gMDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKIAkJcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbaV0pOwpAQCAtOTQzLDEzICs5NDUsMTMgQEAKIAogc3RhdGljIHZvaWQgcGwyMzAzX3JlYWRfaW50X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAgdXJiLT5jb250ZXh0OwogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAl1bnNpZ25lZCBpbnQgYWN0dWFsX2xlbmd0aCA9IHVyYi0+YWN0dWFsX2xlbmd0aDsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAJaW50IHJldHZhbDsKIAotCWRiZygiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzICglZCkiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXN3aXRjaCAoc3RhdHVzKSB7CiAJY2FzZSAwOgpAQCAtOTU5LDE2ICs5NjEsMTYgQEAKIAljYXNlIC1FTk9FTlQ6CiAJY2FzZSAtRVNIVVRET1dOOgogCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLwotCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwgX19GVU5DVElPTl9fLAorCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwgX19mdW5jX18sCiAJCSAgICBzdGF0dXMpOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKLQkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19mdW5jX18sCiAJCSAgICBzdGF0dXMpOwogCQlnb3RvIGV4aXQ7CiAJfQogCi0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sCisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywKIAkJCSAgICAgIHVyYi0+YWN0dWFsX2xlbmd0aCwgdXJiLT50cmFuc2Zlcl9idWZmZXIpOwogCiAJcGwyMzAzX3VwZGF0ZV9saW5lX3N0YXR1cyhwb3J0LCBkYXRhLCBhY3R1YWxfbGVuZ3RoKTsKQEAgLTk3OCwxMiArOTgwLDEyIEBACiAJaWYgKHJldHZhbCkKIAkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwKIAkJCSIlcyAtIHVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHJlc3VsdCAlZFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwkJCV9fZnVuY19fLCByZXR2YWwpOwogfQogCiBzdGF0aWMgdm9pZCBwbDIzMDNfcmVhZF9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAgdXJiLT5jb250ZXh0OwogCXN0cnVjdCBwbDIzMDNfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKQEAgLTk5NCwzMiArOTk2LDMyIEBACiAJdTggbGluZV9zdGF0dXM7CiAJY2hhciB0dHlfZmxhZzsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoc3RhdHVzKSB7Ci0JCWRiZygiJXMgLSB1cmIgc3RhdHVzID0gJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRiZygiJXMgLSB1cmIgc3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJaWYgKCFwb3J0LT5vcGVuX2NvdW50KSB7Ci0JCQlkYmcoIiVzIC0gcG9ydCBpcyBjbG9zZWQsIGV4aXRpbmcuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBwb3J0IGlzIGNsb3NlZCwgZXhpdGluZy4iLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm47CiAJCX0KIAkJaWYgKHN0YXR1cyA9PSAtRVBST1RPKSB7CiAJCQkvKiBQTDIzMDMgbXlzdGVyaW91c2x5IGZhaWxzIHdpdGggLUVQUk9UTyByZXNjaGVkdWxlCiAJCQkgKiB0aGUgcmVhZCAqLwogCQkJZGJnKCIlcyAtIGNhdWdodCAtRVBST1RPLCByZXN1Ym1pdHRpbmcgdGhlIHVyYiIsCi0JCQkgICAgX19GVU5DVElPTl9fKTsKKwkJCSAgICBfX2Z1bmNfXyk7CiAJCQl1cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwogCQkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAkJCWlmIChyZXN1bHQpCiAJCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwgIiVzIC0gZmFpbGVkIgogCQkJCQkiIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsCi0JCQkJCV9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCQkJX19mdW5jX18sIHJlc3VsdCk7CiAJCQlyZXR1cm47CiAJCX0KLQkJZGJnKCIlcyAtIHVuYWJsZSB0byBoYW5kbGUgdGhlIGVycm9yLCBleGl0aW5nLiIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSB1bmFibGUgdG8gaGFuZGxlIHRoZSBlcnJvciwgZXhpdGluZy4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLAogCQkJICAgICAgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKIAogCS8qIGdldCB0dHlfZmxhZyBmcm9tIHN0YXR1cyAqLwpAQCAtMTAzOSw3ICsxMDQxLDcgQEAKIAkJdHR5X2ZsYWcgPSBUVFlfUEFSSVRZOwogCWVsc2UgaWYgKGxpbmVfc3RhdHVzICYgVUFSVF9GUkFNRV9FUlJPUikKIAkJdHR5X2ZsYWcgPSBUVFlfRlJBTUU7Ci0JZGJnKCIlcyAtIHR0eV9mbGFnID0gJWQiLCBfX0ZVTkNUSU9OX18sIHR0eV9mbGFnKTsKKwlkYmcoIiVzIC0gdHR5X2ZsYWcgPSAlZCIsIF9fZnVuY19fLCB0dHlfZmxhZyk7CiAKIAl0dHkgPSBwb3J0LT50dHk7CiAJaWYgKHR0eSAmJiB1cmItPmFjdHVhbF9sZW5ndGgpIHsKQEAgLTEwNTgsNyArMTA2MCw3IEBACiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChyZXN1bHQpCiAJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIgotCQkJCSIgcmVhZCB1cmIsIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQkJIiByZWFkIHVyYiwgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCX0KIAogCXJldHVybjsKQEAgLTEwNjYsMTIgKzEwNjgsMTIgQEAKIAogc3RhdGljIHZvaWQgcGwyMzAzX3dyaXRlX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9ICB1cmItPmNvbnRleHQ7CiAJc3RydWN0IHBsMjMwM19wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWludCByZXN1bHQ7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXN3aXRjaCAoc3RhdHVzKSB7CiAJY2FzZSAwOgpAQCAtMTA4MSwyMSArMTA4MywyMSBAQAogCWNhc2UgLUVOT0VOVDoKIAljYXNlIC1FU0hVVERPV046CiAJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCi0JCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLCBfX2Z1bmNfXywKIAkJICAgIHN0YXR1cyk7CiAJCXByaXYtPndyaXRlX3VyYl9pbl91c2UgPSAwOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJLyogZXJyb3IgaW4gdGhlIHVyYiwgc28gd2UgaGF2ZSB0byByZXN1Ym1pdCBpdCAqLwotCQlkYmcoIiVzIC0gT3ZlcmZsb3cgaW4gd3JpdGUiLCBfX0ZVTkNUSU9OX18pOwotCQlkYmcoIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgLSBPdmVyZmxvdyBpbiB3cml0ZSIsIF9fZnVuY19fKTsKKwkJZGJnKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19mdW5jX18sCiAJCSAgICBzdGF0dXMpOwogCQlwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSAxOwogCQlwb3J0LT53cml0ZV91cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwogCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT53cml0ZV91cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAocmVzdWx0KQogCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwgIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyB3cml0ZSIKLQkJCQkiIHVyYiwgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCQkiIHVyYiwgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCQllbHNlCiAJCQlyZXR1cm47CiAJfQpAQCAtMTExNCw5ICsxMTE2LDYgQEAKIAl9LAogCS5pZF90YWJsZSA9CQlpZF90YWJsZSwKIAkudXNiX2RyaXZlciA9IAkJJnBsMjMwM19kcml2ZXIsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19pbiA9CQkxLAotCS5udW1fYnVsa19vdXQgPQkJMSwKIAkubnVtX3BvcnRzID0JCTEsCiAJLm9wZW4gPQkJCXBsMjMwM19vcGVuLAogCS5jbG9zZSA9CQlwbDIzMDNfY2xvc2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvc2FmZV9zZXJpYWwuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9zYWZlX3NlcmlhbC5jCmluZGV4IDRlNmRjYzE5Li45NGJkZGYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvc2FmZV9zZXJpYWwuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvc2FmZV9zZXJpYWwuYwpAQCAtMTk1LDE4ICsxOTUsMTcgQEAKIAogc3RhdGljIHZvaWQgc2FmZV9yZWFkX2J1bGtfY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAgdXJiLT5jb250ZXh0OwogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAl1bnNpZ25lZCBjaGFyIGxlbmd0aCA9IHVyYi0+YWN0dWFsX2xlbmd0aDsKLQlpbnQgaTsKIAlpbnQgcmVzdWx0OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIAogCWlmIChzdGF0dXMpIHsKIAkJZGJnKCIlcyAtIG5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIyNywyOCArMjI2LDIwIEBACiAJaWYgKHNhZmUpIHsKIAkJX191MTYgZmNzOwogCQlpZiAoIShmY3MgPSBmY3NfY29tcHV0ZTEwIChkYXRhLCBsZW5ndGgsIENSQzEwX0lOSVRGQ1MpKSkgewotCiAJCQlpbnQgYWN0dWFsX2xlbmd0aCA9IGRhdGFbbGVuZ3RoIC0gMl0gPj4gMjsKLQogCQkJaWYgKGFjdHVhbF9sZW5ndGggPD0gKGxlbmd0aCAtIDIpKSB7Ci0KLQkJCQlpbmZvICgiJXMgLSBhY3R1YWw6ICVkIiwgX19GVU5DVElPTl9fLCBhY3R1YWxfbGVuZ3RoKTsKLQotCQkJCWZvciAoaSA9IDA7IGkgPCBhY3R1YWxfbGVuZ3RoOyBpKyspIHsKLQkJCQkJdHR5X2luc2VydF9mbGlwX2NoYXIgKHBvcnQtPnR0eSwgZGF0YVtpXSwgMCk7Ci0JCQkJfQorCQkJCWluZm8gKCIlcyAtIGFjdHVhbDogJWQiLCBfX2Z1bmNfXywgYWN0dWFsX2xlbmd0aCk7CisJCQkJdHR5X2luc2VydF9mbGlwX3N0cmluZyhwb3J0LT50dHksIGRhdGEsIGFjdHVhbF9sZW5ndGgpOwogCQkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoIChwb3J0LT50dHkpOwogCQkJfSBlbHNlIHsKLQkJCQllcnIgKCIlcyAtIGluY29uc2lzdGVudCBsZW5ndGhzICVkOiVkIiwgX19GVU5DVElPTl9fLAorCQkJCWVyciAoIiVzIC0gaW5jb25zaXN0ZW50IGxlbmd0aHMgJWQ6JWQiLCBfX2Z1bmNfXywKIAkJCQkgICAgIGFjdHVhbF9sZW5ndGgsIGxlbmd0aCk7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQllcnIgKCIlcyAtIGJhZCBDUkMgJXgiLCBfX0ZVTkNUSU9OX18sIGZjcyk7CisJCQllcnIgKCIlcyAtIGJhZCBDUkMgJXgiLCBfX2Z1bmNfXywgZmNzKTsKIAkJfQogCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJdHR5X2luc2VydF9mbGlwX2NoYXIgKHBvcnQtPnR0eSwgZGF0YVtpXSwgMCk7Ci0JCX0KKwkJdHR5X2luc2VydF9mbGlwX3N0cmluZyhwb3J0LT50dHksIGRhdGEsIGxlbmd0aCk7CiAJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoIChwb3J0LT50dHkpOwogCX0KIApAQCAtMjU5LDcgKzI1MCw4IEBACiAJCSAgICAgICBzYWZlX3JlYWRfYnVsa19jYWxsYmFjaywgcG9ydCk7CiAKIAlpZiAoKHJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9BVE9NSUMpKSkgewotCQllcnIgKCIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQllcnIgKCIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkIiwgX19mdW5jX18sIHJlc3VsdCk7CisJCS8qIEZJWE1FOiBOZWVkIGEgbWVjaGFuaXNtIHRvIHJldHJ5IGxhdGVyIGlmIHRoaXMgaGFwcGVucyAqLwogCX0KIH0KIApAQCAtMjc0LDI1ICsyNjYsMjUgQEAKIAkgICAgIGNvdW50KTsKIAogCWlmICghcG9ydC0+d3JpdGVfdXJiKSB7Ci0JCWRiZyAoIiVzIC0gd3JpdGUgdXJiIE5VTEwiLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gKDApOworCQlkYmcgKCIlcyAtIHdyaXRlIHVyYiBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKIAl9CiAKIAlkYmcgKCJzYWZlX3dyaXRlIHdyaXRlX3VyYjogJWQgdHJhbnNmZXJfYnVmZmVyX2xlbmd0aCIsCiAJICAgICBwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOwogCiAJaWYgKCFwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpIHsKLQkJZGJnICgiJXMgLSB3cml0ZSB1cmIgdHJhbnNmZXJfYnVmZmVyX2xlbmd0aCB6ZXJvIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuICgwKTsKKwkJZGJnICgiJXMgLSB3cml0ZSB1cmIgdHJhbnNmZXJfYnVmZmVyX2xlbmd0aCB6ZXJvIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKIAl9CiAJaWYgKGNvdW50ID09IDApIHsKLQkJZGJnICgiJXMgLSB3cml0ZSByZXF1ZXN0IG9mIDAgYnl0ZXMiLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gKDApOworCQlkYmcgKCIlcyAtIHdyaXRlIHJlcXVlc3Qgb2YgMCBieXRlcyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CiAJfQogCXNwaW5fbG9ja19iaCgmcG9ydC0+bG9jayk7CiAJaWYgKHBvcnQtPndyaXRlX3VyYl9idXN5KSB7CiAJCXNwaW5fdW5sb2NrX2JoKCZwb3J0LT5sb2NrKTsKLQkJZGJnKCIlcyAtIGFscmVhZHkgd3JpdGluZyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBhbHJlYWR5IHdyaXRpbmciLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KIAlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDE7CkBAIC0zMzIsNyArMzI0LDcgQEAKIAkJcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gY291bnQ7CiAJfQogCi0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIGNvdW50LCBwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgY291bnQsIHBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyKTsKICNpZmRlZiBFQ0hPX1RYCiAJewogCQlpbnQgaTsKQEAgLTM0OSwyOCArMzQxLDMxIEBACiAJcG9ydC0+d3JpdGVfdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAlpZiAoKHJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiIChwb3J0LT53cml0ZV91cmIsIEdGUF9LRVJORUwpKSkgewogCQlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7Ci0JCWVyciAoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJZXJyICgiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCXJldHVybiAwOwogCX0KLQlkYmcgKCIlcyB1cmI6ICVwIHN1Ym1pdHRlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+d3JpdGVfdXJiKTsKKwlkYmcgKCIlcyB1cmI6ICVwIHN1Ym1pdHRlZCIsIF9fZnVuY19fLCBwb3J0LT53cml0ZV91cmIpOwogCiAJcmV0dXJuIChjb3VudCk7CiB9CiAKIHN0YXRpYyBpbnQgc2FmZV93cml0ZV9yb29tIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewotCWludCByb29tID0gMDsJCS8vIERlZmF1bHQ6IG5vIHJvb20KKwlpbnQgcm9vbSA9IDA7CQkvKiBEZWZhdWx0OiBubyByb29tICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiAJaWYgKHBvcnQtPndyaXRlX3VyYl9idXN5KQogCQlyb29tID0gcG9ydC0+YnVsa19vdXRfc2l6ZSAtIChzYWZlID8gMiA6IDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIAogCWlmIChyb29tKSB7CiAJCWRiZyAoInNhZmVfd3JpdGVfcm9vbSByZXR1cm5zICVkIiwgcm9vbSk7CiAJfQogCi0JcmV0dXJuIChyb29tKTsKKwlyZXR1cm4gcm9vbTsKIH0KIAogc3RhdGljIGludCBzYWZlX3N0YXJ0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCkBAIC0zOTQsOSArMzg5LDYgQEAKIAl9LAogCS5pZF90YWJsZSA9CQlpZF90YWJsZSwKIAkudXNiX2RyaXZlciA9CQkmc2FmZV9kcml2ZXIsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19pbiA9CQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19vdXQgPQkJTlVNX0RPTlRfQ0FSRSwKIAkubnVtX3BvcnRzID0JCTEsCiAJLndyaXRlID0JCXNhZmVfd3JpdGUsCiAJLndyaXRlX3Jvb20gPQkJc2FmZV93cml0ZV9yb29tLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3NpZXJyYS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3NpZXJyYS5jCmluZGV4IGVkNjc4ODEuLjI5MDc0YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9zaWVycmEuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvc2llcnJhLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICBVU0IgRHJpdmVyIGZvciBTaWVycmEgV2lyZWxlc3MKIAotICBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggIEtldmluIExsb3lkIDxsaW51eEBzaWVycmF3aXJlbGVzcy5jb20+CisgIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCAgS2V2aW4gTGxveWQgPGtsbG95ZEBzaWVycmF3aXJlbGVzcy5jb20+CiAKICAgSU1QT1JUQU5UIERJU0NMQUlNRVI6IFRoaXMgZHJpdmVyIGlzIG5vdCBjb21tZXJjaWFsbHkgc3VwcG9ydGVkIGJ5CiAgIFNpZXJyYSBXaXJlbGVzcy4gVXNlIGF0IHlvdXIgb3duIHJpc2suCkBAIC0xNCw4ICsxNCw4IEBACiAgIFdob20gYmFzZWQgaGlzIG9uIHRoZSBLZXlzcGFuIGRyaXZlciBieSBIdWdoIEJsZW1pbmdzIDxodWdoQGJsZW1pbmdzLm9yZz4KICovCiAKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYuMS4yLjgiCi0jZGVmaW5lIERSSVZFUl9BVVRIT1IgIktldmluIExsb3lkIDxsaW51eEBzaWVycmF3aXJlbGVzcy5jb20+IgorI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidi4xLjIuOWMiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgIktldmluIExsb3lkIDxrbGxveWRAc2llcnJhd2lyZWxlc3MuY29tPiIKICNkZWZpbmUgRFJJVkVSX0RFU0MgIlVTQiBEcml2ZXIgZm9yIFNpZXJyYSBXaXJlbGVzcyBVU0IgbW9kZW1zIgogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0zMSw3ICszMSw2IEBACiAjZGVmaW5lIFNXSU1TX1VTQl9SRVFVRVNUX1NldFBvd2VyCTB4MDAKICNkZWZpbmUgU1dJTVNfVVNCX1JFUVVFU1RfU2V0Tm1lYQkweDA3CiAjZGVmaW5lIFNXSU1TX1VTQl9SRVFVRVNUX1NldE1vZGUJMHgwQgotI2RlZmluZSBTV0lNU19VU0JfUkVRVUVTVF9UWVBFX1ZTQ19TRVQJMHg0MAogI2RlZmluZSBTV0lNU19TRVRfTU9ERV9Nb2RlbQkJMHgwMDAxCiAKIC8qIHBlciBwb3J0IHByaXZhdGUgZGF0YSAqLwpAQCAtNTUsNyArNTQsNyBAQAogCWRldl9kYmcoJnVkZXYtPmRldiwgIiVzIiwgIlNFVCBQT1dFUiBTVEFURVxuIik7CiAJcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKIAkJCVNXSU1TX1VTQl9SRVFVRVNUX1NldFBvd2VyLAkvKiBfX3U4IHJlcXVlc3QgICAgICAqLwotCQkJU1dJTVNfVVNCX1JFUVVFU1RfVFlQRV9WU0NfU0VULAkvKiBfX3U4IHJlcXVlc3QgdHlwZSAqLworCQkJVVNCX1RZUEVfVkVORE9SLAkJLyogX191OCByZXF1ZXN0IHR5cGUgKi8KIAkJCXN3aVN0YXRlLAkJCS8qIF9fdTE2IHZhbHVlICAgICAgICovCiAJCQkwLAkJCQkvKiBfX3UxNiBpbmRleCAgICAgICAqLwogCQkJTlVMTCwJCQkJLyogdm9pZCAqZGF0YSAgICAgICAgKi8KQEAgLTcwLDcgKzY5LDcgQEAKIAlkZXZfZGJnKCZ1ZGV2LT5kZXYsICIlcyIsICJERVZJQ0UgTU9ERSBTV0lUQ0hcbiIpOwogCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCiAJCQlTV0lNU19VU0JfUkVRVUVTVF9TZXRNb2RlLAkvKiBfX3U4IHJlcXVlc3QgICAgICAqLwotCQkJU1dJTVNfVVNCX1JFUVVFU1RfVFlQRV9WU0NfU0VULAkvKiBfX3U4IHJlcXVlc3QgdHlwZSAqLworCQkJVVNCX1RZUEVfVkVORE9SLAkJLyogX191OCByZXF1ZXN0IHR5cGUgKi8KIAkJCWVTV29jTW9kZSwJCQkvKiBfX3UxNiB2YWx1ZSAgICAgICAqLwogCQkJMHgwMDAwLAkJCQkvKiBfX3UxNiBpbmRleCAgICAgICAqLwogCQkJTlVMTCwJCQkJLyogdm9pZCAqZGF0YSAgICAgICAgKi8KQEAgLTg1LDcgKzg0LDcgQEAKIAlkZXZfZGJnKCZ1ZGV2LT5kZXYsICIlcyIsICJOTUVBIEVuYWJsZSBzZW50XG4iKTsKIAlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAogCQkJU1dJTVNfVVNCX1JFUVVFU1RfU2V0Tm1lYSwJLyogX191OCByZXF1ZXN0ICAgICAgKi8KLQkJCVNXSU1TX1VTQl9SRVFVRVNUX1RZUEVfVlNDX1NFVCwJLyogX191OCByZXF1ZXN0IHR5cGUgKi8KKwkJCVVTQl9UWVBFX1ZFTkRPUiwJCS8qIF9fdTggcmVxdWVzdCB0eXBlICovCiAJCQllbmFibGUsCQkJCS8qIF9fdTE2IHZhbHVlICAgICAgICovCiAJCQkweDAwMDAsCQkJCS8qIF9fdTE2IGluZGV4ICAgICAgICovCiAJCQlOVUxMLAkJCQkvKiB2b2lkICpkYXRhICAgICAgICAqLwpAQCAtMTA5LDYgKzEwOCwyNiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXRpYyBpbnQgc2llcnJhX2NhbGNfaW50ZXJmYWNlKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCit7CisJCWludCBpbnRlcmZhY2U7CisJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICpwX2ludGVyZmFjZTsKKwkJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqcF9ob3N0X2ludGVyZmFjZTsKKworCQkvKiBHZXQgdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgcG9pbnRlciBmcm9tIHRoZSBzZXJpYWwgc3RydWN0ICovCisJCXBfaW50ZXJmYWNlID0gc2VyaWFsLT5pbnRlcmZhY2U7CisKKwkJLyogR2V0IGEgcG9pbnRlciB0byB0aGUgaG9zdCBpbnRlcmZhY2Ugc3RydWN0dXJlICovCisJCXBfaG9zdF9pbnRlcmZhY2UgPSBwX2ludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmc7CisKKwkJLyogcmVhZCB0aGUgaW50ZXJmYWNlIGRlc2NyaXB0b3IgZm9yIHRoaXMgYWN0aXZlIGFsdHNldHRpbmcKKwkJICogdG8gZmluZCBvdXQgdGhlIGludGVyZmFjZSBudW1iZXIgd2UgYXJlIG9uCisJCSovCisJCWludGVyZmFjZSA9IHBfaG9zdF9pbnRlcmZhY2UtPmRlc2MuYkludGVyZmFjZU51bWJlcjsKKworCQlyZXR1cm4gaW50ZXJmYWNlOworfQorCiBzdGF0aWMgaW50IHNpZXJyYV9wcm9iZShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsLAogCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewpAQCAtMTI0LDYgKzE0MywyMiBAQAogCWlmbnVtID0gc2VyaWFsLT5pbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CiAJdWRldiA9IHNlcmlhbC0+ZGV2OwogCisJCS8qIEZpZ3VyZSBvdXQgdGhlIGludGVyZmFjZSBudW1iZXIgZnJvbSB0aGUgc2VyaWFsIHN0cnVjdHVyZSAqLworCQlpZm51bSA9IHNpZXJyYV9jYWxjX2ludGVyZmFjZShzZXJpYWwpOworCisJCS8qCisJCSAqIElmIHRoaXMgaW50ZXJmYWNlIHN1cHBvcnRzIG1vcmUgdGhhbiAxIGFsdGVybmF0ZQorCQkgKiBzZWxlY3QgdGhlIDJuZCBvbmUKKwkJICovCisJCWlmIChzZXJpYWwtPmludGVyZmFjZS0+bnVtX2FsdHNldHRpbmcgPT0gMikgeworCQkJZGV2X2RiZygmdWRldi0+ZGV2LAorCQkJCSJTZWxlY3RpbmcgYWx0IHNldHRpbmcgZm9yIGludGVyZmFjZSAlZFxuIiwKKwkJCQlpZm51bSk7CisKKwkJCS8qIFdlIGtub3cgdGhlIGFsdGVybmF0ZSBzZXR0aW5nIGlzIDEgZm9yIHRoZSBNQzg3ODUgKi8KKwkJCXVzYl9zZXRfaW50ZXJmYWNlKHVkZXYsIGlmbnVtLCAxKTsKKwkJfQorCiAJLyogQ2hlY2sgaWYgaW4gaW5zdGFsbGVyIG1vZGUgKi8KIAlpZiAodHJ1aW5zdGFsbCAmJiBpZC0+ZHJpdmVyX2luZm8gPT0gREVWSUNFX0lOU1RBTExFUikgewogCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICIlcyIsICJGT1VORCBUUlUtSU5TVEFMTCBERVZJQ0UoU1cpXG4iKTsKQEAgLTE1Niw3ICsxOTEsNyBAQAogCXsgVVNCX0RFVklDRSgweDExOTksIDB4MDAxOSkgfSwJLyogU2llcnJhIFdpcmVsZXNzIEFpckNhcmQgNTk1ICovCiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHgwMDIxKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgQWlyQ2FyZCA1OTdFICovCiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHgwMTIwKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgVVNCIERvbmdsZSA1OTVVICovCi0JeyBVU0JfREVWSUNFKDB4MTE5OSwgMHgwMDIzKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgQWlyQ2FyZCAqLworCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oMHgxMTk5LCAweDAwMjMsIDB4RkYsIDB4RkYsIDB4RkYpIH0sIC8qIFNpZXJyYSBXaXJlbGVzcyBDNTk3ICovCiAKIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDY4MDIpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBNQzg3NTUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDY4MDQpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBNQzg3NTUgKi8KQEAgLTE2NCwxNSArMTk5LDIwIEBACiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODEyKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgTUM4Nzc1ICYgQUMgODc1VSAqLwogCXsgVVNCX0RFVklDRSgweDExOTksIDB4NjgxMykgfSwJLyogU2llcnJhIFdpcmVsZXNzIE1DODc3NSAoVGhpbmtwYWQgaW50ZXJuYWwpICovCiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODE1KSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgTUM4Nzc1ICovCisJeyBVU0JfREVWSUNFKDB4MDNmMCwgMHgxZTFkKSB9LAkvKiBIUCBoczIzMDAgYS5rLmEgTUM4Nzc1ICovCiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODIwKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgQWlyQ2FyZCA4NzUgKi8KKwl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDY4MjEpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBBaXJDYXJkIDg3NVUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDY4MzIpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBNQzg3ODAqLwogCXsgVVNCX0RFVklDRSgweDExOTksIDB4NjgzMykgfSwJLyogU2llcnJhIFdpcmVsZXNzIE1DODc4MSovCisJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODNCKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFXzFfUE9SVCB9LAkvKiBTaWVycmEgV2lyZWxlc3MgTUM4Nzg1IENvbXBvc2l0ZSovCiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODUwKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgQWlyQ2FyZCA4ODAgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDY4NTEpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBBaXJDYXJkIDg4MSAqLwogCXsgVVNCX0RFVklDRSgweDExOTksIDB4Njg1MikgfSwJLyogU2llcnJhIFdpcmVsZXNzIEFpckNhcmQgODgwIEUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDY4NTMpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBBaXJDYXJkIDg4MSBFICovCiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODU1KSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgQWlyQ2FyZCA4ODAgVSAqLwogCXsgVVNCX0RFVklDRSgweDExOTksIDB4Njg1NikgfSwJLyogU2llcnJhIFdpcmVsZXNzIEFpckNhcmQgODgxIFUgKi8KKwl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDY4NTkpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfMV9QT1JUIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBBaXJDYXJkIDg4NSBFICovCisJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODVBKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFXzFfUE9SVCB9LAkvKiBTaWVycmEgV2lyZWxlc3MgQWlyQ2FyZCA4ODUgRSAqLwogCiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2NDY4KSB9LCAvKiBTaWVycmEgV2lyZWxlc3MgTVAzRyAtIEVWRE8gKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDY0NjkpIH0sIC8qIFNpZXJyYSBXaXJlbGVzcyBNUDNHIC0gVU1UUy9IU1BBICovCkBAIC0yMTYsNyArMjU2LDcgQEAKIAlzdHJ1Y3Qgc2llcnJhX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CiAJX191MTYgaW50ZXJmYWNlID0gMDsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIApAQCAtMjQ2LDI0ICsyODYsMjQgQEAKIAogc3RhdGljIHZvaWQgc2llcnJhX3J4X3Rocm90dGxlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7Ci0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIH0KIAogc3RhdGljIHZvaWQgc2llcnJhX3J4X3VudGhyb3R0bGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogfQogCiBzdGF0aWMgdm9pZCBzaWVycmFfYnJlYWtfY3RsKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGludCBicmVha19zdGF0ZSkKIHsKIAkvKiBVbmZvcnR1bmF0ZWx5LCBJIGRvbid0IGtub3cgaG93IHRvIHNlbmQgYSBicmVhayAqLwotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiB9CiAKIHN0YXRpYyB2b2lkIHNpZXJyYV9zZXRfdGVybWlvcyhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAogCQkJc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCXR0eV90ZXJtaW9zX2NvcHlfaHcocG9ydC0+dHR5LT50ZXJtaW9zLCBvbGRfdGVybWlvcyk7CiAJc2llcnJhX3NlbmRfc2V0dXAocG9ydCk7CiB9CkBAIC0zMTcsMTQgKzM1NywxNCBAQAogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCS8qIGZyZWUgdXAgdGhlIHRyYW5zZmVyIGJ1ZmZlciwgYXMgdXNiX2ZyZWVfdXJiKCkgZG9lcyBub3QgZG8gdGhpcyAqLwogCWtmcmVlKHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIAogCWlmIChzdGF0dXMpCiAJCWRiZygiJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0ZGF0YS0+bG9jaywgZmxhZ3MpOwogCS0tcG9ydGRhdGEtPm91dHN0YW5kaW5nX3VyYnM7CkBAIC0zNDYsMTIgKzM4NiwxMiBAQAogCiAJcG9ydGRhdGEgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKLQlkYmcoIiVzOiB3cml0ZSAoJWQgY2hhcnMpIiwgX19GVU5DVElPTl9fLCBjb3VudCk7CisJZGJnKCIlczogd3JpdGUgKCVkIGNoYXJzKSIsIF9fZnVuY19fLCBjb3VudCk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydGRhdGEtPmxvY2ssIGZsYWdzKTsKIAlpZiAocG9ydGRhdGEtPm91dHN0YW5kaW5nX3VyYnMgPiBOX09VVF9VUkIpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydGRhdGEtPmxvY2ssIGZsYWdzKTsKLQkJZGJnKCIlcyAtIHdyaXRlIGxpbWl0IGhpdFxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHdyaXRlIGxpbWl0IGhpdFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gMDsKIAl9CiAJcG9ydGRhdGEtPm91dHN0YW5kaW5nX3VyYnMrKzsKQEAgLTM3Myw3ICs0MTMsNyBAQAogCiAJbWVtY3B5KGJ1ZmZlciwgYnVmLCBjb3VudCk7CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgY291bnQsIGJ1ZmZlcik7CisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgY291bnQsIGJ1ZmZlcik7CiAKIAl1c2JfZmlsbF9idWxrX3VyYih1cmIsIHNlcmlhbC0+ZGV2LAogCQkJICB1c2Jfc25kYnVsa3BpcGUoc2VyaWFsLT5kZXYsCkBAIC0zODQsNyArNDI0LDcgQEAKIAlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChzdGF0dXMpIHsKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSB1c2Jfc3VibWl0X3VyYih3cml0ZSBidWxrKSBmYWlsZWQgIgotCQkJIndpdGggc3RhdHVzID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCSJ3aXRoIHN0YXR1cyA9ICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJY291bnQgPSBzdGF0dXM7CiAJCWdvdG8gZXJyb3I7CiAJfQpAQCAtNDE0LDE0ICs0NTQsMTQgQEAKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlczogJXAiLCBfX0ZVTkNUSU9OX18sIHVyYik7CisJZGJnKCIlczogJXAiLCBfX2Z1bmNfXywgdXJiKTsKIAogCWVuZHBvaW50ID0gdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpOwotCXBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKSB1cmItPmNvbnRleHQ7CisJcG9ydCA9ICB1cmItPmNvbnRleHQ7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCWRiZygiJXM6IG5vbnplcm8gc3RhdHVzOiAlZCBvbiBlbmRwb2ludCAlMDJ4LiIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cywgZW5kcG9pbnQpOworCQkgICAgX19mdW5jX18sIHN0YXR1cywgZW5kcG9pbnQpOwogCX0gZWxzZSB7CiAJCXR0eSA9IHBvcnQtPnR0eTsKIAkJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCkgewpAQCAtNDI5LDcgKzQ2OSw3IEBACiAJCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHR0eSwgZGF0YSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiAJCX0gZWxzZSB7Ci0JCQlkYmcoIiVzOiBlbXB0eSByZWFkIHVyYiByZWNlaXZlZCIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzOiBlbXB0eSByZWFkIHVyYiByZWNlaXZlZCIsIF9fZnVuY19fKTsKIAkJfQogCiAJCS8qIFJlc3VibWl0IHVyYiBzbyB3ZSBjb250aW51ZSByZWNlaXZpbmcgKi8KQEAgLTQ0NywxOSArNDg3LDE5IEBACiB7CiAJaW50IGVycjsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gIHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3Qgc2llcnJhX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGEgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOwotCWRiZygiJXM6IHVyYiAlcCBwb3J0ICVwIGhhcyBkYXRhICVwIiwgX19GVU5DVElPTl9fLHVyYixwb3J0LHBvcnRkYXRhKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOworCWRiZygiJXM6IHVyYiAlcCBwb3J0ICVwIGhhcyBkYXRhICVwIiwgX19mdW5jX18sIHVyYiwgcG9ydCwgcG9ydGRhdGEpOwogCiAJaWYgKHN0YXR1cyA9PSAwKSB7CiAJCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKnJlcV9wa3QgPQogCQkJCShzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICopdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAKIAkJaWYgKCFyZXFfcGt0KSB7Ci0JCQlkYmcoIiVzOiBOVUxMIHJlcV9wa3RcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzOiBOVUxMIHJlcV9wa3RcbiIsIF9fZnVuY19fKTsKIAkJCXJldHVybjsKIAkJfQogCQlpZiAoKHJlcV9wa3QtPmJSZXF1ZXN0VHlwZSA9PSAweEExKSAmJgpAQCAtNDY5LDcgKzUwOSw3IEBACiAJCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyICsKIAkJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QpKTsKIAotCQkJZGJnKCIlczogc2lnbmFsIHgleCIsIF9fRlVOQ1RJT05fXywgc2lnbmFscyk7CisJCQlkYmcoIiVzOiBzaWduYWwgeCV4IiwgX19mdW5jX18sIHNpZ25hbHMpOwogCiAJCQlvbGRfZGNkX3N0YXRlID0gcG9ydGRhdGEtPmRjZF9zdGF0ZTsKIAkJCXBvcnRkYXRhLT5jdHNfc3RhdGUgPSAxOwpAQCAtNDgxLDExICs1MjEsMTEgQEAKIAkJCQkJb2xkX2RjZF9zdGF0ZSAmJiAhcG9ydGRhdGEtPmRjZF9zdGF0ZSkKIAkJCQl0dHlfaGFuZ3VwKHBvcnQtPnR0eSk7CiAJCX0gZWxzZSB7Ci0JCQlkYmcoIiVzOiB0eXBlICV4IHJlcSAleCIsIF9fRlVOQ1RJT05fXywKLQkJCQlyZXFfcGt0LT5iUmVxdWVzdFR5cGUscmVxX3BrdC0+YlJlcXVlc3QpOworCQkJZGJnKCIlczogdHlwZSAleCByZXEgJXgiLCBfX2Z1bmNfXywKKwkJCQlyZXFfcGt0LT5iUmVxdWVzdFR5cGUsIHJlcV9wa3QtPmJSZXF1ZXN0KTsKIAkJfQogCX0gZWxzZQotCQlkYmcoIiVzOiBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGJnKCIlczogZXJyb3IgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAogCS8qIFJlc3VibWl0IHVyYiBzbyB3ZSBjb250aW51ZSByZWNlaXZpbmcgSVJRIGRhdGEgKi8KIAlpZiAoc3RhdHVzICE9IC1FU0hVVERPV04pIHsKQEAgLTQ5Myw3ICs1MzMsNyBAQAogCQllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAoZXJyKQogCQkJZGJnKCIlczogcmVzdWJtaXQgaW50ciB1cmIgZmFpbGVkLiAoJWQpIiwKLQkJCQlfX0ZVTkNUSU9OX18sIGVycik7CisJCQkJX19mdW5jX18sIGVycik7CiAJfQogfQogCkBAIC01MDIsMTQgKzU0MiwxNCBAQAogCXN0cnVjdCBzaWVycmFfcG9ydF9wcml2YXRlICpwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCS8qIHRyeSB0byBnaXZlIGEgZ29vZCBudW1iZXIgYmFjayBiYXNlZCBvbiBpZiB3ZSBoYXZlIGFueSBmcmVlIHVyYnMgYXQKIAkgKiB0aGlzIHBvaW50IGluIHRpbWUgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydGRhdGEtPmxvY2ssIGZsYWdzKTsKIAlpZiAocG9ydGRhdGEtPm91dHN0YW5kaW5nX3VyYnMgPiBOX09VVF9VUkIgKiAyIC8gMykgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0ZGF0YS0+bG9jaywgZmxhZ3MpOwotCQlkYmcoIiVzIC0gd3JpdGUgbGltaXQgaGl0XG4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gd3JpdGUgbGltaXQgaGl0XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0ZGF0YS0+bG9jaywgZmxhZ3MpOwpAQCAtNTE5LDEzICs1NTksMTUgQEAKIAogc3RhdGljIGludCBzaWVycmFfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7Ci0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCS8qCiAJICogV2UgY2FuJ3QgcmVhbGx5IGFjY291bnQgZm9yIGhvdyBtdWNoIGRhdGEgd2UKIAkgKiBoYXZlIHNlbnQgb3V0LCBidXQgaGFzbid0IG1hZGUgaXQgdGhyb3VnaCB0byB0aGUKIAkgKiBkZXZpY2UgYXMgd2UgY2FuJ3Qgc2VlIHRoZSBiYWNrZW5kIGhlcmUsIHNvIGp1c3QKIAkgKiB0ZWxsIHRoZSB0dHkgbGF5ZXIgdGhhdCBldmVyeXRoaW5nIGlzIGZsdXNoZWQuCisJICoKKwkgKiBGSVhNRTogc2hvdWxkIHdhbGsgdGhlIG91dHN0YW5kaW5nIHVyYnMgaW5mbwogCSAqLwogCXJldHVybiAwOwogfQpAQCAtNTQwLDcgKzU4Miw3IEBACiAKIAlwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAkvKiBTZXQgc29tZSBzYW5lIGRlZmF1bHRzICovCiAJcG9ydGRhdGEtPnJ0c19zdGF0ZSA9IDE7CkBAIC01NTIsNyArNTk0LDcgQEAKIAkJaWYgKCF1cmIpCiAJCQljb250aW51ZTsKIAkJaWYgKHVyYi0+ZGV2ICE9IHNlcmlhbC0+ZGV2KSB7Ci0JCQlkYmcoIiVzOiBkZXYgJXAgIT0gJXAiLCBfX0ZVTkNUSU9OX18sCisJCQlkYmcoIiVzOiBkZXYgJXAgIT0gJXAiLCBfX2Z1bmNfXywKIAkJCQl1cmItPmRldiwgc2VyaWFsLT5kZXYpOwogCQkJY29udGludWU7CiAJCX0KQEAgLTU5MCw3ICs2MzIsNyBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAJc3RydWN0IHNpZXJyYV9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAlwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAogCXBvcnRkYXRhLT5ydHNfc3RhdGUgPSAwOwpAQCAtNjIwLDcgKzY2Miw3IEBACiAJaW50IGk7CiAJaW50IGo7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJLyogU2V0IERldmljZSBtb2RlIHRvIEQwICovCiAJc2llcnJhX3NldF9wb3dlcl9zdGF0ZShzZXJpYWwtPmRldiwgMHgwMDAwKTsKQEAgLTYzNSw3ICs2NzcsNyBAQAogCQlwb3J0ZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpwb3J0ZGF0YSksIEdGUF9LRVJORUwpOwogCQlpZiAoIXBvcnRkYXRhKSB7CiAJCQlkYmcoIiVzOiBrbWFsbG9jIGZvciBzaWVycmFfcG9ydF9wcml2YXRlICglZCkgZmFpbGVkIS4iLAotCQkJCQlfX0ZVTkNUSU9OX18sIGkpOworCQkJCQlfX2Z1bmNfXywgaSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQlzcGluX2xvY2tfaW5pdCgmcG9ydGRhdGEtPmxvY2spOwpAQCAtNjU2LDcgKzY5OCw3IEBACiAJCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCQkJaWYgKHVyYiA9PSBOVUxMKSB7CiAJCQkJZGJnKCIlczogYWxsb2MgZm9yIGluIHBvcnQgZmFpbGVkLiIsCi0JCQkJICAgIF9fRlVOQ1RJT05fXyk7CisJCQkJICAgIF9fZnVuY19fKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJCS8qIEZpbGwgVVJCIHVzaW5nIHN1cHBsaWVkIGRhdGEuICovCkBAIC02NzgsNyArNzIwLDcgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0OwogCXN0cnVjdCBzaWVycmFfcG9ydF9wcml2YXRlICpwb3J0ZGF0YTsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7ICsraSkgewogCQlwb3J0ID0gc2VyaWFsLT5wb3J0W2ldOwpAQCAtNzA2LDkgKzc0OCw2IEBACiAJLmRlc2NyaXB0aW9uICAgICAgID0gIlNpZXJyYSBVU0IgbW9kZW0iLAogCS5pZF90YWJsZSAgICAgICAgICA9IGlkX3RhYmxlLAogCS51c2JfZHJpdmVyICAgICAgICA9ICZzaWVycmFfZHJpdmVyLAotCS5udW1faW50ZXJydXB0X2luICA9IE5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX2luICAgICAgID0gTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfb3V0ICAgICAgPSBOVU1fRE9OVF9DQVJFLAogCS5jYWxjX251bV9wb3J0cwkgICA9IHNpZXJyYV9jYWxjX251bV9wb3J0cywKIAkucHJvYmUJCSAgID0gc2llcnJhX3Byb2JlLAogCS5vcGVuICAgICAgICAgICAgICA9IHNpZXJyYV9vcGVuLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3NwY3A4eDUuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9zcGNwOHg1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI4MmQ2MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9zcGNwOHg1LmMKQEAgLTAsMCArMSwxMDcyIEBACisvKgorICogc3BjcDh4NSBVU0IgdG8gc2VyaWFsIGFkYXB0b3IgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IExpbnhiICh4dWJpbi5saW5Ad29ybGRwbHVzLmNvbS5jbikKKyAqIENvcHlyaWdodCAoQykgMjAwNiBTMSBDb3JwLgorICoKKyAqIE9yaWdpbmFsIGRyaXZlciBmb3IgMi42LjEwIHBsMjMwMyBkcml2ZXIgYnkKKyAqICAgR3JlZyBLcm9haC1IYXJ0bWFuIChncmVnQGtyb2FoLmNvbSkKKyAqIENoYW5nZXMgZm9yIDIuNi4yMCBieSBIYXJhbGQgS2xlaW4gPGhhcmlAdnQxMDAuYXQ+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL3NlcmlhbC5oPgorCisKKy8qIFZlcnNpb24gSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gCSJ2MC4wNCIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgCSJTUENQOHg1IFVTQiB0byBzZXJpYWwgYWRhcHRvciBkcml2ZXIiCisKK3N0YXRpYyBpbnQgZGVidWc7CisKKyNkZWZpbmUgU1BDUDh4NV8wMDdfVklECQkweDA0RkMKKyNkZWZpbmUgU1BDUDh4NV8wMDdfUElECQkweDAyMDEKKyNkZWZpbmUgU1BDUDh4NV8wMDhfVklECQkweDA0ZmMKKyNkZWZpbmUgU1BDUDh4NV8wMDhfUElECQkweDAyMzUKKyNkZWZpbmUgU1BDUDh4NV9QSElMSVBTX1ZJRAkweDA0NzEKKyNkZWZpbmUgU1BDUDh4NV9QSElMSVBTX1BJRAkweDA4MWUKKyNkZWZpbmUgU1BDUDh4NV9JTlRFUk1BVElDX1ZJRAkweDA0RkMKKyNkZWZpbmUgU1BDUDh4NV9JTlRFUk1BVElDX1BJRAkweDAyMDQKKyNkZWZpbmUgU1BDUDh4NV84MzVfVklECQkweDA0ZmMKKyNkZWZpbmUgU1BDUDh4NV84MzVfUElECQkweDAyMzEKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlIFtdID0geworCXsgVVNCX0RFVklDRShTUENQOHg1X1BISUxJUFNfVklEICwgU1BDUDh4NV9QSElMSVBTX1BJRCl9LAorCXsgVVNCX0RFVklDRShTUENQOHg1X0lOVEVSTUFUSUNfVklELCBTUENQOHg1X0lOVEVSTUFUSUNfUElEKX0sCisJeyBVU0JfREVWSUNFKFNQQ1A4eDVfODM1X1ZJRCwgU1BDUDh4NV84MzVfUElEKX0sCisJeyBVU0JfREVWSUNFKFNQQ1A4eDVfMDA4X1ZJRCwgU1BDUDh4NV8wMDhfUElEKX0sCisJeyBVU0JfREVWSUNFKFNQQ1A4eDVfMDA3X1ZJRCwgU1BDUDh4NV8wMDdfUElEKX0sCisJeyB9CQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBpZF90YWJsZSk7CisKK3N0cnVjdCBzcGNwOHg1X3VzYl9jdHJsX2FyZyB7CisJdTggCXR5cGU7CisJdTgJY21kOworCXU4CWNtZF90eXBlOworCXUxNgl2YWx1ZTsKKwl1MTYJaW5kZXg7CisJdTE2CWxlbmd0aDsKK307CisKKy8qIHdhaXQgMzBzIGJlZm9yZSBjbG9zZSAqLworI2RlZmluZSBTUENQOHg1X0NMT1NJTkdfV0FJVAkoMzAqSFopCisKKyNkZWZpbmUgU1BDUDh4NV9CVUZfU0laRQkxMDI0CisKKworLyogc3BjcDh4NSBzcGVjIHJlZ2lzdGVyIGRlZmluZSAqLworI2RlZmluZSBNQ1JfQ09OVFJPTF9MSU5FX1JUUwkJMHgwMgorI2RlZmluZSBNQ1JfQ09OVFJPTF9MSU5FX0RUUgkJMHgwMQorI2RlZmluZSBNQ1JfRFRSCQkJCTB4MDEKKyNkZWZpbmUgTUNSX1JUUwkJCQkweDAyCisKKyNkZWZpbmUgTVNSX1NUQVRVU19MSU5FX0RDRAkJMHg4MAorI2RlZmluZSBNU1JfU1RBVFVTX0xJTkVfUkkJCTB4NDAKKyNkZWZpbmUgTVNSX1NUQVRVU19MSU5FX0RTUgkJMHgyMAorI2RlZmluZSBNU1JfU1RBVFVTX0xJTkVfQ1RTCQkweDEwCisKKy8qIHZlcmRvciBjb21tYW5kIGhlcmUgLCB3ZSBzaG91bGQgZGVmaW5lIG15c2VsZiAqLworI2RlZmluZSBTRVRfREVGQVVMVAkJCTB4NDAKKyNkZWZpbmUgU0VUX0RFRkFVTFRfVFlQRQkJMHgyMAorCisjZGVmaW5lIFNFVF9VQVJUX0ZPUk1BVAkJCTB4NDAKKyNkZWZpbmUgU0VUX1VBUlRfRk9STUFUX1RZUEUJCTB4MjEKKyNkZWZpbmUgU0VUX1VBUlRfRk9STUFUX1NJWkVfNQkJMHgwMAorI2RlZmluZSBTRVRfVUFSVF9GT1JNQVRfU0laRV82CQkweDAxCisjZGVmaW5lIFNFVF9VQVJUX0ZPUk1BVF9TSVpFXzcJCTB4MDIKKyNkZWZpbmUgU0VUX1VBUlRfRk9STUFUX1NJWkVfOAkJMHgwMworI2RlZmluZSBTRVRfVUFSVF9GT1JNQVRfU1RPUF8xCQkweDAwCisjZGVmaW5lIFNFVF9VQVJUX0ZPUk1BVF9TVE9QXzIJCTB4MDQKKyNkZWZpbmUgU0VUX1VBUlRfRk9STUFUX1BBUl9OT05FCTB4MDAKKyNkZWZpbmUgU0VUX1VBUlRfRk9STUFUX1BBUl9PREQJCTB4MTAKKyNkZWZpbmUgU0VUX1VBUlRfRk9STUFUX1BBUl9FVkVOCTB4MzAKKyNkZWZpbmUgU0VUX1VBUlRfRk9STUFUX1BBUl9NQVNLCTB4RDAKKyNkZWZpbmUgU0VUX1VBUlRfRk9STUFUX1BBUl9TUEFDRQkweDkwCisKKyNkZWZpbmUgR0VUX1VBUlRfU1RBVFVTX1RZUEUJCTB4YzAKKyNkZWZpbmUgR0VUX1VBUlRfU1RBVFVTCQkJMHgyMgorI2RlZmluZSBHRVRfVUFSVF9TVEFUVVNfTVNSCQkweDA2CisKKyNkZWZpbmUgU0VUX1VBUlRfU1RBVFVTCQkJMHg0MAorI2RlZmluZSBTRVRfVUFSVF9TVEFUVVNfVFlQRQkJMHgyMworI2RlZmluZSBTRVRfVUFSVF9TVEFUVVNfTUNSCQkweDAwMDQKKyNkZWZpbmUgU0VUX1VBUlRfU1RBVFVTX01DUl9EVFIJCTB4MDEKKyNkZWZpbmUgU0VUX1VBUlRfU1RBVFVTX01DUl9SVFMJCTB4MDIKKyNkZWZpbmUgU0VUX1VBUlRfU1RBVFVTX01DUl9MT09QCTB4MTAKKworI2RlZmluZSBTRVRfV09SS0lOR19NT0RFCQkweDQwCisjZGVmaW5lIFNFVF9XT1JLSU5HX01PREVfVFlQRQkJMHgyNAorI2RlZmluZSBTRVRfV09SS0lOR19NT0RFX1UyQwkJMHgwMAorI2RlZmluZSBTRVRfV09SS0lOR19NT0RFX1JTNDg1CQkweDAxCisjZGVmaW5lIFNFVF9XT1JLSU5HX01PREVfUERNQQkJMHgwMgorI2RlZmluZSBTRVRfV09SS0lOR19NT0RFX1NQUAkJMHgwMworCisjZGVmaW5lIFNFVF9GTE9XQ1RMX0NIQVIJCTB4NDAKKyNkZWZpbmUgU0VUX0ZMT1dDVExfQ0hBUl9UWVBFCQkweDI1CisKKyNkZWZpbmUgR0VUX1ZFUlNJT04JCQkweGMwCisjZGVmaW5lIEdFVF9WRVJTSU9OX1RZUEUJCTB4MjYKKworI2RlZmluZSBTRVRfUkVHSVNURVIJCQkweDQwCisjZGVmaW5lIFNFVF9SRUdJU1RFUl9UWVBFCQkweDI3CisKKyNkZWZpbmUJR0VUX1JFR0lTVEVSCQkJMHhjMAorI2RlZmluZSBHRVRfUkVHSVNURVJfVFlQRQkJMHgyOAorCisjZGVmaW5lIFNFVF9SQU0JCQkJMHg0MAorI2RlZmluZSBTRVRfUkFNX1RZUEUJCQkweDMxCisKKyNkZWZpbmUgR0VUX1JBTQkJCQkweGMwCisjZGVmaW5lIEdFVF9SQU1fVFlQRQkJCTB4MzIKKworLyogaG93IGNvbWUgPz8/ICovCisjZGVmaW5lIFVBUlRfU1RBVEUJCQkweDA4CisjZGVmaW5lIFVBUlRfU1RBVEVfVFJBTlNJRU5UX01BU0sJMHg3NAorI2RlZmluZSBVQVJUX0RDRAkJCTB4MDEKKyNkZWZpbmUgVUFSVF9EU1IJCQkweDAyCisjZGVmaW5lIFVBUlRfQlJFQUtfRVJST1IJCTB4MDQKKyNkZWZpbmUgVUFSVF9SSU5HCQkJMHgwOAorI2RlZmluZSBVQVJUX0ZSQU1FX0VSUk9SCQkweDEwCisjZGVmaW5lIFVBUlRfUEFSSVRZX0VSUk9SCQkweDIwCisjZGVmaW5lIFVBUlRfT1ZFUlJVTl9FUlJPUgkJMHg0MAorI2RlZmluZSBVQVJUX0NUUwkJCTB4ODAKKworZW51bSBzcGNwOHg1X3R5cGUgeworCVNQQ1A4MjVfMDA3X1RZUEUsCisJU1BDUDgyNV8wMDhfVFlQRSwKKwlTUENQODI1X1BISUxJUF9UWVBFLAorCVNQQ1A4MjVfSU5URVJNQVRJQ19UWVBFLAorCVNQQ1A4MzVfVFlQRSwKK307CisKKy8qIDFzdCBpbiAxc3Qgb3V0IGJ1ZmZlciA0IGRyaXZlciAqLworc3RydWN0IHJpbmdidWYgeworCXVuc2lnbmVkIGludAlidWZfc2l6ZTsKKwljaGFyCQkqYnVmX2J1ZjsKKwljaGFyCQkqYnVmX2dldDsKKwljaGFyCQkqYnVmX3B1dDsKK307CisKKy8qIGFsbG9jIHRoZSByaW5nIGJ1ZiBhbmQgYWxsb2MgdGhlIGJ1ZmZlciBpdHNlbGYgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJpbmdidWYgKmFsbG9jX3JpbmdidWYodW5zaWduZWQgaW50IHNpemUpCit7CisJc3RydWN0IHJpbmdidWYgKnBiOworCisJaWYgKHNpemUgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwYiA9IGttYWxsb2Moc2l6ZW9mKCpwYiksIEdGUF9LRVJORUwpOworCWlmIChwYiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXBiLT5idWZfYnVmID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAocGItPmJ1Zl9idWYgPT0gTlVMTCkgeworCQlrZnJlZShwYik7CisJCXJldHVybiBOVUxMOworCX0KKworCXBiLT5idWZfc2l6ZSA9IHNpemU7CisJcGItPmJ1Zl9nZXQgPSBwYi0+YnVmX3B1dCA9IHBiLT5idWZfYnVmOworCisJcmV0dXJuIHBiOworfQorCisvKiBmcmVlIHRoZSByaW5nIGJ1ZiBhbmQgdGhlIGJ1ZmZlciBpdHNlbGYgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3JpbmdidWYoc3RydWN0IHJpbmdidWYgKnBiKQoreworCWlmIChwYiAhPSBOVUxMKSB7CisJCWtmcmVlKHBiLT5idWZfYnVmKTsKKwkJa2ZyZWUocGIpOworCX0KK30KKworLyogY2xlYXIgcGlwbyAsIGp1ZXN0IHJlcG9pbnQgdGhlIHBvaW50ZXIgaGVyZSAqLworc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX3JpbmdidWYoc3RydWN0IHJpbmdidWYgKnBiKQoreworCWlmIChwYiAhPSBOVUxMKQorCQlwYi0+YnVmX2dldCA9IHBiLT5idWZfcHV0OworfQorCisvKiBnZXQgdGhlIG51bWJlciBvZiBkYXRhIGluIHRoZSBwaXBvICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCByaW5nYnVmX2F2YWlsX2RhdGEoc3RydWN0IHJpbmdidWYgKnBiKQoreworCWlmIChwYiA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKChwYi0+YnVmX3NpemUgKyBwYi0+YnVmX3B1dCAtIHBiLT5idWZfZ2V0KSAlIHBiLT5idWZfc2l6ZSk7Cit9CisKKy8qIGdldCB0aGUgbnVtYmVyIG9mIHNwYWNlIGluIHRoZSBwaXBvICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCByaW5nYnVmX2F2YWlsX3NwYWNlKHN0cnVjdCByaW5nYnVmICpwYikKK3sKKwlpZiAocGIgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuICgocGItPmJ1Zl9zaXplICsgcGItPmJ1Zl9nZXQgLSBwYi0+YnVmX3B1dCAtIDEpICUgcGItPmJ1Zl9zaXplKTsKK30KKworLyogcHV0IGNvdW50IGRhdGEgaW50byBwaXBvICovCitzdGF0aWMgdW5zaWduZWQgaW50IHB1dF9yaW5nYnVmKHN0cnVjdCByaW5nYnVmICpwYiwgY29uc3QgY2hhciAqYnVmLAorCQkJCXVuc2lnbmVkIGludCBjb3VudCkKK3sKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJaWYgKHBiID09IE5VTEwpCisJCXJldHVybiAwOworCisJbGVuICA9IHJpbmdidWZfYXZhaWxfc3BhY2UocGIpOworCWlmIChjb3VudCA+IGxlbikKKwkJY291bnQgPSBsZW47CisKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlsZW4gPSBwYi0+YnVmX2J1ZiArIHBiLT5idWZfc2l6ZSAtIHBiLT5idWZfcHV0OworCWlmIChjb3VudCA+IGxlbikgeworCQltZW1jcHkocGItPmJ1Zl9wdXQsIGJ1ZiwgbGVuKTsKKwkJbWVtY3B5KHBiLT5idWZfYnVmLCBidWYrbGVuLCBjb3VudCAtIGxlbik7CisJCXBiLT5idWZfcHV0ID0gcGItPmJ1Zl9idWYgKyBjb3VudCAtIGxlbjsKKwl9IGVsc2UgeworCQltZW1jcHkocGItPmJ1Zl9wdXQsIGJ1ZiwgY291bnQpOworCQlpZiAoY291bnQgPCBsZW4pCisJCQlwYi0+YnVmX3B1dCArPSBjb3VudDsKKwkJZWxzZSAvKiBjb3VudCA9PSBsZW4gKi8KKwkJCXBiLT5idWZfcHV0ID0gcGItPmJ1Zl9idWY7CisJfQorCXJldHVybiBjb3VudDsKK30KKworLyogZ2V0IGNvdW50IGRhdGEgZnJvbSBwaXBvICovCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9yaW5nYnVmKHN0cnVjdCByaW5nYnVmICpwYiwgY2hhciAqYnVmLAorCQkJCXVuc2lnbmVkIGludCBjb3VudCkKK3sKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJaWYgKHBiID09IE5VTEwgfHwgYnVmID09IE5VTEwpCisJCXJldHVybiAwOworCisJbGVuID0gcmluZ2J1Zl9hdmFpbF9kYXRhKHBiKTsKKwlpZiAoY291bnQgPiBsZW4pCisJCWNvdW50ID0gbGVuOworCisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAwOworCisJbGVuID0gcGItPmJ1Zl9idWYgKyBwYi0+YnVmX3NpemUgLSBwYi0+YnVmX2dldDsKKwlpZiAoY291bnQgPiBsZW4pIHsKKwkJbWVtY3B5KGJ1ZiwgcGItPmJ1Zl9nZXQsIGxlbik7CisJCW1lbWNweShidWYrbGVuLCBwYi0+YnVmX2J1ZiwgY291bnQgLSBsZW4pOworCQlwYi0+YnVmX2dldCA9IHBiLT5idWZfYnVmICsgY291bnQgLSBsZW47CisJfSBlbHNlIHsKKwkJbWVtY3B5KGJ1ZiwgcGItPmJ1Zl9nZXQsIGNvdW50KTsKKwkJaWYgKGNvdW50IDwgbGVuKQorCQkJcGItPmJ1Zl9nZXQgKz0gY291bnQ7CisJCWVsc2UgLyogY291bnQgPT0gbGVuICovCisJCQlwYi0+YnVmX2dldCA9IHBiLT5idWZfYnVmOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHNwY3A4eDVfZHJpdmVyID0geworCS5uYW1lID0JCQkic3BjcDh4NSIsCisJLnByb2JlID0JCXVzYl9zZXJpYWxfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPQkJdXNiX3NlcmlhbF9kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9CQlpZF90YWJsZSwKKwkubm9fZHluYW1pY19pZCA9CTEsCit9OworCisKK3N0cnVjdCBzcGNwOHg1X3ByaXZhdGUgeworCXNwaW5sb2NrX3QgCWxvY2s7CisJc3RydWN0IHJpbmdidWYJKmJ1ZjsKKwlpbnQgCQl3cml0ZV91cmJfaW5fdXNlOworCWVudW0gc3BjcDh4NV90eXBlCXR5cGU7CisJd2FpdF9xdWV1ZV9oZWFkX3QJZGVsdGFfbXNyX3dhaXQ7CisJdTggCQkJbGluZV9jb250cm9sOworCXU4IAkJCWxpbmVfc3RhdHVzOworCXU4IAkJCXRlcm1pb3NfaW5pdGlhbGl6ZWQ7Cit9OworCisvKiBkZXNjIDogd2hlbiBkZXZpY2UgcGx1ZyBpbix0aGlzIGZ1bmN0aW9uIHdvdWxkIGJlIGNhbGxlZC4KKyAqIHRoYW5rcyB0byB1c2Jfc2VyaWFsIHN1YnN5c3RlbSx0aGVuIGRvIGFsbW9zdCBldmVyeSB0aGluZ3MgZm9yIHVzLiBBbmQgd2hhdAorICogd2Ugc2hvdWxkIGRvIGp1c3QgYWxsb2MgdGhlIGJ1ZmZlciAqLworc3RhdGljIGludCBzcGNwOHg1X3N0YXJ0dXAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKK3sKKwlzdHJ1Y3Qgc3BjcDh4NV9wcml2YXRlICpwcml2OworCWludCBpOworCWVudW0gc3BjcDh4NV90eXBlIHR5cGUgPSBTUENQODI1XzAwN19UWVBFOworCisJaWYgKHNlcmlhbC0+ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PSAweDAyMDEpCisJCXR5cGUgPSBTUENQODI1XzAwN19UWVBFOworCWVsc2UgaWYgKHNlcmlhbC0+ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PSAweDAyMzEpCisJCXR5cGUgPSBTUENQODM1X1RZUEU7CisJZWxzZSBpZiAoc2VyaWFsLT5kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0ID09IDB4MDIzNSkKKwkJdHlwZSA9IFNQQ1A4MjVfMDA4X1RZUEU7CisJZWxzZSBpZiAoc2VyaWFsLT5kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0ID09IDB4MDIwNCkKKwkJdHlwZSA9IFNQQ1A4MjVfSU5URVJNQVRJQ19UWVBFOworCWVsc2UgaWYgKHNlcmlhbC0+ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PSAweDA0NzEgJiYKKwkJIHNlcmlhbC0+ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yID09IDB4MDgxZSkKKwkJdHlwZSA9IFNQQ1A4MjVfUEhJTElQX1RZUEU7CisJZGV2X2RiZygmc2VyaWFsLT5kZXYtPmRldiwgImRldmljZSB0eXBlID0gJWRcbiIsIChpbnQpdHlwZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7ICsraSkgeworCQlwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNwY3A4eDVfcHJpdmF0ZSksIEdGUF9LRVJORUwpOworCQlpZiAoIXByaXYpCisJCQlnb3RvIGNsZWFudXA7CisKKwkJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOworCQlwcml2LT5idWYgPSBhbGxvY19yaW5nYnVmKFNQQ1A4eDVfQlVGX1NJWkUpOworCQlpZiAocHJpdi0+YnVmID09IE5VTEwpCisJCQlnb3RvIGNsZWFudXAyOworCisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnByaXYtPmRlbHRhX21zcl93YWl0KTsKKwkJcHJpdi0+dHlwZSA9IHR5cGU7CisJCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbaV0gLCBwcml2KTsKKworCX0KKworCXJldHVybiAwOworCitjbGVhbnVwMjoKKwlrZnJlZShwcml2KTsKK2NsZWFudXA6CisJZm9yICgtLWk7IGkgPj0gMDsgLS1pKSB7CisJCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0W2ldKTsKKwkJZnJlZV9yaW5nYnVmKHByaXYtPmJ1Zik7CisJCWtmcmVlKHByaXYpOworCQl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0W2ldICwgTlVMTCk7CisJfQorCXJldHVybiAtRU5PTUVNOworfQorCisvKiBjYWxsIHdoZW4gdGhlIGRldmljZSBwbHVnIG91dC4gZnJlZSBhbGwgdGhlIG1lbW9yeSBhbGxvY2VkIGJ5IHByb2JlICovCitzdGF0aWMgdm9pZCBzcGNwOHg1X3NodXRkb3duKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCit7CisJaW50IGk7CisJc3RydWN0IHNwY3A4eDVfcHJpdmF0ZSAqcHJpdjsKKworCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgaSsrKSB7CisJCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0W2ldKTsKKwkJaWYgKHByaXYpIHsKKwkJCWZyZWVfcmluZ2J1Zihwcml2LT5idWYpOworCQkJa2ZyZWUocHJpdik7CisJCQl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0W2ldICwgTlVMTCk7CisJCX0KKwl9Cit9CisKKy8qIHNldCB0aGUgbW9kZW0gY29udHJvbCBsaW5lIG9mIHRoZSBkZXZpY2UuCisgKiBOT1RFIHNwY3A4MjUtMDA3IG5vdCBzdXBwb3J0ZWQgdGhpcyAqLworc3RhdGljIGludCBzcGNwOHg1X3NldF9jdHJsTGluZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1OCB2YWx1ZSwKKwkJCQllbnVtIHNwY3A4eDVfdHlwZSB0eXBlKQoreworCWludCByZXR2YWw7CisJdTggbWNyID0gMCA7CisKKwlpZiAodHlwZSA9PSBTUENQODI1XzAwN19UWVBFKQorCQlyZXR1cm4gLUVQRVJNOworCisJbWNyID0gKHVuc2lnbmVkIHNob3J0KXZhbHVlOworCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAorCQkJCSBTRVRfVUFSVF9TVEFUVVNfVFlQRSwgU0VUX1VBUlRfU1RBVFVTLAorCQkJCSBtY3IsIDB4MDQsIE5VTEwsIDAsIDEwMCk7CisJaWYgKHJldHZhbCAhPSAwKQorCQlkZXZfZGJnKCZkZXYtPmRldiwgInVzYl9jb250cm9sX21zZyByZXR1cm4gJSN4XG4iLCByZXR2YWwpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIGdldCB0aGUgbW9kZW0gc3RhdHVzIHJlZ2lzdGVyIG9mIHRoZSBkZXZpY2UKKyAqIE5PVEUgc3BjcDgyNS0wMDcgbm90IHN1cHBvcnRlZCB0aGlzICovCitzdGF0aWMgaW50IHNwY3A4eDVfZ2V0X21zcihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1OCAqc3RhdHVzLAorCQkJICAgZW51bSBzcGNwOHg1X3R5cGUgdHlwZSkKK3sKKwl1OCAqc3RhdHVzX2J1ZmZlcjsKKwlpbnQgcmV0OworCisJLyogSSByZXR1cm4gUGVybWl0ZWQgbm90IHN1cHBvcnQgaGVyZSBidXQgc2VlbSBpbnZhbCBkZXZpY2UKKwkgKiBpcyBtb3JlIGZpeCAqLworCWlmICh0eXBlID09IFNQQ1A4MjVfMDA3X1RZUEUpCisJCXJldHVybiAtRVBFUk07CisJaWYgKHN0YXR1cyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0YXR1c19idWZmZXIgPSBrbWFsbG9jKDEsIEdGUF9LRVJORUwpOworCWlmICghc3RhdHVzX2J1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisJc3RhdHVzX2J1ZmZlclswXSA9IHN0YXR1c1swXTsKKworCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9yY3ZjdHJscGlwZShkZXYsIDApLAorCQkJICAgICAgR0VUX1VBUlRfU1RBVFVTLCBHRVRfVUFSVF9TVEFUVVNfVFlQRSwKKwkJCSAgICAgIDAsIEdFVF9VQVJUX1NUQVRVU19NU1IsIHN0YXR1c19idWZmZXIsIDEsIDEwMCk7CisJaWYgKHJldCA8IDApCisJCWRldl9kYmcoJmRldi0+ZGV2LCAiR2V0IE1TUiA9IDB4JXAgZmFpbGVkIChlcnJvciA9ICVkKSIsCisJCQlzdGF0dXNfYnVmZmVyLCByZXQpOworCisJZGV2X2RiZygmZGV2LT5kZXYsICIweGMwOjB4MjI6MDo2ICAlZCAtIDB4JXAgIiwgcmV0LCBzdGF0dXNfYnVmZmVyKTsKKwlzdGF0dXNbMF0gPSBzdGF0dXNfYnVmZmVyWzBdOworCWtmcmVlKHN0YXR1c19idWZmZXIpOworCisJcmV0dXJuIHJldDsKK30KKworLyogc2VsZWN0IHRoZSB3b3JrIG1vZGUuCisgKiBOT1RFIHRoaXMgZnVuY3Rpb24gbm90IHN1cHBvcnRlZCBieSBzcGNwODI1LTAwNyAqLworc3RhdGljIHZvaWQgc3BjcDh4NV9zZXRfd29ya01vZGUoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdTE2IHZhbHVlLAorCQkJCSB1MTYgaW5kZXgsIGVudW0gc3BjcDh4NV90eXBlIHR5cGUpCit7CisJaW50IHJldDsKKworCS8qIEkgcmV0dXJuIFBlcm1pdGVkIG5vdCBzdXBwb3J0IGhlcmUgYnV0IHNlZW0gaW52YWwgZGV2aWNlCisJICogaXMgbW9yZSBmaXggKi8KKwlpZiAodHlwZSA9PSBTUENQODI1XzAwN19UWVBFKQorCQlyZXR1cm47CisKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKKwkJCSAgICAgIFNFVF9XT1JLSU5HX01PREVfVFlQRSwgU0VUX1dPUktJTkdfTU9ERSwKKwkJCSAgICAgIHZhbHVlLCBpbmRleCwgTlVMTCwgMCwgMTAwKTsKKwlkZXZfZGJnKCZkZXYtPmRldiwgInZhbHVlID0gJSN4ICwgaW5kZXggPSAlI3hcbiIsIHZhbHVlLCBpbmRleCk7CisJaWYgKHJldCA8IDApCisJCWRldl9kYmcoJmRldi0+ZGV2LAorCQkJIlJUU0NUUyB1c2JfY29udHJvbF9tc2coZW5hYmxlIGZsb3djdHJsKSA9ICVkXG4iLCByZXQpOworfQorCisvKiBjbG9zZSB0aGUgc2VyaWFsIHBvcnQuIFdlIHNob3VsZCB3YWl0IGZvciBkYXRhIHNlbmRpbmcgdG8gZGV2aWNlIDFzdCBhbmQKKyAqIHRoZW4ga2lsbCBhbGwgdXJiLiAqLworc3RhdGljIHZvaWQgc3BjcDh4NV9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3Qgc3BjcDh4NV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGNfY2ZsYWc7CisJaW50IGJwczsKKwlsb25nIHRpbWVvdXQ7CisJd2FpdF9xdWV1ZV90IHdhaXQ7CisJaW50IHJlc3VsdDsKKworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CisKKwkvKiB3YWl0IGZvciBkYXRhIHRvIGRyYWluIGZyb20gdGhlIGJ1ZmZlciAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJdGltZW91dCA9IFNQQ1A4eDVfQ0xPU0lOR19XQUlUOworCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKKwlhZGRfd2FpdF9xdWV1ZSgmcG9ydC0+dHR5LT53cml0ZV93YWl0LCAmd2FpdCk7CisJZm9yICg7OykgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlpZiAocmluZ2J1Zl9hdmFpbF9kYXRhKHByaXYtPmJ1ZikgPT0gMCB8fAorCQkgICAgdGltZW91dCA9PSAwIHx8IHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJfQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnBvcnQtPnR0eS0+d3JpdGVfd2FpdCwgJndhaXQpOworCisJLyogY2xlYXIgb3V0IGFueSByZW1haW5pbmcgZGF0YSBpbiB0aGUgYnVmZmVyICovCisJY2xlYXJfcmluZ2J1Zihwcml2LT5idWYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCS8qIHdhaXQgZm9yIGNoYXJhY3RlcnMgdG8gZHJhaW4gZnJvbSB0aGUgZGV2aWNlICh0aGlzIGlzIGxvbmcgZW5vdWdoCisJICogZm9yIHRoZSBlbnRpcmUgYWxsIGJ5dGUgc3BjcDh4NSBoYXJkd2FyZSBidWZmZXIgdG8gZHJhaW4gd2l0aCBubworCSAqIGZsb3cgY29udHJvbCBmb3IgZGF0YSByYXRlcyBvZiAxMjAwIGJwcyBvciBtb3JlLCBmb3IgbG93ZXIgcmF0ZXMgd2UKKwkgKiBzaG91bGQgcmVhbGx5IGtub3cgaG93IG11Y2ggZGF0YSBpcyBpbiB0aGUgYnVmZmVyIHRvIGNvbXB1dGUgYSBkZWxheQorCSAqIHRoYXQgaXMgbm90IHVubmVjZXNzYXJpbHkgbG9uZykgKi8KKwlicHMgPSB0dHlfZ2V0X2JhdWRfcmF0ZShwb3J0LT50dHkpOworCWlmIChicHMgPiAxMjAwKQorCQl0aW1lb3V0ID0gbWF4KChIWioyNTYwKSAvIGJwcywgSFovMTApOworCWVsc2UKKwkJdGltZW91dCA9IDIqSFo7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworCisJLyogY2xlYXIgY29udHJvbCBsaW5lcyAqLworCWlmIChwb3J0LT50dHkpIHsKKwkJY19jZmxhZyA9IHBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKwkJaWYgKGNfY2ZsYWcgJiBIVVBDTCkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJCXByaXYtPmxpbmVfY29udHJvbCA9IDA7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCQlzcGNwOHg1X3NldF9jdHJsTGluZShwb3J0LT5zZXJpYWwtPmRldiwgMCAsIHByaXYtPnR5cGUpOworCQl9CisJfQorCisJLyoga2lsbCB1cmIgKi8KKwlpZiAocG9ydC0+d3JpdGVfdXJiICE9IE5VTEwpIHsKKwkJcmVzdWx0ID0gdXNiX3VubGlua191cmIocG9ydC0+d3JpdGVfdXJiKTsKKwkJaWYgKHJlc3VsdCkKKwkJCWRldl9kYmcoJnBvcnQtPmRldiwKKwkJCQkidXNiX3VubGlua191cmIod3JpdGVfdXJiKSA9ICVkXG4iLCByZXN1bHQpOworCX0KKwlyZXN1bHQgPSB1c2JfdW5saW5rX3VyYihwb3J0LT5yZWFkX3VyYik7CisJaWYgKHJlc3VsdCkKKwkJZGV2X2RiZygmcG9ydC0+ZGV2LCAidXNiX3VubGlua191cmIocmVhZF91cmIpID0gJWRcbiIsIHJlc3VsdCk7Cit9CisKKy8qIHNldCB0aGUgc2VyaWFsIHBhcmFtIGZvciB0cmFuc2Zlci4gd2Ugc2hvdWxkIGNoZWNrIGlmIHdlIHJlYWxseSBuZWVkIHRvCisgKiB0cmFuc2Zlci4gdGhlbiBpZiBiZSBzZXQgZmxvdyBjb250b3JsIHdlIHNob3VsZCBkbyB0aGlzIHRvby4gKi8KK3N0YXRpYyB2b2lkIHNwY3A4eDVfc2V0X3Rlcm1pb3Moc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKKwkJCQlzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQoreworCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CisJc3RydWN0IHNwY3A4eDVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBjZmxhZyA9IHBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKwl1bnNpZ25lZCBpbnQgb2xkX2NmbGFnID0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWc7CisJdW5zaWduZWQgc2hvcnQgdWFydGRhdGE7CisJdW5zaWduZWQgY2hhciBidWZbMl0gPSB7MCwgMH07CisJaW50IGJhdWQ7CisJaW50IGk7CisJdTggY29udHJvbDsKKworCWlmICgoIXBvcnQtPnR0eSkgfHwgKCFwb3J0LT50dHktPnRlcm1pb3MpKQorCQlyZXR1cm47CisKKwkvKiBmb3IgdGhlIDFzdCB0aW1lIGNhbGwgdGhpcyBmdW5jdGlvbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJaWYgKCFwcml2LT50ZXJtaW9zX2luaXRpYWxpemVkKSB7CisJCSoocG9ydC0+dHR5LT50ZXJtaW9zKSA9IHR0eV9zdGRfdGVybWlvczsKKwkJcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnID0gQjExNTIwMCB8IENTOCB8IENSRUFEIHwKKwkJCQkJICAgICAgSFVQQ0wgfCBDTE9DQUw7CisJCXByaXYtPnRlcm1pb3NfaW5pdGlhbGl6ZWQgPSAxOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwkvKiBjaGVjayB0aGF0IHRoZXkgcmVhbGx5IHdhbnQgdXMgdG8gY2hhbmdlIHNvbWV0aGluZyAqLworCWlmICghdHR5X3Rlcm1pb3NfaHdfY2hhbmdlKHBvcnQtPnR0eS0+dGVybWlvcywgb2xkX3Rlcm1pb3MpKQorCQlyZXR1cm47CisKKwkvKiBzZXQgRFRSL1JUUyBhY3RpdmUgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCWNvbnRyb2wgPSBwcml2LT5saW5lX2NvbnRyb2w7CisJaWYgKChvbGRfY2ZsYWcgJiBDQkFVRCkgPT0gQjApIHsKKwkJcHJpdi0+bGluZV9jb250cm9sIHw9IE1DUl9EVFI7CisJCWlmICghKG9sZF9jZmxhZyAmIENSVFNDVFMpKQorCQkJcHJpdi0+bGluZV9jb250cm9sIHw9IE1DUl9SVFM7CisJfQorCWlmIChjb250cm9sICE9IHByaXYtPmxpbmVfY29udHJvbCkgeworCQljb250cm9sID0gcHJpdi0+bGluZV9jb250cm9sOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCXNwY3A4eDVfc2V0X2N0cmxMaW5lKHNlcmlhbC0+ZGV2LCBjb250cm9sICwgcHJpdi0+dHlwZSk7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCX0KKworCS8qIFNldCBCYXVkIFJhdGUgKi8KKwliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUocG9ydC0+dHR5KTs7CisJc3dpdGNoIChiYXVkKSB7CisJY2FzZSAzMDA6CWJ1ZlswXSA9IDB4MDA7CWJyZWFrOworCWNhc2UgNjAwOglidWZbMF0gPSAweDAxOwlicmVhazsKKwljYXNlIDEyMDA6CWJ1ZlswXSA9IDB4MDI7CWJyZWFrOworCWNhc2UgMjQwMDoJYnVmWzBdID0gMHgwMzsJYnJlYWs7CisJY2FzZSA0ODAwOglidWZbMF0gPSAweDA0OwlicmVhazsKKwljYXNlIDk2MDA6CWJ1ZlswXSA9IDB4MDU7CWJyZWFrOworCWNhc2UgMTkyMDA6CWJ1ZlswXSA9IDB4MDc7CWJyZWFrOworCWNhc2UgMzg0MDA6CWJ1ZlswXSA9IDB4MDk7CWJyZWFrOworCWNhc2UgNTc2MDA6CWJ1ZlswXSA9IDB4MGE7CWJyZWFrOworCWNhc2UgMTE1MjAwOglidWZbMF0gPSAweDBiOwlicmVhazsKKwljYXNlIDIzMDQwMDoJYnVmWzBdID0gMHgwYzsJYnJlYWs7CisJY2FzZSA0NjA4MDA6CWJ1ZlswXSA9IDB4MGQ7CWJyZWFrOworCWNhc2UgOTIxNjAwOglidWZbMF0gPSAweDBlOwlicmVhazsKKy8qCWNhc2UgMTIwMDAwMDoJYnVmWzBdID0gMHgwZjsJYnJlYWs7ICovCisvKgljYXNlIDI0MDAwMDA6CWJ1ZlswXSA9IDB4MTA7CWJyZWFrOyAqLworCWNhc2UgMzAwMDAwMDoJYnVmWzBdID0gMHgxMTsJYnJlYWs7CisvKgljYXNlIDYwMDAwMDA6CWJ1ZlswXSA9IDB4MTI7CWJyZWFrOyAqLworCWNhc2UgMDoKKwljYXNlIDEwMDAwMDA6CisJCQlidWZbMF0gPSAweDBiOwlicmVhazsKKwlkZWZhdWx0OgorCQllcnIoInNwY3A4MjUgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIGJhdWRyYXRlICIKKwkJICAgICJyZXF1ZXN0ZWQsIHVzaW5nIGRlZmF1bHQgb2YgOTYwMC4iKTsKKwl9CisKKwkvKiBTZXQgRGF0YSBMZW5ndGggOiAwMDo1Yml0LCAwMTo2Yml0LCAxMDo3Yml0LCAxMTo4Yml0ICovCisJaWYgKGNmbGFnICYgQ1NJWkUpIHsKKwkJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7CisJCWNhc2UgQ1M1OgorCQkJYnVmWzFdIHw9IFNFVF9VQVJUX0ZPUk1BVF9TSVpFXzU7CisJCQlicmVhazsKKwkJY2FzZSBDUzY6CisJCQlidWZbMV0gfD0gU0VUX1VBUlRfRk9STUFUX1NJWkVfNjsKKwkJCWJyZWFrOworCQljYXNlIENTNzoKKwkJCWJ1ZlsxXSB8PSBTRVRfVUFSVF9GT1JNQVRfU0laRV83OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCWNhc2UgQ1M4OgorCQkJYnVmWzFdIHw9IFNFVF9VQVJUX0ZPUk1BVF9TSVpFXzg7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIFNldCBTdG9wIGJpdDIgOiAwOjFiaXQgMToyYml0ICovCisJYnVmWzFdIHw9IChjZmxhZyAmIENTVE9QQikgPyBTRVRfVUFSVF9GT1JNQVRfU1RPUF8yIDoKKwkJCQkgICAgIFNFVF9VQVJUX0ZPUk1BVF9TVE9QXzE7CisKKwkvKiBTZXQgUGFyaXR5IGJpdDMtNCAwMTpPZGQgMTE6RXZlbiAqLworCWlmIChjZmxhZyAmIFBBUkVOQikgeworCQlidWZbMV0gfD0gKGNmbGFnICYgUEFST0REKSA/CisJCVNFVF9VQVJUX0ZPUk1BVF9QQVJfT0REIDogU0VUX1VBUlRfRk9STUFUX1BBUl9FVkVOIDsKKwl9IGVsc2UKKwkJYnVmWzFdIHw9IFNFVF9VQVJUX0ZPUk1BVF9QQVJfTk9ORTsKKworCXVhcnRkYXRhID0gYnVmWzBdIHwgYnVmWzFdPDw4OworCisJaSA9IHVzYl9jb250cm9sX21zZyhzZXJpYWwtPmRldiwgdXNiX3NuZGN0cmxwaXBlKHNlcmlhbC0+ZGV2LCAwKSwKKwkJCSAgICBTRVRfVUFSVF9GT1JNQVRfVFlQRSwgU0VUX1VBUlRfRk9STUFULAorCQkJICAgIHVhcnRkYXRhLCAwLCBOVUxMLCAwLCAxMDApOworCWlmIChpIDwgMCkKKwkJZXJyKCJTZXQgVUFSVCBmb3JtYXQgJSN4IGZhaWxlZCAoZXJyb3IgPSAlZCkiLCB1YXJ0ZGF0YSwgaSk7CisJZGJnKCIweDIxOjB4NDA6MDowICAlZFxuIiwgaSk7CisKKwlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCS8qIGVuYWJsZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wgKi8KKwkJc3BjcDh4NV9zZXRfd29ya01vZGUoc2VyaWFsLT5kZXYsIDB4MDAwYSwKKwkJCQkgICAgIFNFVF9XT1JLSU5HX01PREVfVTJDLCBwcml2LT50eXBlKTsKKwl9CisJcmV0dXJuOworfQorCisvKiBvcGVuIHRoZSBzZXJpYWwgcG9ydC4gZG8gc29tZSB1c2Igc3lzdGVtIGNhbGwuIHNldCB0ZXJtaW9zIGFuZCBnZXQgdGhlIGxpbmUKKyAqIHN0YXR1cyBvZiB0aGUgZGV2aWNlLiB0aGVuIHN1Ym1pdCB0aGUgcmVhZCB1cmIgKi8KK3N0YXRpYyBpbnQgc3BjcDh4NV9vcGVuKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBrdGVybWlvcyB0bXBfdGVybWlvczsKKwlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOworCXN0cnVjdCBzcGNwOHg1X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IHN0YXR1cyA9IDB4MzA7CisJLyogc3RhdHVzIDB4MzAgbWVhbnMgRFNSIGFuZCBDVFMgPSAxIG90aGVyIENEQyBSSSBhbmQgZGVsdGEgPSAwICovCisKKwlkYmcoIiVzIC0gIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKKworCXVzYl9jbGVhcl9oYWx0KHNlcmlhbC0+ZGV2LCBwb3J0LT53cml0ZV91cmItPnBpcGUpOworCXVzYl9jbGVhcl9oYWx0KHNlcmlhbC0+ZGV2LCBwb3J0LT5yZWFkX3VyYi0+cGlwZSk7CisKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coc2VyaWFsLT5kZXYsIHVzYl9zbmRjdHJscGlwZShzZXJpYWwtPmRldiwgMCksCisJCQkgICAgICAweDA5LCAweDAwLAorCQkJICAgICAgMHgwMSwgMHgwMCwgTlVMTCwgMHgwMCwgMTAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlpZiAocG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpCisJCXByaXYtPmxpbmVfY29udHJvbCA9IE1DUl9EVFIgfCBNQ1JfUlRTOworCWVsc2UKKwkJcHJpdi0+bGluZV9jb250cm9sID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlzcGNwOHg1X3NldF9jdHJsTGluZShzZXJpYWwtPmRldiwgcHJpdi0+bGluZV9jb250cm9sICwgcHJpdi0+dHlwZSk7CisKKwkvKiBTZXR1cCB0ZXJtaW9zICovCisJaWYgKHBvcnQtPnR0eSkKKwkJc3BjcDh4NV9zZXRfdGVybWlvcyhwb3J0LCAmdG1wX3Rlcm1pb3MpOworCisJc3BjcDh4NV9nZXRfbXNyKHNlcmlhbC0+ZGV2LCAmc3RhdHVzLCBwcml2LT50eXBlKTsKKworCS8qIG1heSBiZSB3ZSBzaG91bGQgdXBkYXRlIHVhcnQgc3RhdHVzIGhlcmUgYnV0IG5vdyB3ZSBkaWQgbm90IGRvICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlwcml2LT5saW5lX3N0YXR1cyA9IHN0YXR1cyAmIDB4ZjAgOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCS8qIEZJWE1FOiBuZWVkIHRvIGFzc2VydCBSVFMgYW5kIERUUiBpZiBDUlRTQ1RTIG9mZiAqLworCisJZGJnKCIlcyAtIHN1Ym1pdHRpbmcgcmVhZCB1cmIiLCBfX2Z1bmNfXyk7CisJcG9ydC0+cmVhZF91cmItPmRldiA9IHNlcmlhbC0+ZGV2OworCXJldCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0KSB7CisJCXNwY3A4eDVfY2xvc2UocG9ydCwgTlVMTCk7CisJCXJldHVybiAtRVBST1RPOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogYnVsayByZWFkIGNhbGwgYmFjayBmdW5jdGlvbi4gY2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgdXJiLiBpZiB0cmFuc2ZlcgorICogZmFpbGVkIHJldHVybi4gdGhlbiB1cGRhdGUgdGhlIHN0YXR1cyBhbmQgdGhlIHR0eSBzZW5kIGRhdGEgdG8gdHR5IHN1YnN5cy4KKyAqIHN1Ym1pdCB1cmIgYWdhaW4uCisgKi8KK3N0YXRpYyB2b2lkIHNwY3A4eDVfcmVhZF9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCBzcGNwOHg1X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKwlpbnQgcmVzdWx0OworCXU4IHN0YXR1cyA9IDA7CisJY2hhciB0dHlfZmxhZzsKKworCWRldl9kYmcoJnBvcnQtPmRldiwgInN0YXJ0LCB1cmItPnN0YXR1cyA9ICVkLCAiCisJCSJ1cmItPmFjdHVhbF9sZW5ndGggPSAlZFxuLCIsIHVyYi0+c3RhdHVzLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCisJLyogY2hlY2sgdGhlIHVyYiBzdGF0dXMgKi8KKwlpZiAodXJiLT5zdGF0dXMpIHsKKwkJaWYgKCFwb3J0LT5vcGVuX2NvdW50KQorCQkJcmV0dXJuOworCQlpZiAodXJiLT5zdGF0dXMgPT0gLUVQUk9UTykgeworCQkJLyogc3BjcDh4NSBteXN0ZXJpb3VzbHkgZmFpbHMgd2l0aCAtRVBST1RPICovCisJCQkvKiByZXNjaGVkdWxlIHRoZSByZWFkICovCisJCQl1cmItPnN0YXR1cyA9IDA7CisJCQl1cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OworCQkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIodXJiICwgR0ZQX0FUT01JQyk7CisJCQlpZiAocmVzdWx0KQorCQkJCWRldl9kYmcoJnBvcnQtPmRldiwKKwkJCQkJImZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiICVkXG4iLAorCQkJCQlyZXN1bHQpOworCQkJcmV0dXJuOworCQl9CisJCWRldl9kYmcoJnBvcnQtPmRldiwgInVuYWJsZSB0byBoYW5kbGUgdGhlIGVycm9yLCBleGl0aW5nLlxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBnZXQgdHR5X2ZsYWcgZnJvbSBzdGF0dXMgKi8KKwl0dHlfZmxhZyA9IFRUWV9OT1JNQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXN0YXR1cyA9IHByaXYtPmxpbmVfc3RhdHVzOworCXByaXYtPmxpbmVfc3RhdHVzICY9IH5VQVJUX1NUQVRFX1RSQU5TSUVOVF9NQVNLOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkvKiB3YWtlIHVwIHRoZSB3YWl0IGZvciB0ZXJtaW9zICovCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5kZWx0YV9tc3Jfd2FpdCk7CisKKwkvKiBicmVhayB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgcGFyaXR5LCB3aGljaCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIKKwkgKiBmcmFtaW5nIGVycm9ycyAqLworCWlmIChzdGF0dXMgJiBVQVJUX0JSRUFLX0VSUk9SKQorCQl0dHlfZmxhZyA9IFRUWV9CUkVBSzsKKwllbHNlIGlmIChzdGF0dXMgJiBVQVJUX1BBUklUWV9FUlJPUikKKwkJdHR5X2ZsYWcgPSBUVFlfUEFSSVRZOworCWVsc2UgaWYgKHN0YXR1cyAmIFVBUlRfRlJBTUVfRVJST1IpCisJCXR0eV9mbGFnID0gVFRZX0ZSQU1FOworCWRldl9kYmcoJnBvcnQtPmRldiwgInR0eV9mbGFnID0gJWRcbiIsIHR0eV9mbGFnKTsKKworCXR0eSA9IHBvcnQtPnR0eTsKKwlpZiAodHR5ICYmIHVyYi0+YWN0dWFsX2xlbmd0aCkgeworCQl0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIHVyYi0+YWN0dWFsX2xlbmd0aCArIDEpOworCQkvKiBvdmVycnVuIGlzIHNwZWNpYWwsIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBjaGFyICovCisJCWlmIChzdGF0dXMgJiBVQVJUX09WRVJSVU5fRVJST1IpCisJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIDAsIFRUWV9PVkVSUlVOKTsKKwkJZm9yIChpID0gMDsgaSA8IHVyYi0+YWN0dWFsX2xlbmd0aDsgKytpKQorCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBkYXRhW2ldLCB0dHlfZmxhZyk7CisJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CisJfQorCisJLyogU2NoZWR1bGUgdGhlIG5leHQgcmVhZCBfaWZfIHdlIGFyZSBzdGlsbCBvcGVuICovCisJaWYgKHBvcnQtPm9wZW5fY291bnQpIHsKKwkJdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKKwkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIodXJiICwgR0ZQX0FUT01JQyk7CisJCWlmIChyZXN1bHQpCisJCQlkZXZfZGJnKCZwb3J0LT5kZXYsICJmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiAlZFxuIiwKKwkJCQlyZXN1bHQpOworCX0KKworCXJldHVybjsKK30KKworLyogZ2V0IGRhdGEgZnJvbSByaW5nIGJ1ZmZlciBhbmQgdGhlbiB3cml0ZSB0byB1c2IgYnVzICovCitzdGF0aWMgdm9pZCBzcGNwOHg1X3NlbmQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3sKKwlpbnQgY291bnQsIHJlc3VsdDsKKwlzdHJ1Y3Qgc3BjcDh4NV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJaWYgKHByaXYtPndyaXRlX3VyYl9pbl91c2UpIHsKKwkJZGV2X2RiZygmcG9ydC0+ZGV2LCAid3JpdGUgdXJiIHN0aWxsIHVzZWRcbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBzZW5kIHRoZSAxc3QgdXJiIGZvciB3cml0dGluZyAqLworCW1lbXNldChwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlciAsIDB4MDAgLCBwb3J0LT5idWxrX291dF9zaXplKTsKKwljb3VudCA9IGdldF9yaW5nYnVmKHByaXYtPmJ1ZiwgcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXIsCisJCXBvcnQtPmJ1bGtfb3V0X3NpemUpOworCisJaWYgKGNvdW50ID09IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogdXBkYXRlIHRoZSB1cmIgc3RhdHVzICovCisJcHJpdi0+d3JpdGVfdXJiX2luX3VzZSA9IDE7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBjb3VudDsKKwlwb3J0LT53cml0ZV91cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OworCisJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+d3JpdGVfdXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAocmVzdWx0KSB7CisJCWRldl9kYmcoJnBvcnQtPmRldiwgImZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWRcbiIsCisJCQlyZXN1bHQpOworCQlwcml2LT53cml0ZV91cmJfaW5fdXNlID0gMDsKKwkJLyogVE9ETzogcmVzY2hlZHVsZSBzcGNwOHg1X3NlbmQgKi8KKwl9CisKKworCXNjaGVkdWxlX3dvcmsoJnBvcnQtPndvcmspOworfQorCisvKiB0aGlzIGlzIHRoZSBjYWxsIGJhY2sgZnVuY3Rpb24gZm9yIHdyaXRlIHVyYi4gTk9URSB3ZSBzaG91bGQgbm90IHNsZWVwIGluCisgKiB0aGlzIHJvdXRpbmUuIGNoZWNrIHRoZSB1cmIgcmV0dXJuIGNvZGUgYW5kIHRoZW4gc3VibWl0IHRoZSB3cml0ZSB1cmIgYWdhaW4KKyAqIHRvIGhvbGQgdGhlIHdyaXRlIGxvb3AgKi8KK3N0YXRpYyB2b2lkIHNwY3A4eDVfd3JpdGVfYnVsa19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3Qgc3BjcDh4NV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCWludCByZXN1bHQ7CisKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQkvKiBzdWNjZXNzICovCisJCWJyZWFrOworCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KKwkJZGV2X2RiZygmcG9ydC0+ZGV2LCAidXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkXG4iLAorCQkJdXJiLT5zdGF0dXMpOworCQlwcml2LT53cml0ZV91cmJfaW5fdXNlID0gMDsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCS8qIGVycm9yIGluIHRoZSB1cmIsIHNvIHdlIGhhdmUgdG8gcmVzdWJtaXQgaXQgKi8KKwkJZGJnKCIlcyAtIE92ZXJmbG93IGluIHdyaXRlIiwgX19mdW5jX18pOworCQlkYmcoIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAorCQkJX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwkJcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gMTsKKwkJcG9ydC0+d3JpdGVfdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKKwkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+d3JpdGVfdXJiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHJlc3VsdCkKKwkJCWRldl9kYmcoJnBvcnQtPmRldiwKKwkJCQkiZmFpbGVkIHJlc3VibWl0dGluZyB3cml0ZSB1cmIgJWRcbiIsIHJlc3VsdCk7CisJCWVsc2UKKwkJCXJldHVybjsKKwl9CisKKwlwcml2LT53cml0ZV91cmJfaW5fdXNlID0gMDsKKworCS8qIHNlbmQgYW55IGJ1ZmZlcmVkIGRhdGEgKi8KKwlzcGNwOHg1X3NlbmQocG9ydCk7Cit9CisKKy8qIHdyaXRlIGRhdGEgdG8gcmluZyBidWZmZXIuIGFuZCB0aGVuIHN0YXJ0IHRoZSB3cml0ZSB0cmFuc2ZlciAqLworc3RhdGljIGludCBzcGNwOHg1X3dyaXRlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCisJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJc3RydWN0IHNwY3A4eDVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJWQgYnl0ZXNcbiIsIGNvdW50KTsKKworCWlmICghY291bnQpCisJCXJldHVybiBjb3VudDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJY291bnQgPSBwdXRfcmluZ2J1Zihwcml2LT5idWYsIGJ1ZiwgY291bnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXNwY3A4eDVfc2VuZChwb3J0KTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBzcGNwOHg1X3dhaXRfbW9kZW1faW5mbyhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAorCQkJCSAgIHVuc2lnbmVkIGludCBhcmcpCit7CisJc3RydWN0IHNwY3A4eDVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBwcmV2c3RhdHVzOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisJdW5zaWduZWQgaW50IGNoYW5nZWQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXByZXZzdGF0dXMgPSBwcml2LT5saW5lX3N0YXR1czsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoMSkgeworCQkvKiB3YWtlIHVwIGluIGJ1bGsgcmVhZCAqLworCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZwcml2LT5kZWx0YV9tc3Jfd2FpdCk7CisKKwkJLyogc2VlIGlmIGEgc2lnbmFsIGRpZCBpdCAqLworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCXN0YXR1cyA9IHByaXYtPmxpbmVfc3RhdHVzOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwkJY2hhbmdlZCA9IHByZXZzdGF0dXNec3RhdHVzOworCisJCWlmICgoKGFyZyAmIFRJT0NNX1JORykgJiYgKGNoYW5nZWQgJiBNU1JfU1RBVFVTX0xJTkVfUkkpKSB8fAorCQkgICAgKChhcmcgJiBUSU9DTV9EU1IpICYmIChjaGFuZ2VkICYgTVNSX1NUQVRVU19MSU5FX0RTUikpIHx8CisJCSAgICAoKGFyZyAmIFRJT0NNX0NEKSAgJiYgKGNoYW5nZWQgJiBNU1JfU1RBVFVTX0xJTkVfRENEKSkgfHwKKwkJICAgICgoYXJnICYgVElPQ01fQ1RTKSAmJiAoY2hhbmdlZCAmIE1TUl9TVEFUVVNfTElORV9DVFMpKSkKKwkJCXJldHVybiAwOworCisJCXByZXZzdGF0dXMgPSBzdGF0dXM7CisJfQorCS8qIE5PVFJFQUNIRUQgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcGNwOHg1X2lvY3RsKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRiZygiJXMgKCVkKSBjbWQgPSAweCUwNHgiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCBjbWQpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFRJT0NNSVdBSVQ6CisJCWRiZygiJXMgKCVkKSBUSU9DTUlXQUlUIiwgX19mdW5jX18sICBwb3J0LT5udW1iZXIpOworCQlyZXR1cm4gc3BjcDh4NV93YWl0X21vZGVtX2luZm8ocG9ydCwgYXJnKTsKKworCWRlZmF1bHQ6CisJCWRiZygiJXMgbm90IHN1cHBvcnRlZCA9IDB4JTA0eCIsIF9fZnVuY19fLCBjbWQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gLUVOT0lPQ1RMQ01EOworfQorCitzdGF0aWMgaW50IHNwY3A4eDVfdGlvY21zZXQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworCXN0cnVjdCBzcGNwOHg1X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCBjb250cm9sOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlpZiAoc2V0ICYgVElPQ01fUlRTKQorCQlwcml2LT5saW5lX2NvbnRyb2wgfD0gTUNSX1JUUzsKKwlpZiAoc2V0ICYgVElPQ01fRFRSKQorCQlwcml2LT5saW5lX2NvbnRyb2wgfD0gTUNSX0RUUjsKKwlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpCisJCXByaXYtPmxpbmVfY29udHJvbCAmPSB+TUNSX1JUUzsKKwlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCisJCXByaXYtPmxpbmVfY29udHJvbCAmPSB+TUNSX0RUUjsKKwljb250cm9sID0gcHJpdi0+bGluZV9jb250cm9sOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBzcGNwOHg1X3NldF9jdHJsTGluZShwb3J0LT5zZXJpYWwtPmRldiwgY29udHJvbCAsIHByaXYtPnR5cGUpOworfQorCitzdGF0aWMgaW50IHNwY3A4eDVfdGlvY21nZXQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNwY3A4eDVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtY3I7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgcmVzdWx0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwltY3IgPSBwcml2LT5saW5lX2NvbnRyb2w7CisJc3RhdHVzID0gcHJpdi0+bGluZV9zdGF0dXM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJcmVzdWx0ID0gKChtY3IgJiBNQ1JfRFRSKQkJCT8gVElPQ01fRFRSIDogMCkKKwkJICB8ICgobWNyICYgTUNSX1JUUykJCQk/IFRJT0NNX1JUUyA6IDApCisJCSAgfCAoKHN0YXR1cyAmIE1TUl9TVEFUVVNfTElORV9DVFMpCT8gVElPQ01fQ1RTIDogMCkKKwkJICB8ICgoc3RhdHVzICYgTVNSX1NUQVRVU19MSU5FX0RTUikJPyBUSU9DTV9EU1IgOiAwKQorCQkgIHwgKChzdGF0dXMgJiBNU1JfU1RBVFVTX0xJTkVfUkkpCT8gVElPQ01fUkkgIDogMCkKKwkJICB8ICgoc3RhdHVzICYgTVNSX1NUQVRVU19MSU5FX0RDRCkJPyBUSU9DTV9DRCAgOiAwKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIGdldCB0aGUgYXZhaWwgc3BhY2Ugcm9vbSBpbiByaW5nIGJ1ZmZlciAqLworc3RhdGljIGludCBzcGNwOHg1X3dyaXRlX3Jvb20oc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3Qgc3BjcDh4NV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCWludCByb29tID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlyb29tID0gcmluZ2J1Zl9hdmFpbF9zcGFjZShwcml2LT5idWYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByb29tOworfQorCisvKiBnZXQgdGhlIG51bWJlciBvZiBhdmFpbCBkYXRhIGluIHdyaXRlIHJpbmcgYnVmZmVyICovCitzdGF0aWMgaW50IHNwY3A4eDVfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHNwY3A4eDVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwlpbnQgY2hhcnMgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCWNoYXJzID0gcmluZ2J1Zl9hdmFpbF9kYXRhKHByaXYtPmJ1Zik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGNoYXJzOworfQorCisvKiBBbGwgb2YgdGhlIGRldmljZSBpbmZvIG5lZWRlZCBmb3IgdGhlIHNwY3A4eDUgU0lPIHNlcmlhbCBjb252ZXJ0ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX3NlcmlhbF9kcml2ZXIgc3BjcDh4NV9kZXZpY2UgPSB7CisJLmRyaXZlciA9IHsKKwkJLm93bmVyID0JVEhJU19NT0RVTEUsCisJCS5uYW1lID0JCSJTUENQOHg1IiwKKwl9LAorCS5pZF90YWJsZQkJPSBpZF90YWJsZSwKKwkubnVtX3BvcnRzCQk9IDEsCisJLm9wZW4gCQkJPSBzcGNwOHg1X29wZW4sCisJLmNsb3NlIAkJCT0gc3BjcDh4NV9jbG9zZSwKKwkud3JpdGUgCQkJPSBzcGNwOHg1X3dyaXRlLAorCS5zZXRfdGVybWlvcyAJCT0gc3BjcDh4NV9zZXRfdGVybWlvcywKKwkuaW9jdGwgCQkJPSBzcGNwOHg1X2lvY3RsLAorCS50aW9jbWdldCAJCT0gc3BjcDh4NV90aW9jbWdldCwKKwkudGlvY21zZXQgCQk9IHNwY3A4eDVfdGlvY21zZXQsCisJLndyaXRlX3Jvb20gCQk9IHNwY3A4eDVfd3JpdGVfcm9vbSwKKwkucmVhZF9idWxrX2NhbGxiYWNrIAk9IHNwY3A4eDVfcmVhZF9idWxrX2NhbGxiYWNrLAorCS53cml0ZV9idWxrX2NhbGxiYWNrCT0gc3BjcDh4NV93cml0ZV9idWxrX2NhbGxiYWNrLAorCS5jaGFyc19pbl9idWZmZXIgCT0gc3BjcDh4NV9jaGFyc19pbl9idWZmZXIsCisJLmF0dGFjaCAJCT0gc3BjcDh4NV9zdGFydHVwLAorCS5zaHV0ZG93biAJCT0gc3BjcDh4NV9zaHV0ZG93biwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNwY3A4eDVfaW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisJcmV0dmFsID0gdXNiX3NlcmlhbF9yZWdpc3Rlcigmc3BjcDh4NV9kZXZpY2UpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZmFpbGVkX3VzYl9zZXJpYWxfcmVnaXN0ZXI7CisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZzcGNwOHg1X2RyaXZlcik7CisJaWYgKHJldHZhbCkKKwkJZ290byBmYWlsZWRfdXNiX3JlZ2lzdGVyOworCWluZm8oRFJJVkVSX0RFU0MgIiAiIERSSVZFUl9WRVJTSU9OKTsKKwlyZXR1cm4gMDsKK2ZhaWxlZF91c2JfcmVnaXN0ZXI6CisJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyKCZzcGNwOHg1X2RldmljZSk7CitmYWlsZWRfdXNiX3NlcmlhbF9yZWdpc3RlcjoKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc3BjcDh4NV9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJnNwY3A4eDVfZHJpdmVyKTsKKwl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJnNwY3A4eDVfZGV2aWNlKTsKK30KKworbW9kdWxlX2luaXQoc3BjcDh4NV9pbml0KTsKK21vZHVsZV9leGl0KHNwY3A4eDVfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGVuYWJsZWQgb3Igbm90Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuYwppbmRleCAzYTM3NzY2Li5hMWM4YWVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC90aV91c2JfMzQxMF81MDUyLmMKQEAgLTI2NCw5ICsyNjQsNiBAQAogCS5kZXNjcmlwdGlvbgkJPSAiVEkgVVNCIDM0MTAgMSBwb3J0IGFkYXB0ZXIiLAogCS51c2JfZHJpdmVyCQk9ICZ0aV91c2JfZHJpdmVyLAogCS5pZF90YWJsZQkJPSB0aV9pZF90YWJsZV8zNDEwLAotCS5udW1faW50ZXJydXB0X2luCT0gTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfaW4JCT0gTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfb3V0CQk9IDEsCiAJLm51bV9wb3J0cwkJPSAxLAogCS5hdHRhY2gJCQk9IHRpX3N0YXJ0dXAsCiAJLnNodXRkb3duCQk9IHRpX3NodXRkb3duLApAQCAtMjk1LDkgKzI5Miw2IEBACiAJLmRlc2NyaXB0aW9uCQk9ICJUSSBVU0IgNTA1MiAyIHBvcnQgYWRhcHRlciIsCiAJLnVzYl9kcml2ZXIJCT0gJnRpX3VzYl9kcml2ZXIsCiAJLmlkX3RhYmxlCQk9IHRpX2lkX3RhYmxlXzUwNTIsCi0JLm51bV9pbnRlcnJ1cHRfaW4JPSAxLAotCS5udW1fYnVsa19pbgkJPSAyLAotCS5udW1fYnVsa19vdXQJCT0gMiwKIAkubnVtX3BvcnRzCQk9IDIsCiAJLmF0dGFjaAkJCT0gdGlfc3RhcnR1cCwKIAkuc2h1dGRvd24JCT0gdGlfc2h1dGRvd24sCkBAIC00MTQsMTQgKzQwOCwxNCBAQAogCiAKIAlkYmcoIiVzIC0gcHJvZHVjdCAweCU0WCwgbnVtIGNvbmZpZ3VyYXRpb25zICVkLCBjb25maWd1cmF0aW9uIHZhbHVlICVkIiwKLQkgICAgX19GVU5DVElPTl9fLCBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSwKKwkgICAgX19mdW5jX18sIGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpLAogCSAgICBkZXYtPmRlc2NyaXB0b3IuYk51bUNvbmZpZ3VyYXRpb25zLAogCSAgICBkZXYtPmFjdGNvbmZpZy0+ZGVzYy5iQ29uZmlndXJhdGlvblZhbHVlKTsKIAogCS8qIGNyZWF0ZSBkZXZpY2Ugc3RydWN0dXJlICovCiAJdGRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0aV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKIAlpZiAodGRldiA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmRldi0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX0ZVTkNUSU9OX18pOworCQlkZXZfZXJyKCZkZXYtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJbXV0ZXhfaW5pdCgmdGRldi0+dGRfb3Blbl9jbG9zZV9sb2NrKTsKQEAgLTQzMSw3ICs0MjUsNyBAQAogCS8qIGRldGVybWluZSBkZXZpY2UgdHlwZSAqLwogCWlmICh1c2JfbWF0Y2hfaWQoc2VyaWFsLT5pbnRlcmZhY2UsIHRpX2lkX3RhYmxlXzM0MTApKQogCQl0ZGV2LT50ZF9pc18zNDEwID0gMTsKLQlkYmcoIiVzIC0gZGV2aWNlIHR5cGUgaXMgJXMiLCBfX0ZVTkNUSU9OX18sIHRkZXYtPnRkX2lzXzM0MTAgPyAiMzQxMCIgOiAiNTA1MiIpOworCWRiZygiJXMgLSBkZXZpY2UgdHlwZSBpcyAlcyIsIF9fZnVuY19fLCB0ZGV2LT50ZF9pc18zNDEwID8gIjM0MTAiIDogIjUwNTIiKTsKIAogCS8qIGlmIHdlIGhhdmUgb25seSAxIGNvbmZpZ3VyYXRpb24sIGRvd25sb2FkIGZpcm13YXJlICovCiAJaWYgKGRldi0+ZGVzY3JpcHRvci5iTnVtQ29uZmlndXJhdGlvbnMgPT0gMSkgewpAQCAtNDY1LDcgKzQ1OSw3IEBACiAJZm9yIChpID0gMDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKIAkJdHBvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGlfcG9ydCksIEdGUF9LRVJORUwpOwogCQlpZiAodHBvcnQgPT0gTlVMTCkgewotCQkJZGV2X2VycigmZGV2LT5kZXYsICIlcyAtIG91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQkJc3RhdHVzID0gLUVOT01FTTsKIAkJCWdvdG8gZnJlZV90cG9ydHM7CiAJCX0KQEAgLTQ3Nyw3ICs0NzEsNyBAQAogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0cG9ydC0+dHBfd3JpdGVfd2FpdCk7CiAJCXRwb3J0LT50cF93cml0ZV9idWYgPSB0aV9idWZfYWxsb2MoKTsKIAkJaWYgKHRwb3J0LT50cF93cml0ZV9idWYgPT0gTlVMTCkgewotCQkJZGV2X2VycigmZGV2LT5kZXYsICIlcyAtIG91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQkJa2ZyZWUodHBvcnQpOwogCQkJc3RhdHVzID0gLUVOT01FTTsKIAkJCWdvdG8gZnJlZV90cG9ydHM7CkBAIC01MTAsNyArNTA0LDcgQEAKIAlzdHJ1Y3QgdGlfZGV2aWNlICp0ZGV2ID0gdXNiX2dldF9zZXJpYWxfZGF0YShzZXJpYWwpOwogCXN0cnVjdCB0aV9wb3J0ICp0cG9ydDsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlmb3IgKGk9MDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKIAkJdHBvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0W2ldKTsKQEAgLTUzOCw3ICs1MzIsNyBAQAogCQkJICAgICBUSV9QSVBFX1RJTUVPVVRfRU5BQkxFIHwgCiAJCQkgICAgIChUSV9UUkFOU0ZFUl9USU1FT1VUIDw8IDIpKTsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAodHBvcnQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC01NjMsMTAgKzU1NywxMCBAQAogCiAJLyogc3RhcnQgaW50ZXJydXB0IHVyYiB0aGUgZmlyc3QgdGltZSBhIHBvcnQgaXMgb3BlbmVkIG9uIHRoaXMgZGV2aWNlICovCiAJaWYgKHRkZXYtPnRkX29wZW5fcG9ydF9jb3VudCA9PSAwKSB7Ci0JCWRiZygiJXMgLSBzdGFydCBpbnRlcnJ1cHQgaW4gdXJiIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHN0YXJ0IGludGVycnVwdCBpbiB1cmIiLCBfX2Z1bmNfXyk7CiAJCXVyYiA9IHRkZXYtPnRkX3NlcmlhbC0+cG9ydFswXS0+aW50ZXJydXB0X2luX3VyYjsKIAkJaWYgKCF1cmIpIHsKLQkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gbm8gaW50ZXJydXB0IHVyYlxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gbm8gaW50ZXJydXB0IHVyYlxuIiwgX19mdW5jX18pOwogCQkJc3RhdHVzID0gLUVJTlZBTDsKIAkJCWdvdG8gcmVsZWFzZV9sb2NrOwogCQl9CkBAIC01NzUsNDAgKzU2OSw0MCBAQAogCQl1cmItPmRldiA9IGRldjsKIAkJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfS0VSTkVMKTsKIAkJaWYgKHN0YXR1cykgewotCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBzdWJtaXQgaW50ZXJydXB0IHVyYiBmYWlsZWQsICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIHN1Ym1pdCBpbnRlcnJ1cHQgdXJiIGZhaWxlZCwgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQkJZ290byByZWxlYXNlX2xvY2s7CiAJCX0KIAl9CiAKIAl0aV9zZXRfdGVybWlvcyhwb3J0LCBwb3J0LT50dHktPnRlcm1pb3MpOwogCi0JZGJnKCIlcyAtIHNlbmRpbmcgVElfT1BFTl9QT1JUIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gc2VuZGluZyBUSV9PUEVOX1BPUlQiLCBfX2Z1bmNfXyk7CiAJc3RhdHVzID0gdGlfY29tbWFuZF9vdXRfc3luYyh0ZGV2LCBUSV9PUEVOX1BPUlQsCiAJCShfX3U4KShUSV9VQVJUMV9QT1JUICsgcG9ydF9udW1iZXIpLCBvcGVuX3NldHRpbmdzLCBOVUxMLCAwKTsKIAlpZiAoc3RhdHVzKSB7Ci0JCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gY2Fubm90IHNlbmQgb3BlbiBjb21tYW5kLCAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGNhbm5vdCBzZW5kIG9wZW4gY29tbWFuZCwgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlnb3RvIHVubGlua19pbnRfdXJiOwogCX0KIAotCWRiZygiJXMgLSBzZW5kaW5nIFRJX1NUQVJUX1BPUlQiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSBzZW5kaW5nIFRJX1NUQVJUX1BPUlQiLCBfX2Z1bmNfXyk7CiAJc3RhdHVzID0gdGlfY29tbWFuZF9vdXRfc3luYyh0ZGV2LCBUSV9TVEFSVF9QT1JULAogCQkoX191OCkoVElfVUFSVDFfUE9SVCArIHBvcnRfbnVtYmVyKSwgMCwgTlVMTCwgMCk7CiAJaWYgKHN0YXR1cykgewotCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGNhbm5vdCBzZW5kIHN0YXJ0IGNvbW1hbmQsICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gY2Fubm90IHNlbmQgc3RhcnQgY29tbWFuZCwgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlnb3RvIHVubGlua19pbnRfdXJiOwogCX0KIAotCWRiZygiJXMgLSBzZW5kaW5nIFRJX1BVUkdFX1BPUlQiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSBzZW5kaW5nIFRJX1BVUkdFX1BPUlQiLCBfX2Z1bmNfXyk7CiAJc3RhdHVzID0gdGlfY29tbWFuZF9vdXRfc3luYyh0ZGV2LCBUSV9QVVJHRV9QT1JULAogCQkoX191OCkoVElfVUFSVDFfUE9SVCArIHBvcnRfbnVtYmVyKSwgVElfUFVSR0VfSU5QVVQsIE5VTEwsIDApOwogCWlmIChzdGF0dXMpIHsKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBjYW5ub3QgY2xlYXIgaW5wdXQgYnVmZmVycywgJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBjYW5ub3QgY2xlYXIgaW5wdXQgYnVmZmVycywgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlnb3RvIHVubGlua19pbnRfdXJiOwogCX0KIAlzdGF0dXMgPSB0aV9jb21tYW5kX291dF9zeW5jKHRkZXYsIFRJX1BVUkdFX1BPUlQsCiAJCShfX3U4KShUSV9VQVJUMV9QT1JUICsgcG9ydF9udW1iZXIpLCBUSV9QVVJHRV9PVVRQVVQsIE5VTEwsIDApOwogCWlmIChzdGF0dXMpIHsKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBjYW5ub3QgY2xlYXIgb3V0cHV0IGJ1ZmZlcnMsICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gY2Fubm90IGNsZWFyIG91dHB1dCBidWZmZXJzLCAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCWdvdG8gdW5saW5rX2ludF91cmI7CiAJfQogCkBAIC02MTksMjcgKzYxMywyNyBAQAogCiAJdGlfc2V0X3Rlcm1pb3MocG9ydCwgcG9ydC0+dHR5LT50ZXJtaW9zKTsKIAotCWRiZygiJXMgLSBzZW5kaW5nIFRJX09QRU5fUE9SVCAoMikiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSBzZW5kaW5nIFRJX09QRU5fUE9SVCAoMikiLCBfX2Z1bmNfXyk7CiAJc3RhdHVzID0gdGlfY29tbWFuZF9vdXRfc3luYyh0ZGV2LCBUSV9PUEVOX1BPUlQsCiAJCShfX3U4KShUSV9VQVJUMV9QT1JUICsgcG9ydF9udW1iZXIpLCBvcGVuX3NldHRpbmdzLCBOVUxMLCAwKTsKIAlpZiAoc3RhdHVzKSB7Ci0JCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gY2Fubm90IHNlbmQgb3BlbiBjb21tYW5kICgyKSwgJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBjYW5ub3Qgc2VuZCBvcGVuIGNvbW1hbmQgKDIpLCAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCWdvdG8gdW5saW5rX2ludF91cmI7CiAJfQogCi0JZGJnKCIlcyAtIHNlbmRpbmcgVElfU1RBUlRfUE9SVCAoMikiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSBzZW5kaW5nIFRJX1NUQVJUX1BPUlQgKDIpIiwgX19mdW5jX18pOwogCXN0YXR1cyA9IHRpX2NvbW1hbmRfb3V0X3N5bmModGRldiwgVElfU1RBUlRfUE9SVCwKIAkJKF9fdTgpKFRJX1VBUlQxX1BPUlQgKyBwb3J0X251bWJlciksIDAsIE5VTEwsIDApOwogCWlmIChzdGF0dXMpIHsKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBjYW5ub3Qgc2VuZCBzdGFydCBjb21tYW5kICgyKSwgJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBjYW5ub3Qgc2VuZCBzdGFydCBjb21tYW5kICgyKSwgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlnb3RvIHVubGlua19pbnRfdXJiOwogCX0KIAogCS8qIHN0YXJ0IHJlYWQgdXJiICovCi0JZGJnKCIlcyAtIHN0YXJ0IHJlYWQgdXJiIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gc3RhcnQgcmVhZCB1cmIiLCBfX2Z1bmNfXyk7CiAJdXJiID0gcG9ydC0+cmVhZF91cmI7CiAJaWYgKCF1cmIpIHsKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBubyByZWFkIHVyYlxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBubyByZWFkIHVyYlxuIiwgX19mdW5jX18pOwogCQlzdGF0dXMgPSAtRUlOVkFMOwogCQlnb3RvIHVubGlua19pbnRfdXJiOwogCX0KQEAgLTY0OSw3ICs2NDMsNyBAQAogCXVyYi0+ZGV2ID0gZGV2OwogCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0YXR1cykgewotCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIHN1Ym1pdCByZWFkIHVyYiBmYWlsZWQsICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gc3VibWl0IHJlYWQgdXJiIGZhaWxlZCwgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlnb3RvIHVubGlua19pbnRfdXJiOwogCX0KIApAQCAtNjYzLDcgKzY1Nyw3IEBACiAJCXVzYl9raWxsX3VyYihwb3J0LT5zZXJpYWwtPnBvcnRbMF0tPmludGVycnVwdF9pbl91cmIpOwogcmVsZWFzZV9sb2NrOgogCW11dGV4X3VubG9jaygmdGRldi0+dGRfb3Blbl9jbG9zZV9sb2NrKTsKLQlkYmcoIiVzIC0gZXhpdCAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwlkYmcoIiVzIC0gZXhpdCAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTY3Niw3ICs2NzAsNyBAQAogCWludCBzdGF0dXM7CiAJaW50IGRvX3VubG9jazsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJCQkgCiAJdGRldiA9IHVzYl9nZXRfc2VyaWFsX2RhdGEocG9ydC0+c2VyaWFsKTsKIAl0cG9ydCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKQEAgLTY5MywxMSArNjg3LDExIEBACiAKIAlwb3J0X251bWJlciA9IHBvcnQtPm51bWJlciAtIHBvcnQtPnNlcmlhbC0+bWlub3I7CiAKLQlkYmcoIiVzIC0gc2VuZGluZyBUSV9DTE9TRV9QT1JUIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gc2VuZGluZyBUSV9DTE9TRV9QT1JUIiwgX19mdW5jX18pOwogCXN0YXR1cyA9IHRpX2NvbW1hbmRfb3V0X3N5bmModGRldiwgVElfQ0xPU0VfUE9SVCwKIAkJICAgICAoX191OCkoVElfVUFSVDFfUE9SVCArIHBvcnRfbnVtYmVyKSwgMCwgTlVMTCwgMCk7CiAJaWYgKHN0YXR1cykKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBjYW5ub3Qgc2VuZCBjbG9zZSBwb3J0IGNvbW1hbmQsICVkXG4iICwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGNhbm5vdCBzZW5kIGNsb3NlIHBvcnQgY29tbWFuZCwgJWRcbiIgLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAogCS8qIGlmIG11dGV4X2xvY2sgaXMgaW50ZXJydXB0ZWQsIGNvbnRpbnVlIGFueXdheSAqLwogCWRvX3VubG9jayA9ICFtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnRkZXYtPnRkX29wZW5fY2xvc2VfbG9jayk7CkBAIC03MTAsNyArNzA0LDcgQEAKIAlpZiAoZG9fdW5sb2NrKQogCQltdXRleF91bmxvY2soJnRkZXYtPnRkX29wZW5fY2xvc2VfbG9jayk7CiAKLQlkYmcoIiVzIC0gZXhpdCIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIGV4aXQiLCBfX2Z1bmNfXyk7CiB9CiAKIApAQCAtNzIwLDEwICs3MTQsMTAgQEAKIAlzdHJ1Y3QgdGlfcG9ydCAqdHBvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoY291bnQgPT0gMCkgewotCQlkYmcoIiVzIC0gd3JpdGUgcmVxdWVzdCBvZiAwIGJ5dGVzIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHdyaXRlIHJlcXVlc3Qgb2YgMCBieXRlcyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC03NDYsNyArNzQwLDcgQEAKIAlpbnQgcm9vbSA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAodHBvcnQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC03NTUsNyArNzQ5LDcgQEAKIAlyb29tID0gdGlfYnVmX3NwYWNlX2F2YWlsKHRwb3J0LT50cF93cml0ZV9idWYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwb3J0LT50cF9sb2NrLCBmbGFncyk7CiAKLQlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgcm9vbSk7CisJZGJnKCIlcyAtIHJldHVybnMgJWQiLCBfX2Z1bmNfXywgcm9vbSk7CiAJcmV0dXJuIHJvb207CiB9CiAKQEAgLTc2Niw3ICs3NjAsNyBAQAogCWludCBjaGFycyA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAodHBvcnQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC03NzUsNyArNzY5LDcgQEAKIAljaGFycyA9IHRpX2J1Zl9kYXRhX2F2YWlsKHRwb3J0LT50cF93cml0ZV9idWYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwb3J0LT50cF9sb2NrLCBmbGFncyk7CiAKLQlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgY2hhcnMpOworCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19mdW5jX18sIGNoYXJzKTsKIAlyZXR1cm4gY2hhcnM7CiB9CiAKQEAgLTc4NSwxNCArNzc5LDE0IEBACiAJc3RydWN0IHRpX3BvcnQgKnRwb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKHRwb3J0ID09IE5VTEwpCiAJCXJldHVybjsKIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAoIXR0eSkgewotCQlkYmcoIiVzIC0gbm8gdHR5IiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIG5vIHR0eSIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtODA4LDIxICs4MDIsMjEgQEAKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCWludCBzdGF0dXM7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKHRwb3J0ID09IE5VTEwpCiAJCXJldHVybjsKIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAoIXR0eSkgewotCQlkYmcoIiVzIC0gbm8gdHR5IiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIG5vIHR0eSIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmIChJX0lYT0ZGKHR0eSkgfHwgQ19DUlRTQ1RTKHR0eSkpIHsKIAkJc3RhdHVzID0gdGlfcmVzdGFydF9yZWFkKHRwb3J0LCB0dHkpOwogCQlpZiAoc3RhdHVzKQotCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBjYW5ub3QgcmVzdGFydCByZWFkLCAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBjYW5ub3QgcmVzdGFydCByZWFkLCAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJfQogfQogCkBAIC04MzQsMjQgKzgyOCwyNCBAQAogCXN0cnVjdCBhc3luY19pY291bnQgY25vdzsKIAlzdHJ1Y3QgYXN5bmNfaWNvdW50IGNwcmV2OwogCi0JZGJnKCIlcyAtIHBvcnQgJWQsIGNtZCA9IDB4JTA0WCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjbWQpOworCWRiZygiJXMgLSBwb3J0ICVkLCBjbWQgPSAweCUwNFgiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCBjbWQpOwogCiAJaWYgKHRwb3J0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCiAJc3dpdGNoIChjbWQpIHsKIAkJY2FzZSBUSU9DR1NFUklBTDoKLQkJCWRiZygiJXMgLSAoJWQpIFRJT0NHU0VSSUFMIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCQkJZGJnKCIlcyAtICglZCkgVElPQ0dTRVJJQUwiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAkJCXJldHVybiB0aV9nZXRfc2VyaWFsX2luZm8odHBvcnQsIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKilhcmcpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBUSU9DU1NFUklBTDoKLQkJCWRiZygiJXMgLSAoJWQpIFRJT0NTU0VSSUFMIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCQkJZGJnKCIlcyAtICglZCkgVElPQ1NTRVJJQUwiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAkJCXJldHVybiB0aV9zZXRfc2VyaWFsX2luZm8odHBvcnQsIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKilhcmcpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBUSU9DTUlXQUlUOgotCQkJZGJnKCIlcyAtICglZCkgVElPQ01JV0FJVCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwkJCWRiZygiJXMgLSAoJWQpIFRJT0NNSVdBSVQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAkJCWNwcmV2ID0gdHBvcnQtPnRwX2ljb3VudDsKIAkJCXdoaWxlICgxKSB7CiAJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmdHBvcnQtPnRwX21zcl93YWl0KTsKQEAgLTg3Miw3ICs4NjYsNyBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBUSU9DR0lDT1VOVDoKLQkJCWRiZygiJXMgLSAoJWQpIFRJT0NHSUNPVU5UIFJYPSVkLCBUWD0lZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCB0cG9ydC0+dHBfaWNvdW50LnJ4LCB0cG9ydC0+dHBfaWNvdW50LnR4KTsKKwkJCWRiZygiJXMgLSAoJWQpIFRJT0NHSUNPVU5UIFJYPSVkLCBUWD0lZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIHRwb3J0LT50cF9pY291bnQucngsIHRwb3J0LT50cF9pY291bnQudHgpOwogCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ0cG9ydC0+dHBfaWNvdW50LCBzaXplb2YodHBvcnQtPnRwX2ljb3VudCkpKQogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJcmV0dXJuIDA7CkBAIC04OTQsMjAgKzg4OCwyMCBAQAogCWludCBwb3J0X251bWJlciA9IHBvcnQtPm51bWJlciAtIHBvcnQtPnNlcmlhbC0+bWlub3I7CiAJdW5zaWduZWQgaW50IG1jcjsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAljZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKIAlpZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19pZmxhZzsKIAotCWRiZygiJXMgLSBjZmxhZyAlMDh4LCBpZmxhZyAlMDh4IiwgX19GVU5DVElPTl9fLCBjZmxhZywgaWZsYWcpOwotCWRiZygiJXMgLSBvbGQgY2xmYWcgJTA4eCwgb2xkIGlmbGFnICUwOHgiLCBfX0ZVTkNUSU9OX18sIG9sZF90ZXJtaW9zLT5jX2NmbGFnLCBvbGRfdGVybWlvcy0+Y19pZmxhZyk7CisJZGJnKCIlcyAtIGNmbGFnICUwOHgsIGlmbGFnICUwOHgiLCBfX2Z1bmNfXywgY2ZsYWcsIGlmbGFnKTsKKwlkYmcoIiVzIC0gb2xkIGNsZmFnICUwOHgsIG9sZCBpZmxhZyAlMDh4IiwgX19mdW5jX18sIG9sZF90ZXJtaW9zLT5jX2NmbGFnLCBvbGRfdGVybWlvcy0+Y19pZmxhZyk7CiAKIAlpZiAodHBvcnQgPT0gTlVMTCkKIAkJcmV0dXJuOwogCiAJY29uZmlnID0ga21hbGxvYyhzaXplb2YoKmNvbmZpZyksIEdGUF9LRVJORUwpOwogCWlmICghY29uZmlnKSB7Ci0JCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTk5MSw3ICs5ODUsNyBAQAogCQl0dHlfZW5jb2RlX2JhdWRfcmF0ZSh0dHksIGJhdWQsIGJhdWQpOwogCiAJZGJnKCIlcyAtIEJhdWRSYXRlPSVkLCB3QmF1ZFJhdGU9JWQsIHdGbGFncz0weCUwNFgsIGJEYXRhQml0cz0lZCwgYlBhcml0eT0lZCwgYlN0b3BCaXRzPSVkLCBjWG9uPSVkLCBjWG9mZj0lZCwgYlVhcnRNb2RlPSVkIiwKLQlfX0ZVTkNUSU9OX18sIGJhdWQsIGNvbmZpZy0+d0JhdWRSYXRlLCBjb25maWctPndGbGFncywgY29uZmlnLT5iRGF0YUJpdHMsIGNvbmZpZy0+YlBhcml0eSwgY29uZmlnLT5iU3RvcEJpdHMsIGNvbmZpZy0+Y1hvbiwgY29uZmlnLT5jWG9mZiwgY29uZmlnLT5iVWFydE1vZGUpOworCV9fZnVuY19fLCBiYXVkLCBjb25maWctPndCYXVkUmF0ZSwgY29uZmlnLT53RmxhZ3MsIGNvbmZpZy0+YkRhdGFCaXRzLCBjb25maWctPmJQYXJpdHksIGNvbmZpZy0+YlN0b3BCaXRzLCBjb25maWctPmNYb24sIGNvbmZpZy0+Y1hvZmYsIGNvbmZpZy0+YlVhcnRNb2RlKTsKIAogCWNwdV90b19iZTE2cygmY29uZmlnLT53QmF1ZFJhdGUpOwogCWNwdV90b19iZTE2cygmY29uZmlnLT53RmxhZ3MpOwpAQCAtMTAwMCw3ICs5OTQsNyBAQAogCQkoX191OCkoVElfVUFSVDFfUE9SVCArIHBvcnRfbnVtYmVyKSwgMCwgKF9fdTggKiljb25maWcsCiAJCXNpemVvZigqY29uZmlnKSk7CiAJaWYgKHN0YXR1cykKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBjYW5ub3Qgc2V0IGNvbmZpZyBvbiBwb3J0ICVkLCAlZFxuIiwgX19GVU5DVElPTl9fLCBwb3J0X251bWJlciwgc3RhdHVzKTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBjYW5ub3Qgc2V0IGNvbmZpZyBvbiBwb3J0ICVkLCAlZFxuIiwgX19mdW5jX18sIHBvcnRfbnVtYmVyLCBzdGF0dXMpOwogCiAJLyogU0VUX0NPTkZJRyBhc3NlcnRzIFJUUyBhbmQgRFRSLCByZXNldCB0aGVtIGNvcnJlY3RseSAqLwogCW1jciA9IHRwb3J0LT50cF9zaGFkb3dfbWNyOwpAQCAtMTAwOSw3ICsxMDAzLDcgQEAKIAkJbWNyICY9IH4oVElfTUNSX0RUUiB8IFRJX01DUl9SVFMpOwogCXN0YXR1cyA9IHRpX3NldF9tY3IodHBvcnQsIG1jcik7CiAJaWYgKHN0YXR1cykKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBjYW5ub3Qgc2V0IG1vZGVtIGNvbnRyb2wgb24gcG9ydCAlZCwgJWRcbiIsIF9fRlVOQ1RJT05fXywgcG9ydF9udW1iZXIsIHN0YXR1cyk7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gY2Fubm90IHNldCBtb2RlbSBjb250cm9sIG9uIHBvcnQgJWQsICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9udW1iZXIsIHN0YXR1cyk7CiAKIAlrZnJlZShjb25maWcpOwogfQpAQCAtMTAyMSwxNCArMTAxNSwxNyBAQAogCXVuc2lnbmVkIGludCByZXN1bHQ7CiAJdW5zaWduZWQgaW50IG1zcjsKIAl1bnNpZ25lZCBpbnQgbWNyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKHRwb3J0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRwb3J0LT50cF9sb2NrLCBmbGFncyk7CiAJbXNyID0gdHBvcnQtPnRwX21zcjsKIAltY3IgPSB0cG9ydC0+dHBfc2hhZG93X21jcjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cG9ydC0+dHBfbG9jaywgZmxhZ3MpOwogCiAJcmVzdWx0ID0gKChtY3IgJiBUSV9NQ1JfRFRSKSA/IFRJT0NNX0RUUiA6IDApCiAJCXwgKChtY3IgJiBUSV9NQ1JfUlRTKSA/IFRJT0NNX1JUUyA6IDApCkBAIC0xMDM4LDcgKzEwMzUsNyBAQAogCQl8ICgobXNyICYgVElfTVNSX1JJKSA/IFRJT0NNX1JJIDogMCkKIAkJfCAoKG1zciAmIFRJX01TUl9EU1IpID8gVElPQ01fRFNSIDogMCk7CiAKLQlkYmcoIiVzIC0gMHglMDRYIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCWRiZygiJXMgLSAweCUwNFgiLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0xMDQ5LDEyICsxMDQ2LDE0IEBACiB7CiAJc3RydWN0IHRpX3BvcnQgKnRwb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGludCBtY3I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAodHBvcnQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHBvcnQtPnRwX2xvY2ssIGZsYWdzKTsKIAltY3IgPSB0cG9ydC0+dHBfc2hhZG93X21jcjsKIAogCWlmIChzZXQgJiBUSU9DTV9SVFMpCkBAIC0xMDcwLDYgKzEwNjksNyBAQAogCQltY3IgJj0gflRJX01DUl9EVFI7CiAJaWYgKGNsZWFyICYgVElPQ01fTE9PUCkKIAkJbWNyICY9IH5USV9NQ1JfTE9PUDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cG9ydC0+dHBfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIHRpX3NldF9tY3IodHBvcnQsIG1jcik7CiB9CkBAIC0xMDgwLDcgKzEwODAsNyBAQAogCXN0cnVjdCB0aV9wb3J0ICp0cG9ydCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlpbnQgc3RhdHVzOwogCi0JZGJnKCIlcyAtIHN0YXRlID0gJWQiLCBfX0ZVTkNUSU9OX18sIGJyZWFrX3N0YXRlKTsKKwlkYmcoIiVzIC0gc3RhdGUgPSAlZCIsIF9fZnVuY19fLCBicmVha19zdGF0ZSk7CiAKIAlpZiAodHBvcnQgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtMTA5MiwxMyArMTA5MiwxMyBAQAogCQlUSV9MQ1JfQlJFQUssIGJyZWFrX3N0YXRlID09IC0xID8gVElfTENSX0JSRUFLIDogMCk7CiAKIAlpZiAoc3RhdHVzKQotCQlkYmcoIiVzIC0gZXJyb3Igc2V0dGluZyBicmVhaywgJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRiZygiJXMgLSBlcnJvciBzZXR0aW5nIGJyZWFrLCAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogfQogCiAKIHN0YXRpYyB2b2lkIHRpX2ludGVycnVwdF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHRpX2RldmljZSAqdGRldiA9IChzdHJ1Y3QgdGlfZGV2aWNlICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB0aV9kZXZpY2UgKnRkZXYgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gdGRldi0+dGRfc2VyaWFsOwogCXN0cnVjdCB0aV9wb3J0ICp0cG9ydDsKQEAgLTExMTEsNyArMTExMSw3IEBACiAJaW50IHJldHZhbDsKIAlfX3U4IG1zcjsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlzd2l0Y2ggKHN0YXR1cykgewogCWNhc2UgMDoKQEAgLTExMTksMzMgKzExMTksMzMgQEAKIAljYXNlIC1FQ09OTlJFU0VUOgogCWNhc2UgLUVOT0VOVDoKIAljYXNlIC1FU0hVVERPV046Ci0JCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biwgJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biwgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJdGRldi0+dGRfdXJiX2Vycm9yID0gMTsKIAkJcmV0dXJuOwogCWRlZmF1bHQ6CiAJCWRldl9lcnIoZGV2LCAiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMsICVkXG4iLAotCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJX19mdW5jX18sIHN0YXR1cyk7CiAJCXRkZXYtPnRkX3VyYl9lcnJvciA9IDE7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlpZiAobGVuZ3RoICE9IDIpIHsKLQkJZGJnKCIlcyAtIGJhZCBwYWNrZXQgc2l6ZSwgJWQiLCBfX0ZVTkNUSU9OX18sIGxlbmd0aCk7CisJCWRiZygiJXMgLSBiYWQgcGFja2V0IHNpemUsICVkIiwgX19mdW5jX18sIGxlbmd0aCk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlpZiAoZGF0YVswXSA9PSBUSV9DT0RFX0hBUkRXQVJFX0VSUk9SKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXMgLSBoYXJkd2FyZSBlcnJvciwgJWRcbiIsIF9fRlVOQ1RJT05fXywgZGF0YVsxXSk7CisJCWRldl9lcnIoZGV2LCAiJXMgLSBoYXJkd2FyZSBlcnJvciwgJWRcbiIsIF9fZnVuY19fLCBkYXRhWzFdKTsKIAkJZ290byBleGl0OwogCX0KIAogCXBvcnRfbnVtYmVyID0gVElfR0VUX1BPUlRfRlJPTV9DT0RFKGRhdGFbMF0pOwogCWZ1bmN0aW9uID0gVElfR0VUX0ZVTkNfRlJPTV9DT0RFKGRhdGFbMF0pOwogCi0JZGJnKCIlcyAtIHBvcnRfbnVtYmVyICVkLCBmdW5jdGlvbiAlZCwgZGF0YSAweCUwMlgiLCBfX0ZVTkNUSU9OX18sIHBvcnRfbnVtYmVyLCBmdW5jdGlvbiwgZGF0YVsxXSk7CisJZGJnKCIlcyAtIHBvcnRfbnVtYmVyICVkLCBmdW5jdGlvbiAlZCwgZGF0YSAweCUwMlgiLCBfX2Z1bmNfXywgcG9ydF9udW1iZXIsIGZ1bmN0aW9uLCBkYXRhWzFdKTsKIAogCWlmIChwb3J0X251bWJlciA+PSBzZXJpYWwtPm51bV9wb3J0cykgewotCQlkZXZfZXJyKGRldiwgIiVzIC0gYmFkIHBvcnQgbnVtYmVyLCAlZFxuIiwgX19GVU5DVElPTl9fLCBwb3J0X251bWJlcik7CisJCWRldl9lcnIoZGV2LCAiJXMgLSBiYWQgcG9ydCBudW1iZXIsICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9udW1iZXIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0xMTU3LDE3ICsxMTU3LDE3IEBACiAKIAlzd2l0Y2ggKGZ1bmN0aW9uKSB7CiAJY2FzZSBUSV9DT0RFX0RBVEFfRVJST1I6Ci0JCWRldl9lcnIoZGV2LCAiJXMgLSBEQVRBIEVSUk9SLCBwb3J0ICVkLCBkYXRhIDB4JTAyWFxuIiwgX19GVU5DVElPTl9fLCBwb3J0X251bWJlciwgZGF0YVsxXSk7CisJCWRldl9lcnIoZGV2LCAiJXMgLSBEQVRBIEVSUk9SLCBwb3J0ICVkLCBkYXRhIDB4JTAyWFxuIiwgX19mdW5jX18sIHBvcnRfbnVtYmVyLCBkYXRhWzFdKTsKIAkJYnJlYWs7CiAKIAljYXNlIFRJX0NPREVfTU9ERU1fU1RBVFVTOgogCQltc3IgPSBkYXRhWzFdOwotCQlkYmcoIiVzIC0gcG9ydCAlZCwgbXNyIDB4JTAyWCIsIF9fRlVOQ1RJT05fXywgcG9ydF9udW1iZXIsIG1zcik7CisJCWRiZygiJXMgLSBwb3J0ICVkLCBtc3IgMHglMDJYIiwgX19mdW5jX18sIHBvcnRfbnVtYmVyLCBtc3IpOwogCQl0aV9oYW5kbGVfbmV3X21zcih0cG9ydCwgbXNyKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlkZXZfZXJyKGRldiwgIiVzIC0gdW5rbm93biBpbnRlcnJ1cHQgY29kZSwgMHglMDJYXG4iLCBfX0ZVTkNUSU9OX18sIGRhdGFbMV0pOworCQlkZXZfZXJyKGRldiwgIiVzIC0gdW5rbm93biBpbnRlcnJ1cHQgY29kZSwgMHglMDJYXG4iLCBfX2Z1bmNfXywgZGF0YVsxXSk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTE3NSwxOSArMTE3NSwxOSBAQAogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJldHZhbCkKIAkJZGV2X2VycihkZXYsICIlcyAtIHJlc3VibWl0IGludGVycnVwdCB1cmIgZmFpbGVkLCAlZFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwkJCV9fZnVuY19fLCByZXR2YWwpOwogfQogCiAKIHN0YXRpYyB2b2lkIHRpX2J1bGtfaW5fY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB0aV9wb3J0ICp0cG9ydCA9IChzdHJ1Y3QgdGlfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdGlfcG9ydCAqdHBvcnQgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHRwb3J0LT50cF9wb3J0OwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ1cmItPmRldi0+ZGV2OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAlpbnQgcmV0dmFsID0gMDsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlzd2l0Y2ggKHN0YXR1cykgewogCWNhc2UgMDoKQEAgLTExOTUsMTMgKzExOTUsMTMgQEAKIAljYXNlIC1FQ09OTlJFU0VUOgogCWNhc2UgLUVOT0VOVDoKIAljYXNlIC1FU0hVVERPV046Ci0JCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biwgJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biwgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJdHBvcnQtPnRwX3RkZXYtPnRkX3VyYl9lcnJvciA9IDE7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHBvcnQtPnRwX3dyaXRlX3dhaXQpOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJZGV2X2VycihkZXYsICIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cywgJWRcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyApOworCQkJX19mdW5jX18sIHN0YXR1cyApOwogCQl0cG9ydC0+dHBfdGRldi0+dGRfdXJiX2Vycm9yID0gMTsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0cG9ydC0+dHBfd3JpdGVfd2FpdCk7CiAJfQpAQCAtMTIxMCwxNiArMTIxMCwxNiBAQAogCQlnb3RvIGV4aXQ7CiAKIAlpZiAoc3RhdHVzKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXMgLSBzdG9wcGluZyByZWFkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VycihkZXYsICIlcyAtIHN0b3BwaW5nIHJlYWQhXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAocG9ydC0+dHR5ICYmIHVyYi0+YWN0dWFsX2xlbmd0aCkgewotCQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsIGRldiwgX19GVU5DVElPTl9fLAorCQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsIGRldiwgX19mdW5jX18sCiAJCQl1cmItPmFjdHVhbF9sZW5ndGgsIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIAogCQlpZiAoIXRwb3J0LT50cF9pc19vcGVuKQotCQkJZGJnKCIlcyAtIHBvcnQgY2xvc2VkLCBkcm9wcGluZyBkYXRhIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBwb3J0IGNsb3NlZCwgZHJvcHBpbmcgZGF0YSIsIF9fZnVuY19fKTsKIAkJZWxzZQogCQkJdGlfcmVjdigmdXJiLT5kZXYtPmRldiwgcG9ydC0+dHR5LCB1cmItPnRyYW5zZmVyX2J1ZmZlciwKIAkJCQl1cmItPmFjdHVhbF9sZW5ndGgpOwpAQCAtMTI0MSwxOCArMTI0MSwxOCBAQAogCXNwaW5fdW5sb2NrKCZ0cG9ydC0+dHBfbG9jayk7CiAJaWYgKHJldHZhbCkKIAkJZGV2X2VycihkZXYsICIlcyAtIHJlc3VibWl0IHJlYWQgdXJiIGZhaWxlZCwgJWRcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCQlfX2Z1bmNfXywgcmV0dmFsKTsKIH0KIAogCiBzdGF0aWMgdm9pZCB0aV9idWxrX291dF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHRpX3BvcnQgKnRwb3J0ID0gKHN0cnVjdCB0aV9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB0aV9wb3J0ICp0cG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHBvcnQtPnRwX3BvcnQ7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnVyYi0+ZGV2LT5kZXY7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXRwb3J0LT50cF93cml0ZV91cmJfaW5fdXNlID0gMDsKIApAQCAtMTI2MiwxMyArMTI2MiwxMyBAQAogCWNhc2UgLUVDT05OUkVTRVQ6CiAJY2FzZSAtRU5PRU5UOgogCWNhc2UgLUVTSFVURE9XTjoKLQkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duLCAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duLCAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQl0cG9ydC0+dHBfdGRldi0+dGRfdXJiX2Vycm9yID0gMTsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0cG9ydC0+dHBfd3JpdGVfd2FpdCk7CiAJCXJldHVybjsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKGRldiwgIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzLCAlZFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCV9fZnVuY19fLCBzdGF0dXMpOwogCQl0cG9ydC0+dHBfdGRldi0+dGRfdXJiX2Vycm9yID0gMTsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0cG9ydC0+dHBfd3JpdGVfd2FpdCk7CiAJfQpAQCAtMTI4Niw3ICsxMjg2LDcgQEAKIAlkbyB7CiAJCWNudCA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgbGVuZ3RoKTsKIAkJaWYgKGNudCA8IGxlbmd0aCkgewotCQkJZGV2X2VycihkZXYsICIlcyAtIGRyb3BwaW5nIGRhdGEsICVkIGJ5dGVzIGxvc3RcbiIsIF9fRlVOQ1RJT05fXywgbGVuZ3RoIC0gY250KTsKKwkJCWRldl9lcnIoZGV2LCAiJXMgLSBkcm9wcGluZyBkYXRhLCAlZCBieXRlcyBsb3N0XG4iLCBfX2Z1bmNfXywgbGVuZ3RoIC0gY250KTsKIAkJCWlmKGNudCA9PSAwKQogCQkJCWJyZWFrOwogCQl9CkBAIC0xMzA3LDcgKzEzMDcsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdHBvcnQtPnRwX2xvY2ssIGZsYWdzKTsKIApAQCAtMTMyOSw3ICsxMzI5LDcgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwb3J0LT50cF9sb2NrLCBmbGFncyk7CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgY291bnQsIHBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLCBjb3VudCwgcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXIpOwogCiAJdXNiX2ZpbGxfYnVsa191cmIocG9ydC0+d3JpdGVfdXJiLCBwb3J0LT5zZXJpYWwtPmRldiwKIAkJCSAgIHVzYl9zbmRidWxrcGlwZShwb3J0LT5zZXJpYWwtPmRldiwKQEAgLTEzMzksNyArMTMzOSw3IEBACiAKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT53cml0ZV91cmIsIEdGUF9BVE9NSUMpOwogCWlmIChyZXN1bHQpIHsKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBzdWJtaXQgd3JpdGUgdXJiIGZhaWxlZCwgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBzdWJtaXQgd3JpdGUgdXJiIGZhaWxlZCwgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCQl0cG9ydC0+dHBfd3JpdGVfdXJiX2luX3VzZSA9IDA7IAogCQkvKiBUT0RPOiByZXNjaGVkdWxlIHRpX3NlbmQgKi8KIAl9IGVsc2UgewpAQCAtMTM1NywxNCArMTM1NywxNyBAQAogCiBzdGF0aWMgaW50IHRpX3NldF9tY3Ioc3RydWN0IHRpX3BvcnQgKnRwb3J0LCB1bnNpZ25lZCBpbnQgbWNyKQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHN0YXR1czsKIAogCXN0YXR1cyA9IHRpX3dyaXRlX2J5dGUodHBvcnQtPnRwX3RkZXYsCiAJCXRwb3J0LT50cF91YXJ0X2Jhc2VfYWRkciArIFRJX1VBUlRfT0ZGU0VUX01DUiwKIAkJVElfTUNSX1JUUyB8IFRJX01DUl9EVFIgfCBUSV9NQ1JfTE9PUCwgbWNyKTsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZ0cG9ydC0+dHBfbG9jaywgZmxhZ3MpOwogCWlmICghc3RhdHVzKQogCQl0cG9ydC0+dHBfc2hhZG93X21jciA9IG1jcjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cG9ydC0+dHBfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTEzNzgsMjMgKzEzODEsMjMgQEAKIAlpbnQgcG9ydF9udW1iZXIgPSBwb3J0LT5udW1iZXIgLSBwb3J0LT5zZXJpYWwtPm1pbm9yOwogCXN0cnVjdCB0aV9wb3J0X3N0YXR1cyAqZGF0YTsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlzaXplID0gc2l6ZW9mKHN0cnVjdCB0aV9wb3J0X3N0YXR1cyk7CiAJZGF0YSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkYXRhKSB7Ci0JCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCXN0YXR1cyA9IHRpX2NvbW1hbmRfaW5fc3luYyh0ZGV2LCBUSV9HRVRfUE9SVF9TVEFUVVMsCiAJCShfX3U4KShUSV9VQVJUMV9QT1JUK3BvcnRfbnVtYmVyKSwgMCwgKF9fdTggKilkYXRhLCBzaXplKTsKIAlpZiAoc3RhdHVzKSB7Ci0JCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZ2V0IHBvcnQgc3RhdHVzIGNvbW1hbmQgZmFpbGVkLCAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGdldCBwb3J0IHN0YXR1cyBjb21tYW5kIGZhaWxlZCwgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlnb3RvIGZyZWVfZGF0YTsKIAl9CiAKLQlkYmcoIiVzIC0gbHNyIDB4JTAyWCIsIF9fRlVOQ1RJT05fXywgZGF0YS0+YkxTUik7CisJZGJnKCIlcyAtIGxzciAweCUwMlgiLCBfX2Z1bmNfXywgZGF0YS0+YkxTUik7CiAKIAl0cG9ydC0+dHBfbHNyID0gZGF0YS0+YkxTUjsKIApAQCAtMTQ1NSw3ICsxNDU4LDcgQEAKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gbXNyIDB4JTAyWCIsIF9fRlVOQ1RJT05fXywgbXNyKTsKKwlkYmcoIiVzIC0gbXNyIDB4JTAyWCIsIF9fZnVuY19fLCBtc3IpOwogCiAJaWYgKG1zciAmIFRJX01TUl9ERUxUQV9NQVNLKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZ0cG9ydC0+dHBfbG9jaywgZmxhZ3MpOwpAQCAtMTQ5Myw3ICsxNDk2LDcgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHBvcnQtPnRwX3BvcnQ7CiAJd2FpdF9xdWV1ZV90IHdhaXQ7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3Bpbl9sb2NrX2lycSgmdHBvcnQtPnRwX2xvY2spOwogCkBAIC0xNjI1LDEyICsxNjI4LDEyIEBACiAJc3RydWN0IHRpX3dyaXRlX2RhdGFfYnl0ZXMgKmRhdGE7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnRkZXYtPnRkX3NlcmlhbC0+ZGV2LT5kZXY7CiAKLQlkYmcoIiVzIC0gYWRkciAweCUwOGxYLCBtYXNrIDB4JTAyWCwgYnl0ZSAweCUwMlgiLCBfX0ZVTkNUSU9OX18sIGFkZHIsIG1hc2ssIGJ5dGUpOworCWRiZygiJXMgLSBhZGRyIDB4JTA4bFgsIG1hc2sgMHglMDJYLCBieXRlIDB4JTAyWCIsIF9fZnVuY19fLCBhZGRyLCBtYXNrLCBieXRlKTsKIAogCXNpemUgPSBzaXplb2Yoc3RydWN0IHRpX3dyaXRlX2RhdGFfYnl0ZXMpICsgMjsKIAlkYXRhID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEpIHsKLQkJZGV2X2VycihkZXYsICIlcyAtIG91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRldl9lcnIoZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTY0Niw3ICsxNjQ5LDcgQEAKIAkJKF9fdTggKilkYXRhLCBzaXplKTsKIAogCWlmIChzdGF0dXMgPCAwKQotCQlkZXZfZXJyKGRldiwgIiVzIC0gZmFpbGVkLCAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkZXZfZXJyKGRldiwgIiVzIC0gZmFpbGVkLCAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAKIAlrZnJlZShkYXRhKTsKIApAQCAtMTY3Myw3ICsxNjc2LDcgQEAKIAlidWZmZXJfc2l6ZSA9IFRJX0ZJUk1XQVJFX0JVRl9TSVpFICsgc2l6ZW9mKHN0cnVjdCB0aV9maXJtd2FyZV9oZWFkZXIpOwogCWJ1ZmZlciA9IGttYWxsb2MoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghYnVmZmVyKSB7Ci0JCWRldl9lcnIoJmRldi0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX0ZVTkNUSU9OX18pOworCQlkZXZfZXJyKCZkZXYtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTE2ODcsNyArMTY5MCw3IEBACiAJaGVhZGVyLT53TGVuZ3RoID0gY3B1X3RvX2xlMTYoKF9fdTE2KShidWZmZXJfc2l6ZSAtIHNpemVvZihzdHJ1Y3QgdGlfZmlybXdhcmVfaGVhZGVyKSkpOwogCWhlYWRlci0+YkNoZWNrU3VtID0gY3M7CiAKLQlkYmcoIiVzIC0gZG93bmxvYWRpbmcgZmlybXdhcmUiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSBkb3dubG9hZGluZyBmaXJtd2FyZSIsIF9fZnVuY19fKTsKIAlmb3IgKHBvcyA9IDA7IHBvcyA8IGJ1ZmZlcl9zaXplOyBwb3MgKz0gZG9uZSkgewogCQlsZW4gPSBtaW4oYnVmZmVyX3NpemUgLSBwb3MsIFRJX0RPV05MT0FEX01BWF9QQUNLRVRfU0laRSk7CiAJCXN0YXR1cyA9IHVzYl9idWxrX21zZyhkZXYsIHBpcGUsIGJ1ZmZlcitwb3MsIGxlbiwgJmRvbmUsIDEwMDApOwpAQCAtMTY5OCwxMSArMTcwMSwxMSBAQAogCWtmcmVlKGJ1ZmZlcik7CiAKIAlpZiAoc3RhdHVzKSB7Ci0JCWRldl9lcnIoJmRldi0+ZGV2LCAiJXMgLSBlcnJvciBkb3dubG9hZGluZyBmaXJtd2FyZSwgJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGV2X2VycigmZGV2LT5kZXYsICIlcyAtIGVycm9yIGRvd25sb2FkaW5nIGZpcm13YXJlLCAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCi0JZGJnKCIlcyAtIGRvd25sb2FkIHN1Y2Nlc3NmdWwiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSBkb3dubG9hZCBzdWNjZXNzZnVsIiwgX19mdW5jX18pOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYwppbmRleCAyMTM4YmE4Li5hOTkzNGEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMKQEAgLTgxLDcgKzgxLDcgQEAKIAl1bnNpZ25lZCBpbnQgaSwgajsKIAlpbnQgZ29vZF9zcG90OwogCi0JZGJnKCIlcyAlZCIsIF9fRlVOQ1RJT05fXywgbnVtX3BvcnRzKTsKKwlkYmcoIiVzICVkIiwgX19mdW5jX18sIG51bV9wb3J0cyk7CiAKIAkqbWlub3IgPSAwOwogCW11dGV4X2xvY2soJnRhYmxlX2xvY2spOwpAQCAtMTAxLDcgKzEwMSw3IEBACiAKIAkJKm1pbm9yID0gaTsKIAkJaiA9IDA7Ci0JCWRiZygiJXMgLSBtaW5vciBiYXNlID0gJWQiLCBfX0ZVTkNUSU9OX18sICptaW5vcik7CisJCWRiZygiJXMgLSBtaW5vciBiYXNlID0gJWQiLCBfX2Z1bmNfXywgKm1pbm9yKTsKIAkJZm9yIChpID0gKm1pbm9yOyAoaSA8ICgqbWlub3IgKyBudW1fcG9ydHMpKSAmJiAoaSA8IFNFUklBTF9UVFlfTUlOT1JTKTsgKytpKSB7CiAJCQlzZXJpYWxfdGFibGVbaV0gPSBzZXJpYWw7CiAJCQlzZXJpYWwtPnBvcnRbaisrXS0+bnVtYmVyID0gaTsKQEAgLTExNyw3ICsxMTcsNyBAQAogewogCWludCBpOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCWlmIChzZXJpYWwgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtMTM1LDcgKzEzNSw3IEBACiAKIAlzZXJpYWwgPSB0b191c2Jfc2VyaWFsKGtyZWYpOwogCi0JZGJnKCIlcyAtICVzIiwgX19GVU5DVElPTl9fLCBzZXJpYWwtPnR5cGUtPmRlc2NyaXB0aW9uKTsKKwlkYmcoIiVzIC0gJXMiLCBfX2Z1bmNfXywgc2VyaWFsLT50eXBlLT5kZXNjcmlwdGlvbik7CiAKIAlzZXJpYWwtPnR5cGUtPnNodXRkb3duKHNlcmlhbCk7CiAKQEAgLTE4Nyw3ICsxODcsNyBAQAogCXVuc2lnbmVkIGludCBwb3J0TnVtYmVyOwogCWludCByZXR2YWw7CiAJCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCS8qIGdldCB0aGUgc2VyaWFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0dHkgcG9pbnRlciAqLwogCXNlcmlhbCA9IHVzYl9zZXJpYWxfZ2V0X2J5X2luZGV4KHR0eS0+aW5kZXgpOwpAQCAtMjU5LDcgKzI1OSw3IEBACiAJaWYgKCFwb3J0KQogCQlyZXR1cm47CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJbXV0ZXhfbG9jaygmcG9ydC0+bXV0ZXgpOwogCkBAIC0yOTksMTEgKzI5OSwxMSBAQAogCWlmICghcG9ydCB8fCBwb3J0LT5zZXJpYWwtPmRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX05PVEFUVEFDSEVEKQogCQlnb3RvIGV4aXQ7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCwgJWQgYnl0ZShzKSIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjb3VudCk7CisJZGJnKCIlcyAtIHBvcnQgJWQsICVkIGJ5dGUocykiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCBjb3VudCk7CiAKIAlpZiAoIXBvcnQtPm9wZW5fY291bnQpIHsKIAkJcmV0dmFsID0gLUVJTlZBTDsKLQkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuZWQiLCBfX2Z1bmNfXyk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTMyMiwxMCArMzIyLDEwIEBACiAJaWYgKCFwb3J0KQogCQlnb3RvIGV4aXQ7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKCFwb3J0LT5vcGVuX2NvdW50KSB7Ci0JCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTM0NCwxMCArMzQ0LDEwIEBACiAJaWYgKCFwb3J0KQogCQlnb3RvIGV4aXQ7CiAKLQlkYmcoIiVzID0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzID0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKCFwb3J0LT5vcGVuX2NvdW50KSB7Ci0JCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTM2NSwxMCArMzY1LDEwIEBACiAJaWYgKCFwb3J0KQogCQlyZXR1cm47CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKCFwb3J0LT5vcGVuX2NvdW50KSB7Ci0JCWRiZyAoIiVzIC0gcG9ydCBub3Qgb3BlbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZyAoIiVzIC0gcG9ydCBub3Qgb3BlbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzg0LDEwICszODQsMTAgQEAKIAlpZiAoIXBvcnQpCiAJCXJldHVybjsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoIXBvcnQtPm9wZW5fY291bnQpIHsKLQkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gcG9ydCBub3Qgb3BlbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNDAxLDEzICs0MDEsMTUgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlpbnQgcmV0dmFsID0gLUVOT0RFVjsKIAorCWxvY2tfa2VybmVsKCk7CiAJaWYgKCFwb3J0KQogCQlnb3RvIGV4aXQ7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCwgY21kIDB4JS40eCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjbWQpOworCWRiZygiJXMgLSBwb3J0ICVkLCBjbWQgMHglLjR4IiwgX19mdW5jX18sIHBvcnQtPm51bWJlciwgY21kKTsKIAorCS8qIENhdXRpb24gLSBwb3J0LT5vcGVuX2NvdW50IGlzIEJLTCBwcm90ZWN0ZWQgKi8KIAlpZiAoIXBvcnQtPm9wZW5fY291bnQpIHsKLQkJZGJnICgiJXMgLSBwb3J0IG5vdCBvcGVuIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnICgiJXMgLSBwb3J0IG5vdCBvcGVuIiwgX19mdW5jX18pOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC00MTYsOCArNDE4LDggQEAKIAkJcmV0dmFsID0gcG9ydC0+c2VyaWFsLT50eXBlLT5pb2N0bChwb3J0LCBmaWxlLCBjbWQsIGFyZyk7CiAJZWxzZQogCQlyZXR2YWwgPSAtRU5PSU9DVExDTUQ7Ci0KIGV4aXQ6CisJdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTQyOCwxMCArNDMwLDEwIEBACiAJaWYgKCFwb3J0KQogCQlyZXR1cm47CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKCFwb3J0LT5vcGVuX2NvdW50KSB7Ci0JCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQ0NiwxOSArNDQ4LDI0IEBACiB7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAKLQlpZiAoIXBvcnQpCisJbG9ja19rZXJuZWwoKTsKKwlpZiAoIXBvcnQpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm47CisJfQogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmICghcG9ydC0+b3Blbl9jb3VudCkgewotCQlkYmcoIiVzIC0gcG9ydCBub3Qgb3BlbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuIiwgX19mdW5jX18pOworCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybjsKIAl9CiAKIAkvKiBwYXNzIG9uIHRvIHRoZSBkcml2ZXIgc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIGlmIGl0IGlzIGF2YWlsYWJsZSAqLwogCWlmIChwb3J0LT5zZXJpYWwtPnR5cGUtPmJyZWFrX2N0bCkKIAkJcG9ydC0+c2VyaWFsLT50eXBlLT5icmVha19jdGwocG9ydCwgYnJlYWtfc3RhdGUpOworCXVubG9ja19rZXJuZWwoKTsKIH0KIAogc3RhdGljIGludCBzZXJpYWxfcmVhZF9wcm9jIChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKQEAgLTQ2OSw3ICs0NzYsNyBAQAogCW9mZl90IGJlZ2luID0gMDsKIAljaGFyIHRtcFs0MF07CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCWxlbmd0aCArPSBzcHJpbnRmIChwYWdlLCAidXNic2VyaW5mbzoxLjAgZHJpdmVyOjIuMFxuIik7CiAJZm9yIChpID0gMDsgaSA8IFNFUklBTF9UVFlfTUlOT1JTICYmIGxlbmd0aCA8IFBBR0VfU0laRTsgKytpKSB7CiAJCXNlcmlhbCA9IHVzYl9zZXJpYWxfZ2V0X2J5X2luZGV4KGkpOwpAQCAtNTE1LDEwICs1MjIsMTAgQEAKIAlpZiAoIXBvcnQpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmICghcG9ydC0+b3Blbl9jb3VudCkgewotCQlkYmcoIiVzIC0gcG9ydCBub3Qgb3BlbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTUzNiwxMCArNTQzLDEwIEBACiAJaWYgKCFwb3J0KQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoIXBvcnQtPm9wZW5fY291bnQpIHsKLQkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gcG9ydCBub3Qgb3BlbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC01NjUsNyArNTcyLDcgQEAKIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQsIHdvcmspOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCQogCWlmICghcG9ydCkKIAkJcmV0dXJuOwpAQCAtNTgxLDcgKzU4OCw3IEBACiB7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHRvX3VzYl9zZXJpYWxfcG9ydChkZXYpOwogCi0JZGJnICgiJXMgLSAlcyIsIF9fRlVOQ1RJT05fXywgZGV2LT5idXNfaWQpOworCWRiZyAoIiVzIC0gJXMiLCBfX2Z1bmNfXywgZGV2LT5idXNfaWQpOwogCXBvcnRfZnJlZShwb3J0KTsKIH0KIApAQCAtNjI3LDcgKzYzNCw3IEBACiAKIAlzZXJpYWwgPSBremFsbG9jKHNpemVvZigqc2VyaWFsKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzZXJpYWwpIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsICIlcyAtIG91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlzZXJpYWwtPmRldiA9IHVzYl9nZXRfZGV2KGRldik7CkBAIC03MjIsNyArNzI5LDcgQEAKIAlzZXJpYWwgPSBjcmVhdGVfc2VyaWFsIChkZXYsIGludGVyZmFjZSwgdHlwZSk7CiAJaWYgKCFzZXJpYWwpIHsKIAkJdW5sb2NrX2tlcm5lbCgpOwotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICIlcyAtIG91dCBvZiBtZW1vcnlcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC04NTQsMjIgKzg2MSw2IEBACiAJc2VyaWFsLT5udW1faW50ZXJydXB0X2luID0gbnVtX2ludGVycnVwdF9pbjsKIAlzZXJpYWwtPm51bV9pbnRlcnJ1cHRfb3V0ID0gbnVtX2ludGVycnVwdF9vdXQ7CiAKLSNpZiAwCi0JLyogY2hlY2sgdGhhdCB0aGUgZGV2aWNlIG1lZXRzIHRoZSBkcml2ZXIncyByZXF1aXJlbWVudHMgKi8KLQlpZiAoKHR5cGUtPm51bV9pbnRlcnJ1cHRfaW4gIT0gTlVNX0RPTlRfQ0FSRSAmJgotCQkJCXR5cGUtPm51bV9pbnRlcnJ1cHRfaW4gIT0gbnVtX2ludGVycnVwdF9pbikKLQkJCXx8ICh0eXBlLT5udW1faW50ZXJydXB0X291dCAhPSBOVU1fRE9OVF9DQVJFICYmCi0JCQkJdHlwZS0+bnVtX2ludGVycnVwdF9vdXQgIT0gbnVtX2ludGVycnVwdF9vdXQpCi0JCQl8fCAodHlwZS0+bnVtX2J1bGtfaW4gIT0gTlVNX0RPTlRfQ0FSRSAmJgotCQkJCXR5cGUtPm51bV9idWxrX2luICE9IG51bV9idWxrX2luKQotCQkJfHwgKHR5cGUtPm51bV9idWxrX291dCAhPSBOVU1fRE9OVF9DQVJFICYmCi0JCQkJdHlwZS0+bnVtX2J1bGtfb3V0ICE9IG51bV9idWxrX291dCkpIHsKLQkJZGJnKCJ3cm9uZyBudW1iZXIgb2YgZW5kcG9pbnRzIik7Ci0JCWtmcmVlKHNlcmlhbCk7Ci0JCXJldHVybiAtRUlPOwotCX0KLSNlbmRpZgotCiAJLyogZm91bmQgYWxsIHRoYXQgd2UgbmVlZCAqLwogCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwgIiVzIGNvbnZlcnRlciBkZXRlY3RlZFxuIiwKIAkJCXR5cGUtPmRlc2NyaXB0aW9uKTsKQEAgLTg4Myw3ICs4NzQsNyBAQAogCXNlcmlhbC0+bnVtX3BvcnRfcG9pbnRlcnMgPSBtYXhfZW5kcG9pbnRzOwogCXVubG9ja19rZXJuZWwoKTsKIAotCWRiZygiJXMgLSBzZXR0aW5nIHVwICVkIHBvcnQgc3RydWN0dXJlcyBmb3IgdGhpcyBkZXZpY2UiLCBfX0ZVTkNUSU9OX18sIG1heF9lbmRwb2ludHMpOworCWRiZygiJXMgLSBzZXR0aW5nIHVwICVkIHBvcnQgc3RydWN0dXJlcyBmb3IgdGhpcyBkZXZpY2UiLCBfX2Z1bmNfXywgbWF4X2VuZHBvaW50cyk7CiAJZm9yIChpID0gMDsgaSA8IG1heF9lbmRwb2ludHM7ICsraSkgewogCQlwb3J0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCksIEdGUF9LRVJORUwpOwogCQlpZiAoIXBvcnQpCkBAIC0xMDMxLDcgKzEwMjIsNyBAQAogCQlwb3J0LT5kZXYucmVsZWFzZSA9ICZwb3J0X3JlbGVhc2U7CiAKIAkJc25wcmludGYgKCZwb3J0LT5kZXYuYnVzX2lkWzBdLCBzaXplb2YocG9ydC0+ZGV2LmJ1c19pZCksICJ0dHlVU0IlZCIsIHBvcnQtPm51bWJlcik7Ci0JCWRiZyAoIiVzIC0gcmVnaXN0ZXJpbmcgJXMiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPmRldi5idXNfaWQpOworCQlkYmcgKCIlcyAtIHJlZ2lzdGVyaW5nICVzIiwgX19mdW5jX18sIHBvcnQtPmRldi5idXNfaWQpOwogCQlyZXR2YWwgPSBkZXZpY2VfcmVnaXN0ZXIoJnBvcnQtPmRldik7CiAJCWlmIChyZXR2YWwpCiAJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICJFcnJvciByZWdpc3RlcmluZyBwb3J0IGRldmljZSwgIgpAQCAtMTA5MCw3ICsxMDgxLDcgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0OwogCiAJdXNiX3NlcmlhbF9jb25zb2xlX2Rpc2Nvbm5lY3Qoc2VyaWFsKTsKLQlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnICgiJXMiLCBfX2Z1bmNfXyk7CiAKIAltdXRleF9sb2NrKCZzZXJpYWwtPmRpc2NfbXV0ZXgpOwogCXVzYl9zZXRfaW50ZmRhdGEgKGludGVyZmFjZSwgTlVMTCk7CkBAIC0xMTc0LDcgKzExNjUsNyBAQAogCiAJcmVzdWx0ID0gYnVzX3JlZ2lzdGVyKCZ1c2Jfc2VyaWFsX2J1c190eXBlKTsKIAlpZiAocmVzdWx0KSB7Ci0JCWVycigiJXMgLSByZWdpc3RlcmluZyBidXMgZHJpdmVyIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisJCWVycigiJXMgLSByZWdpc3RlcmluZyBidXMgZHJpdmVyIGZhaWxlZCIsIF9fZnVuY19fKTsKIAkJZ290byBleGl0X2J1czsKIAl9CiAKQEAgLTExODgsMjQgKzExNzksMjYgQEAKIAl1c2Jfc2VyaWFsX3R0eV9kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVyB8IFRUWV9EUklWRVJfRFlOQU1JQ19ERVY7CiAJdXNiX3NlcmlhbF90dHlfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CiAJdXNiX3NlcmlhbF90dHlfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKwl1c2Jfc2VyaWFsX3R0eV9kcml2ZXItPmluaXRfdGVybWlvcy5jX2lzcGVlZCA9IDk2MDA7CisJdXNiX3NlcmlhbF90dHlfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19vc3BlZWQgPSA5NjAwOwogCXR0eV9zZXRfb3BlcmF0aW9ucyh1c2Jfc2VyaWFsX3R0eV9kcml2ZXIsICZzZXJpYWxfb3BzKTsKIAlyZXN1bHQgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKHVzYl9zZXJpYWxfdHR5X2RyaXZlcik7CiAJaWYgKHJlc3VsdCkgewotCQllcnIoIiVzIC0gdHR5X3JlZ2lzdGVyX2RyaXZlciBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworCQllcnIoIiVzIC0gdHR5X3JlZ2lzdGVyX2RyaXZlciBmYWlsZWQiLCBfX2Z1bmNfXyk7CiAJCWdvdG8gZXhpdF9yZWdfZHJpdmVyOwogCX0KIAogCS8qIHJlZ2lzdGVyIHRoZSBVU0IgZHJpdmVyICovCiAJcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZ1c2Jfc2VyaWFsX2RyaXZlcik7CiAJaWYgKHJlc3VsdCA8IDApIHsKLQkJZXJyKCIlcyAtIHVzYl9yZWdpc3RlciBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworCQllcnIoIiVzIC0gdXNiX3JlZ2lzdGVyIGZhaWxlZCIsIF9fZnVuY19fKTsKIAkJZ290byBleGl0X3R0eTsKIAl9CiAKIAkvKiByZWdpc3RlciB0aGUgZ2VuZXJpYyBkcml2ZXIsIGlmIHdlIHNob3VsZCAqLwogCXJlc3VsdCA9IHVzYl9zZXJpYWxfZ2VuZXJpY19yZWdpc3RlcihkZWJ1Zyk7CiAJaWYgKHJlc3VsdCA8IDApIHsKLQkJZXJyKCIlcyAtIHJlZ2lzdGVyaW5nIGdlbmVyaWMgZHJpdmVyIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisJCWVycigiJXMgLSByZWdpc3RlcmluZyBnZW5lcmljIGRyaXZlciBmYWlsZWQiLCBfX2Z1bmNfXyk7CiAJCWdvdG8gZXhpdF9nZW5lcmljOwogCX0KIApAQCAtMTIyMyw3ICsxMjE2LDcgQEAKIAlidXNfdW5yZWdpc3RlcigmdXNiX3NlcmlhbF9idXNfdHlwZSk7CiAKIGV4aXRfYnVzOgotCWVyciAoIiVzIC0gcmV0dXJuaW5nIHdpdGggZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJZXJyICgiJXMgLSByZXR1cm5pbmcgd2l0aCBlcnJvciAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogCXB1dF90dHlfZHJpdmVyKHVzYl9zZXJpYWxfdHR5X2RyaXZlcik7CiAJcmV0dXJuIHJlc3VsdDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC91c2JfZGVidWcuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC91c2JfZGVidWcuYwppbmRleCAyNTdhNWU0Li5mOWZjOTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiX2RlYnVnLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3VzYl9kZWJ1Zy5jCkBAIC0zNSw5ICszNSw2IEBACiAJCS5uYW1lID0JCSJkZWJ1ZyIsCiAJfSwKIAkuaWRfdGFibGUgPQkJaWRfdGFibGUsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19pbiA9CQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19vdXQgPQkJTlVNX0RPTlRfQ0FSRSwKIAkubnVtX3BvcnRzID0JCTEsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvdmlzb3IuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC92aXNvci5jCmluZGV4IGMyYjAxZjcuLjVmYzIwMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC92aXNvci5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC92aXNvci5jCkBAIC0xODksOSArMTg5LDYgQEAKIAkuZGVzY3JpcHRpb24gPQkJIkhhbmRzcHJpbmcgVmlzb3IgLyBQYWxtIE9TIiwKIAkudXNiX2RyaXZlciA9CQkmdmlzb3JfZHJpdmVyLAogCS5pZF90YWJsZSA9CQlpZF90YWJsZSwKLQkubnVtX2ludGVycnVwdF9pbiA9CU5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX2luID0JCTIsCi0JLm51bV9idWxrX291dCA9CQlOVU1fRE9OVF9DQVJFLAogCS5udW1fcG9ydHMgPQkJMiwKIAkub3BlbiA9CQkJdmlzb3Jfb3BlbiwKIAkuY2xvc2UgPQkJdmlzb3JfY2xvc2UsCkBAIC0yMTksOSArMjE2LDYgQEAKIAkuZGVzY3JpcHRpb24gPQkJIlNvbnkgQ2xpZSA1LjAiLAogCS51c2JfZHJpdmVyID0JCSZ2aXNvcl9kcml2ZXIsCiAJLmlkX3RhYmxlID0JCWNsaWVfaWRfNV90YWJsZSwKLQkubnVtX2ludGVycnVwdF9pbiA9CU5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX2luID0JCTIsCi0JLm51bV9idWxrX291dCA9CQkyLAogCS5udW1fcG9ydHMgPQkJMiwKIAkub3BlbiA9CQkJdmlzb3Jfb3BlbiwKIAkuY2xvc2UgPQkJdmlzb3JfY2xvc2UsCkBAIC0yNDksOSArMjQzLDYgQEAKIAkuZGVzY3JpcHRpb24gPQkJIlNvbnkgQ2xpZSAzLjUiLAogCS51c2JfZHJpdmVyID0JCSZ2aXNvcl9kcml2ZXIsCiAJLmlkX3RhYmxlID0JCWNsaWVfaWRfM181X3RhYmxlLAotCS5udW1faW50ZXJydXB0X2luID0JMCwKLQkubnVtX2J1bGtfaW4gPQkJMSwKLQkubnVtX2J1bGtfb3V0ID0JCTEsCiAJLm51bV9wb3J0cyA9CQkxLAogCS5vcGVuID0JCQl2aXNvcl9vcGVuLAogCS5jbG9zZSA9CQl2aXNvcl9jbG9zZSwKQEAgLTI5MCw3ICsyODEsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJlc3VsdCA9IDA7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKCFwb3J0LT5yZWFkX3VyYikgewogCQkvKiB0aGlzIGlzIG5lZWRlZCBmb3Igc29tZSBicmFpbiBkZWFkIFNvbnkgZGV2aWNlcyAqLwpAQCAtMzIyLDE2ICszMTMsMTYgQEAKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJlc3VsdCkgewogCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCV9fZnVuY19fLCByZXN1bHQpOwogCQlnb3RvIGV4aXQ7CiAJfQogCQogCWlmIChwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiKSB7Ci0JCWRiZygiJXMgLSBhZGRpbmcgaW50ZXJydXB0IGlucHV0IGZvciB0cmVvIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIGFkZGluZyBpbnRlcnJ1cHQgaW5wdXQgZm9yIHRyZW8iLCBfX2Z1bmNfXyk7CiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIsIEdGUF9LRVJORUwpOwogCQlpZiAocmVzdWx0KQogCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiLCBlcnJvciAlZFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQkJX19mdW5jX18sIHJlc3VsdCk7CiAJfQogZXhpdDoJCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTM0Myw3ICszMzQsNyBAQAogCXN0cnVjdCB2aXNvcl9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGNoYXIgKnRyYW5zZmVyX2J1ZmZlcjsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJCQkgCiAJLyogc2h1dGRvd24gb3VyIHVyYnMgKi8KIAl1c2Jfa2lsbF91cmIocG9ydC0+cmVhZF91cmIpOwpAQCAtMzc5LDEyICszNzAsMTIgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBzdGF0dXM7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAlpZiAocHJpdi0+b3V0c3RhbmRpbmdfdXJicyA+IFVSQl9VUFBFUl9MSU1JVCkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCWRiZygiJXMgLSB3cml0ZSBsaW1pdCBoaXRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSB3cml0ZSBsaW1pdCBoaXRcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogCXByaXYtPm91dHN0YW5kaW5nX3VyYnMrKzsKQEAgLTQwNiw3ICszOTcsNyBAQAogCiAJbWVtY3B5IChidWZmZXIsIGJ1ZiwgY291bnQpOwogCi0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIGNvdW50LCBidWZmZXIpOworCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sIGNvdW50LCBidWZmZXIpOwogCiAJdXNiX2ZpbGxfYnVsa191cmIgKHVyYiwgc2VyaWFsLT5kZXYsCiAJCQkgICB1c2Jfc25kYnVsa3BpcGUgKHNlcmlhbC0+ZGV2LApAQCAtNDE4LDcgKzQwOSw3IEBACiAJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAoc3RhdHVzKSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gdXNiX3N1Ym1pdF91cmIod3JpdGUgYnVsaykgZmFpbGVkIHdpdGggc3RhdHVzID0gJWRcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQlfX2Z1bmNfXywgc3RhdHVzKTsKIAkJY291bnQgPSBzdGF0dXM7CiAJCWdvdG8gZXJyb3I7CiAJfSBlbHNlIHsKQEAgLTQ0OSw3ICs0NDAsNyBAQAogCXN0cnVjdCB2aXNvcl9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyoKIAkgKiBXZSByZWFsbHkgY2FuIHRha2UgYW55dGhpbmcgdGhlIHVzZXIgdGhyb3dzIGF0IHVzCkBAIC00NjAsNyArNDUxLDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCWlmIChwcml2LT5vdXRzdGFuZGluZ191cmJzID4gVVJCX1VQUEVSX0xJTUlUICogMiAvIDMpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQlkYmcoIiVzIC0gd3JpdGUgbGltaXQgaGl0XG4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gd3JpdGUgbGltaXQgaGl0XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC00NzEsMTMgKzQ2MiwxNSBAQAogCiBzdGF0aWMgaW50IHZpc29yX2NoYXJzX2luX2J1ZmZlciAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyogCiAJICogV2UgY2FuJ3QgcmVhbGx5IGFjY291bnQgZm9yIGhvdyBtdWNoIGRhdGEgd2UKIAkgKiBoYXZlIHNlbnQgb3V0LCBidXQgaGFzbid0IG1hZGUgaXQgdGhyb3VnaCB0byB0aGUKIAkgKiBkZXZpY2UsIHNvIGp1c3QgdGVsbCB0aGUgdHR5IGxheWVyIHRoYXQgZXZlcnl0aGluZwogCSAqIGlzIGZsdXNoZWQuCisJICoKKwkgKiBGSVhNRTogU2hvdWxkIHdhbGsgb3V0c3RhbmRpbmdfdXJicwogCSAqLwogCXJldHVybiAwOwogfQpAQCAtNDg1LDcgKzQ3OCw3IEBACiAKIHN0YXRpYyB2b2lkIHZpc29yX3dyaXRlX2J1bGtfY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3Qgdmlzb3JfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTQ5MywxMSArNDg2LDExIEBACiAJLyogZnJlZSB1cCB0aGUgdHJhbnNmZXIgYnVmZmVyLCBhcyB1c2JfZnJlZV91cmIoKSBkb2VzIG5vdCBkbyB0aGlzICovCiAJa2ZyZWUgKHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoc3RhdHVzKQogCQlkYmcoIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCS0tcHJpdi0+b3V0c3RhbmRpbmdfdXJiczsKQEAgLTUwOSw3ICs1MDIsNyBAQAogCiBzdGF0aWMgdm9pZCB2aXNvcl9yZWFkX2J1bGtfY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3Qgdmlzb3JfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwpAQCAtNTE3LDE1ICs1MTAsMTUgQEAKIAlpbnQgcmVzdWx0OwogCWludCBhdmFpbGFibGVfcm9vbTsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCWRiZygiJXMgLSBub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCi0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAodHR5ICYmIHVyYi0+YWN0dWFsX2xlbmd0aCkgewpAQCAtNTUxLDcgKzU0NCw3IEBACiAJCQkJICAgdmlzb3JfcmVhZF9idWxrX2NhbGxiYWNrLCBwb3J0KTsKIAkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAocmVzdWx0KQotCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJfSBlbHNlIHsKIAkJcHJpdi0+YWN0dWFsbHlfdGhyb3R0bGVkID0gMTsKIAl9CkBAIC01NjAsNyArNTUzLDcgQEAKIAogc3RhdGljIHZvaWQgdmlzb3JfcmVhZF9pbnRfY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAJaW50IHJlc3VsdDsKIApAQCAtNTczLDExICs1NjYsMTEgQEAKIAljYXNlIC1FU0hVVERPV046CiAJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCiAJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAlkZWZhdWx0OgogCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtNTg4LDE0ICs1ODEsMTQgQEAKIAkgKiBSdW1vciBoYXMgaXQgdGhpcyBlbmRwb2ludCBpcyB1c2VkIHRvIG5vdGlmeSB3aGVuIGRhdGEKIAkgKiBpcyByZWFkeSB0byBiZSByZWFkIGZyb20gdGhlIGJ1bGsgb25lcy4KIAkgKi8KLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLAogCQkJICAgICAgdXJiLT5hY3R1YWxfbGVuZ3RoLCB1cmItPnRyYW5zZmVyX2J1ZmZlcik7CiAKIGV4aXQ6CiAJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlc3VsdCkKIAkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwgIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiXG4iLAotCQkJX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJX19mdW5jX18sIHJlc3VsdCk7CiB9CiAKIHN0YXRpYyB2b2lkIHZpc29yX3Rocm90dGxlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQpAQCAtNjAzLDcgKzU5Niw3IEBACiAJc3RydWN0IHZpc29yX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAlwcml2LT50aHJvdHRsZWQgPSAxOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKQEAgLTYxNiw3ICs2MDksNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJlc3VsdDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAlwcml2LT50aHJvdHRsZWQgPSAwOwogCXByaXYtPmFjdHVhbGx5X3Rocm90dGxlZCA9IDA7CkBAIC02MjUsNyArNjE4LDcgQEAKIAlwb3J0LT5yZWFkX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOwogCWlmIChyZXN1bHQpCi0JCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIH0KIAogc3RhdGljIGludCBwYWxtX29zXzNfcHJvYmUgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKQEAgLTYzOCwxMSArNjMxLDExIEBACiAJaW50IGk7CiAJaW50IG51bV9wb3J0cyA9IDA7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJdHJhbnNmZXJfYnVmZmVyID0ga21hbGxvYyAoc2l6ZW9mICgqY29ubmVjdGlvbl9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0cmFuc2Zlcl9idWZmZXIpIHsKLQkJZGV2X2VycihkZXYsICIlcyAtIGttYWxsb2MoJVpkKSBmYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18sCisJCWRldl9lcnIoZGV2LCAiJXMgLSBrbWFsbG9jKCVaZCkgZmFpbGVkLlxuIiwgX19mdW5jX18sCiAJCQlzaXplb2YoKmNvbm5lY3Rpb25faW5mbykpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC02NTUsNyArNjQ4LDcgQEAKIAkJCQkgIHNpemVvZigqY29ubmVjdGlvbl9pbmZvKSwgMzAwKTsKIAlpZiAocmV0dmFsIDwgMCkgewogCQlkZXZfZXJyKGRldiwgIiVzIC0gZXJyb3IgJWQgZ2V0dGluZyBjb25uZWN0aW9uIGluZm9ybWF0aW9uXG4iLAotCQkJX19GVU5DVElPTl9fLCByZXR2YWwpOworCQkJX19mdW5jX18sIHJldHZhbCk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTcxNSw3ICs3MDgsNyBAQAogCQkJCSAgMHgwMiwgMzAwKTsKIAlpZiAocmV0dmFsIDwgMCkKIAkJZGV2X2VycihkZXYsICIlcyAtIGVycm9yICVkIGdldHRpbmcgYnl0ZXMgYXZhaWxhYmxlIHJlcXVlc3RcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCQlfX2Z1bmNfXywgcmV0dmFsKTsKIAlyZXR2YWwgPSAwOwogCiBleGl0OgpAQCAtNzMxLDExICs3MjQsMTEgQEAKIAl1bnNpZ25lZCBjaGFyICp0cmFuc2Zlcl9idWZmZXI7CiAJaW50IHJldHZhbDsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAl0cmFuc2Zlcl9idWZmZXIgPSAga21hbGxvYyAoc2l6ZW9mICgqY29ubmVjdGlvbl9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0cmFuc2Zlcl9idWZmZXIpIHsKLQkJZGV2X2VycihkZXYsICIlcyAtIGttYWxsb2MoJVpkKSBmYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18sCisJCWRldl9lcnIoZGV2LCAiJXMgLSBrbWFsbG9jKCVaZCkgZmFpbGVkLlxuIiwgX19mdW5jX18sCiAJCQlzaXplb2YoKmNvbm5lY3Rpb25faW5mbykpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC03NDcsOSArNzQwLDkgQEAKIAkJCQkgIHNpemVvZiAoKmNvbm5lY3Rpb25faW5mbyksIDMwMCk7CiAJaWYgKHJldHZhbCA8IDApCiAJCWRldl9lcnIoZGV2LCAiJXMgLSBlcnJvciAlZCBnZXR0aW5nIGNvbm5lY3Rpb24gaW5mb1xuIiwKLQkJCV9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwkJCV9fZnVuY19fLCByZXR2YWwpOwogCWVsc2UKLQkJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmc2VyaWFsLT5kZXYtPmRldiwgX19GVU5DVElPTl9fLAorCQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZzZXJpYWwtPmRldi0+ZGV2LCBfX2Z1bmNfXywKIAkJCQkgICAgICByZXR2YWwsIHRyYW5zZmVyX2J1ZmZlcik7CiAKIAlrZnJlZSAodHJhbnNmZXJfYnVmZmVyKTsKQEAgLTc2Miw3ICs3NTUsNyBAQAogCWludCByZXR2YWwgPSAwOwogCWludCAoKnN0YXJ0dXApIChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCWlmIChzZXJpYWwtPmRldi0+YWN0Y29uZmlnLT5kZXNjLmJDb25maWd1cmF0aW9uVmFsdWUgIT0gMSkgewogCQllcnIoImFjdGl2ZSBjb25maWcgIyVkICE9IDEgPz8iLApAQCAtODE2LDcgKzgwOSw3IEBACiAJaW50IHJlc3VsdDsKIAl1OCBkYXRhOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCS8qCiAJICogTm90ZSB0aGF0IFBFRy0zMDAgc2VyaWVzIGRldmljZXMgZXhwZWN0IHRoZSBmb2xsb3dpbmcgdHdvIGNhbGxzLgpAQCAtODI3LDExICs4MjAsMTEgQEAKIAkJCQkgIFVTQl9SRVFfR0VUX0NPTkZJR1VSQVRJT04sIFVTQl9ESVJfSU4sCiAJCQkJICAwLCAwLCAmZGF0YSwgMSwgMzAwMCk7CiAJaWYgKHJlc3VsdCA8IDApIHsKLQkJZGV2X2VycihkZXYsICIlczogZ2V0IGNvbmZpZyBudW1iZXIgZmFpbGVkOiAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQlkZXZfZXJyKGRldiwgIiVzOiBnZXQgY29uZmlnIG51bWJlciBmYWlsZWQ6ICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAJaWYgKHJlc3VsdCAhPSAxKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IGdldCBjb25maWcgbnVtYmVyIGJhZCByZXR1cm4gbGVuZ3RoOiAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQlkZXZfZXJyKGRldiwgIiVzOiBnZXQgY29uZmlnIG51bWJlciBiYWQgcmV0dXJuIGxlbmd0aDogJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTg0MSwxMSArODM0LDExIEBACiAJCQkJICBVU0JfRElSX0lOIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKIAkJCQkgIDAsIDAsICZkYXRhLCAxLCAzMDAwKTsKIAlpZiAocmVzdWx0IDwgMCkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBnZXQgaW50ZXJmYWNlIG51bWJlciBmYWlsZWQ6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCWRldl9lcnIoZGV2LCAiJXM6IGdldCBpbnRlcmZhY2UgbnVtYmVyIGZhaWxlZDogJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAlpZiAocmVzdWx0ICE9IDEpIHsKLQkJZGV2X2VycihkZXYsICIlczogZ2V0IGludGVyZmFjZSBudW1iZXIgYmFkIHJldHVybiBsZW5ndGg6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCWRldl9lcnIoZGV2LCAiJXM6IGdldCBpbnRlcmZhY2UgbnVtYmVyIGJhZCByZXR1cm4gbGVuZ3RoOiAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtODYzLDcgKzg1Niw3IEBACiAJICAgIChzZXJpYWwtPm51bV9pbnRlcnJ1cHRfaW4gPT0gMCkpCiAJCWdvdG8gZ2VuZXJpY19zdGFydHVwOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCS8qCiAJKiBJdCBhcHBlYXJzIHRoYXQgVHJlb3MgYW5kIEt5b2NlcmFzIHdhbnQgdG8gdXNlIHRoZSAKQEAgLTg5NCw3ICs4ODcsNyBAQAogCiBzdGF0aWMgaW50IGNsaWVfNV9hdHRhY2ggKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7Ci0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCS8qIFRINTUgcmVnaXN0ZXJzIDIgcG9ydHMuIAogCSAgIENvbW11bmljYXRpb24gaW4gZnJvbSB0aGUgVVg1MC9USDU1IHVzZXMgYnVsa19pbl9lbmRwb2ludEFkZHJlc3MgZnJvbSBwb3J0IDAgCkBAIC05MTgsNyArOTExLDcgQEAKIAlzdHJ1Y3Qgdmlzb3JfcHJpdmF0ZSAqcHJpdjsKIAlpbnQgaTsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7IGkrKykgewogCQlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFtpXSk7CkBAIC05MzEsNyArOTI0LDcgQEAKIAogc3RhdGljIGludCB2aXNvcl9pb2N0bCAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKiBmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkYmcoIiVzIC0gcG9ydCAlZCwgY21kIDB4JS40eCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjbWQpOworCWRiZygiJXMgLSBwb3J0ICVkLCBjbWQgMHglLjR4IiwgX19mdW5jX18sIHBvcnQtPm51bWJlciwgY21kKTsKIAogCXJldHVybiAtRU5PSU9DVExDTUQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvd2hpdGVoZWF0LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvd2hpdGVoZWF0LmMKaW5kZXggMzg3MjZlZi4uZTk2YmY4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3doaXRlaGVhdC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC93aGl0ZWhlYXQuYwpAQCAtMTY0LDkgKzE2NCw2IEBACiAJLmRlc2NyaXB0aW9uID0JCSJDb25uZWN0IFRlY2ggLSBXaGl0ZUhFQVQgLSAocHJlcmVudW1lcmF0aW9uKSIsCiAJLnVzYl9kcml2ZXIgPQkJJndoaXRlaGVhdF9kcml2ZXIsCiAJLmlkX3RhYmxlID0JCWlkX3RhYmxlX3ByZXJlbnVtZXJhdGlvbiwKLQkubnVtX2ludGVycnVwdF9pbiA9CU5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX2luID0JCU5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX291dCA9CQlOVU1fRE9OVF9DQVJFLAogCS5udW1fcG9ydHMgPQkJMSwKIAkucHJvYmUgPQkJd2hpdGVoZWF0X2Zpcm13YXJlX2Rvd25sb2FkLAogCS5hdHRhY2ggPQkJd2hpdGVoZWF0X2Zpcm13YXJlX2F0dGFjaCwKQEAgLTE4MCw5ICsxNzcsNiBAQAogCS5kZXNjcmlwdGlvbiA9CQkiQ29ubmVjdCBUZWNoIC0gV2hpdGVIRUFUIiwKIAkudXNiX2RyaXZlciA9CQkmd2hpdGVoZWF0X2RyaXZlciwKIAkuaWRfdGFibGUgPQkJaWRfdGFibGVfc3RkLAotCS5udW1faW50ZXJydXB0X2luID0JTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfaW4gPQkJTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfb3V0ID0JCU5VTV9ET05UX0NBUkUsCiAJLm51bV9wb3J0cyA9CQk0LAogCS5hdHRhY2ggPQkJd2hpdGVoZWF0X2F0dGFjaCwKIAkuc2h1dGRvd24gPQkJd2hpdGVoZWF0X3NodXRkb3duLApAQCAtMjI1LDcgKzIxOSw3IEBACiBzdHJ1Y3Qgd2hpdGVoZWF0X3ByaXZhdGUgewogCXNwaW5sb2NrX3QJCWxvY2s7CiAJX191OAkJCWZsYWdzOwotCV9fdTgJCQltY3I7CisJX191OAkJCW1jcjsJCS8qIEZJWE1FOiBubyBsb2NraW5nIG9uIG1jciAqLwogCXN0cnVjdCBsaXN0X2hlYWQJcnhfdXJic19mcmVlOwogCXN0cnVjdCBsaXN0X2hlYWQJcnhfdXJic19zdWJtaXR0ZWQ7CiAJc3RydWN0IGxpc3RfaGVhZAlyeF91cmJfcTsKQEAgLTI4OCw3ICsyODIsNyBAQAogCWludCByZXNwb25zZTsKIAljb25zdCBzdHJ1Y3Qgd2hpdGVoZWF0X2hleF9yZWNvcmQgKnJlY29yZDsKIAkKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCQogCXJlc3BvbnNlID0gZXp1c2Jfc2V0X3Jlc2V0IChzZXJpYWwsIDEpOwogCkBAIC0yOTgsNyArMjkyLDcgQEAKIAkJCQkodW5zaWduZWQgY2hhciAqKXJlY29yZC0+ZGF0YSwgcmVjb3JkLT5kYXRhX3NpemUsIDB4YTApOwogCQlpZiAocmVzcG9uc2UgPCAwKSB7CiAJCQllcnIoIiVzIC0gZXp1c2Jfd3JpdGVtZW1vcnkgZmFpbGVkIGZvciBsb2FkZXIgKCVkICUwNFggJXAgJWQpIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHJlc3BvbnNlLCByZWNvcmQtPmFkZHJlc3MsIHJlY29yZC0+ZGF0YSwgcmVjb3JkLT5kYXRhX3NpemUpOworCQkJCV9fZnVuY19fLCByZXNwb25zZSwgcmVjb3JkLT5hZGRyZXNzLCByZWNvcmQtPmRhdGEsIHJlY29yZC0+ZGF0YV9zaXplKTsKIAkJCWJyZWFrOwogCQl9CiAJCSsrcmVjb3JkOwpAQCAtMzE1LDcgKzMwOSw3IEBACiAJCQkJKHVuc2lnbmVkIGNoYXIgKilyZWNvcmQtPmRhdGEsIHJlY29yZC0+ZGF0YV9zaXplLCAweGEzKTsKIAkJaWYgKHJlc3BvbnNlIDwgMCkgewogCQkJZXJyKCIlcyAtIGV6dXNiX3dyaXRlbWVtb3J5IGZhaWxlZCBmb3IgZmlyc3QgZmlybXdhcmUgc3RlcCAoJWQgJTA0WCAlcCAlZCkiLCAKLQkJCQlfX0ZVTkNUSU9OX18sIHJlc3BvbnNlLCByZWNvcmQtPmFkZHJlc3MsIHJlY29yZC0+ZGF0YSwgcmVjb3JkLT5kYXRhX3NpemUpOworCQkJCV9fZnVuY19fLCByZXNwb25zZSwgcmVjb3JkLT5hZGRyZXNzLCByZWNvcmQtPmRhdGEsIHJlY29yZC0+ZGF0YV9zaXplKTsKIAkJCWJyZWFrOwogCQl9CiAJCSsrcmVjb3JkOwpAQCAtMzI5LDcgKzMyMyw3IEBACiAJCQkJKHVuc2lnbmVkIGNoYXIgKilyZWNvcmQtPmRhdGEsIHJlY29yZC0+ZGF0YV9zaXplLCAweGEwKTsKIAkJaWYgKHJlc3BvbnNlIDwgMCkgewogCQkJZXJyKCIlcyAtIGV6dXNiX3dyaXRlbWVtb3J5IGZhaWxlZCBmb3Igc2Vjb25kIGZpcm13YXJlIHN0ZXAgKCVkICUwNFggJXAgJWQpIiwgCi0JCQkJX19GVU5DVElPTl9fLCByZXNwb25zZSwgcmVjb3JkLT5hZGRyZXNzLCByZWNvcmQtPmRhdGEsIHJlY29yZC0+ZGF0YV9zaXplKTsKKwkJCQlfX2Z1bmNfXywgcmVzcG9uc2UsIHJlY29yZC0+YWRkcmVzcywgcmVjb3JkLT5kYXRhLCByZWNvcmQtPmRhdGFfc2l6ZSk7CiAJCQlicmVhazsKIAkJfQogCQkrK3JlY29yZDsKQEAgLTU2Nyw3ICs1NjEsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDI7CiAJaW50IGk7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJLyogZnJlZSB1cCBvdXIgcHJpdmF0ZSBkYXRhIGZvciBvdXIgY29tbWFuZCBwb3J0ICovCiAJY29tbWFuZF9wb3J0ID0gc2VyaWFsLT5wb3J0W0NPTU1BTkRfUE9SVF07CkBAIC02MDQsNyArNTk4LDcgQEAKIAlpbnQJCXJldHZhbCA9IDA7CiAJc3RydWN0IGt0ZXJtaW9zCW9sZF90ZXJtOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXJldHZhbCA9IHN0YXJ0X2NvbW1hbmRfcG9ydChwb3J0LT5zZXJpYWwpOwogCWlmIChyZXR2YWwpCkBAIC02MzcsMTQgKzYzMSwxNCBAQAogCS8qIFN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgZGV2aWNlICovCiAJcmV0dmFsID0gc3RhcnRfcG9ydF9yZWFkKHBvcnQpOwogCWlmIChyZXR2YWwpIHsKLQkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fZnVuY19fLCByZXR2YWwpOwogCQlmaXJtX2Nsb3NlKHBvcnQpOwogCQlzdG9wX2NvbW1hbmRfcG9ydChwb3J0LT5zZXJpYWwpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiBleGl0OgotCWRiZygiJXMgLSBleGl0LCByZXR2YWwgPSAlZCIsIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwlkYmcoIiVzIC0gZXhpdCwgcmV0dmFsID0gJWQiLCBfX2Z1bmNfXywgcmV0dmFsKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC02NTcsNyArNjUxLDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJc3RydWN0IGxpc3RfaGVhZCAqdG1wMjsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAltdXRleF9sb2NrKCZwb3J0LT5zZXJpYWwtPmRpc2NfbXV0ZXgpOwogCS8qIGZpbHAgaXMgTlVMTCB3aGVuIGNhbGxlZCBmcm9tIHVzYl9zZXJpYWxfZGlzY29ubmVjdCAqLwpAQCAtNzMyLDEwICs3MjYsMTAgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoY291bnQgPT0gMCkgewotCQlkYmcoIiVzIC0gd3JpdGUgcmVxdWVzdCBvZiAwIGJ5dGVzIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHdyaXRlIHJlcXVlc3Qgb2YgMCBieXRlcyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuICgwKTsKIAl9CiAKQEAgLTc1NCwxMyArNzQ4LDEzIEBACiAJCWJ5dGVzID0gKGNvdW50ID4gcG9ydC0+YnVsa19vdXRfc2l6ZSkgPyBwb3J0LT5idWxrX291dF9zaXplIDogY291bnQ7CiAJCW1lbWNweSAodXJiLT50cmFuc2Zlcl9idWZmZXIsIGJ1ZiArIHNlbnQsIGJ5dGVzKTsKIAotCQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgYnl0ZXMsIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgYnl0ZXMsIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIAogCQl1cmItPmRldiA9IHNlcmlhbC0+ZGV2OwogCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBieXRlczsKIAkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJlc3VsdCkgewotCQkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogCQkJc2VudCA9IHJlc3VsdDsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CiAJCQlsaXN0X2FkZCh0bXAsICZpbmZvLT50eF91cmJzX2ZyZWUpOwpAQCAtNzg2LDcgKzc4MCw3IEBACiAJaW50IHJvb20gPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCQogCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CiAJbGlzdF9mb3JfZWFjaCh0bXAsICZpbmZvLT50eF91cmJzX2ZyZWUpCkBAIC03OTQsNyArNzg4LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CiAJcm9vbSAqPSBwb3J0LT5idWxrX291dF9zaXplOwogCi0JZGJnKCIlcyAtIHJldHVybnMgJWQiLCBfX0ZVTkNUSU9OX18sIHJvb20pOworCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19mdW5jX18sIHJvb20pOwogCXJldHVybiAocm9vbSk7CiB9CiAKQEAgLTgwNCw3ICs3OTgsNyBAQAogCXN0cnVjdCB3aGl0ZWhlYXRfcHJpdmF0ZSAqaW5mbyA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAl1bnNpZ25lZCBpbnQgbW9kZW1fc2lnbmFscyA9IDA7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJZmlybV9nZXRfZHRyX3J0cyhwb3J0KTsKIAlpZiAoaW5mby0+bWNyICYgVUFSVF9NQ1JfRFRSKQpAQCAtODIxLDcgKzgxNSw3IEBACiB7CiAJc3RydWN0IHdoaXRlaGVhdF9wcml2YXRlICppbmZvID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmIChzZXQgJiBUSU9DTV9SVFMpCiAJCWluZm8tPm1jciB8PSBVQVJUX01DUl9SVFM7CkBAIC04NDQsNyArODM4LDcgQEAKIAlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBzZXJzdHJ1Y3Q7CiAJdm9pZCBfX3VzZXIgKnVzZXJfYXJnID0gKHZvaWQgX191c2VyICopYXJnOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQsIGNtZCAweCUuNHgiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlciwgY21kKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCwgY21kIDB4JS40eCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIGNtZCk7CiAKIAlzd2l0Y2ggKGNtZCkgewogCQljYXNlIFRJT0NHU0VSSUFMOgpAQCAtODg2LDcgKzg4MCw3IEBACiAKIHN0YXRpYyB2b2lkIHdoaXRlaGVhdF9zZXRfdGVybWlvcyhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQogewotCWRiZygiJXMgLXBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCWZpcm1fc2V0dXBfcG9ydChwb3J0KTsKIH0KIApAQCAtOTA0LDcgKzg5OCw3IEBACiAJaW50IGNoYXJzID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CiAJbGlzdF9mb3JfZWFjaCh0bXAsICZpbmZvLT50eF91cmJzX3N1Ym1pdHRlZCkgewpAQCAtOTEzLDcgKzkwNyw3IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKIAotCWRiZyAoIiVzIC0gcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgY2hhcnMpOworCWRiZyAoIiVzIC0gcmV0dXJucyAlZCIsIF9fZnVuY19fLCBjaGFycyk7CiAJcmV0dXJuIGNoYXJzOwogfQogCkBAIC05MjMsNyArOTE3LDcgQEAKIAlzdHJ1Y3Qgd2hpdGVoZWF0X3ByaXZhdGUgKmluZm8gPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwogCWluZm8tPmZsYWdzIHw9IFRIUk9UVExFRDsKQEAgLTkzOSw3ICs5MzMsNyBAQAogCWludCBhY3R1YWxseV90aHJvdHRsZWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwogCWFjdHVhbGx5X3Rocm90dGxlZCA9IGluZm8tPmZsYWdzICYgQUNUVUFMTFlfVEhST1RUTEVEOwpAQCAtOTYwLDcgKzk1NCw3IEBACiB7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCWlmIChzdGF0dXMpIHsKIAkJZGJnKCJub256ZXJvIHVyYiBzdGF0dXM6ICVkIiwgc3RhdHVzKTsKQEAgLTk3MSwyOCArOTY1LDI4IEBACiAKIHN0YXRpYyB2b2lkIGNvbW1hbmRfcG9ydF9yZWFkX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpjb21tYW5kX3BvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpjb21tYW5kX3BvcnQgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IHdoaXRlaGVhdF9jb21tYW5kX3ByaXZhdGUgKmNvbW1hbmRfaW5mbzsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAJdW5zaWduZWQgY2hhciAqZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCWludCByZXN1bHQ7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJY29tbWFuZF9pbmZvID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKGNvbW1hbmRfcG9ydCk7CiAJaWYgKCFjb21tYW5kX2luZm8pIHsKLQkJZGJnICgiJXMgLSBjb21tYW5kX2luZm8gaXMgTlVMTCwgZXhpdGluZy4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcgKCIlcyAtIGNvbW1hbmRfaW5mbyBpcyBOVUxMLCBleGl0aW5nLiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAlpZiAoc3RhdHVzKSB7Ci0JCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXM6ICVkIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzOiAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlpZiAoc3RhdHVzICE9IC1FTk9FTlQpCiAJCQljb21tYW5kX2luZm8tPmNvbW1hbmRfZmluaXNoZWQgPSBXSElURUhFQVRfQ01EX0ZBSUxVUkU7CiAJCXdha2VfdXAoJmNvbW1hbmRfaW5mby0+d2FpdF9jb21tYW5kKTsKIAkJcmV0dXJuOwogCX0KIAotCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJmNvbW1hbmRfcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmY29tbWFuZF9wb3J0LT5kZXYsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOwogCiAJaWYgKGRhdGFbMF0gPT0gV0hJVEVIRUFUX0NNRF9DT01QTEVURSkgewogCQljb21tYW5kX2luZm8tPmNvbW1hbmRfZmluaXNoZWQgPSBXSElURUhFQVRfQ01EX0NPTVBMRVRFOwpAQCAtMTAwMiwzOCArOTk2LDM4IEBACiAJCXdha2VfdXAoJmNvbW1hbmRfaW5mby0+d2FpdF9jb21tYW5kKTsKIAl9IGVsc2UgaWYgKGRhdGFbMF0gPT0gV0hJVEVIRUFUX0VWRU5UKSB7CiAJCS8qIFRoZXNlIGFyZSB1bnNvbGljaXRlZCByZXBvcnRzIGZyb20gdGhlIGZpcm13YXJlLCBoZW5jZSBubyB3YWl0aW5nIGNvbW1hbmQgdG8gd2FrZXVwICovCi0JCWRiZygiJXMgLSBldmVudCByZWNlaXZlZCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBldmVudCByZWNlaXZlZCIsIF9fZnVuY19fKTsKIAl9IGVsc2UgaWYgKGRhdGFbMF0gPT0gV0hJVEVIRUFUX0dFVF9EVFJfUlRTKSB7CiAJCW1lbWNweShjb21tYW5kX2luZm8tPnJlc3VsdF9idWZmZXIsICZkYXRhWzFdLCB1cmItPmFjdHVhbF9sZW5ndGggLSAxKTsKIAkJY29tbWFuZF9pbmZvLT5jb21tYW5kX2ZpbmlzaGVkID0gV0hJVEVIRUFUX0NNRF9DT01QTEVURTsKIAkJd2FrZV91cCgmY29tbWFuZF9pbmZvLT53YWl0X2NvbW1hbmQpOwogCX0gZWxzZSB7Ci0JCWRiZygiJXMgLSBiYWQgcmVwbHkgZnJvbSBmaXJtd2FyZSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBiYWQgcmVwbHkgZnJvbSBmaXJtd2FyZSIsIF9fZnVuY19fKTsKIAl9CiAJCiAJLyogQ29udGludWUgdHJ5aW5nIHRvIGFsd2F5cyByZWFkICovCiAJY29tbWFuZF9wb3J0LT5yZWFkX3VyYi0+ZGV2ID0gY29tbWFuZF9wb3J0LT5zZXJpYWwtPmRldjsKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihjb21tYW5kX3BvcnQtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAocmVzdWx0KQotCQlkYmcoIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCWRiZygiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogfQogCiAKIHN0YXRpYyB2b2lkIHdoaXRlaGVhdF9yZWFkX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3Qgd2hpdGVoZWF0X3VyYl93cmFwICp3cmFwOwogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlzdHJ1Y3Qgd2hpdGVoZWF0X3ByaXZhdGUgKmluZm8gPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXNwaW5fbG9jaygmaW5mby0+bG9jayk7CiAJd3JhcCA9IHVyYl90b193cmFwKHVyYiwgJmluZm8tPnJ4X3VyYnNfc3VibWl0dGVkKTsKIAlpZiAoIXdyYXApIHsKIAkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCQllcnIoIiVzIC0gTm90IG15IHVyYiEiLCBfX0ZVTkNUSU9OX18pOworCQllcnIoIiVzIC0gTm90IG15IHVyYiEiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAJbGlzdF9kZWwoJndyYXAtPmxpc3QpOwpAQCAtMTA0MSwxNCArMTAzNSwxNCBAQAogCiAJaWYgKHN0YXR1cykgewogCQlkYmcoIiVzIC0gbm9uemVybyByZWFkIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKIAkJbGlzdF9hZGQoJndyYXAtPmxpc3QsICZpbmZvLT5yeF91cmJzX2ZyZWUpOwogCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CiAJCXJldHVybjsKIAl9CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOwogCiAJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZ3cmFwLT5saXN0LCAmaW5mby0+cnhfdXJiX3EpOwpAQCAtMTA2NSwxOCArMTA1OSwxOCBAQAogCiBzdGF0aWMgdm9pZCB3aGl0ZWhlYXRfd3JpdGVfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCB3aGl0ZWhlYXRfcHJpdmF0ZSAqaW5mbyA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlzdHJ1Y3Qgd2hpdGVoZWF0X3VyYl93cmFwICp3cmFwOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlzcGluX2xvY2soJmluZm8tPmxvY2spOwogCXdyYXAgPSB1cmJfdG9fd3JhcCh1cmIsICZpbmZvLT50eF91cmJzX3N1Ym1pdHRlZCk7CiAJaWYgKCF3cmFwKSB7CiAJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQkJZXJyKCIlcyAtIE5vdCBteSB1cmIhIiwgX19GVU5DVElPTl9fKTsKKwkJZXJyKCIlcyAtIE5vdCBteSB1cmIhIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCWxpc3RfbW92ZSgmd3JhcC0+bGlzdCwgJmluZm8tPnR4X3VyYnNfZnJlZSk7CkBAIC0xMDg0LDcgKzEwNzgsNyBAQAogCiAJaWYgKHN0YXR1cykgewogCQlkYmcoIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTExMDQsNyArMTA5OCw3IEBACiAJaW50IHJldHZhbCA9IDA7CiAJaW50IHQ7CiAKLQlkYmcoIiVzIC0gY29tbWFuZCAlZCIsIF9fRlVOQ1RJT05fXywgY29tbWFuZCk7CisJZGJnKCIlcyAtIGNvbW1hbmQgJWQiLCBfX2Z1bmNfXywgY29tbWFuZCk7CiAKIAljb21tYW5kX3BvcnQgPSBwb3J0LT5zZXJpYWwtPnBvcnRbQ09NTUFORF9QT1JUXTsKIAljb21tYW5kX2luZm8gPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoY29tbWFuZF9wb3J0KTsKQEAgLTExMTgsNyArMTExMiw3IEBACiAJY29tbWFuZF9wb3J0LT53cml0ZV91cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiIChjb21tYW5kX3BvcnQtPndyaXRlX3VyYiwgR0ZQX05PSU8pOwogCWlmIChyZXR2YWwpIHsKLQkJZGJnKCIlcyAtIHN1Ym1pdCB1cmIgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHN1Ym1pdCB1cmIgZmFpbGVkIiwgX19mdW5jX18pOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0xMTI5LDE5ICsxMTIzLDE5IEBACiAJCXVzYl9raWxsX3VyYihjb21tYW5kX3BvcnQtPndyaXRlX3VyYik7CiAKIAlpZiAoY29tbWFuZF9pbmZvLT5jb21tYW5kX2ZpbmlzaGVkID09IGZhbHNlKSB7Ci0JCWRiZygiJXMgLSBjb21tYW5kIHRpbWVkIG91dC4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gY29tbWFuZCB0aW1lZCBvdXQuIiwgX19mdW5jX18pOwogCQlyZXR2YWwgPSAtRVRJTUVET1VUOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJaWYgKGNvbW1hbmRfaW5mby0+Y29tbWFuZF9maW5pc2hlZCA9PSBXSElURUhFQVRfQ01EX0ZBSUxVUkUpIHsKLQkJZGJnKCIlcyAtIGNvbW1hbmQgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBjb21tYW5kIGZhaWxlZC4iLCBfX2Z1bmNfXyk7CiAJCXJldHZhbCA9IC1FSU87CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlpZiAoY29tbWFuZF9pbmZvLT5jb21tYW5kX2ZpbmlzaGVkID09IFdISVRFSEVBVF9DTURfQ09NUExFVEUpIHsKLQkJZGJnKCIlcyAtIGNvbW1hbmQgY29tcGxldGVkLiIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBjb21tYW5kIGNvbXBsZXRlZC4iLCBfX2Z1bmNfXyk7CiAJCXN3aXRjaCAoY29tbWFuZCkgewogCQkJY2FzZSBXSElURUhFQVRfR0VUX0RUUl9SVFM6CiAJCQkJaW5mbyA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKQEAgLTExODYsNyArMTE4MCw3IEBACiAJCWRlZmF1bHQ6CiAJCWNhc2UgQ1M4Oglwb3J0X3NldHRpbmdzLmJpdHMgPSA4OyAgIGJyZWFrOwogCX0KLQlkYmcoIiVzIC0gZGF0YSBiaXRzID0gJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRfc2V0dGluZ3MuYml0cyk7CisJZGJnKCIlcyAtIGRhdGEgYml0cyA9ICVkIiwgX19mdW5jX18sIHBvcnRfc2V0dGluZ3MuYml0cyk7CiAJCiAJLyogZGV0ZXJtaW5lIHRoZSBwYXJpdHkgKi8KIAlpZiAoY2ZsYWcgJiBQQVJFTkIpCkBAIC0xMjAyLDIxICsxMTk2LDIxIEBACiAJCQkJcG9ydF9zZXR0aW5ncy5wYXJpdHkgPSBXSElURUhFQVRfUEFSX0VWRU47CiAJZWxzZQogCQlwb3J0X3NldHRpbmdzLnBhcml0eSA9IFdISVRFSEVBVF9QQVJfTk9ORTsKLQlkYmcoIiVzIC0gcGFyaXR5ID0gJWMiLCBfX0ZVTkNUSU9OX18sIHBvcnRfc2V0dGluZ3MucGFyaXR5KTsKKwlkYmcoIiVzIC0gcGFyaXR5ID0gJWMiLCBfX2Z1bmNfXywgcG9ydF9zZXR0aW5ncy5wYXJpdHkpOwogCiAJLyogZmlndXJlIG91dCB0aGUgc3RvcCBiaXRzIHJlcXVlc3RlZCAqLwogCWlmIChjZmxhZyAmIENTVE9QQikKIAkJcG9ydF9zZXR0aW5ncy5zdG9wID0gMjsKIAllbHNlCiAJCXBvcnRfc2V0dGluZ3Muc3RvcCA9IDE7Ci0JZGJnKCIlcyAtIHN0b3AgYml0cyA9ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0X3NldHRpbmdzLnN0b3ApOworCWRiZygiJXMgLSBzdG9wIGJpdHMgPSAlZCIsIF9fZnVuY19fLCBwb3J0X3NldHRpbmdzLnN0b3ApOwogCiAJLyogZmlndXJlIG91dCB0aGUgZmxvdyBjb250cm9sIHNldHRpbmdzICovCiAJaWYgKGNmbGFnICYgQ1JUU0NUUykKIAkJcG9ydF9zZXR0aW5ncy5oZmxvdyA9IChXSElURUhFQVRfSEZMT1dfQ1RTIHwgV0hJVEVIRUFUX0hGTE9XX1JUUyk7CiAJZWxzZQogCQlwb3J0X3NldHRpbmdzLmhmbG93ID0gV0hJVEVIRUFUX0hGTE9XX05PTkU7Ci0JZGJnKCIlcyAtIGhhcmR3YXJlIGZsb3cgY29udHJvbCA9ICVzICVzICVzICVzIiwgX19GVU5DVElPTl9fLAorCWRiZygiJXMgLSBoYXJkd2FyZSBmbG93IGNvbnRyb2wgPSAlcyAlcyAlcyAlcyIsIF9fZnVuY19fLAogCSAgICAocG9ydF9zZXR0aW5ncy5oZmxvdyAmIFdISVRFSEVBVF9IRkxPV19DVFMpID8gIkNUUyIgOiAiIiwKIAkgICAgKHBvcnRfc2V0dGluZ3MuaGZsb3cgJiBXSElURUhFQVRfSEZMT1dfUlRTKSA/ICJSVFMiIDogIiIsCiAJICAgIChwb3J0X3NldHRpbmdzLmhmbG93ICYgV0hJVEVIRUFUX0hGTE9XX0RTUikgPyAiRFNSIiA6ICIiLApAQCAtMTIyNywxNSArMTIyMSwxNSBAQAogCQlwb3J0X3NldHRpbmdzLnNmbG93ID0gV0hJVEVIRUFUX1NGTE9XX1JYVFg7CiAJZWxzZQogCQlwb3J0X3NldHRpbmdzLnNmbG93ID0gV0hJVEVIRUFUX1NGTE9XX05PTkU7Ci0JZGJnKCIlcyAtIHNvZnR3YXJlIGZsb3cgY29udHJvbCA9ICVjIiwgX19GVU5DVElPTl9fLCBwb3J0X3NldHRpbmdzLnNmbG93KTsKKwlkYmcoIiVzIC0gc29mdHdhcmUgZmxvdyBjb250cm9sID0gJWMiLCBfX2Z1bmNfXywgcG9ydF9zZXR0aW5ncy5zZmxvdyk7CiAJCiAJcG9ydF9zZXR0aW5ncy54b24gPSBTVEFSVF9DSEFSKHBvcnQtPnR0eSk7CiAJcG9ydF9zZXR0aW5ncy54b2ZmID0gU1RPUF9DSEFSKHBvcnQtPnR0eSk7Ci0JZGJnKCIlcyAtIFhPTiA9ICUyeCwgWE9GRiA9ICUyeCIsIF9fRlVOQ1RJT05fXywgcG9ydF9zZXR0aW5ncy54b24sIHBvcnRfc2V0dGluZ3MueG9mZik7CisJZGJnKCIlcyAtIFhPTiA9ICUyeCwgWE9GRiA9ICUyeCIsIF9fZnVuY19fLCBwb3J0X3NldHRpbmdzLnhvbiwgcG9ydF9zZXR0aW5ncy54b2ZmKTsKIAogCS8qIGdldCB0aGUgYmF1ZCByYXRlIHdhbnRlZCAqLwogCXBvcnRfc2V0dGluZ3MuYmF1ZCA9IHR0eV9nZXRfYmF1ZF9yYXRlKHBvcnQtPnR0eSk7Ci0JZGJnKCIlcyAtIGJhdWQgcmF0ZSA9ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0X3NldHRpbmdzLmJhdWQpOworCWRiZygiJXMgLSBiYXVkIHJhdGUgPSAlZCIsIF9fZnVuY19fLCBwb3J0X3NldHRpbmdzLmJhdWQpOwogCiAJLyogZml4bWU6IHNob3VsZCBzZXQgdmFsaWRhdGVkIHNldHRpbmdzICovCiAJdHR5X2VuY29kZV9iYXVkX3JhdGUocG9ydC0+dHR5LCBwb3J0X3NldHRpbmdzLmJhdWQsIHBvcnRfc2V0dGluZ3MuYmF1ZCk7CkBAIC0xMzE4LDcgKzEzMTIsNyBAQAogCQljb21tYW5kX3BvcnQtPnJlYWRfdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKIAkJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIoY29tbWFuZF9wb3J0LT5yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CiAJCWlmIChyZXR2YWwpIHsKLQkJCWVycigiJXMgLSBmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkIiwgX19mdW5jX18sIHJldHZhbCk7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAl9CkBAIC0xNDU0LDcgKzE0NDgsNyBAQAogCQl1cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwogCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAocmVzdWx0KSB7Ci0JCQllcnIoIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQllcnIoIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWQiLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CiAJCQlsaXN0X2FkZCh0bXAsICZpbmZvLT5yeF91cmJzX2ZyZWUpOwogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL0tjb25maWcgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL0tjb25maWcKaW5kZXggN2U1MzMzMy4uMGY2ZDIzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvS2NvbmZpZwpAQCAtMzIsOCArMzIsOCBAQAogCSAgdmVyYm9zZSBkZWJ1Z2dpbmcgbWVzc2FnZXMuCiAKIGNvbmZpZyBVU0JfU1RPUkFHRV9EQVRBRkFCCi0JYm9vbCAiRGF0YWZhYiBDb21wYWN0IEZsYXNoIFJlYWRlciBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCX1NUT1JBR0UgJiYgRVhQRVJJTUVOVEFMCisJYm9vbCAiRGF0YWZhYiBDb21wYWN0IEZsYXNoIFJlYWRlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCX1NUT1JBR0UKIAloZWxwCiAJICBTdXBwb3J0IGZvciBjZXJ0YWluIERhdGFmYWIgQ29tcGFjdEZsYXNoIHJlYWRlcnMuCiAJICBEYXRhZmFiIGhhcyBhIHdlYiBwYWdlIGF0IDxodHRwOi8vd3d3LmRhdGFmYWJ1c2EuY29tLz4uCkBAIC02OSw4ICs2OSw4IEBACiAJICBUaGVyZSBpcyBhIHdlYiBwYWdlIGF0IDxodHRwOi8vd3d3Lnppb2NvcnAuY29tL3Byb2R1Y3RzLz4uCiAKIGNvbmZpZyBVU0JfU1RPUkFHRV9VU0JBVAotCWJvb2wgIlVTQkFUL1VTQkFUMDItYmFzZWQgc3RvcmFnZSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCX1NUT1JBR0UgJiYgRVhQRVJJTUVOVEFMCisJYm9vbCAiVVNCQVQvVVNCQVQwMi1iYXNlZCBzdG9yYWdlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0JfU1RPUkFHRQogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBhZGRpdGlvbmFsIGNvZGUgdG8gc3VwcG9ydCBzdG9yYWdlIGRldmljZXMKIAkgIGJhc2VkIG9uIHRoZSBTQ00vU2h1dHRsZSBVU0JBVC9VU0JBVDAyIHByb2Nlc3NvcnMuCkBAIC05MCwzMCArOTAsMzAgQEAKIAkgIC0gU2FuZGlzayBJbWFnZU1hdGUgU0REUi0wNWIKIAogY29uZmlnIFVTQl9TVE9SQUdFX1NERFIwOQotCWJvb2wgIlNhbkRpc2sgU0REUi0wOSAoYW5kIG90aGVyIFNtYXJ0TWVkaWEpIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBVU0JfU1RPUkFHRSAmJiBFWFBFUklNRU5UQUwKKwlib29sICJTYW5EaXNrIFNERFItMDkgKGFuZCBvdGhlciBTbWFydE1lZGlhKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCX1NUT1JBR0UKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgYWRkaXRpb25hbCBjb2RlIHRvIHN1cHBvcnQgdGhlIFNhbmRpc2sgU0REUi0wOQogCSAgU21hcnRNZWRpYSByZWFkZXIgaW4gdGhlIFVTQiBNYXNzIFN0b3JhZ2UgZHJpdmVyLgogCSAgQWxzbyB3b3JrcyBmb3IgdGhlIE1pY3JvdGVjaCBaaW8hIFNtYXJ0TWVkaWEgcmVhZGVyLgogCiBjb25maWcgVVNCX1NUT1JBR0VfU0REUjU1Ci0JYm9vbCAiU2FuRGlzayBTRERSLTU1IFNtYXJ0TWVkaWEgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIFVTQl9TVE9SQUdFICYmIEVYUEVSSU1FTlRBTAorCWJvb2wgIlNhbkRpc2sgU0REUi01NSBTbWFydE1lZGlhIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0JfU1RPUkFHRQogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBhZGRpdGlvbmFsIGNvZGUgdG8gc3VwcG9ydCB0aGUgU2FuZGlzayBTRERSLTU1CiAJICBTbWFydE1lZGlhIHJlYWRlciBpbiB0aGUgVVNCIE1hc3MgU3RvcmFnZSBkcml2ZXIuCiAKIGNvbmZpZyBVU0JfU1RPUkFHRV9KVU1QU0hPVAotCWJvb2wgIkxleGFyIEp1bXBzaG90IENvbXBhY3QgRmxhc2ggUmVhZGVyIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCX1NUT1JBR0UgJiYgRVhQRVJJTUVOVEFMCisJYm9vbCAiTGV4YXIgSnVtcHNob3QgQ29tcGFjdCBGbGFzaCBSZWFkZXIiCisJZGVwZW5kcyBvbiBVU0JfU1RPUkFHRQogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBhZGRpdGlvbmFsIGNvZGUgdG8gc3VwcG9ydCB0aGUgTGV4YXIgSnVtcHNob3QKIAkgIFVTQiBDb21wYWN0Rmxhc2ggcmVhZGVyLgogCiBjb25maWcgVVNCX1NUT1JBR0VfQUxBVURBCi0JYm9vbCAiT2x5bXB1cyBNQVVTQi0xMC9GdWppIERQQy1SMSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCX1NUT1JBR0UgJiYgRVhQRVJJTUVOVEFMCisJYm9vbCAiT2x5bXB1cyBNQVVTQi0xMC9GdWppIERQQy1SMSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCX1NUT1JBR0UKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgYWRkaXRpb25hbCBjb2RlIHRvIHN1cHBvcnQgdGhlIE9seW1wdXMgTUFVU0ItMTAKIAkgIGFuZCBGdWppZmlsbSBEUEMtUjEgVVNCIENhcmQgcmVhZGVyL3dyaXRlciBkZXZpY2VzLgpAQCAtMTIyLDggKzEyMiw4IEBACiAJICBYRCBhbmQgU21hcnRNZWRpYSBjYXJkcy4KIAogY29uZmlnIFVTQl9TVE9SQUdFX09ORVRPVUNICi0JYm9vbCAiU3VwcG9ydCBPbmVUb3VjaCBCdXR0b24gb24gTWF4dG9yIEhhcmQgRHJpdmVzIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCX1NUT1JBR0UgJiYgSU5QVVRfRVZERVYgJiYgRVhQRVJJTUVOVEFMICYmICFQTQorCWJvb2wgIlN1cHBvcnQgT25lVG91Y2ggQnV0dG9uIG9uIE1heHRvciBIYXJkIERyaXZlcyIKKwlkZXBlbmRzIG9uIFVTQl9TVE9SQUdFICYmIElOUFVUX0VWREVWCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIGFkZGl0aW9uYWwgY29kZSB0byBzdXBwb3J0IHRoZSBNYXh0b3IgT25lVG91Y2gKIAkgIFVTQiBoYXJkIGRyaXZlJ3Mgb25ldG91Y2ggYnV0dG9uLgpAQCAtMTQ1LDYgKzE0NSwxNyBAQAogCSAgb24gdGhlIHJlc3VsdGluZyBzY3NpIGRldmljZSBub2RlIHJldHVybnMgdGhlIEthcm1hIHRvIG5vcm1hbAogCSAgb3BlcmF0aW9uLgogCitjb25maWcgVVNCX1NUT1JBR0VfQ1lQUkVTU19BVEFDQgorCWJvb2wgIlNBVCBlbXVsYXRpb24gb24gQ3lwcmVzcyBVU0IvQVRBIEJyaWRnZSB3aXRoIEFUQUNCIgorCWRlcGVuZHMgb24gVVNCX1NUT1JBR0UKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBTQVQgKGF0YSBwYXNzIHRocm91Z2gpIG9uIGRldmljZXMgYmFzZWQKKwkgIG9uIHRoZSBDeXByZXNzIFVTQi9BVEEgYnJpZGdlIHN1cHBvcnRpbmcgQVRBQ0IuIFRoaXMgd2lsbCBhbGxvdyB5b3UKKwkgIHRvIHVzZSB0b29scyB0byB0dW5lIGFuZCBtb25pdG9yIHlvdXIgZHJpdmUgKGxpa2UgaGRwYXJtIG9yIHNtYXJ0Y3RsKS4KKworCSAgSWYgeW91IHNheSBubyBoZXJlIHlvdXIgZGV2aWNlIHdpbGwgc3RpbGwgd29yayB3aXRoIHRoZSBzdGFuZGFyZCB1c2IKKwkgIG1hc3Mgc3RvcmFnZSBjbGFzcy4KKwogY29uZmlnIFVTQl9MSUJVU1VBTAogCWJvb2wgIlRoZSBzaGFyZWQgdGFibGUgb2YgY29tbW9uIChvciB1c3VhbCkgc3RvcmFnZSBkZXZpY2VzIgogCWRlcGVuZHMgb24gVVNCCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL01ha2VmaWxlIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9NYWtlZmlsZQppbmRleCAwMjM5NjliLi40YzU5NmM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvTWFrZWZpbGUKQEAgLTIxLDYgKzIxLDcgQEAKIHVzYi1zdG9yYWdlLW9iai0kKENPTkZJR19VU0JfU1RPUkFHRV9BTEFVREEpCSs9IGFsYXVkYS5vCiB1c2Itc3RvcmFnZS1vYmotJChDT05GSUdfVVNCX1NUT1JBR0VfT05FVE9VQ0gpCSs9IG9uZXRvdWNoLm8KIHVzYi1zdG9yYWdlLW9iai0kKENPTkZJR19VU0JfU1RPUkFHRV9LQVJNQSkJKz0ga2FybWEubwordXNiLXN0b3JhZ2Utb2JqLSQoQ09ORklHX1VTQl9TVE9SQUdFX0NZUFJFU1NfQVRBQ0IpICs9IGN5cHJlc3NfYXRhY2IubwogCiB1c2Itc3RvcmFnZS1vYmpzIDo9CXNjc2lnbHVlLm8gcHJvdG9jb2wubyB0cmFuc3BvcnQubyB1c2IubyBcCiAJCQlpbml0aWFsaXplcnMubyAkKHVzYi1zdG9yYWdlLW9iai15KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9jeXByZXNzX2F0YWNiLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL2N5cHJlc3NfYXRhY2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODg4MjRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9jeXByZXNzX2F0YWNiLmMKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBTdXBwb3J0IGZvciBlbXVsYXRpbmcgU0FUIChhdGEgcGFzcyB0aHJvdWdoKSBvbiBkZXZpY2VzIGJhc2VkCisgKiAgICAgICBvbiB0aGUgQ3lwcmVzcyBVU0IvQVRBIGJyaWRnZSBzdXBwb3J0aW5nIEFUQUNCLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYXR0aGlldSBDYXN0ZXQgKGNhc3RldC5tYXR0aGlldUBmcmVlLmZyKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgorI2luY2x1ZGUgPGxpbnV4L2F0YS5oPgorCisjaW5jbHVkZSAidXNiLmgiCisjaW5jbHVkZSAicHJvdG9jb2wuaCIKKyNpbmNsdWRlICJzY3NpZ2x1ZS5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKKy8qCisgKiBBVEFDQiBpcyBhIHByb3RvY29sIHVzZWQgb24gY3lwcmVzcyB1c2I8LT5hdGEgYnJpZGdlIHRvCisgKiBzZW5kIHJhdyBBVEEgY29tbWFuZCBvdmVyIG1hc3Mgc3RvcmFnZQorICogVGhlcmUgaXMgYSBBVEFDQjIgcHJvdG9jb2wgdGhhdCBzdXBwb3J0IExCQTQ4IG9uIG5ld2VyIGNoaXAuCisgKiBNb3JlIGluZm8gdGhhdCBiZSBmb3VuZCBvbiBjeTdjNjgzMTBfOC5wZGYgYW5kIGN5N2M2ODMwMGNfOC5wZGYKKyAqIGRhdGFzaGVldCBmcm9tIGN5cHJlc3MuY29tLgorICovCit2b2lkIGN5cHJlc3NfYXRhY2JfcGFzc3Rocm91Z2goc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgdXNfZGF0YSAqdXMpCit7CisJdW5zaWduZWQgY2hhciBzYXZlX2NtbmRbTUFYX0NPTU1BTkRfU0laRV07CisKKwlpZiAobGlrZWx5KHNyYi0+Y21uZFswXSAhPSBBVEFfMTYgJiYgc3JiLT5jbW5kWzBdICE9IEFUQV8xMikpIHsKKwkJdXNiX3N0b3JfdHJhbnNwYXJlbnRfc2NzaV9jb21tYW5kKHNyYiwgdXMpOworCQlyZXR1cm47CisJfQorCisJbWVtY3B5KHNhdmVfY21uZCwgc3JiLT5jbW5kLCBzaXplb2Yoc2F2ZV9jbW5kKSk7CisJbWVtc2V0KHNyYi0+Y21uZCwgMCwgc2l6ZW9mKHNyYi0+Y21uZCkpOworCisJLyogY2hlY2sgaWYgd2Ugc3VwcG9ydCB0aGUgY29tbWFuZCAqLworCWlmIChzYXZlX2NtbmRbMV0gPj4gNSkgLyogTVVMVElQTEVfQ09VTlQgKi8KKwkJZ290byBpbnZhbGlkX2ZsZDsKKwkvKiBjaGVjayBwcm90b2NvbCAqLworCXN3aXRjaCgoc2F2ZV9jbW5kWzFdID4+IDEpICYgMHhmKSB7CisJCWNhc2UgMzogLypubyBEQVRBICovCisJCWNhc2UgNDogLyogUElPIGluICovCisJCWNhc2UgNTogLyogUElPIG91dCAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGludmFsaWRfZmxkOworCX0KKworCS8qIGZpcnN0IGJ1aWxkIHRoZSBBVEFDQiBjb21tYW5kICovCisJc3JiLT5jbWRfbGVuID0gMTY7CisKKwlzcmItPmNtbmRbMF0gPSAweDI0OyAvKiBiVlNDQlNpZ25hdHVyZSA6IHZlbmRvci1zcGVjaWZpYyBjb21tYW5kCisJICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyB2YWx1ZSBjYW4gY2hhbmdlLCBidXQgbW9zdChhbGwgPykgbWFudWZhY3R1cmVycworCQkJCQkJCWtlZXAgdGhlIGN5cHJlc3MgZGVmYXVsdCA6IDB4MjQgKi8KKwlzcmItPmNtbmRbMV0gPSAweDI0OyAvKiBiVlNDQlN1YkNvbW1hbmQgOiAweDI0IGZvciBBVEFDQiAqLworCisJc3JiLT5jbW5kWzNdID0gMHhmZiAtIDE7IC8qIGZlYXR1cmVzLCBzZWN0b3IgY291bnQsIGxiYSBsb3csIGxiYSBtZWQKKwkJCQkJCQkJbGJhIGhpZ2gsIGRldmljZSwgY29tbWFuZCBhcmUgdmFsaWQgKi8KKwlzcmItPmNtbmRbNF0gPSAxOyAvKiBUcmFuc2ZlckJsb2NrQ291bnQgOiA1MTIgKi8KKworCWlmIChzYXZlX2NtbmRbMF0gPT0gQVRBXzE2KSB7CisJCXNyYi0+Y21uZFsgNl0gPSBzYXZlX2NtbmRbIDRdOyAvKiBmZWF0dXJlcyAqLworCQlzcmItPmNtbmRbIDddID0gc2F2ZV9jbW5kWyA2XTsgLyogc2VjdG9yIGNvdW50ICovCisJCXNyYi0+Y21uZFsgOF0gPSBzYXZlX2NtbmRbIDhdOyAvKiBsYmEgbG93ICovCisJCXNyYi0+Y21uZFsgOV0gPSBzYXZlX2NtbmRbMTBdOyAvKiBsYmEgbWVkICovCisJCXNyYi0+Y21uZFsxMF0gPSBzYXZlX2NtbmRbMTJdOyAvKiBsYmEgaGlnaCAqLworCQlzcmItPmNtbmRbMTFdID0gc2F2ZV9jbW5kWzEzXTsgLyogZGV2aWNlICovCisJCXNyYi0+Y21uZFsxMl0gPSBzYXZlX2NtbmRbMTRdOyAvKiBjb21tYW5kICovCisKKwkJaWYgKHNhdmVfY21uZFsxXSAmIDB4MDEpIHsvKiBleHRlbmRlZCBiaXQgc2V0IGZvciBMQkE0OCAqLworCQkJLyogdGhpcyBjb3VsZCBiZSBzdXBwb3J0ZWQgYnkgYXRhY2IyICovCisJCQlpZiAoc2F2ZV9jbW5kWzNdIHx8IHNhdmVfY21uZFs1XSB8fCBzYXZlX2NtbmRbN10gfHwgc2F2ZV9jbW5kWzldCisJCQkJCXx8IHNhdmVfY21uZFsxMV0pCisJCQkJZ290byBpbnZhbGlkX2ZsZDsKKwkJfQorCX0KKwllbHNlIHsgLyogQVRBMTIgKi8KKwkJc3JiLT5jbW5kWyA2XSA9IHNhdmVfY21uZFszXTsgLyogZmVhdHVyZXMgKi8KKwkJc3JiLT5jbW5kWyA3XSA9IHNhdmVfY21uZFs0XTsgLyogc2VjdG9yIGNvdW50ICovCisJCXNyYi0+Y21uZFsgOF0gPSBzYXZlX2NtbmRbNV07IC8qIGxiYSBsb3cgKi8KKwkJc3JiLT5jbW5kWyA5XSA9IHNhdmVfY21uZFs2XTsgLyogbGJhIG1lZCAqLworCQlzcmItPmNtbmRbMTBdID0gc2F2ZV9jbW5kWzddOyAvKiBsYmEgaGlnaCAqLworCQlzcmItPmNtbmRbMTFdID0gc2F2ZV9jbW5kWzhdOyAvKiBkZXZpY2UgKi8KKwkJc3JiLT5jbW5kWzEyXSA9IHNhdmVfY21uZFs5XTsgLyogY29tbWFuZCAqLworCisJfQorCS8qIEZpbHRlciBTRVRfRkVBVFVSRVMgLSBYRkVSIE1PREUgY29tbWFuZCAqLworCWlmICgoc3JiLT5jbW5kWzEyXSA9PSBBVEFfQ01EX1NFVF9GRUFUVVJFUykKKwkJCSYmIChzcmItPmNtbmRbNl0gPT0gU0VURkVBVFVSRVNfWEZFUikpCisJCWdvdG8gaW52YWxpZF9mbGQ7CisKKwlpZiAoc3JiLT5jbW5kWzEyXSA9PSBBVEFfQ01EX0lEX0FUQSB8fCBzcmItPmNtbmRbMTJdID09IEFUQV9DTURfSURfQVRBUEkpCisJCXNyYi0+Y21uZFsyXSB8PSAoMTw8Nyk7IC8qIHNldCAgSWRlbnRpZnlQYWNrZXREZXZpY2UgZm9yIHRoZXNlIGNtZHMgKi8KKworCisJdXNiX3N0b3JfdHJhbnNwYXJlbnRfc2NzaV9jb21tYW5kKHNyYiwgdXMpOworCisJLyogaWYgdGhlIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgQVRBQ0IKKwkgKi8KKwlpZiAoc3JiLT5yZXN1bHQgPT0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OICYmCisJCQltZW1jbXAoc3JiLT5zZW5zZV9idWZmZXIsIHVzYl9zdG9yX3NlbnNlX2ludmFsaWRDREIsCisJCQkJc2l6ZW9mKHVzYl9zdG9yX3NlbnNlX2ludmFsaWRDREIpKSA9PSAwKSB7CisJCVVTX0RFQlVHUCgiY3lwcmVzcyBhdGFjYiBub3Qgc3VwcG9ydGVkID8/P1xuIik7CisJCWdvdG8gZW5kOworCX0KKworCS8qIGlmIGNrX2NvbmQgZmxhZ3MgaXMgc2V0LCBhbmQgdGhlcmUgd2Fzbid0IGNyaXRpY2FsIGVycm9yLAorCSAqIGJ1aWxkIHRoZSBzcGVjaWFsIHNlbnNlCisJICovCisJaWYgKChzcmItPnJlc3VsdCAhPSAoRElEX0VSUk9SIDw8IDE2KSAmJgorCQkJCXNyYi0+cmVzdWx0ICE9IChESURfQUJPUlQgPDwgMTYpKSAmJgorCQkJc2F2ZV9jbW5kWzJdICYgMHgyMCkgeworCQlzdHJ1Y3Qgc2NzaV9laF9zYXZlIHNlczsKKwkJdW5zaWduZWQgY2hhciByZWdzWzhdOworCQl1bnNpZ25lZCBjaGFyICpzYiA9IHNyYi0+c2Vuc2VfYnVmZmVyOworCQl1bnNpZ25lZCBjaGFyICpkZXNjID0gc2IgKyA4OworCQlpbnQgdG1wX3Jlc3VsdDsKKworCQkvKiBidWlsZCB0aGUgY29tbWFuZCBmb3IKKwkJICogcmVhZGluZyB0aGUgQVRBIHJlZ2lzdGVycyAqLworCQlzY3NpX2VoX3ByZXBfY21uZChzcmIsICZzZXMsIE5VTEwsIDAsIDApOworCQlzcmItPnNkYi5sZW5ndGggPSBzaXplb2YocmVncyk7CisJCXNnX2luaXRfb25lKCZzZXMuc2Vuc2Vfc2dsLCByZWdzLCBzcmItPnNkYi5sZW5ndGgpOworCQlzcmItPnNkYi50YWJsZS5zZ2wgPSAmc2VzLnNlbnNlX3NnbDsKKwkJc3JiLT5zY19kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKwkJc3JiLT5zZGIudGFibGUubmVudHMgPSAxOworCQkvKiB3ZSB1c2UgdGhlIHNhbWUgY29tbWFuZCBhcyBiZWZvcmUsIGJ1dCB3ZSBzZXQKKwkJICogdGhlIHJlYWQgdGFza2ZpbGUgYml0LCBmb3Igbm90IGV4ZWN1dGluZyBhdGFjYiBjb21tYW5kLAorCQkgKiBidXQgcmVhZGluZyByZWdpc3RlciBzZWxlY3RlZCBpbiBzcmItPmNtbmRbNF0KKwkJICovCisJCXNyYi0+Y21uZFsyXSA9IDE7CisKKwkJdXNiX3N0b3JfdHJhbnNwYXJlbnRfc2NzaV9jb21tYW5kKHNyYiwgdXMpOworCQl0bXBfcmVzdWx0ID0gc3JiLT5yZXN1bHQ7CisJCXNjc2lfZWhfcmVzdG9yZV9jbW5kKHNyYiwgJnNlcyk7CisJCS8qIHdlIGZhaWwgdG8gZ2V0IHJlZ2lzdGVycywgcmVwb3J0IGludmFsaWQgY29tbWFuZCAqLworCQlpZiAodG1wX3Jlc3VsdCAhPSBTQU1fU1RBVF9HT09EKQorCQkJZ290byBpbnZhbGlkX2ZsZDsKKworCQkvKiBidWlsZCB0aGUgc2Vuc2UgKi8KKwkJbWVtc2V0KHNiLCAwLCBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpOworCisJCS8qIHNldCBzaywgYXNjIGZvciBhIGdvb2QgY29tbWFuZCAqLworCQlzYlsxXSA9IFJFQ09WRVJFRF9FUlJPUjsKKwkJc2JbMl0gPSAwOyAvKiBBVEEgUEFTUyBUSFJPVUdIIElORk9STUFUSU9OIEFWQUlMQUJMRSAqLworCQlzYlszXSA9IDB4MUQ7CisKKwkJLyogWFhYIHdlIHNob3VsZCBnZW5lcmF0ZSBzaywgYXNjLCBhc2NxIGZyb20gc3RhdHVzIGFuZCBlcnJvcgorCQkgKiByZWdzCisJCSAqIChzZWUgMTEuMSBFcnJvciB0cmFuc2xhdGlvbiCtIEFUQSBkZXZpY2UgZXJyb3IgdG8gU0NTSSBlcnJvciBtYXApCisJCSAqIGFuZCBhdGFfdG9fc2Vuc2VfZXJyb3IgZnJvbSBsaWJhdGEuCisJCSAqLworCisJCS8qIFNlbnNlIGRhdGEgaXMgY3VycmVudCBhbmQgZm9ybWF0IGlzIGRlc2NyaXB0b3IuICovCisJCXNiWzBdID0gMHg3MjsKKwkJZGVzY1swXSA9IDB4MDk7IC8qIEFUQV9SRVRVUk5fREVTQ1JJUFRPUiAqLworCisJCS8qIHNldCBsZW5ndGggb2YgYWRkaXRpb25hbCBzZW5zZSBkYXRhICovCisJCXNiWzddID0gMTQ7CisJCWRlc2NbMV0gPSAxMjsKKworCQkvKiBDb3B5IHJlZ2lzdGVycyBpbnRvIHNlbnNlIGJ1ZmZlci4gKi8KKwkJZGVzY1sgMl0gPSAweDAwOworCQlkZXNjWyAzXSA9IHJlZ3NbMV07ICAvKiBmZWF0dXJlcyAqLworCQlkZXNjWyA1XSA9IHJlZ3NbMl07ICAvKiBzZWN0b3IgY291bnQgKi8KKwkJZGVzY1sgN10gPSByZWdzWzNdOyAgLyogbGJhIGxvdyAqLworCQlkZXNjWyA5XSA9IHJlZ3NbNF07ICAvKiBsYmEgbWVkICovCisJCWRlc2NbMTFdID0gcmVnc1s1XTsgIC8qIGxiYSBoaWdoICovCisJCWRlc2NbMTJdID0gcmVnc1s2XTsgIC8qIGRldmljZSAqLworCQlkZXNjWzEzXSA9IHJlZ3NbN107ICAvKiBjb21tYW5kICovCisKKwkJc3JiLT5yZXN1bHQgPSAoRFJJVkVSX1NFTlNFIDw8IDI0KSB8IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKKwl9CisJZ290byBlbmQ7CitpbnZhbGlkX2ZsZDoKKwlzcmItPnJlc3VsdCA9IChEUklWRVJfU0VOU0UgPDwgMjQpIHwgU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOworCisJbWVtY3B5KHNyYi0+c2Vuc2VfYnVmZmVyLAorCQkJdXNiX3N0b3Jfc2Vuc2VfaW52YWxpZENEQiwKKwkJCXNpemVvZih1c2Jfc3Rvcl9zZW5zZV9pbnZhbGlkQ0RCKSk7CitlbmQ6CisJbWVtY3B5KHNyYi0+Y21uZCwgc2F2ZV9jbW5kLCBzaXplb2Yoc2F2ZV9jbW5kKSk7CisJaWYgKHNyYi0+Y21uZFswXSA9PSBBVEFfMTIpCisJCXNyYi0+Y21kX2xlbiA9IDEyOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9jeXByZXNzX2F0YWNiLmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL2N5cHJlc3NfYXRhY2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmFkYTg5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9jeXByZXNzX2F0YWNiLmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIFN1cHBvcnQgZm9yIGVtdWxhdGluZyBTQVQgKGF0YSBwYXNzIHRocm91Z2gpIG9uIGRldmljZXMgYmFzZWQKKyAqICAgICAgIG9uIHRoZSBDeXByZXNzIFVTQi9BVEEgYnJpZGdlIHN1cHBvcnRpbmcgQVRBQ0IuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE1hdHRoaWV1IENhc3RldCAoY2FzdGV0Lm1hdHRoaWV1QGZyZWUuZnIpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfQ1lQUkVTU19BVEFDQl9IXworI2RlZmluZSBfQ1lQUkVTU19BVEFDQl9IXworZXh0ZXJuIHZvaWQgY3lwcmVzc19hdGFjYl9wYXNzdGhyb3VnaChzdHJ1Y3Qgc2NzaV9jbW5kKiwgc3RydWN0IHVzX2RhdGEqKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9saWJ1c3VhbC5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9saWJ1c3VhbC5jCmluZGV4IDU1Yjk1MjAuLmEyOGQ0OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvbGlidXN1YWwuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL2xpYnVzdWFsLmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvdXNiX3VzdWFsLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAvKgogICovCkBAIC0zMCw3ICszMSw3IEBACiAjZGVmaW5lIEJJQVNfTkFNRV9TSVpFICAoc2l6ZW9mKCJ1c2Itc3RvcmFnZSIpKQogc3RhdGljIGNvbnN0IGNoYXIgKmJpYXNfbmFtZXNbM10gPSB7ICJub25lIiwgInVzYi1zdG9yYWdlIiwgInViIiB9OwogCi1zdGF0aWMgc3RydWN0IHNlbWFwaG9yZSB1c3VfaW5pdF9ub3RpZnk7CitzdGF0aWMgREVGSU5FX01VVEVYKHVzdV9wcm9iZV9tdXRleCk7CiBzdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKHVzdV9lbmRfbm90aWZ5KTsKIHN0YXRpYyBhdG9taWNfdCB0b3RhbF90aHJlYWRzID0gQVRPTUlDX0lOSVQoMCk7CiAKQEAgLTE3OCwxMCArMTc5LDcgQEAKIAlpbnQgcmM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCS8qIEEgY29tcGxldGlvbiBkb2VzIG5vdCB3b3JrIGhlcmUgYmVjYXVzZSBpdCdzIGNvdW50ZWQuICovCi0JZG93bigmdXN1X2luaXRfbm90aWZ5KTsKLQl1cCgmdXN1X2luaXRfbm90aWZ5KTsKLQorCW11dGV4X2xvY2soJnVzdV9wcm9iZV9tdXRleCk7CiAJcmMgPSByZXF1ZXN0X21vZHVsZShiaWFzX25hbWVzW3R5cGVdKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdXN1X2xvY2ssIGZsYWdzKTsKIAlpZiAocmMgPT0gMCAmJiAoc3QtPmZscyAmIFVTVV9NT0RfRkxfUFJFU0VOVCkgPT0gMCkgewpAQCAtMTk0LDYgKzE5Miw3IEBACiAJfQogCXN0LT5mbHMgJj0gflVTVV9NT0RfRkxfVEhSRUFEOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVzdV9sb2NrLCBmbGFncyk7CisJbXV0ZXhfdW5sb2NrKCZ1c3VfcHJvYmVfbXV0ZXgpOwogCiAJY29tcGxldGVfYW5kX2V4aXQoJnVzdV9lbmRfbm90aWZ5LCAwKTsKIH0KQEAgLTIwNCwxMCArMjAzLDkgQEAKIHsKIAlpbnQgcmM7CiAKLQlzZW1hX2luaXQoJnVzdV9pbml0X25vdGlmeSwgMCk7Ci0KKwltdXRleF9sb2NrKCZ1c3VfcHJvYmVfbXV0ZXgpOwogCXJjID0gdXNiX3JlZ2lzdGVyKCZ1c3VfZHJpdmVyKTsKLQl1cCgmdXN1X2luaXRfbm90aWZ5KTsKKwltdXRleF91bmxvY2soJnVzdV9wcm9iZV9tdXRleCk7CiAJcmV0dXJuIHJjOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3Njc2lnbHVlLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3Njc2lnbHVlLmMKaW5kZXggOGMxZTI5NS4uM2ZjZGU5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS9zY3NpZ2x1ZS5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2NzaWdsdWUuYwpAQCAtNzMsNiArNzMsNyBAQAogc3RhdGljIGludCBzbGF2ZV9hbGxvYyAoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQogewogCXN0cnVjdCB1c19kYXRhICp1cyA9IGhvc3RfdG9fdXMoc2Rldi0+aG9zdCk7CisJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICpidWxrX2luX2VwOwogCiAJLyoKIAkgKiBTZXQgdGhlIElOUVVJUlkgdHJhbnNmZXIgbGVuZ3RoIHRvIDM2LiAgV2UgZG9uJ3QgdXNlIGFueSBvZgpAQCAtODQsMTIgKzg1LDEzIEBACiAJLyogU2NhdHRlci1nYXRoZXIgYnVmZmVycyAoYWxsIGJ1dCB0aGUgbGFzdCkgbXVzdCBoYXZlIGEgbGVuZ3RoCiAJICogZGl2aXNpYmxlIGJ5IHRoZSBidWxrIG1heHBhY2tldCBzaXplLiAgT3RoZXJ3aXNlIGEgZGF0YSBwYWNrZXQKIAkgKiB3b3VsZCBlbmQgdXAgYmVpbmcgc2hvcnQsIGNhdXNpbmcgYSBwcmVtYXR1cmUgZW5kIHRvIHRoZSBkYXRhCi0JICogdHJhbnNmZXIuICBTaW5jZSBoaWdoLXNwZWVkIGJ1bGsgcGlwZXMgaGF2ZSBhIG1heHBhY2tldCBzaXplCi0JICogb2YgNTEyLCB3ZSdsbCB1c2UgdGhhdCBhcyB0aGUgc2NzaSBkZXZpY2UgcXVldWUncyBETUEgYWxpZ25tZW50Ci0JICogbWFzay4gIEd1YXJhbnRlZWluZyBwcm9wZXIgYWxpZ25tZW50IG9mIHRoZSBmaXJzdCBidWZmZXIgd2lsbAotCSAqIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0IGJlY2F1c2UsIGV4Y2VwdCBhdCB0aGUgYmVnaW5uaW5nIGFuZAotCSAqIHRoZSBlbmQsIHNjYXR0ZXItZ2F0aGVyIGJ1ZmZlcnMgZm9sbG93IHBhZ2UgYm91bmRhcmllcy4gKi8KLQlibGtfcXVldWVfdXBkYXRlX2RtYV9hbGlnbm1lbnQoc2Rldi0+cmVxdWVzdF9xdWV1ZSwgKDUxMiAtIDEpKTsKKwkgKiB0cmFuc2Zlci4gIFdlJ2xsIHVzZSB0aGUgbWF4cGFja2V0IHZhbHVlIG9mIHRoZSBidWxrLUlOIHBpcGUKKwkgKiB0byBzZXQgdGhlIFNDU0kgZGV2aWNlIHF1ZXVlJ3MgRE1BIGFsaWdubWVudCBtYXNrLgorCSAqLworCWJ1bGtfaW5fZXAgPSB1cy0+cHVzYl9kZXYtPmVwX2luW3VzYl9waXBlZW5kcG9pbnQodXMtPnJlY3ZfYnVsa19waXBlKV07CisJYmxrX3F1ZXVlX3VwZGF0ZV9kbWFfYWxpZ25tZW50KHNkZXYtPnJlcXVlc3RfcXVldWUsCisJCQlsZTE2X3RvX2NwdShidWxrX2luX2VwLT5kZXNjLndNYXhQYWNrZXRTaXplKSAtIDEpOworCQkJLyogd01heFBhY2tldFNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIDIgKi8KIAogCS8qCiAJICogVGhlIFVGSSBzcGVjIHRyZWF0ZXMgdGhlIFBlcmlwaGVyYWwgUXVhbGlmaWVyIGJpdHMgaW4gYW4KQEAgLTEzMiw3ICsxMzQsNyBAQAogCQkvKiBEaXNrLXR5cGUgZGV2aWNlcyB1c2UgTU9ERSBTRU5TRSg2KSBpZiB0aGUgcHJvdG9jb2wKIAkJICogKFN1YkNsYXNzKSBpcyBUcmFuc3BhcmVudCBTQ1NJLCBvdGhlcndpc2UgdGhleSB1c2UKIAkJICogTU9ERSBTRU5TRSgxMCkuICovCi0JCWlmICh1cy0+c3ViY2xhc3MgIT0gVVNfU0NfU0NTSSkKKwkJaWYgKHVzLT5zdWJjbGFzcyAhPSBVU19TQ19TQ1NJICYmIHVzLT5zdWJjbGFzcyAhPSBVU19TQ19DWVBfQVRBQ0IpCiAJCQlzZGV2LT51c2VfMTBfZm9yX21zID0gMTsKIAogCQkvKiBNYW55IGRpc2tzIG9ubHkgYWNjZXB0IE1PREUgU0VOU0UgdHJhbnNmZXIgbGVuZ3RocyBvZgpAQCAtMjI2LDEyICsyMjgsMTIgQEAKIHsKIAlzdHJ1Y3QgdXNfZGF0YSAqdXMgPSBob3N0X3RvX3VzKHNyYi0+ZGV2aWNlLT5ob3N0KTsKIAotCVVTX0RFQlVHUCgiJXMgY2FsbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCVVTX0RFQlVHUCgiJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBjaGVjayBmb3Igc3RhdGUtdHJhbnNpdGlvbiBlcnJvcnMgKi8KIAlpZiAodXMtPnNyYiAhPSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiBVU0JfU1RPUkFHRSAiRXJyb3IgaW4gJXM6IHVzLT5zcmIgPSAlcFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgdXMtPnNyYik7CisJCQlfX2Z1bmNfXywgdXMtPnNyYik7CiAJCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOwogCX0KIApAQCAtMjYwLDcgKzI2Miw3IEBACiB7CiAJc3RydWN0IHVzX2RhdGEgKnVzID0gaG9zdF90b191cyhzcmItPmRldmljZS0+aG9zdCk7CiAKLQlVU19ERUJVR1AoIiVzIGNhbGxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwlVU19ERUJVR1AoIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOwogCiAJLyogdXMtPnNyYiB0b2dldGhlciB3aXRoIHRoZSBUSU1FRF9PVVQsIFJFU0VUVElORywgYW5kIEFCT1JUSU5HCiAJICogYml0cyBhcmUgcHJvdGVjdGVkIGJ5IHRoZSBob3N0IGxvY2suICovCkBAIC0yOTcsNyArMjk5LDcgQEAKIAlzdHJ1Y3QgdXNfZGF0YSAqdXMgPSBob3N0X3RvX3VzKHNyYi0+ZGV2aWNlLT5ob3N0KTsKIAlpbnQgcmVzdWx0OwogCi0JVVNfREVCVUdQKCIlcyBjYWxsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJVVNfREVCVUdQKCIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKIAogCS8qIGxvY2sgdGhlIGRldmljZSBwb2ludGVycyBhbmQgZG8gdGhlIHJlc2V0ICovCiAJbXV0ZXhfbG9jaygmKHVzLT5kZXZfbXV0ZXgpKTsKQEAgLTMxMyw3ICszMTUsNyBAQAogCXN0cnVjdCB1c19kYXRhICp1cyA9IGhvc3RfdG9fdXMoc3JiLT5kZXZpY2UtPmhvc3QpOwogCWludCByZXN1bHQ7CiAKLQlVU19ERUJVR1AoIiVzIGNhbGxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwlVU19ERUJVR1AoIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOwogCXJlc3VsdCA9IHVzYl9zdG9yX3BvcnRfcmVzZXQodXMpOwogCXJldHVybiByZXN1bHQgPCAwID8gRkFJTEVEIDogU1VDQ0VTUzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jCmluZGV4IGJkZDQzMzQuLjY2MTBkMmRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMKQEAgLTExMCw3ICsxMTAsNyBAQAogICovCiBzdGF0aWMgdm9pZCB1c2Jfc3Rvcl9ibG9ja2luZ19jb21wbGV0aW9uKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgY29tcGxldGlvbiAqdXJiX2RvbmVfcHRyID0gKHN0cnVjdCBjb21wbGV0aW9uICopdXJiLT5jb250ZXh0OworCXN0cnVjdCBjb21wbGV0aW9uICp1cmJfZG9uZV9wdHIgPSB1cmItPmNvbnRleHQ7CiAKIAljb21wbGV0ZSh1cmJfZG9uZV9wdHIpOwogfQpAQCAtMTk4LDcgKzE5OCw3IEBACiAJaW50IHN0YXR1czsKIAogCVVTX0RFQlVHUCgiJXM6IHJxPSUwMnggcnF0eXBlPSUwMnggdmFsdWU9JTA0eCBpbmRleD0lMDJ4IGxlbj0ldVxuIiwKLQkJCV9fRlVOQ1RJT05fXywgcmVxdWVzdCwgcmVxdWVzdHR5cGUsCisJCQlfX2Z1bmNfXywgcmVxdWVzdCwgcmVxdWVzdHR5cGUsCiAJCQl2YWx1ZSwgaW5kZXgsIHNpemUpOwogCiAJLyogZmlsbCBpbiB0aGUgZGV2cmVxdWVzdCBzdHJ1Y3R1cmUgKi8KQEAgLTI1MCw3ICsyNTAsNyBAQAogCQl1c2Jfc2V0dG9nZ2xlKHVzLT5wdXNiX2RldiwgdXNiX3BpcGVlbmRwb2ludChwaXBlKSwKIAkJCQl1c2JfcGlwZW91dChwaXBlKSwgMCk7CiAKLQlVU19ERUJVR1AoIiVzOiByZXN1bHQgPSAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCVVTX0RFQlVHUCgiJXM6IHJlc3VsdCA9ICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0zMzIsNyArMzMyLDcgQEAKIAlpbnQgcmVzdWx0OwogCiAJVVNfREVCVUdQKCIlczogcnE9JTAyeCBycXR5cGU9JTAyeCB2YWx1ZT0lMDR4IGluZGV4PSUwMnggbGVuPSV1XG4iLAotCQkJX19GVU5DVElPTl9fLCByZXF1ZXN0LCByZXF1ZXN0dHlwZSwKKwkJCV9fZnVuY19fLCByZXF1ZXN0LCByZXF1ZXN0dHlwZSwKIAkJCXZhbHVlLCBpbmRleCwgc2l6ZSk7CiAKIAkvKiBmaWxsIGluIHRoZSBkZXZyZXF1ZXN0IHN0cnVjdHVyZSAqLwpAQCAtMzY2LDcgKzM2Niw3IEBACiAJdW5zaWduZWQgaW50IHBpcGUgPSB1cy0+cmVjdl9pbnRyX3BpcGU7CiAJdW5zaWduZWQgaW50IG1heHA7CiAKLQlVU19ERUJVR1AoIiVzOiB4ZmVyICV1IGJ5dGVzXG4iLCBfX0ZVTkNUSU9OX18sIGxlbmd0aCk7CisJVVNfREVCVUdQKCIlczogeGZlciAldSBieXRlc1xuIiwgX19mdW5jX18sIGxlbmd0aCk7CiAKIAkvKiBjYWxjdWxhdGUgdGhlIG1heCBwYWNrZXQgc2l6ZSAqLwogCW1heHAgPSB1c2JfbWF4cGFja2V0KHVzLT5wdXNiX2RldiwgcGlwZSwgdXNiX3BpcGVvdXQocGlwZSkpOwpAQCAtMzkzLDcgKzM5Myw3IEBACiB7CiAJaW50IHJlc3VsdDsKIAotCVVTX0RFQlVHUCgiJXM6IHhmZXIgJXUgYnl0ZXNcbiIsIF9fRlVOQ1RJT05fXywgbGVuZ3RoKTsKKwlVU19ERUJVR1AoIiVzOiB4ZmVyICV1IGJ5dGVzXG4iLCBfX2Z1bmNfXywgbGVuZ3RoKTsKIAogCS8qIGZpbGwgYW5kIHN1Ym1pdCB0aGUgVVJCICovCiAJdXNiX2ZpbGxfYnVsa191cmIodXMtPmN1cnJlbnRfdXJiLCB1cy0+cHVzYl9kZXYsIHBpcGUsIGJ1ZiwgbGVuZ3RoLApAQCAtNDI0LDcgKzQyNCw3IEBACiAJCXJldHVybiBVU0JfU1RPUl9YRkVSX0VSUk9SOwogCiAJLyogaW5pdGlhbGl6ZSB0aGUgc2NhdHRlci1nYXRoZXIgcmVxdWVzdCBibG9jayAqLwotCVVTX0RFQlVHUCgiJXM6IHhmZXIgJXUgYnl0ZXMsICVkIGVudHJpZXNcbiIsIF9fRlVOQ1RJT05fXywKKwlVU19ERUJVR1AoIiVzOiB4ZmVyICV1IGJ5dGVzLCAlZCBlbnRyaWVzXG4iLCBfX2Z1bmNfXywKIAkJCWxlbmd0aCwgbnVtX3NnKTsKIAlyZXN1bHQgPSB1c2Jfc2dfaW5pdCgmdXMtPmN1cnJlbnRfc2csIHVzLT5wdXNiX2RldiwgcGlwZSwgMCwKIAkJCXNnLCBudW1fc2csIGxlbmd0aCwgR0ZQX05PSU8pOwpAQCAtNjAzLDcgKzYwMyw4IEBACiAJCXNjc2lfZWhfcHJlcF9jbW5kKHNyYiwgJnNlcywgTlVMTCwgMCwgVVNfU0VOU0VfU0laRSk7CiAKIAkJLyogRklYTUU6IHdlIG11c3QgZG8gdGhlIHByb3RvY29sIHRyYW5zbGF0aW9uIGhlcmUgKi8KLQkJaWYgKHVzLT5zdWJjbGFzcyA9PSBVU19TQ19SQkMgfHwgdXMtPnN1YmNsYXNzID09IFVTX1NDX1NDU0kpCisJCWlmICh1cy0+c3ViY2xhc3MgPT0gVVNfU0NfUkJDIHx8IHVzLT5zdWJjbGFzcyA9PSBVU19TQ19TQ1NJIHx8CisJCQkJdXMtPnN1YmNsYXNzID09IFVTX1NDX0NZUF9BVEFDQikKIAkJCXNyYi0+Y21kX2xlbiA9IDY7CiAJCWVsc2UKIAkJCXNyYi0+Y21kX2xlbiA9IDEyOwpAQCAtNzAwLDcgKzcwMSw3IEBACiAvKiBTdG9wIHRoZSBjdXJyZW50IFVSQiB0cmFuc2ZlciAqLwogdm9pZCB1c2Jfc3Rvcl9zdG9wX3RyYW5zcG9ydChzdHJ1Y3QgdXNfZGF0YSAqdXMpCiB7Ci0JVVNfREVCVUdQKCIlcyBjYWxsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJVVNfREVCVUdQKCIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKIAogCS8qIElmIHRoZSBzdGF0ZSBtYWNoaW5lIGlzIGJsb2NrZWQgd2FpdGluZyBmb3IgYW4gVVJCLAogCSAqIGxldCdzIHdha2UgaXQgdXAuICBUaGUgdGVzdF9hbmRfY2xlYXJfYml0KCkgY2FsbApAQCAtMTEzNCw3ICsxMTM1LDcgQEAKIAogaW50IHVzYl9zdG9yX0NCX3Jlc2V0KHN0cnVjdCB1c19kYXRhICp1cykKIHsKLQlVU19ERUJVR1AoIiVzIGNhbGxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwlVU19ERUJVR1AoIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOwogCiAJbWVtc2V0KHVzLT5pb2J1ZiwgMHhGRiwgQ0JfUkVTRVRfQ01EX1NJWkUpOwogCXVzLT5pb2J1ZlswXSA9IFNFTkRfRElBR05PU1RJQzsKQEAgLTExNDksNyArMTE1MCw3IEBACiAgKi8KIGludCB1c2Jfc3Rvcl9CdWxrX3Jlc2V0KHN0cnVjdCB1c19kYXRhICp1cykKIHsKLQlVU19ERUJVR1AoIiVzIGNhbGxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwlVU19ERUJVR1AoIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOwogCiAJcmV0dXJuIHVzYl9zdG9yX3Jlc2V0X2NvbW1vbih1cywgVVNfQlVMS19SRVNFVF9SRVFVRVNULCAKIAkJCQkgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKaW5kZXggOTEyNTIwNy4uNzMyYmY1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaAorKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCkBAIC0xNzE5LDYgKzE3MTksMTQgQEAKIAkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCiAJCVVTX0ZMX0NBUEFDSVRZX0hFVVJJU1RJQ1MpLAogCisjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0NZUFJFU1NfQVRBQ0IKK1VOVVNVQUxfREVWKCAgMHgwNGI0LCAweDY4MzAsIDB4MDAwMCwgMHg5OTk5LAorCQkiQ3lwcmVzcyIsCisJCSJDeXByZXNzIEFUMkxQIiwKKwkJVVNfU0NfQ1lQX0FUQUNCLCBVU19QUl9CVUxLLCBOVUxMLAorCQkwKSwKKyNlbmRpZgorCiAvKiBDb250cm9sL0J1bGsgdHJhbnNwb3J0IGZvciBhbGwgU3ViQ2xhc3MgdmFsdWVzICovCiBVU1VBTF9ERVYoVVNfU0NfUkJDLCBVU19QUl9DQiwgVVNCX1VTX1RZUEVfU1RPUiksCiBVU1VBTF9ERVYoVVNfU0NfODAyMCwgVVNfUFJfQ0IsIFVTQl9VU19UWVBFX1NUT1IpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMKaW5kZXggYWM2MTE0ZS4uYTg1NmVmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCkBAIC0xMDEsNiArMTAxLDkgQEAKICNpZmRlZiBDT05GSUdfVVNCX1NUT1JBR0VfS0FSTUEKICNpbmNsdWRlICJrYXJtYS5oIgogI2VuZGlmCisjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0NZUFJFU1NfQVRBQ0IKKyNpbmNsdWRlICJjeXByZXNzX2F0YWNiLmgiCisjZW5kaWYKIAogLyogU29tZSBpbmZvcm1hdGlvbmFsIGRhdGEgKi8KIE1PRFVMRV9BVVRIT1IoIk1hdHRoZXcgRGhhcm0gPG1kaGFybS11c2JAb25lLWV5ZWQtYWxpZW4ubmV0PiIpOwpAQCAtMTg3LDcgKzE5MCw3IEBACiAJLyogV2FpdCB1bnRpbCBubyBjb21tYW5kIGlzIHJ1bm5pbmcgKi8KIAltdXRleF9sb2NrKCZ1cy0+ZGV2X211dGV4KTsKIAotCVVTX0RFQlVHUCgiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJVVNfREVCVUdQKCIlc1xuIiwgX19mdW5jX18pOwogCWlmICh1cy0+c3VzcGVuZF9yZXN1bWVfaG9vaykKIAkJKHVzLT5zdXNwZW5kX3Jlc3VtZV9ob29rKSh1cywgVVNfU1VTUEVORCk7CiAKQEAgLTIwNCw3ICsyMDcsNyBAQAogCiAJbXV0ZXhfbG9jaygmdXMtPmRldl9tdXRleCk7CiAKLQlVU19ERUJVR1AoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCVVTX0RFQlVHUCgiJXNcbiIsIF9fZnVuY19fKTsKIAlpZiAodXMtPnN1c3BlbmRfcmVzdW1lX2hvb2spCiAJCSh1cy0+c3VzcGVuZF9yZXN1bWVfaG9vaykodXMsIFVTX1JFU1VNRSk7CiAKQEAgLTIxNiw3ICsyMTksNyBAQAogewogCXN0cnVjdCB1c19kYXRhICp1cyA9IHVzYl9nZXRfaW50ZmRhdGEoaWZhY2UpOwogCi0JVVNfREVCVUdQKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlVU19ERUJVR1AoIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBSZXBvcnQgdGhlIHJlc2V0IHRvIHRoZSBTQ1NJIGNvcmUgKi8KIAl1c2Jfc3Rvcl9yZXBvcnRfYnVzX3Jlc2V0KHVzKTsKQEAgLTIzNyw3ICsyNDAsNyBAQAogewogCXN0cnVjdCB1c19kYXRhICp1cyA9IHVzYl9nZXRfaW50ZmRhdGEoaWZhY2UpOwogCi0JVVNfREVCVUdQKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlVU19ERUJVR1AoIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBNYWtlIHN1cmUgbm8gY29tbWFuZCBydW5zIGR1cmluZyB0aGUgcmVzZXQgKi8KIAltdXRleF9sb2NrKCZ1cy0+ZGV2X211dGV4KTsKQEAgLTI0OCw3ICsyNTEsNyBAQAogewogCXN0cnVjdCB1c19kYXRhICp1cyA9IHVzYl9nZXRfaW50ZmRhdGEoaWZhY2UpOwogCi0JVVNfREVCVUdQKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlVU19ERUJVR1AoIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBSZXBvcnQgdGhlIHJlc2V0IHRvIHRoZSBTQ1NJIGNvcmUgKi8KIAl1c2Jfc3Rvcl9yZXBvcnRfYnVzX3Jlc2V0KHVzKTsKQEAgLTQzNCw3ICs0MzcsNyBAQAogLyogQXNzb2NpYXRlIG91ciBwcml2YXRlIGRhdGEgd2l0aCB0aGUgVVNCIGRldmljZSAqLwogc3RhdGljIGludCBhc3NvY2lhdGVfZGV2KHN0cnVjdCB1c19kYXRhICp1cywgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7Ci0JVVNfREVCVUdQKCItLSAlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlVU19ERUJVR1AoIi0tICVzXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBGaWxsIGluIHRoZSBkZXZpY2UtcmVsYXRlZCBmaWVsZHMgKi8KIAl1cy0+cHVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwpAQCAtNzA4LDYgKzcxMSwxMyBAQAogCQlicmVhazsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0NZUFJFU1NfQVRBQ0IKKwljYXNlIFVTX1NDX0NZUF9BVEFDQjoKKwkJdXMtPnByb3RvY29sX25hbWUgPSAiVHJhbnNwYXJlbnQgU0NTSSB3aXRoIEN5cHJlc3MgQVRBQ0IiOworCQl1cy0+cHJvdG9faGFuZGxlciA9IGN5cHJlc3NfYXRhY2JfcGFzc3Rocm91Z2g7CisJCWJyZWFrOworI2VuZGlmCisKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC04MDYsNyArODE2LDcgQEAKIC8qIFJlbGVhc2UgYWxsIG91ciBkeW5hbWljIHJlc291cmNlcyAqLwogc3RhdGljIHZvaWQgdXNiX3N0b3JfcmVsZWFzZV9yZXNvdXJjZXMoc3RydWN0IHVzX2RhdGEgKnVzKQogewotCVVTX0RFQlVHUCgiLS0gJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJVVNfREVCVUdQKCItLSAlc1xuIiwgX19mdW5jX18pOwogCiAJLyogVGVsbCB0aGUgY29udHJvbCB0aHJlYWQgdG8gZXhpdC4gIFRoZSBTQ1NJIGhvc3QgbXVzdAogCSAqIGFscmVhZHkgaGF2ZSBiZWVuIHJlbW92ZWQgc28gaXQgd29uJ3QgdHJ5IHRvIHF1ZXVlCkBAIC04MzIsNyArODQyLDcgQEAKIC8qIERpc3NvY2lhdGUgZnJvbSB0aGUgVVNCIGRldmljZSAqLwogc3RhdGljIHZvaWQgZGlzc29jaWF0ZV9kZXYoc3RydWN0IHVzX2RhdGEgKnVzKQogewotCVVTX0RFQlVHUCgiLS0gJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJVVNfREVCVUdQKCItLSAlc1xuIiwgX19mdW5jX18pOwogCiAJa2ZyZWUodXMtPnNlbnNlYnVmKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvdXNiLXNrZWxldG9uLmMgYi9kcml2ZXJzL3VzYi91c2Itc2tlbGV0b24uYwppbmRleCBjODE1YTQwLi5iZTc2MDg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi91c2Itc2tlbGV0b24uYworKysgYi9kcml2ZXJzL3VzYi91c2Itc2tlbGV0b24uYwpAQCAtODgsNyArODgsNyBAQAogCWludGVyZmFjZSA9IHVzYl9maW5kX2ludGVyZmFjZSgmc2tlbF9kcml2ZXIsIHN1Ym1pbm9yKTsKIAlpZiAoIWludGVyZmFjZSkgewogCQllcnIgKCIlcyAtIGVycm9yLCBjYW4ndCBmaW5kIGRldmljZSBmb3IgbWlub3IgJWQiLAotCQkgICAgIF9fRlVOQ1RJT05fXywgc3VibWlub3IpOworCQkgICAgIF9fZnVuY19fLCBzdWJtaW5vcik7CiAJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC0yMTIsNyArMjEyLDcgQEAKIHsKIAlzdHJ1Y3QgdXNiX3NrZWwgKmRldjsKIAotCWRldiA9IChzdHJ1Y3QgdXNiX3NrZWwgKil1cmItPmNvbnRleHQ7CisJZGV2ID0gdXJiLT5jb250ZXh0OwogCiAJLyogc3luYy9hc3luYyB1bmxpbmsgZmF1bHRzIGFyZW4ndCBlcnJvcnMgKi8KIAlpZiAodXJiLT5zdGF0dXMpIHsKQEAgLTIyMCw3ICsyMjAsNyBAQAogCQkgICAgdXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQgfHwKIAkJICAgIHVyYi0+c3RhdHVzID09IC1FU0hVVERPV04pKQogCQkJZXJyKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJCSAgICBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJCSAgICBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwogCiAJCXNwaW5fbG9jaygmZGV2LT5lcnJfbG9jayk7CiAJCWRldi0+ZXJyb3JzID0gdXJiLT5zdGF0dXM7CkBAIC0zMDEsNyArMzAxLDcgQEAKIAlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9LRVJORUwpOwogCW11dGV4X3VubG9jaygmZGV2LT5pb19tdXRleCk7CiAJaWYgKHJldHZhbCkgewotCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWQiLCBfX2Z1bmNfXywgcmV0dmFsKTsKIAkJZ290byBlcnJvcl91bmFuY2hvcjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vS2NvbmZpZwppbmRleCAxYmQ1ZmIzLi5lM2RjOGY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL0tjb25maWcKKysrIGIvZHJpdmVycy92aWRlby9LY29uZmlnCkBAIC0xOTMwLDYgKzE5MzAsMjAgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIFhFTl9GQkRFVl9GUk9OVEVORAorCXRyaXN0YXRlICJYZW4gdmlydHVhbCBmcmFtZSBidWZmZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEZCICYmIFhFTgorCXNlbGVjdCBGQl9TWVNfRklMTFJFQ1QKKwlzZWxlY3QgRkJfU1lTX0NPUFlBUkVBCisJc2VsZWN0IEZCX1NZU19JTUFHRUJMSVQKKwlzZWxlY3QgRkJfU1lTX0ZPUFMKKwlzZWxlY3QgRkJfREVGRVJSRURfSU8KKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIGRyaXZlciBpbXBsZW1lbnRzIHRoZSBmcm9udC1lbmQgb2YgdGhlIFhlbiB2aXJ0dWFsCisJICBmcmFtZSBidWZmZXIgZHJpdmVyLiAgSXQgY29tbXVuaWNhdGVzIHdpdGggYSBiYWNrLWVuZAorCSAgaW4gYW5vdGhlciBkb21haW4uCisKIHNvdXJjZSAiZHJpdmVycy92aWRlby9vbWFwL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy92aWRlby9iYWNrbGlnaHQvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUgYi9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlCmluZGV4IDExYzBlNWUuLmYxNzJiOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy92aWRlby9NYWtlZmlsZQpAQCAtMTE0LDYgKzExNCw3IEBACiBvYmotJChDT05GSUdfRkJfU001MDEpICAgICAgICAgICAgKz0gc201MDFmYi5vCiBvYmotJChDT05GSUdfRkJfWElMSU5YKSAgICAgICAgICAgKz0geGlsaW54ZmIubwogb2JqLSQoQ09ORklHX0ZCX09NQVApICAgICAgICAgICAgICs9IG9tYXAvCitvYmotJChDT05GSUdfWEVOX0ZCREVWX0ZST05URU5EKSAgKz0geGVuLWZiZnJvbnQubwogCiAjIFBsYXRmb3JtIG9yIGZhbGxiYWNrIGRyaXZlcnMgZ28gaGVyZQogb2JqLSQoQ09ORklHX0ZCX1VWRVNBKSAgICAgICAgICAgICs9IHV2ZXNhZmIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby94ZW4tZmJmcm9udC5jIGIvZHJpdmVycy92aWRlby94ZW4tZmJmcm9udC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxOWE2ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL3hlbi1mYmZyb250LmMKQEAgLTAsMCArMSw1NTAgQEAKKy8qCisgKiBYZW4gcGFyYS12aXJ0dWFsIGZyYW1lIGJ1ZmZlciBkZXZpY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBBbnRob255IExpZ3VvcmkgPGFsaWd1b3JpQHVzLmlibS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBSZWQgSGF0LCBJbmMuLCBNYXJrdXMgQXJtYnJ1c3RlciA8YXJtYnJ1QHJlZGhhdC5jb20+CisgKgorICogIEJhc2VkIG9uIGxpbnV4L2RyaXZlcnMvdmlkZW8vcTQwZmIuYworICoKKyAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yCisgKiAgbW9yZSBkZXRhaWxzLgorICovCisKKy8qCisgKiBUT0RPOgorICoKKyAqIFN3aXRjaCB0byBncmFudCB0YWJsZXMgd2hlbiB0aGV5IGJlY29tZSBjYXBhYmxlIG9mIGRlYWxpbmcgd2l0aCB0aGUKKyAqIGZyYW1lIGJ1ZmZlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJ2aXNvci5oPgorI2luY2x1ZGUgPHhlbi9ldmVudHMuaD4KKyNpbmNsdWRlIDx4ZW4vcGFnZS5oPgorI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvaW8vZmJpZi5oPgorI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvaW8vcHJvdG9jb2xzLmg+CisjaW5jbHVkZSA8eGVuL3hlbmJ1cy5oPgorCitzdHJ1Y3QgeGVuZmJfaW5mbyB7CisJdW5zaWduZWQgY2hhcgkJKmZiOworCXN0cnVjdCBmYl9pbmZvCQkqZmJfaW5mbzsKKwlpbnQJCQl4MSwgeTEsIHgyLCB5MjsJLyogZGlydHkgcmVjdGFuZ2xlLAorCQkJCQkJICAgcHJvdGVjdGVkIGJ5IGRpcnR5X2xvY2sgKi8KKwlzcGlubG9ja190CQlkaXJ0eV9sb2NrOworCWludAkJCW5yX3BhZ2VzOworCWludAkJCWlycTsKKwlzdHJ1Y3QgeGVuZmJfcGFnZQkqcGFnZTsKKwl1bnNpZ25lZCBsb25nIAkJKm1mbnM7CisJaW50CQkJdXBkYXRlX3dhbnRlZDsgLyogWEVORkJfVFlQRV9VUERBVEUgd2FudGVkICovCisKKwlzdHJ1Y3QgeGVuYnVzX2RldmljZQkqeGJkZXY7Cit9OworCitzdGF0aWMgdTMyIHhlbmZiX21lbV9sZW4gPSBYRU5GQl9XSURUSCAqIFhFTkZCX0hFSUdIVCAqIFhFTkZCX0RFUFRIIC8gODsKKworc3RhdGljIGludCB4ZW5mYl9yZW1vdmUoc3RydWN0IHhlbmJ1c19kZXZpY2UgKik7CitzdGF0aWMgdm9pZCB4ZW5mYl9pbml0X3NoYXJlZF9wYWdlKHN0cnVjdCB4ZW5mYl9pbmZvICopOworc3RhdGljIGludCB4ZW5mYl9jb25uZWN0X2JhY2tlbmQoc3RydWN0IHhlbmJ1c19kZXZpY2UgKiwgc3RydWN0IHhlbmZiX2luZm8gKik7CitzdGF0aWMgdm9pZCB4ZW5mYl9kaXNjb25uZWN0X2JhY2tlbmQoc3RydWN0IHhlbmZiX2luZm8gKik7CisKK3N0YXRpYyB2b2lkIHhlbmZiX2RvX3VwZGF0ZShzdHJ1Y3QgeGVuZmJfaW5mbyAqaW5mbywKKwkJCSAgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkKK3sKKwl1bmlvbiB4ZW5mYl9vdXRfZXZlbnQgZXZlbnQ7CisJdTMyIHByb2Q7CisKKwlldmVudC50eXBlID0gWEVORkJfVFlQRV9VUERBVEU7CisJZXZlbnQudXBkYXRlLnggPSB4OworCWV2ZW50LnVwZGF0ZS55ID0geTsKKwlldmVudC51cGRhdGUud2lkdGggPSB3OworCWV2ZW50LnVwZGF0ZS5oZWlnaHQgPSBoOworCisJcHJvZCA9IGluZm8tPnBhZ2UtPm91dF9wcm9kOworCS8qIGNhbGxlciBlbnN1cmVzICF4ZW5mYl9xdWV1ZV9mdWxsKCkgKi8KKwltYigpOwkJCS8qIGVuc3VyZSByaW5nIHNwYWNlIGF2YWlsYWJsZSAqLworCVhFTkZCX09VVF9SSU5HX1JFRihpbmZvLT5wYWdlLCBwcm9kKSA9IGV2ZW50OworCXdtYigpOwkJCS8qIGVuc3VyZSByaW5nIGNvbnRlbnRzIHZpc2libGUgKi8KKwlpbmZvLT5wYWdlLT5vdXRfcHJvZCA9IHByb2QgKyAxOworCisJbm90aWZ5X3JlbW90ZV92aWFfaXJxKGluZm8tPmlycSk7Cit9CisKK3N0YXRpYyBpbnQgeGVuZmJfcXVldWVfZnVsbChzdHJ1Y3QgeGVuZmJfaW5mbyAqaW5mbykKK3sKKwl1MzIgY29ucywgcHJvZDsKKworCXByb2QgPSBpbmZvLT5wYWdlLT5vdXRfcHJvZDsKKwljb25zID0gaW5mby0+cGFnZS0+b3V0X2NvbnM7CisJcmV0dXJuIHByb2QgLSBjb25zID09IFhFTkZCX09VVF9SSU5HX0xFTjsKK30KKworc3RhdGljIHZvaWQgeGVuZmJfcmVmcmVzaChzdHJ1Y3QgeGVuZmJfaW5mbyAqaW5mbywKKwkJCSAgaW50IHgxLCBpbnQgeTEsIGludCB3LCBpbnQgaCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB5MiA9IHkxICsgaCAtIDE7CisJaW50IHgyID0geDEgKyB3IC0gMTsKKworCWlmICghaW5mby0+dXBkYXRlX3dhbnRlZCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmRpcnR5X2xvY2ssIGZsYWdzKTsKKworCS8qIENvbWJpbmUgd2l0aCBkaXJ0eSByZWN0YW5nbGU6ICovCisJaWYgKGluZm8tPnkxIDwgeTEpCisJCXkxID0gaW5mby0+eTE7CisJaWYgKGluZm8tPnkyID4geTIpCisJCXkyID0gaW5mby0+eTI7CisJaWYgKGluZm8tPngxIDwgeDEpCisJCXgxID0gaW5mby0+eDE7CisJaWYgKGluZm8tPngyID4geDIpCisJCXgyID0gaW5mby0+eDI7CisKKwlpZiAoeGVuZmJfcXVldWVfZnVsbChpbmZvKSkgeworCQkvKiBDYW4ndCBzZW5kIHJpZ2h0IG5vdywgc3Rhc2ggaXQgaW4gdGhlIGRpcnR5IHJlY3RhbmdsZSAqLworCQlpbmZvLT54MSA9IHgxOworCQlpbmZvLT54MiA9IHgyOworCQlpbmZvLT55MSA9IHkxOworCQlpbmZvLT55MiA9IHkyOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5kaXJ0eV9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBDbGVhciBkaXJ0eSByZWN0YW5nbGU6ICovCisJaW5mby0+eDEgPSBpbmZvLT55MSA9IElOVF9NQVg7CisJaW5mby0+eDIgPSBpbmZvLT55MiA9IDA7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5kaXJ0eV9sb2NrLCBmbGFncyk7CisKKwlpZiAoeDEgPD0geDIgJiYgeTEgPD0geTIpCisJCXhlbmZiX2RvX3VwZGF0ZShpbmZvLCB4MSwgeTEsIHgyIC0geDEgKyAxLCB5MiAtIHkxICsgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHhlbmZiX2RlZmVycmVkX2lvKHN0cnVjdCBmYl9pbmZvICpmYl9pbmZvLAorCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqcGFnZWxpc3QpCit7CisJc3RydWN0IHhlbmZiX2luZm8gKmluZm8gPSBmYl9pbmZvLT5wYXI7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgbG9uZyBiZWcsIGVuZDsKKwlpbnQgeTEsIHkyLCBtaW55LCBtYXh5OworCisJbWlueSA9IElOVF9NQVg7CisJbWF4eSA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwYWdlLCBwYWdlbGlzdCwgbHJ1KSB7CisJCWJlZyA9IHBhZ2UtPmluZGV4IDw8IFBBR0VfU0hJRlQ7CisJCWVuZCA9IGJlZyArIFBBR0VfU0laRSAtIDE7CisJCXkxID0gYmVnIC8gZmJfaW5mby0+Zml4LmxpbmVfbGVuZ3RoOworCQl5MiA9IGVuZCAvIGZiX2luZm8tPmZpeC5saW5lX2xlbmd0aDsKKwkJaWYgKHkyID49IGZiX2luZm8tPnZhci55cmVzKQorCQkJeTIgPSBmYl9pbmZvLT52YXIueXJlcyAtIDE7CisJCWlmIChtaW55ID4geTEpCisJCQltaW55ID0geTE7CisJCWlmIChtYXh5IDwgeTIpCisJCQltYXh5ID0geTI7CisJfQorCXhlbmZiX3JlZnJlc2goaW5mbywgMCwgbWlueSwgZmJfaW5mby0+dmFyLnhyZXMsIG1heHkgLSBtaW55ICsgMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmJfZGVmZXJyZWRfaW8geGVuZmJfZGVmaW8gPSB7CisJLmRlbGF5CQk9IEhaIC8gMjAsCisJLmRlZmVycmVkX2lvCT0geGVuZmJfZGVmZXJyZWRfaW8sCit9OworCitzdGF0aWMgaW50IHhlbmZiX3NldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwKKwkJCSAgIHVuc2lnbmVkIGJsdWUsIHVuc2lnbmVkIHRyYW5zcCwKKwkJCSAgIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXUzMiB2OworCisJaWYgKHJlZ25vID4gaW5mby0+Y21hcC5sZW4pCisJCXJldHVybiAxOworCisjZGVmaW5lIENOVlRfVE9IVyh2YWwsIHdpZHRoKSAoKCgodmFsKTw8KHdpZHRoKSkrMHg3RkZGLSh2YWwpKT4+MTYpCisJcmVkID0gQ05WVF9UT0hXKHJlZCwgaW5mby0+dmFyLnJlZC5sZW5ndGgpOworCWdyZWVuID0gQ05WVF9UT0hXKGdyZWVuLCBpbmZvLT52YXIuZ3JlZW4ubGVuZ3RoKTsKKwlibHVlID0gQ05WVF9UT0hXKGJsdWUsIGluZm8tPnZhci5ibHVlLmxlbmd0aCk7CisJdHJhbnNwID0gQ05WVF9UT0hXKHRyYW5zcCwgaW5mby0+dmFyLnRyYW5zcC5sZW5ndGgpOworI3VuZGVmIENOVlRfVE9IVworCisJdiA9IChyZWQgPDwgaW5mby0+dmFyLnJlZC5vZmZzZXQpIHwKKwkgICAgKGdyZWVuIDw8IGluZm8tPnZhci5ncmVlbi5vZmZzZXQpIHwKKwkgICAgKGJsdWUgPDwgaW5mby0+dmFyLmJsdWUub2Zmc2V0KTsKKworCXN3aXRjaCAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSAxNjoKKwljYXNlIDI0OgorCWNhc2UgMzI6CisJCSgodTMyICopaW5mby0+cHNldWRvX3BhbGV0dGUpW3JlZ25vXSA9IHY7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB4ZW5mYl9maWxscmVjdChzdHJ1Y3QgZmJfaW5mbyAqcCwgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpyZWN0KQoreworCXN0cnVjdCB4ZW5mYl9pbmZvICppbmZvID0gcC0+cGFyOworCisJc3lzX2ZpbGxyZWN0KHAsIHJlY3QpOworCXhlbmZiX3JlZnJlc2goaW5mbywgcmVjdC0+ZHgsIHJlY3QtPmR5LCByZWN0LT53aWR0aCwgcmVjdC0+aGVpZ2h0KTsKK30KKworc3RhdGljIHZvaWQgeGVuZmJfaW1hZ2VibGl0KHN0cnVjdCBmYl9pbmZvICpwLCBjb25zdCBzdHJ1Y3QgZmJfaW1hZ2UgKmltYWdlKQoreworCXN0cnVjdCB4ZW5mYl9pbmZvICppbmZvID0gcC0+cGFyOworCisJc3lzX2ltYWdlYmxpdChwLCBpbWFnZSk7CisJeGVuZmJfcmVmcmVzaChpbmZvLCBpbWFnZS0+ZHgsIGltYWdlLT5keSwgaW1hZ2UtPndpZHRoLCBpbWFnZS0+aGVpZ2h0KTsKK30KKworc3RhdGljIHZvaWQgeGVuZmJfY29weWFyZWEoc3RydWN0IGZiX2luZm8gKnAsIGNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSAqYXJlYSkKK3sKKwlzdHJ1Y3QgeGVuZmJfaW5mbyAqaW5mbyA9IHAtPnBhcjsKKworCXN5c19jb3B5YXJlYShwLCBhcmVhKTsKKwl4ZW5mYl9yZWZyZXNoKGluZm8sIGFyZWEtPmR4LCBhcmVhLT5keSwgYXJlYS0+d2lkdGgsIGFyZWEtPmhlaWdodCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHhlbmZiX3dyaXRlKHN0cnVjdCBmYl9pbmZvICpwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHhlbmZiX2luZm8gKmluZm8gPSBwLT5wYXI7CisJc3NpemVfdCByZXM7CisKKwlyZXMgPSBmYl9zeXNfd3JpdGUocCwgYnVmLCBjb3VudCwgcHBvcyk7CisJeGVuZmJfcmVmcmVzaChpbmZvLCAwLCAwLCBpbmZvLT5wYWdlLT53aWR0aCwgaW5mby0+cGFnZS0+aGVpZ2h0KTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3RydWN0IGZiX29wcyB4ZW5mYl9mYl9vcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5mYl9yZWFkCT0gZmJfc3lzX3JlYWQsCisJLmZiX3dyaXRlCT0geGVuZmJfd3JpdGUsCisJLmZiX3NldGNvbHJlZwk9IHhlbmZiX3NldGNvbHJlZywKKwkuZmJfZmlsbHJlY3QJPSB4ZW5mYl9maWxscmVjdCwKKwkuZmJfY29weWFyZWEJPSB4ZW5mYl9jb3B5YXJlYSwKKwkuZmJfaW1hZ2VibGl0CT0geGVuZmJfaW1hZ2VibGl0LAorfTsKKworc3RhdGljIGlycXJldHVybl90IHhlbmZiX2V2ZW50X2hhbmRsZXIoaW50IHJxLCB2b2lkICpkZXZfaWQpCit7CisJLyoKKwkgKiBObyBpbiBldmVudHMgcmVjb2duaXplZCwgc2ltcGx5IGlnbm9yZSB0aGVtIGFsbC4KKwkgKiBJZiB5b3UgbmVlZCB0byByZWNvZ25pemUgc29tZSwgc2VlIHhlbi1rYmRmcm9udCdzCisJICogaW5wdXRfaGFuZGxlcigpIGZvciBob3cgdG8gZG8gdGhhdC4KKwkgKi8KKwlzdHJ1Y3QgeGVuZmJfaW5mbyAqaW5mbyA9IGRldl9pZDsKKwlzdHJ1Y3QgeGVuZmJfcGFnZSAqcGFnZSA9IGluZm8tPnBhZ2U7CisKKwlpZiAocGFnZS0+aW5fY29ucyAhPSBwYWdlLT5pbl9wcm9kKSB7CisJCWluZm8tPnBhZ2UtPmluX2NvbnMgPSBpbmZvLT5wYWdlLT5pbl9wcm9kOworCQlub3RpZnlfcmVtb3RlX3ZpYV9pcnEoaW5mby0+aXJxKTsKKwl9CisKKwkvKiBGbHVzaCBkaXJ0eSByZWN0YW5nbGU6ICovCisJeGVuZmJfcmVmcmVzaChpbmZvLCBJTlRfTUFYLCBJTlRfTUFYLCAtSU5UX01BWCwgLUlOVF9NQVgpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCB4ZW5mYl9wcm9iZShzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2LAorCQkJCSBjb25zdCBzdHJ1Y3QgeGVuYnVzX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHhlbmZiX2luZm8gKmluZm87CisJc3RydWN0IGZiX2luZm8gKmZiX2luZm87CisJaW50IHJldDsKKworCWluZm8gPSBremFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOworCWlmIChpbmZvID09IE5VTEwpIHsKKwkJeGVuYnVzX2Rldl9mYXRhbChkZXYsIC1FTk9NRU0sICJhbGxvY2F0aW5nIGluZm8gc3RydWN0dXJlIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlkZXYtPmRldi5kcml2ZXJfZGF0YSA9IGluZm87CisJaW5mby0+eGJkZXYgPSBkZXY7CisJaW5mby0+aXJxID0gLTE7CisJaW5mby0+eDEgPSBpbmZvLT55MSA9IElOVF9NQVg7CisJc3Bpbl9sb2NrX2luaXQoJmluZm8tPmRpcnR5X2xvY2spOworCisJaW5mby0+ZmIgPSB2bWFsbG9jKHhlbmZiX21lbV9sZW4pOworCWlmIChpbmZvLT5mYiA9PSBOVUxMKQorCQlnb3RvIGVycm9yX25vbWVtOworCW1lbXNldChpbmZvLT5mYiwgMCwgeGVuZmJfbWVtX2xlbik7CisKKwlpbmZvLT5ucl9wYWdlcyA9ICh4ZW5mYl9tZW1fbGVuICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKKworCWluZm8tPm1mbnMgPSB2bWFsbG9jKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIGluZm8tPm5yX3BhZ2VzKTsKKwlpZiAoIWluZm8tPm1mbnMpCisJCWdvdG8gZXJyb3Jfbm9tZW07CisKKwkvKiBzZXQgdXAgc2hhcmVkIHBhZ2UgKi8KKwlpbmZvLT5wYWdlID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pOworCWlmICghaW5mby0+cGFnZSkKKwkJZ290byBlcnJvcl9ub21lbTsKKworCXhlbmZiX2luaXRfc2hhcmVkX3BhZ2UoaW5mbyk7CisKKwkvKiBhYnVzaW5nIGZyYW1lYnVmZmVyX2FsbG9jKCkgdG8gYWxsb2NhdGUgcHNldWRvX3BhbGV0dGUgKi8KKwlmYl9pbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHUzMikgKiAyNTYsIE5VTEwpOworCWlmIChmYl9pbmZvID09IE5VTEwpCisJCWdvdG8gZXJyb3Jfbm9tZW07CisKKwkvKiBjb21wbGV0ZSB0aGUgYWJ1c2U6ICovCisJZmJfaW5mby0+cHNldWRvX3BhbGV0dGUgPSBmYl9pbmZvLT5wYXI7CisJZmJfaW5mby0+cGFyID0gaW5mbzsKKworCWZiX2luZm8tPnNjcmVlbl9iYXNlID0gaW5mby0+ZmI7CisKKwlmYl9pbmZvLT5mYm9wcyA9ICZ4ZW5mYl9mYl9vcHM7CisJZmJfaW5mby0+dmFyLnhyZXNfdmlydHVhbCA9IGZiX2luZm8tPnZhci54cmVzID0gaW5mby0+cGFnZS0+d2lkdGg7CisJZmJfaW5mby0+dmFyLnlyZXNfdmlydHVhbCA9IGZiX2luZm8tPnZhci55cmVzID0gaW5mby0+cGFnZS0+aGVpZ2h0OworCWZiX2luZm8tPnZhci5iaXRzX3Blcl9waXhlbCA9IGluZm8tPnBhZ2UtPmRlcHRoOworCisJZmJfaW5mby0+dmFyLnJlZCA9IChzdHJ1Y3QgZmJfYml0ZmllbGQpezE2LCA4LCAwfTsKKwlmYl9pbmZvLT52YXIuZ3JlZW4gPSAoc3RydWN0IGZiX2JpdGZpZWxkKXs4LCA4LCAwfTsKKwlmYl9pbmZvLT52YXIuYmx1ZSA9IChzdHJ1Y3QgZmJfYml0ZmllbGQpezAsIDgsIDB9OworCisJZmJfaW5mby0+dmFyLmFjdGl2YXRlID0gRkJfQUNUSVZBVEVfTk9XOworCWZiX2luZm8tPnZhci5oZWlnaHQgPSAtMTsKKwlmYl9pbmZvLT52YXIud2lkdGggPSAtMTsKKwlmYl9pbmZvLT52YXIudm1vZGUgPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEOworCisJZmJfaW5mby0+Zml4LnZpc3VhbCA9IEZCX1ZJU1VBTF9UUlVFQ09MT1I7CisJZmJfaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gaW5mby0+cGFnZS0+bGluZV9sZW5ndGg7CisJZmJfaW5mby0+Zml4LnNtZW1fc3RhcnQgPSAwOworCWZiX2luZm8tPmZpeC5zbWVtX2xlbiA9IHhlbmZiX21lbV9sZW47CisJc3RyY3B5KGZiX2luZm8tPmZpeC5pZCwgInhlbiIpOworCWZiX2luZm8tPmZpeC50eXBlID0gRkJfVFlQRV9QQUNLRURfUElYRUxTOworCWZiX2luZm8tPmZpeC5hY2NlbCA9IEZCX0FDQ0VMX05PTkU7CisKKwlmYl9pbmZvLT5mbGFncyA9IEZCSU5GT19GTEFHX0RFRkFVTFQ7CisKKwlyZXQgPSBmYl9hbGxvY19jbWFwKCZmYl9pbmZvLT5jbWFwLCAyNTYsIDApOworCWlmIChyZXQgPCAwKSB7CisJCWZyYW1lYnVmZmVyX3JlbGVhc2UoZmJfaW5mbyk7CisJCXhlbmJ1c19kZXZfZmF0YWwoZGV2LCByZXQsICJmYl9hbGxvY19jbWFwIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZmJfaW5mby0+ZmJkZWZpbyA9ICZ4ZW5mYl9kZWZpbzsKKwlmYl9kZWZlcnJlZF9pb19pbml0KGZiX2luZm8pOworCisJcmV0ID0gcmVnaXN0ZXJfZnJhbWVidWZmZXIoZmJfaW5mbyk7CisJaWYgKHJldCkgeworCQlmYl9kZWZlcnJlZF9pb19jbGVhbnVwKGZiX2luZm8pOworCQlmYl9kZWFsbG9jX2NtYXAoJmZiX2luZm8tPmNtYXApOworCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGZiX2luZm8pOworCQl4ZW5idXNfZGV2X2ZhdGFsKGRldiwgcmV0LCAicmVnaXN0ZXJfZnJhbWVidWZmZXIiKTsKKwkJZ290byBlcnJvcjsKKwl9CisJaW5mby0+ZmJfaW5mbyA9IGZiX2luZm87CisKKwlyZXQgPSB4ZW5mYl9jb25uZWN0X2JhY2tlbmQoZGV2LCBpbmZvKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiAwOworCisgZXJyb3Jfbm9tZW06CisJcmV0ID0gLUVOT01FTTsKKwl4ZW5idXNfZGV2X2ZhdGFsKGRldiwgcmV0LCAiYWxsb2NhdGluZyBkZXZpY2UgbWVtb3J5Iik7CisgZXJyb3I6CisJeGVuZmJfcmVtb3ZlKGRldik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB4ZW5mYl9yZXN1bWUoc3RydWN0IHhlbmJ1c19kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGVuZmJfaW5mbyAqaW5mbyA9IGRldi0+ZGV2LmRyaXZlcl9kYXRhOworCisJeGVuZmJfZGlzY29ubmVjdF9iYWNrZW5kKGluZm8pOworCXhlbmZiX2luaXRfc2hhcmVkX3BhZ2UoaW5mbyk7CisJcmV0dXJuIHhlbmZiX2Nvbm5lY3RfYmFja2VuZChkZXYsIGluZm8pOworfQorCitzdGF0aWMgaW50IHhlbmZiX3JlbW92ZShzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4ZW5mYl9pbmZvICppbmZvID0gZGV2LT5kZXYuZHJpdmVyX2RhdGE7CisKKwl4ZW5mYl9kaXNjb25uZWN0X2JhY2tlbmQoaW5mbyk7CisJaWYgKGluZm8tPmZiX2luZm8pIHsKKwkJZmJfZGVmZXJyZWRfaW9fY2xlYW51cChpbmZvLT5mYl9pbmZvKTsKKwkJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvLT5mYl9pbmZvKTsKKwkJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5mYl9pbmZvLT5jbWFwKTsKKwkJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvLT5mYl9pbmZvKTsKKwl9CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWluZm8tPnBhZ2UpOworCXZmcmVlKGluZm8tPm1mbnMpOworCXZmcmVlKGluZm8tPmZiKTsKKwlrZnJlZShpbmZvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB2bWFsbG9jX3RvX21mbih2b2lkICphZGRyZXNzKQoreworCXJldHVybiBwZm5fdG9fbWZuKHZtYWxsb2NfdG9fcGZuKGFkZHJlc3MpKTsKK30KKworc3RhdGljIHZvaWQgeGVuZmJfaW5pdF9zaGFyZWRfcGFnZShzdHJ1Y3QgeGVuZmJfaW5mbyAqaW5mbykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5ucl9wYWdlczsgaSsrKQorCQlpbmZvLT5tZm5zW2ldID0gdm1hbGxvY190b19tZm4oaW5mby0+ZmIgKyBpICogUEFHRV9TSVpFKTsKKworCWluZm8tPnBhZ2UtPnBkWzBdID0gdm1hbGxvY190b19tZm4oaW5mby0+bWZucyk7CisJaW5mby0+cGFnZS0+cGRbMV0gPSAwOworCWluZm8tPnBhZ2UtPndpZHRoID0gWEVORkJfV0lEVEg7CisJaW5mby0+cGFnZS0+aGVpZ2h0ID0gWEVORkJfSEVJR0hUOworCWluZm8tPnBhZ2UtPmRlcHRoID0gWEVORkJfREVQVEg7CisJaW5mby0+cGFnZS0+bGluZV9sZW5ndGggPSAoaW5mby0+cGFnZS0+ZGVwdGggLyA4KSAqIGluZm8tPnBhZ2UtPndpZHRoOworCWluZm8tPnBhZ2UtPm1lbV9sZW5ndGggPSB4ZW5mYl9tZW1fbGVuOworCWluZm8tPnBhZ2UtPmluX2NvbnMgPSBpbmZvLT5wYWdlLT5pbl9wcm9kID0gMDsKKwlpbmZvLT5wYWdlLT5vdXRfY29ucyA9IGluZm8tPnBhZ2UtPm91dF9wcm9kID0gMDsKK30KKworc3RhdGljIGludCB4ZW5mYl9jb25uZWN0X2JhY2tlbmQoc3RydWN0IHhlbmJ1c19kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IHhlbmZiX2luZm8gKmluZm8pCit7CisJaW50IHJldCwgZXZ0Y2huOworCXN0cnVjdCB4ZW5idXNfdHJhbnNhY3Rpb24geGJ0OworCisJcmV0ID0geGVuYnVzX2FsbG9jX2V2dGNobihkZXYsICZldnRjaG4pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gYmluZF9ldnRjaG5fdG9faXJxaGFuZGxlcihldnRjaG4sIHhlbmZiX2V2ZW50X2hhbmRsZXIsCisJCQkJCTAsIGRldi0+ZGV2aWNldHlwZSwgaW5mbyk7CisJaWYgKHJldCA8IDApIHsKKwkJeGVuYnVzX2ZyZWVfZXZ0Y2huKGRldiwgZXZ0Y2huKTsKKwkJeGVuYnVzX2Rldl9mYXRhbChkZXYsIHJldCwgImJpbmRfZXZ0Y2huX3RvX2lycWhhbmRsZXIiKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaW5mby0+aXJxID0gcmV0OworCisgYWdhaW46CisJcmV0ID0geGVuYnVzX3RyYW5zYWN0aW9uX3N0YXJ0KCZ4YnQpOworCWlmIChyZXQpIHsKKwkJeGVuYnVzX2Rldl9mYXRhbChkZXYsIHJldCwgInN0YXJ0aW5nIHRyYW5zYWN0aW9uIik7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IHhlbmJ1c19wcmludGYoeGJ0LCBkZXYtPm5vZGVuYW1lLCAicGFnZS1yZWYiLCAiJWx1IiwKKwkJCSAgICB2aXJ0X3RvX21mbihpbmZvLT5wYWdlKSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl94ZW5idXM7CisJcmV0ID0geGVuYnVzX3ByaW50Zih4YnQsIGRldi0+bm9kZW5hbWUsICJldmVudC1jaGFubmVsIiwgIiV1IiwKKwkJCSAgICBldnRjaG4pOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfeGVuYnVzOworCXJldCA9IHhlbmJ1c19wcmludGYoeGJ0LCBkZXYtPm5vZGVuYW1lLCAicHJvdG9jb2wiLCAiJXMiLAorCQkJICAgIFhFTl9JT19QUk9UT19BQklfTkFUSVZFKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3hlbmJ1czsKKwlyZXQgPSB4ZW5idXNfcHJpbnRmKHhidCwgZGV2LT5ub2RlbmFtZSwgImZlYXR1cmUtdXBkYXRlIiwgIjEiKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3hlbmJ1czsKKwlyZXQgPSB4ZW5idXNfdHJhbnNhY3Rpb25fZW5kKHhidCwgMCk7CisJaWYgKHJldCkgeworCQlpZiAocmV0ID09IC1FQUdBSU4pCisJCQlnb3RvIGFnYWluOworCQl4ZW5idXNfZGV2X2ZhdGFsKGRldiwgcmV0LCAiY29tcGxldGluZyB0cmFuc2FjdGlvbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXhlbmJ1c19zd2l0Y2hfc3RhdGUoZGV2LCBYZW5idXNTdGF0ZUluaXRpYWxpc2VkKTsKKwlyZXR1cm4gMDsKKworIGVycm9yX3hlbmJ1czoKKwl4ZW5idXNfdHJhbnNhY3Rpb25fZW5kKHhidCwgMSk7CisJeGVuYnVzX2Rldl9mYXRhbChkZXYsIHJldCwgIndyaXRpbmcgeGVuc3RvcmUiKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB4ZW5mYl9kaXNjb25uZWN0X2JhY2tlbmQoc3RydWN0IHhlbmZiX2luZm8gKmluZm8pCit7CisJaWYgKGluZm8tPmlycSA+PSAwKQorCQl1bmJpbmRfZnJvbV9pcnFoYW5kbGVyKGluZm8tPmlycSwgaW5mbyk7CisJaW5mby0+aXJxID0gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHhlbmZiX2JhY2tlbmRfY2hhbmdlZChzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2LAorCQkJCSAgZW51bSB4ZW5idXNfc3RhdGUgYmFja2VuZF9zdGF0ZSkKK3sKKwlzdHJ1Y3QgeGVuZmJfaW5mbyAqaW5mbyA9IGRldi0+ZGV2LmRyaXZlcl9kYXRhOworCWludCB2YWw7CisKKwlzd2l0Y2ggKGJhY2tlbmRfc3RhdGUpIHsKKwljYXNlIFhlbmJ1c1N0YXRlSW5pdGlhbGlzaW5nOgorCWNhc2UgWGVuYnVzU3RhdGVJbml0aWFsaXNlZDoKKwljYXNlIFhlbmJ1c1N0YXRlVW5rbm93bjoKKwljYXNlIFhlbmJ1c1N0YXRlQ2xvc2VkOgorCQlicmVhazsKKworCWNhc2UgWGVuYnVzU3RhdGVJbml0V2FpdDoKK0luaXRXYWl0OgorCQl4ZW5idXNfc3dpdGNoX3N0YXRlKGRldiwgWGVuYnVzU3RhdGVDb25uZWN0ZWQpOworCQlicmVhazsKKworCWNhc2UgWGVuYnVzU3RhdGVDb25uZWN0ZWQ6CisJCS8qCisJCSAqIFdvcmsgYXJvdW5kIHhlbmJ1cyByYWNlIGNvbmRpdGlvbjogSWYgYmFja2VuZCBnb2VzCisJCSAqIHRocm91Z2ggSW5pdFdhaXQgdG8gQ29ubmVjdGVkIGZhc3QgZW5vdWdoLCB3ZSBjYW4KKwkJICogZ2V0IENvbm5lY3RlZCB0d2ljZSBoZXJlLgorCQkgKi8KKwkJaWYgKGRldi0+c3RhdGUgIT0gWGVuYnVzU3RhdGVDb25uZWN0ZWQpCisJCQlnb3RvIEluaXRXYWl0OyAvKiBubyBJbml0V2FpdCBzZWVuIHlldCwgZnVkZ2UgaXQgKi8KKworCQlpZiAoeGVuYnVzX3NjYW5mKFhCVF9OSUwsIGluZm8tPnhiZGV2LT5vdGhlcmVuZCwKKwkJCQkgInJlcXVlc3QtdXBkYXRlIiwgIiVkIiwgJnZhbCkgPCAwKQorCQkJdmFsID0gMDsKKwkJaWYgKHZhbCkKKwkJCWluZm8tPnVwZGF0ZV93YW50ZWQgPSAxOworCQlicmVhazsKKworCWNhc2UgWGVuYnVzU3RhdGVDbG9zaW5nOgorCQl4ZW5idXNfZnJvbnRlbmRfY2xvc2VkKGRldik7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHN0cnVjdCB4ZW5idXNfZGV2aWNlX2lkIHhlbmZiX2lkc1tdID0geworCXsgInZmYiIgfSwKKwl7ICIiIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgeGVuYnVzX2RyaXZlciB4ZW5mYiA9IHsKKwkubmFtZSA9ICJ2ZmIiLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5pZHMgPSB4ZW5mYl9pZHMsCisJLnByb2JlID0geGVuZmJfcHJvYmUsCisJLnJlbW92ZSA9IHhlbmZiX3JlbW92ZSwKKwkucmVzdW1lID0geGVuZmJfcmVzdW1lLAorCS5vdGhlcmVuZF9jaGFuZ2VkID0geGVuZmJfYmFja2VuZF9jaGFuZ2VkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgeGVuZmJfaW5pdCh2b2lkKQoreworCWlmICghaXNfcnVubmluZ19vbl94ZW4oKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBOb3RoaW5nIHRvIGRvIGlmIHJ1bm5pbmcgaW4gZG9tMC4gKi8KKwlpZiAoaXNfaW5pdGlhbF94ZW5kb21haW4oKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4geGVuYnVzX3JlZ2lzdGVyX2Zyb250ZW5kKCZ4ZW5mYik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB4ZW5mYl9jbGVhbnVwKHZvaWQpCit7CisJeGVuYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZ4ZW5mYik7Cit9CisKK21vZHVsZV9pbml0KHhlbmZiX2luaXQpOworbW9kdWxlX2V4aXQoeGVuZmJfY2xlYW51cCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL0tjb25maWcgYi9kcml2ZXJzL3hlbi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNzVhMTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3hlbi9LY29uZmlnCkBAIC0wLDAgKzEsMTkgQEAKK2NvbmZpZyBYRU5fQkFMTE9PTgorCWJvb2wgIlhlbiBtZW1vcnkgYmFsbG9vbiBkcml2ZXIiCisJZGVwZW5kcyBvbiBYRU4KKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGUgYmFsbG9vbiBkcml2ZXIgYWxsb3dzIHRoZSBYZW4gZG9tYWluIHRvIHJlcXVlc3QgbW9yZSBtZW1vcnkgZnJvbQorCSAgdGhlIHN5c3RlbSB0byBleHBhbmQgdGhlIGRvbWFpbidzIG1lbW9yeSBhbGxvY2F0aW9uLCBvciBhbHRlcm5hdGl2ZWx5CisJICByZXR1cm4gdW5uZWVkZWQgbWVtb3J5IHRvIHRoZSBzeXN0ZW0uCisKK2NvbmZpZyBYRU5fU0NSVUJfUEFHRVMKKwlib29sICJTY3J1YiBwYWdlcyBiZWZvcmUgcmV0dXJuaW5nIHRoZW0gdG8gc3lzdGVtIgorCWRlcGVuZHMgb24gWEVOX0JBTExPT04KKwlkZWZhdWx0IHkKKwloZWxwCisJICBTY3J1YiBwYWdlcyBiZWZvcmUgcmV0dXJuaW5nIHRoZW0gdG8gdGhlIHN5c3RlbSBmb3IgcmV1c2UgYnkKKwkgIG90aGVyIGRvbWFpbnMuICBUaGlzIG1ha2VzIHN1cmUgdGhhdCBhbnkgY29uZmlkZW50aWFsIGRhdGEKKwkgIGlzIG5vdCBhY2NpZGVudGFsbHkgdmlzaWJsZSB0byBvdGhlciBkb21haW5zLiAgSXMgaXQgbW9yZQorCSAgc2VjdXJlLCBidXQgc2xpZ2h0bHkgbGVzcyBlZmZpY2llbnQuCisJICBJZiBpbiBkb3VidCwgc2F5IHllcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL01ha2VmaWxlIGIvZHJpdmVycy94ZW4vTWFrZWZpbGUKaW5kZXggNTY1OTJmMC4uMzdhZjA0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vTWFrZWZpbGUKKysrIGIvZHJpdmVycy94ZW4vTWFrZWZpbGUKQEAgLTEsMiArMSw0IEBACi1vYmoteQkrPSBncmFudC10YWJsZS5vCitvYmoteQkrPSBncmFudC10YWJsZS5vIGZlYXR1cmVzLm8gZXZlbnRzLm8KIG9iai15CSs9IHhlbmJ1cy8KK29iai0kKENPTkZJR19YRU5fWEVOQ09NTSkJKz0geGVuY29tbS5vCitvYmotJChDT05GSUdfWEVOX0JBTExPT04pCSs9IGJhbGxvb24ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vYmFsbG9vbi5jIGIvZHJpdmVycy94ZW4vYmFsbG9vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMjViYTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3hlbi9iYWxsb29uLmMKQEAgLTAsMCArMSw3MTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGJhbGxvb24uYworICoKKyAqIFhlbiBiYWxsb29uIGRyaXZlciAtIGVuYWJsZXMgcmV0dXJuaW5nL2NsYWltaW5nIG1lbW9yeSB0by9mcm9tIFhlbi4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIEIgRHJhZ292aWMKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0LCBNIFdpbGxpYW1zb24sIEsgRnJhc2VyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGFuIE0uIFNtaXRoLCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBvciwgd2hlbiBkaXN0cmlidXRlZAorICogc2VwYXJhdGVseSBmcm9tIHRoZSBMaW51eCBrZXJuZWwgb3IgaW5jb3Jwb3JhdGVkIGludG8gb3RoZXIKKyAqIHNvZnR3YXJlIHBhY2thZ2VzLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgbGljZW5zZToKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvdXJjZSBmaWxlICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksCisgKiBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisKKyNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS90bGIuaD4KKworI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvbWVtb3J5Lmg+CisjaW5jbHVkZSA8eGVuL2JhbGxvb24uaD4KKyNpbmNsdWRlIDx4ZW4veGVuYnVzLmg+CisjaW5jbHVkZSA8eGVuL2ZlYXR1cmVzLmg+CisjaW5jbHVkZSA8eGVuL3BhZ2UuaD4KKworI2RlZmluZSBQQUdFUzJLQihfcCkgKChfcCk8PChQQUdFX1NISUZULTEwKSkKKworI2RlZmluZSBCQUxMT09OX0NMQVNTX05BTUUgIm1lbW9yeSIKKworc3RydWN0IGJhbGxvb25fc3RhdHMgeworCS8qIFdlIGFpbSBmb3IgJ2N1cnJlbnQgYWxsb2NhdGlvbicgPT0gJ3RhcmdldCBhbGxvY2F0aW9uJy4gKi8KKwl1bnNpZ25lZCBsb25nIGN1cnJlbnRfcGFnZXM7CisJdW5zaWduZWQgbG9uZyB0YXJnZXRfcGFnZXM7CisJLyogV2UgbWF5IGhpdCB0aGUgaGFyZCBsaW1pdCBpbiBYZW4uIElmIHdlIGRvIHRoZW4gd2UgcmVtZW1iZXIgaXQuICovCisJdW5zaWduZWQgbG9uZyBoYXJkX2xpbWl0OworCS8qCisJICogRHJpdmVycyBtYXkgYWx0ZXIgdGhlIG1lbW9yeSByZXNlcnZhdGlvbiBpbmRlcGVuZGVudGx5LCBidXQgdGhleQorCSAqIG11c3QgaW5mb3JtIHRoZSBiYWxsb29uIGRyaXZlciBzbyB3ZSBhdm9pZCBoaXR0aW5nIHRoZSBoYXJkIGxpbWl0LgorCSAqLworCXVuc2lnbmVkIGxvbmcgZHJpdmVyX3BhZ2VzOworCS8qIE51bWJlciBvZiBwYWdlcyBpbiBoaWdoLSBhbmQgbG93LW1lbW9yeSBiYWxsb29ucy4gKi8KKwl1bnNpZ25lZCBsb25nIGJhbGxvb25fbG93OworCXVuc2lnbmVkIGxvbmcgYmFsbG9vbl9oaWdoOworfTsKKworc3RhdGljIERFRklORV9NVVRFWChiYWxsb29uX211dGV4KTsKKworc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIGJhbGxvb25fc3lzZGV2OworCitzdGF0aWMgaW50IHJlZ2lzdGVyX2JhbGxvb24oc3RydWN0IHN5c19kZXZpY2UgKnN5c2Rldik7CisKKy8qCisgKiBQcm90ZWN0cyBhdG9taWMgcmVzZXJ2YXRpb24gZGVjcmVhc2UvaW5jcmVhc2UgYWdhaW5zdCBjb25jdXJyZW50IGluY3JlYXNlcy4KKyAqIEFsc28gcHJvdGVjdHMgbm9uLWF0b21pYyB1cGRhdGVzIG9mIGN1cnJlbnRfcGFnZXMgYW5kIGRyaXZlcl9wYWdlcywgYW5kCisgKiBiYWxsb29uIGxpc3RzLgorICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGJhbGxvb25fbG9jayk7CisKK3N0YXRpYyBzdHJ1Y3QgYmFsbG9vbl9zdGF0cyBiYWxsb29uX3N0YXRzOworCisvKiBXZSBpbmNyZWFzZS9kZWNyZWFzZSBpbiBiYXRjaGVzIHdoaWNoIGZpdCBpbiBhIHBhZ2UgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZyYW1lX2xpc3RbUEFHRV9TSVpFIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpXTsKKworLyogVk0gL3Byb2MgaW5mb3JtYXRpb24gZm9yIG1lbW9yeSAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdG90YWxyYW1fcGFnZXM7CisKKyNpZmRlZiBDT05GSUdfSElHSE1FTQorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdG90YWxoaWdoX3BhZ2VzOworI2RlZmluZSBpbmNfdG90YWxoaWdoX3BhZ2VzKCkgKHRvdGFsaGlnaF9wYWdlcysrKQorI2RlZmluZSBkZWNfdG90YWxoaWdoX3BhZ2VzKCkgKHRvdGFsaGlnaF9wYWdlcy0tKQorI2Vsc2UKKyNkZWZpbmUgaW5jX3RvdGFsaGlnaF9wYWdlcygpIGRvIHt9IHdoaWxlKDApCisjZGVmaW5lIGRlY190b3RhbGhpZ2hfcGFnZXMoKSBkbyB7fSB3aGlsZSgwKQorI2VuZGlmCisKKy8qIExpc3Qgb2YgYmFsbG9vbmVkIHBhZ2VzLCB0aHJlYWRlZCB0aHJvdWdoIHRoZSBtZW1fbWFwIGFycmF5LiAqLworc3RhdGljIExJU1RfSEVBRChiYWxsb29uZWRfcGFnZXMpOworCisvKiBNYWluIHdvcmsgZnVuY3Rpb24sIGFsd2F5cyBleGVjdXRlZCBpbiBwcm9jZXNzIGNvbnRleHQuICovCitzdGF0aWMgdm9pZCBiYWxsb29uX3Byb2Nlc3Moc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3N0YXRpYyBERUNMQVJFX1dPUksoYmFsbG9vbl93b3JrZXIsIGJhbGxvb25fcHJvY2Vzcyk7CitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgYmFsbG9vbl90aW1lcjsKKworLyogV2hlbiBiYWxsb29uaW5nIG91dCAoYWxsb2NhdGluZyBtZW1vcnkgdG8gcmV0dXJuIHRvIFhlbikgd2UgZG9uJ3QgcmVhbGx5CisgICB3YW50IHRoZSBrZXJuZWwgdG8gdHJ5IHRvbyBoYXJkIHNpbmNlIHRoYXQgY2FuIHRyaWdnZXIgdGhlIG9vbSBraWxsZXIuICovCisjZGVmaW5lIEdGUF9CQUxMT09OIFwKKwkoR0ZQX0hJR0hVU0VSIHwgX19HRlBfTk9XQVJOIHwgX19HRlBfTk9SRVRSWSB8IF9fR0ZQX05PTUVNQUxMT0MpCisKK3N0YXRpYyB2b2lkIHNjcnViX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisjaWZkZWYgQ09ORklHX1hFTl9TQ1JVQl9QQUdFUworCWlmIChQYWdlSGlnaE1lbShwYWdlKSkgeworCQl2b2lkICp2ID0ga21hcChwYWdlKTsKKwkJY2xlYXJfcGFnZSh2KTsKKwkJa3VubWFwKHYpOworCX0gZWxzZSB7CisJCXZvaWQgKnYgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJCWNsZWFyX3BhZ2Uodik7CisJfQorI2VuZGlmCit9CisKKy8qIGJhbGxvb25fYXBwZW5kOiBhZGQgdGhlIGdpdmVuIHBhZ2UgdG8gdGhlIGJhbGxvb24uICovCitzdGF0aWMgdm9pZCBiYWxsb29uX2FwcGVuZChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwkvKiBMb3dtZW0gaXMgcmUtcG9wdWxhdGVkIGZpcnN0LCBzbyBoaWdobWVtIHBhZ2VzIGdvIGF0IGxpc3QgdGFpbC4gKi8KKwlpZiAoUGFnZUhpZ2hNZW0ocGFnZSkpIHsKKwkJbGlzdF9hZGRfdGFpbCgmcGFnZS0+bHJ1LCAmYmFsbG9vbmVkX3BhZ2VzKTsKKwkJYmFsbG9vbl9zdGF0cy5iYWxsb29uX2hpZ2grKzsKKwkJZGVjX3RvdGFsaGlnaF9wYWdlcygpOworCX0gZWxzZSB7CisJCWxpc3RfYWRkKCZwYWdlLT5scnUsICZiYWxsb29uZWRfcGFnZXMpOworCQliYWxsb29uX3N0YXRzLmJhbGxvb25fbG93Kys7CisJfQorfQorCisvKiBiYWxsb29uX3JldHJpZXZlOiByZXNjdWUgYSBwYWdlIGZyb20gdGhlIGJhbGxvb24sIGlmIGl0IGlzIG5vdCBlbXB0eS4gKi8KK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqYmFsbG9vbl9yZXRyaWV2ZSh2b2lkKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCisJaWYgKGxpc3RfZW1wdHkoJmJhbGxvb25lZF9wYWdlcykpCisJCXJldHVybiBOVUxMOworCisJcGFnZSA9IGxpc3RfZW50cnkoYmFsbG9vbmVkX3BhZ2VzLm5leHQsIHN0cnVjdCBwYWdlLCBscnUpOworCWxpc3RfZGVsKCZwYWdlLT5scnUpOworCisJaWYgKFBhZ2VIaWdoTWVtKHBhZ2UpKSB7CisJCWJhbGxvb25fc3RhdHMuYmFsbG9vbl9oaWdoLS07CisJCWluY190b3RhbGhpZ2hfcGFnZXMoKTsKKwl9CisJZWxzZQorCQliYWxsb29uX3N0YXRzLmJhbGxvb25fbG93LS07CisKKwlyZXR1cm4gcGFnZTsKK30KKworc3RhdGljIHN0cnVjdCBwYWdlICpiYWxsb29uX2ZpcnN0X3BhZ2Uodm9pZCkKK3sKKwlpZiAobGlzdF9lbXB0eSgmYmFsbG9vbmVkX3BhZ2VzKSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGxpc3RfZW50cnkoYmFsbG9vbmVkX3BhZ2VzLm5leHQsIHN0cnVjdCBwYWdlLCBscnUpOworfQorCitzdGF0aWMgc3RydWN0IHBhZ2UgKmJhbGxvb25fbmV4dF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQgPSBwYWdlLT5scnUubmV4dDsKKwlpZiAobmV4dCA9PSAmYmFsbG9vbmVkX3BhZ2VzKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgcGFnZSwgbHJ1KTsKK30KKworc3RhdGljIHZvaWQgYmFsbG9vbl9hbGFybSh1bnNpZ25lZCBsb25nIHVudXNlZCkKK3sKKwlzY2hlZHVsZV93b3JrKCZiYWxsb29uX3dvcmtlcik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGN1cnJlbnRfdGFyZ2V0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB0YXJnZXQgPSBtaW4oYmFsbG9vbl9zdGF0cy50YXJnZXRfcGFnZXMsIGJhbGxvb25fc3RhdHMuaGFyZF9saW1pdCk7CisKKwl0YXJnZXQgPSBtaW4odGFyZ2V0LAorCQkgICAgIGJhbGxvb25fc3RhdHMuY3VycmVudF9wYWdlcyArCisJCSAgICAgYmFsbG9vbl9zdGF0cy5iYWxsb29uX2xvdyArCisJCSAgICAgYmFsbG9vbl9zdGF0cy5iYWxsb29uX2hpZ2gpOworCisJcmV0dXJuIHRhcmdldDsKK30KKworc3RhdGljIGludCBpbmNyZWFzZV9yZXNlcnZhdGlvbih1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKQoreworCXVuc2lnbmVkIGxvbmcgIHBmbiwgaSwgZmxhZ3M7CisJc3RydWN0IHBhZ2UgICAqcGFnZTsKKwlsb25nICAgICAgICAgICByYzsKKwlzdHJ1Y3QgeGVuX21lbW9yeV9yZXNlcnZhdGlvbiByZXNlcnZhdGlvbiA9IHsKKwkJLmFkZHJlc3NfYml0cyA9IDAsCisJCS5leHRlbnRfb3JkZXIgPSAwLAorCQkuZG9taWQgICAgICAgID0gRE9NSURfU0VMRgorCX07CisKKwlpZiAobnJfcGFnZXMgPiBBUlJBWV9TSVpFKGZyYW1lX2xpc3QpKQorCQlucl9wYWdlcyA9IEFSUkFZX1NJWkUoZnJhbWVfbGlzdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmFsbG9vbl9sb2NrLCBmbGFncyk7CisKKwlwYWdlID0gYmFsbG9vbl9maXJzdF9wYWdlKCk7CisJZm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKKwkJQlVHX09OKHBhZ2UgPT0gTlVMTCk7CisJCWZyYW1lX2xpc3RbaV0gPSBwYWdlX3RvX3BmbihwYWdlKTs7CisJCXBhZ2UgPSBiYWxsb29uX25leHRfcGFnZShwYWdlKTsKKwl9CisKKwlyZXNlcnZhdGlvbi5leHRlbnRfc3RhcnQgPSAodW5zaWduZWQgbG9uZylmcmFtZV9saXN0OworCXJlc2VydmF0aW9uLm5yX2V4dGVudHMgICA9IG5yX3BhZ2VzOworCXJjID0gSFlQRVJWSVNPUl9tZW1vcnlfb3AoCisJCVhFTk1FTV9wb3B1bGF0ZV9waHlzbWFwLCAmcmVzZXJ2YXRpb24pOworCWlmIChyYyA8IG5yX3BhZ2VzKSB7CisJCWlmIChyYyA+IDApIHsKKwkJCWludCByZXQ7CisKKwkJCS8qIFdlIGhpdCB0aGUgWGVuIGhhcmQgbGltaXQ6IHJlcHJvYmUuICovCisJCQlyZXNlcnZhdGlvbi5ucl9leHRlbnRzID0gcmM7CisJCQlyZXQgPSBIWVBFUlZJU09SX21lbW9yeV9vcChYRU5NRU1fZGVjcmVhc2VfcmVzZXJ2YXRpb24sCisJCQkJCSZyZXNlcnZhdGlvbik7CisJCQlCVUdfT04ocmV0ICE9IHJjKTsKKwkJfQorCQlpZiAocmMgPj0gMCkKKwkJCWJhbGxvb25fc3RhdHMuaGFyZF9saW1pdCA9IChiYWxsb29uX3N0YXRzLmN1cnJlbnRfcGFnZXMgKyByYyAtCisJCQkJCQkgICAgYmFsbG9vbl9zdGF0cy5kcml2ZXJfcGFnZXMpOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgeworCQlwYWdlID0gYmFsbG9vbl9yZXRyaWV2ZSgpOworCQlCVUdfT04ocGFnZSA9PSBOVUxMKTsKKworCQlwZm4gPSBwYWdlX3RvX3BmbihwYWdlKTsKKwkJQlVHX09OKCF4ZW5fZmVhdHVyZShYRU5GRUFUX2F1dG9fdHJhbnNsYXRlZF9waHlzbWFwKSAmJgorCQkgICAgICAgcGh5c190b19tYWNoaW5lX21hcHBpbmdfdmFsaWQocGZuKSk7CisKKwkJc2V0X3BoeXNfdG9fbWFjaGluZShwZm4sIGZyYW1lX2xpc3RbaV0pOworCisJCS8qIExpbmsgYmFjayBpbnRvIHRoZSBwYWdlIHRhYmxlcyBpZiBub3QgaGlnaG1lbS4gKi8KKwkJaWYgKHBmbiA8IG1heF9sb3dfcGZuKSB7CisJCQlpbnQgcmV0OworCQkJcmV0ID0gSFlQRVJWSVNPUl91cGRhdGVfdmFfbWFwcGluZygKKwkJCQkodW5zaWduZWQgbG9uZylfX3ZhKHBmbiA8PCBQQUdFX1NISUZUKSwKKwkJCQltZm5fcHRlKGZyYW1lX2xpc3RbaV0sIFBBR0VfS0VSTkVMKSwKKwkJCQkwKTsKKwkJCUJVR19PTihyZXQpOworCQl9CisKKwkJLyogUmVsaW5xdWlzaCB0aGUgcGFnZSBiYWNrIHRvIHRoZSBhbGxvY2F0b3IuICovCisJCUNsZWFyUGFnZVJlc2VydmVkKHBhZ2UpOworCQlpbml0X3BhZ2VfY291bnQocGFnZSk7CisJCV9fZnJlZV9wYWdlKHBhZ2UpOworCX0KKworCWJhbGxvb25fc3RhdHMuY3VycmVudF9wYWdlcyArPSBucl9wYWdlczsKKwl0b3RhbHJhbV9wYWdlcyA9IGJhbGxvb25fc3RhdHMuY3VycmVudF9wYWdlczsKKworIG91dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYWxsb29uX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY3JlYXNlX3Jlc2VydmF0aW9uKHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpCit7CisJdW5zaWduZWQgbG9uZyAgcGZuLCBpLCBmbGFnczsKKwlzdHJ1Y3QgcGFnZSAgICpwYWdlOworCWludCAgICAgICAgICAgIG5lZWRfc2xlZXAgPSAwOworCWludCByZXQ7CisJc3RydWN0IHhlbl9tZW1vcnlfcmVzZXJ2YXRpb24gcmVzZXJ2YXRpb24gPSB7CisJCS5hZGRyZXNzX2JpdHMgPSAwLAorCQkuZXh0ZW50X29yZGVyID0gMCwKKwkJLmRvbWlkICAgICAgICA9IERPTUlEX1NFTEYKKwl9OworCisJaWYgKG5yX3BhZ2VzID4gQVJSQVlfU0laRShmcmFtZV9saXN0KSkKKwkJbnJfcGFnZXMgPSBBUlJBWV9TSVpFKGZyYW1lX2xpc3QpOworCisJZm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKKwkJaWYgKChwYWdlID0gYWxsb2NfcGFnZShHRlBfQkFMTE9PTikpID09IE5VTEwpIHsKKwkJCW5yX3BhZ2VzID0gaTsKKwkJCW5lZWRfc2xlZXAgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQlwZm4gPSBwYWdlX3RvX3BmbihwYWdlKTsKKwkJZnJhbWVfbGlzdFtpXSA9IHBmbl90b19tZm4ocGZuKTsKKworCQlzY3J1Yl9wYWdlKHBhZ2UpOworCX0KKworCS8qIEVuc3VyZSB0aGF0IGJhbGxvb25lZCBoaWdobWVtIHBhZ2VzIGRvbid0IGhhdmUga21hcHMuICovCisJa21hcF9mbHVzaF91bnVzZWQoKTsKKwlmbHVzaF90bGJfYWxsKCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmFsbG9vbl9sb2NrLCBmbGFncyk7CisKKwkvKiBObyBtb3JlIG1hcHBpbmdzOiBpbnZhbGlkYXRlIFAyTSBhbmQgYWRkIHRvIGJhbGxvb24uICovCisJZm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKKwkJcGZuID0gbWZuX3RvX3BmbihmcmFtZV9saXN0W2ldKTsKKwkJc2V0X3BoeXNfdG9fbWFjaGluZShwZm4sIElOVkFMSURfUDJNX0VOVFJZKTsKKwkJYmFsbG9vbl9hcHBlbmQocGZuX3RvX3BhZ2UocGZuKSk7CisJfQorCisJcmVzZXJ2YXRpb24uZXh0ZW50X3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpZnJhbWVfbGlzdDsKKwlyZXNlcnZhdGlvbi5ucl9leHRlbnRzICAgPSBucl9wYWdlczsKKwlyZXQgPSBIWVBFUlZJU09SX21lbW9yeV9vcChYRU5NRU1fZGVjcmVhc2VfcmVzZXJ2YXRpb24sICZyZXNlcnZhdGlvbik7CisJQlVHX09OKHJldCAhPSBucl9wYWdlcyk7CisKKwliYWxsb29uX3N0YXRzLmN1cnJlbnRfcGFnZXMgLT0gbnJfcGFnZXM7CisJdG90YWxyYW1fcGFnZXMgPSBiYWxsb29uX3N0YXRzLmN1cnJlbnRfcGFnZXM7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYWxsb29uX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBuZWVkX3NsZWVwOworfQorCisvKgorICogV2UgYXZvaWQgbXVsdGlwbGUgd29ya2VyIHByb2Nlc3NlcyBjb25mbGljdGluZyB2aWEgdGhlIGJhbGxvb24gbXV0ZXguCisgKiBXZSBtYXkgb2YgY291cnNlIHJhY2UgdXBkYXRlcyBvZiB0aGUgdGFyZ2V0IGNvdW50cyAod2hpY2ggYXJlIHByb3RlY3RlZAorICogYnkgdGhlIGJhbGxvb24gbG9jayksIG9yIHdpdGggY2hhbmdlcyB0byB0aGUgWGVuIGhhcmQgbGltaXQsIGJ1dCB3ZSB3aWxsCisgKiByZWNvdmVyIGZyb20gdGhlc2UgaW4gdGltZS4KKyAqLworc3RhdGljIHZvaWQgYmFsbG9vbl9wcm9jZXNzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlpbnQgbmVlZF9zbGVlcCA9IDA7CisJbG9uZyBjcmVkaXQ7CisKKwltdXRleF9sb2NrKCZiYWxsb29uX211dGV4KTsKKworCWRvIHsKKwkJY3JlZGl0ID0gY3VycmVudF90YXJnZXQoKSAtIGJhbGxvb25fc3RhdHMuY3VycmVudF9wYWdlczsKKwkJaWYgKGNyZWRpdCA+IDApCisJCQluZWVkX3NsZWVwID0gKGluY3JlYXNlX3Jlc2VydmF0aW9uKGNyZWRpdCkgIT0gMCk7CisJCWlmIChjcmVkaXQgPCAwKQorCQkJbmVlZF9zbGVlcCA9IChkZWNyZWFzZV9yZXNlcnZhdGlvbigtY3JlZGl0KSAhPSAwKTsKKworI2lmbmRlZiBDT05GSUdfUFJFRU1QVAorCQlpZiAobmVlZF9yZXNjaGVkKCkpCisJCQlzY2hlZHVsZSgpOworI2VuZGlmCisJfSB3aGlsZSAoKGNyZWRpdCAhPSAwKSAmJiAhbmVlZF9zbGVlcCk7CisKKwkvKiBTY2hlZHVsZSBtb3JlIHdvcmsgaWYgdGhlcmUgaXMgc29tZSBzdGlsbCB0byBiZSBkb25lLiAqLworCWlmIChjdXJyZW50X3RhcmdldCgpICE9IGJhbGxvb25fc3RhdHMuY3VycmVudF9wYWdlcykKKwkJbW9kX3RpbWVyKCZiYWxsb29uX3RpbWVyLCBqaWZmaWVzICsgSFopOworCisJbXV0ZXhfdW5sb2NrKCZiYWxsb29uX211dGV4KTsKK30KKworLyogUmVzZXRzIHRoZSBYZW4gbGltaXQsIHNldHMgbmV3IHRhcmdldCwgYW5kIGtpY2tzIG9mZiBwcm9jZXNzaW5nLiAqLwordm9pZCBiYWxsb29uX3NldF9uZXdfdGFyZ2V0KHVuc2lnbmVkIGxvbmcgdGFyZ2V0KQoreworCS8qIE5vIG5lZWQgZm9yIGxvY2suIE5vdCByZWFkLW1vZGlmeS13cml0ZSB1cGRhdGVzLiAqLworCWJhbGxvb25fc3RhdHMuaGFyZF9saW1pdCAgID0gfjBVTDsKKwliYWxsb29uX3N0YXRzLnRhcmdldF9wYWdlcyA9IHRhcmdldDsKKwlzY2hlZHVsZV93b3JrKCZiYWxsb29uX3dvcmtlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeGVuYnVzX3dhdGNoIHRhcmdldF93YXRjaCA9Cit7CisJLm5vZGUgPSAibWVtb3J5L3RhcmdldCIKK307CisKKy8qIFJlYWN0IHRvIGEgY2hhbmdlIGluIHRoZSB0YXJnZXQga2V5ICovCitzdGF0aWMgdm9pZCB3YXRjaF90YXJnZXQoc3RydWN0IHhlbmJ1c193YXRjaCAqd2F0Y2gsCisJCQkgY29uc3QgY2hhciAqKnZlYywgdW5zaWduZWQgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgbmV3X3RhcmdldDsKKwlpbnQgZXJyOworCisJZXJyID0geGVuYnVzX3NjYW5mKFhCVF9OSUwsICJtZW1vcnkiLCAidGFyZ2V0IiwgIiVsbHUiLCAmbmV3X3RhcmdldCk7CisJaWYgKGVyciAhPSAxKSB7CisJCS8qIFRoaXMgaXMgb2sgKGZvciBkb21haW4wIGF0IGxlYXN0KSAtIHNvIGp1c3QgcmV0dXJuICovCisJCXJldHVybjsKKwl9CisKKwkvKiBUaGUgZ2l2ZW4gbWVtb3J5L3RhcmdldCB2YWx1ZSBpcyBpbiBLaUIsIHNvIGl0IG5lZWRzIGNvbnZlcnRpbmcgdG8KKwkgKiBwYWdlcy4gUEFHRV9TSElGVCBjb252ZXJ0cyBieXRlcyB0byBwYWdlcywgaGVuY2UgUEFHRV9TSElGVCAtIDEwLgorCSAqLworCWJhbGxvb25fc2V0X25ld190YXJnZXQobmV3X3RhcmdldCA+PiAoUEFHRV9TSElGVCAtIDEwKSk7Cit9CisKK3N0YXRpYyBpbnQgYmFsbG9vbl9pbml0X3dhdGNoZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpub3RpZmllciwKKwkJCQl1bnNpZ25lZCBsb25nIGV2ZW50LAorCQkJCXZvaWQgKmRhdGEpCit7CisJaW50IGVycjsKKworCWVyciA9IHJlZ2lzdGVyX3hlbmJ1c193YXRjaCgmdGFyZ2V0X3dhdGNoKTsKKwlpZiAoZXJyKQorCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBzZXQgYmFsbG9vbiB3YXRjaGVyXG4iKTsKKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB4ZW5zdG9yZV9ub3RpZmllcjsKKworc3RhdGljIGludCBfX2luaXQgYmFsbG9vbl9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBwZm47CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlpZiAoIWlzX3J1bm5pbmdfb25feGVuKCkpCisJCXJldHVybiAtRU5PREVWOworCisJcHJfaW5mbygieGVuX2JhbGxvb246IEluaXRpYWxpc2luZyBiYWxsb29uIGRyaXZlci5cbiIpOworCisJYmFsbG9vbl9zdGF0cy5jdXJyZW50X3BhZ2VzID0gbWluKHhlbl9zdGFydF9pbmZvLT5ucl9wYWdlcywgbWF4X3Bmbik7CisJdG90YWxyYW1fcGFnZXMgICA9IGJhbGxvb25fc3RhdHMuY3VycmVudF9wYWdlczsKKwliYWxsb29uX3N0YXRzLnRhcmdldF9wYWdlcyAgPSBiYWxsb29uX3N0YXRzLmN1cnJlbnRfcGFnZXM7CisJYmFsbG9vbl9zdGF0cy5iYWxsb29uX2xvdyAgID0gMDsKKwliYWxsb29uX3N0YXRzLmJhbGxvb25faGlnaCAgPSAwOworCWJhbGxvb25fc3RhdHMuZHJpdmVyX3BhZ2VzICA9IDBVTDsKKwliYWxsb29uX3N0YXRzLmhhcmRfbGltaXQgICAgPSB+MFVMOworCisJaW5pdF90aW1lcigmYmFsbG9vbl90aW1lcik7CisJYmFsbG9vbl90aW1lci5kYXRhID0gMDsKKwliYWxsb29uX3RpbWVyLmZ1bmN0aW9uID0gYmFsbG9vbl9hbGFybTsKKworCXJlZ2lzdGVyX2JhbGxvb24oJmJhbGxvb25fc3lzZGV2KTsKKworCS8qIEluaXRpYWxpc2UgdGhlIGJhbGxvb24gd2l0aCBleGNlc3MgbWVtb3J5IHNwYWNlLiAqLworCWZvciAocGZuID0geGVuX3N0YXJ0X2luZm8tPm5yX3BhZ2VzOyBwZm4gPCBtYXhfcGZuOyBwZm4rKykgeworCQlwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKKwkJaWYgKCFQYWdlUmVzZXJ2ZWQocGFnZSkpCisJCQliYWxsb29uX2FwcGVuZChwYWdlKTsKKwl9CisKKwl0YXJnZXRfd2F0Y2guY2FsbGJhY2sgPSB3YXRjaF90YXJnZXQ7CisJeGVuc3RvcmVfbm90aWZpZXIubm90aWZpZXJfY2FsbCA9IGJhbGxvb25faW5pdF93YXRjaGVyOworCisJcmVnaXN0ZXJfeGVuc3RvcmVfbm90aWZpZXIoJnhlbnN0b3JlX25vdGlmaWVyKTsKKworCXJldHVybiAwOworfQorCitzdWJzeXNfaW5pdGNhbGwoYmFsbG9vbl9pbml0KTsKKworc3RhdGljIHZvaWQgYmFsbG9vbl9leGl0KHZvaWQpCit7CisgICAgLyogWFhYIC0gcmVsZWFzZSBiYWxsb29uIGhlcmUgKi8KKyAgICByZXR1cm47Cit9CisKK21vZHVsZV9leGl0KGJhbGxvb25fZXhpdCk7CisKK3N0YXRpYyB2b2lkIGJhbGxvb25fdXBkYXRlX2RyaXZlcl9hbGxvd2FuY2UobG9uZyBkZWx0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJhbGxvb25fbG9jaywgZmxhZ3MpOworCWJhbGxvb25fc3RhdHMuZHJpdmVyX3BhZ2VzICs9IGRlbHRhOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhbGxvb25fbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGRlYWxsb2NfcHRlX2ZuKAorCXB0ZV90ICpwdGUsIHN0cnVjdCBwYWdlICpwbWRfcGFnZSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgbWZuID0gcHRlX21mbigqcHRlKTsKKwlpbnQgcmV0OworCXN0cnVjdCB4ZW5fbWVtb3J5X3Jlc2VydmF0aW9uIHJlc2VydmF0aW9uID0geworCQkubnJfZXh0ZW50cyAgID0gMSwKKwkJLmV4dGVudF9vcmRlciA9IDAsCisJCS5kb21pZCAgICAgICAgPSBET01JRF9TRUxGCisJfTsKKwlyZXNlcnZhdGlvbi5leHRlbnRfc3RhcnQgPSAodW5zaWduZWQgbG9uZykmbWZuOworCXNldF9wdGVfYXQoJmluaXRfbW0sIGFkZHIsIHB0ZSwgX19wdGVfbWEoMHVsbCkpOworCXNldF9waHlzX3RvX21hY2hpbmUoX19wYShhZGRyKSA+PiBQQUdFX1NISUZULCBJTlZBTElEX1AyTV9FTlRSWSk7CisJcmV0ID0gSFlQRVJWSVNPUl9tZW1vcnlfb3AoWEVOTUVNX2RlY3JlYXNlX3Jlc2VydmF0aW9uLCAmcmVzZXJ2YXRpb24pOworCUJVR19PTihyZXQgIT0gMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqKmFsbG9jX2VtcHR5X3BhZ2VzX2FuZF9wYWdldmVjKGludCBucl9wYWdlcykKK3sKKwl1bnNpZ25lZCBsb25nIHZhZGRyLCBmbGFnczsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSwgKipwYWdldmVjOworCWludCBpLCByZXQ7CisKKwlwYWdldmVjID0ga21hbGxvYyhzaXplb2YocGFnZSkgKiBucl9wYWdlcywgR0ZQX0tFUk5FTCk7CisJaWYgKHBhZ2V2ZWMgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgeworCQlwYWdlID0gcGFnZXZlY1tpXSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCWlmIChwYWdlID09IE5VTEwpCisJCQlnb3RvIGVycjsKKworCQl2YWRkciA9ICh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwYWdlKTsKKworCQlzY3J1Yl9wYWdlKHBhZ2UpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZiYWxsb29uX2xvY2ssIGZsYWdzKTsKKworCQlpZiAoeGVuX2ZlYXR1cmUoWEVORkVBVF9hdXRvX3RyYW5zbGF0ZWRfcGh5c21hcCkpIHsKKwkJCXVuc2lnbmVkIGxvbmcgZ21mbiA9IHBhZ2VfdG9fcGZuKHBhZ2UpOworCQkJc3RydWN0IHhlbl9tZW1vcnlfcmVzZXJ2YXRpb24gcmVzZXJ2YXRpb24gPSB7CisJCQkJLm5yX2V4dGVudHMgICA9IDEsCisJCQkJLmV4dGVudF9vcmRlciA9IDAsCisJCQkJLmRvbWlkICAgICAgICA9IERPTUlEX1NFTEYKKwkJCX07CisJCQlyZXNlcnZhdGlvbi5leHRlbnRfc3RhcnQgPSAodW5zaWduZWQgbG9uZykmZ21mbjsKKwkJCXJldCA9IEhZUEVSVklTT1JfbWVtb3J5X29wKFhFTk1FTV9kZWNyZWFzZV9yZXNlcnZhdGlvbiwKKwkJCQkJCSAgICZyZXNlcnZhdGlvbik7CisJCQlpZiAocmV0ID09IDEpCisJCQkJcmV0ID0gMDsgLyogc3VjY2VzcyAqLworCQl9IGVsc2UgeworCQkJcmV0ID0gYXBwbHlfdG9fcGFnZV9yYW5nZSgmaW5pdF9tbSwgdmFkZHIsIFBBR0VfU0laRSwKKwkJCQkJCSAgZGVhbGxvY19wdGVfZm4sIE5VTEwpOworCQl9CisKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYWxsb29uX2xvY2ssIGZsYWdzKTsKKwkJCV9fZnJlZV9wYWdlKHBhZ2UpOworCQkJZ290byBlcnI7CisJCX0KKworCQl0b3RhbHJhbV9wYWdlcyA9IC0tYmFsbG9vbl9zdGF0cy5jdXJyZW50X3BhZ2VzOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhbGxvb25fbG9jaywgZmxhZ3MpOworCX0KKworIG91dDoKKwlzY2hlZHVsZV93b3JrKCZiYWxsb29uX3dvcmtlcik7CisJZmx1c2hfdGxiX2FsbCgpOworCXJldHVybiBwYWdldmVjOworCisgZXJyOgorCXNwaW5fbG9ja19pcnFzYXZlKCZiYWxsb29uX2xvY2ssIGZsYWdzKTsKKwl3aGlsZSAoLS1pID49IDApCisJCWJhbGxvb25fYXBwZW5kKHBhZ2V2ZWNbaV0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhbGxvb25fbG9jaywgZmxhZ3MpOworCWtmcmVlKHBhZ2V2ZWMpOworCXBhZ2V2ZWMgPSBOVUxMOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgdm9pZCBmcmVlX2VtcHR5X3BhZ2VzX2FuZF9wYWdldmVjKHN0cnVjdCBwYWdlICoqcGFnZXZlYywgaW50IG5yX3BhZ2VzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlpZiAocGFnZXZlYyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmFsbG9vbl9sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKKwkJQlVHX09OKHBhZ2VfY291bnQocGFnZXZlY1tpXSkgIT0gMSk7CisJCWJhbGxvb25fYXBwZW5kKHBhZ2V2ZWNbaV0pOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYWxsb29uX2xvY2ssIGZsYWdzKTsKKworCWtmcmVlKHBhZ2V2ZWMpOworCisJc2NoZWR1bGVfd29yaygmYmFsbG9vbl93b3JrZXIpOworfQorCitzdGF0aWMgdm9pZCBiYWxsb29uX3JlbGVhc2VfZHJpdmVyX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiYWxsb29uX2xvY2ssIGZsYWdzKTsKKwliYWxsb29uX2FwcGVuZChwYWdlKTsKKwliYWxsb29uX3N0YXRzLmRyaXZlcl9wYWdlcy0tOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhbGxvb25fbG9jaywgZmxhZ3MpOworCisJc2NoZWR1bGVfd29yaygmYmFsbG9vbl93b3JrZXIpOworfQorCisKKyNkZWZpbmUgQkFMTE9PTl9TSE9XKG5hbWUsIGZvcm1hdCwgYXJncy4uLikJCQlcCisJc3RhdGljIHNzaXplX3Qgc2hvd18jI25hbWUoc3RydWN0IHN5c19kZXZpY2UgKmRldiwJXAorCQkJCSAgIGNoYXIgKmJ1ZikJCQlcCisJewkJCQkJCQlcCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgZm9ybWF0LCAjI2FyZ3MpOwkJXAorCX0JCQkJCQkJXAorCXN0YXRpYyBTWVNERVZfQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93XyMjbmFtZSwgTlVMTCkKKworQkFMTE9PTl9TSE9XKGN1cnJlbnRfa2IsICIlbHVcbiIsIFBBR0VTMktCKGJhbGxvb25fc3RhdHMuY3VycmVudF9wYWdlcykpOworQkFMTE9PTl9TSE9XKGxvd19rYiwgIiVsdVxuIiwgUEFHRVMyS0IoYmFsbG9vbl9zdGF0cy5iYWxsb29uX2xvdykpOworQkFMTE9PTl9TSE9XKGhpZ2hfa2IsICIlbHVcbiIsIFBBR0VTMktCKGJhbGxvb25fc3RhdHMuYmFsbG9vbl9oaWdoKSk7CitCQUxMT09OX1NIT1coaGFyZF9saW1pdF9rYiwKKwkgICAgIChiYWxsb29uX3N0YXRzLmhhcmRfbGltaXQhPX4wVUwpID8gIiVsdVxuIiA6ICI/Pz9cbiIsCisJICAgICAoYmFsbG9vbl9zdGF0cy5oYXJkX2xpbWl0IT1+MFVMKSA/IFBBR0VTMktCKGJhbGxvb25fc3RhdHMuaGFyZF9saW1pdCkgOiAwKTsKK0JBTExPT05fU0hPVyhkcml2ZXJfa2IsICIlbHVcbiIsIFBBR0VTMktCKGJhbGxvb25fc3RhdHMuZHJpdmVyX3BhZ2VzKSk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGFyZ2V0X2tiKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbHVcbiIsIFBBR0VTMktCKGJhbGxvb25fc3RhdHMudGFyZ2V0X3BhZ2VzKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3RhcmdldF9rYihzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCSAgICAgICBzaXplX3QgY291bnQpCit7CisJY2hhciBtZW1zdHJpbmdbNjRdLCAqZW5kY2hhcjsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdGFyZ2V0X2J5dGVzOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKGNvdW50IDw9IDEpCisJCXJldHVybiAtRUJBRE1TRzsgLyogcnVudCAqLworCWlmIChjb3VudCA+IHNpemVvZihtZW1zdHJpbmcpKQorCQlyZXR1cm4gLUVGQklHOyAgIC8qIHRvbyBsb25nICovCisJc3RyY3B5KG1lbXN0cmluZywgYnVmKTsKKworCXRhcmdldF9ieXRlcyA9IG1lbXBhcnNlKG1lbXN0cmluZywgJmVuZGNoYXIpOworCWJhbGxvb25fc2V0X25ld190YXJnZXQodGFyZ2V0X2J5dGVzID4+IFBBR0VfU0hJRlQpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgU1lTREVWX0FUVFIodGFyZ2V0X2tiLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgc2hvd190YXJnZXRfa2IsIHN0b3JlX3RhcmdldF9rYik7CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2F0dHJpYnV0ZSAqYmFsbG9vbl9hdHRyc1tdID0geworCSZhdHRyX3RhcmdldF9rYiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpiYWxsb29uX2luZm9fYXR0cnNbXSA9IHsKKwkmYXR0cl9jdXJyZW50X2tiLmF0dHIsCisJJmF0dHJfbG93X2tiLmF0dHIsCisJJmF0dHJfaGlnaF9rYi5hdHRyLAorCSZhdHRyX2hhcmRfbGltaXRfa2IuYXR0ciwKKwkmYXR0cl9kcml2ZXJfa2IuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBiYWxsb29uX2luZm9fZ3JvdXAgPSB7CisJLm5hbWUgPSAiaW5mbyIsCisJLmF0dHJzID0gYmFsbG9vbl9pbmZvX2F0dHJzLAorfTsKKworc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgYmFsbG9vbl9zeXNkZXZfY2xhc3MgPSB7CisJLm5hbWUgPSBCQUxMT09OX0NMQVNTX05BTUUsCit9OworCitzdGF0aWMgaW50IHJlZ2lzdGVyX2JhbGxvb24oc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldikKK3sKKwlpbnQgaSwgZXJyb3I7CisKKwllcnJvciA9IHN5c2Rldl9jbGFzc19yZWdpc3RlcigmYmFsbG9vbl9zeXNkZXZfY2xhc3MpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJc3lzZGV2LT5pZCA9IDA7CisJc3lzZGV2LT5jbHMgPSAmYmFsbG9vbl9zeXNkZXZfY2xhc3M7CisKKwllcnJvciA9IHN5c2Rldl9yZWdpc3RlcihzeXNkZXYpOworCWlmIChlcnJvcikgeworCQlzeXNkZXZfY2xhc3NfdW5yZWdpc3RlcigmYmFsbG9vbl9zeXNkZXZfY2xhc3MpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYmFsbG9vbl9hdHRycyk7IGkrKykgeworCQllcnJvciA9IHN5c2Rldl9jcmVhdGVfZmlsZShzeXNkZXYsIGJhbGxvb25fYXR0cnNbaV0pOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGZhaWw7CisJfQorCisJZXJyb3IgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnN5c2Rldi0+a29iaiwgJmJhbGxvb25faW5mb19ncm91cCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWw7CisKKwlyZXR1cm4gMDsKKworIGZhaWw6CisJd2hpbGUgKC0taSA+PSAwKQorCQlzeXNkZXZfcmVtb3ZlX2ZpbGUoc3lzZGV2LCBiYWxsb29uX2F0dHJzW2ldKTsKKwlzeXNkZXZfdW5yZWdpc3RlcihzeXNkZXYpOworCXN5c2Rldl9jbGFzc191bnJlZ2lzdGVyKCZiYWxsb29uX3N5c2Rldl9jbGFzcyk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyX2JhbGxvb24oc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldikKK3sKKwlpbnQgaTsKKworCXN5c2ZzX3JlbW92ZV9ncm91cCgmc3lzZGV2LT5rb2JqLCAmYmFsbG9vbl9pbmZvX2dyb3VwKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShiYWxsb29uX2F0dHJzKTsgaSsrKQorCQlzeXNkZXZfcmVtb3ZlX2ZpbGUoc3lzZGV2LCBiYWxsb29uX2F0dHJzW2ldKTsKKwlzeXNkZXZfdW5yZWdpc3RlcihzeXNkZXYpOworCXN5c2Rldl9jbGFzc191bnJlZ2lzdGVyKCZiYWxsb29uX3N5c2Rldl9jbGFzcyk7Cit9CisKK3N0YXRpYyB2b2lkIGJhbGxvb25fc3lzZnNfZXhpdCh2b2lkKQoreworCXVucmVnaXN0ZXJfYmFsbG9vbigmYmFsbG9vbl9zeXNkZXYpOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vZXZlbnRzLmMgYi9kcml2ZXJzL3hlbi9ldmVudHMuYwpzaW1pbGFyaXR5IGluZGV4IDgyJQpyZW5hbWUgZnJvbSBhcmNoL3g4Ni94ZW4vZXZlbnRzLmMKcmVuYW1lIHRvIGRyaXZlcnMveGVuL2V2ZW50cy5jCmluZGV4IGRjZjYxM2UuLjRmMGYyMmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9ldmVudHMuYworKysgYi9kcml2ZXJzL3hlbi9ldmVudHMuYwpAQCAtMzMsMTIgKzMzLDExIEBACiAjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcmNhbGwuaD4KICNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KIAorI2luY2x1ZGUgPHhlbi94ZW4tb3BzLmg+CiAjaW5jbHVkZSA8eGVuL2V2ZW50cy5oPgogI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UveGVuLmg+CiAjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS9ldmVudF9jaGFubmVsLmg+CiAKLSNpbmNsdWRlICJ4ZW4tb3BzLmgiCi0KIC8qCiAgKiBUaGlzIGxvY2sgcHJvdGVjdHMgdXBkYXRlcyB0byB0aGUgZm9sbG93aW5nIG1hcHBpbmcgYW5kIHJlZmVyZW5jZS1jb3VudAogICogYXJyYXlzLiBUaGUgbG9jayBkb2VzIG5vdCBuZWVkIHRvIGJlIGFjcXVpcmVkIHRvIHJlYWQgdGhlIG1hcHBpbmcgdGFibGVzLgpAQCAtNDU1LDYgKzQ1NCw1MyBAQAogCW5vdGlmeV9yZW1vdGVfdmlhX2lycShpcnEpOwogfQogCitpcnFyZXR1cm5fdCB4ZW5fZGVidWdfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3Qgc2hhcmVkX2luZm8gKnNoID0gSFlQRVJWSVNPUl9zaGFyZWRfaW5mbzsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RhdGljIERFRklORV9TUElOTE9DSyhkZWJ1Z19sb2NrKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZWJ1Z19sb2NrLCBmbGFncyk7CisKKwlwcmludGsoInZjcHUgJWRcbiAgIiwgY3B1KTsKKworCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgeworCQlzdHJ1Y3QgdmNwdV9pbmZvICp2ID0gcGVyX2NwdSh4ZW5fdmNwdSwgaSk7CisJCXByaW50aygiJWQ6IG1hc2tlZD0lZCBwZW5kaW5nPSVkIGV2ZW50X3NlbCAlMDhseFxuICAiLCBpLAorCQkJKGdldF9pcnFfcmVncygpICYmIGkgPT0gY3B1KSA/IHhlbl9pcnFzX2Rpc2FibGVkKGdldF9pcnFfcmVncygpKSA6IHYtPmV2dGNobl91cGNhbGxfbWFzaywKKwkJCXYtPmV2dGNobl91cGNhbGxfcGVuZGluZywKKwkJCXYtPmV2dGNobl9wZW5kaW5nX3NlbCk7CisJfQorCXByaW50aygicGVuZGluZzpcbiAgICIpOworCWZvcihpID0gQVJSQVlfU0laRShzaC0+ZXZ0Y2huX3BlbmRpbmcpLTE7IGkgPj0gMDsgaS0tKQorCQlwcmludGsoIiUwOGx4JXMiLCBzaC0+ZXZ0Y2huX3BlbmRpbmdbaV0sCisJCQlpICUgOCA9PSAwID8gIlxuICAgIiA6ICIgIik7CisJcHJpbnRrKCJcbm1hc2tzOlxuICAgIik7CisJZm9yKGkgPSBBUlJBWV9TSVpFKHNoLT5ldnRjaG5fbWFzayktMTsgaSA+PSAwOyBpLS0pCisJCXByaW50aygiJTA4bHglcyIsIHNoLT5ldnRjaG5fbWFza1tpXSwKKwkJCWkgJSA4ID09IDAgPyAiXG4gICAiIDogIiAiKTsKKworCXByaW50aygiXG51bm1hc2tlZDpcbiAgICIpOworCWZvcihpID0gQVJSQVlfU0laRShzaC0+ZXZ0Y2huX21hc2spLTE7IGkgPj0gMDsgaS0tKQorCQlwcmludGsoIiUwOGx4JXMiLCBzaC0+ZXZ0Y2huX3BlbmRpbmdbaV0gJiB+c2gtPmV2dGNobl9tYXNrW2ldLAorCQkJaSAlIDggPT0gMCA/ICJcbiAgICIgOiAiICIpOworCisJcHJpbnRrKCJcbnBlbmRpbmcgbGlzdDpcbiIpOworCWZvcihpID0gMDsgaSA8IE5SX0VWRU5UX0NIQU5ORUxTOyBpKyspIHsKKwkJaWYgKHN5bmNfdGVzdF9iaXQoaSwgc2gtPmV2dGNobl9wZW5kaW5nKSkgeworCQkJcHJpbnRrKCIgICVkOiBldmVudCAlZCAtPiBpcnEgJWRcbiIsCisJCQkJY3B1X2V2dGNobltpXSwgaSwKKwkJCQlldnRjaG5fdG9faXJxW2ldKTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlYnVnX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKwogCiAvKgogICogU2VhcmNoIHRoZSBDUFVzIHBlbmRpbmcgZXZlbnRzIGJpdG1hc2tzLiAgRm9yIGVhY2ggb25lIGZvdW5kLCBtYXAKQEAgLTQ3MCwyOSArNTE2LDQ0IEBACiAJaW50IGNwdSA9IGdldF9jcHUoKTsKIAlzdHJ1Y3Qgc2hhcmVkX2luZm8gKnMgPSBIWVBFUlZJU09SX3NoYXJlZF9pbmZvOwogCXN0cnVjdCB2Y3B1X2luZm8gKnZjcHVfaW5mbyA9IF9fZ2V0X2NwdV92YXIoeGVuX3ZjcHUpOwotCXVuc2lnbmVkIGxvbmcgcGVuZGluZ193b3JkczsKKwlzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQsIG5lc3RpbmdfY291bnQpOworIAl1bnNpZ25lZCBjb3VudDsKIAotCXZjcHVfaW5mby0+ZXZ0Y2huX3VwY2FsbF9wZW5kaW5nID0gMDsKKwlkbyB7CisJCXVuc2lnbmVkIGxvbmcgcGVuZGluZ193b3JkczsKIAotCS8qIE5CLiBObyBuZWVkIGZvciBhIGJhcnJpZXIgaGVyZSAtLSBYQ0hHIGlzIGEgYmFycmllciBvbiB4ODYuICovCi0JcGVuZGluZ193b3JkcyA9IHhjaGcoJnZjcHVfaW5mby0+ZXZ0Y2huX3BlbmRpbmdfc2VsLCAwKTsKLQl3aGlsZSAocGVuZGluZ193b3JkcyAhPSAwKSB7Ci0JCXVuc2lnbmVkIGxvbmcgcGVuZGluZ19iaXRzOwotCQlpbnQgd29yZF9pZHggPSBfX2ZmcyhwZW5kaW5nX3dvcmRzKTsKLQkJcGVuZGluZ193b3JkcyAmPSB+KDFVTCA8PCB3b3JkX2lkeCk7CisJCXZjcHVfaW5mby0+ZXZ0Y2huX3VwY2FsbF9wZW5kaW5nID0gMDsKIAotCQl3aGlsZSAoKHBlbmRpbmdfYml0cyA9IGFjdGl2ZV9ldnRjaG5zKGNwdSwgcywgd29yZF9pZHgpKSAhPSAwKSB7Ci0JCQlpbnQgYml0X2lkeCA9IF9fZmZzKHBlbmRpbmdfYml0cyk7Ci0JCQlpbnQgcG9ydCA9ICh3b3JkX2lkeCAqIEJJVFNfUEVSX0xPTkcpICsgYml0X2lkeDsKLQkJCWludCBpcnEgPSBldnRjaG5fdG9faXJxW3BvcnRdOworCQlpZiAoX19nZXRfY3B1X3ZhcihuZXN0aW5nX2NvdW50KSsrKQorCQkJZ290byBvdXQ7CiAKLQkJCWlmIChpcnEgIT0gLTEpIHsKLQkJCQlyZWdzLT5vcmlnX2F4ID0gfmlycTsKLQkJCQlkb19JUlEocmVncyk7CisjaWZuZGVmIENPTkZJR19YODYgLyogTm8gbmVlZCBmb3IgYSBiYXJyaWVyIC0tIFhDSEcgaXMgYSBiYXJyaWVyIG9uIHg4Ni4gKi8KKwkJLyogQ2xlYXIgbWFzdGVyIGZsYWcgL2JlZm9yZS8gY2xlYXJpbmcgc2VsZWN0b3IgZmxhZy4gKi8KKwkJcm1iKCk7CisjZW5kaWYKKwkJcGVuZGluZ193b3JkcyA9IHhjaGcoJnZjcHVfaW5mby0+ZXZ0Y2huX3BlbmRpbmdfc2VsLCAwKTsKKwkJd2hpbGUgKHBlbmRpbmdfd29yZHMgIT0gMCkgeworCQkJdW5zaWduZWQgbG9uZyBwZW5kaW5nX2JpdHM7CisJCQlpbnQgd29yZF9pZHggPSBfX2ZmcyhwZW5kaW5nX3dvcmRzKTsKKwkJCXBlbmRpbmdfd29yZHMgJj0gfigxVUwgPDwgd29yZF9pZHgpOworCisJCQl3aGlsZSAoKHBlbmRpbmdfYml0cyA9IGFjdGl2ZV9ldnRjaG5zKGNwdSwgcywgd29yZF9pZHgpKSAhPSAwKSB7CisJCQkJaW50IGJpdF9pZHggPSBfX2ZmcyhwZW5kaW5nX2JpdHMpOworCQkJCWludCBwb3J0ID0gKHdvcmRfaWR4ICogQklUU19QRVJfTE9ORykgKyBiaXRfaWR4OworCQkJCWludCBpcnEgPSBldnRjaG5fdG9faXJxW3BvcnRdOworCisJCQkJaWYgKGlycSAhPSAtMSkKKwkJCQkJeGVuX2RvX0lSUShpcnEsIHJlZ3MpOwogCQkJfQogCQl9Ci0JfQogCisJCUJVR19PTighaXJxc19kaXNhYmxlZCgpKTsKKworCQljb3VudCA9IF9fZ2V0X2NwdV92YXIobmVzdGluZ19jb3VudCk7CisJCV9fZ2V0X2NwdV92YXIobmVzdGluZ19jb3VudCkgPSAwOworCX0gd2hpbGUoY291bnQgIT0gMSk7CisKK291dDoKIAlwdXRfY3B1KCk7CiB9CiAKQEAgLTUyNSw2ICs1ODYsMjIgQEAKIAlyZWJpbmRfaXJxX3RvX2NwdShpcnEsIHRjcHUpOwogfQogCitpbnQgcmVzZW5kX2lycV9vbl9ldnRjaG4odW5zaWduZWQgaW50IGlycSkKK3sKKwlpbnQgbWFza2VkLCBldnRjaG4gPSBldnRjaG5fZnJvbV9pcnEoaXJxKTsKKwlzdHJ1Y3Qgc2hhcmVkX2luZm8gKnMgPSBIWVBFUlZJU09SX3NoYXJlZF9pbmZvOworCisJaWYgKCFWQUxJRF9FVlRDSE4oZXZ0Y2huKSkKKwkJcmV0dXJuIDE7CisKKwltYXNrZWQgPSBzeW5jX3Rlc3RfYW5kX3NldF9iaXQoZXZ0Y2huLCBzLT5ldnRjaG5fbWFzayk7CisJc3luY19zZXRfYml0KGV2dGNobiwgcy0+ZXZ0Y2huX3BlbmRpbmcpOworCWlmICghbWFza2VkKQorCQl1bm1hc2tfZXZ0Y2huKGV2dGNobik7CisKKwlyZXR1cm4gMTsKK30KKwogc3RhdGljIHZvaWQgZW5hYmxlX2R5bmlycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCWludCBldnRjaG4gPSBldnRjaG5fZnJvbV9pcnEoaXJxKTsKQEAgLTU1NCwxMCArNjMxLDE2IEBACiBzdGF0aWMgaW50IHJldHJpZ2dlcl9keW5pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlpbnQgZXZ0Y2huID0gZXZ0Y2huX2Zyb21faXJxKGlycSk7CisJc3RydWN0IHNoYXJlZF9pbmZvICpzaCA9IEhZUEVSVklTT1Jfc2hhcmVkX2luZm87CiAJaW50IHJldCA9IDA7CiAKIAlpZiAoVkFMSURfRVZUQ0hOKGV2dGNobikpIHsKLQkJc2V0X2V2dGNobihldnRjaG4pOworCQlpbnQgbWFza2VkOworCisJCW1hc2tlZCA9IHN5bmNfdGVzdF9hbmRfc2V0X2JpdChldnRjaG4sIHNoLT5ldnRjaG5fbWFzayk7CisJCXN5bmNfc2V0X2JpdChldnRjaG4sIHNoLT5ldnRjaG5fcGVuZGluZyk7CisJCWlmICghbWFza2VkKQorCQkJdW5tYXNrX2V2dGNobihldnRjaG4pOwogCQlyZXQgPSAxOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL2ZlYXR1cmVzLmMgYi9kcml2ZXJzL3hlbi9mZWF0dXJlcy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3g4Ni94ZW4vZmVhdHVyZXMuYwpyZW5hbWUgdG8gZHJpdmVycy94ZW4vZmVhdHVyZXMuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZ3JhbnQtdGFibGUuYyBiL2RyaXZlcnMveGVuL2dyYW50LXRhYmxlLmMKaW5kZXggZDg1ZGM2ZC4uNTJiNmI0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vZ3JhbnQtdGFibGUuYworKysgYi9kcml2ZXJzL3hlbi9ncmFudC10YWJsZS5jCkBAIC00MzksMjQgKzQzOSw2IEBACiAJcmV0dXJuIHhlbl9tYXg7CiB9CiAKLXN0YXRpYyBpbnQgbWFwX3B0ZV9mbihwdGVfdCAqcHRlLCBzdHJ1Y3QgcGFnZSAqcG1kX3BhZ2UsCi0JCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nICoqZnJhbWVzID0gKHVuc2lnbmVkIGxvbmcgKiopZGF0YTsKLQotCXNldF9wdGVfYXQoJmluaXRfbW0sIGFkZHIsIHB0ZSwgbWZuX3B0ZSgoKmZyYW1lcylbMF0sIFBBR0VfS0VSTkVMKSk7Ci0JKCpmcmFtZXMpKys7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdW5tYXBfcHRlX2ZuKHB0ZV90ICpwdGUsIHN0cnVjdCBwYWdlICpwbWRfcGFnZSwKLQkJCXVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZGF0YSkKLXsKLQotCXNldF9wdGVfYXQoJmluaXRfbW0sIGFkZHIsIHB0ZSwgX19wdGUoMCkpOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGdudHRhYl9tYXAodW5zaWduZWQgaW50IHN0YXJ0X2lkeCwgdW5zaWduZWQgaW50IGVuZF9pZHgpCiB7CiAJc3RydWN0IGdudHRhYl9zZXR1cF90YWJsZSBzZXR1cDsKQEAgLTQ3MCw3ICs0NTIsNyBAQAogCiAJc2V0dXAuZG9tICAgICAgICA9IERPTUlEX1NFTEY7CiAJc2V0dXAubnJfZnJhbWVzICA9IG5yX2dmcmFtZXM7Ci0Jc2V0dXAuZnJhbWVfbGlzdCA9IGZyYW1lczsKKwlzZXRfeGVuX2d1ZXN0X2hhbmRsZShzZXR1cC5mcmFtZV9saXN0LCBmcmFtZXMpOwogCiAJcmMgPSBIWVBFUlZJU09SX2dyYW50X3RhYmxlX29wKEdOVFRBQk9QX3NldHVwX3RhYmxlLCAmc2V0dXAsIDEpOwogCWlmIChyYyA9PSAtRU5PU1lTKSB7CkBAIC00ODAsMTcgKzQ2Miw5IEBACiAKIAlCVUdfT04ocmMgfHwgc2V0dXAuc3RhdHVzKTsKIAotCWlmIChzaGFyZWQgPT0gTlVMTCkgewotCQlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhOwotCQlhcmVhID0gYWxsb2Nfdm1fYXJlYShQQUdFX1NJWkUgKiBtYXhfbnJfZ3JhbnRfZnJhbWVzKCkpOwotCQlCVUdfT04oYXJlYSA9PSBOVUxMKTsKLQkJc2hhcmVkID0gYXJlYS0+YWRkcjsKLQl9Ci0JcmMgPSBhcHBseV90b19wYWdlX3JhbmdlKCZpbml0X21tLCAodW5zaWduZWQgbG9uZylzaGFyZWQsCi0JCQkJIFBBR0VfU0laRSAqIG5yX2dmcmFtZXMsCi0JCQkJIG1hcF9wdGVfZm4sICZmcmFtZXMpOworCXJjID0gYXJjaF9nbnR0YWJfbWFwX3NoYXJlZChmcmFtZXMsIG5yX2dmcmFtZXMsIG1heF9ucl9ncmFudF9mcmFtZXMoKSwKKwkJCQkgICAgJnNoYXJlZCk7CiAJQlVHX09OKHJjKTsKLQlmcmFtZXMgLT0gbnJfZ2ZyYW1lczsgLyogYWRqdXN0IGFmdGVyIG1hcF9wdGVfZm4oKSAqLwogCiAJa2ZyZWUoZnJhbWVzKTsKIApAQCAtNTA2LDEwICs0ODAsNyBAQAogCiBzdGF0aWMgaW50IGdudHRhYl9zdXNwZW5kKHZvaWQpCiB7Ci0JYXBwbHlfdG9fcGFnZV9yYW5nZSgmaW5pdF9tbSwgKHVuc2lnbmVkIGxvbmcpc2hhcmVkLAotCQkJICAgIFBBR0VfU0laRSAqIG5yX2dyYW50X2ZyYW1lcywKLQkJCSAgICB1bm1hcF9wdGVfZm4sIE5VTEwpOwotCisJYXJjaF9nbnR0YWJfdW5tYXBfc2hhcmVkKHNoYXJlZCwgbnJfZ3JhbnRfZnJhbWVzKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19jbGllbnQuYyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfY2xpZW50LmMKaW5kZXggOWZkMmY3MC4uMGY4NmIwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19jbGllbnQuYworKysgYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX2NsaWVudC5jCkBAIC0zOTksNyArMzk5LDcgQEAKIAogCSp2YWRkciA9IE5VTEw7CiAKLQlhcmVhID0gYWxsb2Nfdm1fYXJlYShQQUdFX1NJWkUpOworCWFyZWEgPSB4ZW5fYWxsb2Nfdm1fYXJlYShQQUdFX1NJWkUpOwogCWlmICghYXJlYSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTQwOSw3ICs0MDksNyBAQAogCQlCVUcoKTsKIAogCWlmIChvcC5zdGF0dXMgIT0gR05UU1Rfb2theSkgewotCQlmcmVlX3ZtX2FyZWEoYXJlYSk7CisJCXhlbl9mcmVlX3ZtX2FyZWEoYXJlYSk7CiAJCXhlbmJ1c19kZXZfZmF0YWwoZGV2LCBvcC5zdGF0dXMsCiAJCQkJICJtYXBwaW5nIGluIHNoYXJlZCBwYWdlICVkIGZyb20gZG9tYWluICVkIiwKIAkJCQkgZ250X3JlZiwgZGV2LT5vdGhlcmVuZF9pZCk7CkBAIC01MDgsNyArNTA4LDcgQEAKIAkJQlVHKCk7CiAKIAlpZiAob3Auc3RhdHVzID09IEdOVFNUX29rYXkpCi0JCWZyZWVfdm1fYXJlYShhcmVhKTsKKwkJeGVuX2ZyZWVfdm1fYXJlYShhcmVhKTsKIAllbHNlCiAJCXhlbmJ1c19kZXZfZXJyb3IoZGV2LCBvcC5zdGF0dXMsCiAJCQkJICJ1bm1hcHBpbmcgcGFnZSBhdCBoYW5kbGUgJWQgZXJyb3IgJWQiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5jIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5jCmluZGV4IDQ3NTBkZTMuLjU3Y2ViNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuYworKysgYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMKQEAgLTg4LDYgKzg4LDE2IEBACiAJcmV0dXJuIG1hdGNoX2RldmljZShkcnYtPmlkcywgdG9feGVuYnVzX2RldmljZShfZGV2KSkgIT0gTlVMTDsKIH0KIAorc3RhdGljIGludCB4ZW5idXNfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKl9kZXYsIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudikKK3sKKwlzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2ID0gdG9feGVuYnVzX2RldmljZShfZGV2KTsKKworCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJNT0RBTElBUz14ZW46JXMiLCBkZXYtPmRldmljZXR5cGUpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCiAvKiBkZXZpY2UvPHR5cGU+LzxpZD4gPT4gPHR5cGU+LTxpZD4gKi8KIHN0YXRpYyBpbnQgZnJvbnRlbmRfYnVzX2lkKGNoYXIgYnVzX2lkW0JVU19JRF9TSVpFXSwgY29uc3QgY2hhciAqbm9kZW5hbWUpCiB7CkBAIC0xNjYsNiArMTc2LDcgQEAKIAkuYnVzID0gewogCQkubmFtZSAgICAgPSAieGVuIiwKIAkJLm1hdGNoICAgID0geGVuYnVzX21hdGNoLAorCQkudWV2ZW50ICAgPSB4ZW5idXNfdWV2ZW50LAogCQkucHJvYmUgICAgPSB4ZW5idXNfZGV2X3Byb2JlLAogCQkucmVtb3ZlICAgPSB4ZW5idXNfZGV2X3JlbW92ZSwKIAkJLnNodXRkb3duID0geGVuYnVzX2Rldl9zaHV0ZG93biwKQEAgLTQzOCw2ICs0NDksMTIgQEAKIH0KIERFVklDRV9BVFRSKGRldnR5cGUsIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCwgeGVuZGV2X3Nob3dfZGV2dHlwZSwgTlVMTCk7CiAKK3N0YXRpYyBzc2l6ZV90IHhlbmRldl9zaG93X21vZGFsaWFzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICJ4ZW46JXNcbiIsIHRvX3hlbmJ1c19kZXZpY2UoZGV2KS0+ZGV2aWNldHlwZSk7Cit9CitERVZJQ0VfQVRUUihtb2RhbGlhcywgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RILCB4ZW5kZXZfc2hvd19tb2RhbGlhcywgTlVMTCk7CiAKIGludCB4ZW5idXNfcHJvYmVfbm9kZShzdHJ1Y3QgeGVuX2J1c190eXBlICpidXMsCiAJCSAgICAgIGNvbnN0IGNoYXIgKnR5cGUsCkBAIC00OTIsMTAgKzUwOSwxNiBAQAogCiAJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ4ZW5kZXYtPmRldiwgJmRldl9hdHRyX2RldnR5cGUpOwogCWlmIChlcnIpCi0JCWdvdG8gZmFpbF9yZW1vdmVfZmlsZTsKKwkJZ290byBmYWlsX3JlbW92ZV9ub2RlbmFtZTsKKworCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmeGVuZGV2LT5kZXYsICZkZXZfYXR0cl9tb2RhbGlhcyk7CisJaWYgKGVycikKKwkJZ290byBmYWlsX3JlbW92ZV9kZXZ0eXBlOwogCiAJcmV0dXJuIDA7Ci1mYWlsX3JlbW92ZV9maWxlOgorZmFpbF9yZW1vdmVfZGV2dHlwZToKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnhlbmRldi0+ZGV2LCAmZGV2X2F0dHJfZGV2dHlwZSk7CitmYWlsX3JlbW92ZV9ub2RlbmFtZToKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnhlbmRldi0+ZGV2LCAmZGV2X2F0dHJfbm9kZW5hbWUpOwogZmFpbF91bnJlZ2lzdGVyOgogCWRldmljZV91bnJlZ2lzdGVyKCZ4ZW5kZXYtPmRldik7CkBAIC04NDYsNiArODY5LDcgQEAKIHsKIAlzdHJ1Y3QgeGVuYnVzX2RldmljZSAqeGVuZGV2ID0gdG9feGVuYnVzX2RldmljZShkZXYpOwogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkYXRhOworCXN0cnVjdCB4ZW5idXNfZHJpdmVyICp4ZW5kcnY7CiAKIAkvKgogCSAqIEEgZGV2aWNlIHdpdGggbm8gZHJpdmVyIHdpbGwgbmV2ZXIgY29ubmVjdC4gV2UgY2FyZSBvbmx5IGFib3V0CkBAIC04NTgsNyArODgyLDkgQEAKIAlpZiAoZHJ2ICYmIChkZXYtPmRyaXZlciAhPSBkcnYpKQogCQlyZXR1cm4gMDsKIAotCXJldHVybiAoeGVuZGV2LT5zdGF0ZSAhPSBYZW5idXNTdGF0ZUNvbm5lY3RlZCk7CisJeGVuZHJ2ID0gdG9feGVuYnVzX2RyaXZlcihkZXYtPmRyaXZlcik7CisJcmV0dXJuICh4ZW5kZXYtPnN0YXRlICE9IFhlbmJ1c1N0YXRlQ29ubmVjdGVkIHx8CisJCSh4ZW5kcnYtPmlzX3JlYWR5ICYmICF4ZW5kcnYtPmlzX3JlYWR5KHhlbmRldikpKTsKIH0KIAogc3RhdGljIGludCBleGlzdHNfZGlzY29ubmVjdGVkX2RldmljZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuY29tbS5jIGIvZHJpdmVycy94ZW4veGVuY29tbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5N2NiNGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3hlbi94ZW5jb21tLmMKQEAgLTAsMCArMSwyMzIgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3JwLiAyMDA2CisgKgorICogQXV0aG9yczogSG9sbGlzIEJsYW5jaGFyZCA8aG9sbGlzYkB1cy5pYm0uY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8eGVuL3hlbmNvbW0uaD4KKyNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3hlbi5oPgorI2lmZGVmIF9faWE2NF9fCisjaW5jbHVkZSA8YXNtL3hlbi94ZW5jb21tLmg+CS8qIGZvciBpc19rZXJuX2FkZHIoKSAqLworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1hFTl9QTEFURk9STV9DT01QQVRfSAorI2luY2x1ZGUgPHhlbi9wbGF0Zm9ybS1jb21wYXQuaD4KKyNlbmRpZgorCitzdGF0aWMgaW50IHhlbmNvbW1faW5pdChzdHJ1Y3QgeGVuY29tbV9kZXNjICpkZXNjLAorCQkJdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGJ5dGVzKQoreworCXVuc2lnbmVkIGxvbmcgcmVjb3JkZWQgPSAwOworCWludCBpID0gMDsKKworCXdoaWxlICgocmVjb3JkZWQgPCBieXRlcykgJiYgKGkgPCBkZXNjLT5ucl9hZGRycykpIHsKKwkJdW5zaWduZWQgbG9uZyB2YWRkciA9ICh1bnNpZ25lZCBsb25nKWJ1ZmZlciArIHJlY29yZGVkOworCQl1bnNpZ25lZCBsb25nIHBhZGRyOworCQlpbnQgb2Zmc2V0OworCQlpbnQgY2h1bmtzejsKKworCQlvZmZzZXQgPSB2YWRkciAlIFBBR0VfU0laRTsgLyogaGFuZGxlIHBhcnRpYWwgcGFnZXMgKi8KKwkJY2h1bmtzeiA9IG1pbihQQUdFX1NJWkUgLSBvZmZzZXQsIGJ5dGVzIC0gcmVjb3JkZWQpOworCisJCXBhZGRyID0geGVuY29tbV92dG9wKHZhZGRyKTsKKwkJaWYgKHBhZGRyID09IH4wVUwpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogY291bGRuJ3QgdHJhbnNsYXRlIHZhZGRyICVseFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgdmFkZHIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlkZXNjLT5hZGRyZXNzW2krK10gPSBwYWRkcjsKKwkJcmVjb3JkZWQgKz0gY2h1bmtzejsKKwl9CisKKwlpZiAocmVjb3JkZWQgPCBieXRlcykgeworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIiVzOiBjb3VsZCBvbmx5IHRyYW5zbGF0ZSAlbGQgb2YgJWxkIGJ5dGVzXG4iLAorCQkgICAgICAgX19mdW5jX18sIHJlY29yZGVkLCBieXRlcyk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCS8qIG1hcmsgcmVtYWluaW5nIGFkZHJlc3NlcyBpbnZhbGlkIChqdXN0IGZvciBzYWZldHkpICovCisJd2hpbGUgKGkgPCBkZXNjLT5ucl9hZGRycykKKwkJZGVzYy0+YWRkcmVzc1tpKytdID0gWEVOQ09NTV9JTlZBTElEOworCisJZGVzYy0+bWFnaWMgPSBYRU5DT01NX01BR0lDOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeGVuY29tbV9kZXNjICp4ZW5jb21tX2FsbG9jKGdmcF90IGdmcF9tYXNrLAorCQkJCQkgIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBieXRlcykKK3sKKwlzdHJ1Y3QgeGVuY29tbV9kZXNjICpkZXNjOworCXVuc2lnbmVkIGxvbmcgYnVmZmVyX3Vsb25nID0gKHVuc2lnbmVkIGxvbmcpYnVmZmVyOworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBidWZmZXJfdWxvbmcgJiBQQUdFX01BU0s7CisJdW5zaWduZWQgbG9uZyBlbmQgPSAoYnVmZmVyX3Vsb25nICsgYnl0ZXMpIHwgflBBR0VfTUFTSzsKKwl1bnNpZ25lZCBsb25nIG5yX2FkZHJzID0gKGVuZCAtIHN0YXJ0ICsgMSkgPj4gUEFHRV9TSElGVDsKKwl1bnNpZ25lZCBsb25nIHNpemUgPSBzaXplb2YoKmRlc2MpICsKKwkJc2l6ZW9mKGRlc2MtPmFkZHJlc3NbMF0pICogbnJfYWRkcnM7CisKKwkvKgorCSAqIHNsYWIgYWxsb2NhdG9yIHJldHVybnMgYXQgbGVhc3Qgc2l6ZW9mKHZvaWQqKSBhbGlnbmVkIHBvaW50ZXIuCisJICogV2hlbiBzaXplb2YoKmRlc2MpID4gc2l6ZW9mKHZvaWQqKSwgc3RydWN0IHhlbmNvbW1fZGVzYyBtaWdodAorCSAqIGNyb3NzIHBhZ2UgYm91bmRhcnkuCisJICovCisJaWYgKHNpemVvZigqZGVzYykgPiBzaXplb2Yodm9pZCAqKSkgeworCQl1bnNpZ25lZCBsb25nIG9yZGVyID0gZ2V0X29yZGVyKHNpemUpOworCQlkZXNjID0gKHN0cnVjdCB4ZW5jb21tX2Rlc2MgKilfX2dldF9mcmVlX3BhZ2VzKGdmcF9tYXNrLAorCQkJCQkJCSAgICAgICBvcmRlcik7CisJCWlmIChkZXNjID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKworCQlkZXNjLT5ucl9hZGRycyA9CisJCQkoKFBBR0VfU0laRSA8PCBvcmRlcikgLSBzaXplb2Yoc3RydWN0IHhlbmNvbW1fZGVzYykpIC8KKwkJCXNpemVvZigqZGVzYy0+YWRkcmVzcyk7CisJfSBlbHNlIHsKKwkJZGVzYyA9IGttYWxsb2Moc2l6ZSwgZ2ZwX21hc2spOworCQlpZiAoZGVzYyA9PSBOVUxMKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJZGVzYy0+bnJfYWRkcnMgPSBucl9hZGRyczsKKwl9CisJcmV0dXJuIGRlc2M7Cit9CisKK3ZvaWQgeGVuY29tbV9mcmVlKHN0cnVjdCB4ZW5jb21tX2hhbmRsZSAqZGVzYykKK3sKKwlpZiAoZGVzYyAmJiAhKCh1bG9uZylkZXNjICYgWEVOQ09NTV9JTkxJTkVfRkxBRykpIHsKKwkJc3RydWN0IHhlbmNvbW1fZGVzYyAqZGVzY19fID0gKHN0cnVjdCB4ZW5jb21tX2Rlc2MgKilkZXNjOworCQlpZiAoc2l6ZW9mKCpkZXNjX18pID4gc2l6ZW9mKHZvaWQgKikpIHsKKwkJCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHNpemVvZigqZGVzY19fKSArCisJCQkJc2l6ZW9mKGRlc2NfXy0+YWRkcmVzc1swXSkgKiBkZXNjX18tPm5yX2FkZHJzOworCQkJdW5zaWduZWQgbG9uZyBvcmRlciA9IGdldF9vcmRlcihzaXplKTsKKwkJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpX192YShkZXNjKSwgb3JkZXIpOworCQl9IGVsc2UKKwkJCWtmcmVlKF9fdmEoZGVzYykpOworCX0KK30KKworc3RhdGljIGludCB4ZW5jb21tX2NyZWF0ZSh2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgYnl0ZXMsCisJCQkgIHN0cnVjdCB4ZW5jb21tX2Rlc2MgKipyZXQsIGdmcF90IGdmcF9tYXNrKQoreworCXN0cnVjdCB4ZW5jb21tX2Rlc2MgKmRlc2M7CisJaW50IHJjOworCisJcHJfZGVidWcoIiVzOiAlcFslbGRdXG4iLCBfX2Z1bmNfXywgYnVmZmVyLCBieXRlcyk7CisKKwlpZiAoYnl0ZXMgPT0gMCkgeworCQkvKiBkb24ndCBjcmVhdGUgYSBkZXNjcmlwdG9yOyBYZW4gcmVjb2duaXplcyBOVUxMLiAqLworCQlCVUdfT04oYnVmZmVyICE9IE5VTEwpOworCQkqcmV0ID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCisJQlVHX09OKGJ1ZmZlciA9PSBOVUxMKTsgLyogJ2J5dGVzJyBpcyBub24temVybyAqLworCisJZGVzYyA9IHhlbmNvbW1fYWxsb2MoZ2ZwX21hc2ssIGJ1ZmZlciwgYnl0ZXMpOworCWlmICghZGVzYykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgZmFpbHVyZVxuIiwgInhlbmNvbW1fYWxsb2MiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmMgPSB4ZW5jb21tX2luaXQoZGVzYywgYnVmZmVyLCBieXRlcyk7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlcyBmYWlsdXJlOiAlZFxuIiwgInhlbmNvbW1faW5pdCIsIHJjKTsKKwkJeGVuY29tbV9mcmVlKChzdHJ1Y3QgeGVuY29tbV9oYW5kbGUgKilfX3BhKGRlc2MpKTsKKwkJcmV0dXJuIHJjOworCX0KKworCSpyZXQgPSBkZXNjOworCXJldHVybiAwOworfQorCisvKiBjaGVjayBpZiBtZW1vcnkgYWRkcmVzcyBpcyB3aXRoaW4gVk1BTExPQyByZWdpb24gICovCitzdGF0aWMgaW50IGlzX3BoeXNfY29udGlndW91cyh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJaWYgKCFpc19rZXJuZWxfYWRkcihhZGRyKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKGFkZHIgPCBWTUFMTE9DX1NUQVJUKSB8fCAoYWRkciA+PSBWTUFMTE9DX0VORCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeGVuY29tbV9oYW5kbGUgKnhlbmNvbW1fY3JlYXRlX2lubGluZSh2b2lkICpwdHIpCit7CisJdW5zaWduZWQgbG9uZyBwYWRkcjsKKworCUJVR19PTighaXNfcGh5c19jb250aWd1b3VzKCh1bnNpZ25lZCBsb25nKXB0cikpOworCisJcGFkZHIgPSAodW5zaWduZWQgbG9uZyl4ZW5jb21tX3BhKHB0cik7CisJQlVHX09OKHBhZGRyICYgWEVOQ09NTV9JTkxJTkVfRkxBRyk7CisJcmV0dXJuIChzdHJ1Y3QgeGVuY29tbV9oYW5kbGUgKikocGFkZHIgfCBYRU5DT01NX0lOTElORV9GTEFHKTsKK30KKworLyogIm1pbmkiIHJvdXRpbmUsIGZvciBzdGFjay1iYXNlZCBjb21tdW5pY2F0aW9uczogKi8KK3N0YXRpYyBpbnQgeGVuY29tbV9jcmVhdGVfbWluaSh2b2lkICpidWZmZXIsCisJdW5zaWduZWQgbG9uZyBieXRlcywgc3RydWN0IHhlbmNvbW1fbWluaSAqeGNfZGVzYywKKwlzdHJ1Y3QgeGVuY29tbV9kZXNjICoqcmV0KQoreworCWludCByYyA9IDA7CisJc3RydWN0IHhlbmNvbW1fZGVzYyAqZGVzYzsKKwlCVUdfT04oKCh1bnNpZ25lZCBsb25nKXhjX2Rlc2MpICUgc2l6ZW9mKCp4Y19kZXNjKSAhPSAwKTsKKworCWRlc2MgPSAodm9pZCAqKXhjX2Rlc2M7CisKKwlkZXNjLT5ucl9hZGRycyA9IFhFTkNPTU1fTUlOSV9BRERSUzsKKworCXJjID0geGVuY29tbV9pbml0KGRlc2MsIGJ1ZmZlciwgYnl0ZXMpOworCWlmICghcmMpCisJCSpyZXQgPSBkZXNjOworCisJcmV0dXJuIHJjOworfQorCitzdHJ1Y3QgeGVuY29tbV9oYW5kbGUgKnhlbmNvbW1fbWFwKHZvaWQgKnB0ciwgdW5zaWduZWQgbG9uZyBieXRlcykKK3sKKwlpbnQgcmM7CisJc3RydWN0IHhlbmNvbW1fZGVzYyAqZGVzYzsKKworCWlmIChpc19waHlzX2NvbnRpZ3VvdXMoKHVuc2lnbmVkIGxvbmcpcHRyKSkKKwkJcmV0dXJuIHhlbmNvbW1fY3JlYXRlX2lubGluZShwdHIpOworCisJcmMgPSB4ZW5jb21tX2NyZWF0ZShwdHIsIGJ5dGVzLCAmZGVzYywgR0ZQX0tFUk5FTCk7CisKKwlpZiAocmMgfHwgZGVzYyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiB4ZW5jb21tX3BhKGRlc2MpOworfQorCitzdHJ1Y3QgeGVuY29tbV9oYW5kbGUgKl9feGVuY29tbV9tYXBfbm9fYWxsb2Modm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIGJ5dGVzLAorCQkJc3RydWN0IHhlbmNvbW1fbWluaSAqeGNfZGVzYykKK3sKKwlpbnQgcmM7CisJc3RydWN0IHhlbmNvbW1fZGVzYyAqZGVzYyA9IE5VTEw7CisKKwlpZiAoaXNfcGh5c19jb250aWd1b3VzKCh1bnNpZ25lZCBsb25nKXB0cikpCisJCXJldHVybiB4ZW5jb21tX2NyZWF0ZV9pbmxpbmUocHRyKTsKKworCXJjID0geGVuY29tbV9jcmVhdGVfbWluaShwdHIsIGJ5dGVzLCB4Y19kZXNjLAorCQkJCSZkZXNjKTsKKworCWlmIChyYykKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4geGVuY29tbV9wYShkZXNjKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL1JFQURNRS5Mb2NraW5nIGIvZnMvamZmczIvUkVBRE1FLkxvY2tpbmcKaW5kZXggZDE0ZDVhNC4uM2VhMzY1NSAxMDA2NDQKLS0tIGEvZnMvamZmczIvUkVBRE1FLkxvY2tpbmcKKysrIGIvZnMvamZmczIvUkVBRE1FLkxvY2tpbmcKQEAgLTE0LDcgKzE0LDcgQEAKIAlhbGxvY19zZW0KIAktLS0tLS0tLS0KIAotVGhlIGFsbG9jX3NlbSBpcyBhIHBlci1maWxlc3lzdGVtIHNlbWFwaG9yZSwgdXNlZCBwcmltYXJpbHkgdG8gZW5zdXJlCitUaGUgYWxsb2Nfc2VtIGlzIGEgcGVyLWZpbGVzeXN0ZW0gbXV0ZXgsIHVzZWQgcHJpbWFyaWx5IHRvIGVuc3VyZQogY29udGlndW91cyBhbGxvY2F0aW9uIG9mIHNwYWNlIG9uIHRoZSBtZWRpdW0uIEl0IGlzIGF1dG9tYXRpY2FsbHkKIG9idGFpbmVkIGR1cmluZyBzcGFjZSBhbGxvY2F0aW9ucyAoamZmczJfcmVzZXJ2ZV9zcGFjZSgpKSBhbmQgZnJlZWQKIHVwb24gd3JpdGUgY29tcGxldGlvbiAoamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oKSkuIE5vdGUgdGhhdApAQCAtNDEsMTAgKzQxLDEwIEBACiBPcmRlcmluZyBjb25zdHJhaW50czogU2VlIGYtPnNlbS4KIAogCi0JRmlsZSBTZW1hcGhvcmUgZi0+c2VtCisJRmlsZSBNdXRleCBmLT5zZW0KIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotVGhpcyBpcyB0aGUgSkZGUzItaW50ZXJuYWwgZXF1aXZhbGVudCBvZiB0aGUgaW5vZGUgc2VtYXBob3JlIGktPmlfc2VtLgorVGhpcyBpcyB0aGUgSkZGUzItaW50ZXJuYWwgZXF1aXZhbGVudCBvZiB0aGUgaW5vZGUgbXV0ZXggaS0+aV9zZW0uCiBJdCBwcm90ZWN0cyB0aGUgY29udGVudHMgb2YgdGhlIGpmZnMyX2lub2RlX2luZm8gcHJpdmF0ZSBpbm9kZSBkYXRhLAogaW5jbHVkaW5nIHRoZSBsaW5rZWQgbGlzdCBvZiBub2RlIGZyYWdtZW50cyAoYnV0IHNlZSB0aGUgbm90ZXMgYmVsb3cgb24KIGVyYXNlX2NvbXBsZXRpb25fbG9jayksIGV0Yy4KQEAgLTYwLDE0ICs2MCwxNCBAQAogYmVmb3JlIGNhbGxpbmcgdGhlIHNwYWNlIGFsbG9jYXRpb24gZnVuY3Rpb25zLgogCiBJbnN0ZWFkIG9mIHBsYXlpbmcgc3VjaCBnYW1lcywgd2UganVzdCBoYXZlIGFuIGV4dHJhIGludGVybmFsCi1zZW1hcGhvcmUsIHdoaWNoIGlzIG9idGFpbmVkIGJ5IHRoZSBnYXJiYWdlIGNvbGxlY3Rpb24gY29kZSBhbmQgYWxzbworbXV0ZXgsIHdoaWNoIGlzIG9idGFpbmVkIGJ5IHRoZSBnYXJiYWdlIGNvbGxlY3Rpb24gY29kZSBhbmQgYWxzbwogYnkgdGhlIG5vcm1hbCBmaWxlIHN5c3RlbSBjb2RlIF9hZnRlcl8gYWxsb2NhdGlvbiBvZiBzcGFjZS4KIAogT3JkZXJpbmcgY29uc3RyYWludHM6IAogCiAJMS4gTmV2ZXIgYXR0ZW1wdCB0byBhbGxvY2F0ZSBzcGFjZSBvciBsb2NrIGFsbG9jX3NlbSB3aXRoIAogCSAgIGFueSBmLT5zZW0gaGVsZC4KLQkyLiBOZXZlciBhdHRlbXB0IHRvIGxvY2sgdHdvIGZpbGUgc2VtYXBob3JlcyBpbiBvbmUgdGhyZWFkLgorCTIuIE5ldmVyIGF0dGVtcHQgdG8gbG9jayB0d28gZmlsZSBtdXRleGVzIGluIG9uZSB0aHJlYWQuCiAJICAgTm8gb3JkZXJpbmcgcnVsZXMgaGF2ZSBiZWVuIG1hZGUgZm9yIGRvaW5nIHNvLgogCiAKQEAgLTg2LDggKzg2LDggQEAKIAogTm90ZSB0aGF0IHRoZSBwZXItaW5vZGUgbGlzdCBvZiBwaHlzaWNhbCBub2RlcyAoZi0+bm9kZXMpIGlzIGEgc3BlY2lhbAogY2FzZS4gQW55IGNoYW5nZXMgdG8gX3ZhbGlkXyBub2RlcyAoaS5lLiAtPmZsYXNoX29mZnNldCAmIDEgPT0gMCkgaW4KLXRoZSBsaXN0IGFyZSBwcm90ZWN0ZWQgYnkgdGhlIGZpbGUgc2VtYXBob3JlIGYtPnNlbS4gQnV0IHRoZSBlcmFzZQotY29kZSBtYXkgcmVtb3ZlIF9vYnNvbGV0ZV8gbm9kZXMgZnJvbSB0aGUgbGlzdCB3aGlsZSBob2xkaW5nIG9ubHkgdGhlCit0aGUgbGlzdCBhcmUgcHJvdGVjdGVkIGJ5IHRoZSBmaWxlIG11dGV4IGYtPnNlbS4gQnV0IHRoZSBlcmFzZSBjb2RlCittYXkgcmVtb3ZlIF9vYnNvbGV0ZV8gbm9kZXMgZnJvbSB0aGUgbGlzdCB3aGlsZSBob2xkaW5nIG9ubHkgdGhlCiBlcmFzZV9jb21wbGV0aW9uX2xvY2suIFNvIHlvdSBjYW4gd2FsayB0aGUgbGlzdCBvbmx5IHdoaWxlIGhvbGRpbmcgdGhlCiBlcmFzZV9jb21wbGV0aW9uX2xvY2ssIGFuZCBjYW4gZHJvcCB0aGUgbG9jayB0ZW1wb3JhcmlseSBtaWQtd2FsayBhcwogbG9uZyBhcyB0aGUgcG9pbnRlciB5b3UncmUgaG9sZGluZyBpcyB0byBhIF92YWxpZF8gbm9kZSwgbm90IGFuCkBAIC0xMjQsMTAgKzEyNCwxMCBAQAogCWVyYXNlX2ZyZWVfc2VtCiAJLS0tLS0tLS0tLS0tLS0KIAotVGhpcyBzZW1hcGhvcmUgaXMgb25seSB1c2VkIGJ5IHRoZSBlcmFzZSBjb2RlIHdoaWNoIGZyZWVzIG9ic29sZXRlCi1ub2RlIHJlZmVyZW5jZXMgYW5kIHRoZSBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfZGVsZXRpb25fZGlyZW50KCkKLWZ1bmN0aW9uLiBUaGUgbGF0dGVyIGZ1bmN0aW9uIG9uIE5BTkQgZmxhc2ggbXVzdCByZWFkIF9vYnNvbGV0ZV8gbm9kZXMKLXRvIGRldGVybWluZSB3aGV0aGVyIHRoZSAnZGVsZXRpb24gZGlyZW50JyB1bmRlciBjb25zaWRlcmF0aW9uIGNhbiBiZQorVGhpcyBtdXRleCBpcyBvbmx5IHVzZWQgYnkgdGhlIGVyYXNlIGNvZGUgd2hpY2ggZnJlZXMgb2Jzb2xldGUgbm9kZQorcmVmZXJlbmNlcyBhbmQgdGhlIGpmZnMyX2dhcmJhZ2VfY29sbGVjdF9kZWxldGlvbl9kaXJlbnQoKSBmdW5jdGlvbi4KK1RoZSBsYXR0ZXIgZnVuY3Rpb24gb24gTkFORCBmbGFzaCBtdXN0IHJlYWQgX29ic29sZXRlXyBub2RlcyB0bworZGV0ZXJtaW5lIHdoZXRoZXIgdGhlICdkZWxldGlvbiBkaXJlbnQnIHVuZGVyIGNvbnNpZGVyYXRpb24gY2FuIGJlCiBkaXNjYXJkZWQgb3Igd2hldGhlciBpdCBpcyBzdGlsbCByZXF1aXJlZCB0byBzaG93IHRoYXQgYW4gaW5vZGUgaGFzCiBiZWVuIHVubGlua2VkLiBCZWNhdXNlIHJlYWRpbmcgZnJvbSB0aGUgZmxhc2ggbWF5IHNsZWVwLCB0aGUKIGVyYXNlX2NvbXBsZXRpb25fbG9jayBjYW5ub3QgYmUgaGVsZCwgc28gYW4gYWx0ZXJuYXRpdmUsIG1vcmUKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2J1aWxkLmMgYi9mcy9qZmZzMi9idWlsZC5jCmluZGV4IDcyMmE2YjYuLmQ1OGY4NDUgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2J1aWxkLmMKKysrIGIvZnMvamZmczIvYnVpbGQuYwpAQCAtMzQ1LDYgKzM0NSw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJmMtPmRpcnR5X2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZjLT5lcmFzYWJsZV9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmYy0+ZXJhc2luZ19saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmYy0+ZXJhc2VfY2hlY2tpbmdfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmMtPmVyYXNhYmxlX3BlbmRpbmdfd2J1Zl9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmYy0+ZXJhc2VfY29tcGxldGVfbGlzdCk7CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9kZWJ1Zy5jIGIvZnMvamZmczIvZGVidWcuYwppbmRleCAzYTMyYzY0Li41NTQ0ZDMxIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9kZWJ1Zy5jCisrKyBiL2ZzL2pmZnMyL2RlYnVnLmMKQEAgLTYyLDkgKzYyLDkgQEAKIHZvaWQKIF9famZmczJfZGJnX2ZyYWd0cmVlX3BhcmFub2lhX2NoZWNrKHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmKQogewotCWRvd24oJmYtPnNlbSk7CisJbXV0ZXhfbG9jaygmZi0+c2VtKTsKIAlfX2pmZnMyX2RiZ19mcmFndHJlZV9wYXJhbm9pYV9jaGVja19ub2xvY2soZik7Ci0JdXAoJmYtPnNlbSk7CisJbXV0ZXhfdW5sb2NrKCZmLT5zZW0pOwogfQogCiB2b2lkCkBAIC0xNTMsNiArMTUzLDEzOSBAQAogCWtmcmVlKGJ1Zik7CiB9CiAKK3ZvaWQgX19qZmZzMl9kYmdfc3VwZXJibG9ja19jb3VudHMoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpCit7CisJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYjsKKwl1aW50MzJfdCBmcmVlID0gMCwgZGlydHkgPSAwLCB1c2VkID0gMCwgd2FzdGVkID0gMCwKKwkJZXJhc2luZyA9IDAsIGJhZCA9IDAsIHVuY2hlY2tlZCA9IDA7CisJaW50IG5yX2NvdW50ZWQgPSAwOworCWludCBkdW1wID0gMDsKKworCWlmIChjLT5nY2Jsb2NrKSB7CisJCW5yX2NvdW50ZWQrKzsKKwkJZnJlZSArPSBjLT5nY2Jsb2NrLT5mcmVlX3NpemU7CisJCWRpcnR5ICs9IGMtPmdjYmxvY2stPmRpcnR5X3NpemU7CisJCXVzZWQgKz0gYy0+Z2NibG9jay0+dXNlZF9zaXplOworCQl3YXN0ZWQgKz0gYy0+Z2NibG9jay0+d2FzdGVkX3NpemU7CisJCXVuY2hlY2tlZCArPSBjLT5nY2Jsb2NrLT51bmNoZWNrZWRfc2l6ZTsKKwl9CisJaWYgKGMtPm5leHRibG9jaykgeworCQlucl9jb3VudGVkKys7CisJCWZyZWUgKz0gYy0+bmV4dGJsb2NrLT5mcmVlX3NpemU7CisJCWRpcnR5ICs9IGMtPm5leHRibG9jay0+ZGlydHlfc2l6ZTsKKwkJdXNlZCArPSBjLT5uZXh0YmxvY2stPnVzZWRfc2l6ZTsKKwkJd2FzdGVkICs9IGMtPm5leHRibG9jay0+d2FzdGVkX3NpemU7CisJCXVuY2hlY2tlZCArPSBjLT5uZXh0YmxvY2stPnVuY2hlY2tlZF9zaXplOworCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGplYiwgJmMtPmNsZWFuX2xpc3QsIGxpc3QpIHsKKwkJbnJfY291bnRlZCsrOworCQlmcmVlICs9IGplYi0+ZnJlZV9zaXplOworCQlkaXJ0eSArPSBqZWItPmRpcnR5X3NpemU7CisJCXVzZWQgKz0gamViLT51c2VkX3NpemU7CisJCXdhc3RlZCArPSBqZWItPndhc3RlZF9zaXplOworCQl1bmNoZWNrZWQgKz0gamViLT51bmNoZWNrZWRfc2l6ZTsKKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeShqZWIsICZjLT52ZXJ5X2RpcnR5X2xpc3QsIGxpc3QpIHsKKwkJbnJfY291bnRlZCsrOworCQlmcmVlICs9IGplYi0+ZnJlZV9zaXplOworCQlkaXJ0eSArPSBqZWItPmRpcnR5X3NpemU7CisJCXVzZWQgKz0gamViLT51c2VkX3NpemU7CisJCXdhc3RlZCArPSBqZWItPndhc3RlZF9zaXplOworCQl1bmNoZWNrZWQgKz0gamViLT51bmNoZWNrZWRfc2l6ZTsKKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeShqZWIsICZjLT5kaXJ0eV9saXN0LCBsaXN0KSB7CisJCW5yX2NvdW50ZWQrKzsKKwkJZnJlZSArPSBqZWItPmZyZWVfc2l6ZTsKKwkJZGlydHkgKz0gamViLT5kaXJ0eV9zaXplOworCQl1c2VkICs9IGplYi0+dXNlZF9zaXplOworCQl3YXN0ZWQgKz0gamViLT53YXN0ZWRfc2l6ZTsKKwkJdW5jaGVja2VkICs9IGplYi0+dW5jaGVja2VkX3NpemU7CisJfQorCWxpc3RfZm9yX2VhY2hfZW50cnkoamViLCAmYy0+ZXJhc2FibGVfbGlzdCwgbGlzdCkgeworCQlucl9jb3VudGVkKys7CisJCWZyZWUgKz0gamViLT5mcmVlX3NpemU7CisJCWRpcnR5ICs9IGplYi0+ZGlydHlfc2l6ZTsKKwkJdXNlZCArPSBqZWItPnVzZWRfc2l6ZTsKKwkJd2FzdGVkICs9IGplYi0+d2FzdGVkX3NpemU7CisJCXVuY2hlY2tlZCArPSBqZWItPnVuY2hlY2tlZF9zaXplOworCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGplYiwgJmMtPmVyYXNhYmxlX3BlbmRpbmdfd2J1Zl9saXN0LCBsaXN0KSB7CisJCW5yX2NvdW50ZWQrKzsKKwkJZnJlZSArPSBqZWItPmZyZWVfc2l6ZTsKKwkJZGlydHkgKz0gamViLT5kaXJ0eV9zaXplOworCQl1c2VkICs9IGplYi0+dXNlZF9zaXplOworCQl3YXN0ZWQgKz0gamViLT53YXN0ZWRfc2l6ZTsKKwkJdW5jaGVja2VkICs9IGplYi0+dW5jaGVja2VkX3NpemU7CisJfQorCWxpc3RfZm9yX2VhY2hfZW50cnkoamViLCAmYy0+ZXJhc2VfcGVuZGluZ19saXN0LCBsaXN0KSB7CisJCW5yX2NvdW50ZWQrKzsKKwkJZnJlZSArPSBqZWItPmZyZWVfc2l6ZTsKKwkJZGlydHkgKz0gamViLT5kaXJ0eV9zaXplOworCQl1c2VkICs9IGplYi0+dXNlZF9zaXplOworCQl3YXN0ZWQgKz0gamViLT53YXN0ZWRfc2l6ZTsKKwkJdW5jaGVja2VkICs9IGplYi0+dW5jaGVja2VkX3NpemU7CisJfQorCWxpc3RfZm9yX2VhY2hfZW50cnkoamViLCAmYy0+ZnJlZV9saXN0LCBsaXN0KSB7CisJCW5yX2NvdW50ZWQrKzsKKwkJZnJlZSArPSBqZWItPmZyZWVfc2l6ZTsKKwkJZGlydHkgKz0gamViLT5kaXJ0eV9zaXplOworCQl1c2VkICs9IGplYi0+dXNlZF9zaXplOworCQl3YXN0ZWQgKz0gamViLT53YXN0ZWRfc2l6ZTsKKwkJdW5jaGVja2VkICs9IGplYi0+dW5jaGVja2VkX3NpemU7CisJfQorCWxpc3RfZm9yX2VhY2hfZW50cnkoamViLCAmYy0+YmFkX3VzZWRfbGlzdCwgbGlzdCkgeworCQlucl9jb3VudGVkKys7CisJCWZyZWUgKz0gamViLT5mcmVlX3NpemU7CisJCWRpcnR5ICs9IGplYi0+ZGlydHlfc2l6ZTsKKwkJdXNlZCArPSBqZWItPnVzZWRfc2l6ZTsKKwkJd2FzdGVkICs9IGplYi0+d2FzdGVkX3NpemU7CisJCXVuY2hlY2tlZCArPSBqZWItPnVuY2hlY2tlZF9zaXplOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoamViLCAmYy0+ZXJhc2luZ19saXN0LCBsaXN0KSB7CisJCW5yX2NvdW50ZWQrKzsKKwkJZXJhc2luZyArPSBjLT5zZWN0b3Jfc2l6ZTsKKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeShqZWIsICZjLT5lcmFzZV9jaGVja2luZ19saXN0LCBsaXN0KSB7CisJCW5yX2NvdW50ZWQrKzsKKwkJZXJhc2luZyArPSBjLT5zZWN0b3Jfc2l6ZTsKKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeShqZWIsICZjLT5lcmFzZV9jb21wbGV0ZV9saXN0LCBsaXN0KSB7CisJCW5yX2NvdW50ZWQrKzsKKwkJZXJhc2luZyArPSBjLT5zZWN0b3Jfc2l6ZTsKKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeShqZWIsICZjLT5iYWRfbGlzdCwgbGlzdCkgeworCQlucl9jb3VudGVkKys7CisJCWJhZCArPSBjLT5zZWN0b3Jfc2l6ZTsKKwl9CisKKyNkZWZpbmUgY2hlY2soc3opIFwKKwlpZiAoc3ogIT0gYy0+c3ojI19zaXplKSB7CQkJXAorCQlwcmludGsoS0VSTl9XQVJOSU5HICNzeiAiX3NpemUgbWlzbWF0Y2ggY291bnRlZCAweCV4LCBjLT4iICNzeiAiX3NpemUgMHgleFxuIiwgXAorCQkgICAgICAgc3osIGMtPnN6IyNfc2l6ZSk7CQlcCisJCWR1bXAgPSAxOwkJCQlcCisJfQorCWNoZWNrKGZyZWUpOworCWNoZWNrKGRpcnR5KTsKKwljaGVjayh1c2VkKTsKKwljaGVjayh3YXN0ZWQpOworCWNoZWNrKHVuY2hlY2tlZCk7CisJY2hlY2soYmFkKTsKKwljaGVjayhlcmFzaW5nKTsKKyN1bmRlZiBjaGVjaworCisJaWYgKG5yX2NvdW50ZWQgIT0gYy0+bnJfYmxvY2tzKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIGNvdW50ZWQgb25seSAweCV4IGJsb2NrcyBvZiAweCV4LiBXaGVyZSBhcmUgdGhlIG90aGVycz9cbiIsCisJCSAgICAgICBfX2Z1bmNfXywgbnJfY291bnRlZCwgYy0+bnJfYmxvY2tzKTsKKwkJZHVtcCA9IDE7CisJfQorCisJaWYgKGR1bXApIHsKKwkJX19qZmZzMl9kYmdfZHVtcF9ibG9ja19saXN0c19ub2xvY2soYyk7CisJCUJVRygpOworCX0KK30KKwogLyoKICAqIENoZWNrIHRoZSBzcGFjZSBhY2NvdW50aW5nIGFuZCBub2RlX3JlZiBsaXN0IGNvcnJlY3RuZXNzIGZvciB0aGUgSkZGUzIgZXJhc2FibGUgYmxvY2sgJ2plYicuCiAgKi8KQEAgLTIyOSw2ICszNjIsOSBAQAogCX0KICNlbmRpZgogCisJaWYgKCEoYy0+ZmxhZ3MgJiAoSkZGUzJfU0JfRkxBR19CVUlMRElOR3xKRkZTMl9TQl9GTEFHX1NDQU5OSU5HKSkpCisJCV9famZmczJfZGJnX3N1cGVyYmxvY2tfY291bnRzKGMpOworCiAJcmV0dXJuOwogCiBlcnJvcjoKQEAgLTI2OCw3ICs0MDQsMTAgQEAKIAogCXByaW50ayhKRkZTMl9EQkcpOwogCWZvciAocmVmID0gamViLT5maXJzdF9ub2RlOyA7IHJlZiA9IHJlZl9uZXh0KHJlZikpIHsKLQkJcHJpbnRrKCIlIzA4eCglI3gpIiwgcmVmX29mZnNldChyZWYpLCByZWYtPl9fdG90bGVuKTsKKwkJcHJpbnRrKCIlIzA4eCIsIHJlZl9vZmZzZXQocmVmKSk7CisjaWZkZWYgVEVTVF9UT1RMRU4KKwkJcHJpbnRrKCIoJXgpIiwgcmVmLT5fX3RvdGxlbik7CisjZW5kaWYKIAkJaWYgKHJlZl9uZXh0KHJlZikpCiAJCQlwcmludGsoIi0+Iik7CiAJCWVsc2UKQEAgLTQ0Nyw2ICs1ODYsMjEgQEAKIAkJCX0KIAkJfQogCX0KKwlpZiAobGlzdF9lbXB0eSgmYy0+ZXJhc2VfY2hlY2tpbmdfbGlzdCkpIHsKKwkJcHJpbnRrKEpGRlMyX0RCRyAiZXJhc2VfY2hlY2tpbmdfbGlzdDogZW1wdHlcbiIpOworCX0gZWxzZSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnRoaXM7CisKKwkJbGlzdF9mb3JfZWFjaCh0aGlzLCAmYy0+ZXJhc2VfY2hlY2tpbmdfbGlzdCkgeworCQkJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiA9IGxpc3RfZW50cnkodGhpcywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2ssIGxpc3QpOworCisJCQlpZiAoIShqZWItPnVzZWRfc2l6ZSA9PSAwICYmIGplYi0+ZGlydHlfc2l6ZSA9PSAwICYmIGplYi0+d2FzdGVkX3NpemUgPT0gMCkpIHsKKwkJCQlwcmludGsoSkZGUzJfREJHICJlcmFzZV9jaGVja2luZ19saXN0OiAlIzA4eCAodXNlZCAlIzA4eCwgZGlydHkgJSMwOHgsIHdhc3RlZCAlIzA4eCwgdW5jaGVja2VkICUjMDh4LCBmcmVlICUjMDh4KVxuIiwKKwkJCQkJamViLT5vZmZzZXQsIGplYi0+dXNlZF9zaXplLCBqZWItPmRpcnR5X3NpemUsIGplYi0+d2FzdGVkX3NpemUsCisJCQkJCWplYi0+dW5jaGVja2VkX3NpemUsIGplYi0+ZnJlZV9zaXplKTsKKwkJCX0KKwkJfQorCX0KIAogCWlmIChsaXN0X2VtcHR5KCZjLT5lcmFzZV9wZW5kaW5nX2xpc3QpKSB7CiAJCXByaW50ayhKRkZTMl9EQkcgImVyYXNlX3BlbmRpbmdfbGlzdDogZW1wdHlcbiIpOwpAQCAtNTMyLDkgKzY4Niw5IEBACiB2b2lkCiBfX2pmZnMyX2RiZ19kdW1wX2ZyYWd0cmVlKHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmKQogewotCWRvd24oJmYtPnNlbSk7CisJbXV0ZXhfbG9jaygmZi0+c2VtKTsKIAlqZmZzMl9kYmdfZHVtcF9mcmFndHJlZV9ub2xvY2soZik7Ci0JdXAoJmYtPnNlbSk7CisJbXV0ZXhfdW5sb2NrKCZmLT5zZW0pOwogfQogCiB2b2lkCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9kZWJ1Zy5oIGIvZnMvamZmczIvZGVidWcuaAppbmRleCA0MTMwYWRhLi45NjQ1Mjc1IDEwMDY0NAotLS0gYS9mcy9qZmZzMi9kZWJ1Zy5oCisrKyBiL2ZzL2pmZnMyL2RlYnVnLmgKQEAgLTM4LDYgKzM4LDcgQEAKIAogI2lmIENPTkZJR19KRkZTMl9GU19ERUJVRyA+IDEKICNkZWZpbmUgSkZGUzJfREJHX0ZSQUdUUkVFMl9NRVNTQUdFUworI2RlZmluZSBKRkZTMl9EQkdfUkVBRElOT0RFMl9NRVNTQUdFUwogI2RlZmluZSBKRkZTMl9EQkdfTUVNQUxMT0NfTUVTU0FHRVMKICNlbmRpZgogCkBAIC0xMTUsNiArMTE2LDExIEBACiAjZWxzZQogI2RlZmluZSBkYmdfcmVhZGlub2RlKGZtdCwgLi4uKQogI2VuZGlmCisjaWZkZWYgSkZGUzJfREJHX1JFQURJTk9ERTJfTUVTU0FHRVMKKyNkZWZpbmUgZGJnX3JlYWRpbm9kZTIoZm10LCAuLi4pCUpGRlMyX0RFQlVHKGZtdCwgIyNfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIGRiZ19yZWFkaW5vZGUyKGZtdCwgLi4uKQorI2VuZGlmCiAKIC8qIEZyYWd0cmVlIGJ1aWxkIGRlYnVnZ2luZyBtZXNzYWdlcyAqLwogI2lmZGVmIEpGRlMyX0RCR19GUkFHVFJFRV9NRVNTQUdFUwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvZGlyLmMgYi9mcy9qZmZzMi9kaXIuYwppbmRleCBmOTQ4ZjdlLi5jNjNlN2E5IDEwMDY0NAotLS0gYS9mcy9qZmZzMi9kaXIuYworKysgYi9mcy9qZmZzMi9kaXIuYwpAQCAtODYsNyArODYsNyBAQAogCWRpcl9mID0gSkZGUzJfSU5PREVfSU5GTyhkaXJfaSk7CiAJYyA9IEpGRlMyX1NCX0lORk8oZGlyX2ktPmlfc2IpOwogCi0JZG93bigmZGlyX2YtPnNlbSk7CisJbXV0ZXhfbG9jaygmZGlyX2YtPnNlbSk7CiAKIAkvKiBOQjogVGhlIDIuMiBiYWNrcG9ydCB3aWxsIG5lZWQgdG8gZXhwbGljaXRseSBjaGVjayBmb3IgJy4nIGFuZCAnLi4nIGhlcmUgKi8KIAlmb3IgKGZkX2xpc3QgPSBkaXJfZi0+ZGVudHM7IGZkX2xpc3QgJiYgZmRfbGlzdC0+bmhhc2ggPD0gdGFyZ2V0LT5kX25hbWUuaGFzaDsgZmRfbGlzdCA9IGZkX2xpc3QtPm5leHQpIHsKQEAgLTk5LDcgKzk5LDcgQEAKIAl9CiAJaWYgKGZkKQogCQlpbm8gPSBmZC0+aW5vOwotCXVwKCZkaXJfZi0+c2VtKTsKKwltdXRleF91bmxvY2soJmRpcl9mLT5zZW0pOwogCWlmIChpbm8pIHsKIAkJaW5vZGUgPSBqZmZzMl9pZ2V0KGRpcl9pLT5pX3NiLCBpbm8pOwogCQlpZiAoSVNfRVJSKGlub2RlKSkgewpAQCAtMTQ2LDcgKzE0Niw3IEBACiAJfQogCiAJY3Vyb2ZzPTE7Ci0JZG93bigmZi0+c2VtKTsKKwltdXRleF9sb2NrKCZmLT5zZW0pOwogCWZvciAoZmQgPSBmLT5kZW50czsgZmQ7IGZkID0gZmQtPm5leHQpIHsKIAogCQljdXJvZnMrKzsKQEAgLTE2Niw3ICsxNjYsNyBAQAogCQkJYnJlYWs7CiAJCW9mZnNldCsrOwogCX0KLQl1cCgmZi0+c2VtKTsKKwltdXRleF91bmxvY2soJmYtPnNlbSk7CiAgb3V0OgogCWZpbHAtPmZfcG9zID0gb2Zmc2V0OwogCXJldHVybiAwOwpAQCAtMjc1LDkgKzI3NSw5IEBACiAJcmV0ID0gamZmczJfZG9fbGluayhjLCBkaXJfZiwgZi0+aW5vY2FjaGUtPmlubywgdHlwZSwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLCBub3cpOwogCiAJaWYgKCFyZXQpIHsKLQkJZG93bigmZi0+c2VtKTsKKwkJbXV0ZXhfbG9jaygmZi0+c2VtKTsKIAkJb2xkX2RlbnRyeS0+ZF9pbm9kZS0+aV9ubGluayA9ICsrZi0+aW5vY2FjaGUtPm5saW5rOwotCQl1cCgmZi0+c2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZmLT5zZW0pOwogCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgb2xkX2RlbnRyeS0+ZF9pbm9kZSk7CiAJCWRpcl9pLT5pX210aW1lID0gZGlyX2ktPmlfY3RpbWUgPSBJVElNRShub3cpOwogCQlhdG9taWNfaW5jKCZvbGRfZGVudHJ5LT5kX2lub2RlLT5pX2NvdW50KTsKQEAgLTM1MSw3ICszNTEsNyBAQAogCiAJaWYgKElTX0VSUihmbikpIHsKIAkJLyogRWVlay4gV2F2ZSBieWUgYnllICovCi0JCXVwKCZmLT5zZW0pOworCQltdXRleF91bmxvY2soJmYtPnNlbSk7CiAJCWpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKGMpOwogCQlqZmZzMl9jbGVhcl9pbm9kZShpbm9kZSk7CiAJCXJldHVybiBQVFJfRVJSKGZuKTsKQEAgLTM2MSw3ICszNjEsNyBAQAogCWYtPnRhcmdldCA9IGttYWxsb2ModGFyZ2V0bGVuICsgMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmLT50YXJnZXQpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgYWxsb2NhdGUgJWQgYnl0ZXMgb2YgbWVtb3J5XG4iLCB0YXJnZXRsZW4gKyAxKTsKLQkJdXAoJmYtPnNlbSk7CisJCW11dGV4X3VubG9jaygmZi0+c2VtKTsKIAkJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CiAJCWpmZnMyX2NsZWFyX2lub2RlKGlub2RlKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0zNzQsNyArMzc0LDcgQEAKIAkgICBvYnNvbGV0ZWQgYnkgdGhlIGZpcnN0IGRhdGEgd3JpdGUKIAkqLwogCWYtPm1ldGFkYXRhID0gZm47Ci0JdXAoJmYtPnNlbSk7CisJbXV0ZXhfdW5sb2NrKCZmLT5zZW0pOwogCiAJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CiAKQEAgLTQwNiw3ICs0MDYsNyBAQAogCX0KIAogCWRpcl9mID0gSkZGUzJfSU5PREVfSU5GTyhkaXJfaSk7Ci0JZG93bigmZGlyX2YtPnNlbSk7CisJbXV0ZXhfbG9jaygmZGlyX2YtPnNlbSk7CiAKIAlyZC0+bWFnaWMgPSBjcHVfdG9famUxNihKRkZTMl9NQUdJQ19CSVRNQVNLKTsKIAlyZC0+bm9kZXR5cGUgPSBjcHVfdG9famUxNihKRkZTMl9OT0RFVFlQRV9ESVJFTlQpOwpAQCAtNDI5LDcgKzQyOSw3IEBACiAJCSAgIGFzIGlmIGl0IHdlcmUgdGhlIGZpbmFsIHVubGluaygpICovCiAJCWpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKGMpOwogCQlqZmZzMl9mcmVlX3Jhd19kaXJlbnQocmQpOwotCQl1cCgmZGlyX2YtPnNlbSk7CisJCW11dGV4X3VubG9jaygmZGlyX2YtPnNlbSk7CiAJCWpmZnMyX2NsZWFyX2lub2RlKGlub2RlKTsKIAkJcmV0dXJuIFBUUl9FUlIoZmQpOwogCX0KQEAgLTQ0Miw3ICs0NDIsNyBAQAogCSAgIG9uZSBpZiBuZWNlc3NhcnkuICovCiAJamZmczJfYWRkX2ZkX3RvX2xpc3QoYywgZmQsICZkaXJfZi0+ZGVudHMpOwogCi0JdXAoJmRpcl9mLT5zZW0pOworCW11dGV4X3VubG9jaygmZGlyX2YtPnNlbSk7CiAJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CiAKIAlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwpAQCAtNTA3LDcgKzUwNyw3IEBACiAKIAlpZiAoSVNfRVJSKGZuKSkgewogCQkvKiBFZWVrLiBXYXZlIGJ5ZSBieWUgKi8KLQkJdXAoJmYtPnNlbSk7CisJCW11dGV4X3VubG9jaygmZi0+c2VtKTsKIAkJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CiAJCWpmZnMyX2NsZWFyX2lub2RlKGlub2RlKTsKIAkJcmV0dXJuIFBUUl9FUlIoZm4pOwpAQCAtNTE2LDcgKzUxNiw3IEBACiAJICAgb2Jzb2xldGVkIGJ5IHRoZSBmaXJzdCBkYXRhIHdyaXRlCiAJKi8KIAlmLT5tZXRhZGF0YSA9IGZuOwotCXVwKCZmLT5zZW0pOworCW11dGV4X3VubG9jaygmZi0+c2VtKTsKIAogCWpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKGMpOwogCkBAIC01NDgsNyArNTQ4LDcgQEAKIAl9CiAKIAlkaXJfZiA9IEpGRlMyX0lOT0RFX0lORk8oZGlyX2kpOwotCWRvd24oJmRpcl9mLT5zZW0pOworCW11dGV4X2xvY2soJmRpcl9mLT5zZW0pOwogCiAJcmQtPm1hZ2ljID0gY3B1X3RvX2plMTYoSkZGUzJfTUFHSUNfQklUTUFTSyk7CiAJcmQtPm5vZGV0eXBlID0gY3B1X3RvX2plMTYoSkZGUzJfTk9ERVRZUEVfRElSRU5UKTsKQEAgLTU3MSw3ICs1NzEsNyBAQAogCQkgICBhcyBpZiBpdCB3ZXJlIHRoZSBmaW5hbCB1bmxpbmsoKSAqLwogCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKIAkJamZmczJfZnJlZV9yYXdfZGlyZW50KHJkKTsKLQkJdXAoJmRpcl9mLT5zZW0pOworCQltdXRleF91bmxvY2soJmRpcl9mLT5zZW0pOwogCQlqZmZzMl9jbGVhcl9pbm9kZShpbm9kZSk7CiAJCXJldHVybiBQVFJfRVJSKGZkKTsKIAl9CkBAIC01ODUsNyArNTg1LDcgQEAKIAkgICBvbmUgaWYgbmVjZXNzYXJ5LiAqLwogCWpmZnMyX2FkZF9mZF90b19saXN0KGMsIGZkLCAmZGlyX2YtPmRlbnRzKTsKIAotCXVwKCZkaXJfZi0+c2VtKTsKKwltdXRleF91bmxvY2soJmRpcl9mLT5zZW0pOwogCWpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKGMpOwogCiAJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKQEAgLTY3Myw3ICs2NzMsNyBAQAogCiAJaWYgKElTX0VSUihmbikpIHsKIAkJLyogRWVlay4gV2F2ZSBieWUgYnllICovCi0JCXVwKCZmLT5zZW0pOworCQltdXRleF91bmxvY2soJmYtPnNlbSk7CiAJCWpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKGMpOwogCQlqZmZzMl9jbGVhcl9pbm9kZShpbm9kZSk7CiAJCXJldHVybiBQVFJfRVJSKGZuKTsKQEAgLTY4Miw3ICs2ODIsNyBAQAogCSAgIG9ic29sZXRlZCBieSB0aGUgZmlyc3QgZGF0YSB3cml0ZQogCSovCiAJZi0+bWV0YWRhdGEgPSBmbjsKLQl1cCgmZi0+c2VtKTsKKwltdXRleF91bmxvY2soJmYtPnNlbSk7CiAKIAlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKIApAQCAtNzE0LDcgKzcxNCw3IEBACiAJfQogCiAJZGlyX2YgPSBKRkZTMl9JTk9ERV9JTkZPKGRpcl9pKTsKLQlkb3duKCZkaXJfZi0+c2VtKTsKKwltdXRleF9sb2NrKCZkaXJfZi0+c2VtKTsKIAogCXJkLT5tYWdpYyA9IGNwdV90b19qZTE2KEpGRlMyX01BR0lDX0JJVE1BU0spOwogCXJkLT5ub2RldHlwZSA9IGNwdV90b19qZTE2KEpGRlMyX05PREVUWVBFX0RJUkVOVCk7CkBAIC03NDAsNyArNzQwLDcgQEAKIAkJICAgYXMgaWYgaXQgd2VyZSB0aGUgZmluYWwgdW5saW5rKCkgKi8KIAkJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CiAJCWpmZnMyX2ZyZWVfcmF3X2RpcmVudChyZCk7Ci0JCXVwKCZkaXJfZi0+c2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZkaXJfZi0+c2VtKTsKIAkJamZmczJfY2xlYXJfaW5vZGUoaW5vZGUpOwogCQlyZXR1cm4gUFRSX0VSUihmZCk7CiAJfQpAQCAtNzUzLDcgKzc1Myw3IEBACiAJICAgb25lIGlmIG5lY2Vzc2FyeS4gKi8KIAlqZmZzMl9hZGRfZmRfdG9fbGlzdChjLCBmZCwgJmRpcl9mLT5kZW50cyk7CiAKLQl1cCgmZGlyX2YtPnNlbSk7CisJbXV0ZXhfdW5sb2NrKCZkaXJfZi0+c2VtKTsKIAlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKIAogCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CkBAIC03ODAsMTQgKzc4MCwxNCBAQAogCQlpZiAoU19JU0RJUihuZXdfZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKSB7CiAJCQlzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmZkOwogCi0JCQlkb3duKCZ2aWN0aW1fZi0+c2VtKTsKKwkJCW11dGV4X2xvY2soJnZpY3RpbV9mLT5zZW0pOwogCQkJZm9yIChmZCA9IHZpY3RpbV9mLT5kZW50czsgZmQ7IGZkID0gZmQtPm5leHQpIHsKIAkJCQlpZiAoZmQtPmlubykgewotCQkJCQl1cCgmdmljdGltX2YtPnNlbSk7CisJCQkJCW11dGV4X3VubG9jaygmdmljdGltX2YtPnNlbSk7CiAJCQkJCXJldHVybiAtRU5PVEVNUFRZOwogCQkJCX0KIAkJCX0KLQkJCXVwKCZ2aWN0aW1fZi0+c2VtKTsKKwkJCW11dGV4X3VubG9jaygmdmljdGltX2YtPnNlbSk7CiAJCX0KIAl9CiAKQEAgLTgxNiw5ICs4MTYsOSBAQAogCQkvKiBEb24ndCBvb3BzIGlmIHRoZSB2aWN0aW0gd2FzIGEgZGlyZW50IHBvaW50aW5nIHRvIGFuCiAJCSAgIGlub2RlIHdoaWNoIGRpZG4ndCBleGlzdC4gKi8KIAkJaWYgKHZpY3RpbV9mLT5pbm9jYWNoZSkgewotCQkJZG93bigmdmljdGltX2YtPnNlbSk7CisJCQltdXRleF9sb2NrKCZ2aWN0aW1fZi0+c2VtKTsKIAkJCXZpY3RpbV9mLT5pbm9jYWNoZS0+bmxpbmstLTsKLQkJCXVwKCZ2aWN0aW1fZi0+c2VtKTsKKwkJCW11dGV4X3VubG9jaygmdmljdGltX2YtPnNlbSk7CiAJCX0KIAl9CiAKQEAgLTgzNiwxMSArODM2LDExIEBACiAJaWYgKHJldCkgewogCQkvKiBPaCBzaGl0LiBXZSByZWFsbHkgb3VnaHQgdG8gbWFrZSBhIHNpbmdsZSBub2RlIHdoaWNoIGNhbiBkbyBib3RoIGF0b21pY2FsbHkgKi8KIAkJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYgPSBKRkZTMl9JTk9ERV9JTkZPKG9sZF9kZW50cnktPmRfaW5vZGUpOwotCQlkb3duKCZmLT5zZW0pOworCQltdXRleF9sb2NrKCZmLT5zZW0pOwogCQlpbmNfbmxpbmsob2xkX2RlbnRyeS0+ZF9pbm9kZSk7CiAJCWlmIChmLT5pbm9jYWNoZSkKIAkJCWYtPmlub2NhY2hlLT5ubGluaysrOwotCQl1cCgmZi0+c2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZmLT5zZW0pOwogCiAJCXByaW50ayhLRVJOX05PVElDRSAiamZmczJfcmVuYW1lKCk6IExpbmsgc3VjY2VlZGVkLCB1bmxpbmsgZmFpbGVkIChlcnIgJWQpLiBZb3Ugbm93IGhhdmUgYSBoYXJkIGxpbmtcbiIsIHJldCk7CiAJCS8qIE1pZ2h0IGFzIHdlbGwgbGV0IHRoZSBWRlMga25vdyAqLwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvZXJhc2UuYyBiL2ZzL2pmZnMyL2VyYXNlLmMKaW5kZXggYTFkYjkxOC4uMjVhNjQwZSAxMDA2NDQKLS0tIGEvZnMvamZmczIvZXJhc2UuYworKysgYi9mcy9qZmZzMi9lcmFzZS5jCkBAIC01MCwxNCArNTAsMTQgQEAKIAlpbnN0ciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBlcmFzZV9pbmZvKSArIHNpemVvZihzdHJ1Y3QgZXJhc2VfcHJpdl9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluc3RyKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImttYWxsb2MgZm9yIHN0cnVjdCBlcmFzZV9pbmZvIGluIGpmZnMyX2VyYXNlX2Jsb2NrIGZhaWxlZC4gUmVmaWxpbmcgYmxvY2sgZm9yIGxhdGVyXG4iKTsKLQkJZG93bigmYy0+ZXJhc2VfZnJlZV9zZW0pOworCQltdXRleF9sb2NrKCZjLT5lcmFzZV9mcmVlX3NlbSk7CiAJCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKIAkJbGlzdF9tb3ZlKCZqZWItPmxpc3QsICZjLT5lcmFzZV9wZW5kaW5nX2xpc3QpOwogCQljLT5lcmFzaW5nX3NpemUgLT0gYy0+c2VjdG9yX3NpemU7CiAJCWMtPmRpcnR5X3NpemUgKz0gYy0+c2VjdG9yX3NpemU7CiAJCWplYi0+ZGlydHlfc2l6ZSA9IGMtPnNlY3Rvcl9zaXplOwogCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKLQkJdXAoJmMtPmVyYXNlX2ZyZWVfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZjLT5lcmFzZV9mcmVlX3NlbSk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTg0LDE0ICs4NCwxNCBAQAogCWlmIChyZXQgPT0gLUVOT01FTSB8fCByZXQgPT0gLUVBR0FJTikgewogCQkvKiBFcmFzZSBmYWlsZWQgaW1tZWRpYXRlbHkuIFJlZmlsZSBpdCBvbiB0aGUgbGlzdCAqLwogCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRXJhc2UgYXQgMHglMDh4IGZhaWxlZDogJWQuIFJlZmlsaW5nIG9uIGVyYXNlX3BlbmRpbmdfbGlzdFxuIiwgamViLT5vZmZzZXQsIHJldCkpOwotCQlkb3duKCZjLT5lcmFzZV9mcmVlX3NlbSk7CisJCW11dGV4X2xvY2soJmMtPmVyYXNlX2ZyZWVfc2VtKTsKIAkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwogCQlsaXN0X21vdmUoJmplYi0+bGlzdCwgJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCk7CiAJCWMtPmVyYXNpbmdfc2l6ZSAtPSBjLT5zZWN0b3Jfc2l6ZTsKIAkJYy0+ZGlydHlfc2l6ZSArPSBjLT5zZWN0b3Jfc2l6ZTsKIAkJamViLT5kaXJ0eV9zaXplID0gYy0+c2VjdG9yX3NpemU7CiAJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwotCQl1cCgmYy0+ZXJhc2VfZnJlZV9zZW0pOworCQltdXRleF91bmxvY2soJmMtPmVyYXNlX2ZyZWVfc2VtKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTA3LDcgKzEwNyw3IEBACiB7CiAJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYjsKIAotCWRvd24oJmMtPmVyYXNlX2ZyZWVfc2VtKTsKKwltdXRleF9sb2NrKCZjLT5lcmFzZV9mcmVlX3NlbSk7CiAKIAlzcGluX2xvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CiAKQEAgLTExNiw5ICsxMTYsOSBAQAogCiAJCWlmICghbGlzdF9lbXB0eSgmYy0+ZXJhc2VfY29tcGxldGVfbGlzdCkpIHsKIAkJCWplYiA9IGxpc3RfZW50cnkoYy0+ZXJhc2VfY29tcGxldGVfbGlzdC5uZXh0LCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jaywgbGlzdCk7Ci0JCQlsaXN0X2RlbCgmamViLT5saXN0KTsKKwkJCWxpc3RfbW92ZSgmamViLT5saXN0LCAmYy0+ZXJhc2VfY2hlY2tpbmdfbGlzdCk7CiAJCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKLQkJCXVwKCZjLT5lcmFzZV9mcmVlX3NlbSk7CisJCQltdXRleF91bmxvY2soJmMtPmVyYXNlX2ZyZWVfc2VtKTsKIAkJCWpmZnMyX21hcmtfZXJhc2VkX2Jsb2NrKGMsIGplYik7CiAKIAkJCWlmICghLS1jb3VudCkgewpAQCAtMTM5LDcgKzEzOSw3IEBACiAJCQlqZmZzMl9mcmVlX2plYl9ub2RlX3JlZnMoYywgamViKTsKIAkJCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT5lcmFzaW5nX2xpc3QpOwogCQkJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7Ci0JCQl1cCgmYy0+ZXJhc2VfZnJlZV9zZW0pOworCQkJbXV0ZXhfdW5sb2NrKCZjLT5lcmFzZV9mcmVlX3NlbSk7CiAKIAkJCWpmZnMyX2VyYXNlX2Jsb2NrKGMsIGplYik7CiAKQEAgLTE0OSwxMiArMTQ5LDEyIEBACiAKIAkJLyogQmUgbmljZSAqLwogCQl5aWVsZCgpOwotCQlkb3duKCZjLT5lcmFzZV9mcmVlX3NlbSk7CisJCW11dGV4X2xvY2soJmMtPmVyYXNlX2ZyZWVfc2VtKTsKIAkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwogCX0KIAogCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwotCXVwKCZjLT5lcmFzZV9mcmVlX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZjLT5lcmFzZV9mcmVlX3NlbSk7CiAgZG9uZToKIAlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZXJhc2VfcGVuZGluZ19ibG9ja3MgY29tcGxldGVkXG4iKSk7CiB9CkBAIC0xNjIsMTEgKzE2MiwxMSBAQAogc3RhdGljIHZvaWQgamZmczJfZXJhc2Vfc3VjY2VlZGVkKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViKQogewogCUQxKHByaW50ayhLRVJOX0RFQlVHICJFcmFzZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGF0IDB4JTA4eFxuIiwgamViLT5vZmZzZXQpKTsKLQlkb3duKCZjLT5lcmFzZV9mcmVlX3NlbSk7CisJbXV0ZXhfbG9jaygmYy0+ZXJhc2VfZnJlZV9zZW0pOwogCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKIAlsaXN0X21vdmVfdGFpbCgmamViLT5saXN0LCAmYy0+ZXJhc2VfY29tcGxldGVfbGlzdCk7CiAJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7Ci0JdXAoJmMtPmVyYXNlX2ZyZWVfc2VtKTsKKwltdXRleF91bmxvY2soJmMtPmVyYXNlX2ZyZWVfc2VtKTsKIAkvKiBFbnN1cmUgdGhhdCBrdXBkYXRlZCBjYWxscyB1cyBhZ2FpbiB0byBtYXJrIHRoZW0gY2xlYW4gKi8KIAlqZmZzMl9lcmFzZV9wZW5kaW5nX3RyaWdnZXIoYyk7CiB9CkBAIC0xODAsMjYgKzE4MCwyNiBAQAogCQkgICBmYWlsZWQgdG9vIG1hbnkgdGltZXMuICovCiAJCWlmICghamZmczJfd3JpdGVfbmFuZF9iYWRibG9jayhjLCBqZWIsIGJhZF9vZmZzZXQpKSB7CiAJCQkvKiBXZSdkIGxpa2UgdG8gZ2l2ZSB0aGlzIGJsb2NrIGFub3RoZXIgdHJ5LiAqLwotCQkJZG93bigmYy0+ZXJhc2VfZnJlZV9zZW0pOworCQkJbXV0ZXhfbG9jaygmYy0+ZXJhc2VfZnJlZV9zZW0pOwogCQkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwogCQkJbGlzdF9tb3ZlKCZqZWItPmxpc3QsICZjLT5lcmFzZV9wZW5kaW5nX2xpc3QpOwogCQkJYy0+ZXJhc2luZ19zaXplIC09IGMtPnNlY3Rvcl9zaXplOwogCQkJYy0+ZGlydHlfc2l6ZSArPSBjLT5zZWN0b3Jfc2l6ZTsKIAkJCWplYi0+ZGlydHlfc2l6ZSA9IGMtPnNlY3Rvcl9zaXplOwogCQkJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7Ci0JCQl1cCgmYy0+ZXJhc2VfZnJlZV9zZW0pOworCQkJbXV0ZXhfdW5sb2NrKCZjLT5lcmFzZV9mcmVlX3NlbSk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CiAKLQlkb3duKCZjLT5lcmFzZV9mcmVlX3NlbSk7CisJbXV0ZXhfbG9jaygmYy0+ZXJhc2VfZnJlZV9zZW0pOwogCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKIAljLT5lcmFzaW5nX3NpemUgLT0gYy0+c2VjdG9yX3NpemU7CiAJYy0+YmFkX3NpemUgKz0gYy0+c2VjdG9yX3NpemU7CiAJbGlzdF9tb3ZlKCZqZWItPmxpc3QsICZjLT5iYWRfbGlzdCk7CiAJYy0+bnJfZXJhc2luZ19ibG9ja3MtLTsKIAlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKLQl1cCgmYy0+ZXJhc2VfZnJlZV9zZW0pOworCW11dGV4X3VubG9jaygmYy0+ZXJhc2VfZnJlZV9zZW0pOwogCXdha2VfdXAoJmMtPmVyYXNlX3dhaXQpOwogfQogCkBAIC0zNTAsOSArMzUwLDExIEBACiAJCQkgICBicmVhazsKIAkJfSB3aGlsZSgtLXJldGxlbik7CiAJCWMtPm10ZC0+dW5wb2ludChjLT5tdGQsIGVidWYsIGplYi0+b2Zmc2V0LCBjLT5zZWN0b3Jfc2l6ZSk7Ci0JCWlmIChyZXRsZW4pCisJCWlmIChyZXRsZW4pIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5ld2x5LWVyYXNlZCBibG9jayBjb250YWluZWQgd29yZCAweCVseCBhdCBvZmZzZXQgMHglMDh0eFxuIiwKIAkJCSAgICAgICAqd29yZGVidWYsIGplYi0+b2Zmc2V0ICsgYy0+c2VjdG9yX3NpemUtcmV0bGVuKnNpemVvZigqd29yZGVidWYpKTsKKwkJCXJldHVybiAtRUlPOworCQl9CiAJCXJldHVybiAwOwogCX0KICBkb19mbGFzaF9yZWFkOgpAQCAtMzczLDEwICszNzUsMTIgQEAKIAkJcmV0ID0gYy0+bXRkLT5yZWFkKGMtPm10ZCwgb2ZzLCByZWFkbGVuLCAmcmV0bGVuLCBlYnVmKTsKIAkJaWYgKHJldCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUmVhZCBvZiBuZXdseS1lcmFzZWQgYmxvY2sgYXQgMHglMDh4IGZhaWxlZDogJWQuIFB1dHRpbmcgb24gYmFkX2xpc3RcbiIsIG9mcywgcmV0KTsKKwkJCXJldCA9IC1FSU87CiAJCQlnb3RvIGZhaWw7CiAJCX0KIAkJaWYgKHJldGxlbiAhPSByZWFkbGVuKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTaG9ydCByZWFkIGZyb20gbmV3bHktZXJhc2VkIGJsb2NrIGF0IDB4JTA4eC4gV2FudGVkICVkLCBnb3QgJXpkXG4iLCBvZnMsIHJlYWRsZW4sIHJldGxlbik7CisJCQlyZXQgPSAtRUlPOwogCQkJZ290byBmYWlsOwogCQl9CiAJCWZvciAoaT0wOyBpPHJlYWRsZW47IGkgKz0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSB7CkBAIC0zODUsNiArMzg5LDcgQEAKIAkJCWlmICgqZGF0dW0gKyAxKSB7CiAJCQkJKmJhZF9vZmZzZXQgKz0gaTsKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJOZXdseS1lcmFzZWQgYmxvY2sgY29udGFpbmVkIHdvcmQgMHglbHggYXQgb2Zmc2V0IDB4JTA4eFxuIiwgKmRhdHVtLCAqYmFkX29mZnNldCk7CisJCQkJcmV0ID0gLUVJTzsKIAkJCQlnb3RvIGZhaWw7CiAJCQl9CiAJCX0KQEAgLTQxOSw5ICs0MjQsNiBAQAogCQkJaWYgKGpmZnMyX3dyaXRlX25hbmRfY2xlYW5tYXJrZXIoYywgamViKSkKIAkJCQlnb3RvIGZpbGViYWQ7CiAJCX0KLQotCQkvKiBFdmVyeXRoaW5nIGVsc2UgZ290IHplcm9lZCBiZWZvcmUgdGhlIGVyYXNlICovCi0JCWplYi0+ZnJlZV9zaXplID0gYy0+c2VjdG9yX3NpemU7CiAJfSBlbHNlIHsKIAogCQlzdHJ1Y3Qga3ZlYyB2ZWNzWzFdOwpAQCAtNDQ5LDQ4ICs0NTEsNTAgQEAKIAogCQkJZ290byBmaWxlYmFkOwogCQl9Ci0KLQkJLyogRXZlcnl0aGluZyBlbHNlIGdvdCB6ZXJvZWQgYmVmb3JlIHRoZSBlcmFzZSAqLwotCQlqZWItPmZyZWVfc2l6ZSA9IGMtPnNlY3Rvcl9zaXplOwotCQkvKiBGSVhNRSBTcGVjaWFsIGNhc2UgZm9yIGNsZWFubWFya2VyIGluIGVtcHR5IGJsb2NrICovCi0JCWpmZnMyX2xpbmtfbm9kZV9yZWYoYywgamViLCBqZWItPm9mZnNldCB8IFJFRl9OT1JNQUwsIGMtPmNsZWFubWFya2VyX3NpemUsIE5VTEwpOwogCX0KKwkvKiBFdmVyeXRoaW5nIGVsc2UgZ290IHplcm9lZCBiZWZvcmUgdGhlIGVyYXNlICovCisJamViLT5mcmVlX3NpemUgPSBjLT5zZWN0b3Jfc2l6ZTsKIAotCWRvd24oJmMtPmVyYXNlX2ZyZWVfc2VtKTsKKwltdXRleF9sb2NrKCZjLT5lcmFzZV9mcmVlX3NlbSk7CiAJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCiAJYy0+ZXJhc2luZ19zaXplIC09IGMtPnNlY3Rvcl9zaXplOwotCWMtPmZyZWVfc2l6ZSArPSBqZWItPmZyZWVfc2l6ZTsKLQljLT51c2VkX3NpemUgKz0gamViLT51c2VkX3NpemU7CisJYy0+ZnJlZV9zaXplICs9IGMtPnNlY3Rvcl9zaXplOwogCi0JamZmczJfZGJnX2FjY3Rfc2FuaXR5X2NoZWNrX25vbG9jayhjLGplYik7Ci0JamZmczJfZGJnX2FjY3RfcGFyYW5vaWFfY2hlY2tfbm9sb2NrKGMsIGplYik7CisJLyogQWNjb3VudCBmb3IgY2xlYW5tYXJrZXIgbm93LCBpZiBpdCdzIGluLWJhbmQgKi8KKwlpZiAoYy0+Y2xlYW5tYXJrZXJfc2l6ZSAmJiAhamZmczJfY2xlYW5tYXJrZXJfb29iKGMpKQorCQlqZmZzMl9saW5rX25vZGVfcmVmKGMsIGplYiwgamViLT5vZmZzZXQgfCBSRUZfTk9STUFMLCBjLT5jbGVhbm1hcmtlcl9zaXplLCBOVUxMKTsKIAotCWxpc3RfYWRkX3RhaWwoJmplYi0+bGlzdCwgJmMtPmZyZWVfbGlzdCk7CisJbGlzdF9tb3ZlX3RhaWwoJmplYi0+bGlzdCwgJmMtPmZyZWVfbGlzdCk7CiAJYy0+bnJfZXJhc2luZ19ibG9ja3MtLTsKIAljLT5ucl9mcmVlX2Jsb2NrcysrOworCisJamZmczJfZGJnX2FjY3Rfc2FuaXR5X2NoZWNrX25vbG9jayhjLCBqZWIpOworCWpmZnMyX2RiZ19hY2N0X3BhcmFub2lhX2NoZWNrX25vbG9jayhjLCBqZWIpOworCiAJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7Ci0JdXAoJmMtPmVyYXNlX2ZyZWVfc2VtKTsKKwltdXRleF91bmxvY2soJmMtPmVyYXNlX2ZyZWVfc2VtKTsKIAl3YWtlX3VwKCZjLT5lcmFzZV93YWl0KTsKIAlyZXR1cm47CiAKIGZpbGViYWQ6Ci0JZG93bigmYy0+ZXJhc2VfZnJlZV9zZW0pOworCW11dGV4X2xvY2soJmMtPmVyYXNlX2ZyZWVfc2VtKTsKIAlzcGluX2xvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CiAJLyogU3RpY2sgaXQgb24gYSBsaXN0IChhbnkgbGlzdCkgc28gZXJhc2VfZmFpbGVkIGNhbiB0YWtlIGl0CiAJICAgcmlnaHQgb2ZmIGFnYWluLiAgU2lsbHksIGJ1dCBzaG91bGRuJ3QgaGFwcGVuIG9mdGVuLiAqLwotCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT5lcmFzaW5nX2xpc3QpOworCWxpc3RfbW92ZSgmamViLT5saXN0LCAmYy0+ZXJhc2luZ19saXN0KTsKIAlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKLQl1cCgmYy0+ZXJhc2VfZnJlZV9zZW0pOworCW11dGV4X3VubG9jaygmYy0+ZXJhc2VfZnJlZV9zZW0pOwogCWpmZnMyX2VyYXNlX2ZhaWxlZChjLCBqZWIsIGJhZF9vZmZzZXQpOwogCXJldHVybjsKIAogcmVmaWxlOgogCS8qIFN0aWNrIGl0IGJhY2sgb24gdGhlIGxpc3QgZnJvbSB3aGVuY2UgaXQgY2FtZSBhbmQgY29tZSBiYWNrIGxhdGVyICovCiAJamZmczJfZXJhc2VfcGVuZGluZ190cmlnZ2VyKGMpOwotCWRvd24oJmMtPmVyYXNlX2ZyZWVfc2VtKTsKKwltdXRleF9sb2NrKCZjLT5lcmFzZV9mcmVlX3NlbSk7CiAJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwotCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT5lcmFzZV9jb21wbGV0ZV9saXN0KTsKKwlsaXN0X21vdmUoJmplYi0+bGlzdCwgJmMtPmVyYXNlX2NvbXBsZXRlX2xpc3QpOwogCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwotCXVwKCZjLT5lcmFzZV9mcmVlX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZjLT5lcmFzZV9mcmVlX3NlbSk7CiAJcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvZmlsZS5jIGIvZnMvamZmczIvZmlsZS5jCmluZGV4IGRjYzI3MzQuLjVlOTIwMzQgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2ZpbGUuYworKysgYi9mcy9qZmZzMi9maWxlLmMKQEAgLTExNSw5ICsxMTUsOSBAQAogCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmID0gSkZGUzJfSU5PREVfSU5GTyhwZy0+bWFwcGluZy0+aG9zdCk7CiAJaW50IHJldDsKIAotCWRvd24oJmYtPnNlbSk7CisJbXV0ZXhfbG9jaygmZi0+c2VtKTsKIAlyZXQgPSBqZmZzMl9kb19yZWFkcGFnZV91bmxvY2socGctPm1hcHBpbmctPmhvc3QsIHBnKTsKLQl1cCgmZi0+c2VtKTsKKwltdXRleF91bmxvY2soJmYtPnNlbSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTU0LDcgKzE1NCw3IEBACiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dF9wYWdlOwogCi0JCWRvd24oJmYtPnNlbSk7CisJCW11dGV4X2xvY2soJmYtPnNlbSk7CiAJCW1lbXNldCgmcmksIDAsIHNpemVvZihyaSkpOwogCiAJCXJpLm1hZ2ljID0gY3B1X3RvX2plMTYoSkZGUzJfTUFHSUNfQklUTUFTSyk7CkBAIC0xODEsNyArMTgxLDcgQEAKIAkJaWYgKElTX0VSUihmbikpIHsKIAkJCXJldCA9IFBUUl9FUlIoZm4pOwogCQkJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7Ci0JCQl1cCgmZi0+c2VtKTsKKwkJCW11dGV4X3VubG9jaygmZi0+c2VtKTsKIAkJCWdvdG8gb3V0X3BhZ2U7CiAJCX0KIAkJcmV0ID0gamZmczJfYWRkX2Z1bGxfZG5vZGVfdG9faW5vZGUoYywgZiwgZm4pOwpAQCAtMTk1LDEyICsxOTUsMTIgQEAKIAkJCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCBmbi0+cmF3KTsKIAkJCWpmZnMyX2ZyZWVfZnVsbF9kbm9kZShmbik7CiAJCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKLQkJCXVwKCZmLT5zZW0pOworCQkJbXV0ZXhfdW5sb2NrKCZmLT5zZW0pOwogCQkJZ290byBvdXRfcGFnZTsKIAkJfQogCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKIAkJaW5vZGUtPmlfc2l6ZSA9IHBhZ2VvZnM7Ci0JCXVwKCZmLT5zZW0pOworCQltdXRleF91bmxvY2soJmYtPnNlbSk7CiAJfQogCiAJLyoKQEAgLTIwOSw5ICsyMDksOSBAQAogCSAqIGNhc2Ugb2YgYSBzaG9ydC1jb3B5LgogCSAqLwogCWlmICghUGFnZVVwdG9kYXRlKHBnKSkgewotCQlkb3duKCZmLT5zZW0pOworCQltdXRleF9sb2NrKCZmLT5zZW0pOwogCQlyZXQgPSBqZmZzMl9kb19yZWFkcGFnZV9ub2xvY2soaW5vZGUsIHBnKTsKLQkJdXAoJmYtPnNlbSk7CisJCW11dGV4X3VubG9jaygmZi0+c2VtKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gb3V0X3BhZ2U7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvZnMuYyBiL2ZzL2pmZnMyL2ZzLmMKaW5kZXggZTI2ZWE3OC4uM2ViMWM4NCAxMDA2NDQKLS0tIGEvZnMvamZmczIvZnMuYworKysgYi9mcy9qZmZzMi9mcy5jCkBAIC0zNiw2ICszNiw3IEBACiAJdW5zaWduZWQgaW50IGl2YWxpZDsKIAl1aW50MzJfdCBhbGxvY2xlbjsKIAlpbnQgcmV0OworCWludCBhbGxvY190eXBlID0gQUxMT0NfTk9STUFMOwogCiAJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3NldGF0dHIoKTogaW5vICMlbHVcbiIsIGlub2RlLT5pX2lubykpOwogCkBAIC01MCwyMCArNTEsMjAgQEAKIAkJbWRhdGEgPSAoY2hhciAqKSZkZXY7CiAJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9zZXRhdHRyKCk6IFdyaXRpbmcgJWQgYnl0ZXMgb2Yga2Rldl90XG4iLCBtZGF0YWxlbikpOwogCX0gZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgewotCQlkb3duKCZmLT5zZW0pOworCQltdXRleF9sb2NrKCZmLT5zZW0pOwogCQltZGF0YWxlbiA9IGYtPm1ldGFkYXRhLT5zaXplOwogCQltZGF0YSA9IGttYWxsb2MoZi0+bWV0YWRhdGEtPnNpemUsIEdGUF9VU0VSKTsKIAkJaWYgKCFtZGF0YSkgewotCQkJdXAoJmYtPnNlbSk7CisJCQltdXRleF91bmxvY2soJmYtPnNlbSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQlyZXQgPSBqZmZzMl9yZWFkX2Rub2RlKGMsIGYsIGYtPm1ldGFkYXRhLCBtZGF0YSwgMCwgbWRhdGFsZW4pOwogCQlpZiAocmV0KSB7Ci0JCQl1cCgmZi0+c2VtKTsKKwkJCW11dGV4X3VubG9jaygmZi0+c2VtKTsKIAkJCWtmcmVlKG1kYXRhKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KLQkJdXAoJmYtPnNlbSk7CisJCW11dGV4X3VubG9jaygmZi0+c2VtKTsKIAkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3NldGF0dHIoKTogV3JpdGluZyAlZCBieXRlcyBvZiBzeW1saW5rIHRhcmdldFxuIiwgbWRhdGFsZW4pKTsKIAl9CiAKQEAgLTgyLDcgKzgzLDcgQEAKIAkJCSBrZnJlZShtZGF0YSk7CiAJCXJldHVybiByZXQ7CiAJfQotCWRvd24oJmYtPnNlbSk7CisJbXV0ZXhfbG9jaygmZi0+c2VtKTsKIAlpdmFsaWQgPSBpYXR0ci0+aWFfdmFsaWQ7CiAKIAlyaS0+bWFnaWMgPSBjcHVfdG9famUxNihKRkZTMl9NQUdJQ19CSVRNQVNLKTsKQEAgLTExNSw2ICsxMTYsMTAgQEAKIAkJcmktPmNvbXByID0gSkZGUzJfQ09NUFJfWkVSTzsKIAkJcmktPmRzaXplID0gY3B1X3RvX2plMzIoaWF0dHItPmlhX3NpemUgLSBpbm9kZS0+aV9zaXplKTsKIAkJcmktPm9mZnNldCA9IGNwdV90b19qZTMyKGlub2RlLT5pX3NpemUpOworCX0gZWxzZSBpZiAoaXZhbGlkICYgQVRUUl9TSVpFICYmICFpYXR0ci0+aWFfc2l6ZSkgeworCQkvKiBGb3IgdHJ1bmNhdGUtdG8temVybywgdHJlYXQgaXQgYXMgZGVsZXRpb24gYmVjYXVzZQorCQkgICBpdCdsbCBhbHdheXMgYmUgb2Jzb2xldGluZyBhbGwgcHJldmlvdXMgbm9kZXMgKi8KKwkJYWxsb2NfdHlwZSA9IEFMTE9DX0RFTEVUSU9OOwogCX0KIAlyaS0+bm9kZV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCByaSwgc2l6ZW9mKCpyaSktOCkpOwogCWlmIChtZGF0YWxlbikKQEAgLTEyMiwxNCArMTI3LDE0IEBACiAJZWxzZQogCQlyaS0+ZGF0YV9jcmMgPSBjcHVfdG9famUzMigwKTsKIAotCW5ld19tZXRhZGF0YSA9IGpmZnMyX3dyaXRlX2Rub2RlKGMsIGYsIHJpLCBtZGF0YSwgbWRhdGFsZW4sIEFMTE9DX05PUk1BTCk7CisJbmV3X21ldGFkYXRhID0gamZmczJfd3JpdGVfZG5vZGUoYywgZiwgcmksIG1kYXRhLCBtZGF0YWxlbiwgYWxsb2NfdHlwZSk7CiAJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCiAJCWtmcmVlKG1kYXRhKTsKIAogCWlmIChJU19FUlIobmV3X21ldGFkYXRhKSkgewogCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKIAkJamZmczJfZnJlZV9yYXdfaW5vZGUocmkpOwotCQl1cCgmZi0+c2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZmLT5zZW0pOwogCQlyZXR1cm4gUFRSX0VSUihuZXdfbWV0YWRhdGEpOwogCX0KIAkvKiBJdCB3b3JrZWQuIFVwZGF0ZSB0aGUgaW5vZGUgKi8KQEAgLTE0OSw2ICsxNTQsNyBAQAogCWlmIChpdmFsaWQgJiBBVFRSX1NJWkUgJiYgaW5vZGUtPmlfc2l6ZSA8IGlhdHRyLT5pYV9zaXplKSB7CiAJCWpmZnMyX2FkZF9mdWxsX2Rub2RlX3RvX2lub2RlKGMsIGYsIG5ld19tZXRhZGF0YSk7CiAJCWlub2RlLT5pX3NpemUgPSBpYXR0ci0+aWFfc2l6ZTsKKwkJaW5vZGUtPmlfYmxvY2tzID0gKGlub2RlLT5pX3NpemUgKyA1MTEpID4+IDk7CiAJCWYtPm1ldGFkYXRhID0gTlVMTDsKIAl9IGVsc2UgewogCQlmLT5tZXRhZGF0YSA9IG5ld19tZXRhZGF0YTsKQEAgLTE1OSw3ICsxNjUsNyBAQAogCX0KIAlqZmZzMl9mcmVlX3Jhd19pbm9kZShyaSk7CiAKLQl1cCgmZi0+c2VtKTsKKwltdXRleF91bmxvY2soJmYtPnNlbSk7CiAJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CiAKIAkvKiBXZSBoYXZlIHRvIGRvIHRoZSB2bXRydW5jYXRlKCkgd2l0aG91dCBmLT5zZW0gaGVsZCwgc2luY2UKQEAgLTE2Nyw4ICsxNzMsMTAgQEAKIAkgICBXZSBhcmUgcHJvdGVjdGVkIGZyb20gYSBzaW11bHRhbmVvdXMgd3JpdGUoKSBleHRlbmRpbmcgaV9zaXplCiAJICAgYmFjayBwYXN0IGlhdHRyLT5pYV9zaXplLCBiZWNhdXNlIGRvX3RydW5jYXRlKCkgaG9sZHMgdGhlCiAJICAgZ2VuZXJpYyBpbm9kZSBzZW1hcGhvcmUuICovCi0JaWYgKGl2YWxpZCAmIEFUVFJfU0laRSAmJiBpbm9kZS0+aV9zaXplID4gaWF0dHItPmlhX3NpemUpCi0JCXZtdHJ1bmNhdGUoaW5vZGUsIGlhdHRyLT5pYV9zaXplKTsKKwlpZiAoaXZhbGlkICYgQVRUUl9TSVpFICYmIGlub2RlLT5pX3NpemUgPiBpYXR0ci0+aWFfc2l6ZSkgeworCQl2bXRydW5jYXRlKGlub2RlLCBpYXR0ci0+aWFfc2l6ZSk7CQorCQlpbm9kZS0+aV9ibG9ja3MgPSAoaW5vZGUtPmlfc2l6ZSArIDUxMSkgPj4gOTsKKwl9CQogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNDgsMTIgKzI1NiwxMiBAQAogCWMgPSBKRkZTMl9TQl9JTkZPKGlub2RlLT5pX3NiKTsKIAogCWpmZnMyX2luaXRfaW5vZGVfaW5mbyhmKTsKLQlkb3duKCZmLT5zZW0pOworCW11dGV4X2xvY2soJmYtPnNlbSk7CiAKIAlyZXQgPSBqZmZzMl9kb19yZWFkX2lub2RlKGMsIGYsIGlub2RlLT5pX2lubywgJmxhdGVzdF9ub2RlKTsKIAogCWlmIChyZXQpIHsKLQkJdXAoJmYtPnNlbSk7CisJCW11dGV4X3VubG9jaygmZi0+c2VtKTsKIAkJaWdldF9mYWlsZWQoaW5vZGUpOwogCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCX0KQEAgLTMzMCw3ICszMzgsNyBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzMl9yZWFkX2lub2RlKCk6IEJvZ3VzIGltb2RlICVvIGZvciBpbm8gJWx1XG4iLCBpbm9kZS0+aV9tb2RlLCAodW5zaWduZWQgbG9uZylpbm9kZS0+aV9pbm8pOwogCX0KIAotCXVwKCZmLT5zZW0pOworCW11dGV4X3VubG9jaygmZi0+c2VtKTsKIAogCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9yZWFkX2lub2RlKCkgcmV0dXJuaW5nXG4iKSk7CiAJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CkBAIC0zMzksNyArMzQ3LDcgQEAKIGVycm9yX2lvOgogCXJldCA9IC1FSU87CiBlcnJvcjoKLQl1cCgmZi0+c2VtKTsKKwltdXRleF91bmxvY2soJmYtPnNlbSk7CiAJamZmczJfZG9fY2xlYXJfaW5vZGUoYywgZik7CiAJaWdldF9mYWlsZWQoaW5vZGUpOwogCXJldHVybiBFUlJfUFRSKHJldCk7CkBAIC0zODAsOSArMzg4LDkgQEAKIAkgICBGbHVzaCB0aGUgd3JpdGVidWZmZXIsIGlmIG5lY2NlY2FyeSwgZWxzZSB3ZSBsb29zZSBpdCAqLwogCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewogCQlqZmZzMl9zdG9wX2dhcmJhZ2VfY29sbGVjdF90aHJlYWQoYyk7Ci0JCWRvd24oJmMtPmFsbG9jX3NlbSk7CisJCW11dGV4X2xvY2soJmMtPmFsbG9jX3NlbSk7CiAJCWpmZnMyX2ZsdXNoX3didWZfcGFkKGMpOwotCQl1cCgmYy0+YWxsb2Nfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZjLT5hbGxvY19zZW0pOwogCX0KIAogCWlmICghKCpmbGFncyAmIE1TX1JET05MWSkpCkBAIC00MjksNyArNDM3LDcgQEAKIAogCWYgPSBKRkZTMl9JTk9ERV9JTkZPKGlub2RlKTsKIAlqZmZzMl9pbml0X2lub2RlX2luZm8oZik7Ci0JZG93bigmZi0+c2VtKTsKKwltdXRleF9sb2NrKCZmLT5zZW0pOwogCiAJbWVtc2V0KHJpLCAwLCBzaXplb2YoKnJpKSk7CiAJLyogU2V0IE9TLXNwZWNpZmljIGRlZmF1bHRzIGZvciBuZXcgaW5vZGVzICovCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9nYy5jIGIvZnMvamZmczIvZ2MuYwppbmRleCAzMmZmMDM3Li5iYWQwMDU2IDEwMDY0NAotLS0gYS9mcy9qZmZzMi9nYy5jCisrKyBiL2ZzL2pmZnMyL2djLmMKQEAgLTEyNiw3ICsxMjYsNyBAQAogCWludCByZXQgPSAwLCBpbnVtLCBubGluazsKIAlpbnQgeGF0dHIgPSAwOwogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYy0+YWxsb2Nfc2VtKSkKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjLT5hbGxvY19zZW0pKQogCQlyZXR1cm4gLUVJTlRSOwogCiAJZm9yICg7OykgewpAQCAtMTQzLDcgKzE0Myw3IEBACiAJCQkgICAgICAgYy0+dW5jaGVja2VkX3NpemUpOwogCQkJamZmczJfZGJnX2R1bXBfYmxvY2tfbGlzdHNfbm9sb2NrKGMpOwogCQkJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7Ci0JCQl1cCgmYy0+YWxsb2Nfc2VtKTsKKwkJCW11dGV4X3VubG9jaygmYy0+YWxsb2Nfc2VtKTsKIAkJCXJldHVybiAtRU5PU1BDOwogCQl9CiAKQEAgLTE5MCw3ICsxOTAsNyBAQAogCQkJIG1hZGUgbm8gcHJvZ3Jlc3MgaW4gdGhpcyBjYXNlLCBidXQgdGhhdCBzaG91bGQgYmUgT0sgKi8KIAkJCWMtPmNoZWNrZWRfaW5vLS07CiAKLQkJCXVwKCZjLT5hbGxvY19zZW0pOworCQkJbXV0ZXhfdW5sb2NrKCZjLT5hbGxvY19zZW0pOwogCQkJc2xlZXBfb25fc3BpbnVubG9jaygmYy0+aW5vY2FjaGVfd3EsICZjLT5pbm9jYWNoZV9sb2NrKTsKIAkJCXJldHVybiAwOwogCkBAIC0yMTAsNyArMjEwLDcgQEAKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJldHVybmVkIGVycm9yIGZvciBjcmNjaGVjayBvZiBpbm8gIyV1LiBFeHBlY3QgYmFkbmVzcy4uLlxuIiwgaWMtPmlubyk7CiAKIAkJamZmczJfc2V0X2lub2NhY2hlX3N0YXRlKGMsIGljLCBJTk9fU1RBVEVfQ0hFQ0tFREFCU0VOVCk7Ci0JCXVwKCZjLT5hbGxvY19zZW0pOworCQltdXRleF91bmxvY2soJmMtPmFsbG9jX3NlbSk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0yMjEsOSArMjIxLDE1IEBACiAJCWplYiA9IGpmZnMyX2ZpbmRfZ2NfYmxvY2soYyk7CiAKIAlpZiAoIWplYikgewotCQlEMSAocHJpbnRrKEtFUk5fTk9USUNFICJqZmZzMjogQ291bGRuJ3QgZmluZCBlcmFzZSBibG9jayB0byBnYXJiYWdlIGNvbGxlY3QhXG4iKSk7CisJCS8qIENvdWxkbid0IGZpbmQgYSBmcmVlIGJsb2NrLiBCdXQgbWF5YmUgd2UgY2FuIGp1c3QgZXJhc2Ugb25lIGFuZCBtYWtlICdwcm9ncmVzcyc/ICovCisJCWlmICghbGlzdF9lbXB0eSgmYy0+ZXJhc2VfcGVuZGluZ19saXN0KSkgeworCQkJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJCQltdXRleF91bmxvY2soJmMtPmFsbG9jX3NlbSk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCQlEMShwcmludGsoS0VSTl9OT1RJQ0UgImpmZnMyOiBDb3VsZG4ndCBmaW5kIGVyYXNlIGJsb2NrIHRvIGdhcmJhZ2UgY29sbGVjdCFcbiIpKTsKIAkJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7Ci0JCXVwKCZjLT5hbGxvY19zZW0pOworCQltdXRleF91bmxvY2soJmMtPmFsbG9jX3NlbSk7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtMjMyLDcgKzIzOCw3IEBACiAJICAgcHJpbnRrKEtFUk5fREVCVUcgIk5leHRibG9jayBhdCAgJTA4eCwgdXNlZF9zaXplICUwOHgsIGRpcnR5X3NpemUgJTA4eCwgd2FzdGVkX3NpemUgJTA4eCwgZnJlZV9zaXplICUwOHhcbiIsIGMtPm5leHRibG9jay0+b2Zmc2V0LCBjLT5uZXh0YmxvY2stPnVzZWRfc2l6ZSwgYy0+bmV4dGJsb2NrLT5kaXJ0eV9zaXplLCBjLT5uZXh0YmxvY2stPndhc3RlZF9zaXplLCBjLT5uZXh0YmxvY2stPmZyZWVfc2l6ZSkpOwogCiAJaWYgKCFqZWItPnVzZWRfc2l6ZSkgewotCQl1cCgmYy0+YWxsb2Nfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZjLT5hbGxvY19zZW0pOwogCQlnb3RvIGVyYXNlaXQ7CiAJfQogCkBAIC0yNDgsNyArMjU0LDcgQEAKIAkJCSAgICAgICBqZWItPm9mZnNldCwgamViLT5mcmVlX3NpemUsIGplYi0+ZGlydHlfc2l6ZSwgamViLT51c2VkX3NpemUpOwogCQkJamViLT5nY19ub2RlID0gcmF3OwogCQkJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7Ci0JCQl1cCgmYy0+YWxsb2Nfc2VtKTsKKwkJCW11dGV4X3VubG9jaygmYy0+YWxsb2Nfc2VtKTsKIAkJCUJVRygpOwogCQl9CiAJfQpAQCAtMjY2LDcgKzI3Miw3IEBACiAJCQkvKiBKdXN0IG1hcmsgaXQgb2Jzb2xldGUgKi8KIAkJCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCByYXcpOwogCQl9Ci0JCXVwKCZjLT5hbGxvY19zZW0pOworCQltdXRleF91bmxvY2soJmMtPmFsbG9jX3NlbSk7CiAJCWdvdG8gZXJhc2VpdF9sb2NrOwogCX0KIApAQCAtMzM0LDcgKzM0MCw3IEBACiAJCSovCiAJCXByaW50ayhLRVJOX0NSSVQgIklub2RlICMldSBhbHJlYWR5IGluIHN0YXRlICVkIGluIGpmZnMyX2dhcmJhZ2VfY29sbGVjdF9wYXNzKCkhXG4iLAogCQkgICAgICAgaWMtPmlubywgaWMtPnN0YXRlKTsKLQkJdXAoJmMtPmFsbG9jX3NlbSk7CisJCW11dGV4X3VubG9jaygmYy0+YWxsb2Nfc2VtKTsKIAkJc3Bpbl91bmxvY2soJmMtPmlub2NhY2hlX2xvY2spOwogCQlCVUcoKTsKIApAQCAtMzQ1LDcgKzM1MSw3IEBACiAJCSAgIHRoZSBhbGxvY19zZW0oKSAoZm9yIG1hcmtpbmcgbm9kZXMgaW52YWxpZCkgc28gd2UgbXVzdAogCQkgICBkcm9wIHRoZSBhbGxvY19zZW0gYmVmb3JlIHNsZWVwaW5nLiAqLwogCi0JCXVwKCZjLT5hbGxvY19zZW0pOworCQltdXRleF91bmxvY2soJmMtPmFsbG9jX3NlbSk7CiAJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9nYXJiYWdlX2NvbGxlY3RfcGFzcygpIHdhaXRpbmcgZm9yIGlubyAjJXUgaW4gc3RhdGUgJWRcbiIsCiAJCQkgIGljLT5pbm8sIGljLT5zdGF0ZSkpOwogCQlzbGVlcF9vbl9zcGludW5sb2NrKCZjLT5pbm9jYWNoZV93cSwgJmMtPmlub2NhY2hlX2xvY2spOwpAQCAtNDE2LDcgKzQyMiw3IEBACiAJCXJldCA9IC1FTk9TUEM7CiAJfQogIHJlbGVhc2Vfc2VtOgotCXVwKCZjLT5hbGxvY19zZW0pOworCW11dGV4X3VubG9jaygmYy0+YWxsb2Nfc2VtKTsKIAogIGVyYXNlaXRfbG9jazoKIAkvKiBJZiB3ZSd2ZSBmaW5pc2hlZCB0aGlzIGJsb2NrLCBzdGFydCBpdCBlcmFzaW5nICovCkBAIC00NDUsNyArNDUxLDcgQEAKIAl1aW50MzJfdCBzdGFydCA9IDAsIGVuZCA9IDAsIG5yZnJhZ3MgPSAwOwogCWludCByZXQgPSAwOwogCi0JZG93bigmZi0+c2VtKTsKKwltdXRleF9sb2NrKCZmLT5zZW0pOwogCiAJLyogTm93IHdlIGhhdmUgdGhlIGxvY2sgZm9yIHRoaXMgaW5vZGUuIENoZWNrIHRoYXQgaXQncyBzdGlsbCB0aGUgb25lIGF0IHRoZSBoZWFkCiAJICAgb2YgdGhlIGxpc3QuICovCkBAIC01MjUsNyArNTMxLDcgQEAKIAkJfQogCX0KICB1cG5vdXQ6Ci0JdXAoJmYtPnNlbSk7CisJbXV0ZXhfdW5sb2NrKCZmLT5zZW0pOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTg0Niw3ICs4NTIsNyBAQAogCQkvKiBQcmV2ZW50IHRoZSBlcmFzZSBjb2RlIGZyb20gbmlja2luZyB0aGUgb2Jzb2xldGUgbm9kZSByZWZzIHdoaWxlCiAJCSAgIHdlJ3JlIGxvb2tpbmcgYXQgdGhlbS4gSSByZWFsbHkgZG9uJ3QgbGlrZSB0aGlzIGV4dHJhIGxvY2sgYnV0CiAJCSAgIGNhbid0IHNlZSBhbnkgYWx0ZXJuYXRpdmUuIFN1Z2dlc3Rpb25zIG9uIGEgcG9zdGNhcmQgdG8uLi4gKi8KLQkJZG93bigmYy0+ZXJhc2VfZnJlZV9zZW0pOworCQltdXRleF9sb2NrKCZjLT5lcmFzZV9mcmVlX3NlbSk7CiAKIAkJZm9yIChyYXcgPSBmLT5pbm9jYWNoZS0+bm9kZXM7IHJhdyAhPSAodm9pZCAqKWYtPmlub2NhY2hlOyByYXcgPSByYXctPm5leHRfaW5faW5vKSB7CiAKQEAgLTg5OSw3ICs5MDUsNyBAQAogCQkJLyogT0suIFRoZSBuYW1lIHJlYWxseSBkb2VzIG1hdGNoLiBUaGVyZSByZWFsbHkgaXMgc3RpbGwgYW4gb2xkZXIgbm9kZSBvbgogCQkJICAgdGhlIGZsYXNoIHdoaWNoIG91ciBkZWxldGlvbiBkaXJlbnQgb2Jzb2xldGVzLiBTbyB3ZSBoYXZlIHRvIHdyaXRlIG91dAogCQkJICAgYSBuZXcgZGVsZXRpb24gZGlyZW50IHRvIHJlcGxhY2UgaXQgKi8KLQkJCXVwKCZjLT5lcmFzZV9mcmVlX3NlbSk7CisJCQltdXRleF91bmxvY2soJmMtPmVyYXNlX2ZyZWVfc2VtKTsKIAogCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkRlbGV0aW9uIGRpcmVudCBhdCAlMDh4IHN0aWxsIG9ic29sZXRlcyByZWFsIGRpcmVudCBcIiVzXCIgYXQgJTA4eCBmb3IgaW5vICMldVxuIiwKIAkJCQkgIHJlZl9vZmZzZXQoZmQtPnJhdyksIGZkLT5uYW1lLCByZWZfb2Zmc2V0KHJhdyksIGplMzJfdG9fY3B1KHJkLT5pbm8pKSk7CkBAIC05MDgsNyArOTE0LDcgQEAKIAkJCXJldHVybiBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfZGlyZW50KGMsIGplYiwgZiwgZmQpOwogCQl9CiAKLQkJdXAoJmMtPmVyYXNlX2ZyZWVfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZjLT5lcmFzZV9mcmVlX3NlbSk7CiAJCWtmcmVlKHJkKTsKIAl9CiAKQEAgLTEwODEsNyArMTA4Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgamZmczJfZ2FyYmFnZV9jb2xsZWN0X2Rub2RlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViLAorc3RhdGljIGludCBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfZG5vZGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpvcmlnX2plYiwKIAkJCQkgICAgICAgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsIHN0cnVjdCBqZmZzMl9mdWxsX2Rub2RlICpmbiwKIAkJCQkgICAgICAgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGVuZCkKIHsKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2lvY3RsLmMgYi9mcy9qZmZzMi9pb2N0bC5jCmluZGV4IGY0ZDUyNWIuLmUyMTc3MjEgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2lvY3RsLmMKKysrIGIvZnMvamZmczIvaW9jdGwuYwpAQCAtMTAsNiArMTAsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgIm5vZGVsaXN0LmgiCiAKIGludCBqZmZzMl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJdW5zaWduZWQgbG9uZyBhcmcpCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9qZmZzMl9mc19pLmggYi9mcy9qZmZzMi9qZmZzMl9mc19pLmgKaW5kZXggYTg0MWY0OS4uMzE1NTlmNCAxMDA2NDQKLS0tIGEvZnMvamZmczIvamZmczJfZnNfaS5oCisrKyBiL2ZzL2pmZnMyL2pmZnMyX2ZzX2kuaApAQCAtMTUsNyArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KICNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2wuaD4KLSNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyB7CiAJLyogV2UgbmVlZCBhbiBpbnRlcm5hbCBtdXRleCBzaW1pbGFyIHRvIGlub2RlLT5pX211dGV4LgpAQCAtMjQsNyArMjQsNyBAQAogCSAgIGJlZm9yZSBsZXR0aW5nIEdDIHByb2NlZWQuIE9yIHdlJ2QgaGF2ZSB0byBwdXQgdWdsaW5lc3MKIAkgICBpbnRvIHRoZSBHQyBjb2RlIHNvIGl0IGRpZG4ndCBhdHRlbXB0IHRvIG9idGFpbiB0aGUgaV9tdXRleAogCSAgIGZvciB0aGUgaW5vZGUocykgd2hpY2ggYXJlIGFscmVhZHkgbG9ja2VkICovCi0Jc3RydWN0IHNlbWFwaG9yZSBzZW07CisJc3RydWN0IG11dGV4IHNlbTsKIAogCS8qIFRoZSBoaWdoZXN0IChkYXRhbm9kZSkgdmVyc2lvbiBudW1iZXIgdXNlZCBmb3IgdGhpcyBpbm8gKi8KIAl1aW50MzJfdCBoaWdoZXN0X3ZlcnNpb247CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9qZmZzMl9mc19zYi5oIGIvZnMvamZmczIvamZmczJfZnNfc2IuaAppbmRleCAxOGZjYTJiLi44NWVmNmRiIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9qZmZzMl9mc19zYi5oCisrKyBiL2ZzL2pmZnMyL2pmZnMyX2ZzX3NiLmgKQEAgLTE2LDcgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KLSNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KQEAgLTQ0LDcgKzQ0LDcgQEAKIAlzdHJ1Y3QgY29tcGxldGlvbiBnY190aHJlYWRfc3RhcnQ7IC8qIEdDIHRocmVhZCBzdGFydCBjb21wbGV0aW9uICovCiAJc3RydWN0IGNvbXBsZXRpb24gZ2NfdGhyZWFkX2V4aXQ7IC8qIEdDIHRocmVhZCBleGl0IGNvbXBsZXRpb24gcG9ydCAqLwogCi0Jc3RydWN0IHNlbWFwaG9yZSBhbGxvY19zZW07CS8qIFVzZWQgdG8gcHJvdGVjdCBhbGwgdGhlIGZvbGxvd2luZworCXN0cnVjdCBtdXRleCBhbGxvY19zZW07CQkvKiBVc2VkIHRvIHByb3RlY3QgYWxsIHRoZSBmb2xsb3dpbmcKIAkJCQkJICAgZmllbGRzLCBhbmQgYWxzbyB0byBwcm90ZWN0IGFnYWluc3QKIAkJCQkJICAgb3V0LW9mLW9yZGVyIHdyaXRpbmcgb2Ygbm9kZXMuIEFuZCBHQy4gKi8KIAl1aW50MzJfdCBjbGVhbm1hcmtlcl9zaXplOwkvKiBTaXplIG9mIGFuIF9pbmxpbmVfIENMRUFOTUFSS0VSCkBAIC04Nyw2ICs4Nyw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCBlcmFzYWJsZV9saXN0OwkJLyogQmxvY2tzIHdoaWNoIGFyZSBjb21wbGV0ZWx5IGRpcnR5LCBhbmQgbmVlZCBlcmFzaW5nICovCiAJc3RydWN0IGxpc3RfaGVhZCBlcmFzYWJsZV9wZW5kaW5nX3didWZfbGlzdDsJLyogQmxvY2tzIHdoaWNoIG5lZWQgZXJhc2luZyBidXQgb25seSBhZnRlciB0aGUgY3VycmVudCB3YnVmIGlzIGZsdXNoZWQgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGVyYXNpbmdfbGlzdDsJCS8qIEJsb2NrcyB3aGljaCBhcmUgY3VycmVudGx5IGVyYXNpbmcgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGVyYXNlX2NoZWNraW5nX2xpc3Q7CS8qIEJsb2NrcyB3aGljaCBhcmUgYmVpbmcgY2hlY2tlZCBhbmQgbWFya2VkICovCiAJc3RydWN0IGxpc3RfaGVhZCBlcmFzZV9wZW5kaW5nX2xpc3Q7CS8qIEJsb2NrcyB3aGljaCBuZWVkIGVyYXNpbmcgbm93ICovCiAJc3RydWN0IGxpc3RfaGVhZCBlcmFzZV9jb21wbGV0ZV9saXN0OwkvKiBCbG9ja3Mgd2hpY2ggYXJlIGVyYXNlZCBhbmQgbmVlZCB0aGUgY2xlYW4gbWFya2VyIHdyaXR0ZW4gdG8gdGhlbSAqLwogCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9saXN0OwkJLyogQmxvY2tzIHdoaWNoIGFyZSBmcmVlIGFuZCByZWFkeSB0byBiZSB1c2VkICovCkBAIC0xMDQsNyArMTA1LDcgQEAKIAkvKiBTZW0gdG8gYWxsb3cgamZmczJfZ2FyYmFnZV9jb2xsZWN0X2RlbGV0aW9uX2RpcmVudCB0bwogCSAgIGRyb3AgdGhlIGVyYXNlX2NvbXBsZXRpb25fbG9jayB3aGlsZSBpdCdzIGhvbGRpbmcgYSBwb2ludGVyCiAJICAgdG8gYW4gb2Jzb2xldGVkIG5vZGUuIEkgZG9uJ3QgbGlrZSB0aGlzLiBBbHRlcm5hdGl2ZXMgd2VsY29tZWQuICovCi0Jc3RydWN0IHNlbWFwaG9yZSBlcmFzZV9mcmVlX3NlbTsKKwlzdHJ1Y3QgbXV0ZXggZXJhc2VfZnJlZV9zZW07CiAKIAl1aW50MzJfdCB3YnVmX3BhZ2VzaXplOyAvKiAwIGZvciBOT1IgYW5kIG90aGVyIGZsYXNoZXMgd2l0aCBubyB3YnVmICovCiAKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL25vZGVsaXN0LmggYi9mcy9qZmZzMi9ub2RlbGlzdC5oCmluZGV4IGVjMWFhZTkuLjgyMTlkZjYgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL25vZGVsaXN0LmgKKysrIGIvZnMvamZmczIvbm9kZWxpc3QuaApAQCAtODcsNyArODcsNyBAQAogCQl4YXR0cl9yZWYgb3IgeGF0dHJfZGF0dW0gaW5zdGVhZC4gVGhlIGNvbW1vbiBwYXJ0IG9mIHRob3NlIHN0cnVjdHVyZXMKIAkJaGFzIE5VTEwgaW4gdGhlIGZpcnN0IHdvcmQuIFNlZSBqZmZzMl9yYXdfcmVmX3RvX2ljKCkgYmVsb3cgKi8KIAl1aW50MzJfdCBmbGFzaF9vZmZzZXQ7Ci0jZGVmaW5lIFRFU1RfVE9UTEVOCisjdW5kZWYgVEVTVF9UT1RMRU4KICNpZmRlZiBURVNUX1RPVExFTgogCXVpbnQzMl90IF9fdG90bGVuOyAvKiBUaGlzIG1heSBkaWU7IHVzZSByZWZfdG90bGVuKGMsIGplYiwgKSBiZWxvdyAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9ub2RlbWdtdC5jIGIvZnMvamZmczIvbm9kZW1nbXQuYwppbmRleCBhMDMxM2ZhLi45ZGY4ZjNlIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9ub2RlbWdtdC5jCisrKyBiL2ZzL2pmZnMyL25vZGVtZ210LmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIAltaW5zaXplID0gUEFEKG1pbnNpemUpOwogCiAJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3Jlc2VydmVfc3BhY2UoKTogUmVxdWVzdGVkIDB4JXggYnl0ZXNcbiIsIG1pbnNpemUpKTsKLQlkb3duKCZjLT5hbGxvY19zZW0pOworCW11dGV4X2xvY2soJmMtPmFsbG9jX3NlbSk7CiAKIAlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfcmVzZXJ2ZV9zcGFjZSgpOiBhbGxvYyBzZW0gZ290XG4iKSk7CiAKQEAgLTU3LDcgKzU3LDYgQEAKIAkvKiB0aGlzIG5lZWRzIGEgbGl0dGxlIG1vcmUgdGhvdWdodCAodHJ1ZSA8dGdseD4gOikpICovCiAJd2hpbGUocmV0ID09IC1FQUdBSU4pIHsKIAkJd2hpbGUoYy0+bnJfZnJlZV9ibG9ja3MgKyBjLT5ucl9lcmFzaW5nX2Jsb2NrcyA8IGJsb2Nrc25lZWRlZCkgewotCQkJaW50IHJldDsKIAkJCXVpbnQzMl90IGRpcnR5LCBhdmFpbDsKIAogCQkJLyogY2FsY3VsYXRlIHJlYWwgZGlydHkgc2l6ZQpAQCAtODIsNyArODEsNyBAQAogCQkJCQkgIGRpcnR5LCBjLT51bmNoZWNrZWRfc2l6ZSwgYy0+c2VjdG9yX3NpemUpKTsKIAogCQkJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwotCQkJCXVwKCZjLT5hbGxvY19zZW0pOworCQkJCW11dGV4X3VubG9jaygmYy0+YWxsb2Nfc2VtKTsKIAkJCQlyZXR1cm4gLUVOT1NQQzsKIAkJCX0KIApAQCAtMTA1LDExICsxMDQsMTEgQEAKIAkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAibWF4LiBhdmFpbGFibGUgc2l6ZSAweCUwOHggIDwgYmxvY2tzbmVlZGVkICogc2VjdG9yX3NpemUgMHglMDh4LCByZXR1cm5pbmcgLUVOT1NQQ1xuIiwKIAkJCQkJICBhdmFpbCwgYmxvY2tzbmVlZGVkICogYy0+c2VjdG9yX3NpemUpKTsKIAkJCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKLQkJCQl1cCgmYy0+YWxsb2Nfc2VtKTsKKwkJCQltdXRleF91bmxvY2soJmMtPmFsbG9jX3NlbSk7CiAJCQkJcmV0dXJuIC1FTk9TUEM7CiAJCQl9CiAKLQkJCXVwKCZjLT5hbGxvY19zZW0pOworCQkJbXV0ZXhfdW5sb2NrKCZjLT5hbGxvY19zZW0pOwogCiAJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiVHJpZ2dlcmluZyBHQyBwYXNzLiBucl9mcmVlX2Jsb2NrcyAlZCwgbnJfZXJhc2luZ19ibG9ja3MgJWQsIGZyZWVfc2l6ZSAweCUwOHgsIGRpcnR5X3NpemUgMHglMDh4LCB3YXN0ZWRfc2l6ZSAweCUwOHgsIHVzZWRfc2l6ZSAweCUwOHgsIGVyYXNpbmdfc2l6ZSAweCUwOHgsIGJhZF9zaXplIDB4JTA4eCAodG90YWwgMHglMDh4IG9mIDB4JTA4eClcbiIsCiAJCQkJICBjLT5ucl9mcmVlX2Jsb2NrcywgYy0+bnJfZXJhc2luZ19ibG9ja3MsIGMtPmZyZWVfc2l6ZSwgYy0+ZGlydHlfc2l6ZSwgYy0+d2FzdGVkX3NpemUsIGMtPnVzZWRfc2l6ZSwgYy0+ZXJhc2luZ19zaXplLCBjLT5iYWRfc2l6ZSwKQEAgLTExNyw3ICsxMTYsMTAgQEAKIAkJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwogCiAJCQlyZXQgPSBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfcGFzcyhjKTsKLQkJCWlmIChyZXQpCisKKwkJCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJCQlqZmZzMl9lcmFzZV9wZW5kaW5nX2Jsb2NrcyhjLCAxKTsKKwkJCWVsc2UgaWYgKHJldCkKIAkJCQlyZXR1cm4gcmV0OwogCiAJCQljb25kX3Jlc2NoZWQoKTsKQEAgLTEyNSw3ICsxMjcsNyBAQAogCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQkJCXJldHVybiAtRUlOVFI7CiAKLQkJCWRvd24oJmMtPmFsbG9jX3NlbSk7CisJCQltdXRleF9sb2NrKCZjLT5hbGxvY19zZW0pOwogCQkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwogCQl9CiAKQEAgLTEzOCw3ICsxNDAsNyBAQAogCWlmICghcmV0KQogCQlyZXQgPSBqZmZzMl9wcmVhbGxvY19yYXdfbm9kZV9yZWZzKGMsIGMtPm5leHRibG9jaywgMSk7CiAJaWYgKHJldCkKLQkJdXAoJmMtPmFsbG9jX3NlbSk7CisJCW11dGV4X3VubG9jaygmYy0+YWxsb2Nfc2VtKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC00NjMsNyArNDY1LDcgQEAKIHsKIAlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oKVxuIikpOwogCWpmZnMyX2dhcmJhZ2VfY29sbGVjdF90cmlnZ2VyKGMpOwotCXVwKCZjLT5hbGxvY19zZW0pOworCW11dGV4X3VubG9jaygmYy0+YWxsb2Nfc2VtKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgb25fbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpvYmosIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCkBAIC01MTIsNyArNTE0LDcgQEAKIAkJICAgYW55IGpmZnMyX3Jhd19ub2RlX3JlZnMuIFNvIHdlIGRvbid0IG5lZWQgdG8gc3RvcCBlcmFzZXMgZnJvbQogCQkgICBoYXBwZW5pbmcsIG9yIHByb3RlY3QgYWdhaW5zdCBwZW9wbGUgaG9sZGluZyBhbiBvYnNvbGV0ZQogCQkgICBqZmZzMl9yYXdfbm9kZV9yZWYgd2l0aG91dCB0aGUgZXJhc2VfY29tcGxldGlvbl9sb2NrLiAqLwotCQlkb3duKCZjLT5lcmFzZV9mcmVlX3NlbSk7CisJCW11dGV4X2xvY2soJmMtPmVyYXNlX2ZyZWVfc2VtKTsKIAl9CiAKIAlzcGluX2xvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CkBAIC03MTUsNyArNzE3LDcgQEAKIAl9CiAKICBvdXRfZXJhc2Vfc2VtOgotCXVwKCZjLT5lcmFzZV9mcmVlX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZjLT5lcmFzZV9mcmVlX3NlbSk7CiB9CiAKIGludCBqZmZzMl90aHJlYWRfc2hvdWxkX3dha2Uoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9yZWFkaW5vZGUuYyBiL2ZzL2pmZnMyL3JlYWRpbm9kZS5jCmluZGV4IGU1MTJhOTMuLjRjYjRkNzYgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL3JlYWRpbm9kZS5jCisrKyBiL2ZzL2pmZnMyL3JlYWRpbm9kZS5jCkBAIC04MjUsOCArODI1LDkgQEAKIAllbHNlIC8vIG5vcm1hbCBjYXNlLi4uCiAJCXRuLT5mbi0+c2l6ZSA9IGplMzJfdG9fY3B1KHJkLT5kc2l6ZSk7CiAKLQlkYmdfcmVhZGlub2RlKCJkbm9kZSBAJTA4eDogdmVyICV1LCBvZmZzZXQgJSMwNHgsIGRzaXplICUjMDR4LCBjc2l6ZSAlIzA0eFxuIiwKLQkJICByZWZfb2Zmc2V0KHJlZiksIGplMzJfdG9fY3B1KHJkLT52ZXJzaW9uKSwgamUzMl90b19jcHUocmQtPm9mZnNldCksIGplMzJfdG9fY3B1KHJkLT5kc2l6ZSksIGNzaXplKTsKKwlkYmdfcmVhZGlub2RlMigiZG5vZGUgQCUwOHg6IHZlciAldSwgb2Zmc2V0ICUjMDR4LCBkc2l6ZSAlIzA0eCwgY3NpemUgJSMwNHhcbiIsCisJCSAgICAgICByZWZfb2Zmc2V0KHJlZiksIGplMzJfdG9fY3B1KHJkLT52ZXJzaW9uKSwKKwkJICAgICAgIGplMzJfdG9fY3B1KHJkLT5vZmZzZXQpLCBqZTMyX3RvX2NwdShyZC0+ZHNpemUpLCBjc2l6ZSk7CiAKIAlyZXQgPSBqZmZzMl9hZGRfdG5fdG9fdHJlZShjLCByaWksIHRuKTsKIApAQCAtODM2LDEzICs4MzcsMTMgQEAKIAkJamZmczJfZnJlZV90bXBfZG5vZGVfaW5mbyh0bik7CiAJCXJldHVybiByZXQ7CiAJfQotI2lmZGVmIEpGRlMyX0RCR19SRUFESU5PREVfTUVTU0FHRVMKLQlkYmdfcmVhZGlub2RlKCJBZnRlciBhZGRpbmcgdmVyICVkOlxuIiwgamUzMl90b19jcHUocmQtPnZlcnNpb24pKTsKKyNpZmRlZiBKRkZTMl9EQkdfUkVBRElOT0RFMl9NRVNTQUdFUworCWRiZ19yZWFkaW5vZGUyKCJBZnRlciBhZGRpbmcgdmVyICVkOlxuIiwgamUzMl90b19jcHUocmQtPnZlcnNpb24pKTsKIAl0biA9IHRuX2ZpcnN0KCZyaWktPnRuX3Jvb3QpOwogCXdoaWxlICh0bikgewotCQlkYmdfcmVhZGlub2RlKCIlcDogdiAlZCByIDB4JXgtMHgleCBvdiAlZFxuIiwKLQkJCSAgICAgdG4sIHRuLT52ZXJzaW9uLCB0bi0+Zm4tPm9mcywKLQkJCSAgICAgdG4tPmZuLT5vZnMrdG4tPmZuLT5zaXplLCB0bi0+b3ZlcmxhcHBlZCk7CisJCWRiZ19yZWFkaW5vZGUyKCIlcDogdiAlZCByIDB4JXgtMHgleCBvdiAlZFxuIiwKKwkJCSAgICAgICB0biwgdG4tPnZlcnNpb24sIHRuLT5mbi0+b2ZzLAorCQkJICAgICAgIHRuLT5mbi0+b2ZzK3RuLT5mbi0+c2l6ZSwgdG4tPm92ZXJsYXBwZWQpOwogCQl0biA9IHRuX25leHQodG4pOwogCX0KICNlbmRpZgpAQCAtMTE5Myw3ICsxMTk0LDcgQEAKIAkJSkZGUzJfRVJST1IoImZhaWxlZCB0byByZWFkIGZyb20gZmxhc2g6IGVycm9yICVkLCAlemQgb2YgJXpkIGJ5dGVzIHJlYWRcbiIsCiAJCQlyZXQsIHJldGxlbiwgc2l6ZW9mKCpsYXRlc3Rfbm9kZSkpOwogCQkvKiBGSVhNRTogSWYgdGhpcyBmYWlscywgdGhlcmUgc2VlbXMgdG8gYmUgYSBtZW1vcnkgbGVhay4gRmluZCBpdC4gKi8KLQkJdXAoJmYtPnNlbSk7CisJCW11dGV4X3VubG9jaygmZi0+c2VtKTsKIAkJamZmczJfZG9fY2xlYXJfaW5vZGUoYywgZik7CiAJCXJldHVybiByZXQ/cmV0Oi1FSU87CiAJfQpAQCAtMTIwMiw3ICsxMjAzLDcgQEAKIAlpZiAoY3JjICE9IGplMzJfdG9fY3B1KGxhdGVzdF9ub2RlLT5ub2RlX2NyYykpIHsKIAkJSkZGUzJfRVJST1IoIkNSQyBmYWlsZWQgZm9yIHJlYWRfaW5vZGUgb2YgaW5vZGUgJXUgYXQgcGh5c2ljYWwgbG9jYXRpb24gMHgleFxuIiwKIAkJCWYtPmlub2NhY2hlLT5pbm8sIHJlZl9vZmZzZXQocmlpLmxhdGVzdF9yZWYpKTsKLQkJdXAoJmYtPnNlbSk7CisJCW11dGV4X3VubG9jaygmZi0+c2VtKTsKIAkJamZmczJfZG9fY2xlYXJfaW5vZGUoYywgZik7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTEyNDIsNyArMTI0Myw3IEBACiAJCQlmLT50YXJnZXQgPSBrbWFsbG9jKGplMzJfdG9fY3B1KGxhdGVzdF9ub2RlLT5jc2l6ZSkgKyAxLCBHRlBfS0VSTkVMKTsKIAkJCWlmICghZi0+dGFyZ2V0KSB7CiAJCQkJSkZGUzJfRVJST1IoImNhbid0IGFsbG9jYXRlICVkIGJ5dGVzIG9mIG1lbW9yeSBmb3IgdGhlIHN5bWxpbmsgdGFyZ2V0IHBhdGggY2FjaGVcbiIsIGplMzJfdG9fY3B1KGxhdGVzdF9ub2RlLT5jc2l6ZSkpOwotCQkJCXVwKCZmLT5zZW0pOworCQkJCW11dGV4X3VubG9jaygmZi0+c2VtKTsKIAkJCQlqZmZzMl9kb19jbGVhcl9pbm9kZShjLCBmKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KQEAgLTEyNTUsNyArMTI1Niw3IEBACiAJCQkJCXJldCA9IC1FSU87CiAJCQkJa2ZyZWUoZi0+dGFyZ2V0KTsKIAkJCQlmLT50YXJnZXQgPSBOVUxMOwotCQkJCXVwKCZmLT5zZW0pOworCQkJCW11dGV4X3VubG9jaygmZi0+c2VtKTsKIAkJCQlqZmZzMl9kb19jbGVhcl9pbm9kZShjLCBmKTsKIAkJCQlyZXR1cm4gLXJldDsKIAkJCX0KQEAgLTEyNzMsMTQgKzEyNzQsMTQgQEAKIAkJaWYgKGYtPm1ldGFkYXRhKSB7CiAJCQlKRkZTMl9FUlJPUigiQXJnaC4gU3BlY2lhbCBpbm9kZSAjJXUgd2l0aCBtb2RlIDAlbyBoYWQgbWV0YWRhdGEgbm9kZVxuIiwKIAkJCSAgICAgICBmLT5pbm9jYWNoZS0+aW5vLCBqZW1vZGVfdG9fY3B1KGxhdGVzdF9ub2RlLT5tb2RlKSk7Ci0JCQl1cCgmZi0+c2VtKTsKKwkJCW11dGV4X3VubG9jaygmZi0+c2VtKTsKIAkJCWpmZnMyX2RvX2NsZWFyX2lub2RlKGMsIGYpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAkJaWYgKCFmcmFnX2ZpcnN0KCZmLT5mcmFndHJlZSkpIHsKIAkJCUpGRlMyX0VSUk9SKCJBcmdoLiBTcGVjaWFsIGlub2RlICMldSB3aXRoIG1vZGUgMCVvIGhhcyBubyBmcmFnbWVudHNcbiIsCiAJCQkgICAgICAgZi0+aW5vY2FjaGUtPmlubywgamVtb2RlX3RvX2NwdShsYXRlc3Rfbm9kZS0+bW9kZSkpOwotCQkJdXAoJmYtPnNlbSk7CisJCQltdXRleF91bmxvY2soJmYtPnNlbSk7CiAJCQlqZmZzMl9kb19jbGVhcl9pbm9kZShjLCBmKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CkBAIC0xMjg5LDcgKzEyOTAsNyBAQAogCQkJSkZGUzJfRVJST1IoIkFyZ2guIFNwZWNpYWwgaW5vZGUgIyV1IHdpdGggbW9kZSAweCV4IGhhZCBtb3JlIHRoYW4gb25lIG5vZGVcbiIsCiAJCQkgICAgICAgZi0+aW5vY2FjaGUtPmlubywgamVtb2RlX3RvX2NwdShsYXRlc3Rfbm9kZS0+bW9kZSkpOwogCQkJLyogRklYTUU6IERlYWwgd2l0aCBpdCAtIGNoZWNrIGNyYzMyLCBjaGVjayBmb3IgZHVwbGljYXRlIG5vZGUsIGNoZWNrIHRpbWVzIGFuZCBkaXNjYXJkIHRoZSBvbGRlciBvbmUgKi8KLQkJCXVwKCZmLT5zZW0pOworCQkJbXV0ZXhfdW5sb2NrKCZmLT5zZW0pOwogCQkJamZmczJfZG9fY2xlYXJfaW5vZGUoYywgZik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQpAQCAtMTM3OSwxMiArMTM4MCwxMyBAQAogCWlmICghZikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpbml0X01VVEVYX0xPQ0tFRCgmZi0+c2VtKTsKKwltdXRleF9pbml0KCZmLT5zZW0pOworCW11dGV4X2xvY2soJmYtPnNlbSk7CiAJZi0+aW5vY2FjaGUgPSBpYzsKIAogCXJldCA9IGpmZnMyX2RvX3JlYWRfaW5vZGVfaW50ZXJuYWwoYywgZiwgJm4pOwogCWlmICghcmV0KSB7Ci0JCXVwKCZmLT5zZW0pOworCQltdXRleF91bmxvY2soJmYtPnNlbSk7CiAJCWpmZnMyX2RvX2NsZWFyX2lub2RlKGMsIGYpOwogCX0KIAlrZnJlZSAoZik7CkBAIC0xMzk4LDcgKzE0MDAsNyBAQAogCiAJamZmczJfY2xlYXJfYWNsKGYpOwogCWpmZnMyX3hhdHRyX2RlbGV0ZV9pbm9kZShjLCBmLT5pbm9jYWNoZSk7Ci0JZG93bigmZi0+c2VtKTsKKwltdXRleF9sb2NrKCZmLT5zZW0pOwogCWRlbGV0ZWQgPSBmLT5pbm9jYWNoZSAmJiAhZi0+aW5vY2FjaGUtPm5saW5rOwogCiAJaWYgKGYtPmlub2NhY2hlICYmIGYtPmlub2NhY2hlLT5zdGF0ZSAhPSBJTk9fU1RBVEVfQ0hFQ0tJTkcpCkBAIC0xNDMwLDUgKzE0MzIsNSBAQAogCQkJamZmczJfZGVsX2lub19jYWNoZShjLCBmLT5pbm9jYWNoZSk7CiAJfQogCi0JdXAoJmYtPnNlbSk7CisJbXV0ZXhfdW5sb2NrKCZmLT5zZW0pOwogfQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvc3VwZXIuYyBiL2ZzL2pmZnMyL3N1cGVyLmMKaW5kZXggNDY3NzM1NS4uZjMzNTNkZiAxMDA2NDQKLS0tIGEvZnMvamZmczIvc3VwZXIuYworKysgYi9mcy9qZmZzMi9zdXBlci5jCkBAIC00Nyw3ICs0Nyw3IEBACiB7CiAJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICopIGZvbzsKIAotCWluaXRfTVVURVgoJmVpLT5zZW0pOworCW11dGV4X2luaXQoJmVpLT5zZW0pOwogCWlub2RlX2luaXRfb25jZSgmZWktPnZmc19pbm9kZSk7CiB9CiAKQEAgLTU1LDkgKzU1LDkgQEAKIHsKIAlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyA9IEpGRlMyX1NCX0lORk8oc2IpOwogCi0JZG93bigmYy0+YWxsb2Nfc2VtKTsKKwltdXRleF9sb2NrKCZjLT5hbGxvY19zZW0pOwogCWpmZnMyX2ZsdXNoX3didWZfcGFkKGMpOwotCXVwKCZjLT5hbGxvY19zZW0pOworCW11dGV4X3VubG9jaygmYy0+YWxsb2Nfc2VtKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTUsOCArOTUsOCBAQAogCiAJLyogSW5pdGlhbGl6ZSBKRkZTMiBzdXBlcmJsb2NrIGxvY2tzLCB0aGUgZnVydGhlciBpbml0aWFsaXphdGlvbiB3aWxsCiAJICogYmUgZG9uZSBsYXRlciAqLwotCWluaXRfTVVURVgoJmMtPmFsbG9jX3NlbSk7Ci0JaW5pdF9NVVRFWCgmYy0+ZXJhc2VfZnJlZV9zZW0pOworCW11dGV4X2luaXQoJmMtPmFsbG9jX3NlbSk7CisJbXV0ZXhfaW5pdCgmYy0+ZXJhc2VfZnJlZV9zZW0pOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmMtPmVyYXNlX3dhaXQpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmMtPmlub2NhY2hlX3dxKTsKIAlzcGluX2xvY2tfaW5pdCgmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKQEAgLTEyNSw5ICsxMjUsOSBAQAogCiAJRDIocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyOiBqZmZzMl9wdXRfc3VwZXIoKVxuIikpOwogCi0JZG93bigmYy0+YWxsb2Nfc2VtKTsKKwltdXRleF9sb2NrKCZjLT5hbGxvY19zZW0pOwogCWpmZnMyX2ZsdXNoX3didWZfcGFkKGMpOwotCXVwKCZjLT5hbGxvY19zZW0pOworCW11dGV4X3VubG9jaygmYy0+YWxsb2Nfc2VtKTsKIAogCWpmZnMyX3N1bV9leGl0KGMpOwogCmRpZmYgLS1naXQgYS9mcy9qZmZzMi93YnVmLmMgYi9mcy9qZmZzMi93YnVmLmMKaW5kZXggZDFkNGYyNy4uOGRlNTJiNiAxMDA2NDQKLS0tIGEvZnMvamZmczIvd2J1Zi5jCisrKyBiL2ZzL2pmZnMyL3didWYuYwpAQCAtNTc4LDggKzU3OCw4IEBACiAJaWYgKCFqZmZzMl9pc193cml0ZWJ1ZmZlcmVkKGMpKQogCQlyZXR1cm4gMDsKIAotCWlmICghZG93bl90cnlsb2NrKCZjLT5hbGxvY19zZW0pKSB7Ci0JCXVwKCZjLT5hbGxvY19zZW0pOworCWlmIChtdXRleF90cnlsb2NrKCZjLT5hbGxvY19zZW0pKSB7CisJCW11dGV4X3VubG9jaygmYy0+YWxsb2Nfc2VtKTsKIAkJcHJpbnRrKEtFUk5fQ1JJVCAiamZmczJfZmx1c2hfd2J1ZigpIGNhbGxlZCB3aXRoIGFsbG9jX3NlbSBub3QgbG9ja2VkIVxuIik7CiAJCUJVRygpOwogCX0KQEAgLTcwMiwxMCArNzAyLDEwIEBACiAJaWYgKCFjLT53YnVmKQogCQlyZXR1cm4gMDsKIAotCWRvd24oJmMtPmFsbG9jX3NlbSk7CisJbXV0ZXhfbG9jaygmYy0+YWxsb2Nfc2VtKTsKIAlpZiAoIWpmZnMyX3didWZfcGVuZGluZ19mb3JfaW5vKGMsIGlubykpIHsKIAkJRDEocHJpbnRrKEtFUk5fREVCVUcgIklubyAjJWQgbm90IHBlbmRpbmcgaW4gd2J1Zi4gUmV0dXJuaW5nXG4iLCBpbm8pKTsKLQkJdXAoJmMtPmFsbG9jX3NlbSk7CisJCW11dGV4X3VubG9jaygmYy0+YWxsb2Nfc2VtKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC03MjUsMTQgKzcyNSwxNCBAQAogCX0gZWxzZSB3aGlsZSAob2xkX3didWZfbGVuICYmCiAJCSAgICAgIG9sZF93YnVmX29mcyA9PSBjLT53YnVmX29mcykgewogCi0JCXVwKCZjLT5hbGxvY19zZW0pOworCQltdXRleF91bmxvY2soJmMtPmFsbG9jX3NlbSk7CiAKIAkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2ZsdXNoX3didWZfZ2MoKSBjYWxscyBnYyBwYXNzXG4iKSk7CiAKIAkJcmV0ID0gamZmczJfZ2FyYmFnZV9jb2xsZWN0X3Bhc3MoYyk7CiAJCWlmIChyZXQpIHsKIAkJCS8qIEdDIGZhaWxlZC4gRmx1c2ggaXQgd2l0aCBwYWRkaW5nIGluc3RlYWQgKi8KLQkJCWRvd24oJmMtPmFsbG9jX3NlbSk7CisJCQltdXRleF9sb2NrKCZjLT5hbGxvY19zZW0pOwogCQkJZG93bl93cml0ZSgmYy0+d2J1Zl9zZW0pOwogCQkJcmV0ID0gX19qZmZzMl9mbHVzaF93YnVmKGMsIFBBRF9BQ0NPVU5USU5HKTsKIAkJCS8qIHJldHJ5IGZsdXNoaW5nIHdidWYgaW4gY2FzZSBqZmZzMl93YnVmX3JlY292ZXIKQEAgLTc0MiwxMiArNzQyLDEyIEBACiAJCQl1cF93cml0ZSgmYy0+d2J1Zl9zZW0pOwogCQkJYnJlYWs7CiAJCX0KLQkJZG93bigmYy0+YWxsb2Nfc2VtKTsKKwkJbXV0ZXhfbG9jaygmYy0+YWxsb2Nfc2VtKTsKIAl9CiAKIAlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZmx1c2hfd2J1Zl9nYygpIGVuZHMuLi5cbiIpKTsKIAotCXVwKCZjLT5hbGxvY19zZW0pOworCW11dGV4X3VubG9jaygmYy0+YWxsb2Nfc2VtKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMjM2LDEyICsxMjM2LDI0IEBACiAJaWYgKCFjLT53YnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIAorI2lmZGVmIENPTkZJR19KRkZTMl9GU19XQlVGX1ZFUklGWQorCWMtPndidWZfdmVyaWZ5ID0ga21hbGxvYyhjLT53YnVmX3BhZ2VzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWMtPndidWZfdmVyaWZ5KSB7CisJCWtmcmVlKGMtPm9vYmJ1Zik7CisJCWtmcmVlKGMtPndidWYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisjZW5kaWYKKwogCXByaW50ayhLRVJOX0lORk8gIkpGRlMyIHdyaXRlLWJ1ZmZlcmluZyBlbmFibGVkIGJ1ZmZlciAoJWQpIGVyYXNlc2l6ZSAoJWQpXG4iLCBjLT53YnVmX3BhZ2VzaXplLCBjLT5zZWN0b3Jfc2l6ZSk7CiAKIAlyZXR1cm4gMDsKIH0KIAogdm9pZCBqZmZzMl9kYXRhZmxhc2hfY2xlYW51cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykgeworI2lmZGVmIENPTkZJR19KRkZTMl9GU19XQlVGX1ZFUklGWQorCWtmcmVlKGMtPndidWZfdmVyaWZ5KTsKKyNlbmRpZgogCWtmcmVlKGMtPndidWYpOwogfQogCmRpZmYgLS1naXQgYS9mcy9qZmZzMi93cml0ZS5jIGIvZnMvamZmczIvd3JpdGUuYwppbmRleCA3NzZmMTNjLi42NjVmY2U5IDEwMDY0NAotLS0gYS9mcy9qZmZzMi93cml0ZS5jCisrKyBiL2ZzL2pmZnMyL3dyaXRlLmMKQEAgLTEzNywxMiArMTM3LDEyIEBACiAJCQkJCQkJICAgICBKRkZTMl9TVU1NQVJZX0lOT0RFX1NJWkUpOwogCQkJfSBlbHNlIHsKIAkJCQkvKiBMb2NraW5nIHBhaW4gKi8KLQkJCQl1cCgmZi0+c2VtKTsKKwkJCQltdXRleF91bmxvY2soJmYtPnNlbSk7CiAJCQkJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CiAKIAkJCQlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlKGMsIHNpemVvZigqcmkpICsgZGF0YWxlbiwgJmR1bW15LAogCQkJCQkJCSAgYWxsb2NfbW9kZSwgSkZGUzJfU1VNTUFSWV9JTk9ERV9TSVpFKTsKLQkJCQlkb3duKCZmLT5zZW0pOworCQkJCW11dGV4X2xvY2soJmYtPnNlbSk7CiAJCQl9CiAKIAkJCWlmICghcmV0KSB7CkBAIC0yODUsMTIgKzI4NSwxMiBAQAogCQkJCQkJCSAgICAgSkZGUzJfU1VNTUFSWV9ESVJFTlRfU0laRShuYW1lbGVuKSk7CiAJCQl9IGVsc2UgewogCQkJCS8qIExvY2tpbmcgcGFpbiAqLwotCQkJCXVwKCZmLT5zZW0pOworCQkJCW11dGV4X3VubG9jaygmZi0+c2VtKTsKIAkJCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKIAogCQkJCXJldCA9IGpmZnMyX3Jlc2VydmVfc3BhY2UoYywgc2l6ZW9mKCpyZCkgKyBuYW1lbGVuLCAmZHVtbXksCiAJCQkJCQkJICBhbGxvY19tb2RlLCBKRkZTMl9TVU1NQVJZX0RJUkVOVF9TSVpFKG5hbWVsZW4pKTsKLQkJCQlkb3duKCZmLT5zZW0pOworCQkJCW11dGV4X2xvY2soJmYtPnNlbSk7CiAJCQl9CiAKIAkJCWlmICghcmV0KSB7CkBAIC0zNTMsNyArMzUzLDcgQEAKIAkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9yZXNlcnZlX3NwYWNlIHJldHVybmVkICVkXG4iLCByZXQpKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWRvd24oJmYtPnNlbSk7CisJCW11dGV4X2xvY2soJmYtPnNlbSk7CiAJCWRhdGFsZW4gPSBtaW5fdCh1aW50MzJfdCwgd3JpdGVsZW4sIFBBR0VfQ0FDSEVfU0laRSAtIChvZmZzZXQgJiAoUEFHRV9DQUNIRV9TSVpFLTEpKSk7CiAJCWNkYXRhbGVuID0gbWluX3QodWludDMyX3QsIGFsbG9jbGVuIC0gc2l6ZW9mKCpyaSksIGRhdGFsZW4pOwogCkBAIC0zODEsNyArMzgxLDcgQEAKIAogCQlpZiAoSVNfRVJSKGZuKSkgewogCQkJcmV0ID0gUFRSX0VSUihmbik7Ci0JCQl1cCgmZi0+c2VtKTsKKwkJCW11dGV4X3VubG9jaygmZi0+c2VtKTsKIAkJCWpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKGMpOwogCQkJaWYgKCFyZXRyaWVkKSB7CiAJCQkJLyogV3JpdGUgZXJyb3IgdG8gYmUgcmV0cmllZCAqLwpAQCAtNDAzLDExICs0MDMsMTEgQEAKIAkJCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCBmbi0+cmF3KTsKIAkJCWpmZnMyX2ZyZWVfZnVsbF9kbm9kZShmbik7CiAKLQkJCXVwKCZmLT5zZW0pOworCQkJbXV0ZXhfdW5sb2NrKCZmLT5zZW0pOwogCQkJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CiAJCQlicmVhazsKIAkJfQotCQl1cCgmZi0+c2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZmLT5zZW0pOwogCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKIAkJaWYgKCFkYXRhbGVuKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJFZXAuIFdlIGRpZG4ndCBhY3R1YWxseSB3cml0ZSBhbnkgZGF0YSBpbiBqZmZzMl93cml0ZV9pbm9kZV9yYW5nZSgpXG4iKTsKQEAgLTQzOSw3ICs0MzksNyBAQAogCQkJCUpGRlMyX1NVTU1BUllfSU5PREVfU0laRSk7CiAJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2RvX2NyZWF0ZSgpOiByZXNlcnZlZCAweCV4IGJ5dGVzXG4iLCBhbGxvY2xlbikpOwogCWlmIChyZXQpIHsKLQkJdXAoJmYtPnNlbSk7CisJCW11dGV4X3VubG9jaygmZi0+c2VtKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTQ1NCw3ICs0NTQsNyBAQAogCWlmIChJU19FUlIoZm4pKSB7CiAJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl93cml0ZV9kbm9kZSgpIGZhaWxlZFxuIikpOwogCQkvKiBFZWVrLiBXYXZlIGJ5ZSBieWUgKi8KLQkJdXAoJmYtPnNlbSk7CisJCW11dGV4X3VubG9jaygmZi0+c2VtKTsKIAkJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CiAJCXJldHVybiBQVFJfRVJSKGZuKTsKIAl9CkBAIC00NjMsNyArNDYzLDcgQEAKIAkqLwogCWYtPm1ldGFkYXRhID0gZm47CiAKLQl1cCgmZi0+c2VtKTsKKwltdXRleF91bmxvY2soJmYtPnNlbSk7CiAJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CiAKIAlyZXQgPSBqZmZzMl9pbml0X3NlY3VyaXR5KCZmLT52ZnNfaW5vZGUsICZkaXJfZi0+dmZzX2lub2RlKTsKQEAgLTQ4OSw3ICs0ODksNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlkb3duKCZkaXJfZi0+c2VtKTsKKwltdXRleF9sb2NrKCZkaXJfZi0+c2VtKTsKIAogCXJkLT5tYWdpYyA9IGNwdV90b19qZTE2KEpGRlMyX01BR0lDX0JJVE1BU0spOwogCXJkLT5ub2RldHlwZSA9IGNwdV90b19qZTE2KEpGRlMyX05PREVUWVBFX0RJUkVOVCk7CkBAIC01MTMsNyArNTEzLDcgQEAKIAkJLyogZGlyZW50IGZhaWxlZCB0byB3cml0ZS4gRGVsZXRlIHRoZSBpbm9kZSBub3JtYWxseQogCQkgICBhcyBpZiBpdCB3ZXJlIHRoZSBmaW5hbCB1bmxpbmsoKSAqLwogCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKLQkJdXAoJmRpcl9mLT5zZW0pOworCQltdXRleF91bmxvY2soJmRpcl9mLT5zZW0pOwogCQlyZXR1cm4gUFRSX0VSUihmZCk7CiAJfQogCkBAIC01MjIsNyArNTIyLDcgQEAKIAlqZmZzMl9hZGRfZmRfdG9fbGlzdChjLCBmZCwgJmRpcl9mLT5kZW50cyk7CiAKIAlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKLQl1cCgmZGlyX2YtPnNlbSk7CisJbXV0ZXhfdW5sb2NrKCZkaXJfZi0+c2VtKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTUxLDcgKzU1MSw3IEBACiAJCQlyZXR1cm4gcmV0OwogCQl9CiAKLQkJZG93bigmZGlyX2YtPnNlbSk7CisJCW11dGV4X2xvY2soJmRpcl9mLT5zZW0pOwogCiAJCS8qIEJ1aWxkIGEgZGVsZXRpb24gbm9kZSAqLwogCQlyZC0+bWFnaWMgPSBjcHVfdG9famUxNihKRkZTMl9NQUdJQ19CSVRNQVNLKTsKQEAgLTU3NCwyMSArNTc0LDIxIEBACiAKIAkJaWYgKElTX0VSUihmZCkpIHsKIAkJCWpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKGMpOwotCQkJdXAoJmRpcl9mLT5zZW0pOworCQkJbXV0ZXhfdW5sb2NrKCZkaXJfZi0+c2VtKTsKIAkJCXJldHVybiBQVFJfRVJSKGZkKTsKIAkJfQogCiAJCS8qIEZpbGUgaXQuIFRoaXMgd2lsbCBtYXJrIHRoZSBvbGQgb25lIG9ic29sZXRlLiAqLwogCQlqZmZzMl9hZGRfZmRfdG9fbGlzdChjLCBmZCwgJmRpcl9mLT5kZW50cyk7Ci0JCXVwKCZkaXJfZi0+c2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZkaXJfZi0+c2VtKTsKIAl9IGVsc2UgewotCQlzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmZkID0gZGlyX2YtPmRlbnRzOwogCQl1aW50MzJfdCBuaGFzaCA9IGZ1bGxfbmFtZV9oYXNoKG5hbWUsIG5hbWVsZW4pOwogCisJCWZkID0gZGlyX2YtPmRlbnRzOwogCQkvKiBXZSBkb24ndCBhY3R1YWxseSB3YW50IHRvIHJlc2VydmUgYW55IHNwYWNlLCBidXQgd2UgZG8KIAkJICAgd2FudCB0byBiZSBob2xkaW5nIHRoZSBhbGxvY19zZW0gd2hlbiB3ZSB3cml0ZSB0byBmbGFzaCAqLwotCQlkb3duKCZjLT5hbGxvY19zZW0pOwotCQlkb3duKCZkaXJfZi0+c2VtKTsKKwkJbXV0ZXhfbG9jaygmYy0+YWxsb2Nfc2VtKTsKKwkJbXV0ZXhfbG9jaygmZGlyX2YtPnNlbSk7CiAKIAkJZm9yIChmZCA9IGRpcl9mLT5kZW50czsgZmQ7IGZkID0gZmQtPm5leHQpIHsKIAkJCWlmIChmZC0+bmhhc2ggPT0gbmhhc2ggJiYKQEAgLTYwNyw3ICs2MDcsNyBAQAogCQkJCWJyZWFrOwogCQkJfQogCQl9Ci0JCXVwKCZkaXJfZi0+c2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZkaXJfZi0+c2VtKTsKIAl9CiAKIAkvKiBkZWFkX2YgaXMgTlVMTCBpZiB0aGlzIHdhcyBhIHJlbmFtZSBub3QgYSByZWFsIHVubGluayAqLwpAQCAtNjE1LDcgKzYxNSw3IEBACiAJICAgcG9pbnRpbmcgdG8gYW4gaW5vZGUgd2hpY2ggZGlkbid0IGV4aXN0LiAqLwogCWlmIChkZWFkX2YgJiYgZGVhZF9mLT5pbm9jYWNoZSkgewogCi0JCWRvd24oJmRlYWRfZi0+c2VtKTsKKwkJbXV0ZXhfbG9jaygmZGVhZF9mLT5zZW0pOwogCiAJCWlmIChTX0lTRElSKE9GTklfRURPTklfMlNGRkooZGVhZF9mKS0+aV9tb2RlKSkgewogCQkJd2hpbGUgKGRlYWRfZi0+ZGVudHMpIHsKQEAgLTYzOSw3ICs2MzksNyBAQAogCiAJCWRlYWRfZi0+aW5vY2FjaGUtPm5saW5rLS07CiAJCS8qIE5COiBDYWxsZXIgbXVzdCBzZXQgaW5vZGUgbmxpbmsgaWYgYXBwcm9wcmlhdGUgKi8KLQkJdXAoJmRlYWRfZi0+c2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZWFkX2YtPnNlbSk7CiAJfQogCiAJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CkBAIC02NjYsNyArNjY2LDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlkb3duKCZkaXJfZi0+c2VtKTsKKwltdXRleF9sb2NrKCZkaXJfZi0+c2VtKTsKIAogCS8qIEJ1aWxkIGEgZGVsZXRpb24gbm9kZSAqLwogCXJkLT5tYWdpYyA9IGNwdV90b19qZTE2KEpGRlMyX01BR0lDX0JJVE1BU0spOwpAQCAtNjkxLDcgKzY5MSw3IEBACiAKIAlpZiAoSVNfRVJSKGZkKSkgewogCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKLQkJdXAoJmRpcl9mLT5zZW0pOworCQltdXRleF91bmxvY2soJmRpcl9mLT5zZW0pOwogCQlyZXR1cm4gUFRSX0VSUihmZCk7CiAJfQogCkBAIC02OTksNyArNjk5LDcgQEAKIAlqZmZzMl9hZGRfZmRfdG9fbGlzdChjLCBmZCwgJmRpcl9mLT5kZW50cyk7CiAKIAlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKLQl1cCgmZGlyX2YtPnNlbSk7CisJbXV0ZXhfdW5sb2NrKCZkaXJfZi0+c2VtKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvbG9ja2Qvc3ZjbG9jay5jIGIvZnMvbG9ja2Qvc3ZjbG9jay5jCmluZGV4IDFmMTIyYzEuLjRkODE1NTMgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL3N2Y2xvY2suYworKysgYi9mcy9sb2NrZC9zdmNsb2NrLmMKQEAgLTYzMiw3ICs2MzIsNyBAQAogCQlibG9jay0+Yl9mbGFncyB8PSBCX1RJTUVEX09VVDsKIAlpZiAoY29uZikgewogCQlpZiAoYmxvY2stPmJfZmwpCi0JCQlsb2Nrc19jb3B5X2xvY2soYmxvY2stPmJfZmwsIGNvbmYpOworCQkJX19sb2Nrc19jb3B5X2xvY2soYmxvY2stPmJfZmwsIGNvbmYpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZnMvbG9ja2Qvc3Zjc3Vicy5jIGIvZnMvbG9ja2Qvc3Zjc3Vicy5jCmluZGV4IGRiYmVmYmMuLmQxYzQ4YjUgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL3N2Y3N1YnMuYworKysgYi9mcy9sb2NrZC9zdmNzdWJzLmMKQEAgLTE4LDYgKzE4LDggQEAKICNpbmNsdWRlIDxsaW51eC9sb2NrZC9sb2NrZC5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkL3NoYXJlLmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2Qvc21faW50ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogCiAjZGVmaW5lIE5MTURCR19GQUNJTElUWQkJTkxNREJHX1NWQ1NVQlMKIApAQCAtMTk0LDYgKzE5NiwxMiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50CitubG1zdmNfYWx3YXlzX21hdGNoKHZvaWQgKmR1bW15MSwgc3RydWN0IG5sbV9ob3N0ICpkdW1teTIpCit7CisJcmV0dXJuIDE7Cit9CisKIC8qCiAgKiBJbnNwZWN0IGEgc2luZ2xlIGZpbGUKICAqLwpAQCAtMjMwLDcgKzIzOCw4IEBACiAgKiBMb29wIG92ZXIgYWxsIGZpbGVzIGluIHRoZSBmaWxlIHRhYmxlLgogICovCiBzdGF0aWMgaW50Ci1ubG1fdHJhdmVyc2VfZmlsZXMoc3RydWN0IG5sbV9ob3N0ICpob3N0LCBubG1faG9zdF9tYXRjaF9mbl90IG1hdGNoKQorbmxtX3RyYXZlcnNlX2ZpbGVzKHZvaWQgKmRhdGEsIG5sbV9ob3N0X21hdGNoX2ZuX3QgbWF0Y2gsCisJCWludCAoKmlzX2ZhaWxvdmVyX2ZpbGUpKHZvaWQgKmRhdGEsIHN0cnVjdCBubG1fZmlsZSAqZmlsZSkpCiB7CiAJc3RydWN0IGhsaXN0X25vZGUgKnBvcywgKm5leHQ7CiAJc3RydWN0IG5sbV9maWxlCSpmaWxlOwpAQCAtMjM5LDEyICsyNDgsMTQgQEAKIAltdXRleF9sb2NrKCZubG1fZmlsZV9tdXRleCk7CiAJZm9yIChpID0gMDsgaSA8IEZJTEVfTlJIQVNIOyBpKyspIHsKIAkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmaWxlLCBwb3MsIG5leHQsICZubG1fZmlsZXNbaV0sIGZfbGlzdCkgeworCQkJaWYgKGlzX2ZhaWxvdmVyX2ZpbGUgJiYgIWlzX2ZhaWxvdmVyX2ZpbGUoZGF0YSwgZmlsZSkpCisJCQkJY29udGludWU7CiAJCQlmaWxlLT5mX2NvdW50Kys7CiAJCQltdXRleF91bmxvY2soJm5sbV9maWxlX211dGV4KTsKIAogCQkJLyogVHJhdmVyc2UgbG9ja3MsIGJsb2NrcyBhbmQgc2hhcmVzIG9mIHRoaXMgZmlsZQogCQkJICogYW5kIHVwZGF0ZSBmaWxlLT5mX2xvY2tzIGNvdW50ICovCi0JCQlpZiAobmxtX2luc3BlY3RfZmlsZShob3N0LCBmaWxlLCBtYXRjaCkpCisJCQlpZiAobmxtX2luc3BlY3RfZmlsZShkYXRhLCBmaWxlLCBtYXRjaCkpCiAJCQkJcmV0ID0gMTsKIAogCQkJbXV0ZXhfbG9jaygmbmxtX2ZpbGVfbXV0ZXgpOwpAQCAtMzAzLDIxICszMTQsMjcgQEAKICAqCVVzZWQgYnkgbmxtc3ZjX2ludmFsaWRhdGVfYWxsCiAgKi8KIHN0YXRpYyBpbnQKLW5sbXN2Y19tYXJrX2hvc3Qoc3RydWN0IG5sbV9ob3N0ICpob3N0LCBzdHJ1Y3QgbmxtX2hvc3QgKmR1bW15KQorbmxtc3ZjX21hcmtfaG9zdCh2b2lkICpkYXRhLCBzdHJ1Y3QgbmxtX2hvc3QgKmR1bW15KQogeworCXN0cnVjdCBubG1faG9zdCAqaG9zdCA9IGRhdGE7CisKIAlob3N0LT5oX2ludXNlID0gMTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAotbmxtc3ZjX3NhbWVfaG9zdChzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QsIHN0cnVjdCBubG1faG9zdCAqb3RoZXIpCitubG1zdmNfc2FtZV9ob3N0KHZvaWQgKmRhdGEsIHN0cnVjdCBubG1faG9zdCAqb3RoZXIpCiB7CisJc3RydWN0IG5sbV9ob3N0ICpob3N0ID0gZGF0YTsKKwogCXJldHVybiBob3N0ID09IG90aGVyOwogfQogCiBzdGF0aWMgaW50Ci1ubG1zdmNfaXNfY2xpZW50KHN0cnVjdCBubG1faG9zdCAqaG9zdCwgc3RydWN0IG5sbV9ob3N0ICpkdW1teSkKK25sbXN2Y19pc19jbGllbnQodm9pZCAqZGF0YSwgc3RydWN0IG5sbV9ob3N0ICpkdW1teSkKIHsKKwlzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QgPSBkYXRhOworCiAJaWYgKGhvc3QtPmhfc2VydmVyKSB7CiAJCS8qIHdlIGFyZSBkZXN0cm95aW5nIGxvY2tzIGV2ZW4gdGhvdWdoIHRoZSBjbGllbnQKIAkJICogaGFzbid0IGFza2VkIHVzIHRvbywgc28gZG9uJ3QgdW5tb25pdG9yIHRoZQpAQCAtMzM3LDcgKzM1NCw3IEBACiBubG1zdmNfbWFya19yZXNvdXJjZXModm9pZCkKIHsKIAlkcHJpbnRrKCJsb2NrZDogbmxtc3ZjX21hcmtfcmVzb3VyY2VzXG4iKTsKLQlubG1fdHJhdmVyc2VfZmlsZXMoTlVMTCwgbmxtc3ZjX21hcmtfaG9zdCk7CisJbmxtX3RyYXZlcnNlX2ZpbGVzKE5VTEwsIG5sbXN2Y19tYXJrX2hvc3QsIE5VTEwpOwogfQogCiAvKgpAQCAtMzQ4LDcgKzM2NSw3IEBACiB7CiAJZHByaW50aygibG9ja2Q6IG5sbXN2Y19mcmVlX2hvc3RfcmVzb3VyY2VzXG4iKTsKIAotCWlmIChubG1fdHJhdmVyc2VfZmlsZXMoaG9zdCwgbmxtc3ZjX3NhbWVfaG9zdCkpIHsKKwlpZiAobmxtX3RyYXZlcnNlX2ZpbGVzKGhvc3QsIG5sbXN2Y19zYW1lX2hvc3QsIE5VTEwpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCSJsb2NrZDogY291bGRuJ3QgcmVtb3ZlIGFsbCBsb2NrcyBoZWxkIGJ5ICVzXG4iLAogCQkJaG9zdC0+aF9uYW1lKTsKQEAgLTM2OCw1ICszODUsNDEgQEAKIAkgKiB0dXJuLCB3aGljaCBpcyBhYm91dCBhcyBpbmVmZmljaWVudCBhcyBpdCBnZXRzLgogCSAqIE5vdyB3ZSBqdXN0IGRvIGl0IG9uY2UgaW4gbmxtX3RyYXZlcnNlX2ZpbGVzLgogCSAqLwotCW5sbV90cmF2ZXJzZV9maWxlcyhOVUxMLCBubG1zdmNfaXNfY2xpZW50KTsKKwlubG1fdHJhdmVyc2VfZmlsZXMoTlVMTCwgbmxtc3ZjX2lzX2NsaWVudCwgTlVMTCk7CiB9CisKK3N0YXRpYyBpbnQKK25sbXN2Y19tYXRjaF9zYih2b2lkICpkYXRhcCwgc3RydWN0IG5sbV9maWxlICpmaWxlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkYXRhcDsKKworCXJldHVybiBzYiA9PSBmaWxlLT5mX2ZpbGUtPmZfcGF0aC5tbnQtPm1udF9zYjsKK30KKworaW50CitubG1zdmNfdW5sb2NrX2FsbF9ieV9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWludCByZXQ7CisKKwlyZXQgPSBubG1fdHJhdmVyc2VfZmlsZXMoc2IsIG5sbXN2Y19hbHdheXNfbWF0Y2gsIG5sbXN2Y19tYXRjaF9zYik7CisJcmV0dXJuIHJldCA/IC1FSU8gOiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmxtc3ZjX3VubG9ja19hbGxfYnlfc2IpOworCitzdGF0aWMgaW50CitubG1zdmNfbWF0Y2hfaXAodm9pZCAqZGF0YXAsIHN0cnVjdCBubG1faG9zdCAqaG9zdCkKK3sKKwlfX2JlMzIgKnNlcnZlcl9hZGRyID0gZGF0YXA7CisKKwlyZXR1cm4gaG9zdC0+aF9zYWRkci5zaW5fYWRkci5zX2FkZHIgPT0gKnNlcnZlcl9hZGRyOworfQorCitpbnQKK25sbXN2Y191bmxvY2tfYWxsX2J5X2lwKF9fYmUzMiBzZXJ2ZXJfYWRkcikKK3sKKwlpbnQgcmV0OworCXJldCA9IG5sbV90cmF2ZXJzZV9maWxlcygmc2VydmVyX2FkZHIsIG5sbXN2Y19tYXRjaF9pcCwgTlVMTCk7CisJcmV0dXJuIHJldCA/IC1FSU8gOiAwOworCit9CitFWFBPUlRfU1lNQk9MX0dQTChubG1zdmNfdW5sb2NrX2FsbF9ieV9pcCk7CmRpZmYgLS1naXQgYS9mcy9sb2Nrcy5jIGIvZnMvbG9ja3MuYwppbmRleCA1OTJmYWFkLi5lMWVhMmZlIDEwMDY0NAotLS0gYS9mcy9sb2Nrcy5jCisrKyBiL2ZzL2xvY2tzLmMKQEAgLTIyNCw3ICsyMjQsNyBAQAogLyoKICAqIEluaXRpYWxpemUgYSBuZXcgbG9jayBmcm9tIGFuIGV4aXN0aW5nIGZpbGVfbG9jayBzdHJ1Y3R1cmUuCiAgKi8KLXN0YXRpYyB2b2lkIF9fbG9ja3NfY29weV9sb2NrKHN0cnVjdCBmaWxlX2xvY2sgKm5ldywgY29uc3Qgc3RydWN0IGZpbGVfbG9jayAqZmwpCit2b2lkIF9fbG9ja3NfY29weV9sb2NrKHN0cnVjdCBmaWxlX2xvY2sgKm5ldywgY29uc3Qgc3RydWN0IGZpbGVfbG9jayAqZmwpCiB7CiAJbmV3LT5mbF9vd25lciA9IGZsLT5mbF9vd25lcjsKIAluZXctPmZsX3BpZCA9IGZsLT5mbF9waWQ7CkBAIC04MzMsNyArODMzLDcgQEAKIAkJCWlmICghcG9zaXhfbG9ja3NfY29uZmxpY3QocmVxdWVzdCwgZmwpKQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKGNvbmZsb2NrKQotCQkJCWxvY2tzX2NvcHlfbG9jayhjb25mbG9jaywgZmwpOworCQkJCV9fbG9ja3NfY29weV9sb2NrKGNvbmZsb2NrLCBmbCk7CiAJCQllcnJvciA9IC1FQUdBSU47CiAJCQlpZiAoIShyZXF1ZXN0LT5mbF9mbGFncyAmIEZMX1NMRUVQKSkKIAkJCQlnb3RvIG91dDsKQEAgLTEzNjcsMTggKzEzNjcsMjAgQEAKIAogCWxlYXNlID0gKmZscDsKIAotCWVycm9yID0gLUVBR0FJTjsKLQlpZiAoKGFyZyA9PSBGX1JETENLKSAmJiAoYXRvbWljX3JlYWQoJmlub2RlLT5pX3dyaXRlY291bnQpID4gMCkpCi0JCWdvdG8gb3V0OwotCWlmICgoYXJnID09IEZfV1JMQ0spCi0JICAgICYmICgoYXRvbWljX3JlYWQoJmRlbnRyeS0+ZF9jb3VudCkgPiAxKQotCQl8fCAoYXRvbWljX3JlYWQoJmlub2RlLT5pX2NvdW50KSA+IDEpKSkKLQkJZ290byBvdXQ7CisJaWYgKGFyZyAhPSBGX1VOTENLKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJbmV3X2ZsID0gbG9ja3NfYWxsb2NfbG9jaygpOworCQlpZiAobmV3X2ZsID09IE5VTEwpCisJCQlnb3RvIG91dDsKIAotCWVycm9yID0gLUVOT01FTTsKLQluZXdfZmwgPSBsb2Nrc19hbGxvY19sb2NrKCk7Ci0JaWYgKG5ld19mbCA9PSBOVUxMKQotCQlnb3RvIG91dDsKKwkJZXJyb3IgPSAtRUFHQUlOOworCQlpZiAoKGFyZyA9PSBGX1JETENLKSAmJiAoYXRvbWljX3JlYWQoJmlub2RlLT5pX3dyaXRlY291bnQpID4gMCkpCisJCQlnb3RvIG91dDsKKwkJaWYgKChhcmcgPT0gRl9XUkxDSykKKwkJICAgICYmICgoYXRvbWljX3JlYWQoJmRlbnRyeS0+ZF9jb3VudCkgPiAxKQorCQkJfHwgKGF0b21pY19yZWFkKCZpbm9kZS0+aV9jb3VudCkgPiAxKSkpCisJCQlnb3RvIG91dDsKKwl9CiAKIAkvKgogCSAqIEF0IHRoaXMgcG9pbnQsIHdlIGtub3cgdGhhdCBpZiB0aGVyZSBpcyBhbiBleGNsdXNpdmUKQEAgLTE0MDQsNiArMTQwNiw3IEBACiAJCQlyZGxlYXNlX2NvdW50Kys7CiAJfQogCisJZXJyb3IgPSAtRUFHQUlOOwogCWlmICgoYXJnID09IEZfUkRMQ0sgJiYgKHdybGVhc2VfY291bnQgPiAwKSkgfHwKIAkgICAgKGFyZyA9PSBGX1dSTENLICYmICgocmRsZWFzZV9jb3VudCArIHdybGVhc2VfY291bnQpID4gMCkpKQogCQlnb3RvIG91dDsKQEAgLTE0OTAsOCArMTQ5Myw3IEBACiBpbnQgZmNudGxfc2V0bGVhc2UodW5zaWduZWQgaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgbG9uZyBhcmcpCiB7CiAJc3RydWN0IGZpbGVfbG9jayBmbCwgKmZscCA9ICZmbDsKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX3BhdGguZGVudHJ5OwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJaW50IGVycm9yOwogCiAJbG9ja3NfaW5pdF9sb2NrKCZmbCk7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRzdGF0ZS5jIGIvZnMvbmZzZC9uZnM0c3RhdGUuYwppbmRleCA1NWRmZGQ3Li44Nzk5Yjg3IDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRzdGF0ZS5jCisrKyBiL2ZzL25mc2QvbmZzNHN0YXRlLmMKQEAgLTI3MTIsOSArMjcxMiw2IEBACiAJKiBOb3RlOiBsb2Nrcy5jIHVzZXMgdGhlIEJLTCB0byBwcm90ZWN0IHRoZSBpbm9kZSdzIGxvY2sgbGlzdC4KIAkqLwogCi0JLyogWFhYPzogSnVzdCB0byBkaXZlcnQgdGhlIGxvY2tzX3JlbGVhc2VfcHJpdmF0ZSBhdCB0aGUgc3RhcnQgb2YKLQkgKiBsb2Nrc19jb3B5X2xvY2s6ICovCi0JbG9ja3NfaW5pdF9sb2NrKCZjb25mbG9jayk7CiAJZXJyID0gdmZzX2xvY2tfZmlsZShmaWxwLCBjbWQsICZmaWxlX2xvY2ssICZjb25mbG9jayk7CiAJc3dpdGNoICgtZXJyKSB7CiAJY2FzZSAwOiAvKiBzdWNjZXNzISAqLwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0eGRyLmMgYi9mcy9uZnNkL25mczR4ZHIuYwppbmRleCAxYmE3YWQ5Li5jNTEzYmJkIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczR4ZHIuYworKysgYi9mcy9uZnNkL25mczR4ZHIuYwpAQCAtMzc2LDIwICszNzYsNiBAQAogCQkJZ290byB4ZHJfZXJyb3I7CiAJCX0KIAl9Ci0JaWYgKGJtdmFsWzFdICYgRkFUVFI0X1dPUkQxX1RJTUVfTUVUQURBVEEpIHsKLQkJLyogV2UgcmVxdWlyZSB0aGUgaGlnaCAzMiBiaXRzIG9mICdzZWNvbmRzJyB0byBiZSAwLCBhbmQgd2UgaWdub3JlCi0JCSAgIGFsbCAzMiBiaXRzIG9mICduc2Vjb25kcycuICovCi0JCVJFQURfQlVGKDEyKTsKLQkJbGVuICs9IDEyOwotCQlSRUFEMzIoZHVtbXkzMik7Ci0JCWlmIChkdW1teTMyKQotCQkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKLQkJUkVBRDMyKGlhdHRyLT5pYV9jdGltZS50dl9zZWMpOwotCQlSRUFEMzIoaWF0dHItPmlhX2N0aW1lLnR2X25zZWMpOwotCQlpZiAoaWF0dHItPmlhX2N0aW1lLnR2X25zZWMgPj0gKHUzMikxMDAwMDAwMDAwKQotCQkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKLQkJaWF0dHItPmlhX3ZhbGlkIHw9IEFUVFJfQ1RJTUU7Ci0JfQogCWlmIChibXZhbFsxXSAmIEZBVFRSNF9XT1JEMV9USU1FX01PRElGWV9TRVQpIHsKIAkJUkVBRF9CVUYoNCk7CiAJCWxlbiArPSA0OwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNjdGwuYyBiL2ZzL25mc2QvbmZzY3RsLmMKaW5kZXggNjEzYmNiOC4uNDJmMzgyMCAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNjdGwuYworKysgYi9mcy9uZnNkL25mc2N0bC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CkBAIC0zNSw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbmZzZC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L25mc2QveGRyLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzZC9zeXNjYWxsLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2QvbG9ja2QuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KQEAgLTUzLDYgKzU1LDggQEAKIAlORlNEX0dldGZzLAogCU5GU0RfTGlzdCwKIAlORlNEX0ZoLAorCU5GU0RfRk9fVW5sb2NrSVAsCisJTkZTRF9GT19VbmxvY2tGUywKIAlORlNEX1RocmVhZHMsCiAJTkZTRF9Qb29sX1RocmVhZHMsCiAJTkZTRF9WZXJzaW9ucywKQEAgLTg5LDYgKzkzLDkgQEAKIHN0YXRpYyBzc2l6ZV90IHdyaXRlX3JlY292ZXJ5ZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKICNlbmRpZgogCitzdGF0aWMgc3NpemVfdCBmYWlsb3Zlcl91bmxvY2tfaXAoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOworc3RhdGljIHNzaXplX3QgZmFpbG92ZXJfdW5sb2NrX2ZzKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKKwogc3RhdGljIHNzaXplX3QgKCp3cml0ZV9vcFtdKShzdHJ1Y3QgZmlsZSAqLCBjaGFyICosIHNpemVfdCkgPSB7CiAJW05GU0RfU3ZjXSA9IHdyaXRlX3N2YywKIAlbTkZTRF9BZGRdID0gd3JpdGVfYWRkLApAQCAtOTgsNiArMTA1LDggQEAKIAlbTkZTRF9HZXRmZF0gPSB3cml0ZV9nZXRmZCwKIAlbTkZTRF9HZXRmc10gPSB3cml0ZV9nZXRmcywKIAlbTkZTRF9GaF0gPSB3cml0ZV9maWxlaGFuZGxlLAorCVtORlNEX0ZPX1VubG9ja0lQXSA9IGZhaWxvdmVyX3VubG9ja19pcCwKKwlbTkZTRF9GT19VbmxvY2tGU10gPSBmYWlsb3Zlcl91bmxvY2tfZnMsCiAJW05GU0RfVGhyZWFkc10gPSB3cml0ZV90aHJlYWRzLAogCVtORlNEX1Bvb2xfVGhyZWFkc10gPSB3cml0ZV9wb29sX3RocmVhZHMsCiAJW05GU0RfVmVyc2lvbnNdID0gd3JpdGVfdmVyc2lvbnMsCkBAIC0yOTgsNiArMzA3LDU4IEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIHNzaXplX3QgZmFpbG92ZXJfdW5sb2NrX2lwKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCV9fYmUzMiBzZXJ2ZXJfaXA7CisJY2hhciAqZm9fcGF0aCwgYzsKKwlpbnQgYjEsIGIyLCBiMywgYjQ7CisKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlpZiAoc2l6ZSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChidWZbc2l6ZS0xXSAhPSAnXG4nKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvX3BhdGggPSBidWY7CisJaWYgKHF3b3JkX2dldCgmYnVmLCBmb19wYXRoLCBzaXplKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogZ2V0IGlwdjQgYWRkcmVzcyAqLworCWlmIChzc2NhbmYoZm9fcGF0aCwgIiV1LiV1LiV1LiV1JWMiLCAmYjEsICZiMiwgJmIzLCAmYjQsICZjKSAhPSA0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzZXJ2ZXJfaXAgPSBodG9ubCgoKCgoKGIxPDw4KXxiMik8PDgpfGIzKTw8OCl8YjQpOworCisJcmV0dXJuIG5sbXN2Y191bmxvY2tfYWxsX2J5X2lwKHNlcnZlcl9pcCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZhaWxvdmVyX3VubG9ja19mcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWNoYXIgKmZvX3BhdGg7CisJaW50IGVycm9yOworCisJLyogc2FuaXR5IGNoZWNrICovCisJaWYgKHNpemUgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYnVmW3NpemUtMV0gIT0gJ1xuJykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb19wYXRoID0gYnVmOworCWlmIChxd29yZF9nZXQoJmJ1ZiwgZm9fcGF0aCwgc2l6ZSkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVycm9yID0gcGF0aF9sb29rdXAoZm9fcGF0aCwgMCwgJm5kKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWVycm9yID0gbmxtc3ZjX3VubG9ja19hbGxfYnlfc2IobmQucGF0aC5tbnQtPm1udF9zYik7CisKKwlwYXRoX3B1dCgmbmQucGF0aCk7CisJcmV0dXJuIGVycm9yOworfQorCiBzdGF0aWMgc3NpemVfdCB3cml0ZV9maWxlaGFuZGxlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewogCS8qIHJlcXVlc3QgaXM6CkBAIC03MDAsNiArNzYxLDEwIEBACiAJCVtORlNEX0dldGZkXSA9IHsiLmdldGZkIiwgJnRyYW5zYWN0aW9uX29wcywgU19JV1VTUnxTX0lSVVNSfSwKIAkJW05GU0RfR2V0ZnNdID0geyIuZ2V0ZnMiLCAmdHJhbnNhY3Rpb25fb3BzLCBTX0lXVVNSfFNfSVJVU1J9LAogCQlbTkZTRF9MaXN0XSA9IHsiZXhwb3J0cyIsICZleHBvcnRzX29wZXJhdGlvbnMsIFNfSVJVR099LAorCQlbTkZTRF9GT19VbmxvY2tJUF0gPSB7InVubG9ja19pcCIsCisJCQkJCSZ0cmFuc2FjdGlvbl9vcHMsIFNfSVdVU1J8U19JUlVTUn0sCisJCVtORlNEX0ZPX1VubG9ja0ZTXSA9IHsidW5sb2NrX2ZpbGVzeXN0ZW0iLAorCQkJCQkmdHJhbnNhY3Rpb25fb3BzLCBTX0lXVVNSfFNfSVJVU1J9LAogCQlbTkZTRF9GaF0gPSB7ImZpbGVoYW5kbGUiLCAmdHJhbnNhY3Rpb25fb3BzLCBTX0lXVVNSfFNfSVJVU1J9LAogCQlbTkZTRF9UaHJlYWRzXSA9IHsidGhyZWFkcyIsICZ0cmFuc2FjdGlvbl9vcHMsIFNfSVdVU1J8U19JUlVTUn0sCiAJCVtORlNEX1Bvb2xfVGhyZWFkc10gPSB7InBvb2xfdGhyZWFkcyIsICZ0cmFuc2FjdGlvbl9vcHMsIFNfSVdVU1J8U19JUlVTUn0sCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvcHhhM3h4X25hbmQuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9weGEzeHhfbmFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYTg5MzcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvcHhhM3h4X25hbmQuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9fQVNNX0FSQ0hfUFhBM1hYX05BTkRfSAorI2RlZmluZSBfX0FTTV9BUkNIX1BYQTNYWF9OQU5EX0gKKworI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorCitzdHJ1Y3QgcHhhM3h4X25hbmRfcGxhdGZvcm1fZGF0YSB7CisKKwkvKiB0aGUgZGF0YSBmbGFzaCBidXMgaXMgc2hhcmVkIGJldHdlZW4gdGhlIFN0YXRpYyBNZW1vcnkKKwkgKiBDb250cm9sbGVyIGFuZCB0aGUgRGF0YSBGbGFzaCBDb250cm9sbGVyLCAgdGhlIGFyYml0ZXIKKwkgKiBjb250cm9scyB0aGUgb3duZXJzaGlwIG9mIHRoZSBidXMKKwkgKi8KKwlpbnQJZW5hYmxlX2FyYml0ZXI7CisKKwlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7CisJdW5zaWduZWQgaW50CW5yX3BhcnRzOworfTsKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX1BYQTNYWF9OQU5EX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9wbGF0LXMzYy9uYW5kLmggYi9pbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MvbmFuZC5oCmluZGV4IDg4MTZmN2YuLmFkNmJiZTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9wbGF0LXMzYy9uYW5kLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL3BsYXQtczNjL25hbmQuaApAQCAtMjIsMTEgKzIyLDE0IEBACiAqLwogCiBzdHJ1Y3QgczNjMjQxMF9uYW5kX3NldCB7CisJdW5zaWduZWQgaW50CQlkaXNhYmxlX2VjYyA6IDE7CisKIAlpbnQJCQlucl9jaGlwczsKIAlpbnQJCQlucl9wYXJ0aXRpb25zOwogCWNoYXIJCQkqbmFtZTsKIAlpbnQJCQkqbnJfbWFwOwogCXN0cnVjdCBtdGRfcGFydGl0aW9uCSpwYXJ0aXRpb25zOworCXN0cnVjdCBuYW5kX2VjY2xheW91dAkqZWNjX2xheW91dDsKIH07CiAKIHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX25hbmQgewpAQCAtMzYsNiArMzksOCBAQAogCWludAl0d3JwaDA7CS8qIGFjdGl2ZSB0aW1lIGZvciBuV0Uvbk9FICovCiAJaW50CXR3cnBoMTsJLyogdGltZSBmb3IgcmVsZWFzZSBDTEUvQUxFIGZyb20gbldFL25PRSBpbmFjdGl2ZSAqLwogCisJdW5zaWduZWQgaW50CWlnbm9yZV91bnNldF9lY2MgOiAxOworCiAJaW50CQkJbnJfc2V0czsKIAlzdHJ1Y3QgczNjMjQxMF9uYW5kX3NldCAqc2V0czsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2ZpeG1hcC5oIGIvaW5jbHVkZS9hc20teDg2L2ZpeG1hcC5oCmluZGV4IDM4MmViMjcuLjViZDIwNjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9maXhtYXAuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvZml4bWFwLmgKQEAgLTEsNSArMSwxMyBAQAorI2lmbmRlZiBfQVNNX0ZJWE1BUF9ICisjZGVmaW5lIF9BU01fRklYTUFQX0gKKwogI2lmZGVmIENPTkZJR19YODZfMzIKICMgaW5jbHVkZSAiZml4bWFwXzMyLmgiCiAjZWxzZQogIyBpbmNsdWRlICJmaXhtYXBfNjQuaCIKICNlbmRpZgorCisjZGVmaW5lIGNsZWFyX2ZpeG1hcChpZHgpCQkJXAorCV9fc2V0X2ZpeG1hcChpZHgsIDAsIF9fcGdwcm90KDApKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9maXhtYXBfMzIuaCBiL2luY2x1ZGUvYXNtLXg4Ni9maXhtYXBfMzIuaAppbmRleCBlYjE2NjUxLi40Yjk2MTQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvZml4bWFwXzMyLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2ZpeG1hcF8zMi5oCkBAIC0xMCw4ICsxMCw4IEBACiAgKiBTdXBwb3J0IG9mIEJJR01FTSBhZGRlZCBieSBHZXJoYXJkIFdpY2hlcnQsIFNpZW1lbnMgQUcsIEp1bHkgMTk5OQogICovCiAKLSNpZm5kZWYgX0FTTV9GSVhNQVBfSAotI2RlZmluZSBfQVNNX0ZJWE1BUF9ICisjaWZuZGVmIF9BU01fRklYTUFQXzMyX0gKKyNkZWZpbmUgX0FTTV9GSVhNQVBfMzJfSAogCiAKIC8qIHVzZWQgYnkgdm1hbGxvYy5jLCB2c3lzY2FsbC5sZHMuUy4KQEAgLTEyMSw5ICsxMjEsNiBAQAogI2RlZmluZSBzZXRfZml4bWFwX25vY2FjaGUoaWR4LCBwaHlzKQkJCVwKIAlfX3NldF9maXhtYXAoaWR4LCBwaHlzLCBQQUdFX0tFUk5FTF9OT0NBQ0hFKQogCi0jZGVmaW5lIGNsZWFyX2ZpeG1hcChpZHgpCQkJXAotCV9fc2V0X2ZpeG1hcChpZHgsIDAsIF9fcGdwcm90KDApKQotCiAjZGVmaW5lIEZJWEFERFJfVE9QCSgodW5zaWduZWQgbG9uZylfX0ZJWEFERFJfVE9QKQogCiAjZGVmaW5lIF9fRklYQUREUl9TSVpFCShfX2VuZF9vZl9wZXJtYW5lbnRfZml4ZWRfYWRkcmVzc2VzIDw8IFBBR0VfU0hJRlQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvZml4bWFwXzY0LmggYi9pbmNsdWRlL2FzbS14ODYvZml4bWFwXzY0LmgKaW5kZXggZjNkNzY4NS4uMzU1ZDI2YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2ZpeG1hcF82NC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9maXhtYXBfNjQuaApAQCAtOCw4ICs4LDggQEAKICAqIENvcHlyaWdodCAoQykgMTk5OCBJbmdvIE1vbG5hcgogICovCiAKLSNpZm5kZWYgX0FTTV9GSVhNQVBfSAotI2RlZmluZSBfQVNNX0ZJWE1BUF9ICisjaWZuZGVmIF9BU01fRklYTUFQXzY0X0gKKyNkZWZpbmUgX0FTTV9GSVhNQVBfNjRfSAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8YXNtL2FwaWNkZWYuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9wYXJhdmlydC5oIGIvaW5jbHVkZS9hc20teDg2L3BhcmF2aXJ0LmgKaW5kZXggM2Q0MTkzOS4uMGYxM2I5NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3BhcmF2aXJ0LmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3BhcmF2aXJ0LmgKQEAgLTIyMCwxMSArMjIwLDEzIEBACiAJCQkJIHVuc2lnbmVkIGxvbmcgdmEpOwogCiAJLyogSG9va3MgZm9yIGFsbG9jYXRpbmcvcmVsZWFzaW5nIHBhZ2V0YWJsZSBwYWdlcyAqLwotCXZvaWQgKCphbGxvY19wdCkoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHUzMiBwZm4pOwotCXZvaWQgKCphbGxvY19wZCkoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHUzMiBwZm4pOwotCXZvaWQgKCphbGxvY19wZF9jbG9uZSkodTMyIHBmbiwgdTMyIGNsb25lcGZuLCB1MzIgc3RhcnQsIHUzMiBjb3VudCk7Ci0Jdm9pZCAoKnJlbGVhc2VfcHQpKHUzMiBwZm4pOwotCXZvaWQgKCpyZWxlYXNlX3BkKSh1MzIgcGZuKTsKKwl2b2lkICgqYWxsb2NfcHRlKShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdTMyIHBmbik7CisJdm9pZCAoKmFsbG9jX3BtZCkoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHUzMiBwZm4pOworCXZvaWQgKCphbGxvY19wbWRfY2xvbmUpKHUzMiBwZm4sIHUzMiBjbG9uZXBmbiwgdTMyIHN0YXJ0LCB1MzIgY291bnQpOworCXZvaWQgKCphbGxvY19wdWQpKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1MzIgcGZuKTsKKwl2b2lkICgqcmVsZWFzZV9wdGUpKHUzMiBwZm4pOworCXZvaWQgKCpyZWxlYXNlX3BtZCkodTMyIHBmbik7CisJdm9pZCAoKnJlbGVhc2VfcHVkKSh1MzIgcGZuKTsKIAogCS8qIFBhZ2V0YWJsZSBtYW5pcHVsYXRpb24gZnVuY3Rpb25zICovCiAJdm9pZCAoKnNldF9wdGUpKHB0ZV90ICpwdGVwLCBwdGVfdCBwdGV2YWwpOwpAQCAtOTEwLDI4ICs5MTIsMzcgQEAKIAlQVk9QX1ZDQUxMMyhwdl9tbXVfb3BzLmZsdXNoX3RsYl9vdGhlcnMsICZjcHVtYXNrLCBtbSwgdmEpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGFyYXZpcnRfYWxsb2NfcHQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIHBmbikKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYXJhdmlydF9hbGxvY19wdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIHBmbikKIHsKLQlQVk9QX1ZDQUxMMihwdl9tbXVfb3BzLmFsbG9jX3B0LCBtbSwgcGZuKTsKKwlQVk9QX1ZDQUxMMihwdl9tbXVfb3BzLmFsbG9jX3B0ZSwgbW0sIHBmbik7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgcGFyYXZpcnRfcmVsZWFzZV9wdCh1bnNpZ25lZCBwZm4pCitzdGF0aWMgaW5saW5lIHZvaWQgcGFyYXZpcnRfcmVsZWFzZV9wdGUodW5zaWduZWQgcGZuKQogewotCVBWT1BfVkNBTEwxKHB2X21tdV9vcHMucmVsZWFzZV9wdCwgcGZuKTsKKwlQVk9QX1ZDQUxMMShwdl9tbXVfb3BzLnJlbGVhc2VfcHRlLCBwZm4pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGFyYXZpcnRfYWxsb2NfcGQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIHBmbikKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYXJhdmlydF9hbGxvY19wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIHBmbikKIHsKLQlQVk9QX1ZDQUxMMihwdl9tbXVfb3BzLmFsbG9jX3BkLCBtbSwgcGZuKTsKKwlQVk9QX1ZDQUxMMihwdl9tbXVfb3BzLmFsbG9jX3BtZCwgbW0sIHBmbik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwYXJhdmlydF9hbGxvY19wZF9jbG9uZSh1bnNpZ25lZCBwZm4sIHVuc2lnbmVkIGNsb25lcGZuLAotCQkJCQkgICB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgY291bnQpCitzdGF0aWMgaW5saW5lIHZvaWQgcGFyYXZpcnRfYWxsb2NfcG1kX2Nsb25lKHVuc2lnbmVkIHBmbiwgdW5zaWduZWQgY2xvbmVwZm4sCisJCQkJCSAgICB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgY291bnQpCiB7Ci0JUFZPUF9WQ0FMTDQocHZfbW11X29wcy5hbGxvY19wZF9jbG9uZSwgcGZuLCBjbG9uZXBmbiwgc3RhcnQsIGNvdW50KTsKKwlQVk9QX1ZDQUxMNChwdl9tbXVfb3BzLmFsbG9jX3BtZF9jbG9uZSwgcGZuLCBjbG9uZXBmbiwgc3RhcnQsIGNvdW50KTsKIH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwYXJhdmlydF9yZWxlYXNlX3BkKHVuc2lnbmVkIHBmbikKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYXJhdmlydF9yZWxlYXNlX3BtZCh1bnNpZ25lZCBwZm4pCiB7Ci0JUFZPUF9WQ0FMTDEocHZfbW11X29wcy5yZWxlYXNlX3BkLCBwZm4pOworCVBWT1BfVkNBTEwxKHB2X21tdV9vcHMucmVsZWFzZV9wbWQsIHBmbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYXJhdmlydF9hbGxvY19wdWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIHBmbikKK3sKKwlQVk9QX1ZDQUxMMihwdl9tbXVfb3BzLmFsbG9jX3B1ZCwgbW0sIHBmbik7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgcGFyYXZpcnRfcmVsZWFzZV9wdWQodW5zaWduZWQgcGZuKQoreworCVBWT1BfVkNBTEwxKHB2X21tdV9vcHMucmVsZWFzZV9wdWQsIHBmbik7CiB9CiAKICNpZmRlZiBDT05GSUdfSElHSFBURQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3BnYWxsb2MuaCBiL2luY2x1ZGUvYXNtLXg4Ni9wZ2FsbG9jLmgKaW5kZXggNTg4NmVlZC4uOTFlNDY0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3BnYWxsb2MuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvcGdhbGxvYy5oCkBAIC0xLDUgKzEsMTEwIEBACi0jaWZkZWYgQ09ORklHX1g4Nl8zMgotIyBpbmNsdWRlICJwZ2FsbG9jXzMyLmgiCisjaWZuZGVmIF9BU01fWDg2X1BHQUxMT0NfSAorI2RlZmluZSBfQVNNX1g4Nl9QR0FMTE9DX0gKKworI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgkJLyogZm9yIHN0cnVjdCBwYWdlICovCisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorCisjaWZkZWYgQ09ORklHX1BBUkFWSVJUCisjaW5jbHVkZSA8YXNtL3BhcmF2aXJ0Lmg+CiAjZWxzZQotIyBpbmNsdWRlICJwZ2FsbG9jXzY0LmgiCitzdGF0aWMgaW5saW5lIHZvaWQgcGFyYXZpcnRfYWxsb2NfcHRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHBmbikJe30KK3N0YXRpYyBpbmxpbmUgdm9pZCBwYXJhdmlydF9hbGxvY19wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcGZuKQl7fQorc3RhdGljIGlubGluZSB2b2lkIHBhcmF2aXJ0X2FsbG9jX3BtZF9jbG9uZSh1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBjbG9uZXBmbiwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgY291bnQpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgcGFyYXZpcnRfYWxsb2NfcHVkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHBmbikJe30KK3N0YXRpYyBpbmxpbmUgdm9pZCBwYXJhdmlydF9yZWxlYXNlX3B0ZSh1bnNpZ25lZCBsb25nIHBmbikge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBwYXJhdmlydF9yZWxlYXNlX3BtZCh1bnNpZ25lZCBsb25nIHBmbikge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBwYXJhdmlydF9yZWxlYXNlX3B1ZCh1bnNpZ25lZCBsb25nIHBmbikge30KICNlbmRpZgorCisvKgorICogQWxsb2NhdGUgYW5kIGZyZWUgcGFnZSB0YWJsZXMuCisgKi8KK2V4dGVybiBwZ2RfdCAqcGdkX2FsbG9jKHN0cnVjdCBtbV9zdHJ1Y3QgKik7CitleHRlcm4gdm9pZCBwZ2RfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcGdkX3QgKnBnZCk7CisKK2V4dGVybiBwdGVfdCAqcHRlX2FsbG9jX29uZV9rZXJuZWwoc3RydWN0IG1tX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiBwZ3RhYmxlX3QgcHRlX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICosIHVuc2lnbmVkIGxvbmcpOworCisvKiBTaG91bGQgcmVhbGx5IGltcGxlbWVudCBnYyBmb3IgZnJlZSBwYWdlIHRhYmxlIHBhZ2VzLiBUaGlzIGNvdWxkIGJlCisgICBkb25lIHdpdGggYSByZWZlcmVuY2UgY291bnQgaW4gc3RydWN0IHBhZ2UuICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdGVfZnJlZV9rZXJuZWwoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHB0ZV90ICpwdGUpCit7CisJQlVHX09OKCh1bnNpZ25lZCBsb25nKXB0ZSAmIChQQUdFX1NJWkUtMSkpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwdGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBwYWdlICpwdGUpCit7CisJX19mcmVlX3BhZ2UocHRlKTsKK30KKworZXh0ZXJuIHZvaWQgX19wdGVfZnJlZV90bGIoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgc3RydWN0IHBhZ2UgKnB0ZSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbWRfcG9wdWxhdGVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCSAgICAgICBwbWRfdCAqcG1kLCBwdGVfdCAqcHRlKQoreworCXBhcmF2aXJ0X2FsbG9jX3B0ZShtbSwgX19wYShwdGUpID4+IFBBR0VfU0hJRlQpOworCXNldF9wbWQocG1kLCBfX3BtZChfX3BhKHB0ZSkgfCBfUEFHRV9UQUJMRSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcG1kX3BvcHVsYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwbWRfdCAqcG1kLAorCQkJCXN0cnVjdCBwYWdlICpwdGUpCit7CisJdW5zaWduZWQgbG9uZyBwZm4gPSBwYWdlX3RvX3BmbihwdGUpOworCisJcGFyYXZpcnRfYWxsb2NfcHRlKG1tLCBwZm4pOworCXNldF9wbWQocG1kLCBfX3BtZCgoKHB0ZXZhbF90KXBmbiA8PCBQQUdFX1NISUZUKSB8IF9QQUdFX1RBQkxFKSk7Cit9CisKKyNkZWZpbmUgcG1kX3BndGFibGUocG1kKSBwbWRfcGFnZShwbWQpCisKKyNpZiBQQUdFVEFCTEVfTEVWRUxTID4gMgorc3RhdGljIGlubGluZSBwbWRfdCAqcG1kX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCXJldHVybiAocG1kX3QgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTHxfX0dGUF9SRVBFQVQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcG1kX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBtZF90ICpwbWQpCit7CisJQlVHX09OKCh1bnNpZ25lZCBsb25nKXBtZCAmIChQQUdFX1NJWkUtMSkpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwbWQpOworfQorCitleHRlcm4gdm9pZCBfX3BtZF9mcmVlX3RsYihzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCBwbWRfdCAqcG1kKTsKKworI2lmZGVmIENPTkZJR19YODZfUEFFCitleHRlcm4gdm9pZCBwdWRfcG9wdWxhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHB1ZF90ICpwdWRwLCBwbWRfdCAqcG1kKTsKKyNlbHNlCS8qICFDT05GSUdfWDg2X1BBRSAqLworc3RhdGljIGlubGluZSB2b2lkIHB1ZF9wb3B1bGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcHVkX3QgKnB1ZCwgcG1kX3QgKnBtZCkKK3sKKwlwYXJhdmlydF9hbGxvY19wbWQobW0sIF9fcGEocG1kKSA+PiBQQUdFX1NISUZUKTsKKwlzZXRfcHVkKHB1ZCwgX19wdWQoX1BBR0VfVEFCTEUgfCBfX3BhKHBtZCkpKTsKK30KKyNlbmRpZgkvKiBDT05GSUdfWDg2X1BBRSAqLworCisjaWYgUEFHRVRBQkxFX0xFVkVMUyA+IDMKK3N0YXRpYyBpbmxpbmUgdm9pZCBwZ2RfcG9wdWxhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBnZF90ICpwZ2QsIHB1ZF90ICpwdWQpCit7CisJcGFyYXZpcnRfYWxsb2NfcHVkKG1tLCBfX3BhKHB1ZCkgPj4gUEFHRV9TSElGVCk7CisJc2V0X3BnZChwZ2QsIF9fcGdkKF9QQUdFX1RBQkxFIHwgX19wYShwdWQpKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgcHVkX3QgKnB1ZF9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlyZXR1cm4gKHB1ZF90ICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUx8X19HRlBfUkVQRUFUKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1ZF9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdWRfdCAqcHVkKQoreworCUJVR19PTigodW5zaWduZWQgbG9uZylwdWQgJiAoUEFHRV9TSVpFLTEpKTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcHVkKTsKK30KKworZXh0ZXJuIHZvaWQgX19wdWRfZnJlZV90bGIoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgcHVkX3QgKnB1ZCk7CisjZW5kaWYJLyogUEFHRVRBQkxFX0xFVkVMUyA+IDMgKi8KKyNlbmRpZgkvKiBQQUdFVEFCTEVfTEVWRUxTID4gMiAqLworCisjZW5kaWYJLyogX0FTTV9YODZfUEdBTExPQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvcGdhbGxvY18zMi5oIGIvaW5jbHVkZS9hc20teDg2L3BnYWxsb2NfMzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJlYTZlNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14ODYvcGdhbGxvY18zMi5oCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotI2lmbmRlZiBfSTM4Nl9QR0FMTE9DX0gKLSNkZWZpbmUgX0kzODZfUEdBTExPQ19ICi0KLSNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4JCS8qIGZvciBzdHJ1Y3QgcGFnZSAqLwotI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KLSNpbmNsdWRlIDxhc20vdGxiLmg+Ci0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvdGxiLmg+Ci0KLSNpZmRlZiBDT05GSUdfUEFSQVZJUlQKLSNpbmNsdWRlIDxhc20vcGFyYXZpcnQuaD4KLSNlbHNlCi0jZGVmaW5lIHBhcmF2aXJ0X2FsbG9jX3B0KG1tLCBwZm4pIGRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgcGFyYXZpcnRfYWxsb2NfcGQobW0sIHBmbikgZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBwYXJhdmlydF9hbGxvY19wZF9jbG9uZShwZm4sIGNsb25lcGZuLCBzdGFydCwgY291bnQpIGRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgcGFyYXZpcnRfcmVsZWFzZV9wdChwZm4pIGRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgcGFyYXZpcnRfcmVsZWFzZV9wZChwZm4pIGRvIHsgfSB3aGlsZSAoMCkKLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIHZvaWQgcG1kX3BvcHVsYXRlX2tlcm5lbChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKLQkJCQkgICAgICAgcG1kX3QgKnBtZCwgcHRlX3QgKnB0ZSkKLXsKLQlwYXJhdmlydF9hbGxvY19wdChtbSwgX19wYShwdGUpID4+IFBBR0VfU0hJRlQpOwotCXNldF9wbWQocG1kLCBfX3BtZChfX3BhKHB0ZSkgfCBfUEFHRV9UQUJMRSkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcG1kX3BvcHVsYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwbWRfdCAqcG1kLCBzdHJ1Y3QgcGFnZSAqcHRlKQotewotCXVuc2lnbmVkIGxvbmcgcGZuID0gcGFnZV90b19wZm4ocHRlKTsKLQotCXBhcmF2aXJ0X2FsbG9jX3B0KG1tLCBwZm4pOwotCXNldF9wbWQocG1kLCBfX3BtZCgoKHB0ZXZhbF90KXBmbiA8PCBQQUdFX1NISUZUKSB8IF9QQUdFX1RBQkxFKSk7Ci19Ci0jZGVmaW5lIHBtZF9wZ3RhYmxlKHBtZCkgcG1kX3BhZ2UocG1kKQotCi0vKgotICogQWxsb2NhdGUgYW5kIGZyZWUgcGFnZSB0YWJsZXMuCi0gKi8KLWV4dGVybiBwZ2RfdCAqcGdkX2FsbG9jKHN0cnVjdCBtbV9zdHJ1Y3QgKik7Ci1leHRlcm4gdm9pZCBwZ2RfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcGdkX3QgKnBnZCk7Ci0KLWV4dGVybiBwdGVfdCAqcHRlX2FsbG9jX29uZV9rZXJuZWwoc3RydWN0IG1tX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nKTsKLWV4dGVybiBwZ3RhYmxlX3QgcHRlX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICosIHVuc2lnbmVkIGxvbmcpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdGVfdCAqcHRlKQotewotCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwdGUpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBndGFibGVfdCBwdGUpCi17Ci0JcGd0YWJsZV9wYWdlX2R0b3IocHRlKTsKLQlfX2ZyZWVfcGFnZShwdGUpOwotfQotCi0KLWV4dGVybiB2b2lkIF9fcHRlX2ZyZWVfdGxiKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIHN0cnVjdCBwYWdlICpwdGUpOwotCi0jaWZkZWYgQ09ORklHX1g4Nl9QQUUKLS8qCi0gKiBJbiB0aGUgUEFFIGNhc2Ugd2UgZnJlZSB0aGUgcG1kcyBhcyBwYXJ0IG9mIHRoZSBwZ2QuCi0gKi8KLXN0YXRpYyBpbmxpbmUgcG1kX3QgKnBtZF9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQlyZXR1cm4gKHBtZF90ICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUx8X19HRlBfUkVQRUFUKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHBtZF9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwbWRfdCAqcG1kKQotewotCUJVR19PTigodW5zaWduZWQgbG9uZylwbWQgJiAoUEFHRV9TSVpFLTEpKTsKLQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcG1kKTsKLX0KLQotZXh0ZXJuIHZvaWQgX19wbWRfZnJlZV90bGIoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgcG1kX3QgKnBtZCk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwdWRfcG9wdWxhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHB1ZF90ICpwdWRwLCBwbWRfdCAqcG1kKQotewotCXBhcmF2aXJ0X2FsbG9jX3BkKG1tLCBfX3BhKHBtZCkgPj4gUEFHRV9TSElGVCk7Ci0KLQkvKiBOb3RlOiBhbG1vc3QgZXZlcnl0aGluZyBhcGFydCBmcm9tIF9QQUdFX1BSRVNFTlQgaXMKLQkgICByZXNlcnZlZCBhdCB0aGUgcG1kIChQRFBUKSBsZXZlbC4gKi8KLQlzZXRfcHVkKHB1ZHAsIF9fcHVkKF9fcGEocG1kKSB8IF9QQUdFX1BSRVNFTlQpKTsKLQotCS8qCi0JICogQWNjb3JkaW5nIHRvIEludGVsIEFwcCBub3RlICJUTEJzLCBQYWdpbmctU3RydWN0dXJlIENhY2hlcywKLQkgKiBhbmQgVGhlaXIgSW52YWxpZGF0aW9uIiwgQXByaWwgMjAwNywgZG9jdW1lbnQgMzE3MDgwLTAwMSwKLQkgKiBzZWN0aW9uIDguMTogaW4gUEFFIG1vZGUgd2UgZXhwbGljaXRseSBoYXZlIHRvIGZsdXNoIHRoZQotCSAqIFRMQiB2aWEgY3IzIGlmIHRoZSB0b3AtbGV2ZWwgcGdkIGlzIGNoYW5nZWQuLi4KLQkgKi8KLQlpZiAobW0gPT0gY3VycmVudC0+YWN0aXZlX21tKQotCQl3cml0ZV9jcjMocmVhZF9jcjMoKSk7Ci19Ci0jZW5kaWYJLyogQ09ORklHX1g4Nl9QQUUgKi8KLQotI2VuZGlmIC8qIF9JMzg2X1BHQUxMT0NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3BnYWxsb2NfNjQuaCBiL2luY2x1ZGUvYXNtLXg4Ni9wZ2FsbG9jXzY0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNjcyMjMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20teDg2L3BnYWxsb2NfNjQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0jaWZuZGVmIF9YODZfNjRfUEdBTExPQ19ICi0jZGVmaW5lIF9YODZfNjRfUEdBTExPQ19ICi0KLSNpbmNsdWRlIDxhc20vcGRhLmg+Ci0jaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0KLSNkZWZpbmUgcG1kX3BvcHVsYXRlX2tlcm5lbChtbSwgcG1kLCBwdGUpIFwKLQkJc2V0X3BtZChwbWQsIF9fcG1kKF9QQUdFX1RBQkxFIHwgX19wYShwdGUpKSkKLSNkZWZpbmUgcHVkX3BvcHVsYXRlKG1tLCBwdWQsIHBtZCkgXAotCQlzZXRfcHVkKHB1ZCwgX19wdWQoX1BBR0VfVEFCTEUgfCBfX3BhKHBtZCkpKQotI2RlZmluZSBwZ2RfcG9wdWxhdGUobW0sIHBnZCwgcHVkKSBcCi0JCXNldF9wZ2QocGdkLCBfX3BnZChfUEFHRV9UQUJMRSB8IF9fcGEocHVkKSkpCi0KLSNkZWZpbmUgcG1kX3BndGFibGUocG1kKSBwbWRfcGFnZShwbWQpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwbWRfcG9wdWxhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBtZF90ICpwbWQsIHN0cnVjdCBwYWdlICpwdGUpCi17Ci0Jc2V0X3BtZChwbWQsIF9fcG1kKF9QQUdFX1RBQkxFIHwgKHBhZ2VfdG9fcGZuKHB0ZSkgPDwgUEFHRV9TSElGVCkpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHBtZF9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwbWRfdCAqcG1kKQotewotCUJVR19PTigodW5zaWduZWQgbG9uZylwbWQgJiAoUEFHRV9TSVpFLTEpKTsKLQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcG1kKTsKLX0KLQotc3RhdGljIGlubGluZSBwbWRfdCAqcG1kX2FsbG9jX29uZSAoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQlyZXR1cm4gKHBtZF90ICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUx8X19HRlBfUkVQRUFUKTsKLX0KLQotc3RhdGljIGlubGluZSBwdWRfdCAqcHVkX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKQotewotCXJldHVybiAocHVkX3QgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTHxfX0dGUF9SRVBFQVQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcHVkX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHB1ZF90ICpwdWQpCi17Ci0JQlVHX09OKCh1bnNpZ25lZCBsb25nKXB1ZCAmIChQQUdFX1NJWkUtMSkpOwotCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwdWQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcGdkX2xpc3RfYWRkKHBnZF90ICpwZ2QpCi17Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocGdkKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBnZF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9hZGQoJnBhZ2UtPmxydSwgJnBnZF9saXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZ2RfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcGdkX2xpc3RfZGVsKHBnZF90ICpwZ2QpCi17Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocGdkKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBnZF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9kZWwoJnBhZ2UtPmxydSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGdkX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGlubGluZSBwZ2RfdCAqcGdkX2FsbG9jKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQotewotCXVuc2lnbmVkIGJvdW5kYXJ5OwotCXBnZF90ICpwZ2QgPSAocGdkX3QgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTHxfX0dGUF9SRVBFQVQpOwotCWlmICghcGdkKQotCQlyZXR1cm4gTlVMTDsKLQlwZ2RfbGlzdF9hZGQocGdkKTsKLQkvKgotCSAqIENvcHkga2VybmVsIHBvaW50ZXJzIGluIGZyb20gaW5pdC4KLQkgKiBDb3VsZCBrZWVwIGEgZnJlZWxpc3Qgb3Igc2xhYiBjYWNoZSBvZiB0aG9zZSBiZWNhdXNlIHRoZSBrZXJuZWwKLQkgKiBwYXJ0IG5ldmVyIGNoYW5nZXMuCi0JICovCi0JYm91bmRhcnkgPSBwZ2RfaW5kZXgoX19QQUdFX09GRlNFVCk7Ci0JbWVtc2V0KHBnZCwgMCwgYm91bmRhcnkgKiBzaXplb2YocGdkX3QpKTsKLQltZW1jcHkocGdkICsgYm91bmRhcnksCi0JICAgICAgIGluaXRfbGV2ZWw0X3BndCArIGJvdW5kYXJ5LAotCSAgICAgICAoUFRSU19QRVJfUEdEIC0gYm91bmRhcnkpICogc2l6ZW9mKHBnZF90KSk7Ci0JcmV0dXJuIHBnZDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHBnZF9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ2RfdCAqcGdkKQotewotCUJVR19PTigodW5zaWduZWQgbG9uZylwZ2QgJiAoUEFHRV9TSVpFLTEpKTsKLQlwZ2RfbGlzdF9kZWwocGdkKTsKLQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGdkKTsKLX0KLQotc3RhdGljIGlubGluZSBwdGVfdCAqcHRlX2FsbG9jX29uZV9rZXJuZWwoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKLXsKLQlyZXR1cm4gKHB0ZV90ICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUx8X19HRlBfUkVQRUFUKTsKLX0KLQotc3RhdGljIGlubGluZSBwZ3RhYmxlX3QgcHRlX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQotewotCXN0cnVjdCBwYWdlICpwYWdlOwotCXZvaWQgKnA7Ci0KLQlwID0gKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTHxfX0dGUF9SRVBFQVQpOwotCWlmICghcCkKLQkJcmV0dXJuIE5VTEw7Ci0JcGFnZSA9IHZpcnRfdG9fcGFnZShwKTsKLQlwZ3RhYmxlX3BhZ2VfY3RvcihwYWdlKTsKLQlyZXR1cm4gcGFnZTsKLX0KLQotLyogU2hvdWxkIHJlYWxseSBpbXBsZW1lbnQgZ2MgZm9yIGZyZWUgcGFnZSB0YWJsZSBwYWdlcy4gVGhpcyBjb3VsZCBiZQotICAgZG9uZSB3aXRoIGEgcmVmZXJlbmNlIGNvdW50IGluIHN0cnVjdCBwYWdlLiAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdGVfdCAqcHRlKQotewotCUJVR19PTigodW5zaWduZWQgbG9uZylwdGUgJiAoUEFHRV9TSVpFLTEpKTsKLQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcHRlKTsgCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwdGVfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcGd0YWJsZV90IHB0ZSkKLXsKLQlwZ3RhYmxlX3BhZ2VfZHRvcihwdGUpOwotCV9fZnJlZV9wYWdlKHB0ZSk7Ci19IAotCi0jZGVmaW5lIF9fcHRlX2ZyZWVfdGxiKHRsYixwdGUpCQkJCVwKLWRvIHsJCQkJCQkJXAotCXBndGFibGVfcGFnZV9kdG9yKChwdGUpKTsJCQkJXAotCXRsYl9yZW1vdmVfcGFnZSgodGxiKSwgKHB0ZSkpOwkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX19wbWRfZnJlZV90bGIodGxiLHgpICAgdGxiX3JlbW92ZV9wYWdlKCh0bGIpLHZpcnRfdG9fcGFnZSh4KSkKLSNkZWZpbmUgX19wdWRfZnJlZV90bGIodGxiLHgpICAgdGxiX3JlbW92ZV9wYWdlKCh0bGIpLHZpcnRfdG9fcGFnZSh4KSkKLQotI2VuZGlmIC8qIF9YODZfNjRfUEdBTExPQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20teDg2L3BndGFibGUuaAppbmRleCBmMWQ5ZjRhLi5iOGEwOGJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9wZ3RhYmxlLmgKQEAgLTEsNyArMSw2IEBACiAjaWZuZGVmIF9BU01fWDg2X1BHVEFCTEVfSAogI2RlZmluZSBfQVNNX1g4Nl9QR1RBQkxFX0gKIAotI2RlZmluZSBVU0VSX1BUUlNfUEVSX1BHRAkoKFRBU0tfU0laRS0xKS9QR0RJUl9TSVpFKzEpCiAjZGVmaW5lIEZJUlNUX1VTRVJfQUREUkVTUwkwCiAKICNkZWZpbmUgX1BBR0VfQklUX1BSRVNFTlQJMAkvKiBpcyBwcmVzZW50ICovCkBAIC0zMzAsNiArMzI5LDkgQEAKICMgaW5jbHVkZSAicGd0YWJsZV82NC5oIgogI2VuZGlmCiAKKyNkZWZpbmUgS0VSTkVMX1BHRF9CT1VOREFSWQlwZ2RfaW5kZXgoUEFHRV9PRkZTRVQpCisjZGVmaW5lIEtFUk5FTF9QR0RfUFRSUwkJKFBUUlNfUEVSX1BHRCAtIEtFUk5FTF9QR0RfQk9VTkRBUlkpCisKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKIGVudW0gewpAQCAtMzg5LDM3ICszOTEsMTcgQEAKICAqIGJpdCBhdCB0aGUgc2FtZSB0aW1lLgogICovCiAjZGVmaW5lICBfX0hBVkVfQVJDSF9QVEVQX1NFVF9BQ0NFU1NfRkxBR1MKLSNkZWZpbmUgcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKHZtYSwgYWRkcmVzcywgcHRlcCwgZW50cnksIGRpcnR5KQkJXAotKHsJCQkJCQkJCQlcCi0JaW50IF9fY2hhbmdlZCA9ICFwdGVfc2FtZSgqKHB0ZXApLCBlbnRyeSk7CQkJXAotCWlmIChfX2NoYW5nZWQgJiYgZGlydHkpIHsJCQkJCVwKLQkJKnB0ZXAgPSBlbnRyeTsJCQkJCQlcCi0JCXB0ZV91cGRhdGVfZGVmZXIoKHZtYSktPnZtX21tLCAoYWRkcmVzcyksIChwdGVwKSk7CVwKLQkJZmx1c2hfdGxiX3BhZ2Uodm1hLCBhZGRyZXNzKTsJCQkJXAotCX0JCQkJCQkJCVwKLQlfX2NoYW5nZWQ7CQkJCQkJCVwKLX0pCitleHRlcm4gaW50IHB0ZXBfc2V0X2FjY2Vzc19mbGFncyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCAqcHRlcCwKKwkJCQkgcHRlX3QgZW50cnksIGludCBkaXJ0eSk7CiAKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ZT1VORwotI2RlZmluZSBwdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKHZtYSwgYWRkciwgcHRlcCkgKHsJCQlcCi0JaW50IF9fcmV0ID0gMDsJCQkJCQkJXAotCWlmIChwdGVfeW91bmcoKihwdGVwKSkpCQkJCQkJXAotCQlfX3JldCA9IHRlc3RfYW5kX2NsZWFyX2JpdChfUEFHRV9CSVRfQUNDRVNTRUQsCQlcCi0JCQkJCSAgICYocHRlcCktPnB0ZSk7CQlcCi0JaWYgKF9fcmV0KQkJCQkJCQlcCi0JCXB0ZV91cGRhdGUoKHZtYSktPnZtX21tLCBhZGRyLCBwdGVwKTsJCQlcCi0JX19yZXQ7CQkJCQkJCQlcCi19KQorZXh0ZXJuIGludCBwdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCk7CiAKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9DTEVBUl9ZT1VOR19GTFVTSAotI2RlZmluZSBwdGVwX2NsZWFyX2ZsdXNoX3lvdW5nKHZtYSwgYWRkcmVzcywgcHRlcCkJCQlcCi0oewkJCQkJCQkJCVwKLQlpbnQgX195b3VuZzsJCQkJCQkJXAotCV9feW91bmcgPSBwdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKCh2bWEpLCAoYWRkcmVzcyksIChwdGVwKSk7CVwKLQlpZiAoX195b3VuZykJCQkJCQkJXAotCQlmbHVzaF90bGJfcGFnZSh2bWEsIGFkZHJlc3MpOwkJCQlcCi0JX195b3VuZzsJCQkJCQkJXAotfSkKK2V4dGVybiBpbnQgcHRlcF9jbGVhcl9mbHVzaF95b3VuZyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHRlX3QgKnB0ZXApOwogCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUgogc3RhdGljIGlubGluZSBwdGVfdCBwdGVwX2dldF9hbmRfY2xlYXIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKQEAgLTQ1Niw2ICs0MzgsMjIgQEAKIAlwdGVfdXBkYXRlKG1tLCBhZGRyLCBwdGVwKTsKIH0KIAorLyoKKyAqIGNsb25lX3BnZF9yYW5nZShwZ2RfdCAqZHN0LCBwZ2RfdCAqc3JjLCBpbnQgY291bnQpOworICoKKyAqICBkc3QgLSBwb2ludGVyIHRvIHBnZCByYW5nZSBhbndoZXJlIG9uIGEgcGdkIHBhZ2UKKyAqICBzcmMgLSAiIgorICogIGNvdW50IC0gdGhlIG51bWJlciBvZiBwZ2RzIHRvIGNvcHkuCisgKgorICogZHN0IGFuZCBzcmMgY2FuIGJlIG9uIHRoZSBzYW1lIHBhZ2UsIGJ1dCB0aGUgcmFuZ2UgbXVzdCBub3Qgb3ZlcmxhcCwKKyAqIGFuZCBtdXN0IG5vdCBjcm9zcyBhIHBhZ2UgYm91bmRhcnkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjbG9uZV9wZ2RfcmFuZ2UocGdkX3QgKmRzdCwgcGdkX3QgKnNyYywgaW50IGNvdW50KQoreworICAgICAgIG1lbWNweShkc3QsIHNyYywgY291bnQgKiBzaXplb2YocGdkX3QpKTsKK30KKworCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGd0YWJsZS5oPgogI2VuZGlmCS8qIF9fQVNTRU1CTFlfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvcGd0YWJsZV8zMi5oIGIvaW5jbHVkZS9hc20teDg2L3BndGFibGVfMzIuaAppbmRleCBjNGE2NDM2Li4xNjhiNjQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvcGd0YWJsZV8zMi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9wZ3RhYmxlXzMyLmgKQEAgLTQ4LDkgKzQ4LDYgQEAKICNkZWZpbmUgUEdESVJfU0laRQkoMVVMIDw8IFBHRElSX1NISUZUKQogI2RlZmluZSBQR0RJUl9NQVNLCSh+KFBHRElSX1NJWkUgLSAxKSkKIAotI2RlZmluZSBVU0VSX1BHRF9QVFJTIChQQUdFX09GRlNFVCA+PiBQR0RJUl9TSElGVCkKLSNkZWZpbmUgS0VSTkVMX1BHRF9QVFJTIChQVFJTX1BFUl9QR0QtVVNFUl9QR0RfUFRSUykKLQogLyogSnVzdCBhbnkgYXJiaXRyYXJ5IG9mZnNldCB0byB0aGUgc3RhcnQgb2YgdGhlIHZtYWxsb2MgVk0gYXJlYTogdGhlCiAgKiBjdXJyZW50IDhNQiB2YWx1ZSBqdXN0IG1lYW5zIHRoYXQgdGhlcmUgd2lsbCBiZSBhIDhNQiAiaG9sZSIgYWZ0ZXIgdGhlCiAgKiBwaHlzaWNhbCBtZW1vcnkgdW50aWwgdGhlIGtlcm5lbCB2aXJ0dWFsIG1lbW9yeSBzdGFydHMuICBUaGF0IG1lYW5zIHRoYXQKQEAgLTEwOSwyMSArMTA2LDYgQEAKICNlbmRpZgogCiAvKgotICogY2xvbmVfcGdkX3JhbmdlKHBnZF90ICpkc3QsIHBnZF90ICpzcmMsIGludCBjb3VudCk7Ci0gKgotICogIGRzdCAtIHBvaW50ZXIgdG8gcGdkIHJhbmdlIGFud2hlcmUgb24gYSBwZ2QgcGFnZQotICogIHNyYyAtICIiCi0gKiAgY291bnQgLSB0aGUgbnVtYmVyIG9mIHBnZHMgdG8gY29weS4KLSAqCi0gKiBkc3QgYW5kIHNyYyBjYW4gYmUgb24gdGhlIHNhbWUgcGFnZSwgYnV0IHRoZSByYW5nZSBtdXN0IG5vdCBvdmVybGFwLAotICogYW5kIG11c3Qgbm90IGNyb3NzIGEgcGFnZSBib3VuZGFyeS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGNsb25lX3BnZF9yYW5nZShwZ2RfdCAqZHN0LCBwZ2RfdCAqc3JjLCBpbnQgY291bnQpCi17Ci0gICAgICAgbWVtY3B5KGRzdCwgc3JjLCBjb3VudCAqIHNpemVvZihwZ2RfdCkpOwotfQotCi0vKgogICogTWFjcm8gdG8gbWFyayBhIHBhZ2UgcHJvdGVjdGlvbiB2YWx1ZSBhcyAidW5jYWNoZWFibGUiLgogICogT24gcHJvY2Vzc29ycyB3aGljaCBkbyBub3Qgc3VwcG9ydCBpdCwgdGhpcyBpcyBhIG5vLW9wLgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvcGd0YWJsZV82NC5oIGIvaW5jbHVkZS9hc20teDg2L3BndGFibGVfNjQuaAppbmRleCA5ZmQ4N2QwLi5hM2JiZjg3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvcGd0YWJsZV82NC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9wZ3RhYmxlXzY0LmgKQEAgLTI0LDcgKzI0LDcgQEAKIAogI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KIAotI2RlZmluZSBTSEFSRURfS0VSTkVMX1BNRAkxCisjZGVmaW5lIFNIQVJFRF9LRVJORUxfUE1ECTAKIAogLyoKICAqIFBHRElSX1NISUZUIGRldGVybWluZXMgd2hhdCBhIHRvcC1sZXZlbCBwYWdlIHRhYmxlIGVudHJ5IGNhbiBtYXAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni94ZW4vZXZlbnRzLmggYi9pbmNsdWRlL2FzbS14ODYveGVuL2V2ZW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NjMxMmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14ODYveGVuL2V2ZW50cy5oCkBAIC0wLDAgKzEsMjIgQEAKKyNpZm5kZWYgX19YRU5fRVZFTlRTX0gKKyNkZWZpbmUgX19YRU5fRVZFTlRTX0gKKworZW51bSBpcGlfdmVjdG9yIHsKKwlYRU5fUkVTQ0hFRFVMRV9WRUNUT1IsCisJWEVOX0NBTExfRlVOQ1RJT05fVkVDVE9SLAorCisJWEVOX05SX0lQSVMsCit9OworCitzdGF0aWMgaW5saW5lIGludCB4ZW5faXJxc19kaXNhYmxlZChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZXR1cm4gcmF3X2lycXNfZGlzYWJsZWRfZmxhZ3MocmVncy0+ZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgeGVuX2RvX0lSUShpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZWdzLT5vcmlnX2F4ID0gfmlycTsKKwlkb19JUlEocmVncyk7Cit9CisKKyNlbmRpZiAvKiBfX1hFTl9FVkVOVFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3hlbi9ncmFudF90YWJsZS5oIGIvaW5jbHVkZS9hc20teDg2L3hlbi9ncmFudF90YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NDRkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14ODYveGVuL2dyYW50X3RhYmxlLmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIF9fWEVOX0dSQU5UX1RBQkxFX0gKKyNkZWZpbmUgX19YRU5fR1JBTlRfVEFCTEVfSAorCisjZGVmaW5lIHhlbl9hbGxvY192bV9hcmVhKHNpemUpCWFsbG9jX3ZtX2FyZWEoc2l6ZSkKKyNkZWZpbmUgeGVuX2ZyZWVfdm1fYXJlYShhcmVhKQlmcmVlX3ZtX2FyZWEoYXJlYSkKKworI2VuZGlmIC8qIF9fWEVOX0dSQU5UX1RBQkxFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni94ZW4vaHlwZXJjYWxsLmggYi9pbmNsdWRlL2FzbS14ODYveGVuL2h5cGVyY2FsbC5oCmluZGV4IGJjMGVlN2QuLmMyY2NkOTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni94ZW4vaHlwZXJjYWxsLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3hlbi9oeXBlcmNhbGwuaApAQCAtMTY0LDYgKzE2NCwxMiBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludAorSFlQRVJWSVNPUl9jYWxsYmFja19vcChpbnQgY21kLCB2b2lkICphcmcpCit7CisJcmV0dXJuIF9oeXBlcmNhbGwyKGludCwgY2FsbGJhY2tfb3AsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKIEhZUEVSVklTT1JfZnB1X3Rhc2tzd2l0Y2goaW50IHNldCkKIHsKIAlyZXR1cm4gX2h5cGVyY2FsbDEoaW50LCBmcHVfdGFza3N3aXRjaCwgc2V0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni94ZW4vaW50ZXJmYWNlLmggYi9pbmNsdWRlL2FzbS14ODYveGVuL2ludGVyZmFjZS5oCmluZGV4IDE2NWMzOTYuLjYyMjcwMDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni94ZW4vaW50ZXJmYWNlLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3hlbi9pbnRlcmZhY2UuaApAQCAtMjIsNiArMjIsMzAgQEAKICNkZWZpbmUgREVGSU5FX0dVRVNUX0hBTkRMRShuYW1lKSBfX0RFRklORV9HVUVTVF9IQU5ETEUobmFtZSwgbmFtZSkKICNkZWZpbmUgR1VFU1RfSEFORExFKG5hbWUpICAgICAgICBfX2d1ZXN0X2hhbmRsZV8gIyMgbmFtZQogCisjaWZkZWYgX19YRU5fXworI2lmIGRlZmluZWQoX19pMzg2X18pCisjZGVmaW5lIHNldF94ZW5fZ3Vlc3RfaGFuZGxlKGhuZCwgdmFsKQkJCVwKKwlkbyB7CQkJCQkJXAorCQlpZiAoc2l6ZW9mKGhuZCkgPT0gOCkJCQlcCisJCQkqKHVpbnQ2NF90ICopJihobmQpID0gMDsJXAorCQkoaG5kKS5wID0gdmFsOwkJCQlcCisJfSB3aGlsZSAoMCkKKyNlbGlmIGRlZmluZWQoX194ODZfNjRfXykKKyNkZWZpbmUgc2V0X3hlbl9ndWVzdF9oYW5kbGUoaG5kLCB2YWwpCWRvIHsgKGhuZCkucCA9IHZhbDsgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2Vsc2UKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorI2RlZmluZSBzZXRfeGVuX2d1ZXN0X2hhbmRsZShobmQsIHZhbCkJCQlcCisJZG8gewkJCQkJCVwKKwkJaWYgKHNpemVvZihobmQpID09IDgpCQkJXAorCQkJKih1aW50NjRfdCAqKSYoaG5kKSA9IDA7CVwKKwkJKGhuZCkgPSB2YWw7CQkJCVwKKwl9IHdoaWxlICgwKQorI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorI2RlZmluZSBzZXRfeGVuX2d1ZXN0X2hhbmRsZShobmQsIHZhbCkJZG8geyAoaG5kKSA9IHZhbDsgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2VuZGlmCisKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAvKiBHdWVzdCBoYW5kbGVzIGZvciBwcmltaXRpdmUgQyB0eXBlcy4gKi8KIF9fREVGSU5FX0dVRVNUX0hBTkRMRSh1Y2hhciwgdW5zaWduZWQgY2hhcik7CkBAIC0xNzEsNiArMTk1LDEwIEBACiAgICAgdW5zaWduZWQgbG9uZyBwYWRbNV07IC8qIHNpemVvZihzdHJ1Y3QgdmNwdV9pbmZvKSA9PSA2NCAqLwogfTsKIAorc3RydWN0IHhlbl9jYWxsYmFjayB7CisJdW5zaWduZWQgbG9uZyBjczsKKwl1bnNpZ25lZCBsb25nIGVpcDsKK307CiAjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3hlbi9wYWdlLmggYi9pbmNsdWRlL2FzbS14ODYveGVuL3BhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTc5OTMwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teDg2L3hlbi9wYWdlLmgKQEAgLTAsMCArMSwxNjggQEAKKyNpZm5kZWYgX19YRU5fUEFHRV9ICisjZGVmaW5lIF9fWEVOX1BBR0VfSAorCisjaW5jbHVkZSA8bGludXgvcGZuLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisKKyNpbmNsdWRlIDx4ZW4vZmVhdHVyZXMuaD4KKworLyogWGVuIG1hY2hpbmUgYWRkcmVzcyAqLwordHlwZWRlZiBzdHJ1Y3QgeG1hZGRyIHsKKwlwaHlzX2FkZHJfdCBtYWRkcjsKK30geG1hZGRyX3Q7CisKKy8qIFhlbiBwc2V1ZG8tcGh5c2ljYWwgYWRkcmVzcyAqLwordHlwZWRlZiBzdHJ1Y3QgeHBhZGRyIHsKKwlwaHlzX2FkZHJfdCBwYWRkcjsKK30geHBhZGRyX3Q7CisKKyNkZWZpbmUgWE1BRERSKHgpCSgoeG1hZGRyX3QpIHsgLm1hZGRyID0gKHgpIH0pCisjZGVmaW5lIFhQQUREUih4KQkoKHhwYWRkcl90KSB7IC5wYWRkciA9ICh4KSB9KQorCisvKioqKiBNQUNISU5FIDwtPiBQSFlTSUNBTCBDT05WRVJTSU9OIE1BQ1JPUyAqKioqLworI2RlZmluZSBJTlZBTElEX1AyTV9FTlRSWQkofjBVTCkKKyNkZWZpbmUgRk9SRUlHTl9GUkFNRV9CSVQJKDFVTDw8MzEpCisjZGVmaW5lIEZPUkVJR05fRlJBTUUobSkJKChtKSB8IEZPUkVJR05fRlJBTUVfQklUKQorCitleHRlcm4gdW5zaWduZWQgbG9uZyAqcGh5c190b19tYWNoaW5lX21hcHBpbmc7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwZm5fdG9fbWZuKHVuc2lnbmVkIGxvbmcgcGZuKQoreworCWlmICh4ZW5fZmVhdHVyZShYRU5GRUFUX2F1dG9fdHJhbnNsYXRlZF9waHlzbWFwKSkKKwkJcmV0dXJuIHBmbjsKKworCXJldHVybiBwaHlzX3RvX21hY2hpbmVfbWFwcGluZ1sodW5zaWduZWQgaW50KShwZm4pXSAmCisJCX5GT1JFSUdOX0ZSQU1FX0JJVDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGh5c190b19tYWNoaW5lX21hcHBpbmdfdmFsaWQodW5zaWduZWQgbG9uZyBwZm4pCit7CisJaWYgKHhlbl9mZWF0dXJlKFhFTkZFQVRfYXV0b190cmFuc2xhdGVkX3BoeXNtYXApKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAocGh5c190b19tYWNoaW5lX21hcHBpbmdbcGZuXSAhPSBJTlZBTElEX1AyTV9FTlRSWSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtZm5fdG9fcGZuKHVuc2lnbmVkIGxvbmcgbWZuKQoreworCXVuc2lnbmVkIGxvbmcgcGZuOworCisJaWYgKHhlbl9mZWF0dXJlKFhFTkZFQVRfYXV0b190cmFuc2xhdGVkX3BoeXNtYXApKQorCQlyZXR1cm4gbWZuOworCisjaWYgMAorCWlmICh1bmxpa2VseSgobWZuID4+IG1hY2hpbmVfdG9fcGh5c19vcmRlcikgIT0gMCkpCisJCXJldHVybiBtYXhfbWFwbnI7CisjZW5kaWYKKworCXBmbiA9IDA7CisJLyoKKwkgKiBUaGUgYXJyYXkgYWNjZXNzIGNhbiBmYWlsIChlLmcuLCBkZXZpY2Ugc3BhY2UgYmV5b25kIGVuZCBvZiBSQU0pLgorCSAqIEluIHN1Y2ggY2FzZXMgaXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB3ZSByZXR1cm4gKHdlIHJldHVybiBnYXJiYWdlKSwKKwkgKiBidXQgd2UgbXVzdCBoYW5kbGUgdGhlIGZhdWx0IHdpdGhvdXQgY3Jhc2hpbmchCisJICovCisJX19nZXRfdXNlcihwZm4sICZtYWNoaW5lX3RvX3BoeXNfbWFwcGluZ1ttZm5dKTsKKworCXJldHVybiBwZm47Cit9CisKK3N0YXRpYyBpbmxpbmUgeG1hZGRyX3QgcGh5c190b19tYWNoaW5lKHhwYWRkcl90IHBoeXMpCit7CisJdW5zaWduZWQgb2Zmc2V0ID0gcGh5cy5wYWRkciAmIH5QQUdFX01BU0s7CisJcmV0dXJuIFhNQUREUihQRk5fUEhZUygodTY0KXBmbl90b19tZm4oUEZOX0RPV04ocGh5cy5wYWRkcikpKSB8IG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgeHBhZGRyX3QgbWFjaGluZV90b19waHlzKHhtYWRkcl90IG1hY2hpbmUpCit7CisJdW5zaWduZWQgb2Zmc2V0ID0gbWFjaGluZS5tYWRkciAmIH5QQUdFX01BU0s7CisJcmV0dXJuIFhQQUREUihQRk5fUEhZUygodTY0KW1mbl90b19wZm4oUEZOX0RPV04obWFjaGluZS5tYWRkcikpKSB8IG9mZnNldCk7Cit9CisKKy8qCisgKiBXZSBkZXRlY3Qgc3BlY2lhbCBtYXBwaW5ncyBpbiBvbmUgb2YgdHdvIHdheXM6CisgKiAgMS4gSWYgdGhlIE1GTiBpcyBhbiBJL08gcGFnZSB0aGVuIFhlbiB3aWxsIHNldCB0aGUgbTJwIGVudHJ5CisgKiAgICAgdG8gYmUgb3V0c2lkZSBvdXIgbWF4aW11bSBwb3NzaWJsZSBwc2V1ZG9waHlzIHJhbmdlLgorICogIDIuIElmIHRoZSBNRk4gYmVsb25ncyB0byBhIGRpZmZlcmVudCBkb21haW4gdGhlbiB3ZSB3aWxsIGNlcnRhaW5seQorICogICAgIG5vdCBoYXZlIE1GTiBpbiBvdXIgcDJtIHRhYmxlLiBDb252ZXJzZWx5LCBpZiB0aGUgcGFnZSBpcyBvdXJzLAorICogICAgIHRoZW4gd2UnbGwgaGF2ZSBwMm0obTJwKE1GTikpPT1NRk4uCisgKiBJZiB3ZSBkZXRlY3QgYSBzcGVjaWFsIG1hcHBpbmcgdGhlbiBpdCBkb2Vzbid0IGhhdmUgYSAnc3RydWN0IHBhZ2UnLgorICogV2UgZm9yY2UgIXBmbl92YWxpZCgpIGJ5IHJldHVybmluZyBhbiBvdXQtb2YtcmFuZ2UgcG9pbnRlci4KKyAqCisgKiBOQi4gVGhlc2UgY2hlY2tzIHJlcXVpcmUgdGhhdCwgZm9yIGFueSBNRk4gdGhhdCBpcyBub3QgaW4gb3VyIHJlc2VydmF0aW9uLAorICogdGhlcmUgaXMgbm8gUEZOIHN1Y2ggdGhhdCBwMm0oUEZOKSA9PSBNRk4uIE90aGVyd2lzZSB3ZSBjYW4gZ2V0IGNvbmZ1c2VkIGlmCisgKiB3ZSBhcmUgZm9yZWlnbi1tYXBwaW5nIHRoZSBNRk4sIGFuZCB0aGUgb3RoZXIgZG9tYWluIGFzIG0ycChNRk4pID09IFBGTi4KKyAqIFlpa2VzISBWYXJpb3VzIHBsYWNlcyBtdXN0IHBva2UgaW4gSU5WQUxJRF9QMk1fRU5UUlkgZm9yIHNhZmV0eS4KKyAqCisgKiBOQjIuIFdoZW4gZGVsaWJlcmF0ZWx5IG1hcHBpbmcgZm9yZWlnbiBwYWdlcyBpbnRvIHRoZSBwMm0gdGFibGUsIHlvdSAqbXVzdCoKKyAqICAgICAgdXNlIEZPUkVJR05fRlJBTUUoKS4gVGhpcyB3aWxsIGNhdXNlIHB0ZV9wZm4oKSB0byBjaG9rZSBvbiBpdCwgYXMgd2UKKyAqICAgICAgcmVxdWlyZS4gSW4gYWxsIHRoZSBjYXNlcyB3ZSBjYXJlIGFib3V0LCB0aGUgRk9SRUlHTl9GUkFNRSBiaXQgaXMKKyAqICAgICAgbWFza2VkIChlLmcuLCBwZm5fdG9fbWZuKCkpIHNvIGJlaGF2aW91ciB0aGVyZSBpcyBjb3JyZWN0LgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbWZuX3RvX2xvY2FsX3Bmbih1bnNpZ25lZCBsb25nIG1mbikKK3sKKwlleHRlcm4gdW5zaWduZWQgbG9uZyBtYXhfbWFwbnI7CisJdW5zaWduZWQgbG9uZyBwZm4gPSBtZm5fdG9fcGZuKG1mbik7CisJaWYgKChwZm4gPCBtYXhfbWFwbnIpCisJICAgICYmICF4ZW5fZmVhdHVyZShYRU5GRUFUX2F1dG9fdHJhbnNsYXRlZF9waHlzbWFwKQorCSAgICAmJiAocGh5c190b19tYWNoaW5lX21hcHBpbmdbcGZuXSAhPSBtZm4pKQorCQlyZXR1cm4gbWF4X21hcG5yOyAvKiBmb3JjZSAhcGZuX3ZhbGlkKCkgKi8KKwlyZXR1cm4gcGZuOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3BoeXNfdG9fbWFjaGluZSh1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBtZm4pCit7CisJaWYgKHhlbl9mZWF0dXJlKFhFTkZFQVRfYXV0b190cmFuc2xhdGVkX3BoeXNtYXApKSB7CisJCUJVR19PTihwZm4gIT0gbWZuICYmIG1mbiAhPSBJTlZBTElEX1AyTV9FTlRSWSk7CisJCXJldHVybjsKKwl9CisJcGh5c190b19tYWNoaW5lX21hcHBpbmdbcGZuXSA9IG1mbjsKK30KKworLyogVklSVCA8LT4gTUFDSElORSBjb252ZXJzaW9uICovCisjZGVmaW5lIHZpcnRfdG9fbWFjaGluZSh2KQkocGh5c190b19tYWNoaW5lKFhQQUREUihfX3BhKHYpKSkpCisjZGVmaW5lIHZpcnRfdG9fbWZuKHYpCQkocGZuX3RvX21mbihQRk5fRE9XTihfX3BhKHYpKSkpCisjZGVmaW5lIG1mbl90b192aXJ0KG0pCQkoX192YShtZm5fdG9fcGZuKG0pIDw8IFBBR0VfU0hJRlQpKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcHRlX21mbihwdGVfdCBwdGUpCit7CisJcmV0dXJuIChwdGUucHRlICYgfl9QQUdFX05YKSA+PiBQQUdFX1NISUZUOworfQorCitzdGF0aWMgaW5saW5lIHB0ZV90IG1mbl9wdGUodW5zaWduZWQgbG9uZyBwYWdlX25yLCBwZ3Byb3RfdCBwZ3Byb3QpCit7CisJcHRlX3QgcHRlOworCisJcHRlLnB0ZSA9ICgocGh5c19hZGRyX3QpcGFnZV9uciA8PCBQQUdFX1NISUZUKSB8CisJCShwZ3Byb3RfdmFsKHBncHJvdCkgJiBfX3N1cHBvcnRlZF9wdGVfbWFzayk7CisKKwlyZXR1cm4gcHRlOworfQorCitzdGF0aWMgaW5saW5lIHB0ZXZhbF90IHB0ZV92YWxfbWEocHRlX3QgcHRlKQoreworCXJldHVybiBwdGUucHRlOworfQorCitzdGF0aWMgaW5saW5lIHB0ZV90IF9fcHRlX21hKHB0ZXZhbF90IHgpCit7CisJcmV0dXJuIChwdGVfdCkgeyAucHRlID0geCB9OworfQorCisjaWZkZWYgQ09ORklHX1g4Nl9QQUUKKyNkZWZpbmUgcG1kX3ZhbF9tYSh2KSAoKHYpLnBtZCkKKyNkZWZpbmUgcHVkX3ZhbF9tYSh2KSAoKHYpLnBnZC5wZ2QpCisjZGVmaW5lIF9fcG1kX21hKHgpCSgocG1kX3QpIHsgKHgpIH0gKQorI2Vsc2UgIC8qICFYODZfUEFFICovCisjZGVmaW5lIHBtZF92YWxfbWEodikJKCh2KS5wdWQucGdkLnBnZCkKKyNlbmRpZgkvKiBDT05GSUdfWDg2X1BBRSAqLworCisjZGVmaW5lIHBnZF92YWxfbWEoeCkJKCh4KS5wZ2QpCisKKworeG1hZGRyX3QgYXJiaXRyYXJ5X3ZpcnRfdG9fbWFjaGluZSh1bnNpZ25lZCBsb25nIGFkZHJlc3MpOwordm9pZCBtYWtlX2xvd21lbV9wYWdlX3JlYWRvbmx5KHZvaWQgKnZhZGRyKTsKK3ZvaWQgbWFrZV9sb3dtZW1fcGFnZV9yZWFkd3JpdGUodm9pZCAqdmFkZHIpOworCisjZW5kaWYgLyogX19YRU5fUEFHRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RldmljZS1tYXBwZXIuaCBiL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oCmluZGV4IGNiNzg0NTcuLmFkM2I3ODcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oCisrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwMSBTaXN0aW5hIFNvZnR3YXJlIChVSykgTGltaXRlZC4KLSAqIENvcHlyaWdodCAoQykgMjAwNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBMR1BMLgogICovCkBAIC0xMCw2ICsxMCw4IEBACiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKKyNpbmNsdWRlIDxsaW51eC9iaW8uaD4KKwogc3RydWN0IGRtX3RhcmdldDsKIHN0cnVjdCBkbV90YWJsZTsKIHN0cnVjdCBkbV9kZXY7CkBAIC0yNTAsMTEgKzI1Miw5NyBAQAogICovCiBpbnQgZG1fc3dhcF90YWJsZShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQsIHN0cnVjdCBkbV90YWJsZSAqdCk7CiAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE1hY3Jvcy4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgRE1fTkFNRSAiZGV2aWNlLW1hcHBlciIKKworI2RlZmluZSBETUVSUihmLCBhcmcuLi4pIFwKKwlwcmludGsoS0VSTl9FUlIgRE1fTkFNRSAiOiAiIERNX01TR19QUkVGSVggIjogIiBmICJcbiIsICMjIGFyZykKKyNkZWZpbmUgRE1FUlJfTElNSVQoZiwgYXJnLi4uKSBcCisJZG8geyBcCisJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCVwKKwkJCXByaW50ayhLRVJOX0VSUiBETV9OQU1FICI6ICIgRE1fTVNHX1BSRUZJWCAiOiAiIFwKKwkJCSAgICAgICBmICJcbiIsICMjIGFyZyk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIERNV0FSTihmLCBhcmcuLi4pIFwKKwlwcmludGsoS0VSTl9XQVJOSU5HIERNX05BTUUgIjogIiBETV9NU0dfUFJFRklYICI6ICIgZiAiXG4iLCAjIyBhcmcpCisjZGVmaW5lIERNV0FSTl9MSU1JVChmLCBhcmcuLi4pIFwKKwlkbyB7IFwKKwkJaWYgKHByaW50a19yYXRlbGltaXQoKSkJXAorCQkJcHJpbnRrKEtFUk5fV0FSTklORyBETV9OQU1FICI6ICIgRE1fTVNHX1BSRUZJWCAiOiAiIFwKKwkJCSAgICAgICBmICJcbiIsICMjIGFyZyk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIERNSU5GTyhmLCBhcmcuLi4pIFwKKwlwcmludGsoS0VSTl9JTkZPIERNX05BTUUgIjogIiBETV9NU0dfUFJFRklYICI6ICIgZiAiXG4iLCAjIyBhcmcpCisjZGVmaW5lIERNSU5GT19MSU1JVChmLCBhcmcuLi4pIFwKKwlkbyB7IFwKKwkJaWYgKHByaW50a19yYXRlbGltaXQoKSkJXAorCQkJcHJpbnRrKEtFUk5fSU5GTyBETV9OQU1FICI6ICIgRE1fTVNHX1BSRUZJWCAiOiAiIGYgXAorCQkJICAgICAgICJcbiIsICMjIGFyZyk7IFwKKwl9IHdoaWxlICgwKQorCisjaWZkZWYgQ09ORklHX0RNX0RFQlVHCisjICBkZWZpbmUgRE1ERUJVRyhmLCBhcmcuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBETV9OQU1FICI6ICIgRE1fTVNHX1BSRUZJWCAiIERFQlVHOiAiIGYgIlxuIiwgIyMgYXJnKQorIyAgZGVmaW5lIERNREVCVUdfTElNSVQoZiwgYXJnLi4uKSBcCisJZG8geyBcCisJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCVwKKwkJCXByaW50ayhLRVJOX0RFQlVHIERNX05BTUUgIjogIiBETV9NU0dfUFJFRklYICI6ICIgZiBcCisJCQkgICAgICAgIlxuIiwgIyMgYXJnKTsgXAorCX0gd2hpbGUgKDApCisjZWxzZQorIyAgZGVmaW5lIERNREVCVUcoZiwgYXJnLi4uKSBkbyB7fSB3aGlsZSAoMCkKKyMgIGRlZmluZSBETURFQlVHX0xJTUlUKGYsIGFyZy4uLikgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSBETUVNSVQoeC4uLikgc3ogKz0gKChzeiA+PSBtYXhsZW4pID8gXAorCQkJICAwIDogc2NucHJpbnRmKHJlc3VsdCArIHN6LCBtYXhsZW4gLSBzeiwgeCkpCisKKyNkZWZpbmUgU0VDVE9SX1NISUZUIDkKKwogLyoKLSAqIFByZXBhcmUgYSB0YWJsZSBmb3IgYSBkZXZpY2UgdGhhdCB3aWxsIGVycm9yIGFsbCBJL08uCi0gKiBUbyBtYWtlIGl0IGFjdGl2ZSwgY2FsbCBkbV9zdXNwZW5kKCksIGRtX3N3YXBfdGFibGUoKSB0aGVuIGRtX3Jlc3VtZSgpLgorICogRGVmaW5pdGlvbnMgb2YgcmV0dXJuIHZhbHVlcyBmcm9tIHRhcmdldCBlbmRfaW8gZnVuY3Rpb24uCiAgKi8KLWludCBkbV9jcmVhdGVfZXJyb3JfdGFibGUoc3RydWN0IGRtX3RhYmxlICoqcmVzdWx0LCBzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOworI2RlZmluZSBETV9FTkRJT19JTkNPTVBMRVRFCTEKKyNkZWZpbmUgRE1fRU5ESU9fUkVRVUVVRQkyCisKKy8qCisgKiBEZWZpbml0aW9ucyBvZiByZXR1cm4gdmFsdWVzIGZyb20gdGFyZ2V0IG1hcCBmdW5jdGlvbi4KKyAqLworI2RlZmluZSBETV9NQVBJT19TVUJNSVRURUQJMAorI2RlZmluZSBETV9NQVBJT19SRU1BUFBFRAkxCisjZGVmaW5lIERNX01BUElPX1JFUVVFVUUJRE1fRU5ESU9fUkVRVUVVRQorCisvKgorICogQ2VpbGluZyhuIC8gc3opCisgKi8KKyNkZWZpbmUgZG1fZGl2X3VwKG4sIHN6KSAoKChuKSArIChzeikgLSAxKSAvIChzeikpCisKKyNkZWZpbmUgZG1fc2VjdG9yX2Rpdl91cChuLCBzeikgKCBcCit7IFwKKwlzZWN0b3JfdCBfciA9ICgobikgKyAoc3opIC0gMSk7IFwKKwlzZWN0b3JfZGl2KF9yLCAoc3opKTsgXAorCV9yOyBcCit9IFwKKykKKworLyoKKyAqIGNlaWxpbmcobiAvIHNpemUpICogc2l6ZQorICovCisjZGVmaW5lIGRtX3JvdW5kX3VwKG4sIHN6KSAoZG1fZGl2X3VwKChuKSwgKHN6KSkgKiAoc3opKQorCitzdGF0aWMgaW5saW5lIHNlY3Rvcl90IHRvX3NlY3Rvcih1bnNpZ25lZCBsb25nIG4pCit7CisJcmV0dXJuIChuID4+IFNFQ1RPUl9TSElGVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0b19ieXRlcyhzZWN0b3JfdCBuKQoreworCXJldHVybiAobiA8PCBTRUNUT1JfU0hJRlQpOworfQogCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogI2VuZGlmCS8qIF9MSU5VWF9ERVZJQ0VfTUFQUEVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG0tZGlydHktbG9nLmggYi9pbmNsdWRlL2xpbnV4L2RtLWRpcnR5LWxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMGM1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2RtLWRpcnR5LWxvZy5oCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFNpc3RpbmEgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA4IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZpY2UtTWFwcGVyIGRpcnR5IHJlZ2lvbiBsb2cuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBMR1BMLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0RNX0RJUlRZX0xPRworI2RlZmluZSBfTElOVVhfRE1fRElSVFlfTE9HCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS1tYXBwZXIuaD4KKwordHlwZWRlZiBzZWN0b3JfdCByZWdpb25fdDsKKworc3RydWN0IGRtX2RpcnR5X2xvZ190eXBlOworCitzdHJ1Y3QgZG1fZGlydHlfbG9nIHsKKwlzdHJ1Y3QgZG1fZGlydHlfbG9nX3R5cGUgKnR5cGU7CisJdm9pZCAqY29udGV4dDsKK307CisKK3N0cnVjdCBkbV9kaXJ0eV9sb2dfdHlwZSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgbW9kdWxlICptb2R1bGU7CisKKwlpbnQgKCpjdHIpKHN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZywgc3RydWN0IGRtX3RhcmdldCAqdGksCisJCSAgIHVuc2lnbmVkIGFyZ2MsIGNoYXIgKiphcmd2KTsKKwl2b2lkICgqZHRyKShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2cpOworCisJLyoKKwkgKiBUaGVyZSBhcmUgdGltZXMgd2hlbiB3ZSBkb24ndCB3YW50IHRoZSBsb2cgdG8gdG91Y2gKKwkgKiB0aGUgZGlzay4KKwkgKi8KKwlpbnQgKCpwcmVzdXNwZW5kKShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2cpOworCWludCAoKnBvc3RzdXNwZW5kKShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2cpOworCWludCAoKnJlc3VtZSkoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nKTsKKworCS8qCisJICogUmV0cmlldmVzIHRoZSBzbWFsbGVzdCBzaXplIG9mIHJlZ2lvbiB0aGF0IHRoZSBsb2cgY2FuCisJICogZGVhbCB3aXRoLgorCSAqLworCXVpbnQzMl90ICgqZ2V0X3JlZ2lvbl9zaXplKShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2cpOworCisJLyoKKwkgKiBBIHByZWRpY2F0ZSB0byBzYXkgd2hldGhlciBhIHJlZ2lvbiBpcyBjbGVhbiBvciBub3QuCisJICogTWF5IGJsb2NrLgorCSAqLworCWludCAoKmlzX2NsZWFuKShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2csIHJlZ2lvbl90IHJlZ2lvbik7CisKKwkvKgorCSAqICBSZXR1cm5zOiAwLCAxLCAtRVdPVUxEQkxPQ0ssIDwgMAorCSAqCisJICogQSBwcmVkaWNhdGUgZnVuY3Rpb24gdG8gY2hlY2sgdGhlIGFyZWEgZ2l2ZW4gYnkKKwkgKiBbc2VjdG9yLCBzZWN0b3IgKyBsZW4pIGlzIGluIHN5bmMuCisJICoKKwkgKiBJZiAtRVdPVUxEQkxPQ0sgaXMgcmV0dXJuZWQgdGhlIHN0YXRlIG9mIHRoZSByZWdpb24gaXMKKwkgKiB1bmtub3duLCB0eXBpY2FsbHkgdGhpcyB3aWxsIHJlc3VsdCBpbiBhIHJlYWQgYmVpbmcKKwkgKiBwYXNzZWQgdG8gYSBkYWVtb24gdG8gZGVhbCB3aXRoLCBzaW5jZSBhIGRhZW1vbiBpcworCSAqIGFsbG93ZWQgdG8gYmxvY2suCisJICovCisJaW50ICgqaW5fc3luYykoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nLCByZWdpb25fdCByZWdpb24sCisJCSAgICAgICBpbnQgY2FuX2Jsb2NrKTsKKworCS8qCisJICogRmx1c2ggdGhlIGN1cnJlbnQgbG9nIHN0YXRlIChlZywgdG8gZGlzaykuICBUaGlzCisJICogZnVuY3Rpb24gbWF5IGJsb2NrLgorCSAqLworCWludCAoKmZsdXNoKShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2cpOworCisJLyoKKwkgKiBNYXJrIGFuIGFyZWEgYXMgY2xlYW4gb3IgZGlydHkuICBUaGVzZSBmdW5jdGlvbnMgbWF5CisJICogYmxvY2ssIHRob3VnaCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyBibG9ja2luZyBzaG91bGQKKwkgKiBiZSBleHRyZW1lbHkgcmFyZSAoZWcsIGFsbG9jYXRpbmcgYW5vdGhlciBjaHVuayBvZgorCSAqIG1lbW9yeSBmb3Igc29tZSByZWFzb24pLgorCSAqLworCXZvaWQgKCptYXJrX3JlZ2lvbikoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nLCByZWdpb25fdCByZWdpb24pOworCXZvaWQgKCpjbGVhcl9yZWdpb24pKHN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZywgcmVnaW9uX3QgcmVnaW9uKTsKKworCS8qCisJICogUmV0dXJuczogPDAgKGVycm9yKSwgMCAobm8gcmVnaW9uKSwgMSAocmVnaW9uKQorCSAqCisJICogVGhlIG1pcnJvcmQgd2lsbCBuZWVkIHBlcmZvcm0gcmVjb3Zlcnkgb24gcmVnaW9ucyBvZgorCSAqIHRoZSBtaXJyb3IgdGhhdCBhcmUgaW4gdGhlIE5PU1lOQyBzdGF0ZS4gIFRoaXMKKwkgKiBmdW5jdGlvbiBhc2tzIHRoZSBsb2cgdG8gdGVsbCB0aGUgY2FsbGVyIGFib3V0IHRoZQorCSAqIG5leHQgcmVnaW9uIHRoYXQgdGhpcyBtYWNoaW5lIHNob3VsZCByZWNvdmVyLgorCSAqCisJICogRG8gbm90IGNvbmZ1c2UgdGhpcyBmdW5jdGlvbiB3aXRoICdpbl9zeW5jKCknLCBvbmUKKwkgKiB0ZWxscyB5b3UgaWYgYW4gYXJlYSBpcyBzeW5jaHJvbmlzZWQsIHRoZSBvdGhlcgorCSAqIGFzc2lnbnMgcmVjb3Zlcnkgd29yay4KKwkqLworCWludCAoKmdldF9yZXN5bmNfd29yaykoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nLCByZWdpb25fdCAqcmVnaW9uKTsKKworCS8qCisJICogVGhpcyBub3RpZmllcyB0aGUgbG9nIHRoYXQgdGhlIHJlc3luYyBzdGF0dXMgb2YgYSByZWdpb24KKwkgKiBoYXMgY2hhbmdlZC4gIEl0IGFsc28gY2xlYXJzIHRoZSByZWdpb24gZnJvbSB0aGUgcmVjb3ZlcmluZworCSAqIGxpc3QgKGlmIHByZXNlbnQpLgorCSAqLworCXZvaWQgKCpzZXRfcmVnaW9uX3N5bmMpKHN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZywKKwkJCQlyZWdpb25fdCByZWdpb24sIGludCBpbl9zeW5jKTsKKworCS8qCisJICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlZ2lvbnMgdGhhdCBhcmUgaW4gc3luYy4KKwkgKi8KKwlyZWdpb25fdCAoKmdldF9zeW5jX2NvdW50KShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2cpOworCisJLyoKKwkgKiBTdXBwb3J0IGZ1bmN0aW9uIGZvciBtaXJyb3Igc3RhdHVzIHJlcXVlc3RzLgorCSAqLworCWludCAoKnN0YXR1cykoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nLCBzdGF0dXNfdHlwZV90IHN0YXR1c190eXBlLAorCQkgICAgICBjaGFyICpyZXN1bHQsIHVuc2lnbmVkIG1heGxlbik7Cit9OworCitpbnQgZG1fZGlydHlfbG9nX3R5cGVfcmVnaXN0ZXIoc3RydWN0IGRtX2RpcnR5X2xvZ190eXBlICp0eXBlKTsKK2ludCBkbV9kaXJ0eV9sb2dfdHlwZV91bnJlZ2lzdGVyKHN0cnVjdCBkbV9kaXJ0eV9sb2dfdHlwZSAqdHlwZSk7CisKKy8qCisgKiBNYWtlIHN1cmUgeW91IHVzZSB0aGVzZSB0d28gZnVuY3Rpb25zLCByYXRoZXIgdGhhbiBjYWxsaW5nCisgKiB0eXBlLT5jb25zdHJ1Y3Rvci9kZXN0cnVjdG9yKCkgZGlyZWN0bHkuCisgKi8KK3N0cnVjdCBkbV9kaXJ0eV9sb2cgKmRtX2RpcnR5X2xvZ19jcmVhdGUoY29uc3QgY2hhciAqdHlwZV9uYW1lLAorCQkJCQkgc3RydWN0IGRtX3RhcmdldCAqdGksCisJCQkJCSB1bnNpZ25lZCBhcmdjLCBjaGFyICoqYXJndik7Cit2b2lkIGRtX2RpcnR5X2xvZ19kZXN0cm95KHN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZyk7CisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisjZW5kaWYJLyogX0xJTlVYX0RNX0RJUlRZX0xPR19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWlvLmggYi9pbmNsdWRlL2xpbnV4L2RtLWlvLmgKc2ltaWxhcml0eSBpbmRleCA4MyUKcmVuYW1lIGZyb20gZHJpdmVycy9tZC9kbS1pby5oCnJlbmFtZSB0byBpbmNsdWRlL2xpbnV4L2RtLWlvLmgKaW5kZXggZjY0N2UyYy4uYjZiZjE3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1pby5oCisrKyBiL2luY2x1ZGUvbGludXgvZG0taW8uaApAQCAtMSwxNSArMSwyMCBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwMyBTaXN0aW5hIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDA4IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZpY2UtTWFwcGVyIGxvdy1sZXZlbCBJL08uCiAgKgogICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCiAgKi8KIAotI2lmbmRlZiBfRE1fSU9fSAotI2RlZmluZSBfRE1fSU9fSAorI2lmbmRlZiBfTElOVVhfRE1fSU9fSAorI2RlZmluZSBfTElOVVhfRE1fSU9fSAogCi0jaW5jbHVkZSAiZG0uaCIKKyNpZmRlZiBfX0tFUk5FTF9fCiAKLXN0cnVjdCBpb19yZWdpb24geworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBkbV9pb19yZWdpb24gewogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiAJc2VjdG9yX3Qgc2VjdG9yOwogCXNlY3Rvcl90IGNvdW50OwkJLyogSWYgdGhpcyBpcyB6ZXJvIHRoZSByZWdpb24gaXMgaWdub3JlZC4gKi8KQEAgLTc0LDYgKzc5LDcgQEAKICAqIGVycm9yIG9jY3VycmVkIGRvaW5nIGlvIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJlZ2lvbi4KICAqLwogaW50IGRtX2lvKHN0cnVjdCBkbV9pb19yZXF1ZXN0ICppb19yZXEsIHVuc2lnbmVkIG51bV9yZWdpb25zLAotCSAgc3RydWN0IGlvX3JlZ2lvbiAqcmVnaW9uLCB1bnNpZ25lZCBsb25nICpzeW5jX2Vycm9yX2JpdHMpOworCSAgc3RydWN0IGRtX2lvX3JlZ2lvbiAqcmVnaW9uLCB1bnNpZ25lZCBsb25nICpzeW5jX2Vycm9yX2JpdHMpOwogCi0jZW5kaWYKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisjZW5kaWYJLyogX0xJTlVYX0RNX0lPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG0ta2NvcHlkLmggYi9pbmNsdWRlL2xpbnV4L2RtLWtjb3B5ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYjIxNjMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2RtLWtjb3B5ZC5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDAzIFNpc3RpbmEgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAwNCAtIDIwMDggUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIGtjb3B5ZCBwcm92aWRlcyBhIHNpbXBsZSBpbnRlcmZhY2UgZm9yIGNvcHlpbmcgYW4gYXJlYSBvZiBvbmUKKyAqIGJsb2NrLWRldmljZSB0byBvbmUgb3IgbW9yZSBvdGhlciBibG9jay1kZXZpY2VzLCBlaXRoZXIgc3luY2hyb25vdXMKKyAqIG9yIHdpdGggYW4gYXN5bmNocm9ub3VzIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0RNX0tDT1BZRF9ICisjZGVmaW5lIF9MSU5VWF9ETV9LQ09QWURfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZG0taW8uaD4KKworLyogRklYTUU6IG1ha2UgdGhpcyBjb25maWd1cmFibGUgKi8KKyNkZWZpbmUgRE1fS0NPUFlEX01BWF9SRUdJT05TIDgKKworI2RlZmluZSBETV9LQ09QWURfSUdOT1JFX0VSUk9SIDEKKworLyoKKyAqIFRvIHVzZSBrY29weWQgeW91IG11c3QgZmlyc3QgY3JlYXRlIGEgZG1fa2NvcHlkX2NsaWVudCBvYmplY3QuCisgKi8KK3N0cnVjdCBkbV9rY29weWRfY2xpZW50OworaW50IGRtX2tjb3B5ZF9jbGllbnRfY3JlYXRlKHVuc2lnbmVkIG51bV9wYWdlcywKKwkJCSAgICBzdHJ1Y3QgZG1fa2NvcHlkX2NsaWVudCAqKnJlc3VsdCk7Cit2b2lkIGRtX2tjb3B5ZF9jbGllbnRfZGVzdHJveShzdHJ1Y3QgZG1fa2NvcHlkX2NsaWVudCAqa2MpOworCisvKgorICogU3VibWl0IGEgY29weSBqb2IgdG8ga2NvcHlkLiAgVGhpcyBpcyBidWlsdCBvbiB0b3Agb2YgdGhlCisgKiBwcmV2aW91cyB0aHJlZSBmbnMuCisgKgorICogcmVhZF9lcnIgaXMgYSBib29sZWFuLAorICogd3JpdGVfZXJyIGlzIGEgYml0c2V0LCB3aXRoIDEgYml0IGZvciBlYWNoIGRlc3RpbmF0aW9uIHJlZ2lvbgorICovCit0eXBlZGVmIHZvaWQgKCpkbV9rY29weWRfbm90aWZ5X2ZuKShpbnQgcmVhZF9lcnIsIHVuc2lnbmVkIGxvbmcgd3JpdGVfZXJyLAorCQkJCSAgICB2b2lkICpjb250ZXh0KTsKKworaW50IGRtX2tjb3B5ZF9jb3B5KHN0cnVjdCBkbV9rY29weWRfY2xpZW50ICprYywgc3RydWN0IGRtX2lvX3JlZ2lvbiAqZnJvbSwKKwkJICAgdW5zaWduZWQgbnVtX2Rlc3RzLCBzdHJ1Y3QgZG1faW9fcmVnaW9uICpkZXN0cywKKwkJICAgdW5zaWduZWQgZmxhZ3MsIGRtX2tjb3B5ZF9ub3RpZnlfZm4gZm4sIHZvaWQgKmNvbnRleHQpOworCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworI2VuZGlmCS8qIF9MSU5VWF9ETV9LQ09QWURfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oCmluZGV4IGNjMmJlMmMuLjY1NTZmMmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmgKQEAgLTk3Myw2ICs5NzMsNyBAQAogLyogZnMvbG9ja3MuYyAqLwogZXh0ZXJuIHZvaWQgbG9ja3NfaW5pdF9sb2NrKHN0cnVjdCBmaWxlX2xvY2sgKik7CiBleHRlcm4gdm9pZCBsb2Nrc19jb3B5X2xvY2soc3RydWN0IGZpbGVfbG9jayAqLCBzdHJ1Y3QgZmlsZV9sb2NrICopOworZXh0ZXJuIHZvaWQgX19sb2Nrc19jb3B5X2xvY2soc3RydWN0IGZpbGVfbG9jayAqLCBjb25zdCBzdHJ1Y3QgZmlsZV9sb2NrICopOwogZXh0ZXJuIHZvaWQgbG9ja3NfcmVtb3ZlX3Bvc2l4KHN0cnVjdCBmaWxlICosIGZsX293bmVyX3QpOwogZXh0ZXJuIHZvaWQgbG9ja3NfcmVtb3ZlX2Zsb2NrKHN0cnVjdCBmaWxlICopOwogZXh0ZXJuIHZvaWQgcG9zaXhfdGVzdF9sb2NrKHN0cnVjdCBmaWxlICosIHN0cnVjdCBmaWxlX2xvY2sgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lucHV0LmggYi9pbmNsdWRlL2xpbnV4L2lucHV0LmgKaW5kZXggY2FlMmMzNS4uMjhhMDk0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbnB1dC5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5wdXQuaApAQCAtMTAyNSwxMCArMTAyNSw2IEBACiAgKiBAbm9kZTogdXNlZCB0byBwbGFjZSB0aGUgZGV2aWNlIG9udG8gaW5wdXRfZGV2X2xpc3QKICAqLwogc3RydWN0IGlucHV0X2RldiB7Ci0JLyogcHJpdmF0ZTogKi8KLQl2b2lkICpwcml2YXRlOwkvKiBkbyBub3QgdXNlICovCi0JLyogcHVibGljOiAqLwotCiAJY29uc3QgY2hhciAqbmFtZTsKIAljb25zdCBjaGFyICpwaHlzOwogCWNvbnN0IGNoYXIgKnVuaXE7CkBAIC0xMjM4LDEyICsxMjM0LDEyIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqaW5wdXRfZ2V0X2RydmRhdGEoc3RydWN0IGlucHV0X2RldiAqZGV2KQogewotCXJldHVybiBkZXYtPnByaXZhdGU7CisJcmV0dXJuIGRldl9nZXRfZHJ2ZGF0YSgmZGV2LT5kZXYpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5wdXRfc2V0X2RydmRhdGEoc3RydWN0IGlucHV0X2RldiAqZGV2LCB2b2lkICpkYXRhKQogewotCWRldi0+cHJpdmF0ZSA9IGRhdGE7CisJZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldiwgZGF0YSk7CiB9CiAKIGludCBfX211c3RfY2hlY2sgaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBpbnB1dF9kZXYgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tleWJvYXJkLmggYi9pbmNsdWRlL2xpbnV4L2tleWJvYXJkLmgKaW5kZXggNjVjMmQ3MC4uYTNjOTg0ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rZXlib2FyZC5oCisrKyBiL2luY2x1ZGUvbGludXgva2V5Ym9hcmQuaApAQCAtMzMsNiArMzMsNyBAQAogCXN0cnVjdCB2Y19kYXRhICp2YzsJLyogVkMgb24gd2hpY2ggdGhlIGtleWJvYXJkIHByZXNzIHdhcyBkb25lICovCiAJaW50IGRvd247CQkvKiBQcmVzc3VyZSBvZiB0aGUga2V5PyAqLwogCWludCBzaGlmdDsJCS8qIEN1cnJlbnQgc2hpZnQgbWFzayAqLworCWludCBsZWRzdGF0ZTsJCS8qIEN1cnJlbnQgbGVkIHN0YXRlICovCiAJdW5zaWduZWQgaW50IHZhbHVlOwkvKiBrZXljb2RlLCB1bmljb2RlIHZhbHVlIG9yIGtleXN5bSAqLwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sb2NrZC9sb2NrZC5oIGIvaW5jbHVkZS9saW51eC9sb2NrZC9sb2NrZC5oCmluZGV4IDk0NjQ5YTguLjEwMmQ5MjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbG9ja2QvbG9ja2QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xvY2tkL2xvY2tkLmgKQEAgLTE5NCw3ICsxOTQsNyBAQAogICogVGhpcyBpcyB1c2VkIGluIGdhcmJhZ2UgY29sbGVjdGlvbiBhbmQgcmVzb3VyY2UgcmVjbGFpbQogICogQSByZXR1cm4gdmFsdWUgIT0gMCBtZWFucyBkZXN0cm95IHRoZSBsb2NrL2Jsb2NrL3NoYXJlCiAgKi8KLXR5cGVkZWYgaW50CSAgKCpubG1faG9zdF9tYXRjaF9mbl90KShzdHJ1Y3QgbmxtX2hvc3QgKmN1ciwgc3RydWN0IG5sbV9ob3N0ICpyZWYpOwordHlwZWRlZiBpbnQJICAoKm5sbV9ob3N0X21hdGNoX2ZuX3QpKHZvaWQgKmN1ciwgc3RydWN0IG5sbV9ob3N0ICpyZWYpOwogCiAvKgogICogU2VydmVyLXNpZGUgbG9jayBoYW5kbGluZwpAQCAtMjIwLDYgKzIyMCwxMiBAQAogdm9pZAkJICBubG1zdmNfZnJlZV9ob3N0X3Jlc291cmNlcyhzdHJ1Y3QgbmxtX2hvc3QgKik7CiB2b2lkCQkgIG5sbXN2Y19pbnZhbGlkYXRlX2FsbCh2b2lkKTsKIAorLyoKKyAqIENsdXN0ZXIgZmFpbG92ZXIgc3VwcG9ydAorICovCitpbnQgICAgICAgICAgIG5sbXN2Y191bmxvY2tfYWxsX2J5X3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworaW50ICAgICAgICAgICBubG1zdmNfdW5sb2NrX2FsbF9ieV9pcChfX2JlMzIgc2VydmVyX2FkZHIpOworCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBpbm9kZSAqbmxtc3ZjX2ZpbGVfaW5vZGUoc3RydWN0IG5sbV9maWxlICpmaWxlKQogewogCXJldHVybiBmaWxlLT5mX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9pbmZ0bC5oIGIvaW5jbHVkZS9saW51eC9tdGQvaW5mdGwuaAppbmRleCA2OTc3NzgwLi44NWZkMDQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9pbmZ0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL2luZnRsLmgKQEAgLTU3LDYgKzU3LDExIEBACiB2b2lkIElORlRMX2R1bXB0YWJsZXMoc3RydWN0IElORlRMcmVjb3JkICpzKTsKIHZvaWQgSU5GVExfZHVtcFZVY2hhaW5zKHN0cnVjdCBJTkZUTHJlY29yZCAqcyk7CiAKK2ludCBpbmZ0bF9yZWFkX29vYihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mZnMsIHNpemVfdCBsZW4sCisJCSAgIHNpemVfdCAqcmV0bGVuLCB1aW50OF90ICpidWYpOworaW50IGluZnRsX3dyaXRlX29vYihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mZnMsIHNpemVfdCBsZW4sCisJCSAgICBzaXplX3QgKnJldGxlbiwgdWludDhfdCAqYnVmKTsKKwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmIC8qIF9fTVREX0lORlRMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvbmZ0bC5oIGIvaW5jbHVkZS9saW51eC9tdGQvbmZ0bC5oCmluZGV4IGJjZjJmYjMuLjAwMWVlYzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXRkL25mdGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9uZnRsLmgKQEAgLTQzLDYgKzQzLDExIEBACiBpbnQgTkZUTF9tb3VudChzdHJ1Y3QgTkZUTHJlY29yZCAqcyk7CiBpbnQgTkZUTF9mb3JtYXRibG9jayhzdHJ1Y3QgTkZUTHJlY29yZCAqcywgaW50IGJsb2NrKTsKIAoraW50IG5mdGxfcmVhZF9vb2Ioc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZmZzLCBzaXplX3QgbGVuLAorCQkgIHNpemVfdCAqcmV0bGVuLCB1aW50OF90ICpidWYpOworaW50IG5mdGxfd3JpdGVfb29iKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2Zmcywgc2l6ZV90IGxlbiwKKwkJICAgc2l6ZV90ICpyZXRsZW4sIHVpbnQ4X3QgKmJ1Zik7CisKICNpZm5kZWYgTkZUTF9NQUpPUgogI2RlZmluZSBORlRMX01BSk9SIDkzCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL29uZW5hbmQuaCBiL2luY2x1ZGUvbGludXgvbXRkL29uZW5hbmQuaAppbmRleCBmZDBhMjYwLi45YWEyYTkxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9vbmVuYW5kLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvb25lbmFuZC5oCkBAIC0xODcsNCArMTg3LDcgQEAKICAgICAgICAgY2hhciAqbmFtZTsKIH07CiAKK2ludCBvbmVuYW5kX2JidF9yZWFkX29vYihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sCisJCQkgc3RydWN0IG10ZF9vb2Jfb3BzICpvcHMpOworCiAjZW5kaWYJLyogX19MSU5VWF9NVERfT05FTkFORF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9wbGF0LXJhbS5oIGIvaW5jbHVkZS9saW51eC9tdGQvcGxhdC1yYW0uaAppbmRleCA5NjY3ODYzLi4wZTM3YWQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9wbGF0LXJhbS5oCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL3BsYXQtcmFtLmgKQEAgLTIxLDggKzIxLDkgQEAKICNkZWZpbmUgUExBVFJBTV9SVyAoMSkKIAogc3RydWN0IHBsYXRkYXRhX210ZF9yYW0gewotCWNoYXIJCQkqbWFwbmFtZTsKLQljaGFyCQkgICAgICAgKipwcm9iZXM7CisJY29uc3QgY2hhcgkJKm1hcG5hbWU7CisJY29uc3QgY2hhcgkJKiptYXBfcHJvYmVzOworCWNvbnN0IGNoYXIJCSoqcHJvYmVzOwogCXN0cnVjdCBtdGRfcGFydGl0aW9uCSpwYXJ0aXRpb25zOwogCWludAkJCSBucl9wYXJ0aXRpb25zOwogCWludAkJCSBiYW5rd2lkdGg7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZC5oIGIvaW5jbHVkZS9saW51eC9uZnNkL25mc2QuaAppbmRleCAyMWVlNDQwLi40MWQzMGM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzZC9uZnNkLmgKQEAgLTMyOSw3ICszMjksNyBAQAogKEZBVFRSNF9XT1JEMF9TSVpFICAgICAgICAgICAgICB8IEZBVFRSNF9XT1JEMF9BQ0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICNkZWZpbmUgTkZTRF9XUklURUFCTEVfQVRUUlNfV09SRDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogKEZBVFRSNF9XT1JEMV9NT0RFICAgICAgICAgICAgICB8IEZBVFRSNF9XT1JEMV9PV05FUiAgICAgICAgIHwgRkFUVFI0X1dPUkQxX09XTkVSX0dST1VQICAgICBcCi0gfCBGQVRUUjRfV09SRDFfVElNRV9BQ0NFU1NfU0VUIHwgRkFUVFI0X1dPUkQxX1RJTUVfTUVUQURBVEEgfCBGQVRUUjRfV09SRDFfVElNRV9NT0RJRllfU0VUKQorIHwgRkFUVFI0X1dPUkQxX1RJTUVfQUNDRVNTX1NFVCB8IEZBVFRSNF9XT1JEMV9USU1FX01PRElGWV9TRVQpCiAKICNlbmRpZiAvKiBDT05GSUdfTkZTRF9WNCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BoeS5oIGIvaW5jbHVkZS9saW51eC9waHkuaAppbmRleCA3NzljYmNkLi4wMmRmMjBmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BoeS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGh5LmgKQEAgLTM3OSw2ICszNzksMTggQEAKIH07CiAjZGVmaW5lIHRvX3BoeV9kcml2ZXIoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBwaHlfZHJpdmVyLCBkcml2ZXIpCiAKKyNkZWZpbmUgUEhZX0FOWV9JRCAiTUFUQ0ggQU5ZIFBIWSIKKyNkZWZpbmUgUEhZX0FOWV9VSUQgMHhmZmZmZmZmZgorCisvKiBBIFN0cnVjdHVyZSBmb3IgYm9hcmRzIHRvIHJlZ2lzdGVyIGZpeHVwcyB3aXRoIHRoZSBQSFkgTGliICovCitzdHJ1Y3QgcGh5X2ZpeHVwIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJY2hhciBidXNfaWRbQlVTX0lEX1NJWkVdOworCXUzMiBwaHlfdWlkOworCXUzMiBwaHlfdWlkX21hc2s7CisJaW50ICgqcnVuKShzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KTsKK307CisKIGludCBwaHlfcmVhZChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2LCB1MTYgcmVnbnVtKTsKIGludCBwaHlfd3JpdGUoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwgdTE2IHJlZ251bSwgdTE2IHZhbCk7CiBpbnQgZ2V0X3BoeV9pZChzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgYWRkciwgdTMyICpwaHlfaWQpOwpAQCAtMzg2LDggKzM5OCw4IEBACiBpbnQgcGh5X2NsZWFyX2ludGVycnVwdChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KTsKIGludCBwaHlfY29uZmlnX2ludGVycnVwdChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2LCB1MzIgaW50ZXJydXB0cyk7CiBzdHJ1Y3QgcGh5X2RldmljZSAqIHBoeV9hdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJY29uc3QgY2hhciAqcGh5X2lkLCB1MzIgZmxhZ3MsIHBoeV9pbnRlcmZhY2VfdCBpbnRlcmZhY2UpOwotc3RydWN0IHBoeV9kZXZpY2UgKiBwaHlfY29ubmVjdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpwaHlfaWQsCisJCWNvbnN0IGNoYXIgKmJ1c19pZCwgdTMyIGZsYWdzLCBwaHlfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKTsKK3N0cnVjdCBwaHlfZGV2aWNlICogcGh5X2Nvbm5lY3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVzX2lkLAogCQl2b2lkICgqaGFuZGxlcikoc3RydWN0IG5ldF9kZXZpY2UgKiksIHUzMiBmbGFncywKIAkJcGh5X2ludGVyZmFjZV90IGludGVyZmFjZSk7CiB2b2lkIHBoeV9kaXNjb25uZWN0KHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpOwpAQCAtNDI3LDUgKzQzOSwxMyBAQAogc3RydWN0IHBoeV9kZXZpY2UqIHBoeV9kZXZpY2VfY3JlYXRlKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBhZGRyLCBpbnQgcGh5X2lkKTsKIHZvaWQgcGh5X2RldmljZV9mcmVlKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpOwogCitpbnQgcGh5X3JlZ2lzdGVyX2ZpeHVwKGNvbnN0IGNoYXIgKmJ1c19pZCwgdTMyIHBoeV91aWQsIHUzMiBwaHlfdWlkX21hc2ssCisJCWludCAoKnJ1bikoc3RydWN0IHBoeV9kZXZpY2UgKikpOworaW50IHBoeV9yZWdpc3Rlcl9maXh1cF9mb3JfaWQoY29uc3QgY2hhciAqYnVzX2lkLAorCQlpbnQgKCpydW4pKHN0cnVjdCBwaHlfZGV2aWNlICopKTsKK2ludCBwaHlfcmVnaXN0ZXJfZml4dXBfZm9yX3VpZCh1MzIgcGh5X3VpZCwgdTMyIHBoeV91aWRfbWFzaywKKwkJaW50ICgqcnVuKShzdHJ1Y3QgcGh5X2RldmljZSAqKSk7CitpbnQgcGh5X3NjYW5fZml4dXBzKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpOworCiBleHRlcm4gc3RydWN0IGJ1c190eXBlIG1kaW9fYnVzX3R5cGU7CiAjZW5kaWYgLyogX19QSFlfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXJpby5oIGIvaW5jbHVkZS9saW51eC9zZXJpby5oCmluZGV4IDlmMzgyNTAuLjk1Njc0ZDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcmlvLmgKQEAgLTIxMSw1ICsyMTEsNiBAQAogI2RlZmluZSBTRVJJT19UT1VDSFdJTgkweDMzCiAjZGVmaW5lIFNFUklPX1RBT1NFVk0JMHgzNAogI2RlZmluZSBTRVJJT19GVUpJVFNVCTB4MzUKKyNkZWZpbmUgU0VSSU9fWkhFTkhVQQkweDM2CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGkvYWRzNzg0Ni5oIGIvaW5jbHVkZS9saW51eC9zcGkvYWRzNzg0Ni5oCmluZGV4IDMzNGQzMTQuLmRhZjc0NDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3BpL2Fkczc4NDYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaS9hZHM3ODQ2LmgKQEAgLTE0LDcgKzE0LDggQEAKIHN0cnVjdCBhZHM3ODQ2X3BsYXRmb3JtX2RhdGEgewogCXUxNgltb2RlbDsJCQkvKiA3ODQzLCA3ODQ1LCA3ODQ2LiAqLwogCXUxNgl2cmVmX2RlbGF5X3VzZWNzOwkvKiAwIGZvciBleHRlcm5hbCB2cmVmOyBldGMgKi8KLQlpbnQJa2VlcF92cmVmX29uOjE7CQkvKiBzZXQgdG8ga2VlcCB2cmVmIG9uIGZvciBkaWZmZXJlbnRpYWwKKwl1MTYJdnJlZl9tdjsJCS8qIGV4dGVybmFsIHZyZWYgdmFsdWUsIG1pbGxpVm9sdHMgKi8KKwlib29sCWtlZXBfdnJlZl9vbjsJCS8qIHNldCB0byBrZWVwIHZyZWYgb24gZm9yIGRpZmZlcmVudGlhbAogCQkJCQkgKiBtZWFzdXJlbWVudHMgYXMgd2VsbCAqLwogCiAJLyogU2V0dGxpbmcgdGltZSBvZiB0aGUgYW5hbG9nIHNpZ25hbHM7IGEgZnVuY3Rpb24gb2YgVmNjIGFuZCB0aGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiLmggYi9pbmNsdWRlL2xpbnV4L3VzYi5oCmluZGV4IDU4M2UwNDguLmMwODY4OWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IuaApAQCAtMjMsNiArMjMsNyBAQAogCiBzdHJ1Y3QgdXNiX2RldmljZTsKIHN0cnVjdCB1c2JfZHJpdmVyOworc3RydWN0IHd1c2JfZGV2OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC0zNDEsMTAzICszNDIsMTQ2IEBACiAKIHN0cnVjdCB1c2JfdHQ7CiAKLS8qCisvKioKICAqIHN0cnVjdCB1c2JfZGV2aWNlIC0ga2VybmVsJ3MgcmVwcmVzZW50YXRpb24gb2YgYSBVU0IgZGV2aWNlCisgKiBAZGV2bnVtOiBkZXZpY2UgbnVtYmVyOyBhZGRyZXNzIG9uIGEgVVNCIGJ1cworICogQGRldnBhdGg6IGRldmljZSBJRCBzdHJpbmcgZm9yIHVzZSBpbiBtZXNzYWdlcyAoZS5nLiwgL3BvcnQvLi4uKQorICogQHN0YXRlOiBkZXZpY2Ugc3RhdGU6IGNvbmZpZ3VyZWQsIG5vdCBhdHRhY2hlZCwgZXRjLgorICogQHNwZWVkOiBkZXZpY2Ugc3BlZWQ6IGhpZ2gvZnVsbC9sb3cgKG9yIGVycm9yKQorICogQHR0OiBUcmFuc2FjdGlvbiBUcmFuc2xhdG9yIGluZm87IHVzZWQgd2l0aCBsb3cvZnVsbCBzcGVlZCBkZXYsIGhpZ2hzcGVlZCBodWIKKyAqIEB0dHBvcnQ6IGRldmljZSBwb3J0IG9uIHRoYXQgdHQgaHViCisgKiBAdG9nZ2xlOiBvbmUgYml0IGZvciBlYWNoIGVuZHBvaW50LCB3aXRoIChbMF0gPSBJTiwgWzFdID0gT1VUKSBlbmRwb2ludHMKKyAqIEBwYXJlbnQ6IG91ciBodWIsIHVubGVzcyB3ZSdyZSB0aGUgcm9vdAorICogQGJ1czogYnVzIHdlJ3JlIHBhcnQgb2YKKyAqIEBlcDA6IGVuZHBvaW50IDAgZGF0YSAoZGVmYXVsdCBjb250cm9sIHBpcGUpCisgKiBAZGV2OiBnZW5lcmljIGRldmljZSBpbnRlcmZhY2UKKyAqIEBkZXNjcmlwdG9yOiBVU0IgZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBjb25maWc6IGFsbCBvZiB0aGUgZGV2aWNlJ3MgY29uZmlncworICogQGFjdGNvbmZpZzogdGhlIGFjdGl2ZSBjb25maWd1cmF0aW9uCisgKiBAZXBfaW46IGFycmF5IG9mIElOIGVuZHBvaW50cworICogQGVwX291dDogYXJyYXkgb2YgT1VUIGVuZHBvaW50cworICogQHJhd2Rlc2NyaXB0b3JzOiByYXcgZGVzY3JpcHRvcnMgZm9yIGVhY2ggY29uZmlnCisgKiBAYnVzX21BOiBDdXJyZW50IGF2YWlsYWJsZSBmcm9tIHRoZSBidXMKKyAqIEBwb3J0bnVtOiBwYXJlbnQgcG9ydCBudW1iZXIgKG9yaWdpbiAxKQorICogQGxldmVsOiBudW1iZXIgb2YgVVNCIGh1YiBhbmNlc3RvcnMKKyAqIEBjYW5fc3VibWl0OiBVUkJzIG1heSBiZSBzdWJtaXR0ZWQKKyAqIEBkaXNjb25fc3VzcGVuZGVkOiBkaXNjb25uZWN0ZWQgd2hpbGUgc3VzcGVuZGVkCisgKiBAcGVyc2lzdF9lbmFibGVkOiAgVVNCX1BFUlNJU1QgZW5hYmxlZCBmb3IgdGhpcyBkZXZpY2UKKyAqIEBoYXZlX2xhbmdpZDogd2hldGhlciBzdHJpbmdfbGFuZ2lkIGlzIHZhbGlkCisgKiBAYXV0aG9yaXplZDogcG9saWN5IGhhcyBzYWlkIHdlIGNhbiB1c2UgaXQ7CisgKgkodXNlciBzcGFjZSkgcG9saWN5IGRldGVybWluZXMgaWYgd2UgYXV0aG9yaXplIHRoaXMgZGV2aWNlIHRvIGJlCisgKgl1c2VkIG9yIG5vdC4gQnkgZGVmYXVsdCwgd2lyZWQgVVNCIGRldmljZXMgYXJlIGF1dGhvcml6ZWQuCisgKglXVVNCIGRldmljZXMgYXJlIG5vdCwgdW50aWwgd2UgYXV0aG9yaXplIHRoZW0gZnJvbSB1c2VyIHNwYWNlLgorICoJRklYTUUgLS0gY29tcGxldGUgZG9jCisgKiBAYXV0aGVudGljYXRlZDogQ3J5cHRvIGF1dGhlbnRpY2F0aW9uIHBhc3NlZAorICogQHd1c2I6IGRldmljZSBpcyBXaXJlbGVzcyBVU0IKKyAqIEBzdHJpbmdfbGFuZ2lkOiBsYW5ndWFnZSBJRCBmb3Igc3RyaW5ncworICogQHByb2R1Y3Q6IGlQcm9kdWN0IHN0cmluZywgaWYgcHJlc2VudCAoc3RhdGljKQorICogQG1hbnVmYWN0dXJlcjogaU1hbnVmYWN0dXJlciBzdHJpbmcsIGlmIHByZXNlbnQgKHN0YXRpYykKKyAqIEBzZXJpYWw6IGlTZXJpYWxOdW1iZXIgc3RyaW5nLCBpZiBwcmVzZW50IChzdGF0aWMpCisgKiBAZmlsZWxpc3Q6IHVzYmZzIGZpbGVzIHRoYXQgYXJlIG9wZW4gdG8gdGhpcyBkZXZpY2UKKyAqIEB1c2JfY2xhc3NkZXY6IFVTQiBjbGFzcyBkZXZpY2UgdGhhdCB3YXMgY3JlYXRlZCBmb3IgdXNiZnMgZGV2aWNlCisgKglhY2Nlc3MgZnJvbSB1c2Vyc3BhY2UKKyAqIEB1c2Jmc19kZW50cnk6IHVzYmZzIGRlbnRyeSBlbnRyeSBmb3IgdGhlIGRldmljZQorICogQG1heGNoaWxkOiBudW1iZXIgb2YgcG9ydHMgaWYgaHViCisgKiBAY2hpbGRyZW46IGNoaWxkIGRldmljZXMgLSBVU0IgZGV2aWNlcyB0aGF0IGFyZSBhdHRhY2hlZCB0byB0aGlzIGh1YgorICogQHBtX3VzYWdlX2NudDogdXNhZ2UgY291bnRlciBmb3IgYXV0b3N1c3BlbmQKKyAqIEBxdWlya3M6IHF1aXJrcyBvZiB0aGUgd2hvbGUgZGV2aWNlCisgKiBAdXJibnVtOiBudW1iZXIgb2YgVVJCcyBzdWJtaXR0ZWQgZm9yIHRoZSB3aG9sZSBkZXZpY2UKKyAqIEBhY3RpdmVfZHVyYXRpb246IHRvdGFsIHRpbWUgZGV2aWNlIGlzIG5vdCBzdXNwZW5kZWQKKyAqIEBhdXRvc3VzcGVuZDogZm9yIGRlbGF5ZWQgYXV0b3N1c3BlbmRzCisgKiBAcG1fbXV0ZXg6IHByb3RlY3RzIFBNIG9wZXJhdGlvbnMKKyAqIEBsYXN0X2J1c3k6IHRpbWUgb2YgbGFzdCB1c2UKKyAqIEBhdXRvc3VzcGVuZF9kZWxheTogaW4gamlmZmllcworICogQGNvbm5lY3RfdGltZTogdGltZSBkZXZpY2Ugd2FzIGZpcnN0IGNvbm5lY3RlZAorICogQGF1dG9fcG06IGF1dG9zdXNwZW5kL3Jlc3VtZSBpbiBwcm9ncmVzcworICogQGRvX3JlbW90ZV93YWtldXA6ICByZW1vdGUgd2FrZXVwIHNob3VsZCBiZSBlbmFibGVkCisgKiBAcmVzZXRfcmVzdW1lOiBuZWVkcyByZXNldCBpbnN0ZWFkIG9mIHJlc3VtZQorICogQGF1dG9zdXNwZW5kX2Rpc2FibGVkOiBhdXRvc3VzcGVuZCBkaXNhYmxlZCBieSB0aGUgdXNlcgorICogQGF1dG9yZXN1bWVfZGlzYWJsZWQ6IGF1dG9yZXN1bWUgZGlzYWJsZWQgYnkgdGhlIHVzZXIKKyAqIEBza2lwX3N5c19yZXN1bWU6IHNraXAgdGhlIG5leHQgc3lzdGVtIHJlc3VtZQogICoKLSAqIEZJWE1FOiBXcml0ZSB0aGUga2VybmVsZG9jIQotICoKKyAqIE5vdGVzOgogICogVXNiY29yZSBkcml2ZXJzIHNob3VsZCBub3Qgc2V0IHVzYmRldi0+c3RhdGUgZGlyZWN0bHkuICBJbnN0ZWFkIHVzZQogICogdXNiX3NldF9kZXZpY2Vfc3RhdGUoKS4KLSAqCi0gKiBAYXV0aG9yaXplZDogKHVzZXIgc3BhY2UpIHBvbGljeSBkZXRlcm1pbmVzIGlmIHdlIGF1dGhvcml6ZSB0aGlzCi0gKiAgICAgICAgICAgICAgZGV2aWNlIHRvIGJlIHVzZWQgb3Igbm90LiBCeSBkZWZhdWx0LCB3aXJlZCBVU0IKLSAqICAgICAgICAgICAgICBkZXZpY2VzIGFyZSBhdXRob3JpemVkLiBXVVNCIGRldmljZXMgYXJlIG5vdCwgdW50aWwgd2UKLSAqICAgICAgICAgICAgICBhdXRob3JpemUgdGhlbSBmcm9tIHVzZXIgc3BhY2UuIEZJWE1FIC0tIGNvbXBsZXRlIGRvYwogICovCiBzdHJ1Y3QgdXNiX2RldmljZSB7Ci0JaW50CQlkZXZudW07CQkvKiBBZGRyZXNzIG9uIFVTQiBidXMgKi8KLQljaGFyCQlkZXZwYXRoIFsxNl07CS8qIFVzZSBpbiBtZXNzYWdlczogL3BvcnQvcG9ydC8uLi4gKi8KLQllbnVtIHVzYl9kZXZpY2Vfc3RhdGUJc3RhdGU7CS8qIGNvbmZpZ3VyZWQsIG5vdCBhdHRhY2hlZCwgZXRjICovCi0JZW51bSB1c2JfZGV2aWNlX3NwZWVkCXNwZWVkOwkvKiBoaWdoL2Z1bGwvbG93IChvciBlcnJvcikgKi8KKwlpbnQJCWRldm51bTsKKwljaGFyCQlkZXZwYXRoIFsxNl07CisJZW51bSB1c2JfZGV2aWNlX3N0YXRlCXN0YXRlOworCWVudW0gdXNiX2RldmljZV9zcGVlZAlzcGVlZDsKIAotCXN0cnVjdCB1c2JfdHQJKnR0OyAJCS8qIGxvdy9mdWxsIHNwZWVkIGRldiwgaGlnaHNwZWVkIGh1YiAqLwotCWludAkJdHRwb3J0OwkJLyogZGV2aWNlIHBvcnQgb24gdGhhdCB0dCBodWIgKi8KKwlzdHJ1Y3QgdXNiX3R0CSp0dDsKKwlpbnQJCXR0cG9ydDsKIAotCXVuc2lnbmVkIGludCB0b2dnbGVbMl07CQkvKiBvbmUgYml0IGZvciBlYWNoIGVuZHBvaW50Ci0JCQkJCSAqIChbMF0gPSBJTiwgWzFdID0gT1VUKSAqLworCXVuc2lnbmVkIGludCB0b2dnbGVbMl07CiAKLQlzdHJ1Y3QgdXNiX2RldmljZSAqcGFyZW50OwkvKiBvdXIgaHViLCB1bmxlc3Mgd2UncmUgdGhlIHJvb3QgKi8KLQlzdHJ1Y3QgdXNiX2J1cyAqYnVzOwkJLyogQnVzIHdlJ3JlIHBhcnQgb2YgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZSAqcGFyZW50OworCXN0cnVjdCB1c2JfYnVzICpidXM7CiAJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50IGVwMDsKIAotCXN0cnVjdCBkZXZpY2UgZGV2OwkJLyogR2VuZXJpYyBkZXZpY2UgaW50ZXJmYWNlICovCisJc3RydWN0IGRldmljZSBkZXY7CiAKLQlzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yIGRlc2NyaXB0b3I7LyogRGVzY3JpcHRvciAqLwotCXN0cnVjdCB1c2JfaG9zdF9jb25maWcgKmNvbmZpZzsJLyogQWxsIG9mIHRoZSBjb25maWdzICovCisJc3RydWN0IHVzYl9kZXZpY2VfZGVzY3JpcHRvciBkZXNjcmlwdG9yOworCXN0cnVjdCB1c2JfaG9zdF9jb25maWcgKmNvbmZpZzsKIAotCXN0cnVjdCB1c2JfaG9zdF9jb25maWcgKmFjdGNvbmZpZzsvKiB0aGUgYWN0aXZlIGNvbmZpZ3VyYXRpb24gKi8KKwlzdHJ1Y3QgdXNiX2hvc3RfY29uZmlnICphY3Rjb25maWc7CiAJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcF9pblsxNl07CiAJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcF9vdXRbMTZdOwogCi0JY2hhciAqKnJhd2Rlc2NyaXB0b3JzOwkJLyogUmF3IGRlc2NyaXB0b3JzIGZvciBlYWNoIGNvbmZpZyAqLworCWNoYXIgKipyYXdkZXNjcmlwdG9yczsKIAotCXVuc2lnbmVkIHNob3J0IGJ1c19tQTsJCS8qIEN1cnJlbnQgYXZhaWxhYmxlIGZyb20gdGhlIGJ1cyAqLwotCXU4IHBvcnRudW07CQkJLyogUGFyZW50IHBvcnQgbnVtYmVyIChvcmlnaW4gMSkgKi8KLQl1OCBsZXZlbDsJCQkvKiBOdW1iZXIgb2YgVVNCIGh1YiBhbmNlc3RvcnMgKi8KKwl1bnNpZ25lZCBzaG9ydCBidXNfbUE7CisJdTggcG9ydG51bTsKKwl1OCBsZXZlbDsKIAotCXVuc2lnbmVkIGNhbl9zdWJtaXQ6MTsJCS8qIFVSQnMgbWF5IGJlIHN1Ym1pdHRlZCAqLwotCXVuc2lnbmVkIGRpc2Nvbl9zdXNwZW5kZWQ6MTsJLyogRGlzY29ubmVjdGVkIHdoaWxlIHN1c3BlbmRlZCAqLwotCXVuc2lnbmVkIGhhdmVfbGFuZ2lkOjE7CQkvKiB3aGV0aGVyIHN0cmluZ19sYW5naWQgaXMgdmFsaWQgKi8KLQl1bnNpZ25lZCBhdXRob3JpemVkOjE7CQkvKiBQb2xpY3kgaGFzIHNhaWQgd2UgY2FuIHVzZSBpdCAqLwotCXVuc2lnbmVkIHd1c2I6MTsJCS8qIERldmljZSBpcyBXaXJlbGVzcyBVU0IgKi8KLQlpbnQgc3RyaW5nX2xhbmdpZDsJCS8qIGxhbmd1YWdlIElEIGZvciBzdHJpbmdzICovCisJdW5zaWduZWQgY2FuX3N1Ym1pdDoxOworCXVuc2lnbmVkIGRpc2Nvbl9zdXNwZW5kZWQ6MTsKKwl1bnNpZ25lZCBwZXJzaXN0X2VuYWJsZWQ6MTsKKwl1bnNpZ25lZCBoYXZlX2xhbmdpZDoxOworCXVuc2lnbmVkIGF1dGhvcml6ZWQ6MTsKKyAJdW5zaWduZWQgYXV0aGVudGljYXRlZDoxOworCXVuc2lnbmVkIHd1c2I6MTsKKwlpbnQgc3RyaW5nX2xhbmdpZDsKIAogCS8qIHN0YXRpYyBzdHJpbmdzIGZyb20gdGhlIGRldmljZSAqLwotCWNoYXIgKnByb2R1Y3Q7CQkJLyogaVByb2R1Y3Qgc3RyaW5nLCBpZiBwcmVzZW50ICovCi0JY2hhciAqbWFudWZhY3R1cmVyOwkJLyogaU1hbnVmYWN0dXJlciBzdHJpbmcsIGlmIHByZXNlbnQgKi8KLQljaGFyICpzZXJpYWw7CQkJLyogaVNlcmlhbE51bWJlciBzdHJpbmcsIGlmIHByZXNlbnQgKi8KKwljaGFyICpwcm9kdWN0OworCWNoYXIgKm1hbnVmYWN0dXJlcjsKKwljaGFyICpzZXJpYWw7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZpbGVsaXN0OwogI2lmZGVmIENPTkZJR19VU0JfREVWSUNFX0NMQVNTCiAJc3RydWN0IGRldmljZSAqdXNiX2NsYXNzZGV2OwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1VTQl9ERVZJQ0VGUwotCXN0cnVjdCBkZW50cnkgKnVzYmZzX2RlbnRyeTsJLyogdXNiZnMgZGVudHJ5IGVudHJ5IGZvciB0aGUgZGV2aWNlICovCisJc3RydWN0IGRlbnRyeSAqdXNiZnNfZGVudHJ5OwogI2VuZGlmCi0JLyoKLQkgKiBDaGlsZCBkZXZpY2VzIC0gdGhlc2UgY2FuIGJlIGVpdGhlciBuZXcgZGV2aWNlcwotCSAqIChpZiB0aGlzIGlzIGEgaHViIGRldmljZSksIG9yIGRpZmZlcmVudCBpbnN0YW5jZXMKLQkgKiBvZiB0aGlzIHNhbWUgZGV2aWNlLgotCSAqCi0JICogRWFjaCBpbnN0YW5jZSBuZWVkcyBpdHMgb3duIHNldCBvZiBkYXRhIHN0cnVjdHVyZXMuCi0JICovCiAKLQlpbnQgbWF4Y2hpbGQ7CQkJLyogTnVtYmVyIG9mIHBvcnRzIGlmIGh1YiAqLworCWludCBtYXhjaGlsZDsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqY2hpbGRyZW5bVVNCX01BWENISUxEUkVOXTsKIAotCWludCBwbV91c2FnZV9jbnQ7CQkvKiB1c2FnZSBjb3VudGVyIGZvciBhdXRvc3VzcGVuZCAqLwotCXUzMiBxdWlya3M7CQkJLyogcXVpcmtzIG9mIHRoZSB3aG9sZSBkZXZpY2UgKi8KLQlhdG9taWNfdCB1cmJudW07CQkvKiBudW1iZXIgb2YgVVJCcyBzdWJtaXR0ZWQgZm9yCi0JCQkJCSAgIHRoZSB3aG9sZSBkZXZpY2UgKi8KKwlpbnQgcG1fdXNhZ2VfY250OworCXUzMiBxdWlya3M7CisJYXRvbWljX3QgdXJibnVtOwogCi0JdW5zaWduZWQgbG9uZyBhY3RpdmVfZHVyYXRpb247CS8qIHRvdGFsIHRpbWUgZGV2aWNlIGlzIG5vdCBzdXNwZW5kZWQgKi8KKwl1bnNpZ25lZCBsb25nIGFjdGl2ZV9kdXJhdGlvbjsKIAogI2lmZGVmIENPTkZJR19QTQotCXN0cnVjdCBkZWxheWVkX3dvcmsgYXV0b3N1c3BlbmQ7IC8qIGZvciBkZWxheWVkIGF1dG9zdXNwZW5kcyAqLwotCXN0cnVjdCBtdXRleCBwbV9tdXRleDsJCS8qIHByb3RlY3RzIFBNIG9wZXJhdGlvbnMgKi8KKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGF1dG9zdXNwZW5kOworCXN0cnVjdCBtdXRleCBwbV9tdXRleDsKIAotCXVuc2lnbmVkIGxvbmcgbGFzdF9idXN5OwkvKiB0aW1lIG9mIGxhc3QgdXNlICovCi0JaW50IGF1dG9zdXNwZW5kX2RlbGF5OwkJLyogaW4gamlmZmllcyAqLwotCXVuc2lnbmVkIGxvbmcgY29ubmVjdF90aW1lOwkvKiB0aW1lIGRldmljZSB3YXMgZmlyc3QgY29ubmVjdGVkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X2J1c3k7CisJaW50IGF1dG9zdXNwZW5kX2RlbGF5OworCXVuc2lnbmVkIGxvbmcgY29ubmVjdF90aW1lOwogCi0JdW5zaWduZWQgYXV0b19wbToxOwkJLyogYXV0b3N1c3BlbmQvcmVzdW1lIGluIHByb2dyZXNzICovCi0JdW5zaWduZWQgZG9fcmVtb3RlX3dha2V1cDoxOwkvKiByZW1vdGUgd2FrZXVwIHNob3VsZCBiZSBlbmFibGVkICovCi0JdW5zaWduZWQgcmVzZXRfcmVzdW1lOjE7CS8qIG5lZWRzIHJlc2V0IGluc3RlYWQgb2YgcmVzdW1lICovCi0JdW5zaWduZWQgcGVyc2lzdF9lbmFibGVkOjE7CS8qIFVTQl9QRVJTSVNUIGVuYWJsZWQgZm9yIHRoaXMgZGV2ICovCi0JdW5zaWduZWQgYXV0b3N1c3BlbmRfZGlzYWJsZWQ6MTsgLyogYXV0b3N1c3BlbmQgYW5kIGF1dG9yZXN1bWUgKi8KLQl1bnNpZ25lZCBhdXRvcmVzdW1lX2Rpc2FibGVkOjE7ICAvKiAgZGlzYWJsZWQgYnkgdGhlIHVzZXIgKi8KLQl1bnNpZ25lZCBza2lwX3N5c19yZXN1bWU6MTsJLyogc2tpcCB0aGUgbmV4dCBzeXN0ZW0gcmVzdW1lICovCisJdW5zaWduZWQgYXV0b19wbToxOworCXVuc2lnbmVkIGRvX3JlbW90ZV93YWtldXA6MTsKKwl1bnNpZ25lZCByZXNldF9yZXN1bWU6MTsKKwl1bnNpZ25lZCBhdXRvc3VzcGVuZF9kaXNhYmxlZDoxOworCXVuc2lnbmVkIGF1dG9yZXN1bWVfZGlzYWJsZWQ6MTsKKwl1bnNpZ25lZCBza2lwX3N5c19yZXN1bWU6MTsKICNlbmRpZgorCXN0cnVjdCB3dXNiX2RldiAqd3VzYl9kZXY7CiB9OwogI2RlZmluZQl0b191c2JfZGV2aWNlKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgdXNiX2RldmljZSwgZGV2KQogCkBAIC04OTgsMTAgKzk0MiwxMSBAQAogICoJYW5kIHNob3VsZCBub3JtYWxseSBiZSB0aGUgc2FtZSBhcyB0aGUgbW9kdWxlIG5hbWUuCiAgKiBAcHJvYmU6IENhbGxlZCB0byBzZWUgaWYgdGhlIGRyaXZlciBpcyB3aWxsaW5nIHRvIG1hbmFnZSBhIHBhcnRpY3VsYXIKICAqCWludGVyZmFjZSBvbiBhIGRldmljZS4gIElmIGl0IGlzLCBwcm9iZSByZXR1cm5zIHplcm8gYW5kIHVzZXMKLSAqCWRldl9zZXRfZHJ2ZGF0YSgpIHRvIGFzc29jaWF0ZSBkcml2ZXItc3BlY2lmaWMgZGF0YSB3aXRoIHRoZQorICoJdXNiX3NldF9pbnRmZGF0YSgpIHRvIGFzc29jaWF0ZSBkcml2ZXItc3BlY2lmaWMgZGF0YSB3aXRoIHRoZQogICoJaW50ZXJmYWNlLiAgSXQgbWF5IGFsc28gdXNlIHVzYl9zZXRfaW50ZXJmYWNlKCkgdG8gc3BlY2lmeSB0aGUKICAqCWFwcHJvcHJpYXRlIGFsdHNldHRpbmcuICBJZiB1bndpbGxpbmcgdG8gbWFuYWdlIHRoZSBpbnRlcmZhY2UsCi0gKglyZXR1cm4gYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZS4KKyAqCXJldHVybiAtRU5PREVWLCBpZiBnZW51aW5lIElPIGVycm9ycyBvY2N1cmVkLCBhbiBhcHByb3ByaWF0ZQorICoJbmVnYXRpdmUgZXJybm8gdmFsdWUuCiAgKiBAZGlzY29ubmVjdDogQ2FsbGVkIHdoZW4gdGhlIGludGVyZmFjZSBpcyBubyBsb25nZXIgYWNjZXNzaWJsZSwgdXN1YWxseQogICoJYmVjYXVzZSBpdHMgZGV2aWNlIGhhcyBiZWVuIChvciBpcyBiZWluZykgZGlzY29ubmVjdGVkIG9yIHRoZQogICoJZHJpdmVyIG1vZHVsZSBpcyBiZWluZyB1bmxvYWRlZC4KQEAgLTkxNiwxMCArOTYxLDcgQEAKICAqIEBwcmVfcmVzZXQ6IENhbGxlZCBieSB1c2JfcmVzZXRfY29tcG9zaXRlX2RldmljZSgpIHdoZW4gdGhlIGRldmljZQogICoJaXMgYWJvdXQgdG8gYmUgcmVzZXQuCiAgKiBAcG9zdF9yZXNldDogQ2FsbGVkIGJ5IHVzYl9yZXNldF9jb21wb3NpdGVfZGV2aWNlKCkgYWZ0ZXIgdGhlIGRldmljZQotICoJaGFzIGJlZW4gcmVzZXQsIG9yIGluIGxpZXUgb2YgQHJlc3VtZSBmb2xsb3dpbmcgYSByZXNldC1yZXN1bWUKLSAqCShpLmUuLCB0aGUgZGV2aWNlIGlzIHJlc2V0IGluc3RlYWQgb2YgYmVpbmcgcmVzdW1lZCwgYXMgbWlnaHQKLSAqCWhhcHBlbiBpZiBwb3dlciB3YXMgbG9zdCkuICBUaGUgc2Vjb25kIGFyZ3VtZW50IHRlbGxzIHdoaWNoIGlzCi0gKgl0aGUgcmVhc29uLgorICoJaGFzIGJlZW4gcmVzZXQKICAqIEBpZF90YWJsZTogVVNCIGRyaXZlcnMgdXNlIElEIHRhYmxlIHRvIHN1cHBvcnQgaG90cGx1Z2dpbmcuCiAgKglFeHBvcnQgdGhpcyB3aXRoIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLC4uLikuICBUaGlzIG11c3QgYmUgc2V0CiAgKglvciB5b3VyIGRyaXZlcidzIHByb2JlIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgZ2V0IGNhbGxlZC4KQEAgLTE0MTEsNiArMTQ1Myw3IEBACiBleHRlcm4gaW50IHVzYl91bmxpbmtfdXJiKHN0cnVjdCB1cmIgKnVyYik7CiBleHRlcm4gdm9pZCB1c2Jfa2lsbF91cmIoc3RydWN0IHVyYiAqdXJiKTsKIGV4dGVybiB2b2lkIHVzYl9raWxsX2FuY2hvcmVkX3VyYnMoc3RydWN0IHVzYl9hbmNob3IgKmFuY2hvcik7CitleHRlcm4gdm9pZCB1c2JfdW5saW5rX2FuY2hvcmVkX3VyYnMoc3RydWN0IHVzYl9hbmNob3IgKmFuY2hvcik7CiBleHRlcm4gdm9pZCB1c2JfYW5jaG9yX3VyYihzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCB1c2JfYW5jaG9yICphbmNob3IpOwogZXh0ZXJuIHZvaWQgdXNiX3VuYW5jaG9yX3VyYihzdHJ1Y3QgdXJiICp1cmIpOwogZXh0ZXJuIGludCB1c2Jfd2FpdF9hbmNob3JfZW1wdHlfdGltZW91dChzdHJ1Y3QgdXNiX2FuY2hvciAqYW5jaG9yLApAQCAtMTY2MSwxMyArMTcwNCwxMiBAQAogI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQogI2VuZGlmCiAKLSNkZWZpbmUgZXJyKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9FUlIgIiVzOiAiIGZvcm1hdCAiXG4iICwgXAotCV9fRklMRV9fICwgIyMgYXJnKQotI2RlZmluZSBpbmZvKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9JTkZPICIlczogIiBmb3JtYXQgIlxuIiAsIFwKLQlfX0ZJTEVfXyAsICMjIGFyZykKLSNkZWZpbmUgd2Fybihmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICIgZm9ybWF0ICJcbiIgLCBcCi0JX19GSUxFX18gLCAjIyBhcmcpCi0KKyNkZWZpbmUgZXJyKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9FUlIgS0JVSUxEX01PRE5BTUUgIjogIiBcCisJZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisjZGVmaW5lIGluZm8oZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX0lORk8gS0JVSUxEX01PRE5BTUUgIjogIiBcCisJZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisjZGVmaW5lIHdhcm4oZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgS0JVSUxEX01PRE5BTUUgIjogIiBcCisJZm9ybWF0ICJcbiIgLCAjIyBhcmcpCiAKICNlbmRpZiAgLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9hdWRpby5oIGIvaW5jbHVkZS9saW51eC91c2IvYXVkaW8uaAppbmRleCAyZGZlZWYxLi44Y2IwMjVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9hdWRpby5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL2F1ZGlvLmgKQEAgLTUwLDQgKzUwLDQgQEAKIAlfX3U4ICBiYUludGVyZmFjZU5yW25dOwkJCQkJXAogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKIAotI2VuZGlmCisjZW5kaWYgLyogX19MSU5VWF9VU0JfQVVESU9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvY2RjLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9jZGMuaAppbmRleCA5NGVlNGVjLi43MWU1MmYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9jZGMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9jZGMuaApAQCAtNiw2ICs2LDkgQEAKICAqIGZpcm13YXJlIGJhc2VkIFVTQiBwZXJpcGhlcmFscy4KICAqLwogCisjaWZuZGVmIF9fTElOVVhfVVNCX0NEQ19ICisjZGVmaW5lIF9fTElOVVhfVVNCX0NEQ19ICisKICNkZWZpbmUgVVNCX0NEQ19TVUJDTEFTU19BQ00JCQkweDAyCiAjZGVmaW5lIFVTQl9DRENfU1VCQ0xBU1NfRVRIRVJORVQJCTB4MDYKICNkZWZpbmUgVVNCX0NEQ19TVUJDTEFTU19XSENNCQkJMHgwOApAQCAtMjIxLDMgKzIyNCw0IEBACiAJX19sZTE2CXdMZW5ndGg7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAorI2VuZGlmIC8qIF9fTElOVVhfVVNCX0NEQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9jaDkuaCBiL2luY2x1ZGUvbGludXgvdXNiL2NoOS5oCmluZGV4IDYxNjk0MzguLjdlMGQzMDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL2NoOS5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL2NoOS5oCkBAIC02Niw4ICs2Niw4IEBACiAjZGVmaW5lIFVTQl9SRUNJUF9FTkRQT0lOVAkJMHgwMgogI2RlZmluZSBVU0JfUkVDSVBfT1RIRVIJCQkweDAzCiAvKiBGcm9tIFdpcmVsZXNzIFVTQiAxLjAgKi8KLSNkZWZpbmUgVVNCX1JFQ0lQX1BPUlQgCQkJMHgwNAotI2RlZmluZSBVU0JfUkVDSVBfUlBJUEUgCQkweDA1CisjZGVmaW5lIFVTQl9SRUNJUF9QT1JUCQkJMHgwNAorI2RlZmluZSBVU0JfUkVDSVBfUlBJUEUJCTB4MDUKIAogLyoKICAqIFN0YW5kYXJkIHJlcXVlc3RzLCBmb3IgdGhlIGJSZXF1ZXN0IGZpZWxkIG9mIGEgU0VUVVAgcGFja2V0LgpAQCAtMTAyLDEwICsxMDIsMTYgQEAKICNkZWZpbmUgVVNCX1JFUV9MT09QQkFDS19EQVRBX1JFQUQJMHgxNgogI2RlZmluZSBVU0JfUkVRX1NFVF9JTlRFUkZBQ0VfRFMJMHgxNwogCisvKiBUaGUgTGluayBQb3dlciBNYW5nZW1lbnQgKExQTSkgRUNOIGRlZmluZXMgVVNCX1JFUV9URVNUX0FORF9TRVQgY29tbWFuZCwKKyAqIHVzZWQgYnkgaHVicyB0byBwdXQgcG9ydHMgaW50byBhIG5ldyBMMSBzdXNwZW5kIHN0YXRlLCBleGNlcHQgdGhhdCBpdAorICogZm9yZ290IHRvIGRlZmluZSBpdHMgbnVtYmVyIC4uLgorICovCisKIC8qCiAgKiBVU0IgZmVhdHVyZSBmbGFncyBhcmUgd3JpdHRlbiB1c2luZyBVU0JfUkVRX3tDTEVBUixTRVR9X0ZFQVRVUkUsIGFuZAogICogYXJlIHJlYWQgYXMgYSBiaXQgYXJyYXkgcmV0dXJuZWQgYnkgVVNCX1JFUV9HRVRfU1RBVFVTLiAgKFNvIHRoZXJlCi0gKiBhcmUgYXQgbW9zdCBzaXh0ZWVuIGZlYXR1cmVzIG9mIGVhY2ggdHlwZS4pCisgKiBhcmUgYXQgbW9zdCBzaXh0ZWVuIGZlYXR1cmVzIG9mIGVhY2ggdHlwZS4pICBIdWJzIG1heSBhbHNvIHN1cHBvcnQgYQorICogbmV3IFVTQl9SRVFfVEVTVF9BTkRfU0VUX0ZFQVRVUkUgdG8gcHV0IHBvcnRzIGludG8gTDEgc3VzcGVuZC4KICAqLwogI2RlZmluZSBVU0JfREVWSUNFX1NFTEZfUE9XRVJFRAkJMAkvKiAocmVhZCBvbmx5KSAqLwogI2RlZmluZSBVU0JfREVWSUNFX1JFTU9URV9XQUtFVVAJMQkvKiBkZXYgbWF5IGluaXRpYXRlIHdha2V1cCAqLwpAQCAtMTgwLDYgKzE4Niw3IEBACiAjZGVmaW5lIFVTQl9EVF9XSVJFTEVTU19FTkRQT0lOVF9DT01QCTB4MTEKICNkZWZpbmUgVVNCX0RUX1dJUkVfQURBUFRFUgkJMHgyMQogI2RlZmluZSBVU0JfRFRfUlBJUEUJCQkweDIyCisjZGVmaW5lIFVTQl9EVF9DU19SQURJT19DT05UUk9MCQkweDIzCiAKIC8qIENvbnZlbnRpb25hbCBjb2RlcyBmb3IgY2xhc3Mtc3BlY2lmaWMgZGVzY3JpcHRvcnMuICBUaGUgY29udmVudGlvbiBpcwogICogZGVmaW5lZCBpbiB0aGUgVVNCICJDb21tb24gQ2xhc3MiIFNwZWMgKDMuMTEpLiAgSW5kaXZpZHVhbCBjbGFzcyBzcGVjcwpAQCAtNTc0LDcgKzU4MSw5IEBACiAJLyogTk9URTogIHRoZXJlIGFyZSBhY3R1YWxseSBmb3VyIGRpZmZlcmVudCBTVVNQRU5ERUQKIAkgKiBzdGF0ZXMsIHJldHVybmluZyB0byBQT1dFUkVELCBERUZBVUxULCBBRERSRVNTLCBvcgogCSAqIENPTkZJR1VSRUQgcmVzcGVjdGl2ZWx5IHdoZW4gU09GIHRva2VucyBmbG93IGFnYWluLgorCSAqIEF0IHRoaXMgbGV2ZWwgdGhlcmUncyBubyBkaWZmZXJlbmNlIGJldHdlZW4gTDEgYW5kIEwyCisJICogc3VzcGVuZCBzdGF0ZXMuICAoTDIgYmVpbmcgb3JpZ2luYWwgVVNCIDEuMSBzdXNwZW5kLikKIAkgKi8KIH07CiAKLSNlbmRpZgkvKiBfX0xJTlVYX1VTQl9DSDlfSCAqLworI2VuZGlmIC8qIF9fTElOVVhfVVNCX0NIOV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9nX3ByaW50ZXIuaCBiL2luY2x1ZGUvbGludXgvdXNiL2dfcHJpbnRlci5oCmluZGV4IDBjNWVhMWUuLjYxNzhmZGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL2dfcHJpbnRlci5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL2dfcHJpbnRlci5oCkBAIC0xOCw2ICsxOCw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KIAorI2lmbmRlZiBfX0xJTlVYX1VTQl9HX1BSSU5URVJfSAorI2RlZmluZSBfX0xJTlVYX1VTQl9HX1BSSU5URVJfSAogCiAjZGVmaW5lIFBSSU5URVJfTk9UX0VSUk9SCTB4MDgKICNkZWZpbmUgUFJJTlRFUl9TRUxFQ1RFRAkweDEwCkBAIC0yOSwzICszMSw1IEBACiAgKi8KICNkZWZpbmUgR0FER0VUX0dFVF9QUklOVEVSX1NUQVRVUwlfSU9SKCdnJywgMHgyMSwgdW5zaWduZWQgY2hhcikKICNkZWZpbmUgR0FER0VUX1NFVF9QUklOVEVSX1NUQVRVUwlfSU9XUignZycsIDB4MjIsIHVuc2lnbmVkIGNoYXIpCisKKyNlbmRpZiAvKiBfX0xJTlVYX1VTQl9HX1BSSU5URVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvZ2FkZ2V0LmggYi9pbmNsdWRlL2xpbnV4L3VzYi9nYWRnZXQuaAppbmRleCBmMzI5NTI5Li5kODEyOGY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9nYWRnZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9nYWRnZXQuaApAQCAtODQ2LDQgKzg0Niw0IEBACiAKIGV4dGVybiB2b2lkIHVzYl9lcF9hdXRvY29uZmlnX3Jlc2V0KHN0cnVjdCB1c2JfZ2FkZ2V0ICopIF9fZGV2aW5pdDsKIAotI2VuZGlmCS8qIF9fTElOVVhfVVNCX0dBREdFVF9IICovCisjZW5kaWYgLyogX19MSU5VWF9VU0JfR0FER0VUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL2dhZGdldGZzLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9nYWRnZXRmcy5oCmluZGV4IGMyOTFhYjEuLmVhNDVmMjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL2dhZGdldGZzLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IvZ2FkZ2V0ZnMuaApAQCAtMSwxMSArMSwzIEBACi0jaWZuZGVmIF9fTElOVVhfVVNCX0dBREdFVEZTX0gKLSNkZWZpbmUgX19MSU5VWF9VU0JfR0FER0VURlNfSAotCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2lvY3RsLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+Ci0KIC8qCiAgKiBGaWxlc3lzdGVtIGJhc2VkIHVzZXItbW9kZSBBUEkgdG8gVVNCIEdhZGdldCBjb250cm9sbGVyIGhhcmR3YXJlCiAgKgpAQCAtMjMsNiArMTUsMTQgQEAKICAqIHRoZW4gcGVyZm9ybWluZyBkYXRhIHRyYW5zZmVycyBieSByZWFkaW5nIG9yIHdyaXRpbmcuCiAgKi8KIAorI2lmbmRlZiBfX0xJTlVYX1VTQl9HQURHRVRGU19ICisjZGVmaW5lIF9fTElOVVhfVVNCX0dBREdFVEZTX0gKKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pb2N0bC5oPgorCisjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgorCiAvKgogICogRXZlbnRzIGFyZSBkZWxpdmVyZWQgb24gdGhlIGVwMCBmaWxlIGRlc2NyaXB0b3IsIHdoZW4gdGhlIHVzZXIgbW9kZSBkcml2ZXIKICAqIHJlYWRzIGZyb20gdGhpcyBmaWxlIGRlc2NyaXB0b3IgYWZ0ZXIgd3JpdGluZyB0aGUgZGVzY3JpcHRvcnMuICBEb24ndApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvaW5wdXQuaCBiL2luY2x1ZGUvbGludXgvdXNiL2lucHV0LmgKaW5kZXggNzE2ZTBjYy4uMGUwMTBiMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IvaW5wdXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9pbnB1dC5oCkBAIC0xLDYgKzEsMyBAQAotI2lmbmRlZiBfX1VTQl9JTlBVVF9ICi0jZGVmaW5lIF9fVVNCX0lOUFVUX0gKLQogLyoKICAqIENvcHlyaWdodCAoQykgMjAwNSBEbWl0cnkgVG9yb2tob3YKICAqCkBAIC05LDYgKzYsOSBAQAogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCisjaWZuZGVmIF9fTElOVVhfVVNCX0lOUFVUX0gKKyNkZWZpbmUgX19MSU5VWF9VU0JfSU5QVVRfSAorCiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CkBAIC0yMiw0ICsyMiw0IEBACiAJaWQtPnZlcnNpb24gPSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKTsKIH0KIAotI2VuZGlmCisjZW5kaWYgLyogX19MSU5VWF9VU0JfSU5QVVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvaW93YXJyaW9yLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9pb3dhcnJpb3IuaAppbmRleCBkZTZmMzgwLi40ZmQ2NTEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9pb3dhcnJpb3IuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9pb3dhcnJpb3IuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0lPV0FSUklPUl9IXwotI2RlZmluZSBfSU9XQVJSSU9SX0hfCisjaWZuZGVmIF9fTElOVVhfVVNCX0lPV0FSUklPUl9ICisjZGVmaW5lIF9fTElOVVhfVVNCX0lPV0FSUklPUl9ICiAKICNkZWZpbmUgQ09ERU1FUkNTX01BR0lDX05VTUJFUgkweEMwCS8qIGxpa2UgQ09kZSBNZXJjZW5hcmllcyAqLwogCkBAIC0zOSw0ICszOSw0IEBACiAqLwogI2RlZmluZSBJT1dfR0VUSU5GTyBfSU9SKENPREVNRVJDU19NQUdJQ19OVU1CRVIsIDMsIHN0cnVjdCBpb3dhcnJpb3JfaW5mbykKIAotI2VuZGlmICAvKiBfSU9XQVJSSU9SX0hfICovCisjZW5kaWYgLyogX19MSU5VWF9VU0JfSU9XQVJSSU9SX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL2lzcDExNnguaCBiL2luY2x1ZGUvbGludXgvdXNiL2lzcDExNnguaAppbmRleCA2N2QyODI2Li45NmNhMTE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9pc3AxMTZ4LmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IvaXNwMTE2eC5oCkBAIC0xLDkgKzEsMTEgQEAKLQogLyoKICAqIEJvYXJkIGluaXRpYWxpemF0aW9uIGNvZGUgc2hvdWxkIHB1dCBvbmUgb2YgdGhlc2UgaW50byBkZXYtPnBsYXRmb3JtX2RhdGEKICAqIGFuZCBwbGFjZSB0aGUgaXNwMTE2eCBvbnRvIHBsYXRmb3JtX2J1cy4KICAqLwogCisjaWZuZGVmIF9fTElOVVhfVVNCX0lTUDExNlhfSAorI2RlZmluZSBfX0xJTlVYX1VTQl9JU1AxMTZYX0gKKwogc3RydWN0IGlzcDExNnhfcGxhdGZvcm1fZGF0YSB7CiAJLyogRW5hYmxlIGludGVybmFsIHJlc2lzdG9ycyBvbiBkb3duc3RyZWFtIHBvcnRzICovCiAJdW5zaWduZWQgc2VsMTVLcmVzOjE7CkBAIC0yNywzICsyOSw1IEBACiAJICovCiAJdm9pZCAoKmRlbGF5KSAoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgZGVsYXkpOwogfTsKKworI2VuZGlmIC8qIF9fTElOVVhfVVNCX0lTUDExNlhfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvbWlkaS5oIGIvaW5jbHVkZS9saW51eC91c2IvbWlkaS5oCmluZGV4IDgwNjI0YzUuLjFkMTA0MDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL21pZGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9taWRpLmgKQEAgLTEwOSw0ICsxMDksNCBAQAogCV9fdTggIGJhQXNzb2NKYWNrSURbbl07CQkJCQlcCiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQogCi0jZW5kaWYKKyNlbmRpZiAvKiBfX0xJTlVYX1VTQl9NSURJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL25ldDIyODAuaCBiL2luY2x1ZGUvbGludXgvdXNiL25ldDIyODAuaAppbmRleCBlYzg5N2NiLi45NmNhNTQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9uZXQyMjgwLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IvbmV0MjI4MC5oCkBAIC0xLDExICsxLDcgQEAKIC8qCiAgKiBOZXRDaGlwIDIyODAgaGlnaC9mdWxsIHNwZWVkIFVTQiBkZXZpY2UgY29udHJvbGxlci4KICAqIFVubGlrZSBtYW55IHN1Y2ggY29udHJvbGxlcnMsIHRoaXMgb25lIHRhbGtzIFBDSS4KLSAqLwotI2lmbmRlZiBfX0xJTlVYX1VTQl9ORVQyMjgwX0gKLSNkZWZpbmUgX19MSU5VWF9VU0JfTkVUMjI4MF9ICi0KLS8qCisgKgogICogQ29weXJpZ2h0IChDKSAyMDAyIE5ldENoaXAgVGVjaG5vbG9neSwgSW5jLiAoaHR0cDovL3d3dy5uZXRjaGlwLmNvbSkKICAqIENvcHlyaWdodCAoQykgMjAwMyBEYXZpZCBCcm93bmVsbAogICoKQEAgLTI0LDYgKzIwLDkgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwogCisjaWZuZGVmIF9fTElOVVhfVVNCX05FVDIyODBfSAorI2RlZmluZSBfX0xJTlVYX1VTQl9ORVQyMjgwX0gKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyogTkVUMjI4MCBNRU1PUlkgTUFQUEVEIFJFR0lTVEVSUwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2Ivb3RnLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9vdGcuaAppbmRleCBlMDA3MDc0Li4xZGIyNWQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9vdGcuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9vdGcuaApAQCAtMSwxMSArMSwxMyBAQAogLyogVVNCIE9URyAoT24gVGhlIEdvKSBkZWZpbmVzICovCi0KIC8qCisgKgogICogVGhlc2UgQVBJcyBtYXkgYmUgdXNlZCBiZXR3ZWVuIFVTQiBjb250cm9sbGVycy4gIFVTQiBkZXZpY2UgZHJpdmVycwogICogKGZvciBlaXRoZXIgaG9zdCBvciBwZXJpcGhlcmFsIHJvbGVzKSBkb24ndCB1c2UgdGhlc2UgY2FsbHM7IHRoZXkKICAqIGNvbnRpbnVlIHRvIHVzZSBqdXN0IHVzYl9kZXZpY2UgYW5kIHVzYl9nYWRnZXQuCiAgKi8KIAorI2lmbmRlZiBfX0xJTlVYX1VTQl9PVEdfSAorI2RlZmluZSBfX0xJTlVYX1VTQl9PVEdfSAogCiAvKiBPVEcgZGVmaW5lcyBsb3RzIG9mIGVudW1lcmF0aW9uIHN0YXRlcyBiZWZvcmUgZGV2aWNlIHJlc2V0ICovCiBlbnVtIHVzYl9vdGdfc3RhdGUgewpAQCAtMTI5LDMgKzEzMSw1IEBACiAKIC8qIGZvciBPVEcgY29udHJvbGxlciBkcml2ZXJzIChhbmQgbWF5YmUgb3RoZXIgc3R1ZmYpICovCiBleHRlcm4gaW50IHVzYl9idXNfc3RhcnRfZW51bShzdHJ1Y3QgdXNiX2J1cyAqYnVzLCB1bnNpZ25lZCBwb3J0X251bSk7CisKKyNlbmRpZiAvKiBfX0xJTlVYX1VTQl9PVEdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvcXVpcmtzLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9xdWlya3MuaAppbmRleCAxZjk5OWVjLi43ZjZjNjAzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9xdWlya3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9xdWlya3MuaApAQCAtNCw2ICs0LDkgQEAKICAqIGJlbG9uZyBoZXJlLgogICovCiAKKyNpZm5kZWYgX19MSU5VWF9VU0JfUVVJUktTX0gKKyNkZWZpbmUgX19MSU5VWF9VU0JfUVVJUktTX0gKKwogLyogc3RyaW5nIGRlc2NyaXB0b3JzIG11c3Qgbm90IGJlIGZldGNoZWQgdXNpbmcgYSAyNTUtYnl0ZSByZWFkICovCiAjZGVmaW5lIFVTQl9RVUlSS19TVFJJTkdfRkVUQ0hfMjU1CTB4MDAwMDAwMDEKIApAQCAtMTIsMyArMTUsNSBAQAogCiAvKiBkZXZpY2UgY2FuJ3QgaGFuZGxlIFNldC1JbnRlcmZhY2UgcmVxdWVzdHMgKi8KICNkZWZpbmUgVVNCX1FVSVJLX05PX1NFVF9JTlRGCQkweDAwMDAwMDA0CisKKyNlbmRpZiAvKiBfX0xJTlVYX1VTQl9RVUlSS1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2Ivcm5kaXNfaG9zdC5oIGIvaW5jbHVkZS9saW51eC91c2Ivcm5kaXNfaG9zdC5oCmluZGV4IGVkYzFkNGEuLjI5ZDY0NTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL3JuZGlzX2hvc3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9ybmRpc19ob3N0LmgKQEAgLTE3LDEwICsxNyw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KIAotCi0jaWZuZGVmCV9fUk5ESVNfSE9TVF9ICi0jZGVmaW5lCV9fUk5ESVNfSE9TVF9ICi0KKyNpZm5kZWYJX19MSU5VWF9VU0JfUk5ESVNfSE9TVF9ICisjZGVmaW5lCV9fTElOVVhfVVNCX1JORElTX0hPU1RfSAogCiAvKgogICogQ09OVFJPTCB1c2VzIENEQyAiZW5jYXBzdWxhdGVkIGNvbW1hbmRzIiB3aXRoIGZ1bmt5IG5vdGlmaWNhdGlvbnMuCkBAIC0yNzAsNSArMjY4LDQgQEAKIGV4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqCiBybmRpc190eF9maXh1cChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsIGdmcF90IGZsYWdzKTsKIAotI2VuZGlmCS8qIF9fUk5ESVNfSE9TVF9IICovCi0KKyNlbmRpZgkvKiBfX0xJTlVYX1VTQl9STkRJU19IT1NUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL3NlcmlhbC5oIGIvaW5jbHVkZS9saW51eC91c2Ivc2VyaWFsLmgKaW5kZXggMjFiNGExYy4uOGY4OTFjYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2Ivc2VyaWFsLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2Ivc2VyaWFsLmgKQEAgLTEwLDcgKzEwLDYgQEAKICAqCiAgKi8KIAotCiAjaWZuZGVmIF9fTElOVVhfVVNCX1NFUklBTF9ICiAjZGVmaW5lIF9fTElOVVhfVVNCX1NFUklBTF9ICiAKQEAgLTE0Niw4ICsxNDUsNiBAQAogfTsKICNkZWZpbmUgdG9fdXNiX3NlcmlhbChkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IHVzYl9zZXJpYWwsIGtyZWYpCiAKLSNkZWZpbmUgTlVNX0RPTlRfQ0FSRQk5OQotCiAvKiBnZXQgYW5kIHNldCB0aGUgc2VyaWFsIHByaXZhdGUgZGF0YSBwb2ludGVyIGhlbHBlciBmdW5jdGlvbnMgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCAqdXNiX2dldF9zZXJpYWxfZGF0YShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQogewpAQCAtMTY1LDE4ICsxNjIsNiBAQAogICoJdXNlZCBpbiB0aGUgc3lzbG9nIG1lc3NhZ2VzIHdoZW4gYSBkZXZpY2UgaXMgaW5zZXJ0ZWQgb3IgcmVtb3ZlZC4KICAqIEBpZF90YWJsZTogcG9pbnRlciB0byBhIGxpc3Qgb2YgdXNiX2RldmljZV9pZCBzdHJ1Y3R1cmVzIHRoYXQgZGVmaW5lIGFsbAogICoJb2YgdGhlIGRldmljZXMgdGhpcyBzdHJ1Y3R1cmUgY2FuIHN1cHBvcnQuCi0gKiBAbnVtX2ludGVycnVwdF9pbjogSWYgYSBkZXZpY2UgZG9lc24ndCBoYXZlIHRoaXMgbWFueSBpbnRlcnJ1cHQtaW4KLSAqCWVuZHBvaW50cywgaXQgd29uJ3QgYmUgc2VudCB0byB0aGUgZHJpdmVyJ3MgYXR0YWNoKCkgbWV0aG9kLgotICoJKEJ1dCBpdCBtaWdodCBzdGlsbCBiZSBzZW50IHRvIHRoZSBwcm9iZSgpIG1ldGhvZC4pCi0gKiBAbnVtX2ludGVycnVwdF9vdXQ6IElmIGEgZGV2aWNlIGRvZXNuJ3QgaGF2ZSB0aGlzIG1hbnkgaW50ZXJydXB0LW91dAotICoJZW5kcG9pbnRzLCBpdCB3b24ndCBiZSBzZW50IHRvIHRoZSBkcml2ZXIncyBhdHRhY2goKSBtZXRob2QuCi0gKgkoQnV0IGl0IG1pZ2h0IHN0aWxsIGJlIHNlbnQgdG8gdGhlIHByb2JlKCkgbWV0aG9kLikKLSAqIEBudW1fYnVsa19pbjogSWYgYSBkZXZpY2UgZG9lc24ndCBoYXZlIHRoaXMgbWFueSBidWxrLWluCi0gKgllbmRwb2ludHMsIGl0IHdvbid0IGJlIHNlbnQgdG8gdGhlIGRyaXZlcidzIGF0dGFjaCgpIG1ldGhvZC4KLSAqCShCdXQgaXQgbWlnaHQgc3RpbGwgYmUgc2VudCB0byB0aGUgcHJvYmUoKSBtZXRob2QuKQotICogQG51bV9idWxrX291dDogSWYgYSBkZXZpY2UgZG9lc24ndCBoYXZlIHRoaXMgbWFueSBidWxrLW91dAotICoJZW5kcG9pbnRzLCBpdCB3b24ndCBiZSBzZW50IHRvIHRoZSBkcml2ZXIncyBhdHRhY2goKSBtZXRob2QuCi0gKgkoQnV0IGl0IG1pZ2h0IHN0aWxsIGJlIHNlbnQgdG8gdGhlIHByb2JlKCkgbWV0aG9kLikKICAqIEBudW1fcG9ydHM6IHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IHBvcnRzIHRoaXMgZGV2aWNlIHdpbGwgaGF2ZS4KICAqIEBjYWxjX251bV9wb3J0czogcG9pbnRlciB0byBhIGZ1bmN0aW9uIHRvIGRldGVybWluZSBob3cgbWFueSBwb3J0cyB0aGlzCiAgKglkZXZpY2UgaGFzIGR5bmFtaWNhbGx5LiAgSXQgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHByb2JlKCkKQEAgLTIxMiwxMCArMTk3LDYgQEAKIHN0cnVjdCB1c2Jfc2VyaWFsX2RyaXZlciB7CiAJY29uc3QgY2hhciAqZGVzY3JpcHRpb247CiAJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkX3RhYmxlOwotCWNoYXIJbnVtX2ludGVycnVwdF9pbjsKLQljaGFyCW51bV9pbnRlcnJ1cHRfb3V0OwotCWNoYXIJbnVtX2J1bGtfaW47Ci0JY2hhcgludW1fYnVsa19vdXQ7CiAJY2hhcgludW1fcG9ydHM7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWRyaXZlcl9saXN0OwpAQCAtMzQwLDUgKzMyMSw1IEBACiAKIAogCi0jZW5kaWYJLyogaWZkZWYgX19MSU5VWF9VU0JfU0VSSUFMX0ggKi8KKyNlbmRpZiAvKiBfX0xJTlVYX1VTQl9TRVJJQUxfSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9zbDgxMS5oIGIvaW5jbHVkZS9saW51eC91c2Ivc2w4MTEuaAppbmRleCA4NzczNzNkLi4zYWZlNGQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9zbDgxMS5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL3NsODExLmgKQEAgLTEsOSArMSwxMSBAQAotCiAvKgogICogYm9hcmQgaW5pdGlhbGl6YXRpb24gc2hvdWxkIHB1dCBvbmUgb2YgdGhlc2UgaW50byBkZXYtPnBsYXRmb3JtX2RhdGEKICAqIGFuZCBwbGFjZSB0aGUgc2w4MTFocyBvbnRvIHBsYXRmb3JtX2J1cyBuYW1lZCAic2w4MTEtaGNkIi4KICAqLwogCisjaWZuZGVmIF9fTElOVVhfVVNCX1NMODExX0gKKyNkZWZpbmUgX19MSU5VWF9VU0JfU0w4MTFfSAorCiBzdHJ1Y3Qgc2w4MTFfcGxhdGZvcm1fZGF0YSB7CiAJdW5zaWduZWQJY2FuX3dha2V1cDoxOwogCkBAIC0yNCwzICsyNiw0IEBACiAJLyogdm9pZAkJKCpjbG9ja19lbmFibGUpKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGlzX29uKTsgKi8KIH07CiAKKyNlbmRpZiAvKiBfX0xJTlVYX1VTQl9TTDgxMV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi91c2JuZXQuaCBiL2luY2x1ZGUvbGludXgvdXNiL3VzYm5ldC5oCmluZGV4IGUwNTAxZGEuLmJhMDlmZTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL3VzYm5ldC5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL3VzYm5ldC5oCkBAIC0xOSwxMCArMTksOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCiAKLQotI2lmbmRlZglfX1VTQk5FVF9ICi0jZGVmaW5lCV9fVVNCTkVUX0gKLQorI2lmbmRlZglfX0xJTlVYX1VTQl9VU0JORVRfSAorI2RlZmluZQlfX0xJTlVYX1VTQl9VU0JORVRfSAogCiAvKiBpbnRlcmZhY2UgZnJvbSB1c2JuZXQgY29yZSB0byBlYWNoIFVTQiBuZXR3b3JraW5nIGxpbmsgd2UgaGFuZGxlICovCiBzdHJ1Y3QgdXNibmV0IHsKQEAgLTIxMSw0ICsyMDksNCBAQAogCXByaW50ayhLRVJOX0lORk8gIiVzOiAiIGZtdCAiXG4iICwgKHVzYm5ldCktPm5ldC0+bmFtZSAsICMjIGFyZyk7IFwKIAogCi0jZW5kaWYJLyogX19VU0JORVRfSCAqLworI2VuZGlmIC8qIF9fTElOVVhfVVNCX1VTQk5FVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oIGIvaW5jbHVkZS9saW51eC91c2JfdXN1YWwuaAppbmRleCAwYTQwZGZhLi5kOWEzYmJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiX3VzdWFsLmgKQEAgLTg1LDYgKzg1LDcgQEAKICNkZWZpbmUgVVNfU0NfTE9DS0FCTEUJMHgwNwkJLyogUGFzc3dvcmQtcHJvdGVjdGVkICovCiAKICNkZWZpbmUgVVNfU0NfSVNEMjAwICAgIDB4ZjAJCS8qIElTRDIwMCBBVEEgKi8KKyNkZWZpbmUgVVNfU0NfQ1lQX0FUQUNCIDB4ZjEJCS8qIEN5cHJlc3MgQVRBQ0IgKi8KICNkZWZpbmUgVVNfU0NfREVWSUNFCTB4ZmYJCS8qIFVzZSBkZXZpY2UncyB2YWx1ZSAqLwogCiAvKiBQcm90b2NvbHMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiZGV2aWNlX2ZzLmggYi9pbmNsdWRlL2xpbnV4L3VzYmRldmljZV9mcy5oCmluZGV4IDE3Y2IxMDguLjMxMThlZGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiZGV2aWNlX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2JkZXZpY2VfZnMuaApAQCAtNzcsOCArNzcsMTEgQEAKIAl1bnNpZ25lZCBjaGFyIHNsb3c7CiB9OwogCi0jZGVmaW5lIFVTQkRFVkZTX1VSQl9TSE9SVF9OT1RfT0sgICAgICAgICAgMQotI2RlZmluZSBVU0JERVZGU19VUkJfSVNPX0FTQVAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgVVNCREVWRlNfVVJCX1NIT1JUX05PVF9PSwkweDAxCisjZGVmaW5lIFVTQkRFVkZTX1VSQl9JU09fQVNBUAkJMHgwMgorI2RlZmluZSBVU0JERVZGU19VUkJfTk9fRlNCUgkJMHgyMAorI2RlZmluZSBVU0JERVZGU19VUkJfWkVST19QQUNLRVQJMHg0MAorI2RlZmluZSBVU0JERVZGU19VUkJfTk9fSU5URVJSVVBUCTB4ODAKIAogI2RlZmluZSBVU0JERVZGU19VUkJfVFlQRV9JU08JCSAgIDAKICNkZWZpbmUgVVNCREVWRlNfVVJCX1RZUEVfSU5URVJSVVBUCSAgIDEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvd205N3h4LmggYi9pbmNsdWRlL2xpbnV4L3dtOTd4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMTM3MzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3dtOTd4eC5oCkBAIC0wLDAgKzEsMzE0IEBACisKKy8qCisgKiBSZWdpc3RlciBiaXRzIGFuZCBBUEkgZm9yIFdvbGZzb24gV005N3h4IHNlcmllcyBvZiBjb2RlY3MKKyAqLworCisjaWZuZGVmIF9MSU5VWF9XTTk3WFhfSAorI2RlZmluZSBfTElOVVhfV005N1hYX0gKKworI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9hYzk3X2NvZGVjLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CS8qIElucHV0IGRldmljZSBsYXllciAqLworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisvKgorICogV005N3h4IEFDOTcgVG91Y2hzY3JlZW4gcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgQUM5N19XTTk3WFhfRElHSVRJU0VSMQkJMHg3NgorI2RlZmluZSBBQzk3X1dNOTdYWF9ESUdJVElTRVIyCQkweDc4CisjZGVmaW5lIEFDOTdfV005N1hYX0RJR0lUSVNFUl9SRCAJMHg3YQorI2RlZmluZSBBQzk3X1dNOTcxM19ESUcxCQkweDc0CisjZGVmaW5lIEFDOTdfV005NzEzX0RJRzIJCUFDOTdfV005N1hYX0RJR0lUSVNFUjEKKyNkZWZpbmUgQUM5N19XTTk3MTNfRElHMwkJQUM5N19XTTk3WFhfRElHSVRJU0VSMgorCisvKgorICogV005N3h4IHJlZ2lzdGVyIGJpdHMKKyAqLworI2RlZmluZSBXTTk3WFhfUE9MTAkJMHg4MDAwCS8qIGluaXRpYXRlIGEgcG9sbGluZyBtZWFzdXJlbWVudCAqLworI2RlZmluZSBXTTk3WFhfQURDU0VMX1gJCTB4MTAwMAkvKiB4IGNvb3JkIG1lYXN1cmVtZW50ICovCisjZGVmaW5lIFdNOTdYWF9BRENTRUxfWQkJMHgyMDAwCS8qIHkgY29vcmQgbWVhc3VyZW1lbnQgKi8KKyNkZWZpbmUgV005N1hYX0FEQ1NFTF9QUkVTCTB4MzAwMAkvKiBwcmVzc3VyZSBtZWFzdXJlbWVudCAqLworI2RlZmluZSBXTTk3WFhfQURDU0VMX01BU0sJMHg3MDAwCisjZGVmaW5lIFdNOTdYWF9DT08JCTB4MDgwMAkvKiBlbmFibGUgY29vcmRpbmF0ZSBtb2RlICovCisjZGVmaW5lIFdNOTdYWF9DVEMJCTB4MDQwMAkvKiBlbmFibGUgY29udGludW91cyBtb2RlICovCisjZGVmaW5lIFdNOTdYWF9DTV9SQVRFXzkzCTB4MDAwMAkvKiA5My43NUh6IGNvbnRpbnVvdXMgcmF0ZSAqLworI2RlZmluZSBXTTk3WFhfQ01fUkFURV8xODcJMHgwMTAwCS8qIDE4Ny41SHogY29udGludW91cyByYXRlICovCisjZGVmaW5lIFdNOTdYWF9DTV9SQVRFXzM3NQkweDAyMDAJLyogMzc1SHogY29udGludW91cyByYXRlICovCisjZGVmaW5lIFdNOTdYWF9DTV9SQVRFXzc1MAkweDAzMDAJLyogNzUwSHogY29udGludW91cyByYXRlICovCisjZGVmaW5lIFdNOTdYWF9DTV9SQVRFXzhLCTB4MDBmMAkvKiA4a0h6IGNvbnRpbnVvdXMgcmF0ZSAqLworI2RlZmluZSBXTTk3WFhfQ01fUkFURV8xMksJMHgwMWYwCS8qIDEya0h6IGNvbnRpbnVvdXMgcmF0ZSAqLworI2RlZmluZSBXTTk3WFhfQ01fUkFURV8yNEsJMHgwMmYwCS8qIDI0a0h6IGNvbnRpbnVvdXMgcmF0ZSAqLworI2RlZmluZSBXTTk3WFhfQ01fUkFURV80OEsJMHgwM2YwCS8qIDQ4a0h6IGNvbnRpbnVvdXMgcmF0ZSAqLworI2RlZmluZSBXTTk3WFhfQ01fUkFURV9NQVNLCTB4MDNmMAorI2RlZmluZSBXTTk3WFhfUkFURShpKQkJKCgoaSAmIDMpIDw8IDgpIHwgKChpICYgNCkgPyAweGYwIDogMCkpCisjZGVmaW5lIFdNOTdYWF9ERUxBWShpKQkJKChpIDw8IDQpICYgMHgwMGYwKQkvKiBzYW1wbGUgZGVsYXkgdGltZXMgKi8KKyNkZWZpbmUgV005N1hYX0RFTEFZX01BU0sJMHgwMGYwCisjZGVmaW5lIFdNOTdYWF9TTEVOCQkweDAwMDgJLyogc2xvdCByZWFkIGJhY2sgZW5hYmxlICovCisjZGVmaW5lIFdNOTdYWF9TTFQoaSkJCSgoaSAtIDUpICYgMHg3KQkvKiBwYW5lbCBzbG90ICg1LTExKSAqLworI2RlZmluZSBXTTk3WFhfU0xUX01BU0sJCTB4MDAwNworI2RlZmluZSBXTTk3WFhfUFJQX0RFVFcJCTB4NDAwMAkvKiBkZXRlY3Qgb24sIGRpZ2l0aXNlIG9mZiwgd2FrZSAqLworI2RlZmluZSBXTTk3WFhfUFJQX0RFVAkJMHg4MDAwCS8qIGRldGVjdCBvbiwgZGlnaXRpc2Ugb2ZmLCBubyB3YWtlICovCisjZGVmaW5lIFdNOTdYWF9QUlBfREVUX0RJRwkweGMwMDAJLyogc2V0ZWN0IG9uLCBkaWdpdGlzZSBvbiAqLworI2RlZmluZSBXTTk3WFhfUlBSCQkweDIwMDAJLyogd2FrZSB1cCBvbiBwZW4gZG93biAqLworI2RlZmluZSBXTTk3WFhfUEVOX0RPV04JCTB4ODAwMAkvKiBwZW4gaXMgZG93biAqLworI2RlZmluZSBXTTk3WFhfQURDU1JDX01BU0sJMHg3MDAwCS8qIEFEQyBzb3VyY2UgbWFzayAqLworCisjZGVmaW5lIFdNOTdYWF9BVVhfSUQxCQkweDgwMDEKKyNkZWZpbmUgV005N1hYX0FVWF9JRDIJCTB4ODAwMgorI2RlZmluZSBXTTk3WFhfQVVYX0lEMwkJMHg4MDAzCisjZGVmaW5lIFdNOTdYWF9BVVhfSUQ0CQkweDgwMDQKKworCisvKiBXTTk3MTIgQml0cyAqLworI2RlZmluZSBXTTk3MTJfNDVXCQkweDEwMDAJLyogc2V0IGZvciA1LXdpcmUgdG91Y2hzY3JlZW4gKi8KKyNkZWZpbmUgV005NzEyX1BERU4JCTB4MDgwMAkvKiBtZWFzdXJlIG9ubHkgd2hlbiBwZW4gZG93biAqLworI2RlZmluZSBXTTk3MTJfV0FJVAkJMHgwMjAwCS8qIHdhaXQgdW50aWwgYWRjIGlzIHJlYWQgYmVmb3JlIG5leHQgc2FtcGxlICovCisjZGVmaW5lIFdNOTcxMl9QSUwJCTB4MDEwMAkvKiBjdXJyZW50IHVzZWQgZm9yIHByZXNzdXJlIG1lYXN1cmVtZW50LiBzZXQgNDAwdUEgZWxzZSAyMDB1QSAqLworI2RlZmluZSBXTTk3MTJfTUFTS19ISQkJMHgwMDQwCS8qIGhpIG9uIG1hc2sgcGluICg0Nykgc3RvcHMgY29udmVyc2lvbnMgKi8KKyNkZWZpbmUgV005NzEyX01BU0tfRURHRQkweDAwODAJLyogcmlzaW5nL2ZhbGxpbmcgZWRnZSBvbiBwaW4gZGVsYXlzIHNhbXBsZSAqLworI2RlZmluZQlXTTk3MTJfTUFTS19TWU5DCTB4MDBjMAkvKiByaXNpbmcvZmFsbGluZyBlZGdlIG9uIG1hc2sgaW5pdGlhdGVzIHNhbXBsZSAqLworI2RlZmluZSBXTTk3MTJfUlBVKGkpCQkoaSYweDNmKQkvKiBpbnRlcm5hbCBwdWxsIHVwIG9uIHBlbiBkZXRlY3QgKDY0ayAvIHJwdSkgKi8KKyNkZWZpbmUgV005NzEyX1BEKGkpCQkoMHgxIDw8IGkpCS8qIHBvd2VyIG1hbmFnZW1lbnQgKi8KKworLyogV005NzEyIFJlZ2lzdGVycyAqLworI2RlZmluZSBBQzk3X1dNOTcxMl9QT1dFUgkweDI0CisjZGVmaW5lIEFDOTdfV005NzEyX1JFVgkJMHg1OAorCisvKiBXTTk3MDUgQml0cyAqLworI2RlZmluZSBXTTk3MDVfUERFTgkJMHgxMDAwCS8qIG1lYXN1cmUgb25seSB3aGVuIHBlbiBpcyBkb3duICovCisjZGVmaW5lIFdNOTcwNV9QSU5WCQkweDA4MDAJLyogaW52ZXJ0cyBzZW5zZSBvZiBwZW4gZG93biBvdXRwdXQgKi8KKyNkZWZpbmUgV005NzA1X0JTRU4JCTB4MDQwMAkvKiBCVVNZIGZsYWcgZW5hYmxlLCBwaW40NyBpcyAxIHdoZW4gYnVzeSAqLworI2RlZmluZSBXTTk3MDVfQklOVgkJMHgwMjAwCS8qIGludmVydCBCVVNZIChwaW40Nykgb3V0cHV0ICovCisjZGVmaW5lIFdNOTcwNV9XQUlUCQkweDAxMDAJLyogd2FpdCB1bnRpbCBhZGMgaXMgcmVhZCBiZWZvcmUgbmV4dCBzYW1wbGUgKi8KKyNkZWZpbmUgV005NzA1X1BJTAkJMHgwMDgwCS8qIGN1cnJlbnQgdXNlZCBmb3IgcHJlc3N1cmUgbWVhc3VyZW1lbnQuIHNldCA0MDB1QSBlbHNlIDIwMHVBICovCisjZGVmaW5lIFdNOTcwNV9QSElaCQkweDAwNDAJLyogc2V0IFBIT05FIGFuZCBQQ0JFRVAgaW5wdXRzIHRvIGhpZ2ggaW1wZWRhbmNlICovCisjZGVmaW5lIFdNOTcwNV9NQVNLX0hJCQkweDAwMTAJLyogaGkgb24gbWFzayBzdG9wcyBjb252ZXJzaW9ucyAqLworI2RlZmluZSBXTTk3MDVfTUFTS19FREdFCTB4MDAyMAkvKiByaXNpbmcvZmFsbGluZyBlZGdlIG9uIHBpbiBkZWxheXMgc2FtcGxlICovCisjZGVmaW5lCVdNOTcwNV9NQVNLX1NZTkMJMHgwMDMwCS8qIHJpc2luZy9mYWxsaW5nIGVkZ2Ugb24gbWFzayBpbml0aWF0ZXMgc2FtcGxlICovCisjZGVmaW5lIFdNOTcwNV9QREQoaSkJCShpICYgMHgwMDBmKQkvKiBwZW4gZGV0ZWN0IGNvbXBhcmF0b3IgdGhyZXNob2xkICovCisKKworLyogV005NzEzIEJpdHMgKi8KKyNkZWZpbmUgV005NzEzX1BEUE9MCQkweDA0MDAJLyogUGVuIGRvd24gcG9sYXJpdHkgKi8KKyNkZWZpbmUgV005NzEzX1BPTEwJCTB4MDIwMAkvKiBpbml0aWF0ZSBhIHBvbGxpbmcgbWVhc3VyZW1lbnQgKi8KKyNkZWZpbmUgV005NzEzX0NUQwkJMHgwMTAwCS8qIGVuYWJsZSBjb250aW51b3VzIG1vZGUgKi8KKyNkZWZpbmUgV005NzEzX0FEQ1NFTF9YCQkweDAwMDIJLyogWCBtZWFzdXJlbWVudCAqLworI2RlZmluZSBXTTk3MTNfQURDU0VMX1kJCTB4MDAwNAkvKiBZIG1lYXN1cmVtZW50ICovCisjZGVmaW5lIFdNOTcxM19BRENTRUxfUFJFUwkweDAwMDgJLyogUHJlc3N1cmUgbWVhc3VyZW1lbnQgKi8KKyNkZWZpbmUgV005NzEzX0NPTwkJMHgwMDAxCS8qIGVuYWJsZSBjb29yZGluYXRlIG1vZGUgKi8KKyNkZWZpbmUgV005NzEzX1BERU4JCTB4MDgwMAkvKiBtZWFzdXJlIG9ubHkgd2hlbiBwZW4gZG93biAqLworI2RlZmluZSBXTTk3MTNfQURDU0VMX01BU0sJMHgwMGZlCS8qIEFEQyBzZWxlY3Rpb24gbWFzayAqLworI2RlZmluZSBXTTk3MTNfV0FJVAkJMHgwMjAwCS8qIGNvb3JkaW5hdGUgd2FpdCAqLworCisvKiBBVVggQURDIElEJ3MgKi8KKyNkZWZpbmUgVFNfQ09NUDEJCTB4MAorI2RlZmluZSBUU19DT01QMgkJMHgxCisjZGVmaW5lIFRTX0JNT04JCQkweDIKKyNkZWZpbmUgVFNfV0lQRVIJCTB4MworCisvKiBJRCBudW1iZXJzICovCisjZGVmaW5lIFdNOTdYWF9JRDEJCTB4NTc0ZAorI2RlZmluZSBXTTk3MTJfSUQyCQkweDRjMTIKKyNkZWZpbmUgV005NzA1X0lEMgkJMHg0YzA1CisjZGVmaW5lIFdNOTcxM19JRDIJCTB4NGMxMworCisvKiBDb2RlYyBHUElPJ3MgKi8KKyNkZWZpbmUgV005N1hYX01BWF9HUElPCQkxNgorI2RlZmluZSBXTTk3WFhfR1BJT18xCQkoMSA8PCAxKQorI2RlZmluZSBXTTk3WFhfR1BJT18yCQkoMSA8PCAyKQorI2RlZmluZSBXTTk3WFhfR1BJT18zCQkoMSA8PCAzKQorI2RlZmluZSBXTTk3WFhfR1BJT180CQkoMSA8PCA0KQorI2RlZmluZSBXTTk3WFhfR1BJT181CQkoMSA8PCA1KQorI2RlZmluZSBXTTk3WFhfR1BJT182CQkoMSA8PCA2KQorI2RlZmluZSBXTTk3WFhfR1BJT183CQkoMSA8PCA3KQorI2RlZmluZSBXTTk3WFhfR1BJT184CQkoMSA8PCA4KQorI2RlZmluZSBXTTk3WFhfR1BJT185CQkoMSA8PCA5KQorI2RlZmluZSBXTTk3WFhfR1BJT18xMAkJKDEgPDwgMTApCisjZGVmaW5lIFdNOTdYWF9HUElPXzExCQkoMSA8PCAxMSkKKyNkZWZpbmUgV005N1hYX0dQSU9fMTIJCSgxIDw8IDEyKQorI2RlZmluZSBXTTk3WFhfR1BJT18xMwkJKDEgPDwgMTMpCisjZGVmaW5lIFdNOTdYWF9HUElPXzE0CQkoMSA8PCAxNCkKKyNkZWZpbmUgV005N1hYX0dQSU9fMTUJCSgxIDw8IDE1KQorCisKKyNkZWZpbmUgQUM5N19MSU5LX0ZSQU1FCQkyMQkvKiB0aW1lIGluIHVTIGZvciBBQzk3IGxpbmsgZnJhbWUgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0gUmV0dXJuIGNvZGVzIGZyb20gc2FtcGxlIHJlYWRpbmcgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLSovCisKKy8qIE1vcmUgZGF0YSBpcyBhdmFpbGFibGU7IGNhbGwgdGhlIHNhbXBsZSBnYXRoZXJpbmcgZnVuY3Rpb24gYWdhaW4gKi8KKyNkZWZpbmUgUkNfQUdBSU4JCQkweDAwMDAwMDAxCisvKiBUaGUgcmV0dXJuZWQgc2FtcGxlIGlzIHZhbGlkICovCisjZGVmaW5lIFJDX1ZBTElECQkJMHgwMDAwMDAwMgorLyogVGhlIHBlbiBpcyB1cCAodGhlIGZpcnN0IFJDX1ZBTElEIHdpdGhvdXQgUkNfUEVOVVAgbWVhbnMgcGVuIGlzIGRvd24pICovCisjZGVmaW5lIFJDX1BFTlVQCQkJMHgwMDAwMDAwNAorLyogVGhlIHBlbiBpcyBkb3duIChSQ19WQUxJRCBpbXBsaWVzIFJDX1BFTkRPV04sIGJ1dCBzb21ldGltZXMgaXQgaXMgaGVscGZ1bAorICAgdG8gdGVsbCB0aGUgaGFuZGxlciB0aGF0IHRoZSBwZW4gaXMgZG93biBidXQgd2UgZG9uJ3Qga25vdyB5ZXQgaGlzIGNvb3JkcywKKyAgIHNvIHRoZSBoYW5kbGVyIHNob3VsZCBub3Qgc2xlZXAgb3Igd2FpdCBmb3IgcGVuZG93biBpcnEpICovCisjZGVmaW5lIFJDX1BFTkRPV04JCQkweDAwMDAwMDA4CisKKy8qCisgKiBUaGUgd205N3h4IGRyaXZlciBwcm92aWRlcyBhIHByaXZhdGUgQVBJIGZvciB3cml0aW5nIHBsYXRmb3JtLXNwZWNpZmljCisgKiBkcml2ZXJzLgorICovCisKKy8qIFRoZSBzdHJ1Y3R1cmUgdXNlZCB0byByZXR1cm4gYXJjaCBzcGVjaWZpYyBzYW1wbGVkIGRhdGEgaW50byAqLworc3RydWN0IHdtOTd4eF9kYXRhIHsKKyAgICBpbnQgeDsKKyAgICBpbnQgeTsKKyAgICBpbnQgcDsKK307CisKKy8qCisgKiBDb2RlYyBHUElPIHN0YXR1cworICovCitlbnVtIHdtOTd4eF9ncGlvX3N0YXR1cyB7CisgICAgV005N1hYX0dQSU9fSElHSCwKKyAgICBXTTk3WFhfR1BJT19MT1cKK307CisKKy8qCisgKiBDb2RlYyBHUElPIGRpcmVjdGlvbgorICovCitlbnVtIHdtOTd4eF9ncGlvX2RpciB7CisgICAgV005N1hYX0dQSU9fSU4sCisgICAgV005N1hYX0dQSU9fT1VUCit9OworCisvKgorICogQ29kZWMgR1BJTyBwb2xhcml0eQorICovCitlbnVtIHdtOTd4eF9ncGlvX3BvbCB7CisgICAgV005N1hYX0dQSU9fUE9MX0hJR0gsCisgICAgV005N1hYX0dQSU9fUE9MX0xPVworfTsKKworLyoKKyAqIENvZGVjIEdQSU8gc3RpY2t5CisgKi8KK2VudW0gd205N3h4X2dwaW9fc3RpY2t5IHsKKyAgICBXTTk3WFhfR1BJT19TVElDS1ksCisgICAgV005N1hYX0dQSU9fTk9UU1RJQ0tZCit9OworCisvKgorICogQ29kZWMgR1BJTyB3YWtlCisgKi8KK2VudW0gd205N3h4X2dwaW9fd2FrZSB7CisgICAgV005N1hYX0dQSU9fV0FLRSwKKyAgICBXTTk3WFhfR1BJT19OT1dBS0UKK307CisKKy8qCisgKiBEaWdpdGlzZXIgaW9jdGwgY29tbWFuZHMKKyAqLworI2RlZmluZSBXTTk3WFhfRElHX1NUQVJUCTB4MQorI2RlZmluZSBXTTk3WFhfRElHX1NUT1AJCTB4MgorI2RlZmluZSBXTTk3WFhfUEhZX0lOSVQJCTB4MworI2RlZmluZSBXTTk3WFhfQVVYX1BSRVBBUkUJMHg0CisjZGVmaW5lIFdNOTdYWF9ESUdfUkVTVE9SRQkweDUKKworc3RydWN0IHdtOTd4eDsKKworZXh0ZXJuIHN0cnVjdCB3bTk3eHhfY29kZWNfZHJ2IHdtOTcwNV9jb2RlYzsKK2V4dGVybiBzdHJ1Y3Qgd205N3h4X2NvZGVjX2RydiB3bTk3MTJfY29kZWM7CitleHRlcm4gc3RydWN0IHdtOTd4eF9jb2RlY19kcnYgd205NzEzX2NvZGVjOworCisvKgorICogQ29kZWMgZHJpdmVyIGludGVyZmFjZSAtIGFsbG93cyBtYXBwaW5nIHRvIFdNOTcwNS8xMi8xMyBhbmQgbmV3ZXIgY29kZWNzCisgKi8KK3N0cnVjdCB3bTk3eHhfY29kZWNfZHJ2IHsKKwl1MTYgaWQ7CisJY2hhciAqbmFtZTsKKworCS8qIHJlYWQgMSBzYW1wbGUgKi8KKwlpbnQgKCpwb2xsX3NhbXBsZSkgKHN0cnVjdCB3bTk3eHggKiwgaW50IGFkY3NlbCwgaW50ICpzYW1wbGUpOworCisJLyogcmVhZCBYLFksW1BdIGluIHBvbGwgKi8KKwlpbnQgKCpwb2xsX3RvdWNoKSAoc3RydWN0IHdtOTd4eCAqLCBzdHJ1Y3Qgd205N3h4X2RhdGEgKik7CisKKwlpbnQgKCphY2NfZW5hYmxlKSAoc3RydWN0IHdtOTd4eCAqLCBpbnQgZW5hYmxlKTsKKwl2b2lkICgqcGh5X2luaXQpIChzdHJ1Y3Qgd205N3h4ICopOworCXZvaWQgKCpkaWdfZW5hYmxlKSAoc3RydWN0IHdtOTd4eCAqLCBpbnQgZW5hYmxlKTsKKwl2b2lkICgqZGlnX3Jlc3RvcmUpIChzdHJ1Y3Qgd205N3h4ICopOworCXZvaWQgKCphdXhfcHJlcGFyZSkgKHN0cnVjdCB3bTk3eHggKik7Cit9OworCisKKy8qIE1hY2hpbmUgc3BlY2lmaWMgYW5kIGFjY2VsZXJhdGVkIHRvdWNoIG9wZXJhdGlvbnMgKi8KK3N0cnVjdCB3bTk3eHhfbWFjaF9vcHMgeworCisJLyogYWNjZWxlcmF0ZWQgdG91Y2ggcmVhZGJhY2sgLSBjb29yZHMgYXJlIHRyYW5zbWl0ZWQgb24gQUM5NyBsaW5rICovCisJaW50IGFjY19lbmFibGVkOworCXZvaWQgKCphY2NfcGVuX3VwKSAoc3RydWN0IHdtOTd4eCAqKTsKKwlpbnQgKCphY2NfcGVuX2Rvd24pIChzdHJ1Y3Qgd205N3h4ICopOworCWludCAoKmFjY19zdGFydHVwKSAoc3RydWN0IHdtOTd4eCAqKTsKKwl2b2lkICgqYWNjX3NodXRkb3duKSAoc3RydWN0IHdtOTd4eCAqKTsKKworCS8qIGludGVycnVwdCBtYXNrIGNvbnRyb2wgLSByZXF1aXJlZCBmb3IgYWNjZWxlcmF0ZWQgb3BlcmF0aW9uICovCisJdm9pZCAoKmlycV9lbmFibGUpIChzdHJ1Y3Qgd205N3h4ICosIGludCBlbmFibGUpOworCisJLyogR1BJTyBwaW4gdXNlZCBmb3IgYWNjZWxlcmF0ZWQgb3BlcmF0aW9uICovCisJaW50IGlycV9ncGlvOworCisJLyogcHJlIGFuZCBwb3N0IHNhbXBsZSAtIGNhbiBiZSB1c2VkIHRvIG1pbmltaXNlIGFueSBhbmFsb2cgbm9pc2UgKi8KKwl2b2lkICgqcHJlX3NhbXBsZSkgKGludCk7ICAvKiBmdW5jdGlvbiB0byBydW4gYmVmb3JlIHNhbXBsaW5nICovCisJdm9pZCAoKnBvc3Rfc2FtcGxlKSAoaW50KTsgIC8qIGZ1bmN0aW9uIHRvIHJ1biBhZnRlciBzYW1wbGluZyAqLworfTsKKworc3RydWN0IHdtOTd4eCB7CisJdTE2IGRpZ1szXSwgaWQsIGdwaW9bNl0sIG1pc2M7CS8qIENhY2hlZCBjb2RlYyByZWdpc3RlcnMgKi8KKwl1MTYgZGlnX3NhdmVbM107CQkvKiBzYXZlZCBkdXJpbmcgYXV4IHJlYWRpbmcgKi8KKwlzdHJ1Y3Qgd205N3h4X2NvZGVjX2RydiAqY29kZWM7CS8qIGF0dGFjaGVkIGNvZGVjIGRyaXZlciovCisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OwkvKiB0b3VjaHNjcmVlbiBpbnB1dCBkZXZpY2UgKi8KKwlzdHJ1Y3Qgc25kX2FjOTcgKmFjOTc7CQkvKiBBTFNBIGNvZGVjIGFjY2VzcyAqLworCXN0cnVjdCBkZXZpY2UgKmRldjsJCS8qIEFMU0EgZGV2aWNlICovCisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYmF0dGVyeV9kZXY7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqdG91Y2hfZGV2OworCXN0cnVjdCB3bTk3eHhfbWFjaF9vcHMgKm1hY2hfb3BzOworCXN0cnVjdCBtdXRleCBjb2RlY19tdXRleDsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHRzX3JlYWRlcjsgIC8qIFVzZWQgdG8gcG9sbCB0b3VjaHNjcmVlbiAqLworCXVuc2lnbmVkIGxvbmcgdHNfcmVhZGVyX2ludGVydmFsOyAvKiBDdXJyZW50IGludGVydmFsIGZvciB0aW1lciAqLworCXVuc2lnbmVkIGxvbmcgdHNfcmVhZGVyX21pbl9pbnRlcnZhbDsgLyogTWluaW11bSBpbnRlcnZhbCAqLworCXVuc2lnbmVkIGludCBwZW5faXJxOwkJLyogUGVuIElSUSBudW1iZXIgaW4gdXNlICovCisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnRzX3dvcmtxOworCXN0cnVjdCB3b3JrX3N0cnVjdCBwZW5fZXZlbnRfd29yazsKKwl1MTYgYWNjX3Nsb3Q7CQkJLyogQUM5NyBzbG90IHVzZWQgZm9yIGFjYyB0b3VjaCBkYXRhICovCisJdTE2IGFjY19yYXRlOwkJCS8qIGFjYyB0b3VjaCBkYXRhIHJhdGUgKi8KKwl1bnNpZ25lZCBwZW5faXNfZG93bjoxOwkJLyogUGVuIGlzIGRvd24gKi8KKwl1bnNpZ25lZCBhdXhfd2FpdGluZzoxOwkJLyogYXV4IG1lYXN1cmVtZW50IHdhaXRpbmcgKi8KKwl1bnNpZ25lZCBwZW5fcHJvYmFibHlfZG93bjoxOwkvKiB1c2VkIGluIHBvbGxpbmcgbW9kZSAqLworCXUxNiBzdXNwZW5kX21vZGU7ICAgICAgICAgICAgICAgLyogUFJQIGluIHN1c3BlbmQgbW9kZSAqLworfTsKKworLyoKKyAqIENvZGVjIEdQSU8gYWNjZXNzIChub3Qgc3VwcG9ydGVkIG9uIFdNOTcwNSkKKyAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCBjb2RlYyBHUElPIGFuZCBWaXJ0dWFsIEdQSU8gc3RhdHVzLgorICovCitlbnVtIHdtOTd4eF9ncGlvX3N0YXR1cyB3bTk3eHhfZ2V0X2dwaW8oc3RydWN0IHdtOTd4eCAqd20sIHUzMiBncGlvKTsKK3ZvaWQgd205N3h4X3NldF9ncGlvKHN0cnVjdCB3bTk3eHggKndtLCB1MzIgZ3BpbywKKwkJCSAgZW51bSB3bTk3eHhfZ3Bpb19zdGF0dXMgc3RhdHVzKTsKK3ZvaWQgd205N3h4X2NvbmZpZ19ncGlvKHN0cnVjdCB3bTk3eHggKndtLCB1MzIgZ3BpbywKKwkJCQkgICAgIGVudW0gd205N3h4X2dwaW9fZGlyIGRpciwKKwkJCQkgICAgIGVudW0gd205N3h4X2dwaW9fcG9sIHBvbCwKKwkJCQkgICAgIGVudW0gd205N3h4X2dwaW9fc3RpY2t5IHN0aWNreSwKKwkJCQkgICAgIGVudW0gd205N3h4X2dwaW9fd2FrZSB3YWtlKTsKKwordm9pZCB3bTk3eHhfc2V0X3N1c3BlbmRfbW9kZShzdHJ1Y3Qgd205N3h4ICp3bSwgdTE2IG1vZGUpOworCisvKiBjb2RlYyBBQzk3IElPIGFjY2VzcyAqLworaW50IHdtOTd4eF9yZWdfcmVhZChzdHJ1Y3Qgd205N3h4ICp3bSwgdTE2IHJlZyk7Cit2b2lkIHdtOTd4eF9yZWdfd3JpdGUoc3RydWN0IHdtOTd4eCAqd20sIHUxNiByZWcsIHUxNiB2YWwpOworCisvKiBhdXggYWRjIHJlYWRiYWNrICovCitpbnQgd205N3h4X3JlYWRfYXV4X2FkYyhzdHJ1Y3Qgd205N3h4ICp3bSwgdTE2IGFkY3NlbCk7CisKKy8qIG1hY2hpbmUgb3BzICovCitpbnQgd205N3h4X3JlZ2lzdGVyX21hY2hfb3BzKHN0cnVjdCB3bTk3eHggKiwgc3RydWN0IHdtOTd4eF9tYWNoX29wcyAqKTsKK3ZvaWQgd205N3h4X3VucmVnaXN0ZXJfbWFjaF9vcHMoc3RydWN0IHdtOTd4eCAqKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3hmcm0uaCBiL2luY2x1ZGUvbGludXgveGZybS5oCmluZGV4IDBjODJjODAuLjJjYTZiYWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgveGZybS5oCisrKyBiL2luY2x1ZGUvbGludXgveGZybS5oCkBAIC05NywxMCArOTcsMTAgQEAKIH07CiAKIHN0cnVjdCB4ZnJtX2FsZ29fYWVhZCB7Ci0JY2hhcglhbGdfbmFtZVs2NF07Ci0JaW50CWFsZ19rZXlfbGVuOwkvKiBpbiBiaXRzICovCi0JaW50CWFsZ19pY3ZfbGVuOwkvKiBpbiBiaXRzICovCi0JY2hhcglhbGdfa2V5WzBdOworCWNoYXIJCWFsZ19uYW1lWzY0XTsKKwl1bnNpZ25lZCBpbnQJYWxnX2tleV9sZW47CS8qIGluIGJpdHMgKi8KKwl1bnNpZ25lZCBpbnQJYWxnX2ljdl9sZW47CS8qIGluIGJpdHMgKi8KKwljaGFyCQlhbGdfa2V5WzBdOwogfTsKIAogc3RydWN0IHhmcm1fc3RhdHMgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tdGQvS2J1aWxkIGIvaW5jbHVkZS9tdGQvS2J1aWxkCmluZGV4IDRkNDZiM2IuLjhlYjAxOGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbXRkL0tidWlsZAorKysgYi9pbmNsdWRlL210ZC9LYnVpbGQKQEAgLTMsNSArMyw0IEBACiBoZWFkZXIteSArPSBtdGQtYWJpLmgKIGhlYWRlci15ICs9IG10ZC11c2VyLmgKIGhlYWRlci15ICs9IG5mdGwtdXNlci5oCi1oZWFkZXIteSArPSB1YmktaGVhZGVyLmgKIGhlYWRlci15ICs9IHViaS11c2VyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL2JhbGxvb24uaCBiL2luY2x1ZGUveGVuL2JhbGxvb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTQzYjBmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS94ZW4vYmFsbG9vbi5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGJhbGxvb24uaAorICoKKyAqIFhlbiBiYWxsb29uIGRyaXZlciAtIGVuYWJsZXMgcmV0dXJuaW5nL2NsYWltaW5nIG1lbW9yeSB0by9mcm9tIFhlbi4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIEIgRHJhZ292aWMKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0LCBNIFdpbGxpYW1zb24sIEsgRnJhc2VyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgb3IsIHdoZW4gZGlzdHJpYnV0ZWQKKyAqIHNlcGFyYXRlbHkgZnJvbSB0aGUgTGludXgga2VybmVsIG9yIGluY29ycG9yYXRlZCBpbnRvIG90aGVyCisgKiBzb2Z0d2FyZSBwYWNrYWdlcywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGxpY2Vuc2U6CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb3VyY2UgZmlsZSAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LAorICogbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fWEVOX0JBTExPT05fSF9fCisjZGVmaW5lIF9fWEVOX0JBTExPT05fSF9fCisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaWYgMAorLyoKKyAqIEluZm9ybSB0aGUgYmFsbG9vbiBkcml2ZXIgdGhhdCBpdCBzaG91bGQgYWxsb3cgc29tZSBzbG9wIGZvciBkZXZpY2UtZHJpdmVyCisgKiBtZW1vcnkgYWN0aXZpdGllcy4KKyAqLwordm9pZCBiYWxsb29uX3VwZGF0ZV9kcml2ZXJfYWxsb3dhbmNlKGxvbmcgZGVsdGEpOworCisvKiBBbGxvY2F0ZS9mcmVlIGEgc2V0IG9mIGVtcHR5IHBhZ2VzIGluIGxvdyBtZW1vcnkgKGkuZS4sIG5vIFJBTSBtYXBwZWQpLiAqLworc3RydWN0IHBhZ2UgKiphbGxvY19lbXB0eV9wYWdlc19hbmRfcGFnZXZlYyhpbnQgbnJfcGFnZXMpOwordm9pZCBmcmVlX2VtcHR5X3BhZ2VzX2FuZF9wYWdldmVjKHN0cnVjdCBwYWdlICoqcGFnZXZlYywgaW50IG5yX3BhZ2VzKTsKKwordm9pZCBiYWxsb29uX3JlbGVhc2VfZHJpdmVyX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOworCisvKgorICogUHJldmVudCB0aGUgYmFsbG9vbiBkcml2ZXIgZnJvbSBjaGFuZ2luZyB0aGUgbWVtb3J5IHJlc2VydmF0aW9uIGR1cmluZworICogYSBkcml2ZXIgY3JpdGljYWwgcmVnaW9uLgorICovCitleHRlcm4gc3BpbmxvY2tfdCBiYWxsb29uX2xvY2s7CisjZGVmaW5lIGJhbGxvb25fbG9jayhfX2ZsYWdzKSAgIHNwaW5fbG9ja19pcnFzYXZlKCZiYWxsb29uX2xvY2ssIF9fZmxhZ3MpCisjZGVmaW5lIGJhbGxvb25fdW5sb2NrKF9fZmxhZ3MpIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhbGxvb25fbG9jaywgX19mbGFncykKKyNlbmRpZgorCisjZW5kaWYgLyogX19YRU5fQkFMTE9PTl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL2V2ZW50cy5oIGIvaW5jbHVkZS94ZW4vZXZlbnRzLmgKaW5kZXggMmJkZTU0ZC4uYWNkOGUwNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS94ZW4vZXZlbnRzLmgKKysrIGIvaW5jbHVkZS94ZW4vZXZlbnRzLmgKQEAgLTUsMTMgKzUsNyBAQAogCiAjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS9ldmVudF9jaGFubmVsLmg+CiAjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcmNhbGwuaD4KLQotZW51bSBpcGlfdmVjdG9yIHsKLQlYRU5fUkVTQ0hFRFVMRV9WRUNUT1IsCi0JWEVOX0NBTExfRlVOQ1RJT05fVkVDVE9SLAotCi0JWEVOX05SX0lQSVMsCi19OworI2luY2x1ZGUgPGFzbS94ZW4vZXZlbnRzLmg+CiAKIGludCBiaW5kX2V2dGNobl90b19pcnEodW5zaWduZWQgaW50IGV2dGNobik7CiBpbnQgYmluZF9ldnRjaG5fdG9faXJxaGFuZGxlcih1bnNpZ25lZCBpbnQgZXZ0Y2huLApAQCAtMzcsNiArMzEsNyBAQAogdm9pZCB1bmJpbmRfZnJvbV9pcnFoYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKmRldl9pZCk7CiAKIHZvaWQgeGVuX3NlbmRfSVBJX29uZSh1bnNpZ25lZCBpbnQgY3B1LCBlbnVtIGlwaV92ZWN0b3IgdmVjdG9yKTsKK2ludCByZXNlbmRfaXJxX29uX2V2dGNobih1bnNpZ25lZCBpbnQgaXJxKTsKIAogc3RhdGljIGlubGluZSB2b2lkIG5vdGlmeV9yZW1vdGVfdmlhX2V2dGNobihpbnQgcG9ydCkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL2dyYW50X3RhYmxlLmggYi9pbmNsdWRlL3hlbi9ncmFudF90YWJsZS5oCmluZGV4IDc2MWM4MzQuLjQ2NjIwNDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveGVuL2dyYW50X3RhYmxlLmgKKysrIGIvaW5jbHVkZS94ZW4vZ3JhbnRfdGFibGUuaApAQCAtMzksNiArMzksNyBAQAogCiAjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcnZpc29yLmg+CiAjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS9ncmFudF90YWJsZS5oPgorI2luY2x1ZGUgPGFzbS94ZW4vZ3JhbnRfdGFibGUuaD4KIAogLyogTlJfR1JBTlRfRlJBTUVTIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoYXQgY29uZmlndXJlZCBpbiBYZW4gKi8KICNkZWZpbmUgTlJfR1JBTlRfRlJBTUVTIDQKQEAgLTEwMiw2ICsxMDMsMTIgQEAKIHZvaWQgZ250dGFiX2dyYW50X2ZvcmVpZ25fdHJhbnNmZXJfcmVmKGdyYW50X3JlZl90LCBkb21pZF90IGRvbWlkLAogCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHBmbik7CiAKK2ludCBhcmNoX2dudHRhYl9tYXBfc2hhcmVkKHVuc2lnbmVkIGxvbmcgKmZyYW1lcywgdW5zaWduZWQgbG9uZyBucl9nZnJhbWVzLAorCQkJICAgdW5zaWduZWQgbG9uZyBtYXhfbnJfZ2ZyYW1lcywKKwkJCSAgIHN0cnVjdCBncmFudF9lbnRyeSAqKl9fc2hhcmVkKTsKK3ZvaWQgYXJjaF9nbnR0YWJfdW5tYXBfc2hhcmVkKHN0cnVjdCBncmFudF9lbnRyeSAqc2hhcmVkLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBucl9nZnJhbWVzKTsKKwogI2RlZmluZSBnbnR0YWJfbWFwX3ZhZGRyKG1hcCkgKCh2b2lkICopKG1hcC5ob3N0X3ZpcnRfYWRkcikpCiAKICNlbmRpZiAvKiBfX0FTTV9HTlRUQUJfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi9pbnRlcmZhY2UvY2FsbGJhY2suaCBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS9jYWxsYmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYWRjYmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3hlbi9pbnRlcmZhY2UvY2FsbGJhY2suaApAQCAtMCwwICsxLDEwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2FsbGJhY2suaAorICoKKyAqIFJlZ2lzdGVyIGd1ZXN0IE9TIGNhbGxiYWNrcyB3aXRoIFhlbi4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8KKyAqIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlCisgKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCBJYW4gQ2FtcGJlbGwKKyAqLworCisjaWZuZGVmIF9fWEVOX1BVQkxJQ19DQUxMQkFDS19IX18KKyNkZWZpbmUgX19YRU5fUFVCTElDX0NBTExCQUNLX0hfXworCisjaW5jbHVkZSAieGVuLmgiCisKKy8qCisgKiBQcm90b3R5cGUgZm9yIHRoaXMgaHlwZXJjYWxsIGlzOgorICogICBsb25nIGNhbGxiYWNrX29wKGludCBjbWQsIHZvaWQgKmV4dHJhX2FyZ3MpCisgKiBAY21kICAgICAgICA9PSBDQUxMQkFDS09QXz8/PyAoY2FsbGJhY2sgb3BlcmF0aW9uKS4KKyAqIEBleHRyYV9hcmdzID09IE9wZXJhdGlvbi1zcGVjaWZpYyBleHRyYSBhcmd1bWVudHMgKE5VTEwgaWYgbm9uZSkuCisgKi8KKworLyogaWE2NCwgeDg2OiBDYWxsYmFjayBmb3IgZXZlbnQgZGVsaXZlcnkuICovCisjZGVmaW5lIENBTExCQUNLVFlQRV9ldmVudCAgICAgICAgICAgICAgICAgMAorCisvKiB4ODY6IEZhaWxzYWZlIGNhbGxiYWNrIHdoZW4gZ3Vlc3Qgc3RhdGUgY2Fubm90IGJlIHJlc3RvcmVkIGJ5IFhlbi4gKi8KKyNkZWZpbmUgQ0FMTEJBQ0tUWVBFX2ZhaWxzYWZlICAgICAgICAgICAgICAxCisKKy8qIHg4Ni82NCBoeXBlcnZpc29yOiBTeXNjYWxsIGJ5IDY0LWJpdCBndWVzdCBhcHAgKCc2NC1vbi02NC1vbi02NCcpLiAqLworI2RlZmluZSBDQUxMQkFDS1RZUEVfc3lzY2FsbCAgICAgICAgICAgICAgIDIKKworLyoKKyAqIHg4Ni8zMiBoeXBlcnZpc29yOiBPbmx5IGF2YWlsYWJsZSBvbiB4ODYvMzIgd2hlbiBzdXBlcnZpc29yX21vZGVfa2VybmVsCisgKiAgICAgZmVhdHVyZSBpcyBlbmFibGVkLiBEbyBub3QgdXNlIHRoaXMgY2FsbGJhY2sgdHlwZSBpbiBuZXcgY29kZS4KKyAqLworI2RlZmluZSBDQUxMQkFDS1RZUEVfc3lzZW50ZXJfZGVwcmVjYXRlZCAgIDMKKworLyogeDg2OiBDYWxsYmFjayBmb3IgTk1JIGRlbGl2ZXJ5LiAqLworI2RlZmluZSBDQUxMQkFDS1RZUEVfbm1pICAgICAgICAgICAgICAgICAgIDQKKworLyoKKyAqIHg4Njogc3lzZW50ZXIgaXMgb25seSBhdmFpbGFibGUgYXMgZm9sbG93czoKKyAqIC0gMzItYml0IGh5cGVydmlzb3I6IHdpdGggdGhlIHN1cGVydmlzb3JfbW9kZV9rZXJuZWwgZmVhdHVyZSBlbmFibGVkCisgKiAtIDY0LWJpdCBoeXBlcnZpc29yOiAzMi1iaXQgZ3Vlc3QgYXBwbGljYXRpb25zIG9uIEludGVsIENQVXMKKyAqICAgICAgICAgICAgICAgICAgICAgICgnMzItb24tMzItb24tNjQnLCAnMzItb24tNjQtb24tNjQnKQorICogICAgICAgICAgICAgICAgICAgICAgW25iLiBhbHNvIDY0LWJpdCBndWVzdCBhcHBsaWNhdGlvbnMgb24gSW50ZWwgQ1BVcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAoJzY0LW9uLTY0LW9uLTY0JyksIGJ1dCBzeXNjYWxsIGlzIHByZWZlcnJlZF0KKyAqLworI2RlZmluZSBDQUxMQkFDS1RZUEVfc3lzZW50ZXIgICAgICAgICAgICAgIDUKKworLyoKKyAqIHg4Ni82NCBoeXBlcnZpc29yOiBTeXNjYWxsIGJ5IDMyLWJpdCBndWVzdCBhcHAgb24gQU1EIENQVXMKKyAqICAgICAgICAgICAgICAgICAgICAoJzMyLW9uLTMyLW9uLTY0JywgJzMyLW9uLTY0LW9uLTY0JykKKyAqLworI2RlZmluZSBDQUxMQkFDS1RZUEVfc3lzY2FsbDMyICAgICAgICAgICAgIDcKKworLyoKKyAqIERpc2FibGUgZXZlbnQgZGVsaXZlciBkdXJpbmcgY2FsbGJhY2s/IFRoaXMgZmxhZyBpcyBpZ25vcmVkIGZvciBldmVudCBhbmQKKyAqIE5NSSBjYWxsYmFja3M6IGV2ZW50IGRlbGl2ZXJ5IGlzIHVuY29uZGl0aW9uYWxseSBkaXNhYmxlZC4KKyAqLworI2RlZmluZSBfQ0FMTEJBQ0tGX21hc2tfZXZlbnRzICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ0FMTEJBQ0tGX21hc2tfZXZlbnRzICAgICAgICAgICAgICAoMVUgPDwgX0NBTExCQUNLRl9tYXNrX2V2ZW50cykKKworLyoKKyAqIFJlZ2lzdGVyIGEgY2FsbGJhY2suCisgKi8KKyNkZWZpbmUgQ0FMTEJBQ0tPUF9yZWdpc3RlciAgICAgICAgICAgICAgICAwCitzdHJ1Y3QgY2FsbGJhY2tfcmVnaXN0ZXIgeworICAgIHVpbnQxNl90IHR5cGU7CisgICAgdWludDE2X3QgZmxhZ3M7CisgICAgc3RydWN0IHhlbl9jYWxsYmFjayBhZGRyZXNzOworfTsKKworLyoKKyAqIFVucmVnaXN0ZXIgYSBjYWxsYmFjay4KKyAqCisgKiBOb3QgYWxsIGNhbGxiYWNrcyBjYW4gYmUgdW5yZWdpc3RlcmVkLiAtRUlOVkFMIHdpbGwgYmUgcmV0dXJuZWQgaWYKKyAqIHlvdSBhdHRlbXB0IHRvIHVucmVnaXN0ZXIgc3VjaCBhIGNhbGxiYWNrLgorICovCisjZGVmaW5lIENBTExCQUNLT1BfdW5yZWdpc3RlciAgICAgICAgICAgICAgMQorc3RydWN0IGNhbGxiYWNrX3VucmVnaXN0ZXIgeworICAgIHVpbnQxNl90IHR5cGU7CisgICAgdWludDE2X3QgX3VudXNlZDsKK307CisKKyNlbmRpZiAvKiBfX1hFTl9QVUJMSUNfQ0FMTEJBQ0tfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi9pbnRlcmZhY2UvZ3JhbnRfdGFibGUuaCBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS9ncmFudF90YWJsZS5oCmluZGV4IDIxOTA0OTguLjM5ZGE5M2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveGVuL2ludGVyZmFjZS9ncmFudF90YWJsZS5oCisrKyBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS9ncmFudF90YWJsZS5oCkBAIC0xODUsNiArMTg1LDcgQEAKICAgICBncmFudF9oYW5kbGVfdCBoYW5kbGU7CiAgICAgdWludDY0X3QgZGV2X2J1c19hZGRyOwogfTsKK0RFRklORV9HVUVTVF9IQU5ETEVfU1RSVUNUKGdudHRhYl9tYXBfZ3JhbnRfcmVmKTsKIAogLyoKICAqIEdOVFRBQk9QX3VubWFwX2dyYW50X3JlZjogRGVzdHJveSBvbmUgb3IgbW9yZSBncmFudC1yZWZlcmVuY2UgbWFwcGluZ3MKQEAgLTIwNiw2ICsyMDcsNyBAQAogICAgIC8qIE9VVCBwYXJhbWV0ZXJzLiAqLwogICAgIGludDE2X3QgIHN0YXR1czsgICAgICAgICAgICAgIC8qIEdOVFNUXyogKi8KIH07CitERUZJTkVfR1VFU1RfSEFORExFX1NUUlVDVChnbnR0YWJfdW5tYXBfZ3JhbnRfcmVmKTsKIAogLyoKICAqIEdOVFRBQk9QX3NldHVwX3RhYmxlOiBTZXQgdXAgYSBncmFudCB0YWJsZSBmb3IgPGRvbT4gY29tcHJpc2luZyBhdCBsZWFzdApAQCAtMjIzLDggKzIyNSw5IEBACiAgICAgdWludDMyX3QgbnJfZnJhbWVzOwogICAgIC8qIE9VVCBwYXJhbWV0ZXJzLiAqLwogICAgIGludDE2X3QgIHN0YXR1czsgICAgICAgICAgICAgIC8qIEdOVFNUXyogKi8KLSAgICB1bG9uZyAqZnJhbWVfbGlzdDsKKyAgICBHVUVTVF9IQU5ETEUodWxvbmcpIGZyYW1lX2xpc3Q7CiB9OworREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1QoZ250dGFiX3NldHVwX3RhYmxlKTsKIAogLyoKICAqIEdOVFRBQk9QX2R1bXBfdGFibGU6IER1bXAgdGhlIGNvbnRlbnRzIG9mIHRoZSBncmFudCB0YWJsZSB0byB0aGUKQEAgLTIzNyw2ICsyNDAsNyBAQAogICAgIC8qIE9VVCBwYXJhbWV0ZXJzLiAqLwogICAgIGludDE2X3Qgc3RhdHVzOyAgICAgICAgICAgICAgIC8qIEdOVFNUXyogKi8KIH07CitERUZJTkVfR1VFU1RfSEFORExFX1NUUlVDVChnbnR0YWJfZHVtcF90YWJsZSk7CiAKIC8qCiAgKiBHTlRUQUJPUF90cmFuc2Zlcl9ncmFudF9yZWY6IFRyYW5zZmVyIDxmcmFtZT4gdG8gYSBmb3JlaWduIGRvbWFpbi4gVGhlCkBAIC0yNTUsNyArMjU5LDcgQEAKICAgICAvKiBPVVQgcGFyYW1ldGVycy4gKi8KICAgICBpbnQxNl90ICAgICAgIHN0YXR1czsKIH07Ci0KK0RFRklORV9HVUVTVF9IQU5ETEVfU1RSVUNUKGdudHRhYl90cmFuc2Zlcik7CiAKIC8qCiAgKiBHTlRUQUJPUF9jb3B5OiBIeXBlcnZpc29yIGJhc2VkIGNvcHkKQEAgLTI5Niw2ICszMDAsNyBAQAogCS8qIE9VVCBwYXJhbWV0ZXJzLiAqLwogCWludDE2X3QgICAgICAgc3RhdHVzOwogfTsKK0RFRklORV9HVUVTVF9IQU5ETEVfU1RSVUNUKGdudHRhYl9jb3B5KTsKIAogLyoKICAqIEdOVFRBQk9QX3F1ZXJ5X3NpemU6IFF1ZXJ5IHRoZSBjdXJyZW50IGFuZCBtYXhpbXVtIHNpemVzIG9mIHRoZSBzaGFyZWQKQEAgLTMxMyw3ICszMTgsNyBAQAogICAgIHVpbnQzMl90IG1heF9ucl9mcmFtZXM7CiAgICAgaW50MTZfdCAgc3RhdHVzOyAgICAgICAgICAgICAgLyogR05UU1RfKiAqLwogfTsKLQorREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1QoZ250dGFiX3F1ZXJ5X3NpemUpOwogCiAvKgogICogQml0ZmllbGQgdmFsdWVzIGZvciB1cGRhdGVfcGluX3N0YXR1cy5mbGFncy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL2ludGVyZmFjZS9pby9mYmlmLmggYi9pbmNsdWRlL3hlbi9pbnRlcmZhY2UvaW8vZmJpZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOTM0ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3hlbi9pbnRlcmZhY2UvaW8vZmJpZi5oCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogZmJpZi5oIC0tIFhlbiB2aXJ0dWFsIGZyYW1lIGJ1ZmZlciBkZXZpY2UKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8KKyAqIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlCisgKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEFudGhvbnkgTGlndW9yaSA8YWxpZ3VvcmlAdXMuaWJtLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBSZWQgSGF0LCBJbmMuLCBNYXJrdXMgQXJtYnJ1c3RlciA8YXJtYnJ1QHJlZGhhdC5jb20+CisgKi8KKworI2lmbmRlZiBfX1hFTl9QVUJMSUNfSU9fRkJJRl9IX18KKyNkZWZpbmUgX19YRU5fUFVCTElDX0lPX0ZCSUZfSF9fCisKKy8qIE91dCBldmVudHMgKGZyb250ZW5kIC0+IGJhY2tlbmQpICovCisKKy8qCisgKiBPdXQgZXZlbnRzIG1heSBiZSBzZW50IG9ubHkgd2hlbiByZXF1ZXN0ZWQgYnkgYmFja2VuZCwgYW5kIHJlY2VpcHQKKyAqIG9mIGFuIHVua25vd24gb3V0IGV2ZW50IGlzIGFuIGVycm9yLgorICovCisKKy8qIEV2ZW50IHR5cGUgMSBjdXJyZW50bHkgbm90IHVzZWQgKi8KKy8qCisgKiBGcmFtZWJ1ZmZlciB1cGRhdGUgbm90aWZpY2F0aW9uIGV2ZW50CisgKiBDYXBhYmxlIGZyb250ZW5kIHNldHMgZmVhdHVyZS11cGRhdGUgaW4geGVuc3RvcmUuCisgKiBCYWNrZW5kIHJlcXVlc3RzIGl0IGJ5IHNldHRpbmcgcmVxdWVzdC11cGRhdGUgaW4geGVuc3RvcmUuCisgKi8KKyNkZWZpbmUgWEVORkJfVFlQRV9VUERBVEUgMgorCitzdHJ1Y3QgeGVuZmJfdXBkYXRlIHsKKwl1aW50OF90IHR5cGU7CQkvKiBYRU5GQl9UWVBFX1VQREFURSAqLworCWludDMyX3QgeDsJCS8qIHNvdXJjZSB4ICovCisJaW50MzJfdCB5OwkJLyogc291cmNlIHkgKi8KKwlpbnQzMl90IHdpZHRoOwkJLyogcmVjdCB3aWR0aCAqLworCWludDMyX3QgaGVpZ2h0OwkJLyogcmVjdCBoZWlnaHQgKi8KK307CisKKyNkZWZpbmUgWEVORkJfT1VUX0VWRU5UX1NJWkUgNDAKKwordW5pb24geGVuZmJfb3V0X2V2ZW50IHsKKwl1aW50OF90IHR5cGU7CisJc3RydWN0IHhlbmZiX3VwZGF0ZSB1cGRhdGU7CisJY2hhciBwYWRbWEVORkJfT1VUX0VWRU5UX1NJWkVdOworfTsKKworLyogSW4gZXZlbnRzIChiYWNrZW5kIC0+IGZyb250ZW5kKSAqLworCisvKgorICogRnJvbnRlbmRzIHNob3VsZCBpZ25vcmUgdW5rbm93biBpbiBldmVudHMuCisgKiBObyBpbiBldmVudHMgY3VycmVudGx5IGRlZmluZWQuCisgKi8KKworI2RlZmluZSBYRU5GQl9JTl9FVkVOVF9TSVpFIDQwCisKK3VuaW9uIHhlbmZiX2luX2V2ZW50IHsKKwl1aW50OF90IHR5cGU7CisJY2hhciBwYWRbWEVORkJfSU5fRVZFTlRfU0laRV07Cit9OworCisvKiBzaGFyZWQgcGFnZSAqLworCisjZGVmaW5lIFhFTkZCX0lOX1JJTkdfU0laRSAxMDI0CisjZGVmaW5lIFhFTkZCX0lOX1JJTkdfTEVOIChYRU5GQl9JTl9SSU5HX1NJWkUgLyBYRU5GQl9JTl9FVkVOVF9TSVpFKQorI2RlZmluZSBYRU5GQl9JTl9SSU5HX09GRlMgMTAyNAorI2RlZmluZSBYRU5GQl9JTl9SSU5HKHBhZ2UpIFwKKwkoKHVuaW9uIHhlbmZiX2luX2V2ZW50ICopKChjaGFyICopKHBhZ2UpICsgWEVORkJfSU5fUklOR19PRkZTKSkKKyNkZWZpbmUgWEVORkJfSU5fUklOR19SRUYocGFnZSwgaWR4KSBcCisJKFhFTkZCX0lOX1JJTkcoKHBhZ2UpKVsoaWR4KSAlIFhFTkZCX0lOX1JJTkdfTEVOXSkKKworI2RlZmluZSBYRU5GQl9PVVRfUklOR19TSVpFIDIwNDgKKyNkZWZpbmUgWEVORkJfT1VUX1JJTkdfTEVOIChYRU5GQl9PVVRfUklOR19TSVpFIC8gWEVORkJfT1VUX0VWRU5UX1NJWkUpCisjZGVmaW5lIFhFTkZCX09VVF9SSU5HX09GRlMgKFhFTkZCX0lOX1JJTkdfT0ZGUyArIFhFTkZCX0lOX1JJTkdfU0laRSkKKyNkZWZpbmUgWEVORkJfT1VUX1JJTkcocGFnZSkgXAorCSgodW5pb24geGVuZmJfb3V0X2V2ZW50ICopKChjaGFyICopKHBhZ2UpICsgWEVORkJfT1VUX1JJTkdfT0ZGUykpCisjZGVmaW5lIFhFTkZCX09VVF9SSU5HX1JFRihwYWdlLCBpZHgpIFwKKwkoWEVORkJfT1VUX1JJTkcoKHBhZ2UpKVsoaWR4KSAlIFhFTkZCX09VVF9SSU5HX0xFTl0pCisKK3N0cnVjdCB4ZW5mYl9wYWdlIHsKKwl1aW50MzJfdCBpbl9jb25zLCBpbl9wcm9kOworCXVpbnQzMl90IG91dF9jb25zLCBvdXRfcHJvZDsKKworCWludDMyX3Qgd2lkdGg7ICAgICAgICAgIC8qIHdpZHRoIG9mIHRoZSBmcmFtZWJ1ZmZlciAoaW4gcGl4ZWxzKSAqLworCWludDMyX3QgaGVpZ2h0OyAgICAgICAgIC8qIGhlaWdodCBvZiB0aGUgZnJhbWVidWZmZXIgKGluIHBpeGVscykgKi8KKwl1aW50MzJfdCBsaW5lX2xlbmd0aDsgICAvKiBsZW5ndGggb2YgYSByb3cgb2YgcGl4ZWxzIChpbiBieXRlcykgKi8KKwl1aW50MzJfdCBtZW1fbGVuZ3RoOyAgICAvKiBsZW5ndGggb2YgdGhlIGZyYW1lYnVmZmVyIChpbiBieXRlcykgKi8KKwl1aW50OF90IGRlcHRoOyAgICAgICAgICAvKiBkZXB0aCBvZiBhIHBpeGVsIChpbiBiaXRzKSAqLworCisJLyoKKwkgKiBGcmFtZWJ1ZmZlciBwYWdlIGRpcmVjdG9yeQorCSAqCisJICogRWFjaCBkaXJlY3RvcnkgcGFnZSBob2xkcyBQQUdFX1NJWkUgLyBzaXplb2YoKnBkKQorCSAqIGZyYW1lYnVmZmVyIHBhZ2VzLCBhbmQgY2FuIHRodXMgbWFwIHVwIHRvIFBBR0VfU0laRSAqCisJICogUEFHRV9TSVpFIC8gc2l6ZW9mKCpwZCkgYnl0ZXMuICBXaXRoIFBBR0VfU0laRSA9PSA0MDk2IGFuZAorCSAqIHNpemVvZih1bnNpZ25lZCBsb25nKSA9PSA0LCB0aGF0J3MgNCBNZWdzLiAgVHdvIGRpcmVjdG9yeQorCSAqIHBhZ2VzIHNob3VsZCBiZSBlbm91Z2ggZm9yIGEgd2hpbGUuCisJICovCisJdW5zaWduZWQgbG9uZyBwZFsyXTsKK307CisKKy8qCisgKiBXYXJ0OiB4ZW5rYmQgbmVlZHMgdG8ga25vdyByZXNvbHV0aW9uLiAgUHV0IGl0IGhlcmUgdW50aWwgYSBiZXR0ZXIKKyAqIHNvbHV0aW9uIGlzIGZvdW5kLCBidXQgZG9uJ3QgbGVhayBpdCB0byB0aGUgYmFja2VuZC4KKyAqLworI2lmZGVmIF9fS0VSTkVMX18KKyNkZWZpbmUgWEVORkJfV0lEVEggODAwCisjZGVmaW5lIFhFTkZCX0hFSUdIVCA2MDAKKyNkZWZpbmUgWEVORkJfREVQVEggMzIKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL2ludGVyZmFjZS9pby9rYmRpZi5oIGIvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL2lvL2tiZGlmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI5N2Y0MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS9pby9rYmRpZi5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICoga2JkaWYuaCAtLSBYZW4gdmlydHVhbCBrZXlib2FyZC9tb3VzZQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0bworICogZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUKKyAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgQW50aG9ueSBMaWd1b3JpIDxhbGlndW9yaUB1cy5pYm0uY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA2IFJlZCBIYXQsIEluYy4sIE1hcmt1cyBBcm1icnVzdGVyIDxhcm1icnVAcmVkaGF0LmNvbT4KKyAqLworCisjaWZuZGVmIF9fWEVOX1BVQkxJQ19JT19LQkRJRl9IX18KKyNkZWZpbmUgX19YRU5fUFVCTElDX0lPX0tCRElGX0hfXworCisvKiBJbiBldmVudHMgKGJhY2tlbmQgLT4gZnJvbnRlbmQpICovCisKKy8qCisgKiBGcm9udGVuZHMgc2hvdWxkIGlnbm9yZSB1bmtub3duIGluIGV2ZW50cy4KKyAqLworCisvKiBQb2ludGVyIG1vdmVtZW50IGV2ZW50ICovCisjZGVmaW5lIFhFTktCRF9UWVBFX01PVElPTiAgMQorLyogRXZlbnQgdHlwZSAyIGN1cnJlbnRseSBub3QgdXNlZCAqLworLyogS2V5IGV2ZW50IChpbmNsdWRlcyBwb2ludGVyIGJ1dHRvbnMpICovCisjZGVmaW5lIFhFTktCRF9UWVBFX0tFWSAgICAgMworLyoKKyAqIFBvaW50ZXIgcG9zaXRpb24gZXZlbnQKKyAqIENhcGFibGUgYmFja2VuZCBzZXRzIGZlYXR1cmUtYWJzLXBvaW50ZXIgaW4geGVuc3RvcmUuCisgKiBGcm9udGVuZCByZXF1ZXN0cyBvdCBpbnN0ZWFkIG9mIFhFTktCRF9UWVBFX01PVElPTiBieSBzZXR0aW5nCisgKiByZXF1ZXN0LWFicy11cGRhdGUgaW4geGVuc3RvcmUuCisgKi8KKyNkZWZpbmUgWEVOS0JEX1RZUEVfUE9TICAgICA0CisKK3N0cnVjdCB4ZW5rYmRfbW90aW9uIHsKKwl1aW50OF90IHR5cGU7CQkvKiBYRU5LQkRfVFlQRV9NT1RJT04gKi8KKwlpbnQzMl90IHJlbF94OwkJLyogcmVsYXRpdmUgWCBtb3Rpb24gKi8KKwlpbnQzMl90IHJlbF95OwkJLyogcmVsYXRpdmUgWSBtb3Rpb24gKi8KK307CisKK3N0cnVjdCB4ZW5rYmRfa2V5IHsKKwl1aW50OF90IHR5cGU7CQkvKiBYRU5LQkRfVFlQRV9LRVkgKi8KKwl1aW50OF90IHByZXNzZWQ7CS8qIDEgaWYgcHJlc3NlZDsgMCBvdGhlcndpc2UgKi8KKwl1aW50MzJfdCBrZXljb2RlOwkvKiBLRVlfKiBmcm9tIGxpbnV4L2lucHV0LmggKi8KK307CisKK3N0cnVjdCB4ZW5rYmRfcG9zaXRpb24geworCXVpbnQ4X3QgdHlwZTsJCS8qIFhFTktCRF9UWVBFX1BPUyAqLworCWludDMyX3QgYWJzX3g7CQkvKiBhYnNvbHV0ZSBYIHBvc2l0aW9uIChpbiBGQiBwaXhlbHMpICovCisJaW50MzJfdCBhYnNfeTsJCS8qIGFic29sdXRlIFkgcG9zaXRpb24gKGluIEZCIHBpeGVscykgKi8KK307CisKKyNkZWZpbmUgWEVOS0JEX0lOX0VWRU5UX1NJWkUgNDAKKwordW5pb24geGVua2JkX2luX2V2ZW50IHsKKwl1aW50OF90IHR5cGU7CisJc3RydWN0IHhlbmtiZF9tb3Rpb24gbW90aW9uOworCXN0cnVjdCB4ZW5rYmRfa2V5IGtleTsKKwlzdHJ1Y3QgeGVua2JkX3Bvc2l0aW9uIHBvczsKKwljaGFyIHBhZFtYRU5LQkRfSU5fRVZFTlRfU0laRV07Cit9OworCisvKiBPdXQgZXZlbnRzIChmcm9udGVuZCAtPiBiYWNrZW5kKSAqLworCisvKgorICogT3V0IGV2ZW50cyBtYXkgYmUgc2VudCBvbmx5IHdoZW4gcmVxdWVzdGVkIGJ5IGJhY2tlbmQsIGFuZCByZWNlaXB0CisgKiBvZiBhbiB1bmtub3duIG91dCBldmVudCBpcyBhbiBlcnJvci4KKyAqIE5vIG91dCBldmVudHMgY3VycmVudGx5IGRlZmluZWQuCisgKi8KKworI2RlZmluZSBYRU5LQkRfT1VUX0VWRU5UX1NJWkUgNDAKKwordW5pb24geGVua2JkX291dF9ldmVudCB7CisJdWludDhfdCB0eXBlOworCWNoYXIgcGFkW1hFTktCRF9PVVRfRVZFTlRfU0laRV07Cit9OworCisvKiBzaGFyZWQgcGFnZSAqLworCisjZGVmaW5lIFhFTktCRF9JTl9SSU5HX1NJWkUgMjA0OAorI2RlZmluZSBYRU5LQkRfSU5fUklOR19MRU4gKFhFTktCRF9JTl9SSU5HX1NJWkUgLyBYRU5LQkRfSU5fRVZFTlRfU0laRSkKKyNkZWZpbmUgWEVOS0JEX0lOX1JJTkdfT0ZGUyAxMDI0CisjZGVmaW5lIFhFTktCRF9JTl9SSU5HKHBhZ2UpIFwKKwkoKHVuaW9uIHhlbmtiZF9pbl9ldmVudCAqKSgoY2hhciAqKShwYWdlKSArIFhFTktCRF9JTl9SSU5HX09GRlMpKQorI2RlZmluZSBYRU5LQkRfSU5fUklOR19SRUYocGFnZSwgaWR4KSBcCisJKFhFTktCRF9JTl9SSU5HKChwYWdlKSlbKGlkeCkgJSBYRU5LQkRfSU5fUklOR19MRU5dKQorCisjZGVmaW5lIFhFTktCRF9PVVRfUklOR19TSVpFIDEwMjQKKyNkZWZpbmUgWEVOS0JEX09VVF9SSU5HX0xFTiAoWEVOS0JEX09VVF9SSU5HX1NJWkUgLyBYRU5LQkRfT1VUX0VWRU5UX1NJWkUpCisjZGVmaW5lIFhFTktCRF9PVVRfUklOR19PRkZTIChYRU5LQkRfSU5fUklOR19PRkZTICsgWEVOS0JEX0lOX1JJTkdfU0laRSkKKyNkZWZpbmUgWEVOS0JEX09VVF9SSU5HKHBhZ2UpIFwKKwkoKHVuaW9uIHhlbmtiZF9vdXRfZXZlbnQgKikoKGNoYXIgKikocGFnZSkgKyBYRU5LQkRfT1VUX1JJTkdfT0ZGUykpCisjZGVmaW5lIFhFTktCRF9PVVRfUklOR19SRUYocGFnZSwgaWR4KSBcCisJKFhFTktCRF9PVVRfUklORygocGFnZSkpWyhpZHgpICUgWEVOS0JEX09VVF9SSU5HX0xFTl0pCisKK3N0cnVjdCB4ZW5rYmRfcGFnZSB7CisJdWludDMyX3QgaW5fY29ucywgaW5fcHJvZDsKKwl1aW50MzJfdCBvdXRfY29ucywgb3V0X3Byb2Q7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL2ludGVyZmFjZS9pby9wcm90b2NvbHMuaCBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS9pby9wcm90b2NvbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWZjOGFlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL2lvL3Byb3RvY29scy5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX19YRU5fUFJPVE9DT0xTX0hfXworI2RlZmluZSBfX1hFTl9QUk9UT0NPTFNfSF9fCisKKyNkZWZpbmUgWEVOX0lPX1BST1RPX0FCSV9YODZfMzIgICAgICJ4ODZfMzItYWJpIgorI2RlZmluZSBYRU5fSU9fUFJPVE9fQUJJX1g4Nl82NCAgICAgIng4Nl82NC1hYmkiCisjZGVmaW5lIFhFTl9JT19QUk9UT19BQklfSUE2NCAgICAgICAiaWE2NC1hYmkiCisjZGVmaW5lIFhFTl9JT19QUk9UT19BQklfUE9XRVJQQzY0ICAicG93ZXJwYzY0LWFiaSIKKworI2lmIGRlZmluZWQoX19pMzg2X18pCisjIGRlZmluZSBYRU5fSU9fUFJPVE9fQUJJX05BVElWRSBYRU5fSU9fUFJPVE9fQUJJX1g4Nl8zMgorI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorIyBkZWZpbmUgWEVOX0lPX1BST1RPX0FCSV9OQVRJVkUgWEVOX0lPX1BST1RPX0FCSV9YODZfNjQKKyNlbGlmIGRlZmluZWQoX19pYTY0X18pCisjIGRlZmluZSBYRU5fSU9fUFJPVE9fQUJJX05BVElWRSBYRU5fSU9fUFJPVE9fQUJJX0lBNjQKKyNlbGlmIGRlZmluZWQoX19wb3dlcnBjNjRfXykKKyMgZGVmaW5lIFhFTl9JT19QUk9UT19BQklfTkFUSVZFIFhFTl9JT19QUk9UT19BQklfUE9XRVJQQzY0CisjZWxzZQorIyBlcnJvciBhcmNoIGZpeHVwIG5lZWRlZCBoZXJlCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi9pbnRlcmZhY2UvbWVtb3J5LmggYi9pbmNsdWRlL3hlbi9pbnRlcmZhY2UvbWVtb3J5LmgKaW5kZXggYWYzNmVhZC4uZGE3Njg0NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL21lbW9yeS5oCisrKyBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS9tZW1vcnkuaApAQCAtMjksNyArMjksNyBAQAogICAgICAqICAgT1VUOiBHTUZOIGJhc2VzIG9mIGV4dGVudHMgdGhhdCB3ZXJlIGFsbG9jYXRlZAogICAgICAqICAgKE5CLiBUaGlzIGNvbW1hbmQgYWxzbyB1cGRhdGVzIHRoZSBtYWNoX3RvX3BoeXMgdHJhbnNsYXRpb24gdGFibGUpCiAgICAgICovCi0gICAgR1VFU1RfSEFORExFKHVsb25nKSBleHRlbnRfc3RhcnQ7CisgICAgdWxvbmcgZXh0ZW50X3N0YXJ0OwogCiAgICAgLyogTnVtYmVyIG9mIGV4dGVudHMsIGFuZCBzaXplL2FsaWdubWVudCBvZiBlYWNoICgyXmV4dGVudF9vcmRlciBwYWdlcykuICovCiAgICAgdW5zaWduZWQgbG9uZyAgbnJfZXh0ZW50czsKQEAgLTUwLDcgKzUwLDYgQEAKICAgICBkb21pZF90ICAgICAgICBkb21pZDsKIAogfTsKLURFRklORV9HVUVTVF9IQU5ETEVfU1RSVUNUKHhlbl9tZW1vcnlfcmVzZXJ2YXRpb24pOwogCiAvKgogICogUmV0dXJucyB0aGUgbWF4aW11bSBtYWNoaW5lIGZyYW1lIG51bWJlciBvZiBtYXBwZWQgUkFNIGluIHRoaXMgc3lzdGVtLgpAQCAtODYsNyArODUsNyBAQAogICAgICAqIGFueSBsYXJnZSBkaXNjb250aWd1aXRpZXMgaW4gdGhlIG1hY2hpbmUgYWRkcmVzcyBzcGFjZSwgMk1CIGdhcHMgaW4KICAgICAgKiB0aGUgbWFjaHBoeXMgdGFibGUgd2lsbCBiZSByZXByZXNlbnRlZCBieSBhbiBNRk4gYmFzZSBvZiB6ZXJvLgogICAgICAqLwotICAgIEdVRVNUX0hBTkRMRSh1bG9uZykgZXh0ZW50X3N0YXJ0OworICAgIHVsb25nIGV4dGVudF9zdGFydDsKIAogICAgIC8qCiAgICAgICogTnVtYmVyIG9mIGV4dGVudHMgd3JpdHRlbiB0byB0aGUgYWJvdmUgYXJyYXkuIFRoaXMgd2lsbCBiZSBzbWFsbGVyCkBAIC05NCw3ICs5Myw2IEBACiAgICAgICovCiAgICAgdW5zaWduZWQgaW50IG5yX2V4dGVudHM7CiB9OwotREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1QoeGVuX21hY2hwaHlzX21mbl9saXN0KTsKIAogLyoKICAqIFNldHMgdGhlIEdQRk4gYXQgd2hpY2ggYSBwYXJ0aWN1bGFyIHBhZ2UgYXBwZWFycyBpbiB0aGUgc3BlY2lmaWVkIGd1ZXN0J3MKQEAgLTExNyw3ICsxMTUsNiBAQAogICAgIC8qIEdQRk4gd2hlcmUgdGhlIHNvdXJjZSBtYXBwaW5nIHBhZ2Ugc2hvdWxkIGFwcGVhci4gKi8KICAgICB1bnNpZ25lZCBsb25nIGdwZm47CiB9OwotREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1QoeGVuX2FkZF90b19waHlzbWFwKTsKIAogLyoKICAqIFRyYW5zbGF0ZXMgYSBsaXN0IG9mIGRvbWFpbi1zcGVjaWZpYyBHUEZOcyBpbnRvIE1GTnMuIFJldHVybnMgYSAtdmUgZXJyb3IKQEAgLTEzMiwxNCArMTI5LDEzIEBACiAgICAgdW5zaWduZWQgbG9uZyBucl9ncGZuczsKIAogICAgIC8qIExpc3Qgb2YgR1BGTnMgdG8gdHJhbnNsYXRlLiAqLwotICAgIEdVRVNUX0hBTkRMRSh1bG9uZykgZ3Bmbl9saXN0OworICAgIHVsb25nIGdwZm5fbGlzdDsKIAogICAgIC8qCiAgICAgICogT3V0cHV0IGxpc3QgdG8gY29udGFpbiBNRk4gdHJhbnNsYXRpb25zLiBNYXkgYmUgdGhlIHNhbWUgYXMgdGhlIGlucHV0CiAgICAgICogbGlzdCAoaW4gd2hpY2ggY2FzZSBlYWNoIGlucHV0IEdQRk4gaXMgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgb3V0cHV0IE1GTikuCiAgICAgICovCi0gICAgR1VFU1RfSEFORExFKHVsb25nKSBtZm5fbGlzdDsKKyAgICB1bG9uZyBtZm5fbGlzdDsKIH07Ci1ERUZJTkVfR1VFU1RfSEFORExFX1NUUlVDVCh4ZW5fdHJhbnNsYXRlX2dwZm5fbGlzdCk7CiAKICNlbmRpZiAvKiBfX1hFTl9QVUJMSUNfTUVNT1JZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL3ZjcHUuaCBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS92Y3B1LmgKaW5kZXggYjA1ZDhhNi4uODdlNmY4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL3ZjcHUuaAorKysgYi9pbmNsdWRlL3hlbi9pbnRlcmZhY2UvdmNwdS5oCkBAIC04NSw2ICs4NSw3IEBACiAJCSAqLwogCQl1aW50NjRfdCB0aW1lWzRdOwogfTsKK0RFRklORV9HVUVTVF9IQU5ETEVfU1RSVUNUKHZjcHVfcnVuc3RhdGVfaW5mbyk7CiAKIC8qIFZDUFUgaXMgY3VycmVudGx5IHJ1bm5pbmcgb24gYSBwaHlzaWNhbCBDUFUuICovCiAjZGVmaW5lIFJVTlNUQVRFX3J1bm5pbmcgIDAKQEAgLTExOSw2ICsxMjAsNyBAQAogI2RlZmluZSBWQ1BVT1BfcmVnaXN0ZXJfcnVuc3RhdGVfbWVtb3J5X2FyZWEgNQogc3RydWN0IHZjcHVfcmVnaXN0ZXJfcnVuc3RhdGVfbWVtb3J5X2FyZWEgewogCQl1bmlvbiB7CisJCQkJR1VFU1RfSEFORExFKHZjcHVfcnVuc3RhdGVfaW5mbykgaDsKIAkJCQlzdHJ1Y3QgdmNwdV9ydW5zdGF0ZV9pbmZvICp2OwogCQkJCXVpbnQ2NF90IHA7CiAJCX0gYWRkcjsKQEAgLTEzNCw2ICsxMzYsNyBAQAogc3RydWN0IHZjcHVfc2V0X3BlcmlvZGljX3RpbWVyIHsKIAkJdWludDY0X3QgcGVyaW9kX25zOwogfTsKK0RFRklORV9HVUVTVF9IQU5ETEVfU1RSVUNUKHZjcHVfc2V0X3BlcmlvZGljX3RpbWVyKTsKIAogLyoKICAqIFNldCBvciBzdG9wIGEgVkNQVSdzIHNpbmdsZS1zaG90IHRpbWVyLiBFdmVyeSBWQ1BVIGhhcyBvbmUgc2luZ2xlLXNob3QKQEAgLTE0NSw2ICsxNDgsNyBAQAogCQl1aW50NjRfdCB0aW1lb3V0X2Fic19uczsKIAkJdWludDMyX3QgZmxhZ3M7CQkJICAgLyogVkNQVV9TU0hPVFRNUl8/Pz8gKi8KIH07CitERUZJTkVfR1VFU1RfSEFORExFX1NUUlVDVCh2Y3B1X3NldF9zaW5nbGVzaG90X3RpbWVyKTsKIAogLyogRmxhZ3MgdG8gVkNQVU9QX3NldF9zaW5nbGVzaG90X3RpbWVyLiAqLwogIC8qIFJlcXVpcmUgdGhlIHRpbWVvdXQgdG8gYmUgaW4gdGhlIGZ1dHVyZSAocmV0dXJuIC1FVElNRSBpZiBpdCdzIHBhc3NlZCkuICovCkBAIC0xNjQsNSArMTY4LDYgQEAKICAgICB1aW50MzJfdCBvZmZzZXQ7IC8qIG9mZnNldCB3aXRoaW4gcGFnZSAqLwogICAgIHVpbnQzMl90IHJzdmQ7ICAgLyogdW51c2VkICovCiB9OworREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1QodmNwdV9yZWdpc3Rlcl92Y3B1X2luZm8pOwogCiAjZW5kaWYgLyogX19YRU5fUFVCTElDX1ZDUFVfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi9pbnRlcmZhY2UveGVuLmggYi9pbmNsdWRlL3hlbi9pbnRlcmZhY2UveGVuLmgKaW5kZXggNTE4YTViZi4uOWIwMThkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL3hlbi5oCisrKyBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS94ZW4uaApAQCAtNTgsNiArNTgsMTYgQEAKICNkZWZpbmUgX19IWVBFUlZJU09SX3BoeXNkZXZfb3AgICAgICAgICAgIDMzCiAjZGVmaW5lIF9fSFlQRVJWSVNPUl9odm1fb3AgICAgICAgICAgICAgICAzNAogCisvKiBBcmNoaXRlY3R1cmUtc3BlY2lmaWMgaHlwZXJjYWxsIGRlZmluaXRpb25zLiAqLworI2RlZmluZSBfX0hZUEVSVklTT1JfYXJjaF8wICAgICAgICAgICAgICAgNDgKKyNkZWZpbmUgX19IWVBFUlZJU09SX2FyY2hfMSAgICAgICAgICAgICAgIDQ5CisjZGVmaW5lIF9fSFlQRVJWSVNPUl9hcmNoXzIgICAgICAgICAgICAgICA1MAorI2RlZmluZSBfX0hZUEVSVklTT1JfYXJjaF8zICAgICAgICAgICAgICAgNTEKKyNkZWZpbmUgX19IWVBFUlZJU09SX2FyY2hfNCAgICAgICAgICAgICAgIDUyCisjZGVmaW5lIF9fSFlQRVJWSVNPUl9hcmNoXzUgICAgICAgICAgICAgICA1MworI2RlZmluZSBfX0hZUEVSVklTT1JfYXJjaF82ICAgICAgICAgICAgICAgNTQKKyNkZWZpbmUgX19IWVBFUlZJU09SX2FyY2hfNyAgICAgICAgICAgICAgIDU1CisKIC8qCiAgKiBWSVJUVUFMIElOVEVSUlVQVFMKICAqCkBAIC02OCw4ICs3OCwxOCBAQAogI2RlZmluZSBWSVJRX0NPTlNPTEUgICAgMiAgLyogKERPTTApIEJ5dGVzIHJlY2VpdmVkIG9uIGVtZXJnZW5jeSBjb25zb2xlLiAqLwogI2RlZmluZSBWSVJRX0RPTV9FWEMgICAgMyAgLyogKERPTTApIEV4Y2VwdGlvbmFsIGV2ZW50IGZvciBzb21lIGRvbWFpbi4gICAqLwogI2RlZmluZSBWSVJRX0RFQlVHR0VSICAgNiAgLyogKERPTTApIEEgZG9tYWluIGhhcyBwYXVzZWQgZm9yIGRlYnVnZ2luZy4gICAqLwotI2RlZmluZSBOUl9WSVJRUyAgICAgICAgOAogCisvKiBBcmNoaXRlY3R1cmUtc3BlY2lmaWMgVklSUSBkZWZpbml0aW9ucy4gKi8KKyNkZWZpbmUgVklSUV9BUkNIXzAgICAgMTYKKyNkZWZpbmUgVklSUV9BUkNIXzEgICAgMTcKKyNkZWZpbmUgVklSUV9BUkNIXzIgICAgMTgKKyNkZWZpbmUgVklSUV9BUkNIXzMgICAgMTkKKyNkZWZpbmUgVklSUV9BUkNIXzQgICAgMjAKKyNkZWZpbmUgVklSUV9BUkNIXzUgICAgMjEKKyNkZWZpbmUgVklSUV9BUkNIXzYgICAgMjIKKyNkZWZpbmUgVklSUV9BUkNIXzcgICAgMjMKKworI2RlZmluZSBOUl9WSVJRUyAgICAgICAyNAogLyoKICAqIE1NVS1VUERBVEUgUkVRVUVTVFMKICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi9pbnRlcmZhY2UveGVuY29tbS5oIGIvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL3hlbmNvbW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzQ1ZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL3hlbmNvbW0uaApAQCAtMCwwICsxLDQxIEBACisvKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvCisgKiBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZQorICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIENvcHlyaWdodCAoQykgSUJNIENvcnAuIDIwMDYKKyAqLworCisjaWZuZGVmIF9YRU5fWEVOQ09NTV9IXworI2RlZmluZSBfWEVOX1hFTkNPTU1fSF8KKworLyogQSB4ZW5jb21tIGRlc2NyaXB0b3IgaXMgYSBzY2F0dGVyL2dhdGhlciBsaXN0IGNvbnRhaW5pbmcgcGh5c2ljYWwKKyAqIGFkZHJlc3NlcyBjb3JyZXNwb25kaW5nIHRvIGEgdmlydHVhbGx5IGNvbnRpZ3VvdXMgbWVtb3J5IGFyZWEuIFRoZQorICogaHlwZXJ2aXNvciB0cmFuc2xhdGVzIHRoZXNlIHBoeXNpY2FsIGFkZHJlc3NlcyB0byBtYWNoaW5lIGFkZHJlc3NlcyB0byBjb3B5CisgKiB0byBhbmQgZnJvbSB0aGUgdmlydHVhbGx5IGNvbnRpZ3VvdXMgYXJlYS4KKyAqLworCisjZGVmaW5lIFhFTkNPTU1fTUFHSUMgMHg1ODQzNEY0RCAvKiAnWENPTScgKi8KKyNkZWZpbmUgWEVOQ09NTV9JTlZBTElEICh+MFVMKQorCitzdHJ1Y3QgeGVuY29tbV9kZXNjIHsKKyAgICB1aW50MzJfdCBtYWdpYzsKKyAgICB1aW50MzJfdCBucl9hZGRyczsgLyogdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIGFkZHJlc3NbXSAqLworICAgIHVpbnQ2NF90IGFkZHJlc3NbMF07Cit9OworCisjZW5kaWYgLyogX1hFTl9YRU5DT01NX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi9wYWdlLmggYi9pbmNsdWRlL3hlbi9wYWdlLmgKaW5kZXggMDMxZWYyMi4uZWFmODVmYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS94ZW4vcGFnZS5oCisrKyBiL2luY2x1ZGUveGVuL3BhZ2UuaApAQCAtMSwxODAgKzEgQEAKLSNpZm5kZWYgX19YRU5fUEFHRV9ICi0jZGVmaW5lIF9fWEVOX1BBR0VfSAotCi0jaW5jbHVkZSA8bGludXgvcGZuLmg+Ci0KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0KLSNpbmNsdWRlIDx4ZW4vZmVhdHVyZXMuaD4KLQotI2lmZGVmIENPTkZJR19YODZfUEFFCi0vKiBYZW4gbWFjaGluZSBhZGRyZXNzICovCi10eXBlZGVmIHN0cnVjdCB4bWFkZHIgewotCXVuc2lnbmVkIGxvbmcgbG9uZyBtYWRkcjsKLX0geG1hZGRyX3Q7Ci0KLS8qIFhlbiBwc2V1ZG8tcGh5c2ljYWwgYWRkcmVzcyAqLwotdHlwZWRlZiBzdHJ1Y3QgeHBhZGRyIHsKLQl1bnNpZ25lZCBsb25nIGxvbmcgcGFkZHI7Ci19IHhwYWRkcl90OwotI2Vsc2UKLS8qIFhlbiBtYWNoaW5lIGFkZHJlc3MgKi8KLXR5cGVkZWYgc3RydWN0IHhtYWRkciB7Ci0JdW5zaWduZWQgbG9uZyBtYWRkcjsKLX0geG1hZGRyX3Q7Ci0KLS8qIFhlbiBwc2V1ZG8tcGh5c2ljYWwgYWRkcmVzcyAqLwotdHlwZWRlZiBzdHJ1Y3QgeHBhZGRyIHsKLQl1bnNpZ25lZCBsb25nIHBhZGRyOwotfSB4cGFkZHJfdDsKLSNlbmRpZgotCi0jZGVmaW5lIFhNQUREUih4KQkoKHhtYWRkcl90KSB7IC5tYWRkciA9ICh4KSB9KQotI2RlZmluZSBYUEFERFIoeCkJKCh4cGFkZHJfdCkgeyAucGFkZHIgPSAoeCkgfSkKLQotLyoqKiogTUFDSElORSA8LT4gUEhZU0lDQUwgQ09OVkVSU0lPTiBNQUNST1MgKioqKi8KLSNkZWZpbmUgSU5WQUxJRF9QMk1fRU5UUlkJKH4wVUwpCi0jZGVmaW5lIEZPUkVJR05fRlJBTUVfQklUCSgxVUw8PDMxKQotI2RlZmluZSBGT1JFSUdOX0ZSQU1FKG0pCSgobSkgfCBGT1JFSUdOX0ZSQU1FX0JJVCkKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgKnBoeXNfdG9fbWFjaGluZV9tYXBwaW5nOwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcGZuX3RvX21mbih1bnNpZ25lZCBsb25nIHBmbikKLXsKLQlpZiAoeGVuX2ZlYXR1cmUoWEVORkVBVF9hdXRvX3RyYW5zbGF0ZWRfcGh5c21hcCkpCi0JCXJldHVybiBwZm47Ci0KLQlyZXR1cm4gcGh5c190b19tYWNoaW5lX21hcHBpbmdbKHVuc2lnbmVkIGludCkocGZuKV0gJgotCQl+Rk9SRUlHTl9GUkFNRV9CSVQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHBoeXNfdG9fbWFjaGluZV9tYXBwaW5nX3ZhbGlkKHVuc2lnbmVkIGxvbmcgcGZuKQotewotCWlmICh4ZW5fZmVhdHVyZShYRU5GRUFUX2F1dG9fdHJhbnNsYXRlZF9waHlzbWFwKSkKLQkJcmV0dXJuIDE7Ci0KLQlyZXR1cm4gKHBoeXNfdG9fbWFjaGluZV9tYXBwaW5nW3Bmbl0gIT0gSU5WQUxJRF9QMk1fRU5UUlkpOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbWZuX3RvX3Bmbih1bnNpZ25lZCBsb25nIG1mbikKLXsKLQl1bnNpZ25lZCBsb25nIHBmbjsKLQotCWlmICh4ZW5fZmVhdHVyZShYRU5GRUFUX2F1dG9fdHJhbnNsYXRlZF9waHlzbWFwKSkKLQkJcmV0dXJuIG1mbjsKLQotI2lmIDAKLQlpZiAodW5saWtlbHkoKG1mbiA+PiBtYWNoaW5lX3RvX3BoeXNfb3JkZXIpICE9IDApKQotCQlyZXR1cm4gbWF4X21hcG5yOwotI2VuZGlmCi0KLQlwZm4gPSAwOwotCS8qCi0JICogVGhlIGFycmF5IGFjY2VzcyBjYW4gZmFpbCAoZS5nLiwgZGV2aWNlIHNwYWNlIGJleW9uZCBlbmQgb2YgUkFNKS4KLQkgKiBJbiBzdWNoIGNhc2VzIGl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgd2UgcmV0dXJuICh3ZSByZXR1cm4gZ2FyYmFnZSksCi0JICogYnV0IHdlIG11c3QgaGFuZGxlIHRoZSBmYXVsdCB3aXRob3V0IGNyYXNoaW5nIQotCSAqLwotCV9fZ2V0X3VzZXIocGZuLCAmbWFjaGluZV90b19waHlzX21hcHBpbmdbbWZuXSk7Ci0KLQlyZXR1cm4gcGZuOwotfQotCi1zdGF0aWMgaW5saW5lIHhtYWRkcl90IHBoeXNfdG9fbWFjaGluZSh4cGFkZHJfdCBwaHlzKQotewotCXVuc2lnbmVkIG9mZnNldCA9IHBoeXMucGFkZHIgJiB+UEFHRV9NQVNLOwotCXJldHVybiBYTUFERFIoUEZOX1BIWVMoKHU2NClwZm5fdG9fbWZuKFBGTl9ET1dOKHBoeXMucGFkZHIpKSkgfCBvZmZzZXQpOwotfQotCi1zdGF0aWMgaW5saW5lIHhwYWRkcl90IG1hY2hpbmVfdG9fcGh5cyh4bWFkZHJfdCBtYWNoaW5lKQotewotCXVuc2lnbmVkIG9mZnNldCA9IG1hY2hpbmUubWFkZHIgJiB+UEFHRV9NQVNLOwotCXJldHVybiBYUEFERFIoUEZOX1BIWVMoKHU2NCltZm5fdG9fcGZuKFBGTl9ET1dOKG1hY2hpbmUubWFkZHIpKSkgfCBvZmZzZXQpOwotfQotCi0vKgotICogV2UgZGV0ZWN0IHNwZWNpYWwgbWFwcGluZ3MgaW4gb25lIG9mIHR3byB3YXlzOgotICogIDEuIElmIHRoZSBNRk4gaXMgYW4gSS9PIHBhZ2UgdGhlbiBYZW4gd2lsbCBzZXQgdGhlIG0ycCBlbnRyeQotICogICAgIHRvIGJlIG91dHNpZGUgb3VyIG1heGltdW0gcG9zc2libGUgcHNldWRvcGh5cyByYW5nZS4KLSAqICAyLiBJZiB0aGUgTUZOIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgZG9tYWluIHRoZW4gd2Ugd2lsbCBjZXJ0YWlubHkKLSAqICAgICBub3QgaGF2ZSBNRk4gaW4gb3VyIHAybSB0YWJsZS4gQ29udmVyc2VseSwgaWYgdGhlIHBhZ2UgaXMgb3VycywKLSAqICAgICB0aGVuIHdlJ2xsIGhhdmUgcDJtKG0ycChNRk4pKT09TUZOLgotICogSWYgd2UgZGV0ZWN0IGEgc3BlY2lhbCBtYXBwaW5nIHRoZW4gaXQgZG9lc24ndCBoYXZlIGEgJ3N0cnVjdCBwYWdlJy4KLSAqIFdlIGZvcmNlICFwZm5fdmFsaWQoKSBieSByZXR1cm5pbmcgYW4gb3V0LW9mLXJhbmdlIHBvaW50ZXIuCi0gKgotICogTkIuIFRoZXNlIGNoZWNrcyByZXF1aXJlIHRoYXQsIGZvciBhbnkgTUZOIHRoYXQgaXMgbm90IGluIG91ciByZXNlcnZhdGlvbiwKLSAqIHRoZXJlIGlzIG5vIFBGTiBzdWNoIHRoYXQgcDJtKFBGTikgPT0gTUZOLiBPdGhlcndpc2Ugd2UgY2FuIGdldCBjb25mdXNlZCBpZgotICogd2UgYXJlIGZvcmVpZ24tbWFwcGluZyB0aGUgTUZOLCBhbmQgdGhlIG90aGVyIGRvbWFpbiBhcyBtMnAoTUZOKSA9PSBQRk4uCi0gKiBZaWtlcyEgVmFyaW91cyBwbGFjZXMgbXVzdCBwb2tlIGluIElOVkFMSURfUDJNX0VOVFJZIGZvciBzYWZldHkuCi0gKgotICogTkIyLiBXaGVuIGRlbGliZXJhdGVseSBtYXBwaW5nIGZvcmVpZ24gcGFnZXMgaW50byB0aGUgcDJtIHRhYmxlLCB5b3UgKm11c3QqCi0gKiAgICAgIHVzZSBGT1JFSUdOX0ZSQU1FKCkuIFRoaXMgd2lsbCBjYXVzZSBwdGVfcGZuKCkgdG8gY2hva2Ugb24gaXQsIGFzIHdlCi0gKiAgICAgIHJlcXVpcmUuIEluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCwgdGhlIEZPUkVJR05fRlJBTUUgYml0IGlzCi0gKiAgICAgIG1hc2tlZCAoZS5nLiwgcGZuX3RvX21mbigpKSBzbyBiZWhhdmlvdXIgdGhlcmUgaXMgY29ycmVjdC4KLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG1mbl90b19sb2NhbF9wZm4odW5zaWduZWQgbG9uZyBtZm4pCi17Ci0JZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWF4X21hcG5yOwotCXVuc2lnbmVkIGxvbmcgcGZuID0gbWZuX3RvX3BmbihtZm4pOwotCWlmICgocGZuIDwgbWF4X21hcG5yKQotCSAgICAmJiAheGVuX2ZlYXR1cmUoWEVORkVBVF9hdXRvX3RyYW5zbGF0ZWRfcGh5c21hcCkKLQkgICAgJiYgKHBoeXNfdG9fbWFjaGluZV9tYXBwaW5nW3Bmbl0gIT0gbWZuKSkKLQkJcmV0dXJuIG1heF9tYXBucjsgLyogZm9yY2UgIXBmbl92YWxpZCgpICovCi0JcmV0dXJuIHBmbjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNldF9waHlzX3RvX21hY2hpbmUodW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgbWZuKQotewotCWlmICh4ZW5fZmVhdHVyZShYRU5GRUFUX2F1dG9fdHJhbnNsYXRlZF9waHlzbWFwKSkgewotCQlCVUdfT04ocGZuICE9IG1mbiAmJiBtZm4gIT0gSU5WQUxJRF9QMk1fRU5UUlkpOwotCQlyZXR1cm47Ci0JfQotCXBoeXNfdG9fbWFjaGluZV9tYXBwaW5nW3Bmbl0gPSBtZm47Ci19Ci0KLS8qIFZJUlQgPC0+IE1BQ0hJTkUgY29udmVyc2lvbiAqLwotI2RlZmluZSB2aXJ0X3RvX21hY2hpbmUodikJKHBoeXNfdG9fbWFjaGluZShYUEFERFIoX19wYSh2KSkpKQotI2RlZmluZSB2aXJ0X3RvX21mbih2KQkJKHBmbl90b19tZm4oUEZOX0RPV04oX19wYSh2KSkpKQotI2RlZmluZSBtZm5fdG9fdmlydChtKQkJKF9fdmEobWZuX3RvX3BmbihtKSA8PCBQQUdFX1NISUZUKSkKLQotI2lmZGVmIENPTkZJR19YODZfUEFFCi0jZGVmaW5lIHB0ZV9tZm4oX3B0ZSkgKCgoX3B0ZSkucHRlX2xvdyA+PiBQQUdFX1NISUZUKSB8CQkJXAotCQkgICAgICAgKCgoX3B0ZSkucHRlX2hpZ2ggJiAweGZmZikgPDwgKDMyLVBBR0VfU0hJRlQpKSkKLQotc3RhdGljIGlubGluZSBwdGVfdCBtZm5fcHRlKHVuc2lnbmVkIGxvbmcgcGFnZV9uciwgcGdwcm90X3QgcGdwcm90KQotewotCXB0ZV90IHB0ZTsKLQotCXB0ZS5wdGVfaGlnaCA9IChwYWdlX25yID4+ICgzMiAtIFBBR0VfU0hJRlQpKSB8Ci0JCShwZ3Byb3RfdmFsKHBncHJvdCkgPj4gMzIpOwotCXB0ZS5wdGVfaGlnaCAmPSAoX19zdXBwb3J0ZWRfcHRlX21hc2sgPj4gMzIpOwotCXB0ZS5wdGVfbG93ID0gKChwYWdlX25yIDw8IFBBR0VfU0hJRlQpIHwgcGdwcm90X3ZhbChwZ3Byb3QpKTsKLQlwdGUucHRlX2xvdyAmPSBfX3N1cHBvcnRlZF9wdGVfbWFzazsKLQotCXJldHVybiBwdGU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIHB0ZV92YWxfbWEocHRlX3QgeCkKLXsKLQlyZXR1cm4geC5wdGU7Ci19Ci0jZGVmaW5lIHBtZF92YWxfbWEodikgKCh2KS5wbWQpCi0jZGVmaW5lIHB1ZF92YWxfbWEodikgKCh2KS5wZ2QucGdkKQotI2RlZmluZSBfX3B0ZV9tYSh4KQkoKHB0ZV90KSB7IC5wdGUgPSAoeCkgfSkKLSNkZWZpbmUgX19wbWRfbWEoeCkJKChwbWRfdCkgeyAoeCkgfSApCi0jZWxzZSAgLyogIVg4Nl9QQUUgKi8KLSNkZWZpbmUgcHRlX21mbihfcHRlKSAoKF9wdGUpLnB0ZV9sb3cgPj4gUEFHRV9TSElGVCkKLSNkZWZpbmUgbWZuX3B0ZShwZm4sIHByb3QpCV9fcHRlX21hKCgocGZuKSA8PCBQQUdFX1NISUZUKSB8IHBncHJvdF92YWwocHJvdCkpCi0jZGVmaW5lIHB0ZV92YWxfbWEoeCkJKCh4KS5wdGUpCi0jZGVmaW5lIHBtZF92YWxfbWEodikJKCh2KS5wdWQucGdkLnBnZCkKLSNkZWZpbmUgX19wdGVfbWEoeCkJKChwdGVfdCkgeyAoeCkgfSApCi0jZW5kaWYJLyogQ09ORklHX1g4Nl9QQUUgKi8KLQotI2RlZmluZSBwZ2RfdmFsX21hKHgpCSgoeCkucGdkKQotCi0KLXhtYWRkcl90IGFyYml0cmFyeV92aXJ0X3RvX21hY2hpbmUodW5zaWduZWQgbG9uZyBhZGRyZXNzKTsKLXZvaWQgbWFrZV9sb3dtZW1fcGFnZV9yZWFkb25seSh2b2lkICp2YWRkcik7Ci12b2lkIG1ha2VfbG93bWVtX3BhZ2VfcmVhZHdyaXRlKHZvaWQgKnZhZGRyKTsKLQotI2VuZGlmIC8qIF9fWEVOX1BBR0VfSCAqLworI2luY2x1ZGUgPGFzbS94ZW4vcGFnZS5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS94ZW4veGVuLW9wcy5oIGIvaW5jbHVkZS94ZW4veGVuLW9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZGRmZTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3hlbi94ZW4tb3BzLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIElOQ0xVREVfWEVOX09QU19ICisjZGVmaW5lIElOQ0xVREVfWEVOX09QU19ICisKKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKworREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCB2Y3B1X2luZm8gKiwgeGVuX3ZjcHUpOworCisjZW5kaWYgLyogSU5DTFVERV9YRU5fT1BTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL3hlbmJ1cy5oIGIvaW5jbHVkZS94ZW4veGVuYnVzLmgKaW5kZXggNmY3YzI5MC4uNjM2OWQ4OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS94ZW4veGVuYnVzLmgKKysrIGIvaW5jbHVkZS94ZW4veGVuYnVzLmgKQEAgLTk3LDYgKzk3LDcgQEAKIAlpbnQgKCp1ZXZlbnQpKHN0cnVjdCB4ZW5idXNfZGV2aWNlICosIGNoYXIgKiosIGludCwgY2hhciAqLCBpbnQpOwogCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGRyaXZlcjsKIAlpbnQgKCpyZWFkX290aGVyZW5kX2RldGFpbHMpKHN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXYpOworCWludCAoKmlzX3JlYWR5KShzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2KTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHhlbmJ1c19kcml2ZXIgKnRvX3hlbmJ1c19kcml2ZXIoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL3hlbmNvbW0uaCBiL2luY2x1ZGUveGVuL3hlbmNvbW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDNiMDM5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS94ZW4veGVuY29tbS5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3JwLiAyMDA2CisgKgorICogQXV0aG9yczogSG9sbGlzIEJsYW5jaGFyZCA8aG9sbGlzYkB1cy5pYm0uY29tPgorICogICAgICAgICAgSmVyb25lIFlvdW5nIDxqeW91bmc1QHVzLmlibS5jb20+CisgKi8KKworI2lmbmRlZiBfTElOVVhfWEVOQ09NTV9IXworI2RlZmluZSBfTElOVVhfWEVOQ09NTV9IXworCisjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS94ZW5jb21tLmg+CisKKyNkZWZpbmUgWEVOQ09NTV9NSU5JX0FERFJTIDMKK3N0cnVjdCB4ZW5jb21tX21pbmkgeworCXN0cnVjdCB4ZW5jb21tX2Rlc2MgX2Rlc2M7CisJdWludDY0X3QgYWRkcmVzc1tYRU5DT01NX01JTklfQUREUlNdOworfTsKKworLyogVG8gYXZvaWQgYWRkaXRpb25uYWwgdmlydCB0byBwaHlzIGNvbnZlcnNpb24sIGFuIG9wYXF1ZSBzdHJ1Y3R1cmUgaXMKKyAgIHByZXNlbnRlZC4gICovCitzdHJ1Y3QgeGVuY29tbV9oYW5kbGU7CisKK2V4dGVybiB2b2lkIHhlbmNvbW1fZnJlZShzdHJ1Y3QgeGVuY29tbV9oYW5kbGUgKmRlc2MpOworZXh0ZXJuIHN0cnVjdCB4ZW5jb21tX2hhbmRsZSAqeGVuY29tbV9tYXAodm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIGJ5dGVzKTsKK2V4dGVybiBzdHJ1Y3QgeGVuY29tbV9oYW5kbGUgKl9feGVuY29tbV9tYXBfbm9fYWxsb2Modm9pZCAqcHRyLAorCQkJdW5zaWduZWQgbG9uZyBieXRlcywgIHN0cnVjdCB4ZW5jb21tX21pbmkgKnhjX2FyZWEpOworCisjaWYgMAorI2RlZmluZSBYRU5DT01NX01JTklfQUxJR05FRCh4Y19kZXNjLCBuKQkJCQlcCisJc3RydWN0IHhlbmNvbW1fbWluaSB4Y19kZXNjICMjIF9iYXNlWyhuKV0JCQlcCisJX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oc2l6ZW9mKHN0cnVjdCB4ZW5jb21tX21pbmkpKSkpOwlcCisJc3RydWN0IHhlbmNvbW1fbWluaSAqeGNfZGVzYyA9ICZ4Y19kZXNjICMjIF9iYXNlWzBdOworI2Vsc2UKKy8qCisgKiBnY2MgYnVnIHdvcmthcm91bmQ6CisgKiBodHRwOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE2NjYwCisgKiBnY2MgZG9lc24ndCBoYW5kbGUgcHJvcGVybHkgc3RhY2sgdmFyaWFibGUgd2l0aAorICogX19hdHRyaWJ1dGVfXygoX19hbGlnbl9fKHNpemVvZihzdHJ1Y3QgeGVuY29tbV9taW5pKSkpKQorICovCisjZGVmaW5lIFhFTkNPTU1fTUlOSV9BTElHTkVEKHhjX2Rlc2MsIG4pCQkJCVwKKwl1bnNpZ25lZCBjaGFyIHhjX2Rlc2MgIyMgX2Jhc2VbKChuKSArIDEgKSAqCQkJXAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHhlbmNvbW1fbWluaSldOwlcCisJc3RydWN0IHhlbmNvbW1fbWluaSAqeGNfZGVzYyA9IChzdHJ1Y3QgeGVuY29tbV9taW5pICopCQlcCisJCSgodW5zaWduZWQgbG9uZyl4Y19kZXNjICMjIF9iYXNlICsJCQlcCisJCSAoc2l6ZW9mKHN0cnVjdCB4ZW5jb21tX21pbmkpIC0JCQkJXAorCQkgICgodW5zaWduZWQgbG9uZyl4Y19kZXNjICMjIF9iYXNlKSAlCQkJXAorCQkgIHNpemVvZihzdHJ1Y3QgeGVuY29tbV9taW5pKSkpOworI2VuZGlmCisjZGVmaW5lIHhlbmNvbW1fbWFwX25vX2FsbG9jKHB0ciwgYnl0ZXMpCQkJXAorCSh7IFhFTkNPTU1fTUlOSV9BTElHTkVEKHhjX2Rlc2MsIDEpOwkJCVwKKwkJX194ZW5jb21tX21hcF9ub19hbGxvYyhwdHIsIGJ5dGVzLCB4Y19kZXNjKTsgfSkKKworLyogcHJvdmlkZWQgYnkgYXJjaGl0ZWN0dXJlIGNvZGU6ICovCitleHRlcm4gdW5zaWduZWQgbG9uZyB4ZW5jb21tX3Z0b3AodW5zaWduZWQgbG9uZyB2YWRkcik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqeGVuY29tbV9wYSh2b2lkICpwdHIpCit7CisJcmV0dXJuICh2b2lkICopeGVuY29tbV92dG9wKCh1bnNpZ25lZCBsb25nKXB0cik7Cit9CisKKyNkZWZpbmUgeGVuX2d1ZXN0X2hhbmRsZShobmQpICAoKGhuZCkucCkKKworI2VuZGlmIC8qIF9MSU5VWF9YRU5DT01NX0hfICovCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQuYyBiL2tlcm5lbC9zY2hlZC5jCmluZGV4IDAwMTRiMDMuLjA5Y2E2OWIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC5jCisrKyBiL2tlcm5lbC9zY2hlZC5jCkBAIC04MTI4LDcgKzgxMjgsNyBAQAogCSAqIHdlIHVzZSBhbGxvY19ib290bWVtKCkuCiAJICovCiAJaWYgKGFsbG9jX3NpemUpIHsKLQkJcHRyID0gKHVuc2lnbmVkIGxvbmcpYWxsb2NfYm9vdG1lbV9sb3coYWxsb2Nfc2l6ZSk7CisJCXB0ciA9ICh1bnNpZ25lZCBsb25nKWFsbG9jX2Jvb3RtZW0oYWxsb2Nfc2l6ZSk7CiAKICNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRAogCQlpbml0X3Rhc2tfZ3JvdXAuc2UgPSAoc3RydWN0IHNjaGVkX2VudGl0eSAqKilwdHI7CmRpZmYgLS1naXQgYS9saWIvS2NvbmZpZy5kZWJ1ZyBiL2xpYi9LY29uZmlnLmRlYnVnCmluZGV4IDYyM2VmMjQuLjc1NGNjMDAgMTAwNjQ0Ci0tLSBhL2xpYi9LY29uZmlnLmRlYnVnCisrKyBiL2xpYi9LY29uZmlnLmRlYnVnCkBAIC0yNSw2ICsyNSwxNyBAQAogCSAgc3VwcHJlc3MgdGhlICJ3YXJuaW5nOiBpZ25vcmluZyByZXR1cm4gdmFsdWUgb2YgJ2ZvbycsIGRlY2xhcmVkIHdpdGgKIAkgIGF0dHJpYnV0ZSB3YXJuX3VudXNlZF9yZXN1bHQiIG1lc3NhZ2VzLgogCitjb25maWcgRlJBTUVfV0FSTgorCWludCAiV2FybiBmb3Igc3RhY2sgZnJhbWVzIGxhcmdlciB0aGFuIChuZWVkcyBnY2MgNC40KSIKKwlyYW5nZSAwIDgxOTIKKwlkZWZhdWx0IDEwMjQgaWYgITY0QklUCisJZGVmYXVsdCAyMDQ4IGlmIDY0QklUCisJaGVscAorCSAgVGVsbCBnY2MgdG8gd2FybiBhdCBidWlsZCB0aW1lIGZvciBzdGFjayBmcmFtZXMgbGFyZ2VyIHRoYW4gdGhpcy4KKwkgIFNldHRpbmcgdGhpcyB0b28gbG93IHdpbGwgY2F1c2UgYSBsb3Qgb2Ygd2FybmluZ3MuCisJICBTZXR0aW5nIGl0IHRvIDAgZGlzYWJsZXMgdGhlIHdhcm5pbmcuCisJICBSZXF1aXJlcyBnY2MgNC40CisKIGNvbmZpZyBNQUdJQ19TWVNSUQogCWJvb2wgIk1hZ2ljIFN5c1JxIGtleSIKIAlkZXBlbmRzIG9uICFVTUwKZGlmZiAtLWdpdCBhL25ldC9jYW4vcmF3LmMgYi9uZXQvY2FuL3Jhdy5jCmluZGV4IGVhZDUwYzcuLjIwMWNiZmMgMTAwNjQ0Ci0tLSBhL25ldC9jYW4vcmF3LmMKKysrIGIvbmV0L2Nhbi9yYXcuYwpAQCAtNTczLDcgKzU3Myw4IEBACiAJCQlpbnQgZnNpemUgPSByby0+Y291bnQgKiBzaXplb2Yoc3RydWN0IGNhbl9maWx0ZXIpOwogCQkJaWYgKGxlbiA+IGZzaXplKQogCQkJCWxlbiA9IGZzaXplOwotCQkJZXJyID0gY29weV90b191c2VyKG9wdHZhbCwgcm8tPmZpbHRlciwgbGVuKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCByby0+ZmlsdGVyLCBsZW4pKQorCQkJCWVyciA9IC1FRkFVTFQ7CiAJCX0gZWxzZQogCQkJbGVuID0gMDsKIAkJcmVsZWFzZV9zb2NrKHNrKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2V0aHRvb2wuYyBiL25ldC9jb3JlL2V0aHRvb2wuYwppbmRleCBhMjliNDNkLi4wMTMzYjVlIDEwMDY0NAotLS0gYS9uZXQvY29yZS9ldGh0b29sLmMKKysrIGIvbmV0L2NvcmUvZXRodG9vbC5jCkBAIC0zMjMsNiArMzIzLDExIEBACiAJCWJ5dGVzX3JlbWFpbmluZyAtPSBlZXByb20ubGVuOwogCX0KIAorCWVlcHJvbS5sZW4gPSB1c2VyYnVmIC0gKHVzZXJhZGRyICsgc2l6ZW9mKGVlcHJvbSkpOworCWVlcHJvbS5vZmZzZXQgLT0gZWVwcm9tLmxlbjsKKwlpZiAoY29weV90b191c2VyKHVzZXJhZGRyLCAmZWVwcm9tLCBzaXplb2YoZWVwcm9tKSkpCisJCXJldCA9IC1FRkFVTFQ7CisKIAlrZnJlZShkYXRhKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvcHJvYmUuYyBiL25ldC9kY2NwL3Byb2JlLmMKaW5kZXggNmUxZGY2Mi4uMGJjZGM5MiAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvcHJvYmUuYworKysgYi9uZXQvZGNjcC9wcm9iZS5jCkBAIC0xNDAsNyArMTQwLDcgQEAKIAkJZ290byBvdXRfZnJlZTsKIAogCWNudCA9IGtmaWZvX2dldChkY2Nwdy5maWZvLCB0YnVmLCBsZW4pOwotCWVycm9yID0gY29weV90b191c2VyKGJ1ZiwgdGJ1ZiwgY250KTsKKwllcnJvciA9IGNvcHlfdG9fdXNlcihidWYsIHRidWYsIGNudCkgPyAtRUZBVUxUIDogMDsKIAogb3V0X2ZyZWU6CiAJdmZyZWUodGJ1Zik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfcHJvYmUuYyBiL25ldC9pcHY0L3RjcF9wcm9iZS5jCmluZGV4IDFjNTA5NTkuLjVmZjBjZTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9wcm9iZS5jCisrKyBiL25ldC9pcHY0L3RjcF9wcm9iZS5jCkBAIC0xOTAsMTkgKzE5MCwxOCBAQAogCiAJCXdpZHRoID0gdGNwcHJvYmVfc3ByaW50KHRidWYsIHNpemVvZih0YnVmKSk7CiAKLQkJaWYgKHdpZHRoIDwgbGVuKQorCQlpZiAoY250ICsgd2lkdGggPCBsZW4pCiAJCQl0Y3BfcHJvYmUudGFpbCA9ICh0Y3BfcHJvYmUudGFpbCArIDEpICUgYnVmc2l6ZTsKIAogCQlzcGluX3VubG9ja19iaCgmdGNwX3Byb2JlLmxvY2spOwogCiAJCS8qIGlmIHJlY29yZCBncmVhdGVyIHRoYW4gc3BhY2UgYXZhaWxhYmxlCiAJCSAgIHJldHVybiBwYXJ0aWFsIGJ1ZmZlciAoc28gZmFyKSAqLwotCQlpZiAod2lkdGggPj0gbGVuKQorCQlpZiAoY250ICsgd2lkdGggPj0gbGVuKQogCQkJYnJlYWs7CiAKLQkJZXJyb3IgPSBjb3B5X3RvX3VzZXIoYnVmICsgY250LCB0YnVmLCB3aWR0aCk7Ci0JCWlmIChlcnJvcikKLQkJCWJyZWFrOworCQlpZiAoY29weV90b191c2VyKGJ1ZiArIGNudCwgdGJ1Ziwgd2lkdGgpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCWNudCArPSB3aWR0aDsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L0tjb25maWcgYi9uZXQvaXB2Ni9LY29uZmlnCmluZGV4IDQyODE0YTIuLmIyYzliZWMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L0tjb25maWcKKysrIGIvbmV0L2lwdjYvS2NvbmZpZwpAQCAtMTY3LDcgKzE2Nyw3IEBACiAJICBUdW5uZWxpbmcgbWVhbnMgZW5jYXBzdWxhdGluZyBkYXRhIG9mIG9uZSBwcm90b2NvbCB0eXBlIHdpdGhpbgogCSAgYW5vdGhlciBwcm90b2NvbCBhbmQgc2VuZGluZyBpdCBvdmVyIGEgY2hhbm5lbCB0aGF0IHVuZGVyc3RhbmRzIHRoZQogCSAgZW5jYXBzdWxhdGluZyBwcm90b2NvbC4gVGhpcyBkcml2ZXIgaW1wbGVtZW50cyBlbmNhcHN1bGF0aW9uIG9mIElQdjYKLQkgIGludG8gSVB2NCBwYWNrZXRzLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBjb25uZWN0IHR3byBJUHY2CisJICBpbnRvIElQdjQgcGFja2V0cy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gY29ubmVjdCB0byBJUHY2CiAJICBuZXR3b3JrcyBvdmVyIGFuIElQdjQtb25seSBwYXRoLgogCiAJICBTYXlpbmcgTSBoZXJlIHdpbGwgcHJvZHVjZSBhIG1vZHVsZSBjYWxsZWQgc2l0LmtvLiBJZiB1bnN1cmUsIHNheSBZLgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcmF3LmMgYi9uZXQvaXB2Ni9yYXcuYwppbmRleCA2MTkzYjEyLi4zOTZmMGVhIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yYXcuYworKysgYi9uZXQvaXB2Ni9yYXcuYwpAQCAtOTcxLDYgKzk3MSwxOSBAQAogCiAJc3dpdGNoIChvcHRuYW1lKSB7CiAJCWNhc2UgSVBWNl9DSEVDS1NVTToKKwkJCWlmIChpbmV0X3NrKHNrKS0+bnVtID09IElQUFJPVE9fSUNNUFY2ICYmCisJCQkgICAgbGV2ZWwgPT0gSVBQUk9UT19JUFY2KSB7CisJCQkJLyoKKwkJCQkgKiBSRkMzNTQyIHRlbGxzIHRoYXQgSVBWNl9DSEVDS1NVTSBzb2NrZXQKKwkJCQkgKiBvcHRpb24gaW4gdGhlIElQUFJPVE9fSVBWNiBsZXZlbCBpcyBub3QKKwkJCQkgKiBhbGxvd2VkIG9uIElDTVB2NiBzb2NrZXRzLgorCQkJCSAqIElmIHlvdSB3YW50IHRvIHNldCBpdCwgdXNlIElQUFJPVE9fUkFXCisJCQkJICogbGV2ZWwgSVBWNl9DSEVDS1NVTSBzb2NrZXQgb3B0aW9uCisJCQkJICogKExpbnV4IGV4dGVuc2lvbikuCisJCQkJICovCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKIAkJCS8qIFlvdSBtYXkgZ2V0IHN0cmFuZ2UgcmVzdWx0IHdpdGggYSBwb3NpdGl2ZSBvZGQgb2Zmc2V0OwogCQkJICAgUkZDMjI5MmJpcyBhZ3JlZXMgd2l0aCBtZS4gKi8KIAkJCWlmICh2YWwgPiAwICYmICh2YWwmMSkpCkBAIC0xMDQ2LDYgKzEwNTksMTEgQEAKIAogCXN3aXRjaCAob3B0bmFtZSkgewogCWNhc2UgSVBWNl9DSEVDS1NVTToKKwkJLyoKKwkJICogV2UgYWxsb3cgZ2V0c29ja29wdCgpIGZvciBJUFBST1RPX0lQVjYtbGV2ZWwKKwkJICogSVBWNl9DSEVDS1NVTSBzb2NrZXQgb3B0aW9uIG9uIElDTVB2NiBzb2NrZXRzCisJCSAqIHNpbmNlIFJGQzM1NDIgaXMgc2lsZW50IGFib3V0IGl0LgorCQkgKi8KIAkJaWYgKHJwLT5jaGVja3N1bSA9PSAwKQogCQkJdmFsID0gLTE7CiAJCWVsc2UKZGlmZiAtLWdpdCBhL25ldC9rZXkvYWZfa2V5LmMgYi9uZXQva2V5L2FmX2tleS5jCmluZGV4IDgxYThlNTIuLjI0MDNhMzEgMTAwNjQ0Ci0tLSBhL25ldC9rZXkvYWZfa2V5LmMKKysrIGIvbmV0L2tleS9hZl9rZXkuYwpAQCAtMjM1Niw3ICsyMzU2LDcgQEAKIAlzdHJ1Y3QgeGZybV9zZWxlY3RvciBzZWw7CiAJc3RydWN0IGttX2V2ZW50IGM7CiAJc3RydWN0IHNhZGJfeF9zZWNfY3R4ICpzZWNfY3R4OwotCXN0cnVjdCB4ZnJtX3NlY19jdHggKnBvbF9jdHg7CisJc3RydWN0IHhmcm1fc2VjX2N0eCAqcG9sX2N0eCA9IE5VTEw7CiAKIAlpZiAoIXByZXNlbnRfYW5kX3NhbWVfZmFtaWx5KGV4dF9oZHJzW1NBREJfRVhUX0FERFJFU1NfU1JDLTFdLAogCQkJCSAgICAgZXh0X2hkcnNbU0FEQl9FWFRfQUREUkVTU19EU1QtMV0pIHx8CkBAIC0yMzk2LDggKzIzOTYsNyBAQAogCQlrZnJlZSh1Y3R4KTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7Ci0JfSBlbHNlCi0JCXBvbF9jdHggPSBOVUxMOworCX0KIAogCXhwID0geGZybV9wb2xpY3lfYnlzZWxfY3R4KFhGUk1fUE9MSUNZX1RZUEVfTUFJTiwKIAkJCQkgICBwb2wtPnNhZGJfeF9wb2xpY3lfZGlyIC0gMSwgJnNlbCwgcG9sX2N0eCwKZGlmZiAtLWdpdCBhL25ldC90aXBjL3NvY2tldC5jIGIvbmV0L3RpcGMvc29ja2V0LmMKaW5kZXggMDU4NTMxNS4uMjMwZjljYSAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvc29ja2V0LmMKKysrIGIvbmV0L3RpcGMvc29ja2V0LmMKQEAgLTE3NTYsOCArMTc1Niw4IEBACiAJZWxzZSBpZiAobGVuIDwgc2l6ZW9mKHZhbHVlKSkgewogCQlyZXMgPSAtRUlOVkFMOwogCX0KLQllbHNlIGlmICgocmVzID0gY29weV90b191c2VyKG92LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpKSkgewotCQkvKiBjb3VsZG4ndCByZXR1cm4gdmFsdWUgKi8KKwllbHNlIGlmIChjb3B5X3RvX3VzZXIob3YsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSkpIHsKKwkJcmVzID0gLUVGQVVMVDsKIAl9CiAJZWxzZSB7CiAJCXJlcyA9IHB1dF91c2VyKHNpemVvZih2YWx1ZSksIG9sKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUuYnVpbGQgYi9zY3JpcHRzL01ha2VmaWxlLmJ1aWxkCmluZGV4IDY3ZmI0NTMuLjI3N2NmZTAgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvTWFrZWZpbGUuYnVpbGQKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5idWlsZApAQCAtMjcsMTIgKzI3LDEyIEBACiBjcHBmbGFncy15IDo9CiBsZGZsYWdzLXkgIDo9CiAKLSMgUmVhZCAuY29uZmlnIGlmIGl0IGV4aXN0LCBvdGhlcndpc2UgaWdub3JlCisjIFJlYWQgYXV0by5jb25mIGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIGlnbm9yZQogLWluY2x1ZGUgaW5jbHVkZS9jb25maWcvYXV0by5jb25mCiAKIGluY2x1ZGUgc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQogCi0jIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGNoZWNrIHRoYXQgdGhlc2UgdmFyaWFibGVzIGRvZXMgbm90IGNoYW5nZQorIyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBjaGVjayB0aGF0IHRoZXNlIHZhcmlhYmxlcyBkbyBub3QgY2hhbmdlCiBzYXZlLWNmbGFncyA6PSAkKENGTEFHUykKIAogIyBUaGUgZmlsZW5hbWUgS2J1aWxkIGhhcyBwcmVjZWRlbmNlIG92ZXIgTWFrZWZpbGUKQEAgLTU1LDcgKzU1LDcgQEAKIGVuZGlmCiBlbmRpZgogCi0jIERvIG5vdCBpbmNsdWRlIGhvc3QgcnVsZXMgdW5sZXMgbmVlZGVkCisjIERvIG5vdCBpbmNsdWRlIGhvc3QgcnVsZXMgdW5sZXNzIG5lZWRlZAogaWZuZXEgKCQoaG9zdHByb2dzLXkpJChob3N0cHJvZ3MtbSksKQogaW5jbHVkZSBzY3JpcHRzL01ha2VmaWxlLmhvc3QKIGVuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLmNsZWFuIGIvc2NyaXB0cy9NYWtlZmlsZS5jbGVhbgppbmRleCAyYzY0NzEwLi42Zjg5ZmJiIDEwMDY0NAotLS0gYS9zY3JpcHRzL01ha2VmaWxlLmNsZWFuCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUuY2xlYW4KQEAgLTM3LDcgKzM3LDcgQEAKIAogc3ViZGlyLXltbgk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoc3ViZGlyLXltbikpCiAKLSMgYnVpbGQgYSBsaXN0IG9mIGZpbGVzIHRvIHJlbW92ZSwgdXN1YWxseSByZWxlYXRpdmUgdG8gdGhlIGN1cnJlbnQKKyMgYnVpbGQgYSBsaXN0IG9mIGZpbGVzIHRvIHJlbW92ZSwgdXN1YWxseSByZWxhdGl2ZSB0byB0aGUgY3VycmVudAogIyBkaXJlY3RvcnkKIAogX19jbGVhbi1maWxlcwk6PSAkKGV4dHJhLXkpICQoYWx3YXlzKSAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUuaG9zdCBiL3NjcmlwdHMvTWFrZWZpbGUuaG9zdAppbmRleCA2OTQzYTdhLi4xYWM0MTRmIDEwMDY0NAotLS0gYS9zY3JpcHRzL01ha2VmaWxlLmhvc3QKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5ob3N0CkBAIC0zLDkgKzMsOSBAQAogIyBCaW5hcmllcyBhcmUgdXNlZCBkdXJpbmcgdGhlIGNvbXBpbGF0aW9uIG9mIHRoZSBrZXJuZWwsIGZvciBleGFtcGxlCiAjIHRvIHByZXByb2Nlc3MgYSBkYXRhIGZpbGUuCiAjCi0jIEJvdGggQyBhbmQgQysrIGlzIHN1cHBvcnRlZCwgYnV0IHByZWZlcnJlZCBsYW5ndWFnZSBpcyBDIGZvciBzdWNoIHV0aWxpdGllcy4KKyMgQm90aCBDIGFuZCBDKysgYXJlIHN1cHBvcnRlZCwgYnV0IHByZWZlcnJlZCBsYW5ndWFnZSBpcyBDIGZvciBzdWNoIHV0aWxpdGllcy4KICMKLSMgU2FtbGUgc3ludGF4IChzZWUgRG9jdW1lbnRhdGlvbi9rYnVpbGQvbWFrZWZpbGUudHh0IGZvciByZWZlcmVuY2UpCisjIFNhbXBsZSBzeW50YXggKHNlZSBEb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0IGZvciByZWZlcmVuY2UpCiAjIGhvc3Rwcm9ncy15IDo9IGJpbjJoZXgKICMgV2lsbCBjb21waWxlIGJpbjJoZXguYyBhbmQgY3JlYXRlIGFuIGV4ZWN1dGFibGUgbmFtZWQgYmluMmhleAogIwpAQCAtMjMsMTAgKzIzLDEwIEBACiAjIGhvc3Rwcm9ncy15IDo9IGNvbmYKICMgY29uZi1vYmpzICA6PSBjb25mLm8gbGlia2NvbmZpZy5zbwogIyBsaWJrY29uZmlnLW9ianMgOj0gZXhwci5vIHR5cGUubwotIyBXaWxsIGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IG5hbWVkIGxpYmtjb25maWcuc28gdGhhdCBjb25zaXN0IG9mCi0jIGV4cHIubyBhbmQgdHlwZS5vICh0aGV5IGFyZSBib3RoIGNvbXBpbGVkIGFzIEMgY29kZSBhbmQgdGhlIG9iamVjdCBmaWxlCisjIFdpbGwgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgbmFtZWQgbGlia2NvbmZpZy5zbyB0aGF0IGNvbnNpc3RzIG9mCisjIGV4cHIubyBhbmQgdHlwZS5vICh0aGV5IGFyZSBib3RoIGNvbXBpbGVkIGFzIEMgY29kZSBhbmQgdGhlIG9iamVjdCBmaWxlcwogIyBhcmUgbWFkZSBhcyBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlKS4KLSMgY29uZi5jIGlzIGNvbXBpbGVkIGFzIGEgYyBwcm9ncmFtLCBhbmQgY29uZi5vIGlzIGxpbmtlZCB0b2dldGhlciB3aXRoCisjIGNvbmYuYyBpcyBjb21waWxlZCBhcyBhIEMgcHJvZ3JhbSwgYW5kIGNvbmYubyBpcyBsaW5rZWQgdG9nZXRoZXIgd2l0aAogIyBsaWJrY29uZmlnLnNvIGFzIHRoZSBleGVjdXRhYmxlIGNvbmYuCiAjIE5vdGU6IFNoYXJlZCBsaWJyYXJpZXMgY29uc2lzdGluZyBvZiBDKysgZmlsZXMgYXJlIG5vdCBzdXBwb3J0ZWQKIApAQCAtNjEsNyArNjEsNyBAQAogaG9zdC1jc2hvYmpzCTo9ICQoc29ydCAkKGZvcmVhY2ggbSwkKGhvc3QtY3NobGliKSwkKCQobTouc289LW9ianMpKSkpCiAKICMgb3V0cHV0IGRpcmVjdG9yeSBmb3IgcHJvZ3JhbXMvLm8gZmlsZXMKLSMgaG9zdHByb2dzLXkgOj0gdG9vbHMvYnVpbGQgbWF5IGhhdmUgYmVlbiBzcGVjaWZpZWQuIFJldHJlaXZlIGRpcmVjdG9yeQorIyBob3N0cHJvZ3MteSA6PSB0b29scy9idWlsZCBtYXkgaGF2ZSBiZWVuIHNwZWNpZmllZC4gUmV0cmlldmUgZGlyZWN0b3J5CiBob3N0LW9iamRpcnMgOj0gJChmb3JlYWNoIGYsJChfX2hvc3Rwcm9ncyksICQoaWYgJChkaXIgJChmKSksJChkaXIgJChmKSkpKQogIyBkaXJlY3Rvcnkgb2YgLm8gZmlsZXMgZnJvbSBwcm9nLW9ianMgbm90YXRpb24KIGhvc3Qtb2JqZGlycyArPSAkKGZvcmVhY2ggZiwkKGhvc3QtY211bHRpKSwgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QgYi9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QKaW5kZXggMmQyMDY0MC4uMjRiM2M4ZiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9NYWtlZmlsZS5tb2Rwb3N0CisrKyBiL3NjcmlwdHMvTWFrZWZpbGUubW9kcG9zdApAQCAtNDIsNiArNDIsMTMgQEAKIAogaW5jbHVkZSBpbmNsdWRlL2NvbmZpZy9hdXRvLmNvbmYKIGluY2x1ZGUgc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQorCitpZm5lcSAoJChLQlVJTERfRVhUTU9EKSwpCisjIEluY2x1ZGUgdGhlIG1vZHVsZSdzIE1ha2VmaWxlIHRvIGZpbmQgS0JVSUxEX0VYVFJBX1NZTUJPTFMKK2luY2x1ZGUgJChpZiAkKHdpbGRjYXJkICQoS0JVSUxEX0VYVE1PRCkvS2J1aWxkKSwgXAorICAgICAgICAgICAgICQoS0JVSUxEX0VYVE1PRCkvS2J1aWxkLCAkKEtCVUlMRF9FWFRNT0QpL01ha2VmaWxlKQorZW5kaWYKKwogaW5jbHVkZSBzY3JpcHRzL01ha2VmaWxlLmxpYgogCiBrZXJuZWxzeW1maWxlIDo9ICQob2JqdHJlZSkvTW9kdWxlLnN5bXZlcnMKQEAgLTY5LDYgKzc2LDcgQEAKICAkKGlmICQoQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCksLWEsKSAgICAgICBcCiAgJChpZiAkKEtCVUlMRF9FWFRNT0QpLC1pLC1vKSAkKGtlcm5lbHN5bWZpbGUpICAgXAogICQoaWYgJChLQlVJTERfRVhUTU9EKSwtSSAkKG1vZHVsZXN5bWZpbGUpKSAgICAgIFwKKyAkKGlmICQoaUtCVUlMRF9FWFRSQV9TWU1CT0xTKSwgJChwYXRzdWJzdCAlLCAtZSAlLCQoRVhUUkFfU1lNQk9MUykpKSBcCiAgJChpZiAkKEtCVUlMRF9FWFRNT0QpLC1vICQobW9kdWxlc3ltZmlsZSkpICAgICAgXAogICQoaWYgJChDT05GSUdfREVCVUdfU0VDVElPTl9NSVNNQVRDSCksLC1TKSAgICAgIFwKICAkKGlmICQoQ09ORklHX01BUktFUlMpLC1LICQoa2VybmVsbWFya2Vyc2ZpbGUpKSBcCmRpZmYgLS1naXQgYS9zY3JpcHRzL2NoZWNrcGF0Y2gucGwgYi9zY3JpcHRzL2NoZWNrcGF0Y2gucGwKaW5kZXggNThhOTQ5NC4uNjRlYzRiOCAxMDA3NTUKLS0tIGEvc2NyaXB0cy9jaGVja3BhdGNoLnBsCisrKyBiL3NjcmlwdHMvY2hlY2twYXRjaC5wbApAQCAtMTg4OSw2ICsxODg5LDEzIEBACiAJCQkJV0FSTigia2ZyZWUoTlVMTCkgaXMgc2FmZSB0aGlzIGNoZWNrIGlzIHByb2JhYmFsbHkgbm90IHJlcXVpcmVkXG4iIC4gJGhlcmVwcmV2KTsKIAkJCX0KIAkJfQorIyBjaGVjayBmb3IgbmVlZGxlc3MgdXNiX2ZyZWVfdXJiKCkgY2hlY2tzCisJCWlmICgkcHJldmxpbmUgPX4gL1xiaWZccypcKChbXlwpXSopXCkvKSB7CisJCQlteSAkZXhwciA9ICQxOworCQkJaWYgKCRsaW5lID1+IC9cYnVzYl9mcmVlX3VyYlwoXFEkZXhwclxFXCk7LykgeworCQkJCVdBUk4oInVzYl9mcmVlX3VyYihOVUxMKSBpcyBzYWZlIHRoaXMgY2hlY2sgaXMgcHJvYmFiYWxseSBub3QgcmVxdWlyZWRcbiIgLiAkaGVyZXByZXYpOworCQkJfQorCQl9CiAKICMgd2FybiBhYm91dCAjaWZkZWZzIGluIEMgZmlsZXMKICMJCWlmICgkbGluZSA9fiAvXi4jXHMqaWYofG4pZGVmLyAmJiAoJHJlYWxmaWxlID1+IC9cLmMkLykpIHsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9NYWtlZmlsZSBiL3NjcmlwdHMva2NvbmZpZy9NYWtlZmlsZQppbmRleCAzMmU4YzVhLi5mYTFhN2Q1IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvTWFrZWZpbGUKKysrIGIvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlCkBAIC0zNiwxMCArMzYsMTAgQEAKIAkgICAgLS1vdXRwdXQgJChvYmopL2NvbmZpZy5wb3QKIAkkKFEpc2VkIC1pIHMvQ0hBUlNFVC9VVEYtOC8gJChvYmopL2NvbmZpZy5wb3QKIAkkKFEpbG4gLWZzIEtjb25maWcuaTM4NiBhcmNoL3VtL0tjb25maWcuYXJjaAotCSQoUSkoZm9yIGkgaW4gYGxzIGFyY2gvYDsgICAgICAgICAgICAgICAgICAgICAgICBcCisJJChRKShmb3IgaSBpbiBgbHMgYXJjaC8qL0tjb25maWdgOyAgICAgICAgICAgICAgIFwKIAkgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCQllY2hvICIgIEdFTiAkJGkiOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJJChvYmopL2t4Z2V0dGV4dCBhcmNoLyQkaS9LY29uZmlnICAgICAgICBcCisJCSQob2JqKS9reGdldHRleHQgJCRpICAgICAgICAgICAgICAgICAgICAgXAogCQkgICAgID4+ICQob2JqKS9jb25maWcucG90OyAgICAgICAgICAgICAgIFwKIAkgICAgZG9uZSApCiAJJChRKW1zZ3VuaXEgLS1zb3J0LWJ5LWZpbGUgLS10by1jb2RlPVVURi04ICQob2JqKS9jb25maWcucG90IFwKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kL21vZHBvc3QuYyBiL3NjcmlwdHMvbW9kL21vZHBvc3QuYwppbmRleCAxMTBjZjI0Li5mOGI0MmFiIDEwMDY0NAotLS0gYS9zY3JpcHRzL21vZC9tb2Rwb3N0LmMKKysrIGIvc2NyaXB0cy9tb2QvbW9kcG9zdC5jCkBAIC0xNTUyLDYgKzE1NTIsMTAgQEAKIAl9CiAKIAlsaWNlbnNlID0gZ2V0X21vZGluZm8oaW5mby5tb2RpbmZvLCBpbmZvLm1vZGluZm9fbGVuLCAibGljZW5zZSIpOworCWlmICghbGljZW5zZSAmJiAhaXNfdm1saW51eChtb2RuYW1lKSkKKwkJZmF0YWwoIm1vZHBvc3Q6IG1pc3NpbmcgTU9EVUxFX0xJQ0VOU0UoKSBpbiAlc1xuIgorCQkgICAgICAic2VlIGluY2x1ZGUvbGludXgvbW9kdWxlLmggZm9yICIKKwkJICAgICAgIm1vcmUgaW5mb3JtYXRpb25cbiIsIG1vZG5hbWUpOwogCXdoaWxlIChsaWNlbnNlKSB7CiAJCWlmIChsaWNlbnNlX2lzX2dwbF9jb21wYXRpYmxlKGxpY2Vuc2UpKQogCQkJbW9kLT5ncGxfY29tcGF0aWJsZSA9IDE7CkBAIC0yMDE1LDYgKzIwMTksMTEgQEAKIAl3cml0ZV9pZl9jaGFuZ2VkKCZidWYsIGZuYW1lKTsKIH0KIAorc3RydWN0IGV4dF9zeW1fbGlzdCB7CisJc3RydWN0IGV4dF9zeW1fbGlzdCAqbmV4dDsKKwljb25zdCBjaGFyICpmaWxlOworfTsKKwogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewogCXN0cnVjdCBtb2R1bGUgKm1vZDsKQEAgLTIwMjUsOCArMjAzNCwxMCBAQAogCWNoYXIgKm1hcmtlcnNfd3JpdGUgPSBOVUxMOwogCWludCBvcHQ7CiAJaW50IGVycjsKKwlzdHJ1Y3QgZXh0X3N5bV9saXN0ICpleHRzeW1faXRlcjsKKwlzdHJ1Y3QgZXh0X3N5bV9saXN0ICpleHRzeW1fc3RhcnQgPSBOVUxMOwogCi0Jd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgImk6STpjbXNTbzphd006SzoiKSkgIT0gLTEpIHsKKwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiaTpJOmU6Y21zU286YXdNOks6IikpICE9IC0xKSB7CiAJCXN3aXRjaCAob3B0KSB7CiAJCWNhc2UgJ2knOgogCQkJa2VybmVsX3JlYWQgPSBvcHRhcmc7CkBAIC0yMDM4LDYgKzIwNDksMTQgQEAKIAkJY2FzZSAnYyc6CiAJCQljcm9zc19idWlsZCA9IDE7CiAJCQlicmVhazsKKwkJY2FzZSAnZSc6CisJCQlleHRlcm5hbF9tb2R1bGUgPSAxOworCQkJZXh0c3ltX2l0ZXIgPQorCQkJICAgTk9GQUlMKG1hbGxvYyhzaXplb2YoKmV4dHN5bV9pdGVyKSkpOworCQkJZXh0c3ltX2l0ZXItPm5leHQgPSBleHRzeW1fc3RhcnQ7CisJCQlleHRzeW1faXRlci0+ZmlsZSA9IG9wdGFyZzsKKwkJCWV4dHN5bV9zdGFydCA9IGV4dHN5bV9pdGVyOworCQkJYnJlYWs7CiAJCWNhc2UgJ20nOgogCQkJbW9kdmVyc2lvbnMgPSAxOwogCQkJYnJlYWs7CkBAIC0yMDcxLDYgKzIwOTAsMTIgQEAKIAkJcmVhZF9kdW1wKGtlcm5lbF9yZWFkLCAxKTsKIAlpZiAobW9kdWxlX3JlYWQpCiAJCXJlYWRfZHVtcChtb2R1bGVfcmVhZCwgMCk7CisJd2hpbGUgKGV4dHN5bV9zdGFydCkgeworCQlyZWFkX2R1bXAoZXh0c3ltX3N0YXJ0LT5maWxlLCAwKTsKKwkJZXh0c3ltX2l0ZXIgPSBleHRzeW1fc3RhcnQtPm5leHQ7CisJCWZyZWUoZXh0c3ltX3N0YXJ0KTsKKwkJZXh0c3ltX3N0YXJ0ID0gZXh0c3ltX2l0ZXI7CisJfQogCiAJd2hpbGUgKG9wdGluZCA8IGFyZ2MpCiAJCXJlYWRfc3ltYm9scyhhcmd2W29wdGluZCsrXSk7Cg==